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
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).seq/ts_mono_ns they were based on.