A starting point for projects where one or more coding agents work in parallel against the same codebase. The product is the working method — the principles, documentation discipline, git/PR workflow, multi-agent integrity defenses, and agent pipeline captured in CLAUDE.md. That method is stack-agnostic.
To make the method concrete and prove it runs, the repo also ships one runnable worked example: a FastAPI + Postgres + Svelte stack with CI scaffolding aimed at the failure modes that show up when two agents have different context perspectives — scope detection, testmon, vitest --changed, e2e smoke/slow tiers, Alembic single-head check, frontend/backend contract check. The items example proves the stack is wired up end-to-end.
Using a different stack? (PHP, a data pipeline, a CLI, an existing codebase you're extending.) Keep CLAUDE.md, docs/, .claude/, and openspec/; delete backend/ and frontend/; and re-implement the four CI ideas in your tooling. docs/ADAPTING.md walks through exactly that. Otherwise, replace the items example with your own subject.
- Backend: Python 3.12, FastAPI, SQLAlchemy 2.x async + asyncpg, Alembic, Pydantic v2. uv for package management.
- Database: Postgres 17, in a docker-compose service.
- Frontend: Svelte 5 + TypeScript + Vite. npm for package management.
- Tests: pytest (with
pytest-asyncio+pytest-testmon), vitest, Playwright e2e. - CI: GitHub Actions — see
.github/workflows/ci.ymlandnightly.yml.
# 1. Install pre-commit hooks (blocks .env commits, enforces formatters,
# runs the comment-density check).
make install-hooks
# 2. (Optional) Override host ports if 5432/8000/5173 collide with
# another dev environment on your machine:
# cp .env.example .env
# # edit .env, e.g. BACKEND_HOST_PORT=8010 FRONTEND_HOST_PORT=5183
# Container-internal ports stay canonical; only host-side bindings
# shift. .env is gitignored.
# 3. Start the dev stack (Postgres + backend + frontend). Backend
# waits on Postgres's healthcheck, then auto-applies Alembic
# migrations on startup (see backend/entrypoint.sh).
make run-dev
# 4. Verify the wired-up flow (replace ports with your .env overrides):
# http://localhost:8000/api/health → {"status":"ok"}
# http://localhost:5173/ → the Items page
# Add a few items via the form; they should persist across
# `make stop-dev` / `make run-dev` thanks to the pgdata volume.
# 5. Run the tests.
make test
# `make migrate` is also available for manual reruns (e.g. after
# pulling a branch that added new migrations).If any of those steps fail, the bug is in the template itself — please open an issue.
Running Playwright e2e locally with overridden ports. The default PLAYWRIGHT_BASE_URL is http://localhost:5173. When your .env sets a different FRONTEND_HOST_PORT, export PLAYWRIGHT_BASE_URL to match:
export PLAYWRIGHT_BASE_URL=http://localhost:${FRONTEND_HOST_PORT:-5173}
cd frontend && npm run test:e2eDifferent stack? If your project isn't a FastAPI+Svelte app, the steps below (which assume the shipped stack) are not your path — read
docs/ADAPTING.mdfirst. It tells you what to keep (CLAUDE.md,docs/,.claude/,openspec/), what to delete (backend/,frontend/), and how to re-implement the four CI ideas in your own tooling.
-
Pick a subject. Replace the
itemsexample. Delete:backend/src/app/routes/items.py,backend/src/app/models.py,backend/src/app/schemas.pyfrontend/src/lib/Items.svelte,frontend/src/lib/api.tsbackend/tests/test_items.py,backend/tests/test_items_integration.pyfrontend/tests/unit/Items.test.ts,frontend/tests/unit/api.test.tsfrontend/tests/e2e/items-flow.spec.tsbackend/alembic/versions/0001_create_items.py
-
Update the path-trigger map.
scripts/path_triggers.shand the table inCLAUDE.md→ "Slow tier — path triggers" both referenceitemspaths. Replace them with your own source ↔ test mappings as you build them — and keep both in lock-step. -
Rewrite the Project section of
CLAUDE.md. It's labelled with aTEMPLATE NOTEto make it easy to find. -
Reset
docs/DECISIONS.md. Keep D3 (methodology-first stance) if it still describes your repo. Keep D1 (stack) and D2 (Alembic) only if you keep the shipped stack; otherwise reset them. Add a D4+ for your own first decision.
.
├── backend/
│ ├── src/app/ FastAPI app, async SQLAlchemy, items example
│ ├── tests/ pytest, including one @pytest.mark.slow test
│ ├── alembic/ migrations + env.py (asyncpg→psycopg2 swap)
│ └── pyproject.toml
├── frontend/
│ ├── src/ Svelte 5 (runes) + TypeScript
│ ├── tests/unit/ vitest
│ ├── tests/e2e/ Playwright (smoke + items-flow)
│ └── package.json
├── docker-compose.yml db + backend + frontend (dev-only)
├── scripts/
│ ├── contract_check.py frontend API calls vs backend routes
│ └── path_triggers.sh slow-tier source ↔ test map
├── .github/workflows/
│ ├── ci.yml per-PR fast tier with scope detection
│ └── nightly.yml slow tier + testmon refresh
├── .githooks/
│ ├── pre-commit format / lint / comment-density gate
│ └── check_comment_density.py
├── .claude/
│ ├── commands/ slash commands (review, design, ticket, ...)
│ ├── skills/ openspec workflow skills
│ ├── schedules/ sample /schedule routines (agent pipeline)
│ └── hooks/ PostToolUse hook (issue-close reminder)
├── docs/
│ ├── DECISIONS.md architectural / product decisions
│ ├── ADAPTING.md how to apply the method to a different stack
│ └── design/TEMPLATE.md design-doc template
├── openspec/ capability-spec workflow skeleton
├── CLAUDE.md agent-facing project guidance
└── Makefile
| If you want to | Read |
|---|---|
| Understand what Claude reads at session start | CLAUDE.md |
| Adapt the method to a non-FastAPI/Svelte stack (PHP, data pipeline, CLI, existing codebase) | docs/ADAPTING.md |
| Add an architectural decision | docs/DECISIONS.md (format documented at the top) |
| Add a new feature larger than a bugfix | docs/design/TEMPLATE.md (use /design) |
| Understand the CI scope-detection / testmon / vitest --changed logic | CLAUDE.md → "Change-scope test gauntlet" |
| Understand the multi-agent integrity defenses | CLAUDE.md → "Multi-agent integrity defenses" |
| Set up the agent pipeline (issue → PR auto-merge) | .claude/schedules/README.md |
- Docker + Docker Compose
- For local-only development without Docker: Python 3.12, Node 22+, Postgres 17,
uv. - GitHub CLI (
gh) — required for the agent pipeline and many of the workflows documented inCLAUDE.md.