[Fable 5][P2] recommend_mix: _district_velocity_trend — захардкоженные даты 2025: «recent»-окно растёт безгранично, trend_factor раздут до ~2x #1203

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

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

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

Файл

backend/app/services/analytics_queries.py:1458

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

SUM(crm.deals_total_count)
    FILTER (WHERE crm.report_month >= DATE '2025-07-01')
    AS recent,
SUM(crm.deals_total_count)
    FILTER (WHERE crm.report_month BETWEEN DATE '2025-01-01'
            AND DATE '2025-06-30')
    AS prior

Why bug

Докстринг обещает «recent_6mo / prior_6mo», но recent не ограничен сверху: objective_corpus_room_month обновляется еженедельно, и на июнь 2026 recent ≈ 11-12 месяцев против prior = 6 → при плоском рынке ratio ≈ 2 → trend_factor = clamp(…, 2.0) ≈ 2.0 → bucket_velocity ×2 (macro_velocity_mult), months_to_sellout вдвое занижен, liquidity_24mo/headline завышены на живом эндпоинте квартирографии. Искажение растёт с каждым месяцем.

Suggested fix

Считать окна относительно NOW(): recent = report_month >= NOW()-INTERVAL '6 months', prior = между NOW()-'12 months' и NOW()-'6 months' (равные 6-мес окна).

Verify notes

  • [real/P2] Трассировка подтверждает: recent-окно без верхней границы, а objective_corpus_room_month еженедельно пополняется ETL (objective_etl.py upsert report_month из источника без капа). На 2026-06 recent≈11 мес vs prior=6 → при плоском рынке ratio≈1.83, с июля 2026 навсегда кламп 2.0 — сигнал тренда мёртв. trend_factor умножает bucket_velocity в живом recommend_mix → months_to_sellout занижен в ~1.8-2x. Докстринг и коммент call-site обещают 6mo/6mo; все соседние запросы используют NOW()-окна.
  • [real/P2] Защита не нашлась: recent-окно без верхней границы, ETL еженедельно доливает последний полный месяц (scrape_objective, period_months_back=1), downstream нет нормализации по числу месяцев (trend_factor=clamp(recent/prior) → macro_velocity_mult → bucket_velocity/months_to_sellout), тесты функцию мокают. Конвенция файла — rolling NOW()-окна (стр. 1379/1760/1839/1930 по той же таблице), эта функция — единственный outlier. На 2026-06 recent≈11 мес vs prior=6 → плоский рынок даёт ratio≈1.8.

Provenance

  • Finders: forecasting
  • Confidence: 0.78
  • Originally batched at: main@d796027
## Из армейского ревью Claude Fable 5 (2026-06-11) Confirmed by 2/2 адверсариальных верификатора, severity **P2** (correctness), confidence 0.78. ## Файл [`backend/app/services/analytics_queries.py:1458`](backend/app/services/analytics_queries.py:1458) ## Evidence (цитата кода) ``` SUM(crm.deals_total_count) FILTER (WHERE crm.report_month >= DATE '2025-07-01') AS recent, SUM(crm.deals_total_count) FILTER (WHERE crm.report_month BETWEEN DATE '2025-01-01' AND DATE '2025-06-30') AS prior ``` ## Why bug Докстринг обещает «recent_6mo / prior_6mo», но recent не ограничен сверху: objective_corpus_room_month обновляется еженедельно, и на июнь 2026 recent ≈ 11-12 месяцев против prior = 6 → при плоском рынке ratio ≈ 2 → trend_factor = clamp(…, 2.0) ≈ 2.0 → bucket_velocity ×2 (macro_velocity_mult), months_to_sellout вдвое занижен, liquidity_24mo/headline завышены на живом эндпоинте квартирографии. Искажение растёт с каждым месяцем. ## Suggested fix Считать окна относительно NOW(): recent = report_month >= NOW()-INTERVAL '6 months', prior = между NOW()-'12 months' и NOW()-'6 months' (равные 6-мес окна). ## Verify notes - [real/P2] Трассировка подтверждает: recent-окно без верхней границы, а objective_corpus_room_month еженедельно пополняется ETL (objective_etl.py upsert report_month из источника без капа). На 2026-06 recent≈11 мес vs prior=6 → при плоском рынке ratio≈1.83, с июля 2026 навсегда кламп 2.0 — сигнал тренда мёртв. trend_factor умножает bucket_velocity в живом recommend_mix → months_to_sellout занижен в ~1.8-2x. Докстринг и коммент call-site обещают 6mo/6mo; все соседние запросы используют NOW()-окна. - [real/P2] Защита не нашлась: recent-окно без верхней границы, ETL еженедельно доливает последний полный месяц (scrape_objective, period_months_back=1), downstream нет нормализации по числу месяцев (trend_factor=clamp(recent/prior) → macro_velocity_mult → bucket_velocity/months_to_sellout), тесты функцию мокают. Конвенция файла — rolling NOW()-окна (стр. 1379/1760/1839/1930 по той же таблице), эта функция — единственный outlier. На 2026-06 recent≈11 мес vs prior=6 → плоский рынок даёт ratio≈1.8. ## Provenance - Finders: `forecasting` - Confidence: 0.78 - Originally batched at: main@d796027
bot-backend added the
Fable 5 ревью
label 2026-06-13 04:49:42 +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#1203
No description provided.