Пара плагинов с намеренно проведённой границей: av-dev-tasks отвечает за то, что делаем и в каком порядке, av-dev-pipeline — за то, как ведём одну задачу. Зависимости между ними нет: управление задачами работает и с ручным исполнением, пайплайн — на проекте с любым учётом задач. - av-dev-tasks — преемник av-dev-backlog: цели вместо приоритетов, спринт под одну цель с заморозкой набора, различение вопроса и блокера, каденция «вопросы — разбор — переоценка — набор». Раскладка docs/tasks с items/, PLAN.md, BACKLOG.md, SPRINT.md, REJECTED.md; проверенное из av-dev-backlog перенесено, не переписано. - av-dev-pipeline — вынос того, что лежало копиями в healthlog и jellybit (3628 строк) и уже разошлось: цикл SDD, конвейер ревью с обязательным триажем, прогон нескольких задач разом. Проектная специфика вынесена в файл-бриф, charter'ы несут метод. Коммит фиксирует состояние на момент ревью: три прохода нашли блокирующие дефекты (нет шага, заводящего бриф; git rebase на занятой worktree ветке; sprint drop пишет наполовину) — они чинятся следующими коммитами. Сохранено как база, от которой видно правки.
19 KiB
name, description
| name | description |
|---|---|
| task-batch | Проводит несколько задач разом — планирует порядок и пересечения, гонит каждую задачу отдельным сабагентом в своём git worktree через task-pipeline, интегрирует по одной ветке через rebase + fast-forward (линейная история), проверяет полноту ревью каждой ветки и в конце сверяет стыки, возникшие от слияния. Набор задач приходит извне. Использовать, когда просят сделать несколько задач сразу. |
Батч задач
Оркестратор набора задач. Планирует порядок, раскидывает задачи по
изолированным worktree, каждую проводит через полный цикл task-pipeline, затем
сводит в основную ветку линейной историей и делает финальную сверку. Тонкая
обёртка над task-pipeline — не переизобретай её шаги, вызывай как есть.
Работай максимально автономно, по тому же принципу, что и одиночный пайплайн: вопрос, который решать не тебе, записывается и не останавливает поток; спрашиваем только про необратимое (деплой, выкладка наружу, удаление или перезапись рабочих данных). Механику — планирование, worktree, rebase, интеграцию, чистку — делаем без спроса.
Перед стартом прочитай CLAUDE.md проекта и бриф ревью (docs/review-brief.md):
из него берутся команда гейта, инварианты и раскладка нумерованных артефактов.
Границы
- Набор задач приходит извне. Батч его не формирует: не выбирает из беклога, не приоритизирует, не решает, что важнее. Набор не задан — попроси его у вызывающего и остановись.
- Батч не владеет спринтом и целями. Он сообщает исход по каждой задаче в тех
же трёх словах, что и
task-pipeline: сделана / не доведена / оказалась крупнее задачи.
Ключевое отличие от одиночного пайплайна
task-pipeline коммитит в текущую ветку, и при ручном запуске это основная
ветка. Здесь так нельзя для параллельных задач, поэтому батч — осознанное
исключение: временные ветки и worktree заводятся лишь как средство изоляции, а
конечное состояние — та же линейная история основной ветки через rebase +
fast-forward. Ветки после вливания удаляются.
Модель исполнения
- Каждая задача = один автономный сабагент (
general-purpose, чтобы иметь доступ к Skill и Agent для вложенных чекпоинтов ревью), работающий только в своём worktree и прогоняющийtask-pipelineцеликом на этой задаче. - Оркестратор кода задач не пишет: он планирует, заводит worktree, запускает сабагентов, проверяет полноту их ревью, интегрирует ветки и делает финальную сверку.
- Стиль правок внутри — заточка под проект и конвенции, right-size, без золочения.
Шаги
1. Прочитать набор
Набор задан списком (слаги, файлы, описания) — прочитай файл каждой задачи и
связанные спеки и черновики. Задачи-идеи включаются, но помни: сабагент проведёт
их сперва через opsx:explore, это тяжелее и чаще упирается в вопрос.
2. Спланировать порядок и пересечения (автономно)
Для каждой задачи определи:
- затронутые capability — по её описанию и по каталогу актуальных спек
(
openspec/specs/); - жёсткие зависимости: задача B строится на результате A → A строго раньше B;
- нумерованные артефакты — номера раздаёт оркестратор заранее. Если проект нумерует миграции или подобные файлы (путь — из брифа), посмотри последний номер и раздай номера тем задачам, которые, вероятно, их добавят, до запуска. Номер уходит в charter сабагента, и он берёт назначенный, а не «следующий свободный». Так такие задачи можно гнать одновременно: файлы не столкнутся, а описание схемы правят разные строки — конфликт мелкий и решается на интеграции;
- жёстко сериализуем (не гоняем одновременно) настоящие пересечения:
- одна capability на несколько задач — две задачи, правящие одну спеку (тем
более одно и то же
### Requirement), дают не текстовый, а семантический конфликт при архивации; сериализуем по смыслу, а не только по файлам; - пересечение по одним и тем же исходникам;
- одна capability на несколько задач — две задачи, правящие одну спеку (тем
более одно и то же
- мягкие конфликты сериализовать не надо: индекс беклога (каждая задача убирает свою строку) и спеки разных capability — разные строки и файлы, сливаются сами.
Собери план: волны параллельно-безопасных задач плюс сериализованный хвост конфликтоопасных, с учётом зависимостей. Покажи план короткой репликой и иди дальше.
3. Свежая база
Убедись, что рабочее дерево чистое и основная ветка свежая. Зафиксируй базовый коммит. Новые ветки бери от свежей вершины; ветки следующей волны — от вершины, уже включающей результат предыдущих волн.
4. Прогнать волны
Потолок параллелизма — 2–3 задачи одновременно. Каждая задача тянет полный
task-pipeline с вложенным ревью и гейтом, поэтому больше трёх разом душат
машину и провоцируют гонки. Волну шире трёх бей на под-пачки по ≤3.
Волна из одной задачи — не вырожденный случай, а обязательный. Задача,
ревью которой будет доказывать находки числами (профиль deep, где работают
adversary и ops: удержание блокировки, пик памяти, рост файлов, длительность
операции), гонится в волне одна. Соседний прогон на той же машине портит эти
числа, а находка с испорченным оракулом хуже отсутствующей — она выглядит
доказанной. Если задача всё же пошла в общей волне, её отчёт обязан нести строку
в границах покрытия: замеры сняты под соседней нагрузкой.
Для каждой задачи в под-пачке:
- Заведи worktree и ветку от текущей вершины:
git worktree add <path> -b task/<slug> <основная ветка>. Путь — во временном каталоге проекта (./tmp), не в системном/tmp. - Запусти по одному сабагенту на задачу, все в одном сообщении,
subagent_type: general-purpose. Charter сабагента:- работай строго в своём worktree
<path>; в другие каталоги и в основную ветку не лезь; - прогони Skill
task-pipelineровно на этой задаче, полный цикл SDD с обоими чекпоинтами ревью; - если задаче назначен номер артефакта — используй строго его;
- профиль ревью выбирается по факту изменения. Батч не повод понижать профиль: «нас много и мы спешим» — это ровно тот стимул, из-за которого проходы пропускают;
- режим прогона проходов — последовательный. Твой worktree не один на машине;
- вернуть отчёт, в котором обязательно: исход задачи одним из трёх слов; что сделано; какие вопросы записаны и куда; изменённые файлы; добавлялся ли нумерованный артефакт и с каким номером; затронутые capability; состояние гейта; перечень запущенных проходов ревью поимённо с исходом каждого и границы покрытия.
- работай строго в своём worktree
Сабагент, упершийся в вопрос, не останавливает батч: он записывает вопрос, режет задачу до остатка и доводит остаток — либо, если остатка нет, возвращает исход «не доведена». Оркестратор собирает такие вопросы и выносит их в финальный доклад пачкой.
5. Проверить полноту ревью — до интеграции
Ветка, чей отчёт не называет проходы поимённо, не вливается. Пропуск прохода не отличим от прохода без находок, и на уровне батча это ещё опаснее: отчётов много, каждый выглядит полным, а сверять их некому, кроме тебя.
По каждой готовой ветке сверь перечень проходов с таблицей профилей скилла
review-pipeline для объявленного профиля. Расхождение — не повод отменять
задачу: дозапусти недостающие проходы на ветке, в её worktree, через
review-pipeline, и только потом интегрируй. Отчёт дозапуска приложи к отчёту
задачи.
6. Интегрировать — rebase + fast-forward, по одной ветке
Сводим ветки строго последовательно (линейная история), в порядке зависимостей. Вливаем только зелёные.
Для каждой готовой ветки task/<slug>:
git rebase <основная> task/<slug>— перенос на текущую вершину;- резолв конфликтов (их почти нет — конфликтоопасное сериализовано, номера
розданы заранее). Неавтоматический конфликт — не форсируй: прерви
(
git rebase --abort), оставь ветку и worktree как есть, вынеси это в доклад как нераспознанное пересечение; git checkout <основная> && git merge --ff-only task/<slug>;- после каждой интеграции — гейт на основной ветке. Красное — откати эту
интеграцию (
git reset --hardна прошлую вершину), ветку с worktree сохрани, задачу перечисли в докладе. Основная ветка никогда не остаётся полузелёной; - только после зелёного:
git worktree remove <path>иgit branch -d task/<slug>.
Политика частичного провала. Упавшая задача (исход «не доведена», красные тесты в её worktree, конфликт при rebase) не блокирует остальные: интегрируем все зелёные, упавшую оставляем в её worktree и ветке нетронутой — ничего не удаляем, — и перечисляем в докладе с причиной, отчётом и путём к worktree.
7. Финальный гейт
На основной ветке после всех интеграций — гейт целиком. Зелёное обязательно; пока красное, шаг 8 не начинается.
8. Финальная сверка — только то, чего не видел никто
Каждая задача уже прошла полный конвейер в своём worktree. Повторять его на интегрированном диффе бессмысленно: те же проходы на тех же файлах дадут те же находки и удорожат триаж. Здесь проверяется только то, что появилось от слияния:
- запусти по одному
review-specsна каждую затронутую capability. Набор назван поимённо и замеров эти проходы не делают, поэтому их допустимо гнать одним сообщением — это то самое отступление от последовательного режима, которое правило разрешает. Задание сузь до стыков: не сверять capability целиком заново, а искать рассинхрон код↔спека, возникший от слияния — требование, которое одна задача выполнила, а соседняя незаметно отменила; два change, по-разному описавшие одно поведение; - если задачи пересекались по файлам, добавь один
review-architectureна интегрированный дифф с вопросом «не появился ли второй способ делать то, что уже делается» — именно он возникает, когда две задачи независимо решали похожее.
Замечания отрабатывай как в task-pipeline: инлайн чини сам, развилка —
вопросом в запись; после правок — снова гейт.
9. Прибраться и доложить
- Убери worktree и ветки только успешно влитых задач, в конце
git worktree prune. Worktree и ветки провалившихся не трогай — они нужны для ручного дожатия. - Доложи кратко:
- исход по каждой задаче одним из трёх слов, с хешем коммита;
- план волн и порядок интеграции;
- вопросы, записанные сабагентами, пачкой;
- что дозапускалось на шаге 5 и почему;
- итог финальной сверки и ссылки на архивные change;
- отдельно — провалившиеся задачи с причиной и путём к оставленному worktree;
- границы покрытия сводной строкой, включая задачи, чьи замеры снимались в общей волне.
Тонкости
- Изоляция параллельных тестов. Прежде чем гнать несколько прогонов разом, убедись, что тесты не делят фиксированный порт или файл БД (обычно берут временный каталог и эфемерный порт — тогда ок). Делят — гони такие задачи последовательно.
- Поведенческая верификация внутри сабагента поднимает изменение вживую: следи, чтобы соседние worktree не дрались за порты и рабочие каталоги. Если проект умеет поднимать только один экземпляр — такие задачи в одну волну не ставь.
- Ревью выполненного — до закрытия задачи; это забота
task-pipelineвнутри каждого сабагента, дублировать не надо. openspec validate --strictтоже внутриtask-pipeline— не пропускай его своими правками на интеграции.- Крупная переработка, предложенная ревью внутри задачи, — развилка: не вливай молча, вынеси в доклад.
- Держи вызывающего в цикле короткими репликами на переходах фаз (план → волны → интеграция → финальная сверка), но не проси подтверждать механику.