Files
h-school/.claude/skills/phase-orch/SKILL.md
T

187 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: phase-orch
description: >-
Оркестрирует параллельных агентов /phase-work и /phase-review по графу фаз
в docs/phases/. Аргумент — целевая ширина волны: `/phase-orch 2-3`,
`/phase-orch 3`. Используй при «запусти N разработчиков», «веди срез»,
«оркестрация», «раздели срез между агентами и следи», «продолжай волну».
Не пишет код фаз сам. Не для одной фазы (/phase-work), одного бага
(/bug-work), задачи вне среза (/side-work), нового среза (/slice-work)
и одиночного ревью (/phase-review).
---
# Оркестрация среза
Ты **координатор**, не разработчик. В этом чате не пишешь код фаз, багов,
side-work и не заводишь новый срез. Фазы делают фоновые агенты по [`phase-work`](../phase-work/SKILL.md);
проверку закрытых срезов — по [`phase-review`](../phase-review/SKILL.md).
Твоя работа: держать волну нужной ширины, не запускать фазы с открытыми
зависимостями и не оставлять слот пустым, если есть чем его занять.
## Соседи
| Фраза | Куда |
| --- | --- |
| «сделай фазу 25», «возьми фазу» | `/phase-work` |
| «запусти троих», «веди срез», «продолжай волну» | этот скилл |
| «проверь срез», одно ревью | `/phase-review` |
| «баг», «почини» | `/bug-work` |
| «сделай отдельно», «вне среза» | `/side-work` |
| «новый срез», «спланируй срез» | `/slice-work` |
Независимые side-фазы параллельно — тоже этот скилл (так уже сказано в
side-work). Слоты волны багами не заполнять.
## Аргумент
`/phase-orch` или `/phase-orch 2-3` или `/phase-orch 3`.
| Запись | Цель |
| --- | --- |
| нет числа | **23** слота |
| `N` | ровно **N**, если граф даёт; иначе сколько даёт, остаток — ревью |
| `A-B` | держать **от A до B** живых агентов |
N — **одновременные** агенты, не «запусти N и забудь». Пять слотов при двух
независимых ⬜ — это два разработчика, не пять простаивающих.
Потолок без явной просьбы — **4**. Модель разработчикам — та, что назвал
пользователь; иначе та же, что у координатора.
## Старт
1. Оглавление `docs/phases/README.md` (каталог). Открытые ⬜:
`rg "⬜" docs/phases/*/README.md` — читай только эти индексы, не все.
Ревьюеру — только `docs/phases/<slice>/reviewed.md`, не сводку всех срезов.
Если IDE не на `main` — статусы с `git show main:docs/phases/<slice>/README.md`.
2. Посчитай, сколько ⬜ с **закрытыми** зависимостями (шапка фазы). 🔄 не бери
как новый захват.
3. Проверь `git branch --list "phase/*"` и `review/*` — заявка уже стоит.
4. Запусти первую волну (см. «Чем занять слот»). Каждому разработчику —
**номер фазы** в промпте, чтобы не гонялись за одной ⬜.
5. **Стоп координатора до уведомления.** Не делай работу агента в foreground.
Не полли транскрипты без сигнала («завис», «продолжай», completion).
Каждый ответ пользователю **заканчивай** списком живых агентов (см. ниже).
Дальше цикл: уведомление или реплика пользователя → пересчёт слотов → запуск
или пинок → снова стоп.
## Чем занять слот
Порядок. Следующий пункт — только если предыдущий не набрал ширину волны.
1. **Разработчик** на ⬜ с закрытыми зависимостями, без ветки `phase/<N>-*`.
Один агент — одна фаза, промпт «новый захват» из
[`worker-prompt.md`](worker-prompt.md).
Замена зависшего — **не** этот пункт: это продолжение 🔄, запуск с
**существующей** веткой и worktree, 🔄 не сбрасывать.
2. **Слияние**. Ветка готова, в `main` нет — merge-агент, не второй автор фазы.
Зависимую фазу **не** стартовать, пока зависимость не в `main` (не «на ветке»).
3. **Ревьюер**, если разработчиков больше некуда ставить:
- следующий срез не в `reviewed.md`, или `git log <хеш>..HEAD -- <пути>` непустой;
- срез в работе (есть ⬜/🔄) — можно, в журнале «в работе на момент проверки»;
- два ревьюера — два среза **или** два этапа большого среза (A / B–C),
никогда один этап; **разные** разделы журнала и ветки `review/…`;
- фазу 🔄/⬜ как «готовую» не закрывай; дописалась посреди ревью — допиши в
тот же проход, не начинай срез заново.
4. Слот пустой — так и скажи. Не выдумывай фазу, не ставь второго автора на 🔄,
не сажай `/bug-work` в слот.
Параллельные разработчики не должны править одни файлы без нужды. В промпте
назови соседа и стоп-границу фазы. Общие `docs/phases/<slice>/README.md`,
`docs/protocol.md`, `AGENTS.md` — точечно. Каталог `docs/phases/README.md`
трогай только когда появляется новый срез.
## На уведомлении агента
| Исход | Действие |
| --- | --- |
| Фаза в `main`, ✅ | слот свободен → п. «Чем занять слот» |
| Фаза на ветке, merge не вышел (грязный `main`) | merge-агент, если пользователь уже разрешал stash→merge или сказал «сливай». Иначе спроси |
| Ревьюер влил журнал | слот свободен |
| Агент уступил / снят | не запускай дубль той же фазы, пока не ясно, что ветка свободна |
| Пользователь: пауза, только слияние | interrupt разработчикам: коммит WIP **на своей ветке**, не merge, не main. Merge-агентов не трогать |
| Пользователь: последняя волна / остановись | interrupt: добей свою фазу (и merge) и стоп. **Новых** агентов не запускать, в том числе по completion |
| Пользователь: продолжи | снять паузу с WIP-ветки (`resume` с хешем коммита), не начинать фазу с нуля |
| Агент коммитит в `bug/…` / нет worktree | interrupt: стоп в корне IDE, `worktree add` на уже существующую ветку фазы, 🔄 на `main` через `wt-claim-main`. Историю `bug/…` не revert |
Зависимую ⬜ не открывать, пока зависимость 🔄 или лежит неслитой веткой.
## Зависание
Транскрипт из 1–2 сообщений («читаю скилл» / `GetMcpTools`) при живом агенте
дольше ~15 минут, или тишина после interrupt — **завис**.
1. `resume` + `interrupt`: брось MCP (`GetMcpTools` на `cursor-app-control` не
звать), не читай скилл заново, продолжай с ветки/worktree. Корень IDE не
трогай. Если worktree нет — `git worktree add` на существующую `phase/<N>-*`,
не создавай вторую ветку.
2. Второй раз — старый: «уступи, git не трогай». Новый агент — **продолжение**
того же 🔄: та же ветка и worktree, промпт «замена зависшего». Это не новый
захват ⬜ и не второй автор.
3. Не убивай `HSchool.Server` из-за MSB3021. Dev-сервер не поднимай.
Подробности: [`hangs.md`](hangs.md). Пинает координатор, не отдельный агент.
## Слияние
Сливает **тот же** phase-work, что делал фазу. Не вышло (грязный `main`, lock,
дерево не на `main`) — merge-агент по блоку «Слить в main» из phase-work и
шаблону в [`worker-prompt.md`](worker-prompt.md). «сливай» — merge-агент
по шаблону, не второй автор фазы.
- Замок `merge/lock` **общий**: фаза, баг, ревью, side. Чужой — ждать, не
снимать и не воровать.
- Основное дерево должно **уже** стоять на `main`. Если там `bug/…` (или
другая ветка пользователя) — не `checkout`, не stash, не merge; слот ждёт.
- Грязный `main`: без явного «сливай» — не stash. С разрешением — это
исключение к dirty-main из phase-work, только в промпте merge-агента:
`stash push -u` **своего** ярлыка, merge, pop только его. Конфликт pop —
оставить stash, не форсировать. **Не** stash’ать незакоммиченное живого
worktree соседа.
- Конфликт индекса среза: обе стороны (пришедший ✅ и чужие 🔄/✅).
- `protocol.md`: оставить все блоки (сессия + карточка + темп), не бампить
версию чужой фазы.
- После merge: `branch -d` (не `-D`), снять lock, worktree remove.
## Промпт агента
Координаторский чат **не виден** субагенту. В каждом запуске: скилл, номер
фазы, пути документов, соседи, стоп фазы, worktree **вне** репо
(`…/wt-phase-<N>`), «не пушь», «Server не убивай», отчёт из phase-work.
Замена зависшего — существующая ветка в промпте, не пустой `git branch --list`.
Ветка фазы — `git branch phase/<N>-<slug> main` (не от HEAD). 🔄 только на
`main`: если IDE на `bug/…`, одноразовый worktree `wt-claim-main`, не коммит в
дерево пользователя. После `worktree add` правки — абсолютным путём worktree.
Шаблон: [`worker-prompt.md`](worker-prompt.md).
## Чего не делать
- Писать код фазы, бага или side-work в этом чате.
- Запускать разработчика на фазу с открытой зависимостью «чтобы прогрелось».
- Двух `/phase-work` на один номер.
- Ревьюера вместо единственного свободного разработчика, если слот один и
есть ⬜ с закрытыми зависимостями — сначала код.
- Автопродолжения после «остановись» / «последняя волна».
- `git push`.
- Переставлять чужие 🔄/✅ (замена зависшего 🔄 не трогает: статус тот же).
- Снимать чужой `merge/lock` или `checkout` основного дерева с `bug/…` на `main`.
- Коммитить 🔄 фазы в дерево `bug/…` или править код фазы в корне IDE.
- Заканчивать ответ без списка агентов (ниже).
## Список агентов
**Последний блок каждого ответа** пользователю — кто сейчас жив. Даже если
в этом ходе никого не запускал и даже если только спросил «можно stash?».
Не прятать в середину отчёта.
| Имя | Роль | Статус |
| --- | --- | --- |
| [Имя](id) | разработчик 32 / merge 36 / ревьюер 29–31 | пишет / сливает / ждёт lock / завис / WIP на паузе |
Пусто — одна строка: «агентов нет».