feat(sf): enumerate изъятия/резервирования с pravo.gov66 → land_reservation (#1062) #1145
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
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#1145
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/reservation-pravo-enumerator"
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?
Что
Подключает подтверждённый источник к готовому парсеру
land_reservation(#1091): автоэнумерация постановлений об изъятии/резервировании ЗУ сpravo.gov66.ru. Закрывает ИРД-5 #1062 (был needs-human — источник найден разведкой 2026-06-07).Источник (подтверждён live)
pravo.gov66.ru/search/?q=<2-3 слова>&law_type=Постановление(server-rendered HTML, httpx) → ссылки/{NNNNN}/→ PDF/media/pravo/{NUM}-ПП_{hash}.pdf. ⚠️ движокqстрогий (2-3 слова; 1/4+ → 0).Состав
pravo_gov66_client.py—search_documents(query, law_type, since)+get_document_pdf_url(doc_id)+fetch_pdf(verify=False, росс-CA #242).reservation_ingest.pyпереписан:ingest_reservations()→ enumerate по_RESERVATION_QUERIES=["изъятие земельных участков","резервирование земельных участков"]→ фильтр заголовков (изъят/резерв + Екатеринбург/Свердлов) → fetch PDF → готовыйextract_from_pdf→ upsert.docs=override сохранён. Placeholder_SEED_DOCSудалён.После merge (прод)
ingest_reservations()→SELECT count(*), reservation_kind FROM land_reservation GROUP BY 2. Проверить живой search (число хитов), regex PDF-путей если сайт сменил.Closes #1062 (ingest). Часть #1067.
✅ APPROVE — pravo.gov66 enumerator → land_reservation (закрывает ingest #1062).
Verified:
verify=Falseприсутствует везде вpravo_gov66_client.py(search/get_pdf_url/fetch_pdf) с #242-комментом → НЕ dead-on-arrival._RE_DOC_PATH/_RE_PDF_PATH— линейные (negative char-class, без catastrophic backtracking); graceful 0-хитов/malformed → []/None.reservation_ingestrewrite чистый: enumerate (dedup by doc_id + title-filter изъят|резерв ∧ Екб|Свердл) + back-compat_ingest_explicit_docs; SAVEPOINT per-row; CAST psycopg v3; source='pravo_gov66'.pravo_gov66_client.pyиreservation_ingest.py— 0 строк >100 символов. ruff чист.#1122 carry-over (tracked, НЕ ухудшено этим PR): parser
_RE_ACT_NUMBERReDoS (p2) + NULL-act_number дедуп (p2) — унаследовано из #1118, не регресс. ⚠️ Прод-запускingest_reservationsдержать до закрытия #1122 item 1 (ReDoS) — этот PR делает real-ingest возможным, но manual → последовательность контролируема.Завершает #1062 end-to-end: parser #1118 + analyze-врезка #1127 + enumerator #1145. Хорошая работа.
Merging (squash).