chore(engine): server hygiene batch — workers tests, surname dedup, save pin (T-1063, T-1064)

- workers/pool.rs: 5 new tests; catch_unwind keeps worker threads alive on
  handler panic (in-flight request loss unchanged, pinned by test + #843
  docs); stubs.rs no longer falsely claims the pool is tested
- save/load: execute_save_load pinned .after(Storyteller) so the scheduler
  cannot legally save pre-Input state; exclusive-system exception recorded
  in tick_phases.rs rules
- surname corpus extracted to bin/shared/surname_corpus.rs (both economy
  generators import it; byte-identical output verified on 23.6MB+1.45MB
  TOMLs); all three stamp/watch registries updated
- generator_spike gated behind non-default 'generator-spike' feature
- economy.rs: 11 new D-181 signal-derivation tests on the new
  econ_sim Simulation::from_economy in-memory constructor
- perception exemption comments now state the consumer sort contract;
  unused bytemuck removed; rayon comment corrected; the 22 allow(dead_code)
  documented as serde schema enforcement

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-06-12 16:22:28 +02:00
co-authored by Claude Fable 5
parent c64231e8ee
commit 0bd895fcac
19 changed files with 903 additions and 673 deletions
+12 -2
View File
@@ -54,13 +54,23 @@ impl Simulation {
let conn = db::open_db(&db_pathbuf);
let economy = db::load_economy(&conn);
Ok(Self::from_economy(economy, run_seed))
}
/// Build a simulation directly from an in-memory [`db::Economy`] — no DB file.
///
/// Identical initialization to [`Simulation::load`] after the DB read:
/// deterministic productivity/shadow seeding from `run_seed`, warm-start
/// node states. Intended for unit tests and embedded callers that
/// construct small, fully-controlled economies (T-1064).
pub fn from_economy(economy: db::Economy, run_seed: u64) -> Self {
let productivity = seed::seed_all_productivity(&economy, run_seed);
let shadow = currency::seed_shadow_economy(&economy, run_seed);
let adjacency = trade::build_adjacency(&economy);
let archetypes = agents::build_archetype_map(economy.corp_archetype_data.clone());
let nodes = model::init_nodes(&economy);
Ok(Simulation {
Simulation {
economy,
productivity,
shadow,
@@ -72,7 +82,7 @@ impl Simulation {
tick: 0,
alpha: model::ALPHA,
beta: trade::BETA,
})
}
}
/// Try to load from the auto-detected DB path (same search as the CLI binary).