You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* feat: eligibility claims & verification contract
Introduce `context.eligibility` — buyer claims about eligible benefits
(loyalty membership, payment instrument perks, etc.) that Businesses
can act on across the shopping lifecycle.
Processing model:
- Platform provides claims via context.eligibility on any request
- Business MAY act on recognized claims (adjust pricing, product
access, provisional discounts); MUST ignore unrecognized claims
- At checkout completion, all claims that influenced the checkout
MUST be resolved: verified against proof, or rescinded by Platform
- Unresolved claims block completion (invalid_eligibility error)
- Business MUST NOT mutate checkout on verification failure
Layering:
- context.json: eligibility array with reverse-domain $ref validation
- checkout.md: normative verification contract (core obligation)
- discount.json: provisional + eligibility fields on applied_discount
for structured attribution when discount extension is active
- catalog/index.md: MAY adjust price/list_price for eligible claims
- error_code.json: invalid_eligibility standard error
Key design decision: eligibility lives on context (not PaymentInstrument)
enabling full-funnel coverage from catalog through checkout. Verification
is a core checkout concern; the discount extension adds attribution.
* align error code to noun_adjective pattern
* fix: address PR Universal-Commerce-Protocol#250 review feedback
Terminology:
- "claims that influenced the checkout" → "accepted claims" throughout,
aligning with the accepted/not-accepted partition (maximenajim, ACSchil)
- "not applied" → "not accepted" for consistency
Verification semantics:
- Clarify that verification failure MUST only affect the messages array,
not checkout state (line items, totals, discounts, etc.) (maximenajim)
- Add path field to eligibility_invalid example for machine-readable
partial failure identification (ACSchil)
Messages contract:
- Add MAY use type: "info" to explain effects of accepted claims,
complementing SHOULD warn on rejection (maximenajim)
Catalog:
- Add non-binding pricing contract to "Relationship to Checkout" section:
catalog responses are not transactional commitments, checkout is
authoritative, responses SHOULD NOT be reused across sessions
without re-validation (maximenajim)
* add eligibility message codes for warning and info
Standardize codes for the three eligibility message types:
eligibility_not_accepted (warning), eligibility_accepted (info),
and eligibility_invalid (error at completion).
* remove display MUST from provisional
Per TC discussion, this is already captured via messages flow.
---------
Co-authored-by: Alex Schillinger <alexcschillinger@gmail.com>
"description": "Extends Cart and Checkout with discount code support, enabling agents to apply promotional, loyalty, referral, and other discount codes.",
6
+
"description": "Extends Cart and Checkout with discount support, including discount codes, automatic discounts, and eligibility-triggered provisional discounts.",
7
7
"$defs": {
8
8
"allocation": {
9
9
"type": "object",
@@ -61,6 +61,15 @@
61
61
"minimum": 1,
62
62
"description": "Stacking order for discount calculation. Lower numbers applied first (1 = first)."
63
63
},
64
+
"provisional": {
65
+
"type": "boolean",
66
+
"default": false,
67
+
"description": "True if this discount requires additional verification."
68
+
},
69
+
"eligibility": {
70
+
"$ref": "types/reverse_domain_name.json",
71
+
"description": "The eligibility claim accepted by the Business for this discount. Corresponds to a value from context.eligibility. Omitted for code-based and non-eligibility automatic discounts."
Copy file name to clipboardExpand all lines: source/schemas/shopping/types/context.json
+8Lines changed: 8 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -29,6 +29,14 @@
29
29
"currency": {
30
30
"type": "string",
31
31
"description": "Preferred currency (ISO 4217, e.g., 'EUR', 'USD'). Businesses determine presentment currency from context and authoritative signals; this hint MAY inform selection in multi-currency markets. Also serves as the denomination for price filter values — platforms SHOULD include this field when sending price filters. Response prices include explicit currency confirming the resolution."
32
+
},
33
+
"eligibility": {
34
+
"type": "array",
35
+
"description": "Buyer claims about eligible benefits such as loyalty membership, payment instrument perks, and similar. Recognized claims MAY inform the Business response (e.g., member-only product availability, adjusted pricing in catalog, provisional discounts at cart or checkout). Businesses MUST ignore unrecognized values without error. Values MUST use reverse-domain naming (e.g., 'com.example.loyalty_gold', 'org.school.student') and MUST be non-identifying.",
0 commit comments