Multi-agent swarm orchestration harness
Project description
boring-swarm
Self-contained multi-agent swarm orchestration. One binary (bsw), one declarative flow.toml, and default worker prompts.
Swarm Concept
bsw runs a bead-native software factory in tmux.
- Work unit: a bead (
brissue) with labels likeneeds-impl,needs-proof,needs-review. - Orchestrator:
bswdaemon/robot, which assigns beads, enforces transitions, and manages worker lifecycle. - Workers: dedicated panes per role (
implement,proof,review, optionalcommitter,plan-review). - Source of truth: bead state and comments (
STATE ...), plus your local.bsw/flow.toml.
Each worker is single-purpose. A worker does not switch roles.
Actors
implement: writes code/docs for assigned bead only.proof: executes gates and evidence checks; does not implement.review: validates correctness/scope against bead acceptance criteria.committer(optional): async commit/push worker triggered by configured workflow events.plan-review(optional): runs after bead lane is exhausted to close or regenerate follow-up work.
Quality Gates
Default quality model is strict lane progression:
- Gate 1: implementation complete (
STATE impl:done) moves bead to proof. - Gate 2: proof pass/fail (
STATE proof:passed|failed) moves bead to review or back to implement. - Gate 3: review pass/fail (
STATE review:passed|failed) closes bead or sends it back to implement.
The gate semantics are encoded in flow.toml transitions/actions, not hardcoded in prompts.
Standard Flow
Default lane:
needs-impl -> needs-proof -> needs-review -> closed
On rejection:
proof failed -> back to needs-impl
review failed -> back to needs-impl
When no active bead work remains, optional plan-review can run and optionally stop daemon per flow policy.
Install
uv tool install boring-swarm
Or with pip/pipx:
pipx install boring-swarm
Quick Start
bsw init
bsw doctor
bsw spawn
bsw robot
bsw doctorvalidates deps + local flow/prompt files.bsw robotruns hardened hybrid scheduling for autonomous operation.
Get Started (With Screenshots)
1) Initialize swarm files in your project
cd /path/to/your-project
bsw init
bsw doctor
This creates:
.bsw/config.json.bsw/flow.toml.bsw/prompts/*.md
2) Spawn tmux worker panes
bsw spawn
bsw sessions
This starts role-specific panes (implement, proof, review, committer, plan-review) and applies profile colors.
3) Start autonomous orchestration (robot mode)
bsw robot
robot runs hybrid scheduling with event + fallback ticks. It auto-assigns beads, nudges waiting workers, and can recycle unhealthy panes.
4) Open the TUI dashboard
bsw tui
Use the TUI for:
- system status and queue health
- live pane/session states
- bead lifecycle/timeline view
- tick log inspection
5) Customize workflow behavior
Edit .bsw/flow.toml to change:
- states and transitions
- worker counts per role
- provider/model/effort
- lifecycle policy (
max_idle,max_lifetime,max_busy_without_progress) - role colors (
color_bg,color_fg,tmux_bg,tmux_fg)
DSL reference: docs/FLOW_DSL.md
Structure
boring-swarm/
├── cli/bsw/ # Go source — compiled into platform wheels via go-to-wheel
├── defaults/
│ ├── prompts/
│ │ ├── impl_worker.md
│ │ ├── impl_proofer.md
│ │ ├── impl_reviewer.md
│ │ ├── impl_committer.md
│ │ └── plan_reviewer.md
│ └── flow.toml # Default state machine definition
└── deps.toml # External dependency declarations
Dependencies
External — installed separately:
| Dep | Role |
|---|---|
| br | Work item CRUD (beads) |
| bv | Verification / robot ops |
| ntm | Tmux session + pane management |
| agent-mail | Inter-agent messaging (MCP) |
Prompt resolution
bsw init materializes local files:
.bsw/flow.toml.bsw/prompts/*.md
After init, runtime reads only local .bsw/* files. Users can fully overwrite flow.toml.
Flow DSL
- Full DSL reference:
docs/FLOW_DSL.md - Default example:
defaults/flow.toml
Build wheels locally
Requires Go 1.24+ and go-to-wheel:
pip install go-to-wheel
go-to-wheel cli/bsw --name boring-swarm --version 0.1.0 --entry-point bsw
Wheels are built automatically on GitHub release via CI.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file boring_swarm-0.1.2-py3-none-win_arm64.whl.
File metadata
- Download URL: boring_swarm-0.1.2-py3-none-win_arm64.whl
- Upload date:
- Size: 7.7 MB
- Tags: Python 3, Windows ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c557460d4daf89d4d303ae9d8e9da178e87fb7e80baeceed05850979ba993d2b
|
|
| MD5 |
3feac046d23a7e9e46a14629b9ffefc7
|
|
| BLAKE2b-256 |
9ca8511c3d43bf5257d52a3d95daf8348bce11b9b932527e207a8d91780e9f11
|
File details
Details for the file boring_swarm-0.1.2-py3-none-win_amd64.whl.
File metadata
- Download URL: boring_swarm-0.1.2-py3-none-win_amd64.whl
- Upload date:
- Size: 8.3 MB
- Tags: Python 3, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
653c063c6f0400014799fdcf9ec2d009bdf315d98ec28aa97fce272374593d90
|
|
| MD5 |
5e0d57a159d5d205ddc3bea219371388
|
|
| BLAKE2b-256 |
4156944a79c97c1f0690991425788e4febce140645610610f075c7c770bb3a74
|
File details
Details for the file boring_swarm-0.1.2-py3-none-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: boring_swarm-0.1.2-py3-none-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 8.0 MB
- Tags: Python 3, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6c1bb7050f2c35f8260798c095042c0a5740c9938e68722f73019444c0dcb1ef
|
|
| MD5 |
cf1b1127f926a7fcd3daba6bd1bb6ae2
|
|
| BLAKE2b-256 |
7fef04b6498fd6e98af05c069c2be949005c7ea2f83296781a604184aeece107
|
File details
Details for the file boring_swarm-0.1.2-py3-none-musllinux_1_2_aarch64.whl.
File metadata
- Download URL: boring_swarm-0.1.2-py3-none-musllinux_1_2_aarch64.whl
- Upload date:
- Size: 7.5 MB
- Tags: Python 3, musllinux: musl 1.2+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4d88ad5fa75a8e065319ac2c52bf1464c173f658b2c2b7aeda844b1e7bac0cea
|
|
| MD5 |
be545dcf7092c40ec876c79fe35b26df
|
|
| BLAKE2b-256 |
bb63f308eea3da93c3182c73e323c9634c37538a68fb7edbc724137049e2240b
|
File details
Details for the file boring_swarm-0.1.2-py3-none-manylinux_2_17_x86_64.whl.
File metadata
- Download URL: boring_swarm-0.1.2-py3-none-manylinux_2_17_x86_64.whl
- Upload date:
- Size: 8.0 MB
- Tags: Python 3, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e92a01d6f4a5d9717fb65b54c22b713359ba376da351b6038767749852db0824
|
|
| MD5 |
28cd7970e545cf51243eff16a647664c
|
|
| BLAKE2b-256 |
c1c5e2b97dba8dc0d1cef23b5980a02ef5a033eab657393f315a7d0368225169
|
File details
Details for the file boring_swarm-0.1.2-py3-none-manylinux_2_17_aarch64.whl.
File metadata
- Download URL: boring_swarm-0.1.2-py3-none-manylinux_2_17_aarch64.whl
- Upload date:
- Size: 7.5 MB
- Tags: Python 3, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
313526f566de666e62ed56e80a7e98a3864cf3ba8b595649df7f85669183917d
|
|
| MD5 |
416e341d9140ee9dcba28b360acf2da5
|
|
| BLAKE2b-256 |
2f8925ba72b2abbb7391cc52857ac2ce58546e05d929b4dda0de3c44d3a64191
|
File details
Details for the file boring_swarm-0.1.2-py3-none-macosx_11_0_arm64.whl.
File metadata
- Download URL: boring_swarm-0.1.2-py3-none-macosx_11_0_arm64.whl
- Upload date:
- Size: 7.7 MB
- Tags: Python 3, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
25dee4036e715673a0fc07f273c9a6c4cc06f4d92b5203ae4bc985449a7e2eb5
|
|
| MD5 |
a50a8287d2b55422008ce2ef80ef09d7
|
|
| BLAKE2b-256 |
595bae59fbff7b5fa57e53b99de6cf829848f0954df15a4756660e31752ab36b
|
File details
Details for the file boring_swarm-0.1.2-py3-none-macosx_10_9_x86_64.whl.
File metadata
- Download URL: boring_swarm-0.1.2-py3-none-macosx_10_9_x86_64.whl
- Upload date:
- Size: 8.2 MB
- Tags: Python 3, macOS 10.9+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aacf8c51db3a67e116b43fe181f7e00b810232c3d42bd098873bc84a22b12e73
|
|
| MD5 |
611223746ae78242c856a53007348c76
|
|
| BLAKE2b-256 |
7045b219ba2a4b34452d847ac8147f0e7fe9c167cc0163ca482f15629a24e70d
|