Phases are the release, so AGENTS.md stops burying them. The six sections that were `###`s inside "Task file format" — where they had split that section's own prose in half, header table above and Assignee below — become a `## Phases` section of their own, between "Pull requests" and "Stages" because that is the order they are learned in. Nothing in them changed: the diff is a move plus the section's opening paragraph. Which gives the site three pages to cut rather than a tail nobody would find at the bottom of "Task files": /concepts/phases/ (the model), /concepts/running-a-phase/ (the branch, the beat, the halt, the ending) and /concepts/phases-on-the-board/ (what the Board stops drawing, and the Phases view that draws it instead). They sit after "PRs and review" in the Concepts flow, which is the order AGENTS.md now reads in — the manifest and the source cannot disagree about that without the build saying so. The landing page's third reason says it too, since "parallel work, zero collisions" was only half of what the board now does, and the README's opening paragraph gains the sentence it was missing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
200 lines
9.0 KiB
JSON
200 lines
9.0 KiB
JSON
{
|
|
"site": {
|
|
"title": "bench",
|
|
"tagline": "docs",
|
|
"description": "Run a team of coding agents without losing track of what they are doing.",
|
|
"base_url": "https://bench.12vectors.com",
|
|
"repo_url": "https://github.com/12vectors/bench",
|
|
"issues_url": "https://github.com/12vectors/bench/issues",
|
|
"releases_url": "https://github.com/12vectors/bench/releases",
|
|
"blob_base": "https://github.com/12vectors/bench/blob/main/"
|
|
},
|
|
|
|
"link_routes": {},
|
|
|
|
"pages": [
|
|
{
|
|
"path": "/",
|
|
"title": "bench — run a team of coding agents, stay in control",
|
|
"layout": "home",
|
|
"section": null,
|
|
"description": "Your agents ship faster than you can keep track. Every task is a card, every agent gets its own worktree, every change waits as a PR. Nothing merges without you.",
|
|
"source": null
|
|
},
|
|
{
|
|
"path": "/guides/install/",
|
|
"title": "Install and first run",
|
|
"layout": "article",
|
|
"section": "Guides",
|
|
"description": "Untar bench into .task-manager/, run start.sh, and answer the three questions the first run asks.",
|
|
"source": "README.md",
|
|
"from": "## Install into a repo",
|
|
"to": "## Update"
|
|
},
|
|
{
|
|
"path": "/concepts/stages/",
|
|
"title": "The five stages",
|
|
"layout": "article",
|
|
"section": "Concepts",
|
|
"description": "backlog, to-do, in-progress, review, done — the directory a task file sits in is its status, and there is no other source of truth.",
|
|
"source": "AGENTS.md",
|
|
"from": "## Stages",
|
|
"to": "## Claiming a card"
|
|
},
|
|
{
|
|
"path": "/concepts/task-files/",
|
|
"title": "Task files",
|
|
"layout": "article",
|
|
"section": "Concepts",
|
|
"description": "A task is a markdown file with a numbered name and a short header. Status is the only field the board enforces.",
|
|
"source": "AGENTS.md",
|
|
"from": "## Task file format"
|
|
},
|
|
{
|
|
"path": "/concepts/claiming-a-card/",
|
|
"title": "Claiming a card",
|
|
"layout": "article",
|
|
"section": "Concepts",
|
|
"description": "Claiming is moving: taking a card towards work is the commitment, and that is where ownership is recorded.",
|
|
"source": "AGENTS.md",
|
|
"from": "## Claiming a card",
|
|
"to": "## Syncing boards"
|
|
},
|
|
{
|
|
"path": "/concepts/agents-on-the-board/",
|
|
"title": "Agents on the board",
|
|
"layout": "article",
|
|
"section": "Concepts",
|
|
"description": "Start work makes a worktree and a branch, runs the agent headless, and moves the card on the way it exits.",
|
|
"source": "AGENTS.md",
|
|
"from": "## Agents working the board",
|
|
"to": "## Pull requests"
|
|
},
|
|
{
|
|
"path": "/concepts/pull-requests/",
|
|
"title": "PRs and review",
|
|
"layout": "article",
|
|
"section": "Concepts",
|
|
"description": "A card entering review gets a PR opened for it by the board; then review PR, copilot and act on PR, until it settles.",
|
|
"source": "AGENTS.md",
|
|
"from": "## Pull requests",
|
|
"to": "## Phases"
|
|
},
|
|
{
|
|
"path": "/concepts/phases/",
|
|
"title": "Phases",
|
|
"layout": "article",
|
|
"section": "Concepts",
|
|
"description": "A phase is a card that lists its cards: Type: Phase, a ## Cards section in run order, and membership that runs one direction only.",
|
|
"lede": "The model, before anything runs: what a phase card is made of, how membership is written down, why it runs one direction only, and what the board flags when the list does not resolve.",
|
|
"source": "AGENTS.md",
|
|
"from": "## Phases",
|
|
"to": "### A phase runs itself, on a branch of its own"
|
|
},
|
|
{
|
|
"path": "/concepts/running-a-phase/",
|
|
"title": "Running a phase",
|
|
"layout": "article",
|
|
"section": "Concepts",
|
|
"description": "Each member branches from the phase's tip, runs headless, and merges back on green. Halt, never skip — and one PR into main at the end.",
|
|
"lede": "Everything between starting a phase and the one PR it ends with: where each member's branch is cut, what advances the run and what stops it, how a restarted board picks the phase back up, and what merging it does to the cards it carried.",
|
|
"source": "AGENTS.md",
|
|
"from": "### A phase runs itself, on a branch of its own",
|
|
"to": "### A phase's members leave the Board view"
|
|
},
|
|
{
|
|
"path": "/concepts/phases-on-the-board/",
|
|
"title": "Where a phase is drawn",
|
|
"layout": "article",
|
|
"section": "Concepts",
|
|
"description": "The Board stops listing a phase's members and the phase card stands for them; the Phases view gives every phase a swimlane of its own.",
|
|
"lede": "A phase card stands for cards the kanban no longer lists. What the columns say instead, what the phase card owes in return, and the view that gives every phase a lane of its own.",
|
|
"source": "AGENTS.md",
|
|
"from": "### A phase's members leave the Board view",
|
|
"to": "## Stages"
|
|
},
|
|
{
|
|
"path": "/concepts/team-mode/",
|
|
"title": "Team mode",
|
|
"layout": "article",
|
|
"section": "Concepts",
|
|
"description": "BOARD_SYNC makes origin/main the truth and every board a converging replica: moves commit and push themselves, and a beat pulls what the other boards published.",
|
|
"source": "AGENTS.md",
|
|
"from": "## Syncing boards",
|
|
"to": "## Task file format"
|
|
},
|
|
{
|
|
"path": "/concepts/three-layer-law/",
|
|
"title": "The three-layer law",
|
|
"layout": "article",
|
|
"section": "Concepts",
|
|
"description": "Core knows tasks, worktrees, PRs and events. Drivers know apps, adapters know agent vendors, local/ knows your project.",
|
|
"source": "README.md",
|
|
"from": "## The three-layer law",
|
|
"to": "## License"
|
|
},
|
|
{
|
|
"path": "/concepts/adapters/",
|
|
"title": "Agent adapters",
|
|
"layout": "article",
|
|
"section": "Concepts",
|
|
"description": "Headless jobs run through an adapter, so the board works with coding agents other than Claude Code — and never sees a vendor's payloads.",
|
|
"lede": "The adapter is the layer that knows a coding agent. It launches one headless job, and translates that vendor's events into the board's own schema — which is what keeps every other line of core free of any particular agent.",
|
|
"source": "AGENTS.md",
|
|
"from": "## Agent adapters",
|
|
"to": "## Drives"
|
|
},
|
|
{
|
|
"path": "/reference/settings/",
|
|
"title": "Settings",
|
|
"layout": "reference",
|
|
"section": "Reference",
|
|
"description": "Every BOARD_* setting with its default and what changing it does — generated from manager/core/.env.example, which is where the defaults live.",
|
|
"lede": "The whole of manager/core/.env.example, read out of the file itself on every build. Precedence runs process environment, then your manager/local/.env, then the defaults below — so a key you never copied is a key at the value shown here.",
|
|
"source": "manager/core/.env.example",
|
|
"generate": "settings"
|
|
},
|
|
{
|
|
"path": "/reference/adapters/",
|
|
"title": "The adapter contract",
|
|
"layout": "reference",
|
|
"section": "Reference",
|
|
"description": "The two executables an adapter is — run and wire — the three launch intents, the model passthrough, and the normalized event schema.",
|
|
"lede": "What you implement to put a different coding agent behind the board. Two executables, three launch intents, and one event schema; the shipped claude/ and opencode/ adapters are both of these read side by side.",
|
|
"source": "manager/core/adapters/README.md",
|
|
"from": "## The contract",
|
|
"to": "## Writing one"
|
|
},
|
|
{
|
|
"path": "/reference/driver/",
|
|
"title": "The driver contract",
|
|
"layout": "reference",
|
|
"section": "Reference",
|
|
"description": "manager/local/driver/start: the executable that launches your app from a task's worktree, and the four things the board asks of it.",
|
|
"lede": "How an app starts is project knowledge, so the board does not hold any of it: it runs one executable you write and owns it as a process group. Four env vars in, one line out when the app is up, and SIGTERM to park it.",
|
|
"source": "AGENTS.md",
|
|
"from": "## Drives",
|
|
"to": "## The activity bar and the archive"
|
|
},
|
|
{
|
|
"path": "/reference/commands/",
|
|
"title": "The local-command contract",
|
|
"layout": "reference",
|
|
"section": "Reference",
|
|
"description": "manager/local/commands/: project chores run against a task's worktree, surfaced as chips on the cards that have a branch.",
|
|
"lede": "The driver's contract again, for the chores that belong to one checkout rather than to the app: migrations, reseeds, asset rebuilds. An executable in manager/local/commands/ becomes a chip on every card with a branch.",
|
|
"source": "AGENTS.md",
|
|
"from": "## Local commands",
|
|
"to": "## Updating"
|
|
},
|
|
{
|
|
"path": "/404.html",
|
|
"title": "Not found",
|
|
"layout": "notfound",
|
|
"section": null,
|
|
"description": "That path is not a page on this site.",
|
|
"source": null
|
|
}
|
|
]
|
|
}
|