ПТИЦА: убрать мёртвую фазу bulk_harvest, которая на каждый квартал запрашивала ПЗЗ у НСПД и писала их в таблицу без читателей #3579

Merged
bot-backend merged 4 commits from fix/ptica-bulk-harvest-phase25-removal into main 2026-09-17 11:12:02 +00:00
Collaborator

#2985 — фаза 2.5 bulk_harvest: запрос ПЗЗ в НСПД на каждый квартал без читателя

Что было. После основного обхода harvest_quarter отдельно обходил сеткой слой 875838: client.get_territorial_zones_in_bbox, 7×7 = 49 запросов к НСПД на квартал. Результат писался в cad_territorial_zones через _save_territorial_zones.

Почему убираем.

  • У таблицы нет читателей. git grep cad_territorial_zones вне миграций находит только сам писатель. На проде (Poincare, 17.09) от таблицы не зависит ни одно представление или функция: pg_depend/pg_rewrite дают 0, pg_proc.prosrc тоже 0.
  • Запись ничего не даёт. В cad_territorial_zones 1 строка (fetched_at 2026-05-24), zone_code и zone_name в ней пустые. Два полных прохода по ЕКБ (24.05 и 19.06, по 2408 кварталов) оставили в таблице эту одну строку.
  • ПЗЗ попадают в отчёт другим путём: nspd_syncnspd_quarter_dumps.features_jsonquarter_dump_lookup._get_zoning.

Откуда решение. Решение удалить фазу, а таблицу и данные оставить пришло в постановке задачи 17.09. В #2985 оно не записано: комментариев владельца там нет, есть один комментарий bot-backend от 28.08. В прошлой версии тела PR решение было названо «вариантом (а)», и это неверно. В issue варианты идут без букв: первый — «довести трубу до конца», второй — «убрать Phase 2.5 целиком вместе с таблицей». Этот PR не совпадает ни с одним из них полностью: фаза убрана, таблица осталась. Поэтому здесь стоит Refs, а не ключевое слово закрытия. Порядок закрытия описан в конце.

Что сделано:

  • удалён блок Phase 2.5 в harvest_quarter, писатель _save_territorial_zones и ставший лишним import hashlib;
  • удалена обёртка NSPDBulkClient.get_territorial_zones_in_bbox. Её вызывала только эта фаза, других вызовов по git grep нет ни в репозитории, ни в tradein-mvp;
  • удалены tests/services/cadastre/test_bulk_harvest_territorial.py и мок get_territorial_zones_in_bbox в test_cadastre_bulk.py;
  • из комментариев bulk_harvest.py и beat_schedule.py убраны ссылки на фазу. В beat_schedule было написано, что ПЗЗ приходят через Phase 2.5, а на деле их приносит nspd_sync;
  • отдельным коммитом поправлены комментарии в шести тестах test_cadastre_bulk.py. Там было «grid-walk + territorial_zones фазы пропускаются», теперь «grid-walk фаза пропускается».

Чего НЕ трогали. Таблица cad_territorial_zones и её данные остались как есть, миграций нет. Файлы 102_…sql и 159_…sql — это история, их не меняли.

Попутно замечено, в этом PR не трогали. Асинхронный NSPDBulkClient.get_features_in_bbox_grid (nspd_bulk_client.py:459) остался без вызовов, и ссылка на него в bulk_harvest.py:398 теперь ведёт на неиспользуемый код. ird_harvest и opportunity_harvest вызывают одноимённый синхронный метод NSPDClient. Это вопрос для отдельного issue.

Правки по ревью

