hermes-hub/agents/inbox/2026-08-31-A48-interface-by-mockup.md

14 KiB
Raw Permalink Blame History

Задание A48: интерфейс по макетам — исполнитель Codex

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

2026-08-31

Исполнитель

Codex на сервере 192.168.1.81. Не Antigravity.

Задание отменяет A46: там та же работа была поставлена Antigravity. Два агента в одних файлах уже приводили к тому, что один переключал ветку под работой другого. Владелец фронтенда — только это задание.

База

репозиторий:  /srv/projects/Agent projects/hermes-hub   (уже на 80aab00)
макеты:       /srv/projects/Agent projects/Разное/фронтенд
общая память: /srv/projects/AI-Memory   (см. корневой AGENTS.md)
живой хаб:    http://127.0.0.1:8080
git fetch origin --prune
git checkout -b codex/a48-interface-by-mockup origin/main

В main напрямую не пушить.

Порядок

Codex работает одним исполнителем, поэтому второго прохода внутри задания нет. Вместо него — самопроверка по пункту P0-6 и приёмка ревьюером. Пункты, помеченные «приложить», — это то, по чему работу будут принимать.

Перед началом прочитать общую память по правилам корневого AGENTS.md: протокол, состояние и задачи проекта. После работы обновить их.


Почему это задание существует

Задание A43 объявили выполненным. Владелец поставил сборку на две машины и написал: «интерфейс вообще не изменился, какой был, такой и остался. Зачем тогда было задание на изменение по макетам?»

Он прав. Вот что изменил A43:

app.js        +297   шесть карточек показателей, обвязка холста
workflow.js   +136   панорамирование, зум колесом
index.html      +8
workflow.css     15  снят потолок высоты 430 px
style.css       НЕ ОТКРЫВАЛСЯ НИ РАЗУ

style.css — это и есть внешний вид. Привести экраны к макетам, не тронув его, нельзя.

Работу приняли по зелёным тестам. Тесты внешний вид не видят. Отсюда главное требование этого задания — проверка глазами, см. P0-3.

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


P0-1. Первоисточник — текстовые ТЗ, а не только картинки

Рядом с макетами лежат два документа, и в них требования подробнее, чем видно на изображении:

Разное/фронтенд/1.txt   ТЗ по главному экрану «Обзор»: рабочее пространство
                        агентной системы, визуальные workflow, Agent Files,
                        LIVE-мониторинг
Разное/фронтенд/3.txt   ТЗ по вкладке «Маршрутизация»

Из 3.txt важное разграничение, которое легко нарушить: на «Маршрутизации» настраивается очерёдность аккаунтов внутри агента; связи между агентами живут на «Обзоре». Не смешивать.

Прочитать оба целиком до начала работы. Расхождения между текстом и картинкой — вынести владельцу, а не решать молча.

P0-2. Вёрстка

Экраны привести к макетам 1.17.1: сетка, отступы, типографика, состояния карточек, расположение панелей, палитра.

  1. Открыть style.css. Если по итогам работы он не изменён — задание не выполнено.
  2. Правки в index.html и app.js — по необходимости; клиент без сборки, без npm, без фреймворка (решение зафиксировано в docs/web-api/CONTRACT.md §1). Tailwind, React и генераторы страниц не вносить.
  3. Три темы — светлая, средняя, тёмная — работают на каждом экране. Цвета через переменные, не литералами.

Заметные расхождения, найденные ревьюером на экране «Обзор»:

шапка          в макете поиск (Ctrl+K), уведомления, настройки, карточка
               пользователя; в сборке две кнопки
логотип        вензель и подпись против значка молнии
панель холста  вертикальный столбец инструментов слева — отсутствует
карточки узлов в макете иконка, файл .md, строка «модель • аккаунт»;
               в сборке три обрезанные строки без модели и аккаунта
инспектор      в макете вкладки, конфигурация исполнения, Agent File,
               инструменты, быстрые действия; в сборке пустая заглушка
нижний ряд     в макете три карточки, в сборке две
подписи связей режутся карточками узлов: «ТАНОВКА ЗАД», «РАЙПРИЁМКА»

Про подписи: центрирование уже исправлено в workflow.css, дело не в стиле текста. Их перекрывают карточки узлов — лечится порядком слоёв и расстоянием между узлами в раскладке.

P0-3. Проверка глазами — обязательная часть работы

