hermes-hub/agents/inbox/2026-08-21-B5-codex-mockup-redesign.md
Hermes Team 2407d47606 docs(task): A6 and B5 — back the approved dashboard mockup with real data
The mockup's headline blocks divide three ways against the code at 2b2ccd8:
already available (latency, readiness, events, routing chain), derivable but not
yet exposed (per-provider aggregates, call share, host metrics via the unused
psutil dependency, active leases), and absent by design (task queues, service
window, incidents, provider RPS/SLA).

A6 supplies the second group; B5 redesigns against the contract and restores the
four account actions that d0d15ae dropped.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 17:28:33 +07:00

12 KiB
Raw Blame History

Задание B5 (Codex): редизайн по утверждённому макету, три цветовые схемы

Дата поступления

2026-08-21

База

Проверочный HEAD: 2b2ccd8, origin/main = 2b2ccd8. git fetch, зафиксировать BASE_SHA, работать от свежего main.

Ветка

codex/mockup-redesign

Зависимость

Параллельно выполняется Задание A6 (Antigravity) — оно поставляет данные для правой панели, схемы маршрутизации и показателей хоста. Разделы, помеченные ниже «после A6», начинать, когда соответствующие поля появятся в docs/UI_STATE_CONTRACT.md. Всё остальное можно делать сразу.


P0. Сначала вернуть то, что пропало

В редизайне фаз 26 (d0d15ae) с экрана «Аккаунты» исчезли управляющие элементы. История файла:

a7027b4  действий = 4     ← до редизайна
d0d15ae  действий = 1     ← после
2b2ccd8  действий = 1     ← сейчас

Пропали, при живых обработчиках в hermes_hub_app._handle_action:

Действие Обработчик Триггер в UI
test — « Тест» есть только меню «Команда»
set_main — «★ Сделать основным» есть только меню «Команда»
set_orchestrator — «👑 Назначить оркестратором» есть только меню «Команда»
assign_role — «Назначить роль» есть, вместе с модалкой нигде

Владелец установил сборку и сообщил, что функции перестали работать — это оно.

Вернуть все четыре на экран «Аккаунты» и добавить тест: для каждого обработчика в _handle_action существует хотя бы один вызывающий элемент в UI. Дефект этого класса возникает третий раз, механическая проверка обязательна.


Макет

Утверждён главный экран «Обзор» в трёх схемах: тёмная, средняя (гибрид), светлая (бежевая). Все три — один и тот же layout, различаются палитрой. Остальные вкладки привести к тому же языку.

Композиция

  • Левая панель: логотип, вертикальная навигация, пользователь внизу, версия.
  • Верхняя строка: индикатор состояния, поиск с подсказкой Ctrl + K, кнопка «+ Добавить аккаунт», уведомления, справка, настройки.
  • Строка KPI: пять карточек в ряд.
  • Центр: схема маршрутизации — провайдеры слева, оркестратор в центре, кластеры агентов справа, связи с подписями.
  • Правая панель: «Статус в реальном времени», «Системные показатели», «Очереди задач».
  • Низ: «Последние события» — таймлайн с тегами.

Три темы

Палитры вынести в theme.py как три набора токенов с общими именами. Переключение — в настройках, с сохранением выбора. Ни один экран не должен содержать цвет вне токенов: смена темы обязана менять всё приложение, а не часть.

Семантика цвета сохраняется во всех трёх: зелёный — работает, янтарный — предупреждение, красный — ошибка, серый — нет данных. Золото остаётся брендом, а не статусом.


Что чем наполнять

Это главная часть задания. Источник каждого блока проверен по коду на 2b2ccd8.

Есть данные — рисовать по-настоящему

Блок Источник
Время отклика TelemetryService, латентность P50, источник own_measurement
Агенты онлайн 18/20 SystemReadiness.roles_ready_count / total_roles
Последние события EventLogService
Цепочка маршрутизации, приоритеты, резервы RolePipeline / PipelineNode
Состояние провайдеров, авторизация, здоровье ProviderSummary, ProfileViewModel
Тариф аккаунта plan_code + plan_source
Причина переключения PipelineNode.failover_reason

После A6 — появятся данные

