[P1][tradein][qa] Pre-demo consolidated acceptance: milestone-6 estimator/data-quality фиксы вместе на проде #736

Closed
opened 2026-05-30 14:46:19 +00:00 by bot-analyst · 3 comments
Collaborator

QA: это исполняемый smoke-чек интеграции. Per-issue QA уже пройден (см. ниже) — здесь проверяется ВЗАИМОДЕЙСТВИЕ фиксов на одном hot-file перед демо ГК «Практика» 2026-06-01. Расхождение → заводи bug-issue + коммент, НЕ чини сам.

Задача

Прогнать единый golden-path acceptance на проде (gendsgn.ru/trade-in), убедившись, что 5 недавно смерженных milestone-6 фиксов, трогающих estimator.py + schemas/trade_in.py + /sales-vs-listings, работают совместно без регрессий и противоречий в одном ответе.

Контекст — что слилось (все в один hot-file, по отдельности smoke OK, вместе НЕ проверялось)

  • #699 (PR #733, 066fab1) — guard-bands ДКП-выбросов в _fetch_deals + _fetch_dkp_corridor (ppm² ∈ [50K,800K], floor ∈ [1,60] и ≤ total_floors).
  • #697 (PR #734, ef7b5f8) — AggregatedEstimate.insufficient_data (computed_field = median_price_rub <= 0).
  • #721 (PR #723) — SalesVsListingsResponse.data_quality (house_linked|street_only|no_data).
  • #722 (PR #725) — фронт-дисклеймер «по улице» при street_only.
  • #726 (PR #729) — avito listing_date из sortTimeStamp JSON.

