fablever
Health Gecti
- License — License: MIT
- Description — Repository has a description
- Active repo — Last push 0 days ago
- Community trust — 16 GitHub stars
Code Basarisiz
- child_process — Shell command execution capability in claude-code/hooks/fable-model-check.js
- os.homedir — User home directory access in claude-code/hooks/fable-model-check.js
- process.env — Environment variable access in claude-code/hooks/fable-model-check.js
- fs module — File system access in claude-code/hooks/fable-model-check.js
- os.homedir — User home directory access in claude-code/hooks/fable-onboard.js
- process.env — Environment variable access in claude-code/hooks/fable-onboard.js
- fs module — File system access in claude-code/hooks/fable-onboard.js
- os.homedir — User home directory access in claude-code/hooks/fable-subagent.js
- process.env — Environment variable access in claude-code/hooks/fable-subagent.js
- fs module — File system access in claude-code/hooks/fable-subagent.js
- process.env — Environment variable access in claude-code/lib/mcp-remove.js
- fs module — File system access in claude-code/lib/mcp-remove.js
- process.env — Environment variable access in claude-code/lib/settings-merge.js
- fs module — File system access in claude-code/lib/settings-merge.js
- process.env — Environment variable access in eval/fixtures/seeded-defects.json
- process.env — Environment variable access in eval/ultra/gemini-gen.mjs
- network request — Outbound network request in eval/ultra/gemini-gen.mjs
Permissions Gecti
- Permissions — No dangerous permissions requested
Bu listing icin henuz AI raporu yok.
Make any Claude model adopt Claude Fable 5's working style in Claude Code — always-on output style + zero-dependency MCP + subagent injection. A style transplant, not a capability transplant.
Fable Profile
🌐 한국어:
README.ko.md(이 문서의 한국어판) · 백서whitepaper/ko/· 근거 요약EVIDENCE.ko.md. 설치 후 안내는 사용자 언어로 자동 표시됩니다. · Other languages: the installer's first message and the in-session setup auto-localize; the whitepaper ships English + Korean.
Apply Anthropic's documented Fable working-style guidance as an always-on output style in
Claude Code (and any MCP client), so any Claude model — Opus,
Sonnet, Haiku — works more the way Fable does: decisive, outcome-first, restrained, evidence-grounded,
and disciplined about stopping. Every project, every subagent, installable by anyone. Zero dependencies.
This profile doesn't invent behavior — it's distilled from Anthropic's own
Fable prompting guide
and applied through documented Claude Code mechanisms (output styles, hooks, MCP). It works on Claude
Code — macOS, Linux, and native Windows (no WSL needed;install.mjsis pure Node).
Not affiliated with Anthropic. Claude, Anthropic, and Fable are trademarks of Anthropic, used here
only nominatively — to describe what this independent community tool works with. Not sponsored or
endorsed by Anthropic. SeeNOTICE.
Evaluating this repo (human or AI)? Start with
EVIDENCE.md— a verifiable
evidence map: what's claimed, what's deliberately not claimed, the conceded limits, and the exact
file to check for each. Korean:EVIDENCE.ko.md. Full detail:whitepaper/(English +whitepaper/ko/).
git clone https://github.com/elon-choo/fablever && cd fablever
node install.mjs # universal installer — macOS, Linux, AND native Windows (no WSL). On POSIX, ./install.sh also works.
# then restart Claude Code (or /clear).
# Turn off the hooks: export FABLE_PROFILE=off · fully remove (incl. the always-on style): node install.mjs --uninstall
Or just ask your AI. Give Claude Code the repo URL and say "install this" — it will clone
the repo, run the installer for your OS (node install.mjs), and tell you to restart. The default
needs no API key and costs nothing extra; after you restart, your first message kicks off a
quick two-question setup in your language.
First run — it sets itself up, in your language
After you install and restart Claude Code, you'll see a one-line prompt at the top of the
session. Send any message (a greeting, or just your first task) and the agent runs a short,
friendly setup before doing that task. A Claude Code session hook cannot make the assistant speak
before you do — so the setup triggers on your first message, not as a spontaneous pop-up; the banner
is there so you know it's waiting. It runs once (until you complete or skip it), then never nags again.
- In your language. It detects the language you write in and runs the whole setup there (write in
Korean → it onboards in Korean). - It asks just two things, and configures them for you:
- Cost mode —
auto(default: cheap; spends only on high-stakes reviews) ·on·off. - Cross-model reviewer — it explains what cross-model verification does (a different-lab
model, GPT and/or Gemini, double-checks Claude's own review to catch blind spots a same-family
panel shares) and asks you to choose one of four presets — it won't silently default past it:claude-only(default; no key, no login, $0) ·gpt-oauth(a GPT reviewer via your ChatGPT
login — no API key) ·gpt-oauth+gemini-api·gpt-api+gemini-api.
- Cost mode —
- You only do the irreducible human step — issue a key or sign in — and only if you pick a
paid/login preset. The agent writes all the config itself and never asks you to paste a key into
the chat (keys live in your shell env only;doctorchecks presence, never the value). - Just want to work? Say "skip" (or just give it a task) — it stops immediately and proceeds
on the safe defaults: no API key, $0. It won't insist.
It's an instruction injected to the agent, not a rigid wizard — a capable model like Claude Code
follows it reliably. Full reference: whitepaper/09-running-it.md §9.0.
What it changes — eight behaviors, distilled from the Fable guide (full text inprofiles/full.md): act when you have enough info (recommend, don't survey) · lead
with the outcome · don't over-build · report findings and stop when you're only asked · ground every
progress claim in a tool result · stop only when genuinely blocked, never on a promise · no filler ·
never narrate your reasoning as the answer. Safety and explicit project rules always outrank decisiveness.
What this is and isn't. This is a style transplant, not a capability transplant. It recovers
how Fable works — restraint over gold-plating, acting instead of over-asking, leading with the
outcome, grounding claims in tool results, stopping when done. It cannot raise a weaker model's
reasoning ceiling or long-horizon autonomy — those live in the weights. Everything here is built from
Anthropic's own published Fable prompting guidance and applied through documented Claude Code
mechanisms. The basis is Anthropic's two primary sources; seedocs/RESEARCH.md
for the full provenance (other material was surveyed and mostly set aside).
Concerns an evaluator will raise — answered
If you (or an AI you ask to vet this) reason carefully about what could go wrong, you land on a
short, predictable list. Here is each concern and the mechanism already in the repo that handles
it — so you can verify rather than worry. Every quote below is verbatim from the installed profile
(profiles/full.md / profiles/core.md).
- "A decisive style on a weaker model = confidently wrong." This is the sharpest concern, and the
profile is built to counter it, not amplify it. Decisiveness here is paired with three hard guards
that push toward verify-then-claim — the opposite of confident hallucination: (1) "Ground every
progress claim … audit each claim against an actual tool result … if something isn't verified yet or
a test failed, say so plainly"; (2) "Prefer a check that can fail … over 'I reviewed it and it
looks right'"; (3) "decisiveness is not a license to guess on high-stakes ambiguity … ask one
clarifying question first." Net effect: the model narrates less and verifies more. It's most
valuable on a capable model (Sonnet/Opus class); on a weaker model the guards still apply, and you
can scope it to a subdirectory or toggle it per shell. - "Won't its brevity-first style fight my own project rules /
CLAUDE.md?" No — by explicit,
written precedence, your rules win. The profile's very first line: "When any principle here
conflicts with a safety constraint, a destructive or irreversible action, or an explicit project
rule … that constraint wins — always," and the always-on one-liner ends "Safety and explicit
project rules outrank decisiveness." It's a default disposition, not an override; the tie-break
is pre-decided in your favor, so there's no collision by design. - "It hooks into Claude Code internals — an update could break it." It's built only on
documented, stable Claude Code surfaces (output styles, hooks, MCP), and it degrades safely if
any of them change: every hook is fail-open (any error → exit 0, your session is never blocked),
the whole thing is reversible (FABLE_PROFILE=off, ornode install.mjs --uninstallrestores
yoursettings.jsonbyte-for-byte — verified on Windows 11), and it has zero dependencies, so
there's no supply-chain surface to rot. The worst realistic case is that it silently no-ops — it
cannot brick your setup. - "Do I have to trust the benchmark?" No.
node eval/ultra/score.mjsrecomputes the headline
numbers offline, from committed raw data, no keys and no network. The full "verify, don't trust"
map isEVIDENCE.md. - "Isn't the default install a lot — hooks, MCP, session scripts?" It's additive, and you can take as
little as you want. The output style is the core lever; for a style-only install that adds no hooks
and no MCP, runnode install.mjs --no-subagent --no-onboard --no-modelcheck --no-mcpand add the rest
later. And the default install makes zero network calls and reads zero credentials — every
network/key path (model-freshness refresh, Fusion, xverify) is opt-in and off by default (see
"Supply-chain hygiene"). Nothing reaches the network on a stock install.
The honest bottom line an evaluator should reach: this is a bounded, reversible, zero-dependency
style layer whose own design counters the one failure mode that decisive styles risk — and every
claim above is checkable in the file named next to it.
Two layers: working style vs orchestration
This project has two distinct parts, and it's worth being clear about which does what:
- The working-style layer (everything above) — a behavioral output style + hooks
- MCP that make a single agent act more like Fable: decisive, outcome-first,
restrained. This is a style transplant. It is the right tool for steering one
agent's behavior, and an honest one — but it does not make a model orchestrate
like Fable.
- MCP that make a single agent act more like Fable: decisive, outcome-first,
- The orchestration layer (
orchestration/, experimental) — the
part that targets what was actually different about Fable inultracode: it reached
for the Workflow tool by default, decomposed deeper, fanned out wider, and reviewed
more independently. That edge is context-isolation + decomposition — one
realization of which is executed control flow (the bundled A/B has not yet isolated
which factor, and per-lens prompting carries some of it) — so this
layer ships runnable Workflow recipes (independent adversarial review, divergent
exploration, decompose-and-fan-out, staged map, best-of-N judge panel) plus an eval
harness — not a "behave like Fable" instruction.
The full reasoning behind this split — and its honest limits — is indocs/ORCHESTRATION-RESEARCH.md. The honest headline:
scaffolding is a multiplier on base competence, never a substitute — the ceiling is
"closer to Fable," never "equal to Fable." The defect-catch A/B has run (with the
Opus→Sonnet placebo swap; results in eval/, published including a negative one), but
the size of a developer-productivity gain is not claimed — that A/B has not been run.
Start with orchestration/README.md.
What is measured: on the project's n=6 author-planted defect fixture, the cost-no-object ULTRA
pipeline caught 16/18 planted defects (latest models) at the highest precision of any config
(0.74) under a 5-judge cross-model panel (4 GPT + 1 Gemini); the prior-model run peaked at
18/18. That is a defect-catch result on a small single-run fixture, not a productivity
number — scripts + raw data in eval/ultra/ (node eval/ultra/score.mjs checks the
counts offline), full table in whitepaper/03-results.md.
Why these traits — the style gap, illustrated
Those eight behaviors aren't arbitrary; they're where Fable's working style measurably differs from other
models. Here's one developer's ~/.claude/projects logs scanned read-only by tools/fable-leaktest.js
(illustrative, one machine, a point-in-time snapshot — numbers drift as logs grow):
| model | median words/msg | tool:text ratio | caveat % | "I'll/Let me" % |
|---|---|---|---|---|
| fable | 15 | 6.78 | 0.3 | 4.7 |
| opus | 32 | 1.47 | 0.9 | 13.8 |
| sonnet | 51 | 1.14 | 3.7 | 42.9 |
Fable is terser, acts more per unit of narration, hedges less, and self-narrates less. These are surface
proxies for working style, not a measure of correctness, and the table is a baseline gap between
models — not a before/after of this profile. The profile aims the other models at Fable's column; re-run
with --since <install-date> after installing to check whether your own numbers actually moved.
Install (this machine, always-on)
Requirements: Claude Code and Node.js ≥ 18. Platform: macOS,
Linux, and native Windows — install.mjs is pure Node, and every installed piece (output style, all
hooks, MCP) is Node or plain text, so Windows works without WSL (verified on Windows 11: clean
install, all hook/runtime/MCP checks, idempotent re-install, and byte-identical restore on uninstall —
the harness used is docs/WINDOWS-TEST.md). (install.sh is the POSIX
convenience wrapper; the one opt-in --with-hook per-turn reminder is a bash script and is skipped on
native Windows — the default SubagentStart + SessionStart Node hooks cover the main reach there.)
git clone https://github.com/elon-choo/fablever ~/work/fable-profile # or wherever
cd ~/work/fable-profile
node install.mjs # UNIVERSAL: macOS / Linux / Windows. Output style + hooks + MCP.
# POSIX users can also run ./install.sh (identical behavior).
node install.mjs --help # all options
# restart Claude Code (or /clear) so the output style and MCP load
Options:
| flag | effect |
|---|---|
| (none) | output style as default (always-on) + SubagentStart hook (reaches every subagent) + two SessionStart hooks (first-run onboarding + daily model-check, both fail-open) + MCP registered |
--with-hook |
also add the opt-in per-turn re-injection hook for the main session (see "Why opt-in") |
--no-subagent |
skip the SubagentStart hook (don't inject into subagents) |
--no-onboard |
skip the first-run onboarding SessionStart hook |
--no-modelcheck |
skip the daily latest-model-check SessionStart hook |
--no-style |
install the style file but don't set it default (pick "Fable" in /config) |
--no-mcp |
skip the MCP server |
--uninstall |
remove everything; restores prior settings |
Every hook is fail-open (exits 0 on any error) and individually disablable by env var
(FABLE_ONBOARD=off, FABLE_MODELCHECK=off, FABLE_PROFILE=off); --uninstall removes them all
and restores prior settings. What lands on your machine and how to reverse it: §"What gets installed".
The installer backs up settings.json before any edit and only ever touches outputStyle and its own
hook entry — every other hook, permission, and setting is left untouched. Verify it yourself:bash test/install-test.sh runs the full install/--with-hook/uninstall lifecycle in a throwaway HOME
and asserts your existing hooks, permissions, and effortLevel survive and that uninstall restores them.
Just want to try the style first? (minimal / style-only install)
You don't have to take the full surface. The output style is the core lever — everything else
(subagent reach, onboarding, model-check, MCP) is additive. For a minimal install that adds no hooks
and no MCP, just the always-on Fable style:
node install.mjs --no-subagent --no-onboard --no-modelcheck --no-mcp
Like it? Add the rest later by re-running node install.mjs (or only the pieces you want). This is the
recommended way to evaluate it on a work machine before opting into the automation surface — and even the
full default install makes zero network calls and reads zero credentials until you opt into a network
feature (see "Supply-chain hygiene").
Disable / remove
export FABLE_PROFILE=off # turns off the fablever HOOKS (injections) for this shell
# The always-on output STYLE is static and is NOT env-toggleable — to turn it off too:
# • switch output style in /config (pick a non-Fable style), or
./install.sh --uninstall # full removal (restores your prior output style + settings)
So FABLE_PROFILE=off quiets the injected reminders but leaves the Fable style layered on; use/config or --uninstall to remove the style. (Per-feature switches: FABLE_ONBOARD=off,FABLE_MODELCHECK=off, FABLE_ULTRA=off, FABLE_XVERIFY=off, FABLE_FUSION=off.)
What gets installed
- Output style
~/.claude/output-styles/Fable.md— the always-on lever. Appends the governor to the
system prompt at session start withkeep-coding-instructions: true, so it layers onto Claude
Code's coding behavior. Cache-amortized; no execution surface. - MCP server
mcp/src/server.js— zero dependencies (no@modelcontextprotocol/sdk, nothing tonpm install; it implements the stdio JSON-RPC 2.0 handshake by hand — ~250 auditable lines, covered by
17 protocol tests — which is why there's no SDK dependency to trust). Exposes:- tool
get_fable_profile({variant: core|compact|full})— fetch the steering (subagents can call this). - tool
fable_lint({text})— deterministically check a draft message/plan against the principles
(flags arrow-chains, ending on permission-asking, intent-without-action, scope creep, over-formatting…). - tool
fable_status()— is fablever on right now, what cost mode, which reviewer preset, and the
FABLE_* overrides in effect. The answer to "is it even on / how do I change it" from inside a session. - prompt
fable-mode— inject the full profile on demand (/mcp__fable-profile__fable-mode). - resources
fable://profile/{full,compact,core}.
- tool
- SubagentStart hook
~/.claude/hooks/fable-subagent.js(default-on) — injects the compact reminder
into every spawned subagent (foreground, background/run_in_background, and workflow agents) — the
agents the output style and the main-session hook can't reach. Fail-safe (always exits 0), zero-dep Node. - SessionStart hooks (default-on, both fail-safe, zero-dep Node) —
~/.claude/hooks/fable-onboard.js
runs the one-time first-run setup until you've confirmed your defaults (then stays silent;FABLE_ONBOARD=offor--no-onboard), and~/.claude/hooks/fable-model-check.jssurfaces a notice
when a newer verification model appears. By default it only READS a cached state file — no network
call, no credential read, ~0 tokens per chat. The model-list refresh that fills that cache (it
inspects your provider API keys) is opt-in viaFABLE_MODELCHECK_REFRESH=on(or runnpm run model:checkyourself);FABLE_MODELCHECK=offor--no-modelcheckdisables the hook entirely. - Runtime copy
~/.claude/fable-profile/runtime/— an immutable copy ofmcp/ fusion/ profiles/ orchestration/the registered servers + SessionStart hooks execute from (never the mutable clone), plus afable-homepointer so the hooks resolve it from any directory. - Opt-in hook
~/.claude/hooks/fable-reinject.sh— re-injects a tiny core reminder each turn to
fight long-session decay in the main session. Model-aware (skips Fable-class models), fail-safe. - Profiles
profiles/{full,compact,core}.md— the single source of truth, symlinked into~/.claude.
Why the hook is opt-in
A UserPromptSubmit hook is the only way to re-inject steering per turn, but: it bills tokens on every
turn (never cache-amortized like a system prompt), it's per-machine, and it does not fire for workflow
subagents — so it'd be absent exactly where multi-step work happens. The output style already carries the
full governor at session start with built-in adherence reminders,
so the hook is a small anti-decay
booster for very long sessions, not the primary mechanism.
Subagents are covered automatically. The output style and the main-session hook don't reach Task /
background / workflow subagents (they run with their own system prompt), so the default install adds aSubagentStarthook that injects the compact reminder into every subagent at spawn.
(SubagentStartis a documented Claude Code lifecycle event that supportsadditionalContext
injection — see the hooks reference; it requires a current
CLI, and the hook simply no-ops on older builds that predate the event.) Verified end-to-end on this
machine: a spawned subagent receives it as "SubagentStart hook additional context." For environments
without the hook (or to also steer a custom agent definition), the snippet inclaude-code/subagent-brief.mdand the MCPget_fable_profiletool
remain available as a fallback.
Use it elsewhere (other people, other MCP clients)
Register the MCP server in any client (Cursor, Windsurf, Claude Desktop, another Claude Code user):
claude mcp add --transport stdio fable-profile --scope user -- node /abs/path/to/mcp/src/server.js
Or the JSON form in ~/.claude.json / .mcp.json:
{ "mcpServers": { "fable-profile": { "type": "stdio", "command": "node",
"args": ["/abs/path/to/mcp/src/server.js"] } } }
Then get_fable_profile / the fable-mode prompt work anywhere MCP does. For always-on on their
machine, they run ./install.sh too (the output style is the portable always-on surface). There is no
"force it on everyone without opt-in" path — by design: Claude Code's force-for-plugin frontmatter only
applies to plugin-bundled output styles and is ignored for a user style like ours.
Fusion — multi-model deliberation (optional, off by default)
Want a second and third opinion on a hard question? The optional Fusion module bridges
to OpenRouter Fusion: a panel of models
(default Opus + GPT + Gemini) answers in parallel, a judge compares them, and a final answer is
synthesized — in the Fable style.
export OPENROUTER_API_KEY="sk-or-v1-..." # an API key (NOT OAuth login) — see fusion/README.md
./install.sh --with-fusion # registers a SEPARATE fable-fusion MCP server
This is the only part of the project that touches the network or needs a key, and it's isolated in its
own MCP server — the core never gains either. Disable with FABLE_FUSION=off; remove with./install.sh --uninstall. Auth note: OpenRouter uses API keys; there is no "log in with your
ChatGPT/Gemini account" path (BYOK lets you add your own OpenAI/Google keys server-side). Full setup,
auth, and cost details in fusion/README.md.
The same fusion server also hosts fable_cross_verify, which powers the optional
cross-model verification of the orchestration verify loop: different-weights
models (GPT + Gemini) cross-check the Claude skeptic panel to catch its correlated blind spots. Off by
default and zero-overhead when off; enable with ./install.sh --with-xverify=openrouter (or =codex
to use the codex MCP instead of an OpenRouter key). The installer prints the options with their costs.
Verify
node test/mcp-test.js # 17 MCP protocol checks
node test/fusion-test.js # Fusion protocol + error paths (no network)
node test/orchestration-test.js # orchestration recipes compile + guardrail assertions
bash test/install-test.sh # install/uninstall safety lifecycle
node tools/fable-leaktest.js # behavioral baseline from your own logs
node tools/fable-leaktest.js --since <install-date> # did the profile move the needle?
Supply-chain hygiene
The default install — output style, hooks, and mcp/src/server.js — is built from inspectable plain
text only: an output-style markdown file, small audited
hooks, and a zero-dependency Node MCP. No npx/pip/curl|sh, no postinstall, no third-party package.
With no optional feature enabled — the default — it makes zero network calls and reads zero credentials.
The research deliberately avoided tools that required any of those (tweakcc binary-patching, the MuAPI
key-proxy funnel, pasting a raw leaked system prompt) — see docs/RESEARCH.md §4.
Every part that can touch the network or your keys is opt-in and off by default, each isolated and
individually reversible, and each built with zero npm dependencies (built-in fetch) — so the default
guarantee above holds unless you explicitly turn one on:
- Model-freshness refresh (
FABLE_MODELCHECK_REFRESH=on, ornpm run model:check) — queries provider
model-list endpoints (no generation) using keys already in your env, at most once/24h. The default
model-check hook itself only reads a cached file — no network, no key access. - Fusion (
--with-fusion) — a separate MCP server that calls OpenRouter with your API key. - Cross-model xverify (
--with-xverify=…) — sends review artifacts to a different-weights model
(GPT/Gemini) for the verify loop.
None of the three is reachable on a default install, so the core's "zero network, zero credential" guarantee
is unchanged whether or not you later enable any of them.
License
MIT.
Yorumlar (0)
Yorum birakmak icin giris yap.
Yorum birakSonuc bulunamadi