gendesign/backend/tests/services
bot-backend 7d5ca247ca fix(ptica): ключ gisogd_permits — id документа на портале, а не (группа, номер) (#2986)
`UNIQUE (doc_group, doc_num)` вводился, чтобы склеивать ОДИН документ,
пришедший из двух схем портала. Замер 20.08.2026 показал, что задача,
ради которой ключ введён, почти отсутствует, а побочный эффект огромен:
docNum у ГИСОГД НЕ уникален — разрешение и изменения к нему носят один
номер.

    группа   документов   различных key   различных docNum   схлопывается
    DocRS         6098          6096            4305             1793
    DocRV         5419          5415            4969              450
    DocIZ          548           547             393              155

    общих docNum между схемами (DocRS): 2   ← ради этого ключ и вводился
    общих key    между схемами (DocRS): 2   ← те же два

На проде 9182 строки против 12 065 документов на портале — нет 23.9 %
реестра. Пример 66-06-06-2026: портал отдаёт два документа (key …719586 —
само разрешение, key …752293 — изменения к нему), а UPSERT с
предпочтением позднего date_reg оставлял только изменение. Так вытеснено
598 из 4320 строк РНС (13.8 %) — в §6 на месте разрешения показывается
изменение к нему, без признака подмены.

Ключ стал `UNIQUE (source_key)`: разделяет разрешение и изменения (разные
key) и по-прежнему склеивает настоящие межсхемные дубли (у них key
ОБЩИЙ — ровно 7 записей по всем группам). Дедуп перед сменой не нужен:
source_key на проде уже уникален (9182 из 9182, NOT NULL).

Заодно группа DocIZ добавлена в GROUP_CODE — её не было вовсе, 548
документов не грузились. CHECK расширен значением 'IZ'.

§6 сужена до РНС/РВЭ ЯВНО: агрегат обещает total_count = rs_count +
rv_count, а строки 'IZ' попадали бы в total и ни в один счётчик.
Показывать ли изменения отдельной строкой — вопрос продуктовый (#2986);
до его решения сужение стоит в запросе, а не держится на том, что таких
строк «пока нет».

Проверки:
- два гейта на лоадер (GROUP_CODE и цель ON CONFLICT) — БЕЗ базы,
  двусторонние: на origin/main дают конкретные неверные значения
  ({'DocRS','DocRV'} и старый ON CONFLICT в тексте запроса);
- гейт на §6 и контроль инварианта total = rs + rv на данных — красные
  на origin/main;
- герметичная репетиция миграции на временной копии: со старым ключом
  разрешение и изменение схлопываются в одну строку (и остаётся именно
  изменение — как на проде), после миграции живут раздельно; межсхемный
  дубль по-прежнему склеивается; CHECK принимает 'IZ' и отвергает мусор.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 22:41:27 +05:00
..
analysis_runs feat(parcels): typed AnalyzeResponse + run-history read endpoints (#961) 2026-06-06 18:13:34 +00:00
cadastre fix(ptica): WAF-блок прерывает backfill_parcel_geom, а не гонит его дальше по кварталам (#2464) (#2969) 2026-08-20 10:34:26 +00:00
chat feat(chat): tool get_parcel_info — курируемый градрегламент/ЗОУИТ/ЕГРН в контекст чата (#2366) 2026-07-04 01:24:42 +00:00
exporters fix(ptica): число ЗОУИТ перестаёт подписываться как число типов (#2464) (#2961) 2026-08-20 09:17:06 +00:00
forecasting docs(ptica): фактор уверенности называл не ту величину (#2464-H) (#2878) 2026-08-13 21:21:38 +00:00
generative fix(generative): устаревший VAT/office caveat в concept PDF (#2445-C1) (#2455) 2026-07-05 19:40:30 +00:00
llm feat(chat): tool get_parcel_info — курируемый градрегламент/ЗОУИТ/ЕГРН в контекст чата (#2366) 2026-07-04 01:24:42 +00:00
scrapers fix(ptica): act_date — дата акта об изъятии, а не первой попавшейся ссылки (#2464) 2026-08-20 16:43:27 +00:00
site_finder fix(ptica): ключ gisogd_permits — id документа на портале, а не (группа, номер) (#2986) 2026-08-20 22:41:27 +05:00
__init__.py feat(cadastre): bulk_harvest worker + grid-walker + admin API (#168 PR3/5) (#171) 2026-05-15 13:31:32 +03:00
test_2464_docs_match_code.py docs(ptica): шесть мест, где документация расходилась с кодом (#2464) (#2968) 2026-08-20 10:25:22 +00:00
test_2464_kn_lock_key.py fix(ptica): ключ синглтон-лока kn-свипа зависит от множества, а не от порядка (#2464) (#2970) 2026-08-20 10:34:30 +00:00
test_2464a_job_settings_savepoint.py fix(ptica): job_settings не отравляет чужую сессию при сбое БД (#2464 кластер A) (#2937) 2026-08-19 15:42:39 +00:00
test_2464h_timing_overlap_formula.py docs(ptica): три комментария, утверждавших не то, что делает код (#2464 кластер H) (#2943) 2026-08-19 17:09:24 +00:00
test_analytics_queries_domrf_dedup.py fix(analytics): de-inflate domrf_kn snapshot counts (8.49×) + backfill UPSERT columns (#2464) (#2470) 2026-07-08 07:30:12 +00:00
test_cadastre_bulk.py fix(ptica): бан НСПД по WAF больше не глотается сборщиком кварталов (#2464-A) (#2881) 2026-08-14 06:00:10 +00:00
test_dadata_client.py fix(ptica): дрейф формы ответа DaData не роняет весь гео-проход (#2464) (#2942) 2026-08-19 16:59:49 +00:00
test_ekburg_permits.py feat(sf): geocode geom для ekburg_construction_permits из МСК-66 (#1124) 2026-06-07 11:16:45 +00:00
test_forecast_request_cache.py perf(forecast): per-request memoization cache for §22 cold build (#1129) 2026-06-08 05:26:27 +00:00
test_functional_zone_lookup.py fix(ptica): шесть lookup'ов /analyze глотали ошибку БД без SAVEPOINT (#2464) (#2951) 2026-08-20 07:38:23 +00:00
test_granddoc_lookup.py fix(ptica): шесть lookup'ов /analyze глотали ошибку БД без SAVEPOINT (#2464) (#2951) 2026-08-20 07:38:23 +00:00
test_ird_analyze.py fix(site_finder): SAVEPOINT-isolate gate-lookup db.execute swallows (#2464 Wave 2) (#2468) 2026-07-08 06:46:03 +00:00
test_ird_overlay_lookup.py fix(ptica): шесть lookup'ов /analyze глотали ошибку БД без SAVEPOINT (#2464) (#2951) 2026-08-20 07:38:23 +00:00
test_job_settings.py fix(admin-jobs): UPSERT в PUT /admin/jobs/settings — не терять изменения (#1223) 2026-06-13 08:36:23 +00:00
test_krt_lookup.py fix(site_finder): SAVEPOINT-isolate gate-lookup db.execute swallows (#2464 Wave 2) (#2468) 2026-07-08 06:46:03 +00:00
test_mapping_review.py feat: ревью-инструмент авто-маппингов Объектив↔ДОМ.РФ (/admin/mapping-review) (#2278) 2026-07-03 07:59:13 +00:00
test_newbuilding_crossload.py fix(sf): psql stdin-bootstrap пароля gendesign_reader + COALESCE-protect внешних id (review fixup, #976) 2026-06-12 11:26:40 +03:00
test_nspd_denorm.py fix(week-review): backend-аудит v2 — 82 фиксов (#1660) 2026-06-17 17:13:38 +00:00
test_obj_class_backfill.py feat(etl): housing-class normalization fallback via yandex_realty trigram match (#38) (#1911) 2026-06-26 07:44:25 +00:00
test_objective_backfill.py fix(ptica): гео-проход не тратит геокод на занятых кандидатов и не «подтверждает» их (#2464) (#2929) 2026-08-19 11:52:07 +00:00
test_own_developer_ids_config.py feat(site-finder): own-portfolio data source for §25.3 cannibalization (#1169 PR1) 2026-06-08 16:21:53 +05:00
test_planning_lookup.py fix(ptica): шесть lookup'ов /analyze глотали ошибку БД без SAVEPOINT (#2464) (#2951) 2026-08-20 07:38:23 +00:00
test_ppt_tep_lookup.py fix(site_finder): SAVEPOINT-isolate gate-lookup db.execute swallows (#2464 Wave 2) (#2468) 2026-07-08 06:46:03 +00:00
test_quarter_dump_lookup.py fix(site-finder): true-counts вместо молча-усечённых len(list) в connection-points/utility (#2445-A1/A2) (#2450) 2026-07-05 18:54:49 +00:00
test_recommend_mix_velocity.py fix(analytics): recommend_mix success-boost regression from view 172 (#1955) 2026-06-27 15:49:40 +05:00
test_reservation_lookup.py fix(ptica): шесть lookup'ов /analyze глотали ошибку БД без SAVEPOINT (#2464) (#2951) 2026-08-20 07:38:23 +00:00
test_utility_characteristics.py feat(site-finder): теплотрассы из OSM в слой инженерной инфраструктуры (Фаза C1) (#2280) 2026-07-03 08:05:44 +00:00
test_weather_cache.py fix(ptica): «0 мм осадков» перестаёт означать «данных нет» (#2464) (#2947) 2026-08-20 07:00:01 +00:00
test_zone_regulation_backfill.py fix(site_finder): SAVEPOINT-isolate DB errors across cluster A (#2464) (#2465) 2026-07-07 12:50:11 +00:00
test_zone_regulation_extract.py feat(sf): zone_regulation_cache — ПЗЗ-регламент по zone_index + числовой экстракт (#1099) 2026-06-06 19:31:28 +00:00
test_zone_regulation_memo.py fix(site-finder): optimize zone-regulation resolve in /analyze (#1850) 2026-06-25 09:12:41 +00:00
test_zone_regulation_write_session.py fix(site-finder): isolate zone-regulation cache write off the request session (#1850 item 4) 2026-06-25 11:16:26 +00:00