[Fable 5][P2] scrape_objective: провал lots_pf-стрима (главный 600МБ отчёт) проглатывается — run завершается status='done' #1220

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

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

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

Файл

backend/app/workers/tasks/scrape_objective.py:267

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

n_requests += 1
reports_ok += 1
try:
    with client.stream_report(
        report_type="Поквартирные",
        report_name="Лоты",

Why bug

reports_ok и n_requests инкрементируются ДО старта HTTP-стрима. Любая ошибка стрима/парсинга (auth 401, 5xx, обрыв сети, ijson-сбой) ловится generic-except (строка 293): rollback + logger — reports_failed НЕ растёт, внешний except (ObjectiveAuthError/ObjectiveAPIError, строка 355) недостижим. Итог: _finish_run(status='done' if reports_failed==0) помечает run успешным при полностью провалившемся основном отчёте — objective_lots/history остаются stale молча, админка и downstream (supply-layers L2) видят 'done', rows_lots=0.

Suggested fix

Инкрементировать reports_ok только после успешного parse; в except-ветке стрима делать reports_failed += 1; n_requests считать после фактического запроса.

Verify notes

  • [real/P2] Трасса: lots_pf: reports_ok+=1 (стр.267) ДО HTTP. stream_report кидает ObjectiveAuthError/APIError (RuntimeError⊂Exception) — их, обрыв сети и ijson-сбой глотает except Exception стр.293 без reports_failed+=1 и re-raise; внешний except стр.355 недостижим. _finish_run → status='done', rows_lots=0, error=NULL. Admin: last_run_at = MAX(finished_at) WHERE status='done' — свежесть врёт. payload=NULL → re-parse невозможен. В corp_sum-ветке reports_ok+=1 после HTTP, ошибки доходят до внешнего except.
  • [real/P2] Защиты нет. ObjectiveAuthError/APIError — подклассы RuntimeError; в lots_pf-ветке stream_report целиком внутри except Exception (стр. 293): rollback+log, reports_failed не растёт, внешний handler (стр. 355) для lots_pf недостижим. reports_ok++ до старта стрима; payload=NULL → re-parse невозможен (в corp_sum fetch вне inner-try и raw сохранён — там паттерн безопасен). Админка: last_run_at = MAX(finished_at) WHERE status='done'. Смягчение только logger.exception→GlitchTip, потому P2.

Provenance

  • Finders: workers
  • Confidence: 0.7
  • Originally batched at: main@d796027
## Из армейского ревью Claude Fable 5 (2026-06-11) Confirmed by 2/2 адверсариальных верификатора, severity **P2** (correctness), confidence 0.7. ## Файл [`backend/app/workers/tasks/scrape_objective.py:267`](backend/app/workers/tasks/scrape_objective.py:267) ## Evidence (цитата кода) ``` n_requests += 1 reports_ok += 1 try: with client.stream_report( report_type="Поквартирные", report_name="Лоты", ``` ## Why bug reports_ok и n_requests инкрементируются ДО старта HTTP-стрима. Любая ошибка стрима/парсинга (auth 401, 5xx, обрыв сети, ijson-сбой) ловится generic-except (строка 293): rollback + logger — reports_failed НЕ растёт, внешний except (ObjectiveAuthError/ObjectiveAPIError, строка 355) недостижим. Итог: _finish_run(status='done' if reports_failed==0) помечает run успешным при полностью провалившемся основном отчёте — objective_lots/history остаются stale молча, админка и downstream (supply-layers L2) видят 'done', rows_lots=0. ## Suggested fix Инкрементировать reports_ok только после успешного parse; в except-ветке стрима делать reports_failed += 1; n_requests считать после фактического запроса. ## Verify notes - [real/P2] Трасса: lots_pf: reports_ok+=1 (стр.267) ДО HTTP. stream_report кидает ObjectiveAuthError/APIError (RuntimeError⊂Exception) — их, обрыв сети и ijson-сбой глотает except Exception стр.293 без reports_failed+=1 и re-raise; внешний except стр.355 недостижим. _finish_run → status='done', rows_lots=0, error=NULL. Admin: last_run_at = MAX(finished_at) WHERE status='done' — свежесть врёт. payload=NULL → re-parse невозможен. В corp_sum-ветке reports_ok+=1 после HTTP, ошибки доходят до внешнего except. - [real/P2] Защиты нет. ObjectiveAuthError/APIError — подклассы RuntimeError; в lots_pf-ветке stream_report целиком внутри except Exception (стр. 293): rollback+log, reports_failed не растёт, внешний handler (стр. 355) для lots_pf недостижим. reports_ok++ до старта стрима; payload=NULL → re-parse невозможен (в corp_sum fetch вне inner-try и raw сохранён — там паттерн безопасен). Админка: last_run_at = MAX(finished_at) WHERE status='done'. Смягчение только logger.exception→GlitchTip, потому P2. ## Provenance - Finders: `workers` - Confidence: 0.7 - Originally batched at: main@d796027
bot-backend added the
Fable 5 ревью
label 2026-06-13 04:49:45 +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#1220
No description provided.