Replaced the deterministic active-effect prose injector introduced earlier on 2026-07-27. The injector guaranteed effect presence but exposed the complete authored effect and movement constraint as a conspicuous state-report paragraph.
- Removed all backend insertion of raw active-effect sensation and constraint prose.
- Project known active effects and perceptible onset transitions with opaque narration references; raw effect IDs are not exposed to the narrator.
- Require the narrator to return ordered natural-language beats with typed effect-reference coverage.
- Validate that every required ongoing effect and onset transition is covered before prose is emitted or persisted.
- Request one bounded correction when the structured response is invalid or incomplete.
- Refuse to commit a turn with required effects when valid natural coverage cannot be obtained; deterministic fallback never dumps raw effect manifestations.
- Apply the same contract to regenerated narration.
- Emit only joined natural prose after the safety-state recheck; JSON and references remain private.
- Updated EventHorizon requirements REQ-0498 and REQ-0500.
- Workspace tests: backend 347 passed; frontend 8 passed; no failures.
- Requirements JSONL parsed successfully; Rust formatting and diff checks passed.
- Gitea workflows passed: frontend in 2m26s; build/deploy in 6m46s.
- Merge commit:
f84a23d2ec70b0301f02619eea5250ca273cd3c2.
- Production image:
gitea.app.lan/eventhorizon/eventhorizon:sha-f84a23d2ec70.
- Kubernetes rollout completed with 2/2 new replicas ready and zero restarts.
/healthz returned ok; /readyz reported PostgreSQL and Qdrant ready.
The turns persisted at 19:17:57 and 19:19:05 UTC were handled by the retiring sha-e90dc08e53f3 pod and therefore still contain the old injected paragraph. The new replicas started at 19:18:25 and 19:18:38 UTC; no natural gameplay turn fully processed by the new narration path had completed at verification time. No synthetic turn or session mutation was performed.