--- name: phase-orch description: >- Оркестрирует параллельных агентов /phase-work и /phase-review по графу фаз в docs/phases/. Аргумент — целевая ширина волны: `/phase-orch 2-3`, `/phase-orch 3`. Используй при «запусти N разработчиков», «веди срез», «оркестрация», «раздели срез между агентами и следи», «продолжай волну». Не пишет код фаз сам. Не для одной фазы (/phase-work), одного бага (/bug-work), задачи вне среза (/side-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` | Независимые side-фазы параллельно — тоже этот скилл (так уже сказано в side-work). Слоты волны багами не заполнять. ## Аргумент `/phase-orch` или `/phase-orch 2-3` или `/phase-orch 3`. | Запись | Цель | | --- | --- | | нет числа | **2–3** слота | | `N` | ровно **N**, если граф даёт; иначе сколько даёт, остаток — ревью | | `A-B` | держать **от A до B** живых агентов | N — **одновременные** агенты, не «запусти N и забудь». Пять слотов при двух независимых ⬜ — это два разработчика, не пять простаивающих. Потолок без явной просьбы — **4**. Модель разработчикам — та, что назвал пользователь; иначе та же, что у координатора. ## Старт 1. Прочитай `docs/phases/README.md` и `docs/phases/reviewed.md`. Если IDE не на `main` — статусы с `git show main:docs/phases/README.md`, не с рабочей копии (там может быть чужой 🔄 из бага). 2. Посчитай, сколько ⬜ с **закрытыми** зависимостями (шапка фазы). 🔄 не бери как новый захват. 3. Проверь `git branch --list "phase/*"` и `review/*` — заявка уже стоит. 4. Запусти первую волну (см. «Чем занять слот»). Каждому разработчику — **номер фазы** в промпте, чтобы не гонялись за одной ⬜. 5. **Стоп координатора до уведомления.** Не делай работу агента в foreground. Не полли транскрипты без сигнала («завис», «продолжай», completion). Каждый ответ пользователю **заканчивай** списком живых агентов (см. ниже). Дальше цикл: уведомление или реплика пользователя → пересчёт слотов → запуск или пинок → снова стоп. ## Чем занять слот Порядок. Следующий пункт — только если предыдущий не набрал ширину волны. 1. **Разработчик** на ⬜ с закрытыми зависимостями, без ветки `phase/-*`. Один агент — одна фаза, промпт «новый захват» из [`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/README.md`, `docs/protocol.md`, `AGENTS.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/-*`, не создавай вторую ветку. 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 соседа. - Конфликт README: обе стороны (пришедший ✅ и чужие 🔄/✅). - `protocol.md`: оставить все блоки (сессия + карточка + темп), не бампить версию чужой фазы. - После merge: `branch -d` (не `-D`), снять lock, worktree remove. ## Промпт агента Координаторский чат **не виден** субагенту. В каждом запуске: скилл, номер фазы, пути документов, соседи, стоп фазы, worktree **вне** репо (`…/wt-phase-`), «не пушь», «Server не убивай», отчёт из phase-work. Замена зависшего — существующая ветка в промпте, не пустой `git branch --list`. Ветка фазы — `git branch phase/- 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 на паузе | Пусто — одна строка: «агентов нет».