NPAMP-MAP-UCP — Universal Commerce Protocol Mapping (companion to draft-bubblefish-npamp-01)¶
Status: DRAFT companion specification. The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 (RFC 2119, RFC 8174) when, and only when, they appear in all capitals, as shown here. This document is a thin per-protocol mapping: it pins the specifics of the Universal Commerce Protocol (UCP) onto N-PAMP carriage. UCP's core transport is a REST/HTTP-semantics binding, so this document carries UCP's REST exchanges as a thin mapping over the HTTP-semantics carriage class NPAMP-CC-HTTP (
21_carriage_http.md): that carriage class does the structural work — the HTTP-Carriage Object, correlation, verbatim body and header carriage, streaming, and the SafetyLabel derivation from HTTP method — and this document pins only what is specific to UCP. It builds on NPAMP-CC-HTTP, on NPAMP-BRIDGE (10_bridge_framework.md), and on the N-PAMP core specification (draft-bubblefish-npamp-01, the "core specification"). It consumes only code points those documents already reserve and introduces no change to the core wire format, to NPAMP-BRIDGE, or to NPAMP-CC-HTTP.Provisional / OPAQUE-READY posture. UCP has no standards-assigned
protocol_idin the Bridge Protocol Identifier registry (NPAMP-REG30_protocol_registry.md), which assigns only0x01–0x04. This mapping is therefore PROVISIONAL on its code point (§2): until a value is assigned under NPAMP-REG §8, UCP is carried under an experimentalprotocol_id(0x10–0x7F) agreed out of band, or opaquely via Class OPAQUE (NPAMP-CC-OPAQUE,25_carriage_opaque.md). UCP's REST transport is confirmed against the protocol's own published specification (§9), so the HTTP mapping below is pinned, not deferred; the parts that are version-dependent or not yet confirmed are marked as such in §4 and §8, and no method, field, header, or code point is fabricated.
1. Scope¶
1.1 In scope¶
This document specifies how UCP's REST/HTTP-semantics exchanges are carried over an N-PAMP association. It defines, and only defines, the UCP-specific facts a peer needs in order to carry UCP under NPAMP-CC-HTTP:
- UCP's
protocol_idposture and its carriage class, and thecontent_typeused (§2); - How UCP's REST operations — its checkout-session lifecycle and the general HTTP verb/target contract — map onto NPAMP-BRIDGE frame types through the HTTP-Carriage Object (§4);
- How UCP's discovery profile (
/.well-known/ucp), theUCP-Agentrequest header, and UCP's dated version negotiation ride the carriage verbatim (§5); - Which UCP operations are state-mutating and therefore the SafetyLabel effect class a sender attaches, derived from the HTTP method per NPAMP-CC-HTTP §8.1 and tightened for UCP's purchase-completion semantics, with the NPAMP-BRIDGE §7 fail-safe on absence (§6); and
- Channel selection: the Bridge channel
0x000Das the default, the Discovery channel0x0010for the profile document, and the Commerce channel0x000Efor payment-mandate traffic where a deployment prefers the more specific channel (§7).
1.2 Not in scope¶
The following are explicitly NOT defined by this document, because NPAMP-CC-HTTP, NPAMP-BRIDGE, UCP's own specification, or a sibling mapping already define them:
- The structural HTTP-semantics carriage — the HTTP-Carriage Object (method,
target, status, headers, body, trailers, passthrough), the frame-type mapping,
correlation_idmatching, deterministic-CBOR encoding, the redirect and streaming rules, and the foreign-vs-carriage error split. These are inherited verbatim from NPAMP-CC-HTTP (§2, §3, §4, §5, §6, §7 of that document) and are not restated here (§3). - UCP's non-REST transports. UCP additionally defines an MCP transport
(JSON-RPC) and an A2A transport (Agent Card) for the same capabilities (§9).
Those bindings are carried by their own N-PAMP mappings — NPAMP-MAP-MCP
(
60_map_mcp.md) and NPAMP-MAP-A2A (61_map_a2a.md) respectively — and are out of scope here; this document carries UCP's REST binding only. - UCP's Embedded Protocol (EP). UCP's embedded/browser checkout surface is an in-page interface with event delegation to a host page; its non-N-PAMP delivery surface is out of scope, exactly as A2A webhook delivery is out of scope for NPAMP-MAP-A2A (§8).
- The UCP object schemas and capability semantics. The internal grammar of the
UCP profile, the Cart / Checkout / Order / Identity-Linking capability objects, the
AP2-mandate and other extension objects, and the UCP error bodies is fixed by UCP's
own specification. This document carries these objects verbatim inside the
HTTP-Carriage Object
body(NPAMP-CC-HTTP §4.3) and does not parse, validate, or transform them. - Reconstruction of UCP's transport-bound HTTP Message Signatures. UCP authorizes requests with RFC 9421 HTTP Message Signatures computed over HTTP components that do not exist on the N-PAMP wire (§8). This mapping carries those header fields verbatim but does not recompute, verify, or re-bind them, exactly as NPAMP-CC-HTTP §8.4 requires.
- Any change to the N-PAMP frame format, to NPAMP-BRIDGE, or to NPAMP-CC-HTTP, including the BridgeEnvelope TLV, the SafetyLabel TLV, and the HTTP-Carriage Object.
2. Protocol identity¶
| Property | Value |
|---|---|
| Protocol | Universal Commerce Protocol (UCP), REST/HTTP-semantics binding. |
protocol_id |
PROVISIONAL. No value is assigned to UCP by NPAMP-REG §6 (which assigns only 0x01–0x04). Until a value is assigned under NPAMP-REG §8, a sender MUST use an experimental protocol_id (0x10–0x7F) agreed out of band with the peer (NPAMP-REG §7.1), or a private-use value (0x80–0xFF) within one administrative domain (NPAMP-REG §7.2). This document assigns no value and MUST NOT be read as reserving one. |
| Carriage class | HTTP (NPAMP-CC-HTTP), whose protocol_id MUST name an HTTP-class protocol (NPAMP-CC-HTTP §1.3). Where no HTTP-class mapping is negotiated, UCP is instead carriable via Class OPAQUE (NPAMP-CC-OPAQUE) under the same agreed identifier. |
content_type |
0x02 (application/cbor), as NPAMP-CC-HTTP §2.3 requires for every frame carrying an HTTP-Carriage Object; UCP's application/json request/response body is carried inside the object (§4). Under the Class OPAQUE fallback the raw UCP JSON payload is carried directly with content_type = 0x01 (application/json). |
| Foreign-message form | Under NPAMP-CC-HTTP, one deterministic-CBOR HTTP-Carriage Object per Bridge frame (NPAMP-CC-HTTP §4), carrying UCP's HTTP method, target, headers, and JSON body octet-for-octet. |
A sender MUST set the agreed protocol_id on every Bridge frame carrying a UCP REST
exchange, and MUST NOT emit a UCP exchange under a protocol_id the peer has not
agreed carries UCP (NPAMP-REG §7). A receiver that does not carry UCP MUST reply to a
BRIDGE_REQUEST bearing that identifier with ProtocolUnsupported (NPAMP-BRIDGE §6;
NPAMP-REG §9), and MUST NOT infer UCP from any other envelope field. When UCP is
promoted to a standards-assigned code point, that value replaces the experimental one
and this section is the only part of the mapping that changes.
3. Relationship to NPAMP-CC-HTTP and NPAMP-BRIDGE¶
UCP's REST binding is HTTP semantics: a request bearing a method, a target
(/checkout-sessions and related paths), header fields, and an optional JSON body,
answered by a response bearing a status code, headers, and an optional JSON body.
Consequently the entire structural carriage of UCP-over-REST is provided by
NPAMP-CC-HTTP without modification:
- The transparency rule governs: UCP's HTTP message is carried octet-for-octet inside the HTTP-Carriage Object and MUST NOT be re-serialized, reordered, canonicalized, or rewritten (NPAMP-BRIDGE §1; NPAMP-CC-HTTP §2.1, §4.3).
- Correlation of a UCP response to its request is the
correlation_idmapping of NPAMP-CC-HTTP §3 (NPAMP-BRIDGE §5), inherited unchanged. This document adds no correlation rule. - A UCP HTTP error response whose status is 4xx or 5xx is a successful carriage of a foreign result and MUST be carried as a BRIDGE_RESPONSE with that status and body preserved verbatim, never as BRIDGE_ERROR (NPAMP-CC-HTTP §6.1). A failure below UCP — the request did not reach, or no response was obtained from, the UCP endpoint — is the only case reported as BRIDGE_ERROR with an N-PAMP transport error (NPAMP-CC-HTTP §6.2).
- The BridgeEnvelope
methodfield carries the advisory routing key "<HTTP-method> SP <target>" for a request and is empty for a response (NPAMP-CC-HTTP §2.4); the authoritative method, target, and status remain the typed keys of the HTTP-Carriage Object.
This document therefore pins only UCP specifics (§2, §4, §5, §6, §7). Where this document and NPAMP-CC-HTTP could appear to differ on a structural matter, NPAMP-CC-HTTP governs.
4. UCP REST operation namespace and frame mapping¶
A UCP REST operation is an HTTP request; either peer MAY originate one, and the peer that emits the BRIDGE_REQUEST is the requester for that exchange (NPAMP-BRIDGE §5). No N-PAMP role is tied to UCP's platform/agent or business/merchant role.
The table enumerates the REST checkout-session operations confirmed against UCP's
published REST specification (version 2026-04-08; §9). Each is a complete HTTP
request carried as BRIDGE_REQUEST (0x0100, message_kind = 0x01) with an
HTTP-Carriage Object of kind = request; its reply is BRIDGE_RESPONSE (0x0101)
carrying the UCP status and JSON body — including a 4xx/5xx UCP error body — or, only
for a sub-UCP failure, BRIDGE_ERROR (0x0102) (§3; NPAMP-CC-HTTP §2.2, §6). The
target is the resolved origin-form path from the UCP profile's REST endpoint plus
the OpenAPI path (§5).
| UCP operation | HTTP method + target | State impact |
|---|---|---|
| Create checkout session | POST /checkout-sessions |
Creates a session. |
| Get checkout session | GET /checkout-sessions/{id} |
Reads session state. |
| Update checkout session | PUT /checkout-sessions/{id} |
Replaces/updates session state. |
| Complete checkout session | POST /checkout-sessions/{id}/complete |
Completes the purchase (executes payment). |
| Cancel checkout session | POST /checkout-sessions/{id}/cancel |
Cancels the session. |
Carriage requirements:
- Every request MUST carry
application/jsonrequest and response bodies (UCP requires valid JSON per RFC 8259); the JSON media type is carried in the object'sheaders(NPAMP-CC-HTTP §4.4), while the carriage container'scontent_typeis0x02(§2). - The BridgeEnvelope
methodfield MUST equal "<method> SP <target>" for the request and MUST be empty on the response (NPAMP-CC-HTTP §2.4); a receiver MUST reject a frame whose envelope routing key disagrees with the object'smethod/target(NPAMP-CC-HTTP §4.7). - A receiver that does not carry a given UCP operation MUST report
MethodUnsupported(NPAMP-BRIDGE §6 code 3) for a BRIDGE_REQUEST bearing it, and MUST NOT report success for an operation it did not perform.
Coverage note. UCP defines further capabilities beyond checkout — for example Cart, Order, and Identity Linking — and admits vendor and extension operations (e.g. AP2 mandates). Their exact REST verb/target set was not exhaustively confirmed from the primary source at the time of writing and is therefore not enumerated here. Because NPAMP-CC-HTTP selects nothing on the operation beyond the HTTP method and target and carries the message transparently (§3), a peer carries any additional UCP REST operation under this same mapping without a change to this document: the HTTP method fixes the frame type and the SafetyLabel default (§6), and the object is carried verbatim. An implementation MUST NOT reject a UCP operation solely because it is absent from the table above.
5. Discovery profile, UCP-Agent header, and version negotiation¶
UCP is a discovery-and-negotiation protocol layered on HTTP; the following UCP mechanisms ride the carriage as ordinary HTTP-semantics traffic, carried verbatim, and this mapping neither reads nor rewrites them:
- Discovery profile. A UCP business publishes a profile document at
/.well-known/ucpdeclaring itsversion,services,capabilities, payment handlers, andsigning_keys(JWK). Retrieval of that profile is an HTTPGETand is carried as a BRIDGE_REQUEST/BRIDGE_RESPONSE under this mapping. Because the target is a.well-knowndiscovery resource, a sender MAY set the HTTP-Carriage Object passthroughwell_knownvalue toucp(NPAMP-CC-HTTP §5.2, which namesucpas a recognized suffix) as an advisory routing aid; the profile bytes remain authoritative inbody. The profile MAY additionally be carried as a capability document on the Discovery channel (§7). - Endpoint resolution. The profile's REST transport declaration carries a
version, atransportofrest, an OpenAPIschemaURI, and anendpointbase URI; the operationtarget(§4) is the OpenAPI path resolved against thatendpoint. This resolution is performed by the UCP endpoints from the carried profile; the carriage does not resolve, rewrite, or validate URLs. UCP-Agentheader. A UCP platform/agent announces its own profile URI in theUCP-Agentrequest header, an RFC 8941 structured-field dictionary (e.g.UCP-Agent: profile="https://agent.example/profiles/shopping-agent.json"). This header is carried verbatim in the request object'sheaders(NPAMP-CC-HTTP §4.4) and MAY be surfaced inpassthrough.selected_headers; the carriage does not dereference the profile URI (NPAMP-CC-OPAQUE §1.3 forbids the carriage from performing such out-of-band fetches).- Version negotiation. UCP versions are RFC 3339 dates (
YYYY-MM-DD; the confirmed reference version is2026-04-08), negotiated by intersecting both parties' declared versions and selecting the highest mutually supported one. This negotiation lives entirely inside the carried profile and request/response bodies; a peer MUST NOT attempt to convey or enforce the UCP version through any N-PAMP envelope field, and MUST NOT carry UCP negotiated state from a prior association into a new one.
6. SafetyLabel and state-mutating operations¶
The SafetyLabel TLV (Type 0x0013) and its fail-safe semantics are governed by
NPAMP-BRIDGE §7 and inherited through NPAMP-CC-HTTP §8.1 unchanged. For an HTTP-carried
protocol the effect class is derived from the HTTP method, which UCP's RESTful
verbs make explicit. This section fixes, for UCP, the effect class each REST operation
carries; a sender MUST attach a SafetyLabel to every UCP request that can cause side
effects, and a receiver MUST NOT treat the absence of a SafetyLabel on a
state-mutating operation as read_only — absence MUST be treated as destructive
(NPAMP-BRIDGE §7 fail-safe).
| UCP operation | HTTP method | Effect (NPAMP-BRIDGE §7) | Rationale |
|---|---|---|---|
| Get checkout session | GET |
0x00 read_only |
A read; a SafetyLabel MAY be omitted and absence is correctly read as read_only. |
| Update checkout session | PUT |
0x01 idempotent_write |
Replaces session state; repeating with identical input yields the same state (NPAMP-CC-HTTP §8.1 PUT default). |
| Cancel checkout session | POST |
0x02 non_idempotent_write |
Cancels the session; carried as a POST, whose default class this mapping MUST NOT loosen (NPAMP-CC-HTTP §8.1). A deployment MAY tighten to 0x03 destructive. |
| Create checkout session | POST |
0x02 non_idempotent_write |
Creates a new session; each call is a fresh action (NPAMP-CC-HTTP §8.1 POST default). |
| Complete checkout session | POST |
0x02 non_idempotent_write (floor) |
Executes an irreversible purchase/payment. This is the money-moving operation; a sender SHOULD tighten the label to 0x03 destructive to reflect its irreversibility, and MUST attach a label. NPAMP-CC-HTTP §8.1 forbids loosening. |
General rules, inherited from NPAMP-CC-HTTP §8.1:
- For any UCP REST operation not listed above, the sender MUST derive the
effectfrom the HTTP method's default (GET/HEAD/OPTIONS/TRACE → read_only; PUT → idempotent_write; DELETE → idempotent_write; POST/PATCH → non_idempotent_write), MUST tighten (never loosen) it when it knows the specific operation is more dangerous, and MUST label a known-destructive operation0x03destructive regardless of method. - UCP's
Idempotency-Keyrequest header makes a retried state-mutating operation safe to repeat at the UCP layer; it does not loosen the SafetyLabel effect class, which reflects the method's declared danger, not the client's retry strategy. - The SafetyLabel
scope(NPAMP-BRIDGE §7) MAY carry the target path (e.g. the checkout-session id) as an advisory resource hint. The label states intent and does not replace authorization; a receiver MUST enforce its own authorization at the UCP endpoint and MUST NOT treat a favorable label as permission.
7. Channel selection¶
UCP REST traffic rides the Bridge channel 0x000D by default, as required for
NPAMP-CC-HTTP encapsulation (NPAMP-CC-HTTP §9.1; NPAMP-BRIDGE §1). Under this mapping,
a peer carrying a UCP REST exchange MUST carry that exchange's HTTP-Carriage Objects on
the Bridge channel unless a deployment selects a more specific core channel below.
| UCP traffic class | Carriage | Channel |
|---|---|---|
| REST checkout/session and other HTTP operations (§4) | NPAMP-CC-HTTP | Bridge 0x000D (default) |
Discovery profile /.well-known/ucp (§5) |
NPAMP-CC-HTTP (GET) or NPAMP-CC-DOC (as a capability document) | Bridge 0x000D default; MAY use Discovery 0x0010 |
| Payment-mandate / multi-party commerce traffic (e.g. AP2-mandate extension) | NPAMP-CC-HTTP | Bridge 0x000D default; MAY use Commerce 0x000E |
- The Discovery channel
0x0010MAY carry the UCP profile as a capability document (its core purpose is "agent, tool, and service discovery and capability advertisement"); a document and its proofs MUST NOT be split across channels (NPAMP-CC-DOC). A peer MAY also advertise that it carries UCP over NPAMP-DISC (40_discovery.md), which announces the capability without carrying UCP traffic. - The Commerce channel
0x000E(core purpose "multi-party agentic commerce and payment mandates") MAY carry UCP's payment-mandate and commerce traffic where a deployment prefers the more specific channel, per the companion index's channel- selection guidance. A single UCP exchange MUST NOT be split across channels. - The Bridge
0x000D, Commerce0x000E, and Discovery0x0010channels are all minimum-profile Standard (../../registries/channels.csv); UCP carriage requires no channel above the Standard profile. A peer MUST NOT send or accept UCP frames on a channel it did not advertise during the handshake (core specification §5).
8. Transport-binding, HTTP Message Signatures, and version notes¶
UCP mandates HTTPS for its native transport ("All UCP communication MUST occur over HTTPS"; §9). Over N-PAMP, N-PAMP is the transport: UCP's HTTP/TLS hop does not exist on the N-PAMP wire, and the N-PAMP association supplies authentication, post-quantum confidentiality and integrity, multiplexing, and the key schedule (core specification), which replace UCP's TLS hop rather than layering on it.
- HTTP Message Signatures (RFC 9421) are transport-bound. UCP authorizes requests
with RFC 9421 HTTP Message Signatures whose signature base covers HTTP components
(for example
@method,@authority,@path) and aContent-Digest, carried in theSignature-Input,Signature, andContent-Digestheader fields and verified viakidagainst the signer's profilesigning_keys. Those signed components are bound to an HTTP hop that does not exist over N-PAMP. This mapping carries the signature header fields verbatim (NPAMP-CC-HTTP §4.4, §5.2) so a receiver re-emitting the message onto a real HTTP hop can present them, but it does not recompute, verify, or re-bind them, and a receiver MUST NOT infer that a carried UCP signature was verified by the carriage (NPAMP-CC-HTTP §8.4). Re-binding such a signature at an egress boundary is the responsibility of a gateway acting as an independent foreign-transport endpoint, not of this mapping. - Other UCP credentials. UCP's alternative authentication mechanisms — an
X-API-Keyheader, OAuth bearer tokens in theAuthorizationheader, and theUCP-Agentprofile header — are carried as opaque header octets (NPAMP-CC-HTTP §4.4, §8.3); the carriage neither validates nor establishes the property any such field names. - Version and state. UCP's dated version (§5) is conveyed only inside the carried profile and message bodies; a peer MUST NOT convey or enforce it through an N-PAMP envelope field, and MUST NOT carry UCP negotiated state across associations.
- What is confirmed vs. provisional. Confirmed against UCP's published
specification (§9): the REST/HTTP transport with mandatory HTTPS and
application/jsonbodies; the checkout-session operations of §4; theUCP-Agent,Idempotency-Key, andRequest-Idheaders; RFC 9421 HTTP Message Signatures; the/.well-known/ucpprofile and dated version negotiation. Provisional / unconfirmed: UCP has no assignedprotocol_id(§2); the full non-checkout operation set (§4 coverage note); and UCP's MCP and A2A transports and Embedded Protocol, which are carried by their own mappings or out of scope (§1.2). UCP is an active, evolving specification; an implementer MUST confirm version-dependent facts against the exact UCP version they target.
9. References¶
Normative for the carriage:
- draft-bubblefish-npamp-01 — the N-PAMP core specification (Bridge channel
0x000D, Commerce channel0x000E, Discovery channel0x0010, the 36-octet frame, the BridgeEnvelope and SafetyLabel TLV reservations, and AEAD payload protection). - NPAMP-BRIDGE (
10_bridge_framework.md) — the encapsulation, correlation, error, and SafetyLabel contract. - NPAMP-CC-HTTP (
21_carriage_http.md) — the HTTP-semantics carriage class that does the structural work for UCP's REST binding. - NPAMP-CC-OPAQUE (
25_carriage_opaque.md) — the fallback carriage for UCP until a code point is assigned (§2). - NPAMP-REG (
30_protocol_registry.md) — the Bridge Protocol Identifier registry; UCP is unassigned, and the experimental/private ranges of §7 apply (§2). - NPAMP-DISC (
40_discovery.md) and NPAMP-CC-DOC (24_carriage_documents.md) — the Discovery-channel advertisement and document carriage referenced in §7. - BCP 14: RFC 2119 and RFC 8174 — requirement key words.
- RFC 9421 (HTTP Message Signatures), RFC 8941 (Structured Field Values), RFC 8259 (JSON), RFC 3986 (URI), RFC 3339 (date/time) — the HTTP-level mechanisms UCP uses, referenced where this mapping carries their header fields or values verbatim.
UCP source specification (primary sources consulted for §2, §4, §5, §6, §8; UCP
version 2026-04-08, the current dated release at the time of writing):
- UCP Specification — Overview (transport list, HTTPS requirement,
UCP-Agentheader, versioning) — http://ucp.dev/2026-04-08/specification/overview/ - UCP Specification — REST checkout (checkout-session HTTP verbs and paths, headers, RFC 9421 signatures) — http://ucp.dev/2026-04-08/specification/checkout-rest/
- UCP Specification — MCP transport (JSON-RPC binding; out of scope, carried by NPAMP-MAP-MCP) — http://ucp.dev/2026-04-08/specification/catalog/mcp/
- UCP Specification — A2A transport (Agent Card binding; out of scope, carried by NPAMP-MAP-A2A) — http://ucp.dev/2026-04-08/specification/checkout-a2a/
- UCP Specification — Embedded checkout (EP; out of scope) — http://ucp.dev/2026-04-08/specification/embedded-checkout/
- UCP specification and schema source repository — https://github.com/universal-commerce-protocol/ucp
- Google for Developers — UCP guide (cross-confirmation of transports and capabilities) — https://developers.google.com/merchant/ucp
Where a fact was version-dependent or not confirmable from the primary source (the
non-checkout operation set, the absence of an assigned protocol_id), it is marked in
§4 and §8 rather than fixed by assumption.
10. Conformance¶
An implementation conforms to NPAMP-MAP-UCP if and only if it conforms to NPAMP-CC-HTTP (and therefore to NPAMP-BRIDGE) and, for UCP REST traffic, it:
- Carries every UCP REST exchange under the agreed UCP
protocol_idwithcontent_type = 0x02, selects UCP solely fromprotocol_id, and — because no standards code point is assigned — uses an experimental (0x10–0x7F, out-of-band agreed) or private-use (0x80–0xFF) identifier, never emitting UCP under aprotocol_idassigned to another protocol (§2; NPAMP-REG §7, §9); - Maps each UCP HTTP request onto a BRIDGE_REQUEST with an HTTP-Carriage Object of
kind = request, carries the UCP status and JSON body (including a 4xx/5xx UCP error body) as a BRIDGE_RESPONSE, and signals only a sub-UCP failure as BRIDGE_ERROR with an N-PAMP transport error, never fabricating an HTTP status for a carriage failure (§3, §4; NPAMP-CC-HTTP §6); - Carries the UCP JSON body, the
UCP-Agent,Idempotency-Key,Request-Id, and any authentication or RFC 9421 signature header fields octet-for-octet and in order, without combining, splitting, reordering, or interpreting them, and sets the BridgeEnvelopemethodto "<method> SP <target>" for requests (§3, §4, §5; NPAMP-CC-HTTP §4.4, §2.4); - Attaches a SafetyLabel to every state-mutating UCP operation using the effect classes
of §6 — read_only for
GET, idempotent_write forPUT, non_idempotent_write for thePOSToperations, tightening the purchase-completionPOSTtoward destructive and never loosening a method's default — and treats a missing SafetyLabel on a state-mutating operation asdestructive(§6; NPAMP-BRIDGE §7 fail-safe); - Carries the
/.well-known/ucpprofile and UCP's dated version negotiation transparently, conveys the UCP version only inside the carried objects (never through an N-PAMP envelope field), and carries no UCP negotiated state across associations (§5, §8); - Neither recomputes, verifies, nor re-binds any UCP RFC 9421 HTTP Message Signature, and does not assume any carried UCP credential was validated by the carriage (§8; NPAMP-CC-HTTP §8.3, §8.4);
- Carries UCP REST traffic on the Bridge channel
0x000Dby default, uses the Discovery channel0x0010only for the profile document/advertisement and the Commerce channel0x000Eonly where a deployment selects it for payment-mandate traffic, never splits a single UCP exchange across channels, and sends or accepts UCP frames only on advertised channels (§7); and - Defines no new frame type, TLV, or code point, carries UCP's MCP and A2A transports (if at all) under their own mappings rather than this one, and treats UCP's Embedded Protocol surface as out of scope (§1.2).
A conformance test suite SHOULD assert each clause above with recorded exchanges that
include: a GET /checkout-sessions/{id} read; a POST /checkout-sessions create and a
PUT /checkout-sessions/{id} update carrying their SafetyLabel effect classes; a
POST /checkout-sessions/{id}/complete carrying a non_idempotent_write (or tightened
destructive) SafetyLabel and a second completion with the SafetyLabel omitted, verified
to be treated as destructive; a 4xx UCP error response carried as a BRIDGE_RESPONSE
with its status and JSON body preserved verbatim; a /.well-known/ucp profile retrieval
carried with the well_known = ucp passthrough; and a request bearing RFC 9421
Signature/Signature-Input/Content-Digest header fields carried verbatim and
neither verified nor re-bound by the carriage.