A Core Agent MUST:
- Negotiate the protocol version and tolerate unknown fields (AWP-VER-002..003).
[AWP-AGT-001] - Parse the world manifest and refuse to open a session against a manifest it cannot validate against the canonical schema.
[AWP-AGT-002] - Submit only granted action types on granted embodiments and subscribe only to granted channels (AWP-PRM-001).
[AWP-AGT-003] - Generate unique
action_ids and resubmit only with identical content (AWP-ACT-001).[AWP-AGT-004] - Handle every lifecycle state, including
pending_approval,queued,cancelling, andpreempted, and deduplicate redelivered statuses on(action_id, status_seq)(AWP-LIF-009).[AWP-AGT-005] - Send heartbeats at the negotiated interval carrying
origin_ns, answer the world’s pings withreceive_nsandtransmit_ns, and in lockstep callworld.tickrather than waiting for completion (AWP-SAF-001, AWP-CLK-007, AWP-TIM-002).[AWP-AGT-006] - On
session.resume, passlast_status_seqand treat the embodiment as being in safe state until a new action executes (AWP-CTL-008, AWP-SAF-008).[AWP-AGT-007] - Maintain the clock-offset estimate from heartbeat exchanges and express every agent-originated session-clock value through it (AWP-CLK-008, AWP-CLK-009).
[AWP-AGT-008] - Expose
world.tickas an explicit call and never advance time as a side effect of any other operation; an SDK helper that submits and ticks in one step MUST be a distinct, lockstep-only entry point that fails in a streaming session.[AWP-AGT-009]
inline, snapshots, approval, envelopes, and the safe-state watchdog are not required by Core; they arrive with profiles. A Core world that offers streaming does still declare safe_state (AWP-MAN-006), stamps ts_send_ns on every observation frame (AWP-OBS-006), and sends session.telemetry (AWP-TIM-006), because those are part of the streaming time model itself.