Release

The running jobjob_7Hq2 · accepted · document.fr-CA.pdf · $49.00 final

When a charge releases. The order holds the money by an authorization, a capture or a mandate, and collects it only when the fact the price names is on the record, from delivery to a verified outcome. A refusal never charges, a job that ends early charges only the paid acts already committed, and a declined charge retries before it is unpaid.

Release answers when the buyer is charged. An order holds the price, and the charge waits for one fact on the record. Until it lands, the buyer owes nothing and can see what it's waiting on.

releaseThe charge waits forUse it when
left out, or 'delivery'the job's deliverythe work is the deliverable
'accept'the buyer's acceptance, or 7 days after delivery with no send-backthe buyer judges the work
a submit step's name, such as 'file'that step's receipt from the outside systemno filing, no charge
'<step>.accepted'the outside system's acceptance, not only its receiptthe filing counts only once accepted
'<step>.<guard>', such as 'meet.held'that step committed past its guardthe act is what you sell: a meeting the account attended
'outcome', or an end through price.ona verified outcome: outcomesyou're paid on results

On a list priced per item with a submit release, each item releases on its own receipt, so an item the outside system can't find never charges.

check derives how an order holds the money from its release and its deadline, and prints it as hold:

price.holdWhat the order doescheck picks it when
'authorization'authorizes the card, and captures at the factthe fact lands inside 7 days, while a card authorization lasts
'capture'captures at the order and holds the money under the job, outside your balance, until the factthe fact can land later: an outside acceptance, a long within
'mandate'saves the buyer's card or bank account with their consent, and charges it off-session at the endthe amount is known only at the end: a share, or usd: 0
Run
npx services.dev check services/annual-return.ts --only hold
magic values: metadata.sandbox.outside = reject_once
services/annual-return.ts · release file.accepted, within the agency's own window
  hold    capture · every filing's acceptance can land past 7 days, past a card authorization, so the order captures it and holds it under the job

An authorization about to lapse before its fact is captured and held the same way, at charge.authorization_expiring, so a slow outside system never costs you the charge. A captured hold that returns is a refund, and its processing stays spent. A bank debit has no later capture: charged at the end, it is pending for about four days, then collected, and a window that holds it counts from the collection.

One line names the fact:

Run
grep -n "release\|ends" services/trademark-response.ts
magic values: metadata.sandbox.outside = reject_once
27:  ends: { abandoned: { charge: 'acts', by: ['client', 'clock'] } },
28:  price: { usd: 349, release: 'file' },

A rejection keeps the charge held while the job routes back and repairs. The receipt releases it, and it's final seven days after delivery:

Call
→ GET /owner/matters/job_7Hq3/charges   # released on the office's receipt
200 · job_7Hq3 · trademark-response · chg_7Hq3 and chg_7Hq4 · $349.00 · earned · magic values: metadata.sandbox.outside = reject_once
  Mon 2 Nov 10:04    charge.held        $349.00   authorized at the order, both charges together, on the client's card
  Fri 6 Nov 16:40    submission.sent    file → USPTO
  Fri 6 Nov 16:41    receipt.rejected   missing_specimen → evidence          still held
  Mon 9 Nov 15:02    submission.sent    file → USPTO, with the new specimen
  Mon 9 Nov 15:12    receipt.accepted   rcp_7Hq3
  Mon 9 Nov 15:12    charge.collected   $349.00   captured: api.lawyer $174.00, the attorney $175.00
  Mon 16 Nov 15:12   charge.earned      $349.00   final, 7 days after delivery

With several filings, '<step>.accepted' waits for every one, and acceptance can come months after the order, so the money is captured and held under the job. A repair inside the outside system's window keeps its first filing time:

Call
→ GET /owner/returns/job_4Tx2/charges   # released on the outside system's acceptance
200 · job_4Tx2 · annual-return · chg_4Tx2 · $1,800.00 · earned · magic values: metadata.sandbox.outside = reject_once
  2026-01-12   charge.held        $1,800.00   captured at the order and held under job_4Tx2, outside apis.tax's balance
  2026-03-09   receipt.accepted   US · rcp_4Tx2 transmitted and accepted          still held: 1 of 2
  2026-03-09   receipt.rejected   US-CA · ein_mismatch → repair                  still held
  2026-03-11   receipt.accepted   US-CA · rcp_4Tx3, inside the 10-day window, on time
  2026-03-11   charge.collected   $1,800.00   transferred to apis.tax: every filing accepted
  2026-03-18   charge.earned      $1,800.00   final

A refusal holds nothing and charges nothing, whether the rules refuse the order, the gate refuses an act, or a credential is stale. The buyer pays no AI either:

