Шаг 4 стал профилем design на предложении (архитектурная находка на готовом коде стоит переписывания и потому игнорируется — на предложении она стоит абзаца), шаг 7 — вызовом review-pipeline с профилем по факту изменения. Границы покрытия протаскиваются в финальный доклад строкой. В task-batch финальная сверка сужена до того, что появилось от слияния: повторять полный конвейер на интегрированном диффе бессмысленно — те же проходы на тех же файлах дают те же находки и удорожают триаж. Заодно убрана ссылка на несуществующий скилл verify: шага не было ни в проекте, ни у пользователя, поведенческую верификацию делает Skill run. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
18 KiB
name, description
| name | description |
|---|---|
| task-batch | Автономно проводит несколько задач jellybit из беклога разом — планирует порядок и зависимости, гонит каждую задачу отдельным сабагентом в своём git worktree через task-pipeline, интегрирует в master по одной ветке через rebase/ff (линейная история), в конце прогоняет все тесты и сверяет код с требованиями по каждой затронутой capability. Использовать, когда пользователь просит взять/сделать несколько задач из беклога сразу. |
Батч задач (jellybit)
Оркестратор набора задач по Spec Driven Development. Планирует порядок,
раскидывает задачи по изолированным worktree, каждую проводит через полный цикл
task-pipeline, затем сводит в master линейной историей и делает финальную
сверку. Тонкая обёртка над task-pipeline — не переизобретай её шаги, вызывай
как есть.
Работай максимально автономно. Зови пользователя (через AskUserQuestion)
только на реальных развилках — как в task-pipeline. Механику — планирование,
worktree, rebase, интеграцию, чистку — делаем без спроса.
Перед стартом прочитай CLAUDE.md, README.md, BRIEF.md,
docs/specs/architecture.md, если ещё не в контексте.
Ключевое отличие от одиночного пайплайна
task-pipeline коммитит прямо в master (память commit-directly-to-master).
Здесь это невозможно для параллельных задач, поэтому батч — осознанное
исключение: заводим временные ветки/worktree лишь как средство изоляции, а
конечное состояние — та же линейная trunk-based история master через rebase +
fast-forward. Ветки после вливания удаляем. Дух памяти (линейный master без
мусорных мёрджей) сохраняется.
Модель исполнения
- Каждая задача = один автономный сабагент (
general-purpose, чтобы иметь доступ к Skill и Agent для вложенных ревью-чекпоинтов), работающий только в своём worktree и прогоняющийtask-pipelineцеликом на этой задаче. - Оркестратор (главный агент) не пишет код задач сам — он планирует, заводит worktree, запускает сабагентов, интегрирует ветки в master и делает финальную сверку.
- Стиль правок внутри — заточка под проект и конвенции, right-size, без золочения
(память
convention-design-approach).
Шаги
1. Выбрать набор задач
- Если набор задан (список slug'ов/файлов, «топ-3 высоких», «эти три») — используй.
- Иначе покажи кандидатов из
docs/backlog/README.md(высокий приоритет, не[идея]) через AskUserQuestion (multiSelect) и дай выбрать. [идея]-задачи включаются, но помни: сабагент проведёт их сперва черезopsx:explore(см.task-pipeline) — это тяжелее и может упереться в развилку.
Прочитай файл каждой выбранной задачи и связанные спеки/ADR/черновики.
2. Спланировать порядок, зависимости и конфликты (автономно)
Для каждой задачи определи по её файлу и capability-map (память):
- Затронутые capability (из 11: identity, ingest, download-tracking, recognition, metadata-match, review, file-layout, state-reconciliation, notifications, web-ui, live-status).
- Жёсткие зависимости: задача B строится на результате A → A строго раньше B.
- Миграции БД — пред-назначение номеров (не сериализация). Определи, какие
задачи, вероятно, добавят миграцию (новая таблица/столбец/индекс/связь), и
заранее раздай им номера: посмотри последний номер в
internal/store/migrations/и назначь0012,0013, … по одной на задачу. Номер уходит в charter сабагента (шаг 4). Так migration-задачи можно гнать параллельно — файлы миграций не столкнутся, аdocs/specs/database.md(ER-схема) правят разные строки, textual-конфликт при rebase мелкий и решается на интеграции. - Жёстко сериализуем (не гоняем одновременно) только настоящие пересечения:
- Одна capability на несколько задач: две задачи, правящие одну capability
(тем более один и тот же
### Requirementв её спеке), дают не текстовый, а семантический конфликт приarchive— сериализуем по смыслу, а не только по файлам. - Пересечение по одним и тем же исходникам.
- Одна capability на несколько задач: две задачи, правящие одну capability
(тем более один и тот же
- Мягкие конфликты (обычно авто-мёрджатся при rebase, сериализовать не надо):
docs/backlog/README.md(каждая задача убирает свою строку) иopenspec/specs/<cap>разных capability (archive вливает дельты) — разные строки/файлы.
Собери план: волны параллельно-безопасных задач + сериализованный хвост конфликтоопасных, с учётом зависимостей. Покажи план короткой репликой и иди дальше. AskUserQuestion — только если порядок реально неоднозначен или задачи глубоко связаны продуктово.
3. Свежий master как база
Убедись, что рабочее дерево чистое и master свежий (git status, при наличии
remote — git fetch и синк). Зафиксируй базовый коммит. Новые ветки бери от
свежего master; ветки следующей волны — от master, уже включающего результат
предыдущих волн.
4. Прогнать волны
Потолок параллелизма — 2–3 задачи одновременно. Каждая задача тянет полный
task-pipeline + вложенные ревью + task test/go build, поэтому больше трёх
разом душат домашнюю машину и провоцируют гонки. Волну шире трёх бей на под-пачки
по ≤3 и гони их последовательно.
Для каждой задачи в под-пачке:
- Заведи worktree + ветку от текущего вершинного master:
git worktree add <path> -b task/<slug> master. Путь — рядом с репо или в./tmp/(памятьuse-project-tmp-dir; НЕ в системном/tmp). Имя ветки —task/<slug>. - Запусти по одному сабагенту на задачу, все в одном сообщении (конкурентно,
но не больше трёх),
subagent_type: general-purpose. Charter сабагента:- Работай строго в своём worktree
<path>; в другие каталоги и в master не лезь. - Прогони skill
task-pipelineровно на этой задаче (<slug>/файл), полный цикл SDD с промежуточными ревью-чекпоинтами. - Если задаче на шаге 2 назначен номер миграции — используй строго его
(
internal/store/migrations/<номер>_*), не бери «следующий свободный» сам. - Ревью-чекпоинты: оба идут через Skill
review-pipeline(профильdesignдо кода, потом профиль по факту изменения). Если вложенный запуск сабагентов недоступен — проведи ревью инлайн по тем же charter'ам.claude/agents/jellybit-review-*.md, но обязательно сохрани гейт (task gateдо опиниативных проходов) и триаж; в отчёте прямо укажи, что ревью шло инлайн — это меняет доверие к результату. - Коммит.
task-pipelineкоммитит в текущую ветку — а это твояtask/<slug>в worktree, так что специально ничего переопределять не нужно. Всё остальное (opsx:archive, чистка беклогаdocs/backlog/<slug>.md+ строка индекса, синк спек/ADR) ложится коммитами туда же. Master не трогай, ветку не переключай, ничего не пушь, новых worktree не создавай. task gateв своём worktree — добейся зелёного.- Верни отчёт: что сделано, какие развилки решались, изменённые файлы, добавлял ли миграцию и её номер, затронутые capability, статус тестов/линта, все неразрешённые вопросы.
- Работай строго в своём worktree
Если сабагент упирается в развилку, которую task-pipeline выносит на
пользователя, — он останавливает свою задачу и возвращает вопрос; оркестратор
собирает такие вопросы и выносит их пользователю (AskUserQuestion), остальные
задачи при этом продолжаются.
5. Интегрировать в master — rebase + fast-forward, по одной ветке
Сводим ветки в master строго последовательно (линейная история), в порядке зависимостей — по одной ветке за раз. Вливаем только зелёные ветки: провалившиеся/зависшие задачи в интеграцию не берём (см. политику ниже).
Для каждой готовой (зелёной) ветки task/<slug>:
git rebase master task/<slug>— перенос ветки на текущую вершину master.- Резолв конфликтов (их почти нет — конфликтоопасное сериализовано, номера
миграций розданы заранее). Если rebase дал неавтоматический конфликт — не
форсируй: прерви (
git rebase --abort), оставь ветку/worktree как есть и вынеси развилку пользователю (это признак нераспознанного пересечения). git checkout master && git merge --ff-only task/<slug>.- После каждой интеграции:
task gateна master. Красное — откати эту интеграцию (git reset --hardна прошлую вершину master), ветку с worktree сохрани, вынеси пользователю. Master никогда не остаётся полузелёным. - Только после зелёного:
git worktree remove <path>иgit branch -d task/<slug>.
Так каждая следующая ветка ребейзится на уже обновлённый master — история линейна, каждая задача = свой осмысленный коммит (или несколько по фазам apply).
Политика частичного провала. Если задача упала (сабагент вернул неразрешённую развилку, тесты в её worktree красные, rebase/merge конфликтует) — она не блокирует остальные: интегрируем все зелёные, упавшую оставляем в её worktree и ветке нетронутой (ничего не удаляем), и в финальном докладе (шаг 8) перечисляем провалившиеся с их отчётами и причиной. Пользователь потом решит: дожать вручную, переназначить, отложить.
6. Финальный гейт
На master после всех интеграций: task gate (+ task build). Зелёное —
обязательно; пока красное, шаг 7 не начинается.
7. Финальная сверка — только то, чего не видел никто
Каждая задача уже прошла полный конвейер ревью в своём worktree. Повторять его на интегрированном диффе бессмысленно: те же проходы на тех же файлах дадут те же находки и удорожат триаж. Здесь проверяется только то, что появилось от слияния и потому не было видно ни одному прогону:
- Запусти по одному
jellybit-review-specsна каждую затронутую capability, все в одном сообщении (параллельно). Задание сузь до стыков: не сверять capability целиком заново, а искать рассинхрон код↔спека, возникший от слияния нескольких задач — требование, которое одна задача выполнила, а соседняя незаметно отменила; два change, по-разному описавшие одно поведение. - Если задачи пересекались по файлам, добавь один
jellybit-review-architectureна интегрированный дифф с вопросом «не появился ли второй способ делать то, что уже делается» — именно он возникает, когда две задачи независимо решали похожее.
Замечания отрабатывай как в task-pipeline: инлайн чини сам, развилка — на
пользователя; после правок — снова task gate.
8. Прибраться и доложить
- Убери worktree/ветки только успешно влитых задач (
git worktree remove+git branch -dуже сделаны на шаге 5); в концеgit worktree prune. Worktree/ветки провалившихся задач не трогай — они нужны пользователю для ручного дожатия. - Доложи кратко: какие задачи сделаны, план волн и порядок интеграции, какие развилки решались, коммиты по задачам, итог финальной сверки, ссылки на архивные change. Отдельно перечисли провалившиеся задачи с причиной, их отчётом и путём к оставленному worktree/ветке.
Тонкости
- Номера миграций раздаёт оркестратор (шаг 2), сабагент берёт назначенный, а не «следующий свободный» — тогда migration-задачи безопасны параллельно.
- Изоляция параллельных тестов. Прежде чем гнать несколько
task testразом, убедись, что тесты не делят фиксированный TCP-порт или файл БД (обычно берутt.TempDir()/эфемерный порт — тогда ок). Если делят — гони такие тесты последовательно, а не в параллельной под-пачке. - Ревью выполненного — до чистки беклога; это забота
task-pipelineвнутри каждого сабагента (памятьreview-before-backlog-cleanup). Оркестратор дублировать не должен. - Не пропускай
openspec validate --strict— это тоже внутриtask-pipeline. - Если сабагент вернул крупную переработку/смену подхода — это развилка, не вливай молча, вынеси пользователю.
- Держи пользователя в цикле короткими репликами на переходах фаз (план → волны → интеграция → финальная сверка), но не проси подтверждать механику.