The 3D layer never feeds back
The browser receives zones and activities and decides everything about bodies: where they walk, which way they face, what gesture they make. Nothing in the rendering layer may write back to the simulation except a click to select.
The contract
The server says: this person is at the railing, doing gossip, aimed at that person. The browser walks the figure there at walking pace, turns it to face its target, and drifts it while it stands. If the renderer needs to know something, that something goes in the world state and not into a variable in a component.
One gesture per action kind
POSES maps every engine ActionKind to a gesture. An offer is an open hand, a rumour is a hand at the mouth, a toast raises a glass, a refusal leaves you with your arms down. Add an ActionKind, add a pose: the map is exhaustive on purpose, so a new rule cannot be invisible.
Focus: the last loud public thing
Set once per snapshot instead of per frame. Everyone near it turns their head, a shock ring runs across the floor, and the camera eases onto it and pushes in, then hands control straight back the moment you touch anything.
A camera that keeps taking the shot back is the most irritating thing a live simulation can do. Yield on first input, always.
Furniture
LocationSpec.standOff is how far back people stand in a zone with something in the middle of it. Without it, the room stands on the card table, which is the kind of bug that makes a scene read as tokens instead of people and costs nothing to fix once you know the zone has a shape.
Read next
One party in memory, streamed to everyone
A room is a single party held in server memory and streamed to every watcher, so everybody sees the same betrayal at the same moment and the model is paid for once per beat however many people are looking.
Drawing four hundred people
The valley is a handful of instanced meshes, three for people and five for houses by tier and one for trees, with frustum culling off, world-sized bounding spheres set once, and clicks landing on invisible fat capsules.
Server-sent events for a live simulation
Simulation frames go out over server-sent events, which are one-way, plain HTTP and reconnecting for free, because nothing a watcher does needs a socket and the little that does is an ordinary POST.
Two clocks: real time, not turns
Characters act on their own clocks. Each one wakes when its cadence comes round, makes its call, and moves the instant the answer lands, while the slow physics and the room's decisions run on beat boundaries.