Part of epic #112.
Depends on: #113, #114.
Change
1. New feature in arcane-demos/Cargo.toml:
[features]
clustering-sim = ["arcane-infra/affinity-clustering"]
[[bin]]
name = "arcane-clustering-sim"
path = "src/bin/arcane_clustering_sim.rs"
required-features = ["clustering-sim"]
2. New binary src/bin/arcane_clustering_sim.rs — synchronous loop (no Tokio), no WebSocket, no Redis:
create_grouped_agents to create agents across M initial zones
set_party_assignments on ClusterManager from agent group_ids
- Per tick:
tick_grouped_agents → update_entity per agent → run_evaluation_cycle every eval_interval ticks
- Emit one JSON line per evaluation:
{"tick":N,"model":"...","clusters":N,"merges":N,"splits":N,"group_fragmentation":F,"groups_co_located":N}
- CLI flags:
--agents, --group-size, --zones, --ticks, --eval-interval, --model rules|affinity, --compare
3. Extract run_sim(config) -> SimResult library function callable from tests without spawning a subprocess.
4. New integration test tests/clustering_sim_tests.rs — Test E:
// 30 agents, 3 groups of 10, 3 zones, 300 ticks, eval every 10
let affinity = run_sim(SimConfig { model: Model::Affinity, ticks: 300, .. });
let rules = run_sim(SimConfig { model: Model::Rules, ticks: 300, .. });
assert!(affinity.final_fragmentation < 0.25);
assert!(rules.final_fragmentation > affinity.final_fragmentation + 0.2);
Acceptance criteria
Spec
See §4.8, §5.3, §7, §8 in demo_agent_group_behaviour.md.
Part of epic #112.
Depends on: #113, #114.
Change
1. New feature in
arcane-demos/Cargo.toml:2. New binary
src/bin/arcane_clustering_sim.rs— synchronous loop (no Tokio), no WebSocket, no Redis:create_grouped_agentsto create agents across M initial zonesset_party_assignmentson ClusterManager from agent group_idstick_grouped_agents→update_entityper agent →run_evaluation_cycleeveryeval_intervalticks{"tick":N,"model":"...","clusters":N,"merges":N,"splits":N,"group_fragmentation":F,"groups_co_located":N}--agents,--group-size,--zones,--ticks,--eval-interval,--model rules|affinity,--compare3. Extract
run_sim(config) -> SimResultlibrary function callable from tests without spawning a subprocess.4. New integration test
tests/clustering_sim_tests.rs— Test E:Acceptance criteria
--features clustering-sim--model rulesworks withoutclustering-simfeature (falls back gracefully)group_fragmentation < 0.25at tick 300; rules fragmentation exceeds affinity by ≥ 0.2--compareemits interleaved JSON lines for both models on the same agent sequencearcane-demotests pass (no regressions)cargo test -p arcane-demo --features clustering-simpassescargo clippy -- -D warningspassesSpec
See §4.8, §5.3, §7, §8 in
demo_agent_group_behaviour.md.