TL;DR: faf-cli v8 authors a new era: the Always33 engine. Same score, everywhere. faf-cli still fills 21 slots, and the 12 enterprise slots stay slotignored. Upgrading from v7? Run faf auto once. It marks the 12 enterprise slots slotignored, and your score is back.

In Plain English

Old state. Through v7.16, faf score counted 21 slots. The always-33 scorers counted 33. The same file could get two different numbers.

Fix. faf-cli now scores with the always-33 kernel. Slots that are not applicable to a project are marked slotignored, and do not score.

New state. One number. faf-cli gives your file the same score as every other FAF tool.

npm install -g faf-cli@8.0.1 faf auto

Homebrew: brew install wolfe-jam/faf/faf-cli. To try it without installing: npx faf-cli auto or pnpm dlx faf auto.

What happened since Discoverable

One blog, one arc. The last faf-cli write-up was v7.16 The Discoverable Edition. Short tour to today:

  • v7.16.2: faf compile emits FAFb wire v2, the same bytes as the faf-fafb golden. Not a blog.
  • v8.0.0: The Always33 Edition. This is the log entry for the stretch.
  • v8.0.1: pnpm installs work. faf-cli gets its scoring kernel from npm, not a folder inside the package.

This post opens the Always33 series, one release at a time. The overview is The Always33 Suite.

What v8 is

The Always33 engine. faf-cli scores every .faf with the vendored always-33 kernel (Rust, compiled to WASM), the same engine behind every FAF score. Through v7.16, faf score counted only slots 1 to 21. We checked it against the reference always-33 scorer on the project.faf of all 80 FAF repos: same score on every one.

Your 21 slots, and the 12 enterprise slots in view. faf-cli fills the 21 base slots. faf init, faf auto and faf git mark the 12 enterprise slots (infra, app, ops) slotignored unless your app type uses them, and faf score lists all 33.

Upgrading: run faf auto once

This is the breaking part. A .faf without the 12 enterprise markers now counts them as empty: 21 filled is 21 of 33, which is 64%. Run faf auto. It writes the markers and the score returns. We tested four v7 files:

56 → 100 · 56 → 100 · 58 → 100 · 52 → 100

Anything that gates on faf score, such as a CI threshold, should re-check its number after upgrading.

Also in v8

  • tbd and todo, in any case, are placeholders. They count as empty.
  • A command can carry its own note. In project.faf, build: bun run build — clean, bundle cli+index, then tsc becomes a command with a # comment in AGENTS.md. The note never ends up in a line someone would run.
  • init --force keeps the life it ends. A reset writes the old birth record into priorLineage, and faf dna prints each earlier life.
  • Older .faf-dna files that carry birthWeight now read as the birth score. The file is never rewritten.
  • faf demo writes its sample the faf-cli way, 21 slots plus the 12 enterprise markers, and scores ✪ 100%.

Try it

Install (npm or Homebrew):

npm install -g faf-cli@8.0.1 brew install wolfe-jam/faf/faf-cli

Then, in your project:

faf auto faf score

More depth: The Always33 Suite · CHANGELOG · repo.

Technical details

  • Version: 8.0.1 (September 30, 2026); 8.0.0 shipped September 26
  • Edition: The Always33 Edition
  • Scoring: always-33 kernel (Rust → WASM); faf-cli fills 21 slots, the 12 enterprise slots slotignored
  • Verified: same score as the reference scorer on 80 FAF repos
  • Tests: 2075
  • Packages: npm faf-cli · Homebrew wolfe-jam/faf/faf-cli