Formatting pass across simulation, perception, knowledge, NPC, and
test modules. Includes two clippy fixes in monologue.rs (.values()
instead of for (_, v) pattern).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New ListeningFocus component tracks stationary_ticks for eavesdrop
mechanic. Increments when position unchanged, resets on movement.
Sprint stance blocks accumulation, Careful reduces threshold from
30 to 20 ticks. Registered in SimulationPlugin after validate_movement.
17 tests covering all stances, thresholds, and edge cases.
Ref: D-053 (stance system), D-018 (sound model)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New CognitiveDelay component buffers perception events before emitting
KnowledgeEvents. Normal delay: 6 ticks (0.6s), urgent: 3 ticks (0.3s).
Drain system runs after emit_observation_events, before process_knowledge_events.
Adds pending_recognitions to ObserverSnapshot (protocol v7) for client
fog entity visualization. Includes cancellation when entity leaves LOS.
Monologue fires during delay (not after) per D-060 — cross-system
wiring deferred to follow-up ticket #451.
Ref: D-060 (cognitive delay), D-031 (10 tps), D-059 (fog layers)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Formal spec at docs/architecture/line-pool-format.md defining YAML
structure for dialogue and monologue content files. Covers tag enums,
4-layer filtering pipeline, prerequisite-to-KG mapping, ID format,
validation rules, and Rust loader interface.
Fixes monologue schema: adds required constraint on relationship
prerequisite target/state fields.
Ref: D-028, D-032, D-035, D-041
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sprint 7 server entries: cognitive delay, ListeningFocus, YAML loader,
line pool spec, interaction memory schema.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Well-structured PR with comprehensive test coverage (37 tests across new modules), zero unsafe code, and good error handling. However, 3 critical bugs must be fixed before merge.
#
File
Severity
Issue
1
server/tests/serialization.rs
critical
Missing roundtrip test for PendingRecognitionWire. Protocol v7 adds pending_recognitions to ObserverSnapshot but no test verifies it survives MessagePack serialization. Wire format regression risk.
2
server/src/perception/observation.rs:139
critical
delay.cancel(&sid) can return None but code logs success unconditionally. Misleading logs when entity leaves LOS but was never pending. Check the Option return.
3
server/src/simulation/input.rs:47
critical
InputQueue has unbounded growth — no capacity limit on VecDeque::push_back(). Client flood or stalled ticks → OOM. Add capacity limit (~1000) with drop-oldest or reject.
4
server/src/content/hot_reload.rs:86
warning
System spins forever if content root path is invalid. Guard against zero-file watcher insertion.
5
server/src/content/line_pool.rs
warning
No validation that location header matches parent directory name (spec Section 3.2 requires it). Silent wrong data on misplaced files.
6
server/src/perception/observation.rs:84
suggestion
TODO comment without ticket reference — convert to tracked ticket.
7
server/src/content/line_pool.rs:356
suggestion
parse_tags() should log the invalid value itself, not just the error message.
walk_yaml() recursive traversal has no depth limit. Add ~100 level cap.
10
server/src/perception/cognitive_delay.rs:104
suggestion
is_pending() is O(n) — consider HashSet<StableId> for O(1) lookup at scale.
11
server/src/simulation/input.rs:241
suggestion
handle_take()/handle_place() don't emit knowledge events. KG won't know about inventory changes.
12
server/src/content/line_pool.rs:689
suggestion
Missing negative test for prerequisite filtering (line excluded when fact absent).
13
server/tests/observer
suggestion
No integration test for pending_recognitions field in compute_observer_snapshot.
Tyre (Architecture): APPROVE
Exceptionally solid architectural work. All systems respect D-010 determinism (BTreeMap everywhere), D-020 client-server separation (wire types properly isolated), and D-030 testability (37 tests, no test-only production paths). Documentation is specification-grade. System ordering is explicit and correct.
#
File
Severity
Issue
1
server/src/bridge/types.rs:7
critical
PROTOCOL_VERSION bumped to 7 — verify client branch has matching update before merge. Mismatch causes silent data corruption.
2
docs/architecture/interaction-memory-schema.md:78
warning
ContentSlug component prerequisite doesn't exist yet — no ticket reference. Create ticket for Sprint 8.
3
server/src/simulation/listening.rs:22
warning
ListeningFocus.last_position is 12-byte overhead per entity. Fine for singleton player, won't scale to NPCs. Flag for v0.2.
4
server/src/perception/cognitive_delay.rs:23
suggestion
Add playtesting expectation comment on delay constants.
Protocol v7 verification: client branch has not been updated yet. Client PR should update PROTOCOL_VERSION to 7 and handle pending_recognitions field (with serde default for backward compatibility). Server uses #[serde(default)] on pending_recognitions so existing v6 clients won't break — they just won't see fog entity data until updated.
Protocol v7 verification: client branch has not been updated yet. Client PR should update PROTOCOL_VERSION to 7 and handle pending_recognitions field (with serde default for backward compatibility). Server uses #[serde(default)] on pending_recognitions so existing v6 clients won't break — they just won't see fog entity data until updated.
Critical fixes:
- Add PendingRecognitionWire serialization roundtrip test
- Check Option return from delay.cancel() before logging
- InputQueue capacity limit (1000) with drop-oldest and warning
- TODO in observation.rs references ticket #450
Warning fixes:
- Hot-reload guards against invalid/empty content root
- Location header mismatch warning in line pool indexing
- walk_yaml() depth limit (100) against symlink loops
- Consecutive reload failure counter (warns after 5+)
Test additions:
- Negative prerequisite filtering test for monologue lines
- Integration test for pending_recognitions in observer snapshot
- Eavesdrop threshold ordering assertion (Careful < default)
Documentation:
- Playtesting expectation comments on delay constants
- is_pending() scalability note for future NPC cognitive delay
- ID format regex validation in line pool spec
- BTreeMap vs sort() ordering clarification in loader
- Multiplayer TODO in relationships.rs references D-010
- ContentSlug ticket #452 filed for entity slug resolution
394 tests, 0 failures.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Sprint 7 server team deliverables — 5 tickets, all QA-reviewed and approved.
New systems
Architecture specs
Stats
Follow-up tickets filed
QA reviews (Hoshe)
Review: server → main (type: code)
Hoshe (Code Quality): REQUEST_CHANGES
Well-structured PR with comprehensive test coverage (37 tests across new modules), zero unsafe code, and good error handling. However, 3 critical bugs must be fixed before merge.
PendingRecognitionWire. Protocol v7 addspending_recognitionstoObserverSnapshotbut no test verifies it survives MessagePack serialization. Wire format regression risk.delay.cancel(&sid)can returnNonebut code logs success unconditionally. Misleading logs when entity leaves LOS but was never pending. Check theOptionreturn.InputQueuehas unbounded growth — no capacity limit onVecDeque::push_back(). Client flood or stalled ticks → OOM. Add capacity limit (~1000) with drop-oldest or reject.locationheader matches parent directory name (spec Section 3.2 requires it). Silent wrong data on misplaced files.parse_tags()should log the invalid value itself, not just the error message.walk_yaml()recursive traversal has no depth limit. Add ~100 level cap.is_pending()is O(n) — considerHashSet<StableId>for O(1) lookup at scale.handle_take()/handle_place()don't emit knowledge events. KG won't know about inventory changes.pending_recognitionsfield incompute_observer_snapshot.Tyre (Architecture): APPROVE
Exceptionally solid architectural work. All systems respect D-010 determinism (BTreeMap everywhere), D-020 client-server separation (wire types properly isolated), and D-030 testability (37 tests, no test-only production paths). Documentation is specification-grade. System ordering is explicit and correct.
PROTOCOL_VERSIONbumped to 7 — verify client branch has matching update before merge. Mismatch causes silent data corruption.ContentSlugcomponent prerequisite doesn't exist yet — no ticket reference. Create ticket for Sprint 8.ListeningFocus.last_positionis 12-byte overhead per entity. Fine for singleton player, won't scale to NPCs. Flag for v0.2.CHECK_INTERVAL_TICKSviaContentConfigfor authoring workflow tuning.sort()ordering guarantee.Decision compliance: D-010 ✅ | D-020 ✅ | D-026 ✅ | D-030 ✅ | D-041 ✅ | D-060 ✅
Verdict: CHANGES REQUESTED
Must fix (4 critical):
PendingRecognitionWireserialization testInputQueuegrowthShould fix (3 warnings):
ContentSlugprerequisite needs a ticketProtocol v7 verification: client branch has not been updated yet. Client PR should update PROTOCOL_VERSION to 7 and handle pending_recognitions field (with serde default for backward compatibility). Server uses #[serde(default)] on pending_recognitions so existing v6 clients won't break — they just won't see fog entity data until updated.
Re-review: fix commit
d4fdbf4Criticals
Warnings
11 of 19 suggestions addressed
Remaining suggestions are low-priority and can be deferred.
Verdict: BLOCKED on client protocol version bump
Client branch has
PROTOCOL_VERSION = 6, server has7. Must sync before merge to avoid wire corruption.Pull request closed