Clarify convoy vs swarm terminology in docs and code

- Convoy: Persistent tracking unit for batched work across rigs
- Swarm: Ephemeral workers on a convoy (no separate tracking)

Changes:
- docs/convoy.md: New comprehensive convoy documentation
- docs/swarm.md: Updated to explain ephemeral nature
- docs/reference.md: Replace swarm section with convoy commands
- internal/cmd/convoy.go: Clarify help text
- internal/cmd/swarm.go: Mark as deprecated

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Steve Yegge
2025-12-30 18:55:24 -08:00
parent 3f653a3e9d
commit f8b030b7ca
6 changed files with 292 additions and 266 deletions

198
docs/convoy.md Normal file
View File

@@ -0,0 +1,198 @@
# Convoys
Convoys are the primary unit for tracking batched work across rigs.
## Concept
A **convoy** is a persistent tracking unit that monitors related issues across
multiple rigs. When you kick off work - even a single issue - a convoy tracks it
so you can see when it lands and what was included.
```
Convoy (hq-abc)
┌────────────┼────────────┐
│ │ │
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ gt-xyz │ │ gt-def │ │ bd-abc │
│ gastown │ │ gastown │ │ beads │
└────┬────┘ └────┬────┘ └────┬────┘
│ │ │
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ nux │ │ furiosa │ │ amber │
│(polecat)│ │(polecat)│ │(polecat)│
└─────────┘ └─────────┘ └─────────┘
"the swarm"
(ephemeral)
```
## Convoy vs Swarm
| Concept | Persistent? | ID | Description |
|---------|-------------|-----|-------------|
| **Convoy** | Yes | hq-* | Tracking unit. What you create, track, get notified about. |
| **Swarm** | No | None | Ephemeral. "The workers currently on this convoy's issues." |
When you "kick off a swarm", you're really:
1. Creating a convoy (the tracking unit)
2. Assigning polecats to the tracked issues
3. The "swarm" is just those polecats while they're working
When issues close, the convoy lands and notifies you. The swarm dissolves.
## Convoy Lifecycle
```
OPEN ──(all issues close)──► LANDED/CLOSED
↑ │
└──(add more issues)───────────┘
(auto-reopens)
```
| State | Description |
|-------|-------------|
| `open` | Active tracking, work in progress |
| `closed` | All tracked issues closed, notification sent |
Adding issues to a closed convoy reopens it automatically.
## Commands
### Create a Convoy
```bash
# Track multiple issues across rigs
gt convoy create "Deploy v2.0" gt-abc bd-xyz --notify gastown/joe
# Track a single issue (still creates convoy for dashboard visibility)
gt convoy create "Fix auth bug" gt-auth-fix
# With default notification (from config)
gt convoy create "Feature X" gt-a gt-b gt-c
```
### Add Issues
```bash
# Add to existing convoy
gt convoy add hq-abc gt-new-issue
# Adding to closed convoy reopens it
gt convoy add hq-abc gt-followup-fix
# → Convoy hq-abc reopened
```
### Check Status
```bash
# Show issues and active workers (the swarm)
gt convoy status hq-abc
# All active convoys (the dashboard)
gt convoy status
```
Example output:
```
Convoy: hq-abc (Deploy v2.0)
════════════════════════════
Progress: 3/5 complete
Issues
✓ gt-xyz: Update API closed
✓ bd-abc: Fix validation closed
→ bd-ghi: Update docs in_progress @beads/amber
○ gt-jkl: Deploy to prod blocked by bd-ghi
Workers (the swarm)
beads/amber bd-ghi running 12m
```
### List Convoys (Dashboard)
```bash
# Active convoys - the primary attention view
gt convoy list --active
# All convoys
gt convoy list
# JSON output
gt convoy list --json
```
## Notifications
When a convoy lands (all tracked issues closed), subscribers are notified:
```bash
# Explicit subscriber
gt convoy create "Feature X" gt-abc --notify gastown/joe
# Multiple subscribers
gt convoy create "Feature X" gt-abc --notify mayor/ --notify --human
```
Notification content:
```
📦 Convoy Landed: Deploy v2.0 (hq-abc)
Issues (3):
✓ gt-xyz: Update API endpoint
✓ gt-def: Add validation
✓ bd-abc: Update docs
Workers: gastown/nux, gastown/furiosa, beads/amber
Duration: 2h 15m
```
## Auto-Convoy on Sling
When you sling a single issue without an existing convoy:
```bash
gt sling bd-xyz beads/amber
```
This auto-creates a convoy so all work appears in the dashboard:
1. Creates convoy: "Work: bd-xyz"
2. Tracks the issue
3. Assigns the polecat
Even "swarm of one" gets convoy visibility.
## Cross-Rig Tracking
Convoys live in town-level beads (hq-* prefix) and can track issues from any rig:
```bash
# Track issues from multiple rigs
gt convoy create "Full-stack feature" \
gt-frontend-abc \
gt-backend-def \
bd-docs-xyz
```
The `tracks` relation is:
- **Non-blocking**: doesn't affect issue workflow
- **Additive**: can add issues anytime
- **Cross-rig**: convoy in hq-*, issues in gt-*, bd-*, etc.
## Convoy vs Rig Status
| View | Scope | Shows |
|------|-------|-------|
| `gt convoy status [id]` | Cross-rig | Issues tracked by convoy + workers |
| `gt rig status <rig>` | Single rig | All workers in rig + their convoy membership |
Use convoys for "what's the status of this batch of work?"
Use rig status for "what's everyone in this rig working on?"
## See Also
- [Propulsion Principle](propulsion-principle.md) - Worker execution model
- [Mail Protocol](mail-protocol.md) - Notification delivery

