hermes-hub/docs/reports/A48.md

73 lines
15 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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.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%), не со статистикой.
## Визуальные доказательства и пропуски
[Галерея макет / до / после](../screenshots/a48/index.html).
- Собраны **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 не менялись. Полный произвольный граф с препятствиями не проверен; маршрутизация рассчитана на текущую раскладку по рядам.