Files
bench/reference/bench-docs-design-turn2.dc.html
istos 66f06b96b9 docs design: turn 2 of Bench Docs on real bench content
Turn 1 of the docs design wrapped three good layouts around invented
content — a bench.toml, a brew-installed CLI, "lanes", a handoff rule
engine, port 7331, PAS-411 cards. None of it exists. Turn 2 holds all
three layouts and replaces every word, label and code block with the
product AGENTS.md, README.md and manager/core/.env.example describe.

  1b Dockside — hero terminal is the real install one-liner, the real
    first-run questions and the real board.py startup lines on 26071.
    The six doors are install, the five stages, agents on the board,
    PRs & review, team mode, the three-layer law.
  1a Harbour — the article is "Claiming a card": what each move writes
    to **Assignee:**, the two local/.env keys that turn it on, and the
    board: <n> → <stage> (<name>) commit it makes.
  1c Logbook — the CLI reference is now a settings reference, with
    BOARD_SYNC as the shown key and the board's own activity log (real
    event strings from sync.py, agents.py and github.py) in the pinned
    console.

The design project's write path needs an interactive permission grant,
which a headless run cannot answer, so the finished file lands here as
reference/bench-docs-design-turn2.dc.html for a human to upload as
"Bench Docs.dc.html". The card scoped itself to the design project with
no repo files changed; this one file is the deviation, and a git rm
undoes it once the upload has happened.
2026-07-31 11:09:42 +02:00

