Add remaining crew subcommands for user-managed workspaces:
- gt crew list: List crew workspaces with session/git status
- gt crew at/attach: Start or attach to tmux session
- gt crew remove: Remove workspace with safety checks
- gt crew refresh: Context cycling with mail-to-self handoff
- gt crew status: Show detailed workspace status with mail info
All commands support --rig flag for explicit rig selection and
--json output where appropriate.
Closes: gt-cik.9
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Implements gt-cik.2: Create crew workspace command with:
- internal/crew/types.go: CrewWorker type definition
- internal/crew/manager.go: Manager for crew lifecycle
- internal/crew/manager_test.go: Unit tests
- internal/cmd/crew.go: CLI command with --rig and --branch flags
Crew workers are user-managed persistent workspaces that:
- Clone repo into <rig>/crew/<name>/
- Create optional feature branch (crew/<name>)
- Set up mail directory for delivery
- Initialize CLAUDE.md with crew worker prompting
- Are NOT registered with witness (user-managed)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Create prompts/roles/crew.md template for crew workers
- Document crew worker role as overseer's personal workspace
- Include mail-to-self handoff instructions for context cycling
- Document gt crew refresh command usage
- Explain no witness monitoring (user-managed lifecycle)
- Include conditional beads usage when BEADS_DIR configured
- Update docs/prompts.md with crew role documentation
Closes: gt-cik.8
Generated with Claude Code
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add crew/ directory support to rig structure for user-managed
persistent workspaces. Crew workers are separate from polecats
(AI-managed) and can have optional custom BEADS_DIR configuration.
- Add internal/crew package with Worker type and Manager
- Update rig types to include Crew slice and CrewCount in summary
- Update rig manager to scan for crew workers
- Add crew/ to AgentDirs for rig initialization
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace stub "Future: Federation" with comprehensive section
- Add Outpost interface and Worker interface definitions
- Document Cloud Run workers with persistent connections
- Document SSH/VM outposts for long-running work
- Add configuration example (outposts.yaml)
- Add architecture diagram showing outpost hierarchy
- Add Key Design Decision #14: Outpost Abstraction
Also reopened gt-u1j.6 and gt-u1j.12 (mail tasks) since beads
mail support (bd-kwro) is not yet complete.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Comprehensive analysis of Gas Town federation via "Outposts" abstraction:
- LocalOutpost: current tmux model
- SSHOutpost: full Gas Town clone on VM
- CloudRunOutpost: elastic container workers
Key insights:
- Persistent HTTP/2 connections solve Cloud Run cold start
- ~$0.017 per 5-min worker session vs $50-200/mo VM
- Git remains source of truth for code and beads
- Local-first, remote for overflow/burst
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Key Decision #11 renamed from "Beads as Swarm State" to "Work is a Stream
(No Swarm IDs)". Work flows through the system as a continuous stream:
- The epic IS the grouping (no separate swarm ID)
- The merge queue IS the coordination (no batch boundaries)
- Workers process issues independently (add/remove anytime)
- Dependencies provide sequencing (multi-wave emerges naturally)
Updated sections:
- Introduction: Added key insight about stream model
- Work Dispatch: Renamed from "Swarm Dispatch", updated diagram
- Multi-Wave Work Processing: Renamed from "Multi-Wave Swarms"
- Key Decision #11: Full rewrite explaining stream model
- Various terminology updates throughout
This aligns with the vision that Gas Town manages work as a stream,
not as discrete batches requiring explicit start/end boundaries.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Crew workspaces are the overseer's (human's personal workspaces within
a rig. Unlike polecats which are witness-managed and ephemeral, crew
workers are:
- Persistent (not auto-garbage-collected)
- User-managed (overseer controls lifecycle)
- Long-lived identities (dave, emma, fred)
- Gas Town integrated (mail, handoff mechanics)
- Tmux optional
See gt-cik for implementation epic.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
EOF
)
- notifyWorkerConflict: Mail worker with rebase instructions on conflict
- notifyWorkerMerged: Mail worker on successful merge
- findTownRoot: Walk up to find workspace for mail routing
- High priority notification for conflicts
- Integrates with mail system for agent communication
This completes the semantic merge handling for MVP - conflicts
are intelligently handled by notifying workers rather than
silently failing.
Closes gt-kmn.4
Generated with Claude Code
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- ExecuteLanding: Full landing protocol for swarms
- Phase 1: Stop all polecat sessions
- Phase 2: Git audit (uncommitted/unpushed detection)
- Phase 3: Branch cleanup
- Phase 4: Mail notification to Mayor
- Code at risk detection with escalation
- Beads-only changes considered safe
- Updated gt swarm land to use full protocol
Closes gt-kmn.6
Generated with Claude Code
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- internal/mail: Message types with priority support
- internal/mail: Mailbox JSONL operations (list, get, append, delete)
- internal/mail: Router for address resolution and delivery
- gt mail send: Send messages to agents
- gt mail inbox: List messages (--unread, --json)
- gt mail read: Read and mark messages as read
- Address formats: mayor/, rig/, rig/polecat, rig/refinery
- High priority messages trigger tmux notification
- Auto-detect sender from GT_RIG/GT_POLECAT env vars
Closes gt-u1j.6, gt-u1j.12
Generated with Claude Code
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- internal/refinery: Types for Refinery, MergeRequest, queue items
- internal/refinery: Manager with start/stop/status/queue operations
- gt refinery start: Start refinery for a rig (--foreground option)
- gt refinery stop: Stop running refinery
- gt refinery status: Show refinery state and statistics
- gt refinery queue: Show pending merge requests
- Auto-discover polecat work branches as queue items
- JSON output support for status and queue commands
Closes gt-rm3
Generated with Claude Code
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- gt swarm create: Create swarm from beads epic with workers
- gt swarm start: Activate a created swarm
- gt swarm status: Show detailed swarm info with task progress
- gt swarm list: List swarms with filtering by rig/status
- gt swarm land: Manually trigger landing to target branch
- gt swarm cancel: Cancel an active swarm
- SwarmStore: JSON-based persistence for swarm state
- Support for --json output on status and list commands
Closes gt-kmn.7
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- CreateIntegrationBranch: create from BaseCommit, push to origin
- MergeToIntegration: merge worker branch with conflict detection
- LandToMain: merge integration to target branch
- CleanupBranches: remove all swarm branches after landing
- Helper functions for branch naming conventions
Closes gt-kmn.3
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Create/Start/Cancel swarm lifecycle methods
- State transition validation (Created->Active->Merging->Landed)
- Task assignment and state tracking
- GetReadyTasks/GetActiveTasks queries
- IsComplete check for swarm completion
- Integration with beads CLI for task loading
Closes gt-kmn.2
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- gt stop --all: Kill all sessions across all rigs
- gt stop --rig <name>: Kill sessions in specific rig
- gt stop --graceful: Try graceful shutdown before force kill
- Captures session output before stopping
- Reports success/failure summary
Closes gt-u1j.22
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace custom contains() with strings.Contains in init.go
- Make session stop --force flag actually work
- Update session.Manager.Stop() to accept force parameter
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- start: Create tmux session and launch claude for polecat
- stop: Graceful shutdown with optional --force
- at: Attach to running session
- list: Show all active sessions with --json support
- capture: Get recent terminal output
- inject: Send message to session via tmux send-keys
Closes gt-u1j.11
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- status: Show town status with rig/polecat/witness counts (--json supported)
- prime: Output role context based on current directory
- init: Initialize a git repo as a Gas Town rig
Closes gt-u1j.10
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Manager operations:
- Start: create tmux session with optional issue assignment
- Stop: graceful shutdown with Ctrl+C then kill
- IsRunning: check if session exists
- List: enumerate all sessions for rig
- Attach: attach to session
- Capture: get recent output
- Inject: send message to session
- StopAll: terminate all sessions
Session naming: gt-<rig>-<polecat>
StartOptions:
- WorkDir: override working directory
- Issue: initial issue to work on
- Command: override default "claude" command
Environment variables set on start:
- GT_RIG: rig name
- GT_POLECAT: polecat name
Closes gt-u1j.7
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Detection:
- Find() walks up from given directory looking for markers
- Primary marker: config/town.json
- Secondary marker: mayor/ directory
- Follows symlinks using filepath.EvalSymlinks
Functions:
- Find, FindOrError: from given directory
- FindFromCwd, FindFromCwdOrError: from current directory
- IsWorkspace: check if directory is workspace root
Closes gt-f9x.2
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Types:
- TownConfig: main town configuration (config/town.json)
- RigsConfig: rigs registry with BeadsConfig per rig
- AgentState: agent state with role, session, extras
Features:
- Load/Save functions for all types
- Version compatibility checks
- Required field validation
- Creates parent directories on save
Closes gt-f9x.1
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- cmd/gt/main.go: Entry point using Cobra
- internal/cmd/root.go: Root command with description
- internal/cmd/version.go: Version command with build info
- internal/style/style.go: Lipgloss styles for terminal output
Closes gt-u1j.1
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Key Design Decisions added:
- #11: Beads as Swarm State (No Separate Database)
- #12: Agent Session Lifecycle (Daemon Protection)
- #13: Resource-Constrained Worker Pool
New section: Multi-Wave Swarms
- Wave orchestration via dependency graph
- Witness multi-wave loop pseudocode
- Long-running autonomy through daemon persistence
This eliminates the need for SQLite/manifest storage for swarms.
Beads epics and dependencies encode all swarm state.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Comprehensive prompt system documentation including:
- Full PGT prompt inventory (roles, mail, spawn, lifecycle)
- Gap analysis (Witness has no prompts!)
- GGT architecture recommendations (directory structure, template engine)
- Complete Witness prompt design (new role!)
- Implementation plan with phases
Related: gt-59p
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- System overview: Town hierarchy with Overseer, Mayor, Rigs, Agents
- Communication flows: Mail-based agent communication
- Swarm dispatch sequence: Full workflow from Overseer to completion
- Worker cleanup sequence: Witness verification with escalation path
- Session cycling sequence: Mail-to-self handoff pattern
- Rig structure: Visual of container with agent directories
- Merge queue flow: Polecat branches → Refinery → main
All diagrams render in GitHub markdown.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Plugins are just more agents in the wasteland - with identities,
mailboxes, and beads access. No special framework, just directory
conventions and mail-based invocation.
Added beads:
- gt-axz: Plugin architecture epic
- gt-8dv: CLI plugin commands
- gt-pio: merge-oracle plugin (merge queue analysis)
- gt-35x: plan-oracle plugin (work decomposition)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Major architecture decision: rigs are now pure container directories,
not git clones. This prevents agent confusion by ensuring each agent
has exactly one place to work (their own /rig/ clone).
Key changes:
- Rig root is NOT a git repo - just a container
- Rig-level .beads/ holds issues for all agents in that rig
- Agents use BEADS_DIR env var to point to rig's beads
- Refinery's clone is the authoritative "main branch" view
- Added design decisions #6 (rig as container) and #7 (BEADS_DIR)
See also: beads issue bd-411u for BEADS_DIR documentation.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replaced 4 individual design docs with single master architecture doc.
Design content moved to bead descriptions (self-contained, no markdown refs).
Closed gt-cr0.
- Add docs/architecture.md: top-down Gas Town explanation
- Delete docs/{town,swarm-shutdown,polecat-beads-access,mayor-handoff}-design.md
- Update CLAUDE.md to point to architecture.md
- Update beads: gt-sd6, gt-f8v, gt-eu9, gt-gl2, gt-zx3, gt-e1y, gt-cjb, gt-082,
gt-g2d, gt-sye, gt-vci, gt-82y, gt-l3c, gt-u82 now self-contained
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Architecture decision (gt-iib):
- Per-rig agents: mayor/, witness/, refinery/, polecats/ in each rig
- Visible config dir: config/ not .gastown/
- Witness role: per-rig pit boss with its own clone
- Minimal invasiveness: only .git/info/exclude modified
- Updated config file examples for new structure
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The old epic IDs (gt-fqwd, gt-evp2) were from the PGT repo.
The canonical GGT epics are:
- gt-u1j: Port Gas Town to Go
- gt-f9x: Town & Rig Management
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Go project structure (go.mod, cmd/gt/main.go)
- Beads database initialized with gt- prefix
- Town management design doc (docs/town-design.md)
- Basic README and CLAUDE.md
Epics tracked:
- gt-u1j: Port Gas Town to Go
- gt-f9x: Town & Rig Management
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>