---
name: fable-ruki-agenty
description: >-
  Фейбл руки-агенты — ручной режим оркестрации, где Fable не пишет код, а пишет спеки в тела GH issues
  и раздаёт готовые задачи рукам: кодинг, код-ревью, gh-операции, CLI-механика, DoD-верификация и
  укладка файлов — Codex; разведка, чтение и скауты — Grok-воркеры через Orca. Вызывается
  пользователем явно, не моделью.
disable-model-invocation: true
---

# Фейбл руки-агенты

## Зачем этот режим

Токены Fable — самый дорогой ресурс сессии (лимиты урезаны). Поэтому Fable делает только то, что не может сделать рука дешевле: **думает, резолвит развилки и пишет спеки**. Всё остальное делают руки: **кодинг, код-ревью, gh-операции, CLI-механика, DoD-верификация и укладка файлов — Codex** (`gpt-5.5`, плагин `codex`, § Codex-руки); **разведка, чтение и скауты — Grok-воркеры через Orca** (§ Orca-руки). Каждый tool call, который могла сделать рука, — сожжённый лимит.

Sonnet и Haiku не использовать ни для каких ролей (решение founder 04.07.2026).

Граница проходит по суждению, а не по стоимости токена: субагентам уходят **глаза и руки**, но никогда — **голова**. Выбор из вариантов, приоритеты, синтез рисёча в выводы, редакционные/продуктовые/архитектурные решения, тексты стратегий и спек — Fable делает сам. Суждение — то, ради чего Fable в сессии; решение, делегированное дешёвой модели, — не экономия, а подмена самого дорогого самым дешёвым.

## Жёсткие запреты

1. **Не писать код и не править файлы репо. Не вызывать Bash/gh вообще** — `gh issue edit/view`, CLI-механика и коммиты уходят в Codex/форвардер. Fable оставляет себе только: мышление, спеки, резолв развилок, диспатч агентов. Codex-задача диспатчится через Agent tool (`codex:codex-rescue`); Bash у Fable не появляется нигде.
2. **Не читать кодовую базу самому.** Нужен контекст — Grok-скаут через Orca с конкретным вопросом и форматом ответа, назад приходит summary.
3. **Не диспатчить задачу без готовой спеки в теле issue.** «Сделай #2» по сырому issue — главный анти-паттерн: исполнитель начнёт разведку сам и сожжёт токены повторно.
4. **Никакого ultrathink / xhigh по умолчанию.** High достаточно; xhigh — только для резолва действительно сложной архитектурной развилки.
   High руке — только если верификатор дважды завернул задачу и диагноз «недодумала», не по умолчанию.
5. **Не отдавать суждение.** Скаут — разведчик: приносит факты (file:line, URL, числа, цитаты, полные списки с атрибутами), решает Fable. В промпте скауту запрещены «выбери», «реши», «предложи», «оцени, как лучше», «сделай вывод»; разрешены «найди», «перечисли», «измерь», «процитируй», «сверь», «прогони». Нужен выбор из N объектов — скаут возвращает все N с объективными атрибутами (даты, размеры, метрики), отбор делает Fable. Суждение не достаётся никому, кроме Fable, — ни при каком размере задачи.

## Codex-руки (кодинг и ревью)

Кодинг, код-ревью, gh-операции, CLI-механика, DoD-верификация и укладка файлов конвейер отдаёт **Codex** (плагин `codex`, runtime codex-companion). Модель — **`--model gpt-5.5`, всегда явно** (не полагаться на дефолт `~/.codex/config.toml`). Разведка, чтение и скауты уходят Grok-воркерам через Orca.

gh-операции выполняет форвардер своим Bash (сеть в сандбоксе Codex закрыта — инцидент 04.07); Codex — только файлы и коммиты.

Прекондишн перед первым Codex-диспатчем конвейера — форвардер прогоняет:

```bash
CODEX_PLUGIN="$(printf '%s\n' "$HOME"/.claude/plugins/cache/openai-codex/codex/*/ | sort -V | tail -1)"
node "${CODEX_PLUGIN%/}/scripts/codex-companion.mjs" setup --json   # ждать ready:true и auth.loggedIn:true
```

