Files a checkout carries
Project identity and Toolkit pin
Commit .foundry/project.toml. Init creates identity and pins the verified Toolkit. Keep the shared identity across clones. The example below comes from this repository. Use your generated identity and digest.
schema_version = 2
project_id = "project_24a65729-12e3-460e-bc96-25d51eaebd9b"
publication_root = "foundry"
minimum_cli_version = "2.0.0"
toolkit_version = "2.0.0"
toolkit_digest = "sha256:82cd76b4e1c0885ff045d059edad03408c3295c8cf7b21c3fc32b69b7bab5cf5"
[knowledge]
choice = "e11"
decided = "2026-10-12"The [knowledge] table is the answer to what agents should know about: none, own, e11 or other, and the day it was last given. Init writes it and raises minimum_cli_version to the CLI that wrote it. The names picked for other live in .alloy/corpus.lock, not here. config.toml is regenerated from the answer (e11_platform is on only for e11); set e11_platform under [modules.foundry] in .foundry/custom/config.toml to override it.
Price list
Commit .foundry/pricing.json. Each rate is microdollars per million tokens. One dollar equals one million microdollars. The engine pins the snapshot for each run. Doctor compares rates with the CLI’s published table.
{
"schemaVersion": 1,
"capturedAt": "2026-09-09T00:00:00.000Z",
"rates": {
"anthropic/claude-opus-5": {
"inputMicrosPerMillionTokens": 5000000,
"outputMicrosPerMillionTokens": 25000000,
"cacheReadMicrosPerMillionTokens": 500000,
"cacheWriteMicrosPerMillionTokens": 6250000
}
}
}This excerpt shows one model from the captured list. Retain the models your project intends to use and review their rates.
Execution profiles
Commit .foundry/profiles.toml. Use argument arrays for trusted commands. Story text does not supply executable shell commands. This example assumes your project provides pnpm test.
[profiles.default]
setup = [{ id = "install", argv = ["pnpm", "install", "--frozen-lockfile"], timeout_ms = 900000 }]
worker_scoped = [{ id = "test", argv = ["pnpm", "test"], timeout_ms = 600000 }]
acceptance = [{ id = "test", argv = ["pnpm", "test"], timeout_ms = 600000 }]
final = []
environment = []
[worker]
attribution = false| Field | Purpose |
|---|---|
setup | Prepare dependencies before the worker. |
worker_scoped | Tell the worker which checks to run. |
acceptance | Checks the controller executes to judge delivery. |
repair | Optional write commands for repairing failed formatting checks once. |
final | Commands at the final verification stage. |
environment | Names of additional environment variables passed to workers and commands. Values stay outside the plan. |
compare_with_base | Bugfix profiles only. On unless set to false: the test and lint commands fail a fix only on failures the staged base did not already have. |
[worker] attribution | Controls worker commit attribution. The default is false. |
Match worker and acceptance checks. Edit profiles before planning because each run seals its profile. Use --profile <id> to choose a named profile.
Local and derived files
| Path | Owner and purpose |
|---|---|
.foundry/local.json | Generated checkout identity link. Keep ignored. |
.foundry/initiative.json | Local current initiative pointer. Keep ignored. |
.foundry/config.toml | Generated central project configuration. Keep ignored. |
.foundry/config.user.toml | Generated personal configuration. Keep ignored. |
.foundry/custom/ | Handwritten team overrides are committed. Personal .user.toml files stay ignored. |
.foundry/foundry/ | Materialized Toolkit files. Keep ignored. |
.foundry/scripts/ | Helpers from the Toolkit. Keep ignored. |
.claude/skills/ | Generated Foundry skills for Claude Code. Keep generated entries ignored. |
.agents/skills/ | Generated Foundry skills for Codex. Keep generated entries ignored. |
.opencode/skills/ | Generated Foundry skills for OpenCode. Keep generated entries ignored. |
Visual verification files
Only an app that uses the optional visual add-on carries these.
| Path | Owner and purpose |
|---|---|
<app>/visual.config.json | Committed, one per app. How to serve the app and sign in, envFiles, masks, errorText, errorSelectors, reference, screens, ledger, publish, evidence. e11 visual schema prints the schema. |
<app>/visual/decision-ledger.yaml | Committed when the config's ledger key names it. Known, intentional differences from the design. |
<app>/visual.local.json | Per machine, ignored. Where the design reference checkout lives. |
~/.e11-foundry/flow-hooks.json | Per person, under Foundry Home. { "schemaVersion": 1, "visual": true } turns the flow hooks on in every project on the machine; no installer writes it. |
{implementation_artifacts}/visual/<slug>/ | A run folder, under the initiative's stories when one is in force, the same for every hooked flow. features.md, visuals.md, composites/ (with a reconcile's composites/round-<n>/ pre-fix snapshots and its annotated NN-<id>.run.png composites), run.json, screens.run.json, findings.json and reconcile-report.md are committed; before/, after/, reference/, start/ and logs/ are ignored by the folder's own .gitignore. |
Error intake files
Only a project that ran e11 errors init carries these. The working state is never in the checkout.
| Path | Owner and purpose |
|---|---|
.foundry/custom/e11-errors.toml | Committed. The errors projects, their sources and runners, budgets and the base branch. |
.foundry/custom/errors/locate.md | Committed. Where the team's code, logs and environments are, for the agent. |
[profiles.bugfix] in .foundry/profiles.toml | Committed. The default profile with e11 errors verify-repro last in worker_scoped and acceptance. |
<publication_root>/errors/<project>/ | Committed through e11 errors ledger --cut. ledger.jsonl and one <slug>/ folder per root cause. |
~/.e11-foundry/workspaces/<workspaceId>/errors/<project>/ledger/ | Per workspace, under Foundry Home. The working ledger every action reads and writes; e11 errors ledger prints it. |
~/.e11-foundry/workspaces/<workspaceId>/errors/<project>/ledger.lock | Per workspace. The lease every ledger writer holds. |
~/.e11-foundry/workspaces/<workspaceId>/errors/<project>/nights/<date>.json | Per workspace. One record per night: what it ran, spent, landed and ported, or the refusal that stopped it. e11 doctor reads them. |
~/.e11-foundry/workspaces/<workspaceId>/errors/<project>/logs/ | Per workspace. The night's log and every step's output. |
~/.e11-foundry/workspaces/<workspaceId>/errors/<project>/nightly.lock | Per workspace. Held for a whole night. |
~/.e11-foundry/workspaces/<workspaceId>/errors/<project>/port/<slug>/ | Per workspace. A port's replay worktree, removed when it ends. |
~/.e11-foundry/workspaces/<workspaceId>/errors/nightly.env | Per workspace, mode 600. The nightly job's tokens and PATH additions. |
~/.e11-foundry/workspaces/<workspaceId>/errors/<project>/ledger/<slug>/pr.md | Per workspace. The pull request text the publish session wrote; e11 errors port --push opens the PR from it. |
<checkout>.errors-<project>/ | Beside the checkout. The nightly job's own worktree, a Foundry checkout the sweep and engine runs work in; its errors state is the checkout's. e11 uninstall removes it. |
~/Library/LaunchAgents/com.engineering11.foundry-errors.<project>.<hash>.plist | Per checkout. The nightly job, running the CLI itself; <hash> names the checkout, so two clones keep two jobs. e11 errors schedule --remove or e11 uninstall removes it, and a job under the older name without the hash. |
Managed ignore rules
Commit the ignore blocks written by init. They keep generated files out of Git and allow the three shared inputs and team overrides. Preserve block markers and contents exactly. A modified managed block causes a refusal.
git check-ignore .foundry/local.json
git check-ignore .foundry/project.toml
git status --shortThe first command should print the local file. The project file should have no ignore match. Your publication root belongs in Git. Remove an unrelated ignore rule if the rule hides stories.