[P2] external_valuations.house_id всегда NULL (1579/1579) — привязать к houses #2236

Closed
opened 2026-07-02 21:32:17 +00:00 by lekss361 · 1 comment
Owner

Из аудита 2026-07-02 (Фаза 4, verified на проде 2026-07-03: SELECT count(*) FROM external_valuations WHERE house_id IS NULL = 1579 из 1579).

Находка: внешние оценки (cian_valuation / yandex_valuation) не связаны с канонической таблицей houses — house-уровневые фичи (IMV-anchor, house-analytics, дедуп по дому) не могут использовать историю внешних оценок; данные копятся мёртвым грузом.

Acceptance:

  • Write-path: при сохранении external_valuation резолвить house_id (тот же resolve, что у estimate: match_house_readonly по address/lat/lon).
  • Идемпотентный бэкфилл существующих 1579 строк (миграция или admin-джоба; для миграции осторожно — резолв требует Python-логики → скорее scheduled task/one-shot скрипт, НЕ SQL).
  • Проверка: доля house_id IS NULL падает существенно (<20% — часть адресов может честно не резолвиться).

Scope: tradein-mvp/backend/app/services/ (external valuations save path), task/backfill.

Из аудита 2026-07-02 (Фаза 4, verified на проде 2026-07-03: `SELECT count(*) FROM external_valuations WHERE house_id IS NULL` = 1579 из 1579). **Находка:** внешние оценки (cian_valuation / yandex_valuation) не связаны с канонической таблицей houses — house-уровневые фичи (IMV-anchor, house-analytics, дедуп по дому) не могут использовать историю внешних оценок; данные копятся мёртвым грузом. **Acceptance:** - [ ] Write-path: при сохранении external_valuation резолвить house_id (тот же resolve, что у estimate: match_house_readonly по address/lat/lon). - [ ] Идемпотентный бэкфилл существующих 1579 строк (миграция или admin-джоба; для миграции осторожно — резолв требует Python-логики → скорее scheduled task/one-shot скрипт, НЕ SQL). - [ ] Проверка: доля house_id IS NULL падает существенно (<20% — часть адресов может честно не резолвиться). Scope: `tradein-mvp/backend/app/services/` (external valuations save path), task/backfill.
lekss361 added the
data
priority/p2
scope/backend
tradein
labels 2026-07-02 21:33:30 +00:00
Author
Owner

Код смержен и задеплоен (PR #2263), canary-прогон бэкфилла на проде чистый. Полный прогон — за человеком (бриф смены задаёт «прод read-only», а это UPDATE ~1579 строк; вопрос задан в сессии, ответа не было → оставляю needs-human).

Canary (--dry-run --limit 100, 06:50 UTC): resolved=82, unresolved=18, errors=0 (yandex 82/98, cian 0/2 — cian-адреса форматируются иначе, best-effort по дизайну).

Команда полного прогона (идемпотентен, per-row SAVEPOINT, повторный запуск безопасен):

ssh gendesign
docker exec tradein-backend python -m scripts.backfill_external_valuations_house_id            # полный прогон
docker exec tradein-postgres psql -U tradein -d tradein -c "SELECT count(*) FILTER (WHERE house_id IS NULL) AS null_left, count(*) AS total FROM external_valuations;"   # проверка: null_left/total < 20%

Write-path уже активен: новые external valuations пишутся с house_id сразу (проверено деплоем, health 200). После полного прогона acceptance «доля NULL < 20%» закроется (ожидаемо ~13% NULL останется).

**Код смержен и задеплоен (PR #2263), canary-прогон бэкфилла на проде чистый. Полный прогон — за человеком** (бриф смены задаёт «прод read-only», а это UPDATE ~1579 строк; вопрос задан в сессии, ответа не было → оставляю needs-human). Canary (`--dry-run --limit 100`, 06:50 UTC): **resolved=82, unresolved=18, errors=0** (yandex 82/98, cian 0/2 — cian-адреса форматируются иначе, best-effort по дизайну). Команда полного прогона (идемпотентен, per-row SAVEPOINT, повторный запуск безопасен): ``` ssh gendesign docker exec tradein-backend python -m scripts.backfill_external_valuations_house_id # полный прогон docker exec tradein-postgres psql -U tradein -d tradein -c "SELECT count(*) FILTER (WHERE house_id IS NULL) AS null_left, count(*) AS total FROM external_valuations;" # проверка: null_left/total < 20% ``` Write-path уже активен: новые external valuations пишутся с house_id сразу (проверено деплоем, health 200). После полного прогона acceptance «доля NULL < 20%» закроется (ожидаемо ~13% NULL останется).
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
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#2236
No description provided.