Observe

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

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:

Run
npx services.dev jobs trace job_5Tq1 --live
magic values: none
job_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
ColumnRead from
step, doereach step.committed, and the role, code, AI or party that proposed it
began, tookthe step's first proposal to its commit
waited onthe open ask, the unclaimed Task or the outside system the step was waiting for, from job.paused and the Task's timers
AIeach decision.made: the calls, the model each was pinned to, their cost in cents
gatewhat 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.

Run
npx services.dev jobs ledger job_5Tq1
magic values: none
job_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 take

The 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.

Run
npx services.dev spend --by step --since 2027-02-01 --live
magic values: none
apis.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.alarm

Each 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.

Run
open https://apis.tax/console/jobs/job_5Tq1
magic values: none
Return 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.92

Every 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:

Run
npx services.dev audit --since 2026-11-09 --live
magic values: none
api.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 log

Only 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)APIEventOn the consolePlan
jobs trace <job>GET /owner/jobs/:id/tracenone: it reads/console/jobsevery plan
jobs ledger <job>GET /owner/jobs/:idnone: it reads/console/jobsevery plan
spend --by service|step|model --since <date>GET /owner/spendspend.alarm, ai.exhausted/consoleevery plan
logsGET /owner/logsnone: it reads/console/auditevery plan
listenGET /events/streamnone: it reads—every plan
audit --since <date> [--who agent]GET /owner/auditnone: it reads/console/auditevery plan