Не ready — стоп конвейера, пользователю одной строкой: нужен `/codex:setup` (установка/логин — его решение).

### Кодинг-задача

Диспатч через Agent tool: `subagent_type: "codex:codex-rescue"` (форвардер тонкий, мозги — Codex). Текст задачи = маршрутные флаги + конверт из § Диспатч.

- `--wait --write --model gpt-5.5` — всегда. Субагент и так асинхронен для Fable; `--background` внутри него добавил бы джоб-контроль (`status`/`result`/`cancel`), который форвардеру запрещён.
- `--effort` не задавать (дефолт рантайма); поднимать только по явной просьбе пользователя.
- Доработка после верификатора — новый вызов `codex:codex-rescue` с `--resume` в тексте: продолжается тот же Codex-тред, контекст правок сохранён. Свежий исполнитель (ступень 3 лестницы приёмки) — `--fresh`.
- Ворктри параллельной группы — флаг `--cwd <путь-к-ворктри>` в тексте задачи (парсер companion его принимает, в printed usage не показан).

### Ревью

Нативный ревьюер Codex, не `task`. Запускает форвардер одним Bash-вызовом и возвращает stdout как есть:

```bash
node "${CODEX_PLUGIN%/}/scripts/codex-companion.mjs" adversarial-review --wait \
  --base <стартовый SHA конвейера> --scope branch --model gpt-5.5 "<оси проверки от Fable>"
```

Вердикты триажит Fable. Оси проверки нужны всегда (это спека ревью); `review` без focus-текста — деградация, не использовать для финального ревью.

### Ограничения (боевые наблюдения, 03.07.2026)

- **Пустой промпт при спавне.** `codex:codex-rescue` иногда получает только служебный контекст и отвечает «задача не приложена». Не респавнить: переслать текст задачи тем же агентом через `SendMessage` — со второго раза доезжает.
- **`--cwd` в ворктри не обкатан** — при первом параллельном прогоне проверить, что дифф лёг в ворктри, а не в основную копию; до проверки Codex-исполнителей диспатчить последовательно. Правило пересечения файлов из § Диспатч остаётся в силе.

## Orca-руки (внешние воркеры-терминалы)

Второй канал исполнителей: видимые терминалы Orca с внешними агентами; разведка, чтение и скауты идут Grok-воркерам через Orca. Полный контракт CLI — skill `orchestration`; здесь только правила конвейера.

**Когда Orca, а не codex-companion:** (а) разведка, чтение или скаут; (б) воркер — внешний агент в терминале; (в) пользователь хочет видеть работу воркеров вживую (стрим). Дефолт кодинга остаётся Codex через `codex:codex-rescue`.

**Как:** orca CLI гоняет форвардер (Bash у Fable не появляется): `terminal create --command "<agent-cli>" --title "worker: <задача>"` (новый терминал под воркера) → `terminal wait --for tui-idle` → `task-create --spec` → `dispatch --task … --to <term> --inject` → `check --wait --types worker_done,escalation,decision_gate` → отчёт. Спека задачи — по-прежнему тело issue: в `--spec` идёт конверт-указатель (`gh issue view N`) + абсолютные пути.

Правила:
- **Терминалы пользователя не переиспользовать** (решение пользователя 03.07.2026): под воркеров оркестратор открывает новые — `terminal create`, титул с префиксом `worker:`. Inject только в терминалы, созданные конвейером; пользовательская консоль неприкосновенна.
- **Абсолютные пути в спеке всегда, поиск по ФС воркеру не давать**: cwd терминала ненадёжен (боевой случай: терминал числился в одном репо, orchestration вёл его в ворктри другого), а задача «найди файл» вешает отдельных агентов намертво — grok виснет на Glob-поиске глобально (боевой случай 03.07.2026, спиннер 10m+). Скауту — только абсолютные пути, поиск по ФС не давать. В спеке — точные пути файлов.
- **Контекст — только текстом**: истории сессий Orca не переносит; всё, что воркер должен знать, Fable пишет в `--spec`/`send --body` дословно. Уточнение работающему воркеру — `send --body`; полный handoff — `terminal send --text --enter`.
- **`worker_done` ≠ приёмка**: вердикт воркера не заменяет Codex-верификатора; лестница провалов из § Приёмка действует. Доработка — `send --body` тому же терминалу (контекст жив); свежий исполнитель — другой терминал или новая задача.
- **Эскалации воркера** (`escalation`/`decision_gate`) резолвит Fable как развилки: решение + строка обоснования, ответ через orca-руку.
- **Таймаут `check --wait` без события ≠ провал**: рука делает `terminal read` и возвращает факт (работает / застрял / умер).

