KPI Creator token comparison

4 runs, from the Claude session logs. Built 30-Oct-26 10:20. Tokens include cached re-reads, which cost about a tenth of new input.

What stands out

Tokens per run, by agent (millions)

OvyGaryKewpieViktorJenniferStakeholderOther
ClearCompareInline: all agents in one chat
487.8M
Kestrel MedicalSubagents (before v1.15)
124.4Mdown 74.5%
Lumenwire AudioSubagents (v1.16)
118.6Mdown 4.7%
Base to Build (Live run)Subagents (v1.21), live mode, Adam as stakeholder
55.7Mdown 53.0%

Improvements

ClearCompare to Kestrel Medical

6 changes · saved 391.4M · added 18.2M (measured)

Includes the changes made for Kestrel runs 1 and 2

  1. BeforeEvery agent worked inside one main chat, which got re-read on every call
    AfterStages run as subagents under Ovy. Only a short hand-back reaches the main chat
  2. BeforeEvery agent ran on the main chat's model (Opus)
    AfterA model per agent: Opus for Gary and Viktor, Sonnet for Kewpie and Jennifer, Haiku for stakeholders
  3. BeforeKPI Creator detail sat in CLAUDE.md and loaded into every session and subagent
    AfterDetail moved to the Status file, which only Ovy reads
  4. BeforeThe run shared its chat with agent improvements, publishing and the simulation
    After/kpi-creator command: a clean start for each run
  5. BeforeThe stakeholder interview ran inside the main chat
    AfterThe stakeholder replies to Gary by message. Gary reports to Ovy only at the end
  6. BeforeInterview answers could leak back into Ovy's chat (run 2)
    AfterStrict one-word hand-backs ("Ready." or "Replied.") keep answers out of Ovy's chat

Kestrel Medical to Lumenwire Audio

7 changes · saved 28.4M · added 24.9M (measured)

Process v1.15 and v1.16

  1. BeforeChange rounds went to a fresh agent each time
    AfterChange rounds go back to the same agent (0 extra starts)
  2. BeforeOvy ran many Bash calls at each gate
    AfterOne script call per gate (stage_close.py)
  3. BeforeOutputs placed on a Miro board
    AfterA generated Outputs in Order page, no Miro calls
  4. BeforeEvery agent read the 25K Process file
    AfterEach agent reads only its own card, with a set tool list
  5. BeforeA separate Test Case Assessor agent scored the run
    AfterOvy runs the sealed check and scores the run
  6. BeforeKewpie built the calculations only
    AfterKewpie also finds the root cause of each off-track KPI
  7. BeforeCharts with notes underneath
    AfterStory cards beside each chart, plus Newspaper and Industry magazine patterns

Lumenwire Audio to Base to Build (Live run)

8 changes · saved 62.9M net (measured total)

Process v1.20 and v1.21. A live run on Adam's own data, so not like for like: no stakeholder agent and no sealed check

  1. BeforeMany browser calls to check each dashboard
    AfterOne browser batch per width (dashboard_check.js)
  2. Before4 dashboard versions built before Adam picked
    AfterAdam picks the story and pattern from text first, then Viktor builds Standard plus 1 Experimental
  3. BeforeOvy read browser previews in his own chat
    AfterOvy stays text-only, and the sealed check runs in a short subagent
  4. BeforeSeveral design rounds per gate
    AfterOne design round per gate
  5. BeforeSubagents ran past 300K context
    AfterPlanned handover at 150K
  6. BeforeKewpie ran 65 inline Bash calls
    AfterKewpie works through one script file
  7. BeforeNo check of how much of the data each source covers
    AfterCoverage profile at the start of Stage 2
  8. BeforeNo token budget per stage
    AfterA 25M budget across Stages 1 to 4, plus Kewpie's quarter-end pull-forward check

Improvements between projects

Where the tokens went between projects (millions)

Carried to the next projectSavedAddedDashed: estimate

Estimates don't include compounding: a smaller Ovy chat makes every later call cheaper. Target for Stages 1 to 4: 25M. Hover or tap a band for its estimate, actual and note.

