blog /
Three kinds of dollar, each one marked
In seven days this machine spent $200.77 that a harness priced exactly, plus 3,177 million tokens no dollar figure covers. Tade never adds those together.
Here is the whole problem in one line. A harness on a subscription reports what a turn would have cost an API, and nobody is charged it. Add that to the dollars somebody actually was charged and the total is fiction — in the direction that makes the tool look impressive.
So Tade keeps three kinds of dollar apart, marks every figure with which kind it is, and refuses to turn a plan into money at all.
This is what that looks like on the machine this site was built on, read on 28 September 2026:
$ tade spend --days 7
last 7 days
elsewhere $200.77 132.7M tokens —
tade — 2875.8M tokens 39d 8h
tade-web — 301.3M tokens 5d 22h
total $200.77 3309.8M tokens 45d 7h
by harness
pi $200.77 132.7M tokens 6h 59m
claude-code — 3177.0M tokens 45d
$200.77 priced by the harness, against its own catalog — and 3177.0M of these
tokens nothing here could price, which no figure above covers
Two hundred dollars and three and a quarter billion tokens, and the second
number is not the cause of the first. They are two different things that
happened in the same week. (elsewhere is the bucket for turns belonging to no
task — the orchestrator’s own, and the window’s.)
Who priced it, and the three answers
The harness that ran a turn is the only thing that knows what was charged, so its figure wins wherever it gives one. What differs is whether it vouched for it:
| kind | what it is | how it is marked |
|---|---|---|
exact |
the harness priced it against its own catalog | nothing |
estimate |
the harness guessed at it | ~ |
listed |
the harness prices nothing, so Tade priced the tokens | ≈ |
A total may still add all three — somebody asking what the morning cost wants one number — but every surface that prints one also says what it is made of, and money nobody vouched for is marked in the column where it is read rather than in a footnote.
The declaration is per harness, and it is short:
pi: { provider: null, usd: 'exact' },
'claude-code': { provider: 'anthropic', usd: 'none' },
codex: { provider: 'openai', usd: 'none' },
none is the honest half of it. Codex counts tokens and never prices them,
and a journal is full of turns whose harness said nothing at all. The
alternative to filling that in is a money column with a hole in it and nothing
saying so — which is why ccusage exists as a separate program. The hole is
real; the answer is to price it here.
~ on
any figure the harness only guessed at, and under PLAN what each subscription
has left — its own list, in no total above it. The figures in this screen are
Tade drawing one of its own test scenarios; the real ones are the report above.A subscription is not money
isMoney decides this before anything reaches the price table, and it decides
by the sign-in rather than by the number.
A plan pays a flat fee. The tokens under it have no per-token cost at all, so
there is nothing to price and nothing to total — and a harness’s guess at what
an API would have charged for them is money that means nothing being added to
a figure that means something. In the report above that is the — beside
claude-code, and 3,177.0M tokens behind it.
That dash is not zero spend. It is unknown spend, and the two have to be
told apart because a dollar budget cannot police it. So a token budget exists
as well, and what any bucket holds that no dollar covers is kept beside the
money — tokensUnpriced — because a bucket holding both reads as a complete
figure with one agent’s cost missing from it.
What a plan has left is the other question entirely, and it is its own list: how much of each window is used and when it resets, never a dollar, never in a total. On that page pi says cannot tell — is never told what a plan has left; it prices each turn instead, which is the truthful answer rather than a blank.
A price is a fact with a date on it
Where a harness prices nothing, Tade prices the tokens from a table checked
into the source, with the day it was read off the providers’ own pages riding
along with every figure it produces. Today that is PRICES_TAKEN = '2026-09-27'.
It is never fetched. Three places were possible and two are worse: a network lookup breaks the rule that nothing on a timer touches the network, and makes every reader of an old journal ask the internet what last March cost. A price typed into the config by every user is a blank table on every machine nobody filled in.
The cost of that choice is that it goes stale, which is exactly why the date is
attached and why config.prices overrides any model without waiting for a
release.
Two details in the table matter more than they look:
- Four figures per model, not one. Input, output, cache read and cache write. A cached prompt read back costs a tenth of a fresh one, and an agent’s day is mostly cache reads — 3.1 billion of the 3.3 billion tokens above. Pricing a long run off the input rate alone overstates it several times over.
- A model the table has never heard of stays unknown. An invented price would be indistinguishable from a real one on the page, and a wrong dollar figure is worse than a missing one.
And the hours are two numbers, not one
The same argument applies to time, which is where the first version of this was wrong.
45d 7h is 168 runs added together, not elapsed time: agents at once each count
their own hours, and each counts until it stopped, idle time included.
At least 17h 49m of that was spent working — inside a turn, rather than sitting
in a lane waiting to be read. 93 of these runs began before Tade wrote down
when a turn starts, so what they spent working cannot be known — it is not
nought.
Forty-five days of lane time in seven days of wall clock is the parallelism, stated as what it is. Wall clock answers how long an agent was there, which is what an agent sitting finished in its lane until somebody closes the window burns. Working time answers how long a model was actually working, which is what pairs with a cost. Both are true, they answer different questions, and reading one as the other is the mistake the sentence exists to prevent.
unknown rather than nought, again: the journal is append-only, turn_done
has always been written and turn_started has not, so 93 of those runs cannot
say. A 0s in that column would be a lie told four times a second.
What this is worth
Nothing, if the only question is roughly how much am I spending. Plenty, the first time somebody asks where $200 went and the answer has to survive being checked.
The four claims in this post are each one file. isMoney and the three kinds
are packages/core/src/spend.ts; the dated table is
packages/core/src/prices.ts; the two clocks are
packages/core/src/runtime.ts. The report above is
tade spend --days 7 --json on any machine that has been running agents.
npm i -g tade-sh
Tade is MIT, and free. What the agents cost is whatever your models cost — and the repository is where the arithmetic is.