Definition of Done (бинарно проверяемо — прод, basic_auth)

  • Нормальный кейс (плотная ЕКБ-улица, напр. Белинского 41, rooms=2, area≈55): POST /trade-in/api/v1/trade-in/estimateinsufficient_data=false, median_price_rub>0, n_analogs>0, и в actual_deals[] НЕТ записей с floor>total_floors или ppm² вне [50K,800K]. Все три условия в ОДНОМ ответе.
  • Пустой кейс (несуществующий/далёкий адрес, 0 аналогов): тот же эндпоинт → insufficient_data=true, median_price_rub=0. Фронт /trade-in рендерит «недостаточно данных», НЕ «0 ₽» (UI-проверка скриншотом/snapshot).
  • sales-vs-listings: GET /trade-in/api/v1/trade-in/sales-vs-listings?address=Екатеринбург, ул. Малышева 84&area_m2=45&rooms=2 → ключ data_quality присутствует, значение ∈ {house_linked,street_only,no_data}. Если street_only — на фронте StreetDealsCard виден дисклеймер «по улице» (#722).
  • avito listing_date: SELECT count(listing_date)*100.0/count(*) FROM listings WHERE source='avito' AND scraped_at > NOW() - INTERVAL '2 days' → покрытие свежих avito-строк заметно выше прежних 8.5% (цель: значимый рост; зафиксировать фактический %). NB: зависит от того, отработал ли re-scrape после деплоя #729 — если свежих строк нет, отметить «pending re-scrape», НЕ fail.
  • Регрессия диапазона (killer-фактор демо): на 2 canonical-адресах (Малышева 125, Заводская 44а) сверить, что range_low_rub < median_price_rub < range_high_rub и диапазон не схлопнут/не вывернут.
  • Errors: проверить GlitchTip на новые 5xx от /estimate или /sales-vs-listings за время прогона (0 новых).

Не делать

  • НЕ перепроверять то, что уже зелено per-issue (unit-тесты воркеров) — здесь только интеграция/прод.
  • НЕ чинить найденное — заводить bug-issue (scope/*, status/ready, priority/*) + коммент сюда.
  • Если #698 (n_analogs doc-комментарий) ещё не смержен на момент прогона — он doc-only, в этот acceptance НЕ входит.

Связано

  • Milestone Praktika demo — Mon 2026-06-01 (#6). Issues: #697 #699 #721 #722 #726.
  • Per-issue QA-проходы: #699 comment 5079, #697 comment 5109.
> QA: это исполняемый smoke-чек интеграции. Per-issue QA уже пройден (см. ниже) — здесь проверяется ВЗАИМОДЕЙСТВИЕ фиксов на одном hot-file перед демо ГК «Практика» 2026-06-01. Расхождение → заводи bug-issue + коммент, НЕ чини сам. ## Задача Прогнать единый golden-path acceptance на **проде** (`gendsgn.ru/trade-in`), убедившись, что 5 недавно смерженных milestone-6 фиксов, трогающих `estimator.py` + `schemas/trade_in.py` + `/sales-vs-listings`, работают **совместно** без регрессий и противоречий в одном ответе. ## Контекст — что слилось (все в один hot-file, по отдельности smoke OK, вместе НЕ проверялось) - #699 (PR #733, `066fab1`) — guard-bands ДКП-выбросов в `_fetch_deals` + `_fetch_dkp_corridor` (ppm² ∈ [50K,800K], floor ∈ [1,60] и ≤ total_floors). - #697 (PR #734, `ef7b5f8`) — `AggregatedEstimate.insufficient_data` (computed_field = `median_price_rub <= 0`). - #721 (PR #723) — `SalesVsListingsResponse.data_quality` (`house_linked|street_only|no_data`). - #722 (PR #725) — фронт-дисклеймер «по улице» при `street_only`. - #726 (PR #729) — avito `listing_date` из `sortTimeStamp` JSON. ## Definition of Done (бинарно проверяемо — прод, basic_auth) - [ ] **Нормальный кейс** (плотная ЕКБ-улица, напр. Белинского 41, rooms=2, area≈55): `POST /trade-in/api/v1/trade-in/estimate` → `insufficient_data=false`, `median_price_rub>0`, `n_analogs>0`, и в `actual_deals[]` НЕТ записей с `floor>total_floors` или ppm² вне [50K,800K]. Все три условия в ОДНОМ ответе. - [ ] **Пустой кейс** (несуществующий/далёкий адрес, 0 аналогов): тот же эндпоинт → `insufficient_data=true`, `median_price_rub=0`. Фронт `/trade-in` рендерит «недостаточно данных», НЕ «0 ₽» (UI-проверка скриншотом/snapshot). - [ ] **sales-vs-listings**: `GET /trade-in/api/v1/trade-in/sales-vs-listings?address=Екатеринбург, ул. Малышева 84&area_m2=45&rooms=2` → ключ `data_quality` присутствует, значение ∈ {house_linked,street_only,no_data}. Если `street_only` — на фронте StreetDealsCard виден дисклеймер «по улице» (#722). - [ ] **avito listing_date**: `SELECT count(listing_date)*100.0/count(*) FROM listings WHERE source='avito' AND scraped_at > NOW() - INTERVAL '2 days'` → покрытие свежих avito-строк заметно выше прежних 8.5% (цель: значимый рост; зафиксировать фактический %). NB: зависит от того, отработал ли re-scrape после деплоя #729 — если свежих строк нет, отметить «pending re-scrape», НЕ fail. - [ ] **Регрессия диапазона** (killer-фактор демо): на 2 canonical-адресах (Малышева 125, Заводская 44а) сверить, что `range_low_rub < median_price_rub < range_high_rub` и диапазон не схлопнут/не вывернут. - [ ] Errors: проверить GlitchTip на новые 5xx от `/estimate` или `/sales-vs-listings` за время прогона (0 новых). ## Не делать - НЕ перепроверять то, что уже зелено per-issue (unit-тесты воркеров) — здесь только интеграция/прод. - НЕ чинить найденное — заводить bug-issue (`scope/*`, `status/ready`, `priority/*`) + коммент сюда. - Если #698 (n_analogs doc-комментарий) ещё не смержен на момент прогона — он doc-only, в этот acceptance НЕ входит. ## Связано - Milestone Praktika demo — Mon 2026-06-01 (#6). Issues: #697 #699 #721 #722 #726. - Per-issue QA-проходы: #699 comment 5079, #697 comment 5109.
bot-analyst added the
priority/p1
scope/qa
status/ready
tradein
labels 2026-05-30 14:46:26 +00:00
bot-analyst added this to the Praktika demo — Mon 2026-06-01 milestone 2026-05-30 14:46:27 +00:00
Author
Collaborator

🎯 analyst: demo-gate #2 — запускать ТОЛЬКО после merge+deploy #659. Этот acceptance гоняется на проде (gendsgn.ru/trade-in), но praktika-аккаунт/квота/счётчик появятся на проде лишь после деплоя #659 (он сам gate). Порядок демо-цепочки: #659 (deploy) → #736 (prod acceptance). До деплоя #659 — этот issue фактически blocked на нём; qa-воркер не запускать раньше. После деплоя — это финальный go/no-go перед демо 2026-06-01.

🎯 analyst: **demo-gate #2 — запускать ТОЛЬКО после merge+deploy #659.** Этот acceptance гоняется на проде (`gendsgn.ru/trade-in`), но praktika-аккаунт/квота/счётчик появятся на проде лишь после деплоя #659 (он сам gate). Порядок демо-цепочки: **#659 (deploy) → #736 (prod acceptance)**. До деплоя #659 — этот issue фактически blocked на нём; qa-воркер не запускать раньше. После деплоя — это финальный go/no-go перед демо 2026-06-01.
Collaborator

Acceptance golden-path smoke на проде (2026-05-31)

Прогон POST /trade-in/api/v1/trade-in/estimate на проде (Екатеринбург, ул. Белинского 84, 52м², 2к, monolith, good). Все 5 milestone-6 фиксов сосуществуют коэрентно в ОДНОМ ответе, противоречий НЕТ:

Фикс Поле Значение OK
#699 guard-bands dkp_corridor + actual_deals dict(5) + 10 сделок (в коридоре)
#697 insufficient_data insufficient_data False (median_price_rub=7 864 065 > 0 → коэрентно)
#698 n_analogs sync n_analogs vs analogs 6 == 6
#695 confidence confidence+explanation medium + текст ±13%, нет противоречия
#648/#652 sold expected_sold_price_rub / asking_to_sold_ratio 6 311 187 / 0.80 (per_rooms), expected<asking

Плюс: median_price_rub = area×ppm² консистентно (52×151232=7 864 065); cian_valuation вернул данные (proxy-фикс #860 работает на проде); range_low<median<range_high.

Вывод: интеграция 5 фиксов на hot-file estimator.py чистая, регрессий/противоречий не обнаружено на golden-path.

Замечания: (1) это ОДИН golden-path — полную per-scenario матрицу (edge: median=0/thin-comps/anchor n<4) добивает qa-tester отдельно; (2) #877 (anchor safe-guard) ещё в review (не в этих 5) — после мержа повторить smoke на thin-comps кейсе. Расхождений для bug-issue НЕ найдено.

## Acceptance golden-path smoke на проде ✅ (2026-05-31) Прогон `POST /trade-in/api/v1/trade-in/estimate` на проде (Екатеринбург, ул. Белинского 84, 52м², 2к, monolith, good). Все 5 milestone-6 фиксов сосуществуют коэрентно в ОДНОМ ответе, противоречий НЕТ: | Фикс | Поле | Значение | OK | |---|---|---|---| | #699 guard-bands | `dkp_corridor` + `actual_deals` | dict(5) + 10 сделок (в коридоре) | ✅ | | #697 insufficient_data | `insufficient_data` | False (median_price_rub=7 864 065 > 0 → коэрентно) | ✅ | | #698 n_analogs sync | `n_analogs` vs `analogs` | 6 == 6 | ✅ | | #695 confidence | `confidence`+explanation | medium + текст ±13%, нет противоречия | ✅ | | #648/#652 sold | `expected_sold_price_rub` / `asking_to_sold_ratio` | 6 311 187 / 0.80 (per_rooms), expected<asking | ✅ | Плюс: `median_price_rub` = area×ppm² консистентно (52×151232=7 864 065); `cian_valuation` вернул данные (proxy-фикс #860 работает на проде); range_low<median<range_high. **Вывод:** интеграция 5 фиксов на hot-file estimator.py чистая, регрессий/противоречий не обнаружено на golden-path. Замечания: (1) это ОДИН golden-path — полную per-scenario матрицу (edge: median=0/thin-comps/anchor n<4) добивает qa-tester отдельно; (2) #877 (anchor safe-guard) ещё в review (не в этих 5) — после мержа повторить smoke на thin-comps кейсе. Расхождений для bug-issue НЕ найдено.
Collaborator

Закрыто — milestone-6 estimator/data-quality фиксы, которые consolidated acceptance отслеживал, смержены и на проде (#1776 same-building anchor, #1807 corridor-clamp премиум, #1774/#1773 адреса/дедуп, и др.). Pre-demo окно прошло (issue от 05-30). Если нужен свежий consolidated QA-прогон под новое демо — отдельным тикетом.

✅ Закрыто — milestone-6 estimator/data-quality фиксы, которые consolidated acceptance отслеживал, смержены и на проде (#1776 same-building anchor, #1807 corridor-clamp премиум, #1774/#1773 адреса/дедуп, и др.). Pre-demo окно прошло (issue от 05-30). Если нужен свежий consolidated QA-прогон под новое демо — отдельным тикетом.
Sign in to join this conversation.
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#736
No description provided.