fix(report-pdf): best-effort inline §22-форсайт на холодном участке — отчёт самодостаточен #2357

Merged
bot-backend merged 1 commit from fix/report-inline-forecast into main 2026-07-04 00:30:13 +00:00
Collaborator

Что

Находка стресс-свипа: полный отчёт «холодного» участка (не открывали страницу) выходил без §4–§6 — форсайт-ран строится лениво GET /forecast-поллингом фронта. Для «одного файла инвесткомитету» это полотчёта.

  • _ensure_forecast_run: при отсутствии рана build_full_report считает §22 синхронно прямым вызовом build_site_finder_report (мы уже в worker'е, ~20–30с на scoped-участок) и персистит ран — контракт сверен построчно с Celery-таском (horizons [6,12,18,24] = _horizons_for(12), district-fallback, schema "1.0", status/confidence/segment; отличие только params.source="full-report-inline-forecast" — потребители по source не фильтруют, GET /forecast увидит обычный ready-ран).
  • Best-effort: сбой → warning (не exception — GlitchTip-шум помним), отчёт без §4–§6 как раньше. Lazy-import orchestrator'а — web-процесс не тянет.
  • Кэш-ключ корректен (свежий ран → новый forecast_run_id → cache-miss). Таймлимит 600с не тронут: worst-case ЕКБ-wide ~250с < 540с soft.

Тесты

19 в файле (3 новых на persist-контракт/fallback/глотание, 2 адаптированы: генерация вызвана+перечитана / упала → деградация с persist_not_called). Каталог exporters: 189 passed. ruff+UP clean.

Ревью

code-reviewer: APPROVE (дрейф контракта — нет; транзакции — безопасны, persist и раньше коммитил внутри flow; гонка двух inline-форсайтов — benign latest-wins).

Post-merge

Пересборка на реально холодном 0001001:30: §4–§6 в PDF + новый "1.0"-ран с source=inline; время в лимите.

Refs #2259

## Что Находка стресс-свипа: полный отчёт «холодного» участка (не открывали страницу) выходил без §4–§6 — форсайт-ран строится лениво GET /forecast-поллингом фронта. Для «одного файла инвесткомитету» это полотчёта. - `_ensure_forecast_run`: при отсутствии рана `build_full_report` считает §22 синхронно прямым вызовом `build_site_finder_report` (мы уже в worker'е, ~20–30с на scoped-участок) и персистит ран — **контракт сверен построчно с Celery-таском** (horizons `[6,12,18,24]` = `_horizons_for(12)`, district-fallback, schema "1.0", status/confidence/segment; отличие только `params.source="full-report-inline-forecast"` — потребители по source не фильтруют, GET /forecast увидит обычный ready-ран). - Best-effort: сбой → warning (не exception — GlitchTip-шум помним), отчёт без §4–§6 как раньше. Lazy-import orchestrator'а — web-процесс не тянет. - Кэш-ключ корректен (свежий ран → новый forecast_run_id → cache-miss). Таймлимит 600с не тронут: worst-case ЕКБ-wide ~250с < 540с soft. ## Тесты 19 в файле (3 новых на persist-контракт/fallback/глотание, 2 адаптированы: генерация вызвана+перечитана / упала → деградация с `persist_not_called`). Каталог exporters: 189 passed. ruff+UP clean. ## Ревью code-reviewer: ✅ APPROVE (дрейф контракта — нет; транзакции — безопасны, persist и раньше коммитил внутри flow; гонка двух inline-форсайтов — benign latest-wins). ## Post-merge Пересборка на реально холодном 0001001:30: §4–§6 в PDF + новый "1.0"-ран с source=inline; время в лимите. Refs #2259
bot-backend added 1 commit 2026-07-04 00:14:42 +00:00
fix(report-pdf): best-effort inline §22-форсайт на холодном участке (#2259)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 6s
CI / changes (pull_request) Successful in 7s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 2m4s
CI / backend-tests (pull_request) Successful in 14m34s
1180d8f8c7
Полный PDF-отчёт не-открытого участка выходил без §4-§6: форсайт-ран
(schema "1.0") строится лениво GET /forecast-поллингом и на холодном
участке отсутствует (стресс-свип: 66:41:0001001:30). build_full_report
теперь при отсутствии рана считает форсайт синхронно прямым вызовом
build_site_finder_report (мы уже в worker'е, ~20-30с) с теми же
дефолтами, что Celery-таск (horizons=[6,12,18,24] = _horizons_for(12),
district-fallback, persist schema "1.0" — контракт сверен построчно,
потребители по params.source не фильтруют), и перечитывает ран.
Best-effort: сбой → warning (не exception — GlitchTip), отчёт без
§4-§6 как раньше. Отчёт самодостаточен (как §7-концепция).
Таймлимит 600с не тронут — worst-case ~250с < 540с soft.

Refs #2259
bot-backend merged commit 6468bd6b37 into main 2026-07-04 00:30:13 +00:00
bot-backend deleted branch fix/report-inline-forecast 2026-07-04 00:30:13 +00:00
Sign in to join this conversation.
No reviewers
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#2357
No description provided.