Skip to main content
The pattern: manifest → context → loop.
1

Render the manifest as capabilities

Turn each granted action schema into a tool-like description the model can select from, and each channel into a described percept source. This mirrors how MCP clients render tools.
2

Loop: observe, decide, submit, tick, read

In lockstep, await action.terminal() without a preceding tick() never resolves — the world does not advance on its own (AWP-TIM-002). Extended actions may need several ticks; loop on tick() until the status is terminal. In streaming mode drop the tick() call: the world advances on its own and statuses arrive as they happen.
3

Handle the lifecycle honestly

Feed failed, preempted, and clamped statuses back into context — they are the world teaching the model its limits. Never retry non-retryable errors with identical params (AWP-ERR-001).
Prefer subscribing to a scene-graph channel when the world offers one — structured entities and affordances beat raw pixels for LLM planning, and you can add pixels later for grounding checks.
For streaming worlds, run observation ingestion and decision-making concurrently, always stamping decisions with the seq/ts_mono_ns they were based on.