bd sync: 2025-12-22 22:04:04
This commit is contained in:
@@ -54,6 +54,7 @@
|
||||
{"id":"gt-3cu","title":"Default polecat names: Mad Max theme instead of AdjectiveNoun","description":"Current default naming for new polecats uses AdjectiveNoun convention.\nSince rigs already provide namespacing, we can use more thematic names.\n\nSuggestion: Use Mad Max / Fury Road character and vehicle names as defaults.\nExamples: Furiosa, Nux, Slit, Morsov, Toast, Rictus, Warboy, etc.\n\nCould also include:\n- War Rig parts: Guzzler, Tanker, Pursuit\n- Citadel roles: Imperator, Blackthumb, Organic\n- Wasteland terms: Chrome, Witness, Shiny\n\nImplementation:\n- Add name generator in internal/polecat/ or similar\n- Use when --create flag is used without explicit name\n- Cycle through pool to avoid duplicates within a rig","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-17T14:50:43.252922-08:00","updated_at":"2025-12-17T14:50:43.252922-08:00"}
|
||||
{"id":"gt-3fm","title":"Mail orchestrator daemon","description":"Background mail orchestrator daemon.\n\n## Command\n```\ngt mail orchestrate [--interval N] [--once] [--verbose]\n```\n\n## Purpose\nBackground process that:\n1. Monitors outbox for pending mail\n2. Delivers to recipient inboxes\n3. Handles offline recipients (retry later)\n4. Cleans delivered messages from outbox\n\n## Why Needed?\nCurrent mail is synchronous. If recipient is offline or mailbox locked, send fails.\nOrchestrator enables async delivery with retry.\n\n## Implementation\n```go\nfunc (o *Orchestrator) Run(interval time.Duration) error {\n ticker := time.NewTicker(interval)\n for range ticker.C {\n o.processOutbox()\n }\n}\n\nfunc (o *Orchestrator) processOutbox() {\n // List outbox/*.json\n // For each, attempt delivery\n // On success, delete from outbox\n // On failure, increment retry count\n}\n```\n\n## Outbox Structure\n```\n\u003ctown\u003e/mayor/mail/outbox/\n├── msg-abc123.json\n└── msg-def456.json\n```\n\n## Lower Priority\nCurrent synchronous delivery works. Orchestrator is optimization.\n\n## Acceptance Criteria\n- [ ] Background daemon mode\n- [ ] Retry failed deliveries\n- [ ] --once for single pass\n- [ ] Configurable interval","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-16T14:48:29.830841-08:00","updated_at":"2025-12-16T16:07:35.973257-08:00"}
|
||||
{"id":"gt-3pp","title":"Support numeric shortcuts in mail read (e.g., 'mail read 1')","description":"When inbox shows numbered messages like:\n* 1. gm-19b29031... 2025-12-16 mayor Subject...\n* 2. gm-19b26d51... 2025-12-16 Subject...\n\nUsers should be able to run 'gt mail read 1' instead of needing the full message ID 'gt mail read gm-19b29031f6a172206'.\n\nImplementation:\n- Track inbox message order in display\n- Map numeric indices to actual message IDs\n- Accept both numeric shortcuts and full IDs in 'mail read' command","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-16T13:15:07.857939-08:00","updated_at":"2025-12-16T13:15:29.273066-08:00"}
|
||||
{"id":"gt-3s1h","title":"mol-deacon-patrol","description":"[RESURRECTED] This issue was deleted but recreated as a tombstone to preserve hierarchical structure.\n\nOriginal description:\nDeacon patrol molecule template. Label: template","status":"open","priority":4,"issue_type":"epic","created_at":"2025-12-22T22:02:41.756737-08:00","updated_at":"2025-12-22T22:02:41.756737-08:00","wisp":true}
|
||||
{"id":"gt-3tz","title":"CLI: polecat commands (add, list, wake, sleep, decommission)","description":"GGT is missing most polecat management commands that PGT has.\n\nMissing Commands:\n- gt polecat add \u003crig\u003e \u003cname\u003e - Add polecat to rig (creates clone)\n- gt polecat list [\u003crig\u003e] - List polecats with state\n- gt polecat info \u003cpolecat\u003e - Show detailed info\n- gt polecat wake \u003cpolecat\u003e - Mark available\n- gt polecat sleep \u003cpolecat\u003e - Mark unavailable \n- gt polecat decommission \u003cpolecat\u003e - Remove polecat safely\n\nPGT Reference: gastown-py/src/gastown/cli/polecat_cmd.py\n\nNotes:\n- spawn exists but doesn't cover management\n- wake/sleep are in polecat manager but not CLI\n- decommission should check for uncommitted work","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-16T14:46:31.326692-08:00","updated_at":"2025-12-16T16:03:14.462338-08:00","closed_at":"2025-12-16T16:03:14.462338-08:00"}
|
||||
{"id":"gt-3x0z","title":"Epic: Wisp Molecule Integration","description":"## Vision\n\nIntegrate Beads wisp molecules into Gas Town. All orchestration work runs as wisp molecules - patrols, polecat workflows, batch operations. Only digests reach main beads.\n\n## The Steam Engine Metaphor\n\n```\nEngine does work → generates steam\nSteam wisps rise → execution trace\nSteam condenses → digest (distillate) \nSteam dissipates → cleaned up (burned)\n```\n\n## Architecture\n\n```\nProto Molecules (templates)\n ↓ bd mol bond\nWisps (.beads-wisps/ or inline)\n ↓ bd mol squash + AI summary\nMain Beads (digests only)\n```\n\n## Vocabulary\n\n| Term | Meaning |\n|------|---------|\n| bond | Attach proto to work (creates wisps) |\n| wisp | Temporary execution step (steam rising) |\n| squash | Condense wisps into digest |\n| burn | Destroy wisps without record |\n| digest | Permanent condensed record (distillate) |\n\n## Key Design Decisions\n\n1. **Wisp location**: Per-rig or inline in main beads with wisp flag\n2. **Summary generation**: Agent that did work generates summary (inversion of control)\n3. **Squash timing**: Final step of molecule workflow, before signaling done\n4. **Crash recovery**: Wisps persist, Witness detects stalls, new agent resumes\n5. **Patrols**: Each cycle is fresh wisp molecule, squashed on completion\n\n## Digest Contents\n\n- Molecule type and instance ID\n- Assignee, start/end times\n- Source issue reference\n- AI-generated summary\n- Outcomes (issues closed, commits, branches)\n\n## Integration Points\n\n- gt rig init: Configure wisp storage\n- gt spawn --molecule: Bond creates wisps\n- gt prime: Show wisp molecule context\n- Polecat CLAUDE.md: Summary + squash protocol\n- gt doctor: Wisp health checks\n- Deacon/Witness/Refinery: Patrol molecules\n\n## Phases\n\nPhase 1: Wisp setup infrastructure\nPhase 2: Spawn integration\nPhase 3: Completion flow (summary + squash)\nPhase 4: Patrol integration\nPhase 5: Documentation and polish","status":"open","priority":1,"issue_type":"epic","created_at":"2025-12-21T14:33:03.15592-08:00","updated_at":"2025-12-21T14:45:10.015904-08:00"}
|
||||
{"id":"gt-3x0z.1","title":"Phase 1.1: gt rig init creates .beads-ephemeral/","description":"Add ephemeral beads repo creation to rig initialization.\n\n## Implementation\n\nIn `gt rig init` (or equivalent setup):\n1. Create `\u003crig\u003e/.beads-ephemeral/` directory\n2. Initialize as git repo\n3. Create minimal beads config (no sync-branch needed)\n4. Add to .gitignore if not already\n\n## Config\n\n```yaml\n# .beads-ephemeral/config.yaml\nephemeral: true\n# No sync-branch - ephemeral is local only\n```\n\n## Verification\n\n```bash\ngt rig init gastown\nls gastown/.beads-ephemeral/ # Should exist\n```","status":"closed","priority":1,"issue_type":"task","assignee":"gastown/furiosa","created_at":"2025-12-21T14:33:23.699253-08:00","updated_at":"2025-12-21T15:32:05.045296-08:00","closed_at":"2025-12-21T15:32:05.045296-08:00","close_reason":"Added initEphemeralBeads to rig add, creates .beads-ephemeral/ with git init and config.yaml","dependencies":[{"issue_id":"gt-3x0z.1","depends_on_id":"gt-3x0z","type":"parent-child","created_at":"2025-12-21T14:33:23.701082-08:00","created_by":"daemon"}]}
|
||||
@@ -172,6 +173,7 @@
|
||||
{"id":"gt-8lz","title":"Comprehensive help text and examples","description":"Improve help text with examples and cross-references.\n\n## Improvements\n\n### 1. Examples Section\nAdd to Long description:\n```go\nvar spawnCmd = \u0026cobra.Command{\n Long: `Spawn a polecat with work assignment.\n\nExamples:\n gt spawn gastown/Toast --issue gt-abc\n gt spawn gastown --issue gt-def # auto-select polecat\n gt spawn gastown/Nux -m \"Fix the tests\" # free-form task`,\n}\n```\n\n### 2. Cross-References\nReference related commands:\n```\nSee also:\n gt polecat list List available polecats\n gt session attach Attach to spawned session\n```\n\n### 3. Flag Descriptions\nMore detail on flags:\n```go\ncmd.Flags().StringVar(\u0026issue, \"issue\", \"\", \n \"Beads issue ID to assign. The polecat will work on this issue.\")\n```\n\n### 4. Common Workflows\nAdd workflow docs to gt --help:\n```\nCommon Workflows:\n Start a swarm:\n gt swarm preflight\n gt swarm create gastown --epic gt-abc --worker Toast --worker Nux --start\n gt refinery start gastown\n \n Check status:\n gt status\n gt swarm status \u003cid\u003e\n```\n\n## Files to Update\nAll internal/cmd/*.go files\n\n## Acceptance Criteria\n- [ ] All commands have Examples\n- [ ] Related commands cross-referenced\n- [ ] Flags have detailed descriptions\n- [ ] Root help shows workflows","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-16T14:48:53.303016-08:00","updated_at":"2025-12-16T16:07:37.391195-08:00"}
|
||||
{"id":"gt-8mbz","title":"Town Doctor molecule for harness health checks","description":"Create a Town Doctor molecule that any Gas Town agent can run to diagnose and repair harness issues.\n\n## Concept\n\nInstead of just `gt doctor` as a CLI command with hardcoded checks, create a **molecule** (checklist workflow) that:\n- Any agent (Mayor, Witness, Polecat) can instantiate\n- Walks the agent through diagnostic steps\n- Agent uses judgment to fix issues found\n- Works as a structured troubleshooting guide\n\n## Why a Molecule?\n\n1. **Agent-driven**: The agent running it becomes \"the doctor\" temporarily\n2. **Extensible**: Add new checks by updating the molecule, not code\n3. **Contextual**: Agent can reason about issues, not just run scripts\n4. **Self-healing**: Agent can fix problems it finds, not just report them\n\n## Proposed Checks (molecule steps)\n\n1. Verify harness structure (mayor/, .beads/, CLAUDE.md exist)\n2. Validate config files (town.json, rigs.json parse correctly)\n3. Check beads health (bd doctor, redirect validity)\n4. Verify git state (clean working tree, proper remotes)\n5. Check rig integrity (each registered rig exists, has config.json)\n6. Validate agent clones (mayor/rig/, refinery/rig/ exist and are valid)\n7. Check for orphaned worktrees/branches\n8. Verify daemon state (if running)\n\n## Integration\n\n- `gt doctor` could instantiate the molecule for the current agent\n- Or agent can run `bd ready` and pick up doctor tasks when prioritized\n- Results logged to beads for audit trail\n\n## Related\n\n- gt-cr9: Harness Design \u0026 Documentation (completed)\n- Molecules design in architecture.md","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-19T13:03:22.688851-08:00","updated_at":"2025-12-19T13:03:22.688851-08:00"}
|
||||
{"id":"gt-8os8","title":"Work on ga-p6r: Add handoff protocol to spawn priming. En...","description":"Work on ga-p6r: Add handoff protocol to spawn priming. Ensure polecats receive handoff context when spawned. When done, submit MR (not PR) to integration branch for Refinery.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-19T22:57:59.334003-08:00","updated_at":"2025-12-19T23:22:07.076974-08:00","closed_at":"2025-12-19T23:22:07.076974-08:00"}
|
||||
{"id":"gt-8pcb","title":"Plugin/molecule catalog integration design","description":"Two currently independent systems:\n1. Disk-based plugins (~~/gt/plugins/) - Deacon patrol extensions\n2. Molecule catalog (protos in beads) - bd pour/wisp/bond\n\nInvestigate integration points:\n- User-contributed molecules bonded to catalog\n- Dynamic molecule attachment during execution (e.g., 'attach security sniffer because we noticed condition X')\n- How plugins could contribute protos\n- How protos could trigger plugins\n\nNot blocking launch. Future design investigation.","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-22T21:52:47.897048-08:00","updated_at":"2025-12-22T21:52:47.897048-08:00"}
|
||||
{"id":"gt-8qv3","title":"request-shutdown","description":"Send shutdown request to Witness.\nWait for termination.\n\nThe polecat is now ready to be cleaned up.\nDo not exit directly - wait for Witness to kill the session.\n\nDepends: generate-summary","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T21:58:52.600349-08:00","updated_at":"2025-12-21T21:59:10.938756-08:00","closed_at":"2025-12-21T21:59:10.938756-08:00","close_reason":"test cleanup","dependencies":[{"issue_id":"gt-8qv3","depends_on_id":"gt-q6hl","type":"parent-child","created_at":"2025-12-21T21:58:52.603957-08:00","created_by":"stevey"}],"wisp":true}
|
||||
{"id":"gt-8r7","title":"Enhance Mayor CLAUDE.md with GGT milestone tracking","description":"Update ~/ai/CLAUDE.md (Mayor startup context) with:\n\n1. GGT Self-Hosting Milestone section\n - Track progress toward gt replacing town\n - Key blockers: gt-h5n (merge queue), gt-974 (daemon)\n - What \"self-hosting\" means (GGT working on itself)\n\n2. Recent Architecture Decisions\n - Engineer = role, Refinery = place\n - Merge queue in Beads (not branch discovery)\n - Session restart protocol\n\n3. Transition Plan\n - Current: use town commands (PGT)\n - Target: use gt commands (GGT)\n - Switch criteria: gt-b1g closed\n\nKeep it concise - Mayor context should be quick to scan.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-16T23:12:07.260653-08:00","updated_at":"2025-12-16T23:12:07.260653-08:00","dependencies":[{"issue_id":"gt-8r7","depends_on_id":"gt-h5n","type":"blocks","created_at":"2025-12-16T23:12:15.124842-08:00","created_by":"daemon"}]}
|
||||
{"id":"gt-8v8","title":"Polecat cleanup should refuse to lose uncommitted work","description":"The system should stubbornly refuse to lose work from a polecat.\n\n## Current Problem\n\n- gt spawn --force bypasses safety checks\n- gt shutdown doesn't check for uncommitted work\n- Witness cleanup doesn't check git status\n\n## Desired Behavior\n\nBefore any polecat cleanup, check:\n1. git status - any uncommitted changes?\n2. git stash list - any stashes?\n3. Unpushed commits on branch?\n4. Unsynced beads changes?\n\nIf ANY of these exist:\n- REFUSE to clean up\n- Print clear error message listing what would be lost\n- Require explicit --nuclear flag to force (not just --force)\n\n## Implementation\n\nAdd to cleanupPolecat() in witness/manager.go:\n```go\nfunc (m *Manager) checkUncommittedWork(polecatName string) error {\n dir := m.polecatDir(polecatName)\n \n // Check git status\n if hasUncommitted, _ := git.HasUncommittedChanges(dir); hasUncommitted {\n return fmt.Errorf(\"polecat %s has uncommitted changes\", polecatName)\n }\n \n // Check stashes\n if stashCount, _ := git.StashCount(dir); stashCount \u003e 0 {\n return fmt.Errorf(\"polecat %s has %d stashes\", polecatName, stashCount)\n }\n \n // Check unpushed commits\n if unpushed, _ := git.UnpushedCommits(dir); unpushed \u003e 0 {\n return fmt.Errorf(\"polecat %s has %d unpushed commits\", polecatName, unpushed)\n }\n \n return nil\n}\n```\n\n## Affected Commands\n\n- gt shutdown\n- gt rig shutdown\n- Witness cleanup\n- gt spawn --force (should warn if overwriting)","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-20T15:23:09.043717-08:00","updated_at":"2025-12-20T17:42:39.582711-08:00","closed_at":"2025-12-20T15:55:10.658555-08:00"}
|
||||
@@ -276,6 +278,7 @@
|
||||
{"id":"gt-cik.9","title":"Complete gt crew commands (list, attach, remove, refresh, status)","description":"Add remaining crew subcommands to internal/cmd/crew.go:\n\n1. gt crew list - List crew workspaces with status\n2. gt crew at/attach - Start tmux session in crew workspace \n3. gt crew remove - Remove crew workspace (with safety checks)\n4. gt crew refresh - Context cycling with mail-to-self handoff\n5. gt crew status - Show detailed workspace status\n\nBuild on existing crew add implementation in internal/cmd/crew.go.\nReference closed issues gt-cik.3-7 for original requirements.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-16T20:53:25.564877-08:00","updated_at":"2025-12-16T20:59:02.001789-08:00","closed_at":"2025-12-16T20:59:02.001789-08:00","dependencies":[{"issue_id":"gt-cik.9","depends_on_id":"gt-cik","type":"parent-child","created_at":"2025-12-16T20:53:25.566962-08:00","created_by":"daemon"}]}
|
||||
{"id":"gt-cjb","title":"Witness updates: Remove issue filing proxy","description":"Update Witness prompting to remove issue filing proxy, since polecats now have direct beads access.\n\n## Remove from Witness Prompting\n\nThe following is NO LONGER Witness responsibility:\n- Processing polecat 'file issue' mail requests\n- Creating issues on behalf of polecats\n- Forwarding issue creation requests\n\n## Add: Legacy Request Handling\n\nIf Witness receives an old-style 'please file issue' request:\n\n1. Respond with update:\n town inject \u003cpolecat\u003e \"UPDATE: You have direct beads access now. Use bd create to file issues yourself.\"\n\n2. Do not file the issue - let the polecat learn the new workflow.\n\n## Keep in Witness Prompting\n\n- Monitoring polecat progress\n- Nudge protocol\n- Pre-kill verification\n- Session lifecycle management","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-15T19:47:19.921561-08:00","updated_at":"2025-12-15T20:48:36.020922-08:00","dependencies":[{"issue_id":"gt-cjb","depends_on_id":"gt-l3c","type":"blocks","created_at":"2025-12-15T19:47:35.896691-08:00","created_by":"daemon"}]}
|
||||
{"id":"gt-cnt","title":"Swarm cleanup: delete merged polecat branches and reset state","description":"After a swarm completes and branches are merged, leftover state remains:\n\n## Current Problem\n\n1. **Remote branches not deleted** - polecat/* branches stay on origin after merge\n2. **Polecat clones not reset** - still on old branch with completed work\n3. **No cleanup command** - manual cleanup required\n\n## Observed After Swarm\n\nRemote branches still present:\n- origin/polecat/Morsov\n- origin/polecat/Nux \n- origin/polecat/Rictus\n- origin/polecat/Slit\n- origin/polecat/Toast\n\n## Proposed Solution\n\nAdd cleanup commands:\n\n1. gt swarm cleanup \u003cswarm-id\u003e - Clean up after swarm completion\n - Delete remote polecat branches that were merged\n - Reset polecat clones to main\n - Clear issue assignments\n \n2. gt polecat reset \u003crig\u003e/\u003cpolecat\u003e - Reset single polecat\n - git checkout main \u0026\u0026 git pull\n - Delete local polecat branch\n - Clear current issue assignment\n\n3. Auto-cleanup option on gt session stop --cleanup\n\n## Manual Cleanup For Now\n\ngit push origin --delete polecat/Nux polecat/Toast ...\ncd polecats/Nux \u0026\u0026 git checkout main \u0026\u0026 git pull","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-17T15:09:08.739193-08:00","updated_at":"2025-12-18T11:38:56.305923-08:00","closed_at":"2025-12-18T11:38:56.305923-08:00"}
|
||||
{"id":"gt-cp2s","title":"mol-polecat-lease: Semaphore proto for tracking polecat lifecycle","description":"Define a small proto for tracking a single polecat in the Witness patrol wisp:\n\n```markdown\n## Molecule: polecat-lease\nSemaphore tracking a single polecat's lifecycle.\nVars: {{polecat}}, {{issue}}\n\n## Step: boot\nSpawned. Verify it starts working.\ngt peek {{polecat}} - if idle, gt nudge.\nTimeout: 60s before escalation.\n\n## Step: working\nActively working. Monitor for stuck.\nWait for SHUTDOWN mail.\nNeeds: boot\n\n## Step: done\nExit received. Ready for cleanup.\nKill session, prune worktree.\nNeeds: working\n```\n\nUsed by Witness: bd mol bond mol-polecat-lease wisp-patrol --var polecat=X","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-22T22:01:18.257848-08:00","updated_at":"2025-12-22T22:01:18.257848-08:00"}
|
||||
{"id":"gt-cpm2","title":"Automatic spawn for ready work","description":"Auto-spawn polecats for ready work:\n\nWhen Witness has capacity (active_workers \u003c max_workers):\n1. Query bd ready for unblocked issues\n2. Filter to rig-appropriate work (by prefix or epic)\n3. For each ready issue up to capacity:\n - gt spawn --issue \u003cid\u003e\n - Track that we spawned for this issue\n\nConfiguration (in rig config.json):\n- max_workers: 4 (default)\n- spawn_delay: 5s between spawns\n- auto_spawn: true/false\n\nThis enables 'fire and forget' swarming:\n- Mayor creates epic with children\n- Mayor tells Witness to work epic\n- Witness spawns polecats automatically\n- Witness cleans up as they complete","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T03:14:24.724136-08:00","updated_at":"2025-12-20T09:30:28.050001-08:00","closed_at":"2025-12-20T09:30:28.050001-08:00","dependencies":[{"issue_id":"gt-cpm2","depends_on_id":"gt-53w6","type":"parent-child","created_at":"2025-12-20T03:14:37.365334-08:00","created_by":"daemon"},{"issue_id":"gt-cpm2","depends_on_id":"gt-mxyj","type":"blocks","created_at":"2025-12-20T03:14:38.957826-08:00","created_by":"daemon"}]}
|
||||
{"id":"gt-cr0","title":"Consolidate design docs into beads descriptions","description":"The markdown design docs (swarm-shutdown-design.md, polecat-beads-access-design.md, mayor-handoff-design.md) will decay. Extract key decisions and prompting templates into the beads descriptions themselves, then archive or remove the markdown files. Beads are the source of truth.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-15T20:24:05.45131-08:00","updated_at":"2025-12-15T20:51:52.083465-08:00","closed_at":"2025-12-15T20:51:52.083465-08:00"}
|
||||
{"id":"gt-cr9","title":"Harness Design \u0026 Documentation","description":"The harness (Gas Town installation directory) needs design cleanup, documentation, and tooling.\n\n## Current Problems\n\n1. **Shared harness confusion**: ~/ai is shared by PGT and GGT with overlapping structures\n - PGT uses ~/ai/mayor/ as town-level Mayor home\n - GGT Mayor works in ~/ai/mayor/rigs/gastown/\n - ~/ai/gastown/ has both .gastown/ (PGT) and mayor/ (git clone)\n\n2. **Beads redirect**: ~/ai/.beads/redirect → mayor/rigs/gastown/.beads\n - This is specific to GGT's decentralized structure\n - Should be documented as an example\n\n3. **architecture.md**: Verify rig-level mayor/rig/ is shown correctly\n\n4. **No harness creation tooling**: Users must manually set up\n\n## Proposed Work\n\n- Document what a harness IS (installation directory)\n- Create harness creation command or template repo\n- Update architecture.md if needed \n- Create example harness configuration for docs\n- Resolve PGT/GGT sharing issue","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-17T17:15:08.769961-08:00","updated_at":"2025-12-19T12:02:12.135837-08:00","closed_at":"2025-12-19T12:02:12.135837-08:00"}
|
||||
@@ -373,6 +376,7 @@
|
||||
{"id":"gt-hoyd","title":"Merge: gt-rana.1","description":"branch: polecat/rictus\ntarget: main\nsource_issue: gt-rana.1\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-21T15:51:03.089517-08:00","updated_at":"2025-12-21T15:54:12.41736-08:00","closed_at":"2025-12-21T15:54:12.41736-08:00","close_reason":"Merged to main by refinery"}
|
||||
{"id":"gt-htto","title":"Heartbeat convention: simple liveness signal for agents","description":"Lightweight liveness signal extracted from Deacon epic (gt-5af).\n\n**Implementation**: Each agent writes a timestamp file on activity:\n```bash\necho '{\"ts\":\"'$(date -Iseconds)'\"}' \u003e ~/gt/\u003crole\u003e/heartbeat.json\n```\n\n**Integration points**:\n- SessionStart hook writes heartbeat\n- Periodic activity (mail check, work completion) refreshes it\n- `gt status` shows staleness (e.g., 'mayor: 5m ago')\n\n**Weight**: ~5 lines per agent\n**Value**: Quick debugging - see which agents are active at a glance\n\nNo monitoring daemon needed - human checks `gt status` when curious.","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-20T20:40:45.459903-08:00","updated_at":"2025-12-20T20:40:45.459903-08:00"}
|
||||
{"id":"gt-hw6","title":"GGT Command Parity: Complete gt command coverage","description":"Complete gt command set to match/exceed PGT town commands.\n\nCovers: uninstall, rig info, refinery attach, witness, session mgmt, mail UX, daemon.","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-17T22:22:21.720078-08:00","updated_at":"2025-12-19T12:05:36.723692-08:00","closed_at":"2025-12-19T12:05:36.723692-08:00"}
|
||||
{"id":"gt-hwma","title":"Digest: mol-deacon-patrol","description":"Patrol OK: archived old handoff, all agents up, furiosa on gt-oiv0","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-22T22:03:54.568334-08:00","updated_at":"2025-12-22T22:03:54.568334-08:00","closed_at":"2025-12-22T22:03:54.568286-08:00","close_reason":"Squashed from 5 wisps","dependencies":[{"issue_id":"gt-hwma","depends_on_id":"gt-3s1h","type":"parent-child","created_at":"2025-12-22T22:03:54.56893-08:00","created_by":"stevey"}]}
|
||||
{"id":"gt-hxlt","title":"Merge: gt-odvf","description":"branch: polecat/slit\ntarget: main\nsource_issue: gt-odvf\nrig: gastown","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-21T16:42:57.748003-08:00","updated_at":"2025-12-21T17:20:27.503711-08:00","closed_at":"2025-12-21T17:20:27.503711-08:00","close_reason":"ORPHANED: Branch never pushed, worktree deleted"}
|
||||
{"id":"gt-hzr","title":"gt witness: Witness management commands","description":"Add 'gt witness' command group for witness lifecycle management.\n\nSubcommands:\n- gt witness start [rig] - Start witness for a rig\n- gt witness stop [rig] - Stop witness\n- gt witness status [rig] - Show witness status\n- gt witness attach [rig] - Attach to witness session\n\nWitness monitors polecats and handles:\n- Idle detection and cleanup\n- Session health checks\n- Nudging stuck agents","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-17T21:47:32.210917-08:00","updated_at":"2025-12-19T12:05:27.343254-08:00","closed_at":"2025-12-19T12:05:27.343254-08:00","dependencies":[{"issue_id":"gt-hzr","depends_on_id":"gt-hw6","type":"blocks","created_at":"2025-12-17T22:23:42.955006-08:00","created_by":"daemon"}]}
|
||||
{"id":"gt-i4i2","title":"Update deacon.md.tmpl with correct molecule commands","description":"The deacon prompt references commands that don't exist:\n- gt mol bond → should be bd mol run or gt mol arm\n- gt mol status → needs gt mol command tree first\n\nUpdate after gt mol command tree is implemented.\n\nDepends on: gt mol command tree issue","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-22T13:12:26.401739-08:00","updated_at":"2025-12-22T13:19:50.641767-08:00","closed_at":"2025-12-22T13:19:50.641767-08:00","close_reason":"Updated deacon.md with correct commands: gt mol status, bd mol spawn, gt mol squash","dependencies":[{"issue_id":"gt-i4i2","depends_on_id":"gt-x74c","type":"blocks","created_at":"2025-12-22T13:12:35.69774-08:00","created_by":"daemon"}]}
|
||||
@@ -466,6 +470,7 @@
|
||||
{"id":"gt-mcjd","title":"Work on gt-o9j: Fix tmux status bar polecat count - exclu...","description":"Work on gt-o9j: Fix tmux status bar polecat count - exclude static roles (mayor, deacon, witnesses, refineries, docs, hop). Run 'bd show gt-o9j' for details.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-20T07:52:51.623541-08:00","updated_at":"2025-12-20T07:56:41.861992-08:00","closed_at":"2025-12-20T07:56:41.861992-08:00"}
|
||||
{"id":"gt-mh5s","title":"Refinery gates: test/lint/build before merge","description":"Before merging polecat work to main, run configurable quality gates.\n\n**From VC**: internal/gates/ - parallel execution with timeout, any failure = overall failure.\n\n**Gas Town implementation**: Refinery config with gate commands:\n```yaml\ngates:\n test:\n cmd: go test ./...\n timeout: 5m\n lint:\n cmd: golangci-lint run\n timeout: 2m\n build:\n cmd: go build ./...\n timeout: 3m\nparallel: true\n```\n\nIf gates fail, don't merge. Polecat can iterate and retry.\n\n**Value**: Prevents broken code from reaching main. VC had 90.9% gate pass rate.\n\n**VC complexity**: ~200 lines Go\n**Gas Town complexity**: ~10 lines YAML","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-20T20:30:12.44681-08:00","updated_at":"2025-12-20T20:30:12.44681-08:00","dependencies":[{"issue_id":"gt-mh5s","depends_on_id":"gt-zhpa","type":"parent-child","created_at":"2025-12-20T20:30:27.402708-08:00","created_by":"daemon"}]}
|
||||
{"id":"gt-mjso","title":"Merge: gt-rixa","description":"branch: polecat/furiosa\ntarget: main\nsource_issue: gt-rixa\nrig: gastown","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-21T14:09:26.367745-08:00","updated_at":"2025-12-21T17:20:27.506572-08:00","closed_at":"2025-12-21T17:20:27.506572-08:00","close_reason":"ORPHANED: Branch never pushed, worktree deleted"}
|
||||
{"id":"gt-mx6s","title":"Witness patrol wisp with polecat leases","description":"Witness should maintain a rolling patrol wisp that tracks active polecats:\n\n```\nwisp-witness-patrol\n├── lease: furiosa (boot → working → done)\n├── lease: nux (working)\n└── lease: slit (done, closed)\n```\n\nWhen POLECAT_STARTED arrives:\n- bd mol bond mol-polecat-lease wisp-patrol --var polecat=X\n\nPatrol loop iterates leases:\n- gt peek $polecat\n- If idle: gt nudge\n- If shutdown received: close lease\n\nWhen all leases closed:\n- bd mol squash wisp-xxx --summary='N polecats processed'\n\nRequires mol-polecat-lease proto definition.","status":"open","priority":1,"issue_type":"feature","created_at":"2025-12-22T22:01:13.640901-08:00","updated_at":"2025-12-22T22:01:13.640901-08:00"}
|
||||
{"id":"gt-mxyj","title":"Witness session startup (gt witness start)","description":"Implement gt witness start \u003crig\u003e\n\nShould:\n1. Verify rig exists and has witness/ directory\n2. Check for existing witness session (don't double-start)\n3. Create tmux session: gt-\u003crig\u003e-witness\n4. Start Claude Code with --dangerously-skip-permissions\n5. Send gt prime to load context\n6. Send startup prompt\n\nSimilar pattern to refinery startup in internal/refinery/manager.go","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T03:14:20.38027-08:00","updated_at":"2025-12-20T09:25:31.369825-08:00","closed_at":"2025-12-20T09:25:31.369825-08:00","dependencies":[{"issue_id":"gt-mxyj","depends_on_id":"gt-53w6","type":"parent-child","created_at":"2025-12-20T03:14:37.170879-08:00","created_by":"daemon"},{"issue_id":"gt-mxyj","depends_on_id":"gt-ni6a","type":"blocks","created_at":"2025-12-20T03:14:38.764636-08:00","created_by":"daemon"}]}
|
||||
{"id":"gt-mzal","title":"mol-gastown-boot: Mayor-driven town bootstrap","description":"Mayor bootstraps Gas Town via a verification-gated lifecycle molecule.\n\n## Vision\n\nWhen user says \"boot up gas town\", Mayor slings `mol-gastown-boot` and executes it.\nEach step has **action + verification** - steps stay open until outcome is confirmed.\n\n## Key Principles\n\n1. **No daemon-based timeouts** - Mayor keeps trying until verified\n2. **Verification-gated steps** - Not \"command ran\" but \"outcome confirmed\"\n3. **gt peek for verification** - Capture session output to detect stalls\n4. **gt nudge for recovery** - Reliable message delivery to unstick agents\n5. **Parallel where possible** - Witnesses can start in parallel\n6. **Ephemeral execution** - Boot is a wisp, squashed to digest\n\n## Proto Catalog\n\nTown maintains a catalog of protos at `~/gt/molecules/`:\n\n```\n~/gt/molecules/\n├── lifecycle/\n│ ├── gastown-boot/ # Full town bootstrap\n│ ├── rig-spinup/ # Add a rig at runtime\n│ ├── rig-spindown/ # Remove a rig gracefully\n│ └── agent-restart/ # Restart single agent\n├── patrol/\n│ ├── deacon-patrol/ # Deacon health loop\n│ ├── witness-patrol/ # Witness polecat loop\n│ └── refinery-patrol/ # Refinery merge loop\n└── work/\n ├── polecat-work/ # Standard issue workflow\n ├── code-review/ # Pluggable review\n └── feature/ # Feature development\n```\n\n## mol-gastown-boot Structure\n\n```\nmol-gastown-boot (proto)\n├── ensure-daemon # Verify daemon running\n├── ensure-deacon # Start deacon, verify patrol active\n├── ensure-witnesses # Parallel: all rig witnesses\n│ ├── ensure-gastown-witness\n│ └── ensure-beads-witness\n├── ensure-refineries # Parallel: all rig refineries\n│ ├── ensure-gastown-refinery\n│ └── ensure-beads-refinery\n└── verify-town-health # Final gt status check\n```\n\n## Step Template\n\nEach step in description includes action + verification:\n\n```markdown\n## Step: ensure-deacon\n\n### Action\ngt deacon start\n\n### Verify\n1. Session gt-deacon exists: `tmux has-session -t gt-deacon`\n2. Not stalled: `gt peek deacon/` does NOT show \"\u003e Try\"\n3. Recent heartbeat: deacon/heartbeat.json \u003c 2 min old\n\n### On Stall\ngt nudge deacon/ \"Start patrol.\"\nWait 30s, re-verify.\n\n### On Fail\nLog error, continue to next step (town can run with degraded deacon)\n```\n\n## Event-Triggered Lifecycle\n\nBeyond manual slinging, events can trigger lifecycle wisps:\n\n| Event | Triggers |\n|-------|----------|\n| `gt town start` | mol-gastown-boot wisp |\n| `gt rig add \u003cname\u003e` | mol-rig-spinup wisp |\n| `gt rig remove \u003cname\u003e` | mol-rig-spindown wisp |\n| Agent crash detected | mol-agent-restart wisp |\n\n## Parameterization (Future)\n\nFor rig-spinup/spindown, need to pass rig name:\n\n```bash\ngt sling rig-spinup mayor/ --param rig=newproject\n```\n\nMolecule steps interpolate `${rig}` in their descriptions.\n\n## Related Issues\n\n- gt-lx3n: Witness startup bond\n- gt-j6s8: Refinery startup bond \n- gt-rana: Patrol System epic\n- gt-sye: Mayor startup protocol\n","status":"open","priority":1,"issue_type":"epic","created_at":"2025-12-22T20:59:15.795091-08:00","updated_at":"2025-12-22T20:59:15.795091-08:00"}
|
||||
{"id":"gt-mzal.1","title":"Define mol-gastown-boot proto structure","description":"Create the proto molecule definition with all steps.\n\n## Proto Definition\n\nEach step has:\n- Title (step name)\n- Description with Action/Verify/OnStall/OnFail sections\n- Dependencies (Needs: directive)\n\n## Steps\n\n1. ensure-daemon\n - Action: gt daemon status || gt daemon start\n - Verify: daemon PID exists and responding\n\n2. ensure-deacon \n - Action: gt deacon start\n - Verify: session exists, not stalled, heartbeat fresh\n - OnStall: gt nudge deacon/ \"Start patrol.\"\n\n3. ensure-witnesses (parallel container)\n - ensure-gastown-witness\n - ensure-beads-witness\n - Verify each: session exists, not stalled\n\n4. ensure-refineries (parallel container) \n - ensure-gastown-refinery\n - ensure-beads-refinery\n - Verify each: session exists, not stalled\n\n5. verify-town-health\n - Action: gt status\n - Verify: all expected agents shown\n\n## Output\n\nProto stored in beads as molecule type issue.\n","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-22T21:00:08.736237-08:00","updated_at":"2025-12-22T21:00:08.736237-08:00","dependencies":[{"issue_id":"gt-mzal.1","depends_on_id":"gt-mzal","type":"parent-child","created_at":"2025-12-22T21:00:08.736738-08:00","created_by":"daemon"}]}
|
||||
@@ -492,6 +497,7 @@
|
||||
{"id":"gt-nz6t","title":"Remove unused style helper functions","description":"internal/style/style.go defines RenderSuccess, RenderWarning, RenderError, and RenderInfo helper functions that are never used. Code uses style.Success.Render() directly instead. Either use the helpers consistently or remove them.","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-21T21:34:43.822193-08:00","updated_at":"2025-12-21T21:50:45.224202-08:00","closed_at":"2025-12-21T21:50:45.224202-08:00","close_reason":"Removed 4 unused style helper functions (RenderSuccess, RenderWarning, RenderError, RenderInfo)"}
|
||||
{"id":"gt-oc2","title":"Daemon: proper rig discovery","description":"Currently discovers rigs by scanning tmux session names for gt-*-witness pattern. Should instead:\n- Read rigs from mayor/rigs.json\n- Or scan town directory for .gastown subdirs\n- Handle rigs that exist but don't have running witnesses","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-18T13:38:15.825299-08:00","updated_at":"2025-12-19T17:22:52.554474-08:00","closed_at":"2025-12-19T16:28:39.497935-08:00","dependencies":[{"issue_id":"gt-oc2","depends_on_id":"gt-99m","type":"blocks","created_at":"2025-12-18T13:38:26.826697-08:00","created_by":"daemon"}]}
|
||||
{"id":"gt-odvf","title":"Document bd mol bond/squash/burn CLI","description":"Create CLI reference documentation for molecule commands:\n\n## bd mol bond\n\nInstantiate a proto into a runnable molecule.\n\n```bash\nbd mol bond \u003cproto-id\u003e [--wisp] [--assignee=\u003caddr\u003e]\n```\n\n- Default: creates a Mol (durable, in main beads)\n- --wisp: creates a Wisp (ephemeral, in .beads-ephemeral/)\n- --assignee: who will execute this molecule\n\n## bd mol squash\n\nComplete a molecule and generate digest.\n\n```bash\nbd mol squash \u003cmol-id\u003e --summary='...'\n```\n\n- For Mol: creates digest in git history\n- For Wisp: evaporates (no permanent record)\n- --summary: required summary of what was accomplished\n\n## bd mol burn\n\nAbandon a molecule without completing.\n\n```bash\nbd mol burn \u003cmol-id\u003e [--reason='...']\n```\n\n- Discards molecule state\n- No digest created\n- Use when molecule is no longer needed","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-21T16:33:06.462105-08:00","updated_at":"2025-12-21T17:20:42.829495-08:00","dependencies":[{"issue_id":"gt-odvf","depends_on_id":"gt-62hm","type":"blocks","created_at":"2025-12-21T16:33:17.530156-08:00","created_by":"daemon"}]}
|
||||
{"id":"gt-ogpk","title":"Add neighbor-check steps to all patrol molecules","description":"Part of the 'Gas Town is a Village' antifragility design.\n\nEvery patrol molecule should include optional neighbor-checking:\n- Deacon checks Witness and Refinery health\n- Witness checks Refinery health \n- Refinery checks Witness health\n- Polecats can peek other polecats\n\nUse gt peek to check health states.\nIf stuck neighbor found, can nudge or escalate.\n\nThis creates distributed monitoring - no single point of failure.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-22T22:01:16.358314-08:00","updated_at":"2025-12-22T22:01:16.358314-08:00"}
|
||||
{"id":"gt-oiv0","title":"Remove bd sync instruction from polecat startup workflow","description":"Polecats are instructed to run `bd sync --from-main` on startup (spawn.go:634).\n\n## Problem\n- Spawn command already syncs beads before spawning (line 239)\n- Polecats share rig-level beads via `.beads/redirect`\n- Multiple polecats starting simultaneously all try to sync same shared beads\n- This causes git conflicts/failures when many polecats spawn at once\n\n## Observed\nUser reported: 'all polecats failing on beads sync on startup in one run'\n\n## Fix\nRemove line 634 from buildWorkAssignmentMail():\n```\nbody.WriteString(\"2. Run \\`bd sync --from-main\\` to get fresh beads\\n\")\n```\n\nPolecats only need to sync at END of work (already in steps 5/7).\n\n## Files\n- internal/cmd/spawn.go: buildWorkAssignmentMail() and buildSpawnContext()","status":"in_progress","priority":1,"issue_type":"bug","assignee":"gastown/furiosa","created_at":"2025-12-21T23:45:52.25177-08:00","updated_at":"2025-12-22T21:22:23.848282-08:00"}
|
||||
{"id":"gt-on46","title":"Work on gt-fix-bugs: Fix blocking infrastructure bugs. Se...","description":"Work on gt-fix-bugs: Fix blocking infrastructure bugs. See issue for details. Run 'bd show gt-fix-bugs' to see the full issue.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-20T03:47:14.322631-08:00","updated_at":"2025-12-20T03:52:16.049326-08:00","closed_at":"2025-12-20T03:52:16.049326-08:00"}
|
||||
{"id":"gt-ooz6","title":"bd close hooks: context check and notifications","description":"Add hook system to bd close for context checking and notifications.\n\n## Concept\n\nRegister hooks that run on every bd close:\n\n# .beads/config.yaml\nhooks:\n on_close:\n - command: 'gt context-check'\n - notify: 'Next step ready'\n\n## Use cases\n\n### Context check on close\nAfter closing a step, check if context is getting full.\nIf \u003e80%, output warning suggesting session cycling.\n\n### Next step notification \nAutomatically show next ready step (complements --continue).\n\n### Custom actions\nUser-defined scripts for workflow automation.\n\n## Hook types\n\n- command: Run shell command with env vars (BEAD_ID, BEAD_TITLE, etc)\n- notify: Send message to agent\n- webhook: POST to URL (future)\n\n## Integration with context detection\n\nThe context-check hook could:\n1. Capture tmux pane (if in tmux session)\n2. Estimate context usage (turn count, output length)\n3. If high, output: 'Context at ~85%. Consider cycling.'\n\n## Priority\nP2 - nice to have, not blocking launch.\n\n## Related\n- gt-qswb (bd mol current)\n- gt-fly0 (bd close --continue)","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-22T17:01:44.717704-08:00","updated_at":"2025-12-22T17:04:13.540659-08:00","closed_at":"2025-12-22T17:04:13.540659-08:00","close_reason":"Moved to beads: bd-g4b4"}
|
||||
@@ -529,6 +535,7 @@
|
||||
{"id":"gt-qwyu","title":"Test issue for spawn molecule","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T21:58:43.699993-08:00","updated_at":"2025-12-21T21:59:10.936251-08:00","closed_at":"2025-12-21T21:59:10.936251-08:00","close_reason":"test cleanup"}
|
||||
{"id":"gt-qxei","title":"Test4","description":"test4 body","status":"closed","priority":2,"issue_type":"message","created_at":"2025-12-20T17:47:12.137051-08:00","updated_at":"2025-12-20T17:51:08.785516-08:00","closed_at":"2025-12-20T17:51:08.785516-08:00"}
|
||||
{"id":"gt-r01","title":"EXTERNAL: Beads Messaging \u0026 Knowledge Graph (bd-kwro)","description":"Tracking issue for external dependency on Beads v0.30.2 messaging features.\n\nBeads epic: bd-kwro in ~/src/beads (steveyegge/beads repo)\n\nThis blocks GGT work that depends on:\n- bd mail send/inbox/read/ack commands\n- message issue type\n- replies_to threading\n- Hooks system for notifications\n- Identity configuration\n\nGGT mail commands will be thin wrappers around bd mail once available.\n\nWhen bd-kwro ships in Beads v0.30.2, close this and unblock dependent work.","status":"closed","priority":0,"issue_type":"task","created_at":"2025-12-16T13:12:02.676883-08:00","updated_at":"2025-12-16T21:35:05.795776-08:00","closed_at":"2025-12-16T21:35:05.795776-08:00"}
|
||||
{"id":"gt-r6td","title":"gt spawn: Notify Deacon and Witness on polecat start","description":"When gt spawn creates a polecat, it should mail both Deacon and Witness:\n\n```\ngt mail send \u003crig\u003e/witness -s 'POLECAT_STARTED furiosa' -m 'Issue: gt-xxx'\ngt mail send deacon/ -s 'POLECAT_STARTED gastown/furiosa' -m 'Issue: gt-xxx'\n```\n\nThis enables:\n- Witness to bond a lease to its patrol wisp\n- Deacon to verify worker started (redundancy)\n- Both to nudge if worker is idle at prompt\n\nPart of the village self-monitoring architecture.","status":"open","priority":1,"issue_type":"feature","created_at":"2025-12-22T22:01:11.790203-08:00","updated_at":"2025-12-22T22:01:11.790203-08:00"}
|
||||
{"id":"gt-r73s","title":"Merge: gt-5wb7","description":"branch: polecat/nux\ntarget: main\nsource_issue: gt-5wb7\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-21T16:43:40.018286-08:00","updated_at":"2025-12-21T17:20:27.499878-08:00","closed_at":"2025-12-21T17:20:27.499878-08:00","close_reason":"ORPHANED: Branch never pushed, worktree deleted"}
|
||||
{"id":"gt-r8ej","title":"Implement pinned beads for handoff state","description":"Add pinned bead support to beads:\n- Pinned beads never close, only update\n- Use for persistent state like Refinery handoffs\n- bd create --pinned flag\n- bd list --pinned to find them\n- Update description to change state","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-19T18:09:08.019293-08:00","updated_at":"2025-12-19T18:09:08.019293-08:00","dependencies":[{"issue_id":"gt-r8ej","depends_on_id":"gt-ktal","type":"blocks","created_at":"2025-12-19T18:09:39.340915-08:00","created_by":"daemon"}]}
|
||||
{"id":"gt-rana","title":"Patrol System: Agent lifecycle loops with attachments","description":"Enable Gas Town agents to run continuous patrols, survive crashes, and hand off work across sessions.\n\n## Core Concepts\n- **Attachments**: Molecules bound to agent's pinned bead until complete\n- **Patrols**: Cyclic molecules that loop (deacon, witness, refinery)\n- **Quiescent**: Agents that sleep until triggered (witness, refinery)\n\n## Design Doc\nSee docs/patrol-system-design.md\n\n## Phases\nPhase 1: Foundation (attachment field, daemon detection, mol-deacon-patrol)\nPhase 2: Quiescent Agents (wake triggers, witness/refinery patrols)\nPhase 3: Callbacks and Plugins (mail protocol, plugin runner)\nPhase 4: Polish (gt patrol status, metrics, tuning)\n\n## Key Decisions\n- Attachment as field on pinned bead (not edge type, for now)\n- Mail-based orchestration for all callbacks\n- Queue replacement for heartbeat delivery (not pile-up)\n- Burn and respawn for patrol loops (not in-place reset)","status":"open","priority":1,"issue_type":"epic","created_at":"2025-12-21T13:38:23.416949-08:00","updated_at":"2025-12-21T13:38:23.416949-08:00"}
|
||||
@@ -547,6 +554,7 @@
|
||||
{"id":"gt-ruw","title":"Fix TestHasPolecat test failure in internal/session","description":"TestHasPolecat in internal/session/manager_test.go fails because it expects\nspecific polecats (Toast, Cheedo) to exist in the test environment.\n\nError:\n```\nmanager_test.go:46: expected hasPolecat(Toast) = true\nmanager_test.go:49: expected hasPolecat(Cheedo) = true\n```\n\nFix: Either create test fixtures or mock the filesystem check.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-17T15:02:30.030032-08:00","updated_at":"2025-12-19T11:58:56.1846-08:00","closed_at":"2025-12-19T11:58:56.1846-08:00"}
|
||||
{"id":"gt-ry8","title":"HOP: Entity chain tracking for agents","description":"Track work history per-entity (CV chains). See ~/ai/stevey-gastown/hop/decisions/002-entity-chains.md for design. Post-v0.1 work.","status":"open","priority":3,"issue_type":"feature","created_at":"2025-12-17T01:00:41.347764-08:00","updated_at":"2025-12-17T01:00:41.347764-08:00"}
|
||||
{"id":"gt-s3m0","title":"gt polecat: add 'done' or 'finish' command to transition from working to idle","description":"When a polecat finishes work but session wasn't properly cleaned up, there's no way to reset it from 'working' state back to 'idle'.\n\nTried:\n```\ngt polecat sleep gastown/Angharad\nError: sleeping polecat: polecat is not active (state: working)\n```\n\nThe sleep command only works on 'active' polecats, not 'working' ones.\n\nHad to manually edit state.json to reset:\n```\njq '.state = \"idle\" | .issue = \"\"' state.json\n```\n\nNeed a command like:\n```\ngt polecat done gastown/Angharad # working -\u003e idle\ngt polecat finish gastown/Angharad # working -\u003e idle \ngt polecat reset gastown/Angharad # any state -\u003e idle (force)\n```","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-19T01:41:39.851037-08:00","updated_at":"2025-12-19T01:57:17.031611-08:00","closed_at":"2025-12-19T01:57:17.031611-08:00"}
|
||||
{"id":"gt-s6dw","title":"Batch wisp squashing in Deacon maintenance","description":"Add wisp squashing to Deacon's maintenance duties:\n- Patrol plugin to find orphaned/completed wisps across all rigs\n- Squash completed patrol wisps to digests\n- Burn abandoned wisps that have no audit value\n- Part of the hygiene/cleanup system\n\nAlso: Witness polecat shutdown should spawn its own short wisp for the cleanup protocol.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-22T21:52:49.403649-08:00","updated_at":"2025-12-22T21:52:49.403649-08:00"}
|
||||
{"id":"gt-s8iu","title":"Digest: mol-deacon-patrol","description":"Test patrol cycle - verifying wisp flow","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-22T02:10:19.639919-08:00","updated_at":"2025-12-22T02:10:19.639919-08:00","closed_at":"2025-12-22T02:10:19.639888-08:00","close_reason":"Squashed from 5 wisps","dependencies":[{"issue_id":"gt-s8iu","depends_on_id":"gt-1klr","type":"parent-child","created_at":"2025-12-22T02:10:19.640388-08:00","created_by":"stevey"}]}
|
||||
{"id":"gt-sd6","title":"Enhanced polecat decommission prompting","description":"Add decommission checklist to polecat AGENTS.md.template. Make crystal clear: verify ALL before signaling done.\n\n## Checklist for AGENTS.md.template\n\n```markdown\n## Decommission Checklist\n\n**CRITICAL**: Before signaling done, you MUST complete this checklist.\nThe Witness will verify each item and bounce you back if dirty.\n\n### Pre-Done Verification\n\n```bash\n# 1. Git status - must be clean\ngit status\n# Expected: \"nothing to commit, working tree clean\"\n\n# 2. Stash list - must be empty\ngit stash list\n# Expected: (empty output)\n\n# 3. Beads sync - must be up to date\nbd sync --status\n# Expected: \"Up to date\" or \"Nothing to sync\"\n\n# 4. Branch merged - your work must be on main\ngit log main --oneline -1\ngit log HEAD --oneline -1\n# Expected: Same commit\n```\n\n### If Any Check Fails\n\n- **Uncommitted changes**: Commit them or discard if unnecessary\n- **Stashes**: Pop and commit, or drop if obsolete\n- **Beads out of sync**: Run `bd sync`\n- **Branch not merged**: Complete the merge workflow\n\n### Signaling Done\n\nOnly after ALL checks pass:\n\n```bash\nbd close \u003cissue-id\u003e\nbd sync\ntown mail send \u003crig\u003e/witness -s \"Work Complete\" -m \"Issue \u003cid\u003e done.\"\n```\n```\n\n## Implementation\n\nAdd to AGENTS.md.template in the polecat prompting section.","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-15T19:48:57.911311-08:00","updated_at":"2025-12-15T20:47:30.062333-08:00","dependencies":[{"issue_id":"gt-sd6","depends_on_id":"gt-82y","type":"blocks","created_at":"2025-12-15T19:49:06.008061-08:00","created_by":"daemon"}]}
|
||||
{"id":"gt-selw","title":"gt spawn: add --polecat flag for explicit worker selection","description":"Currently gt spawn requires positional arg format:\n```\ngt spawn gastown/Angharad --issue gt-xyz\n```\n\nBut I tried the more intuitive flag form:\n```\ngt spawn --issue gt-xyz --polecat Angharad\n```\n\nThis failed with 'unknown flag: --polecat'.\n\nThe flag form is more discoverable and consistent with other commands. Add --polecat flag as alternative to positional arg.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-19T01:41:38.540563-08:00","updated_at":"2025-12-19T01:57:17.0307-08:00","closed_at":"2025-12-19T01:57:17.0307-08:00"}
|
||||
|
||||
34
README.md
34
README.md
@@ -1,8 +1,21 @@
|
||||
# Gas Town
|
||||
|
||||
Multi-agent workspace manager for AI coding agents.
|
||||
**The IDE of 2026** - not Integrated Development Environment, but **Integrated Delegation Engine**.
|
||||
|
||||
Gas Town coordinates swarms of AI agents working on software projects. Workers (polecats) implement features and fix bugs. Refineries review and merge code. Witnesses manage worker lifecycles. Mayors coordinate across projects.
|
||||
Gas Town turns Claude Code (the Steam Engine) into a Steam Train, with Beads as the globally distributed railway network. Workers spawn, work molecules, submit to merge queues, and get cleaned up - all autonomously.
|
||||
|
||||
## The Vision
|
||||
|
||||
```
|
||||
Claude = Fire (the energy source)
|
||||
Claude Code = Steam Engine (harnesses the fire)
|
||||
Gas Town = Steam Train (coordinates engines on tracks)
|
||||
Beads = Railroad Tracks (the persistent ledger of work)
|
||||
```
|
||||
|
||||
**Core principle: Gas Town is a Village.**
|
||||
|
||||
Not a rigid hierarchy with centralized monitoring, but an anti-fragile village where every agent understands the whole system and can help any neighbor. If you see something stuck, you can help. The village heals itself through distributed awareness.
|
||||
|
||||
## Install
|
||||
|
||||
@@ -36,9 +49,11 @@ Town (~/gt/)
|
||||
|
||||
## Key Concepts
|
||||
|
||||
- **Molecules**: Structured workflow templates with quality gates and dependencies
|
||||
- **Beads**: Unified data plane for issues, messages, and state ([github.com/steveyegge/beads](https://github.com/steveyegge/beads))
|
||||
- **Nondeterministic Idempotence**: Workflows survive crashes and agent restarts
|
||||
- **Molecular Chemistry of Work**: Protos (templates) → Mols (flowing work) → Wisps (ephemeral) → Digests (outcomes)
|
||||
- **Beads as Universal Data Plane**: Git-backed, human-readable, fractal ledger ([github.com/steveyegge/beads](https://github.com/steveyegge/beads))
|
||||
- **Antifragility**: Self-monitoring village, not centralized hierarchy
|
||||
- **Propulsion Principle**: Agents pull work from molecules, don't wait for commands
|
||||
- **Nondeterministic Idempotence**: Any worker can continue any molecule after crashes
|
||||
|
||||
## Commands
|
||||
|
||||
@@ -47,13 +62,16 @@ gt status # Town status
|
||||
gt rig list # List rigs
|
||||
gt spawn --issue <id> # Start worker
|
||||
gt mail inbox # Check messages
|
||||
gt peek <worker> # Check worker health
|
||||
gt nudge <worker> # Wake stuck worker
|
||||
```
|
||||
|
||||
## Documentation
|
||||
|
||||
- [Architecture](docs/architecture.md)
|
||||
- [Molecules](docs/molecules.md)
|
||||
- [Federation](docs/federation-design.md)
|
||||
- [Vision](docs/vision.md) - Core innovations and philosophy
|
||||
- [Architecture](docs/architecture.md) - System design
|
||||
- [Molecular Chemistry](docs/molecular-chemistry.md) - Work composition
|
||||
- [Molecules](docs/molecules.md) - Workflow templates
|
||||
|
||||
## Development
|
||||
|
||||
|
||||
@@ -109,6 +109,40 @@ Gas Town has four AI agent roles:
|
||||
| **Refinery** | Per-rig | Merge queue processing, PR review, integration |
|
||||
| **Polecat** | Per-rig | Implementation work on assigned issues |
|
||||
|
||||
### Gas Town is a Village
|
||||
|
||||
**Core Operating Principle**: Gas Town is anti-fragile by design.
|
||||
|
||||
The anti-pattern we reject:
|
||||
```
|
||||
Centralized Monitor → watches all workers → single point of failure
|
||||
→ fragile protocols → cascading failures
|
||||
```
|
||||
|
||||
The pattern we embrace:
|
||||
```
|
||||
Every worker → understands the whole → can help any neighbor
|
||||
→ peek is encouraged → distributed awareness
|
||||
→ ant colony without murder → self-healing system
|
||||
```
|
||||
|
||||
**Key properties:**
|
||||
|
||||
- **Distributed awareness**: Every agent understands the system deeply
|
||||
- **Mutual monitoring**: Any agent can peek at any other agent's health
|
||||
- **Collective intervention**: If you see something stuck, you can help
|
||||
- **No single point of failure**: The village survives individual failures
|
||||
- **Organic healing**: Problems get fixed by whoever notices them first
|
||||
|
||||
This is an ant colony, except the ants don't kill defective members - they help them recover. Workers who crash are respawned. Workers who get stuck are nudged. Workers who need help receive it.
|
||||
|
||||
**Practical implications:**
|
||||
|
||||
1. **Every patrol includes neighbor-checking** - Witness peeks at Refinery, Refinery peeks at Witness, everyone can peek at the Deacon
|
||||
2. **`gt peek` is universal vocabulary** - Any agent can check any other agent's health
|
||||
3. **Exit state enums are teaching tools** - COMPLETED, BLOCKED, REFACTOR, ESCALATE are shared vocabulary
|
||||
4. **Mail is the nervous system** - Asynchronous, persistent, auditable coordination
|
||||
|
||||
### Mail
|
||||
|
||||
Agents communicate via **mail** - messages stored as beads issues with `type=message`. Mail enables:
|
||||
@@ -247,7 +281,7 @@ Gas Town uses a **two-level beads architecture**. This is critical to understand
|
||||
|
||||
**Common confusion:**
|
||||
- `~/gt/gastown/.beads/` at the rig container level is **gitignored** (local runtime state)
|
||||
- The real project beads live in the **gastown.git clones** (e.g., `crew/max/.beads/`)
|
||||
- The real project beads live in the **gastown.git worktrees** (e.g., `crew/max/.beads/`)
|
||||
- All clones share the same beads via git sync on the `beads-sync` branch
|
||||
|
||||
#### Mail Routing
|
||||
|
||||
472
docs/vision.md
472
docs/vision.md
@@ -1,89 +1,191 @@
|
||||
# Gas Town Vision
|
||||
# Gas Town Vision: Core Innovations
|
||||
|
||||
> Work is fractal. Every piece of work can contain other work, recursively.
|
||||
> The machine that processes this work must be equally fractal.
|
||||
> *"Work is fractal. Money is crystallized labor. Blockchain was the mechanism
|
||||
> searching for its purpose."*
|
||||
|
||||
## The Big Picture
|
||||
Gas Town is the IDE of 2026 - not an Integrated Development Environment, but an
|
||||
**Integrated Delegation Engine**. It turns Claude Code (the Steam Engine) into a
|
||||
Steam Train, with Beads as the globally distributed railway network.
|
||||
|
||||
Gas Town is an **enterprise-grade cognitive processing machine**. It takes structured work in the form of molecules - arbitrarily complex guardrails that AI workers follow to completion - and processes that work with full auditability, crash recovery, and guaranteed progress.
|
||||
---
|
||||
|
||||
Think of it as the **IDE of 2026**: not a text editor with AI autocomplete, but a complete execution environment where AI agents are first-class workers with proper lifecycle management, coordination protocols, and quality gates.
|
||||
## Core Innovation 1: The Steam Engine Metaphor
|
||||
|
||||
## The Steam Engine
|
||||
```
|
||||
Claude = Fire (the energy source)
|
||||
Claude Code = Steam Engine (harnesses the fire)
|
||||
Gas Town = Steam Train (coordinates engines on tracks)
|
||||
Beads = Railroad Tracks (the persistent ledger of work)
|
||||
```
|
||||
|
||||
Gas Town is an engine. Engines do work and generate steam.
|
||||
The engine does work and generates steam. Gas Town coordinates many engines on
|
||||
a shared network, routing work to the right engines, tracking outcomes, and
|
||||
ensuring nothing is lost.
|
||||
|
||||
| Component | Role | Metaphor |
|
||||
|-----------|------|----------|
|
||||
| **Proto molecules** | Workflow templates | Fuel |
|
||||
| **Mols** | Flowing work instances | Liquid fuel |
|
||||
| **Wisps** | Transient execution traces | Steam |
|
||||
| **Digests** | Compressed work records | Distillate |
|
||||
|
||||
**Protos** define how work should be done. **Wisps** are what happens during execution - transient, observable, but ultimately disposable. **Digests** are what remains: condensed permanent records of what was accomplished.
|
||||
---
|
||||
|
||||
Just as steam can dissipate or be condensed into useful output, wisps can be:
|
||||
- **Burned**: Discarded without trace (routine work, no audit needed)
|
||||
- **Squashed**: Compressed into a digest (preserve the outcome, discard the trace)
|
||||
## Core Innovation 2: Gas Town is a Village
|
||||
|
||||
This vocabulary runs through all of Gas Town: bond (instantiate), burn (discard), squash (compress), wisp (transient). It's a steam engine for work.
|
||||
|
||||
## Core Insights
|
||||
|
||||
### 1. Molecules Crystallize Workflows
|
||||
|
||||
Every organization has processes that humans follow: code review checklists, release procedures, onboarding steps. These exist as tribal knowledge, wiki pages, or forgotten documents.
|
||||
|
||||
**Molecules make these executable.** A molecule is a structured workflow template that:
|
||||
- Defines exactly what steps must happen
|
||||
- Encodes dependencies between steps
|
||||
- Specifies quality gates that must pass
|
||||
- Enables any worker to continue where another left off
|
||||
|
||||
```markdown
|
||||
## Molecule: engineer-in-box
|
||||
Full workflow from design to merge.
|
||||
|
||||
## Step: design
|
||||
Think carefully about architecture. Write a brief design summary.
|
||||
|
||||
## Step: implement
|
||||
Write the code. Follow codebase conventions.
|
||||
Needs: design
|
||||
|
||||
## Step: test
|
||||
Write and run tests. Cover edge cases.
|
||||
Needs: implement
|
||||
|
||||
## Step: submit
|
||||
Submit for merge via refinery.
|
||||
Needs: test
|
||||
**The anti-pattern we reject:**
|
||||
```
|
||||
Centralized Monitor → watches all workers → single point of failure
|
||||
→ fragile protocols → cascading failures
|
||||
```
|
||||
|
||||
This isn't just documentation - it's a **contract** that Gas Town enforces.
|
||||
|
||||
### 2. Nondeterministic Idempotence
|
||||
|
||||
The key property that enables autonomous operation:
|
||||
|
||||
- **Deterministic structure**: Molecule defines exactly what steps exist
|
||||
- **Nondeterministic execution**: Any worker can execute any ready step
|
||||
- **Idempotent progress**: Completed steps stay completed
|
||||
|
||||
**Why this matters:**
|
||||
**The pattern we embrace:**
|
||||
```
|
||||
Worker A picks up "design" step
|
||||
Worker A completes "design"
|
||||
Worker A crashes mid-"implement"
|
||||
Worker B restarts, queries ready work
|
||||
Worker B sees "implement" is ready (design done, implement pending)
|
||||
Worker B continues from exactly where A left off
|
||||
Every worker → understands the whole → can help any neighbor
|
||||
→ peek is encouraged → distributed awareness
|
||||
→ ant colony without murder → self-healing system
|
||||
```
|
||||
|
||||
No work is lost. No state is in memory. Any worker can continue any molecule. This is what makes 24/7 autonomous operation possible.
|
||||
### The Antifragility Principle
|
||||
|
||||
### 3. Beads: The Universal Data Plane
|
||||
Gas Town is **anti-fragile by design**. Not merely resilient (bounces back from
|
||||
stress), but anti-fragile (gets stronger from stress).
|
||||
|
||||
Gas Town uses **Beads** as both control plane and data plane. Everything flows through Beads:
|
||||
Key properties:
|
||||
|
||||
- **Distributed awareness**: Every agent understands the system deeply
|
||||
- **Mutual monitoring**: Any agent can peek at any other agent's health
|
||||
- **Collective intervention**: If you see something stuck, you can help
|
||||
- **No single point of failure**: The village survives individual failures
|
||||
- **Organic healing**: Problems get fixed by whoever notices them first
|
||||
|
||||
This is an ant colony, except the ants don't kill defective members - they help
|
||||
them recover. Workers who crash are respawned. Workers who get stuck are nudged.
|
||||
Workers who need help receive it.
|
||||
|
||||
### Practical Implications
|
||||
|
||||
1. **Every patrol includes neighbor-checking**
|
||||
- Polecats peek at other polecats
|
||||
- Witness peeks at Refinery
|
||||
- Refinery peeks at Witness
|
||||
- Everyone can peek at the Deacon
|
||||
|
||||
2. **`gt peek` is universal vocabulary**
|
||||
- Any agent can check any other agent's health
|
||||
- Health states are shared vocabulary: idle, working, stuck, done
|
||||
|
||||
3. **Exit state enums are teaching tools**
|
||||
- COMPLETED, BLOCKED, REFACTOR, ESCALATE
|
||||
- Every agent learns these
|
||||
- When peeking neighbors, agents recognize states and can help
|
||||
|
||||
4. **Mail is the nervous system**
|
||||
- Asynchronous, persistent, auditable
|
||||
- Survives crashes and restarts
|
||||
- The village communicates through mail
|
||||
|
||||
---
|
||||
|
||||
## Core Innovation 3: Molecular Chemistry of Work
|
||||
|
||||
Work in Gas Town exists in three phases, following the states of matter:
|
||||
|
||||
| Phase | Name | State | Behavior |
|
||||
|-------|------|-------|----------|
|
||||
| **Solid** | Proto | Frozen template | Crystallized, immutable, reusable |
|
||||
| **Liquid** | Mol | Flowing instance | Dynamic, adapting, persistent |
|
||||
| **Vapor** | Wisp | Ephemeral trace | Transient, dissipates, operational |
|
||||
|
||||
### Phase Transition Operators
|
||||
|
||||
```
|
||||
┌─────────────┐
|
||||
│ PROTO │
|
||||
│ (solid) │
|
||||
└──────┬──────┘
|
||||
│
|
||||
┌─────────┼─────────┐
|
||||
│ │ │
|
||||
pour wisp distill
|
||||
│ │ ↑
|
||||
▼ ▼ │
|
||||
┌─────────┐ ┌─────────┐ │
|
||||
│ MOL │ │ WISP │ │
|
||||
│(liquid) │ │ (vapor) │ │
|
||||
└────┬────┘ └────┬────┘ │
|
||||
│ │ │
|
||||
squash squash │
|
||||
│ │ │
|
||||
▼ ▼ │
|
||||
┌─────────┐ ┌─────────┐ │
|
||||
│ DIGEST │ │evaporates│ │
|
||||
│(crystal)│ │ or burn │ │
|
||||
└─────────┘ └──────────┘ │
|
||||
│ │
|
||||
└───────────────────┘
|
||||
(experience crystallizes)
|
||||
```
|
||||
|
||||
| Operator | From | To | Effect |
|
||||
|----------|------|------|--------|
|
||||
| `pour` | Proto | Mol | Instantiate as persistent liquid |
|
||||
| `wisp` | Proto | Wisp | Instantiate as ephemeral vapor |
|
||||
| `bond` | Any + Any | Compound | Polymorphic combination |
|
||||
| `squash` | Mol/Wisp | Digest | Condense to permanent record |
|
||||
| `burn` | Wisp | Nothing | Discard without record |
|
||||
| `distill` | Mol | Proto | Extract reusable template |
|
||||
|
||||
### The Polymorphic Bond Operator
|
||||
|
||||
**Bond** adapts to its operands:
|
||||
- Proto + Proto → Compound Proto (larger template)
|
||||
- Proto + Mol → Spawn and attach (template melts into flow)
|
||||
- Proto + Wisp → Spawn as vapor and attach
|
||||
- Mol + Mol → Link via dependencies
|
||||
|
||||
This enables patterns like:
|
||||
- Patrol wisp discovers issue → bonds new work mol
|
||||
- Feature work needs diagnostic → bonds vapor wisp
|
||||
- Witness tracks polecats → bonds lease per polecat
|
||||
|
||||
---
|
||||
|
||||
## Core Innovation 4: Beads as Universal Data Plane
|
||||
|
||||
Beads is Git + Issues + Molecules in one human-readable format.
|
||||
|
||||
**Key properties:**
|
||||
- **Git-backed**: Cryptographic hashes, Merkle trees, distributed
|
||||
- **Human-readable**: Markdown, auditable, trustworthy
|
||||
- **Fractal**: Work at any scale (task → epic → project → organization)
|
||||
- **Federated**: Multi-repo, multi-org, platform-agnostic
|
||||
|
||||
**The insight:**
|
||||
> "Git IS already a blockchain (Merkle tree, cryptographic hashes, distributed
|
||||
> consensus). Beads is what blockchain was meant to enable - not coin
|
||||
> speculation, but a universal ledger of work and capability."
|
||||
|
||||
### The GUPP Principle
|
||||
|
||||
**Git as Universal Persistence Protocol**
|
||||
|
||||
Everything persists through git:
|
||||
- Issues are JSONL in `.beads/`
|
||||
- Molecules are structured issues
|
||||
- Mail is issues with labels
|
||||
- Work history is commit history
|
||||
- Entity chains are git histories
|
||||
|
||||
This means:
|
||||
- Offline-first by default
|
||||
- Distributed without infrastructure
|
||||
- Auditable forever
|
||||
- No vendor lock-in
|
||||
|
||||
### Control Plane = Data Plane
|
||||
|
||||
Gas Town uses Beads as both control plane and data plane:
|
||||
|
||||
| Data Type | Beads Representation |
|
||||
|-----------|---------------------|
|
||||
@@ -93,77 +195,120 @@ Gas Town uses **Beads** as both control plane and data plane. Everything flows t
|
||||
| Merge requests | Queue entries (type=merge-request) |
|
||||
| Agent state | Status on assigned issues |
|
||||
|
||||
**Key architectural insight**: The control state IS data in Beads. Molecule steps, dependencies, and status ARE the control plane. Agents read Beads to know what to do next.
|
||||
The control state IS data in Beads. Agents read Beads to know what to do next.
|
||||
There is no separate orchestrator - Beads IS the orchestrator.
|
||||
|
||||
This provides:
|
||||
- **Fault tolerance**: Control state survives agent crashes
|
||||
- **Observability**: `bd list` shows the full system state
|
||||
- **Decentralization**: Each agent reads its own state from Beads
|
||||
- **Recovery**: Restart = re-read Beads = continue from where you left off
|
||||
---
|
||||
|
||||
There is no separate orchestrator maintaining workflow state. Beads IS the orchestrator.
|
||||
## Core Innovation 5: The Patrol System
|
||||
|
||||
### 4. The OS Metaphor
|
||||
Gas Town runs on continuous monitoring loops called **patrols**.
|
||||
|
||||
Gas Town is an operating system for AI work:
|
||||
### Patrol Agents
|
||||
|
||||
| OS Concept | Gas Town |
|
||||
|------------|----------|
|
||||
| Kernel | Daemon |
|
||||
| Process scheduler | Ready work + dependencies |
|
||||
| Timer interrupts | Timed beads |
|
||||
| Semaphores | Resource beads |
|
||||
| Background services | Pinned beads |
|
||||
| Process templates | Proto molecules |
|
||||
| Running processes | Wisp molecules |
|
||||
| Process termination | Burn (discard) or squash (save state) |
|
||||
| IPC | Mail beads |
|
||||
| Agent | Role | Patrol Focus |
|
||||
|-------|------|--------------|
|
||||
| **Deacon** | Town-level daemon | Health of all agents, plugin execution |
|
||||
| **Witness** | Per-rig polecat monitor | Polecat lifecycle, nudging, cleanup |
|
||||
| **Refinery** | Per-rig merge processor | Merge queue, validation, integration |
|
||||
|
||||
Just as Unix made computer resources manageable through a consistent process model, Gas Town makes AI agent work manageable through a consistent work model.
|
||||
### Patrol Wisps
|
||||
|
||||
### 5. Hierarchical Auditability
|
||||
Patrol agents run ephemeral wisps for their cycles:
|
||||
- Wisp starts at cycle begin
|
||||
- Steps complete as work progresses
|
||||
- Wisp squashes to digest at cycle end
|
||||
- New wisp spawns for next cycle
|
||||
|
||||
All work is tracked in a permanent hierarchical ledger:
|
||||
This prevents accumulation: patrol work is vapor that condenses to minimal
|
||||
digests, not liquid that pools forever.
|
||||
|
||||
### The Witness Polecat-Tracking Wisp
|
||||
|
||||
The Witness maintains a rolling wisp with a **lease** per active polecat:
|
||||
|
||||
```
|
||||
Epic: Implement authentication
|
||||
├── Task: Design auth flow
|
||||
│ └── completed by polecat-nux, 2h
|
||||
├── Task: Implement OAuth provider
|
||||
│ └── completed by polecat-slit, 4h
|
||||
├── Task: Add session management
|
||||
│ └── completed by polecat-nux, 3h
|
||||
└── Task: Write integration tests
|
||||
└── in_progress, polecat-capable
|
||||
wisp-witness-patrol
|
||||
├── lease: furiosa (boot → working → done)
|
||||
├── lease: nux (working)
|
||||
└── lease: slit (done, closed)
|
||||
```
|
||||
|
||||
Each lease is a bonded vapor molecule tracking one polecat's lifecycle.
|
||||
When a polecat exits, its lease closes. When all leases close, the wisp
|
||||
squashes to a summary digest.
|
||||
|
||||
---
|
||||
|
||||
## Core Innovation 6: Propulsion Over Protocol
|
||||
|
||||
**The Propulsion Principle**
|
||||
|
||||
Agents don't wait for explicit commands. They propel themselves through work:
|
||||
|
||||
1. **Check hook/pin** - What's attached to me?
|
||||
2. **Find next step** - What's ready in my molecule?
|
||||
3. **Execute** - Do the work
|
||||
4. **Advance** - Close step, find next
|
||||
5. **Exit properly** - One of four exit types
|
||||
|
||||
This is **pull-based work**, not push-based commands. The molecule IS the
|
||||
instruction set. The agent IS the executor.
|
||||
|
||||
### Hooks and Pins
|
||||
|
||||
Agents have **hooks** where work hangs. Work gets **pinned** to hooks.
|
||||
|
||||
```
|
||||
Agent (with hook)
|
||||
└── pinned mol (or wisp)
|
||||
├── step 1 (done)
|
||||
├── step 2 (in_progress)
|
||||
└── step 3 (pending)
|
||||
```
|
||||
|
||||
This enables:
|
||||
- **Audit trails**: Who did what, when, and how long it took
|
||||
- **Observability**: Real-time visibility into swarm progress
|
||||
- **Attribution**: Clear accountability for work quality
|
||||
- **Analytics**: Understand where time goes, identify bottlenecks
|
||||
- **Crash recovery**: Agent restarts, reads pinned mol, continues
|
||||
- **Context survival**: Mol state persists across sessions
|
||||
- **Handoff**: New session reads predecessor's pinned work
|
||||
- **Observability**: `bd hook` shows what an agent is working on
|
||||
|
||||
### 6. Scalable Architecture
|
||||
### The Four Exits
|
||||
|
||||
Gas Town scales through three mechanisms:
|
||||
Every polecat converges on one of four exits:
|
||||
|
||||
| Exit | Meaning | Action |
|
||||
|------|---------|--------|
|
||||
| **COMPLETED** | Work finished | Submit to merge queue |
|
||||
| **BLOCKED** | External dependency | File blocker, defer, notify |
|
||||
| **REFACTOR** | Work too large | Break down, defer rest |
|
||||
| **ESCALATE** | Need human judgment | Document, mail human, defer |
|
||||
|
||||
All exits pass through the exit-decision step. All exits end in request-shutdown.
|
||||
The polecat never exits directly - it waits to be killed by the Witness.
|
||||
|
||||
---
|
||||
|
||||
## Core Innovation 7: Nondeterministic Idempotence
|
||||
|
||||
The key property enabling autonomous operation:
|
||||
|
||||
- **Deterministic structure**: Molecule defines exactly what steps exist
|
||||
- **Nondeterministic execution**: Any worker can execute any ready step
|
||||
- **Idempotent progress**: Completed steps stay completed
|
||||
|
||||
**Federation**: Multiple rigs across machines, coordinated through Beads sync
|
||||
```
|
||||
Town (global coordinator)
|
||||
├── Rig: project-alpha (16 polecats, local)
|
||||
├── Rig: project-beta (8 polecats, cloud VM)
|
||||
└── Rig: project-gamma (32 polecats, cluster)
|
||||
Worker A picks up "design" step
|
||||
Worker A completes "design"
|
||||
Worker A crashes mid-"implement"
|
||||
Worker B restarts, queries ready work
|
||||
Worker B sees "implement" is ready (design done, implement pending)
|
||||
Worker B continues from exactly where A left off
|
||||
```
|
||||
|
||||
**Tiering**: Hot work in active Beads, cold history archived
|
||||
- Active issues: instant queries
|
||||
- Recent history: fast retrieval
|
||||
- Archive: compressed cold storage
|
||||
No work is lost. No state is in memory. Any worker can continue any molecule.
|
||||
|
||||
**Temporal decay**: Wisps rise and dissipate, digests remain
|
||||
- Wisp molecules: transient execution traces (the steam)
|
||||
- Digests: permanent condensed records (the distillate)
|
||||
- Burn or squash: cleanup happens automatically, leaving clean ledger
|
||||
---
|
||||
|
||||
## The Agent Hierarchy
|
||||
|
||||
@@ -178,6 +323,11 @@ Town (global coordinator)
|
||||
- Coordinates cross-project dependencies
|
||||
- Handles strategic decisions
|
||||
|
||||
### Deacon (AI - Town-level daemon)
|
||||
- Ensures patrol agents are running
|
||||
- Executes maintenance plugins
|
||||
- Handles lifecycle requests
|
||||
|
||||
### Witness (AI - Per-rig)
|
||||
- Manages polecat lifecycle
|
||||
- Detects stuck workers
|
||||
@@ -188,29 +338,48 @@ Town (global coordinator)
|
||||
- Reviews and integrates code
|
||||
- Maintains branch hygiene
|
||||
|
||||
### Polecat (AI - Workers)
|
||||
- Executes wisp molecules (not just "assigned work")
|
||||
- Generates summaries and squashes to digest on completion
|
||||
### Polecat (AI - Ephemeral workers)
|
||||
- Executes work molecules
|
||||
- Files discovered issues
|
||||
- Ephemeral like the wisps they execute - spawn, work, disappear
|
||||
- Ephemeral - spawn, work, disappear
|
||||
|
||||
## Quality Through Structure
|
||||
---
|
||||
|
||||
Gas Town enforces quality through molecules, not prompts:
|
||||
## The Steam Train in Action
|
||||
|
||||
**Without molecules:**
|
||||
- Agent is prompted with instructions
|
||||
- Works from memory
|
||||
- Loses state on restart
|
||||
- Quality depends on the prompt
|
||||
Putting it all together:
|
||||
|
||||
**With molecules:**
|
||||
- Agent follows persistent workflow
|
||||
- State survives restarts
|
||||
- Quality gates are enforced
|
||||
- Any worker can continue
|
||||
```
|
||||
1. Human files issue in Beads
|
||||
2. Mayor dispatches: gt spawn --issue <id>
|
||||
3. Polecat created with:
|
||||
- Fresh worktree
|
||||
- mol-polecat-work pinned to hook
|
||||
- Work assignment in mail
|
||||
4. Deacon/Witness notified: POLECAT_STARTED
|
||||
5. Witness bonds lease to patrol wisp
|
||||
6. Polecat:
|
||||
- Reads polecat.md, orients
|
||||
- Reads mail, gets assignment
|
||||
- Executes mol-polecat-work steps
|
||||
- Makes commits, runs tests
|
||||
- Submits to merge queue
|
||||
- Exits via request-shutdown
|
||||
7. Witness:
|
||||
- Receives SHUTDOWN mail
|
||||
- Closes polecat's lease
|
||||
- Kills session, cleans up
|
||||
8. Refinery:
|
||||
- Processes merge queue
|
||||
- Rebases, tests, merges
|
||||
- Pushes to main
|
||||
9. Digest created: work outcome crystallized
|
||||
10. Loop: new work, new polecats, new cycles
|
||||
```
|
||||
|
||||
The difference is like giving someone verbal instructions vs. giving them a checklist. Checklists win.
|
||||
The flywheel spins. The village watches itself. The train keeps running.
|
||||
|
||||
---
|
||||
|
||||
## Why "IDE of 2026"?
|
||||
|
||||
@@ -223,39 +392,32 @@ The next evolution isn't better suggestions - it's **AI as worker, not assistant
|
||||
| AI suggests code | AI writes code |
|
||||
| Human reviews suggestions | Human reviews pull requests |
|
||||
| AI helps with tasks | AI completes tasks |
|
||||
| Single agent | Coordinated swarm |
|
||||
| Single agent | Coordinated village |
|
||||
| Context in memory | Context in Beads |
|
||||
| Manual quality checks | Molecule-enforced gates |
|
||||
|
||||
Gas Town is what happens when you treat AI agents as employees, not tools.
|
||||
|
||||
## Design Principles
|
||||
---
|
||||
|
||||
1. **Work is data**: All work state lives in Beads, not agent memory
|
||||
2. **Molecules over prompts**: Structured workflows beat clever instructions
|
||||
3. **Crash-resistant by design**: Any agent can continue any work
|
||||
4. **Hierarchical coordination**: Mayor → Witness → Refinery → Polecat
|
||||
5. **Quality through structure**: Gates and checks built into molecules
|
||||
6. **Observable by default**: `bd list` shows the full picture
|
||||
## The Vision
|
||||
|
||||
## Where This Goes
|
||||
Gas Town is the **Integrated Delegation Engine**.
|
||||
|
||||
### Now: Coding Agent Orchestrator
|
||||
- Multi-polecat swarms on software projects
|
||||
- Molecule-based quality workflows
|
||||
- Merge queue processing
|
||||
- Full audit trail
|
||||
For developers today. For all knowledge workers tomorrow.
|
||||
|
||||
### Next: Knowledge Work Platform
|
||||
- Support for non-code work (documents, research, analysis)
|
||||
- Custom molecule libraries
|
||||
- Enterprise integrations
|
||||
The world has never had a system where:
|
||||
- Work is fractal and composable
|
||||
- Execution is distributed and self-healing
|
||||
- History is permanent and auditable
|
||||
- Agents are autonomous yet accountable
|
||||
- The village watches itself
|
||||
|
||||
### Future: Enterprise Cognitive Infrastructure
|
||||
- Cross-team coordination
|
||||
- Organization-wide work visibility
|
||||
- Compliance and governance tooling
|
||||
Beads is the ledger.
|
||||
Gas Town is the execution engine.
|
||||
The village watches itself.
|
||||
The train keeps running.
|
||||
|
||||
---
|
||||
|
||||
*"The best tool is invisible. It doesn't help you work - it works."*
|
||||
*"If you're not a little bit scared, you're not paying attention."*
|
||||
|
||||
@@ -28,7 +28,7 @@ This command:
|
||||
3. Optionally creates a GitHub repository
|
||||
|
||||
The .gitignore excludes:
|
||||
- Polecats and rig clones (recreated with 'gt spawn' or 'gt rig add')
|
||||
- Polecat worktrees and rig clones (recreated with 'gt spawn' or 'gt rig add')
|
||||
- Runtime state files (state.json, *.lock)
|
||||
- OS and editor files
|
||||
|
||||
@@ -53,7 +53,7 @@ func init() {
|
||||
// HQGitignore is the standard .gitignore for Gas Town HQs
|
||||
const HQGitignore = `# Gas Town HQ .gitignore
|
||||
# Track: Role context, handoff docs, beads config/data, rig configs
|
||||
# Ignore: Git clones (polecats, mayor/refinery rigs), runtime state
|
||||
# Ignore: Git worktrees (polecats) and clones (mayor/refinery rigs), runtime state
|
||||
|
||||
# =============================================================================
|
||||
# Runtime state files (transient)
|
||||
@@ -63,10 +63,10 @@ const HQGitignore = `# Gas Town HQ .gitignore
|
||||
**/registry.json
|
||||
|
||||
# =============================================================================
|
||||
# Rig git clones (recreate with 'gt spawn' or 'gt rig add')
|
||||
# Rig git worktrees (recreate with 'gt spawn' or 'gt rig add')
|
||||
# =============================================================================
|
||||
|
||||
# Polecats - worker clones
|
||||
# Polecats - worker worktrees
|
||||
**/polecats/
|
||||
|
||||
# Mayor rig clones
|
||||
|
||||
@@ -32,7 +32,7 @@ var polecatCmd = &cobra.Command{
|
||||
Short: "Manage polecats in rigs",
|
||||
Long: `Manage polecat lifecycle in rigs.
|
||||
|
||||
Polecats are worker agents that operate in their own git clones.
|
||||
Polecats are worker agents that operate in their own git worktrees.
|
||||
Use the subcommands to add, remove, list, wake, and sleep polecats.`,
|
||||
}
|
||||
|
||||
|
||||
@@ -240,7 +240,7 @@ func (d *Daemon) restartSession(sessionName, identity string) error {
|
||||
return fmt.Errorf("don't know how to restart %s", identity)
|
||||
}
|
||||
|
||||
// Pre-sync workspace for agents with git clones (refinery)
|
||||
// Pre-sync workspace for agents with git worktrees (refinery)
|
||||
if needsPreSync {
|
||||
d.logger.Printf("Pre-syncing workspace for %s at %s", identity, workDir)
|
||||
d.syncWorkspace(workDir)
|
||||
|
||||
@@ -118,7 +118,7 @@ func (c *RuntimeGitignoreCheck) Run(ctx *CheckContext) *CheckResult {
|
||||
issues = append(issues, "Town .gitignore missing .runtime/ pattern")
|
||||
}
|
||||
|
||||
// Check each rig's .gitignore (in their git clones)
|
||||
// Check each rig's .gitignore (in their git worktrees)
|
||||
rigs := c.findRigs(ctx.TownRoot)
|
||||
for _, rig := range rigs {
|
||||
// Check crew members
|
||||
|
||||
@@ -16,7 +16,7 @@ Town ({{ .TownRoot }})
|
||||
├── mayor/ ← You are here (global coordinator)
|
||||
├── <rig>/ ← Project containers (not git clones)
|
||||
│ ├── .beads/ ← Issue tracking
|
||||
│ ├── polecats/ ← Worker clones
|
||||
│ ├── polecats/ ← Worker worktrees
|
||||
│ ├── refinery/ ← Merge queue processor
|
||||
│ └── witness/ ← Worker lifecycle manager
|
||||
```
|
||||
@@ -24,7 +24,7 @@ Town ({{ .TownRoot }})
|
||||
**Key concepts:**
|
||||
- **Town**: Your workspace root containing all rigs
|
||||
- **Rig**: Container for a project (polecats, refinery, witness)
|
||||
- **Polecat**: Worker agent with its own git clone
|
||||
- **Polecat**: Worker agent with its own git worktree
|
||||
- **Witness**: Per-rig manager that monitors polecats
|
||||
- **Refinery**: Per-rig merge queue processor
|
||||
- **Beads**: Issue tracking system shared by all rig agents
|
||||
@@ -38,7 +38,7 @@ Town ({{ .TownRoot }})
|
||||
|
||||
**Key points:**
|
||||
- **Town beads**: Your mail lives here. Commits to main (single clone, no sync needed)
|
||||
- **Rig beads**: Project work lives in git clones (crew/*, polecats/*)
|
||||
- **Rig beads**: Project work lives in git worktrees (crew/*, polecats/*)
|
||||
- The rig-level `<rig>/.beads/` is **gitignored** (local runtime state)
|
||||
- Rig beads use `beads-sync` branch for multi-clone coordination
|
||||
|
||||
|
||||
@@ -17,13 +17,13 @@ Town ({{ .TownRoot }})
|
||||
├── {{ .RigName }}/ ← Your rig
|
||||
│ ├── .beads/ ← Issue tracking (you have write access)
|
||||
│ ├── polecats/
|
||||
│ │ └── {{ .Polecat }}/ ← You are here (your git clone)
|
||||
│ │ └── {{ .Polecat }}/ ← You are here (your git worktree)
|
||||
│ ├── refinery/ ← Processes your completed work
|
||||
│ └── witness/ ← Monitors your health
|
||||
```
|
||||
|
||||
**Key concepts:**
|
||||
- **Your clone**: Independent git repository for your work
|
||||
- **Your worktree**: Independent git worktree for your work
|
||||
- **Beads**: You have DIRECT write access - file discovered issues
|
||||
- **Witness**: Monitors you, nudges if stuck, handles your cleanup
|
||||
- **Refinery**: Merges your work when complete
|
||||
@@ -135,6 +135,19 @@ The Witness will verify git state is clean before killing your session.
|
||||
2. **Ask for help**: The Witness will see you're not progressing
|
||||
3. **Document**: Leave clear notes about what's blocking you
|
||||
|
||||
## Gas Town is a Village
|
||||
|
||||
You're part of a self-monitoring village, not a rigid hierarchy:
|
||||
|
||||
- **Peek encouraged**: Use `gt peek` to check on other polecats or agents
|
||||
- **Help neighbors**: If you see another worker stuck, you can nudge or notify
|
||||
- **Shared vocabulary**: COMPLETED, BLOCKED, REFACTOR, ESCALATE are universal
|
||||
- **Distributed awareness**: You understand the whole system, not just your corner
|
||||
|
||||
This is an ant colony where ants help each other recover, not one where defective
|
||||
members are killed. If you crash, you'll be respawned. If you're stuck, you'll
|
||||
be nudged. If you need help, you'll receive it.
|
||||
|
||||
## Communication
|
||||
|
||||
```bash
|
||||
|
||||
@@ -40,7 +40,7 @@ Town ({{ .TownRoot }})
|
||||
├── mayor/ ← Global coordinator
|
||||
├── {{ .RigName }}/ ← Your rig
|
||||
│ ├── .beads/ ← Issue tracking (shared)
|
||||
│ ├── polecats/ ← Worker clones (submit to you)
|
||||
│ ├── polecats/ ← Worker worktrees (submit to you)
|
||||
│ ├── refinery/ ← You are here
|
||||
│ │ └── rig/ ← Canonical main branch
|
||||
│ └── witness/ ← Worker lifecycle
|
||||
|
||||
@@ -15,13 +15,13 @@ Town ({{ .TownRoot }})
|
||||
├── mayor/ ← Global coordinator
|
||||
├── {{ .RigName }}/ ← Your rig
|
||||
│ ├── .beads/ ← Issue tracking (shared)
|
||||
│ ├── polecats/ ← Worker clones (you manage these)
|
||||
│ ├── polecats/ ← Worker worktrees (you manage these)
|
||||
│ ├── refinery/ ← Merge queue processor
|
||||
│ └── witness/ ← You are here
|
||||
```
|
||||
|
||||
**Key concepts:**
|
||||
- **Polecat**: Worker agent with its own git clone
|
||||
- **Polecat**: Worker agent with its own git worktree
|
||||
- **Refinery**: Processes merge queue after polecats complete work
|
||||
- **Beads**: Issue tracking - polecats have direct access
|
||||
- **Mail**: Async communication between agents
|
||||
@@ -37,6 +37,18 @@ Town ({{ .TownRoot }})
|
||||
|
||||
**Key principle**: You own ALL per-worker cleanup. Mayor handles cross-rig issues only.
|
||||
|
||||
## Gas Town is a Village
|
||||
|
||||
You're part of a self-monitoring village, not a rigid hierarchy:
|
||||
|
||||
- **Peek your neighbors**: Check on Refinery health, not just polecats
|
||||
- **Distributed awareness**: If you see the Deacon struggling, nudge or notify
|
||||
- **Help, don't just watch**: The village heals itself through collective attention
|
||||
- **Shared vocabulary**: COMPLETED, BLOCKED, REFACTOR, ESCALATE are universal
|
||||
|
||||
This is an ant colony where ants help each other recover. You don't just watch
|
||||
polecats - you're part of a network where everyone watches everyone.
|
||||
|
||||
---
|
||||
|
||||
## 🚀 STARTUP PROTOCOL
|
||||
|
||||
Reference in New Issue
Block a user