feat(objective): активировать data goldmine — 303k lots, 81% цен, mapping backfill (P0) #307

Closed
opened 2026-05-17 15:27:09 +00:00 by lekss361 · 4 comments
Owner

Severity: P0

Big finding 2026-05-17: у нас уже скрапается 303 677 квартир через Objective с 81.4% покрытием цен. Но:

  • 84% mapping'ов в objective_complex_mapping отсутствуют (129 из ~800)
  • bank_name 100% NULL (scraper не маппит из payload)
  • Site Finder ищет цены в domrf_kn_flats (0.3% покрытие) вместо objective_lots (81%)
  • TradeIn Estimator brief писал «нужны 7 внешних API» — на самом деле Objective покрывает Свердл

Решение: ~10 рабочих дней backend, без новых скраперов, без новых таблиц — активация существующих данных.

Подзадачи

🔴 OBJ-1 — Mapping fix bank_name / encumbrance_* в scraper (P1, 1d)

objective_lots schema имеет bank_name, encumbrance_type, encumbrance_start_dateно 0 значений в 303k строк.

Audit: запросить raw payload Objective API (через objective_raw_reports если будет заполнен, или live request), сравнить с маппингом в objective_backfill.py. Скорее всего поле есть в payload, scraper его не извлекает (то же что было с energy_eff в DOM.РФ).

Acceptance: ≥50% sold lots с заполненным bank_name после следующего sync.

🔴 OBJ-2 — Massive backfill objective_complex_mapping (P0, 2d)

Сейчас 129 mappings. Нужно: ~800 (покрытие 90%+ ЖК Свердл).

Алгоритм:

  1. Получить distinct (project_name, developer, district) из objective_lots (не в mapping)
  2. Для каждого — fuzzy match с domrf_kn_objects.comm_name + dev_name + district_name (pg_trgm)
  3. Записать match с match_score, match_method='auto'
  4. Manual review топ-100 (sample 1-2 часа)
  5. REFRESH mv_layout_velocity

Acceptance: mapping.count() >= 800, Малевич → obj_id=64701 присутствует. После REFRESH MV — Малевич показывается в Site Finder velocity для PRINZIP.

Note: Связано с issue #295 (weighted AVG в MV — должно быть исправлено до этого backfill, иначе площади будут продолжать ехать).

🔴 OBJ-3 — Site Finder migration на Objective ground truth (P0, 1.5d)

