static analysis · zero network
95.3% of this context file reloads on every single turn.
Static analysis for CLAUDE.md, AGENTS.md and tool definitions. Every enforced rule ships with the eval that measured its effect on behavior.
✓ runs in a Web Worker✓ nothing uploaded✓ MIT
A real profile, not a mockup
6,197 ref tokens across 3 file(s), o200k_base
2 file(s) · loads into context on every single turn
1 file(s) · loads only when a path-scoped rule matches
past a documented read limit · silently cut every session, never loads
Most teams have never separated these three piles. Computed from the committed case-study fixture, the same way the full case study is.
the three piles
Resident vs. on-demand vs. dropped
Your CLAUDE.md loads on every turn. A skill body loads only when it routes. A .claude/rules/*.md file with paths: loads only for matching files. Content past MEMORY.md’s documented read limit does not load at all.
what is allowed to fail a build
Two tiers gate a build. Everything else is labelled.
enforced · fails CI
Either a structural fact — a broken import, or content past a documented read limit, both deterministic and needing no eval — or a measured behavioral claim backed by a committed, reproducible eval.
The honest count, today
17 rules in the v1 catalog: 6 structural facts enforced today, 8 heuristics labelled unmeasured in every line of output and excluded from the chaff score, and 3 planned measured-rule candidates — specified in full (three-arm design, ≥12-item battery, seeded bootstrap admission test) but not yet run, because running them costs real API spend and needs explicit approval.
0 of 17 rules are measured so far. We would rather say that than pad the enforced tier. The rule catalog keeps a graveyard for rules that do not survive their eval.
the real thing, recorded
Not a screencast.
A scripted run against the live site: paste a file with a broken @-import into /analyze, press Analyze, watch the finding appear.
The corner badge is injected only for the recording and counts real network requests live. After the first analysis loads this site’s own worker code (same-origin GET, expected), the upload/cross-origin count stays at zero for the rest of the run — which is the actual privacy claim (worker source). Recorded with scripts/record-demo.mjs.

Your system requests reduced motion, so autoplay is off. Watch the recording (webm, plays on click, still muted and silent).
chaff, on chaff
It holds itself to the bar it enforces.
The root chaff.config.json declares this repo’s own working agreements (CLAUDE.md) as the set to analyze, and evals/dogfood.eval.test.ts asserts --fail-on enforced exits 0 on every CI run.
chaff analyze --today 2026-08-08
resident
666
this file, o200k_base ref tok
findings
0
enforced or heuristic
chaff %
0.0%
clean
pre-release
Install
git clone https://github.com/jamessuuu/chaff
pnpm install && pnpm --filter chaff build
node packages/chaff/dist/cli/main.js analyze CLAUDE.md
# npx chaff@latest analyze (once the package publishes at M7)status
The CLI is not on npm yet — the workspace-local build above is the real path today. See the README for current status, or the docs for a five-minute quickstart.