The .sfab directory
How tasks and documents sync into your repo, and why you never edit them by hand.
Every repo the factory manages gets a .sfab/ directory: a read-only mirror
of the platform's tasks and documents, committed like any other code so agents
working in a sandbox (and humans browsing GitHub) can read project state
straight from the filesystem.
.sfab/
.docs/
README.md
architecture/
decisions/
...
.tasks/
INDEX.md # auto-regenerated, grouped by status
ALW-42.md # one file per task, status in frontmatter
ALW-43.mdThe dot-prefix rule
Directories inside .sfab/ that start with a dot are platform-owned: the
platform database is the source of truth, and the sync overwrites local edits.
Don't edit .sfab/.tasks/* or .sfab/.docs/* by hand or in a PR; your
change will be silently clobbered on the next sync. To read or write tasks and
documents, go through the platform UI or the
MCP tools (tasks_*,
documents_*); the repo mirror catches up on its own moments later.
Tasks: flat files plus an index
Tasks sync to .sfab/.tasks/<id>.md with the status in YAML frontmatter, not
in the path, so a status change is a one-line edit, paths stay stable for
anything linking to them, and git history stays clean. The at-a-glance view
lives in INDEX.md, regenerated on every sync and grouped by status: one
cat .sfab/.tasks/INDEX.md shows the state of the whole repo.
Documents: free-form
.sfab/.docs/ has no enforced structure. Authors (human or agent) decide
where each document lives, and whatever organization emerges, emerges.
Architecture notes, decision records, plans: it's all markdown, versioned with
the code it describes.
Repo-scoped, project-grouped
Tasks and documents belong to a repository, not a project. A project is a thin grouping, a set of repos one agent team operates over, with no content of its own. Work that spans repos is split into per-repo tasks explicitly, so every task maps to one repo, one PR, one CI run, one merge gate.