Исправлено

  1. (блокирующее) Пункт 2 приёмки не отличал старую версию от новой. Проверил обе улики ревью, обе верны:

    • phase_state сливается через shallow || (scrape_cadastre.py:82-84), и терминальный {"phase": "done", …} перетирает ключ phase. На проде 17.09 в cadastre_jobs 23 задачи (done 12, cancelled 11). Все отработали со старым кодом, где фаза 2.5 была, а phase_state::text LIKE '%territorial_zones%' даёт 0 из 23;
    • в cad_territorial_zones 1 строка с min = max(fetched_at) = 2026-05-24 15:16. Проход 19.06 не добавил строк и не обновил эту, хотя ON CONFLICT DO UPDATE ставит fetched_at = NOW().

    Пункт 2 переписан на признак из логов воркера (ниже). Одно уточнение к формулировке ревью: строку harvest_quarter done без хвоста пишет и nspd_sync (nspd_sync.py:340, harvest_quarter done: cad=…). Он стоит в beat (nspd-harvest-stale-quarters, пн 04:00 МСК) и выполняется в том же gendesign-worker-1. Кроме того, синхронный NSPDClient, которым пользуется nspd_sync, пишет get_features_in_bbox_grid layer=875838 без двоеточия. Поэтому в приёмке шаблоны заданы точно: harvest_quarter done: quarter= и get_features_in_bbox_grid: layer=875838 с двоеточием.

  2. Ключевое слово закрытия для #2985 снято, вместо него Refs. Оба условия ревью пока не выполнены: решения в issue нет, а пункт 2 приёмки на проде ещё не проверен.

  3. (неблокирующее) Устаревшие комментарии в тестах, строки 492, 557, 762, 837, 907, 1226. Поправлены отдельным коммитом 8def3402. При bbox=None действительно пропускается только grid-walk (bulk_harvest.py:176, :335). Поведение тестов не меняется, поэтому тест на эту правку не нужен.

  4. (неблокирующее) Ссылка на решение. Раздел «Откуда решение» выше: источник назван, «вариант (а)» убран.

Опровергнутого нет. Мёртвый асинхронный get_features_in_bbox_grid признан, но оставлен на отдельный issue, как и предлагало ревью.

Как проверил, что новый признак различает версии. Прогнал harvest_quarter на настоящем NSPDBulkClient, подменив только search_by_quarter и wms_feature_info: quarter_bbox_3857 возвращает валидный bbox, логи собирались на уровне INFO. Зонд был временным, в PR его нет, после прогона он удалён. Строки по трём шаблонам:

старый код (bulk_harvest.py и nspd_bulk_client.py из 85d455e3, main до PR):

LOG: get_features_in_bbox_grid: layer=875838 grid=7x7 unique_features=0
LOG: harvest_quarter: territorial_zones quarter=66:41:0303161 upserted=0
LOG: harvest_quarter done: quarter=66:41:0303161 parcels=0 buildings=0 constructions=0 zouit=0 grid_requests=0 failed_layers=None
COUNTS: {'tz': 1, 'grid875838': 1, 'done_bulk': 1}

новый код:

LOG: harvest_quarter done: quarter=66:41:0303161 parcels=0 buildings=0 constructions=0 zouit=0 grid_requests=0 failed_layers=None
COUNTS: {'tz': 0, 'grid875838': 0, 'done_bulk': 1}

Остальные ветки старого кода тоже проверил по исходнику. Сбой всего слоя или любое другое исключение фазы дают WARNING harvest_quarter: territorial_zones failed quarter=…, то есть шаблон совпадает. При WAF-бане исключение пробрасывается, и квартал не доходит до harvest_quarter done: quarter=. Значит, в старой версии каждый квартал с валидным bbox, у которого есть строка done: quarter=, оставляет и строку harvest_quarter: territorial_zones. На проде app-логи уровня INFO попадают в docker logs gendesign-worker-1: воркер запущен с --loglevel=info, и строки worker_process_init: … из celery_app видны в логе.

Тест по значению

test_harvest_quarter_makes_no_territorial_zones_request_2985 берёт квартал без overflow, с валидным bbox и пустыми meta и проверяет две вещи:

  • список вызовов клиента НСПД ровно ["search_by_quarter"];
  • фазы прогресса ровно ["snapshot_started", "snapshot_done", "done"].

Фальсификация (перепрогон после merge origin/main, HEAD 89b4a675)