Codex работает на том же сервере, где запущен хаб. Это ключевое отличие от прошлого захода: сверять есть с чем прямо на месте.

  1. Открыть http://127.0.0.1:8080 и пройти все экраны.
  2. Скриншот до и после по каждому экрану, рядом фрагмент макета. Приложить.
  3. Проверить каждую тему.
  4. Холст: подвигать полотно, покрутить колесо, утащить узел за край и вернуть кнопкой «вписать».
  5. Подписи связей читаются на нескольких масштабах и не перекрываются.

Отчёт без скриншотов приниматься не будет: другого способа проверить эту работу нет.

P0-4. Что из макета не переносить

Макеты нарисованы с правдоподобными данными. В живой интерфейс они попасть не должны:

кольцевая диаграмма с числом 42      пример, а не измерение
«Gemini 1.5 Flash • acc-02»          подпись примера
версия v2.9.0                        в проекте 0.1.1, заморожена намеренно
«94.2%», «+20% к вчера»              выдуманные показатели

Правило проекта: число появляется только после измерения. Нет данных под элемент — Н с причиной. Загрузка и отсутствие пишутся разными словами: «список ещё не получен» и «моделей нет» — разное.

Модель и аккаунт для карточки узла в снапшоте есть — брать оттуда.

Элемент, которому нечего обслуживать (кнопки несуществующих приложений экосистемы внизу макета), не рисовать и назвать пропущенным в отчёте.

P0-5. Данные берутся из снапшота

Единственный источник — GET /api/snapshot. Это dataclasses.asdict(HubSnapshot), имена полей ровно как в датаклассе:

all_profiles          профили; ключа "profiles" НЕ существует
providers             сводки провайдеров, у них discovered_models
routing, agents, workflow, readiness, quotas, metrics

Перед чтением поля перечислить поля датакласса. Обращение к несуществующему ключу молча даёт пустоту: именно так экран маршрутизации показывал «0 аккаунтов» при шести подключённых.

Список моделей провайдера — discovered_models у провайдера. У профиля preferred_models — это настройки владельца, и model_states строится из них же.

P0-6. Самопроверка перед сдачей

Пройти по списку и приложить результат:

  1. git diff --stat — есть ли в списке style.css.
  2. python -m pytest -q — сравнить с базой, на origin/main сейчас 496 passed.
  3. python -m ruff check .
  4. PYTHONPATH=src python scripts/verify_multi_provider_router.py
  5. Скриншоты собраны по всем экранам и всем темам.
  6. Поиск по клиенту: не осталось ли зашитых чисел и процентов.
  7. Пункт, который не сделан, назван пропущенным.

Ограничения

  • Без сборки, без npm, без фреймворка.
  • Python не трогать: провайдеры и квоты — задание A42.
  • Холст A43 не переделывать, только доводить.
  • Учётные данные и ~/.hermes/agy_profiles/ не трогать.
  • Службы qwen-coder и qwen-compressor не трогать: они только что восстановлены после того, как их подменили заглушкой.
  • Версию 0.1.1 не поднимать.
  • Правило честности без исключений.

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

  1. Ветка в origin, git status чист.
  2. style.css изменён; вёрстка приведена к макетам.
  3. Оба текстовых ТЗ прочитаны; разграничение из 3.txt соблюдено — очерёдность аккаунтов на «Маршрутизации», связи агентов на «Обзоре».
  4. По каждому экрану приложены скриншоты до и после рядом с фрагментом макета.
  5. Пройдены все макеты 1.17.1.
  6. Инспектор реализован по макету; отсутствующие данные показаны как Н с причиной.
  7. Карточки узлов показывают модель и аккаунт из снапшота.
  8. Подписи связей не перекрываются карточками; проверено на нескольких масштабах.
  9. Ни одного числа из макета в живом интерфейсе.
  10. Три темы работают на всех экранах.
  11. Холст не сломан: панорамирование, зум, «вписать».
  12. ruff check . чисто; релизный гейт 10/10; тестов не меньше 496.
  13. Память проекта в AI-Memory обновлена: состояние, задачи, worklog.
  14. Отчёт: START_HEAD, FINAL_HEAD, origin/main, git status, X passed / Y skipped / Z failed.

Главное

Владелец ждал сборку, поставил её на две машины и увидел прежний интерфейс. Холст стал лучше — но это один экран из семи, а вёрстку не начинали.

У этого задания есть преимущество, которого не было у прошлого: исполнитель сидит на том же сервере, где работает хаб, и может открыть его и сравнить с макетом сам. Поэтому сдача — скриншоты, а не описание сделанного.

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

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