[P1][backend] rosreestr DKP: сделки заморожены на 2026-01-01 — расследовать источник и обновить #727

Closed
opened 2026-05-30 13:41:38 +00:00 by bot-analyst · 5 comments
Collaborator

Investigate-first. Шаг 1 (root cause) — обязательный deliverable коммент. НЕ грузить массово вслепую.

Проблема

  • Подтверждено: tradein deals max deal_date = 2026-01-01 (49 791 индивид. сделка), 149 дней stale.
  • Подтверждено upstream: gendesign main rosreestr_dealsквартальный агрегат (period_start_date, source_quarter, deal_count — НЕ индивид. сделки). max period_start_date = 2026-01-01 (Q1'26), last_loaded = 2026-04-30, 6.83M строк / 10.2M сделок. Ingestion РАБОТАЛ (грузился 30 апр), но Q1'26 — последний опубликованный Росреестром квартал.
  • Загадка provenance: tradein 49k ИНДИВИДУАЛЬНЫХ сделок с deal_date/rooms/area НЕ выводятся напрямую из квартального агрегата. Откуда реально tradein-сделки (др. источник / разовый дамп / FDW-view) — главный вопрос.

Половина причины linkage=0: свежие listings (2026-04/05) не имеют сделок в окне [deal−180д, +30д], т.к. сделки кончаются на 2026-01-01.

Шаг 1 — расследовать (deliverable = коммент)

  • проследить реальный источник tradein deals (tradein-mvp/backend/app/services/scrapers/rosreestr.py помечен «NOT a web scraper»; FDW user-mapping tradein_fdw_reader; tradein-mvp/deploy/import-rosreestr.sh).
  • определить ПОЧЕМУ 2026-01-01:
    • (a) остановленный ingestion job tradein-стороны (импорт не перезапускался с Q1)?
    • (b) Росреестр ДКП публикуется поквартально с лагом → Q1'26 реально последний (тогда ждать Q2'26; частичный fix только за счёт avito listing_date + старых сделок)?
    • (c) разовый bulk-дамп, refresh-pipeline не существует → epic?

Шаг 2 — по итогу (a/b/c)

  • (a): перезапустить импорт, догрузить. (b): закрыть как upstream-lag, зафиксировать. (c): epic на refresh-pipeline.

DoD

  • Шаг 1: коммент с реальным источником tradein deals + root cause (a/b/c) + файлы.
  • Шаг 2 при (a): max(deal_date) сдвинут к ~сейчас.

Risk

  • Может затрагивать main gendesign БД (партиционированная rosreestr_deals, 6.8M). Объём согласовать с человеком.

Контекст

  • Root cause: #721 (comment) · DaData/гео/кадастр НЕ при чём (ось — время) · парный рычаг — avito listing_date · Эпик #721.
> Investigate-first. Шаг 1 (root cause) — обязательный deliverable коммент. НЕ грузить массово вслепую. ## Проблема - **Подтверждено:** tradein `deals` max `deal_date` = **2026-01-01** (49 791 индивид. сделка), 149 дней stale. - **Подтверждено upstream:** gendesign main `rosreestr_deals` — **квартальный агрегат** (`period_start_date`, `source_quarter`, `deal_count` — НЕ индивид. сделки). max `period_start_date` = **2026-01-01** (Q1'26), `last_loaded` = **2026-04-30**, 6.83M строк / 10.2M сделок. Ingestion РАБОТАЛ (грузился 30 апр), но Q1'26 — последний опубликованный Росреестром квартал. - **Загадка provenance:** tradein 49k ИНДИВИДУАЛЬНЫХ сделок с `deal_date`/rooms/area НЕ выводятся напрямую из квартального агрегата. Откуда реально tradein-сделки (др. источник / разовый дамп / FDW-view) — главный вопрос. Половина причины linkage=0: свежие listings (2026-04/05) не имеют сделок в окне `[deal−180д, +30д]`, т.к. сделки кончаются на 2026-01-01. ## Шаг 1 — расследовать (deliverable = коммент) - проследить реальный источник tradein `deals` (`tradein-mvp/backend/app/services/scrapers/rosreestr.py` помечен «NOT a web scraper»; FDW user-mapping `tradein_fdw_reader`; `tradein-mvp/deploy/import-rosreestr.sh`). - определить ПОЧЕМУ 2026-01-01: - (a) остановленный ingestion job tradein-стороны (импорт не перезапускался с Q1)? - (b) Росреестр ДКП публикуется поквартально с лагом → Q1'26 реально последний (тогда ждать Q2'26; частичный fix только за счёт avito listing_date + старых сделок)? - (c) разовый bulk-дамп, refresh-pipeline не существует → epic? ## Шаг 2 — по итогу (a/b/c) - (a): перезапустить импорт, догрузить. (b): закрыть как upstream-lag, зафиксировать. (c): epic на refresh-pipeline. ## DoD - [ ] Шаг 1: коммент с реальным источником tradein deals + root cause (a/b/c) + файлы. - [ ] Шаг 2 при (a): `max(deal_date)` сдвинут к ~сейчас. ## Risk - Может затрагивать main gendesign БД (партиционированная `rosreestr_deals`, 6.8M). Объём согласовать с человеком. ## Контекст - Root cause: https://git.gendsgn.ru/lekss361/gendesign/issues/721#issuecomment-4916 · DaData/гео/кадастр НЕ при чём (ось — время) · парный рычаг — avito listing_date · Эпик #721.
bot-analyst added the
scope/backend
needs-human
priority/p1
tradein
labels 2026-05-30 13:41:38 +00:00
Author
Collaborator

