BeadBoard Driver
Overview
This skill is the operator runbook for agent execution in external repos with BeadBoard as control plane.
Core principle: explicit state + explicit assignment + explicit evidence.
What is BeadBoard
BeadBoard is a real-time dashboard for bd-backed agent work — it surfaces agent liveness, state transitions, swarm progress, and inter-agent mail in a live UI. The human uses the BeadBoard UI to observe and coordinate; agents use this skill to emit the signals (heartbeats, state transitions, mail) that drive what the dashboard displays.
Agents almost never work inside the BeadBoard repo. You work in your own project repo. bb and bd are globally available on PATH. Scripts used by this skill (preflight, mail shim, etc.) are bundled inside this skill folder — your agent runtime knows where this skill is installed and provides the path as {baseDir} (the directory containing this SKILL.md).
The Iron Law
No bead claims, handoffs, or completion statements without:
1) assignee set,
2) coordination checked,
3) evidence recorded.
Requirements
bdmust be installed and available onPATH.bborbeadboardmust be installed globally and available onPATH.- Work from the target repository root.
- Install
bd:npm install -g beads-cli - Install
bb: clone from GitHub and install globally — see Step 0 bootstrap for the exact commands
Session Runbook (Do Not Skip Steps)
Step 0: Read project.md — Cache-First Decision
ls project.md 2>/dev/null && echo "EXISTS" || echo "MISSING"
MISSING → you are the first agent in this project. Run the Bootstrap Checklist below, then return here.
EXISTS → read the Environment Status Cache table at the top of project.md.
- All rows
pass→ skip Step 1 entirely, go straight to Step 2. The environment is verified. - Any row
failorunknown→ run only that specific check (see Step 1), fix it, updateproject.md, continue.
project.mdis the token budget. Trust it when it's green. Only spend checks on what's actually broken.
Bootstrap Checklist
{baseDir}is the absolute path to the directory containing this SKILL.md, injected automatically by your agent runtime (Claude Code, Codex, etc.). If your runtime does not auto-substitute it, find the skill installation path and substitute the absolute path manually.
Run once, in order, when project.md is missing.
A. Check bd (beads-cli)
which bd 2>/dev/null || where bd 2>/dev/null
If missing:
npm install -g beads-cli
B. Initialize beads database (if not already present)
ls .beads 2>/dev/null && echo "EXISTS — skip" || bd init
Required before any bd config commands. Skip if .beads already exists.
C. Check bb (BeadBoard)
which bb 2>/dev/null || where bb 2>/dev/null
If missing — bb is required for coordination. Ask the user:
"BeadBoard is not installed. It is required for agent coordination. Would you like me to install it now? I'll clone the repo and install it globally."
If the user agrees:
git clone https://github.com/zenchantlive/beadboard.git ~/beadboard
cd ~/beadboard && npm install && npm install -g .
D. Configure mail delegate
node {baseDir}/scripts/setup-mail-delegate.mjs
Self-resolves the shim absolute path and runs bd config set mail.delegate automatically.
E. Run session preflight
node {baseDir}/scripts/session-preflight.mjs
Must pass before continuing. Checks bd, bb, and confirms delegate is set.
F. Create project.md
cp {baseDir}/project.template.md ./project.md
Fill in every field in the Environment Status Cache table and Project Identity section. Set each verified row to pass with today's date. This is what saves the next agent from re-running all of the above.
Append to the Session Log:
| YYYY-MM-DD | `<your-agent-bead-id>` | Initial project.md created, all checks pass |
Step 1: Environment Check (Skip If project.md All Green)
Only run this step if project.md has a fail or unknown row.
Run only the failing check:
| Row failed | Command to fix |
|---|---|
bd on PATH | npm install -g beads-cli |
bb on PATH | clone + npm install -g . (see Bootstrap C) |
.beads db | bd init (see Bootstrap B) |
mail.delegate | node {baseDir}/scripts/setup-mail-delegate.mjs |
session-preflight | node {baseDir}/scripts/session-preflight.mjs — fix what it reports |
{baseDir} is the directory containing this SKILL.md. Your agent runtime substitutes it automatically.
After fixing: update that row in project.md to pass with today's date.
See Platform Notes if running on Windows native or WSL2.
Step 2: Create Agent Bead Identity + Verify Mail
bd create --title="Agent: bb-<role-name>" --description="<scope>" --type=task --priority=0 --label="gt:agent,role:<orchestrator|ui|graph|backend|infra>"
# Register in bb coordination system and set identity
bb agent register --name <role-name> --role <orchestrator|ui|graph|backend|infra>
export BB_AGENT=<role-name>
Naming convention: Name your
bdbeadbb-<role-name>(e.g.bb-silver-scribe). Register the same name inbbas<role-name>(e.g.silver-scribe). SetBB_AGENT=<role-name>. This bridges both identity systems:bd agent state bb-silver-scribe ...uses the bead ID;bd mail sendusesBB_AGENTautomatically.
| Term | Example | Used where |
|---|---|---|
<role-name> | silver-scribe | bb agent register --name, BB_AGENT, bd mail --to |
| Bead title | bb-silver-scribe | bd create --title |
<agent-bead-id> | beadboard-0m9 | bd agent state, bd slot set, bd update --assignee |
BB_AGENT value | silver-scribe | Set via export; auto-injected into all bd mail calls |
Now that BB_AGENT is set, verify the full mail stack:
node {baseDir}/scripts/ensure-bb-mail-configured.mjs
Expected: ok: true with matching delegate and actor. If it fails, see Failure Modes.
Check inbox before proceeding:
bd mail inbox
Read and ack any pending messages before claiming work. Unacked HANDOFF or DECISION messages may affect your tasks downstream.
Then set lifecycle state:
bd agent state <agent-bead-id> spawning
bd agent state <agent-bead-id> running
Step 3: Note Any Environment Changes in project.md
project.md was already read in Step 0. Only update it now if something changed this session — new package installed, delegate reconfigured, new platform quirk discovered. If nothing changed, skip this step entirely.
If you fixed a fail/unknown row in Step 1, update that row to pass with today's date now.
Step 4: Read Hard Memory and Task Context
# Select your primary domain first:
# memory-arch | memory-workflow | memory-agent | memory-ux | memory-reliability
bd query "label=memory AND label=mem-canonical AND label=<domain> AND status=closed" --sort updated --reverse
bd ready
bd show <target-bead-id>
Pick the domain matching your task:
memory-arch(architecture decisions),memory-workflow(session protocol),memory-agent(agent setup/identity),memory-ux(UI/UX),memory-reliability(errors/recovery). Domain anchor IDs are inreferences/memory-system.md.
bd readylists all unblocked, unassigned tasks ready for pickup. Review the output and select a<target-bead-id>to pass tobd show.
Minimum: read task contract, dependencies, success criteria, and blockers.
Step 5: Claim Work with Assignee + Hook Slot
bd update <target-bead-id> --status in_progress --assignee <agent-bead-id>
bd slot set <agent-bead-id> hook <target-bead-id>
bd agent state <agent-bead-id> working
Never use --claim. Use explicit --assignee.
Step 6: Execute + Heartbeat + Coordinate via Mail
During execution:
bd agent heartbeat <agent-bead-id>
LLM agents (Claude Code): Heartbeat at turn start and immediately before long-running commands (builds, tests). Inter-turn silence is expected — do not treat it as a health failure. The every-5-minutes cadence applies to persistent daemon-backed agents only.
Note: The Witness enforcement layer that automatically marks agents
deadon missed heartbeats is not yet running. Heartbeats are recorded and visible in the BeadBoard dashboard but not currently enforced. Daemon implementation is a future epic.
Coordinate through delegated mail:
bd mailvsbb agent:bd mail inbox/send/read/ackare thin wrappers that delegate tobb agent inbox/send/read/ackvia the configured shim, injectingBB_AGENTas your sender identity automatically. Always usebd mailin this skill. Rawbb agentcommands appear in some reference docs as lower-level equivalents — use them only when the shim is not configured or for directbb-level debugging.
bd mail inbox
bd mail send --to <agent-or-role> --bead <bead-id> --category <HANDOFF|BLOCKED|DECISION|INFO> --subject "<short>" --body "<details>"
bd mail read <message-id>
bd mail ack <message-id>
When blocked:
- send
BLOCKED - set
bd agent state <agent-bead-id> stuck - resume only after intervention/response
See
references/coordination-system.md→ Inbox Polling Protocol for minimum polling moments and cadence.
Step 7: Verification Gates (Code Changes)
npm run typecheck
npm run lint
npm run test
Do not claim fixed/done without fresh command output from this session.
Step 8: Publish Evidence, Close, and Update Cache
bd update <target-bead-id> --notes "<commands run + key outputs + files changed>"
bd close <target-bead-id> --reason "<what was completed>"
bd slot clear <agent-bead-id> hook
bd agent state <agent-bead-id> done
Update project.md Environment Status Cache:
- If you ran tests: set
Tests last runrow topass/fail+ today's date - If you ran preflight: update
session-preflightrow - If you ran
bb agent registerthis session: updatebb agent registeredrow topass | BB_AGENT=<name>+ today's date - Append one line to the Session Log:
| YYYY-MM-DD | <agent-bead-id> | <what you verified/changed> |
This update is what saves the next agent from re-running your checks.
Step 9: Memory Review
If reusable lesson exists:
- create/supersede canonical memory decision bead
If no reusable lesson:
- record:
Memory review: no new reusable memory.
Red Flags
Stop and correct if you are about to:
- close without
--assigneehistory - skip
bd mailchecks at session start/claim/close - claim completion without gate output
- write project context inside skill folder instead of repo
project.md - use deprecated direct command patterns from old docs
Use-The-Right-Doc Map
references/session-lifecycle.md: Full end-to-end session choreography.references/agent-state-liveness.md: Agent states, heartbeat cadence, liveness interpretation.references/coordination-system.md: Canonical bb-mail command surface and category semantics.references/coord-events-sessions-ack.md: Trigger map, inbox polling protocol, blocked-to-resume walkthrough.references/command-matrix.md: Exact command inventory for day-to-day operation.references/failure-modes.md: Deterministic diagnosis and recovery paths.references/memory-system.md: Memory anchors, injection protocol, promotion/supersede rules.references/archetypes-templates-swarms.md: Swarm composition, molecule operations, worker dispatch patterns.references/missions-realtime.md: Real-time/watcher/event troubleshooting.references/creating-beads.md: Creating epics, tasks, subtasks with proper naming, dependencies, and workflow.
Bottom Line
If you follow this runbook exactly, any agent can enter cold, coordinate safely, and deliver auditable completion without drift.
Platform Notes
Environment Variable Syntax
| Shell | Command |
|---|---|
| bash / zsh (WSL2, Linux, macOS) | export BB_AGENT=<name> |
| PowerShell (Windows native) | $env:BB_AGENT = "<name>" |
| cmd.exe (Windows native) | set BB_AGENT=<name> |
Mail Delegate Path Format
When configuring bd config set mail.delegate "node <path>/bb-mail-shim.mjs":
| Environment | Path format example |
|---|---|
| WSL2 | node /home/<you>/<project-path>/skills/beadboard-driver/scripts/bb-mail-shim.mjs |
| Windows native | node C:\Users\<you>\<project-path>\skills\beadboard-driver\scripts\bb-mail-shim.mjs |
Binary Detection
The preflight script checks bd and bb are on PATH. On native Windows, the system uses where instead of which. If preflight reports a binary as missing despite it being installed, run where bd and where bb from your shell to verify, and ensure you are running from a shell where PATH is correctly populated.