Context
Commerce has the shopper’s model (carts, checkout, orders, returns, tenders) and its actions (SetCartLineAction,
CheckoutCartAction, …). Shoppers will meet the product in the storefront, in WhatsApp and inside assistant hosts
(ChatGPT, Claude) through the MCP gateway. Each surface would otherwise grow its own cards and its own checkout. 0360
decision 8 says no mode, setting or session skips a named human for money movement; it was written for staff (refunds,
payouts, price changes) and does not say who the named human is when a shopper pays for their own order. Read
literally it would make an agent-assisted checkout impossible, or push a staff member into every sale.
Decision
-
The shopping assistant is an ordinary agent.
ShopperAgent(anAgentof@stackra/ai) lives in Commerce’s storefront module. Its tools are Commerce queries and shopper actions, generated as every tool is: catalogue search, filter, sort and facets (@stackra/searchunder record visibility, 0492), product, availability and price for the shopper’s market, cart actions, the shopper’s orders, tracking, returns. Its actor is the shopper: a signed-in customer, or a guest session that may browse and fill a cart but must sign in or verify a contact (OTP) before checkout. No staff permission is ever reachable from a shopper session. -
Cards are shared. Commerce declares
ProductCard,ProductListCard,CartCard,OrderCard,OrderTrackingCardandCheckoutCardasCards (0490 decision 14). The storefront renders the web and native components; MCP hosts receive theui://commerce/<card>bundle; WhatsApp receives the message projection (an interactive message with an image and up to three reply buttons, or a product list message). One card, one output schema, three renderers. -
Tracking comes from events. Commerce keeps an
order_timelineprojection fed by its order, payment and fulfilment integration events;orders.order.trackreads it. Proactive updates (shipped, out for delivery, delivered, delayed) go through the notifications service on the channel the shopper consented to, WhatsApp included, under the consent rules of 0472. - B2B. A company buyer acts under the company’s account and price lists; a quote, a PO number and payment terms are inputs of the same checkout. An order above the buyer’s limit goes to the company’s approver by Escalate (0360 decision 9): the approver takes the order over, the buyer’s agent never borrows the approver’s authority. Payment on terms moves no money at checkout; the invoice settles it later under the staff rules.
- Marketplace. A multi-seller cart splits at checkout into one order per seller with one payment that the connection mode of 0390 divides. Each seller’s staff work their orders through the staff sidekick under the staff floor. A shopper’s question about a seller’s order is answered from that order’s timeline; a seller never sees another seller’s lines.
-
The payer is the named human for their own payment (clarifies 0360 decision 8 item 1). For an action tagged
financialwhose only money movement is the actor paying for their own order from their own payment method, the named human of decision 8 is that actor, and their approval is a payer step-up that the agent cannot perform:- a wallet sheet (Apple Pay, Google Pay) confirmed on the device with its own biometric or passcode;
- a card authentication (3-D Secure) challenge the issuer presents;
- a one-time code sent to the shopper’s verified phone or email and typed by the shopper, where the method has
neither of the above (cash on delivery, payment on terms, a stored method).
The agent may build the cart and call
commerce.checkout.prepare, which returns a payment intent that needs the payer’s confirmation and binds the cart version, the total, the currency and the payee. Confirmation happens only in a payer surface: the wallet sheet or 3-D Secure frame in the storefront and the apps, or, on WhatsApp and in an MCP host, aCheckoutCardwhose button opens a short-lived hosted payment page on the storefront bound to that intent. Any change to the cart voids the intent. The agent never holds a card number, never confirms a payment intent, and never sees a one-time code.
-
Staff money stays on the existing floor. Refunds, voids, store credit, discounts, price and coupon activation,
payouts and every other
financialaction by a staff actor keep a named staff human on every call, whatever the mode. Applying a coupon code the shopper typed to their own cart is not activation and is notfinancial; an agent offering a discount that no rule grants is refused. - Day one, not later (amends 0348 decision 7). MCP host rendering of cards and WhatsApp chat (the WhatsApp Business Platform’s messages and interactive messages through the OS integrations service) are day-one surfaces. WhatsApp Flows stay tier later. Meta business verification and each host’s directory review stay owner steps.
Consequences
- Commerce owns the shopper agent, its skills and its cards; Stackra owns the
Cardkind, the renderers, theui://build and the WhatsApp projection. commerce.checkout.prepareand a payer-confirmation webhook path are Commerce work;CheckoutCartActionbecomes the server half that runs only after confirmation.- The approval gate of
@stackra/aigains apayerapproval kind: satisfied by the payment provider’s confirmed event for the bound intent, or by a verified one-time code, never by a tool call. - An abandoned agent-built cart is an ordinary abandoned cart.
Enforcement
- planned — STA-1635: the approval gate test that a
financialaction whose actor is staff never resolves through apayerapproval, and that apayerapproval for one intent never confirms another. - planned — STA-1635: the runtime test that no tool output, log or stored message carries a card number or a one-time
code (the guardrail redaction rules of
@stackra/ai). - planned — Commerce: the checkout test that a cart change after
preparevoids the intent.
Supersedes and sources
Supersedes: none. Clarifies 0360 decision 8 item 1; amends 0348 decision 7. Sources: the leader’s brief of
2026-10-30 (STA-1629); Commerce resources and actions as listed in the Commerce 0.1.0 shape (commerce wave-a).