Observe
Every job's trace, step by step, with who did it, how long it took, what it waited on, what AI cost and what the gate said. Then the job's ledger to the cent, and AI spend by Service, step and model, with an alarm when a step's cost jumps. Each view is read from the record, so nothing is sampled or estimated.
Observing a job answers one question: where did its time and money go? Every answer here is read from the record, the job's append-only history, so a trace, a ledger and a spend report never disagree with each other or with what the buyer was charged.
One return from apis.tax's spring, filed three weeks before its date:
npx services.dev jobs trace job_5Tq1 --livejob_5Tq1 · Annual Return · Tailwind Traders · 2026 · S corp · US, US-CA · accepted · version 2027-01 · rules 2026-10
step doer began took waited on AI gate
consent owner · consent 02-01 09:00 4h 12m the officer — committed
organizer owner · upload 02-01 13:12 9d 3h the officer, 6 items — committed
compute code · schedules 02-10 16:20 2s — — committed · cites 2 schedules
draft ai 02-10 16:20 3m 41s — 4 calls $1.92 committed
check ai · adversarial 02-10 16:24 2m 05s — 6 calls $1.38 passed in round 2 · 1 finding fixed
sign signer · mbr_8Ea4 02-10 16:26 1d 2h claim 1h 40m — committed · stamped
authorize owner · sign 02-11 18:31 6h 02m the officer — committed
file submit · each 02-12 00:33 3h 20m the IRS, then US-CA — 2 receipts, accepted
total 10d 19h · 9d 13h of it waiting on the officer · AI 10 calls, $3.30 · 1 person's act| Column | Read from |
|---|---|
| step, doer | each step.committed, and the role, code, AI or party that proposed it |
| began, took | the step's first proposal to its commit |
| waited on | the open ask, the unclaimed Task or the outside system the step was waiting for, from job.paused and the Task's timers |
| AI | each decision.made: the calls, the model each was pinned to, their cost in cents |
| gate | what the gate did: committed, refused with its reason, or the review's rounds and findings |
The trace says where to act. Here nine and a half of its eleven days were the officer's, so the request list is the lever, not the AI.
npx services.dev jobs ledger job_5Tq1job_5Tq1 · $1,800.00 released on file.accepted · 2027-02-12
+ charge $1,800.00
− processing $52.50
− AI $3.30 draft $1.92, check $1.38
− signer's pay $75.00 mbr_8Ea4 · accrued at sign
− state fees $0.00 US-CA takes none to e-file
− services.dev's take the take on $1,725.00
= you $1,669.20, less the takeThe ledger's lines and who carries each one are on Money. The take sits on the line the brand adds, never on a member's pay.
npx services.dev spend --by step --since 2027-02-01 --liveapis.tax · live · 2027-02-01 → 2027-03-31 · AI $1,045.56 on 392 returns · $2.67 a return
service step calls spend a job of the price
annual-return draft 1,140 $547.20 $1.92 0.11%
annual-return check 1,710 $393.30 $1.38 0.08%
question answer 61 $51.24 $0.84 1.71%
estimate draft 92 $53.82 $1.17 1.48%
caps no return reached its AI budget · ai.exhausted 0 times
alarm none · a step whose cost a job rises past twice its 30-day median raises spend.alarmEach AI job has a budget, a fifth of its price unless price.ai says otherwise. Past it, ai.exhausted asks you to fund more, hands the step to its escalate role, or ends the job, and the buyer is never billed for AI (price.ai). spend.alarm fires when a step's cost a job passes twice its 30-day median, so a model that starts looping shows up the same hour. Brand.ai.alarm sets the multiple.
open https://apis.tax/console/jobs/job_5Tq1Return job_5Tq1 · Tailwind Traders · accepted 12 Feb · you $1,669.20, less the take
tabs trace · record · ledger · thread · files · clocks
trace 8 steps · the longest wait: organizer, 9d 3h, on the officer · the costliest: draft, $1.92Every act on the console is on the audit log: who did it, under which session, and the reason they gave. An act your files or your coding agent took is marked as theirs:
npx services.dev audit --since 2026-11-09 --liveapi.lawyer · live · 9 Nov → 16 Nov · 6 acts on the console, by your files, your coding agent under your login, and you
when who act what
9 Nov 09:40 respond hold hld_2Lp4 · trademark-response.draft → attorney, $120.00 an act · quality.alarm
9 Nov 13:41 agent evals run evl_3Lq7 against 2026-11-09.1 · no lens finds fewer grounds
9 Nov 13:50 agent line apply contract-review.flag back to AI alone · owner.agent.line: { standard: 'apply' } · its evidence in 2026-11-09.1's notes
9 Nov 13:55 agent deploy --live 2026-11-09.1 · draft pinned to claude-x@2026-11-08
9 Nov 14:20 you hold lift hld_2Lp4 --repin-to 2026-11-09.1 · 22 drafts by attorneys, $2,640.00 · 6 repinned
9 Nov 14:31 you jobs send-back 8 matters --affected, by: 'incident' · $1,400.00 in second acts
kept 90 days, on Team's audit logOnly the owner and staff read decisions, traces and the audit log. A buyer's portal shows the job's timeline and its receipts, never what the AI cost or which model ran. How long the audit log keeps each act depends on the plan (limits).
| Call (CLI) | API | Event | On the console | Plan |
|---|---|---|---|---|
jobs trace <job> | GET /owner/jobs/:id/trace | none: it reads | /console/jobs | every plan |
jobs ledger <job> | GET /owner/jobs/:id | none: it reads | /console/jobs | every plan |
spend --by service|step|model --since <date> | GET /owner/spend | spend.alarm, ai.exhausted | /console | every plan |
logs | GET /owner/logs | none: it reads | /console/audit | every plan |
listen | GET /events/stream | none: it reads | — | every plan |
audit --since <date> [--who agent] | GET /owner/audit | none: it reads | /console/audit | every plan |