Found 5 issues. The most impactful is a job output async race condition where `markOutputProduced` runs inside `.then()` after `produceOutput`, allowing duplicate production on consecutive ticks β fix by marking synchronously before the async call. Also found: duplicate ritual conversations from multi-sphere belief overlap, raw numeric stats leaking into creature thoughts (breaking immersion), encounter speech truncation from missing `num_predict`, and revelation spam from attempting divine_revelation when no eligible creatures exist.
(HIGH): Job output fires twice β async race condition in `markOutputProduced`
Fix: Mark output produced synchronously *before* the async call, not inside `.then()`: (code change) β
(MEDIUM): Duplicate ritual conversations β same pair has multiple ritual types at one site
Fix: In `detectRituals()`, limit each pair to one ritual per POI by tracking which creatures already have a ritual at that site: (code change) β
(MEDIUM): Social think leaks raw numeric stats β LLM parrots βenergy is 67/100β
Fix: Replace numeric stats with experiential descriptors: (code change) Add a helper function at the top of the file: (code change) Also reinforce first-person in the instruction at line 177:
(code change) β
(MEDIUM): Encounter speech truncated mid-word β missing `num_predict` on encounter LLM calls
Fix: Add `num_predict: 384` to the encounter Ollama options: (code change) Also add it to the social think call (line 4312-4316), which uses `enqueueRaw` without any options: (code change) β
(LOW): Kron revelation rejection spam β `getCreaturesOnCooldown` time unit mismatch
Fix: In `world-brain.ts`, skip the entire divine_revelation option when no eligible creatures exist: (code change) This completely removes divine_revelation from the LLMβs options when no eligible creatures exist, rather than relying on βDO NOT pickβ instructions that small LLMs ignore. ββ¦