Dispatch

https://dispatch.foo/a2a/ext/gate/v1

From §8 of the Dispatch Messaging Protocol 1.0.0-draft.2.

8.3 Extension activation and placement

The three extensions carry what A2A 1.0 has no field for: DMP addressing, why a task is waiting on its owner, and handoffs of work. Each extension URI serves its own subsection together with this one.

An extension is active for a request when its URI appears in the A2A-Extensions header or in message.extensions. The response echoes the active URIs in A2A-Extensions, and a host MUST write extension metadata only for active extensions. A client that activates none gets the same facts as plain text in status.message.

Extension data sits in metadata[<URI>]. On a Message (including status.message) and on an Artifact, the object's extensions list also names the URI. A Task has no extensions field, so task-level data lives only in Task.metadata[<URI>], written when the request activated the extension.

All metadata on one message together MUST be at most 64 KiB as JSON; a host refuses more as invalid on message.metadata. The extensions fit well inside it: work/v1 tops out near 36 KB and envelope/v1 near 15 KB with inbound refs restricted as §8.4 says. Body (64 KiB), data (64 KiB), metadata (64 KiB) and A2A's framing fit a 256 KiB request. Vectors: a2a.envelope-ext.refuses-metadata-over-64-kib.

Each extension is versioned by its URI: a breaking change mints a new URI ending /v2 (§14.4). The registry of extension URIs is §11.10.

8.5 gate/v1

https://dispatch.foo/a2a/ext/gate/v1 is data only, and read only: it rides on status.message.metadata while a task is TASK_STATE_AUTH_REQUIRED (§8.7), and says which gates hold the task open.

interface GateStateV1 {
  gates: {
    id: string; // the gate's DMP message id
    type: string; // the gate's type (§5.6)
    openedAt: string; // ISO 8601
    waitingOn: 'owner';
  }[];
}

Only a deciding principal answers a gate, and a client never can (§5.2). A gate's data never leaves the host (§5.8): a tool-approval gate quotes a tool's input and a scope gate names paths. Only each gate's id, type and time leave, here, and status.message carries one fixed sentence per type in place of the gate's body. The Dispatch profile's sentences:

Vectors: a2a.projection.row-8-an-open-gate-needs-authorization, a2a.projection.row-8-gate-v1-lists-id-type-and-time, a2a.projection.row-8-a-handoff-waits-on-its-proposal, a2a.egress.gate-data-never-reaches-a-client, a2a.egress.a-reply-to-a-gate-never-reaches-a-client.