From 2304e09e37f22d3ada3c8798eec21129f4fcd022 Mon Sep 17 00:00:00 2001 From: bot-backend Date: Fri, 26 Jun 2026 06:33:29 +0000 Subject: [PATCH] fix(freshness): calibrate kn staleness thresholds to weekly cadence MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- backend/app/api/v1/admin_scrape.py | 8 ++++++-- backend/tests/api/v1/test_admin_scrape_freshness.py | 13 +++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/backend/app/api/v1/admin_scrape.py b/backend/app/api/v1/admin_scrape.py index fd7c54fc..bb094440 100644 --- a/backend/app/api/v1/admin_scrape.py +++ b/backend/app/api/v1/admin_scrape.py @@ -1290,8 +1290,12 @@ _FRESHNESS_SOURCES: list[FreshnessSource] = [ label="DOM.РФ kn-API (ЖК)", table="kn_scrape_runs", work_col="objects_count", - fresh_days=2.0, - stale_days=5.0, + # kn шедулится ЕЖЕНЕДЕЛЬНО (settings.scrape_kn_cron='15 4 * * mon', Mon 04:15 МСК), + # поэтому 2/5 дней давали ложный "stale" каждую среду-воскресенье. Калибруем под + # недельную каденцию (как objective 7/14): fresh до 8 дней (полная неделя + добег + # понедельничного прогона), stale при пропуске ~двух понедельников. + fresh_days=8.0, + stale_days=14.0, critical=True, ), FreshnessSource( diff --git a/backend/tests/api/v1/test_admin_scrape_freshness.py b/backend/tests/api/v1/test_admin_scrape_freshness.py index ebc1fe42..b62f07f1 100644 --- a/backend/tests/api/v1/test_admin_scrape_freshness.py +++ b/backend/tests/api/v1/test_admin_scrape_freshness.py @@ -195,3 +195,16 @@ def test_classify_freshness_boundaries() -> None: assert f(4.9, 2.0, 5.0) == "stale" assert f(5.0, 2.0, 5.0) == "critical" # ровно stale_days → 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"