The mental model in one breath
You've run pipelines like this with humans in every box. The difference to look for: every hand-off is a record, and nothing passes a gate on vibes.
Every repo is a hive — its own beads database, embedded as Dolt under the repo's gitignored .beads/. Issues carry a short, stable prefix(acme-api-1) derived from the stable part of identity (org + repo); the parts that can change (provider, org) live in labels. Issue history publishes torefs/dolt/data on the repo's own git remote — a separate ref namespace that never touches branches or PRs, so there is no server to run. A workspace-level aggregate (the hub, or its evolved form Factory HQ) pulls every hive into one view, so you can ask "what's ready to work on anywhere?"
bh is deliberately a thin orchestrator: bd (beads) owns issues,git owns history, git-workspace owns cloning. What bhadds is the process — bh work drives a bead through its lifecycle so agents never improvise raw git / gh pr for the lifecycle itself.
The tenets
⬢Planes, kept separate
Control governs the factory. Planning turns ideas into molecules.Integration executes them. Each plane has its own verbs and seats; they hand off sequentially and never step into each other's role. Assurance is the one exception — a cross-cutting gate layer, not a sequential plane.
⬢Merging is not releasing
Integration is high-frequency and dirty: each bead gets its own worktree and lands on an always-green line. Release is a separate, deliberate, gated act.
⬢Lossless history
Agents do the merging, so history is audited: merge --no-ff at the boundary, never squash there. Workers squash only their own local checkpoints into clean conventional digests before submit (tiered retention).
⬢Unit of work = a bead
Worktree → implement → refine → check → submit → review → merge. One bead, one branch (wt/bead/issue/<id>), one reviewable change.
Six phases, one ring — and one edge nobody closes
A car factory isn't successful because the car left the line — it's successful if the car survives the road. Software is no different: what happens in production is the only signal that says whether the last decision was any good, so it has to come back round to the next one.
Planning → dispatch → develop → review → merge
The full state machine, with its three feedback loops: the spike loop (settle feasibility before implementation beads exist), the bounce loop(review → changes-requested → resume), and the replan door (a mid-execution blocker re-enters planning). Hexagons are gates — nothing passes one without the right seat resolving it.
wt/bead/epic/<id>) so bead B sees bead A's merged work; the container lands on main only when the whole molecule is done — one recursive rule that scales to N tiers (issue → epic → workstream → main).What keeps the line green
- Serialized merges. Merge is a separate seat (the merger) gated by
bd merge-slot— parallel developers, one merge at a time. - The conflict ladder.
clean → rebased → union → bounce: try a clean--no-ff, then rebase-and-retry, then path-whitelisted union merge (append-only files only, re-validated), else bounce with the branch restored. No work is ever lost. - Validation modes. Every bead validates in isolation at submit;
relaxed/conservative/loosetune how often thecombination is re-tested. If a re-validation fails on a safe-to-rewrite branch, the tip is rolled back before anyone can observe it; a shared branch escalates for a forward fix instead. - The batch exception. Cohesive linear chains can run as one shared
wt/batch/<group>worktree, merged once — guarded by cohesion, a size cap of 5, one model tier, one review gate. A batch fails and bounces as a unit; per-bead commits stay bisectable inside the bubble.
bh plan file like any other molecule, so nothing skips the kickoff gate.Merge order is planned, not first-come-first-served
Landing approved beads in whatever order they clear review is fine until a molecule mixeskinds of change — a hotfix for the released version, additive features that should ship as one clean minor bump, and a breaking change that must not leak into a patch. Review order produces a history nobody can version cleanly. So a bead can carry its semantic-version impact, and the merge sequence is computed from it:
release:—breaking,featureorfix. A fixed vocabulary, identical in every hive, so the ordering means the same thing everywhere.wave:— a free-form label grouping additive features that should land together as one bump. Distinct from the worktree batching label.
The default strategy, stable-versioning, orders in four tiers: fixes for the released version flush first, up to a churn budget; then additive features, grouped by wave; then any fixes past that budget; then breaking changes last, so they never leak into a patch or minor window early. Both knobs are per-hive configuration (release.strategy, release.fix_churn_budget).
bh release order # the strategy-preferred merge sequence, read-onlyIt is advisory. It decides sequence and nothing else — it never claims, merges or mutates anything, and the scheduler consults the same scorer so dispatch and merge never disagree about the order. The one hard counterpart is opt-in per hive: withrelease.enforce_hold on, a release:breaking bead gets arelease-hold: gate that blocks its merge until a releaser resolves it — and only a releaser can.