Update SKILL documentation for phase and bug workflows. Clarified branch creation commands to specify main instead of HEAD, emphasized the importance of not committing phase changes to the bug tree, and provided detailed instructions for managing worktrees and agent interactions. Enhanced clarity on handling dependencies and worktree paths to prevent conflicts.
ci / server (push) Failing after 3m36s
ci / client (push) Successful in 20s

This commit is contained in:
Leonid Pershin
2026-08-20 10:29:56 +03:00
parent b14d27dd81
commit 9c49c8b3a6
7 changed files with 82 additions and 28 deletions
+3 -2
View File
@@ -70,8 +70,9 @@ description: >-
## 4. Работа
Заявка `git branch bug/<N>-<slug>` **до** кода. Новые файлы и 🔄 живут на этой
ветке.
Заявка `git branch bug/<N>-<slug> main` **до** кода (от `main`, не от чужого
HEAD). Новые файлы и 🔄 живут на этой ветке. Не коммить заявку фазы в дерево
бага и наоборот.
Дальше — как [phase-work](../phase-work/SKILL.md), с отличиями:
+13 -3
View File
@@ -49,7 +49,9 @@ N — **одновременные** агенты, не «запусти N и з
## Старт
1. Прочитай `docs/phases/README.md` и `docs/phases/reviewed.md`.
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/*` — заявка уже стоит.
@@ -99,6 +101,7 @@ N — **одновременные** агенты, не «запусти N и з
| Пользователь: пауза, только слияние | interrupt разработчикам: коммит WIP **на своей ветке**, не merge, не main. Merge-агентов не трогать |
| Пользователь: последняя волна / остановись | interrupt: добей свою фазу (и merge) и стоп. **Новых** агентов не запускать, в том числе по completion |
| Пользователь: продолжи | снять паузу с WIP-ветки (`resume` с хешем коммита), не начинать фазу с нуля |
| Агент коммитит в `bug/…` / нет worktree | interrupt: стоп в корне IDE, `worktree add` на уже существующую ветку фазы, 🔄 на `main` через `wt-claim-main`. Историю `bug/…` не revert |
Зависимую ⬜ не открывать, пока зависимость 🔄 или лежит неслитой веткой.
@@ -107,8 +110,10 @@ N — **одновременные** агенты, не «запусти N и з
Транскрипт из 1–2 сообщений («читаю скилл» / `GetMcpTools`) при живом агенте
дольше ~15 минут, или тишина после interrupt — **завис**.
1. `resume` + `interrupt`: брось MCP (`cursor-app-control` не звать), не читай
скилл заново, продолжай с ветки/worktree.
1. `resume` + `interrupt`: брось MCP (`GetMcpTools` на `cursor-app-control` не
звать), не читай скилл заново, продолжай с ветки/worktree. Корень IDE не
трогай. Если worktree нет — `git worktree add` на существующую `phase/<N>-*`,
не создавай вторую ветку.
2. Второй раз — старый: «уступи, git не трогай». Новый агент — **продолжение**
того же 🔄: та же ветка и worktree, промпт «замена зависшего». Это не новый
захват ⬜ и не второй автор.
@@ -145,6 +150,10 @@ N — **одновременные** агенты, не «запусти N и з
Замена зависшего — существующая ветка в промпте, не пустой `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).
## Чего не делать
@@ -158,6 +167,7 @@ N — **одновременные** агенты, не «запусти N и з
- `git push`.
- Переставлять чужие 🔄/✅ (замена зависшего 🔄 не трогает: статус тот же).
- Снимать чужой `merge/lock` или `checkout` основного дерева с `bug/…` на `main`.
- Коммитить 🔄 фазы в дерево `bug/…` или править код фазы в корне IDE.
- Заканчивать ответ без списка агентов (ниже).
## Список агентов
+10 -2
View File
@@ -15,8 +15,9 @@
## MCP
`GetMcpTools` на `cursor-app-control` и ожидание echovault держали агента
полчаса. В промпте: **не звать cursor-app-control**; memory — один раз или
без неё.
полчаса. В промпте: **не открывай этот сервер через `GetMcpTools`**. После
готового worktree можно один `move_agent_to_root` с известной схемой
`{ rootPath }`. Memory — один раз или без неё.
## Interrupt
@@ -36,6 +37,13 @@
Первая сборка в worktree длинная — это не завис.
`git branch phase/<N>-<slug>` без `main` берёт HEAD IDE. Коммит 🔄 «в основном
дереве» на `bug/…` оставляет заявку в истории бага, а worktree иногда так и не
появляется — агент пишет фазу в дерево пользователя. Лечение: interrupt, не
`checkout`, `worktree add` на уже существующую `phase/<N>-*`, 🔄 донести на
`main` через `wt-claim-main`. Коммиты на `bug/…` не revert. Правки после
захвата — только абсолютным путём worktree.
## Грязный main и чужая ветка
`merge/lock` общий: фаза, баг, ревью, side. Чужой — ждать, не снимать.
+18 -8
View File
@@ -8,8 +8,10 @@
трогали `src/HSchool.Client`. `HSchool.AppHost.Tests` — только HTTP / сокет / хост.
Общее во все промпты: не пушь; `HSchool.Server` не убивай; dev-сервер не
поднимай; `cursor-app-control` не вызывай; memory — один раз или без неё;
stash с пометкой portraits / чужой wip не pop.
поднимай; `GetMcpTools` на `cursor-app-control` не зови (висит). После
`worktree add` можно один `move_agent_to_root` с `rootPath` = путь worktree,
без открытия сервера; иначе все правки — абсолютным путём worktree.
Memory — один раз или без неё; stash с пометкой portraits / чужой wip не pop.
## Разработчик — новый захват ⬜
@@ -30,10 +32,16 @@ Windows Vitest: при падении параллели — `--maxWorkers=1`.
Застолбить до кода:
1. git branch --list "phase/<N>-*" — пусто, иначе стоп (это чужой захват).
2. git branch phase/<N>-<slug>
3. 🔄 в README основного дерева, отдельный коммит только этой строки.
Занятость: `git show main:docs/phases/README.md`, не рабочую копию IDE.
2. git branch phase/<N>-<slug> main
От **main**, не от HEAD (HEAD часто bug/…). Не checkout основного дерева.
3. 🔄 в README **на main**, отдельный коммит только этой строки.
Дерево уже на main — коммить там. Иначе: worktree add <scratch>/wt-claim-main
main, коммит там, worktree remove. В bug/… не коммить и не revert чужое.
4. git worktree add <scratch>/wt-phase-<N> phase/<N>-<slug>
Клиент: npm ci или копия node_modules (не рекурсивно в себя).
5. Дальше только этот worktree: абсолютные пути / working_directory. Корень
IDE не трогать (ни Write, ни git commit).
Задачи и обязательные тесты — как в файле фазы целиком.
Гоняй только проект(ы) из Testing policy в AGENTS.md, `--filter` на новый
@@ -61,12 +69,12 @@ HTTP/протокол — docs/protocol.md тем же коммитом; вер
Следуй `.claude/skills/phase-work/SKILL.md`. Блок «Как застолбить» пропусти.
Фаза: **<N>. <имя>**. Ветка уже есть: **phase/<N>-<slug>**.
Worktree: <путь>/wt-phase-<N> — работай там.
Worktree: <путь>/wt-phase-<N> — работай там (абсолютные пути).
🔄 не сбрасывай и вторую ветку не создавай. `git branch --list "phase/<N>-*"`
не обязан быть пустым — это не гонка.
Не начинай фазу с нуля. Брось MCP (cursor-app-control не звать).
Дочитай незакоммиченное в worktree, не выкидывай его.
Не начинай фазу с нуля. Брось MCP (`GetMcpTools` на cursor-app-control не звать).
Корень IDE / bug/… не трогай. Дочитай незакоммиченное в worktree, не выкидывай его.
Дальше — как обычный разработчик: задачи фазы, тесты по Testing policy
(`--filter`, не весь solution), слияние по скиллу (грязный main / не на
@@ -115,7 +123,9 @@ phase-work; stash — только если ниже явно сказано, ч
<X><Y> (этап <A> среза <имя>), не весь срез и не следующий.
Свой заголовок в docs/phases/reviewed.md. Чужие разделы журнала не затирай.
Ветка review/<slug>, worktree вне репо: <scratch>/wt-review-<slug>.
Ветка `git branch review/<slug> main` (от main, не от HEAD).
Worktree вне репо: <scratch>/wt-review-<slug> — дальше только его пути.
Журнал коммить в этом worktree, не в bug/… пользователя.
Слияние как у phase-work: merge/lock общий, --no-ff, не пушь.
Основное дерево уже на main; не checkout bug/….
Тесты — Testing policy, `--filter`, не весь solution.
+5 -4
View File
@@ -57,10 +57,11 @@ description: Ревью срезов и фаз проекта h-school по их
а не получит через час одну кучу правок в семи проектах.
`/phase-orch` мог отдать **часть** среза (этап A, фазы 29–31). Это всё ещё один проход: только
эти фазы, свой заголовок в журнале, ветка `review/<slug>`, worktree вне репо, слияние как у
`/phase-work` (`merge/lock` общий с фазами и багами — чужой не снимать; `--no-ff`; не пушь;
основное дерево уже на `main`, не `checkout` `bug/…`). Чужой раздел `reviewed.md` не затирай.
Следующий срез сам не бери. Два ревьюера на один и тот же этап не садятся.
эти фазы, свой заголовок в журнале, ветка `git branch review/<slug> main` (не от HEAD), worktree
вне репо, дальше абсолютные пути этого worktree — журнал не коммитить в `bug/…` пользователя.
Слияние как у `/phase-work` (`merge/lock` общий с фазами и багами — чужой не снимать; `--no-ff`;
не пушь; основное дерево уже на `main`, не `checkout` `bug/…`). Чужой раздел `reviewed.md` не
затирай. Следующий срез сам не бери. Два ревьюера на один и тот же этап не садятся.
## Что именно проверять
+31 -8
View File
@@ -39,26 +39,41 @@ description: Берёт ровно одну фазу из среза в docs/pha
**пропусти**: ветку не создавай, 🔄 не сбрасывай, садись в существующий
worktree. «already exists» здесь не гонка.
Ветка — и есть заявка, потому что git не даст создать её дважды:
Ветка — и есть заявка, потому что git не даст создать её дважды. Указывай **`main`**, не текущий
HEAD: IDE пользователя часто стоит на `bug/…`, и ветка от HEAD утащит фазу на чужую историю.
```bash
git branch phase/25-golden-fixtures
git branch phase/25-golden-fixtures main
```
Команда упала с «already exists» — значит фазу взял другой агент между твоей проверкой и попыткой.
Не спорь, вернись к выбору и возьми следующую.
Ветка создалась — фаза твоя. Сразу пометь её 🔄 в `docs/phases/README.md` **в основном дереве**,
отдельным коммитом, состоящим только из этой строки. Это единственная правка, которую ты делаешь
вне своего worktree, и она нужна по двум причинам: соседние агенты видят занятое, а пустая свежая
ветка ещё ничем не отличается от слитой — по ней одной понять, что фаза в работе, нельзя.
Ветка создалась — фаза твоя. Сразу пометь её 🔄 в `docs/phases/README.md` **на `main`**, отдельным
коммитом из одной этой строки. Соседи читают занятость с `main`, а пустая свежая ветка ещё ничем
не отличается от слитой — по ней одной понять, что фаза в работе, нельзя.
Пометить 🔄 надо **до** первой строчки кода, а не после.
Как доставить этот коммит, зависит от основного дерева (`git -C <корень> branch --show-current`):
- дерево **уже на `main`** — правь README там и коммить. Это единственная правка вне своего
worktree фазы.
- дерево на `bug/…` или другой ветке пользователя — **не** `checkout`, **не** коммить в это
дерево. Одноразовый worktree `main`:
```bash
git worktree add <scratch>/wt-claim-main main
# README ⬜→🔄, commit, затем:
git worktree remove <scratch>/wt-claim-main
```
Пометить 🔄 надо **до** первой строчки кода, а не после. Коммит «Mark phase N…», который уже
уехал в `bug/…`, не revertь и не переписывай историю пользователя — доведи 🔄 на `main` через
`wt-claim-main` (cherry-pick, если коммит тот же).
## Где работать
В своём worktree, а не в общем дереве. Иначе два агента правят одни файлы и роняют друг другу
сборку.
сборку — или, хуже, пишут код фазы в `bug/…` пользователя.
```bash
git worktree add <путь-в-scratchpad>/wt-phase-25 phase/25-golden-fixtures
@@ -67,6 +82,14 @@ git worktree add <путь-в-scratchpad>/wt-phase-25 phase/25-golden-fixtures
Путь — **вне репозитория**; каталог scratchpad этой сессии подходит. Worktree внутри репозитория
засоряет `git status` и попадёт в глаза следующему ревью.
Cursor workspace по умолчанию — корень IDE, не этот worktree. После `worktree add` каждый
`Read` / `Write` / `StrReplace` / `Shell` идёт **абсолютным путём** (или `working_directory`)
внутрь `…/wt-phase-25`. Относительный `docs/phases/README.md` пишется в ветку, которую сейчас
держит пользователь. `git add` / `commit` без `-C` worktree — то же самое.
Занятость чужих фаз читай так: `git show main:docs/phases/README.md` и
`git branch --list "phase/*"` — не рабочую копию на `bug/…`.
Дальше вся работа там. В конце worktree удаляется (`git worktree remove --force`), ветка остаётся.
Что нужно знать про worktree:
+2 -1
View File
@@ -64,7 +64,8 @@ description: >-
Прочитай [phase-work](../phase-work/SKILL.md) и следуй ему.
Отличия: фазу ты завёл сам; заявка `git branch phase/<N>-<slug>` **до** кода;
Отличия: фазу ты завёл сам; заявка `git branch phase/<N>-<slug> main` **до** кода
(от `main`, не от HEAD);
тесты — как Testing policy в `AGENTS.md`, не весь solution;
новые файлы и 🔄 живут на этой ветке. `merge/lock` общий с фазами, багами и
ревью. Один цикл — одна фаза. «Сделай всё» — по порядку, каждая своим циклом `/phase-work`. Независимые фазы