fix(freshness): calibrate kn staleness thresholds to weekly cadence
All checks were successful
Deploy / changes (push) Successful in 6s
Deploy / build-frontend (push) Has been skipped
Deploy / build-backend (push) Successful in 2m41s
Deploy / build-worker (push) Successful in 3m18s
Deploy / deploy (push) Successful in 1m28s

kn (DOM.РФ ЖК) runs weekly (Mon cron) but thresholds were 2/5 → false "stale" every Wed-Sun. Recalibrate to 8/14 (weekly, mirrors objective) + regression test. Surfaced by the freshness monitor's first prod run. Refs #73
This commit is contained in:
bot-backend 2026-06-26 06:33:29 +00:00
parent 66da75681f
commit 2304e09e37
2 changed files with 19 additions and 2 deletions

View file

@ -1290,8 +1290,12 @@ _FRESHNESS_SOURCES: list[FreshnessSource] = [
label="DOM.РФ kn-API (ЖК)", label="DOM.РФ kn-API (ЖК)",
table="kn_scrape_runs", table="kn_scrape_runs",
work_col="objects_count", work_col="objects_count",
fresh_days=2.0, # kn шедулится ЕЖЕНЕДЕЛЬНО (settings.scrape_kn_cron='15 4 * * mon', Mon 04:15 МСК),
stale_days=5.0, # поэтому 2/5 дней давали ложный "stale" каждую среду-воскресенье. Калибруем под
# недельную каденцию (как objective 7/14): fresh до 8 дней (полная неделя + добег
# понедельничного прогона), stale при пропуске ~двух понедельников.
fresh_days=8.0,
stale_days=14.0,
critical=True, critical=True,
), ),
FreshnessSource( FreshnessSource(

View file

@ -195,3 +195,16 @@ def test_classify_freshness_boundaries() -> None:
assert f(4.9, 2.0, 5.0) == "stale" assert f(4.9, 2.0, 5.0) == "stale"
assert f(5.0, 2.0, 5.0) == "critical" # ровно stale_days → critical assert f(5.0, 2.0, 5.0) == "critical" # ровно stale_days → critical
assert f(100.0, 2.0, 5.0) == "critical" assert f(100.0, 2.0, 5.0) == "critical"
def test_kn_thresholds_match_weekly_cadence() -> None:
"""kn шедулится еженедельно (Mon cron) → пороги должны покрывать полную неделю,
иначе ложный 'stale' каждую среду-воскресенье. Регрессия на калибровку."""
kn = next(s for s in admin_scrape._FRESHNESS_SOURCES if s.source == "kn")
f = admin_scrape._classify_freshness
# В течение недели после понедельничного прогона kn остаётся свежим.
assert f(3.9, kn.fresh_days, kn.stale_days) == "fresh" # пятница
assert f(6.5, kn.fresh_days, kn.stale_days) == "fresh" # воскресенье
# Пропуск одного понедельника → stale; двух → critical.
assert f(9.0, kn.fresh_days, kn.stale_days) == "stale"
assert f(15.0, kn.fresh_days, kn.stale_days) == "critical"