Files
bench/site/pages.json
T
istosandClaude Opus 5 38745ae0b3 site: add the reference section, generated from the settings file
The third design layout (1c Logbook) had no page. This lands it, and
with it the four routes a reader reaches for when the guides have
stopped answering: /reference/settings and the three contracts a
project implements against.

The settings page is parsed, not transcribed. site/build.py grows a
second way to make a body — a page may say "generate": "settings"
instead of a "from" heading — and manager/core/.env.example is read on
every build: its blank-line blocks become the page's entries, a comment
block documents the keys directly under it, and the file's own
NAME=value lines are the defaults shown. A key with no comment above it,
or one set twice, stops the build naming the route; a settings page that
disagrees with the settings file is worse than no settings page.

Generated bodies render with raw HTML off. The file writes
<git user.name> meaning a placeholder, and a parser honouring HTML
swallows it — it was never written to be markdown.

The reference layout is the article's three columns with the contents
gutter given over to a console: every entry on the page once more in the
machine register, keys with their defaults on the settings page and
headings on a sliced one. It links the same anchors "On this page"
carries, so the 1080px step folds the whole column away and the contents
strip hands them back — no third copy of anything, and the responsive
rules already in the sheet cover it.

The contract pages are slices like every other page: the adapter
contract and its event schema out of manager/core/adapters/README.md,
the driver and local-command contracts out of AGENTS.md. Renaming any of
those headings stops the build naming its route.

tests/test_site_reference.py holds the promise: add a key to
.env.example with its comment, rebuild, and it is on the page with its
default, with nothing in site/ edited.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 16:28:53 +02:00

167 lines
7.1 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": "## 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
}
]
}