dist/codex/ap2-agentic-payments/skills/ap2-cryptographic-signing/SKILL.md
Implement AP2 cryptographic signing — hardware-backed user signatures, merchant entity signatures, VDC integrity, key management, and attestation flows. Use when building the signing, verification, and key management components of AP2 mandates.
npx skillsauth add orcaqubits/agentic-commerce-claude-plugins ap2-cryptographic-signingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Fetch live docs:
https://ap2-protocol.org/specification/ for cryptographic signing requirementshttps://ap2-protocol.org/topics/privacy-and-security/ for security architecturesite:github.com google-agentic-commerce AP2 signature mandate for signing implementationsap2 protocol VDC signing cryptographic hardware-backed for community guidesAP2's core innovation is verifiable intent — cryptographic proof that:
AP2 VDCs use the SD-JWT with Key Binding (+kb) format, enabling selective disclosure and cryptographic holder binding.
AP2 supports ECDSA with the following algorithm/curve combinations:
Before signing, JSON payloads are canonicalized using JCS (RFC 8785) to produce a deterministic byte representation. This ensures that logically equivalent JSON objects produce the same signature regardless of key ordering or whitespace.
The merchant_authorization field on Cart Mandates uses Detached JWS format:
<base64url-header>..<base64url-signature>
Note the double dots — the payload is omitted from the JWS because it is the JCS-canonicalized CartContents, which the verifier already possesses.
JWT header MUST include:
alg — The signing algorithm (ES256, ES384, or ES512)kid — Key identifier for the signing keyJWT payload for merchant_authorization includes:
iss — Issuer (merchant identifier)aud — Audienceiat — Issued-at timestampexp — Expiration timestampjti — Unique JWT identifiercart_hash — Hash of the canonicalized cart contents| VDC | Signed By | What's Covered | |-----|-----------|---------------| | Cart Mandate | Merchant + User | Exact items, prices, totals, payment methods | | Intent Mandate | User | Shopping constraints, categories, intent, TTL | | Payment Mandate | User | Payment method selection, transaction amount |
The user signing step (especially for Cart and Payment Mandates) involves:
This is a load-bearing security step — the agent cannot bypass it.
Verifiers check:
Signed mandates provide non-repudiation for disputes:
VDC signatures prevent MITM attacks:
Fetch the specification for exact signature formats, supported algorithms, attestation requirements, and verification procedures before implementing.
development
Build with Spree's headless Next.js storefront — the official `spree/storefront` repo (Next.js 16 App Router with Server Actions and Turbopack, React 19 Server Components, Tailwind CSS 4, TypeScript 5, `@spree/sdk`, Sentry), server-only auth (httpOnly JWT cookies + publishable key), MeiliSearch faceted catalog, one-page checkout with Apple/Google Pay/Klarna/Affirm/SEPA, multi-region market routing, GA4 + JSON-LD SEO, and Vercel/Docker deployment. Use when forking or customizing the storefront, or evaluating headless adoption.
tools
Build Spree extensions as Rails engines — gem scaffolding, `bin/rails g spree:extension`, mounting routes/migrations/assets, the modern `prepend` decorator pattern (`*_decorator.rb` with `self.prepended(base)`), generators (`spree:model_decorator`, `spree:controller_decorator`), the four customization surfaces in preference order (Events > Webhooks > Dependencies > Decorators), Spree::Dependencies for swapping service objects, gem release/versioning, and the deprecated Deface engine. Use when building a reusable Spree extension or adding non-trivial customization to an app.
development
Build with Spree's event bus and Webhooks 2.0 — `Spree::Events` publication, `Spree::Subscriber` DSL with `subscribes_to` and `on`, wildcard matching, lifecycle events (`{model}.created/.updated/.deleted` via `publishes_lifecycle_events`), the canonical event catalog (order.*, payment.*, shipment.*, product.*), Webhooks 2.0 endpoints, HMAC-SHA256 signing (`X-Spree-Webhook-Signature`), exponential-backoff retries, and Sidekiq job orchestration. Use when wiring event-driven business logic, building webhook consumers, or replacing ActiveSupport callback chains.
tools
Cross-cutting Spree development patterns — the customization preference hierarchy (Events > Webhooks > Dependencies > Decorators), `Spree::Dependencies` service-object swapping, the `_decorator.rb` + `prepend` + `self.prepended` idiom, idempotent subscribers and webhook receivers, multi-store scoping discipline, prefixed IDs, calculator polymorphism (shipping/promotion/tax share the base), service-object composition with `dry-monads` or simple results, why to avoid `class_eval` reopening and Deface, and Spree-on-Rails idioms (Hotwire/Turbo Stimulus, ActiveStorage, Action Cable, Sidekiq). Use when designing the architecture of a Spree extension or solving cross-cutting concerns.