fix(tradein): resilience-хвост аудита #770 (findings #25-33) #793
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
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#793
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/770-resilience-tail"
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?
Findings закрыты
mutations.retry=falseapp/providers.tsxWhatIfPanel.tsxtitleна дельту (включает естественный scrape-разброс, не только эффект параметра)WhatIfPanel.tsxkey={i})ListingsCard.tsx,DealsCard.tsxasHouseType/asRepairState— runtime-валидация enum передas-casttypes/trade-in.ts,EstimateForm.tsx,HeroSummary.tsxhumanizeAgo: мин→ч→дн дляdata_freshness_minutes(«2880 мин» → «2 дн назад»)ListingsCard.tsxperiod_monthsвместо хардкода «7 месяцев»DealsCard.tsx.gitignore: broader cookies pattern (*cookies*.json+ dotfiles.avito/.yandex).gitignoreglobal-error.tsx(root error-boundary) + history error-state (не маскировать сбой пустым списком)app/global-error.tsx(new),history/page.tsxПроверки реальности (verify-before-fix)
git ls-files 'tradein-mvp/**/*.bak'→ пусто —.bakНЕ трекаются в git (только untracked мусор в working tree), удалять нечего. Cookie-json'ы тоже не трекаются; существующие gitignore-паттерны не покрывали.avito-cookies.json/.yandex-cookies.json(dotfiles) → добавил.WhatIfPanel:69cast уже типобезопасен (est.repair_stateтипизированRepairState|null), не трогал — finding касался EstimateForm/HeroSummary.Deferred (1 sub-part)
#25 —
?id=-restore error-UI вpage.tsx(протухшая ссылка → молча пустая форма): требует UX-проектирования error-state внутри restore-флоу, выходит за рамки механического fix. Рекомендую отдельный follow-up issue. Остальные части #25 (global-error, history) сделаны.Test plan
npx tsc --noEmit→ 0 ошибокnpm run build(incl. ESLint + types) → ✓ Compiled, 10/10 pagesRefs #770
✅ APPROVE
Resilience-хвост, 9 findings (#25-33), frontend + .gitignore.
Correctness (по находкам)
<2(5xx/сеть);mutations.retry=false. Anti-storm. ✓reqSeqRef, onSuccess применяет только приseq===current— классический out-of-order guard, предотвращает перетирание свежего stale-ответом. ✓titleна дельте (естественный scrape-разброс). Честно. ✓${source}|${address}|${price}|${i}(itiebreaker → уникальность). ✓asHouseType/asRepairStateruntime-валидаторы (membership-check перед cast) — защита от битого?id=-restore/payload. ✓humanizeAgoмин→ч→дн (60/1440 пороги, null→"—"). ✓{period_months} месвместо хардкода «7 месяцев». ✓.gitignorecookie-паттерны — verify-before-fix подтвердил файлы untracked (удалять нечего), secret в диффе нет.global-error.tsx(own html/body — верно для Next.js global-error) + history 5xx error-state (без маскировки). Deferred?id=-restore error-UI задокументирован как follow-up (разумный scope-call).Verify-before-fix дисциплина видна (#33
git ls-files, #29 реальные строки, #30 отметил WhatIfPanel:69 уже типобезопасен). tsc 0, build ✓ 10/10.Advisory (non-blocking) — массивы
HOUSE_TYPES/REPAIR_STATESнужно держать в синке с union-типами (readonly HouseType[]ловит невалидные добавления, но не пропуски); dropdown ограничивает ввод → низкий реальный риск.Scope/security — frontend + .gitignore (не self-extending-guard файл); нет secrets в диффе, нет backend.
Verdict: ✅ APPROVE (#770 tail). Smoke → qa.