Files
h-school/docs/phases/09-social/reviewed.md
T
Leonid PershinandCursor 19554d4362 Review slice 9 C-D: persist clash opinions and the bully's victim.
FinishConflict never set RosterTalkDirty, so people.json skipped quarrel shifts until some other save — the same seam as the A-B talk-circle fix. First BullyVictimId write stayed in RAM only.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-20 14:27:49 +03:00

68 lines
7.7 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.
# Журнал ревью — срез 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. Менять ванильный размер кружка ревью не стало.
## Срез 9. Этапы C–D — конфликт, присутствие, речь и romance
- **Фазы:** 4447
- **Проверен на:** `PLACEHOLDER`, 2026-08-20
- **Пути:** `src/HSchool.Ai/Conflict.cs`, `src/HSchool.Simulation/TalkCircleSystem.cs`, `src/HSchool.Simulation/PresenceSystem.cs`, `src/HSchool.Simulation/AffinitySystem.cs`, `src/HSchool.Simulation/MorningOpinions.cs`, `src/HSchool.People/Affinity.cs`, `src/HSchool.People/OrientationGenerator.cs`, `src/HSchool.Content/SpeechRules.cs`, `src/HSchool.Protocol/ProtocolCodec.cs`, `src/HSchool.Client/src/net/protocol.ts`, `src/HSchool.Client/src/format/talkCircle.ts`, `src/HSchool.Client/src/ui/dressRulesPanel.ts`, `src/HSchool.Client/src/ui/personCardNow.ts`, `src/HSchool.Client/src/ui/personCardConnections.ts`, `src/HSchool.Server/mods/romance/`, `src/HSchool.Server/Game/PresenceFrame.cs`, `src/HSchool.Server/Api/SpeechRulesModels.cs`, `docs/protocol.md`, `tests/HSchool.Ai.Tests/ConflictTests.cs`, `tests/HSchool.Simulation.Tests/QuarrelFightTests.cs`, `tests/HSchool.Simulation.Tests/TalkCircleTests.cs`, `tests/HSchool.Simulation.Tests/MorningOpinionsTests.cs`, `tests/HSchool.Protocol.Tests/ProtocolCodecTests.cs`, `tests/HSchool.People.Tests/AffinityTests.cs`, `tests/HSchool.People.Tests/OrientationGeneratorTests.cs`, `tests/HSchool.Content.Tests/RomancePackTests.cs`, `tests/HSchool.AppHost.Tests/RomancePackTests.cs`, `tests/HSchool.AppHost.Tests/SpeechRulesApiTests.cs`
- **Итог:** обещания 44–47 на месте; дописано 4 теста; исправлено 2 расхождения с тем же швом, что у 41–43 (сейв после ссоры; id жертвы задиры). `Seed.Mix` в политиковых тестах не трогали. Фазу 60 не закрывали.
- **Открыто:** строка локации для тем пака `romance` показывает `defName`, не локаль пака.
### Что проверено
Каждый пункт «Тесты, без которых фаза не закрыта» у 44–47 имеет отдельный тест. Ссора/драка — поля черт, не `defName`; skip пустого двора бросает кружок, а не тащит драку через выходные; нужды «здоровье» нет. Кадр присутствия v9 несёт id кружка и темы, имён нет; «Сейчас» собирает ту же строку из directory. Политика речи — с завтра, POST сегодня не переписывает живой кружок. Ваниль и `example` без романтических тем; пара только 18+; учитель → ученик не получает симпатию. Хостовые `RomancePackTests` / `SpeechRulesApiTests` в этом проходе не гонялись (политика тестирования: не AppHost, сервер пользователя не трогали). `dotnet test` с `--filter` по `QuarrelFightTests`, `RosterJson_RoundTripsBullyVictimId` и `PupilTalkWithTeacherCrush` зелёный.
### Что дописано
- `QuarrelFightTests.QuarrelFinish_MarksTickPeopleChangedSoSaveWritesOpinions`
- `QuarrelFightTests.BullyPickingAVictim_DirtiesRosterSoSaveKeepsTheId`
- `OpinionGeneratorTests.RosterJson_RoundTripsBullyVictimId`
- `AffinityTests.PupilTalkWithTeacherCrush_WritesRebuffAndDropsOpinion`
### Что исправлено
- Конец ссоры, драки и извинения писал мнения, но не ставил `RosterTalkDirty` — воркер не сохранял `people.json` до следующего чужого сдвига, как с кружком до ревью A–B.
- Первая запись `BullyVictimId` оставалась только в памяти: после перезагрузки задира бросал кубик заново.
### Открытое
- Клиентский `talkTopicLabel` знает только ванильные ключи. Тема пака в локации — сырой id; в логе карточки подпись берётся из каталога. Вшивать строки пака в ванильный словарь ревью не стало.