Подставил в worktree bulk_harvest.py и nspd_bulk_client.py из 85d455e3 (main до PR, фаза 2.5 на месте). Тест покраснел, pytest rc=1:

E       AssertionError: assert ['search_by_q...x().__iter__'] == ['search_by_quarter']
E         Left contains 2 more items, first extra item: 'get_territorial_zones_in_bbox'
1 failed, 7 warnings in 1.47s

Затем вернул исправленные файлы. diff -q с HEAD пустой, git status чистый, тест снова зелёный (rc=0). Ревьюер отдельно проверил мутацию M2: прямой await client.get_features_in_bbox_grid(875838, bbox) без обёртки тоже роняет тест (Left contains one more item: 'get_features_in_bbox_grid'). Значит, тест ловит любой лишний вызов НСПД, а не только имя обёртки.

Прогоны (backend ПТИЦЫ, rc снят у самого pytest, после merge origin/main be140328)

  • uv run python -m pytest tests/services/test_cadastre_bulk.py tests/services/cadastre tests/scrapers -q203 passed, 5 skipped, rc=0
  • весь сьют uv run python -m pytest tests/ -q -p no:cacheprovider5050 passed, 4 failed, 87 skipped, 11 deselected, rc=1. Все 4 падения — известные tests/ops/test_2203_backup_trailer_grep_dashdash.py на macOS (BSD mktemp), с правкой не связаны
  • uv run ruff check app tests → All checks passed, rc=0; ruff format --check по 4 изменённым файлам → already formatted, rc=0

