feat(tradein/monitor): алерт на staleness данных deals по max(deal_date) (#2212) #2226

Merged
lekss361 merged 1 commit from fix/tradein-deals-freshness-monitor into main 2026-07-02 20:50:37 +00:00

1 commit

Author SHA1 Message Date
bot-backend
30d91be796 feat(tradein/monitor): алерт на staleness данных deals по max(deal_date) (#2212)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 1m36s
CI / changes (pull_request) Successful in 8s
CI / backend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
Джоба-статус rosreestr_* остаётся done при quarter-stale данных (inserted=0
== всё импортировано), маскируя пропущенный операторский импорт нового
квартала. Новый daily-монитор смотрит max(deal_date) и поднимает ERROR-алерт
(→ GlitchTip), когда следующий квартал просрочен публикацией
(порог = конец имеющегося квартала + 3 мес + 45д лага).

Расследование (2026-07-02): импорт НЕ сломан — deal_date = лейбл начала
квартала, 2026Q1 = последний опубликованный Росреестром (Q2 закончился
30.06, публикация ожидается ~август; исторические кварталы загружены
разово 26.04). Монитор ловит именно пропуск ОПЕРАТОРСКОГО шага
(data/sql/02_load_all_quarters.sh), когда quarter_poll задетектит Q2.

- app/tasks/deals_freshness_monitor.py — чистая evaluate_deals_freshness
  (frozen-now testable) + DB-обёртка; overdue → ERROR-лог, не failed
- scheduler.py + product_handlers.py — оба dispatch-пути (kit боевой + legacy)
- data/sql/162 — seed (daily, 08:00-09:00 UTC, lag_allowance_days=45)
- 23 теста: арифметика порога (год-переход, clamp), migration props, parity

Refs #2212
2026-07-02 23:31:36 +03:00