backend/app/services/site_finder/best_layouts.py и competitors.py сейчас используют:

  • domrf_kn_flats.price_rub0.3% coverage
  • mv_layout_velocity (унаследовано от Objective с weighted AVG bug #295)

После OBJ-2 (mapping backfill) — поменять источник на objective_lots напрямую для:

  • Цены квартир (price_per_m2_rub, price_calculated_total_rub)
  • Статус продажи (is_sold, status)
  • Тип сделки (contract_type)
  • Аналитика по комнатности (rooms_int + area_pd)

Acceptance: На участке 66:41:0204016:10 все блоки конкурентов / Best Layouts показывают реалистичные цены (~110-220 тыс ₽/м² вместо «3-к за 30 тыс»), площади (28-80 м² вместо «студия 12 м²»).

🔴 OBJ-4 — TradeIn Estimator MVP на Objective (P0, 2-3d, упрощение)

code/patterns/TradeIn_Estimator_Brief_May17.md Phase 1 MVP писал «нужны 7 внешних API» (Cian/Avito/ДомКлик/Yandex/Дом.РФ/Restate/N1) — это 2-3 недели работы со скрапингом.

Реальность: objective_lots покрывает Свердл с 81% ground truth — нужен только агрегатор + UI + PDF.

Action:

  1. Обновить TradeIn brief с упрощённой архитектурой (vault edit)
  2. MVP за 5 дней: form ввода → SQL aggregate из objective_lots по фильтрам адреса/площади/комнат → DiapазON цен + analogs + actual deals + PDF
  3. Внешние API (Cian/Avito) — только для регионов вне Объектива

Acceptance: Working /trade-in page с формой + результатом, 3 sample addresses в Екб дают реалистичную оценку ±15% от рынка.

🟡 OBJ-5 — objective_scrape_runs пустое (P2, 0.5d)

Schema готова, но 0 строк. Heartbeat либо не пишется (bug), либо пишется в другое место. Нужно verify run history существует — иначе нельзя trace когда упал sync.

Acceptance: После следующего вторничного sync — в таблице ≥1 строка с status='done' или 'failed' + heartbeat.

🟢 OBJ-6 — objective_lots_history для time-series (P2, 1d)

Заполнение lots_history при каждом sync для трекинга:

  • Изменение цены лота (price_delta_pct per snapshot_date)
  • Переход status free → reserved → sold
  • Длительность экспозиции (sales_start_date → contract_date)

Pattern: на каждый sync — INSERT в history если diff с предыдущим snapshot.

Use case: «Видеть как менялись цены на квартиру X за 12 мес» для TradeIn / для аналитики дев-стратегий.

🟢 OBJ-7 — objective_raw_reports для audit (P2, 0.5d)

Сохранять raw payload API в JSONB для:

  • Debug new field mappings (как OBJ-1)
  • Backfill после schema change

Pattern аналогичный domrf_raw_endpoints.

Зависимости

OBJ-1 (mapping fix bank_name)     — независимо, в любое время
OBJ-2 (massive mapping backfill)  — должно быть после #295 weighted AVG fix
  ↓
OBJ-3 (Site Finder migration)     — зависит от OBJ-2 (без mapping JOIN не даёт результат)
  ↓
OBJ-4 (TradeIn MVP)               — может параллельно с OBJ-3, если есть отдельный worker

OBJ-5/6/7 — operational improvements, независимо, любое время

Связь с другими issues

  • #295 weighted AVG MV — должен быть до OBJ-2 (иначе backfill mapping вернёт ту же broken aggregation)
  • #297 DOM.РФ scraper — sub-task 22d (catalog scraper для цен) становится obsolete после OBJ-3. Можно закрыть 22d как «cancelled — цены через Objective».
  • TradeIn brief — переписать (OBJ-4 == упрощение)
  • mv_layout_velocity definition — может стать proxy view над objective_lots напрямую, если решим что MV больше не нужен. (Отдельное решение — не в scope этого issue.)

Полный inventory данных Objective

См. vault code/patterns/Objective_Data_Source_May17.md — single source of truth с описанием всех 7 таблиц, coverage метриками и structure.

Total effort

Sub-task Effort Priority Worker
OBJ-1 1d P1 backend-engineer
OBJ-2 2d P0 database-expert + backend-engineer
OBJ-3 1.5d P0 backend-engineer + frontend-engineer
OBJ-4 2-3d P0 full-stack
OBJ-5 0.5d P2 backend-engineer
OBJ-6 1d P2 backend-engineer
OBJ-7 0.5d P2 backend-engineer
Total ~10d

Параллелизация

  • Wave 1 (1 неделя): OBJ-1 + OBJ-2 + #295 (worktree, разные file scopes)
  • Wave 2 (1 неделя): OBJ-3 + OBJ-4 (worktree)
  • Wave 3: OBJ-5/6/7 в фоне

ROI

DOM.РФ scraper roadmap (issue #297) занимает 13 дней для покрытия новых полей с 30% → 95%.

Objective roadmap занимает 10 дней для активации того, что уже скрапится — покрытие цен с 0.3% → 81%, открытие 303k lots для downstream.

ROI Objective работ выше.

Discovered: 2026-05-17 by Ghost в ходе DOM.РФ field audit.

## Severity: P0 **Big finding 2026-05-17**: у нас уже скрапается **303 677 квартир** через Objective с **81.4% покрытием цен**. Но: - 84% mapping'ов в `objective_complex_mapping` отсутствуют (129 из ~800) - `bank_name` 100% NULL (scraper не маппит из payload) - Site Finder ищет цены в `domrf_kn_flats` (0.3% покрытие) вместо `objective_lots` (81%) - TradeIn Estimator brief писал «нужны 7 внешних API» — на самом деле Objective покрывает Свердл **Решение**: ~10 рабочих дней backend, без новых скраперов, без новых таблиц — **активация существующих данных**. ## Подзадачи ### 🔴 OBJ-1 — Mapping fix `bank_name` / `encumbrance_*` в scraper (P1, 1d) `objective_lots` schema имеет `bank_name`, `encumbrance_type`, `encumbrance_start_date` — **но 0 значений в 303k строк**. Audit: запросить raw payload Objective API (через `objective_raw_reports` если будет заполнен, или live request), сравнить с маппингом в `objective_backfill.py`. Скорее всего поле есть в payload, scraper его не извлекает (то же что было с `energy_eff` в DOM.РФ). **Acceptance**: ≥50% sold lots с заполненным `bank_name` после следующего sync. ### 🔴 OBJ-2 — Massive backfill `objective_complex_mapping` (P0, 2d) Сейчас 129 mappings. Нужно: **~800** (покрытие 90%+ ЖК Свердл). Алгоритм: 1. Получить distinct `(project_name, developer, district)` из `objective_lots` (не в mapping) 2. Для каждого — fuzzy match с `domrf_kn_objects.comm_name + dev_name + district_name` (pg_trgm) 3. Записать match с `match_score`, `match_method='auto'` 4. Manual review топ-100 (sample 1-2 часа) 5. REFRESH `mv_layout_velocity` **Acceptance**: `mapping.count() >= 800`, `Малевич → obj_id=64701` присутствует. После REFRESH MV — Малевич показывается в Site Finder velocity для PRINZIP. **Note**: Связано с issue #295 (weighted AVG в MV — должно быть исправлено до этого backfill, иначе площади будут продолжать ехать). ### 🔴 OBJ-3 — Site Finder migration на Objective ground truth (P0, 1.5d) `backend/app/services/site_finder/best_layouts.py` и `competitors.py` сейчас используют: - `domrf_kn_flats.price_rub` — **0.3% coverage** - `mv_layout_velocity` (унаследовано от Objective с weighted AVG bug #295) После OBJ-2 (mapping backfill) — поменять источник на `objective_lots` напрямую для: - Цены квартир (`price_per_m2_rub`, `price_calculated_total_rub`) - Статус продажи (`is_sold`, `status`) - Тип сделки (`contract_type`) - Аналитика по комнатности (`rooms_int` + `area_pd`) **Acceptance**: На участке `66:41:0204016:10` все блоки конкурентов / Best Layouts показывают реалистичные цены (~110-220 тыс ₽/м² вместо «3-к за 30 тыс»), площади (28-80 м² вместо «студия 12 м²»). ### 🔴 OBJ-4 — TradeIn Estimator MVP на Objective (P0, 2-3d, упрощение) `code/patterns/TradeIn_Estimator_Brief_May17.md` Phase 1 MVP писал «нужны 7 внешних API» (Cian/Avito/ДомКлик/Yandex/Дом.РФ/Restate/N1) — это **2-3 недели работы со скрапингом**. **Реальность**: `objective_lots` покрывает Свердл с 81% ground truth — нужен только агрегатор + UI + PDF. Action: 1. Обновить TradeIn brief с упрощённой архитектурой (vault edit) 2. MVP за 5 дней: form ввода → SQL aggregate из `objective_lots` по фильтрам адреса/площади/комнат → DiapазON цен + analogs + actual deals + PDF 3. Внешние API (Cian/Avito) — только для регионов вне Объектива **Acceptance**: Working `/trade-in` page с формой + результатом, 3 sample addresses в Екб дают реалистичную оценку ±15% от рынка. ### 🟡 OBJ-5 — `objective_scrape_runs` пустое (P2, 0.5d) Schema готова, но 0 строк. Heartbeat либо не пишется (bug), либо пишется в другое место. Нужно verify run history существует — иначе нельзя trace когда упал sync. **Acceptance**: После следующего вторничного sync — в таблице ≥1 строка с `status='done'` или `'failed'` + heartbeat. ### 🟢 OBJ-6 — `objective_lots_history` для time-series (P2, 1d) Заполнение `lots_history` при каждом sync для трекинга: - Изменение цены лота (`price_delta_pct` per snapshot_date) - Переход status `free → reserved → sold` - Длительность экспозиции (sales_start_date → contract_date) Pattern: на каждый sync — INSERT в history если diff с предыдущим snapshot. **Use case**: «Видеть как менялись цены на квартиру X за 12 мес» для TradeIn / для аналитики дев-стратегий. ### 🟢 OBJ-7 — `objective_raw_reports` для audit (P2, 0.5d) Сохранять raw payload API в JSONB для: - Debug new field mappings (как OBJ-1) - Backfill после schema change Pattern аналогичный `domrf_raw_endpoints`. ## Зависимости ``` OBJ-1 (mapping fix bank_name) — независимо, в любое время OBJ-2 (massive mapping backfill) — должно быть после #295 weighted AVG fix ↓ OBJ-3 (Site Finder migration) — зависит от OBJ-2 (без mapping JOIN не даёт результат) ↓ OBJ-4 (TradeIn MVP) — может параллельно с OBJ-3, если есть отдельный worker OBJ-5/6/7 — operational improvements, независимо, любое время ``` ## Связь с другими issues - **#295** weighted AVG MV — должен быть до OBJ-2 (иначе backfill mapping вернёт ту же broken aggregation) - **#297** DOM.РФ scraper — sub-task 22d (catalog scraper для цен) **становится obsolete** после OBJ-3. Можно закрыть 22d как «cancelled — цены через Objective». - **TradeIn brief** — переписать (OBJ-4 == упрощение) - **`mv_layout_velocity`** definition — может стать proxy view над `objective_lots` напрямую, если решим что MV больше не нужен. (Отдельное решение — не в scope этого issue.) ## Полный inventory данных Objective См. vault `code/patterns/Objective_Data_Source_May17.md` — single source of truth с описанием всех 7 таблиц, coverage метриками и structure. ## Total effort | Sub-task | Effort | Priority | Worker | |---|---|---|---| | OBJ-1 | 1d | P1 | backend-engineer | | OBJ-2 | 2d | P0 | database-expert + backend-engineer | | OBJ-3 | 1.5d | P0 | backend-engineer + frontend-engineer | | OBJ-4 | 2-3d | P0 | full-stack | | OBJ-5 | 0.5d | P2 | backend-engineer | | OBJ-6 | 1d | P2 | backend-engineer | | OBJ-7 | 0.5d | P2 | backend-engineer | | **Total** | **~10d** | | | ## Параллелизация - **Wave 1** (1 неделя): OBJ-1 + OBJ-2 + #295 (worktree, разные file scopes) - **Wave 2** (1 неделя): OBJ-3 + OBJ-4 (worktree) - **Wave 3**: OBJ-5/6/7 в фоне ## ROI DOM.РФ scraper roadmap (issue #297) занимает **13 дней** для покрытия **новых** полей с 30% → 95%. Objective roadmap занимает **10 дней** для **активации того, что уже скрапится** — покрытие цен с 0.3% → 81%, открытие 303k lots для downstream. **ROI Objective работ выше**. Discovered: 2026-05-17 by Ghost в ходе DOM.РФ field audit.
lekss361 added the
data
site-finder
enhancement
labels 2026-05-17 15:27:09 +00:00
Author
Owner

Update — 2026-05-17: split на data-only vs UI track

OBJ-4 (TradeIn Estimator MVP) перенесён в отдельный issue для разделения треков:

  • Этот issue (#307) — теперь data-only: OBJ-1, OBJ-2, OBJ-3 (backend части), OBJ-5, OBJ-6, OBJ-7. Total: ~7 дней. 95% backend / SQL / ETL работ.
  • Новый issue для UI TradeIn MVP — frontend + thin backend + PDF. Total: ~5 дней. Зависит от закрытия OBJ-1 + OBJ-2 в этом issue.

Что меняется в этом issue

  • OBJ-4 (TradeIn MVP) — удалён из этого issue
  • OBJ-3 (Site Finder migration) — теперь backend-only (~1.5d), frontend codegen + минорные правки переносятся в OBJ-4 track или делаются автоматически как side-effect

Обновлённый total для этого issue

ID Effort Status
OBJ-1 (bank_name mapping) 1d P1
OBJ-2 (mapping backfill) 2d P0
OBJ-3 (Site Finder migration backend) 1d P0
OBJ-5 (scrape_runs heartbeat) 0.5d P2
OBJ-6 (lots_history) 1d P2
OBJ-7 (raw_reports audit) 0.5d P2
Total ~6d

Параллелизация

  • Wave 1 (1 неделя): OBJ-1 + OBJ-2 + #295 (3 параллельных worktree)
  • Wave 2: OBJ-3 backend
  • Wave 3: OBJ-5/6/7 в фоне

После Wave 2 — TradeIn MVP в новом issue может стартовать (другое окно).

Discovered: 2026-05-17 — User requested clean separation of data work from UI track.

## Update — 2026-05-17: split на data-only vs UI track **OBJ-4 (TradeIn Estimator MVP) перенесён в отдельный issue** для разделения треков: - **Этот issue (#307)** — теперь **data-only**: OBJ-1, OBJ-2, OBJ-3 (backend части), OBJ-5, OBJ-6, OBJ-7. **Total: ~7 дней**. 95% backend / SQL / ETL работ. - **Новый issue** для UI TradeIn MVP — frontend + thin backend + PDF. **Total: ~5 дней**. Зависит от закрытия OBJ-1 + OBJ-2 в этом issue. ### Что меняется в этом issue - ❌ OBJ-4 (TradeIn MVP) — **удалён** из этого issue - ✅ OBJ-3 (Site Finder migration) — теперь **backend-only** (~1.5d), frontend codegen + минорные правки переносятся в OBJ-4 track или делаются автоматически как side-effect ### Обновлённый total для этого issue | ID | Effort | Status | |---|---|---| | OBJ-1 (bank_name mapping) | 1d | P1 | | OBJ-2 (mapping backfill) | 2d | **P0** | | OBJ-3 (Site Finder migration backend) | 1d | **P0** | | OBJ-5 (scrape_runs heartbeat) | 0.5d | P2 | | OBJ-6 (lots_history) | 1d | P2 | | OBJ-7 (raw_reports audit) | 0.5d | P2 | | **Total** | **~6d** | | ### Параллелизация - Wave 1 (1 неделя): OBJ-1 + OBJ-2 + #295 (3 параллельных worktree) - Wave 2: OBJ-3 backend - Wave 3: OBJ-5/6/7 в фоне После Wave 2 — TradeIn MVP в новом issue может стартовать (другое окно). Discovered: 2026-05-17 — User requested clean separation of data work from UI track.
Collaborator

Статус (2026-06-13): OBJ-2 + OBJ-3 done в проде; OBJ-1 defer (scraping).

Ground-truth показал drift с момента создания (May17): objective_lots 303k → 1.12M.

  • OBJ-3 (Site Finder читает objective_lots вместо domrf_kn_flats) DONE — objective_lots используется в supply_layers/market_metrics/competitors/velocity/future_supply/best_layouts.
  • OBJ-2 (mapping backfill) DONE в проде (PR #1310, миграция 150 применена): fuzzy-match objective↔domrf через pg_trgm на нормализованных именах, dev-corroborated порог (nsim≥0.62 AND dsim≥0.5). mapping 148 → 263 (+115, 107 high + 8 mid). mv_layout_velocity 555 → 885 rows (+330 — покрытие velocity выросло на 60%). Precision over recall для P0: generic-имена с разным застройщиком отклонены (Солнечный/Прекрасный/Стрелки). 115 матчей is_reviewed=false + confidence-tier в note → нужен human-review топ-кандидатов (особенно mid-tier).
  • OBJ-1 (bank_name/encumbrance mapping) 🟡 DEFER — objective_raw_reports=28 строк (мало), bank_name=0/1.12M. Требует (1) scraper-маппинга из raw payload + (2) больше raw_reports через sync — но external scraping на проде намеренно на паузе. Разблокируется при возобновлении scraping.

Остаётся для закрытия #307: OBJ-1 (scraping-blocked) + human-review 115 auto-mappings (опц., is_reviewed-флаг). Понизил бы severity P0→P1 — основная ценность (Site Finder на objective-ценах + расширенный mapping) уже в проде.

**Статус (2026-06-13): OBJ-2 + OBJ-3 done в проде; OBJ-1 defer (scraping).** Ground-truth показал drift с момента создания (May17): objective_lots **303k → 1.12M**. - **OBJ-3 (Site Finder читает objective_lots вместо domrf_kn_flats)** ✅ DONE — `objective_lots` используется в supply_layers/market_metrics/competitors/velocity/future_supply/best_layouts. - **OBJ-2 (mapping backfill)** ✅ DONE в проде (PR #1310, миграция 150 применена): fuzzy-match objective↔domrf через pg_trgm на нормализованных именах, dev-corroborated порог (nsim≥0.62 AND dsim≥0.5). **mapping 148 → 263** (+115, 107 high + 8 mid). **mv_layout_velocity 555 → 885 rows** (+330 — покрытие velocity выросло на 60%). Precision over recall для P0: generic-имена с разным застройщиком отклонены (Солнечный/Прекрасный/Стрелки). 115 матчей `is_reviewed=false` + confidence-tier в note → **нужен human-review топ-кандидатов** (особенно mid-tier). - **OBJ-1 (bank_name/encumbrance mapping)** 🟡 DEFER — `objective_raw_reports`=28 строк (мало), `bank_name`=0/1.12M. Требует (1) scraper-маппинга из raw payload + (2) больше raw_reports через sync — но external scraping на проде намеренно на паузе. Разблокируется при возобновлении scraping. **Остаётся для закрытия #307:** OBJ-1 (scraping-blocked) + human-review 115 auto-mappings (опц., is_reviewed-флаг). Понизил бы severity P0→P1 — основная ценность (Site Finder на objective-ценах + расширенный mapping) уже в проде.
Collaborator

Прогресс по подзадачам (автономно, на существующих данных):

  • OBJ-2 — консервативный trgm-backfill objective_complex_mapping +23 near-exact (PR #1331, merged f9dd903). 286 маппингов, 18/23 сразу расширяют velocity MV. 133 на manual (задокументировано).
  • OBJ-3 — additive objective_lots price fallback для competitors (PR #1332). Открытие: на последнем snapshot domrf_kn_flats.price = 0 строк (скрапер перестал отдавать per-flat цены ~2026-06-03) → live price-сигнал SF был мёртв; fallback восстановил (262/263 mapped obj_id, median 136k руб/м²). best_layouts price уже был на objective. Веса/MV не тронуты.
  • OBJ-1 (bank_name) — остаётся proxy-blocked: objective_raw_reports хранит только 28 агрегатных отчётов (часть с NULL payload), не per-lot → offline-backfill 1.1M лотов невозможен, нужен re-scrape Objective (прокси). Фикс извлечения в скрапере имеет смысл только когда скрапинг возобновится.

OBJ-2+OBJ-3 = data goldmine активирован для SF (81.8% цен vs 3.66% domrf). Остаток OBJ-1 — после восстановления прокси.

Прогресс по подзадачам (автономно, на существующих данных): - ✅ **OBJ-2** — консервативный trgm-backfill `objective_complex_mapping` +23 near-exact (PR #1331, merged `f9dd903`). 286 маппингов, 18/23 сразу расширяют velocity MV. 133 на manual (задокументировано). - ✅ **OBJ-3** — additive objective_lots price fallback для competitors (PR #1332). Открытие: на последнем snapshot `domrf_kn_flats.price` = **0 строк** (скрапер перестал отдавать per-flat цены ~2026-06-03) → live price-сигнал SF был мёртв; fallback восстановил (262/263 mapped obj_id, median 136k руб/м²). `best_layouts` price уже был на objective. Веса/MV не тронуты. - ⏳ **OBJ-1** (bank_name) — **остаётся proxy-blocked**: `objective_raw_reports` хранит только 28 агрегатных отчётов (часть с NULL payload), не per-lot → offline-backfill 1.1M лотов невозможен, нужен re-scrape Objective (прокси). Фикс извлечения в скрапере имеет смысл только когда скрапинг возобновится. OBJ-2+OBJ-3 = data goldmine активирован для SF (81.8% цен vs 3.66% domrf). Остаток OBJ-1 — после восстановления прокси.
Author
Owner

Статус OBJ-1..7 на 2026-06-17 (верифицировано по коду + живой БД)

  • OBJ-1 — НЕ баг маппинга: парсер мапит все 3 поля; encumbrance_* заполнены на 36%, bank_name=0 т.к. вендор не отдаёт ЕГРН-поле на текущем тарифе. Вынесено в отдельный needs-human issue.
  • OBJ-2 backfill #1331/#1333 (mapping 148→263) + is_reviewed/confidence-гейт velocity добит сегодня (PR #1720, миграция 165: гейт is_reviewed OR manual OR score>=0.85, MV-объекты 275→236).
  • OBJ-3 уже DONE (PR #1332: competitors/best_layouts на objective_lots, 81% цен).
  • OBJ-5objective_scrape_runs = 18 строк (heartbeat пишется ); ждёт resume скрапинга.
  • OBJ-6 diff-gated триггер objective_lots_history добит сегодня (PR #1719, миграция 164). Вскрылось: history раньше не дельта-трекался (wholesale insert).
  • OBJ-7objective_raw_reports = 28 строк (schema-only, минимальный payload-store).
  • #295 weighted-AVG — DONE (PR #626).

Остаток (OBJ-1 tariff, OBJ-5/7 resume) — capability/ops, не code. Эпик можно закрывать после решения по OBJ-1-тарифу.

## Статус OBJ-1..7 на 2026-06-17 (верифицировано по коду + живой БД) - **OBJ-1** — НЕ баг маппинга: парсер мапит все 3 поля; `encumbrance_*` заполнены на 36%, `bank_name`=0 т.к. вендор не отдаёт ЕГРН-поле на текущем тарифе. Вынесено в отдельный needs-human issue. - **OBJ-2** — ✅ backfill #1331/#1333 (mapping 148→263) + **is_reviewed/confidence-гейт velocity** добит сегодня (PR #1720, миграция 165: гейт `is_reviewed OR manual OR score>=0.85`, MV-объекты 275→236). - **OBJ-3** — ✅ уже DONE (PR #1332: competitors/best_layouts на objective_lots, 81% цен). - **OBJ-5** — `objective_scrape_runs` = 18 строк (heartbeat пишется ✅); ждёт resume скрапинга. - **OBJ-6** — ✅ diff-gated триггер `objective_lots_history` добит сегодня (PR #1719, миграция 164). Вскрылось: history раньше не дельта-трекался (wholesale insert). - **OBJ-7** — `objective_raw_reports` = 28 строк (schema-only, минимальный payload-store). - **#295** weighted-AVG — ✅ DONE (PR #626). Остаток (OBJ-1 tariff, OBJ-5/7 resume) — capability/ops, не code. Эпик можно закрывать после решения по OBJ-1-тарифу.
Sign in to join this conversation.
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#307
No description provided.