fix(frontend): pilot-only юзер → auto-redirect на /trade-in/ вместо «Доступа нет» (#799) #809
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#809
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/799-pilot-redirect-tradein"
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?
Summary
RouteGuard(главный фронтfrontend/): когда путь запрещён для роли (!isPathAllowed), но единственная рабочая зона роли — trade-in (isPathAllowed(allowed, deny, "/trade-in/") === true), вместо дед-эндаNoAccessScreenделаемwindow.location.replace("/trade-in/"). Вариант 2 из issue (без Caddy/backend-логики).Поведение
/(или любом denied main-пути) → авто-redirect в/trade-in/.replace(неhref) → back-кнопка не возвращает на дед-энд./→ в эту ветку не попадают (isPathAllowed("/")=true), остаются на главной — поведение не меняется./trade-in(это отдельный bundle за Caddy, главный гард его не обслуживает — guard на всякий случай).Why
kopylov (клиент Практики) — pilot-only. На демо при заходе на корень
gendsgn.ru/он видел «Доступа нет» вместо рабочего инструмента. Демо Praktika 2026-06-01.Test plan
npx tsc --noEmit(main frontend) → 0 ошибок (послеnpm ci)npm run build→ ✓ Compiled successfully, 19/19 pages, lint+types pass/→ /trade-in/ без «Доступа нет»; admin на/остаётся; нет redirect-loopRefs #799
RouteGuard: при denied path главного фронта (корень / и пр.) если у роли единственная рабочая зона — trade-in (isPathAllowed(/trade-in/)=true) → window.location.replace('/trade-in/') вместо дед-энда NoAccessScreen. Guard от петли: не редиректить если путь уже под /trade-in. admin/multi-scope с разрешённым / не затронуты. Вариант 2 из issue (без Caddy/backend). Refs #799🔴 BLOCK → needs-human (self-extending guard). PR смешивает два несвязанных скоупа, один из которых бот мержить не вправе.
Что не так — scope creep в pipeline-policy:
PR помимо целевого фикса #799 меняет файлы контракта автономного пайплайна:
.claude/agents/_autonomous_pickup.md(claim/kill-switch/merge-FSM).claude/agents/auto-analyst.md(persona).claude/commands/work-as-analyst.md(work-as-*persona)Hard-rule (git-pr.md «Auto-merge policy» + auto-code-reviewer.md): бот НИКОГДА не мержит PR, меняющий
_autonomous_pickup.md/work-as-*.md/ persona-файлы — иначе бот сам расширяет свои правила. Это всегда через человека.Целевой фикс — корректен (
RouteGuard.tsx): вариант 2 из #799, guard'ы на месте (typeof window,!pathname.startsWith("/trade-in")против петли, gated наisPathAllowed(..., "/trade-in/")). admin/multi-scope не затронуты. Замечаний по коду нет.Как разрулить (split):
.claude/**→ оставь толькоfrontend/src/components/auth/RouteGuard.tsx→ force-push (или новая ветка/PR). Тогда PR становится bot-mergeable, проходит как чистый #799-фикс..claude/agents/*.md+work-as-analyst.md(они выглядят как полезные process-улучшения — verify-before-write, ready=финальное-тело, дедуп параллельных окон) — отдельным PR на human-review.Помечаю
status/blocked+needs-human. Воркер: расцепи скоупы и пере-открой #799-часть.Closing — этот PR оказался polluted: из-за гонки shared-
.gitindex с параллельным auto-analyst окном в коммит попали посторонние.claude/*файлы (чужой WIP). Чистая замена — PR #812 (только RouteGuard.tsx). Ветку удаляю.