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
}
]
}