Композиция инструкций
Одна инструкция может выполнить часть работы, но реальные пользовательские задачи требуют связки нескольких. Чтобы агент надёжно выполнял такие связки — инструкции должны быть композируемыми: каждая знает свой кусок и не путается в чужом.
Зачем
Раньше один скил пытался покрыть всё подряд — от опроса пользователя до записи cron. Получались простыни на 150 строк, в которых агент терялся и пропускал шаги. Когда мы разбили на маленькие инструкции с явными зависимостями — каждая стала простой, а агент стал собирать из них нужную цепочку сам.
Пример: cron-напоминалка нужна в часовой пояс пользователя. Без таймзоны cron срабатывает в UTC и приходит не вовремя. Раньше я бы написал в setup_idle_check_in инструкцию «спроси таймзону, переведи в IANA, поставь cron» — длинно и дублирует другую инструкцию. Сейчас instructions/setup_idle_check_in просто зависит от instructions/setup_timezone через depends_on. Когда агент берётся за пинг — сначала отрабатывает таймзонную часть, потом ставит cron в локальном времени.
Признаки композируемой инструкции
- Один артефакт или один тип артефактов. Инструкция «настроить таймзону» создаёт
user_settings.mdи больше ничего. Инструкция «бриф для лендинга» собирает только бриф, она не рисует страницу. - Идемпотентность. Запустил повторно — ничего не сломалось. Если файл уже есть и в нём ровно то что должно быть — инструкция тихо возвращает «всё ок», не переспрашивает.
- Явная зависимость через
depends_on:. Не закопанная ссылка в тексте, а строчка во frontmatter в формате wikilink. Тогда trip2g/Obsidian рисуют граф связей, а агент понимает порядок. - Чтение, прежде чем спрашивать. Инструкция читает артефакты от предыдущих инструкций (
user_settings.md,persona.md) и не задаёт лишних вопросов если данные уже есть.
Признаки плохой композируемости
- Инструкция спрашивает то, что должна была заполнить другая. Признак: одну и ту же информацию пользователь сообщает агенту дважды.
- Артефакт от инструкции живёт в нестандартном месте. Признак: следующая инструкция не находит нужный файл и переспрашивает.
- В инструкции есть «и заодно сделай X». Признак: X нужно вынести в отдельную инструкцию.
Как тестировать
В тесте композиции запускают только последнюю инструкцию в цепочке. Если она тащит за собой все нужные предыдущие — композиция работает. Если падает с «не знаю таймзону» — нет связи через depends_on, нужно править.
Конкретный пример из наших тестов: tests/setup_idle_check_in — запустили setup_idle_check_in, агент сам отработал setup_timezone потому что иначе не мог поставить cron в нужное время. Оба артефакта (user_settings.md + _remind_state.md + cron job) появились в одной сессии.
Когда композиция ломается
- Инструкция не объявила зависимость, но фактически требует данных от другой. Тогда агент или спросит пользователя (раздражает), или поставит наугад (вредит).
- Зависимость объявлена, но артефакт не в том месте, где её ждёт следующая инструкция. Тогда агент создаёт дубль либо предполагает что нужного нет.
- Цикл зависимостей — A требует B, B требует A. На граф-визуализации легко увидеть и разорвать.
Связь с другими инсайтами
Это близко к insights/draft_and_commit — каждая инструкция делает свой проход, как writer/reviewer. Композиция = несколько отдельных проходов, каждый со своим артефактом.
И с принципом из code-with-claude case-010: не пытайся загрузить все инструменты в контекст, ищи нужный по запросу. Школа агентов и есть такой инструмент — агент тащит из неё нужную инструкцию ровно когда она понадобилась, не раньше.
Практический чек для новой инструкции
Перед тем как опубликовать инструкцию в школу, спроси себя:
- Какой ОДИН артефакт она создаёт или обновляет?
- Какие данные ей нужны от пользователя, а какие — от других инструкций?
- Есть ли
depends_onсо всеми инструкциями, чьи артефакты она читает? - Если её запустить повторно — ничего не сломается?
- Если убрать одну из зависимостей — будет ли понятная ошибка или тихий бред?
Если на каждый «да» — публикуй. Если хотя бы один «нет» — переписывай до того как зальёшь.