npx skills add ...
npx skills add boshu2/agentops --skill beads
Local-first issue tracker (beads_rust) for AI agents. Use when tracking tasks, managing dependencies, finding ready work, or syncing issues to git via JSONL. Triggers: "beads-br", "beads br", "local-first issue tracker beads rust".
npx skills add boshu2/agentops --skill beads
Non-invasive: br NEVER runs git commands. Sync and commit are YOUR responsibility.
| Rule | Why |
|---|---|
ALWAYS use --json | Structured output for parsing |
NEVER run bare bv | Blocks session in TUI mode |
| Sync is EXPLICIT | BEADS_DIR="$(ao beads dir)" br sync --flush-only after changes |
| Git is YOUR job | br never runs git; _beads/ sync is explicit |
| No cycles allowed | br dep cycles must return empty |
Some repos declare a private bead ledger separated from the public source tree. The agentops repo is the canonical case; an agent that loads only this skill (without the repo CLAUDE.md) must still honor these invariants:
| Invariant | Rule |
|---|---|
| Indirection | Resolve first with ao beads dir, then invoke as BEADS_DIR="$(ao beads dir)" br <cmd>. A worktree-local ledger path is valid only in the canonical checkout; linked worktrees use git's common dir to reach the canonical private ledger. |
| Private repo | _beads/ is its own git repository (separate remote). Sync = git -C "$(ao beads dir)" push. |
| Never leak | never stage the private ledger from the host repo — bead bodies carry private context; the host repo is public and gitignores the ledger. |
| bd is retired AS OUR TRACKER | because the bd/Dolt remote-server lane was retired (2026-06-11) — do not run bd in a br repo; it appears only in explicitly-marked legacy notes. Gas City carve-out (age-gc-integrate-8aom.2): bd/dolt is gc's NATIVE city store and that is blessed — bd/gc bd inside a gc city dir (a dir with a GC_HOME/.gc/ or a gc-managed .beads/, e.g. ~/gc/*) is substrate operation, not a tracker violation. The seam: br = agentops ledger (git-JSONL); bd/dolt = gc city-internal store; outcomes cross one way via the read-only rollup (age-gc-adoption-u0he.6). Never point a gc city's bd at this repo's tracking, and never file agentops work in a city store. |
| Prefix filter | to prevent cross-project leakage in shared DBs, filter queries by the repo's issue prefix (e.g. ag-) before trusting br ready output. |
| Writes fail closed | because an empty/wrong BEADS_DIR makes br silently write a fallback tracker (age-gstf) — for create/update/close/dep use BEADS_DIR="$(ao beads dir --require)" && export BEADS_DIR && br <write-cmd>; --require refuses to print a path unless the directory holds a real ledger. |
This section is the persist_intent port contract: the skill that persists
intent owns the rules that keep that intent private and uncorrupted.
| Priority | Meaning |
|---|---|
| 0 | Critical |
| 1 | High |
| 2 | Medium (default) |
| 3 | Low |
| 4 | Backlog |
CRITICAL: Never run bare bv — it launches interactive TUI and blocks.
Use bead ID as thread_id for multi-agent coordination:
Absorbed from the retired beads-workflow skill (ag-ez7y6 consolidation) —
requests for /beads-workflow, "beads workflow", or "convert this markdown
plan into beads" route here.
Core Principle: "Check your beads N times, implement once" — where N is as many as you can stomach. Beads should be so detailed and polished that you can mechanically unleash a swarm of agents to implement them, and it will come out just about perfectly.
What this creates: tasks and subtasks with clear scope, dependency links (what blocks what), detailed descriptions with background/reasoning/ considerations — self-contained, so the original plan is never needed again.
All other exact prompts — the short conversion variant, the polish prompts, and the fresh-session re-establish-context sequence — live in PROMPTS.md [blocked]. What a well-formed bead looks like (required elements, description guidelines, anti-patterns) is BEAD-ANATOMY.md [blocked].
Operating in "plan space" is far cheaper than correcting in implementation space — that is the rationale for the whole loop:
br/bv, then resume polishing. Exact prompts in PROMPTS.md [blocked].Before implementation, verify each bead:
br dep cycles returns emptyYour beads are ready for implementation when:
br dep cycles returns emptybd itself is retired as THIS repo's tracker — never run it here (see the
persist_intent invariants above; gc city dirs are the blessed exception — bd
is gc's native store). Use this checklist only when scrubbing legacy bd
references from AGENTS.md or other docs:
Behavioral difference (only one): br sync never runs git commands. After BEADS_DIR="$(ao beads dir)" br sync --flush-only, you must commit and push the private ledger with git -C "$(ao beads dir)" add -A, git -C "$(ao beads dir)" commit, and git -C "$(ao beads dir)" push.
Transform checklist (order matters):
bd commands → br commandsbd sync → BEADS_DIR="$(ao beads dir)" br sync --flush-only + git -C "$(ao beads dir)" add -A + git -C "$(ao beads dir)" commitbd-* → br-* — the prefix is configurable (often remains bd-*).Verify:
Folded from the retired beads umbrella and beads-workflow lifecycle cards
(ag-ez7y6) — operating doctrine, not the command surface above. These keep the
tracker graph honest across sessions:
BEADS_DIR="$(ao beads dir)" br show / ready / list
output as the source of truth for current tracker state. Do NOT treat the
exported issues.jsonl as the primary decision source when live br data is
available — the JSONL is a git-friendly export artifact, refreshed on
BEADS_DIR="$(ao beads dir)" br sync --flush-only.br close <id> --reason must name the
touched files (or explicit no-file evidence artifact), the validation
command(s) run, and the parent-reconciliation outcome. Never close a child
bead with a generic reason like "done" or "implemented".BEADS_DIR="$(ao beads dir)" br ready --json surfaces a
broad umbrella bead, do not implement against vague parent wording — first
narrow the remaining gap into an execution-ready child bead, land the child,
then reconcile the parent.br show <id> — check
assignee/status). A race-claim on an already-claimed bead creates two workers
on the same task — one of them will silently lose work. The ledger is the
lock: if the bead is claimed, coordinate via Agent Mail (use the bead ID as
the thread ID and reservation reason); do not dispatch a second worker.br close without a merge is a protection-off state —
the work will recur as an incident (it did, 2026-06-09). For
assurance-close contexts the gate cp-hxp6 enforces this; for other contexts,
apply it as a practice: confirm git log --oneline origin/main includes the
commit SHA before closing.br close <id> --reason "Residual → <new-id>".
Close-with-residual is honest; a zombie parent that never closes is the
failure mode.br update <id> --notes is an
append operation — it adds to the notes, it does NOT replace existing
notes. When adding a progress note, pass only the new content; the flag
accumulates. A --notes call that silently replaces prior notes erases
audit history — the same silent-destruction class as the close-eater
(cp-8720) and the split-brain (cp-4gkz).br sync without --flush-only or --import-onlybvWorktree error ('main' is already checked out):
| Topic | File |
|---|---|
| Full command reference | COMMANDS.md [blocked] |
| Configuration details | CONFIG.md [blocked] |
| Troubleshooting guide | TROUBLESHOOTING.md [blocked] |
| Multi-agent patterns | INTEGRATION.md [blocked] |
| Conversion/polish/fresh-session prompts | PROMPTS.md [blocked] |
| Bead structure (well-formed bead anatomy) | BEAD-ANATOMY.md [blocked] |