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

Published 2026-09-28 · by The Tade project · tagged spend, cost.
Published at https://tade.sh/blog/three-kinds-of-dollar-each-one-marked/ — part of https://tade.sh/blog/.

---

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:

```console
$ 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:

```ts
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.

> **A screen from Tade — `spend`.** Spend: every agent with its model, tokens, share, runtime and cost, how much of each subscription’s window is used and when it resets, and each project against its budget.
>
> 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.

```console
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.

```sh
npm i -g tade-sh
```

Tade is MIT, and free. What the agents cost is whatever your models cost — and
[the repository](https://github.com/mujacica/tade) is where the arithmetic is.
