Skip to content

The worktree model ​

Why project/ and docs/ live as git worktrees of orphan branches inside this repo — and what that buys.

The shape ​

text
arca/
├── crates/ …           ← code branch (main)
├── project/            ← worktree of the orphan `project` branch
│   ├── TODO.md  BACKLOG.md  index.md  meta.toml
│   └── issues/  proposals/  plans/  adrs/  handoffs/
├── docs/               ← worktree of the orphan `docs` branch
│   └── this site — VitePress sources
└── .gitignore          ← ignores project/ and docs/

Both worktrees share the repo's .git object store but have histories disjoint from main — orphan roots, no code ancestors. To tools they're ordinary directories; to git worktree list they're checkouts of their own branches.

Why orphan branches ​

Non-code state moves at its own cadence. On orphan branches, ledger and docs commits never touch the code history: no chore: handoff T-009 noise in main's log, no PM or docs-site diffs in code PRs. Both dirs are gitignored on main — the worktrees physically can't leak into a code commit.

Why worktrees (not just branches) ​

The content has to be visible — agents read project/, humans edit docs/ — without git checkout swapping the code tree. Worktrees keep all three branches checked out at once.

project/ — the PM ledger ​

Owned by myco, not arca: this repo dogfoods the stack's PM tool. The project branch history is the audit trail — every mutating myco verb is one atomic commit. myco init created the branch and worktree; agents go through myco verbs rather than hand-editing when a verb exists.

docs/ — this site ​

The docs branch holds the VitePress + Diátaxis sources; generated pages (reference/cli.md, reference/config.md, the crate map in architecture.md, reference/crate-api.md) are rebuilt by docs/gen-*.py and arca gen-cli-docs — never hand-edited. cargo xtask site builds the site; pushes deploy to GitHub Pages at 9aia.com/arca via scripts/deploy-docs.sh.

See architecture for the crates the code side is made of.