[Fable 5][P2] price_sensitivity: в _elasticity_coef уходит админ-район вместо микро — регрессия всегда мертва (fallback) #1211

Closed
opened 2026-06-13 04:49:44 +00:00 by bot-backend · 0 comments
Collaborator

Из армейского ревью Claude Fable 5 (2026-06-11)

Confirmed by 2/2 адверсариальных верификатора, severity P2 (correctness), confidence 0.6.

Файл

backend/app/services/site_finder/market_metrics.py:523

Evidence (цитата кода)

    if not district:
        return None, None
    elasticity_window = max(window_months, 24)
    try:
        elast = _elasticity_coef(
            db,
            region_code=_EKB_REGION_CODE,
            district_name=district,

Why bug

compute_market_metrics резолвит админ-имя ('Кировский') в микро-районы для стока/продаж, но _price_sensitivity передаёт сырое админ-имя в _elasticity_coef, фильтрующий objective_corpus_room_month.district — МИКРО-вокабуляр ('Втузгородок', 'ЖБИ'; ground-truth в district_resolver). Для 7 из 8 админ-районов регрессия получает 0 точек → n=0 → всегда FALLBACK_ELASTICITY: district-level эластичность §9.2 молча никогда не считается в /analyze-пути.

Suggested fix

Передавать зарезолвленные микро-районы: фильтр crm.district = ANY(CAST(:districts AS text[])) (расширить _elasticity_coef списком) либо звать resolve_objective_districts внутри _price_sensitivity.

Verify notes

  • [real/P2] Трасса: /analyze даёт админ-имя ('Кировский'); market_metrics:364 резолвит его в micros для stock/sales, но :407 передаёт сырой админ в _price_sensitivity→_elasticity_coef→WHERE crm.district=:dn по objective_corpus_room_month — микро-вокабуляр (schema 68:119 «Автовокзал»; ground-truth в district_resolver и 131_district_vocab_map.sql). 0 строк→n=0<30→всегда FALLBACK_ELASTICITY; лишь 'Академический' в обоих вокабулярах. Тихая деградация §9.2, но graceful → P2.
  • [real/P2] Защита не найдена. compute_market_metrics резолвит admin→micro (micros, стр.364) только для stock/sales SQL; _price_sensitivity получает сырой district и шлёт в _elasticity_coef → WHERE crm.district=:dn (exact match). corpus_room_month.district — микро (district_resolver docstring, 131_district_vocab_map.sql, commit 681a922: "crm shares the micro vocab, prod-verified"). /analyze передаёт админ-имя (orchestrator:267, forecast.py:123) → n=0<30 → всегда FALLBACK_ELASTICITY для 7/8 районов.

Provenance

  • Finders: site-finder-A
  • Confidence: 0.6
  • Originally batched at: main@d796027
## Из армейского ревью Claude Fable 5 (2026-06-11) Confirmed by 2/2 адверсариальных верификатора, severity **P2** (correctness), confidence 0.6. ## Файл [`backend/app/services/site_finder/market_metrics.py:523`](backend/app/services/site_finder/market_metrics.py:523) ## Evidence (цитата кода) ``` if not district: return None, None elasticity_window = max(window_months, 24) try: elast = _elasticity_coef( db, region_code=_EKB_REGION_CODE, district_name=district, ``` ## Why bug compute_market_metrics резолвит админ-имя ('Кировский') в микро-районы для стока/продаж, но _price_sensitivity передаёт сырое админ-имя в _elasticity_coef, фильтрующий objective_corpus_room_month.district — МИКРО-вокабуляр ('Втузгородок', 'ЖБИ'; ground-truth в district_resolver). Для 7 из 8 админ-районов регрессия получает 0 точек → n=0 → всегда FALLBACK_ELASTICITY: district-level эластичность §9.2 молча никогда не считается в /analyze-пути. ## Suggested fix Передавать зарезолвленные микро-районы: фильтр crm.district = ANY(CAST(:districts AS text[])) (расширить _elasticity_coef списком) либо звать resolve_objective_districts внутри _price_sensitivity. ## Verify notes - [real/P2] Трасса: /analyze даёт админ-имя ('Кировский'); market_metrics:364 резолвит его в micros для stock/sales, но :407 передаёт сырой админ в _price_sensitivity→_elasticity_coef→WHERE crm.district=:dn по objective_corpus_room_month — микро-вокабуляр (schema 68:119 «Автовокзал»; ground-truth в district_resolver и 131_district_vocab_map.sql). 0 строк→n=0<30→всегда FALLBACK_ELASTICITY; лишь 'Академический' в обоих вокабулярах. Тихая деградация §9.2, но graceful → P2. - [real/P2] Защита не найдена. compute_market_metrics резолвит admin→micro (micros, стр.364) только для stock/sales SQL; _price_sensitivity получает сырой district и шлёт в _elasticity_coef → WHERE crm.district=:dn (exact match). corpus_room_month.district — микро (district_resolver docstring, 131_district_vocab_map.sql, commit 681a922: "crm shares the micro vocab, prod-verified"). /analyze передаёт админ-имя (orchestrator:267, forecast.py:123) → n=0<30 → всегда FALLBACK_ELASTICITY для 7/8 районов. ## Provenance - Finders: `site-finder-A` - Confidence: 0.6 - Originally batched at: main@d796027
bot-backend added the
Fable 5 ревью
label 2026-06-13 04:49:44 +00:00
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#1211
No description provided.