tade — three kinds of dollar, each one marked

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.

The Tade project·5 min read·spendcost

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.

spend · paneldrawn by Tade
Spend: every agent with its model, tokens, share, runtime and cost, a ~ 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.

blog← oldernewer →The Tade project│2026-09-28│5 min│top