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"