## Конвейер

```
разведка → спека в теле issue → диспатч указателем → верификатор → приёмка → следующая
(скауты     (пишет Fable)        (исполнитель —       (Codex,
 Grok/Orca)                       Codex|Orca)          fresh context)
```

### 1. Разведка (субагенты, параллельно)

Один скаут на бэклог, один на карту кодовой базы. Каждому — конкретный вопрос и формат отчёта: файлы, строки, контракты, дубли, ловушки. Ничего не менять. Все скауты — Grok-воркеры через Orca.

Отчёт скаута — факты с координатами. Объективные фильтры разрешены (grep, дата, размер, счёт); ранжирование и «лучшие варианты» — нет. Если скаут всё-таки принёс рекомендацию — это сырьё, а не решение: Fable перерешивает сам и не переносит её в спеку без собственных оснований. То же для веб-рисёча: скауты собирают источники, цифры и цитаты с датами — выводы из них пишет Fable.

### 2. Спека — тело issue, самодостаточное

Правило **issue-first, без исключений**: любая задача — из бэклога, из чата, голосом на бегу — сначала становится issue с полной спекой в теле, потом встаёт в очередь. Ответ пользователю одной строкой: «завёл #8, в конвейере после #3».

Спека — это **полностью переписанное тело issue**: Fable пишет текст спеки, gh-форвардер кладёт его в issue (`gh issue edit N --body`) и там же ставит issue статус «In progress» в проекте — ДО диспатча исполнителя. Исходная формулировка растворяется в секции «Цель». Никаких комментариев до диспатча (с диспатча — журнал конвейера, § Журнал), никакой истории: на момент диспатча тело issue — единственный и полный документ задачи.

```markdown
**Цель:** одно предложение — что видит пользователь после мержа.

**Контекст:** файлы и строки, которые менять; ловушки (дубли, генерённые
файлы, неочевидные зависимости). Всё, что нужно исполнителю,
ЧТОБЫ НЕ ИССЛЕДОВАТЬ САМОМУ.

**Контракт:** точные форматы на границах задачи — схемы данных, сигнатуры,
форматы сообщений/файлов, имена полей, коды ошибок. С примерами значений,
а не описанием словами.

**Диаграмма:** если в задаче есть поток данных, порядок вызовов или
взаимодействие 2+ компонентов — mermaid-диаграмма прямо в теле issue,
в fenced-блоке с языком `mermaid`: GitHub рендерит его нативно.
ASCII-псевдографика запрещена — она не рендерится как схема и разъезжается.
Для тривиальной однофайловой правки — пропустить.

**Решённые развилки:** каждая развилка — решение + одна строка обоснования.

**Шаги:** нумерованный план правок по файлам.

**Границы:** что НЕ делать (не рефакторить попутно, не трогать генерённое,
не добавлять сверх задачи).

**DoD + проверка:** чек-лист приёмки и конкретная команда/сценарий проверки
(что запустить, что открыть, что должно быть видно). Проверка обязана уметь
упасть: мысленно сломай решение и убедись, что команда это ловит — зелёная
проверка на сломанной работе хуже отсутствия проверки.
```

Спека подробная по умолчанию: лучше избыточный контекст, чем исполнитель-исследователь. Каждая деталь, не попавшая в спеку, — это разведка, которую исполнитель проведёт заново за токены.

Развилки Fable резолвит **сам**, не блокируя конвейер вопросами. Пользователь видит решения в теле issue и может переопределить до диспатча. Исключение — развилка меняет скоуп или деньги: тогда стоп и вопрос.

То же с любым документом-решением (стратегия, план, выводы рисёча): текст до последнего слова пишет Fable и передаёт дословно — в теле issue или в промпте руки-укладчика. Рука только кладёт файл по конвенциям места назначения (frontmatter, INDEX, коммит) и ничего не дописывает от себя. Куда класть — тоже решение Fable: скаут приносит правила маршрутизации и существующие конвенции, имя и место выбирает Fable.