Блок Что придёт
Латентность по каждому провайдеру в правой панели агрегаты по провайдеру
Доли 45 / 35 / 20 % на схеме call_share по провайдеру
Счётчики 128 / 74 / 56 запросов вызовы по ролям
CPU, память, диск, сеть psutil, источник host_measurement
Активные вызовы число занятых лизов

До появления этих полей — «Н/Д», не заглушки с числами.

Данных нет и не будет — не рисовать

Блок макета Причина
Очереди задач по приоритетам подсистемы очередей в продукте нет
Окно обслуживания 09:0021:00 понятия нет
«Инциденты» как раздел подсистемы инцидентов нет; ближайшее реальное — журнал событий с фильтром по ошибкам
RPS провайдера, SLA, uptime провайдеры не отдают, Gap 13
Квота 78 % при отсутствии данных baseline у всех провайдеров None; реальное значение появляется только после настоящего 429

Пункт про квоту важен: на макете она нарисована заполненной, но по контракту до первого 429 данных нет. Показывать «Н/Д» с пояснением, а не 78 %.

Правило без исключений: если поля нет в docs/UI_STATE_CONTRACT.md — числа в интерфейсе не будет. Ни примера, ни placeholder'а, ни «пока так». Продукт создан, чтобы показывать правду о квотах и маршрутах; первый аудит этого проекта нашёл именно выдуманные метрики, и повторения не будет.

Пустое место в макете лучше заполнять тем, что есть на самом деле: состоянием авторизации, семейством моделей, позицией в цепочке отказоустойчивости, временем последней проверки.


Остальные вкладки

Привести к тому же языку: та же сетка, та же плотность, те же компоненты, постоянная правая панель деталей вместо модальных окон.

  • Команда — иерархия «оркестратор → роли → агенты», карточка агента с провайдером, аккаунтом, моделью, состоянием квоты.
  • Аккаунты — сохранить дельта-отрисовку по ключам, вернуть четыре действия (P0), группировка по провайдерам, поиск, фильтры.
  • Маршрутизация — цепочка основной → резервы с активным узлом и причиной переключения.
  • Провайдеры — сводка, обнаруженные модели, состояние.
  • Квоты и лимиты — мульти-корзинные квоты с пометкой оценки и временем сброса.
  • Аналитика — агрегаты телеметрии: латентность, токены, переключения, доля ошибок. Раздел появляется после A6.
  • Журнал событий — таймлайн с фильтрами, поиском и уровнями.
  • Настройки — параметры, выбор темы, пути, обновления.
  • Оркестратор — если отдельным разделом, то на реальных данных о главной роли; иначе не заводить пустой экран.

Экран без данных не создавать: либо скрыть пункт навигации, либо честное «Скоро».


Ограничения

  • Граница: ваша зона — src/antigravity_provider/router/ui/**, hermes_hub_app.py, tests/test_ui_*.py.
  • Итеративно: после каждой вкладки приложение запускается.
  • Сеть, подпроцессы, опрос OAuth — только в фоне.
  • Дельта-отрисовку по стабильным ключам не терять; полных пересборок виджетов не возвращать.
  • Мастер подключения не ломать: шесть рабочих потоков и трёхэлементная распаковка start_profile_oauth.
  • Секреты маскировать.
  • Проверить на 1280×720, 1366×768, 1920×1080 при масштабировании 100 %, 125 %, 150 %.
  • Тег v0.1.1 не создавать.

Критерии приёмки

  1. Ни один файл чужой зоны не изменён.
  2. Четыре действия вернулись на «Аккаунты»; тест проверяет соответствие обработчиков и триггеров.
  3. Три темы переключаются, покрывают всё приложение; ни одного цвета вне токенов.
  4. Приложение запускается, все разделы открываются без ошибок.
  5. Ни одного числа без поля в контракте: очереди, окно обслуживания, RPS, SLA, CPU до A6 — отсутствуют или «Н/Д».
  6. Дельта-отрисовка сохранена: изменение одного аккаунта не перерисовывает остальные.
  7. Прогон в обоих окружениях — без UI-зависимостей и с customtkinter/pillow/psutil; обе команды и оба результата в отчёте.
  8. ruff check . чисто; release gate не ухудшен.
  9. Отчёт: скриншоты каждой вкладки во всех трёх темах и раздел «расхождения с макетом» с причиной по каждому пункту.

Порядок сдачи

Передать точный FINAL_COMMIT_SHA.