Перейти к основному содержимому

Визуальный аудит до и после 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 сессиях (3 terminal, 1 git_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 на загрузку (после)
login6 → 68 → 8—
dashboard0 → 01 → 06
overview3 → 112 → 232
executors0 → 04 → 022
creative0 → 07 → 320
chat0 → 05 → 116
insights0 → 04 → 017
code0 → 02 → 016
PRs0 → 05 → 118
approvals1 → 113 → 123
backlog0 → 05 → 216
architecture0 → 011 → 015
spend0 → 09 → 018
settings12 → 6120 → 3552
session5 → 214 → 2121
session 24 → 121 → 1921
containers1 → 19 → 87
account0 → 06 → 27
status1 → 11 → 12

Только один экран прокручивает всю страницу вбок при 390 px: /status (scrollWidth 413 против 390, в обеих темах).

Находки «до», по одной​

Серьёзность, как в «до»: A высокая (ломает использование или вводит в заблуждение), M средняя, B низкая (отделка). Состояние: исправлено, частично, сохраняется или не перепроверено (данных, которые это показывали, больше нет).

Рамка и навигация​

#Сер.СостояниеЧто показывает «после»Доказательство
S1AчастичноРамка перестраивается при 390 px: sidebar становится выдвижным ящиком, рейка проекта — горизонтальной полосой, и ни один аутентифицированный экран, кроме /status, не прокручивается вбок. Маршрут сессии не последовал за ними — см. N1.*--mobile.png, detalhe-gaveta-mobile--*.png
S2MсохраняетсяSidebar «ATIVIDADES — Nenhum agente entrou em ação ainda.» рядом с Visão geral, где Criativo «aguardando» и 4 ожидающих одобрения.projeto-overview--dark--desktop.png
S3MсохраняетсяСписок вкладок в sidebar не имеет счётчиков и не отмечает текущую вкладку; рейка показывает «Aprovações 4» и «Arquitetura 1» и выделяет вкладку.то же
S4MисправленоОдна трактовка активного: терракотовая заливка с терракотовым текстом в рейке; строка проекта в sidebar нейтральна.то же
S5BсохраняетсяПереключатель темы по-прежнему читает состояние («Tema escuro»/«Tema claro»); «sair» по-прежнему строчными.любой аутентифицированный экран
S6BсохраняетсяИмя проекта моноширинным в sidebar и дисплейным шрифтом в заголовке.то же

Login, Dashboard​

#Сер.СостояниеЧто показывает «после»Доказательство
L1BсохраняетсяТе же 4 цели меньше 24 px.validacao-visual.json, login--*
L2BсохраняетсяТот же текст, обрезанный собственным блоком.то же
D1Mсохраняется«0 / 0 USD» и «0%» зелёным в проекте без бюджета.dashboard--dark--desktop.png
D2Mсохраняется«Sem atividade ainda» в проекте с 4 сессиями и десятками событий (частично из-за 500 заглушки, см. начало).то же
D3Bсохраняется«+ Novo projeto» с иконкой; «+ Nova ideação» и «+ Nova conversa» с буквальным «+».dashboard × creative × chat

Visão geral​

#Сер.СостояниеЧто показывает «после»Доказательство
O1Mне перепровереноЛента показывает только самую свежую сессию (консультативную), в которой нет событий PO/Arquiteto.projeto-overview--*
O2MсохраняетсяТеперь длиннее: «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”».то же
O3Bне перепровереноВременная шкала команды пуста с этими данными.то же
O4BчастичноПодвалы по источнику исчезли («1 de 1 carregados»), но заголовок говорит «1 eventos» — см. N9.то же

Criativo, Chat, Percepções, Executores​

#Сер.СостояниеЧто показывает «после»Доказательство
C1MсохраняетсяМоноширинные пилюли в Criativo и Chat, прямоугольные вкладки без засечек в PRs.projeto-criativo--*, projeto-chat--*, projeto-prs--*
C2Bчастично«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
C3Bне перепровереноСессия seed теперь active, поэтому двойное «aguardando» не появляется.creative
C4BсохраняетсяЧетыре формата пустого состояния (простой текст в Percepções, карточка с замком в Código, никакого в Chat, красная карточка в трассируемости Backlog).вкладки
C5BсохраняетсяPercepções и Arquitetura начинают заголовок на y≈145, остальные вкладки на y≈116; у Histórias только надзаголовок.projeto-insights--*, projeto-arquitetura--*, projeto-backlog--*
C6Bсохраняется«Conversar/Buscar» над заголовком «Chat».projeto-chat--*

Код и PR​

#Сер.СостояниеЧто показывает «после»Доказательство
P1Mисправлено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--*
P2BсохраняетсяСтрока «Já sabe o id?» по-прежнему прижата к низу карточки барьера.projeto-prs--dark--desktop.png

Одобрения​

#Сер.СостояниеЧто показывает «после»Доказательство
A1AисправленоРейка, вкладка Aprovações и «Precisa de você» показывают 4 — число из базы, включая git_push другой сессии; панель боковых сессий в сессии показывает 3, принадлежащие другим.projeto-approvals--*, detalhe-precisa-de-voce--dark.png, detalhe-sessao2-topo--dark.png
A2AисправленоКарточка git_push предлагает Aprovar/Negar/Modo automático, без «Sempre permitir».projeto-approvals--*
A3MсохраняетсяВсё ещё несколько вариантов: 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
A4BсохраняетсяГлиф ⚠ по-прежнему ~8 px, а моноширинный абзац весит больше, чем решение.projeto-approvals--*
A5BсохраняетсяКоманда по-прежнему показывается в прямых кавычках пропорциональным шрифтом.то же

Сессия​

#Сер.СостояниеЧто показывает «после»Доказательство
X1AисправленоПри 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
X2AчастичноПанель теперь шириной с ленту (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
X3AисправленоБез групп по источнику; лента читается вопрос → ответ, по порядку.detalhe-sessao2-topo--dark.png (grupos: [] в sondas-dark.json)
X4MчастичноКарточки handoff в этих данных нет (предложение вытеснено), но composer всё ещё говорит «Endereçar handoff».sessao*--*
X5Mне перепровереноНет карточки handoff, с которой можно сравнить ширины.—
X6Mсохраняется«ARTEFATOS GERADOS 3» перечисляет одну группу («PO 1»); во второй сессии brief существует, а панель говорит «0 · Nada ainda».sessao--*, sessao2--*
X7Bчастично«ORIGEM: 0 REF(S)» стало «ORIGEM: 0 REFERÊNCIA» — без жаргона, но с неверным числом; см. N9.sessao2--*
X8BсохраняетсяОдна и та же сессия открылась в разных позициях прокрутки в двух темах.sessao2--dark--desktop.png × sessao2--light--desktop.png

/containers, /account, /status​

#Сер.СостояниеЧто показывает «после»Доказательство
K1Mисправлено«Parar» и «Remover» disabled (прозрачность 0.5), а строка говорит «Nunca provisionado: não há container para parar nem remover».containers--*--desktop.png, sondas-dark.json
K2MисправленоПричина broker — одна строка с раскрывающимся «Por quê?»; никакого BROKER_URL в интерфейсе.то же
K3BсохраняетсяСсылка проекта 53×14 px.validacao-visual.json
U1MисправленоФраза «só esta página está traduzida» исчезла.account--*
U2BисправленоНикаких номеров RN в подзаголовках («Agente local»); длинный абзац перед таблицей остаётся.то же
T1BсохраняетсяСырая ISO-метка времени, «Último check», «—» для engine и «Voltar» как маленькая ссылка. При 390 px страница также переполняется — см. N5.status--*

Настройки​

#Сер.СостояниеЧто показывает «после»Доказательство
G1AчастичноПуть самого экрана исправлен: одна загрузка (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
G2MчастичноЧетыре колонки исчезли: «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
G3Mчастично«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
G4Mсохраняется«Salvar» в Execução активна (терракотовая) без ожидающих изменений и без счётчика; «Converter» неактивна.то же
G5–G7Bне перепровереноОглавление якорных разделов, чипы возможностей и placeholder PAT не были пересняты в тех же условиях.—

Архитектура, Backlog, Расходы, светлая тема​

#Сер.СостояниеЧто показывает «после»Доказательство
R1Bсохраняется«a partir do module_map (create_c4_diagram)».projeto-arquitetura--*
R2BсохраняетсяОсиротевший абзац вверху, «Gastos do workspace» внутри вкладки проекта, график только с осями.projeto-spend--*
R3BсохраняетсяИконка истории — по-прежнему лампочка Criativo.projeto-backlog--*
CL1MсохраняетсяНеактивная «Converter» по-прежнему плохо видна на светлом фоне.projeto-settings--light--desktop.png

Новые находки​

То, чего «до» не перечисляло, — либо новое, либо скрытое, пока исправление не сделало экран достижимым. Ничего здесь не исправлено; каждая находка — кандидат в AT.

#Сер.Экран / темаНаходкаДоказательство
N1AСессия, обе темы, 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
N2MСессия, обе темыКаждый 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» для пользователя, агента, пользователя)
N3M/containers, обе темы, 390 pxТаблица втискивает семь колонок в ширину: заголовки «REGISTRADO/OBSERVADO/RECURSOS/DESDE» перекрываются, ячейки переносят по слову на строку, а кнопки действий обрезаются справа.containers--*--mobile.png; проверка 8 texto-cortado
N4MНастройки, обе темы, 390 px«Modelos por agente» становится непригодной на мобильном: имя агента получает блок в 6 px, триггер модели — 0 px.projeto-settings--*--mobile.png; проверка 33–35 texto-cortado
N5B/status, обе темы, 390 pxЕдинственная страница, прокручивающаяся вбок: scrollWidth 413 против 390; правый край таблицы обрезан.status--*--mobile.png, validacao-visual.json
N6BDashboard, обе темы, 390 pxПоиск сжимается до «Bus», а «Novo projeto» переносится на две строки.dashboard--*--mobile.png
N7BCriativo, обе темы, 390 pxId сессии в каждой строке получает блок в 0 px («#ae1e5746», «#cde43f7c»), поэтому строки теряют то, что их идентифицирует.projeto-criativo--*--mobile.png, validacao-visual.json
N8BРейка проекта, обе темы, 390 pxАктивная вкладка не прокручивается в зону видимости целиком («Config…» обрезано, «4» у Aprovações обрезано), и ничто не сигнализирует, что полоса прокручивается.projeto-settings--*--mobile.png, projeto-approvals--*--mobile.png
N9BVisão geral и сессия, обе темыОшибки множественного числа после прохода i18next: «1 eventos» (overview.json:70 имеет одну форму) и «0 referência» (правило pt относит 0 к one, поэтому origemRefs_one используется для нуля).projeto-overview--*--desktop.png, sessao2--*
N10BLogin, обе темыФоновое свечение — --success-soft (apps/web/src/routes/AuthLayout.module.css:80-84): со старым сине-зелёным оно читалось как бренд; в нейтральной теме это зелёная дымка за терракотовой страницей.login--dark--desktop.png, login--light--desktop.png
N11BВкладка 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.