Визуальный аудит до и после Rodada 29
AT-290 (EP-031, HS-074). Это замер, а не изменение: ничего в
apps/не трогалось ради этой страницы. Съёмка «до» выполнялась 2026-09-30 наdevвde18e6a6e2; съёмка «после» — в тот же день наdevв79e6b1209f, где уже есть вся Rodada 29 — нейтральная чёрная тема с мягким терракотовым акцентом (AT-283/284),Card/Chip/Badge/Button(AT-286..288), мобильная рамка (AT-316), панель сессии (AT-317), обрезка ленты (AT-319), исправления одобрений (AT-296..299, AT-310, AT-318, AT-320), бюджет Настроек (AT-321), тексты PR и Containers (AT-323, AT-324) и проход i18n (AT-289, AT-326).Скриншотов в репозитории нет. Каждая находка называет имя файла снимка, чтобы обладатель папки со снимками мог его открыть; каждая находка, измеренная проверкой, называет также число.
Как был поднят продукт (и чего это не покрывает)
Задача требует production compose через docker/smoke.sh с
SMOKE_KEEP_UP=1. Это пробовали в одноразовом проекте compose
(COMPOSE_PROJECT_NAME=r30visual), и в этой среде это не работает по той же
причине, что зафиксирована в «до»: исходящий прокси блокирует
dl-cdn.alpinelinux.org (и repo.hex.pm/builds.hex.pm), поэтому первый
apk add --no-cache build-base git в docker/engine/Dockerfile.prod завершается с 2,
и ни один production-образ не собирается. Одноразовый проект удалён
через down -v.
Поэтому «после» выполнялось на той же замене, что и «до», намеренно — другой стек заставил бы сравнение измерять стек:
- Postgres:
pgvector/pgvector:pg16в контейнере, миграции api иpnpm seed(seed прошёл чисто на новой базе). - api:
node dist/main, собранный из этого checkout, порт 3000. - engine: HTTP-заглушка на порту 4000, отвечающая 200 на всё. Без канала
Phoenix, без схемы
engine.*. - web: dev-сервер
viteна порту 5173. - данные: seed плюс то же сценарное наполнение, что и в «до» — одна
творческая сессия с разговором, brief, бизнес-правилом, handoff
Criativo→PO, эпиком/историей/задачей и
module_map; вторая творческая сессия с реалистичной лентой иagent.error; и 4 ожидающихproposed_actionsв 3 сессиях (3terminal, 1git_push), в том же формате, что и раньше.
Следствия для чтения этой страницы:
- Сокет сессии всегда падает, поэтому полоса активности хода и терминал Кода никогда не появляются, а сессии опрашиваются с резервным интервалом.
GET /workspaces/:id/projects-summaryотвечает 500, потому чтоengine.dev_agent_statesне существует — артефакт заглушки, как и в «до». «0 агентов» на Dashboard — не находка.- Данные не идентичны данным «до»: seed теперь сам активирует сессию, предложение Criativo→PO было вытеснено, когда пришли события backlog от PO (AT-291/292), а самая свежая сессия — консультативная. Там, где находка «до» зависит от данных, которых больше нет, она помечена не перепроверено, а не «исправлено».
- Снимки сделаны как
fullPage, но большинство экранов прокручиваются внутри внутреннего контейнера, поэтому они показывают viewport. Прицельные фрагменты (detalhe-*) покрывают то, до чего не достают полные снимки.
Съёмка была ритмизирована — 6 с между экранами и 65 с между проходами темы/viewport — и зафиксировала ноль ответов 429. «До» не было ритмизировано, поэтому его снимки Настроек частично сделаны под rate limit; rate limit измеряется отдельно, ниже (G1).
Файлы
Хранятся вне репозитория, в scratchpad сессии (shots-depois/):
<screen>--<dark|light>--<desktop|mobile>.png: 19 экранов (login, dashboard, 12 вкладок проекта, две сессии,/containers,/account,/status) × 2 темы × 2 viewport (1440×900 и 390×844) = 76 снимков.detalhe-*: сессия при 1280 и 1024, верх ленты, свёрнутая панель боковых сессий, конец сессии, «Precisa de você», мобильный выдвижной ящик в обеих темах, 11 разделов Настроек и последний раздел, достигнутый под rate limit.validacao-visual.json: выводscripts/dev/validacao-visual.js, внедрённого в каждый снимок, плюс фактически применённая тема (data-theme), ширина горизонтальной прокрутки страницы, запросы к api во время загрузки и ответы 429.console-erros.json,sondas-dark.json,g1.json,g1-cliques.json: ошибки консоли и DOM-зонды, упомянутые ниже.
Скрипты съёмки (capturar-depois.mjs, detalhes-depois.mjs, g1.mjs,
g1-cliques.mjs, gaveta.mjs) — это скрипты «до» с добавленными ритмом и
зондами.
Проверка, экран за экраном
validacao-visual.js считает четыре типа дефектов разметки
(texto-cortado, fora-da-viewport, recortado-por-ancestral, alvo-pequeno
меньше 24 px). Числа одинаковы в обеих темах на каждом экране, до и
после, поэтому достаточно одного столбца на viewport. Мобильные числа «до» напрямую
не сравнимы: до AT-316 большая часть содержимого была
вытолкнута за экран, а то, чего проверка не видит, она не считает.
| экран | desktop до → после | mobile до → после | запросов к api на загрузку (после) |
|---|---|---|---|
| login | 6 → 6 | 8 → 8 | — |
| dashboard | 0 → 0 | 1 → 0 | 6 |
| overview | 3 → 1 | 12 → 2 | 32 |
| executors | 0 → 0 | 4 → 0 | 22 |
| creative | 0 → 0 | 7 → 3 | 20 |
| chat | 0 → 0 | 5 → 1 | 16 |
| insights | 0 → 0 | 4 → 0 | 17 |
| code | 0 → 0 | 2 → 0 | 16 |
| PRs | 0 → 0 | 5 → 1 | 18 |
| approvals | 1 → 1 | 13 → 1 | 23 |
| backlog | 0 → 0 | 5 → 2 | 16 |
| architecture | 0 → 0 | 11 → 0 | 15 |
| spend | 0 → 0 | 9 → 0 | 18 |
| settings | 12 → 6 | 120 → 35 | 52 |
| session | 5 → 2 | 14 → 21 | 21 |
| session 2 | 4 → 1 | 21 → 19 | 21 |
| containers | 1 → 1 | 9 → 8 | 7 |
| account | 0 → 0 | 6 → 2 | 7 |
| status | 1 → 1 | 1 → 1 | 2 |
Только один экран прокручивает всю страницу вбок при 390 px: /status
(scrollWidth 413 против 390, в обеих темах).
Находки «до», по одной
Серьёзность, как в «до»: A высокая (ломает использование или вводит в заблуждение), M средняя, B низкая (отделка). Состояние: исправлено, частично, сохраняется или не перепроверено (данных, которые это показывали, больше нет).
Рамка и навигация
| # | Сер. | Состояние | Что показывает «после» | Доказательство |
|---|---|---|---|---|
| S1 | A | частично | Рамка перестраивается при 390 px: sidebar становится выдвижным ящиком, рейка проекта — горизонтальной полосой, и ни один аутентифицированный экран, кроме /status, не прокручивается вбок. Маршрут сессии не последовал за ними — см. N1. | *--mobile.png, detalhe-gaveta-mobile--*.png |
| S2 | M | сохраняется | Sidebar «ATIVIDADES — Nenhum agente entrou em ação ainda.» рядом с Visão geral, где Criativo «aguardando» и 4 ожидающих одобрения. | projeto-overview--dark--desktop.png |
| S3 | M | сохраняется | Список вкладок в sidebar не имеет счётчиков и не отмечает текущую вкладку; рейка показывает «Aprovações 4» и «Arquitetura 1» и выделяет вкладку. | то же |
| S4 | M | исправлено | Одна трактовка активного: терракотовая заливка с терракотовым текстом в рейке; строка проекта в sidebar нейтральна. | то же |
| S5 | B | сохраняется | Переключатель темы по-прежнему читает состояние («Tema escuro»/«Tema claro»); «sair» по-прежнему строчными. | любой аутентифицированный экран |
| S6 | B | сохраняется | Имя проекта моноширинным в sidebar и дисплейным шрифтом в заголовке. | то же |
Login, Dashboard
| # | Сер. | Состояние | Что показывает «после» | Доказательство |
|---|---|---|---|---|
| L1 | B | сохраняется | Те же 4 цели меньше 24 px. | validacao-visual.json, login--* |
| L2 | B | сохраняется | Тот же текст, обрезанный собственным блоком. | то же |
| D1 | M | сохраняется | «0 / 0 USD» и «0%» зелёным в проекте без бюджета. | dashboard--dark--desktop.png |
| D2 | M | сохраняется | «Sem atividade ainda» в проекте с 4 сессиями и десятками событий (частично из-за 500 заглушки, см. начало). | то же |
| D3 | B | сохраняется | «+ Novo projeto» с иконкой; «+ Nova ideação» и «+ Nova conversa» с буквальным «+». | dashboard × creative × chat |
Visão geral
| # | Сер. | Состояние | Что показывает «после» | Доказательство |
|---|---|---|---|---|
| O1 | M | не перепроверено | Лента показывает только самую свежую сессию (консультативную), в которой нет событий PO/Arquiteto. | projeto-overview--* |
| O2 | M | сохраняется | Теперь длиннее: «dev-web: ação aguardando decisão — A política decidiu por: default (sem regra aplicável) · raiz do escopo: pasta gerenciada “core-api-665191a6”». | то же |
| O3 | B | не перепроверено | Временная шкала команды пуста с этими данными. | то же |
| O4 | B | частично | Подвалы по источнику исчезли («1 de 1 carregados»), но заголовок говорит «1 eventos» — см. N9. | то же |
Criativo, Chat, Percepções, Executores
| # | Сер. | Состояние | Что показывает «после» | Доказательство |
|---|---|---|---|---|
| C1 | M | сохраняется | Моноширинные пилюли в Criativo и Chat, прямоугольные вкладки без засечек в PRs. | projeto-criativo--*, projeto-chat--*, projeto-prs--* |
| C2 | B | частично | «1 história» теперь склоняется; «3 ação(ões) proposta(s) … 0 decidida(s) … auto-aprovada(s)» и «0 chamada(s)» остались (sessions.json:164,172,173, spend.json:20,37). | creative, chat, spend |
| C3 | B | не перепроверено | Сессия seed теперь active, поэтому двойное «aguardando» не появляется. | creative |
| C4 | B | сохраняется | Четыре формата пустого состояния (простой текст в Percepções, карточка с замком в Código, никакого в Chat, красная карточка в трассируемости Backlog). | вкладки |
| C5 | B | сохраняется | Percepções и Arquitetura начинают заголовок на y≈145, остальные вкладки на y≈116; у Histórias только надзаголовок. | projeto-insights--*, projeto-arquitetura--*, projeto-backlog--* |
| C6 | B | сохраняется | «Conversar/Buscar» над заголовком «Chat». | projeto-chat--* |
Код и PR
| # | Сер. | Состояние | Что показывает «после» | Доказательство |
|---|---|---|---|---|
| P1 | M | исправлено | PRs говорит «A lista de PRs ainda não está liberada» и объясняет общий барьер; Código говорит «A aba Código ainda não está liberada». | projeto-prs--*, projeto-code--* |
| P2 | B | сохраняется | Строка «Já sabe o id?» по-прежнему прижата к низу карточки барьера. | projeto-prs--dark--desktop.png |
Одобрения
| # | Сер. | Состояние | Что показывает «после» | Доказательство |
|---|---|---|---|---|
| A1 | A | исправлено | Рейка, вкладка Aprovações и «Precisa de você» показывают 4 — число из базы, включая git_push другой сессии; панель боковых сессий в сессии показывает 3, принадлежащие другим. | projeto-approvals--*, detalhe-precisa-de-voce--dark.png, detalhe-sessao2-topo--dark.png |
| A2 | A | исправлено | Карточка git_push предлагает Aprovar/Negar/Modo automático, без «Sempre permitir». | projeto-approvals--* |
| A3 | M | сохраняется | Всё ещё несколько вариантов: 4 кнопки плюс длинная моноширинная заметка во вкладке, 3 кнопки и никакой заметки в «Precisa de você», 3 растянутые кнопки в панели боковых сессий. Заметка «Sempre permitir» по-прежнему говорит две разные вещи: «grava a regra em .brabo/permissions.json» в ленте и «libera este tipo de ação só para dev-api» в панели. | detalhe-sessao2-topo--dark.png, detalhe-precisa-de-voce--dark.png |
| A4 | B | сохраняется | Глиф ⚠ по-прежнему ~8 px, а моноширинный абзац весит больше, чем решение. | projeto-approvals--* |
| A5 | B | сохраняется | Команда по-прежнему показывается в прямых кавычках пропорциональным шрифтом. | то же |
Сессия
| # | Сер. | Состояние | Что показывает «после» | Доказательство |
|---|---|---|---|---|
| X1 | A | исправлено | При 1440, 1280 и 1024 панель помещается: модель и язык ответа стали одним чипом, заголовок и метаданные видны целиком, «Encerrar» становится иконкой при 1024. Единственная оставшаяся обрезка — многоточие самого чипа («… · pt…», 230 px в 217). | sessao*--*--desktop.png, detalhe-sessao-1280--dark.png, detalhe-sessao-1024--dark.png, sondas-dark.json |
| X2 | A | частично | Панель теперь шириной с ленту (x 302–1082), группирует предложения по сессии («2 propostas na sessão #cde43f7c») и больше не повторяет метку. Это всё ещё фиксированный блок 345 из 900 px над composer, а элемент за ним виден по верхнему краю (y≈387). | detalhe-sessao2-topo--dark.png, detalhe-sessao-fim--dark.png, sondas-dark.json |
| X3 | A | исправлено | Без групп по источнику; лента читается вопрос → ответ, по порядку. | detalhe-sessao2-topo--dark.png (grupos: [] в sondas-dark.json) |
| X4 | M | частично | Карточки handoff в этих данных нет (предложение вытеснено), но composer всё ещё говорит «Endereçar handoff». | sessao*--* |
| X5 | M | не перепроверено | Нет карточки handoff, с которой можно сравнить ширины. | — |
| X6 | M | сохраняется | «ARTEFATOS GERADOS 3» перечисляет одну группу («PO 1»); во второй сессии brief существует, а панель говорит «0 · Nada ainda». | sessao--*, sessao2--* |
| X7 | B | частично | «ORIGEM: 0 REF(S)» стало «ORIGEM: 0 REFERÊNCIA» — без жаргона, но с неверным числом; см. N9. | sessao2--* |
| X8 | B | сохраняется | Одна и та же сессия открылась в разных позициях прокрутки в двух темах. | sessao2--dark--desktop.png × sessao2--light--desktop.png |
/containers, /account, /status
| # | Сер. | Состояние | Что показывает «после» | Доказательство |
|---|---|---|---|---|
| K1 | M | исправлено | «Parar» и «Remover» disabled (прозрачность 0.5), а строка говорит «Nunca provisionado: não há container para parar nem remover». | containers--*--desktop.png, sondas-dark.json |
| K2 | M | исправлено | Причина broker — одна строка с раскрывающимся «Por quê?»; никакого BROKER_URL в интерфейсе. | то же |
| K3 | B | сохраняется | Ссылка проекта 53×14 px. | validacao-visual.json |
| U1 | M | исправлено | Фраза «só esta página está traduzida» исчезла. | account--* |
| U2 | B | исправлено | Никаких номеров RN в подзаголовках («Agente local»); длинный абзац перед таблицей остаётся. | то же |
| T1 | B | сохраняется | Сырая ISO-метка времени, «Último check», «—» для engine и «Voltar» как маленькая ссылка. При 390 px страница также переполняется — см. N5. | status--* |
Настройки
| # | Сер. | Состояние | Что показывает «после» | Доказательство |
|---|---|---|---|---|
| G1 | A | частично | Путь самого экрана исправлен: одна загрузка (52 запроса) плюс клики по 11 пунктам «Nesta página» стоят 18 дополнительных запросов за 28 с, без 429. Перезагрузка по прямой ссылке (?section=) по-прежнему стоит 52 на загрузку (55 раньше): шестая перезагрузка за 16 с превысила лимит, и страница показала «Limite de requisições excedido» (g1.json: 362 запроса, 51 × 429 за 30 с). | g1-cliques.json, g1.json, detalhe-g1-ultima-secao--dark.png |
| G2 | M | частично | Четыре колонки исчезли: «Nesta página» стоит над разделами. «Modelos por agente» по-прежнему обрезает имя агента («QA de Performance e Segurança», 201 px в 119) и модель (173 в 143). На мобильном таблица схлопывается — см. N4. | projeto-settings--*--desktop.png, validacao-visual.json |
| G3 | M | частично | «Tarefas bloqueadas seguidas até parar» заменило «Tasks blocked»; «dev agent(s)», «bind-mount», «permissions.json» и «runner» остались в разделах Execução и «Onde o código mora». | projeto-settings--*--desktop.png |
| G4 | M | сохраняется | «Salvar» в Execução активна (терракотовая) без ожидающих изменений и без счётчика; «Converter» неактивна. | то же |
| G5–G7 | B | не перепроверено | Оглавление якорных разделов, чипы возможностей и placeholder PAT не были пересняты в тех же условиях. | — |
Архитектура, Backlog, Расходы, светлая тема
| # | Сер. | Состояние | Что показывает «после» | Доказательство |
|---|---|---|---|---|
| R1 | B | сохраняется | «a partir do module_map (create_c4_diagram)». | projeto-arquitetura--* |
| R2 | B | сохраняется | Осиротевший абзац вверху, «Gastos do workspace» внутри вкладки проекта, график только с осями. | projeto-spend--* |
| R3 | B | сохраняется | Иконка истории — по-прежнему лампочка Criativo. | projeto-backlog--* |
| CL1 | M | сохраняется | Неактивная «Converter» по-прежнему плохо видна на светлом фоне. | projeto-settings--light--desktop.png |
Новые находки
То, чего «до» не перечисляло, — либо новое, либо скрытое, пока исправление не сделало экран достижимым. Ничего здесь не исправлено; каждая находка — кандидат в AT.
| # | Сер. | Экран / тема | Находка | Доказательство |
|---|---|---|---|---|
| N1 | A | Сессия, обе темы, 390 px | Страница сессии не получила мобильную разметку. «Contexto da sessão» сохраняет ~320 px, лента получает ~70 px и переносит по слову на строку, панель боковых сессий становится нечитаемой, а «Iniciar ideação»/«Encerrar» вываливаются за правый край. | sessao--*--mobile.png, sessao2--*--mobile.png, detalhe-sessao2-mobile--*.png; проверка 19–21 texto-cortado |
| N2 | M | Сессия, обе темы | Каждый chat.message рисуется как смотрящий — аватар и имя берутся у вошедшего пользователя, никогда из actorKind/actorId (apps/web/src/routes/session-timeline-montagem.tsx:379-395). chat.message агента показывается как «owner@brabo.dev»; в общей сессии сообщение другого человека показалось бы с именем смотрящего. Это было скрыто, пока лента сворачивала историю в группы по источнику (X3). | detalhe-sessao2-topo--dark.png; sondas-dark.json (autoriaChatMessage: трижды «owner@brabo.dev» для пользователя, агента, пользователя) |
| N3 | M | /containers, обе темы, 390 px | Таблица втискивает семь колонок в ширину: заголовки «REGISTRADO/OBSERVADO/RECURSOS/DESDE» перекрываются, ячейки переносят по слову на строку, а кнопки действий обрезаются справа. | containers--*--mobile.png; проверка 8 texto-cortado |
| N4 | M | Настройки, обе темы, 390 px | «Modelos por agente» становится непригодной на мобильном: имя агента получает блок в 6 px, триггер модели — 0 px. | projeto-settings--*--mobile.png; проверка 33–35 texto-cortado |
| N5 | B | /status, обе темы, 390 px | Единственная страница, прокручивающаяся вбок: scrollWidth 413 против 390; правый край таблицы обрезан. | status--*--mobile.png, validacao-visual.json |
| N6 | B | Dashboard, обе темы, 390 px | Поиск сжимается до «Bus», а «Novo projeto» переносится на две строки. | dashboard--*--mobile.png |
| N7 | B | Criativo, обе темы, 390 px | Id сессии в каждой строке получает блок в 0 px («#ae1e5746», «#cde43f7c»), поэтому строки теряют то, что их идентифицирует. | projeto-criativo--*--mobile.png, validacao-visual.json |
| N8 | B | Рейка проекта, обе темы, 390 px | Активная вкладка не прокручивается в зону видимости целиком («Config…» обрезано, «4» у Aprovações обрезано), и ничто не сигнализирует, что полоса прокручивается. | projeto-settings--*--mobile.png, projeto-approvals--*--mobile.png |
| N9 | B | Visão geral и сессия, обе темы | Ошибки множественного числа после прохода i18next: «1 eventos» (overview.json:70 имеет одну форму) и «0 referência» (правило pt относит 0 к one, поэтому origemRefs_one используется для нуля). | projeto-overview--*--desktop.png, sessao2--* |
| N10 | B | Login, обе темы | Фоновое свечение — --success-soft (apps/web/src/routes/AuthLayout.module.css:80-84): со старым сине-зелёным оно читалось как бренд; в нейтральной теме это зелёная дымка за терракотовой страницей. | login--dark--desktop.png, login--light--desktop.png |
| N11 | B | Вкладка Aprovações, обе темы | Каждая карточка несёт «Motivo da política fora dos eventos carregados nesta tela» — правда (причина живёт в логе другой сессии), но это инструмент, объясняющий сам себя, повторённый на каждой карточке. | projeto-approvals--* |
Чего эта страница не измеряет
- Контраст. Это арифметика над токенами, и она живёт в наборе тестов web
(
apps/web/src/lib/contraste.ts); проверка здесь видит только разметку. - Ничего, что находится за engine: полосу живого хода, терминал, присутствие dev agents. Заглушка не может их произвести.
- Production-сборку. Dev-сервер
viteотдаёт те же компоненты и CSS, но не production CSP и не nginx перед образом web.