M1-04B (part B of M1-04) - snapshot build + hand-off on a fixed pool of 4 threads; 1,000 bots re-measured Machine: Apple M3 (4P+4E), shared with other projects; load average read before/after each run (sysctl vm.loadavg). Change: services/zone/src/pool.rs ShardPool (std threads, no crate): clients in stable shards (slot % 4), shard 0 on the tick thread, shards 1-3 on zone-snap-1..3; per tick the workers get a shared read-only handle on the tick's ZoneState, build + hand off their own clients, drop the handle and return the shard (the barrier). netcode.json server.snapshotWorkers 4 (proposed); --snapshot-workers 1 is the single-threaded path. Bots: loadTest.botMix fieldSpawnShare 0.5 (proposed): half the bots spawn inside a random hunting zone (in-process load server only). Determinism / allocation: services/zone/tests/snapshot_pool.rs - 60 clients, 800 moving entities, per-client ack lags: 4 shards produce byte-identical snapshots to 1 shard for 100 compared ticks; 60 warm ticks of both pools allocate nothing on any thread. snapshot_no_alloc still passes (task log M1-04B-01 PASS). Run 1 (metrics-80s-4workers.json, 4 snapshot workers): 1,000 bots, 20 s ramp + 60 s hold. PASS. load 13.95 27.49 26.56 -> 100.01 47.00 33.85 1000/1000 joined, 0 disconnects, 0 skipped frames, 0 dropped ticks loop p50 6.38 p99 12.10 (target 15) max 82.44 ms; 8 ticks over the target phase means: ingest 0.25, tick 0.91, build 2.59 + hand-off 1.30 (slowest shard), pool wait 1.14 ms CPU per tick: tick thread 2.94 ms (p99 5.13) + workers 6.45 ms downstream per bot (hold) mean 3,743 p95 9,896 max 10,587 B/s (target avg <= 12,000, hard cap 32,000) RTT p50 45.0 p99 55.3 ms Run 2 (metrics-80s-1worker.json, single-threaded comparison, same bots and placement): FAIL under machine load. load 54.78 41.94 32.60 -> 62.33 48.55 36.01 loop p50 16.60 p99 2,611.86 ms (one stall; 160 dropped ticks, 563 skipped frames) phase means: build 14.52, hand-off 8.89 ms; tick-thread CPU mean 10.95 p99 16.90 ms The single-threaded path does ~11 ms of CPU per tick on one thread: with any load it misses 15 ms p99. Not done here (M1-04C): --steps stepped ramp 100/250/500/1,000, the 10-minute hold, memory-drift check, per-second RSS and RTT series, the Grafana-like PNG chart and the card's soak pass/fail.