fix(simulation): PR #68 review — version bump, tracing warns, test coverage

- Bump PROTOCOL_VERSION 14 → 15 for save_result field addition
- Add tracing::warn on SaveLoadPending command overwrite (double-tap F5)
- Add tracing::warn on KnowledgeGraph::new() fallback during save
- Fix misleading WouldBlock comment in tcp.rs
- Document SimSpacePressure.active_count pre-eviction timing
- Document entity-based eviction tie-breaking non-determinism
- Add ScopePinned eviction survival regression test
- Regenerate msgpack fixtures for protocol v15

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-25 12:32:35 +01:00
co-authored by Claude Opus 4.6
parent 17a9197b65
commit 23fbfdbfc5
17 changed files with 150 additions and 9 deletions
+30 -3
View File
@@ -84,9 +84,10 @@ pub fn save_to_file(path: &Path, world: &mut World) -> Result<(), SaveLoadError>
// Player knowledge graph — the observer's epistemics at save time
let player_knowledge = {
let mut q = world.query_filtered::<&KnowledgeGraph, With<PlayerCharacter>>();
q.single(world)
.cloned()
.unwrap_or_else(|_| KnowledgeGraph::new())
q.single(world).cloned().unwrap_or_else(|_| {
tracing::warn!("save_to_file: no PlayerCharacter with KnowledgeGraph found — saving empty graph");
KnowledgeGraph::new()
})
};
// Global NPC social web
@@ -610,6 +611,32 @@ mod tests {
assert!(result.error.is_some(), "error message should be present");
}
// -----------------------------------------------------------------------
// Overwrite behaviour
// -----------------------------------------------------------------------
/// When two commands arrive in the same tick, the second overwrites the first.
/// The warn! in process_player_input fires; here we just confirm last-write-wins.
#[test]
fn pending_command_overwrite_last_write_wins() {
let mut pending = SaveLoadPending::default();
pending.pending = Some(SaveLoadCommand::Save {
path: PathBuf::from("/tmp/first.msgpack"),
});
// Overwrite with a Load command
pending.pending = Some(SaveLoadCommand::Load {
path: PathBuf::from("/tmp/second.msgpack"),
});
match pending.pending.unwrap() {
SaveLoadCommand::Load { ref path } => {
assert_eq!(path.to_str().unwrap(), "/tmp/second.msgpack");
}
other => panic!("expected Load, got {:?}", other),
}
}
// -----------------------------------------------------------------------
// SaveLoadError display
// -----------------------------------------------------------------------