A few days ago I open-sourced fable-mode, a set of Claude Code hooks that make Opus 4.8 behave like Fable 5. It re-injects a block of conduct norms into the model on every turn — lead with the answer, don't touch files you weren't asked about, verify before you report.
Two things bothered me after launch. The norm block was 1,377 characters and went in on every single turn, so a one-line question was paying 860 tokens of preamble it never needed. And the cost figure I published, 0.70× Fable, was a three-task average that hid a much uglier per-task shape.
v1.4 is the record of fixing both — and of sealing one regression with code instead of trust.
Not every turn needs the whole block
Re-injecting every turn is deliberate: in a long conversation, an instruction at the top of the system prompt gets buried, so fable-mode keeps the norms in the "always most recent" slot. But a turn where you ask the model to do work needs the full block — respect scope, inspect before you overwrite, prove "done" with a tool result — while "what's the difference between rebase and merge?" needs almost none of it.
So v1.4 splits injection by turn size. Major turns (real work), the session's first turn, and every fifth turn get the full 1,377-character block. Every other short-Q&A turn gets a 214-character reminder that opens with "the full norms injected earlier still apply" and lists six essentials. That's 860 tokens down to 134 on a minor turn — 84% less — while the every-fifth-turn refresh keeps the anchor from fading. Across a session where half the turns are short, total injection overhead drops about 34%.
Measure what you inject
If you make claims in tokens, you have to observe the tokens. v1.4 logs every injection — type and character count — to a file, and /fable-mode status reports the session's full-versus-reminder counts and their token cost. Every number in this post came from that log, not an estimate. The most common failure when you steer a model through prompts is not knowing how much you're feeding it; making it observable is how you avoid the tax quietly outgrowing the benefit.
grep instead of trust
fable-mode forces a self-check before a major turn ends: Claude Code's Stop hook returns decision:block, the model can't finish, and it takes one more pass to verify its claims. In v1.3 that check occasionally leaked into the user's output — a stray "self-verification passed" in the final answer. I had fixed it by asking the model not to mention the check. That holds most of the time. Most.
v1.4 stopped trusting it and greps the final message instead:
if printf '%s' "$LAST_TEXT" | grep -qiE 'self-check|self-verif|fable-mode|conduct block'; then
# detected → drop a .leakfix marker and force exactly one rewrite
...
fi
One rewrite, capped by a marker so there's no loop, with a carve-out: if the term is genuinely the task's subject — a session about the kit itself — resubmit as-is. A behavior you enforced with a prompt should not be verified only with a prompt.
The truth behind 0.70×
Building v1.4, I widened to four task types and re-measured. The aggregate held near the old number at 0.72× Fable, but the average was hiding the shape.
| task | bare Opus | + stack | Fable | stack/Fable |
|---|---|---|---|---|
| diagnosis | $0.23 | $0.28 | $0.49 | 0.57× |
| implementation | $0.34 | $0.45 | $0.49 | 0.91× |
| ambiguous cleanup | $0.86 | $1.13 | $1.52 | 0.74× |
| simple question | $0.12 | $0.13 | $0.27 | 0.49× |
On implementation the stack was only 9% cheaper than Fable, because it burns extra tokens on the self-check turns. On ambiguous cleanup it cost 31% more than bare Opus — the price of the correction turns that buy the conduct. fable-mode isn't free; you pay in turns, not quality. The aggregate still wins because Fable's unit price is 2× — it writes half the output tokens and loses anyway. And the deliverables matched: all three slugify implementations produced identical results on shared test cases.
The fourth hook also settled in v1.4 — a SubagentStart hook that injects the norms into subagents at spawn, closing the gap where fan-out workers ran bare. What stays open is the weights: 97% is a conduct score, and entangled reasoning or long autonomous runs still belong on Fable, or on Opus with fan-out plus adversarial verification.
A behavior you enforced with a prompt — don't trust with a prompt alone. Measure what you can measure, grep what you can grep.
