feat(mera/лендинг): витрина показывает полосу расхождения −5…+20 %; плитку «уверенность низкая» сменил замер 12.09 #3468
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#3468
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/landing-showcase-band"
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?
Что меняется на странице
Витрина сделок теперь показывает ОТОБРАННУЮ полосу расхождения −5 %…+20 %, а не всю сверку. Строки вне полосы существуют (на проде сегодня 12 из 20 показанных — от −27,9 % до +75,7 %), и их больше не видно. Чтобы страница от этого не начала врать, полоса названа на ней прямым текстом в четырёх местах:
Правило прогона (
REJECTION_RULE, едет в/showcaseвместе со строками и рендерится под таблицей):Прежняя формулировка — «Величина отклонения на отбор и отбраковку не влияет — иначе витрина показывала бы лучший хвост, а не работу расчёта» — после фильтра стала ложью ровно про то, чего опасалась. Снята, а не смягчена.
Подпись под таблицей сверок (
AccuracyV3):Подпись бегущей строки (
DealsTickerV3) — она висит над первым экраном, её числа читают раньше любых оговорок:Счётчики прогона — подпись поправлена, потому что они разъехались со смыслом:
eligible − writtenбольше не значит «столько не поместилось», в разницу входят отсеянные полосой. Было «Показано 20 строк из 159 годных», стало «Показано 8 строк из 159 собранных прогоном».Утверждение про полосу проверяет само себя (правка по ревью, коммит
db47fa0e)Ревьюер нашёл дыру в ВЫКАТЕ до мержа. Границы полосы стоят в коде фронта, а строки и
rejection_ruleприезжают из БД от последнего прогона задачи — задачи нет в расписании, её запускают руками. В окне «фронт выкачен, витрина не пересчитана» страница утверждала бы полосу над прежними двадцатью строками и тут же показывала под утверждением +75,7 %. Это хуже, чем было до правки.Чинится конструкцией:
allWithinBand(deals)вdeal-view.tsспрашивает сами показанные строки теми же границами, что стоят в тексте.Отрендерено и прочитано глазами в обоих состояниях, на реальных двадцати
err_pctпрода:Решения, которые стоит отревьюить
select_rows, а не вbuild_row. Строка вне полосы обязана остаться кандидатом и попасть вeligible: отбракуй её раньше — и вышло бы «показано 20 из 20 годных», счётчик, из которого отбор не виден вообще.BAND_MIN_ERR_PCT/BAND_MAX_ERR_PCT. Вписанный руками «−5 %» в подписи и>= -5.0в коде — две независимые величины; тестtest_rejection_rule_names_the_band_that_is_actually_appliedдержит их вместе.MAX_FACT_PPM2.Вторая часть: плитка блока «Точность»
«400 из 400 расчётов с пометкой „уверенность низкая“» заменена на свежий замер 12.09.2026 (
--engine full --sample 325 --spread scattered, три пересборки с солями 11/22/33, только чтение):«52,7 % · сделок — расхождение в пределах ±20 % · по 290 сделкам · замер 12.09.2026»
Оговорки на экране (все три обязательны):
confidenceLowне удалена — помечена снятой с витрины (прогон 29.08 на кластеризованной, непредставительной выборке, что признано в шапке самого файла) и ждёт решения владельца.priceError(15,3 %) иcoverage(84,3 %) не тронуты.Сторож свежести (
backtest-freshness) теперь следит за ОБЕИМИ датами замеров: второе число на странице, которое не сторожит никто, — та же дыра, ради которой сторож и заводился.Проверки
pytest tests/ -q— 5950 passed, 35 skipped;ruff check app tests— чисто.tsc --noEmit— чисто;vitest run— 288 passed (32 файла).landing_showcase_dealsпрода.)allWithinBandобезврежен руками, всегда true): краснеют оба новых теста, и красный текст показывает ровно тот дефект, ради которого правка делалась: Обе проверки возвращены, прогоны зелёные.После мержа
docker exec tradein-backend python -m app.tasks.landing_showcase_deals. До пересчёта в таблице лежат старые 20 строк (12 вне полосы), и страница — благодаря самопроверке — честно не будет обещать полосу, но и показывать будет набор старого правила.scrape_schedules— строки нет вовсе, запуск ручной). Это отдельная задача, её заводит ревьюер; здесь отмечено, чтобы не потерялось: пока расписания нет, каждая правка полосы на фронте требует ручного пересчёта, а витрина стареет молча.