[Fable 5][P3] §15 report-confidence: _confounded читает ключи, которых нет в forecast-диктах — шок-окно никогда не влияет на уверенность #1222

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

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

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

Файл

backend/app/services/forecasting/report_assembler.py:233

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

for f in forecasts:
        if f.get("confounded") is True or f.get("is_confounded_window") is True:
            return True
    return False

Why bug

DemandSupplyForecast.as_dict() (единственный продьюсер forecasts в orchestrator-пути) не содержит ни 'confounded', ни 'is_confounded_window' (grep по модулю пуст) → функция всегда False → фактор confounded_window движка #990 («НИКОГДА не 'high', оценки смещены») перманентно мёртв, хотя 48-мес окна §9.6/§9.4 пересекают конфаундер 2024-07-01 до 2028 г. Rationale §15 систематически не называет шок-окно и не роняет уровень в low.

Suggested fix

Прокинуть confounded в DemandSupplyForecast (из §9.4/§9.6 sensitivity/macro_coef) и его as_dict(), либо передавать в _build_confidence флаг из macro_coefficient/rate_sensitivity напрямую.

Verify notes

  • [real/P3] Трасса: forecast.py:137 → orchestrator.py:311/357 передаёт list[DemandSupplyForecast] → as_dict() без confounded-ключей → _confounded всегда False → confidence_engine.py:450 if confounded: мёртв. Окна §9.5/§9.6 пересекают конфаундер 2024-07-01, под-сервисы считают confounded=True, но per-forecast confidence capped 'medium' — §15 не отличает шок-окно: уровень 'medium' вместо 'low', rationale не называет шок. Тесты маскируют синтетикой. Advisory-слой, без краша → P3.
  • [real/P3] Защиты нет: единственный prod-вызов assemble_report — orchestrator.py:357 с DemandSupplyForecast; as_dict() (строки 179-200) не содержит ни одного из ключей → _confounded всегда False. compute_report_confidence зовётся только отсюда → фактор confounded_window (level='low', weakest-link) мёртв. Окно реально конфаундено (§9.6: 48 мес пересекают 2024-07-01 до 2028). Косвенный канал (macro ≤ medium) не форсит 'low' и не называет шок в rationale. P3: advisory-cap уже гарантирует ≤medium.

Provenance

  • Finders: forecasting
  • Confidence: 0.58
  • Originally batched at: main@d796027
## Из армейского ревью Claude Fable 5 (2026-06-11) Confirmed by 2/2 адверсариальных верификатора, severity **P3** (correctness), confidence 0.58. ## Файл [`backend/app/services/forecasting/report_assembler.py:233`](backend/app/services/forecasting/report_assembler.py:233) ## Evidence (цитата кода) ``` for f in forecasts: if f.get("confounded") is True or f.get("is_confounded_window") is True: return True return False ``` ## Why bug DemandSupplyForecast.as_dict() (единственный продьюсер forecasts в orchestrator-пути) не содержит ни 'confounded', ни 'is_confounded_window' (grep по модулю пуст) → функция всегда False → фактор confounded_window движка #990 («НИКОГДА не 'high', оценки смещены») перманентно мёртв, хотя 48-мес окна §9.6/§9.4 пересекают конфаундер 2024-07-01 до 2028 г. Rationale §15 систематически не называет шок-окно и не роняет уровень в low. ## Suggested fix Прокинуть confounded в DemandSupplyForecast (из §9.4/§9.6 sensitivity/macro_coef) и его as_dict(), либо передавать в _build_confidence флаг из macro_coefficient/rate_sensitivity напрямую. ## Verify notes - [real/P3] Трасса: forecast.py:137 → orchestrator.py:311/357 передаёт list[DemandSupplyForecast] → as_dict() без confounded-ключей → _confounded всегда False → confidence_engine.py:450 `if confounded:` мёртв. Окна §9.5/§9.6 пересекают конфаундер 2024-07-01, под-сервисы считают confounded=True, но per-forecast confidence capped 'medium' — §15 не отличает шок-окно: уровень 'medium' вместо 'low', rationale не называет шок. Тесты маскируют синтетикой. Advisory-слой, без краша → P3. - [real/P3] Защиты нет: единственный prod-вызов assemble_report — orchestrator.py:357 с DemandSupplyForecast; as_dict() (строки 179-200) не содержит ни одного из ключей → _confounded всегда False. compute_report_confidence зовётся только отсюда → фактор confounded_window (level='low', weakest-link) мёртв. Окно реально конфаундено (§9.6: 48 мес пересекают 2024-07-01 до 2028). Косвенный канал (macro ≤ medium) не форсит 'low' и не называет шок в rationale. P3: advisory-cap уже гарантирует ≤medium. ## Provenance - Finders: `forecasting` - Confidence: 0.58 - Originally batched at: main@d796027
bot-backend added the
Fable 5 ревью
label 2026-06-13 04:49:46 +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#1222
No description provided.