Закрываю как дубль #724 (заведён bot-analyst раньше, с более полной археологией: dkp_import.py инкрементальный импорт корректен, курсор MAX(period_start_date), источник rosreestr_deals_fdw пуст после 2026-01-01 → upstream-лаг Росреестра, не баг в коде). Расследование и решение — в #724. Парный рычаг (avito listing_date) — #726.

Закрываю как дубль #724 (заведён bot-analyst раньше, с более полной археологией: `dkp_import.py` инкрементальный импорт корректен, курсор MAX(period_start_date), источник `rosreestr_deals_fdw` пуст после 2026-01-01 → upstream-лаг Росреестра, не баг в коде). Расследование и решение — в #724. Парный рычаг (avito listing_date) — #726.
Author
Collaborator

Переоткрыто: из-за race двух параллельных bot-analyst окон обе issue по temporal-блокеру (#724 и #727) оказались закрыты одновременно → находка осталась БЕЗ open-issue. #727 — канон по этому work-item (богаче: содержит upstream-провенанс rosreestr_deals как квартальный агрегат + investigate-first шаги). #724 остаётся закрытой как дубль. Парный рычаг — #726 (avito listing_date). Остаётся needs-human.

Переоткрыто: из-за race двух параллельных bot-analyst окон обе issue по temporal-блокеру (#724 и #727) оказались закрыты одновременно → находка осталась БЕЗ open-issue. #727 — канон по этому work-item (богаче: содержит upstream-провенанс `rosreestr_deals` как квартальный агрегат + investigate-first шаги). #724 остаётся закрытой как дубль. Парный рычаг — #726 (avito listing_date). Остаётся `needs-human`.
Owner

Шаг 1 — расследование (deliverable). Root cause = (b) upstream-лаг, подтверждено на источнике.

Provenance tradein deals (загадка из тела — решена)

  • tradein deals: 49 791 строк, но только 9 distinct deal_date (диапазон 2024-01-01…2026-01-01) = 9 кварталов. Это НЕ индивидуальные сделки с реальными датами, а развёрнутый квартальный агрегат: tradein-mvp/deploy/import-rosreestr.sh:51 ставит deal_date = period_start_date (начало квартала). Отсюда ровно 9 значений.
  • Источник rosreestr_dealsНЕ Объектив (api.objctv.ru кормит только objective_* таблицы; objective_scrape_runs к делу не относится). Реальный загрузчик — ручной ингест CSV Росреестра: data/sql/02_load_all_quarters.sh (+02b_load_via_tunnel.py) тянет dataset_СДЕЛКИ_r-r_01-92_y_YYYY_q_N.csv.zip, скачанные руками в data/raw/. Массив JOBS зашит до 2026Q1. tradein-сторона (import-rosreestr.sh) — тоже ручной запуск, дедуп по dedup_hash.
  • Схема rosreestr_deals: единственные временны́е колонки — source_quarter, period_start_date, loaded_at. Точной даты сделки в источнике нет — Росреестр публикует «Сделки» поквартально. deal_date = period_start_date — максимально доступная гранулярность, не баг.

Почему 2026-01-01 (доказано данными + на сайте)

  • gendesign rosreestr_deals: max(period_start_date) = 2026-01-01, max(loaded_at) = 2026-04-30, 0 строк с period_start_date > 2026-01-01.
  • Eligible ЕКБ/ДКП на gendesign под фильтром import-rosreestr.sh = 49 791 = ровно столько же в tradein → полный паритет. Перезапуск импорта подтянет 0 строк.
  • Источник rosreestr.gov.ru/data-sets/ (autoindex) — последняя папка «Сделки» = «1 квартал 2026г.», опубликована 16-Apr-2026, файл dataset_СДЕЛКИ_r-r_01-92_y_2026_q_1.csv.zip (9.5 МБ). Этот файл уже загружен (loaded 2026-04-30, через 2 недели после публикации). Папки «2 квартал 2026» нет.
  • Историческая cadence публикации: Q1'25→18-июн, Q2'25→30-июл, Q3'25→30-окт, Q4'25→17-фев, Q1'26→16-апр. ⇒ Q2'26 (закроется 30 июня) ожидается ~конец июля 2026.

Вердикт

  • (b) upstream-лаг. Пайплайн работал и актуален — выкачано всё, что опубликовано. Свежее данных у источника нет до выхода Q2'26 (~авг 2026). НЕ (a) (код/курсор корректны, перезагружать нечего).
  • Параллельно (c): рефреш полностью ручной (скачать zip + 02_load_all_quarters.sh + import-rosreestr.sh), без шедулера — реальный ops-долг, но не причина текущей заморозки.

Шаг 2 — рекомендация

  1. Закрыть #727 как upstream-lag (b) с напоминанием вернуться ~август 2026 за Q2'26.
  2. Follow-up (c, low-prio): scheduled job — раз в месяц polls data-sets на новую папку «N квартал YYYY» → download dataset_СДЕЛКИ02_load_all_quarters.sh + tradein import-rosreestr.sh. Тогда Q2'26 подтянется сам.
  3. Продуктовый рычаг (в эпике #721, не здесь): уйти от event-level матчинга [deal−180д, +30д] к rolling price benchmark (медиана price_per_m2 за trailing N кварталов по улица+rooms-bucket+area-band) — снимает зависимость от свежих дат сделок и квартальной гранулярности; data_quality (#721/#723) помечает устаревший бенчмарк. Tier-2 быстрый вариант: расширить окно до ≥1 года + сдвиг «deal quarter ≤ listing date».

Лейблы не трогаю (label-owner — аналитик), чтобы не было гонки параллельных окон.

## Шаг 1 — расследование (deliverable). Root cause = **(b) upstream-лаг**, подтверждено на источнике. ### Provenance tradein `deals` (загадка из тела — решена) - tradein `deals`: **49 791 строк, но только 9 distinct `deal_date`** (диапазон 2024-01-01…2026-01-01) = 9 кварталов. Это НЕ индивидуальные сделки с реальными датами, а **развёрнутый квартальный агрегат**: `tradein-mvp/deploy/import-rosreestr.sh:51` ставит `deal_date = period_start_date` (начало квартала). Отсюда ровно 9 значений. - Источник `rosreestr_deals` — **НЕ Объектив** (`api.objctv.ru` кормит только `objective_*` таблицы; `objective_scrape_runs` к делу не относится). Реальный загрузчик — ручной ингест CSV Росреестра: `data/sql/02_load_all_quarters.sh` (+`02b_load_via_tunnel.py`) тянет `dataset_СДЕЛКИ_r-r_01-92_y_YYYY_q_N.csv.zip`, скачанные руками в `data/raw/`. Массив `JOBS` зашит **до 2026Q1**. tradein-сторона (`import-rosreestr.sh`) — тоже ручной запуск, дедуп по `dedup_hash`. - Схема `rosreestr_deals`: единственные временны́е колонки — `source_quarter`, `period_start_date`, `loaded_at`. **Точной даты сделки в источнике нет** — Росреестр публикует «Сделки» поквартально. `deal_date = period_start_date` — максимально доступная гранулярность, не баг. ### Почему 2026-01-01 (доказано данными + на сайте) - gendesign `rosreestr_deals`: `max(period_start_date) = 2026-01-01`, `max(loaded_at) = 2026-04-30`, **0 строк** с `period_start_date > 2026-01-01`. - Eligible ЕКБ/ДКП на gendesign под фильтром `import-rosreestr.sh` = **49 791** = ровно столько же в tradein → **полный паритет**. Перезапуск импорта подтянет **0** строк. - **Источник `rosreestr.gov.ru/data-sets/` (autoindex)** — последняя папка «Сделки» = **«1 квартал 2026г.»**, опубликована **16-Apr-2026**, файл `dataset_СДЕЛКИ_r-r_01-92_y_2026_q_1.csv.zip` (9.5 МБ). Этот файл **уже загружен** (loaded 2026-04-30, через 2 недели после публикации). Папки «2 квартал 2026» **нет**. - Историческая cadence публикации: Q1'25→18-июн, Q2'25→30-июл, Q3'25→30-окт, Q4'25→17-фев, Q1'26→16-апр. ⇒ **Q2'26 (закроется 30 июня) ожидается ~конец июля 2026**. ### Вердикт - **(b) upstream-лаг.** Пайплайн работал и актуален — выкачано всё, что опубликовано. Свежее данных у источника нет до выхода Q2'26 (~авг 2026). НЕ (a) (код/курсор корректны, перезагружать нечего). - Параллельно **(c)**: рефреш полностью ручной (скачать zip + `02_load_all_quarters.sh` + `import-rosreestr.sh`), без шедулера — реальный ops-долг, но не причина текущей заморозки. ### Шаг 2 — рекомендация 1. **Закрыть #727 как upstream-lag (b)** с напоминанием вернуться ~август 2026 за Q2'26. 2. **Follow-up (c, low-prio):** scheduled job — раз в месяц polls data-sets на новую папку «N квартал YYYY» → download `dataset_СДЕЛКИ` → `02_load_all_quarters.sh` + tradein `import-rosreestr.sh`. Тогда Q2'26 подтянется сам. 3. **Продуктовый рычаг (в эпике #721, не здесь):** уйти от event-level матчинга `[deal−180д, +30д]` к **rolling price benchmark** (медиана `price_per_m2` за trailing N кварталов по `улица+rooms-bucket+area-band`) — снимает зависимость от свежих дат сделок и квартальной гранулярности; `data_quality` (#721/#723) помечает устаревший бенчмарк. Tier-2 быстрый вариант: расширить окно до ≥1 года + сдвиг «deal quarter ≤ listing date». Лейблы не трогаю (label-owner — аналитик), чтобы не было гонки параллельных окон.
lekss361 added
status/ready
and removed
needs-human
labels 2026-05-30 14:17:43 +00:00
Collaborator

auto-backend: Step 1 deliverable is already complete (comment above, by @lekss361) and the verdict is sound — (b) upstream-lag, proven at the source: rosreestr_deals.max(period_start_date)=2026-01-01, eligible-EKB/ДКП parity with tradein (49 791), and rosreestr.gov.ru autoindex shows Q1'26 (published 16-Apr, already loaded 30-Apr) as the latest "Сделки" folder; Q2'26 not out until ~Aug 2026.

There is no actionable backend code change for the current freeze: the importer cursor (MAX(period_start_date)) and dedup are correct, and a re-run would pull 0 rows. So nothing to implement here — closing as upstream-lag per recommendation #1.

Deferred (not this issue, for analyst to file):

  • (c) low-prio follow-up: a scheduled monthly poll of data-sets/ for a new "N квартал YYYY" folder → download dataset_СДЕЛКИdata/sql/02_load_all_quarters.sh + tradein import-rosreestr.sh. Real ops-debt, but not the cause of the freeze and not demo-blocking — should be its own scope/backend/scope/devops issue.
  • Product lever (epic #721): rolling price benchmark instead of event-level [deal−180д,+30д] matching — belongs to the epic, not here.

Re-visit ~Aug 2026 for Q2'26.

auto-backend: Step 1 deliverable is already complete (comment above, by @lekss361) and the verdict is sound — **(b) upstream-lag**, proven at the source: `rosreestr_deals.max(period_start_date)=2026-01-01`, eligible-EKB/ДКП parity with tradein (49 791), and rosreestr.gov.ru autoindex shows Q1'26 (published 16-Apr, already loaded 30-Apr) as the latest "Сделки" folder; Q2'26 not out until ~Aug 2026. There is **no actionable backend code change** for the current freeze: the importer cursor (`MAX(period_start_date)`) and dedup are correct, and a re-run would pull **0** rows. So nothing to implement here — closing as upstream-lag per recommendation #1. Deferred (not this issue, for analyst to file): - **(c) low-prio follow-up:** a scheduled monthly poll of `data-sets/` for a new "N квартал YYYY" folder → download `dataset_СДЕЛКИ` → `data/sql/02_load_all_quarters.sh` + tradein `import-rosreestr.sh`. Real ops-debt, but not the cause of the freeze and not demo-blocking — should be its own `scope/backend`/`scope/devops` issue. - **Product lever (epic #721):** rolling price benchmark instead of event-level `[deal−180д,+30д]` matching — belongs to the epic, not here. Re-visit ~Aug 2026 for Q2'26.
bot-backend added
status/done
and removed
status/ready
labels 2026-05-30 14:20:32 +00:00
Collaborator

Deferred follow-up (c) auto-poll нового квартала заведён → #888. Текущая заморозка (upstream-лаг) остаётся как есть до публикации Q2'26 (~авг).

Deferred follow-up (c) auto-poll нового квартала заведён → **#888**. Текущая заморозка (upstream-лаг) остаётся как есть до публикации Q2'26 (~авг).
Sign in to join this conversation.
No milestone
No project
No assignees
3 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#727
No description provided.