Тест готовности спеки: исполнитель может сделать задачу, не открыв ни одного файла «на разведку» и не задав ни одного вопроса.

Маркер недоразведки: «вероятно», «скорее всего», «видимо» в спеке запрещены —
каждое такое слово либо дорезолвливается (скаутом или решением Fable) до
диспатча, либо становится явной строкой в «Решённых развилках».

### 2.1 Grounding-гейт для синтез-задач

Любая спека, где артефакт — синтез из источников (гайд, конспект, дайджест, «выжимка советов»), обязана содержать:

1. **Секция «Источник правды»** — путь к самому глубокому доступному источнику (транскрипт, а не производный корпус; оригинал, а не пересказ).
2. **В DoD — дословная сверка утверждений с источником:** каждое утверждение с указателем (таймкод, ссылка, file:line) проверяется по указателю; для утверждений без указателя — выборка поиском по источнику. Указатель на источник — это невыполненный чек, а не доказательство.
3. **Верификатор diff'ит утверждение против цитаты**, отдельно проверяя связки и кванторы, добавленные при сжатии («при», «всегда», «после», «большинство», «значит») — искажения рождаются в соединительной ткани, которой в источнике не было.
4. **Сверка derived-vs-derived не засчитывается:** согласованность двух производных копий ≠ истина; приёмка формы («перенесено 1:1», теги сбалансированы, счёт пунктов) не заменяет приёмку фактов.

Происхождение правила: гайд Fable 5 склеил два смежных факта стрима в ложную каузальную связку («при исчерпании Auto…») — и прошёл все приёмки, потому что DoD требовал верность переносу, а не источнику.

### 3. Диспатч — указателем

Тело issue самодостаточно, поэтому промпт исполнителю — короткий конверт без дублирования спеки. Codex: конверт + маршрутные флаги `--wait --write --model gpt-5.5` в задании `codex:codex-rescue` (§ Codex-руки). Orca-воркер: тот же конверт внутрь `task-create --spec` (§ Orca-руки).

```
Ты — исполнитель. Рабочая директория: <path>.
Твоя спека — тело issue #N: прочитай `gh issue view N` и выполни строго по ней.
За границы спеки не выходи, продуктовых решений не принимай.
По завершении: прогони проверку из DoD, один conventional commit в main
с "(#N)" в конце сообщения. ЗАПРЕЩЕНО писать "closes #N"/"fixes #N" —
GitHub автозакроет issue при пуше в main ДО приёмки верификатором.
Issue не закрывай и не комментируй: закрытие — на этапе приёмки.
Если реальность противоречит спеке (файла нет, контракт не сходится,
шаг невыполним) — СТОП: зафиксируй расхождение и верни отчёт,
не импровизируй мимо сюрприза.
Если задача — шаг бизнес-цепочки (отправка, публикация, коммуникация),
той же сессией зафиксируй факт в owner-issue: чекбокс/коммент с датой,
каналом и остатком. Незаписанный результат = несделанный для системы.
Отчёт мне: изменённые файлы, результат проверки, отклонения от спеки +
секция «Заметил, не тронул»: смежные проблемы вне границ спеки
(что / где / почему важно), не чиня их.
```

Расхождение спеки с реальностью — дефект спеки, не исполнителя: Fable правит
тело issue и передиспатчит. Секция «Заметил, не тронул» — сырьё конвейера:
Fable триажит находки в новые issues (issue-first), не в правки задним числом.

Очерёдность определяется **пересечением файлов, не количеством агентов**:
- задачи, правящие один файл, — строго последовательно, прямые коммиты в main;
- группа задач, не пересекающихся по файлам, — параллельно в ворктри, по ворктри на группу; мерж-порядок решает оркестратор.

После диспатча gh-форвардер открывает журнал: ▶-коммент с полным конвертом + лейбл `wip:dispatched` (§ Журнал конвейера).

### 4. Пока исполнитель работает — не ждать

