Тринадцать файлов существовали только на диске ПК владельца, в рабочей копии, отставшей от origin/main на 122 коммита. Их реализация и тесты давно влиты: tests/test_a42_provider_connect.py, test_a49_subagents_skills_memory.py, test_a51_hub_controls_hermes.py, test_a52_local_models_supervisor_dual.py, test_a55_account_connection.py, test_a56_context_compression.py и другие. Постановок, объясняющих, что эти тесты обязаны доказывать, в репозитории не было. Правило записано в agents/AGENTS.md: задание живёт в репозитории, а не в переписке и не в личных папках на диске. A48, A50 и A54 не переносятся: они уже есть на origin под другими именами, содержимое совпадает с точностью до перевода строки в конце файла. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
174 lines
18 KiB
Markdown
174 lines
18 KiB
Markdown
# Задание A49: расстановка субагентов, вкладка «Скиллы», память через Obsidian
|
||
|
||
## Дата поступления
|
||
2026-08-31
|
||
|
||
## База
|
||
|
||
`origin/main` (`17b368a`) — туда слиты A42, A45, A47 и A48.
|
||
|
||
```
|
||
git fetch origin --prune
|
||
git checkout -b antigravity/a49-subagents-skills-memory origin/main
|
||
```
|
||
|
||
В `main` напрямую не пушить.
|
||
|
||
## Порядок исполнения
|
||
|
||
Два прохода: **Flash** реализует, **Pro** проводит аудит. Пункт **P0-6** написан для аудитора.
|
||
|
||
Задание крупное и делится на три независимые части. **Части можно сдавать по отдельности**, но каждую — целиком.
|
||
|
||
Не пересекается с A44 (сервер) и A45 (замеры). Вёрстка A48 уже в `main`: новые экраны делать в её стиле, существующие не ломать.
|
||
|
||
---
|
||
|
||
## Что проверено ревьюером
|
||
|
||
**Ролей объявлено тринадцать**, соединено пять.
|
||
|
||
```
|
||
manager developer-1 developer-2 code-reviewer researcher tester
|
||
tech-writer analyst guardian cost-controller integration-expert
|
||
security-expert dependency-agent
|
||
```
|
||
|
||
Конвейер по умолчанию связывает только `manager → developer-1 → developer-2 → code-reviewer` с возвратами по `REVIEW_FAILED`. Остальные восемь ролей объявлены, но в графе висят без связей: на экране владельца `Research` и `Fast` стоят в стороне и ни к чему не присоединены.
|
||
|
||
**Скиллов в интерфейсе нет вовсе.** Ни вкладки, ни поля в инспекторе агента, ни признака, пользовался ли агент скиллом.
|
||
|
||
**Общая память уже работает** после A47: `/srv/projects/AI-Memory` под git, структура `00_SYSTEM`, `01_PROJECTS`, `03_LESSONS`, `04_PATTERNS`, `05_AGENTS`, протокол и шаблоны на месте, `worklog` заполняется. Корневой `AGENTS.md` в репозитории указывает на неё.
|
||
|
||
**Obsidian** стоит на сервере (snap 1.13.7), но **агенту он не нужен**. Из руководства владельца по подключению Obsidian к агенту, дословно: «Агенту нужен не GUI Obsidian, а локальная папка vault». Хранилище — это папка с файлами Markdown.
|
||
|
||
---
|
||
|
||
# Часть 1. Расстановка субагентов и связи
|
||
|
||
## P0-1. Разобрать всех тринадцать и соединить
|
||
|
||
1. **Разбор каждой роли**: что делает, от кого получает работу, кому передаёт, по какому условию. Приложить таблицей.
|
||
2. **Связать те, что должны работать вместе.** Восемь ролей сейчас ни с чем не соединены — для каждой либо связь, либо явная запись «работает по вызову, в конвейер не входит» с обоснованием.
|
||
3. **Условия переходов** брать из существующего набора: `SUCCESS`, `REVIEW_PASSED`, `REVIEW_FAILED`, `NEXT`, `ERROR`, `ALWAYS`. Новые вводить только при необходимости и объяснять.
|
||
4. **Циклы доработки конечны.** Возврат `REVIEW_FAILED` без ограничения числа итераций — это бесконечный круг на живых квотах. Предел итераций уже есть в конвейере — проверить, что он соблюдается на каждом возврате.
|
||
5. **Расстановка на холсте осмысленная**: поток слева направо, возвраты видимой дугой, узлы не наезжают друг на друга. После A48 подписи связей читаются — не сломать.
|
||
|
||
**Ничего не выдумывать про роли.** Назначение брать из `role_registry.py`; если для роли нет внятного места в потоке, так и написать, а не придумывать ей работу.
|
||
|
||
---
|
||
|
||
# Часть 2. Вкладка «Скиллы»
|
||
|
||
## P0-2. Скиллы видны, ищутся и назначаются
|
||
|
||
1. **Новая вкладка «Скиллы»** в главном меню, в стиле экранов A48.
|
||
2. **Список установленных скиллов** — читать из каталога скиллов агента (`~/.claude/skills/` и равнозначные для других инструментов; путь настраивается). Показывать `name`, `description` и путь.
|
||
3. **Поиск** по имени и описанию.
|
||
4. **Назначение скилла субагенту** — из вкладки и из карточки агента. Назначения сохраняются и переживают перезапуск.
|
||
5. **Во вкладке «Инструменты» инспектора** показывать назначенные скиллы. Сейчас там `Н/Д: инструменты не назначены` — это состояние должно наполниться.
|
||
6. **Скилл не найден или каталог отсутствует** — сказать об этом с причиной и путём, где искали. Не показывать пустой список как «скиллов нет».
|
||
|
||
## P0-3. Видно, пользовался ли агент скиллом
|
||
|
||
Владелец: «добавить режим просмотра, использовал он в проекте скиллы или сам придумывал».
|
||
|
||
1. **Записывать факт применения**: какой скилл, каким агентом, в какой задаче, когда.
|
||
2. **Показывать в истории агента** и отдельным срезом по проекту: применённые скиллы против назначенных, но ни разу не сработавших.
|
||
3. **Назначен и ни разу не применён — это сигнал**, а не ошибка. Показывать как факт: скилл может не подходить под задачи, а может быть сломан — второе лечится частью P0-4.
|
||
4. **Правило честности здесь особенно важно.** Если признак применения снять неоткуда — писать `Н/Д` с причиной, а не рисовать правдоподобную статистику. Сначала выяснить, что вообще можно узнать достоверно, и в отчёте назвать источник.
|
||
|
||
## P0-4. Субагент «скилл-доктор»
|
||
|
||
Готовый скилл лежит у владельца: `Desktop/skills-hermes/skill-doctor/` — `SKILL.md` и `references/description-cookbook.md`. **Написан, выверен и переделке не подлежит**; задание — встроить его как роль.
|
||
|
||
Главное из него, что определяет устройство роли:
|
||
|
||
- **У скилла две независимые части.** `frontmatter` (`name`, `description`) решает, **запустится** ли скилл; тело решает, **что будет после запуска**. Чинить тело, когда сломано описание, — самая частая потеря времени.
|
||
- **Порядок диагностики:** формальное (имя файла ровно `SKILL.md`, расположение, границы `---`, `name` латиницей, `description` одной строкой) → разбор описания на три части → тело → проверочные запросы → диагноз.
|
||
- **Многострочный `description` — ошибка номер один по частоте**: YAML обрезает его, и решение о запуске принимается по огрызку.
|
||
- **Описание состоит из трёх частей**: что делает, когда запускать (реальными словами пользователя, 4–5 формулировок), когда **НЕ** запускать. Третья отсутствует почти всегда, и без неё скилл тихо срабатывает на соседних темах и жжёт лимиты — это хуже молчания, потому что не замечается.
|
||
- **Пять проверочных запросов**: три должны запустить скилл, два — не запустить. Негативные обязательны.
|
||
- **Диагноз выдаётся строгим форматом** с готовым `description` целиком, а не советом «сделай понятнее».
|
||
|
||
Требования к встраиванию:
|
||
|
||
1. **Новая каноническая роль** `skill-doctor` в реестре, с назначением и способностями, как у остальных.
|
||
2. **Запуск из вкладки «Скиллы»**: кнопка «Проверить скилл» рядом с каждым, и общая проверка всех.
|
||
3. **Результат показывать в интерфейсе** тем же форматом диагноза, с готовым описанием, которое можно скопировать.
|
||
4. **Скилл-доктор не правит файлы молча.** Он ставит диагноз и предлагает правку; применяет её владелец.
|
||
|
||
---
|
||
|
||
# Часть 3. Память через Obsidian
|
||
|
||
## P0-5. Хранилище подключается и наполняется
|
||
|
||
Владелец: «если на ПК или сервере установлен Обсидиан, то должен подгружаться в память… в настройках добавляешь папку рабочую Обсидиан, и оркестратору даёшь задание, чтобы он настроил работу».
|
||
|
||
1. **Обнаружение.** Хаб проверяет, есть ли Obsidian и хранилище. Признак хранилища — **папка с каталогом `.obsidian` внутри**, а не установленное приложение: агенту нужна папка, не программа. Найдено — предложить; не найдено — сказать прямо, без догадок.
|
||
2. **Настройка пути** в «Настройках»: путь к хранилищу задаётся вручную и сохраняется. На сервере владельца это `/srv/projects/AI-Memory`.
|
||
3. **Проверка при сохранении**: путь существует, доступен на запись, внутри есть `.obsidian`. Иначе — отказ с причиной.
|
||
4. **Хранилища нет — хаб работает как прежде.** Память не должна стать обязательной.
|
||
|
||
## P0-6. Оркестратор раскладывает память по структуре
|
||
|
||
1. **Действие «Настроить память»**, запускающее оркестратора по заложенной структуре. Структура **уже существует** — та, что в `/srv/projects/AI-Memory`: `00_SYSTEM`, `01_PROJECTS/<проект>/`, `03_LESSONS`, `04_PATTERNS`, `05_AGENTS`. Использовать её, а не изобретать вторую.
|
||
2. **У каждого субагента во вкладке «Память»** — своя структура по проектам: что он читает перед работой, что записывает после, его записи в `worklog` и его уроки.
|
||
3. **Существующие заметки владельца не трогать.** 218 заметок и восемь записей `worklog` уже есть; устаревшее переносить в `99_ARCHIVE`, не удалять.
|
||
4. **Разделение чтения и записи.** Субагент читает общее, пишет своё. Каждая запись подписана: кто, когда, по какому заданию.
|
||
5. **Граница остаётся.** Память описывает состояние и уроки; **распоряжений она не отдаёт**. Задание приходит от владельца, а не из заметки. Это требование A47, и оно не отменяется тем, что памятью теперь управляет оркестратор.
|
||
|
||
---
|
||
|
||
## P0-7. Аудит вторым проходом
|
||
|
||
1. **Открыть хаб и посмотреть** новую вкладку и связи на холсте. Не отчёт — экран. Скриншоты приложить, как в A48.
|
||
2. **Проверить, что список скиллов настоящий**: подложить скилл в каталог и убедиться, что он появился; убрать — исчез.
|
||
3. **Скилл-доктор проверить на заведомо сломанном скилле** — с многострочным `description` — и убедиться, что диагноз указывает именно на это.
|
||
4. **Признак применения скилла**: убедиться, что он снимается измерением, а не выводится из назначения.
|
||
5. **Проверить, что без Obsidian хаб работает** как прежде.
|
||
6. **Проверить, что заметки владельца не пострадали**: число заметок до и после.
|
||
7. **Циклы доработки конечны** — убедиться, что предел итераций соблюдается.
|
||
8. **Побочные изменения** объяснить.
|
||
9. **Пропущенный пункт назвать пропущенным.**
|
||
|
||
---
|
||
|
||
## Ограничения
|
||
|
||
- Клиент **без сборки, без npm, без фреймворка**.
|
||
- Вёрстку A48 не ломать; новые экраны — в её стиле.
|
||
- Учётные данные, `~/.hermes/agy_profiles/`, службы `qwen-coder` и `qwen-compressor` не трогать.
|
||
- Заметки владельца не удалять.
|
||
- Скилл-доктор из `Desktop/skills-hermes/skill-doctor/` не переписывать.
|
||
- Версию `0.1.1` не поднимать.
|
||
- Правило честности без исключений: не измерено — `Н/Д` с причиной.
|
||
|
||
## Критерии приёмки
|
||
|
||
1. Ветка в `origin`, `git status` чист.
|
||
2. Разбор тринадцати ролей приложен таблицей; каждая либо соединена, либо объявлена внеконвейерной с обоснованием.
|
||
3. Циклы доработки конечны; проверено.
|
||
4. Вкладка «Скиллы» есть: список читается из каталога, поиск работает, назначение сохраняется и переживает перезапуск.
|
||
5. Назначенные скиллы видны в инспекторе агента.
|
||
6. Видно, применялся ли скилл; источник признака назван; неизмеримое помечено `Н/Д`.
|
||
7. Роль `skill-doctor` в реестре; запуск из интерфейса; диагноз выводится строгим форматом с готовым описанием; файлы молча не правятся.
|
||
8. Скилл-доктор проверен на заведомо сломанном скилле.
|
||
9. Хранилище Obsidian обнаруживается по наличию `.obsidian`, путь настраивается и проверяется.
|
||
10. Без хранилища хаб работает как прежде.
|
||
11. Оркестратор раскладывает память по существующей структуре; у каждого субагента во вкладке «Память» видна структура по проектам.
|
||
12. Заметки владельца целы; число до и после совпадает.
|
||
13. Скриншоты новых экранов приложены.
|
||
14. `ruff check .` чисто; релизный гейт 10/10; тестов не меньше **517**.
|
||
15. Память проекта в AI-Memory обновлена.
|
||
16. Отчёт: `START_HEAD`, `FINAL_HEAD`, `origin/main`, `git status`, `X passed / Y skipped / Z failed`.
|
||
|
||
## Главное
|
||
|
||
Тринадцать субагентов объявлено, работают пятеро, восемь висят на холсте без связей. Скиллы владелец ставит руками и не видит ни списка, ни того, пользовался ими агент или писал по наитию. Память после A47 ожила, но субагенты в неё не смотрят.
|
||
|
||
Задание сводит три вещи в одно: агенты расставлены и связаны осмысленно, у каждого свои скиллы с проверкой их исправности, и все читают одну память по структуре, которую раскладывает оркестратор.
|
||
|
||
## Порядок сдачи
|
||
Передать точный `FINAL_COMMIT_SHA`.
|