No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
вторичка
ИРД
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#1948
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/freshness-output-floor"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Зачем
Прод-проверка #1947 (zero-output
upd_7d==0) показала, что чек не ловит реальную поломку и ложно-срабатывает:kn_flatslatest done-прогон далflats_count=9(не ровно 0) →==0мимо. А 9 против здоровых ~376k — это поломка (#1945, тихо 5+ недель: ground-truthdomrf_kn_flatslatest snapshot 2026-06-22=9 vs 2026-05-17=376604).kn_flats.fresh_days=8(недельная каденция) → здоровый прогон возрастом 7–8d даётupd_7d=0приstatus=ok→ ложный downgrade ~1 день/неделю.Первый редизайн (single-newest
last_success_work) адверсариал-ревью (4 линзы) зарубило блокером: логический цикл загрузки — это несколько done-прогонов (objective пишет строку на каждую из 4 группgroup_name; kn — наregion_codes+ resume-хвост), поэтому одиночный последний прогон искажает картину. Прод подтвердил: objective single-newest=324570 (повезло, что Свердловская финишировала последней; Челябинск=68387), kn_flats single-newest=9 (resume-хвост).Что
Floor сравнивается с
SUM(work_col)по всем done-прогонам цикла в окнеfresh_days(а не одиночный прогон и не хардкод-7d):SUM 7d=946264, kn_flatsSUM 8d=9).fresh_days→ здоровый недельный прогон 7–8d остаётся в окне → нет aging-FP (фикс #1947 сохранён).make_interval(secs => fresh_days*86400)(paramdaysв PG — int;secs— double, future-proof для дробного fresh_days).COALESCE(work_col,0)— NULL-счётчик = 0. Без::-каста.Даунгрейд:
alert_on_zero_output and timestamp_col is None and status=='ok' and recent_output is not None and recent_output < min_output_rows(строгое<).Реестр (floors сохранены):
kn_flats=50000(healthy ~376k, broken sum ≤3670),objective=1000(SUM 7d ~946k, наименьшая группа 68k). Комменты переписаны на cycle-sum basis + KNOWN LIMITATION по kn_flats (zombie-resume малый хвост без полного прогона в окне → транзиентный one-cycle ложняк, самозаживает).Безопасность / контракт
recent_output(int|None) в каждом source-объекте;reasonуже был. Эндпоинтdict[str, Any](нет response_model) → ключ проходит, фронт/freshnessне консьюмит, openapi-codegen не задет (ревью frontend-contract: ✅ clean).::-cast grep пусто,pytest -k "freshness or admin_scrape"→ 19 passed, 1 skipped; консьюмерtest_scrape_freshness_check→ 5 passed (status=failed → алёрт; critical=True → error-level GlitchTip).Migration не нужна (чистый код). После деплоя
GET /admin/scrape/freshnessдолжен показатьkn_flatsсrecent_output=9, status=failed, reason=low-output…→ ловит #1945, который тихо шёл 5+ недель.