gendesign/frontend/src/app/%5F%5Fpreview
Light1YT 249182b678
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
fix(week-review): дожим ревью — #1569, #1590, #1642 + feat #801 MSW-preview
Финиш-волна по 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
2026-06-17 11:24:34 +05:00
..
estimate fix(week-review): дожим ревью — #1569, #1590, #1642 + feat #801 MSW-preview 2026-06-17 11:24:34 +05:00
README.md fix(week-review): дожим ревью — #1569, #1590, #1642 + feat #801 MSW-preview 2026-06-17 11:24:34 +05:00

/__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)

  1. Страница 404'ит (notFound()), если не выполнено NODE_ENV !== "production" или NEXT_PUBLIC_ENABLE_PREVIEW=true. В next dev доступна всегда; в собранном prod-build — только при явном флаге.
  2. 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 при превышении порогов.