438 lines
42 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="./support.js"></script>
</head>
<body>
<x-dc>
<helmet>
<meta name="design_doc_mode" content="canvas" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,400;0,500;0,600;1,400&family=IBM+Plex+Mono:ital,wght@0,400;0,500;1,400&family=Zilla+Slab:wght@500;600;700&display=swap" rel="stylesheet" />
<style>
html,body{margin:0;padding:0;background:#c9dde1;color:#12323b;font-family:'IBM Plex Sans',system-ui,sans-serif;-webkit-font-smoothing:antialiased}
*{box-sizing:border-box}
a{color:#0d6e8c;text-decoration:none}
a:hover{color:#12323b;text-decoration:underline}
button{font-family:inherit;font-size:inherit;color:inherit;cursor:pointer}
pre{margin:0}
::selection{background:#0d6e8c;color:#fff}
@keyframes blink{0%,49%{opacity:1}50%,100%{opacity:0}}
@keyframes breathe{0%,100%{opacity:.35;transform:scale(.82)}50%{opacity:1;transform:scale(1)}}
</style>
</helmet>
<section style="display:flex;flex-direction:column;gap:22px;padding:40px">
<div style="display:flex;align-items:baseline;gap:14px">
<span style="font-family:'Zilla Slab',Georgia,serif;font-weight:600;letter-spacing:-.015em;font-size:26px">bench docs</span>
<span style="font-family:'IBM Plex Mono',monospace;font-size:12.5px;color:#4d6e77">turn 2 — the same three page types, re-cut on what bench actually is</span>
</div>
<div style="display:flex;flex-wrap:wrap;gap:28px;align-items:flex-start">
<!-- ============================== 1a HARBOUR ============================== -->
<div id="1a" style="display:flex;flex-direction:column;gap:10px">
<div style="display:flex;align-items:center;gap:10px">
<span style="font-family:'IBM Plex Mono',monospace;font-size:11px;font-weight:500;letter-spacing:.08em;padding:3px 8px;background:#12323b;color:#eaf3f4;border-radius:5px">1a</span>
<span style="font-size:14px;font-weight:600">Harbour — the article page</span>
<span style="font-size:13px;color:#4d6e77">three columns, dark ink code, marginalia in the gutter</span>
</div>
<div style="width:1180px;background:#eaf3f4;border:1px solid #c5d7db;border-radius:14px;overflow:hidden;box-shadow:0 20px 50px -34px rgba(18,50,59,.55)">
<div style="display:flex;align-items:center;gap:10px;padding:0 18px;height:30px;background:#12323b;color:#a9c4c9;font-family:'IBM Plex Mono',monospace;font-size:11px">
<span style="color:#eaf3f4;font-weight:500">12vectors</span>
<span style="color:#4d6e77">/</span>
<span style="color:#56c2d8">bench</span>
<span style="color:#4d6e77"></span>
<span style="flex:1"></span>
<span>docs for 0.2-alpha</span>
</div>
<header style="display:flex;align-items:center;gap:20px;padding:14px 22px;background:#fff;border-bottom:1px solid #c5d7db">
<div style="display:flex;align-items:baseline;gap:9px">
<span style="font-family:'Zilla Slab',Georgia,serif;font-weight:600;letter-spacing:-.015em;font-size:21px;line-height:1">bench</span>
<span style="font-family:'IBM Plex Mono',monospace;font-size:12px;color:#87a1a8">docs</span>
</div>
<nav style="display:flex;gap:18px;font-size:13.5px;margin-left:8px">
<span style="color:#4d6e77">Guides</span>
<span style="color:#12323b;font-weight:600;padding-bottom:2px;border-bottom:2px solid #0d6e8c">Concepts</span>
</nav>
<span style="flex:1"></span>
<div style="display:flex;align-items:center;gap:8px;width:240px;padding:6px 10px;background:#eaf3f4;border:1px solid #c5d7db;border-radius:8px">
<span style="font-family:'IBM Plex Mono',monospace;font-size:12px;color:#87a1a8">/</span>
<span style="font-size:13px;color:#87a1a8">Search the docs…</span>
<span style="flex:1"></span>
<span style="font-family:'IBM Plex Mono',monospace;font-size:10.5px;padding:1px 5px;background:#fff;border:1px solid #c5d7db;border-radius:4px;color:#87a1a8">⌘K</span>
</div>
<button style="padding:7px 13px;background:#0d6e8c;color:#fff;border:0;border-radius:8px;font-size:13px;font-weight:500">GitHub ↗</button>
</header>
<div style="display:grid;grid-template-columns:236px 1fr 208px">
<aside style="border-right:1px solid #d9e6e9;padding:22px 16px 40px;display:flex;flex-direction:column;gap:22px">
<div style="display:flex;flex-direction:column;gap:7px">
<span style="font-family:'IBM Plex Mono',monospace;font-size:10.5px;letter-spacing:.1em;text-transform:uppercase;color:#87a1a8;padding-left:9px">Get going</span>
<span style="font-size:13.5px;color:#4d6e77;padding:4px 9px">Install into a repo</span>
<span style="font-size:13.5px;color:#4d6e77;padding:4px 9px">Your first card</span>
<span style="font-size:13.5px;color:#4d6e77;padding:4px 9px">Choosing an adapter</span>
</div>
<div style="display:flex;flex-direction:column;gap:7px">
<span style="font-family:'IBM Plex Mono',monospace;font-size:10.5px;letter-spacing:.1em;text-transform:uppercase;color:#87a1a8;padding-left:9px">Concepts</span>
<span style="font-size:13.5px;color:#4d6e77;padding:4px 9px">Stages</span>
<span style="font-size:13.5px;color:#4d6e77;padding:4px 9px">Task files</span>
<span style="font-size:13.5px;font-weight:600;color:#12323b;padding:4px 9px;background:#e0eef1;border-left:2px solid #0d6e8c;border-radius:0 6px 6px 0">Claiming a card</span>
<span style="font-size:13.5px;color:#4d6e77;padding:4px 9px">Agents on the board</span>
<span style="font-size:13.5px;color:#4d6e77;padding:4px 9px">Pull requests &amp; review</span>
<span style="font-size:13.5px;color:#4d6e77;padding:4px 9px">Team mode</span>
</div>
<div style="display:flex;flex-direction:column;gap:7px">
<span style="font-family:'IBM Plex Mono',monospace;font-size:10.5px;letter-spacing:.1em;text-transform:uppercase;color:#87a1a8;padding-left:9px">Guides</span>
<span style="font-size:13.5px;color:#4d6e77;padding:4px 9px">Drives</span>
<span style="font-size:13.5px;color:#4d6e77;padding:4px 9px">Local commands</span>
<span style="font-size:13.5px;color:#4d6e77;padding:4px 9px">Updating</span>
<span style="font-size:13.5px;color:#4d6e77;padding:4px 9px">Settings</span>
</div>
<div style="margin-top:6px;padding:11px 12px;background:#fff;border:1px solid #d9e6e9;border-radius:10px;display:flex;flex-direction:column;gap:5px">
<span style="font-family:'IBM Plex Mono',monospace;font-size:10.5px;color:#87a1a8">0.2-alpha</span>
<span style="font-size:12.5px;color:#4d6e77;line-height:1.45">The first run now asks three questions and writes <span style="font-family:'IBM Plex Mono',monospace;font-size:11.5px">local/.env</span>.</span>
</div>
</aside>
<article style="padding:30px 40px 44px;min-width:0;position:relative">
<div style="display:flex;align-items:center;gap:8px;font-family:'IBM Plex Mono',monospace;font-size:11.5px;color:#87a1a8;margin-bottom:16px">
<span>Concepts</span><span></span><span style="color:#4d6e77">Claiming a card</span>
</div>
<h1 style="font-family:'Zilla Slab',Georgia,serif;font-weight:600;font-size:40px;line-height:1.1;letter-spacing:-.02em;margin:0 0 12px">Claiming a card</h1>
<p style="font-size:17px;line-height:1.6;color:#4d6e77;margin:0 0 26px;max-width:60ch;text-wrap:pretty">Claiming is moving. Taking a card out of <span style="font-family:'IBM Plex Mono',monospace;font-size:15px">backlog/</span> 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.</p>
<div style="display:flex;gap:12px;padding:14px 16px;background:#fff;border:1px solid #d9e6e9;border-left:3px solid #0d6e8c;border-radius:0 10px 10px 0;margin-bottom:28px">
<span style="font-family:'IBM Plex Mono',monospace;font-size:12px;color:#0d6e8c;font-weight:500;flex:0 0 auto">TL;DR</span>
<span style="font-size:14px;line-height:1.55;color:#12323b">A board-made move writes <span style="font-family:'IBM Plex Mono',monospace;font-size:13px;background:#eaf3f4;padding:1px 5px;border-radius:4px">**Assignee:** &lt;git user.name&gt;</span> into the task file. It gates exactly one thing — <span style="font-family:'IBM Plex Mono',monospace;font-size:13px;background:#eaf3f4;padding:1px 5px;border-radius:4px">▸ start work</span>. Everything else is convention, and git history is the audit.</span>
</div>
<h2 style="font-family:'Zilla Slab',Georgia,serif;font-weight:600;font-size:23px;letter-spacing:-.01em;margin:0 0 10px">What a move writes</h2>
<p style="font-size:15px;line-height:1.68;color:#4d6e77;margin:0 0 18px;max-width:64ch;text-wrap:pretty">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.</p>
<div style="border:1px solid #d9e6e9;border-radius:10px;overflow:hidden;margin-bottom:28px;background:#fff">
<div style="display:grid;grid-template-columns:190px 1fr 96px;padding:9px 14px;background:#eaf3f4;border-bottom:1px solid #d9e6e9;font-family:'IBM Plex Mono',monospace;font-size:10.5px;letter-spacing:.08em;text-transform:uppercase;color:#87a1a8">
<span>Move</span><span>What the board does</span><span>Assignee</span>
</div>
<div style="display:grid;grid-template-columns:190px 1fr 96px;padding:11px 14px;border-bottom:1px solid #eaf3f4;font-size:13.5px;align-items:center">
<span style="font-family:'IBM Plex Mono',monospace;font-size:12.5px;color:#0d6e8c">backlog → to-do</span><span style="color:#4d6e77">Writes the line from <span style="font-family:'IBM Plex Mono',monospace;font-size:12.5px">git config user.name</span></span><span style="font-family:'IBM Plex Mono',monospace;font-size:12px;color:#5f7f33">claimed</span>
</div>
<div style="display:grid;grid-template-columns:190px 1fr 96px;padding:11px 14px;border-bottom:1px solid #eaf3f4;font-size:13.5px;align-items:center">
<span style="font-family:'IBM Plex Mono',monospace;font-size:12.5px;color:#0d6e8c">to-do → in-progress</span><span style="color:#4d6e77">Leaves whoever claimed it first alone</span><span style="font-family:'IBM Plex Mono',monospace;font-size:12px;color:#5f7f33">kept</span>
</div>
<div style="display:grid;grid-template-columns:190px 1fr 96px;padding:11px 14px;border-bottom:1px solid #eaf3f4;font-size:13.5px;align-items:center">
<span style="font-family:'IBM Plex Mono',monospace;font-size:12.5px;color:#0d6e8c">anything → backlog</span><span style="color:#4d6e77">Removes the line — the card is free again</span><span style="font-family:'IBM Plex Mono',monospace;font-size:12px;color:#87a1a8">cleared</span>
</div>
<div style="display:grid;grid-template-columns:190px 1fr 96px;padding:11px 14px;font-size:13.5px;align-items:center">
<span style="font-family:'IBM Plex Mono',monospace;font-size:12.5px;color:#0d6e8c">mv on disk</span><span style="color:#4d6e77">Narrates the move; writes no assignee</span><span style="font-family:'IBM Plex Mono',monospace;font-size:12px;color:#b1543a">yours to write</span>
</div>
</div>
<h2 style="font-family:'Zilla Slab',Georgia,serif;font-weight:600;font-size:23px;letter-spacing:-.01em;margin:0 0 10px">Turning it on</h2>
<p style="font-size:15px;line-height:1.68;color:#4d6e77;margin:0 0 14px;max-width:64ch;text-wrap:pretty">Claiming is off by default. It lives in <span style="font-family:'IBM Plex Mono',monospace;font-size:13.5px;background:#fff;border:1px solid #d9e6e9;padding:1px 5px;border-radius:4px">manager/local/.env</span>, the copy of the documented example your first run wrote.</p>
<div style="border-radius:11px;overflow:hidden;margin-bottom:12px;box-shadow:0 12px 28px -24px rgba(12,26,32,.9)">
<div style="display:flex;align-items:center;gap:9px;padding:8px 14px;background:#0a161b;border-bottom:1px solid #1c343a">
<span style="width:8px;height:8px;border-radius:99px;background:#e08a63"></span>
<span style="width:8px;height:8px;border-radius:99px;background:#a6c96f"></span>
<span style="font-family:'IBM Plex Mono',monospace;font-size:11px;color:#62828a;margin-left:6px">manager/local/.env</span>
<span style="flex:1"></span>
<span style="font-family:'IBM Plex Mono',monospace;font-size:10.5px;color:#62828a">copy</span>
</div>
<pre style="margin:0;padding:16px 18px;background:#0c1a20;color:#e9f3f3;font-family:'IBM Plex Mono',monospace;font-size:12.5px;line-height:1.75;overflow-x:auto"><div><span style="color:#62828a"># claim on move, and commit the move</span></div><div><span style="color:#a6c96f">BOARD_COMMIT_MOVES</span>=<span style="color:#56c2d8">1</span></div><div>&nbsp;</div><div><span style="color:#62828a"># the other half of team mode: origin/main is the truth</span></div><div><span style="color:#a6c96f">BOARD_SYNC</span>=<span style="color:#56c2d8">1</span></div><div><span style="color:#a6c96f">BOARD_SYNC_INTERVAL</span>=<span style="color:#56c2d8">30</span> <span style="color:#62828a"># seconds between pulls</span></div></pre>
</div>
<p style="font-family:'IBM Plex Mono',monospace;font-size:11.5px;color:#87a1a8;margin:0 0 28px;font-style:italic">↑ the first run asks "solo or team?" and writes both keys for you.</p>
<div style="display:flex;gap:13px;padding:15px 17px;background:#fbf1ec;border:1px solid #ecc9b8;border-radius:11px;margin-bottom:30px">
<span style="font-family:'IBM Plex Mono',monospace;font-size:12px;font-weight:500;color:#b1543a;flex:0 0 auto">!! heads up</span>
<span style="font-size:14px;line-height:1.6;color:#7a3c2a">Identity is git's, so it collides like git's. Two machines both configured <span style="font-family:'IBM Plex Mono',monospace;font-size:13px">user.name = ronald</span> are one person as far as the board is concerned. Teams that share a git history already share that assumption.</span>
</div>
<h2 style="font-family:'Zilla Slab',Georgia,serif;font-weight:600;font-size:23px;letter-spacing:-.01em;margin:0 0 14px">What you see when it fires</h2>
<div style="display:flex;flex-direction:column;gap:12px;margin-bottom:32px">
<div style="display:flex;gap:13px">
<span style="flex:0 0 22px;height:22px;display:flex;align-items:center;justify-content:center;background:#12323b;color:#eaf3f4;border-radius:6px;font-family:'IBM Plex Mono',monospace;font-size:11px">1</span>
<span style="font-size:14.5px;line-height:1.6;color:#4d6e77;padding-top:1px">The task file grows <b style="color:#12323b;font-weight:600">**Assignee:** ronald</b> beside its <b style="color:#12323b;font-weight:600">**Status:**</b> line, and the card shows the name.</span>
</div>
<div style="display:flex;gap:13px">
<span style="flex:0 0 22px;height:22px;display:flex;align-items:center;justify-content:center;background:#12323b;color:#eaf3f4;border-radius:6px;font-family:'IBM Plex Mono',monospace;font-size:11px">2</span>
<span style="font-size:14.5px;line-height:1.6;color:#4d6e77;padding-top:1px">The move commits itself — one commit touching only that file, messaged <span style="font-family:'IBM Plex Mono',monospace;font-size:13px;background:#eaf3f4;padding:1px 5px;border-radius:4px">board: 18 → in-progress (ronald)</span>.</span>
</div>
<div style="display:flex;gap:13px">
<span style="flex:0 0 22px;height:22px;display:flex;align-items:center;justify-content:center;background:#12323b;color:#eaf3f4;border-radius:6px;font-family:'IBM Plex Mono',monospace;font-size:11px">3</span>
<span style="font-size:14.5px;line-height:1.6;color:#4d6e77;padding-top:1px">Another board refuses <b style="color:#12323b;font-weight:600">▸ start work</b> on that card, names who holds it, and offers <b style="color:#12323b;font-weight:600">▸ take over</b> instead.</span>
</div>
</div>
<div style="display:flex;align-items:center;gap:14px;padding:16px 18px;background:#fff;border:1px solid #d9e6e9;border-radius:11px">
<span style="font-size:14px;color:#4d6e77">{{ feedbackAsk }}</span>
<span style="flex:1"></span>
<button style="padding:6px 13px;background:#eaf3f4;border:1px solid #c5d7db;border-radius:7px;font-size:13px;color:#12323b">{{ feedbackYes }}</button>
<button style="padding:6px 13px;background:#eaf3f4;border:1px solid #c5d7db;border-radius:7px;font-size:13px;color:#12323b">{{ feedbackNo }}</button>
</div>
</article>
<aside style="border-left:1px solid #d9e6e9;padding:30px 18px;display:flex;flex-direction:column;gap:9px">
<sc-if value="{{ showTOC }}" hint-placeholder-val="{{ true }}">
<div style="display:flex;flex-direction:column;gap:9px">
<span style="font-family:'IBM Plex Mono',monospace;font-size:10.5px;letter-spacing:.1em;text-transform:uppercase;color:#87a1a8;margin-bottom:2px">On this page</span>
<span style="font-size:12.5px;color:#0d6e8c;border-left:2px solid #0d6e8c;padding-left:9px">What a move writes</span>
<span style="font-size:12.5px;color:#87a1a8;border-left:2px solid #e0eef1;padding-left:9px">Turning it on</span>
<span style="font-size:12.5px;color:#87a1a8;border-left:2px solid #e0eef1;padding-left:9px">What you see</span>
<div style="height:1px;background:#d9e6e9;margin:12px 0"></div>
<span style="font-size:12.5px;color:#4d6e77;line-height:1.5">Edit this page on GitHub ↗</span>
<span style="font-size:12.5px;color:#4d6e77;line-height:1.5">Open an issue ↗</span>
</div>
</sc-if>
<sc-if value="{{ showMarginalia }}" hint-placeholder-val="{{ true }}">
<span style="margin-top:36px;font-family:'IBM Plex Mono',monospace;font-size:11px;line-height:1.55;color:#b1543a;font-style:italic;transform:rotate(-1.2deg);transform-origin:left top">← the whole of ownership: one line in a markdown file</span>
</sc-if>
</aside>
</div>
<footer style="display:flex;align-items:flex-end;gap:26px;padding:22px 26px;background:#12323b;color:#a9c4c9">
<pre style="font-family:'IBM Plex Mono',monospace;font-size:9.5px;line-height:1.25;color:#4d6e77;margin:0"> ___________________
|___________________|
|| ||
|| ||</pre>
<div style="display:flex;flex-direction:column;gap:4px">
<span style="font-family:'Zilla Slab',Georgia,serif;font-size:15px;color:#eaf3f4;font-weight:600">bench</span>
<span style="font-family:'IBM Plex Mono',monospace;font-size:11px">a 12vectors product · built in the open</span>
</div>
<span style="flex:1"></span>
<span style="font-family:'IBM Plex Mono',monospace;font-size:11px">github.com/12vectors/bench</span>
</footer>
</div>
</div>
<!-- ============================== 1b DOCKSIDE ============================== -->
<div id="1b" style="display:flex;flex-direction:column;gap:10px">
<div style="display:flex;align-items:center;gap:10px">
<span style="font-family:'IBM Plex Mono',monospace;font-size:11px;font-weight:500;letter-spacing:.08em;padding:3px 8px;background:#12323b;color:#eaf3f4;border-radius:5px">1b</span>
<span style="font-size:14px;font-weight:600">Dockside — the docs home</span>
<span style="font-size:13px;color:#4d6e77">a landing that's mostly a terminal and a set of doors</span>
</div>
<div style="width:1180px;background:#eaf3f4;border:1px solid #c5d7db;border-radius:14px;overflow:hidden;box-shadow:0 20px 50px -34px rgba(18,50,59,.55)">
<div style="display:flex;align-items:center;gap:10px;padding:0 18px;height:30px;background:#12323b;color:#a9c4c9;font-family:'IBM Plex Mono',monospace;font-size:11px">
<span style="color:#eaf3f4;font-weight:500">12vectors</span>
<span style="color:#4d6e77">/</span>
<span style="color:#56c2d8">bench</span>
<span style="color:#4d6e77"></span>
<span style="flex:1"></span>
<span>docs · guides · concepts · github</span>
</div>
<header style="display:flex;align-items:center;gap:20px;padding:14px 30px;background:#eaf3f4">
<div style="display:flex;align-items:baseline;gap:9px">
<span style="font-family:'Zilla Slab',Georgia,serif;font-weight:600;letter-spacing:-.015em;font-size:21px;line-height:1">bench</span>
<span style="font-family:'IBM Plex Mono',monospace;font-size:12px;color:#87a1a8">docs</span>
</div>
<span style="flex:1"></span>
<nav style="display:flex;gap:20px;font-size:13.5px;color:#4d6e77">
<span>Guides</span><span>Concepts</span>
</nav>
<button style="padding:7px 13px;background:transparent;border:1px solid #c5d7db;border-radius:8px;font-size:13px;color:#12323b">GitHub ↗</button>
</header>
<div style="display:grid;grid-template-columns:1.05fr .95fr;gap:44px;padding:44px 44px 40px;align-items:center">
<div style="display:flex;flex-direction:column;gap:20px">
<span style="font-family:'IBM Plex Mono',monospace;font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:#0d6e8c">Documentation</span>
<h1 style="font-family:'Zilla Slab',Georgia,serif;font-weight:600;font-size:52px;line-height:1.05;letter-spacing:-.025em;margin:0;text-wrap:balance">Put the agents<br />on the bench.</h1>
<p style="font-size:17px;line-height:1.62;color:#4d6e77;margin:0;max-width:44ch;text-wrap:pretty">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.</p>
<div style="display:flex;gap:10px;align-items:center">
<button style="padding:11px 18px;background:#0d6e8c;color:#fff;border:0;border-radius:9px;font-size:14px;font-weight:500">Install into a repo</button>
<button style="padding:11px 18px;background:#fff;border:1px solid #c5d7db;border-radius:9px;font-size:14px;color:#12323b">Read the concepts</button>
</div>
<span style="font-family:'IBM Plex Mono',monospace;font-size:11.5px;color:#87a1a8;font-style:italic">no account, no service, no database. it is python 3 on your own machine.</span>
</div>
<div style="border-radius:12px;overflow:hidden;box-shadow:0 24px 46px -30px rgba(12,26,32,.85)">
<div style="display:flex;align-items:center;gap:8px;padding:9px 14px;background:#0a161b">
<span style="width:8px;height:8px;border-radius:99px;background:#e08a63"></span>
<span style="width:8px;height:8px;border-radius:99px;background:#a6c96f"></span>
<span style="font-family:'IBM Plex Mono',monospace;font-size:11px;color:#62828a;margin-left:6px">~/your-repo</span>
</div>
<pre style="margin:0;padding:18px;background:#0c1a20;color:#e9f3f3;font-family:'IBM Plex Mono',monospace;font-size:12.5px;line-height:1.85;white-space:pre-wrap;word-break:break-all"><div><span style="color:#a6c96f">$</span> mkdir .task-manager &amp;&amp; curl -L \</div><div> <span style="color:#62828a">https://github.com/12vectors/bench/releases/latest/download/bench.tar.gz</span> \</div><div> | tar -xz -C .task-manager</div><div><span style="color:#a6c96f">$</span> ./.task-manager/start.sh</div><div>&nbsp;</div><div> <span style="color:#95afb4">No .task-manager/manager/local/.env yet — a few questions and bench writes one.</span></div><div> solo or team? <span style="color:#56c2d8">[solo]</span>:</div><div> which agent adapter? <span style="color:#56c2d8">[claude]</span>:</div><div> what command runs this project's tests? <span style="color:#56c2d8">[python3 -m unittest]</span>:</div><div>&nbsp;</div><div> Task board for ~/your-repo/.task-manager/tasks</div><div> <span style="color:#56c2d8">http://127.0.0.1:26071/</span></div><div> <span style="color:#62828a">Ctrl-C to stop</span><span style="color:#e9f3f3;animation:blink 1.1s step-end infinite"></span></div></pre>
</div>
</div>
<div style="display:grid;grid-template-columns:repeat(3,1fr);gap:14px;padding:0 44px 34px">
<div style="display:flex;flex-direction:column;gap:8px;padding:20px;background:#fff;border:1px solid #d9e6e9;border-radius:12px">
<span style="font-family:'IBM Plex Mono',monospace;font-size:11px;color:#87a1a8">01</span>
<span style="font-family:'Zilla Slab',Georgia,serif;font-size:19px;font-weight:600">Install</span>
<span style="font-size:13.5px;line-height:1.6;color:#4d6e77">Untar it into <span style="font-family:'IBM Plex Mono',monospace;font-size:12.5px">.task-manager/</span>, run <span style="font-family:'IBM Plex Mono',monospace;font-size:12.5px">start.sh</span>, answer three questions. Port 26071, pinned.</span>
</div>
<div style="display:flex;flex-direction:column;gap:8px;padding:20px;background:#fff;border:1px solid #d9e6e9;border-radius:12px">
<span style="font-family:'IBM Plex Mono',monospace;font-size:11px;color:#87a1a8">02</span>
<span style="font-family:'Zilla Slab',Georgia,serif;font-size:19px;font-weight:600">The five stages</span>
<span style="font-size:13.5px;line-height:1.6;color:#4d6e77">backlog → to-do → in-progress → review → done. The directory a file sits in <i>is</i> its status.</span>
</div>
<div style="display:flex;flex-direction:column;gap:8px;padding:20px;background:#fff;border:1px solid #d9e6e9;border-radius:12px">
<span style="font-family:'IBM Plex Mono',monospace;font-size:11px;color:#87a1a8">03</span>
<span style="font-family:'Zilla Slab',Georgia,serif;font-size:19px;font-weight:600">Agents on the board</span>
<span style="font-size:13.5px;line-height:1.6;color:#4d6e77">▸ start work makes a worktree and a branch, runs the agent headless, and moves the card when it exits.</span>
</div>
<div style="display:flex;flex-direction:column;gap:8px;padding:20px;background:#fff;border:1px solid #d9e6e9;border-radius:12px">
<span style="font-family:'IBM Plex Mono',monospace;font-size:11px;color:#87a1a8">04</span>
<span style="font-family:'Zilla Slab',Georgia,serif;font-size:19px;font-weight:600">PRs &amp; review</span>
<span style="font-size:13.5px;line-height:1.6;color:#4d6e77">A card entering review gets a PR opened for it. Then ◔ review PR, ⚑ copilot, ↻ act on PR — until it settles.</span>
</div>
<div style="display:flex;flex-direction:column;gap:8px;padding:20px;background:#fff;border:1px solid #d9e6e9;border-radius:12px">
<span style="font-family:'IBM Plex Mono',monospace;font-size:11px;color:#87a1a8">05</span>
<span style="font-family:'Zilla Slab',Georgia,serif;font-size:19px;font-weight:600">Team mode</span>
<span style="font-size:13.5px;line-height:1.6;color:#4d6e77"><span style="font-family:'IBM Plex Mono',monospace;font-size:12.5px">BOARD_SYNC=1</span> makes origin/main the truth. Moves commit and push themselves; boards pull on a beat.</span>
</div>
<div style="display:flex;flex-direction:column;gap:8px;padding:20px;background:#12323b;border-radius:12px;color:#eaf3f4">
<span style="font-family:'IBM Plex Mono',monospace;font-size:11px;color:#7fa0a8">06</span>
<span style="font-family:'Zilla Slab',Georgia,serif;font-size:19px;font-weight:600">The three-layer law</span>
<span style="font-size:13.5px;line-height:1.6;color:#a9c4c9">Core knows tasks, worktrees, PRs and events. Drivers know apps, adapters know vendors, local/ knows your project.</span>
</div>
</div>
<div style="display:flex;align-items:center;gap:28px;padding:20px 44px;background:#e0eef1;border-top:1px solid #d9e6e9">
<span style="font-family:'IBM Plex Mono',monospace;font-size:10.5px;letter-spacing:.1em;text-transform:uppercase;color:#87a1a8">Most opened this week</span>
<div style="display:flex;gap:8px;flex-wrap:wrap">
<span style="font-family:'IBM Plex Mono',monospace;font-size:12px;padding:4px 10px;background:#fff;border:1px solid #c5d7db;border-radius:99px;color:#0d6e8c">local/.env settings</span>
<span style="font-family:'IBM Plex Mono',monospace;font-size:12px;padding:4px 10px;background:#fff;border:1px solid #c5d7db;border-radius:99px;color:#0d6e8c">a run that died</span>
<span style="font-family:'IBM Plex Mono',monospace;font-size:12px;padding:4px 10px;background:#fff;border:1px solid #c5d7db;border-radius:99px;color:#0d6e8c">the adapter contract</span>
<span style="font-family:'IBM Plex Mono',monospace;font-size:12px;padding:4px 10px;background:#fff;border:1px solid #c5d7db;border-radius:99px;color:#0d6e8c">archive &amp; undo</span>
</div>
</div>
</div>
</div>
<!-- ============================== 1c LOGBOOK ============================== -->
<div id="1c" style="display:flex;flex-direction:column;gap:10px">
<div style="display:flex;align-items:center;gap:10px">
<span style="font-family:'IBM Plex Mono',monospace;font-size:11px;font-weight:500;letter-spacing:.08em;padding:3px 8px;background:#12323b;color:#eaf3f4;border-radius:5px">1c</span>
<span style="font-size:14px;font-weight:600">Logbook — the settings reference</span>
<span style="font-size:13px;color:#4d6e77">prose left, the board's own activity pinned right</span>
</div>
<div style="width:1180px;background:#eaf3f4;border:1px solid #c5d7db;border-radius:14px;overflow:hidden;box-shadow:0 20px 50px -34px rgba(18,50,59,.55)">
<div style="display:flex;align-items:center;gap:10px;padding:0 18px;height:30px;background:#12323b;color:#a9c4c9;font-family:'IBM Plex Mono',monospace;font-size:11px">
<span style="color:#eaf3f4;font-weight:500">12vectors</span>
<span style="color:#4d6e77">/</span>
<span style="color:#56c2d8">bench</span>
<span style="color:#4d6e77"></span>
<span style="flex:1"></span>
<span>0.2-alpha</span>
</div>
<div style="display:grid;grid-template-columns:212px 1fr">
<aside style="background:#e4eff1;border-right:1px solid #d9e6e9;padding:20px 14px 40px;display:flex;flex-direction:column;gap:18px">
<div style="display:flex;align-items:baseline;gap:8px;padding:0 8px 6px">
<span style="font-family:'Zilla Slab',Georgia,serif;font-weight:600;font-size:19px">bench</span>
<span style="font-family:'IBM Plex Mono',monospace;font-size:11.5px;color:#87a1a8">local/.env</span>
</div>
<div style="display:flex;flex-direction:column;gap:5px">
<span style="font-family:'IBM Plex Mono',monospace;font-size:10.5px;letter-spacing:.1em;text-transform:uppercase;color:#87a1a8;padding-left:8px">Keys</span>
<span style="font-family:'IBM Plex Mono',monospace;font-size:12.5px;color:#4d6e77;padding:4px 8px">BOARD_PORT</span>
<span style="font-family:'IBM Plex Mono',monospace;font-size:12.5px;color:#4d6e77;padding:4px 8px">BOARD_TITLE</span>
<span style="font-family:'IBM Plex Mono',monospace;font-size:12.5px;color:#4d6e77;padding:4px 8px">BOARD_AGENT_ADAPTER</span>
<span style="font-family:'IBM Plex Mono',monospace;font-size:12.5px;color:#4d6e77;padding:4px 8px">BOARD_AGENT_COMMANDS</span>
<span style="font-family:'IBM Plex Mono',monospace;font-size:12.5px;color:#4d6e77;padding:4px 8px">BOARD_COMMIT_MOVES</span>
<span style="font-family:'IBM Plex Mono',monospace;font-size:12.5px;color:#12323b;font-weight:500;padding:4px 8px;background:#fff;border:1px solid #c5d7db;border-radius:6px">BOARD_SYNC</span>
<span style="font-family:'IBM Plex Mono',monospace;font-size:12.5px;color:#4d6e77;padding:4px 8px">BOARD_WORKTREES</span>
</div>
<div style="display:flex;flex-direction:column;gap:5px">
<span style="font-family:'IBM Plex Mono',monospace;font-size:10.5px;letter-spacing:.1em;text-transform:uppercase;color:#87a1a8;padding-left:8px">Also</span>
<span style="font-size:13px;color:#4d6e77;padding:4px 8px">Precedence</span>
<span style="font-size:13px;color:#4d6e77;padding:4px 8px">Where the file lives</span>
<span style="font-size:13px;color:#4d6e77;padding:4px 8px">What updates touch</span>
</div>
</aside>
<div style="display:grid;grid-template-columns:1fr 430px">
<article style="padding:28px 32px 40px;min-width:0">
<div style="display:flex;align-items:center;gap:9px;margin-bottom:14px">
<span style="font-family:'IBM Plex Mono',monospace;font-size:10.5px;letter-spacing:.08em;padding:3px 7px;background:#e0eef1;border:1px solid #c5d7db;border-radius:5px;color:#0d6e8c">team mode</span>
<span style="font-family:'IBM Plex Mono',monospace;font-size:10.5px;letter-spacing:.08em;padding:3px 7px;background:#f2f7dc;border:1px solid #d6e2a8;border-radius:5px;color:#5f7f33">off by default</span>
</div>
<h1 style="font-family:'IBM Plex Mono',monospace;font-weight:500;font-size:29px;letter-spacing:-.01em;margin:0 0 10px">BOARD_SYNC</h1>
<p style="font-size:15.5px;line-height:1.65;color:#4d6e77;margin:0 0 22px;max-width:52ch;text-wrap:pretty">Makes <span style="font-family:'IBM Plex Mono',monospace;font-size:14.5px">origin/main</span> the truth and every board a converging replica. Off, none of it runs — no fetch, no push, no thread, no behaviour change at all.</p>
<div style="font-family:'IBM Plex Mono',monospace;font-size:12.5px;line-height:1.7;padding:12px 14px;background:#fff;border:1px solid #d9e6e9;border-radius:9px;color:#12323b;margin-bottom:26px">BOARD_SYNC=<span style="color:#0d6e8c">&lt;empty&gt;</span> &nbsp;·&nbsp; empty <span style="color:#87a1a8">/</span> 0 <span style="color:#87a1a8">/</span> false <span style="color:#87a1a8">/</span> no <span style="color:#87a1a8">/</span> off = off, anything else = on</div>
<span style="font-family:'IBM Plex Mono',monospace;font-size:10.5px;letter-spacing:.1em;text-transform:uppercase;color:#87a1a8">Keys it pulls in</span>
<div style="display:flex;flex-direction:column;gap:0;margin:10px 0 26px;border:1px solid #d9e6e9;border-radius:10px;overflow:hidden;background:#fff">
<div style="display:flex;gap:14px;padding:12px 14px;border-bottom:1px solid #eaf3f4">
<span style="font-family:'IBM Plex Mono',monospace;font-size:12.5px;color:#0d6e8c;flex:0 0 150px">BOARD_COMMIT_MOVES</span>
<span style="font-size:13.5px;line-height:1.55;color:#4d6e77">Implied by this one. A move that never commits has nothing to publish.</span>
</div>
<div style="display:flex;gap:14px;padding:12px 14px;border-bottom:1px solid #eaf3f4">
<span style="font-family:'IBM Plex Mono',monospace;font-size:12.5px;color:#0d6e8c;flex:0 0 150px">BOARD_SYNC_INTERVAL</span>
<span style="font-size:13.5px;line-height:1.55;color:#4d6e77">Default <span style="font-family:'IBM Plex Mono',monospace;font-size:12.5px">30</span>. Seconds between fetch-and-fast-forward beats. Raise it on a metered remote.</span>
</div>
<div style="display:flex;gap:14px;padding:12px 14px">
<span style="font-family:'IBM Plex Mono',monospace;font-size:12.5px;color:#0d6e8c;flex:0 0 150px">BOARD_WATCH_INTERVAL</span>
<span style="font-size:13.5px;line-height:1.55;color:#4d6e77">Default <span style="font-family:'IBM Plex Mono',monospace;font-size:12.5px">2</span>. The disk poll that narrates what a pull just applied.</span>
</div>
</div>
<div style="display:flex;gap:13px;padding:14px 16px;background:#f4f8e6;border:1px solid #d6e2a8;border-radius:11px">
<span style="font-family:'IBM Plex Mono',monospace;font-size:12px;font-weight:500;color:#5f7f33;flex:0 0 auto">~ tip</span>
<span style="font-size:13.5px;line-height:1.6;color:#4a6329">Answering <b>team</b> at the first run writes this key and <span style="font-family:'IBM Plex Mono',monospace;font-size:12.5px">BOARD_COMMIT_MOVES</span> together. <span style="font-family:'IBM Plex Mono',monospace;font-size:12.5px">install.py --setup</span> is the way back to the question.</span>
</div>
</article>
<div style="padding:28px 28px 40px 0">
<div style="position:sticky;top:20px;border-radius:12px;overflow:hidden;box-shadow:0 18px 40px -30px rgba(12,26,32,.9)">
<div style="display:flex;align-items:center;gap:9px;padding:9px 14px;background:#0a161b">
<span style="width:6px;height:6px;border-radius:99px;background:#56c2d8;animation:breathe 2.4s ease-in-out infinite"></span>
<span style="font-family:'IBM Plex Mono',monospace;font-size:11px;color:#95afb4">activity · 12vectors/bench</span>
<span style="flex:1"></span>
<span style="font-family:'IBM Plex Mono',monospace;font-size:10.5px;color:#62828a">live</span>
</div>
<pre style="margin:0;padding:16px;background:#0c1a20;font-family:'IBM Plex Mono',monospace;font-size:11.5px;line-height:1.95;color:#e9f3f3;overflow-x:auto"><div><span style="color:#62828a">09:14:02</span> <span style="color:#56c2d8">move</span> 26-forge-adapters.md moved</div><div> <span style="color:#95afb4">to-do → in-progress (you)</span></div><div><span style="color:#62828a">09:14:03</span> <span style="color:#62828a">sync</span> pushed 1 board commit to origin/main</div><div><span style="color:#62828a">09:14:33</span> <span style="color:#62828a">sync</span> pulled 2 commits from origin/main</div><div> <span style="color:#95afb4">(elena)</span></div><div><span style="color:#62828a">09:31:22</span> <span style="color:#62828a">agent</span> Wren finished 26-forge-adapters.md</div><div> <span style="color:#95afb4">— review branch task/26-forge-adapters</span></div><div><span style="color:#62828a">09:31:24</span> <span style="color:#56c2d8">move</span> 26-forge-adapters.md moved</div><div> <span style="color:#95afb4">in-progress → review (agent)</span></div><div><span style="color:#62828a">09:31:26</span> <span style="color:#62828a">agent</span> PR opened for 26-forge-adapters.md:</div><div> <span style="color:#95afb4">https://github.com/12vectors/bench/pull/31</span></div><div><span style="color:#62828a">09:32:31</span> <span style="color:#62828a">agent</span> CI on 26-forge-adapters.md's PR:</div><div> <span style="color:#a6c96f">all checks pass</span></div><div><span style="color:#e9f3f3;animation:blink 1.1s step-end infinite"></span></div></pre>
<div style="display:flex;align-items:center;gap:10px;padding:10px 14px;background:#0a161b;border-top:1px solid #1c343a">
<span style="font-family:'IBM Plex Mono',monospace;font-size:10.5px;color:#62828a">the browser gets these over SSE · no refresh</span>
</div>
</div>
</div>
</div>
</div>
<footer style="display:flex;align-items:center;gap:20px;padding:18px 26px;background:#12323b;color:#a9c4c9">
<span style="font-family:'Zilla Slab',Georgia,serif;font-size:15px;color:#eaf3f4;font-weight:600">bench</span>
<span style="font-family:'IBM Plex Mono',monospace;font-size:11px">a 12vectors product</span>
<span style="flex:1"></span>
<span style="font-family:'IBM Plex Mono',monospace;font-size:11px">edit this page on GitHub ↗</span>
</footer>
</div>
</div>
</div>
</section>
</x-dc>
<script type="text/x-dc" data-dc-script data-props="{&quot;showMarginalia&quot;:{&quot;editor&quot;:&quot;boolean&quot;,&quot;default&quot;:true,&quot;tsType&quot;:&quot;boolean&quot;,&quot;section&quot;:&quot;Tone&quot;},&quot;showTOC&quot;:{&quot;editor&quot;:&quot;boolean&quot;,&quot;default&quot;:true,&quot;tsType&quot;:&quot;boolean&quot;,&quot;section&quot;:&quot;Layout&quot;},&quot;feedbackTone&quot;:{&quot;editor&quot;:&quot;enum&quot;,&quot;options&quot;:[&quot;playful&quot;,&quot;plain&quot;],&quot;default&quot;:&quot;playful&quot;,&quot;tsType&quot;:&quot;string&quot;,&quot;section&quot;:&quot;Tone&quot;}}">
class Component extends DCLogic {
renderVals() {
const playful = (this.props.feedbackTone ?? "playful") === "playful";
return {
showMarginalia: this.props.showMarginalia ?? true,
showTOC: this.props.showTOC ?? true,
feedbackAsk: playful ? "Did this page save you a trip to AGENTS.md?" : "Was this page helpful?",
feedbackYes: playful ? "it did" : "Yes",
feedbackNo: playful ? "no, and I'm mildly annoyed" : "No"
};
}
}
</script>
</body>
</html>