Update AGENTS.md and various SKILL.md files to improve documentation structure, clarify design phase references, and ensure consistency in file paths. Adjust links to design documents for better navigation and organization across phases.
ci / server (push) Failing after 3m41s
ci / client (push) Successful in 21s

This commit is contained in:
Leonid Pershin
2026-08-20 12:26:21 +03:00
parent a37a5eb82d
commit 9a6cbff55a
30 changed files with 116 additions and 95 deletions
+2 -2
View File
@@ -18,8 +18,8 @@ description: >-
## Когда это, а когда нет
Прочитай `docs/bugs/README.md`, `docs/phases/README.md` и инварианты в
`AGENTS.md`.
Прочитай `docs/bugs/README.md` и инварианты в `AGENTS.md`. Оглавление фаз
(`docs/phases/README.md`) — только если нужно отличить баг от открытой ⬜.
- Уже стоит ⬜/🔄 в индексе багов — бери его, не заводи второй.
- Это ещё не сделанная фаза в `docs/phases/` — скажи и отдай `/phase-work`.
+8 -6
View File
@@ -50,9 +50,10 @@ N — **одновременные** агенты, не «запусти N и з
## Старт
1. Прочитай `docs/phases/README.md` и `docs/phases/reviewed.md`. Если IDE не
на `main` — статусы с `git show main:docs/phases/README.md`, не с рабочей
копии (там может быть чужой 🔄 из бага).
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/*` — заявка уже стоит.
@@ -88,8 +89,9 @@ N — **одновременные** агенты, не «запусти N и з
не сажай `/bug-work` в слот.
Параллельные разработчики не должны править одни файлы без нужды. В промпте
назови соседа и стоп-границу фазы. Общие `docs/phases/README.md`,
`docs/protocol.md`, `AGENTS.md` — точечно.
назови соседа и стоп-границу фазы. Общие `docs/phases/<slice>/README.md`,
`docs/protocol.md`, `AGENTS.md` — точечно. Каталог `docs/phases/README.md`
трогай только когда появляется новый срез.
## На уведомлении агента
@@ -138,7 +140,7 @@ N — **одновременные** агенты, не «запусти N и з
`stash push -u` **своего** ярлыка, merge, pop только его. Конфликт pop —
оставить stash, не форсировать. **Не** stash’ать незакоммиченное живого
worktree соседа.
- Конфликт README: обе стороны (пришедший ✅ и чужие 🔄/✅).
- Конфликт индекса среза: обе стороны (пришедший ✅ и чужие 🔄/✅).
- `protocol.md`: оставить все блоки (сессия + карточка + темп), не бампить
версию чужой фазы.
- После merge: `branch -d` (не `-D`), снять lock, worktree remove.
+11 -10
View File
@@ -21,10 +21,11 @@ Memory — один раз или без неё; stash с пометкой portr
Репо: <корень>. Сливать только в основном дереве, и только если оно уже на
main (не checkout ветки пользователя bug/…).
Фаза: docs/phases/<файл>.md
Дизайн среза: docs/design/<файл>.md
Фаза: docs/phases/<slice>/<файл>.md
Дизайн среза: docs/design/<slice>/<файл>.md
Инварианты: AGENTS.md
Индекс: docs/phases/README.md — эта фаза сейчас ⬜.
Индекс: docs/phases/<slice>/README.md — эта фаза сейчас ⬜.
Чужие срезы, сводку reviewed.md и оглавление дальше таблицы не читать.
Соседи (🔄 / параллельно): <номера и чего не трогать>.
Стоп фазы: <из её файла>.
@@ -32,10 +33,10 @@ Windows Vitest: при падении параллели — `--maxWorkers=1`.
Застолбить до кода:
1. git branch --list "phase/<N>-*" — пусто, иначе стоп (это чужой захват).
Занятость: `git show main:docs/phases/README.md`, не рабочую копию IDE.
Занятость: `git show main:docs/phases/<slice>/README.md`, не рабочую копию IDE.
2. git branch phase/<N>-<slug> main
От **main**, не от HEAD (HEAD часто bug/…). Не checkout основного дерева.
3. 🔄 в README **на main**, отдельный коммит только этой строки.
3. 🔄 в индексе среза **на main**, отдельный коммит только этой строки.
Дерево уже на main — коммить там. Иначе: worktree add <scratch>/wt-claim-main
main, коммит там, worktree remove. В bug/… не коммить и не revert чужое.
4. git worktree add <scratch>/wt-phase-<N> phase/<N>-<slug>
@@ -46,15 +47,15 @@ Windows Vitest: при падении параллели — `--maxWorkers=1`.
Задачи и обязательные тесты — как в файле фазы целиком.
Гоняй только проект(ы) из Testing policy в AGENTS.md, `--filter` на новый
класс. Весь solution не гонять.
Общие файлы (README фаз, protocol.md, AGENTS.md) — точечно.
Общие файлы (индекс среза, protocol.md, AGENTS.md) — точечно. Каталог срезов не трогать.
HTTP/протокол — docs/protocol.md тем же коммитом; версию сокета не бампить,
если фаза этого не требует.
Слияние по скиллу: убрать worktree, merge/lock (общий: фаза/баг/ревью/side;
чужой — ждать, не снимать), merge --no-ff, конфликт README — обе стороны.
чужой — ждать, не снимать), merge --no-ff, конфликт индекса среза — обе стороны.
Грязный main или дерево не на main — не сливать, не checkout, снять lock,
отчёт. Stash сам не делай.
✅ в README — последним коммитом ветки, только строка статуса.
✅ в индексе среза — последним коммитом ветки, только строка статуса.
Не сливай чужие ветки.
Отчёт: фаза и ветка; задачи; тесты списком; какой проект прогнал; незакрытое; слита ли.
@@ -106,7 +107,7 @@ phase-work; stash — только если ниже явно сказано, ч
<или:>
Грязный main — не stash, снять lock, отчёт.
Конфликт README — обе стороны. protocol.md — не выкидывать чужие блоки.
Конфликт индекса среза — обе стороны. protocol.md — не выкидывать чужие блоки.
После успеха: branch -d (не -D), снять lock, worktree remove.
Не пушь. HSchool.Server не убивай. Весь solution не гонять: конфликт только
в статусе — тесты не нужны; в коде — узкий проект из Testing policy.
@@ -122,7 +123,7 @@ phase-work; stash — только если ниже явно сказано, ч
Следуй `.claude/skills/phase-review/SKILL.md`. Один проход — только фазы
<X><Y> (этап <A> среза <имя>), не весь срез и не следующий.
Свой заголовок в docs/phases/reviewed.md. Чужие разделы журнала не затирай.
Свой заголовок в docs/phases/<slice>/reviewed.md. Чужие срезы не открывать.
Ветка `git branch review/<slug> main` (от main, не от HEAD).
Worktree вне репо: <scratch>/wt-review-<slug> — дальше только его пути.
Журнал коммить в этом worktree, не в bug/… пользователя.
+8 -6
View File
@@ -1,6 +1,6 @@
---
name: phase-review
description: Ревью срезов и фаз проекта h-school по их же критериям приёмки — с дописыванием недостающих тестов, исправлением найденного и журналом проверенного в docs/phases/reviewed.md. Обязательно используй этот скилл, когда просят «сделай ревью», «проведи ревью», «проверь срез», «проверь непроверенные срезы», «что ещё не проверено», «review the slice» — и вообще при любой просьбе проверить, действительно ли сделанная фаза сделана. Не для ревью одного диффа или пул-реквеста: там нужен /code-review. Не для волны разработчиков — /phase-orch (он может запустить этот скилл как одного из агентов). Не для планирования нового среза — /slice-work.
description: Ревью срезов и фаз проекта h-school по их же критериям приёмки — с дописыванием недостающих тестов, исправлением найденного и журналом проверенного в docs/phases/<slice>/reviewed.md. Обязательно используй этот скилл, когда просят «сделай ревью», «проведи ревью», «проверь срез», «проверь непроверенные срезы», «что ещё не проверено», «review the slice» — и вообще при любой просьбе проверить, действительно ли сделанная фаза сделана. Не для ревью одного диффа или пул-реквеста: там нужен /code-review. Не для волны разработчиков — /phase-orch (он может запустить этот скилл как одного из агентов). Не для планирования нового среза — /slice-work.
---
# Ревью срезов
@@ -16,8 +16,9 @@ description: Ревью срезов и фаз проекта h-school по их
## Журнал
`docs/phases/reviewed.md` единственный источник правды о том, что уже проверено. Если файла
нет, создай его с заголовком и одной строкой о том, что это такое.
`docs/phases/<slice>/reviewed.md` — правда о проверке **этого** среза. Сводка ссылок —
короткий `docs/phases/reviewed.md`. Чужие журналы не читать. Если файла среза нет, создай
его и добавь строку в сводку.
Раздел на срез:
@@ -38,8 +39,9 @@ description: Ревью срезов и фаз проекта h-school по их
## Как выбрать, что проверять
1. Прочитай `docs/phases/README.md` — там срезы, их фазы и статусы.
2. Прочитай журнал.
1. Оглавление `docs/phases/README.md` и сводка `docs/phases/reviewed.md` — только чтобы выбрать
срез. Дальше — индекс, фазы и `reviewed.md` **этой** папки, не остальные.
2. Прочитай журнал этого среза.
3. Срез попадает в очередь, если:
- его нет в журнале; **или**
- `git log <коммит-из-журнала>..HEAD -- <пути среза>` непустой — код менялся после проверки;
@@ -80,7 +82,7 @@ description: Ревью срезов и фаз проекта h-school по их
**3. «Things that will bite you».** Этот раздел `AGENTS.md` — список уже случившихся регрессий.
Проверить, что ни одна не вернулась, дешевле, чем поймать её второй раз.
**4. Дизайн-док среза** (`docs/design/*.md`, ссылка есть в индексе фаз). Расхождение кода с
**4. Дизайн-док среза** (`docs/design/<slice>/`, ссылка есть в индексе среза). Расхождение кода с
принятым решением — находка, даже если тесты зелёные. Но сначала спроси себя, не устарел ли док:
бывает, что решение сознательно поменяли, и тогда чинить надо документ.
+16 -11
View File
@@ -22,13 +22,18 @@ description: Берёт ровно одну фазу из среза в docs/pha
**Номера нет** — выбираешь сам. Волну «запусти троих» так не раздавай — это `/phase-orch`.
1. Читаешь `docs/phases/README.md`: находишь первый срез, где есть ⬜.
2. Внутри среза берёшь первую ⬜, у которой закрыты зависимости — они перечислены в шапке фазы.
1. `rg "⬜" docs/phases/*/README.md` — не читай индексы всех срезов. Оглавление
`docs/phases/README.md` — каталог папок, без таблиц фаз.
2. В первом срезе с ⬜ берёшь первую ⬜, у которой закрыты зависимости — они в шапке фазы.
3. Проверяешь, что её никто не взял: `git branch --list "phase/<номер>-*"` пусто.
**Статус в `README.md` — первый источник правды, ветка — только арбитр гонки.** 🔄 значит занято,
✅ значит сделано, ⬜ значит свободно. Ветка может существовать и при ✅ — её просто не убрали после
слияния; это не заявка, а мусор, см. «Кто убирает ветку».
Номер дали — файл `docs/phases/*/<N>-*.md`. Читай его, `README.md` этой папки и дизайн
среза по ссылке в индексе. Чужие срезы и `reviewed.md` не открывать.
**Статус в индексе среза (`docs/phases/<slice>/README.md`) — первый источник правды, ветка —
только арбитр гонки.** 🔄 значит занято, ✅ значит сделано, ⬜ значит свободно. Ветка может
существовать и при ✅ — её просто не убрали после слияния; это не заявка, а мусор, см.
«Кто убирает ветку».
Фаза 🔄 — чужая работа в процессе. Не трогай её, даже если кажется, что там застряли —
кроме случая выше: номер передали и ветка уже есть, тебя посадили продолжить.
@@ -49,7 +54,7 @@ git branch phase/25-golden-fixtures main
Команда упала с «already exists» — значит фазу взял другой агент между твоей проверкой и попыткой.
Не спорь, вернись к выбору и возьми следующую.
Ветка создалась — фаза твоя. Сразу пометь её 🔄 в `docs/phases/README.md` **на `main`**, отдельным
Ветка создалась — фаза твоя. Сразу пометь её 🔄 в `docs/phases/<slice>/README.md` **на `main`**, отдельным
коммитом из одной этой строки. Соседи читают занятость с `main`, а пустая свежая ветка ещё ничем
не отличается от слитой — по ней одной понять, что фаза в работе, нельзя.
@@ -84,10 +89,10 @@ git worktree add <путь-в-scratchpad>/wt-phase-25 phase/25-golden-fixtures
Cursor workspace по умолчанию — корень IDE, не этот worktree. После `worktree add` каждый
`Read` / `Write` / `StrReplace` / `Shell` идёт **абсолютным путём** (или `working_directory`)
внутрь `…/wt-phase-25`. Относительный `docs/phases/README.md` пишется в ветку, которую сейчас
внутрь `…/wt-phase-25`. Относительный `docs/phases/<slice>/README.md` пишется в ветку, которую сейчас
держит пользователь. `git add` / `commit` без `-C` worktree — то же самое.
Занятость чужих фаз читай так: `git show main:docs/phases/README.md` и
Занятость чужих фаз читай так: `git show main:docs/phases/<slice>/README.md` и
`git branch --list "phase/*"` — не рабочую копию на `bug/…`.
Дальше вся работа там. В конце worktree удаляется (`git worktree remove --force`), ветка остаётся.
@@ -184,7 +189,7 @@ git -C <корень> merge --no-ff phase/25-golden-fixtures
`--no-ff` — чтобы фаза осталась видимой в истории одним куском, а не растворилась в линии.
**5. Конфликты разрешай только те, что понимаешь.** Почти всегда это строка статуса в
`docs/phases/README.md` — там обе стороны правы, надо оставить обе. Конфликт в коде, смысл
`docs/phases/<slice>/README.md` — там обе стороны правы, надо оставить обе. Конфликт в коде, смысл
которого тебе неясен, — `git merge --abort`, снять замок, оставить ветку и написать в отчёте, с
чем именно она не сходится.
@@ -235,8 +240,8 @@ git branch --merged main --list "phase/*" --format="%(refname:short)"
работай там, статус не возвращай в ⬜.
- **Не меняй молча** версию протокола, форму сейва и публичное поведение API — даже когда это
очевидно правильно. Если фаза этого требует, так и написано в её задачах.
- **Общие файлы трогай минимально.** `AGENTS.md`, `docs/protocol.md`, `README.md` правят все ветки
сразу — чем точечнее правка, тем дешевле слияние.
- **Общие файлы трогай минимально.** `AGENTS.md`, `docs/protocol.md` правят все ветки сразу.
Индекс — только свой `docs/phases/<slice>/README.md`. Каталог срезов не трогать.
## Окружение: что укусит
+18 -14
View File
@@ -22,10 +22,11 @@ description: >-
## 1. Обсуждение
Прочитай `docs/phases/README.md`, `docs/bugs/README.md`, инварианты в
`AGENTS.md` и затронутые дизайн-доки. Это уже чья-то фаза в индексе — скажи
и отдай `/phase-work`. Регрессия уже сделанного — `/bug-work`. Этапы, новый
кусок игры, остановка посередине целой школой — `/slice-work`.
Прочитай оглавление `docs/phases/README.md` (не индексы всех срезов),
`docs/bugs/README.md`, инварианты в `AGENTS.md` и **только** затронутый
дизайн. Это уже чья-то фаза — скажи и отдай `/phase-work`. Регрессия уже
сделанного — `/bug-work`. Этапы, новый кусок игры, остановка посередине
целой школой — `/slice-work`.
Два–пять вопросов, два–три варианта, **рекомендация обязательна**. Спросить
только форму: что увидит игрок; протокол / HTTP / сейв; какой инвариант; одна
@@ -40,23 +41,26 @@ description: >-
**Новый срез** — не этот скилл, [slice-work](../slice-work/SKILL.md).
**Мелкое** (дырка, одна кнопка, DX, склейка живых систем) — фаза в секции
**«Вне очереди»** в конце индекса. Это срез без номера, чтобы не спорить со
следующим именованным. Дизайн `##` в `docs/design/off-queue.md`; файла нет —
заведи с заголовком, зачем он.
**Мелкое** (дырка, одна кнопка, DX, склейка живых систем) — фаза в
`docs/phases/off-queue/`. Это срез без номера, чтобы не спорить со следующим
именованным. Дизайн новой темы — **новый файл**
`docs/design/off-queue/<slug>.md`, не дописывать в чужой файл темы. Строка в
`docs/design/off-queue/README.md`.
Номер фазы: максимум по `docs/phases/*.md` и индексу, плюс один, затем
`git branch --list "phase/<N>-*"`. Занято — следующий. Гонку ловят ветки, не
индекс: у новой фазы на `main` строки ещё нет.
Номер фазы: максимум по именам `docs/phases/*/<NN>-*.md` (не README, не
reviewed), плюс один, затем `git branch --list "phase/<N>-*"`. Занято —
следующий. Гонку ловят ветки, не индекс: у новой фазы на `main` строки ещё нет.
## 3. Документы
Как у соседней фазы, не новый жанр. Каркас тот же: Зависимости, Зачем, Задачи,
Тесты без которых фаза не закрыта, Критерий готовности, Стоп.
Как у соседней фазы в `off-queue/`, не новый жанр. Каркас тот же: Зависимости,
Зачем, Задачи, Тесты без которых фаза не закрыта, Критерий готовности, Стоп.
Файл — `docs/phases/off-queue/<N>-<slug>.md`.
«Тесты…» — контракт для `/phase-review`: каждый пункт станет отдельным тестом
по Testing policy в `AGENTS.md`. Дизайн: зачем; «Было / Стало / Почему», если
меняется принятое; что не входит. Индекс — новая строка, статус ⬜.
меняется принятое; что не входит. Индекс — новая строка в
`docs/phases/off-queue/README.md`, статус ⬜. Общий каталог срезов не трогать.
Протокол, HTTP, сейв — назвать явно. Версию не бампать: это коммит с кодом.
+18 -13
View File
@@ -19,8 +19,9 @@ description: >-
## Когда это
Прочитай `docs/phases/README.md`, `docs/bugs/README.md`, инварианты в
`AGENTS.md` и соседние дизайн-доки.
Прочитай оглавление `docs/phases/README.md` (не индексы всех срезов),
`docs/bugs/README.md`, инварианты в `AGENTS.md` и **только** дизайн-доки,
на которые срез опирается.
- Уже чья-то фаза в индексе — скажи и отдай `/phase-work`.
- Регрессия уже сделанного — `/bug-work`.
@@ -54,15 +55,18 @@ description: >-
Срез: максимум именованного в индексе, плюс один.
Фазы: максимум по `docs/phases/*.md` и индексу, плюс один, затем
`git branch --list "phase/<N>-*"`. Занято — следующий. Гонку ловят ветки,
не индекс: у новой фазы на `main` строки ещё нет.
Фазы: максимум по именам `docs/phases/*/<NN>-*.md` (не README, не reviewed),
плюс один, затем `git branch --list "phase/<N>-*"`. Занято — следующий.
Гонку ловят ветки, не индекс: у новой фазы на `main` строки ещё нет.
## 3. Документы
Как у соседа (`social.md`, `session.md`, `inventory.md`), не новый жанр.
Как у соседа по папке (`09-social/`, `08-session/`, `07-inventory/`), не новый жанр.
`docs/design/<slug>.md`:
Папки: `docs/design/<NN>-<slug>/` и `docs/phases/<NN>-<slug>/`. NN — номер
среза с ведущим нулём (`11-…`). «Вне очереди» номер среза не занимает.
`docs/design/<NN>-<slug>/<slug>.md` (если доков несколько — как у `01-shell/`):
- шапка: договорённость на срез, не текущий код; ссылки на соседние доки;
- зачем, что увидит игрок, на какие вопросы отвечает, чего **нет**;
@@ -73,13 +77,14 @@ description: >-
- «Заведомо не сейчас»;
- «Зафиксировано этим разговором».
Фазы — как у соседней, не короче бага: Зависимости, Зачем, Задачи, Тесты
без которых фаза не закрыта, Критерий готовности, Стоп. Галочки все `[ ]`.
«Тесты…» — контракт для `/phase-review`: каждый пункт станет отдельным
тестом по Testing policy в `AGENTS.md`.
Фазы — `docs/phases/<NN>-<slug>/<M>-<phase-slug>.md`, как у соседней, не короче
бага: Зависимости, Зачем, Задачи, Тесты без которых фаза не закрыта, Критерий
готовности, Стоп. Галочки все `[ ]`. «Тесты…» — контракт для `/phase-review`:
каждый пункт станет отдельным тестом по Testing policy в `AGENTS.md`.
Индекс — новая секция **перед** «Вне очереди», все ⬜, этапы как у 7–9.
Куда ходят люди — строка в Orientation `AGENTS.md`.
Индекс среза — `docs/phases/<NN>-<slug>/README.md` с таблицей фаз, все ⬜,
этапы как у 7–9. В общий `docs/phases/README.md`**одна строка** в таблицу,
без копипасты фаз. Куда ходят люди — строка в Orientation `AGENTS.md`.
Протокол, HTTP, сейв — назвать явно. Версию не бампать: это коммит с кодом.
🔄 не ставить: фазы ещё никто не взял.