hermes-hub/docs/reports/A48.md

12 KiB
Raw Blame History

A48 — реализация и визуальная проверка

Дата: 2026-08-31. Исполнитель: Codex, один исполнитель, без субагентов.

Контрольные точки

  • START_HEAD: 80aab00ee2bef353e12d128bd8ba6a6dde503abd.
  • origin/main перед началом: 80aab00ee2bef353e12d128bd8ba6a6dde503abd.
  • Ветка: codex/a48-interface-by-mockup, отдельный worktree hermes-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.17.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, службы и установленный хаб не менялись. Нужна последующая функциональная проверка на подключённых аккаунтах; визуальную приёмку выполняет владелец.