TL;DR: Your AI is either grounded in your project or it's guessing at it. v6.9.0 makes grounding measurable (faf bench), askable (the 6Ws Interview, one registry for every surface), and maintainable (faf refresh). And the benchmark grades itself — the .faf is the answer key.

Trouble Ahead, Expensive Trouble

Run faf bench on a repo with no context and here's what you learn: the AI is hemorrhaging tokens re-deriving your stack every session — and the half it can't dig out at any price is your intent. Exploration eventually finds your framework. It never finds your why.

           without context    with .faf
answers    9/15               15/15
tokens     ~33,492            ~29,426

✪ BENCH RECEIPT
  qset: 15e8cf16c307 · cold 9/15 · faf 15/15

Those are real receipts. We benched our own fleet on day one — cold runs vs with-faf runs, fresh AI sessions both sides:

  • claude-faf-mcp: 8/15 cold → 15/15 with .faf — 3 file reads down to 1, 41s down to 7s
  • grok-faf-mcp: 9/15 → 15/15
  • faf-mcp: 8/15 → 15/15

Honest footnote: our cold scores are flattering — these repos have unusually thorough READMEs. A typical repo cold-scores far lower. And the misses cluster exactly where the theory says: the six Ws. The stack is diggable. The intent is not.

The Answer Key Is Your Own Repo

Benchmarks usually need a judge. This one doesn't: the questions derive from your project.faf's populated slots, so grading is mechanical — normalize, compare, versioned aliases, no rubric drift. The receipt is a sha256 over the run that any third party can re-derive. FAF don't lie — and neither can the benchmark.

faf bench              # the protocol
faf bench questions    # hand them to any AI
faf bench grade cold.json --cold --tokens 33492
faf bench grade faf.json --faf  → the pair + ✪ receipt

A low cold score isn't a verdict on your AI — it's the diagnosis that your project is under-contextualized. The missing answers are already in your repo. Unstructured. faf init structures them; re-bench and watch the pair.

One Interview, Every Surface

The 6Ws Interview — the 8 questions that capture what machines can't derive (name, goal, and the six Ws) — now ships on faf-cli's public API: SIX_WS_INTERVIEW, questionForSlot, interviewForMissing. The CLI, the MCP servers, any UI: one registry, identical questions. Question drift between surfaces is now structurally impossible.

drift → refresh → re-grounded

faf refresh is the maintenance half: re-score the live .faf, measure drift against your project's DNA baseline, keep an existing .fafb fast tier compiled current, record the journey.

refresh — re-grounding on the live .faf

  drift: 43% ↑ 55% (+12)
  .fafb re-compiled (fast tier current)
  re-grounded: ● 55%

Fixed: Your Files Are Enhanced, Never Replaced

Straight talk: faf sync and the interop exports used to overwrite AGENTS.md, CLAUDE.md, GEMINI.md, and .cursorrules wholesale. That was a bug, and it's fixed — a non-destructive injector owns a marked block at the top of the file and preserves everything you've written below. A build-failing write-guard makes the old behavior impossible to reintroduce.

Try It

Or bunx faf, or brew install faf-cli — all three serve 6.9.0. Run the bench on your own repo. Your numbers, your receipt.

The Numbers

  • v6.9.0 — Released June 12, 2026
  • 820 tests, 0 fail — 2,652 assertions
  • 🏆 100% — Trophy score
  • 3 grounding primitives — bench · interview · refresh
  • npm + Homebrewfaf-cli and faf, both 6.9.0