dist/cursor/ap2-agentic-payments/skills/ap2-intent-mandate/SKILL.md
Implement the AP2 Intent Mandate — the human-not-present VDC that pre-authorizes agent purchases within defined constraints. Use when building autonomous agent shopping with user-signed intent, TTL, and constraint enforcement.
npx skillsauth add orcaqubits/agentic-commerce-claude-plugins ap2-intent-mandateInstall 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 the Intent Mandate schemasite:github.com google-agentic-commerce AP2 intent mandate for type definitions and sampleshttps://ap2-protocol.org/topics/core-concepts/ for Intent Mandate conceptual detailsap2 protocol intent mandate human-not-present autonomous for implementation guidesThe Intent Mandate is the VDC for human-not-present transactions. It captures the user's pre-authorized shopping intent with defined constraints, allowing the Shopping Agent to act autonomously within those bounds after the user has left the session.
The Shopping Agent creates the Intent Mandate based on the user's expressed intent. The agent captures the user's requirements and formalizes them into a structured mandate.
The User signs the Intent Mandate before going offline:
The spec describes several conceptual properties for the Intent Mandate (payer/payee identities, authorized payment method categories, risk payload, shopping intent, etc.). The actual V0.1 implementation uses the following IntentMandate Python type fields:
user_cart_confirmation_required (bool) — Whether the user must confirm the cart before purchasenatural_language_description (str) — The user's actual words / shopping intent, captured for accountabilitymerchants (Optional[List[str]]) — Optional list of preferred or allowed merchantsskus (Optional[List[str]]) — Optional list of specific SKUs the agent may purchaserequires_refundability (Optional[bool]) — Whether the user requires the purchase to be refundableintent_expiry (str, ISO 8601) — When this authorization expires (e.g., "2025-09-02T12:00:00Z")Note: Use intent_expiry (an ISO 8601 timestamp) rather than a generic "TTL" concept.
Additional conceptual fields described in the specification (but not necessarily present in V0.1 types) include:
| Aspect | Cart Mandate | Intent Mandate |
|--------|-------------|----------------|
| Scenario | Human-present | Human-not-present |
| Created by | Merchant | Shopping Agent |
| Specificity | Exact items, prices, totals | Categories, constraints, intent |
| Payment method | Specific tokenized method | Authorized categories |
| User presence | User present at signing | User signs before leaving |
| Expiration | Transaction-scoped | intent_expiry (ISO 8601 timestamp) |
The Intent Mandate defines boundaries the agent must stay within:
intent_expiry — Authorization expires at the specified ISO 8601 timestampThe merchant can escalate a human-not-present flow to human-present:
intent_expiry values — don't leave Intent Mandates valid indefinitelyFetch the specification for exact Intent Mandate fields, constraint formats, and TTL semantics 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.