Development record
The launches abcd makes spend a person's money only within the budget they set, past it only through named residuals
Context
abcd starts agents itself when a role is routed to a command-line runner, and on the claude runner's key route every launch is billed to the person's own API account. The first live run on a person's key (2026-11-01) cost 0.97 USD for one review and 0.33 USD for another; the run's budget check reported itself skipped, because no runner reports a quota. Every route already records the cost it reported (itd-166), so the figure exists; nothing treats it as a limit. The model-matrix intent rules a spending cap for matrix runs alone (itd-2610161733316518, decision 17: a figure the person named, no default abcd supplies, shown before consent, and the run stops when it is reached). Builds and drains spend the same money with no such rule, and a drain is meant to run unattended for a day (itd-2610161016401115).
Decision
We will spend a person's money, in the launches abcd makes, only within a budget they set; spend on the same key outside abcd's launches is neither counted nor bounded, and the record of totals is writable by the person's own account, residuals the provider's own console limit covers. Any launch that bills a person per token, through any route abcd starts, runs only under a budget of the person's own: caps per day, per week and per month, set in their own configuration through a command abcd refuses to agents (a filter, not a lock, since agents run as the person's own account and could edit the configuration directly), with no default figure abcd supplies; a route with no budget set refuses to start. Within the budget, abcd bounds every launch, running ones included, against what remains of the key's caps: each launch's --max-budget-usd is reserved against every cap before it starts, so the bounds handed out never together exceed what remains less a headroom kept for the response that can cross a bound, and a launch held back by reservations is told so, distinct from a cap reached. The spec sets the arithmetic and must bound, and name where it cannot, three residuals, each named in the record when it happens and the first flagged for the product thinker: a response larger than any launch cost recorded before it, a launch whose cost cannot be read, and how many launches may run on one key at once; and a fourth no machine can see when it happens, the same key used by abcd on a second machine, since the store of totals is per machine and each machine's store counts only its own launches, so one key spends up to the cap on each; running launches are not stopped at the cap, as decision 34 stops matrix copies, because each already ends at its own reserved bound. When a cap is reached the work pauses until the period resets or the person raises the cap; it never continues on the host session or the subscription; moving to a second key the person named for that purpose is a per-repository choice of theirs. A route that bills no money (the host session, the subscription route) needs no budget.
This refines decisions 17 and 34 of itd-2610161733316518 from matrix runs to every route that spends the person's money, keeping 17's person-named figure with no default and 34's rule that no launch starts unless its remainder covers it. The product thinker accepted it, the four named residuals included, at the planning interview of itd-2611011230226453 (dcn-2611041550126639): an overrun abcd can see is recorded against the key and named in the run's record, and the provider's own console limit is the outer stop past every residual.
Alternatives Considered
- A budget the person sets, enforced per launch with headroom and summed per period, pausing at the cap (chosen). It keeps the guarantee where the money is spent, reuses the costs itd-166 records, and leaves only the residuals the Decision names. Its residual: a command refused to agents is a filter, not a lock, since agents run as the person's own account; raising a cap with the person's touch (itd-2611012123486967) closes it.
- Leave it to the provider's console limit. It stops the key only at the account's limit, across every use of the key, and a run then fails mid-lane with no pause; the person learns of it from the provider. Rejected as the only control; the console limit stays a sensible second fence.
- A default budget abcd supplies. Every figure abcd could choose spends money on a number the person never set, which decision 17 already refuses. Rejected.
- Fall back to the host session when a cap is reached. It keeps work moving but spends the person's subscription without asking, which the product thinker ruled out on 2026-11-01. Rejected.
Consequences
- Every route that bills per token must report its cost, failed launches included, and honour the bound before it can be routed; the claude runner must keep the cost of a non-success result it discards today.
- The budget check of a build and a drain stops reporting itself skipped for a budgeted route.
- An unread cost charged as its whole bound means a harness crash can pause the work early; the pause keeps the work, so the cost is time, not loss.
- A person who wants agents unable even to request a raise needs the touch of itd-2611012123486967.
- The brief gains an invariant naming this rule, and the build and drain chapters gain the arithmetic from the spec of itd-2611011230226453, which carries the outcome and the named residuals.
Frontmatter
| id | adr-2611011231015519 |
|---|---|
| type | adr |
| status | accepted |
| date | 2026-11-01 |
.abcd/development/decisions/adrs/2611011231015519-abcd-never-spends-a-person-s-money-past.md
open on GitHub ↗ · commit history ↗
References4
- adr-2610120937435856A cloud session's unchecked work goes only to a declared work-in-progress prefix that never reaches the default branchrelated
- adr-2610222222326104abcd drives agents with no host session only on the person's own invocation, on the person's own account behind a wall, and hands back what it cannot finishrelated
- itd-2610161733316518One task done across a model matrix, re-runnablyrelated
- itd-2611011230226453Agents abcd starts on your API key stay within the budget you setrelated
mentions5
- dcn-26110415501266392026-11-04 — The product thinker's rulings on the per-key budget draft itd-2611011230226453, at its planning interview. The API key a session names is a named credential, resolved through the credential store by name from whichever of its homes the person chose (adr-2609221017021499); the keychain is the suggested home, never a required one, so a machine without a keychain tool is offered the key route like any other, and the draft is reworded to say so. Spend never passing a cap admits the exceptions the record names: a response larger than any launch cost recorded on the key before it, a launch whose cost cannot be read, several launches sharing one key at once, and the same key used by abcd on a second machine; an overrun abcd can see is recorded against the key and named in the run's record, and the provider's own console limit is the outer stop past every one of them. On that ruling adr-2611011231015519 is accepted, and its refinement of decisions 17 and 34 of itd-2610161733316518 is no longer advisory. The key route and the subscription route compose by one rule: a key at its cap pauses or moves to a second key the person named and never falls to a subscription, a subscription at its usage mark never opens a route the person has not named, and both out at once is a wait, never a third route. The key reaches the harness by a channel the agent's own shell cannot read, proved to work with the harness first, and that proof is the plan's first step; this binds how the key is handed over and not what an agent spends through the harness, which the caps bound.
- itd-166A run records what it was actually run with
- itd-2610161016401115Drains run unattended and visibly
- itd-2611012123486967Raising a spending cap needs the person's touch
- itd-2611040344170206Unattended work runs on a named profile, one per way of paying