Call
→ POST /matters {"service":"contract-review","contract":"msa.pdf","client":{"name":"Ada Lovelace","email":"signs@example.test"},"client_region":"US-FL","max_usd":99,"key":"msa-1"}
403 · BLOCKED · region_not_ratified · The rules don't ratify advise in US-FL. Nothing was charged. · magic values: metadata.sandbox.outside = reject_once
  money   nothing held, nothing charged, no AI spent
  cure    the rules row's regions are US-CA, US-NY and US-TX

An end declares what it charges. charge: 'acts' charges the paid acts already committed and returns the rest of the hold, so a person who acted is paid and the buyer pays for nothing undelivered:

Call
→ GET /owner/matters/job_7Hq8   # the client withdrew after the attorney advised
200 · job_7Hq8 · contract-review · ended · withdrawn, by the client · $50.00 charged · magic values: metadata.sandbox.outside = reject_once
  money   charge.held $99.00 → advise committed → withdrawn → charge.collected $50.00 → charge.released $49.00
  why     ends.withdrawn charges 'acts': the attorney's advice was committed, the memo was not delivered
  ledger  +$50.00 · attorney's fee $50.00, sold by the attorney (rail member) · AI $1.26 · coverage $4.00 · you −$5.26

A job that lapses before any paid act charges nothing:

Call
→ GET /owner/matters/job_7Hq9   # an evidence ask lapsed before any paid act
200 · job_7Hq9 · trademark-response · ended · abandoned, by the clock · $0.00 · magic values: metadata.sandbox.outside = reject_once
  money   charge.held $349.00 → ask.expired → charge.voided · the authorization dropped, no processing
  ledger  +$0.00 · AI $0.84 · you −$0.84
ends.<end>.chargeCharged
truethe whole price, as at delivery
'acts'each paid act already committed, at its fee
falsenothing; the hold returns

A capture from a live authorization doesn't fail. A charge made at the end, on a mandate or a renewal, can, and each one runs the same way:

MomentStatusEventWhat happens
The bank declinesfailedcharge.failedStripe retries on its schedule, and an ask asks the buyer to update their card or bank account
A retry collectscollectedcharge.collectedthe job runs on as if the first try had collected
Brand.dunning runs out, 14 days unless setunpaidcharge.unpaidthe buyer's next orders answer 402 with the balance; accrued pay stands, and the loss is yours, with no take on it

Outcome money and renewals run the same way: outcomes, subscriptions.

Each seller's part of a job is one charge, chg_, with its release fact, its dates, its amount in cents and the Stripe objects behind it (flow of funds):

captured/money-release.txt · 200 · magic values: metadata.sandbox.outside = reject_once
→ GET /charges/chg_7Hq3
{
  "id": "chg_7Hq3",
  "object": "charge",
  "job": "job_7Hq3",
  "checkout": "chk_7Hq3",
  "seller": "brand",
  "amount": 17400,
  "currency": "usd",
StatusEventMeans
authorizedcharge.heldthe order authorized the price on a card
heldcharge.heldthe order captured the price and holds it under the job until the fact
mandatedcharge.mandateda share or a usd: 0 price: the buyer's card or bank account and consent are saved, and no money is held
—charge.authorization_expiringan authorization lapses in a day: the charge is captured and held
pendingcharge.pendinga bank debit is in flight; it collects in about four days, or fails
collectedcharge.collectedthe fact landed: the buyer is charged and the ledger splits it
earnedcharge.earnedpast the send-back window, or the outcome's
releasedcharge.releasedthe unused part of a hold went back
voidedcharge.voidedthe job ended with nothing to charge
failed, unpaidcharge.failed, charge.unpaida charge at the end was declined, and stayed unpaid when dunning ran out
refundedcharge.refundedmoney went back after collection: refunds
AppWhat it shows
Customer portalHeld, not charged, and the fact it waits for: "charged when the office accepts the filing", or a mandate: "charged at won, up to $12,000"
Delivery portalA member's pay accrues when their act is accepted, whatever the release waits for
Owner consoleHeld money by the fact it waits on, and each job's charges with their dates
KeyWrittenLeft outDoes
price.release'delivery' | 'accept' | <step> | '<step>.accepted' | '<step>.<guard>' | 'outcome'a submit step's receipt, the last one's when there are several; else deliveryThe fact that releases the charge
price.hold'authorization' | 'capture' | 'mandate'derived from the release and withinHow the order holds the money
ends.<end>.chargetrue | 'acts' | falsetrueWhat an end charges
Brand.dunning{ for?: Within; ask?: boolean }{ for: '14d', ask: true }How long a failed charge retries, and whether the buyer is asked to update their card or bank account
CodeWhen
release_unprovencheck: price.release names no step that runs
region_not_ratified, act_refusedan order or an act the rules don't allow; nothing is charged