Record slice 9 A-B review.

Phases 41-43 checked on b38d0bb. 44 and 46 were in flight; Outgoing.talkCircleBonus is a no-op at max 4.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Leonid Pershin
2026-08-20 13:35:16 +03:00
co-authored by Cursor
parent b38d0bb628
commit 26666ba426
2 changed files with 40 additions and 0 deletions
+39
View File
@@ -0,0 +1,39 @@
# Журнал ревью — срез 9
## Срез 9. Этапы A–B — мнения и разговоры
- **Фазы:** 4143
- **Проверен на:** `b38d0bb`, 2026-08-20
- **Пути:** `src/HSchool.People/OpinionStore.cs`, `src/HSchool.People/OpinionGenerator.cs`, `src/HSchool.People/OpinionLabels.cs`, `src/HSchool.Ai/TalkCircles.cs`, `src/HSchool.Simulation/MorningOpinions.cs`, `src/HSchool.Simulation/TalkCircleSystem.cs`, `src/HSchool.Simulation/School.cs`, `src/HSchool.Server/Game/PersonCardReader.cs`, `src/HSchool.Server/mods/core/defs/topics/`, `src/HSchool.Server/mods/core/defs/traits/`, `src/HSchool.Client/src/ui/personCard.ts`, `docs/protocol.md`, `tests/HSchool.People.Tests`, `tests/HSchool.Ai.Tests`, `tests/HSchool.Simulation.Tests`
- **Итог:** обещания 41–43 на месте; дописано 14 тестов; исправлено 2 расхождения (сейв мнений после разговора; `PickTopic` почти всегда брал последнюю тему). 44 и 46 — **в работе на момент проверки** (44 🔄, 46 ⬜). 45 и 47 в этот проход не входили.
- **Открыто:** `Outgoing.talkCircleBonus` не меняет размер кружка при `talkCircleMax` 4 и жёстком clamp 4.
### Что проверено
Каждый пункт «Тесты, без которых фаза не закрыта» у 41–43 имеет отдельный тест. Клиент рисует присланную `opinionLabel`, вкладка «Связи» не монтирует лог и ничего не POST-ит. Сокет 41–43 не бампили. `dotnet test` с `--filter` по затронутым классам зелёный.
### Что дописано
- `OpinionStoreTests.SetZero_RemovesTheEntry`
- `OpinionStoreTests.Set_ClampsToMinusOneHundredAndOneHundred`
- `OpinionGeneratorTests.RosterJson_RoundTripsFamilyOpinions`
- `OpinionGeneratorTests.SaveWithoutOpinionsField_SeedsFamilyOnLoad`
- `MorningOpinionsTests.DriftToZero_DropsTheRecord`
- `TalkCirclesTests.NodeFriendScore_PullsTowardFriends_NotEnemies`
- `TalkCirclesTests.LunchNodeBlockedByEnemy_OnlyWhenAnotherSeatExists`
- `TalkCirclesTests.GossipAndOutgoing_UseTraitFields_NotHardcodedIdLists`
- `TalkCirclesTests.GossipTrait_BiasesPickTopicTowardGossipTag`
- `TalkCirclesTests.AppearanceTopic_UsesDressAppropriateness`
- `TalkCirclesTests.CommunicationGain_IsLessThanLessonSkillPerHour`
- `TalkCirclesTests.PickTopic_IsNotAlwaysTheLastNameAlphabetically`
- `TalkCircleTests.TalkCircleFinish_MarksTickPeopleChangedSoSaveWritesOpinions`
- `WhisperTests.CaughtWhisper_BecomesDisciplineTalkWithTeacher`
### Что исправлено
- Конец кружка писал мнения в ростер, но `Tick` не возвращал `peopleChanged` — воркер не сохранял `people.json` до утреннего дрейфа.
- `PickTopic` сравнивал бросок в шкале `0…total` с курсором `0…1`, поэтому тема почти всегда была последней по имени, а сплетник не сдвигал выбор.
### Открытое
- Черта «общительный» задаёт `talkCircleBonus: 1`, но `MaxSize` клампит к 4 при уже `talkCircleMax` 4 — поле мёртвое, пока верхний потолок не ниже 4. Менять ванильный размер кружка ревью не стало.