Review fixes from Hoshe + Tyre:
- EntityRng seeding: splitmix64(seed) ^ splitmix64(id) instead of
splitmix64(seed + id) — eliminates collision class where adjacent
seeds produce identical streams
- AtomicBool ordering: Relaxed → SeqCst for shutdown flag (correct
on weakly-ordered architectures)
- Worker Drop: join handles instead of detaching threads
- Normalize stub API: remove ChunkGenWorker convenience wrappers,
use .pool consistently across all 3 workers
- trigger_monologue: downgrade &mut to shared refs (no-op anchor
was blocking parallel systems)
- Remove dead SimRng inserts from migrated monologue tests
- Document determinism gap on poll_worker_results
- Document bevy_tasks/rayon dep rationale in Cargo.toml
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Generic BackgroundWorkerPool<Req, Resp> with crossbeam channels, closure
handlers, and 3 delivery strategies (Fallback, GracefulDegrade, ModalLock).
Stub workers registered as Bevy resources:
- ChunkGenWorker (2 threads) — terrain/props/navmesh generation
- NpcPrepWorker (1 thread) — pre-compute NPC state for incoming areas
- OffscreenTickWorker (1 thread) — advance NPCs outside active tier
Tick loop integration:
- PreInput: poll_worker_results drains completed work
- PostSnapshot: push_worker_requests queues new work (no-op until Phase 5)
Handlers are stubs — real computation plugs in when the phases that need
them arrive. The infrastructure (channels, threads, push/poll, shutdown)
is real and tested.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>