[tradein][tech-debt] Flag sprawl: ~40 estimate_* флагов, матрица взаимодействий непротестирована → паралич правок #1970

Open
opened 2026-06-27 08:52:37 +00:00 by lekss361 · 1 comment
Owner

Из стратегического аудита 2026-06-27. №1 maintainability-долг движка.

Проблема

config.py содержит ~40 estimate_* флагов (anchor gate, IMV-blend, quarter-index, corridor, radius-floor, expected_sold clamp, dedup, ghost-guard, …). Комбинаторно непротестированы, матрицу взаимодействий не знает никто → паралич правок: страшно трогать движок, т.к. неизвестно как флаги взаимодействуют. Каждый новый флаг увеличивает поверхность.

DoD (ТОЛЬКО после accuracy-loop CI-гейта — иначе схлопывание вслепую)

  • Инвентаризировать все estimate_* флаги: что делает, дефолт, когда вводился, ещё нужен ли как флаг.
  • Схлопнуть «победившие» флаги в захардкоженные дефолты (убрать флаг), оставить флагом только то, что реально переключается.
  • Покрыть оставшиеся комбинации тестами / задокументировать матрицу.
  • Зависит от #accuracy-loop: схлопывание безопасно только когда есть backtest-гейт, который поймает регрессию.

scope/backend, tech-debt. Refs аудит 0627, config.py.

Из стратегического аудита 2026-06-27. **№1 maintainability-долг движка.** ## Проблема `config.py` содержит ~40 `estimate_*` флагов (anchor gate, IMV-blend, quarter-index, corridor, radius-floor, expected_sold clamp, dedup, ghost-guard, …). Комбинаторно непротестированы, матрицу взаимодействий не знает никто → паралич правок: страшно трогать движок, т.к. неизвестно как флаги взаимодействуют. Каждый новый флаг увеличивает поверхность. ## DoD (ТОЛЬКО после accuracy-loop CI-гейта — иначе схлопывание вслепую) - Инвентаризировать все `estimate_*` флаги: что делает, дефолт, когда вводился, ещё нужен ли как флаг. - Схлопнуть «победившие» флаги в захардкоженные дефолты (убрать флаг), оставить флагом только то, что реально переключается. - Покрыть оставшиеся комбинации тестами / задокументировать матрицу. - **Зависит от #accuracy-loop**: схлопывание безопасно только когда есть backtest-гейт, который поймает регрессию. scope/backend, tech-debt. Refs аудит 0627, config.py.
lekss361 added the
priority/p2
scope/backend
tech-debt
tradein
labels 2026-06-27 08:53:21 +00:00
Author
Owner

Инвентаризация 61 поля estimate_* (config.py:110-423) завершена (tech-analyst, 2026-07-04). Precondition #1966 (backtest CI gate) закрыт 2026-07-03 — блокер снят.

Метод: grep всех usage (settings.estimate_* — 75 хитов, все 61 поля используются), проверка .env.example + всех docker-compose (main+tradein) на ESTIMATE_* override — 0 хитов везде, grep тестов на OFF-тумблинг флагов — только 2 из ~17 bool-флагов тестируются в OFF-состоянии.

Итог:

  • 43 поля — "мёртвые"/устаканившиеся (default никогда не менялся, 0 env-override, 0 тестов на OFF) → 4 sub-issue ниже на схлопывание в хардкод
  • 8 полей — операционные/бизнес-параметры (timeouts #654, quota #658, price_trend_max_age #audit-3) — легитимно конфигурируемы, НЕ tech debt
  • 10 полей — hedonic (#2002) + calibrated_pi (#1966) + price_trend_dedup — тестируются в OFF, похоже завязаны на механику #1966 gate → needs archeology, НЕ включены в текущий батч
  • estimate_segment_multiplier_enabled/_multipliers (#2255) — активная калибровка СЕГОДНЯШНЕГО дня, явный WIP, вне scope полностью

Sub-issues: #2378 (low-risk misc, 9 полей), #2379 (quarter-index #764, 7 полей), #2380 (#1795 corridor-clamp/radius-floor, 8 полей), #2381 (same-building anchor + IMV-blend, 19 полей, HIGH risk — implementer может дальше сплитить).

Каждый sub-issue: full pytest + test_backtest_regression_gate.py метрики без изменений, #2381 дополнительно требует deep-code-reviewer APPROVE.

Sub-issues намеренно не заведены под 18 keep/unclear полей — DoD допускает документирование вместо тестов, но это отдельный follow-up при желании.

Инвентаризация 61 поля `estimate_*` (config.py:110-423) завершена (tech-analyst, 2026-07-04). Precondition #1966 (backtest CI gate) закрыт 2026-07-03 — блокер снят. Метод: grep всех usage (`settings.estimate_*` — 75 хитов, все 61 поля используются), проверка `.env.example` + всех docker-compose (main+tradein) на `ESTIMATE_*` override — 0 хитов везде, grep тестов на OFF-тумблинг флагов — только 2 из ~17 bool-флагов тестируются в OFF-состоянии. **Итог:** - **43 поля** — "мёртвые"/устаканившиеся (default никогда не менялся, 0 env-override, 0 тестов на OFF) → 4 sub-issue ниже на схлопывание в хардкод - **8 полей** — операционные/бизнес-параметры (timeouts #654, quota #658, price_trend_max_age #audit-3) — легитимно конфигурируемы, НЕ tech debt - **10 полей** — hedonic (#2002) + calibrated_pi (#1966) + price_trend_dedup — тестируются в OFF, похоже завязаны на механику #1966 gate → needs archeology, НЕ включены в текущий батч - `estimate_segment_multiplier_enabled`/`_multipliers` (#2255) — активная калибровка СЕГОДНЯШНЕГО дня, явный WIP, вне scope полностью **Sub-issues:** #2378 (low-risk misc, 9 полей), #2379 (quarter-index #764, 7 полей), #2380 (#1795 corridor-clamp/radius-floor, 8 полей), #2381 (same-building anchor + IMV-blend, 19 полей, HIGH risk — implementer может дальше сплитить). Каждый sub-issue: full pytest + `test_backtest_regression_gate.py` метрики без изменений, #2381 дополнительно требует `deep-code-reviewer` APPROVE. Sub-issues намеренно не заведены под 18 keep/unclear полей — DoD допускает документирование вместо тестов, но это отдельный follow-up при желании.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1970
No description provided.