fix(freshness): repoint nspd source to live nspd_quarter_dumps (data-table mode) #1908
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#1908
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/freshness-nspd-repoint"
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?
Расследование (по твоему запросу «разобраться почему умер»)
Монитор заалертил
nspd [failed, нет успешных прогонов]. Копнул — и оказалось, что NSPD не умер:nspd_scrape_runs(куда смотрел монитор) — это defunct-ledger заброшенного ручного bulk-region harvest: 3 прогона, всеtriggered_by=manual, всеfailed2026-04-30 с «WAF banned after 5 retries». Никогда не шедулился, заброшен после WAF-бана в апреле.tasks.nspd_sync.harvest_stale_quarters(в beat) + /analyze resolver write-back (#1891), оба пишутnspd_quarter_dumpsнапрямую, минуя ledger. Эта таблица свежая: 370 строк, 56 за 7 дней, последний fetch 2026-06-22.Итог: не мёртвый источник, а монитор смотрел не на ту таблицу. Ретайрить было бы ошибкой (потеряли бы реальный сигнал) — правильно репойнтнуть на живую таблицу.
Фикс
FreshnessSource.timestamp_col— новый режим «data-table»: свежесть =MAX(timestamp_col)вместо run-ledgerstatus-семантики (уnspd_quarter_dumpsнет status/started/finished, толькоfetched_at_utc).nspdрепойнт →nspd_quarter_dumps.fetched_at_utc, порогиfresh<14d / stale<30d(медленный кадастровый + lazy-refresh источник). Текущий age ~4d → fresh (ложный алерт снят).SQL psycopg-v3 безопасен (
CAST(:d1 AS interval), f-string только на trusted registry-именах). Без schema/codegen.Тесты
+2 (nspd data-table fresh→ok; stale 40d→critical), существующие репойнтнуты. 12 passed, ruff clean.
⚠️ Наблюдение: живой
harvest_stale_quartersвообще не пишет run-ledger — у scheduled-джобы нет observability своих прогонов (видим только косвенно черезnspd_quarter_dumps). Можно отдельно добавить ledger-запись в таск (out of scope этого PR).Refs #73