14 KiB
Задание 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.1 … 7.1: сетка, отступы, типографика, состояния карточек, расположение панелей, палитра.
- Открыть
style.css. Если по итогам работы он не изменён — задание не выполнено. - Правки в
index.htmlиapp.js— по необходимости; клиент без сборки, без npm, без фреймворка (решение зафиксировано вdocs/web-api/CONTRACT.md§1). Tailwind, React и генераторы страниц не вносить. - Три темы — светлая, средняя, тёмная — работают на каждом экране. Цвета через переменные, не литералами.
Заметные расхождения, найденные ревьюером на экране «Обзор»:
шапка в макете поиск (Ctrl+K), уведомления, настройки, карточка
пользователя; в сборке две кнопки
логотип вензель и подпись против значка молнии
панель холста вертикальный столбец инструментов слева — отсутствует
карточки узлов в макете иконка, файл .md, строка «модель • аккаунт»;
в сборке три обрезанные строки без модели и аккаунта
инспектор в макете вкладки, конфигурация исполнения, Agent File,
инструменты, быстрые действия; в сборке пустая заглушка
нижний ряд в макете три карточки, в сборке две
подписи связей режутся карточками узлов: «ТАНОВКА ЗАД», «РАЙПРИЁМКА»
Про подписи: центрирование уже исправлено в workflow.css, дело не в стиле текста. Их перекрывают карточки узлов — лечится порядком слоёв и расстоянием между узлами в раскладке.
P0-3. Проверка глазами — обязательная часть работы
Codex работает на том же сервере, где запущен хаб. Это ключевое отличие от прошлого захода: сверять есть с чем прямо на месте.
- Открыть
http://127.0.0.1:8080и пройти все экраны. - Скриншот до и после по каждому экрану, рядом фрагмент макета. Приложить.
- Проверить каждую тему.
- Холст: подвигать полотно, покрутить колесо, утащить узел за край и вернуть кнопкой «вписать».
- Подписи связей читаются на нескольких масштабах и не перекрываются.
Отчёт без скриншотов приниматься не будет: другого способа проверить эту работу нет.
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. Самопроверка перед сдачей
Пройти по списку и приложить результат:
git diff --stat— есть ли в спискеstyle.css.python -m pytest -q— сравнить с базой, наorigin/mainсейчас 496 passed.python -m ruff check .PYTHONPATH=src python scripts/verify_multi_provider_router.py- Скриншоты собраны по всем экранам и всем темам.
- Поиск по клиенту: не осталось ли зашитых чисел и процентов.
- Пункт, который не сделан, назван пропущенным.
Ограничения
- Без сборки, без npm, без фреймворка.
- Python не трогать: провайдеры и квоты — задание A42.
- Холст A43 не переделывать, только доводить.
- Учётные данные и
~/.hermes/agy_profiles/не трогать. - Службы
qwen-coderиqwen-compressorне трогать: они только что восстановлены после того, как их подменили заглушкой. - Версию
0.1.1не поднимать. - Правило честности без исключений.
Критерии приёмки
- Ветка в
origin,git statusчист. style.cssизменён; вёрстка приведена к макетам.- Оба текстовых ТЗ прочитаны; разграничение из
3.txtсоблюдено — очерёдность аккаунтов на «Маршрутизации», связи агентов на «Обзоре». - По каждому экрану приложены скриншоты до и после рядом с фрагментом макета.
- Пройдены все макеты
1.1…7.1. - Инспектор реализован по макету; отсутствующие данные показаны как
Н/Дс причиной. - Карточки узлов показывают модель и аккаунт из снапшота.
- Подписи связей не перекрываются карточками; проверено на нескольких масштабах.
- Ни одного числа из макета в живом интерфейсе.
- Три темы работают на всех экранах.
- Холст не сломан: панорамирование, зум, «вписать».
ruff check .чисто; релизный гейт 10/10; тестов не меньше 496.- Память проекта в AI-Memory обновлена: состояние, задачи, worklog.
- Отчёт:
START_HEAD,FINAL_HEAD,origin/main,git status,X passed / Y skipped / Z failed.
Главное
Владелец ждал сборку, поставил её на две машины и увидел прежний интерфейс. Холст стал лучше — но это один экран из семи, а вёрстку не начинали.
У этого задания есть преимущество, которого не было у прошлого: исполнитель сидит на том же сервере, где работает хаб, и может открыть его и сравнить с макетом сам. Поэтому сдача — скриншоты, а не описание сделанного.
Порядок сдачи
Передать точный FINAL_COMMIT_SHA.