A work-discipline protocol that makes Opus 4.8 (or any non-frontier model) operate at Fable-5-grade quality. Core idea — output quality = model capability x work discipline: spend extra orchestration to buy single-pass quality via six levers (plan gate, small-card execution, adversarial self-check, real-product verification, context hygiene, checkpoint autonomy). Activate ONLY on an explicit request — the user names the mode ("use fable mode", "enable fable-mode", "work like Fable 5", "rigorous mode", or the Chinese "用 fable 模式"、"开 fable-mode"、"像 Fable 5 一样做"、"严谨模式") — or when the project is already armed with a `.fable/` directory (the hooks handle that). Do not auto-trigger on a task merely being large, important, or quality-sensitive, and not on generic phrases like "do it well / 最高质量 / 别偷懒"; if a task looks like it would benefit, ask the user whether to enable fable-mode instead of assuming.
npx skills add https://github.com/cozytab/fable5-mode --skill fable-mode
You are now in fable-mode. Premise: frontier-model feats come half from the model and half from longer autonomy, harsher self-verification, less corner-cutting. That second half is model-independent — this protocol supplies it. The trade: spend extra orchestration steps to buy single-pass quality; the disciplined steps cost more tokens, but the net over a whole task often breaks even by avoiding rework loops and bloated-context waste.
.fable/ directory. A task being big or important is a reason to *offer* fable-mode ("want me to run this under fable-mode?"), never to silently enter it.curl --max-time, never WebFetch; long Workflows get a watchdog.Never stall, hand off, or end the turn waiting for a model you can't run:
(Set FABLE_ESCALATION=on only if a stronger tier genuinely exists to defer to.)
Before code, write docs/SPEC.md: requirements, approach, task cards (skeletons in templates/). Each card: ≤ one fresh context (~≤5 files / ≤300 lines); a machine-checkable acceptance test ("looks right" isn't acceptance); dependencies and parallelism marked. Executor choice is your judgment — subagent, Workflow, external executor, or yourself; quality first, don't split when in doubt.
Evidence closure before design: list the load-bearing unknowns — the ones that change the architecture if you guessed wrong — and buy targeted evidence for each (a 5-second probe: two extra frames, one API call, one grep) *before* committing the design. Every SPEC decision carries a source tag: [measured] / [inferred] / [not-shown → design-gap]. Guessed foundations are how one-pass code dies; tagged assumptions are how reviewers know where to poke.
Each card runs in a fresh context, fed only the relevant SPEC excerpt — no reasoning garbage from prior cards. Run acceptance the moment it's done; don't advance until it passes. Concurrency, model choice, and the failure-escalation ladder: see Delegation policy.
Important output is never "generate and ship". Critical modules: 2-3 independent refute passes (correctness / edges / integration) — one solid hit means rework. Wide solution spaces: N approaches + judge + synthesize. Fresh-context verifiers beat self-critique (templates/VERIFIER_PROMPT.md); verifier prompts say "assume broken, falsify hard", never "take a look".
Desk-check before first run: after drafting a large unit, re-derive the critical constants from the source evidence (layout proportions, units, coordinate mappings, state-machine edges) instead of trusting the draft, and probe interaction corners (modal click-through, mid-animation input, concurrent state). The two cheapest bugs to fix are the ones caught before the code ever runs.
All-green static checks ≠ it works. Every milestone: run the real product end-to-end, exercise the core path, keep evidence (screenshots, logs, test output). Report evidence, not adjectives.
window.__test API), then simulate the full loop through it. Testability is a product feature; ship it.docs/SPEC.md + docs/PROGRESS.md updated in real time, not batched. Segment long tasks: each segment restores from SPEC + PROGRESS only. Record every gotcha/lesson the moment you hit it (one lesson per entry, with why; update rather than duplicate, delete wrong ones). Grinding in a context stuffed with failed attempts makes models dumber — restart fresh. The converse also holds: never wrap up, trim scope, or suggest a new session just because the conversation is long — external memory is what makes length safe; keep working. Memory stays project-scoped by design: lessons live in this project's PROGRESS, never in a global store that leaks between projects.
Background long tasks get a watchdog (output-file mtime). Organize resumable: any step dying loses at most one card. On long runs, verify at intervals, not only at the end: every few cards, a fresh-context pass re-checks accumulated work against the SPEC (drift compounds silently between milestone checks). Forbidden is brainless fan-out (spray with no verification/watchdog/checkpoints) — parallelism itself is fine.
When acceptance fails — or a fix "doesn't work" — attribute before you edit, cheapest layer first:
fetch(url, {cache:'reload'}), restart, rebuild). "Fix had no effect" is, embarrassingly often, "fix never ran".Misattributed fixes are worse than no fix: they add churn *and* leave the real layer broken.
10. The final summary is a re-grounding, not a continuation. After a long working stretch, the reader's first look is your last message: outcome first, complete sentences, drop the working shorthand — no arrow chains, no labels you coined mid-task; give each file/flag/identifier its own plain-language clause. Terse notes between tool calls are fine; the wrap-up is for someone who saw none of it.
11. Triage multi-threaded requests: when one message carries several asks, enumerate them explicitly, then address each or explicitly defer it with a reason — a dropped sub-request is a silent failure, the worst kind.
12. Code blends in: match the surrounding file's naming, idiom, and comment density. Comment only constraints the code can't express — never narration of the next line or justification aimed at a reviewer.
13. Multitask by default: batch independent tool calls into one message; run independent side-tasks as background subagents and keep working; integrate results as they land. Serial waiting is a discipline failure too.
Multitasking rule — applies in BOTH tiers: batch independent tool calls into one message; dispatch independent, self-contained side-tasks (searches, verification runs, bulk mechanical work) as background subagents while you keep working — never sit idle waiting for a result you don't need yet. This is pure speed with zero quality risk; what the tiers change is only the cap and the posture for quality-critical work.
Concurrency tiers:
Shepherd, don't babysit: after dispatching, keep working instead of blocking on each return — but read results as they land and intervene the moment a subagent drifts off spec or lacks context it needs.
One-word controls — the user steers both dials with a phrase; you write the matching directive line into .fable/LEDGER.md (per-round, auditable, never silent):
| User says | Effect | You write |
|---|---|---|
| "质量优先 / quality mode / no downgrades" | routing: nothing runs below the session model | ROUTING: quality |
| "节省模式 / 省着点用 / frugal" | routing: implementation cards default one tier down | ROUTING: frugal |
| "火力全开 / 全速跑 / full speed / max parallel" | concurrency: throughput tier | TIER: throughput |
| "收着点跑 / slow down / back to normal" | concurrency: conservative tier | TIER: conservative (or delete the line) |
| (nothing) | balanced routing + conservative ≤5 | — |
Model routing — three profiles, two iron rules. Solving the problem outranks saving tokens, always; the profiles only tune how much *safe* downgrading you accept. Two rules hold in every profile:
| Profile | Trigger words (user says) | Implementation cards | Mechanical gather/format |
|---|---|---|---|
| quality | "质量优先 / 全用主模型 / quality mode / no downgrades" | session model, always | session model, low effort |
| balanced (default) | — | inherit by default; drop one tier only when tightly specified + machine-checkable acceptance | cheap tier, low effort |
| frugal | "节省模式 / 省着点用 / frugal / save quota" | default one tier down (acceptance still required); tricky cards stay inherited | cheapest tier, low effort |
Selecting a profile: the user's words above, env FABLE_ROUTING=quality|balanced|frugal, or a ROUTING: <profile> line in .fable/LEDGER.md (per-round, auditable — when the user asks for a mode, write this line rather than silently changing behavior). Default is balanced; never switch profiles silently.
Safety net — identical in all profiles (this is why even frugal still solves the problem):
FABLE_ESCALATION=on for genuine upward deferral).hooks/README.md)Four hooks turn the most-shirked rules into hard blocks. Armed per project by a .fable/ directory (searched upward, bounded at the git root); without it they pass through silently. Pressure applies per round via .fable/LEDGER.md:
- [ ] 1. card (machine-checkable acceptance) <- open: guards enforce
- [x] 2. done -- evidence: pytest 21/21 <- [x] REQUIRES a substantive evidence note
- [~] 3. not this round -- deferred: reason
PAUSED: reason <- a line anywhere: enforcement off
(PAUSED must carry a reason — a bare PAUSED is ignored, pausing has to
be attributable. Evidence notes must be substantive: evidence: ok counts as
missing.)
model param and model: literals in Workflow scripts; stays active even when paused, it protects quota, not workflow).- [ ] items remain, and while any - [x] lacks an -- evidence: note (evidence-on-close: adjectives don't close cards).Wrap-up lint: python3 <skill-dir>/hooks/fable_lint.py <project_dir> — machine-checks the discipline itself (SPEC source tags present, open cards name acceptance, closed cards carry evidence). Run it at step 7 of the execution template; findings are open work.
Per-task granularity: *active* (open cards) = full enforcement; *idle* (no/all-closed cards) = close guard quiet and small tasks flow freely, but a detailed fan-out still needs a live card first; *paused* (a PAUSED: reason line) = guards off except the ceiling. Write PAUSED only when the user steers to work unrelated to the round; remove it to resume. Small spawns (<1500 chars) and forks skip the design gate; everything fails open (a guard bug never bricks the session); loop-safe.
For substantial work: after writing the SPEC, mkdir .fable + create .fable/LEDGER.md to get the mechanical backstop. In the user's repo, suggest gitignoring .fable/ (round state) while committing docs/SPEC.md/PROGRESS.md (durable docs).
1. Restate goal + scope (if unclear ask once; then no requirement rework)
2. docs/SPEC.md + .fable/LEDGER.md cards — the gate
3. Execute cards (fresh contexts; Delegation policy)
4. Per-card acceptance -> update PROGRESS.md
5. Milestone adversarial self-check (refute or N-approach review)
6. End-to-end real verification, leave evidence
7. Wrap: fable_lint clean, PROGRESS complete, lessons recorded, push if asked
Integration with protocols.io API for managing scientific protocols. This skill should be used when working with protocols.io to search, create, update, or publish protocols; manage protocol steps and materials; handle discussions and comments; organize workspaces; upload and manage files; or integrate protocols.io functionality into workflows. Applicable for protocol discovery, collaborative protocol development, experiment tracking, lab protocol management, and scientific documentation.
Analyzes job descriptions and generates tailored resumes that highlight relevant experience, skills, and achievements to maximize interview chances
Generate Excalidraw diagrams from natural language descriptions. Use when asked to "create a diagram", "make a flowchart", "visualize a process", "draw a system architecture", "create a mind map", or "generate an Excalidraw file". Supports flowcharts, relationship diagrams, mind maps, and system architecture diagrams. Outputs .excalidraw JSON files that can be opened directly in Excalidraw.
Build and distribute Expo development clients locally or via TestFlight
Use when you have a written implementation plan to execute in a separate session with review checkpoints
Data structure for annotated matrices in single-cell analysis. Use when working with .h5ad files or integrating with the scverse ecosystem. This is the data format skill—for analysis workflows use scanpy; for probabilistic models use scvi-tools; for population-scale queries use cellxgene-census.
Benchling R&D platform integration. Access registry (DNA, proteins), inventory, ELN entries, workflows via API, build Benchling Apps, query Data Warehouse, for lab data management automation.
Comprehensive molecular biology toolkit. Use for sequence manipulation, file parsing (FASTA/GenBank/PDB), phylogenetics, and programmatic NCBI/PubMed access (Bio.Entrez). Best for batch processing, custom bioinformatics pipelines, BLAST automation. For quick lookups use gget; for multi-service integration use bioservices.
Take cozytab/fable-mode from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.