Files
h-school/docs/phases/10-craft/reviewed.md
T
Leonid PershinandCursor 1ba38058d3 Record slice 10 B-C recheck after worker paths drifted.
Speech and dress load landed on SchoolWorker after f4f726a. Lock PersonCardReader to one public Read and journal the recheck.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-20 17:39:29 +03:00

86 lines
7.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Журнал ревью — срез 10
Сводка: [`../reviewed.md`](../reviewed.md). Индекс среза: [`README.md`](README.md).
## Срез 10. Этап A — страховка (перепроверка)
- **Фазы:** 5657
- **Проверен на:** `cecd79c`, 2026-08-20
- **Пути:** `tests/HSchool.Architecture.Tests`, `src/HSchool.Client/package.json`, `src/HSchool.Client/scripts`, `AGENTS.md`, `README.md`, `docs/design/01-shell/projects.md`
- **Итог:** перепроверка после `e2e7d30`: `git log e2e7d30..HEAD` по путям этапа A был пуст — код 56–57 не дрейфовал. Обещания на месте. Дописаны запреты People↛Schedule/Ai, Schedule↛People/Ai, Simulation↛Protocol; в `projects.md` у Simulation добавлен прямой `Schedule` (как в csproj). Этап B–C в этот проход не входил.
- **Первая проверка:** `e2e7d30`, 2026-08-20.
### 56. Слои одной пачкой
Все шесть пунктов «тестов, без которых фаза не закрыта» есть в `LayerBoundaryTests`. Копипасты `Assembly_DoesNotReference*` / `Sources_DoNotUseWallClock` из People/Ai/Schedule/Simulation.Tests по-прежнему отсутствуют. NetArchTest в solution нет; csproj не ссылается на Server/AppHost. README не называет школу пустой, `MaxSchools` — слоты игрока. Testing policy в `AGENTS.md` указывает на `HSchool.Architecture.Tests`.
`dotnet test tests/HSchool.Architecture.Tests --filter FullyQualifiedName~LayerBoundaryTests`: 11 зелёных (было 9; плюс People↛Schedule/Ai и Schedule↛People/Ai; Simulation дополнительно без Protocol).
Инвариант 4 и запрет `DateTime.Now` / `UtcNow` в шести библиотеках держатся; исходники ловят неиспользованный `using System.Net.Http`. `DateTime.UtcNow` есть в `HSchool.Server` (SwarmUI health) — хост, не слой.
Дописано на перепроверке:
- People не ссылается на Schedule и Ai
- Schedule не ссылается на People и Ai
- Simulation не ссылается на Protocol
- `projects.md`: `Simulation → Ai, People, Content, Schedule` — граф отставал от csproj; запрет Simulation↛Schedule был бы красным и ложным
### 57. tsc в npm test
`package.json``"test": "node ./scripts/run-test.mjs"` по-прежнему гоняет `tsc -b`, потом vitest, и не глотает код выхода typecheck на Windows. `"hschool-client": "file:"` в зависимостях нет. `test:watch` — только vitest. `AGENTS.md` это описывает. Скрипт `build` = `tsc -b && vite build`.
Клиентские пути с `e2e7d30` не менялись; `src/HSchool.Client` в этом проходе не правился, `npm test` по Testing policy не гонялся.
### Открытое
- `README.md` «What is deliberately missing» всё ещё пишет «No authentication» и что диалог создания не выбирает моды — ложь срезов 8 и 1, не этого этапа.
- Дубликат ключа проверяется изолированным `tsc -p`, не `tsc -b` живого клиента; проводка `run-test.mjs` покрыта отдельно.
- Этап B–C (58–59) — соседний проход, здесь не перепроверялся.
## Срез 10. Этапы B–C — работник, карточка и дамп (перепроверка)
- **Фазы:** 5859
- **Проверен на:** `34f28f9`, 2026-08-20
- **Пути:** `src/HSchool.Server/Game/SchoolWorker.cs`,
`src/HSchool.Server/Game/SchoolWorker.Mailbox.cs`,
`src/HSchool.Server/Game/SchoolWorker.Tick.cs`,
`src/HSchool.Server/Game/SchoolWorker.Persist.cs`,
`src/HSchool.Server/Game/PersonCardReader.cs`,
`src/HSchool.Server/Game/PersonCardReader.Overview.cs`,
`src/HSchool.Server/Game/PersonCardReader.Inventory.cs`,
`src/HSchool.Server/Game/PersonCardReader.Connections.cs`,
`src/HSchool.Server/Game/SchoolDumpReader.cs`,
`src/HSchool.Server/Api/DevEndpoints.cs`,
`src/HSchool.Client/src/ui/personCard.ts`,
`src/HSchool.Client/src/ui/personCardHost.ts`,
`src/HSchool.Client/src/ui/personCardOverview.ts`,
`src/HSchool.Client/src/ui/personCardApparel.ts`,
`src/HSchool.Client/src/ui/personCardCarry.ts`,
`src/HSchool.Client/src/ui/personCardNow.ts`,
`src/HSchool.Client/src/ui/personCardConnections.ts`,
`src/HSchool.Client/src/ui/personCardPortrait.ts`,
`src/HSchool.Client/src/ui/personCardDom.ts`,
`tests/HSchool.Server.Tests/SchoolWorkerShapeTests.cs`,
`tests/HSchool.Server.Tests/PersonCardReaderShapeTests.cs`,
`tests/HSchool.AppHost.Tests/ServiceabilityTests.cs`
- **Итог:** перепроверка после `f4f726a`. По путям этапа дрейфовали воркер и `ServiceabilityTests`: в mailbox/persist пришла речь (фаза 46), `DressGenerator.NeedsDressing` взял каталог. Обещания 58–59 держатся; `lock` вокруг `School`/`World` нет; дамп по-прежнему ждёт `NodeId` на идущих часах. Дописан `PersonCardReaderShapeTests` — единственный публичный `Read`. Код фаз не чинился. Этап A (56–57) в этот проход не входил.
- **Первая проверка:** `f4f726a`, 2026-08-20.
### Что проверено
**58.** `SchoolWorker` — один `internal sealed partial` (почта / тик / запись), тот же `LongRunning`-поток и тот же mailbox; `lock` нет. `PersonCardReader.Read(School, personId, locale)` — единственный публичный вход; вкладки в `partial`. Клиент: вкладки в модулях, `personCardHost.ts` по-прежнему `fetchPerson` / `fetchPersonLog`. `GameLoopService` не резался. Карточка: `PeopleApiTests.Card_IncludesFamilyAndLiveNeeds`, `InventoryApiTests.Card_IncludesWornAndCarried_ListDoesNot`, `Card_ConnectionsCarryOnlyThisPersonsOpinions`. UI: `personCard.test.ts` (вкладки, портрет, связи). Пауза: `PausingOneSchool_DoesNotStopAnother`. Форма: `SchoolWorkerShapeTests` и `PersonCardReaderShapeTests` (прогнаны, 1/1 каждый). Клиент и Architecture.Tests — этап A, не гонялись.
**59.** `Dump_ReturnsPeopleNodesAndTimetable` нанимает математику, требует идущие часы, ждёт непустой `NodeId`, отдельно нужды и `Lessons` Mathematics. На паузе wait сразу красный, не висит. Неизвестный id — 404 `unknown-school`. JSON дампа и `SchoolDumpReader` не расширялись; ручка по-прежнему за `HSchool:AllowSaveReload`; HTTP кладёт `DumpSchool` в mailbox, `World` читает только работник.
### Что дописано
- `PersonCardReader_HasOnePublicRead` — рефлексия: один публичный `Read(School, personId, locale)`
### Что исправлено
- (нет)
### Открытое
- Нет. Этап A (56–57) — соседний проход. TalkCircle и остаток `review/slice-9-cd` не трогались.