Real token costs, measured rather than guessed
Pekan can now capture what a terminal Claude Code session actually cost, without anyone having to estimate anything. When a session ends, a hook reads the transcript Claude Code just wrote, totals the token usage recorded in it, and reports that to your board. The numbers come from the provider's own accounting, so the Telemetry view's Runs tab fills in for sessions the desktop app never launched. For most people, that is nearly all of them.
Building it turned up three properties of the transcript format that quietly wreck a naive total, and all three are now handled. Assistant messages are repeated across lines: in one real session, 187 of 466 lines were duplicates, so counting them all inflates usage by more than half. Cache writes carry a time-to-live split, and the one-hour variety bills at twice the base input rate rather than the five-minute rate's 1.25x. And most consequentially, the input token count is the uncached remainder only, not a total: in that same session it read 566 against 67.2 million cache-read tokens.
That last point is why the Flow tab still shows plain token counts rather than dollars for most tasks. A single blended token number cannot be priced, even in principle. Input, output, cache reads and cache writes differ by as much as fiftyfold per token, so the mix decides the bill far more than the total does. The same 700,000 tokens can be a few dollars or twenty. Where a captured run exists, the Costliest tasks panel now shows a real metered dollar figure and says how many of the listed tasks it could meter; everywhere else it shows the agent's reported token count, visibly distinct, and labelled as the estimate it is.
The pricing catalog was corrected against both providers' published rates in the process. Claude Opus 5 had been carrying Opus 4.1's older, higher numbers; Sonnet 5's introductory pricing is now reflected; Fable 5 was added; and the OpenAI entries were replaced, since the model identifiers they named are no longer in OpenAI's catalog and could never have matched anything a provider reports. A model with no published rate is still stored as unknown rather than guessed: an unpriced run reads "cost unknown", never zero.