Ветка уже была запушена, поэтому вместо rebase сделан merge origin/main. Из main пришли только файлы tradein-mvp/**, конфликтов не было.

Деплой

Меняется только backend/**, поэтому деплой идёт через deploy.yml: пересоберутся образы backend, worker и beat. backend и beat пересоздаются всегда, worker — по гарду #3029. Миграций нет. На 17.09 10:25 UTC status='running' в kn_scrape_runs и objective_scrape_runs — 0, в cadastre_jobs нет running/pending, последняя задача 19.06. Непосредственно перед мержем ещё раз проверить status='running' в kn_scrape_runs и objective_scrape_runs: worker может быть пересоздан.

Приёмка на проде

  1. Маркер кода в контейнерах (проверить до 2026-09-20). Сейчас (17.09 10:25 UTC) docker exec <c> grep -c "_save_territorial_zones\|get_territorial_zones_in_bbox" /app/app/services/cadastre/bulk_harvest.py даёт 6 и в gendesign-backend-1, и в gendesign-worker-1. После деплоя в обоих должно быть 0. В старой версии маркер есть, в новой нет, поэтому проверка различает версии.

  2. Поведение: в первом ручном bulk harvest после деплоя нет запросов ПЗЗ. Bulk harvest запускается только вручную (enqueue_cadastre_harvest, очередь geo), последний раз 19.06. Для этого прогона:

    • убедиться, что docker inspect -f '{{.State.StartedAt}}' gendesign-worker-1 раньше cadastre_jobs.started_at задачи. Если воркер пересоздали во время прогона, логи неполные и проверка недействительна;
    • docker logs gendesign-worker-1 --since <started_at задачи> 2>&1 | grep -c "harvest_quarter done: quarter="больше 0 (прогон дошёл до кварталов);
    • docker logs gendesign-worker-1 --since <started_at задачи> 2>&1 | grep -c "harvest_quarter: territorial_zones"0;
    • docker logs gendesign-worker-1 --since <started_at задачи> 2>&1 | grep -c "get_features_in_bbox_grid: layer=875838" (с двоеточием) → 0.

    В старой версии на каждый квартал с валидным bbox, у которого есть done: quarter=, приходится строка harvest_quarter: territorial_zones (см. «Как проверил» выше). Поэтому ноль при ненулевом done: quarter= отличает новую версию от старой. Проверка по phase_state и по числу строк в cad_territorial_zones не годится: оба признака одинаковы в обеих версиях (см. «Правки по ревью», п. 1).

    Если до 2026-10-01 ручного прогона не будет, приёмка ограничивается пунктом 1, и это нужно явно записать в #2985 с датой.

Закрытие #2985: вручную, не этим PR. Закрывать после двух шагов: (1) владелец записывает в #2985 решение дословно («решение от 17.09 — удалить фазу 2.5, таблицу и данные оставить»); (2) пройден пункт 2 приёмки или записан отказ от него по сроку 2026-10-01.

Refs #2985

🤖 Generated with Claude Code

## #2985 — фаза 2.5 bulk_harvest: запрос ПЗЗ в НСПД на каждый квартал без читателя **Что было.** После основного обхода `harvest_quarter` отдельно обходил сеткой слой 875838: `client.get_territorial_zones_in_bbox`, 7×7 = 49 запросов к НСПД на квартал. Результат писался в `cad_territorial_zones` через `_save_territorial_zones`. **Почему убираем.** - У таблицы нет читателей. `git grep cad_territorial_zones` вне миграций находит только сам писатель. На проде (Poincare, 17.09) от таблицы не зависит ни одно представление или функция: `pg_depend`/`pg_rewrite` дают 0, `pg_proc.prosrc` тоже 0. - Запись ничего не даёт. В `cad_territorial_zones` **1 строка** (`fetched_at 2026-05-24`), `zone_code` и `zone_name` в ней пустые. Два полных прохода по ЕКБ (24.05 и 19.06, по 2408 кварталов) оставили в таблице эту одну строку. - ПЗЗ попадают в отчёт другим путём: `nspd_sync` → `nspd_quarter_dumps.features_json` → `quarter_dump_lookup._get_zoning`. **Откуда решение.** Решение удалить фазу, а таблицу и данные оставить пришло в постановке задачи 17.09. **В #2985 оно не записано**: комментариев владельца там нет, есть один комментарий bot-backend от 28.08. В прошлой версии тела PR решение было названо «вариантом (а)», и это неверно. В issue варианты идут без букв: первый — «довести трубу до конца», второй — «убрать Phase 2.5 целиком вместе с таблицей». Этот PR не совпадает ни с одним из них полностью: фаза убрана, таблица осталась. Поэтому здесь стоит `Refs`, а не ключевое слово закрытия. Порядок закрытия описан в конце. **Что сделано:** - удалён блок Phase 2.5 в `harvest_quarter`, писатель `_save_territorial_zones` и ставший лишним `import hashlib`; - удалена обёртка `NSPDBulkClient.get_territorial_zones_in_bbox`. Её вызывала только эта фаза, других вызовов по `git grep` нет ни в репозитории, ни в `tradein-mvp`; - удалены `tests/services/cadastre/test_bulk_harvest_territorial.py` и мок `get_territorial_zones_in_bbox` в `test_cadastre_bulk.py`; - из комментариев `bulk_harvest.py` и `beat_schedule.py` убраны ссылки на фазу. В `beat_schedule` было написано, что ПЗЗ приходят через Phase 2.5, а на деле их приносит `nspd_sync`; - отдельным коммитом поправлены комментарии в шести тестах `test_cadastre_bulk.py`. Там было «grid-walk + territorial_zones фазы пропускаются», теперь «grid-walk фаза пропускается». **Чего НЕ трогали.** Таблица `cad_territorial_zones` и её данные остались как есть, миграций нет. Файлы `102_…sql` и `159_…sql` — это история, их не меняли. **Попутно замечено, в этом PR не трогали.** Асинхронный `NSPDBulkClient.get_features_in_bbox_grid` (`nspd_bulk_client.py:459`) остался без вызовов, и ссылка на него в `bulk_harvest.py:398` теперь ведёт на неиспользуемый код. `ird_harvest` и `opportunity_harvest` вызывают одноимённый синхронный метод `NSPDClient`. Это вопрос для отдельного issue. ## Правки по ревью **Исправлено** 1. **(блокирующее) Пункт 2 приёмки не отличал старую версию от новой.** Проверил обе улики ревью, обе верны: - `phase_state` сливается через shallow `||` (`scrape_cadastre.py:82-84`), и терминальный `{"phase": "done", …}` перетирает ключ `phase`. На проде 17.09 в `cadastre_jobs` 23 задачи (done 12, cancelled 11). Все отработали со старым кодом, где фаза 2.5 была, а `phase_state::text LIKE '%territorial_zones%'` даёт **0 из 23**; - в `cad_territorial_zones` 1 строка с `min = max(fetched_at) = 2026-05-24 15:16`. Проход 19.06 не добавил строк и не обновил эту, хотя `ON CONFLICT DO UPDATE` ставит `fetched_at = NOW()`. Пункт 2 переписан на признак из логов воркера (ниже). Одно уточнение к формулировке ревью: строку `harvest_quarter done` без хвоста пишет и `nspd_sync` (`nspd_sync.py:340`, `harvest_quarter done: cad=…`). Он стоит в beat (`nspd-harvest-stale-quarters`, пн 04:00 МСК) и выполняется в том же `gendesign-worker-1`. Кроме того, синхронный `NSPDClient`, которым пользуется `nspd_sync`, пишет `get_features_in_bbox_grid layer=875838` **без двоеточия**. Поэтому в приёмке шаблоны заданы точно: `harvest_quarter done: quarter=` и `get_features_in_bbox_grid: layer=875838` с двоеточием. 2. **Ключевое слово закрытия для #2985 снято**, вместо него `Refs`. Оба условия ревью пока не выполнены: решения в issue нет, а пункт 2 приёмки на проде ещё не проверен. 3. **(неблокирующее) Устаревшие комментарии в тестах**, строки 492, 557, 762, 837, 907, 1226. Поправлены отдельным коммитом `8def3402`. При `bbox=None` действительно пропускается только grid-walk (`bulk_harvest.py:176`, `:335`). Поведение тестов не меняется, поэтому тест на эту правку не нужен. 4. **(неблокирующее) Ссылка на решение.** Раздел «Откуда решение» выше: источник назван, «вариант (а)» убран. **Опровергнутого нет.** Мёртвый асинхронный `get_features_in_bbox_grid` признан, но оставлен на отдельный issue, как и предлагало ревью. **Как проверил, что новый признак различает версии.** Прогнал `harvest_quarter` на настоящем `NSPDBulkClient`, подменив только `search_by_quarter` и `wms_feature_info`: `quarter_bbox_3857` возвращает валидный bbox, логи собирались на уровне INFO. Зонд был временным, в PR его нет, после прогона он удалён. Строки по трём шаблонам: старый код (`bulk_harvest.py` и `nspd_bulk_client.py` из `85d455e3`, main до PR): ``` LOG: get_features_in_bbox_grid: layer=875838 grid=7x7 unique_features=0 LOG: harvest_quarter: territorial_zones quarter=66:41:0303161 upserted=0 LOG: harvest_quarter done: quarter=66:41:0303161 parcels=0 buildings=0 constructions=0 zouit=0 grid_requests=0 failed_layers=None COUNTS: {'tz': 1, 'grid875838': 1, 'done_bulk': 1} ``` новый код: ``` LOG: harvest_quarter done: quarter=66:41:0303161 parcels=0 buildings=0 constructions=0 zouit=0 grid_requests=0 failed_layers=None COUNTS: {'tz': 0, 'grid875838': 0, 'done_bulk': 1} ``` Остальные ветки старого кода тоже проверил по исходнику. Сбой всего слоя или любое другое исключение фазы дают WARNING `harvest_quarter: territorial_zones failed quarter=…`, то есть шаблон совпадает. При WAF-бане исключение пробрасывается, и квартал не доходит до `harvest_quarter done: quarter=`. Значит, в старой версии каждый квартал с валидным bbox, у которого есть строка `done: quarter=`, оставляет и строку `harvest_quarter: territorial_zones`. На проде app-логи уровня INFO попадают в `docker logs gendesign-worker-1`: воркер запущен с `--loglevel=info`, и строки `worker_process_init: …` из `celery_app` видны в логе. ## Тест по значению `test_harvest_quarter_makes_no_territorial_zones_request_2985` берёт квартал без overflow, с валидным bbox и пустыми meta и проверяет две вещи: - список вызовов клиента НСПД ровно `["search_by_quarter"]`; - фазы прогресса ровно `["snapshot_started", "snapshot_done", "done"]`. ## Фальсификация (перепрогон после merge origin/main, HEAD `89b4a675`) Подставил в worktree `bulk_harvest.py` и `nspd_bulk_client.py` из `85d455e3` (main до PR, фаза 2.5 на месте). Тест покраснел, pytest rc=1: ``` E AssertionError: assert ['search_by_q...x().__iter__'] == ['search_by_quarter'] E Left contains 2 more items, first extra item: 'get_territorial_zones_in_bbox' 1 failed, 7 warnings in 1.47s ``` Затем вернул исправленные файлы. `diff -q` с HEAD пустой, `git status` чистый, тест снова зелёный (rc=0). Ревьюер отдельно проверил мутацию M2: прямой `await client.get_features_in_bbox_grid(875838, bbox)` без обёртки тоже роняет тест (`Left contains one more item: 'get_features_in_bbox_grid'`). Значит, тест ловит любой лишний вызов НСПД, а не только имя обёртки. ## Прогоны (backend ПТИЦЫ, rc снят у самого pytest, после merge origin/main `be140328`) - `uv run python -m pytest tests/services/test_cadastre_bulk.py tests/services/cadastre tests/scrapers -q` → **203 passed, 5 skipped**, rc=0 - весь сьют `uv run python -m pytest tests/ -q -p no:cacheprovider` → **5050 passed, 4 failed, 87 skipped, 11 deselected**, rc=1. Все 4 падения — известные `tests/ops/test_2203_backup_trailer_grep_dashdash.py` на macOS (BSD mktemp), с правкой не связаны - `uv run ruff check app tests` → All checks passed, rc=0; `ruff format --check` по 4 изменённым файлам → already formatted, rc=0 Ветка уже была запушена, поэтому вместо rebase сделан `merge origin/main`. Из main пришли только файлы `tradein-mvp/**`, конфликтов не было. ## Деплой Меняется только `backend/**`, поэтому деплой идёт через `deploy.yml`: пересоберутся образы backend, worker и beat. backend и beat пересоздаются всегда, worker — по гарду #3029. Миграций нет. На 17.09 10:25 UTC `status='running'` в `kn_scrape_runs` и `objective_scrape_runs` — 0, в `cadastre_jobs` нет running/pending, последняя задача 19.06. **Непосредственно перед мержем** ещё раз проверить `status='running'` в `kn_scrape_runs` и `objective_scrape_runs`: worker может быть пересоздан. ## Приёмка на проде 1. **Маркер кода в контейнерах** (проверить до 2026-09-20). Сейчас (17.09 10:25 UTC) `docker exec <c> grep -c "_save_territorial_zones\|get_territorial_zones_in_bbox" /app/app/services/cadastre/bulk_harvest.py` даёт **6** и в `gendesign-backend-1`, и в `gendesign-worker-1`. После деплоя в обоих должно быть **0**. В старой версии маркер есть, в новой нет, поэтому проверка различает версии. 2. **Поведение: в первом ручном bulk harvest после деплоя нет запросов ПЗЗ.** Bulk harvest запускается только вручную (`enqueue_cadastre_harvest`, очередь `geo`), последний раз 19.06. Для этого прогона: - убедиться, что `docker inspect -f '{{.State.StartedAt}}' gendesign-worker-1` раньше `cadastre_jobs.started_at` задачи. Если воркер пересоздали во время прогона, логи неполные и проверка недействительна; - `docker logs gendesign-worker-1 --since <started_at задачи> 2>&1 | grep -c "harvest_quarter done: quarter="` → **больше 0** (прогон дошёл до кварталов); - `docker logs gendesign-worker-1 --since <started_at задачи> 2>&1 | grep -c "harvest_quarter: territorial_zones"` → **0**; - `docker logs gendesign-worker-1 --since <started_at задачи> 2>&1 | grep -c "get_features_in_bbox_grid: layer=875838"` (с двоеточием) → **0**. В старой версии на каждый квартал с валидным bbox, у которого есть `done: quarter=`, приходится строка `harvest_quarter: territorial_zones` (см. «Как проверил» выше). Поэтому ноль при ненулевом `done: quarter=` отличает новую версию от старой. Проверка по `phase_state` и по числу строк в `cad_territorial_zones` **не годится**: оба признака одинаковы в обеих версиях (см. «Правки по ревью», п. 1). Если до 2026-10-01 ручного прогона не будет, приёмка ограничивается пунктом 1, и это нужно явно записать в #2985 с датой. **Закрытие #2985: вручную, не этим PR.** Закрывать после двух шагов: (1) владелец записывает в #2985 решение дословно («решение от 17.09 — удалить фазу 2.5, таблицу и данные оставить»); (2) пройден пункт 2 приёмки или записан отказ от него по сроку 2026-10-01. Refs #2985 🤖 Generated with [Claude Code](https://claude.com/claude-code)
bot-backend added 1 commit 2026-09-17 10:04:10 +00:00
ПТИЦА: убрать мёртвую фазу 2.5 bulk_harvest — запрос ПЗЗ в НСПД на каждый квартал (#2985)
All checks were successful
CI / openapi-codegen-check (pull_request) Successful in 4m1s
CI / backend-tests (pull_request) Successful in 10m2s
CI Trade-In / changes (pull_request) Successful in 23s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 27s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
3ee5244491
harvest_quarter после основного обхода делал отдельный grid-walk слоя 875838
(49 запросов к НСПД на квартал) и писал результат в cad_territorial_zones.
Эту таблицу никто не читает: на проде 1 строка за два полных прохода по ЕКБ,
zone_code/zone_name пустые (маппинг свойств не совпадает с ответом НСПД).
ПЗЗ до отчёта доходят другой трубой: nspd_sync -> nspd_quarter_dumps.features_json.
Владелец 17.09 выбрал удаление фазы.

Удалено: блок Phase 2.5 в harvest_quarter, писатель _save_territorial_zones,
обёртка NSPDBulkClient.get_territorial_zones_in_bbox (других вызовов нет),
тесты писателя и мок в test_cadastre_bulk. Таблица и её данные не тронуты,
миграций нет. Поправлены комментарии, ссылавшиеся на фазу.

Новый тест: квартал без overflow с валидным bbox стоит ровно один запрос
к НСПД (search_by_quarter), фазы прогресса без territorial_zones_started.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Light1YT added 2 commits 2026-09-17 10:25:45 +00:00
В шести тестах test_cadastre_bulk.py комментарий к моку с xmin=None
говорил, что пропускаются «grid-walk + territorial_zones фазы». Фазы
territorial_zones в harvest_quarter после предыдущего коммита нет;
при bbox=None пропускается только grid-walk (bulk_harvest.py:176, :335).

Правка только в комментариях, поведение тестов не меняется.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Merge remote-tracking branch 'origin/main' into fix/ptica-bulk-harvest-phase25-removal
All checks were successful
CI Trade-In / changes (pull_request) Successful in 12s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 14s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 2m42s
CI / backend-tests (pull_request) Successful in 7m11s
89b4a67508
Light1YT added 1 commit 2026-09-17 10:50:51 +00:00
Merge remote-tracking branch 'origin/main' into fix/ptica-bulk-harvest-phase25-removal
All checks were successful
CI Trade-In / changes (pull_request) Successful in 26s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
6eaa31ac66
bot-backend merged commit 3a8513cd68 into main 2026-09-17 11:12:02 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3579
No description provided.