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, сейв — назвать явно. Версию не бампать: это коммит с кодом.
🔄 не ставить: фазы ещё никто не взял.
+9 -7
View File
@@ -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 2937; country, wardrobes and weather are live |
| login, who owns a school, watching others | [`docs/design/session.md`](docs/design/session.md) — slice 8, phases 3839 |
| 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 4147 |
| lesson consequences (teacher present, skill, warmth, textbook, weather commute) | [`docs/design/off-queue.md`](docs/design/off-queue.md) — phases 48, 5053 |
| layer tests, client tsc-in-test, worker/card splits, dump nodes | [`docs/design/craft.md`](docs/design/craft.md) — slice 10, phases 5659 |
| clothing, inventory, climate, dress codes | [`docs/design/07-inventory/`](docs/design/07-inventory/inventory.md) — slice 7, phases 2937 |
| login, who owns a school, watching others | [`docs/design/08-session/`](docs/design/08-session/session.md) — slice 8, phases 3839 |
| 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 4147 |
| 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, 5053 |
| layer tests, client tsc-in-test, worker/card splits, dump nodes | [`docs/design/10-craft/`](docs/design/10-craft/craft.md) — slice 10, phases 5659 |
| 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/<slice>/` and `docs/design/<slice>/`. [`docs/phases/README.md`](docs/phases/README.md) is a catalog — open only the slice you are changing.
## Commands
```bash
+1 -1
View File
@@ -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).
+1 -1
View File
@@ -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).
Один процесс сервера, несколько браузеров в локальной сети. Это не аккаунты и не интернет:
общий пароль альфы пускает к двери, имя отличает игроков. Школу по-прежнему тикает её работник,
+1 -1
View File
@@ -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); появится лента — вернётся и панель.
## Критерий готовности
+4 -4
View File
@@ -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 можно вести параллельно (клиент / сервер).
+1 -1
View File
@@ -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] Все ученические места заполнены, все должности закрыты
+1 -1
View File
@@ -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] Карточка: тело, навыки, черты, нужды, семья со ссылками на родных — по ссылке открывается
карточка родственника
+1 -1
View File
@@ -2,7 +2,7 @@
## Срез 2. Люди
Дизайн: [`../design/people.md`](../../design/02-people/people.md).
Дизайн: [`people.md`](../../design/02-people/people.md).
Школа наполняется людьми. Ученики, работники и родители существуют, показываются и обновляются
раз в год — но **ничего не делают**: ни расписания, ни перемещений, ни влияния характеристик.
+1 -1
View File
@@ -2,7 +2,7 @@
## Срез 3. Штат
Дизайн: [`../design/staffing.md`](../../design/03-staffing/staffing.md).
Дизайн: [`staffing.md`](../../design/03-staffing/staffing.md).
Первый срез, где игрок принимает решения. Школа открывается пустой: надо нанять людей из пула
соискателей, раздать им предметы и уложиться в выделенную на месяц сумму. Уроков по-прежнему нет —
+1 -1
View File
@@ -2,7 +2,7 @@
## Срез 4. Расписание
Дизайн: [`../design/schedule.md`](../../design/04-schedule/schedule.md).
Дизайн: [`schedule.md`](../../design/04-schedule/schedule.md).
Часы учебного плана раскладываются по дням и кабинетам. Школа начинает жить по времени: видно,
что идёт в комнате прямо сейчас. Люди при этом по-прежнему **не ходят** — они находятся там, где
+1 -1
View File
@@ -2,7 +2,7 @@
## Срез 5. Жизнь школы
Дизайн: [`../design/ai.md`](../../design/05-ai/ai.md).
Дизайн: [`ai.md`](../../design/05-ai/ai.md).
Люди начинают ходить и решать. Присутствие перестаёт вычисляться из расписания и становится
состоянием: человек приходит утром, идёт коридором, может уйти с урока в туалет и вернуться.
+1 -1
View File
@@ -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) правятся тем же
коммитом, что и обработчики
## Тесты, без которых фаза не закрыта
+1 -1
View File
@@ -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) показывает на него как на образец
## Тесты, без которых фаза не закрыта
@@ -6,7 +6,7 @@
## Зачем
[`docs/design/05-ai/ai.md`](../../design/05-ai/ai.md) обещает: числа поведения — деф правил, как `StaffingDef` у
[`ai.md`](../../design/05-ai/ai.md) обещает: числа поведения — деф правил, как `StaffingDef` у
штата. Порог нужды и разброс на дорогу туда уехали, а веса целей остались константами в коде.
Пока они там, мод, меняющий одно число, вынужден быть форком.
+1 -1
View File
@@ -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) правятся тем же коммитом
## Тесты, без которых фаза не закрыта
+1 -1
View File
@@ -2,7 +2,7 @@
## Срез 6. Фундамент
Дизайн: [`../design/foundation.md`](../../design/06-foundation/foundation.md).
Дизайн: [`foundation.md`](../../design/06-foundation/foundation.md).
Срез без единой новой кнопки для игрока. Мод становится настоящим объектом, числа поведения
уезжают из кода в данные, сид перестаёт быть идентификатором, у сейва появляется версия, а то,
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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: чтение текущих+отложенных, запись отложенных. Отказ по неизвестному коду правила —
+1 -1
View File
@@ -2,7 +2,7 @@
## Срез 7. Одежда, вещи и климат
Дизайн: [`../design/inventory.md`](../../design/07-inventory/inventory.md).
Дизайн: [`inventory.md`](../../design/07-inventory/inventory.md).
Человек одевается, несёт вещи, мёрзнет и переодевается. Игрок смотрит гардероб и выбирает
правила школы; надевает не он. Погода видна у часов. Срез можно остановить после этапа A —
+1 -1
View File
@@ -2,7 +2,7 @@
## Срез 8. Сессия и темп
Дизайн: [`../design/session.md`](../../design/08-session/session.md).
Дизайн: [`session.md`](../../design/08-session/session.md).
Несколько браузеров на одном сервере: общий пароль альфы, имя игрока, свои школы и чужие
отдельным списком. Часы становятся смотрибельными — минута за секунду, на высоких скоростях
+1 -1
View File
@@ -2,7 +2,7 @@
## Срез 9. Общение и романтический пак
Дизайн: [`../design/social.md`](../../design/09-social/social.md).
Дизайн: [`social.md`](../../design/09-social/social.md).
Разговор становится кружком, мнение — числом, вражда — ссорой. Романтика не ваниль: отдельный
пак. Срез можно остановить после этапа B — школа болтает, даже если драк и пака ещё нет.
+1 -1
View File
@@ -2,7 +2,7 @@
## Срез 10. Ремесло
Дизайн: [`../design/craft.md`](../../design/10-craft/craft.md).
Дизайн: [`craft.md`](../../design/10-craft/craft.md).
Срез без новой кнопки. Слои ловятся одним тестовым проектом, клиентский `npm test` гоняет tsc,
работник и карточка режутся по швам, дамп проверяет явку. После этапа A школа целая, даже если
+2 -2
View File
@@ -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).
| Фаза | Статус | Зачем |
| --- | --- | --- |