From 1ea8d0b721017e43e8fff8a6b5f5bc1f0cd53300 Mon Sep 17 00:00:00 2001 From: Light1YT Date: Fri, 26 Jun 2026 11:20:02 +0500 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.РФ ЖК) is scheduled WEEKLY (settings.scrape_kn_cron='15 4 * * mon'), but its freshness thresholds were fresh_days=2 / stale_days=5 — so the monitor flagged kn "stale" every Wed-Sun by design, a guaranteed weekly false-positive that would desensitize the team to the GlitchTip alert. The freshness monitor (#1904) caught this on its first prod run (06-26 09:00 MSK: "kn [stale, 3.9d]"). Recalibrate to weekly cadence (mirror objective 7/14): fresh_days=8 (full week + Monday-run completion buffer), stale_days=14 (alert only after ~two missed Mondays). +regression test pinning kn stays fresh through the week. 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"