Коридор сделок с малой выборкой честно помечен справочным #3462
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#3462
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/3452-corridor-advisory-zone"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #3452
Что меняется для клиента
Коридор реальных сделок Росреестра показывается начиная с трёх сделок, а страховки по нему (кламп headline сверху, radius-floor снизу) включаются только с десяти. В зоне 3..9 сделок коридор на экране выглядел ровно как рабочий, хотя цену он не держал. PR #3445 (снятие предиката
d.rooms) переносит в эту зону реальных клиентов — замерено 248 → 3 и 72 → 8 сделок.Порог показа НЕ поднят (иначе клиент лишился бы информации), кламп по трём сделкам НЕ включён (он был бы хуже своего отсутствия). Вместо этого рядом с коридором теперь стоит размер его выборки:
Как это сделано
DkpCorridor.advisory_only(app/schemas/trade_in.py) — computed-поле:count < settings.estimate_corridor_clamp_min_n. Порог живёт в одном месте, поле верно во всех конструкторах коридора автоматически — и на POST/estimate, и на GET-rehydrate.app/services/estimator.py, сразу после выдачиestimate_id) — ровно одна строка на оценку, GET-rehydrate счёт не двоит._fetch_dkp_corridorотдаёт служебный ключscope(street/city_wide): «мало сделок на улице» и «мало сделок во всём городе» — разные новости, и лог обязан их различать. В схему ответа ключ не уходит.corridorAdvisoryNoteвlib/rosreestr.ts, чтобы два экрана не разъехались.Почему текст про выборку, а не про алгоритм (правка по ревью)
Первая редакция говорила «оценку по ним не корректировали» — и это было неправдой. Порог
estimate_corridor_clamp_min_nгейтит только ДВЕ страховки; третий ценовой путь коридора — гейт Tier C (#1795 шаг 3,estimator.py) — сравнивает якорь с потолком коридора без порога вообще, и коридор из пяти сделок способен уронить headline на треть (ревьюер воспроизвёл: якорь Tier C 300 000 ₽/м², с коридором 200 000 против 300 500 без него). Плюс deals-headline-fallback берёт медиану коридора начиная с трёх сделок. Утверждение о РАЗМЕРЕ ВЫБОРКИ истинно во всех достижимых состояниях — его и показываем. Докстрингиadvisory_onlyи комментарий у лога тоже перестали обещать «в цену не пошёл».Маркер лога и как считать попадания на проде
Точный маркер:
corridor_advisory_zone(уникален в кодовой базе).Формат строки:
Шаг 1 — убедиться, что чтение вообще состоялось. Контейнер называется
tradein-backend(неmera-backend); при опечаткеdocker logs ... 2>&1 | grep -cпечатает0, и отказ читается ровно как «зона пуста». Плюс--since 24hне создаёт логов за сутки: после рестарта контейнер помнит только с момента старта.lines_24h=0илиstarted=моложе суток → окно короче заявленного, число из шага 2 неполное. (Замер 12.09 в 09:35 UTC:started=2026-09-12T09:10:26Z,lines_24h=163— то есть реально покрыты 25 минут, а не сутки.)Шаг 2 — счёт попаданий:
Разрез по выборке (улица против расширения до города):
Проверки
uv run python -m pytest tests/ -q→ 5940 passed, 35 skipped, rc=0uv run ruff check app tests→ All checks passed, rc=0uv run ruff format --checkпо изменённым файлам → 3 files already formatted (в репозитории есть 15 предсуществующих неотформатированных файлов — мои не в их числе)npx tsc --noEmitrc=0,npx vitest run→ 32 файла / 278 тестов passed,npm run buildrc=0Новый файл
tests/test_3452_corridor_advisory_zone.pyпроверяет ФАКТ, а не только метку: коридор с потолком заведомо ниже медианы аналогов, в зоне headline остаётся 200 000 ₽/м² (кламп выключен порогом), выше порога прижимается к cap = 140 000 ₽/м². Фальсификация прогнана руками — флаг, захардкоженный в любую сторону, и снятый порог клампа роняют тесты.🤖 Generated with Claude Code