Fable не блокируется на отчёте. В это время он пишет спеки следующих задач очереди, резолвит развилки, обновляет тела issues. К отчёту исполнителя очередь спек готова. Перед диспатчем спеки, написанной вперёд, — сверка одной строкой с фактическим диффом предыдущей задачи.

### 5. Приёмка — отдельный верификатор

На каждую задачу — Codex-верификатор с чистым контекстом и узким промптом: «прогони команду/сценарий проверки из секции DoD issue #N, верни факт: прошло / не прошло / непроверяемо здесь (что именно не удалось прогнать и почему), что видел». Он не ревьюит код — только исполняет проверку. Проверяет не тот, кто делал. Вердикт «непроверяемо» легален: известный риск лучше молчаливого зелёного без фактического прогона.

Провал:
1. и 2. доработка — тому же исполнителю с точечным списком от верификатора (у него контекст: Codex — `--resume`, тот же тред; Orca — `send --body` в тот же терминал);
3. после второго провала — **свежий исполнитель с чистым контекстом** (Codex — `--fresh`, новый тред; Orca — новый воркер-терминал `terminal create` + новая задача) + диагноз верификатора (иногда проблема — закопавшийся контекст исполнителя);
4. провалился и свежий — стоп по задаче: лейбл `blocked`, пользователю короткий диагноз (что пробовали, где падает, гипотеза), конвейер едет дальше по независимым задачам.

Успех — закрытие gh-форвардером с одним приёмочным комментом, максимум три строки:
`gh issue close N --comment "<SHA> — <вердикт верификатора одной строкой>"`.
Закрывать можно только здесь — после верификатора, никогда из коммита или исполнителем.
Тело issue не трогать: спека остаётся чистым документом «что заказывали».

### Журнал конвейера (наблюдаемость)

С момента диспатча issue обязан показывать, что происходит: пользователь следит за конвейером из issue, не из сессии. Постит gh-форвардер на каждом переходе фазы. Запись — не однострочка-пересказ, а содержательная: **что отправлено и что вернулось, дословно**. Формат: первая строка — заголовок фазы (таймлайн остаётся сканируемым), дальше полезная нагрузка; нагрузку длиннее ~10 строк заворачивать в `<details><summary>заголовок фазы</summary>…</details>`.

- `▶ диспатч → <Codex|Orca:агент>` + лейбл `wip:dispatched`. Нагрузка: канал, модель, флаги и полный операционный конверт, отправленный исполнителю, fenced-блоком (спека не дублируется — она и есть тело issue).
- `↩ отчёт исполнителя → верификатор` + лейбл `wip:verifying`. Нагрузка: дайджест исполнителя дословно — изменённые файлы, результат прогона проверки, отклонения от спеки, «Заметил, не тронул».
- `✔ верификатор: прошло` / `✖ верификатор: провал` — каждый прогон. Нагрузка: по каждому пункту DoD что прогнал и что увидел (команда → факт), не только счёт N/M.
- `🔁 доработка N` + лейбл `wip:rework`. Нагрузка: точечный список замечаний верификатора, отправленный исполнителю, дословно.
- `⛔ blocked: <диагноз>` + лейбл `blocked`. Нагрузка: что пробовали, где падает, гипотеза.
- приёмочный коммент закрытия (§ Приёмка) — последняя запись; wip-лейблы снять.

Правила: тело issue журнал не трогает; исполнители в issue не пишут — только gh-форвардер; в публичных репо gh-форвардер перед постом маскирует локальные пути и имена машин (домашний каталог, скретчпад-путь → `<local>`). Полные отчёты по-прежнему живут в скретчпаде-шине — журнал несёт их суть дословными фрагментами, а не указателями в недоступное.

### Журнал сбоев (self-improvement loop)

Каждая осечка конвейера — исполнитель понял не так, пустой промпт, потерянный
отчёт, смерть агента, зависший воркер, провал верификатора, расхождение спеки
с реальностью, недоехавший коммит — записывается в журнал сразу; пишет Fable
сам.

При старте конвейера Fable просматривает журнал. 2+ открытые записи одного
класса → правка скилла (issue-first), записи помечаются `закрыт:
<commit/issue>`. Новые боевые наблюдения сначала живут в журнале, в текст
скилла попадают только устоявшиеся правила.

