bench docs turn 2 — the same three page types, re-cut on what bench actually is
1a Harbour — the article page three columns, dark ink code, marginalia in the gutter
12vectors / bench docs for 0.2-alpha
bench docs
/ Search the docs… ⌘K
ConceptsClaiming a card

Claiming a card

Claiming is moving. Taking a card out of backlog/ towards work is the commitment, so that is where ownership gets written down — one line in the task file, taken from the identity git history already shows.

TL;DR A board-made move writes **Assignee:** <git user.name> into the task file. It gates exactly one thing — ▸ start work. Everything else is convention, and git history is the audit.

What a move writes

The first claim sticks: a card that already names an assignee keeps it when someone else moves it on. Walking it all the way back to backlog clears the line, because nobody holds it again.

MoveWhat the board doesAssignee
backlog → to-doWrites the line from git config user.nameclaimed
to-do → in-progressLeaves whoever claimed it first alonekept
anything → backlogRemoves the line — the card is free againcleared
mv on diskNarrates the move; writes no assigneeyours to write

Turning it on

Claiming is off by default. It lives in manager/local/.env, the copy of the documented example your first run wrote.

manager/local/.env copy
# claim on move, and commit the move
BOARD_COMMIT_MOVES=1
 
# the other half of team mode: origin/main is the truth
BOARD_SYNC=1
BOARD_SYNC_INTERVAL=30 # seconds between pulls

↑ the first run asks "solo or team?" and writes both keys for you.

!! heads up Identity is git's, so it collides like git's. Two machines both configured user.name = ronald are one person as far as the board is concerned. Teams that share a git history already share that assumption.

What you see when it fires

1 The task file grows **Assignee:** ronald beside its **Status:** line, and the card shows the name.
2 The move commits itself — one commit touching only that file, messaged board: 18 → in-progress (ronald).
3 Another board refuses ▸ start work on that card, names who holds it, and offers ▸ take over instead.
{{ feedbackAsk }}
  ___________________
 |___________________|
   ||             ||
   ||             ||
bench a 12vectors product · built in the open
github.com/12vectors/bench
1b Dockside — the docs home a landing that's mostly a terminal and a set of doors
12vectors / bench docs · guides · concepts · github
bench docs
Documentation

Put the agents
on the bench.

Task files in stage directories are the only source of truth. A stdlib-only board narrates what happens to them — agents working in git worktrees, PRs opening on review, CI on the cards — and never merges anything itself.

no account, no service, no database. it is python 3 on your own machine.
~/your-repo
$ mkdir .task-manager && curl -L \
https://github.com/12vectors/bench/releases/latest/download/bench.tar.gz \
| tar -xz -C .task-manager
$ ./.task-manager/start.sh
 
No .task-manager/manager/local/.env yet — a few questions and bench writes one.
solo or team? [solo]:
which agent adapter? [claude]:
what command runs this project's tests? [python3 -m unittest]:
 
Task board for ~/your-repo/.task-manager/tasks
http://127.0.0.1:26071/
Ctrl-C to stop
01 Install Untar it into .task-manager/, run start.sh, answer three questions. Port 26071, pinned.
02 The five stages backlog → to-do → in-progress → review → done. The directory a file sits in is its status.
03 Agents on the board ▸ start work makes a worktree and a branch, runs the agent headless, and moves the card when it exits.
04 PRs & review A card entering review gets a PR opened for it. Then ◔ review PR, ⚑ copilot, ↻ act on PR — until it settles.
05 Team mode BOARD_SYNC=1 makes origin/main the truth. Moves commit and push themselves; boards pull on a beat.
06 The three-layer law Core knows tasks, worktrees, PRs and events. Drivers know apps, adapters know vendors, local/ knows your project.
Most opened this week
local/.env settings a run that died the adapter contract archive & undo
1c Logbook — the settings reference prose left, the board's own activity pinned right
12vectors / bench 0.2-alpha
team mode off by default

BOARD_SYNC

Makes origin/main the truth and every board a converging replica. Off, none of it runs — no fetch, no push, no thread, no behaviour change at all.

BOARD_SYNC=<empty>  ·  empty / 0 / false / no / off = off, anything else = on
Keys it pulls in
BOARD_COMMIT_MOVES Implied by this one. A move that never commits has nothing to publish.
BOARD_SYNC_INTERVAL Default 30. Seconds between fetch-and-fast-forward beats. Raise it on a metered remote.
BOARD_WATCH_INTERVAL Default 2. The disk poll that narrates what a pull just applied.
~ tip Answering team at the first run writes this key and BOARD_COMMIT_MOVES together. install.py --setup is the way back to the question.
activity · 12vectors/bench live
09:14:02 move 26-forge-adapters.md moved
to-do → in-progress (you)
09:14:03 sync pushed 1 board commit to origin/main
09:14:33 sync pulled 2 commits from origin/main
(elena)
09:31:22 agent Wren finished 26-forge-adapters.md
— review branch task/26-forge-adapters
09:31:24 move 26-forge-adapters.md moved
in-progress → review (agent)
09:31:26 agent PR opened for 26-forge-adapters.md:
https://github.com/12vectors/bench/pull/31
09:32:31 agent CI on 26-forge-adapters.md's PR:
all checks pass
the browser gets these over SSE · no refresh