fix(tradein/estimate): оживлять мёртвые сохранённые оценки при открытии #2826
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
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2826
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/tradein-revive-dead-estimates"
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?
Инцидент
Заказчик прислал в поддержку ссылку на сохранённую оценку
?id=ff421062-...и видит «НЕДОСТАТОЧНО ДАННЫХ». Запись создана до #2823/#2825 и лежит в БД мёртвой (median_price=0,n_analogs=0) со старым текстом объяснения — «минимум для оценки по рынку — 5», формулировкой, которой в коде уже нет.Новый расчёт по тем же входным данным сейчас даёт 4 031 157 ₽ / 39 аналогов. То есть оценка починена, а старая ссылка навсегда показывает труп. Таких строк в базе 117 из 1071 (29 за последние 30 дней, самая старая 2026-05-29).
Summary
median_price <= 0/NULL) — пересчёт из сохранённых входных данных с записью результата в ту же строку, id и ссылка не меняются. Строка с реальной ценой не трогается никогда — это сохранённый документ клиента.UPDATE ... WHERE id=... AND (median_price<=0 OR NULL) AND (revival_attempted_at IS NULL OR < NOW()-interval) RETURNING id— проверки «всё ещё мертва» и «давно не пробовали» выполняются в БД, без TOCTOU между параллельными GET. Окно троттлинга 10 мин (trade_in_revival_throttle_minutes). Временная строка, которую всегда создаётestimate_qualityпод новым uuid, удаляется, аavito_imv_evaluations.estimate_idперепривязан к оригиналу до удаления — иначеON DELETE CASCADEснёс бы только что записанный IMV-кэш.house_type/repair_state) →logger.exceptionи отдача сохранённой строки. GET не отдаёт 500.relaxations/reliability(миграция255_*,ADD COLUMN IF NOT EXISTS,lock_timeout): раньше при возврате к сохранённой оценке пропадал красный дисклеймер, хотя цена построена на расширенной выборке. PDF читает их так же.Test plan
ruff check/ruff format— чисто, pre-commit зелёныйtsc --noEmit,eslint,npm run build— чистоhouse_type→ fallback; round-triprelaxations/reliability; два guard-теста на то, что оба INSERT-пути реально пишут новые колонкиget_estimateобъявлен какdef, а неasync def—asyncio.run()внутри корректен?id=ff421062-...и убедиться, что вместо заглушки появилась цена