|
All checks were successful
CI / frontend-tests (pull_request) Successful in 1m2s
CI / openapi-codegen-check (push) Successful in 2m13s
CI / openapi-codegen-check (pull_request) Successful in 1m45s
CI / backend-tests (push) Successful in 9m29s
CI / backend-tests (pull_request) Successful in 9m29s
CI / changes (push) Successful in 8s
CI / changes (pull_request) Successful in 8s
CI / frontend-tests (push) Successful in 1m7s
Финиш-волна по cross-file/partial остаткам аудита + a11y-харнесс. Полностью (4): #1569 alembic регистрирует все ORM-модели (+убран фантомный Parcel) · #1590 «Индекс дефицита» больше не лжёт на fallback-горизонте (report_pdf+report_md) · #1642 thumbs mtime-freshness (нет устаревшей миниатюры) · #801 /__preview/estimate mock-render для axe/lighthouse (env-gated bypass). Частично (остаток cross-file/домен, открыты): #1593 #1635 #1640. needs-leha (открыт): #1650 (нужна новая миграция вьюхи supply-слоёв). Verify: tsc --noEmit 0; py_compile OK. Closes #1569 Closes #1590 Closes #1642 Closes #801 |
||
|---|---|---|
| .. | ||
| estimate | ||
| README.md | ||
/__preview/* — mock-render маршруты для UI-аудита (issue #801)
Dev/CI-only страницы, которые рендерят «тяжёлый» UI на статичных fixture
без единого сетевого запроса. Нужны потому, что live-фронт за auth-gate (Caddy
basic_auth), а dev без бэкенда отвечает /api/v1/me + /estimate 401 /
network-fail → реальные страницы рендерят пустой EmptyState / NoAccessScreen.
axe / lighthouse требуют reachable rendered content — его и даёт preview.
Маршруты
| URL | Рендерит | Fixture |
|---|---|---|
/__preview/estimate |
<EstimateResult> — HeroSummary + price-range bar + таблицы аналогов/сделок («денежный экран» Trade-In) |
src/lib/mocks/trade-in-estimate.ts |
Folder назван
%5F%5Fpreview(URL-encoded__preview): App Router исключает из роутинга папки с leading_, поэтому underscore-сегмент задаётся%5F.
Гарды (preview не утекает в prod)
- Страница 404'ит (
notFound()), если не выполненоNODE_ENV !== "production"илиNEXT_PUBLIC_ENABLE_PREVIEW=true. Вnext devдоступна всегда; в собранном prod-build — только при явном флаге. - RouteGuard (
components/auth/RouteGuard.tsx) пропускает/__preview/*без вызова/me, иначе network-fail подменил бы content на<NoAccessScreen>.
Локальный прогон аудита
# 1. Поднять preview без бэкенда (NODE_ENV=development → preview включён)
cd frontend && npm run dev # http://localhost:3000/__preview/estimate
# 2a. axe (a11y) — через @axe-core/cli или @axe-core/playwright
npx @axe-core/cli http://localhost:3000/__preview/estimate
# 2b. lighthouse (CWV: LCP / CLS / TBT)
npx lighthouse http://localhost:3000/__preview/estimate \
--only-categories=performance,accessibility \
--preset=desktop --output=json --output-path=./lh-estimate.json
Для собранного build вместо dev:
NEXT_PUBLIC_ENABLE_PREVIEW=true npm run build && \
NEXT_PUBLIC_ENABLE_PREVIEW=true npm run start
Baseline-метрики (заполнить после первого реального прогона)
Зафиксировать здесь, чтобы ловить регрессии (DoD #801). Прочерки — TODO followup-issue: реальный axe/lighthouse прогон.
| Метрика | Baseline | Дата | Порог регрессии |
|---|---|---|---|
| axe violations (critical/serious) | TODO | — | 0 critical |
| lighthouse a11y score | TODO | — | ≥ 90 |
| LCP (desktop) | TODO | — | ≤ 2.5 s |
| CLS | TODO | — | ≤ 0.1 |
Известные кандидаты-дефекты для followup-issue (UI-аудит 2026-05-30, #559): контраст
text-xs/#9ca3afна белом, ARIA на sortable<th>таблиц (AnalogsTable), LCP/CLS от Hero + фото-ячеек.
CI (опционально — вне scope #801, отдельный followup)
Деп @axe-core/playwright + lighthouse не добавлены в package.json (правило:
изменение deps требует regen lockfile, иначе deploy aborts). Интеграция в
.forgejo/workflows/ci.yml — отдельная задача для devops-engineer: поднять
npm run dev, прогнать команды выше, fail job при превышении порогов.