> ## Documentation Index
> Fetch the complete documentation index at: https://www.agentworldprotocol.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Actions

> Actions are typed intents with duration and a lifecycle — not fire-and-forget RPCs.

The single biggest departure from tool-calling protocols: an AWP action is an **intent that unfolds over time**. "Move arm to pose X" takes two seconds and might fail halfway. The protocol therefore gives every action a lifecycle:

```
submit → admitted as pending_approval | queued | accepted   (or rejected)
       → accepted → executing (progress…) → completed | failed | preempted
                                          → cancelling → cancelled
```

Three gates, kept separate: **admission** (the world acknowledges the intent within a bounded time and says where it stands), **permission** (`accepted`: the action may execute), and **execution**. Approval and queueing are states between the first two, so a human taking sixty seconds to approve never breaks the admission bound.

Actions are **typed**. The world's manifest declares each action type as a JSON Schema with units and ranges:

```json awp:action-schema theme={null}
{
  "type": "move_to_pose",
  "params_schema": {
    "type": "object",
    "properties": {
      "pose": { "$ref": "https://agentworldprotocol.com/schemas/v0.1/common.schema.json#/$defs/pose" },
      "frame": { "type": "string" },
      "max_velocity_mps": { "type": "number", "maximum": 1.5 }
    },
    "required": ["pose", "frame"]
  },
  "duration": "extended",
  "preemption": "replace",
  "requires_approval": false
}
```

Key properties:

* **Idempotency** — every submission carries a client-generated `action_id`; resubmission after reconnect with the same content is safe, and the same id with different content is refused.
* **Exactly one outcome** — every action reaches one terminal state; its notification may be redelivered after a reconnect, so agents deduplicate on `(action_id, status_seq)`.
* **Validation** — worlds MUST validate params against the schema and reject out-of-range values before execution.
* **Preemption policy** — each type declares what a new action does to a running one: `queue`, `replace`, `blend`, or `reject`. See [preemption](/spec/loop/preemption).
* **Approval** — types marked `requires_approval` pause at the boundary for a human or supervisor. See [approval](/spec/safety/approval).

Full normative rules: [action lifecycle](/spec/loop/action-lifecycle).
