# Selfe registry A2A extension

Extension URI: `https://selfe.ai/a2a/extensions/registry/v1`. Wire version: `1.0`.

Discover the serving endpoint and enabled skills from `/.well-known/agent-card.json`.
Use its exact supportedInterfaces URL, including any catalogue selector. This is
JSON-RPC A2A, not MCP. Set `A2A-Version: 1.0`; structured commands also require
`A2A-Extensions: https://selfe.ai/a2a/extensions/registry/v1`.

A2A 0.3 callers (no A2A-Version; `message/send`, `tasks/get`, `tasks/cancel`;
kind-tagged parts) are served on the same URL: each call is translated into its 1.0
operation, held to the same rules, and answered in 0.3 shape. 0.3 structured commands
name the extension in `X-A2A-Extensions`.

Discover and match answers add to the registry output: `pageUrl` on each place (the
curator site's own page, where the guest reads and books); `next`, the follow-up
command filled in (match for the top places, with the dates and party read from the
question; prepare_booking_handoff for a bookable offer); on Visit Keswick, `handoff`
with a booking review link on up to three dated places with a bookable offer; and a
short text part after the data part.

SendMessage accepts one ROLE_USER Message with one data Part:

`{ "skill": "discover", "arguments": { "query": { "text": "Peaceful stays" } } }`

Skills use the canonical registry request schemas advertised through ARD and
`/.well-known/ucp/services/registry.openapi.json`. Discover answers an open
question (live availability when a stay is given). Match looks up places the
caller already means, by id or by name. Book uses entityId and a current
sealed offerId, plus verified guest or signed
AP2 Cart Mandate authority. Booking is available only if advertised in this card;
its separate gate defaults off. This reservation operation never claims payment.

When the VK card advertises `prepare_booking_handoff`, send that skill with
`{ "venueId": "slf_01M2T7Q2F2MVGDY5GQGMWTM7W1", "handle": "sopt_<selected-live-option>" }`.
Any currently published VK venue can use this action. Include optional section (stay, eat or do) when the venue has listings in more than one section. VK resolves the actual destination from its live catalogue; unknown or hidden listings cannot issue links.
This distinct action creates only a short-lived VK browser review link. It accepts no
mandate, price, guest or payment details. VK's existing booking gate controls issuance;
when closed the result is `{ "available": false, "booked": false, "reason": "booking_closed" }`.
The guest must sign in, review and explicitly confirm on VK; a link is not a reservation.
The card's bookingHandoff statusUrl reports current gate state without caching.

Plain text always means priceless discovery, never an inferred booking or priced
match. File parts and caller URLs are unsupported and never fetched. No caller
price, provider, user identity, supplier account or arbitrary endpoint is trusted.

Anonymous discovery/matching returns a stateless Message under public allowances.
Verified Bearer callers receive durable, owner/host/catalogue-bound Tasks with
output artifacts. GetTask, ListTasks and CancelTask require that same verified
identity and catalogue. Scoped guest OAuth requires bookings:write to book; an
agent or service credential alone is not guest consent. ListTasks is cursor
paginated; artifacts are omitted unless requested. Task history does not persist
raw mandates or credentials.

SendMessage is blocking only. Streaming, push, extended cards and
returnImmediately:true are unsupported. Reusing a message ID cannot execute a
second time; changing its content is rejected. Unknown booking outcomes retain
durable review claims: do not retry with a new message or offer. CancelTask only
cancels safe waiting work, never a supplier booking or refund.

Authentication failures are HTTP 401/403. Exhausted allowances are HTTP 429;
an unconfirmed allowance or unavailable required policy/store is HTTP 503.
Observe bounded Retry-After when provided. Neither response authorises work or
an automatic immediate retry. Malformed protocol requests use JSON-RPC errors. UCP's A2A discovery
entry correctly points to this agent card; Selfe registry extensions do not
implement standard UCP checkout messages over A2A.
