Sharpee multiuser — world-model as replicated state

Renderer keeps Zifmia's contract: query the world directly. Snapshots ride the wire next to OUTPUT.

Sandbox (Deno isolate, one per room) Owns execution. ADR-153 isolation preserved. GameEngine parser • language capability dispatch stdlib actions WorldModel (authoritative) entities • traits • relations capabilities (sharedData) toJSON() / fromJSON() deno-entry stdio frame loop snapshot & emit After each executeTurn: world.toJSON() → OUTPUT.world Server (Node) Owns sessions, broadcasts, persistence. Hydrates world per room. RoomManager spawn / lifecycle turn routing WorldModel (server mirror) hydrated from each OUTPUT.world queryable by RoomManager enables roster, scope hints, etc. WS broadcast story_output + world snapshot Browser client (each participant) Renders against local world. Same contract as Zifmia. WorldModel (client mirror) hydrated per turn React context zero-latency reads StatusLine world.getEntity(player).location.name capabilities.score / max / turns Transcript / Roster enrich text via world queries "X (held)" / "Y (worn)" Future panels map • inventory scope-aware UI COMMAND OUTPUT { text_blocks, events, world } command WS story_output { ..., world } authoritative mirror mirror

Reading the diagram

What this changes vs. today

Open questions