Skip to content

Commit f560a94

Browse files
vvillait88claude
andauthored
chore: 1.5.0 release with neutral spec-framing copy (#15)
## Summary - Version 1.4.0 → 1.5.0 to match node-commerce (both SDKs ship the same UCP feature surface: spec-compliant profile shape, A2A extension support, supported_versions advertisement) - Drops named-vendor references from user-facing docs/READMEs/CLAUDE.md/example docstrings; replaced with neutral spec-language ("production UCP merchants commonly ship unsigned"; "trust-mode verifiers (regulated-commerce, AP2-aware)") - No code changes; technical content unchanged ## Test plan - [x] `uv run pytest` — 883 pass, 3 skipped, 95.04% coverage 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 01c688d commit f560a94

6 files changed

Lines changed: 11 additions & 14 deletions

File tree

CLAUDE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ Peer-dep pattern: payment/x402/mppx/stripe modules import lazily at runtime; ven
4545
| `variable_cost_merchant.py` | Pay-per-actual-usage on **two protocols**: x402 upto (Permit2 + Settlement-Overrides) AND MPP tempo session (channel + SSE + mid-stream vouchers) |
4646
| `compliance_merchant.py` | Regulated-goods merchant: full compliance gate + custom `on_denied` composing the denial helpers (`verification_agent_instructions`, `is_fixable_denial`, `build_signer_mismatch_body`, `build_contact_support_next_steps`, `denial_reason_to_body`/`denial_reason_status`) |
4747
| `per_product_policy_merchant.py` | Multi-product merchant where each row carries its own compliance policy. One product hard-gates KYC + age + state; another is anonymous; a third uses `enforcement="soft"` (request KYC but don't block sale). Demonstrates `PolicyBlock`, `build_gate_from_policy`, `run_gate_with_enforcement`, `shipping_country_allowed`, `shipping_state_allowed`. |
48-
| `signed_ucp_merchant.py` | Signed UCP profile (`/.well-known/ucp`) + JWKS endpoint (`/.well-known/jwks.json`). AgentScore's `agentscore-profile+jws` is a vendor extension on top of UCP for trust-mode verifiers (Visa AP2 pilots, regulated-commerce verifiers) that opt into auditable cryptographic provenance — UCP §6 itself does NOT mandate signing; Pura Vida and other Shopify-backed UCP merchants ship unsigned in production. Wires ephemeral-for-dev / env-JWK-for-prod signing, kid rotation, and `Cache-Control` posture. Uses `generate_ucp_signing_key`, `sign_ucp_profile`, `build_jwks_response`, `UCPSigningKey.from_jwk`, `UCPVerificationError`. |
48+
| `signed_ucp_merchant.py` | Signed UCP profile (`/.well-known/ucp`) + JWKS endpoint (`/.well-known/jwks.json`). AgentScore's `agentscore-profile+jws` is a vendor extension on top of UCP for trust-mode verifiers (regulated-commerce, AP2-aware) that opt into auditable cryptographic provenance — UCP §6 itself does NOT mandate signing; production UCP merchants commonly ship unsigned. Wires ephemeral-for-dev / env-JWK-for-prod signing, kid rotation, and `Cache-Control` posture. Uses `generate_ucp_signing_key`, `sign_ucp_profile`, `build_jwks_response`, `UCPSigningKey.from_jwk`, `UCPVerificationError`. |
4949

5050
## Identity model
5151

README.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -200,8 +200,7 @@ card = build_a2a_agent_card(name="My Service", url=base_url, capabilities=A2AAge
200200
# Output shape: {"ucp": {"version", "services", "capabilities",
201201
# "payment_handlers", "name?", "supported_versions?"}, "signing_keys": [...]}
202202
# — services / capabilities / payment_handlers are MAPS keyed by reverse-DNS
203-
# service / capability / handler name. Verified against the live Pura Vida
204-
# reference at puravidabracelets.com/.well-known/ucp.
203+
# service / capability / handler name (UCP spec §3 + §6).
205204
profile = build_ucp_profile(
206205
name="My Service",
207206
services={
@@ -231,7 +230,7 @@ profile = build_ucp_profile(
231230
)
232231
```
233232

234-
UCP §6 doesn't mandate profile-body JWS signing — Pura Vida and other Shopify-backed UCP merchants ship unsigned. AgentScore's `agentscore-profile+jws` is a vendor extension for trust-mode verifiers (Visa AP2 pilots, regulated-commerce verifiers) that opt into auditable profiles. Sign + verify via the optional `joserfc` extra (tested against joserfc v1.x; pin `joserfc>=1.0.0,<2`):
233+
UCP §6 doesn't mandate profile-body JWS signing; production UCP merchants commonly ship unsigned. AgentScore's `agentscore-profile+jws` is a vendor extension for trust-mode verifiers (regulated-commerce, AP2-aware) that opt into auditable profiles. Sign + verify via the optional `joserfc` extra (tested against joserfc v1.x; pin `joserfc>=1.0.0,<2`):
235234

236235
```bash
237236
pip install agentscore-commerce[ucp]

agentscore_commerce/identity/ucp.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33
Compose the JSON payload published at ``/.well-known/ucp`` per the UCP spec. Output
44
shape matches the spec example: top-level ``{"ucp": {...}, "signing_keys": [...]}``
55
envelope, with ``services`` / ``capabilities`` / ``payment_handlers`` as MAPS keyed by
6-
reverse-DNS name. Verified against the live production reference at
7-
``https://puravidabracelets.com/.well-known/ucp`` (Shopify's UCP integration).
6+
reverse-DNS name (UCP spec §3 + §6).
87
98
AgentScore identity claims layer over UCP via the ``sh.agentscore.identity`` capability
109
(vendor-namespaced; UCP doesn't define KYC/sanctions/age/jurisdiction natively).

examples/signed_ucp_merchant.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
"""Signed UCP profile example — ``/.well-known/ucp`` + ``/.well-known/jwks.json``.
22
33
AgentScore's ``agentscore-profile+jws`` is a vendor extension layered on top of
4-
the UCP profile for trust-mode verifiers (Visa AP2 pilots, regulated-commerce
5-
verifiers) that opt into auditable cryptographic provenance. UCP §6 itself does
6-
NOT mandate profile-body signing — Pura Vida and other Shopify-backed UCP
7-
merchants ship unsigned in production today, and live UCP-aware agents (Google
8-
AI Mode, Gemini commerce, Microsoft Copilot, Perplexity) accept unsigned
9-
profiles. This example wires both routes against a persistent signing key
4+
the UCP profile for trust-mode verifiers (regulated-commerce, AP2-aware) that
5+
opt into auditable cryptographic provenance. UCP §6 itself does NOT mandate
6+
profile-body signing; production UCP merchants commonly ship unsigned, and
7+
vanilla UCP-aware agents read the canonical body and ignore the ``signature``
8+
field. This example wires both routes against a persistent signing key
109
(env-loaded for prod, ephemeral for dev) for verifiers that DO opt into the
1110
signed envelope.
1211

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
44

55
[project]
66
name = "agentscore-commerce"
7-
version = "1.4.0"
7+
version = "1.5.0"
88
description = "Agent commerce SDK for Python — identity middleware (FastAPI, Flask, Django, AIOHTTP, Sanic, ASGI) + payment helpers + 402 builders + discovery + Stripe multichain. The full merchant-side toolkit for AgentScore-powered agent commerce."
99
readme = "README.md"
1010
license = "MIT"

uv.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)