The Performance dashboard doesn't know about Claude Fable 5 yet. Two problems:
- Costs are wrong.
MODEL_PRICING has no claude-fable-5 entry, so getPricing() falls through to the Sonnet default ($3/$15). Fable is $10/$50 — Fable-heavy sessions get under-costed about 3.3x.
- Display is broken.
shortModel() only knows opus/haiku/sonnet, so Fable sessions show up as a truncated raw id like claude-fable-5[1m] instead of "Fable".
One detail that matters: transcripts carry suffixed ids (claude-fable-5[1m]), so a table entry alone won't fix it — the fuzzy match needs a fable branch too.
The fix is small (PR incoming):
- Add
"claude-fable-5": { input: 10, output: 50, cacheWrite: 12.50, cacheRead: 1.00 } to MODEL_PRICING
- Add a
fable branch to the fuzzy match
- Add the "Fable" display name to
shortModel()
Tested in a sandbox with a synthetic Fable transcript — costs came out exact ($10.00 for 1M input, $5.00 for 100K output, and so on down the line).
Two things I hit while testing, separate from this fix — I can file them if you want them tracked:
- First run on a completely fresh system crashes:
saveState() writes into PAI/PULSE/Performance/, but nothing ever creates that directory
- The Opus rows still carry $15/$75 pricing; current Opus 4.x is $5/$25
The Performance dashboard doesn't know about Claude Fable 5 yet. Two problems:
MODEL_PRICINGhas noclaude-fable-5entry, sogetPricing()falls through to the Sonnet default ($3/$15). Fable is $10/$50 — Fable-heavy sessions get under-costed about 3.3x.shortModel()only knows opus/haiku/sonnet, so Fable sessions show up as a truncated raw id likeclaude-fable-5[1m]instead of "Fable".One detail that matters: transcripts carry suffixed ids (
claude-fable-5[1m]), so a table entry alone won't fix it — the fuzzy match needs afablebranch too.The fix is small (PR incoming):
"claude-fable-5": { input: 10, output: 50, cacheWrite: 12.50, cacheRead: 1.00 }toMODEL_PRICINGfablebranch to the fuzzy matchshortModel()Tested in a sandbox with a synthetic Fable transcript — costs came out exact ($10.00 for 1M input, $5.00 for 100K output, and so on down the line).
Two things I hit while testing, separate from this fix — I can file them if you want them tracked:
saveState()writes intoPAI/PULSE/Performance/, but nothing ever creates that directory