A one-file coordination board so your parallel AI coding sessions don't collide.
ไธๅ็ดๆๅญ็ๆฟ๏ผ่ฎไฝ ๅๆ้็ๅคๅ AI ๅฐ่ฉฑ่ฆ็ช / worktree ไธๆไบ็ธๆๆถใ
When you code with AI agents, you naturally open several chat windows at once โ one refactoring checkout, one editing the admin page, one writing docs. Every AI session is amnesiac: it has no idea what the other windows are touching. So they collide on the same file, redo each other's work, or break something the other depended on.
agent-work-board is a sticky note on the wall: who is doing what, how far along, and which files they'll touch. Glance before you start, claim before you act, and you stop crashing into yourself.
It's deliberately tiny: one Markdown file + one optional script + one line in your agent's rules. No service, no database, no lock server.
Window A WORK-BOARD.md Window B
(checkout) (shared, lives in git) (admin)
โ โ โ
โ 1. scan โโโโโโโโโโโโโโโโถโ CHECKOUT: free โ
โ 2. add claim row โโโโโโโถโ CHECKOUT โ A ๐ โ
โ 3. push immediately โโโโถโ (git = the lock) โ
โ โโโโโโโโโโโโโโโโโ scan 1. โ
โ โ ADMIN: free โ
โ โ sees A on CHECKOUT โโโโโโถ โ no clash โ
โ โ โ claims ADMIN
โผ โผ โผ
edits useCheckout one source of truth edits pages/admin
+ orders table everyone reads first (knows to avoid checkout)
Window C wants checkout too:
scan โโโถ board shows "CHECKOUT โ A ๐, refactoring"
โโถ C does NOT barge in. Picks other work / waits / coordinates.
โ
collision avoided BEFORE editing โ not at merge time.
Tools like Claude Code's TodoWrite track steps within one session โ in-memory, gone when the session ends, invisible to your other windows. That's a different layer:
| Built-in todo (e.g. TodoWrite) | agent-work-board | |
|---|---|---|
| Scope | within one session | across sessions / windows |
| Lifetime | gone when the session ends | committed to git, permanent |
| Shared? | only the current window sees it | everyone / every window shares one |
| Answers | "what are my next steps here" | "which area/task is claimed by whom" |
They stack: each session uses its todo list internally, while the board coordinates between sessions. No conflict โ the board fills the gap the harness leaves open.
The board is not another mechanism competing with your agent runtime. It sits above all of them. Everything below works within one orchestrated run; the board works across the runs you launched by hand.
| Tool | Layer | The board's relation |
|---|---|---|
| subagents / Agent tool / Workflows | intra-run (one orchestrator fans out helpers) | orthogonal โ the board coordinates the separate runs you started, which no single orchestrator sees |
| git worktrees | filesystem isolation | complements โ worktrees stop file clobber; the board stops whom-does-what clobber (two windows both deciding to refactor checkout) |
| native task / agent-team features | intra-run step tracking | same as the built-in todo above: within-session, invisible to your other windows |
| file-lock + handoff tools (e.g. mclaude) | mechanism (atomic locks, handoff notes) | the board is convention-only (git is the lock) and adds the two things a lock doesn't: a territory map and footprint awareness |
Two genuine differentiators โ neither the native harness nor a lock tool gives you these:
- A territory map (WHERE). The repo is pre-split into 5โ8 named areas; a claim reads "I'm in CHECKOUT", not "I locked 12 files". Humans coordinate on areas, not file lists.
- Footprint awareness (WHAT KIND). Before you parallelize, classify the shared state you're about to write: a disjoint leaf / a hot shared file / a discrete allocator (e.g. migration numbers) / a singleton mutable service (including the working copy's own git
HEADโ one checkout, many windows; territory can't see it) / a function others depend on. Each class has a different safe move โ not every same-area overlap is equally dangerous. (Seedocs/methodology.md.)
Run one window and you need none of this. Run two, and the harness coordinates inside each while nothing coordinates between them. That gap is the board.
- Copy the board file into your repo at a fixed path on your main branch:
cp WORK-BOARD.template.md WORK-BOARD.md
- Draw your area map โ split the project into 5โ8 areas, each with its main files (see the template). This is the one step worth real thought.
- Wire it into your agent's opening ritual so it actually gets read (see
ritual-snippets.md). Without this, the board is dead โ nobody remembers to look. - (optional) Add the git-truth script for branch status + a non-blocking push reminder:
The package also ships a
npm run board # print branch status (last commit, ahead/behind, claimed?)board-statusbin entry, so if it's installed as a dependency you can callnpx board-statusdirectly โ no npm script needed.
That's it. Start small (just the "In progress" table + the ritual); grow the area map and scripts only when collisions actually start happening.
โ Before you start (3 steps)
- Check the area map + ๐ต In progress โ confirm nobody is in your area.
- Add a row to "In progress": area / task / branch / start date / last updated / one-line note.
- Commit + push that claim immediately (not when you finish) โ then start.
Why push the claim right away (the "grab the lock" rule): between "check nobody's there" and "add a row" there's a gap โ two sessions can both read empty and claim the same area (a race). Pushing the row instantly uses git as the lock: whoever pushes first wins; the second push fails and is forced to rebase, discovering the collision at claim time instead of at merge time.
โก While working
- On each meaningful step, update your own row's "last updated" + note "where I am / what I'm stuck on".
โ ๏ธ Edit only your own row. The board is a single file everyone writes to โ it's its own merge-conflict hotspot. Touch only your row.
โข Done
- Move the row to โ Recently done with a commit SHA / PR link.
โฃ Stale-claim recovery
- A row not updated for N days (default 7) = that session probably died.
- Judge staleness by the branch's last-commit time, not the board edit time (
npm run boardflagsโ stale). โ ๏ธ Before reclaiming, re-verify on the spot withgit log -1 <branch>. Never trust the old snapshot โ it may be wrong and you'll delete an active branch.- Only reclaim if the branch truly has no new commits; note "reclaimed from stale".
โค Claim gate (conditional)
- A pre-push hook runs
node scripts/board-status.mjs --hook. It is conditional on whether other sessions are active:- Solo (no other feature branch committed in the last 24h): pushing an unclaimed feature branch prints one reminder line โ never blocks.
- Parallel (another feature branch active in the last 24h): pushing an unclaimed feature branch is blocked (exit 1) until you add a claim row to the board. Pushing straight to the base branch is never hard-blocked (it warns when parallel).
- Fail-open: any script error lets the push through. Emergency bypass:
git push --no-verify. - Why conditional: a hard block on every solo push is pure friction; the block only earns its keep when a second session is genuinely running in parallel โ the case where an unclaimed branch actually causes a collision.
The board holds one kind of thing: live work state ("who's doing what right now"). Everything else has its own home โ don't merge them, or it rots into an unmaintained dump:
| Doc | Holds | Trait |
|---|---|---|
| WORK-BOARD (this) | live work state | changes constantly |
| FEATURE-BACKLOG | future ideas | slow accretion |
| TECH-DEBT | known debt | slow accretion |
| handoff | one-shot "pass to next session" note | use-once |
| agent memory | permanent facts (who you are, design intent) | rarely changes |
Why progress must NOT go in agent memory: memory auto-loads every session โ putting "task 60% done" there bloats context and goes stale fast. Memory = things that never change; the board = the thing that does.
If the board lives on your production branch and your CI builds on every push to it, then every claim = a push = a build โ even though a plain-text board change can't affect build output, it still burns build minutes (e.g. Netlify's free monthly cap).
Two fixes:
[skip ci]in the board commit message (Netlify and most CIs skip the build), or- a path filter so only real frontend changes trigger a build, e.g. Netlify:
[build] ignore = "git diff --quiet $CACHED_COMMIT_REF $COMMIT_REF -- ."
Sort this out before adopting the board, or you'll mysteriously burn deploy quota.
It has a maintenance cost โ not every project should adopt it. Skip it if you only ever run one window, work linearly, or it's a tiny solo project you hold in your head. Adopt it when you start running 2+ windows / worktrees on the same repo in parallel, or have ever hit "we both edited the same file" / "we both did the same thing".
- Single-machine, multi-clone blindness. The board only sees what gets pushed to the shared remote. Two clones of the same repo that never push to each other (or a session that forgets to push its claim) are invisible to each other โ the board is convention-on-top-of-git, not a live lock server.
- Solo compliance in practice is low. Reported real-world use: when a session runs alone for a stretch, the "add a row before you start" step tends to get skipped โ nothing forces it in the solo case by design (ยงโค only hard-blocks when a second session is genuinely active). That's a deliberate low-friction tradeoff, not a bug, but it means the board's actual collision coverage depends on how consistently claims get made, not just on the gate existing.
- Not published to npm. There is no
npm install agent-work-board/npx agent-work-boardtoday โ install via manual clone (git clone https://github.com/dragon375014/agent-work-board) and copy in the files you need (see Quick start). Thebinentry inpackage.jsonis prepared for a future publish, not evidence one has happened.
This board is the coordination layer of a five-public-repo AI-dev toolchain by dragon375014 โ one-command install: npx specmit init.
Full topology, routing rules, and canonical skill ownership โ specmit/ECOSYSTEM.md
Siblings: spec-sonar ยท specmit ยท goal-workflow-designer ยท claude-skills-governance-meta โ spec-sonar turns ideas into specs and goal graphs, specmit executes those goals in parallel, and this board keeps the sessions running all of the above from colliding.
This is the entry-level coordination primitive. If you grow into a larger, more complex governance setup (single-source-of-truth registries, cross-layer trace locks, automated guard rules), this board is the on-ramp to that philosophy โ start here, graduate later.
- ๐ Full methodology (with a worked three-window walkthrough): English ยท ็น้ซไธญๆ
- ๐งฉ Opening-ritual snippets for CLAUDE.md / .cursorrules / generic agents:
ritual-snippets.md - ๐ Copy-paste board:
WORK-BOARD.template.md
I'm a solo dev running a coffee brand who taught myself to build this toolchain with AI. I write up the reasoning (and the scars) at coffeeshooters.com/content โ start with "I Built My AI Team a Blackboard โ How to Stop Parallel Claude Sessions From Colliding" (ไธญๆ็๏ผใๆๅนซๆ็ AI ๅ้ๅไบไธๅก้ปๆฟใ), the origin story of this exact board. Two-week newsletter, no spam โ subscribe on any article.
ไธไบบๅ็ๅต่พฆไบบ๏ผ็ฝๅคฉ็่ฑใๆไธ่ท AI ไธ่ตทๆ้ๅฅๅทฅๅ ท้็ๅบไพ๏ผ้็ผ้็จ้ฝๅฏซๆๆ็ซ ๆพๅจ coffeeshooters.com/contentใ
MIT โ see LICENSE. Use it anywhere, no attribution required.