settle-invoice · git:20260723.6e5370b · 2026-07-23 · sha256 b224db1ee54d3a64

settle-invoice git:20260723.6e5370bA

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

---
name: settle-invoice
description: Validate one invoice against a real payment authority and prepare an executable canonical spend handoff without moving money.
runx:
  category: payments
---

# Settle Invoice

Prepare one invoice for the canonical `spend` lane. The native
`payment.invoice_plan` tool validates the invoice, payee identity, selected
rail, profile, idempotency seed, and complete parent payment AuthorityTerm.

Use this skill when an invoice is the source business document and the operator
needs to know whether it can be represented as one exact governed payment. It
keeps invoice validation separate from money movement: a ready result is a
reviewable `spend` handoff, not a paid invoice. Use `spend` directly when the
payment signal is already structured and validated.

This skill plans only. It never approves a spend, contacts a provider, moves
money, or claims settlement. A ready plan has `provider_effect.status:
not_started` and `money_moved: false`.

## Contract

- Amounts are positive integer minor units and currency is uppercase ISO 4217.
- The payee has `name`, `party_ref`, and exactly one opaque
  `settlement_ref` or SHA-256 `settlement_digest`. Raw account and routing
  fields are refused.
- `parent_payment_authority` is a full typed term. Native quote validation
  requires bounded per-call and aggregate limits, the selected rail, realm,
  payee, `invoice.settle` operation, and single-use capability authority.
- Supported executable handoff rails are `mock`, `mpp`, and `stripe-spt`,
  matching actual `spend` runners. Unsupported rails return `blocked`; the
  skill never labels an unavailable ACH or x402 path ready.
- `rail_profile_ref` and `idempotency_seed` are explicit and pass unchanged.
  Hosted `payment_admission` and realm pass through only when supplied.

A `ready_for_spend` plan names `skill: spend`, the executable runner, and
the exact validated inputs. A blocked plan has no downstream handoff and lists
the failed bounds. Approval and rail evidence belong to downstream `spend`.

## Stop conditions

- Block missing invoice identity, non-positive or non-integer minor units,
  malformed currency, or ambiguous payee identity.
- Refuse raw bank-account or routing material; accept only an opaque settlement
  ref or stable settlement digest.
- Block an unsupported rail or any invoice outside the parent authority's
  amount, currency, counterparty, operation, realm, or aggregate bounds.
- Do not interpret an existing approval note as downstream spend approval.
- Preserve the same profile and idempotency seed in the handoff; do not silently
  regenerate them.

## Example

An invoice for `25000 AUD` identifies a supplier by party ref and opaque Stripe
settlement ref. If the parent authority permits that supplier, currency,
`invoice.settle` operation, rail, and ceiling, the skill returns the exact
`spend:stripe-spt` inputs. If the invoice requests ACH—which no canonical runner
supports—the result is blocked rather than a vague “ready” plan. In both cases,
no payment has occurred.