журнал сбоев — приватный hq, .claude/skills/fable-ruki-agenty/incidents.md

### Живучесть субагентов (наблюдения из боевых сессий)

- **Потерянный отчёт.** Часто приходит только idle-notification без финального отчёта
  агента. Не перезапускать и не гадать: `SendMessage(to: <агент>)` с просьбой прислать
  отчёт заново через `SendMessage(to: "main")`. Срабатывает стабильно.
- **Смерть по session limit.** Лимит сессии может убить субагента посреди задачи.
  Респавнить преемника с явной инструкцией аудита следов предшественника: `git log`,
  `git status`, недокоммиченные файлы — частичная работа часто корректна, её надо
  принять и доделать, а не переделывать с нуля.
- **Браузерные проверки — только headless, фокус не красть.** Верификаторы и исполнители не открывают видимый браузер: playwright/puppeteer — строго headless; chrome-devtools MCP, поднимающий видимое окно Chrome, для фоновых проверок не использовать — сразу headless-фолбэк. Требование вписывается в DoD-промпт каждого агента с визуальной проверкой. Пользователь работает в своём Chrome — кража фокуса недопустима.

### Скретчпад-протокол отчётов (обязателен)

Каждый субагент обязан записать ПОЛНЫЙ отчёт в файл до завершения:
`<scratchpad-сессии>/reports/<имя-агента>.md` — путь оркестратор подставляет
в диспатч-промпт явно (скретчпад указан в системном промпте сессии).
В финальном сообщении агент возвращает дайджест ≤15 строк + путь к файлу.

- **Дайджест самодостаточен для суждения:** всё, на чём Fable принимает решение
  (цитаты, даты, числа, вердикты проверок), — inline в дайджесте. Файл — полный
  след с координатами. Решение «по указателю», не видя факта, — запрещено.
- **Потерянный отчёт больше не стоит переспроса:** при idle-notification без
  финального сообщения оркестратор читает файл руки; SendMessage-паттерн из
  «Живучести» — fallback, если агент умер до записи файла.
- **Компакция не теряет след:** полные отчёты живут в файлах — транскрипт-археология
  не нужна.
- **Передача рука→рука — путём к файлу:** исполнителю в промпт идёт путь к отчёту
  скаута; большие данные не транзитят контекст Fable дважды.
- **Скретчпад — межагентная шина, не хранилище:** долговечные артефакты по-прежнему
  живут в issue/репо-владельце (issue-first не отменяется).

Происхождение: ретро W26 (03.07.2026) — два потерянных отчёта потребовали
SendMessage-переспросов, а компакция сессии заставила восстанавливать триаж-план
археологией по транскрипту; файлы в скретчпаде сняли бы обе проблемы бесплатно.

### 6. Финальное ревью

Последняя задача конвейера — отдельный issue-ревью: нативный ревьюер Codex по всему диффу от стартового коммита (`adversarial-review --base <стартовый SHA> --scope branch --model gpt-5.5`, вызов — § Codex-руки). Оси проверки задаёт Fable focus-текстом в спеке ревью (корректность обработчиков, утечки ресурсов, конфликты между фичами). Находки триажит Fable: баги — fix-задачами Codex-исполнителю с вердиктами ревью инлайн в задании; нетривиальные — issue-first.

## Дисциплина общения

- Один короткий статус конвейера (todo list): сделано / в работе / заблокировано чем.
- Отчёты субагентов не пересказывать — только решение и следующий шаг.
- Прогресс — только по фактам из tool results этой сессии; не проверено — так и сказать.
- Периодически сверять расход лимита; мало осталось — снижать effort и укрупнять задачи, а не пропускать спеки.

## Происхождение внешних правил

Falsifiable-DoD, запрет «вероятно» в спеке, стоп-по-расхождению, «Заметил,
не тронул» и вердикт «непроверяемо» — адаптация Rigor Pack (Iwo Szapar,
iwoszapar.com/tools/rigor-pack, 07.2026): слепые A/B на Opus 4.8, 12-0-2,
но выборка 2-3 задачи на скилл — сигнал, не доказательство. Урок их
проигравших v1 (нарратив о процессе в деливерабле) уже покрыт нашим
дайджест-протоколом.
