spend · git:20260723.6e5370b · 2026-07-23 · sha256 f319654d2e4dd188

spend git:20260723.6e5370bA

Immutable. This exact content is served forever at /api/v1/blob/f319654d2e4dd188.

---
name: spend
description: Execute one governed outbound payment through deterministic quote, authority reservation, approval, rail fulfillment, and provider evidence.
runx:
  category: payments
---

# Spend

`spend` is the canonical buyer-side payment operation. Its `plan` runner turns
one structured payment-required signal into a bounded quote. Executable runners
then turn that quote into one approved rail effect and will not report success
until provider evidence is sealed. All executable rails share the same
authority, idempotency, approval, recovery, and finality story.

Use this skill when a caller has a real parent payment authority and needs to
pay a known counterparty for a known operation. Do not call a rail directly
because credentials happen to be available. Use `charge` for seller-side paid
calls, `refund` for a receipt-linked reversal, and `settle-invoice` when an
invoice must first be validated into an exact spend handoff.

## The payment model

A payment signal is intent, not authority. The caller must supply a complete
typed parent `AuthorityTerm` with currency, per-call and aggregate ceilings,
allowed rails, realm, counterparty, operation, period, and single-use capability
authority. A grant id or prose claim that permission exists is refused.

Native `payment.quote` validates the signal against that parent term and derives
the exact requested child authority. Native `payment.reserve` re-mints and
proves the child as a subset, binds it to `act_fulfill`, holds budget, and
derives stable capability and idempotency material. Neither step moves money or
constitutes approval.

## Planning and execution

1. Validate and quote the positive minor-unit amount, currency, rail,
   counterparty, operation, realm, and challenge binding.
2. For `plan`, stop here with `runx.payment.quote.v1`; no budget is reserved and
   no approval or rail call occurs.
3. For an executable runner, reserve one digest-bound child authority beneath
   the real parent term.
4. Pause at the explicit spend approval gate. Missing or denied approval
   prevents the rail step.
5. Execute exactly one configured rail through `pay-fulfill-rail`.
6. Require rail-specific effect evidence and seal the payment receipt before
   reporting success.
7. If the outcome is ambiguous, recover under the same reservation and
   idempotency binding. Never retry with a new key and risk a double charge.

## Runtime paths

- `mock` is a deterministic local and test rail.
- `mpp` executes through a configured MPP provider path.
- `stripe-spt` uses a Stripe Shared Payment Token path. Live credential custody
  stays outside skill inputs.
- `plan` performs authority-bound quoting without a rail effect.

`stripe-pay` is a discoverable facade over its executable runner. `x402-pay`
uses `spend:plan` until a trusted x402 buyer adapter exists; it does not
misrepresent quote evidence as settlement. Neither facade introduces a second
authority model.

## Inputs and result

- `payment_signal` carries positive `amount_minor`, uppercase currency, rail,
  counterparty, operation, and optional challenge and realm.
- `parent_payment_authority` is the complete bounded payment term.
- `rail_profile_ref` identifies configured rail policy without exposing its
  secret material.
- `idempotency_seed` is stable caller-owned material used across quote,
  reservation, capability, and provider execution.
- Hosted paths may require an opaque `payment_admission`. Provider endpoints,
  wallet material, and bearer secrets are never public skill inputs.

The result is the sealed receipt chain containing quote, subset reservation,
approval, effect evidence, provider proof, redactions, and recovery state. HTTP
acceptance alone is not finality; the selected rail must provide its required
terminal evidence.

## Stop conditions

- Refuse malformed, reference-only, expired, wildcard, wrong-currency,
  wrong-counterparty, wrong-operation, wrong-rail, or over-ceiling authority.
- Refuse raw card data, API keys, wallet keys, seed phrases, webhook secrets, or
  bearer tokens on the public input surface.
- Stop on quote drift, target-binding drift, failed subset proof, missing
  admission identity, or absent approval.
- Do not switch rails opportunistically or silently widen the parent term.
- Do not label an ambiguous provider response successful. Enter recovery under
  the same idempotency key.

## Example

An x402 endpoint requests `125` minor units of `USD` for `search.paid` from a
known merchant. The parent term permits that exact counterparty, operation,
currency, rail, and ceiling. `spend:plan` emits the bounded quote and stops;
there is no x402 execution adapter to reserve or move funds. An executable rail
continues only through its declared adapter, approval, and terminal readback.