TL;DR: faf-python-sdk v2 returns the kernel's score in pure Python, and
mcpaas.live v1.8 scores every hosted route with the kernel. Python apps and the edge now
give your file the same number as faf-cli. Upgrading? Run faf auto once and
your score is back.
In Plain English
Old state. The Python SDK and the hosted server each had their own scorer. On 80 FAF repos, the hosted one matched always-33 on only 47.
Fix. Python matches the kernel file for file, and the edge runs the
kernel itself. Slots that are not applicable to a project are marked slotignored, and do not score.
New state. The same score in Python, on the hosted MCP routes, on README badges, and in every other FAF tool.
Python:
pip install faf-python-sdkThe edge: point an MCP client at a hosted route, with nothing to install:
https://mcpaas.live/claude/mcp/v1 https://mcpaas.live/grok/mcp/v1Or uv add faf-python-sdk. On claude.ai, add the Claude route as a custom
connector (Settings → Connectors, no sign-in), as in Part II.
Where this fits
This is Part V of the Always33 series. Part I was faf-cli v8, where the engine was authored. Then claude-faf-mcp v7, faf-mcp v4 and gemini-faf-mcp v3 and grok-faf-mcp v2. Part V takes the same number past JavaScript and off your machine. The overview is The Always33 Suite.
faf-python-sdk v2
The kernel's number, in pure Python. score_faf(yaml) returns
what faf-kernel returns, on every file. A parity test checks the score, tier, counts and
every slot state against the kernel's own answers: 845 of 845 files match,
from real project.faf files to deliberately awkward YAML.
from faf_sdk import score_faf result = score_faf(open("project.faf").read()) print(result.score, result.tier)- Always 33 slots. A file with the 21 base slots filled and no markers
scores 64%. The same file plus the 12
slotignoredmarkers scores 100%. - It never raises. Unreadable YAML scores 0 with every slot empty, for
any
strorbytesinput. - Breaking changes are listed. Slot names follow the kernel
(
stack.framework, notstack.frontend),tier=no longer changes the slot count,tbdandtodocount as empty, and rounding is half away from zero. The CHANGELOG has the full list.
mcpaas.live v1.8
The kernel, at the edge. The hosted MCP routes
(/claude/mcp, /grok/mcp, /faf/mcp) score with the
same kernel as faf-cli, claude-faf-mcp and faf-mcp. So do the README score badges, the
repo cards and the GitHub pages. Checked live after deploy: the same numbers on all three
routes.
Seven patches followed in two days. The ones you can see:
faf_validategives the same answer asfaf_score.- Trophy is ✪ on tool output, and the Trophy mark draws on badges and cards.
- Files from GitHub are read as UTF-8, so a ✪ or an em dash no longer breaks a score.
/healthand/infoname the engine that scores.- Souls are never scored. A soul is a personal record, not project context, so it gets no score, percentage or tier.
Upgrading: run faf auto once
A .faf without the 12 enterprise markers now counts them as empty in Python
and at the edge: 21 filled is 64%. Run faf auto (faf-cli) and the score
returns. If you gate on score_faf or a badge, re-check the threshold.
Try it
pip install faf-python-sdkOr at the edge: add https://mcpaas.live/claude/mcp/v1 to
claude.ai, or the Grok route to ~/.grok/config.toml, and ask for faf_score.
More depth: The Always33 Suite · faf-python-sdk CHANGELOG · mcpaas.live.
Technical details
- faf-python-sdk: 2.0.0 (September 28, 2026) · PyPI · pure Python · 845/845 kernel parity
- mcpaas.live: 1.8.0 to 1.8.7 (September 27 to 28, 2026) · Cloudflare edge · hosted MCP routes for Claude, Grok and IDEs · badges and repo cards
- Edition: The Always33 Edition
- Scoring: the always-33 engine; 21 slots filled, the 12 enterprise slots
slotignored
Feedback welcome
Questions, nits, suggestions: guide the next version. Tell us what you want to see.
