Конвейер реализации на пресете xlow-pipeline — нижняя ступень линейки xhigh/high/medium/low/xlow: коротко, без ТЗ и критики (при пустом write_scope карточки исполнитель сам сперва возвращает границы правки — ход 1 на чтении, потом реализует продолжением сессии) — код пишет devin (SWE-2, усилие max) фоновой задачей, принимает и коммитит Grok 4.7 с усилием high. Вызывай, когда задача укладывается в один прогон, резать её на порции не нужно, а перед коммитом нужна независимая приёмка. Запускай т...
Installs into .claude/skills of the current project.
Are you the author of Xlow Pipeline?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/dmitry-fomin-xlow-pipeline)
---
name: xlow-pipeline
description: "Конвейер реализации на пресете xlow-pipeline — нижняя ступень линейки xhigh/high/medium/low/xlow: коротко, без ТЗ и критики (при пустом write_scope карточки исполнитель сам сперва возвращает границы правки — ход 1 на чтении, потом реализует продолжением сессии) — код пишет devin (SWE-2, усилие max) фоновой задачей, принимает и коммитит Grok 4.7 с усилием high. Вызывай, когда задача укладывается в один прогон, резать её на порции не нужно, а перед коммитом нужна независимая приёмка. Запускай только по явному имени: маршрутом карточки Listik (launch_route или метка process:<ключ>) или когда человек назвал пресет; по сходству задачи сам не подхватывай."
argument-hint: "[описание задачи или путь к adhoc-файлу]"
license: MIT
---
# Конвейер xlow-pipeline
**Прочитай [pipeline-core.md](../../references/pipeline-core.md) целиком до первого действия.** Там всё, что у пресетов общее: твоя роль, жёсткие правила, протокол вопросов, шаг 0, adhoc-файл, сборка пакета диффа, пределы на порцию, журнал, раздел `## Listik` и общие грабли. Ниже — только то, чем этот пресет отличается: кто делает каждый этап и как его позвать.
Нижняя ступень линейки `xhigh` → `high` → `medium` → `low` → `xlow`. Пресет для **короткой задачи без ТЗ и критики**: этапов у него два, писателя ТЗ нет вовсе, квота подписки не тратится. Код пишет devin на `swe-2-max` (в Artificial Analysis SWE-2 не замерен — выбор по аналогии, сверяется по вердиктам в журнале), принимает и коммитит Grok 4.7 с усилием high; внешних денег ≈ $2.7 на задачу, квота 0. Основной контекст только маршрутизирует, носит вопросы автору и ведёт журнал. Скил запускается только по явному имени — маршрутом карточки Listik (`launch_route` или метка
`process:xlow-pipeline`) или человеком (`/feature-pipeline:xlow-pipeline`); по сходству задачи сам его не подхватывай, и запуск скила — согласие автора на отправку **требований и кода порции** наружу: исполнителю уходит рабочий каталог целиком (devin ходит по коду сам), судье — дифф. Секреты в adhoc-файл не пропускает шаг 0, в дифф — границы правки порции; все команды — из корня основного дерева.
## Роли
| Этап | Кто | Модель и усилие | Первая строка отчёта |
| --- | --- | --- | --- |
| 3. Реализация | скил `devin:devin-delegate`, фоновой задачей, с `--write` | `--thinking max` (модель `swe-2-max`; в AA не замерена) | `готово`, `не смог` или `вопрос` |
| 4. Приёмка и коммит | `/grok:delegate`, фоновой задачей | `--model grok-4.7 --effort high` | `зелёный` с хешем или `красный` |
## Нужные скилы
Стоп, если нет хотя бы одного — раздел «Внешние скилы» `pipeline-core.md`. Скрипты из кэша не зови.
- [`devin:devin-delegate`](../../../devin/skills/devin-delegate/SKILL.md) (`plugins/devin/skills/devin-delegate/SKILL.md`) — этап 3 (`--write` и `--thinking max` обязательны); [`devin:devin-check`](../../../devin/skills/devin-check/SKILL.md) — готовность; [`devin:devin-jobs`](../../../devin/skills/devin-jobs/SKILL.md) — ход и забор; [`devin:devin-runtime`](../../../devin/skills/devin-runtime/SKILL.md) — контракт и продолжение сессии;
- `/grok:delegate` — этап 4 и предполётный прогон судьи; `/grok:setup` — готовность, если прогон упал не на балансе; `/grok:status` и `/grok:result` — ход и забор; `grok:grok-cli-runtime` — контракт;
- [`listik:listik`](../../../listik/skills/listik/SKILL.md) (`plugins/listik/skills/listik/SKILL.md`) — карточка, этапы, журнал, вопросы автору.
## Когда не подходит
Пресет берёт короткую задачу целиком и в один прогон. Не подходит, и это стоп с вопросом автору:
- **эпик** — определяется фактом, а не догадкой: на шаге 0 `show <id> --json` и `issue_type == "epic"`;
- **задача на несколько порций** — её пришлось бы резать, а резать здесь нечем: писателя ТЗ у пресета нет;
- **просьба «спроектируй»** — проектирование живёт на этапе 1, которого у пресета нет;
- **несколько независимых частей** — им нужны треки и своё ТЗ на каждый, а не один adhoc-файл.
В этих случаях — стоп и вопрос автору с предложением `low-pipeline` или `high-pipeline`. Эпик идёт через `needs-owner` по разделу `## Listik` `pipeline-core.md`, и этапы после него не начинаются. Решение автора:
«выбрать эпик и выбрать пайплайн без ТЗ-писателя — НЕЛЬЗЯ».
## Шаг 0 — adhoc-файл, карточка, дерево
Шаг 0 общий, из `pipeline-core.md`: конфиг, класс задачи, журнал, дерево. Отличие одно: класс задачи здесь всегда **широкая механическая правка** — текст автора дословно ложится в adhoc-файл: при карточке `<steps>/<id>.a.md`, без карточки — `<steps>/adhoc-<ГГГГ-ММ-ДД>-<слаг>.a.md`, с разделами «Требования» и «Границы правки», порция у ветки одна (`<X>` — `a`), своих требований ты не добавляешь. Правила adhoc-файла — в `pipeline-core.md` («Adhoc-файл для широкой правки»), здесь они не пересказываются.
Карточка Listik ведётся по разделу `## Listik` того же файла, ветка «Пресет без писателя ТЗ (adhoc-ветка, `xlow-pipeline`)»: карточка одна, `spec_path` и `checklist_path` — сам adhoc-файл, `review_path` не ставится, критики не было. Дочерних карточек нет: задача на порции не делится. Перед этим — проверка эпика из «Когда не подходит»:
```
listik show <id> --json --actor agent:claude --harness claude
```
## Префикс
```
STEPS=docs/specs/steps
BASE=<id> # без карточки — adhoc-<ГГГГ-ММ-ДД>-<слаг>
WT=. # в треке — абсолютный путь дерева трека
```
`<X>` — буква порции, `<R>` — заход приёмки, `DJOB` и `JOB` — id фоновых задач devin и судьи. `DJOB` берётся из ответа `devin:devin-delegate`.
## Предполётная проверка — до этапа 3
**Стоп-фактор.** Любая роль недоступна (предполётная проверка не прошла, харнесс не установлен или не залогинен, запуск упал, ответила не та модель) — конвейер стоит: журнал `стоп: <роль> — <харнесс> недоступен: <причина>`, `listik needs-owner <id> "<вопрос>"` и тот же вопрос в чат, и больше ничего. Запасного исполнителя нет: роль не подменяется ни другим харнессом, ни другой моделью, ни локальным субагентом, в headless тоже (`pipeline-core.md`, «Стоп-фактор»). Повтор того же харнесса и той же модели в той же роли — не подмена.
Оба канала — здесь, не когда понадобятся. Скилов нет — уже стоп по ядру. Готовность исполнителя —
`devin:devin-check`. Не готов — **стоп-фактор**: журнал `стоп: исполнитель — devin недоступен: <причина>`, `needs-owner <id> "<вопрос>"` и тот же вопрос в чат; запасного исполнителя нет (раздел «Стоп-фактор» `pipeline-core.md`); чинить по выводу этого скила. Усилие исполнителя зашито пресетом —
`--thinking max`, другое не выбирай. Судья — **настоящим коротким прогоном** через `/grok:delegate`
без `--background`:
```
/grok:delegate --no-web --model grok-4.7 --effort high Ответь ровно одним словом: ok
```
Вернулось `ok` — канал живой. Вернулся 402 или другая ошибка — **стоп и вопрос автору** с текстом ошибки дословно в журнал.
## Ход 1 — границы правки (условно)
Писателя ТЗ у пресета нет, поэтому задачу делает одна нейронка в **два хода одной сессии devin**: ход 1 — только чтение, исполнитель возвращает текстом ответа раздел «Границы правки» со списком путей и план; ход 2 — это этап 3, продолжение той же сессии с правом записи. Список путей из хода 1 уходит в `write_scope` карточки — по нему рой раскладывает задачи по волнам.
**Когда идёт.** Ход 1 идёт, только если выполнены **оба** условия: у карточки пуст `write_scope` (`listik show <id> --json` — поле `write_scope` равно `[]`) **и** автор в тексте задачи не назвал ни одного пути. «Назвал путь» — в тексте автора есть хотя бы один токен, похожий на путь: содержит `/` без пробелов (`listik/store.py`, `web/src/`, `docs/`) **или** оканчивается расширением файла (`.py .md .ts .vue .mjs .js .json .sh .toml .yaml .yml .css .html .txt`) — регекс `(^|\s)[\w.@-]+(/[\w.@-]*)+|\b[\w-]+\.(py|md|ts|vue|mjs|js|json|sh|toml|yaml|yml|css|html|txt)\b`. Существование пути в дереве **не** проверяется: названный автором новый файл — тоже «назван». Без карточки — только второе условие. Иначе ход 1 пропускается: в adhoc-файл идут границы автора (по ядру), в журнал — `порция a: ход 1 пропущен — write_scope задан` или `порция a: ход 1 пропущен — пути названы автором`, и этап 3 идёт одним ходом.
**Вызов.** Вызови скил `devin:devin-delegate` без `--write` (режим `read` по умолчанию — ход 1 ничего не пишет; `--bash` и `--write` не давать), `--thinking max`, `--cwd $WT`, `--session "$BASE-a"`, `--label "$BASE a: границы"`, фоновой задачей; путь к adhoc-файлу — строкой. Сразу после запуска — в журнал `порция a: devin <job-id>` и `порция a: devin сессия <имя>`. Задание, которое уходит в скил:
```
Ход 1, только чтение: ничего не правь, команд не запускай. Прочитай файл <путь adhoc-файла подставь буквально> целиком и код, который задача затронет. Первая строка ответа — `готово` или `вопрос`. После неё ровно два раздела. «## Границы правки» — не длиннее 30 строк: строка «Файлы:» и список путей от корня репозитория в бэктиках, по одному в строке — файлы и каталоги, которые придётся править (существующие или новые; каталог — не шире одного модуля, корень репозитория и `.` не годятся); строка «Не трогать:» и список того, чего касаться нельзя (соседние модули, тесты, конфиги с секретами — .env, *.key, *.pem, credentials.json всегда здесь). «## План» — шаги реализации, не длиннее 40 строк: для правки текста три-четыре строки, для незнакомой подсистемы — сколько нужно в этом пределе. Путь, которого в дереве нет и который ты не собираешься создавать, — в список не клади. `вопрос` — только если без ответа автора список путей получается разным: список вопросов, у каждого варианты, один помечен словом «предпочитаю».
```
Listik-хвост в ход 1 не добавляется: карточку на ход 1 исполнителю не выдают — её держит оркестратор (`--holder claude`), и heartbeat во время фонового хода 1 шлёт **оркестратор** по разделу «Всегда» ядра с note `<id>, порция a, ход 1: границы`. Ожидание и забор — `devin:devin-jobs`.
**Ответ `готово`.** Сначала критерий годности (проверяет оркестратор до записи): путь годен, если он существует в `$WT` **или** существует его родительский каталог (новый файл в существующем каталоге). Список «Файлы:» пуст, или в нём есть `.`, `/`, `$WT`, корень репозитория, или хотя бы один негодный путь — ответ считается `не смог` (повтор по правилу ниже с добавкой «предыдущий список отклонён: <причина>»). Годный ответ:
1. раздел «Границы правки» adhoc-файла переписываешь списками «Файлы:»/«Не трогать:» из ответа (текст автора в «Требованиях» не трогается) и дописываешь после него раздел «План» из ответа;
2. при карточке — `listik set <id> write_scope=<пути из «Файлы:» через запятую> --actor agent:claude --harness claude`; пути берутся только из этого списка, не из «Не трогать:»;
3. в журнал `порция a: ход 1 — границы: <N> путей, сессия <имя>` и та же строка в карточку `comment -k journal`.
**Ответ `вопрос`** — протокол вопросов ядра (в headless — дефолт «предпочитаю»); ответ автора уходит продолжением `resume --session "$BASE-a"` без `--write` (ход 1 ещё не закончен).
**`не смог`, `failed`, таймаут, пустой ответ** — один повтор новой сессией `$BASE-a-2` (тем же вызовом, без `--write`). Второй сбой — стоп и вопрос автору: идти одним ходом с границами автора / остановиться; в headless — дефолт «одним ходом», `needs-owner` с дефолтной строкой, в журнал `порция a: ход 1 не удался дважды — одним ходом`; этап 3 тогда идёт как без хода 1.
**Имя текущей сессии.** Сессии нумеруются `$BASE-a`, `$BASE-a-2`, `$BASE-a-3`, … — каждый новый `run` (повтор хода 1, откат хода 2) берёт **следующий** свободный номер, никогда существующее имя. Имя действующей сессии — последняя строка `порция a: devin сессия <имя>` в журнале, и она пишется при **каждом** `run` — в том числе когда хода 1 не было и сессия заводится на этапе 3, и когда после двух сбоев идём одним ходом (тогда строка появляется на этапе 3).
## Этапы
### 3. Реализация — `devin:devin-delegate`
**Стоп-фактор.** Харнесс этапа недоступен (запуск упал, не залогинен, ответила не та модель) — конвейер стоит: журнал `стоп: <роль> — <харнесс> недоступен: <причина>`, `needs-owner` и тот же вопрос в чат; подмены другим харнессом, моделью или локальным субагентом нет (`pipeline-core.md`, «Стоп-фактор»).
**Развилка по ходу 1.** Был ход 1 (успешный) — этап 3 это **ход 2**: `devin:devin-delegate` в режиме продолжения (`resume --session <имя действующей сессии из журнала> --background`, синтаксис — `devin:devin-runtime`) с `--write` и `--thinking max` (resume наследует режим `read` хода 1, поэтому оба флага передаются явно), `--label "$BASE a"`, с тем же заданием этапа 3 ниже (путь к adhoc-файлу, «Границы правки — жёсткое условие», Listik-хвост с `devin`). `resume` вернул exit 2 — откат на новый `run --session <следующий номер> --write --thinking max` с тем же заданием, в журнал `порция a: откат — новая сессия <имя>` и `порция a: devin сессия <имя>`. Хода 1 не было (пропущен или не удался дважды) — как ниже: `run --session "$BASE-a" --write --thinking max` (если `$BASE-a` уже занята неудачным ходом 1 — следующий свободный номер), строка `порция a: devin сессия <имя>` пишется здесь.
Карточку Listik выдаёшь до запуска, а `claim` за devin не пишешь — он сам:
`listik stage <P> --to s3-impl --holder devin --actor agent:claude --harness claude`.
Дальше **вызови скил `devin:devin-delegate`**. В аргументах скила обязательно:
- `--write` — этап пишет код; без флага devin только читает, и «похоже на реализацию» он в право записи сам не переводит;
- `--thinking max` — усилие пресета (`swe-2-max`);
- рабочий каталог `--cwd $WT`, имя сессии `--session "$BASE-<X>"` и `--label "$BASE <X>"`;
- фоновой запуск: ответ — job-id;
- путь к порции **строкой**, не содержимое файла.
Задание, которое уходит в скил:
```
Реализуй порцию ТЗ из файла <путь $STEPS/$BASE.<X>.md подставь буквально>. Прочитай его целиком; раздел «Границы
правки» — жёсткое условие, не пожелание. Раздел «Границы правки» — это список путей: правки вне «Файлы:» — выход за
границы; понадобился путь вне списка — верни `вопрос`, а не правь. Разберись в коде, который правишь, прежде чем править. Прогони то, чем проект
проверяется (тесты, линтер, типы). Не коммить и не делай git add/stash/checkout/reset. Не трогай .env, *.key, *.pem,
credentials.json. Не правь тесты под реализацию и не глуши гарды. Требование непонятно или противоречиво — не выбирай
за автора: сделай то, что от ответа не зависит, и верни ответ с первой строкой `вопрос` и списком вопросов, у каждого
варианты, один помечен словом «предпочитаю». Ответ — не длиннее 30 строк, первая строка `готово`, `не смог` или
`вопрос`; дальше: сделано по пунктам требований / не сделано с причиной / открытые вопросы и расхождения / изменённые
файлы списком / проверки одной строкой каждая. Хоть одно требование не выполнено — первая строка `не смог`. Листинги и
логи в ответ не клади.
Listik, карточка <P> (подставь её id буквально): отчитывайся по ней, а не только в дереве. Писать в трекер
не запрещено — это твоя карточка, и claim в ней и есть доказательство, что ты запустился.
listik
Первым действием возьми её сам: listik claim <P> --holder devin --actor agent:devin --harness devin
Дальше каждые 10–15 минут работы — heartbeat с тем, что идёт сейчас:
listik heartbeat <P> --holder devin --note "<что делаешь>" --actor agent:devin --harness devin
Перед ответом — итог в журнал:
listik comment <P> "<первая строка отчёта и суть: файлы, проверки>" -k journal --actor agent:devin --harness devin
Не смог или вопрос — тот же journal и release <P>: не держи карточку, если по ней не работаешь.
```
Job id из ответа скила сразу в журнал: `порция <X>: devin <job-id>`, он же `DJOB=`. Ожидание и забор — как говорит `devin:devin-delegate`; ход уже запущенной задачи — `devin:devin-jobs`. Ответ devin дословно — отчёт этапа.
**Сессия devin и повтор.** Прогон идёт в именованной сессии `--session "$BASE-<X>"`, имя сразу в журнал строкой `порция <X>: devin сессия <id>` (имя сессии и есть её id). Повторный заход по той же порции **продолжает её**: `resume --session "<имя>" --background --label "…"` по `devin:devin-runtime` (наследует каталог, права и усилие; после хода 1 права — `read`, поэтому `--write` передаётся явно). `resume` вернул exit 2 (сессии нет) или другую ошибку — **откат на новый прогон** тем же `devin:devin-delegate` с текущим текстом задачи и новым именем сессии (`$BASE-<X>-2` и т.д.), строкой в журнал об откате и новой строкой `порция <X>: devin сессия <имя>`. `run` вернул exit 2 «имя занято» — это прошлый заход той же порции: нужен `resume`, а не новое имя.
**Чем повторяется заход.** Правило одно на все пресеты и задано протоколом (`pipeline-core.md`, «Шаг 0 — конфиг»), отдельного ключа настройки у него нет. После `вопрос` — продолжение сессии, ответы автора уходят в неё дословно. После красного приёмки — то же продолжение сессии, «Красные пункты приёмки» уходят в неё дословно. Новый прогон в обоих случаях только **откат** (см. выше): тогда в текст идёт текущий текст задачи, «Ответы автора» или «Красные пункты приёмки» дословно и в конец — «Правки предыдущего захода уже лежат в рабочем дереве — не откатывай и не переписывай их, работай поверх».
`вопрос` — протокол вопросов: продолжение той же сессии с ответами автора дословно, и только откат продолжения идёт новым прогоном; `не смог` — повтор **его формулировкой** в пределах бюджета; сбой, таймаут или пустой ответ — по `devin:devin-jobs` как `не смог`; `готово` идёт на этап 4 без обсуждения.
**devin недоступен — стоп.** `devin:devin-check` не готов, аккаунт/сессия devin не поднимается, запуск упал — стоп-фактор: журнал `стоп: исполнитель — devin недоступен: <причина>`, `needs-owner <id> "<вопрос>"` и тот же вопрос в чат; запасного исполнителя нет (раздел «Стоп-фактор» `pipeline-core.md`). Ни pi, ни другая модель, ни локальный субагент роль не берут, в headless тоже. Повтор того же devin с тем же `--thinking max` (новая сессия после упавшего `resume`) — не подмена.
### 4. Приёмка и коммит — Grok 4.7 high фоновой задачей
**Стоп-фактор.** Харнесс этапа недоступен (запуск упал, не залогинен, ответила не та модель) — конвейер стоит: журнал `стоп: <роль> — <харнесс> недоступен: <причина>`, `needs-owner` и тот же вопрос в чат; подмены другим харнессом, моделью или локальным субагентом нет (`pipeline-core.md`, «Стоп-фактор»).
Судья единственный видит требования и код одновременно, поэтому вердикт и коммит — его; здесь он же и единственная проверка работы исполнителя. Чек-листом приёмки служит **сам adhoc-файл**: разделы «Требования» и «Границы правки» — это и порция, и её чек-лист. Подсказок «это не дефект» ему не давай: находку разрешаешь ты по отчёту. Собери пакет диффа по `pipeline-core.md` («Пакет диффа для приёмки»), выдай карточку судье (`listik stage <P> --holder grok --actor agent:claude --harness claude`; `claim` и вердикт он пишет сам, за него — нельзя) и запусти судью. **Вызови `/grok:delegate`** с `--background`, `--write`, `--no-web`, `--model grok-4.7`, `--effort high`, каталог `$WT`. Как ждать и забирать — `/grok:status` и `/grok:result`: ждать финальной фазы `done`/`failed`/`cancelled`, не пропажи `running`, не дольше трёх часов; предел исчерпан — стоп, строка в журнал и вопрос автору.
Задание, которое уходит в `/grok:delegate`:
```
Ты — приёмка одной порции ТЗ и последняя инстанция по ней. Кода ты не правишь никогда: твой результат — вердикт и,
если он зелёный, коммит.
Пути (подставлены буквально): порция и чек-лист — один и тот же adhoc-файл, и ещё пакет диффа; при повторном заходе —
ещё дамп предыдущего захода, тогда смотри разницу, а не всю порцию заново.
Порядок: прочитай порцию и чек-лист. Прогони каждый пункт чек-листа по факту — открой код, запусти команду, посмотри
вывод; «выглядит сделанным» не считается. Прочитай пакет диффа и ищи срезанные углы: правку тестов под реализацию,
ослабленные ассерты, скипы и xfail, отключённые правила линтера, заглушенные гарды, выход за границы правки порции,
правки не по теме порции. Прогони команды из раздела «Проверки порции» чек-листа — это минимум. Полный набор тестов сверх него — на твоё усмотрение: гоняй, если дифф задевает общий код, от которого зависит многое, конфиг сборки/тестов или зависимости, либо узкий запуск вызывает сомнение; в ответе строкой — запускал ли и почему. Дифф не трогает исполняемый код (документация, тексты, комментарии) — тесты не запускай вовсе, строкой «код не менялся». Раздела в чек-листе нет — минимум определи сам тем же правилом.
Чек-лист содержит негативный контроль — прогони его и покажи отказ выводом команды; отказа нет — красный
пункт. Порция добавляет или чинит проверку (барьер, `claim`, шлюз, гард, валидацию, отказ API), а негативного
контроля в чек-листе нет — построй сценарий отказа сам и прогони его.
Каждое число, SHA и цитата в вердикте и отчёте — копией из вывода команды этого захода: хеш — из
`git rev-parse --short HEAD` после коммита, счётчики — из вывода раннера тестов, место в файле — `path:line`;
числа не из вывода в вердикт не идут. Утверждение исполнителя с числом или хешем сверяй с выводом своей
команды, а не принимай на веру.
Чек-лист — разделы adhoc-файла «Требования» и «Границы правки»: по каждому требованию и каждой границе предъяви
конкретный наблюдаемый исход — команду и её вывод, состояние тестов, ответ API. Пересказ кода без попытки
не считается проверкой.
Вердикт первой строкой:
- `зелёный` — все пункты чек-листа закрыты, проверки зелёные, срезанных углов нет. Тогда сам закоммить порцию.
`git add` — только новые и изменённые пути порции; удалённый через `git rm` путь в него не передавай:
упадёт `did not match any files` и не застейджит **ничего**. Коммить `git commit -m "<сообщение>" -- <все пути
порции, включая удалённые>`. После проверь `git show --stat --name-status HEAD` — ровно пути порции. Неполный —
второй коммит поверх, не `git commit --amend` (запрещён); в отчёте оба хеша: вторая строка вердикта — через
запятую, последний итоговый. Не добавляй `-A` и `.`: в
дереве может лежать чужое. Не коммить бумаги шага (каталог ТЗ и файлы `*.journal.md`). Не пушить. Не делать
reset, stash, checkout файлов, clean, rebase, amend и --no-verify. Не трогать .env, *.key, *.pem, credentials.json.
- `красный` — коммита нет. Дальше нумерованный список: пункт чек-листа или найденный срезанный угол, каждый — что
не так и что именно доделать. Находку про выход за границы правки порции ставь первым словом строки
`ГРАНИЦЫ:` — дальше её иначе маршрутизирует оркестратор. Остальные формулировки уйдут исполнителю дословно,
поэтому они про дефект, а не про впечатление.
Ответ — не длиннее 40 строк. Первая строка `зелёный` с хешем коммита или `красный`; дальше: пункты чек-листа с исходом
по каждому / найденные срезанные углы / проверки одной строкой каждая / что отложено или перенесено. Листинги и логи в
ответ не клади.
Listik, карточка <P> (подставь её id буквально): судья берёт её сам и сам пишет вердикт — за тебя его не напишут.
listik
Первым действием: listik claim <P> --holder grok --actor agent:grok --harness grok
Вердикт — сразу после ответа, первой строкой аргумента ровно `VERDICT: PASS` или `VERDICT: FAIL`
(сервер читает только её), дальше хеш коммита или красные пункты дословно, по одному в строке:
listik comment <P> $'VERDICT: PASS\n<hash7>' -k verdict --actor agent:grok --harness grok
listik comment <P> $'VERDICT: FAIL\n<пункты дословно>' -k verdict --actor agent:grok --harness grok
Красный вердикт — ещё и release <P>: карточку снова возьмёт исполнитель.
```
Job id из ответа `/grok:delegate` — в журнал и в `JOB=`.
- **зелёный** — судья уже закоммитил, в отчёте хеш. В журнал `порция <X>: готово (коммит <hash7>)`, отложенное и перенесённое — отдельными строками. Порция у пресета одна, следующей нет: на этом шаг закрыт.
- **красный** — коммита нет, порция на этап 3 с пунктами дословно, в пределах бюджета (повтор идёт продолжением сессии исполнителя — правило `pipeline-core.md`, «Шаг 0 — конфиг»; новый прогон — только откат, когда продолжить нельзя); на **третий красный** вердикт — остановка и доклад автору (этапа 1 нет).
- **`failed`, `402` или пустой ответ** — это не красное: вердикта не было. Строка в журнал и вопрос автору; порция остаётся незакрытой.
Проверь после зелёного, что коммит действительно есть: `git -C "$WT" log --oneline -1`. Судья работает с автоодобрением своих инструментов, и его «закоммитил» стоит одной команды проверки.
## Грабли пресета
| Симптом | Причина | Что делать |
| --- | --- | --- |
| В сессии нет `devin:devin-delegate` | плагин devin не установлен или сессия стартовала до установки | стоп-фактор: `стоп: исполнитель — devin недоступен: …`, `needs-owner`, вопрос в чат; запасного нет; скрипт из кэша не зови |
| devin вернул разбор порции вместо правки, дерево чистое | в `devin:devin-delegate` забыт `--write` (или `resume` после хода 1 унаследовал `read`) | перезапуск скила с `--write`; предыдущий ответ отчётом этапа не считается |
| Ответ пришёл не от `swe-2-max` | в вызов не попал `--thinking max` | ответ отчётом не считается, перезапуск с `--thinking max` |
| Исполнителю ушло содержимое ТЗ | в скил попал текст файла, а не путь | в задание идёт путь к порции |
| Порция закоммичена недоделанной | `готово` от исполнителя принято на веру без судьи | судья не опционален: «готово» проверяет только приёмка |
| Судья упал с 402, порция повисла | баланс Grok Build исчерпан | предполётный прогон судьи до этапа 3; 402 по ходу — вопрос автору, порция не закрывается |
| Фоновая задача не находится по статусу | статус или забор вызваны из другого каталога, чем запуск | тот же каталог во всех вызовах; ход — скил jobs/status плагина |
| Судья сказал «зелёный», коммита нет | прогон оборвался после вердикта | `git log --oneline -1` после каждого зелёного; нет коммита — вопрос автору |
| Повтор после `вопрос` или красного начал сессию с нуля | имя сессии не попало в журнал или `resume` вернул exit 2 | это откат, а не сбой: новый прогон через `devin:devin-delegate` с текущим текстом задачи и новым именем сессии, строка в журнал |
| Ход 1 вернул правки, дерево не чистое | в вызов хода 1 попал `--write`/`--bash` | ответ не считать, `git status` проверить, повтор хода 1 без `--write` |
| После хода 1 в write_scope каталог `.`/корень | список путей «Файлы:» негодный, критерий годности пропущен | повтор хода 1 с уточнением «каталоги не шире модуля» |
| Ход 2 начал сессию с нуля | `resume --session` действующей сессии вернул exit 2 | это откат: новый `run` со следующим номером сессии, строки `порция a: откат — новая сессия <имя>` и `порция a: devin сессия <имя>` в журнал |