# Задание 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`.