fix(simulation): address PR #85 review — warnings and polish items

- Ticker rotation: document sliding-window semantics (vs modulus-aligned)
- Ticker zone ID: add warning about Gauntlet vs production zone ID mismatch
- Proof-room movement profile: respect archetype instead of hardcoding smuggler
- Storyteller tie-break: use exact f32 equality (inputs are discrete integers)
- Observer: .map().flatten() → .and_then() (clippy strict)
- Content loader: remove dangling doc comment before section header
- Tests: replace assert!(false, ...) with TODO comments in ignored tests
- Tests: add frame limiter note on 302-update loop in tell expiry test

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-05 10:59:38 +01:00
co-authored by Claude Opus 4.6
parent 37c38c0441
commit 9ed6094d69
7 changed files with 27 additions and 21 deletions
+7 -15
View File
@@ -202,49 +202,41 @@ fn ticker_yaml_category_distribution_is_sane() {
#[test]
#[ignore = "pending TickerPool implementation (#591)"]
fn ticker_pool_loads_all_30_headlines() {
// TickerPool::load() should parse the YAML and hold all 30 headlines.
// TODO: TickerPool::load() should parse the YAML and hold all 30 headlines.
// Verifies content loader wiring (ticker/ subdirectory is scanned).
assert!(false, "Implement: TickerPool::load() returns pool with len() == 30");
}
#[test]
#[ignore = "pending TickerPool implementation (#591)"]
fn ticker_rotates_at_200_tick_boundary() {
// After TICKER_ROTATION_TICKS (200) ticks, the active headline changes.
// TODO: run 200 ticks, assert current_headline changes.
// Must use SimRng — running with same seed must produce same sequence.
assert!(false, "Implement: run 200 ticks, assert current_headline changes");
}
#[test]
#[ignore = "pending TickerPool implementation (#591)"]
fn ticker_rotation_is_deterministic_under_same_seed() {
// TODO: two apps, same seed, assert same ticker at tick 200 and 400.
// D-010 principle 4: deterministic simulation.
// Two sessions with the same seed must show the same ticker sequence.
assert!(false, "Implement: two apps, same seed, assert same ticker at tick 200 and 400");
}
#[test]
#[ignore = "pending current_ticker in ObserverSnapshot (#591)"]
fn current_ticker_is_none_when_player_is_not_in_bar_zone() {
// When player is outside "bar" zone, current_ticker must be None.
// TODO: player in terminal zone → snapshot.current_ticker is None.
// Edge case: don't leak bar headlines into The Terminal or corridor zones.
assert!(false, "Implement: player in terminal zone → snapshot.current_ticker is None");
}
#[test]
#[ignore = "pending current_ticker in ObserverSnapshot (#591)"]
fn current_ticker_is_some_when_player_is_in_bar_zone() {
// When player is in "bar" zone, current_ticker must be Some.
// Spec: zone_id == "bar" (from zone.rs LAST_SHIFT_BAR_ZONE or equivalent).
assert!(false, "Implement: player in bar zone → snapshot.current_ticker is Some");
// TODO: player in bar zone → snapshot.current_ticker is Some.
// Spec: zone_id from zone.rs LAST_SHIFT_BAR_ZONE or equivalent.
}
#[test]
#[ignore = "pending current_ticker in ObserverSnapshot (#591)"]
fn ticker_line_dual_lens_field_not_in_wire_format() {
// TODO: serialize TickerLine, assert no dual_lens key in msgpack output.
// D-036 says dual_lens is authoring metadata ONLY — must not cross the wire.
// TickerLine wire struct must NOT have a dual_lens field.
// This is a security/info-boundary concern: the dual_lens notes contain
// game design commentary that should not be visible to players via the API.
assert!(false, "Implement: serialize TickerLine, assert no dual_lens key in msgpack output");
}
+3 -1
View File
@@ -217,7 +217,9 @@ fn routine_deviation_expires_after_duration() {
});
}
// Run enough ticks to trigger expiry (301 > TELL_ESCALATION_DURATION_TICKS = 300)
// Run enough ticks to trigger expiry (301 > TELL_ESCALATION_DURATION_TICKS = 300).
// Note: 302 updates is acceptable for a unit test; if this becomes a perf concern
// when un-ignored, consider advancing SimulationTime directly instead of looping.
for _ in 0..302 {
app.update();
}