View File

@@ -220,18 +220,18 @@ gt sling <bead> <rig> # Assign to polecat
gt sling <bead> <rig> --molecule=<proto> gt sling <bead> <rig> --molecule=<proto>
``` ```
### Swarm Management ### Convoy Management (Work Tracking)
```bash ```bash
gt swarm create <rig> --epic <id> --worker <name> # Create swarm gt convoy create "name" [issues...] # Create convoy tracking issues
gt swarm create <rig> --epic <id> --worker <name> --start # Create and start gt convoy create "name" gt-a bd-b --notify mayor/ # With notification
gt swarm start <swarm-id> # Start a created swarm gt convoy add <convoy-id> <issue-id> # Add issue (reopens if closed)
gt swarm status <swarm-id> # Show swarm status gt convoy status [convoy-id] # Show progress + workers (the swarm)
gt swarm list [rig] # List swarms gt convoy list # Dashboard of active convoys
gt swarm dispatch <epic-id> # Assign next ready task to idle worker gt convoy list --active # Active only
gt swarm land <swarm-id> # Land completed swarm to main
gt swarm cancel <swarm-id> # Cancel active swarm
``` ```
Note: "Swarm" is ephemeral (workers on a convoy's issues). See [Convoys](convoy.md).
### Communication ### Communication
```bash ```bash
gt mail inbox gt mail inbox
@@ -334,4 +334,4 @@ bd mol bond mol-security-scan $PATROL_ID --var scope="$SCOPE"
**Nondeterministic idempotence**: Any worker can continue any molecule. Steps are atomic checkpoints in beads. **Nondeterministic idempotence**: Any worker can continue any molecule. Steps are atomic checkpoints in beads.
**Swarm coordination**: Swarms parallelize work across multiple polecats. Each swarm has an integration branch where completed tasks merge before landing to main. See [Swarms](swarm.md) for details. **Convoy tracking**: Convoys track batched work across rigs. A "swarm" is ephemeral - just the workers currently on a convoy's issues. See [Convoys](convoy.md) for details.

View File

@@ -1,231 +1,74 @@
# Swarms # Swarm (Ephemeral Worker View)
Swarms coordinate multiple polecats working on related tasks from a shared base commit. > **Note**: "Swarm" is an ephemeral concept, not a persistent entity.
> For tracking work, see [Convoys](convoy.md).
## Concept ## What is a Swarm?
A swarm is a coordinated multi-agent work unit. When you have an epic with multiple A **swarm** is simply "the workers currently assigned to a convoy's issues."
independent tasks, a swarm lets you: It has no separate ID and no persistent state - it's just a view of active workers.
1. **Parallelize** - Multiple polecats work simultaneously | Concept | Persistent? | ID | Description |
2. **Isolate** - Each worker branches from the same base commit |---------|-------------|-----|-------------|
3. **Integrate** - All work merges to an integration branch before landing | **Convoy** | Yes | hq-* | The tracking unit. What you create and track. |
4. **Coordinate** - Task dispatch respects dependencies | **Swarm** | No | None | The workers. Ephemeral view of who's working. |
## The Relationship
``` ```
epic (tasks) Convoy hq-abc ─────────tracks───────────► Issues
│ assigned to
┌────────────────────────────────────────────┐
SWARM Polecats
┌──────────┐ ┌──────────┐ ┌──────────┐
│ │ Polecat │ │ Polecat │ │ Polecat ────────┴────────
Toast │ │ Nux │ │ Capable "the swarm"
└────┬─────┘ └────┬─────┘ └────┬─────┘ │ (ephemeral)
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────────────────────────────────┐ │
│ │ integration/<epic> │ │
│ └───────────────────┬──────────────────┘ │
└──────────────────────┼────────────────────┘
▼ land
main
``` ```
## Swarm Lifecycle When you say "kick off a swarm," you're really:
1. Creating a convoy (persistent tracking)
2. Assigning polecats to the convoy's issues
3. The swarm = those polecats while they work
| State | Description | When the work completes, the convoy lands and the swarm dissolves.
|-------|-------------|
| `created` | Swarm set up, not yet started |
| `active` | Workers actively executing tasks |
| `merging` | All work done, integration in progress |
| `landed` | Successfully merged to main |
| `cancelled` | Swarm aborted |
| `failed` | Swarm failed and cannot recover |
## Commands ## Viewing the Swarm
### Create a Swarm The swarm appears in convoy status:
```bash ```bash
# Create swarm from existing epic gt convoy status hq-abc
gt swarm create greenplace --epic gp-abc --worker Toast --worker Nux
# Create and start immediately
gt swarm create greenplace --epic gp-abc --worker Toast --start
# Specify target branch (defaults to main)
gt swarm create greenplace --epic gp-abc --worker Toast --target develop
``` ```
The epic should already exist in beads with child tasks. The swarm will track ```
which tasks are ready, in-progress, and complete. Convoy: hq-abc (Deploy v2.0)
════════════════════════════
### Start a Swarm Progress: 2/3 complete
```bash Issues
# Start a previously created swarm ✓ gt-xyz: Update API closed
gt swarm start gp-abc → bd-ghi: Update docs in_progress @beads/amber
○ gt-jkl: Final review open
Workers (the swarm) ← this is the swarm
beads/amber bd-ghi running 12m
``` ```
This transitions the swarm from `created` to `active` and begins dispatching ## Historical Note
tasks to workers.
### Check Swarm Status Earlier Gas Town development used "swarm" as if it were a persistent entity
with its own lifecycle. The `gt swarm` commands were built on this model.
```bash The correct model is:
# Human-readable status - **Convoy** = the persistent tracking unit (what `gt swarm` was trying to be)
gt swarm status gp-abc - **Swarm** = ephemeral workers (no separate tracking needed)
# JSON output The `gt swarm` command is being deprecated in favor of `gt convoy`.
gt swarm status gp-abc --json
```
Shows:
- Swarm metadata (epic, rig, target branch)
- Ready front (tasks with no blockers)
- Active tasks (in-progress with assignees)
- Blocked tasks (waiting on dependencies)
- Completed tasks
### List Swarms
```bash
# All swarms across all rigs
gt swarm list
# Swarms in specific rig
gt swarm list greenplace
# Filter by status
gt swarm list --status=active
gt swarm list greenplace --status=landed
# JSON output
gt swarm list --json
```
### Dispatch Tasks
```bash
# Auto-dispatch next ready task to idle polecat
gt swarm dispatch gp-abc
# Dispatch in specific rig
gt swarm dispatch gp-abc --rig greenplace
```
Finds the first unassigned ready task and assigns it to an available polecat.
Uses `gt sling` internally.
### Land a Swarm
```bash
# Manually land completed swarm
gt swarm land gp-abc
```
This:
1. Verifies all tasks are complete
2. Stops any running polecat sessions
3. Audits git state (checks for uncommitted/unpushed code)
4. Merges integration branch to target (main)
5. Cleans up branches
6. Closes the epic in beads
**Note**: Normally the Refinery handles landing automatically.
### Cancel a Swarm
```bash
gt swarm cancel gp-abc
```
Marks the swarm as cancelled. Does not automatically stop sessions or clean up
branches - use `gt swarm land` for full cleanup if needed.
## How It Works
### Beads Integration
Swarms are built on beads molecules:
- The epic is marked as `mol_type=swarm`
- Tasks are child issues of the epic
- Task dependencies are beads dependencies
- State is queried from beads, not cached
### Task Flow
1. **Ready front**: Tasks with no uncompleted dependencies are "ready"
2. **Dispatch**: `gt swarm dispatch` or `gt sling` assigns ready tasks
3. **Execution**: Polecat works the task, commits, signals `gt done`
4. **Merge**: Refinery merges to integration branch
5. **Next**: When dependencies clear, new tasks become ready
### Integration Branch
Each swarm has an integration branch: `swarm/<epic-id>`
- Created from the base commit when swarm starts
- Each completed task merges here
- Avoids merge conflicts from landing directly to main
- Final landing merges integration → main
### Git Safety
Before landing, the swarm manager audits each worker's git state:
| Check | Risk |
|-------|------|
| Uncommitted changes | Code loss if not in .beads/ |
| Unpushed commits | Code not in remote |
| Stashes | Forgotten work |
If code is at risk, landing blocks and notifies Mayor.
## Swarm vs Single Assignment
| Scenario | Use |
|----------|-----|
| Single task, one polecat | `gt sling` |
| Multiple independent tasks | `gt swarm create` |
| Sequential dependent tasks | Molecule (not swarm) |
| Large feature with subtasks | Swarm with dependencies |
## Example Workflow
```bash
# 1. Create epic with tasks in beads
bd create --type=epic --title="Add authentication" --id gp-auth
bd create --title="Add login form" --parent gp-auth
bd create --title="Add session management" --parent gp-auth
bd create --title="Add logout flow" --parent gp-auth
# 2. Create swarm
gt swarm create greenplace --epic gp-auth --worker Toast --worker Nux --start
# 3. Monitor progress
gt swarm status gp-auth
# 4. Dispatch more as tasks complete
gt swarm dispatch gp-auth
# 5. Land when complete
gt swarm land gp-auth
```
## Troubleshooting
| Problem | Solution |
|---------|----------|
| "No ready tasks" | Check dependencies with `bd show <epic>` |
| "No idle polecats" | Create more with `gt polecat create` |
| "Code at risk" | Workers need to commit/push before landing |
| "Swarm not found" | Epic may not be marked `mol_type=swarm` |
## See Also ## See Also
- [Molecules](molecules.md) - Workflow templates - [Convoys](convoy.md) - The persistent tracking unit
- [Propulsion Principle](propulsion-principle.md) - Worker execution model - [Propulsion Principle](propulsion-principle.md) - Worker execution model
- [Mail Protocol](mail-protocol.md) - Agent communication

View File

@@ -49,7 +49,7 @@ Both do project work, but with key differences:
**When to use Polecats**: **When to use Polecats**:
- Discrete, well-defined tasks - Discrete, well-defined tasks
- Batch work (via swarms) - Batch work (tracked via convoys)
- Parallelizable work - Parallelizable work
- Work that benefits from supervision - Work that benefits from supervision

View File

@@ -26,26 +26,34 @@ var (
var convoyCmd = &cobra.Command{ var convoyCmd = &cobra.Command{
Use: "convoy", Use: "convoy",
GroupID: GroupWork, GroupID: GroupWork,
Short: "Manage cross-rig issue tracking", Short: "Track batches of work across rigs",
Long: `Manage convoys for tracking issues across multiple rigs. Long: `Manage convoys - the primary unit for tracking batched work.
A convoy is a tracking unit that monitors issues across project chains. A convoy is a persistent tracking unit that monitors related issues across
Unlike swarms (which coordinate parallel work), convoys simply track rigs. When you kick off work (even a single issue), a convoy tracks it so
related issues and auto-close when all tracked issues complete. you can see when it lands and what was included.
CONVOY VS SWARM: WHAT IS A CONVOY:
Swarm: Multiple polecats working on tasks from a shared base commit - Persistent tracking unit with an ID (hq-*)
Convoy: Cross-rig issue tracker, monitors progress without spawning workers - Tracks issues across rigs (frontend+backend, beads+gastown, etc.)
- Auto-closes when all tracked issues complete → notifies subscribers
- Can be reopened by adding more issues
WHAT IS A SWARM:
- Ephemeral: "the workers currently assigned to a convoy's issues"
- No separate ID - uses the convoy ID
- Dissolves when work completes
TRACKING SEMANTICS: TRACKING SEMANTICS:
- 'tracks' relation is non-blocking (tracked issues don't block convoy) - 'tracks' relation is non-blocking (tracked issues don't block convoy)
- Cross-prefix capable (convoy in hq-* tracks issues in gt-*, bd-*) - Cross-prefix capable (convoy in hq-* tracks issues in gt-*, bd-*)
- Reactive completion: convoy auto-closes when all tracked issues close - Landed: all tracked issues closed → notification sent to subscribers
COMMANDS: COMMANDS:
create Create a new convoy tracking specified issues create Create a convoy tracking specified issues
status Show convoy progress and tracked issues add Add issues to an existing convoy (reopens if closed)
list List all convoys`, status Show convoy progress, tracked issues, and active workers
list List convoys (the dashboard view)`,
} }
var convoyCreateCmd = &cobra.Command{ var convoyCreateCmd = &cobra.Command{

View File

@@ -36,48 +36,25 @@ var (
) )
var swarmCmd = &cobra.Command{ var swarmCmd = &cobra.Command{
Use: "swarm", Use: "swarm",
GroupID: GroupWork, GroupID: GroupWork,
Short: "Manage multi-agent swarms", Short: "[DEPRECATED] Use 'gt convoy' instead",
Long: `Manage coordinated multi-agent work units (swarms). Deprecated: "Use 'gt convoy' for work tracking. A 'swarm' is now just the ephemeral workers on a convoy.",
Long: `DEPRECATED: Use 'gt convoy' instead.
A swarm coordinates multiple polecats working on related tasks from a shared The term "swarm" now refers to the ephemeral set of workers on a convoy's issues,
base commit. Work is merged to an integration branch, then landed to main. not a persistent tracking unit. Use 'gt convoy' for creating and tracking batched work.
SWARM LIFECYCLE: TERMINOLOGY:
epic (tasks) Convoy: Persistent tracking unit (what this command was trying to be)
Swarm: Ephemeral workers on a convoy (no separate tracking needed)
┌────────────────────────────────────────────┐
│ SWARM │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Polecat │ │ Polecat │ │ Polecat │ │
│ │ Toast │ │ Nux │ │ Capable │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────────────────────────────────┐ │
│ │ integration/<epic> │ │
│ └───────────────────┬──────────────────┘ │
└──────────────────────┼────────────────────┘
▼ land
main
STATES: MIGRATION:
creatingSwarm being set up gt swarm create gt convoy create
active → Workers executing tasks gt swarm status → gt convoy status
merging → Work being integrated gt swarm list → gt convoy list
landed → Successfully merged to main
cancelled → Swarm aborted
COMMANDS: See 'gt convoy --help' for the new workflow.`,
create Create a new swarm from an epic
status Show swarm progress
list List swarms in a rig
land Manually land completed swarm
cancel Cancel an active swarm
dispatch Assign next ready task to a worker`,
} }
var swarmCreateCmd = &cobra.Command{ var swarmCreateCmd = &cobra.Command{