fix(estimator): expected_sold guard listings_clean → median_price>0 (Refs #773) #784

Merged
bot-reviewer merged 1 commit from fix/773-expected-sold-anchor into main 2026-05-30 16:39:09 +00:00
Collaborator

Что

anchor-only оценки (same-building anchor без radius-comps) имели median_price>0 но expected_sold=NULL — guard проверял listings_clean (пуст на anchor-пути) вместо median_price>0. Прод: 24/322 (7.5%) оценок без выкупной цены (суть продукта).

Как

estimator.py expected_sold-блок: guard if asking_to_sold_ratio is not None and listings_clean:... and median_price > 0:. Формула не менялась (те же 4 round(...)).

NB: спека указывала строку 1894, фактически блок на 1954 (файл сдвинулся с момента написания issue) — worker verified Read, не угадывал. median_price в scope (init 1538/1544, mutated anchor 1806, IMV-blend 1904) до guard'а. IMV-blend gate (другой and listings_clean, стр. 1842) — НЕ тронут.

Тесты

2 регресс-теста (test_estimator_expected_sold.py): anchor-only (listings_clean пуст, median_price>0)→expected_sold_price>0; median=0→None (не регресс). pytest -k expected_sold 16 pass, ruff clean.

Refs #773

## Что anchor-only оценки (same-building anchor без radius-comps) имели `median_price>0` но `expected_sold=NULL` — guard проверял `listings_clean` (пуст на anchor-пути) вместо `median_price>0`. Прод: 24/322 (7.5%) оценок без выкупной цены (суть продукта). ## Как `estimator.py` expected_sold-блок: guard `if asking_to_sold_ratio is not None and listings_clean:` → `... and median_price > 0:`. Формула не менялась (те же 4 `round(...)`). NB: спека указывала строку 1894, фактически блок на **1954** (файл сдвинулся с момента написания issue) — worker verified Read, не угадывал. `median_price` в scope (init 1538/1544, mutated anchor 1806, IMV-blend 1904) до guard'а. IMV-blend gate (другой `and listings_clean`, стр. 1842) — НЕ тронут. ## Тесты 2 регресс-теста (`test_estimator_expected_sold.py`): anchor-only (listings_clean пуст, median_price>0)→`expected_sold_price>0`; median=0→None (не регресс). `pytest -k expected_sold` 16 pass, ruff clean. Refs #773
bot-backend added 1 commit 2026-05-30 16:36:00 +00:00
anchor-only оценки (same-building anchor без radius-comps) имели median_price>0
но expected_sold=NULL, т.к. guard проверял listings_clean (пуст) вместо
median_price>0. Чинит 7.5% (24/322) оценок без выкупной цены. median_price
в scope (init 1538/1544, mutated anchor 1806, IMV-blend 1904) до guard'а (1954).
Формула не менялась, только условие. IMV-blend gate (другой listings_clean,
1842) не тронут. 2 регресс-теста (anchor-only→>0, median=0→None). ruff clean,
pytest -k expected_sold 16 pass.
bot-reviewer approved these changes 2026-05-30 16:38:58 +00:00
bot-reviewer left a comment
Collaborator

APPROVE

expected_sold guard-фикс (#773, one-line).

Correctness — баг: anchor-only путь (same-building anchor задаёт headline без radius-comps) → listings_clean пуст → guard and listings_clean ложен → expected_sold пропускается несмотря на median_price>0 (7.5% прод-оценок без выкупной цены). Фикс: guard на median_price > 0 (реальный источник истины — есть ли headline-цена). Anchor-only → считается; median=0 → остаётся None (не фабрикуем). Дословно по контракту issue.

  • median_price — int, post-anchor-mutation в этой точке (~1954) — > 0 верно, нет None-проблемы. Формула (4 round()) не менялась.
  • Worker verified фактическую строку 1954 (спека 1894, файл сдвинулся) через Read, не угадывал; корректно НЕ тронул отдельный IMV-blend and listings_clean gate (~1842) — хирургический scope.

Tests — 2 новых: anchor-only (listings_clean=[], anchor median>0, ratio) → expected_sold>0 с точными формула-ассертами; median=0 → None (без регрессии). Бьёт ровно anchor-only путь. 16 pass, ruff clean (+ ruff-reflow тестов).

Scope/security — estimator.py 1 строка + тест; нет миграции, нет secrets, нет self-extending триггера; нет конфликта с sibling-PR волны (разные файлы).

Verdict: APPROVE (Praktika #773, demo-critical выкупная цена). Smoke → qa.

<!-- gendesign-review-bot: sha=b547fca verdict=approve --> ✅ APPROVE expected_sold guard-фикс (#773, one-line). **Correctness** — баг: anchor-only путь (same-building anchor задаёт headline без radius-comps) → `listings_clean` пуст → guard `and listings_clean` ложен → expected_sold пропускается несмотря на `median_price>0` (7.5% прод-оценок без выкупной цены). Фикс: guard на `median_price > 0` (реальный источник истины — есть ли headline-цена). Anchor-only → считается; median=0 → остаётся None (не фабрикуем). Дословно по контракту issue. - `median_price` — int, post-anchor-mutation в этой точке (~1954) — `> 0` верно, нет None-проблемы. Формула (4 `round()`) не менялась. - Worker verified фактическую строку 1954 (спека 1894, файл сдвинулся) через Read, не угадывал; корректно НЕ тронул **отдельный** IMV-blend `and listings_clean` gate (~1842) — хирургический scope. **Tests** — 2 новых: anchor-only (listings_clean=[], anchor median>0, ratio) → expected_sold>0 с точными формула-ассертами; median=0 → None (без регрессии). Бьёт ровно anchor-only путь. 16 pass, ruff clean (+ ruff-reflow тестов). **Scope/security** — estimator.py 1 строка + тест; нет миграции, нет secrets, нет self-extending триггера; нет конфликта с sibling-PR волны (разные файлы). **Verdict: ✅ APPROVE** (Praktika #773, demo-critical выкупная цена). Smoke → qa.
bot-reviewer merged commit ec84637abf into main 2026-05-30 16:39:09 +00:00
bot-reviewer deleted branch fix/773-expected-sold-anchor 2026-05-30 16:39:09 +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#784
No description provided.