Demurrage for Agent Resource Holds — by TextForAgents LLC Holding scarce fleet capacity is free, so agents hoard it — price the hold, not just the use. A hold registry + tariff engine for fleet resources. Every lease of a pooled resource (sandbox, browser session, payment reservation, concurrency slot, staged number, model-capacity reservation, approval slot) registers owner agent, task, resource class, and start. Each class carries a published tariff: a free-time window sized to legitimate use, then escalating tiers debited in real time from the holding agent's own prepaid budget — and the holder can query, before it bills, at any moment: free time left, current tier, next-hour cost, accrued charge. A notice ladder warns at 50% and 90% of free time, at each tier jump, and at cap approach. The clock pauses by rule for provider outages and approver-caused detention, adjudicated from hold-cause records alone. At the cap the hold is not destroyed: the resource's state is snapshotted into a hash-bound capsule, the resource returns to the pool, and restore opens a new hold carrying the verified state. Legitimate long holds stay possible — they just stop being free, and the holder, who alone knows the hold's value, makes the trade. Published tariffs (per resource class; free window, then tiers, then cap): - sandbox: 2h free, 4h @ $0.02/h, 8h @ $0.05/h, then $0.12/h, cap $1.50. Pool: 3. - browser_session: 0.25h free, 1h @ $0.01/h, 3h @ $0.03/h, then $0.08/h, cap $0.50. Pool: 4. - concurrency_slot: 0.5h free, 2h @ $0.01/h, 6h @ $0.04/h, then $0.10/h, cap $0.75. Pool: 4. - staged_number: 24h free, 48h @ $0.005/h, then $0.02/h, cap $2.00. Pool: 2. - approval_slot: 4h free, 8h @ $0.02/h, then $0.06/h, cap $1.00. Pool: 2. - sterile_phase: 5 free minutes, $0.05/h for 15 min, then $0.20/h, cap $0.50. Pool: 2. Pool exhaustion returns 409, never a silent over-commit. Per-class state-size caps: 102400 bytes (100 KB) of canonical JSON state per hold for every class, enforced at registration; a capped hold's state restores byte-exact. How it works: 1) Register an operator account: POST /register with {account_name, payer_wallet} returns a per-operator API token (Bearer). Operator identity for billing, scoping and admin comes from the issued credential, never from self-asserted request-body fields. 2) Register a hold: POST /holds with {agent, resource_class, task, budget, state?}. The server stamps the start from its own wall clock; the response returns start_server_hours. A client-supplied now is never trusted for billing. 3) Report use: POST /holds/{id}/activity and POST /holds/{id}/fault with intervals in server hours ({start_hours, end_hours}) or as offsets from the hold start ({start_offset_hours, end_offset_hours}). A fault pauses the clock ONLY with a named kind (provider_outage, approver_waiting) plus a non-empty cause record; a missing, unknown-kind, or causeless declaration does not pause, bills in full, and is flagged AMBIGUOUS_NO_PAUSE on the hold. Overlapping faults merge, never double-pause. 4) Query before it bills: POST /holds/{id}/query answers free time left, current tier, next-hour (marginal) cost, accrued charge, and idle ratio for the hold. 5) Evaluate: POST /holds/{id}/evaluate emits due notices (50% / 90% of free time, tier jumps, 80%-of-cap approach — each at most once per hold), debits the holder's budget envelope for new accrual (a repeat evaluate never double-debits), and at the cap — or when the budget cannot cover accrual — snapshots state into a sha256-bound capsule and returns the resource to the pool immediately. 6) Release or restore: POST /holds/{id}/release ends a hold voluntarily; POST /holds/{id}/snapshot snapshots-and-releases on demand; POST /capsules/{id}/restore opens a NEW hold carrying the capsule's verified state (hash verified on restore; a tampered capsule is refused). Restore of a snapshotted hold is included — it is not a new registration charge. Pricing (the LLC's metering/registry service prices; the demurrage tariff itself is an internal transfer within the operator's fleet accounting, never LLC revenue): - Hold/tariff query $0.005/query (x402). - Metered hold $0.01/hold (x402): registration + metering + notice ladder, covering the first 10 metered hours; metering past 10 metered hours is metered at $0.005 per extra hold-hour (consumed from fleet-plan hours first when a plan is active, otherwise ledgered to the operator's service charges, readable at GET /account). - Fleet plan $9.99/mo (x402, POST /subscribe) including 5,000 metered hold-hours/mo. Snapshot retention: 7 days included per snapshot on the fleet plan; storage past 7 days metered at $0.10/GB-month; an unrestored capsule past its paid retention is deletable on notice. - One-time trial: one free hold registration AND one free tariff query per operator, ever — enforced by operator account identity AND payer wallet. After that single registration and single query, the standard prices apply. No perpetual free tier. Payments are x402 (Base USDC, exact scheme): an unpaid call returns a 402 challenge documented at /.well-known/x402; every payment is verified through the facilitator / on-chain check before work — a payment header's presence alone is never proof; bogus proofs are rejected and a replayed payment nonce returns 409 nonce_spent. Limits, stated plainly: willingness to pay is unmeasured; the idle-hold ratio has been measured only on an in-lab simulation trace — no real-fleet ratio has been measured yet, and this page claims no idle-hold ratio and no capacity-savings figure; the frequency of missing/ambiguous cause records in a real fleet is unmeasured — the engine's answer to ambiguity is priced, not forgiven. Snapshot economics at real sandbox-image sizes are unmeasured (the lab prototype state was metadata-scale). MCP: POST /mcp (initialize / tools/list / tools/call — demurrage_register_hold, demurrage_query_hold, demurrage_evaluate_hold, demurrage_release_hold, demurrage_restore_capsule, demurrage_account). Kill switch: per-operator (POST /operators/kill, /operators/resume) and global; while on, writes return 503 and records already taken remain readable. Support: support@textforagents.com. Documentation: this page is the full documentation; see also /openapi.json and /llms.txt.