fix(server): PR #132 review round 2 — 14 actionable comments addressed

Blockers (4):
- Wire cargo deny check into pre-pr-server (was dead config) (#1)
- ConfirmBookmark idempotency guard: SimError ProtocolError on retry (#2)
- D-080 amendment: transfer_npc_knowledge retained-but-dormant honest doc (#3)
- SelectedBookmark v0.2 transient scope; save/load deferred to #863 (#4)

Issues (8):
- ConfirmBookmark validation tests: unknown id, invalid location,
  valid path, double-confirm guard (#5)
- snapshot_with_bookmark_catalog fixture for client #618 decode tests (#6)
- generate_brands: replace 5 raw .unwrap() with eprintln+exit pattern (#7)
- npc_knowledge_transfer.rs: stale run_npc_conversations refs cleaned (#8)
- monologue.rs: residual D-078 "overheard conversations" doc removed (#9)
- 5 test files: orphan blank lines from removed conversation_* fields (#10)
- BookmarkCatalog: add PartialEq, Eq derives (matches sibling) (#11)

Nits (2):
- culture_tag doc: describe BookmarkRegistry::build_catalog behavior,
  remove "until #679 lands" placeholder (#13)
- generate_brands seed=1 canonical comment (#14)

Follow-ups filed:
- #862 — BookmarkPlugin::new(registry) injection (#12 deferred)
- #863 — Wire SelectedBookmark into SaveState (Sprint 37)

Pre-pr-server: fmt clean, clippy clean, deny clean, build clean.
nextest save_io failures pre-existing parallelism issue (sequential
cargo test --lib passes 20/20).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-19 18:04:46 +02:00
co-authored by Claude Opus 4.7
parent e86e53ec06
commit 13530910c9
14 changed files with 275 additions and 32 deletions
+23 -6
View File
@@ -58,7 +58,9 @@ struct Cli {
)]
output: PathBuf,
/// PRNG seed for deterministic generation
/// PRNG seed for deterministic generation.
/// Seed 1 is canonical — the committed output in db/ was produced at seed=1.
/// Use a different seed only for experimentation; committed output must stay seed=1.
#[arg(long, default_value = "1")]
seed: u64,
@@ -207,7 +209,10 @@ fn load_corps(conn: &Connection) -> Vec<Corp> {
LEFT JOIN star_systems ss ON co.headquarters_system = ss.system_id
ORDER BY co.corp_id",
)
.unwrap();
.unwrap_or_else(|e| {
eprintln!("error: failed to prepare corps query: {}", e);
process::exit(1);
});
stmt.query_map([], |row| {
Ok(Corp {
@@ -219,7 +224,10 @@ fn load_corps(conn: &Connection) -> Vec<Corp> {
shadow_economy_access: row.get::<_, i64>(5).unwrap_or(0) != 0,
})
})
.unwrap()
.unwrap_or_else(|e| {
eprintln!("error: failed to query corporations: {}", e);
process::exit(1);
})
.filter_map(|r| r.ok())
.collect()
}
@@ -227,9 +235,15 @@ fn load_corps(conn: &Connection) -> Vec<Corp> {
fn load_valid_commodity_ids(conn: &Connection) -> BTreeSet<String> {
let mut stmt = conn
.prepare("SELECT commodity_id FROM commodities")
.unwrap();
.unwrap_or_else(|e| {
eprintln!("error: failed to prepare commodities query: {}", e);
process::exit(1);
});
stmt.query_map([], |row| row.get::<_, String>(0))
.unwrap()
.unwrap_or_else(|e| {
eprintln!("error: failed to query commodities: {}", e);
process::exit(1);
})
.filter_map(|r| r.ok())
.collect()
}
@@ -626,7 +640,10 @@ fn main() {
process::exit(1);
});
conn.execute_batch("PRAGMA journal_mode=WAL; PRAGMA foreign_keys=ON;")
.unwrap();
.unwrap_or_else(|e| {
eprintln!("error: failed to configure DB pragmas: {}", e);
process::exit(1);
});
// Load corps and commodity IDs
println!(" [2/5] Loading corporations and commodities...");