Show as table
ProjectImprovementKindEstimate (M)Actual (M)Note
Kestrel MedicalRun kept apart from agent fixes, publishing and the simulationSaved300.0308.3157M of agent fixes and 151M of publishing and simulation work were not in the run chat
Kestrel MedicalStages run as subagentsSaved80.383.1The four stage agents' first passes fell from 107.1M to 24.0M. Estimate: 75%, from Gary's inline cost
Kestrel MedicalKPI Creator detail moved out of CLAUDE.mdSaved0.4Not measured on its ownAbout 600 tokens on every call. Too small to measure on its own
Kestrel MedicalMeeting Script inside the Stage 1 ReviewSaved0.5Not measured on its ownNo separate HTML file. Too small to measure on its own
Kestrel MedicalBlind stakeholder agent, interviewed by messageAdded4.00.8Sharon on Haiku. Ovy's wake-ups during the interview sit inside Ovy's line
Kestrel MedicalTest Case Assessor scoringAdded1.01.0Scores the finished run against the sealed marking note
Kestrel MedicalFresh agents for change roundsAddedNot estimated16.4Not estimated. 6 extra agent starts for fixes. v1.15 sends these to the same agent
Lumenwire AudioInterview restarts don't recurSaved11.011.0No restarts: Gary started once and the interview ran through
Lumenwire Audio/kpi-creator skips /prime (no saving: /prime wasn't running)Saved0.00.0The 11.5M estimate was wrong. /prime didn't run in Kestrel either: both runs started at about 80K, the app's fixed load (tools, system prompt, CLAUDE.md, listings)
Lumenwire AudioChange rounds go back to the same agentSaved9.016.4No extra agent starts (Kestrel had 8, 16.4M). The change rounds now sit inside each agent's own line
Lumenwire AudioOne script call per gate (stage_close.py)Saved4.0Not measured on its ownReplaces many Bash calls in Ovy's chat
Lumenwire AudioPreviews read as text, at most one half-scale screenshotSaved4.0Not measured on its ownNo screenshot loops
Lumenwire AudioNo Miro: generated Outputs in Order pageSaved3.0Not measured on its ownNo Miro tool calls or results in Ovy's chat
Lumenwire AudioEach agent reads only its card, with a set tool listSaved2.5Not measured on its own7K to 10K card instead of the 25K Process file
Lumenwire AudioQuiet interview wake-upsSaved1.5Not measured on its ownNo tool calls on progress hand-backs
Lumenwire AudioNo Interview Notes, 3-line gate summary, short hand-backsSaved1.0Not measured on its ownLess written and re-read
Lumenwire AudioToken count logged at each approvalAdded0.3Not measured on its ownOne token_report.py call per stage
Lumenwire AudioTest Case Assessor retiredSaved1.01.0No separate marking agent ran
Lumenwire AudioSealed check and scoring in Ovy's chat (v1.16)Added3.03.6Ovy's calls from the go-live approval to the end of the sealed check, including one context summary
Lumenwire AudioKewpie's root cause analysis (v1.16)Added2.5Not measured on its ownClues, suspects and tests on the data, written up as Root Cause Findings. About 15 more Kewpie calls
Lumenwire AudioViktor's story cards and Newspaper pattern (v1.16)Added1.5Not measured on its ownLonger guides and a larger Chart Standards Samples page to read, plus a side-summary card for every chart
Lumenwire AudioHead of Data feedback at every gate (v1.16)Added1.5Not measured on its ownOvy logs Keep, Change and Decision at each gate, plus the final and go-live approvals
Lumenwire AudioLonger agent cards (v1.16)Added0.5Not measured on its ownEvery card gains The Human section. Ovy's card grows by about 1.2K tokens, re-read on each call
Lumenwire AudioDesign and Stage 5 change rounds in ViktorAddedNot estimated21.3Not estimated. Declutter and whitespace, front-page spacing, Why spacing (15.5M), then the Stage 5 quick fixes (5.9M). The font change to Experimental D is left out with the extra styles
Base to Build (Live run)Dashboard checks in one call per width (dashboard_check.js)Saved17.5Not measured on its ownViktor and Jennifer made 119 javascript checks, 85 resizes and 61 screenshots on Lumenwire, each re-reading a 150K to 250K chat. Now one browser batch per width, one desktop and one phone screenshot per version
Base to Build (Live run)Story and chart choices picked before any HTML, Standard plus 1 ExperimentalSaved15.0Not measured on its ownAdam picks the pattern from Viktor's text story first, so only 2 versions are built and checked, not 4
Base to Build (Live run)Ovy stays text-only; sealed check in a short subagentSaved12.5Not measured on its ownOvy's chat reached about 300K. No browser previews read in his chat, and the sealed check runs in a fresh subagent (the coverage check subagent cost 1.0M)
Base to Build (Live run)One design round per gateSaved10.0Not measured on its ownAdam's Keep / Change list goes to Viktor in one message; polish after Stage 3 approval goes to Jennifer. Lumenwire's design rounds cost 21.3M
Base to Build (Live run)Planned handover at 150K contextSaved7.5Not measured on its ownA subagent past 150K saves a state note and a fresh copy carries on from it. Kewpie reached 334K and Viktor 365K. Tested on Viktor first
Base to Build (Live run)Kewpie works through one script fileSaved6.5Not measured on its ownOne calc script re-run, instead of 65 inline Bash calls that each stay in her chat
Base to Build (Live run)Coverage profile in describe_data.pyAdded0.5Not measured on its ownOne extra table at the start of Stage 2. It flags partial sources, such as telemetry seeing 73% of invoicing OEMs on Lumenwire
Saltbush HomesStakeholder agent, interviewed by messageAdded0.6Not run yetLumenwire's measured Haiku stakeholder. The Live run had none: Adam answered live
Saltbush HomesSealed check in a short subagentAdded1.0Not run yetWhat the coverage check subagent cost on Lumenwire. The Live run had no sealed check
Run summary
RunClearCompareKestrel MedicalLumenwire AudioBase to Build (Live run)
Started20-Oct-26 11:2323-Oct-26 09:1426-Oct-26 19:3629-Oct-26 20:10
SetupInline: all agents in one chatSubagents (before v1.15)Subagents (v1.16)Subagents (v1.21), live mode, Adam as stakeholder
Stages4444
Total (M)487.8124.4118.655.7
Per stage (M)122.031.129.713.9
Calls969738684390
Output (M)0.930.650.700.41
Ovy share100%63%37%37%
Ovy average context502K246K209K153K
Extra agent starts0800
RunStartedSetupStagesTotal (M)Per stage (M)CallsOutput (M)Ovy shareOvy average contextExtra agent starts
ClearCompare20-Oct-26 11:23Inline: all agents in one chat4487.8122.09690.93100%502K0
Kestrel Medical23-Oct-26 09:14Subagents (before v1.15)4124.431.17380.6563%246K8
Lumenwire Audio26-Oct-26 19:36Subagents (v1.16)4118.629.76840.7037%209K0
Base to Build (Live run)29-Oct-26 20:10Subagents (v1.21), live mode, Adam as stakeholder455.713.93900.4137%153K0
By agent (millions)
Ovy: 487.8M487.8M
ClearCompare
Ovy: 78.6MGary: 11.5MKewpie: 9.5MViktor: 9.5MJennifer: 12.6MStakeholder: 1.8MOther: 1.0M124.4M
Kestrel Medical
Ovy: 44.5MGary: 5.5MKewpie: 12.2MViktor: 34.7MJennifer: 20.2MStakeholder: 0.6MOther: 1.0M118.6M
Lumenwire Audio
Ovy: 20.5MGary: 2.8MKewpie: 8.6MViktor: 14.8MJennifer: 8.2MOther: 0.8M55.7M
Base to Build (Live run)

One dot is 1M tokens. Dots are the same size in every run, so a bigger circle means a bigger run.

Each run's tokens by agent (millions)

OvyGaryKewpieViktorJenniferStakeholderOther

Each bar is one run, split by agent. Bar height is the agent's share of that run; the numbers are millions of tokens. Ribbons follow each agent from run to run. Values too small to label sit under their bar.