15 KiB
A48 — реализация и визуальная проверка
Дата: 2026-08-31. Исполнитель: Codex, один исполнитель, без субагентов.
Контрольные точки
- START_HEAD:
80aab00ee2bef353e12d128bd8ba6a6dde503abd. - origin/main перед началом:
80aab00ee2bef353e12d128bd8ba6a6dde503abd. - Ветка:
codex/a48-interface-by-mockup, отдельный worktreehermes-hub-a48. - FINAL_COMMIT_SHA передаётся в итоговом сообщении после фиксации этого отчёта. Визуальное согласование владельцем не подменяется технической проверкой.
- Главный checkout и незакоммиченная
.agents/сохранены; ветка A47 не переключалась. - Живой хаб фактически слушает порт 5800, сообщает сборку
81a58f6. На 8080 работает другое приложение; оно не изменялось. - Предпросмотр клиента A48: loopback 5801, защищённый API пересылается в существующий хаб без добавления авторизации и без изменения служб. Для другого порта браузеру требуется отдельный вход владельца.
Что изменено в клиенте
style.css: общая сетка семи страниц, навигация, типографика, состояния карточек, отдельные цвета поверхностей/обрамления для трёх тем, адаптивность.- Утверждённый логотип из существующих assets; SVG-значки меню, поиск по экранам/агентам/аккаунтам с Ctrl+K, переходы к событиям и настройкам. Вместо вымышленного Administrator указано отсутствие профиля пользователя в API.
- Обзор: столбец инструментов, модель и аккаунт на узле, автоматический первоначальный выбор агента, сводка инспектора и переходы к существующему редактору Agent File. Три нижние карточки; кольцевая статистика не выдумана.
- Сохранены механизмы панорамирования и масштабирования A43. Подписи связей выделены в отдельный SVG-слой; размещение учитывает прямоугольники узлов и других подписей. Добавлено разнесение узлов как явно сохраняемый черновик.
- Маршрутизация читает
RolePipeline.nodesвместо отсутствующегоpreferred_chain; порядок сохраняется существующимsave_chain. Фильтры провайдеров/состояний, поиск, выбор модели, кнопочное добавление и удаление профиля из цепочки. Связи агентов остаются на Обзоре. - Списки моделей —
ProviderSummary.discovered_models. Настроенная, но не обнаруженная модель отмечается неподтверждённой. «Список ещё не получен» и «доступных моделей нет» различаются по времени обновления провайдера. - Аналитика исправлена на
telemetry.by_provider/by_role. Состояние — наmetrics.host. Нулевые измерения не заменяются отсутствием данных. - Настройки сгруппированы; не полученные настройки не выдаются за текущие значения. Сохраняются только явно выбранные изменения. Поля, не имеющие источника/обработчика в этом потоке, помечены Н/Д.
- Журнал показывает события workflow из снапшота (не более 60). Это не полный журнал сервера: при требовании единственного источника
/api/snapshotболее широкий журнал недоступен. Детали события и фильтры предусмотрены.
Источники проверены до изменения чтения
HubSnapshot: generation, seq, timestamp, profiles_by_provider, all_profiles, readiness, agents, providers, routing, quotas, metrics, is_stale, workflow.
Прочитаны определения ProfileViewModel, ProviderSummary, RolePipeline, SystemReadiness, HostMetricsSnapshot, TelemetryAggregates, WorkflowEvent и реализация WorkflowService.snapshot. Текстовые ТЗ 1.txt и 3.txt прочитаны полностью. Все изображения 1.1–7.1 просмотрены.
Проверки
- База origin/main: 495 passed / 1 skipped / 0 failed, 4 deselected.
- Текущий клиент: 495 passed / 1 skipped / 0 failed, 4 deselected. В A48 указано 496 passed, но это не воспроизводится даже на исходной базе; Python и тестовые маркеры не изменены.
python -m ruff check .: чисто.PYTHONPATH=src python scripts/verify_multi_provider_router.py: 10/10.scripts/release_gate.py: PASSED. Сам скрипт содержит 7 групп проверок; 10/10 относится к отдельному router verifier.node tests/test_workspace_a48.js: прошёл (модели, отсутствие/нулевая квота, host metrics, telemetry keys, экранирование).node tests/test_web_handlers_dom_contract.js: прошёл.node --checkдля трёх файлов клиента иgit diff --check: чисто.- Первый промежуточный запуск pytest дал 1 сбой: новый стартовый обработчик вызывался из файла, который тест загружает отдельно. Инициализация перенесена в собственный JS-файл; повторный тест прошёл.
- Поиск демонстрационных чисел/версий/моделей: совпадения только с геометрией кривой (0.42) и настройкой порога (20%), не со статистикой.
Визуальные доказательства и пропуски
- Собраны 21 исходный снимок: 7 экранов × 3 темы, авторизованный живой хаб.
- Собраны 21 снимок
layout-onlyбез входа для проверки базовой сетки/тем. Они НЕ заменяют требуемые скриншоты после с реальными данными; часть последних мелких CSS-правок требует повторной съёмки. - Собраны 21 авторизованный снимок после, 1280×720. Дополнительно: Обзор 1536×1024, адаптивность 760×900, холст после переноса за край и Fit, нижние части аналитики/состояния/настроек. Проверены темы, переходы, поиск агента, вкладки инспектора и чтение Agent File.
- Панорамирование меняет translate; зум проверен 85→95%. После перетаскивания узла за край в EDIT и Fit: 13/13 узлов внутри холста, пересечений подписей с узлами нет. Черновик теста не сохранён на сервер. Ошибок консоли нет.
- НЕ ПРОВЕРЕНО на живых данных: заполненные карточки аккаунтов, перестановка аккаунтов в цепочке, выбор обнаруженной модели, детали реального события: API возвращает 0 подключённых аккаунтов и 0 событий workflow. Контракты списков моделей и отсутствующих значений проверены JS-тестами. Новые аккаунты и фиктивные события для скриншотов не создавались.
- ПРОПУЩЕНО намеренно: кнопки несуществующих приложений экосистемы, выдуманные графики/рост процентов/кольцо 42, версия v2.9.0, неподдерживаемые настройки уведомлений/backup/2FA, история температур и сетевых замеров без источника, вымышленный профиль Administrator.
- Отличия от макета: используется существующий утверждённый растровый логотип с кремовой подложкой, а не генерация нового вензеля; нет фиктивных аккаунтов и назначений. Сохранённые координаты графа не менялись: основная цепочка остаётся горизонтальной, остальные узлы разнесены. Поэтому геометрия графа отличается от демонстрационного дерева макета. При 1280×720 нижние панели требуют прокрутки.
- Ограничение backend:
set_modelменяет предпочтение профиля, общее для его использования в разных ролях. Независимые модели на каждую пару роль/аккаунт нельзя честно обещать без отдельного изменения backend. Python в A48 не менялся.
Доработка после замечания владельца
Переключатель LIVE/EDIT перенесён в шапку; KPI на desktop в одном ряду; инспектор занимает правый столбец рядом с графом и нижними карточками. Уплотнены шапка и холст. Подписи лежат на линиях связей, а не отдельно от них. Начальный вид сфокусирован на оркестраторе, Fit учитывает настоящие размеры узлов и подписей. Перетаскивание продолжает работать вне холста до отпускания мыши. Исправлены критический индикатор, объяснение сетевого замера, нулевая задержка в таблицах и отображение ранее настроенной, но неподтверждённой модели.
Оригинальная пользовательская вкладка с несохранённым графом не перезагружалась. Проверки выполнялись в отдельной вкладке того же защищённого preview. Python, службы и установленный хаб не менялись. Нужна последующая функциональная проверка на подключённых аккаунтах; визуальную приёмку выполняет владелец.
2026-08-31 — оркестратор сверху по запросу владельца
Владелец явно запросил изменить сохранённые координаты: оркестратор (430,60), первый ряд субагентов — два кодера и ревьюер на y=250; остальные 9 субагентов в трёх колонках ниже. Раскладка применена через штатную команду и сохранена save_workflow. После перезагрузки координаты подтверждены по DOM. Связи, модели и настройки агентов не менялись. Начальный вид клиента центрирует выбранного агента по горизонтали. Новый снимок: docs/screenshots/a48/after/overview-orchestrator-top.png; предыдущие сравнительные снимки показывают состояние до этого запроса. Проверка синтаксиса workflow.js прошла.
2026-08-31 — разводка и цвета стрелок
По запросу владельца изменено только отображение существующих связей. Нисходящая связь выходит снизу и входит сверху; переходы между соседними карточками идут напрямую, обратные связи — по отдельным нижним дорожкам, возврат к оркестратору — снаружи справа. Углы скруглены. SUCCESS/REVIEW_PASSED зелёные, REVIEW_FAILED/ERROR красные пунктирные, NEXT/ALWAYS золотые; наконечники и подписи используют соответствующий цвет. Невидимый hit-path больше не перекрашивает видимый путь. Длинные подписи переносятся в межузловом промежутке. Fit учитывает внешние линии.
node tests/test_workflow_routes_a48.js: шесть связей текущей раскладки не пересекают 13 карточек, направление портов и возвратные дорожки проверены. Оба прежних JS-набора проходят. В браузере подтверждены разные stroke/marker, прозрачность шести hit-path, отсутствие пересечений подписей с узлами и ошибок консоли. Новый снимок: after/overview-colored-arrows.png. Старые снимки в галерее остаются историческим сравнением. Топология и настройки workflow не менялись. Полный произвольный граф с препятствиями не проверен; маршрутизация рассчитана на текущую раскладку по рядам.