fix(estimator): enable split-home disclosure at validated threshold 1.2 (audit #1871) #1887

Merged
bot-backend merged 1 commit from fix/finmodel-split-disclosure-threshold into main 2026-06-23 20:55:45 +00:00
Collaborator

Summary

Включает wide-corridor split-home disclosure (из PR #1880, был default OFF) — но с исправленным порогом, провалидированным по prod-данным.

Почему порог 0.6 был неверным

Проверка trade_in_estimates (60д): corridor_pct = (range_high−range_low)/median_price → median≈0.48, p90≈0.93, p99≈1.38, и 30.7% оценок > 0.6. Включение при 0.6 прилепило бы caveat «дом разбит на секции» к ~трети оценок — большинство НЕ split-дома. Ложная атрибуция = дезинформация (ровно то, против чего весь аудит).

Изменения (3 файла, +42/-13)

  • estimate_wide_corridor_threshold 0.6 → 1.2: genuine split-дома аудита = 148-170% (1.48-1.70) → 1.2 ловит только экстремальный хвост (>p99).
  • estimate_wide_corridor_disclosure_enabled False → True (после валидации). ENV-override сохранён.
  • Формулировка смягчена: «дом разбит на секции» → «вероятно, дом разбит на секции разной этажности или разнородный фонд» — инферим по ширине коридора, не доказываем структурно.
  • Логика не тронута: Tier A + corridor>threshold, только confidence↓ + explanation; point/median/range не трогает.

Test plan

  • обновлены default-ассерты (флаг ON, порог 1.2)
  • +2 behavioral boundary-теста: фаерит при pct>threshold (1.045>1.0), НЕ фаерит при умеренном (1.045<1.2) — доказывает что raise убрал false-positive flood
  • 13 passed, ruff clean; логика/инвариант не затронуты; no schema change (config defaults → no codegen)
  • code-reviewer (после фикса header-коммента + добавления behavioral-теста по его находке)
  • post-deploy: split-дом (Хохрякова 48, коридор ~148%) → caveat + понижен confidence; нормальная оценка → без изменений

Deploy: deploy-tradein.yml.

Refs #1871

🤖 Generated with Claude Code

## Summary Включает wide-corridor split-home disclosure (из PR #1880, был default OFF) — но с **исправленным порогом**, провалидированным по prod-данным. ## Почему порог 0.6 был неверным Проверка `trade_in_estimates` (60д): `corridor_pct = (range_high−range_low)/median_price` → median≈0.48, p90≈0.93, p99≈1.38, и **30.7% оценок > 0.6**. Включение при 0.6 прилепило бы caveat «дом разбит на секции» к ~трети оценок — большинство НЕ split-дома. Ложная атрибуция = дезинформация (ровно то, против чего весь аудит). ## Изменения (3 файла, +42/-13) - `estimate_wide_corridor_threshold` **0.6 → 1.2**: genuine split-дома аудита = 148-170% (1.48-1.70) → 1.2 ловит только экстремальный хвост (>p99). - `estimate_wide_corridor_disclosure_enabled` **False → True** (после валидации). ENV-override сохранён. - Формулировка смягчена: «дом разбит на секции» → «**вероятно**, дом разбит на секции разной этажности **или разнородный фонд**» — инферим по ширине коридора, не доказываем структурно. - Логика не тронута: Tier A + corridor>threshold, только confidence↓ + explanation; point/median/range не трогает. ## Test plan - [x] обновлены default-ассерты (флаг ON, порог 1.2) - [x] +2 behavioral boundary-теста: фаерит при pct>threshold (1.045>1.0), НЕ фаерит при умеренном (1.045<1.2) — доказывает что raise убрал false-positive flood - [x] 13 passed, ruff clean; логика/инвариант не затронуты; no schema change (config defaults → no codegen) - [x] code-reviewer ✅ (после фикса header-коммента + добавления behavioral-теста по его находке) - [ ] post-deploy: split-дом (Хохрякова 48, коридор ~148%) → caveat + понижен confidence; нормальная оценка → без изменений Deploy: `deploy-tradein.yml`. Refs #1871 🤖 Generated with [Claude Code](https://claude.com/claude-code)
bot-backend added 1 commit 2026-06-23 20:55:20 +00:00
fix(estimator): enable split-home disclosure at validated threshold 1.2 (audit #1871)
All checks were successful
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 6s
CI / openapi-codegen-check (pull_request) Has been skipped
77a3d3f75a
Включает wide-corridor disclosure (PR #1880, был default OFF) — но с
ИСПРАВЛЕННЫМ порогом по prod-данным.

Проверка на trade_in_estimates (60д): corridor_pct = (range_high-range_low)/
median_price имеет median≈0.48, p90≈0.93, p99≈1.38; **30.7% оценок > 0.6**.
Старый порог 0.6 прилепил бы caveat «дом разбит на секции» к ~трети оценок —
большинство НЕ split-дома (широкий коридор бывает от разных причин). Это была
бы ложная атрибуция (дезинформация).

- estimate_wide_corridor_threshold 0.6 → 1.2: genuine split-дома из аудита =
  148-170% (1.48-1.70) → 1.2 ловит только экстремальный хвост (>p99), не трогая
  нормальную оценочную неопределённость.
- estimate_wide_corridor_disclosure_enabled False → True (включаем после
  валидации). ENV-override сохранён (kill-switch).
- Формулировка смягчена: «дом разбит на секции» → «вероятно, дом разбит на
  секции разной этажности ИЛИ разнородный фонд» — мы ИНФЕРИМ split по ширине
  коридора, не доказываем структурно.
- Логика не тронута: фаерит только Tier A + corridor>threshold, только понижает
  confidence + дописывает explanation; point/median/range не трогает.

Тесты: обновлены default-ассерты (флаг ON, порог 1.2) + 2 behavioral boundary-
теста (фаерит при pct>threshold, НЕ фаерит при умеренном 1.045<1.2 — доказывает
что raise убрал false-positive flood). 13 passed.

Refs #1871
bot-backend merged commit 8bec98e435 into main 2026-06-23 20:55:45 +00:00
Sign in to join this conversation.
No reviewers
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#1887
No description provided.