[Fable 5][P3] UserMenu: роль analyst (есть в backend с #962) отображается бейджем «Пилот» #1237

Closed
opened 2026-06-13 04:49:48 +00:00 by bot-backend · 0 comments
Collaborator

Из армейского ревью Claude Fable 5 (2026-06-11)

Confirmed by 2/2 адверсариальных верификатора, severity P3 (api-contract), confidence 0.85.

Файл

frontend/src/components/auth/UserMenu.tsx:92

Evidence (цитата кода)

const roleLabel = data.role === "admin" ? "Админ" : "Пилот";

Why bug

Backend Role = Literal["admin", "pilot", "analyst"] (backend/app/core/auth.py:33), роль analyst активна в auth/roles.yaml (юзер analysttest, #962). Frontend-тип Role в lib/useMe.ts = "admin" | "pilot" разъехался со схемой /me, и UserMenu любому не-admin рисует «Пилот» — analyst-пользователь видит неверную роль в личном кабинете.

Suggested fix

Расширить тип Role в useMe.ts до "admin" | "pilot" | "analyst" и сделать map ролей → label («Аналитик») вместо бинарного тернарника.

Verify notes

  • [real/P3] Трасса подтверждена: /me возвращает роль из roles.yaml как есть (analysttest: analyst, #962; get_user_scope auth.py:183-187), фронт-тип Role="admin"|"pilot" в useMe.ts не ограничивает runtime-JSON, и строка 92 рисует «Пилот» любому не-admin → analyst увидит неверный бейдж. Доступ не страдает (RouteGuard использует allowed/deny_paths; .role в фронте только тут). Сейчас analysttest ещё не в caddy/users.caddy.snippet (документированный devops-шаг того же #962), поэтому строго cosmetic P3.
  • [real/P3] Backend Role включает "analyst" (#962, 86828d0), roles.yaml: analysttest: analyst, paths "/**" — landing с UserMenu доступен; /me возвращает роль verbatim. Frontend useMe.ts (Role = "admin"|"pilot", не менялся с #586) и UserMenu:92 analyst не знают — не-admin получает «Пилот». Защит нет: в frontend/src ноль обработки analyst; отсутствие в Caddy — документированный временный шаг devops, не guard. Display-only, RBAC через allowed_paths не задет — P3.

Provenance

  • Finders: fe-rest
  • Confidence: 0.85
  • Originally batched at: main@d796027
## Из армейского ревью Claude Fable 5 (2026-06-11) Confirmed by 2/2 адверсариальных верификатора, severity **P3** (api-contract), confidence 0.85. ## Файл [`frontend/src/components/auth/UserMenu.tsx:92`](frontend/src/components/auth/UserMenu.tsx:92) ## Evidence (цитата кода) ``` const roleLabel = data.role === "admin" ? "Админ" : "Пилот"; ``` ## Why bug Backend Role = Literal["admin", "pilot", "analyst"] (backend/app/core/auth.py:33), роль analyst активна в auth/roles.yaml (юзер analysttest, #962). Frontend-тип Role в lib/useMe.ts = "admin" | "pilot" разъехался со схемой /me, и UserMenu любому не-admin рисует «Пилот» — analyst-пользователь видит неверную роль в личном кабинете. ## Suggested fix Расширить тип Role в useMe.ts до "admin" | "pilot" | "analyst" и сделать map ролей → label («Аналитик») вместо бинарного тернарника. ## Verify notes - [real/P3] Трасса подтверждена: /me возвращает роль из roles.yaml как есть (analysttest: analyst, #962; get_user_scope auth.py:183-187), фронт-тип Role="admin"|"pilot" в useMe.ts не ограничивает runtime-JSON, и строка 92 рисует «Пилот» любому не-admin → analyst увидит неверный бейдж. Доступ не страдает (RouteGuard использует allowed/deny_paths; .role в фронте только тут). Сейчас analysttest ещё не в caddy/users.caddy.snippet (документированный devops-шаг того же #962), поэтому строго cosmetic P3. - [real/P3] Backend Role включает "analyst" (#962, 86828d0), roles.yaml: analysttest: analyst, paths "/**" — landing с UserMenu доступен; /me возвращает роль verbatim. Frontend useMe.ts (Role = "admin"|"pilot", не менялся с #586) и UserMenu:92 analyst не знают — не-admin получает «Пилот». Защит нет: в frontend/src ноль обработки analyst; отсутствие в Caddy — документированный временный шаг devops, не guard. Display-only, RBAC через allowed_paths не задет — P3. ## Provenance - Finders: `fe-rest` - Confidence: 0.85 - Originally batched at: main@d796027
bot-backend added the
Fable 5 ревью
label 2026-06-13 04:49:48 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1237
No description provided.