Skip to main content

faf-python-sdk

Persistent Project Context for Python. Parse, validate, score.

FAF defines. MD instructs. AI codes.

The foundation other Python FAF tools build on. If you're building MCP servers, CI validators, or any Python tool that needs to understand project context, start here.

FAF PyPI Downloads Tests IANA

Media Type: application/vnd.faf+yaml (IANA registered)

What's New in v1.4.0 — The Interop Edition

The interop functions get their real names: author_agents_md / author_gemini_md are public, render_* is the impl, generate_* is deprecated (removed in 2.0).

Output is byte-identical — a naming change, not a behaviour change. Existing from faf_sdk import generate_agents_md keeps working, now with a DeprecationWarning.

faf_sdk.interop — author_agents_md(faf) and author_gemini_md(faf), Python ports of faf-cli's src/interop/agents.ts + gemini.ts, in parity with the canonical TypeScript. Deterministic BETTER-shaped projection: setup (install→build→dev ordered) · tests · layout · conventions · three-tier guardrails · definition of done · security · commit · stack. Human Context (who/why marketing) is intentionally omitted from AGENTS.md — it belongs in the README / .faf DNA, not agent ops.

from faf_sdk import parse_file, author_agents_md

faf = parse_file("project.faf")
print(author_agents_md(faf.data.raw))   # takes the raw dict — carries top-level commands / key_files / security

Any Python FAF tool that authors an AI-context file wraps this now — never hand-roll one. gemini-faf-mcp 2.7.0's faf_agents / faf_gemini are the reference wrappers.

What's New in v1.2.0 — The Dart Edition

Adds detect_dart_project(): content-aware Dart/Flutter detection from a pubspec.yaml (Flutter app vs package · Dart MCP / backend / CLI / library), reproducing faf-cli's engine byte-for-byte — 20 shared fixtures, parity-tested.

from faf_sdk import detect_dart_project

d = detect_dart_project(".")
print(d.app_type, d.framework)   # e.g. "mobile" "Flutter"

What's New in v1.1.0

Mk4 Championship Scoring Engine — the same 33-slot scoring algorithm used by the Rust compiler and TypeScript CLI, now in Python. Same slots, same formula, same scores. Every FAF tool in every language now agrees on what 100% means.

  • score_faf() — Mk4 scoring with 21-slot Base or 33-slot Enterprise tiers
  • 100% parity with faf-wasm-sdk (Rust) and faf-cli (TypeScript)
  • 3 crash bugs fixed (malformed YAML, null project fields)
  • 175 tests including 88 WJTTC championship-grade tests (concurrency, adversarial input, security)

Why this matters: If you're building on FAF in Python — MCP servers, Gemini extensions, CI pipelines — your scores now match every other FAF tool exactly. No more "it scored 85% in the CLI but 60% in Python." One engine, one truth.

v1.1.2 is a patch release — package description aligned with the canonical "Persistent project context for Python" framing. CHANGELOG.md added. No code changes.

Installation

pip install faf-python-sdk

Quick Start

from faf_sdk import parse_file, score_faf

# Parse a .faf file
faf = parse_file("project.faf")
print(f"Project: {faf.project_name}")

# Score it with the Mk4 engine
with open("project.faf") as f:
    result = score_faf(f.read())

print(f"Score: {result.score}% {result.tier}")
print(f"Slots: {result.populated}/{result.total} populated")

FAF defines. MD instructs. AI codes.

Mk4 Scoring

The Mk4 engine scores .faf files by checking 21 universal slots (project metadata, human context, tech stack). Each slot is Populated, Empty, or Slotignored. The score is the percentage of active slots that are populated.

from faf_sdk import score_faf, LicenseTier

# Base scoring (21 slots)
result = score_faf(yaml_content)
print(result.score)      # 0-100
print(result.tier)       # Trophy/Gold/Silver/Bronze/Green/Yellow/Red
print(result.populated)  # slots with real data
print(result.active)     # total minus slotignored
print(result.slots)      # per-slot breakdown

# Enterprise scoring (33 slots — adds monorepo/infra)
result = score_faf(yaml_content, LicenseTier.ENTERPRISE)

Placeholder rejection: Values like "null", "unknown", "n/a", "Describe your project goal" are detected and scored as Empty — not Populated.

Slotignored: Set any slot to slotignored to exclude it from scoring. A backend-only project can mark frontend: slotignored and still reach 100%.

Parsing

from faf_sdk import parse, parse_file, stringify

# Parse from string or file
faf = parse(yaml_content)
faf = parse_file("project.faf")

# Typed access
print(faf.data.project.name)
print(faf.data.project.goal)
print(faf.data.stack.backend)
print(faf.data.human_context.who)

# Raw dict access
print(faf.raw["project"]["goal"])

# Convert back to YAML
yaml_str = stringify(faf)

Validation

from faf_sdk import validate

result = validate(faf)

if result.valid:
    print(f"Valid! Score: {result.score}%")
else:
    print("Errors:", result.errors)

print("Warnings:", result.warnings)

File Discovery

from faf_sdk import find_faf_file, find_project_root

# Find project.faf (walks up directory tree)
path = find_faf_file("/path/to/src")

# Find project root by markers (package.json, pyproject.toml, .git, etc.)
root = find_project_root()

API Reference

Function Returns Description
score_faf(yaml, tier?) Mk4Result Mk4 score (21 or 33 slots)
parse(content) FafFile Parse YAML string
parse_file(path) FafFile Parse from file path
validate(faf) ValidationResult Structure validation + warnings
stringify(data) str Convert back to YAML
find_faf_file(dir?) str | None Find project.faf in tree
find_project_root(dir?) str | None Find project root

FAF Ecosystem

Package Platform Registry
faf-python-sdk Python foundation PyPI
gemini-faf-mcp Google Gemini PyPI
claude-faf-mcp Anthropic npm + MCP #2759
grok-faf-mcp xAI npm
faf-cli CLI npm

If faf-python-sdk has been useful, consider starring the repo — it helps others find it.

Links

License

MIT

Metadata

Release files for faf-python-sdk 1.4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for faf-python-sdk 1.4.0
File Size Uploaded
faf_python_sdk-1.4.0.tar.gz 56.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for faf-python-sdk 1.4.0
File Interpreter ABI Platform
faf_python_sdk-1.4.0-py3-none-any.whl Python 3 none any Details

Total release size: 81.2 kB

Release files / faf_python_sdk-1.4.0.tar.gz

Download URL faf_python_sdk-1.4.0.tar.gz
Size 56.3 kB
Tags Source
SHA-256 checksum
How to use checksums
2b7967cc136364b51a1a141d0899730b768054996e6e1014f942720c1c9f2112
BLAKE2b-256 checksum
How to use checksums
4079002380645ff9f9665af0392ac0f62949134474e8e34b107f2737b46328ed
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 8, 2026.

Transparency log

Release files / faf_python_sdk-1.4.0-py3-none-any.whl

Download URL faf_python_sdk-1.4.0-py3-none-any.whl
Size 24.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1fdcbf86e7f97d2ec490e374cabed2879d2d7314426d771a3c1345cc81502ad6
BLAKE2b-256 checksum
How to use checksums
669883047e940b9845ad7431b23663ccffad64c9d873eca5345130e2114874a4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 8, 2026.

Transparency log

Release history Release notifications | RSS feed

2.0.0

2 release files

This release

1.4.0 This release

2 release files

1.3.1

2 release files

1.3.0

2 release files

1.2.0

2 release files

1.1.2

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.2

2 release files

1.0.1

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page