From f4a793aca4322c2e2f8705e360bcf969d2c06b74 Mon Sep 17 00:00:00 2001 From: Leonid Pershin Date: Thu, 20 Aug 2026 09:10:42 +0300 Subject: [PATCH] Update AGENTS.md and SKILL.md to refine testing policies and clarify project-specific test execution. Emphasized the importance of using filters for tests and avoiding full solution runs unless necessary. Adjusted descriptions in phase-work and side-work skills to align with the new testing guidelines. --- .claude/skills/bug-work/SKILL.md | 3 +++ .claude/skills/phase-review/SKILL.md | 15 +++++++-------- .claude/skills/phase-work/SKILL.md | 21 ++++++++++++++------- .claude/skills/side-work/SKILL.md | 1 + AGENTS.md | 13 +++++++++++-- 5 files changed, 36 insertions(+), 17 deletions(-) diff --git a/.claude/skills/bug-work/SKILL.md b/.claude/skills/bug-work/SKILL.md index 0732c2e..e5fc060 100644 --- a/.claude/skills/bug-work/SKILL.md +++ b/.claude/skills/bug-work/SKILL.md @@ -78,6 +78,9 @@ description: >- другая ветка. Чистое `main` — можно в этом дереве; - шаблон фазы не заполнять. Тест из файла бага — да, «Критерий готовности» фазы — нет; +- тесты — только проект из Testing policy и `--filter` на новый тест. Полный + `dotnet test`, клиентский Vitest без правок клиента и повтор после слияния + статус-строки **не** наследовать из `/phase-work`; - ✅ в индексе — последним коммитом ветки, в нём только строка статуса. Слияние и замок `merge/lock` — как у `/phase-work`. Не пушь. diff --git a/.claude/skills/phase-review/SKILL.md b/.claude/skills/phase-review/SKILL.md index cbb9283..9624308 100644 --- a/.claude/skills/phase-review/SKILL.md +++ b/.claude/skills/phase-review/SKILL.md @@ -100,15 +100,14 @@ description: Ревью срезов и фаз проекта h-school по их - **Молча не меняй** версию протокола, форму сейва и публичное поведение API. Это отдельное решение пользователя, даже когда оно очевидно правильное. -## Окружение +## Какие тесты гонять -```bash -dotnet test -``` - -```bash -npm --prefix src/HSchool.Client test -``` +Сначала читай код и имена тестов — ревью это сверка обещаний, не ритуал прогона. Когда +дописал недостающий тест или починил найденное, гоняй **только проект среза** из Testing +policy в `AGENTS.md`, с `--filter` на новый класс. Клиентский Vitest — только если ревью +трогает `src/HSchool.Client`. `HSchool.AppHost.Tests` — только если срез про HTTP, сокет +или хост. Весь solution, парный `npm test` «для уверенности» и прогон в начале ревью — +не делать. Чего ждать и что делать: diff --git a/.claude/skills/phase-work/SKILL.md b/.claude/skills/phase-work/SKILL.md index b029ad1..afcd199 100644 --- a/.claude/skills/phase-work/SKILL.md +++ b/.claude/skills/phase-work/SKILL.md @@ -92,8 +92,11 @@ git worktree add <путь-в-scratchpad>/wt-phase-25 phase/25-golden-fixtures - меняется HTTP — `docs/protocol.md` тем же коммитом; - решение разошлось с дизайн-доком — правится документ, и в отчёте это названо явно. -**5. Проверь то, что заявляешь.** Прогоняешь тесты своей фазы и полный прогон. Не «должно -работать», а «прогнал, вот результат». +**5. Проверь то, что заявляешь.** Гоняй только проект(ы) из Testing policy в `AGENTS.md`, +которые эта фаза трогает; пока пишешь — `--filter` на новый класс. Клиентский Vitest — только +если трогал `src/HSchool.Client`. `HSchool.AppHost.Tests` — только если трогал HTTP, сокет +или хост. Весь solution и «на всякий случай оба стека» не гонять. Не «должно работать», а +«прогнал вот этот проект, вот результат». ## Что считать сделанным @@ -152,8 +155,10 @@ git -C <корень> merge --no-ff phase/25-golden-fixtures которого тебе неясен, — `git merge --abort`, снять замок, оставить ветку и написать в отчёте, с чем именно она не сходится. -**6. Перепрогони тесты на `main` после слияния.** Две зелёные ветки в сумме бывают красными: -каждая правила своё, а вместе получилось не то. Это единственный способ поймать такое. +**6. После слияния.** Конфликт только в строке статуса или в доке — тесты не гонять, ничего +не сошлось в коде. Был конфликт в коде — тот же узкий набор проектов, что в шаге 5, не +весь solution. Две зелёные ветки в сумме бывают красными; ловить это должен затронутый +проект, а не ритуал на восемь сборок. Красно — откати слияние и оставь ветку жить: @@ -214,8 +219,9 @@ git branch --merged main --list "phase/*" --format="%(refname:short)" - **Состав школы зависит от её id**, пока не сделана фаза 26. Тест, требующий у первого ученика двух родителей или конкретную фамилию, зелёный у тебя и красный в CI. Проверяй свойство, а не совпадение. -- **Полный `dotnet test` изредка падает целиком** с нативной ошибкой в `Simulation.Tests`. Один раз - — перепрогони; повторяется — это находка для отчёта. +- **Не гоняй `dotnet test` на solution** «на всякий случай»: это восемь проектов и подъём + хоста. Если всё же гонял и упало целиком с нативной ошибкой в `Simulation.Tests` — один + повтор того же проекта; повторяется — в отчёт. - **Dev-сервер не запускать.** Нужно посмотреть на UI — пользуйся уже запущенным приложением пользователя. @@ -233,7 +239,8 @@ git branch --merged main --list "phase/*" --format="%(refname:short)" - какая фаза взята и на какой ветке лежит; - что сделано — по пунктам задач, без пересказа кода; - какие тесты добавлены, списком по одной строке; -- чем подтверждено: что прогнал и с каким результатом, числа замеров, если были; +- чем подтверждено: какой проект прогнал и с каким результатом, числа замеров, если были; + не «весь solution зелёный»; - что осталось незакрытым и почему; - что замечено за границами фазы; - слита ли ветка в `main` и удалена ли — а если нет, то что помешало. diff --git a/.claude/skills/side-work/SKILL.md b/.claude/skills/side-work/SKILL.md index 0c2a629..d6c76ec 100644 --- a/.claude/skills/side-work/SKILL.md +++ b/.claude/skills/side-work/SKILL.md @@ -64,6 +64,7 @@ description: >- Прочитай [phase-work](../phase-work/SKILL.md) и следуй ему. Отличия: фазу ты завёл сам; заявка `git branch phase/-` **до** кода; +тесты — как Testing policy в `AGENTS.md`, не весь solution; новые файлы и 🔄 живут на этой ветке. Один цикл — одна фаза. «Сделай всё» — по порядку, каждая своим циклом `/phase-work`. Три фазы в одну ветку не паковать. diff --git a/AGENTS.md b/AGENTS.md index b372645..6b69b60 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -35,13 +35,16 @@ dotnet build h-school.sln ``` ```bash -dotnet test +dotnet test tests/HSchool.People.Tests --filter FullyQualifiedName~YearlyIntake ``` ```bash -npm --prefix src/HSchool.Client test +npm --prefix src/HSchool.Client test -- src/ui/peoplePanel.test.ts ``` +Solution-wide `dotnet test` and a full client `npm test` are CI, or when the user asked. Agents +scope the run — Testing policy. + ```bash npm --prefix src/HSchool.Client run build ``` @@ -115,6 +118,12 @@ say so explicitly in the change description. ## Testing policy +**What to run.** One project from the list below, filtered to the new or changed class while +iterating. Client Vitest only if `src/HSchool.Client` changed. `HSchool.AppHost.Tests` only if +the change is HTTP, WebSocket, or host wiring — it boots a server. Do not `dotnet test` the +solution, do not run client and .NET together "to be sure", do not re-run after a merge that +only resolved a status line. Solution-wide is CI. + - Simulation changes need a `GameClock` or `SchoolRegistry` test. They are fast and need no host. Putting a roster into `World` and ticking needs belongs there too. - People generation belongs in `tests/HSchool.People.Tests`. Same seed, map, country and