diff --git a/.claude/skills/bug-work/SKILL.md b/.claude/skills/bug-work/SKILL.md index 55fa9e4..742bc19 100644 --- a/.claude/skills/bug-work/SKILL.md +++ b/.claude/skills/bug-work/SKILL.md @@ -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`. diff --git a/.claude/skills/phase-orch/SKILL.md b/.claude/skills/phase-orch/SKILL.md index 92916b8..0ff098f 100644 --- a/.claude/skills/phase-orch/SKILL.md +++ b/.claude/skills/phase-orch/SKILL.md @@ -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//reviewed.md`, не сводку всех срезов. + Если IDE не на `main` — статусы с `git show main:docs/phases//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//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. diff --git a/.claude/skills/phase-orch/worker-prompt.md b/.claude/skills/phase-orch/worker-prompt.md index e7daa68..38af619 100644 --- a/.claude/skills/phase-orch/worker-prompt.md +++ b/.claude/skills/phase-orch/worker-prompt.md @@ -21,10 +21,11 @@ Memory — один раз или без неё; stash с пометкой portr Репо: <корень>. Сливать только в основном дереве, и только если оно уже на main (не checkout ветки пользователя bug/…). -Фаза: docs/phases/<файл>.md -Дизайн среза: docs/design/<файл>.md +Фаза: docs/phases//<файл>.md +Дизайн среза: docs/design//<файл>.md Инварианты: AGENTS.md -Индекс: docs/phases/README.md — эта фаза сейчас ⬜. +Индекс: docs/phases//README.md — эта фаза сейчас ⬜. +Чужие срезы, сводку reviewed.md и оглавление дальше таблицы не читать. Соседи (🔄 / параллельно): <номера и чего не трогать>. Стоп фазы: <из её файла>. @@ -32,10 +33,10 @@ Windows Vitest: при падении параллели — `--maxWorkers=1`. Застолбить до кода: 1. git branch --list "phase/-*" — пусто, иначе стоп (это чужой захват). - Занятость: `git show main:docs/phases/README.md`, не рабочую копию IDE. + Занятость: `git show main:docs/phases//README.md`, не рабочую копию IDE. 2. git branch phase/- main От **main**, не от HEAD (HEAD часто bug/…). Не checkout основного дерева. -3. 🔄 в README **на main**, отдельный коммит только этой строки. +3. 🔄 в индексе среза **на main**, отдельный коммит только этой строки. Дерево уже на main — коммить там. Иначе: worktree add /wt-claim-main main, коммит там, worktree remove. В bug/… не коммить и не revert чужое. 4. git worktree add /wt-phase- phase/- @@ -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`. Один проход — только фазы (этап среза <имя>), не весь срез и не следующий. -Свой заголовок в docs/phases/reviewed.md. Чужие разделы журнала не затирай. +Свой заголовок в docs/phases//reviewed.md. Чужие срезы не открывать. Ветка `git branch review/ main` (от main, не от HEAD). Worktree вне репо: /wt-review- — дальше только его пути. Журнал коммить в этом worktree, не в bug/… пользователя. diff --git a/.claude/skills/phase-review/SKILL.md b/.claude/skills/phase-review/SKILL.md index 75ccc59..0a11a85 100644 --- a/.claude/skills/phase-review/SKILL.md +++ b/.claude/skills/phase-review/SKILL.md @@ -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//reviewed.md. Обязательно используй этот скилл, когда просят «сделай ревью», «проведи ревью», «проверь срез», «проверь непроверенные срезы», «что ещё не проверено», «review the slice» — и вообще при любой просьбе проверить, действительно ли сделанная фаза сделана. Не для ревью одного диффа или пул-реквеста: там нужен /code-review. Не для волны разработчиков — /phase-orch (он может запустить этот скилл как одного из агентов). Не для планирования нового среза — /slice-work. --- # Ревью срезов @@ -16,8 +16,9 @@ description: Ревью срезов и фаз проекта h-school по их ## Журнал -`docs/phases/reviewed.md` — единственный источник правды о том, что уже проверено. Если файла -нет, создай его с заголовком и одной строкой о том, что это такое. +`docs/phases//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//`, ссылка есть в индексе среза). Расхождение кода с принятым решением — находка, даже если тесты зелёные. Но сначала спроси себя, не устарел ли док: бывает, что решение сознательно поменяли, и тогда чинить надо документ. diff --git a/.claude/skills/phase-work/SKILL.md b/.claude/skills/phase-work/SKILL.md index a7a8618..f944204 100644 --- a/.claude/skills/phase-work/SKILL.md +++ b/.claude/skills/phase-work/SKILL.md @@ -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/*/-*.md`. Читай его, `README.md` этой папки и дизайн +среза по ссылке в индексе. Чужие срезы и `reviewed.md` не открывать. + +**Статус в индексе среза (`docs/phases//README.md`) — первый источник правды, ветка — +только арбитр гонки.** 🔄 значит занято, ✅ значит сделано, ⬜ значит свободно. Ветка может +существовать и при ✅ — её просто не убрали после слияния; это не заявка, а мусор, см. +«Кто убирает ветку». Фаза 🔄 — чужая работа в процессе. Не трогай её, даже если кажется, что там застряли — кроме случая выше: номер передали и ветка уже есть, тебя посадили продолжить. @@ -49,7 +54,7 @@ git branch phase/25-golden-fixtures main Команда упала с «already exists» — значит фазу взял другой агент между твоей проверкой и попыткой. Не спорь, вернись к выбору и возьми следующую. -Ветка создалась — фаза твоя. Сразу пометь её 🔄 в `docs/phases/README.md` **на `main`**, отдельным +Ветка создалась — фаза твоя. Сразу пометь её 🔄 в `docs/phases//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//README.md` пишется в ветку, которую сейчас держит пользователь. `git add` / `commit` без `-C` worktree — то же самое. -Занятость чужих фаз читай так: `git show main:docs/phases/README.md` и +Занятость чужих фаз читай так: `git show main:docs/phases//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//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//README.md`. Каталог срезов не трогать. ## Окружение: что укусит diff --git a/.claude/skills/side-work/SKILL.md b/.claude/skills/side-work/SKILL.md index eb9e2e1..bd61f94 100644 --- a/.claude/skills/side-work/SKILL.md +++ b/.claude/skills/side-work/SKILL.md @@ -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/.md`, не дописывать в чужой файл темы. Строка в +`docs/design/off-queue/README.md`. -Номер фазы: максимум по `docs/phases/*.md` и индексу, плюс один, затем -`git branch --list "phase/-*"`. Занято — следующий. Гонку ловят ветки, не -индекс: у новой фазы на `main` строки ещё нет. +Номер фазы: максимум по именам `docs/phases/*/-*.md` (не README, не +reviewed), плюс один, затем `git branch --list "phase/-*"`. Занято — +следующий. Гонку ловят ветки, не индекс: у новой фазы на `main` строки ещё нет. ## 3. Документы -Как у соседней фазы, не новый жанр. Каркас тот же: Зависимости, Зачем, Задачи, -Тесты без которых фаза не закрыта, Критерий готовности, Стоп. +Как у соседней фазы в `off-queue/`, не новый жанр. Каркас тот же: Зависимости, +Зачем, Задачи, Тесты без которых фаза не закрыта, Критерий готовности, Стоп. +Файл — `docs/phases/off-queue/-.md`. «Тесты…» — контракт для `/phase-review`: каждый пункт станет отдельным тестом по Testing policy в `AGENTS.md`. Дизайн: зачем; «Было / Стало / Почему», если -меняется принятое; что не входит. Индекс — новая строка, статус ⬜. +меняется принятое; что не входит. Индекс — новая строка в +`docs/phases/off-queue/README.md`, статус ⬜. Общий каталог срезов не трогать. Протокол, HTTP, сейв — назвать явно. Версию не бампать: это коммит с кодом. diff --git a/.claude/skills/slice-work/SKILL.md b/.claude/skills/slice-work/SKILL.md index 25f1041..dbbe598 100644 --- a/.claude/skills/slice-work/SKILL.md +++ b/.claude/skills/slice-work/SKILL.md @@ -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/-*"`. Занято — следующий. Гонку ловят ветки, -не индекс: у новой фазы на `main` строки ещё нет. +Фазы: максимум по именам `docs/phases/*/-*.md` (не README, не reviewed), +плюс один, затем `git branch --list "phase/-*"`. Занято — следующий. +Гонку ловят ветки, не индекс: у новой фазы на `main` строки ещё нет. ## 3. Документы -Как у соседа (`social.md`, `session.md`, `inventory.md`), не новый жанр. +Как у соседа по папке (`09-social/`, `08-session/`, `07-inventory/`), не новый жанр. -`docs/design/.md`: +Папки: `docs/design/-/` и `docs/phases/-/`. NN — номер +среза с ведущим нулём (`11-…`). «Вне очереди» номер среза не занимает. + +`docs/design/-/.md` (если доков несколько — как у `01-shell/`): - шапка: договорённость на срез, не текущий код; ссылки на соседние доки; - зачем, что увидит игрок, на какие вопросы отвечает, чего **нет**; @@ -73,13 +77,14 @@ description: >- - «Заведомо не сейчас»; - «Зафиксировано этим разговором». -Фазы — как у соседней, не короче бага: Зависимости, Зачем, Задачи, Тесты -без которых фаза не закрыта, Критерий готовности, Стоп. Галочки все `[ ]`. -«Тесты…» — контракт для `/phase-review`: каждый пункт станет отдельным -тестом по Testing policy в `AGENTS.md`. +Фазы — `docs/phases/-/-.md`, как у соседней, не короче +бага: Зависимости, Зачем, Задачи, Тесты без которых фаза не закрыта, Критерий +готовности, Стоп. Галочки все `[ ]`. «Тесты…» — контракт для `/phase-review`: +каждый пункт станет отдельным тестом по Testing policy в `AGENTS.md`. -Индекс — новая секция **перед** «Вне очереди», все ⬜, этапы как у 7–9. -Куда ходят люди — строка в Orientation `AGENTS.md`. +Индекс среза — `docs/phases/-/README.md` с таблицей фаз, все ⬜, +этапы как у 7–9. В общий `docs/phases/README.md` — **одна строка** в таблицу, +без копипасты фаз. Куда ходят люди — строка в Orientation `AGENTS.md`. Протокол, HTTP, сейв — назвать явно. Версию не бампать: это коммит с кодом. 🔄 не ставить: фазы ещё никто не взял. diff --git a/AGENTS.md b/AGENTS.md index f579de3..8187ba0 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -20,16 +20,18 @@ way; this file is *how to work in them*. | connection handling, workers, saves | `src/HSchool.Server` | | what runs locally | `src/HSchool.AppHost/AppHost.cs` | | screens, dialogs, formatting, UI language | `src/HSchool.Client/src` | -| clothing, inventory, climate, dress codes | [`docs/design/inventory.md`](docs/design/inventory.md) — slice 7, phases 29–37; country, wardrobes and weather are live | -| login, who owns a school, watching others | [`docs/design/session.md`](docs/design/session.md) — slice 8, phases 38–39 | -| clock speed buttons and high-speed stride | `src/HSchool.Simulation/ClockSpeed.cs` **and** [`docs/design/session.md`](docs/design/session.md) — phase 40 | -| talks, opinions, fights, romance pack | [`docs/design/social.md`](docs/design/social.md) — slice 9, phases 41–47 | -| lesson consequences (teacher present, skill, warmth, textbook, weather commute) | [`docs/design/off-queue.md`](docs/design/off-queue.md) — phases 48, 50–53 | -| layer tests, client tsc-in-test, worker/card splits, dump nodes | [`docs/design/craft.md`](docs/design/craft.md) — slice 10, phases 56–59 | +| clothing, inventory, climate, dress codes | [`docs/design/07-inventory/`](docs/design/07-inventory/inventory.md) — slice 7, phases 29–37 | +| login, who owns a school, watching others | [`docs/design/08-session/`](docs/design/08-session/session.md) — slice 8, phases 38–39 | +| clock speed buttons and high-speed stride | `src/HSchool.Simulation/ClockSpeed.cs` **and** [`session.md`](docs/design/08-session/session.md) — phase 40 | +| talks, opinions, fights, romance pack | [`docs/design/09-social/`](docs/design/09-social/social.md) — slice 9, phases 41–47 | +| lesson consequences (teacher present, skill, warmth, textbook, weather commute) | [`docs/design/off-queue/lesson-consequences.md`](docs/design/off-queue/lesson-consequences.md) — phases 48, 50–53 | +| layer tests, client tsc-in-test, worker/card splits, dump nodes | [`docs/design/10-craft/`](docs/design/10-craft/craft.md) — slice 10, phases 56–59 | | a bug in already-shipped behaviour | `.claude/skills/bug-work` — document in `docs/bugs/`, discuss only if the fix has a fork, then patch | -| a task that is not in any slice | `.claude/skills/side-work` — discuss, document in «Вне очереди», then implement | +| a task that is not in any slice | `.claude/skills/side-work` — discuss, document in [`docs/phases/off-queue/`](docs/phases/off-queue/README.md), then implement | | a new named slice of the game | `.claude/skills/slice-work` — discuss, write design and phases, then `/phase-orch` | +Docs are per slice: `docs/phases//` and `docs/design//`. [`docs/phases/README.md`](docs/phases/README.md) is a catalog — open only the slice you are changing. + ## Commands ```bash diff --git a/docs/bugs/README.md b/docs/bugs/README.md index 6406b6d..0b36f28 100644 --- a/docs/bugs/README.md +++ b/docs/bugs/README.md @@ -3,7 +3,7 @@ Индекс регрессий в уже сделанном. Статус: ⬜ не начат, 🔄 в работе, ✅ готов. Это не фазы: номера не спорят со срезами, в `docs/phases/` не дублировать. -Склейка систем и DX — [«Вне очереди»](../phases/README.md#вне-очереди), скилл +Склейка систем и DX — [«Вне очереди»](../phases/off-queue/README.md), скилл `/side-work`. Новый кусок игры — `/slice-work`. Как работать с багом — [`.claude/skills/bug-work`](../../.claude/skills/bug-work/SKILL.md). diff --git a/docs/design/08-session/session.md b/docs/design/08-session/session.md index de88e31..9847dda 100644 --- a/docs/design/08-session/session.md +++ b/docs/design/08-session/session.md @@ -2,7 +2,7 @@ Договорённость на следующий срез, не текущий код. Оболочка: [`near-term.md`](../01-shell/near-term.md). Рантайм: [`runtime.md`](../01-shell/runtime.md). -Протокол: [`../protocol.md`](../../protocol.md). +Протокол: [`protocol.md`](../../protocol.md). Один процесс сервера, несколько браузеров в локальной сети. Это не аккаунты и не интернет: общий пароль альфы пускает к двери, имя отличает игроков. Школу по-прежнему тикает её работник, diff --git a/docs/phases/01-shell/01-manager-shell.md b/docs/phases/01-shell/01-manager-shell.md index 6ca0c70..8cd7667 100644 --- a/docs/phases/01-shell/01-manager-shell.md +++ b/docs/phases/01-shell/01-manager-shell.md @@ -19,7 +19,7 @@ > **Отменено в фазе 8.** Панель общих событий убрана с экрана: пока ленты событий нет, постоянно > пустая треть экрана мешала, и место отдано вкладкам «Карта» и «Люди». Решение записано в -> [`docs/design/01-shell/near-term.md`](../../design/01-shell/near-term.md); появится лента — вернётся и панель. +> [`near-term.md`](../../design/01-shell/near-term.md); появится лента — вернётся и панель. ## Критерий готовности diff --git a/docs/phases/01-shell/README.md b/docs/phases/01-shell/README.md index 0e368be..adde64c 100644 --- a/docs/phases/01-shell/README.md +++ b/docs/phases/01-shell/README.md @@ -2,10 +2,10 @@ ## Срез 1. Оболочка и карта -Дизайн закрыт: [`../design/near-term.md`](../../design/01-shell/near-term.md), -[`../design/defs.md`](../../design/01-shell/defs.md), -[`../design/runtime.md`](../../design/01-shell/runtime.md), -[`../design/projects.md`](../../design/01-shell/projects.md). +Дизайн закрыт: [`near-term.md`](../../design/01-shell/near-term.md), +[`defs.md`](../../design/01-shell/defs.md), +[`runtime.md`](../../design/01-shell/runtime.md), +[`projects.md`](../../design/01-shell/projects.md). Новых игровых фич в эти фазы не добавлять. 1 и 2 можно вести параллельно (клиент / сервер). diff --git a/docs/phases/02-people/06-people-generator.md b/docs/phases/02-people/06-people-generator.md index ae5f6a4..db844f5 100644 --- a/docs/phases/02-people/06-people-generator.md +++ b/docs/phases/02-people/06-people-generator.md @@ -28,7 +28,7 @@ - [x] Тот же сид, карта и набор имён — ровно тот же ростер - [x] Тринадцатая семья не меняет, как разыграны первые двенадцать (фамилия, состав, имена). Класс ребёнка при этом меняется — места раздаются вперемешку по школе, иначе братья и - сёстры всегда оказывались одноклассниками; см. [`docs/design/02-people/people.md`](../../design/02-people/people.md) + сёстры всегда оказывались одноклассниками; см. [`people.md`](../../design/02-people/people.md) - [x] Фамилии, родовые формы и отчества внутри семьи согласованы - [x] Ученик с телосложением «полное» не получает высокую ловкость - [x] Все ученические места заполнены, все должности закрыты diff --git a/docs/phases/02-people/08-people-browser.md b/docs/phases/02-people/08-people-browser.md index cfc2343..426eaef 100644 --- a/docs/phases/02-people/08-people-browser.md +++ b/docs/phases/02-people/08-people-browser.md @@ -18,7 +18,7 @@ `TaskCompletionSource`, потому что нужды живые - [x] Панель «Люди» в оболочке менеджера: фильтры, сортируемые колонки, пейджер. Сделана **вкладкой рядом с картой**, а не нижним рядом — заодно с экрана ушла пустая панель - событий из фазы 1; см. [`docs/design/02-people/people.md`](../../design/02-people/people.md) + событий из фазы 1; см. [`people.md`](../../design/02-people/people.md) - [x] Строка списка — только лёгкие поля: ФИО, роль, класс или должность, возраст, пол - [x] Карточка: тело, навыки, черты, нужды, семья со ссылками на родных — по ссылке открывается карточка родственника diff --git a/docs/phases/02-people/README.md b/docs/phases/02-people/README.md index 85eb224..5697017 100644 --- a/docs/phases/02-people/README.md +++ b/docs/phases/02-people/README.md @@ -2,7 +2,7 @@ ## Срез 2. Люди -Дизайн: [`../design/people.md`](../../design/02-people/people.md). +Дизайн: [`people.md`](../../design/02-people/people.md). Школа наполняется людьми. Ученики, работники и родители существуют, показываются и обновляются раз в год — но **ничего не делают**: ни расписания, ни перемещений, ни влияния характеристик. diff --git a/docs/phases/03-staffing/README.md b/docs/phases/03-staffing/README.md index 9de5fe5..72119f1 100644 --- a/docs/phases/03-staffing/README.md +++ b/docs/phases/03-staffing/README.md @@ -2,7 +2,7 @@ ## Срез 3. Штат -Дизайн: [`../design/staffing.md`](../../design/03-staffing/staffing.md). +Дизайн: [`staffing.md`](../../design/03-staffing/staffing.md). Первый срез, где игрок принимает решения. Школа открывается пустой: надо нанять людей из пула соискателей, раздать им предметы и уложиться в выделенную на месяц сумму. Уроков по-прежнему нет — diff --git a/docs/phases/04-schedule/README.md b/docs/phases/04-schedule/README.md index 0a4c219..962c0c2 100644 --- a/docs/phases/04-schedule/README.md +++ b/docs/phases/04-schedule/README.md @@ -2,7 +2,7 @@ ## Срез 4. Расписание -Дизайн: [`../design/schedule.md`](../../design/04-schedule/schedule.md). +Дизайн: [`schedule.md`](../../design/04-schedule/schedule.md). Часы учебного плана раскладываются по дням и кабинетам. Школа начинает жить по времени: видно, что идёт в комнате прямо сейчас. Люди при этом по-прежнему **не ходят** — они находятся там, где diff --git a/docs/phases/05-ai/README.md b/docs/phases/05-ai/README.md index 85e9662..1f94a41 100644 --- a/docs/phases/05-ai/README.md +++ b/docs/phases/05-ai/README.md @@ -2,7 +2,7 @@ ## Срез 5. Жизнь школы -Дизайн: [`../design/ai.md`](../../design/05-ai/ai.md). +Дизайн: [`ai.md`](../../design/05-ai/ai.md). Люди начинают ходить и решать. Присутствие перестаёт вычисляться из расписания и становится состоянием: человек приходит утром, идёт коридором, может уйти с урока в туалет и вернуться. diff --git a/docs/phases/06-foundation/22-mod-identity.md b/docs/phases/06-foundation/22-mod-identity.md index 67a9022..189b6bb 100644 --- a/docs/phases/06-foundation/22-mod-identity.md +++ b/docs/phases/06-foundation/22-mod-identity.md @@ -25,7 +25,7 @@ - [x] Разрешённый порядок виден: пишется в лог при старте школы и возвращается в ответе создания - [x] Сейв хранит **разрешённый** порядок паков, чтобы школа поднималась тем же каталогом - [x] Загрузчик пишет предупреждение, когда у конкретного def нет подписи в локали пака -- [x] `docs/protocol.md` и [`docs/design/06-foundation/foundation.md`](../../design/06-foundation/foundation.md) правятся тем же +- [x] `docs/protocol.md` и [`foundation.md`](../../design/06-foundation/foundation.md) правятся тем же коммитом, что и обработчики ## Тесты, без которых фаза не закрыта diff --git a/docs/phases/06-foundation/23-example-pack.md b/docs/phases/06-foundation/23-example-pack.md index 130bcae..c050326 100644 --- a/docs/phases/06-foundation/23-example-pack.md +++ b/docs/phases/06-foundation/23-example-pack.md @@ -18,7 +18,7 @@ пока не выбран - [x] Пак едет в вывод сборки тестов теми же правилами, что и `core` - [x] Короткий `README.md` внутри пака: что где лежит и как добавить своё -- [x] Ориентир в [`docs/design/01-shell/defs.md`](../../design/01-shell/defs.md) показывает на него как на образец +- [x] Ориентир в [`defs.md`](../../design/01-shell/defs.md) показывает на него как на образец ## Тесты, без которых фаза не закрыта diff --git a/docs/phases/06-foundation/24-behavior-numbers.md b/docs/phases/06-foundation/24-behavior-numbers.md index d0653d6..335c4a6 100644 --- a/docs/phases/06-foundation/24-behavior-numbers.md +++ b/docs/phases/06-foundation/24-behavior-numbers.md @@ -6,7 +6,7 @@ ## Зачем -[`docs/design/05-ai/ai.md`](../../design/05-ai/ai.md) обещает: числа поведения — деф правил, как `StaffingDef` у +[`ai.md`](../../design/05-ai/ai.md) обещает: числа поведения — деф правил, как `StaffingDef` у штата. Порог нужды и разброс на дорогу туда уехали, а веса целей остались константами в коде. Пока они там, мод, меняющий одно число, вынужден быть форком. diff --git a/docs/phases/06-foundation/26-school-seed.md b/docs/phases/06-foundation/26-school-seed.md index 6afbf30..ab02a60 100644 --- a/docs/phases/06-foundation/26-school-seed.md +++ b/docs/phases/06-foundation/26-school-seed.md @@ -21,7 +21,7 @@ - [x] Существующие школы не меняются: сид читается из файла людей, как и сейчас - [x] Тесты хоста, которым нужен предсказуемый состав, передают сид явно, а не полагаются на порядок создания -- [x] `docs/protocol.md` и [`docs/design/02-people/people.md`](../../design/02-people/people.md) правятся тем же коммитом +- [x] `docs/protocol.md` и [`people.md`](../../design/02-people/people.md) правятся тем же коммитом ## Тесты, без которых фаза не закрыта diff --git a/docs/phases/06-foundation/README.md b/docs/phases/06-foundation/README.md index d540015..c78fd81 100644 --- a/docs/phases/06-foundation/README.md +++ b/docs/phases/06-foundation/README.md @@ -2,7 +2,7 @@ ## Срез 6. Фундамент -Дизайн: [`../design/foundation.md`](../../design/06-foundation/foundation.md). +Дизайн: [`foundation.md`](../../design/06-foundation/foundation.md). Срез без единой новой кнопки для игрока. Мод становится настоящим объектом, числа поведения уезжают из кода в данные, сид перестаёт быть идентификатором, у сейва появляется версия, а то, diff --git a/docs/phases/07-inventory/30-apparel-defs.md b/docs/phases/07-inventory/30-apparel-defs.md index b3bcb96..d212f04 100644 --- a/docs/phases/07-inventory/30-apparel-defs.md +++ b/docs/phases/07-inventory/30-apparel-defs.md @@ -18,7 +18,7 @@ ошибка - [x] Вещь с несколькими `layers` допустима (платье). Пересечение слоёв у двух надетых сразу валидатор не проверяет — это состояние человека, не каталога -- [x] Ваниль по [`docs/design/07-inventory/inventory.md`](../../design/07-inventory/inventory.md): бельё, носки, низы, верх, +- [x] Ваниль по [`inventory.md`](../../design/07-inventory/inventory.md): бельё, носки, низы, верх, свитер, куртка/пальто/шуба, обувь, шапка, аксессуары, платье, форма физкультуры, портфель, учебник, телефон, бутылка - [x] Палитра цветов и локали ru/en на все новые def diff --git a/docs/phases/07-inventory/37-school-rules.md b/docs/phases/07-inventory/37-school-rules.md index 4cb99a3..174cf0f 100644 --- a/docs/phases/07-inventory/37-school-rules.md +++ b/docs/phases/07-inventory/37-school-rules.md @@ -14,7 +14,7 @@ - [x] В «Управлении» вкладка **«Правила»** рядом со штатом, не новый верхний режим - [x] Четыре комбобокса: форма учеников, цвет учеников, форма сотрудников, цвет сотрудников. - Значения — как в [`docs/design/07-inventory/inventory.md`](../../design/07-inventory/inventory.md) + Значения — как в [`inventory.md`](../../design/07-inventory/inventory.md) - [x] Сохранение пишет завтрашнее правило; на экране видно, что действует сегодня и что вступит завтра - [x] HTTP: чтение текущих+отложенных, запись отложенных. Отказ по неизвестному коду правила — diff --git a/docs/phases/07-inventory/README.md b/docs/phases/07-inventory/README.md index 8b7683b..1e526cb 100644 --- a/docs/phases/07-inventory/README.md +++ b/docs/phases/07-inventory/README.md @@ -2,7 +2,7 @@ ## Срез 7. Одежда, вещи и климат -Дизайн: [`../design/inventory.md`](../../design/07-inventory/inventory.md). +Дизайн: [`inventory.md`](../../design/07-inventory/inventory.md). Человек одевается, несёт вещи, мёрзнет и переодевается. Игрок смотрит гардероб и выбирает правила школы; надевает не он. Погода видна у часов. Срез можно остановить после этапа A — diff --git a/docs/phases/08-session/README.md b/docs/phases/08-session/README.md index 4e4c202..bb49735 100644 --- a/docs/phases/08-session/README.md +++ b/docs/phases/08-session/README.md @@ -2,7 +2,7 @@ ## Срез 8. Сессия и темп -Дизайн: [`../design/session.md`](../../design/08-session/session.md). +Дизайн: [`session.md`](../../design/08-session/session.md). Несколько браузеров на одном сервере: общий пароль альфы, имя игрока, свои школы и чужие отдельным списком. Часы становятся смотрибельными — минута за секунду, на высоких скоростях diff --git a/docs/phases/09-social/README.md b/docs/phases/09-social/README.md index 959f7ff..f42c6cc 100644 --- a/docs/phases/09-social/README.md +++ b/docs/phases/09-social/README.md @@ -2,7 +2,7 @@ ## Срез 9. Общение и романтический пак -Дизайн: [`../design/social.md`](../../design/09-social/social.md). +Дизайн: [`social.md`](../../design/09-social/social.md). Разговор становится кружком, мнение — числом, вражда — ссорой. Романтика не ваниль: отдельный пак. Срез можно остановить после этапа B — школа болтает, даже если драк и пака ещё нет. diff --git a/docs/phases/10-craft/README.md b/docs/phases/10-craft/README.md index fe3d6a5..abfb967 100644 --- a/docs/phases/10-craft/README.md +++ b/docs/phases/10-craft/README.md @@ -2,7 +2,7 @@ ## Срез 10. Ремесло -Дизайн: [`../design/craft.md`](../../design/10-craft/craft.md). +Дизайн: [`craft.md`](../../design/10-craft/craft.md). Срез без новой кнопки. Слои ловятся одним тестовым проектом, клиентский `npm test` гоняет tsc, работник и карточка режутся по швам, дамп проверяет явку. После этапа A школа целая, даже если diff --git a/docs/phases/off-queue/README.md b/docs/phases/off-queue/README.md index 21cc2e3..6f38520 100644 --- a/docs/phases/off-queue/README.md +++ b/docs/phases/off-queue/README.md @@ -2,12 +2,12 @@ ## Вне очереди -Дизайн: [`../design/off-queue.md`](../../design/off-queue/README.md). +Дизайн: [`off-queue.md`](../../design/off-queue/README.md). Склейка уже живых систем и мелкий DX, не новый кусок игры. Номера не спорят с именованными срезами. После каждой игровой фазы школа целая. 50–52 стоят на 48; 53 — на 18 и 32, можно параллельно с 48. 49, 54 и 55 от них не зависят. Баг в уже сделанном — -[`../bugs/README.md`](../../bugs/README.md). +[bugs](../../bugs/README.md). | Фаза | Статус | Зачем | | --- | --- | --- |