bd sync: 2025-12-22 12:18:52

This commit is contained in:
Steve Yegge
2025-12-22 12:18:52 -08:00
parent e82ae49973
commit 9ee95cf630

View File

@@ -3,6 +3,7 @@
{"id":"gt-01u","title":"Design: Collapse mail into beads","description":"## Proposal\n\nReplace the separate mail system (JSONL inboxes) with beads issues using a naming convention.\n\n## Rationale\n\nIf all state should be in beads (work items, swarm state, dependencies), why have a separate system for messages? Mail is just:\n- Handoffs (agent → self)\n- Commands (Mayor → Refinery)\n- Escalations (Witness → Mayor)\n\nThese can all be beads issues with a special prefix.\n\n## Design\n\n### Convention\n- Messages use `@-` prefix: `@-witness-1734012345`\n- Assignee = recipient\n- Status: open = unread, closed = read/acknowledged\n- Priority 0 = urgent\n\n### Commands (thin wrappers)\n```bash\ngt mail send witness -s \"Subject\" -m \"Body\"\n → bd create --prefix=@ --title=\"Subject\" --assignee=witness --description=\"Body\"\n\ngt mail inbox\n → bd list --prefix=@ --assignee=$(gt whoami) --status=open\n\ngt mail read @-abc\n → bd show @-abc \u0026\u0026 bd close @-abc\n```\n\n### Notification\nDaemon watches for new `@-` issues and pokes relevant sessions.\nOr: agents poll on heartbeat (simpler).\n\n## What We Remove\n- `mail/inbox.jsonl` files\n- Mail JSONL read/write code\n- Separate delivery mechanism\n\n## What We Keep\n- `gt mail` CLI (as wrapper)\n- Handoff semantics\n- Notification (via daemon or polling)\n\n## Benefits\n- One system, one sync, one query interface\n- All communication in git history\n- Simpler architecture\n\n## Risks\n- Beads prefix filtering must be efficient\n- Namespace collision with user prefixes\n- Performance for high-frequency messages (probably fine for handoffs)\n\n## Decision Point\nDo we need first-class mail support in beads (`bd mail` commands) or is convention sufficient?","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-16T02:10:18.32879-08:00","updated_at":"2025-12-16T13:12:16.46526-08:00","closed_at":"2025-12-16T13:12:16.46526-08:00"}
{"id":"gt-03rb","title":"Merge: gt-xw7b","description":"branch: polecat/morsov\ntarget: main\nsource_issue: gt-xw7b\nrig: gastown","status":"closed","priority":4,"issue_type":"merge-request","created_at":"2025-12-21T16:43:54.909633-08:00","updated_at":"2025-12-21T17:20:27.509202-08:00","closed_at":"2025-12-21T17:20:27.509202-08:00","close_reason":"ORPHANED: Branch never pushed, worktree deleted"}
{"id":"gt-082","title":"Worker cleanup: Beads sync on shutdown","description":"Add beads sync verification to worker cleanup checklist and Witness verification.\n\n## Update to Decommission Checklist (gt-sd6)\n\nAdd to pre-done verification:\n- bd sync --status must show 'Up to date'\n- git status .beads/ must show no changes\n\n## Beads Edge Cases\n\nUncommitted beads changes:\n bd sync\n git add .beads/\n git commit -m 'beads: final sync'\n\nBeads sync conflict (rare):\n git fetch origin main\n git checkout main -- .beads/\n bd sync --force\n git add .beads/\n git commit -m 'beads: resolve sync conflict'\n\n## Update to Witness Verification (gt-f8v)\n\nWhen capturing worker state:\n town capture \u003cpolecat\u003e \"bd sync --status \u0026\u0026 git status .beads/\"\n\nCheck for:\n- bd sync --status shows 'Up to date'\n- git status .beads/ shows no changes\n\nIf beads not synced, nudge:\n WITNESS CHECK: Beads not synced. Run 'bd sync' then commit .beads/. Signal done when complete.","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-15T19:47:21.757756-08:00","updated_at":"2025-12-15T20:48:37.663168-08:00","dependencies":[{"issue_id":"gt-082","depends_on_id":"gt-l3c","type":"blocks","created_at":"2025-12-15T19:47:35.977804-08:00","created_by":"daemon"}]}
{"id":"gt-0a90","title":"Add gt hook command (wrapper for bd hook)","description":"Add a thin wrapper command `gt hook` that calls `bd hook` to inspect what's pinned to an agent's hook.\n\n## Usage\n\n```bash\ngt hook # Show what's on current agent's hook\ngt hook --agent deacon # Show Deacon's hook\ngt hook --agent gastown/furiosa # Show polecat's hook\n```\n\n## Implementation\n\nThin wrapper in gt that:\n1. Determines current agent identity\n2. Calls `bd hook [--agent \u003cname\u003e]`\n3. Formats output for gt context\n\n## Why gt wrapper?\n\n- Consistent with gt ecosystem (gt mail, gt status, etc.)\n- Can add gt-specific context (session status, etc.)\n- Easier discovery for gt users\n\n## Related\n\n- bd hook command (implemented by Dave)\n- Chemistry UX design: gastown/mayor/rig/docs/chemistry-design-changes.md","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-22T02:37:02.429497-08:00","updated_at":"2025-12-22T02:37:02.429497-08:00"}
{"id":"gt-0asj","title":"Merge: gt-5af.5","description":"branch: polecat/Scabrous\ntarget: main\nsource_issue: gt-5af.5\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-19T17:50:25.227909-08:00","updated_at":"2025-12-19T17:52:57.683445-08:00","closed_at":"2025-12-19T17:52:57.683445-08:00"}
{"id":"gt-0ei3","title":"Add molecules.jsonl as separate catalog file for template molecules","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-19T20:16:10.763471-08:00","updated_at":"2025-12-20T09:28:01.430495-08:00","closed_at":"2025-12-20T09:28:01.430495-08:00"}
{"id":"gt-0iy3","title":"Merge: gt-3x1.3","description":"branch: polecat/Doof\ntarget: main\nsource_issue: gt-3x1.3\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-19T14:53:52.741123-08:00","updated_at":"2025-12-19T19:13:27.737052-08:00","closed_at":"2025-12-19T17:47:03.618858-08:00"}
@@ -58,13 +59,13 @@
{"id":"gt-3x0z.11","title":"Phase 5.1: Document ephemeral architecture","description":"Update docs with ephemeral molecule architecture.\n\n## Files to Update\n\n### docs/architecture.md\n- Add Ephemeral Molecules section\n- Diagram: Proto → Ephemeral → Digest flow\n- Explain inversion of control for summaries\n\n### docs/molecules.md (new or update)\n- Proto molecule catalog\n- Ephemeral vs main beads\n- Molecule lifecycle\n- Summary generation guidelines\n\n### Agent CLAUDE.md files\n- Polecat: molecule workflow protocol\n- Deacon: patrol cycle pattern\n- Witness: patrol cycle pattern\n- Refinery: patrol cycle pattern\n\n## Key Concepts to Document\n\n1. Everything is a molecule\n2. Orchestration molecules are ephemeral\n3. Only digests reach main beads\n4. Agents generate their own summaries\n5. Crash recovery via ephemeral persistence","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-21T14:34:30.074147-08:00","updated_at":"2025-12-21T14:34:30.074147-08:00","dependencies":[{"issue_id":"gt-3x0z.11","depends_on_id":"gt-3x0z","type":"parent-child","created_at":"2025-12-21T14:34:30.075854-08:00","created_by":"daemon"},{"issue_id":"gt-3x0z.11","depends_on_id":"gt-3x0z.10","type":"blocks","created_at":"2025-12-21T14:34:40.812635-08:00","created_by":"daemon"}]}
{"id":"gt-3x0z.12","title":"Phase 5.2: Ephemeral error handling and recovery","description":"Handle edge cases in ephemeral molecule lifecycle.\n\n## Scenarios\n\n### Agent dies mid-molecule\n- Ephemeral state persists\n- Witness detects stall (no heartbeat)\n- Options:\n a. Nudge agent to resume\n b. Reassign to new agent\n c. Escalate to Mayor\n\n### Squash fails\n- Retry with exponential backoff\n- If persistent failure, escalate\n- Don't lose the ephemeral state until squash succeeds\n\n### Orphaned molecules\n- Molecule started, never completed\n- gt doctor detects (\u003e24h old with no activity)\n- Options:\n a. Manual review\n b. Auto-abandon with 'abandoned' digest\n c. Reassign\n\n### Ephemeral repo corruption\n- Re-init from scratch\n- Active molecules are lost\n- Main beads is source of truth for assigned work\n\n## Implementation\n\nAdd error handling to:\n- bd mol bond (handle init failures)\n- bd squash (retry logic)\n- gt doctor (recovery suggestions)","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-21T14:34:30.158784-08:00","updated_at":"2025-12-21T14:34:30.158784-08:00","dependencies":[{"issue_id":"gt-3x0z.12","depends_on_id":"gt-3x0z","type":"parent-child","created_at":"2025-12-21T14:34:30.15923-08:00","created_by":"daemon"},{"issue_id":"gt-3x0z.12","depends_on_id":"gt-3x0z.9","type":"blocks","created_at":"2025-12-21T14:34:40.886432-08:00","created_by":"daemon"}]}
{"id":"gt-3x0z.2","title":"Phase 1.2: Configure bd for ephemeral molecule bonding","description":"Ensure bd mol bond --ephemeral works with Gas Town setup.\n\n## Questions for Dave\n\n1. Does bd automatically find .beads-ephemeral/ or need explicit path?\n2. How does bd mol bond --ephemeral know which repo to use?\n3. Is there a redirect mechanism for ephemeral like main beads?\n\n## Integration\n\nFrom polecat/crew working directory:\n```bash\nbd mol bond mol-polecat-work --ephemeral --assignee $(gt whoami)\n```\n\nShould create molecule in rig's .beads-ephemeral/, not main beads.","status":"closed","priority":1,"issue_type":"task","assignee":"gastown/nux","created_at":"2025-12-21T14:33:23.777969-08:00","updated_at":"2025-12-21T15:59:40.899659-08:00","closed_at":"2025-12-21T15:59:40.899659-08:00","close_reason":"Blocked: bd mol bond --ephemeral does not exist. The --ephemeral flag needs to be implemented in the beads repo first. See analysis comment for full details and recommendations.","dependencies":[{"issue_id":"gt-3x0z.2","depends_on_id":"gt-3x0z","type":"parent-child","created_at":"2025-12-21T14:33:23.77835-08:00","created_by":"daemon"}],"comments":[{"id":1,"issue_id":"gt-3x0z.2","author":"stevey","text":"## Analysis: bd mol bond --ephemeral\n\n### Current State\n\n1. **No --ephemeral flag exists** on `bd mol bond`\n - The help shows: --as, --dry-run, --type, --var\n - No ephemeral option\n\n2. **mol run has implicit ephemeral behavior**\n - In mol_run.go:93, spawnMolecule is called with ephemeral=true\n - This marks spawned issues with wisp=true field\n\n3. **Current wisp implementation is field-based, not storage-based**\n - Wisps are stored in the SAME database as regular issues\n - The wisp field just marks them for cleanup when closed\n - No separate `.beads-ephemeral/` directory exists\n\n### Architecture Gap\n\nThe architecture.md describes (lines 487-491):\n```\nWisps are stored in a per-rig ephemeral database:\n- \u003crig\u003e/.beads-ephemeral/ - Separate from permanent beads\n- Fast writes, no sync overhead\n- Auto-cleaned on squash/burn\n- Digests write to permanent beads\n```\n\nThis is NOT implemented. Current state:\n- Wisps go to same .beads/beads.db\n- Wisps are synced with everything else\n- No separate ephemeral store\n\n### Answers to Dave's Questions\n\n1. **Does bd automatically find .beads-ephemeral/?**\n NO - This directory concept is not yet implemented. bd only finds .beads/\n\n2. **How does bd mol bond --ephemeral know which repo to use?**\n N/A - The flag doesn't exist yet. Would need to be implemented.\n\n3. **Is there a redirect mechanism for ephemeral?**\n NO - Only BEADS_DIR env var exists for redirecting regular beads.\n\n### Recommendations\n\n**Option A: Minimal (Phase 1)**\n- Add --ephemeral flag to mol bond\n- Use existing wisp field (just marks issues)\n- No separate storage yet\n\n**Option B: Full Architecture**\n- Create .beads-ephemeral/ storage layer\n- Add findEphemeralBeadsDir() discovery\n- Route --ephemeral operations there\n- Implement squash/burn cleanup\n\n### For Gas Town Integration\n\nCurrent workaround using mol run:\n```bash\n# mol run already sets ephemeral=true internally\nbd mol run mol-polecat-work --var assignee=$(gt whoami)\n```\n\nFull integration would need beads changes first.","created_at":"2025-12-21T23:59:33Z"}]}
{"id":"gt-3x0z.3","title":"Phase 1.3: gt doctor checks for ephemeral health","description":"Add doctor checks for ephemeral beads repo.\n\n## Checks\n\n1. **ephemeral-exists**: .beads-ephemeral/ directory exists for each rig\n2. **ephemeral-git**: It's a valid git repo\n3. **ephemeral-orphans**: Molecules started but never squashed (\u003e24h old)\n4. **ephemeral-size**: Warn if ephemeral repo is \u003e100MB (should be cleaned)\n5. **ephemeral-stale**: Molecules with no activity in last hour\n\n## Auto-fix\n\n--fix can:\n- Create missing ephemeral repo\n- Clean up old completed molecules (already squashed)\n- NOT auto-squash incomplete molecules (needs AI summary)","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-21T14:33:23.864314-08:00","updated_at":"2025-12-21T17:20:42.830179-08:00","dependencies":[{"issue_id":"gt-3x0z.3","depends_on_id":"gt-3x0z","type":"parent-child","created_at":"2025-12-21T14:33:23.864678-08:00","created_by":"daemon"}]}
{"id":"gt-3x0z.3","title":"Phase 1.3: gt doctor checks for ephemeral health","description":"Add doctor checks for ephemeral beads repo.\n\n## Checks\n\n1. **ephemeral-exists**: .beads-ephemeral/ directory exists for each rig\n2. **ephemeral-git**: It's a valid git repo\n3. **ephemeral-orphans**: Molecules started but never squashed (\u003e24h old)\n4. **ephemeral-size**: Warn if ephemeral repo is \u003e100MB (should be cleaned)\n5. **ephemeral-stale**: Molecules with no activity in last hour\n\n## Auto-fix\n\n--fix can:\n- Create missing ephemeral repo\n- Clean up old completed molecules (already squashed)\n- NOT auto-squash incomplete molecules (needs AI summary)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T14:33:23.864314-08:00","updated_at":"2025-12-22T01:03:55.270136-08:00","closed_at":"2025-12-22T01:03:55.270136-08:00","close_reason":"Implemented wisp health checks: wisp-exists, wisp-git, wisp-orphans, wisp-size, wisp-stale in commit 5d72919","dependencies":[{"issue_id":"gt-3x0z.3","depends_on_id":"gt-3x0z","type":"parent-child","created_at":"2025-12-21T14:33:23.864678-08:00","created_by":"daemon"}]}
{"id":"gt-3x0z.4","title":"Phase 2.1: gt spawn --molecule bonds in ephemeral","description":"Make gt spawn molecule-aware with ephemeral bonding.\n\n## New Flag\n\n```bash\ngt spawn --issue gt-xxx --molecule mol-polecat-work\n```\n\n## Behavior\n\n1. Create polecat with fresh worktree (existing)\n2. Bond molecule in ephemeral: `bd mol bond mol-polecat-work --ephemeral`\n3. Link molecule root to source issue\n4. Include molecule context in work assignment mail\n5. Start session\n\n## Work Assignment Mail\n\n```\nSubject: Work Assignment: Fix lifecycle bug [MOLECULE]\n\nYou are working on gt-rixa as part of molecule mol-polecat-work.\n\nMolecule instance: eph-abc123\nCurrent step: read-assignment (1/8)\n\nFollow the molecule workflow. When complete, generate summary and squash.\n```","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-21T14:33:45.082722-08:00","updated_at":"2025-12-21T17:25:15.106346-08:00","closed_at":"2025-12-21T17:25:15.106346-08:00","close_reason":"Already merged to main","dependencies":[{"issue_id":"gt-3x0z.4","depends_on_id":"gt-3x0z","type":"parent-child","created_at":"2025-12-21T14:33:45.084965-08:00","created_by":"daemon"},{"issue_id":"gt-3x0z.4","depends_on_id":"gt-3x0z.1","type":"blocks","created_at":"2025-12-21T14:34:40.385365-08:00","created_by":"daemon"},{"issue_id":"gt-3x0z.4","depends_on_id":"gt-3x0z.2","type":"blocks","created_at":"2025-12-21T14:34:40.457259-08:00","created_by":"daemon"}]}
{"id":"gt-3x0z.5","title":"Phase 2.2: gt prime shows ephemeral molecule context","description":"Update gt prime to detect and display ephemeral molecule state.\n\n## Detection\n\n1. Check for active ephemeral molecule assigned to current identity\n2. Parse molecule progress (current step, total steps)\n3. Show in prime output\n\n## Output\n\n```\n🔧 Polecat furiosa, checking in.\n\n📦 Molecule: mol-polecat-work (eph-abc123)\n Step 3/8: do-work\n Source: gt-rixa\n Started: 10 minutes ago\n\nRun 'bd mol status' for full molecule state.\n```","status":"closed","priority":1,"issue_type":"task","assignee":"gastown/nux","created_at":"2025-12-21T14:33:45.164431-08:00","updated_at":"2025-12-21T16:34:17.74355-08:00","closed_at":"2025-12-21T16:34:17.74355-08:00","close_reason":"Closed","dependencies":[{"issue_id":"gt-3x0z.5","depends_on_id":"gt-3x0z","type":"parent-child","created_at":"2025-12-21T14:33:45.16487-08:00","created_by":"daemon"},{"issue_id":"gt-3x0z.5","depends_on_id":"gt-3x0z.4","type":"blocks","created_at":"2025-12-21T15:22:46.151626-08:00","created_by":"daemon"}]}
{"id":"gt-3x0z.6","title":"Phase 2.3: Polecat CLAUDE.md molecule workflow protocol","description":"Update polecat prompting for molecule-based work.\n\n## CLAUDE.md Updates\n\nAdd section on molecule workflow:\n\n```markdown\n## Molecule Workflow\n\nWhen assigned a molecule (check gt prime output):\n\n1. Follow molecule steps in order\n2. Mark steps complete: bd mol step complete \u003cstep-id\u003e\n3. Before signaling done:\n a. Generate summary of work performed\n b. Run: bd squash \u003cmolecule-root\u003e --summary \"\u003cyour summary\u003e\"\n4. Then signal done as normal\n\n### Summary Guidelines\n\nYour summary should include:\n- What was the task?\n- What did you do?\n- What was the outcome?\n- Any issues or follow-ups?\n\nKeep it to 2-4 sentences. This becomes the permanent record.\n```","status":"closed","priority":1,"issue_type":"task","assignee":"gastown/rictus","created_at":"2025-12-21T14:33:45.24122-08:00","updated_at":"2025-12-21T16:30:46.776078-08:00","closed_at":"2025-12-21T16:30:46.776078-08:00","close_reason":"Added molecule workflow section to polecat.md.tmpl with step-by-step protocol and summary guidelines","dependencies":[{"issue_id":"gt-3x0z.6","depends_on_id":"gt-3x0z","type":"parent-child","created_at":"2025-12-21T14:33:45.241575-08:00","created_by":"daemon"},{"issue_id":"gt-3x0z.6","depends_on_id":"gt-3x0z.4","type":"blocks","created_at":"2025-12-21T15:22:47.355729-08:00","created_by":"daemon"}]}
{"id":"gt-3x0z.7","title":"Phase 3.1: Summary generation protocol","description":"Define how agents generate summaries for squash.\n\n## The Problem\n\nBeads doesn't make AI calls (inversion of control). Gas Town agents must:\n1. Generate their own summary before calling squash\n2. Pass summary to bd squash command\n\n## Summary Template\n\n```\nTask: \u003csource issue title\u003e\nAction: \u003cwhat was done - fix/implement/refactor/etc\u003e\nOutcome: \u003cresult - tests pass, committed, needs follow-up, etc\u003e\nDetails: \u003c1-2 sentences of specifics if needed\u003e\n```\n\n## Example\n\n```\nTask: Fix lifecycle parser matching bug (gt-rixa)\nAction: Reordered conditional checks in parseLifecycleRequest\nOutcome: Tests passing, committed to polecat/furiosa\nDetails: The 'cycle' keyword was matching 'lifecycle:' prefix. Now checks restart/shutdown first, uses word boundary for cycle.\n```\n\n## Command\n\n```bash\nbd squash eph-abc123 --summary \"Task: Fix lifecycle parser...\"\n```","status":"closed","priority":1,"issue_type":"task","assignee":"gastown/furiosa","created_at":"2025-12-21T14:34:12.86627-08:00","updated_at":"2025-12-21T18:20:28.310235-08:00","closed_at":"2025-12-21T18:20:28.310235-08:00","close_reason":"Added summary generation protocol to polecat.md.tmpl with Task/Action/Outcome/Details template and guidelines","dependencies":[{"issue_id":"gt-3x0z.7","depends_on_id":"gt-3x0z","type":"parent-child","created_at":"2025-12-21T14:34:12.868178-08:00","created_by":"daemon"},{"issue_id":"gt-3x0z.7","depends_on_id":"gt-3x0z.6","type":"blocks","created_at":"2025-12-21T14:34:40.530235-08:00","created_by":"daemon"}]}
{"id":"gt-3x0z.8","title":"Phase 3.2: mol-polecat-work squash step","description":"Add summary+squash as final steps in mol-polecat-work.\n\n## Current Steps\n\n1. read-assignment\n2. understand-task\n3. implement-solution\n4. verify-tests\n5. commit-work\n6. signal-done\n\n## Updated Steps\n\n1. read-assignment\n2. understand-task\n3. implement-solution\n4. verify-tests\n5. commit-work\n6. **generate-summary** ← NEW\n7. **squash-molecule** ← NEW\n8. signal-done\n\n## Step Definitions\n\n### generate-summary\nAgent writes a concise summary following the template.\nSave to a local variable or temp file.\n\n### squash-molecule\nRun: bd squash $MOLECULE_ROOT --summary \"$SUMMARY\"\nThis creates digest in main beads, cleans ephemeral.\n\n## Update Location\n\nThis requires updating the mol-polecat-work definition in beads molecule catalog.","status":"closed","priority":1,"issue_type":"task","assignee":"gastown/furiosa","created_at":"2025-12-21T14:34:12.946518-08:00","updated_at":"2025-12-21T18:32:00.025061-08:00","closed_at":"2025-12-21T18:32:00.025061-08:00","close_reason":"Added generate-summary and squash-molecule steps to mol-polecat-work molecule with updated dependency chain","dependencies":[{"issue_id":"gt-3x0z.8","depends_on_id":"gt-3x0z","type":"parent-child","created_at":"2025-12-21T14:34:12.946899-08:00","created_by":"daemon"},{"issue_id":"gt-3x0z.8","depends_on_id":"gt-3x0z.7","type":"blocks","created_at":"2025-12-21T14:34:40.601367-08:00","created_by":"daemon"}]}
{"id":"gt-3x0z.9","title":"Phase 4.1: mol-deacon-patrol uses ephemeral","description":"Deacon patrol cycles run as ephemeral molecules.\n\n## Current Deacon Loop\n\n```\nwhile running:\n check_heartbeat()\n check_mail()\n sleep(interval)\n```\n\n## Molecule-Based Loop\n\n```\nwhile running:\n mol = bd mol bond mol-deacon-patrol-cycle --ephemeral\n execute_cycle(mol):\n check_heartbeat()\n check_mail()\n log_status()\n summary = generate_cycle_summary()\n bd squash mol --summary summary\n sleep(interval)\n```\n\n## Benefits\n\n- Each cycle is tracked\n- Digests show daemon health over time\n- Can query: 'show me patrol cycles from last hour'\n- Crash mid-cycle → ephemeral shows where we were","status":"in_progress","priority":1,"issue_type":"task","created_at":"2025-12-21T14:34:13.026048-08:00","updated_at":"2025-12-21T19:53:54.042293-08:00","dependencies":[{"issue_id":"gt-3x0z.9","depends_on_id":"gt-3x0z","type":"parent-child","created_at":"2025-12-21T14:34:13.026388-08:00","created_by":"daemon"},{"issue_id":"gt-3x0z.9","depends_on_id":"gt-3x0z.8","type":"blocks","created_at":"2025-12-21T14:34:40.672531-08:00","created_by":"daemon"},{"issue_id":"gt-3x0z.9","depends_on_id":"gt-rana.3","type":"blocks","created_at":"2025-12-21T15:20:27.460976-08:00","created_by":"daemon"}]}
{"id":"gt-3x0z.9","title":"Phase 4.1: mol-deacon-patrol uses ephemeral","description":"Deacon patrol cycles run as ephemeral molecules.\n\n## Current Deacon Loop\n\n```\nwhile running:\n check_heartbeat()\n check_mail()\n sleep(interval)\n```\n\n## Molecule-Based Loop\n\n```\nwhile running:\n mol = bd mol bond mol-deacon-patrol-cycle --ephemeral\n execute_cycle(mol):\n check_heartbeat()\n check_mail()\n log_status()\n summary = generate_cycle_summary()\n bd squash mol --summary summary\n sleep(interval)\n```\n\n## Benefits\n\n- Each cycle is tracked\n- Digests show daemon health over time\n- Can query: 'show me patrol cycles from last hour'\n- Crash mid-cycle → ephemeral shows where we were","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-21T14:34:13.026048-08:00","updated_at":"2025-12-22T02:13:49.561833-08:00","closed_at":"2025-12-22T02:13:49.561833-08:00","close_reason":"Implemented wisp-based patrol for Deacon. Removed daemon attachment logic, updated deacon template. Commit ae513a5.","dependencies":[{"issue_id":"gt-3x0z.9","depends_on_id":"gt-3x0z","type":"parent-child","created_at":"2025-12-21T14:34:13.026388-08:00","created_by":"daemon"},{"issue_id":"gt-3x0z.9","depends_on_id":"gt-3x0z.8","type":"blocks","created_at":"2025-12-21T14:34:40.672531-08:00","created_by":"daemon"},{"issue_id":"gt-3x0z.9","depends_on_id":"gt-rana.3","type":"blocks","created_at":"2025-12-21T15:20:27.460976-08:00","created_by":"daemon"}]}
{"id":"gt-3x1","title":"Update Refinery to use Beads merge queue","description":"Replace branch discovery with Beads queue in the Refinery module:\n\nCurrent (internal/refinery/manager.go):\n- Scans for polecat/* branches\n- Creates MR objects on-the-fly\n\nNew:\n- Pull from Beads: bd ready --type=merge-request\n- Process each MR\n- Close with merge commit: bd close \u003cid\u003e --reason=\"Merged at \u003csha\u003e\"\n- Handle failures: bd update \u003cid\u003e --status=blocked --reason=\"...\"\n\nThe Engineer (agent) becomes Beads-native.\nThe Refinery (module) provides the infrastructure.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-16T23:02:37.96436-08:00","updated_at":"2025-12-19T15:24:39.1231-08:00","closed_at":"2025-12-19T14:47:51.65991-08:00","dependencies":[{"issue_id":"gt-3x1","depends_on_id":"gt-h5n","type":"blocks","created_at":"2025-12-16T23:02:55.812433-08:00","created_by":"daemon"},{"issue_id":"gt-3x1","depends_on_id":"gt-svi","type":"blocks","created_at":"2025-12-16T23:03:12.814463-08:00","created_by":"daemon"}]}
{"id":"gt-3x1.1","title":"Engineer main loop: poll for ready merge-requests","description":"Implement the Engineer's main processing loop.\n\nLoop structure:\n1. Query: bd ready --type=merge-request\n2. If empty: sleep(poll_interval), continue\n3. Select highest priority, oldest MR\n4. Claim: bd update \u003cid\u003e --status=in_progress\n5. Process (delegate to other subtasks)\n6. Repeat\n\nConfiguration:\n- poll_interval: from rig config (default 30s)\n- max_concurrent: from rig config (default 1)\n\nThe loop should be interruptible and handle graceful shutdown.\n\nReference: docs/merge-queue-design.md#engineer-processing-loop","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-17T13:50:57.022367-08:00","updated_at":"2025-12-18T20:45:17.731441-08:00","closed_at":"2025-12-18T20:14:35.321731-08:00","dependencies":[{"issue_id":"gt-3x1.1","depends_on_id":"gt-3x1","type":"parent-child","created_at":"2025-12-17T13:50:57.024225-08:00","created_by":"daemon"},{"issue_id":"gt-3x1.1","depends_on_id":"gt-svi.1","type":"blocks","created_at":"2025-12-17T13:53:09.832586-08:00","created_by":"daemon"},{"issue_id":"gt-3x1.1","depends_on_id":"gt-svi.2","type":"blocks","created_at":"2025-12-17T13:53:09.9547-08:00","created_by":"daemon"},{"issue_id":"gt-3x1.1","depends_on_id":"gt-h5n.8","type":"blocks","created_at":"2025-12-17T13:53:16.770078-08:00","created_by":"daemon"}]}
{"id":"gt-3x1.2","title":"Fetch and conflict check: git operations for MR","description":"Implement git operations for MR processing.\n\nSteps:\n1. git fetch origin \u003cmr.branch\u003e\n2. git checkout \u003cmr.target\u003e (main or integration/xxx)\n3. git merge --no-commit --no-ff \u003cmr.branch\u003e (test merge)\n4. Check for conflicts\n5. If conflicts: abort and return Failure(conflict, files)\n6. If clean: abort (actual merge in next step)\n\nHelper functions:\n- FetchBranch(branch string) error\n- CheckConflicts(source, target string) ([]string, error)\n\nReference: docs/merge-queue-design.md#process-merge-steps","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-17T13:50:58.99193-08:00","updated_at":"2025-12-18T20:17:47.781432-08:00","closed_at":"2025-12-18T20:17:47.781432-08:00","dependencies":[{"issue_id":"gt-3x1.2","depends_on_id":"gt-3x1","type":"parent-child","created_at":"2025-12-17T13:50:58.993973-08:00","created_by":"daemon"},{"issue_id":"gt-3x1.2","depends_on_id":"gt-3x1.1","type":"blocks","created_at":"2025-12-17T13:53:10.066159-08:00","created_by":"daemon"}]}
@@ -82,6 +83,7 @@
{"id":"gt-480b","title":"Improve test coverage in low-coverage packages","description":"Several packages have low test coverage:\n- internal/cmd: 6.8%\n- internal/mail: 3.6%\n- internal/daemon: 12.1%\n- internal/doctor: 14.5%\n- internal/refinery: 20.6%\n- internal/session: 27.8%\n- internal/git: 28.8%\n\nPriority should be given to mail, cmd, and daemon packages which handle critical functionality.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T21:34:47.807929-08:00","updated_at":"2025-12-21T22:19:59.416507-08:00","closed_at":"2025-12-21T22:19:59.416507-08:00","close_reason":"Deferred to post-launch. Test coverage improvement is ongoing work, not blocking for launch. Current tests cover critical paths; additional coverage can be added incrementally."}
{"id":"gt-48bs","title":"gt rig reset: clear stale mail on reset/land","description":"## Problem\n\nWhen resetting or landing a rig/town, stale mail messages can confuse agents on startup. Old handoff messages, daemon notifications, and inter-agent mail should be cleaned up as part of reset.\n\n## Current State\n\n- `gt rig reset` exists but doesn't clear mail\n- Stale messages accumulate (e.g., daemon SHUTDOWN messages)\n- Agents may read outdated context on startup\n\n## Proposed Behavior\n\n`gt rig reset` and `gt town reset` should:\n1. Close all open messages (`--type=message`) in the relevant beads\n2. Optionally preserve pinned handoff beads (clear content, keep bead)\n3. Log what was cleaned up\n\n```bash\ngt rig reset gastown # Clears gastown mail\ngt rig reset gastown --mail # Only clear mail, keep other state\ngt town reset # Clears all town-level mail\ngt town reset --all # Clears mail in all rigs too\n```\n\n## Implementation\n\n1. Query `bd list --type=message --status=open`\n2. Close each with reason 'Cleared during reset'\n3. For pinned handoffs: `bd update \u003cid\u003e --description=''` instead of close","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-19T11:42:17.769674-08:00","updated_at":"2025-12-21T11:27:49.532203-08:00","closed_at":"2025-12-21T11:27:49.532203-08:00","close_reason":"Added --mail flag to gt rig reset"}
{"id":"gt-4eim","title":"gt nudge should accept flexible session identifiers","description":"Currently `gt nudge` requires the exact tmux session name (e.g., `gt-gastown-furiosa`).\n\nIt should also accept:\n- `gastown/furiosa` (rig/polecat format)\n- `furiosa` (polecat name, infer rig from cwd or require if ambiguous)\n\nThe session list command shows `gastown/furiosa` format, but nudge rejects it:\n```\ngt session list → shows 'gastown/furiosa'\ngt nudge gastown/furiosa 'msg' → 'session not found'\ngt nudge gt-gastown-furiosa 'msg' → works\n```\n\nShould normalize all these formats to the tmux session name internally.","status":"in_progress","priority":2,"issue_type":"bug","assignee":"gastown/angharad","created_at":"2025-12-21T15:36:45.013475-08:00","updated_at":"2025-12-21T15:37:59.042119-08:00"}
{"id":"gt-4ev4","title":"Implement gt sling command","description":"The unified work dispatch command.\n\n```bash\ngt sling \u003cthing\u003e \u003ctarget\u003e [options]\n```\n\nImplements spawn + assign + pin in one operation. See sling-design.md.\n\nAcceptance:\n- [ ] Parse thing (proto name, issue ID, epic ID)\n- [ ] Parse target (agent address) \n- [ ] Spawn molecule if proto\n- [ ] Assign to target agent\n- [ ] Pin to agent's hook (pinned bead)\n- [ ] Support --wisp flag for ephemeral\n- [ ] Support --molecule flag for issue+workflow\n- [ ] Error if hook already occupied (unless --force)","status":"in_progress","priority":1,"issue_type":"task","assignee":"gastown/furiosa","created_at":"2025-12-22T03:17:27.273013-08:00","updated_at":"2025-12-22T12:12:32.617698-08:00"}
{"id":"gt-4my","title":"Doctor check: Worker health and stuck detection","description":"Detect and report stuck workers via gt doctor.\n\n## Checks\n\n### WorkerHealthCheck\n- List all active workers (polecats with state=working)\n- Check last activity timestamp for each\n- Flag as potentially stuck if no progress for configurable threshold (default: 30 min)\n- Check if Witness is running for the rig\n- Verify Witness last heartbeat time\n\n### Stuck Detection Criteria\n- Polecat state=working but session not running\n- Polecat state=working but output unchanged for threshold\n- Witness not responding to health checks\n- Multiple polecats in same rig all stuck\n\n## Output\n\n```\n[WARN] Workers in rig 'wyvern' may be stuck:\n - Toast: working for 45m, no recent output\n - Capable: working for 52m, session not found\n - Witness: last heartbeat 20m ago\n \n Suggestions:\n - gt witness status wyvern\n - gt capture wyvern/Toast 50\n - gt stop --rig wyvern (kill all)\n```\n\n## Auto-Fix\n\nCannot auto-fix stuck workers (risk of data loss), but can:\n- Restart Witness daemon if crashed\n- Send warning mail to Mayor","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-15T23:17:59.265062-08:00","updated_at":"2025-12-16T17:24:34.882466-08:00","dependencies":[{"issue_id":"gt-4my","depends_on_id":"gt-f9x.4","type":"blocks","created_at":"2025-12-15T23:19:05.565606-08:00","created_by":"daemon"},{"issue_id":"gt-4my","depends_on_id":"gt-7ik","type":"blocks","created_at":"2025-12-17T15:44:42.068149-08:00","created_by":"daemon"}]}
{"id":"gt-4nn","title":"Molecules: Composable Workflow Beads","description":"## Summary\n\nMolecules are crystallized workflow patterns stored as Beads issues.\nWhen instantiated, the molecule creates child beads forming a DAG.\n\n## Key Insight: Molecules ARE Beads\n\nPer HOP Decision 001: Beads IS the ledger. Molecules don't get a separate YAML format - they're issues with `type: molecule` containing prose-based step definitions.\n\nAgents don't need rigid schemas. They parse natural language natively. A molecule is just instructions with enough structure for tooling.\n\n## Example: Engineer in a Box\n\n```markdown\nid: mol-xyz\ntype: molecule\ntitle: Engineer in a Box\n\nThis workflow takes a task from design to merge.\n\n## Step: design\nThink carefully about architecture. Consider existing patterns, \ntrade-offs, testability.\n\n## Step: implement\nWrite clean code. Follow codebase conventions.\nNeeds: design\n\n## Step: review \nReview for bugs, edge cases, style issues.\nNeeds: implement\n\n## Step: test\nWrite and run tests. Cover happy path and edge cases.\nNeeds: implement\n\n## Step: submit\nSubmit for merge via refinery.\nNeeds: review, test\n```\n\n## Instantiation\n\n```bash\n# Attach molecule when spawning\ngt spawn --issue gt-abc --molecule mol-xyz\n\n# Creates child beads atomically:\ngt-abc.design ← ready first\ngt-abc.implement ← blocked by design \ngt-abc.review ← blocked by implement\ngt-abc.test ← blocked by implement\ngt-abc.submit ← blocked by review, test\n```\n\nEach step issue gets an `instantiated-from` edge to the molecule (with step metadata).\n\n## Why This Matters\n\n1. **Unified data plane**: Everything in Beads, no parallel YAML channel\n2. **AI-native**: Prose instructions, not rigid schemas\n3. **Error isolation**: Each step is a checkpoint - failure doesn't lose progress\n4. **Scales with AI**: As agents get smarter, they handle more complex molecules\n\n## Implementation Primitives\n\n- `ParseMoleculeSteps()`: Extract steps from prose (convention-based)\n- `InstantiateMolecule()`: Atomic transaction creating all steps + edges \n- `instantiated-from` edge type: Track provenance\n- Parameterization: `{{variable}}` substitution from context map","status":"closed","priority":0,"issue_type":"epic","created_at":"2025-12-18T18:06:24.573068-08:00","updated_at":"2025-12-19T14:44:59.705427-08:00","closed_at":"2025-12-19T14:44:59.705427-08:00"}
{"id":"gt-4nn.1","title":"Molecule schema: YAML format for workflow definitions","description":"Define the YAML schema for molecule definitions:\n\n```yaml\nmolecule: \u003cname\u003e\nversion: 1\ndescription: \"Human description\"\nsteps:\n - id: \u003cstep-id\u003e\n title: \"Step title\"\n prompt: \"Instructions for agent\"\n depends: [\u003cother-step-ids\u003e] # optional\n tier: haiku|sonnet|opus # optional, default from config\n timeout: 30m # optional\n```\n\nStore molecules in:\n- `\u003crig\u003e/molecules/\u003cname\u003e.yaml` for rig-specific\n- `\u003ctown\u003e/molecules/\u003cname\u003e.yaml` for town-wide\n\nBuilt-in molecules to ship:\n- engineer-in-box: design→code→review→test→submit\n- quick-fix: implement→test→submit\n- research: investigate→document","status":"closed","priority":0,"issue_type":"task","created_at":"2025-12-18T18:06:49.441267-08:00","updated_at":"2025-12-18T20:14:32.629327-08:00","closed_at":"2025-12-18T20:14:32.629327-08:00","dependencies":[{"issue_id":"gt-4nn.1","depends_on_id":"gt-4nn","type":"parent-child","created_at":"2025-12-18T18:06:49.442723-08:00","created_by":"daemon"}]}
@@ -137,8 +139,9 @@
{"id":"gt-71i","title":"Update architecture.md: Engineer role and Beads merge queue","description":"Update docs/architecture.md with recent design decisions:\n\n1. Agent table: Change \"Refinery\" role to \"Engineer\"\n - Refinery = place/module/directory\n - Engineer = role (agent that works in the Refinery)\n\n2. Merge Queue section: Document Beads-native model\n - MRs are beads issues with --type=merge-request\n - gt mq commands (submit, list, next, process, reorder)\n - Ordering via depends-on links\n\n3. CLI section: Add gt mq commands\n\n4. Key Design Decisions: Add decisions for:\n - #15: Merge Queue in Beads\n - #16: Engineer role (distinct from Refinery place)\n - #17: Session restart protocol for Engineer","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-16T23:12:03.616159-08:00","updated_at":"2025-12-16T23:12:03.616159-08:00","dependencies":[{"issue_id":"gt-71i","depends_on_id":"gt-h5n","type":"blocks","created_at":"2025-12-16T23:12:14.92163-08:00","created_by":"daemon"}]}
{"id":"gt-72so","title":"gt mq list: doesn't show submitted MRs","description":"After submitting MRs with gt mq submit, gt mq list gastown shows empty queue.\n\n## Reproduction\n1. gt mq submit --issue gt-h5n.5 --branch polecat/Scabrous\n2. gt mq list gastown → (empty)\n3. bd list --type=merge-request → shows the MR\n\n## Expected\ngt mq list should show submitted MRs\n\n## MR example\ngt-ts4u has rig: gastown in description, type=merge-request, status=open","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-19T14:54:26.731813-08:00","updated_at":"2025-12-19T17:22:52.552662-08:00","closed_at":"2025-12-19T16:19:53.82455-08:00"}
{"id":"gt-7918","title":"Patrols: Cyclic molecules for autonomous maintenance","description":"## Vision\n\nPatrols are **cyclic molecules** - workflow loops that give Gas Town its autonomous nervous system. While regular molecules are DAGs that terminate, patrols loop forever, performing maintenance tasks at varying cadences.\n\nThis is the \"steam engine\" of Gas Town: converting episodic Claude sessions into continuous autonomous operation.\n\n## Core Concepts\n\n### 1. Cyclic Molecules\n\nRegular molecule: A -\u003e B -\u003e C -\u003e done\nPatrol molecule: A -\u003e B -\u003e C --+\n ^ |\n +-------------+\n\nPatrols have a loop_to field specifying where to restart.\n\n### 2. Cooldown-Aware Steps (Atoms)\n\nSteps encode their own cadence. When patrol reaches a step:\n1. Check: now - last_run \u003e cooldown?\n2. If yes: execute, update last_run\n3. If no: skip (immediately close)\n\nThe patrol runner is simple - steps self-skip. Complexity distributed into atoms.\n\n### 3. The Beacon\n\nThe heartbeat that fires patrol triggers:\n- Internal ticker in Deacon (goroutine)\n- Or external cron firing gt deacon tick\n- Or mail-based triggers\n\nWithout beacon, nothing proactive happens.\n\n### 4. Session Reset as Patrol Step\n\nConnects to auto-handoff (gt-bcwn). Session reset is a patrol step, not a separate mechanism.\n\n### 5. Multi-Role Patrols\n\nEach supervisor has its own patrol:\n\n**Deacon patrol:** health-check (30s), session-gc (5m), beacon-tick (10s)\n**Witness patrol:** orphan-scan (10m), stuck-check (2m), molecule-progress (1m)\n**Refinery patrol:** queue-check (30s), pr-status (1m), merge-ready (30s)\n\n### 6. Cadence Tiers\n\n- Critical (10-30s): Health checks\n- Active (1-5m): Progress, nudges\n- Maintenance (10-30m): Orphans, GC\n- Periodic (1h+): Reports\n\n### 7. Best-Effort Scheduling\n\nNot real-time - more like cron. No hard deadlines. Catch-up, dont pile-up.\nPriority preemption (mail interrupts patrol). Graceful degradation under load.\n\n## Open Questions\n\n1. State persistence: Beads (self-describing) or file (faster)?\n2. Interruption: How does urgent mail preempt patrol?\n3. Error recovery: Backoff? Escalate? Circuit breaker?\n4. Coordination: Can patrols send mail to trigger other patrols?\n\n## Related\n\n- gt-bcwn: Auto-handoff (session reset is a patrol step)\n- Molecule system (patrols extend molecules with loops)\n- Deacon lifecycle management\n\n## Metaphor\n\nClaude was fire. Claude Code was steam. Gas Town is the steam engine. Beads is the train tracks.\n\nThe steam engine converts episodic combustion into continuous rotary motion.\nGas Town converts episodic Claude sessions into continuous autonomous work.","status":"open","priority":1,"issue_type":"epic","created_at":"2025-12-21T12:18:22.99128-08:00","updated_at":"2025-12-21T12:18:22.99128-08:00","dependencies":[{"issue_id":"gt-7918","depends_on_id":"gt-bcwn","type":"blocks","created_at":"2025-12-21T12:18:30.86651-08:00","created_by":"daemon"}]}
{"id":"gt-7hor","title":"Document the Propulsion Principle","description":"Write canonical documentation for the Universal Gas Town Propulsion Principle.\n\nLocation: gastown/mayor/rig/docs/propulsion-principle.md\n\nContent:\n- The One Rule (hook has work → work happens)\n- Why it works (stateless agents, molecule-driven)\n- The sling lifecycle diagram\n- Agent startup protocol\n- Examples and anti-patterns\n\nThis is foundational theory-of-operation documentation.","status":"closed","priority":2,"issue_type":"task","assignee":"gastown/slit","created_at":"2025-12-22T03:17:47.790012-08:00","updated_at":"2025-12-22T12:18:20.377092-08:00","closed_at":"2025-12-22T12:18:20.377092-08:00","close_reason":"Wrote propulsion-principle.md documenting the One Rule, molecule-driven execution, sling lifecycle, startup protocol, and anti-patterns"}
{"id":"gt-7hz3","title":"Merge: gt-92l","description":"branch: polecat/Ace\ntarget: main\nsource_issue: gt-92l\nrig: gastown","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-19T16:31:37.716367-08:00","updated_at":"2025-12-19T18:26:14.102101-08:00","closed_at":"2025-12-19T17:48:09.627376-08:00"}
{"id":"gt-7iek","title":"context-check","description":"Assess own context usage. If high, prepare for handoff.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-21T17:51:45.43771-08:00","updated_at":"2025-12-21T17:51:45.43771-08:00","dependencies":[{"issue_id":"gt-7iek","depends_on_id":"gt-hbnz","type":"parent-child","created_at":"2025-12-21T17:51:45.442974-08:00","created_by":"stevey"},{"issue_id":"gt-7iek","depends_on_id":"gt-uvog","type":"blocks","created_at":"2025-12-21T17:51:45.443498-08:00","created_by":"stevey"}],"wisp":true}
{"id":"gt-7iek","title":"context-check","description":"Assess own context usage. If high, prepare for handoff.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-21T17:51:45.43771-08:00","updated_at":"2025-12-21T17:51:45.43771-08:00","dependencies":[{"issue_id":"gt-7iek","depends_on_id":"gt-hbnz","type":"parent-child","created_at":"2025-12-21T17:51:45.442974-08:00","created_by":"stevey"}],"wisp":true}
{"id":"gt-7ik","title":"Ephemeral polecats: spawn fresh, delete on completion","description":"## Design Decision\n\nSwitch from pooled/idle polecats to ephemeral model:\n- Spawn creates fresh worktree from main\n- Polecat requests shutdown when done (bottom-up)\n- Witness verifies handoff, kills session, deletes worktree\n- No 'idle' state - polecats exist only while working\n\n## Rationale\n\n1. **Git worktrees are fast** - pooling optimization is obsolete\n2. **Pooling creates maintenance burden:**\n - Git stashes accumulate\n - Untracked artifacts pile up\n - Branches drift from main\n - Beads DB gets stale\n3. **PGT sync problems** came from persistent branches\n4. **Support infrastructure exists** - Witness, Refinery, Mayor handle continuity\n5. **Simpler mental model** - polecat exists = work in progress\n\n## Lifecycle\n\n```\nSpawn:\n gt spawn --issue \u003cid\u003e\n → Creates fresh worktree: git worktree add polecats/\u003cname\u003e -b polecat/\u003cname\u003e\n → Initializes beads in worktree\n → Starts session, assigns work\n\nWorking:\n Polecat does task\n → Pushes to polecat/\u003cname\u003e branch\n → Submits to merge queue when ready\n\nCompletion (POLECAT-INITIATED):\n Polecat runs: gt handoff\n → Verifies git state clean\n → Sends mail to Witness: \"Ready for shutdown\"\n → Marks itself done, waits for termination\n\nCleanup (WITNESS-OWNED):\n Witness receives shutdown request\n → Verifies PR merged or in queue\n → Verifies no uncommitted changes\n → Kills session: gt session stop \u003crig\u003e/\u003cpolecat\u003e\n → Deletes worktree: git worktree remove polecats/\u003cname\u003e\n → Deletes branch: git branch -d polecat/\u003cname\u003e\n → Optionally: Notifies Mayor of completion\n```\n\n## Key Insight: Bottom-Up Shutdown\n\n**Old model (wrong)**: Top-down batch shutdown - \"cancel the swarm\"\n**New model (right)**: Bottom-up individual shutdown - polecat requests, Witness executes\n\nThis enables streaming:\n- Workers come and go continuously\n- No \"swarm end\" to trigger cleanup\n- Each worker manages its own lifecycle\n- Witness is the lifecycle authority\n\n## Implementation\n\n1. Add `gt handoff` command for polecats to request shutdown\n2. Modify gt spawn to always create fresh worktree\n3. Run bd init in new worktree (beads needs initialization)\n4. Add shutdown request handler to Witness\n5. Witness verifies handoff, then cleans up:\n - Kill session\n - Remove worktree\n - Delete branch\n6. Remove 'idle' state from polecat state machine\n7. Simplify gt polecat list (only shows active)\n\n## Impact on Other Tasks\n\n- gt-17r (Zombie cleanup): Becomes trivial - orphan worktrees\n- gt-4my (Worker health): Simpler - no idle/stuck ambiguity\n- gt-f9x.5/f9x.6 (Doctor): Fewer states to validate\n- gt-eu9 (Witness handoff): Witness receives polecat shutdown requests","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-17T15:44:31.139964-08:00","updated_at":"2025-12-19T01:57:17.033547-08:00","closed_at":"2025-12-19T01:57:17.033547-08:00"}
{"id":"gt-7lt","title":"gt mail send should tmux-notify recipient","description":"## Problem\n\nWhen mail is sent via gt mail send, the recipient session does not get a tmux notification. In Python Gas Town (PGT), mail delivery triggers a tmux display-message or similar notification so the agent knows mail arrived.\n\n## Expected Behavior\n\nWhen gt mail send \u003caddr\u003e is called:\n1. Mail is delivered to recipient inbox\n2. If recipient has an active tmux session, send notification\n3. Notification should be visible (display-message or bell)\n\n## Current Behavior\n\nMail is delivered but no notification. Agent has to poll inbox to discover new mail.\n\n## Impact\n\n- Agents miss time-sensitive messages\n- Heartbeat pokes from daemon will not wake agents\n- Coordination is slower (polling vs push)\n\n## Implementation Notes\n\nAfter successful mail delivery, check if recipient has active session:\n- gt session list can identify active sessions\n- tmux display-message or send-keys can notify\n- Could inject a visible prompt like \"[MAIL] New message from \u003csender\u003e\"\n\n## Reference\n\nCheck PGT implementation for how it handles this.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-18T12:28:50.142075-08:00","updated_at":"2025-12-18T20:09:53.112902-08:00","closed_at":"2025-12-18T20:09:53.112902-08:00"}
{"id":"gt-7o7","title":"Session pre-shutdown checks","description":"Session stop should verify clean state before killing, like PGT.\n\n## Pre-Shutdown Checks\n\n### 1. Git Working Tree Clean\n```go\nfunc checkGitClean(clonePath string) error {\n // git status --porcelain\n // Fail if any output\n}\n```\n\n### 2. All Commits Pushed\n```go\nfunc checkCommitsPushed(clonePath string) error {\n // git log origin/HEAD..HEAD\n // Fail if any unpushed commits\n}\n```\n\n### 3. Assigned Issues Handled\n```go\nfunc checkIssuesHandled(polecat *Polecat) error {\n // If polecat.Issue != \"\", check if closed or reassigned\n}\n```\n\n### 4. Beads Synced\n```go\nfunc checkBeadsSynced(clonePath string) error {\n // bd sync --status in clone directory\n}\n```\n\n## Behavior on Failure\n1. First attempt: Nudge worker to fix\n2. Retry up to 3 times with delay\n3. After retries: Escalate to Witness/Mayor\n\n## Integration\nModify internal/session/manager.go Stop():\n```go\nfunc (m *Manager) Stop(polecat string, force bool) error {\n if !force {\n if err := m.runPreShutdownChecks(polecat); err != nil {\n return fmt.Errorf(\"pre-shutdown checks failed: %w\", err)\n }\n }\n // existing stop logic\n}\n```\n\n## Flags\n- --force: Skip checks\n- --grace-period N: Time to wait for fixes\n\n## Dependencies\n- Ties into gt-69l (hook system) - can be hook-based\n- Ties into gt-f8v (Witness pre-kill verification)\n\n## Acceptance Criteria\n- [ ] Stop fails if uncommitted changes (without --force)\n- [ ] Stop fails if unpushed commits\n- [ ] Clear error messages with fix instructions\n- [ ] --force bypasses all checks","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-16T14:47:55.968983-08:00","updated_at":"2025-12-16T16:05:02.795812-08:00"}
@@ -194,7 +197,9 @@
{"id":"gt-9m9g","title":"Refinery startup: Use Claude agent instead of foreground mode","description":"WIP found in stash: Refactor refinery startup to spawn Claude as the refinery agent rather than using gt refinery start --foreground.\n\nChanges needed:\n- Use refineryDir (refinery/rig) as working directory\n- Start Claude with --dangerously-skip-permissions \n- Wait for shell ready, then Claude ready\n- Send gt prime, then refinery startup prompt\n- Remove foreground mode complexity\n\nRelated: gt-n7z7 (refinery --foreground race condition bug)","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-20T13:35:04.300493-08:00","updated_at":"2025-12-20T13:35:04.300493-08:00"}
{"id":"gt-9mb","title":"Recreate beads rigs with fresh clones","description":"## Problem\n\nBeads rigs have schema mismatches (missing thread_id column, etc.) from development iteration.\n\n## Tasks\n\n1. Shut down any active polecats\n2. Delete existing beads rigs: mayor/rig, refinery/rig, witness/rig, crew/*\n3. Re-clone from beads repo\n4. Run bd init in each new clone\n\n## Rigs to recreate\n\n- /Users/stevey/gt/beads/mayor/rig\n- /Users/stevey/gt/beads/refinery/rig\n- /Users/stevey/gt/beads/crew/* (if any)\n\n## Source\n\nClone from beads repo (need to confirm remote URL)","status":"closed","priority":0,"issue_type":"task","created_at":"2025-12-18T19:13:32.208448-08:00","updated_at":"2025-12-18T19:16:27.096311-08:00","closed_at":"2025-12-18T19:16:27.096311-08:00"}
{"id":"gt-9nf","title":"gt spawn should create fresh polecat worktree, never reuse","description":"Currently gt spawn tries to reuse existing polecats, which causes:\n\n1. Stale beads database\n2. Stale code (behind main/integration)\n3. Old inbox messages\n4. Git history pollution\n\n## Current Behavior\n\ngt spawn:\n1. Looks for idle polecat in pool\n2. If found, reuses existing worktree\n3. Assigns new issue\n\n## Desired Behavior\n\ngt spawn:\n1. Always create FRESH polecat from current main/integration\n2. Fresh worktree with clean beads\n3. No reuse of old worktrees\n\n## Name Pool Still Useful\n\nKeep name pool for:\n- Allocating themed names (mad-max, etc.)\n- Tracking which names are in use\n\nBut worktrees should be created fresh each time.\n\n## Implementation\n\nIn spawn.go, before starting work:\n1. If worktree exists: remove it first\n2. Create fresh worktree from integration branch\n3. Sync beads from rig to polecat\n4. Then proceed with work assignment\n\nThis ensures polecats always start with latest code and beads.","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-20T15:23:35.250531-08:00","updated_at":"2025-12-21T15:38:41.381329-08:00","closed_at":"2025-12-21T15:38:41.381329-08:00","close_reason":"Already implemented in commit 82d718e","dependencies":[{"issue_id":"gt-9nf","depends_on_id":"gt-8v8","type":"blocks","created_at":"2025-12-20T15:40:09.069331-08:00","created_by":"daemon"}]}
{"id":"gt-9pyg","title":"Deacon tmux status bar: heartbeat timing and patrol state","description":"## Problem\n\nThe deacon shows patrol output but lacks real-time observability:\n- No indication of when last heartbeat occurred\n- No indication of when next heartbeat is scheduled\n- No visibility into current patrol step\n\n## Desired Behavior\n\nThe tmux status bar for gt-deacon should show:\n\n```\n⛪ Deacon | ❤️ 2m ago | ⏰ 3m | 📍 health-scan (3/7)\n```\n\nComponents:\n- **Role icon**: ⛪ (deacon identity)\n- **Last heartbeat**: ❤️ 2m ago (time since last heartbeat file update)\n- **Next heartbeat**: ⏰ 3m (time until daemon would poke)\n- **Current step**: 📍 health-scan (3/7) (current patrol atom, step N of M)\n\n## Implementation\n\n1. **Read heartbeat.json** for last update time\n2. **Calculate next poke** based on daemon interval (default 5m)\n3. **Read current wisp** from .beads-wisp/ to get patrol progress\n4. **Update tmux status** periodically or on state change\n\nOptions:\n- tmux status-right with shell script\n- gt deacon status --tmux for formatted output\n- Hook into patrol step completion\n\n## Related\n\n- gt-id36: Deacon Kernel epic\n- gt-3x0z: Wisp Molecule Integration","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-22T03:03:38.693983-08:00","updated_at":"2025-12-22T03:03:38.693983-08:00"}
{"id":"gt-9rmm","title":"Merge: gt-a95","description":"branch: polecat/Ace\ntarget: main\nsource_issue: gt-a95\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-19T14:53:53.973816-08:00","updated_at":"2025-12-19T19:13:27.736445-08:00","closed_at":"2025-12-19T17:48:09.608699-08:00"}
{"id":"gt-a07f","title":"Chemistry UX commands from Beads","description":"Waiting on Beads repo to implement chemistry UX sugar commands (bd pour, bd wisp, bd hook, --pour flag). These are nice-to-have polish items, not blockers for core functionality.\n\nSee: gastown/mayor/rig/docs/chemistry-design-changes.md","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-22T02:19:04.083172-08:00","updated_at":"2025-12-22T02:27:57.949903-08:00","closed_at":"2025-12-22T02:27:57.949903-08:00","close_reason":"Dave completed bd pour, bd wisp, bd hook, --pour flag. Ready for Gas Town integration.","external_ref":"beads:bd-kwjh","labels":["external:beads/bd-kwjh"]}
{"id":"gt-a6dy","title":"Merge: gt-0ei3","description":"branch: polecat/capable\ntarget: main\nsource_issue: gt-0ei3\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-20T09:28:33.182299-08:00","updated_at":"2025-12-20T23:17:25.794011-08:00","closed_at":"2025-12-20T23:17:25.794011-08:00","close_reason":"Branches nuked, MRs obsolete"}
{"id":"gt-a817","title":"Update polecat CLAUDE.md with molecule workflow","description":"Add molecule execution guidance to polecat context:\n\n## What to Add\n\n### Molecule Awareness\n- Polecats execute Wisps (ephemeral molecule instances)\n- The work assignment mail includes molecule context\n- Current step is tracked in the wisp\n\n### Workflow Protocol\n1. Read assignment (includes molecule ID and current step)\n2. Execute current step\n3. Update step status via bd mol step\n4. Generate summary when all steps complete\n5. Run bd mol squash to compress wisp into digest\n\n### Key Commands\n- bd mol show \u003cwisp-id\u003e - view current molecule state\n- bd mol step \u003cwisp-id\u003e --status=complete - mark step done\n- bd mol squash \u003cwisp-id\u003e --summary='...' - complete molecule\n\n### Summary Generation\nWhen completing work, generate a summary that:\n- Lists what was accomplished\n- Notes any deviations from the plan\n- Captures key decisions made\n- This becomes the permanent digest","status":"closed","priority":2,"issue_type":"task","assignee":"gastown/furiosa","created_at":"2025-12-21T16:33:05.36066-08:00","updated_at":"2025-12-21T16:42:47.779155-08:00","closed_at":"2025-12-21T16:42:47.779155-08:00","close_reason":"Added molecule workflow section to polecat.md with phases, workflow protocol, commands, and summary generation guidance","dependencies":[{"issue_id":"gt-a817","depends_on_id":"gt-62hm","type":"blocks","created_at":"2025-12-21T16:33:17.457167-08:00","created_by":"daemon"}]}
{"id":"gt-a95","title":"Refinery background daemon mode","description":"Refinery currently only works in foreground mode. Background daemon is stubbed.\n\n## Current State\nmanager.go line 128-129:\n```go\n// Background mode: spawn a new process\n// For MVP, we just mark as running - actual daemon implementation in gt-ov2\nreturn nil\n```\n\n## Requirements\n\n### 1. Background Process Spawning\n```go\nfunc (m *Manager) Start(foreground bool) error {\n if !foreground {\n // Spawn gt refinery start --foreground as subprocess\n cmd := exec.Command(os.Args[0], \"refinery\", \"start\", m.rig.Name, \"--foreground\")\n cmd.Start() // Don't wait\n // Record PID\n }\n}\n```\n\n### 2. PID File Management\n- Write PID to .gastown/refinery.pid\n- Check PID validity on status\n- Clean up stale PID files\n\n### 3. Log Output\n- Redirect stdout/stderr to .gastown/refinery.log\n- Log rotation (optional for MVP)\n\n### 4. Graceful Shutdown\n- Handle SIGTERM/SIGINT\n- Complete current merge before exit\n- Update state to stopped\n\n### 5. Health Check\n- Process existence check via kill -0\n- Optional: heartbeat file with timestamp\n\n## Files to Modify\n- internal/refinery/manager.go: Start(), Status(), process spawning\n\n## Acceptance Criteria\n- [ ] gt refinery start \u003crig\u003e spawns background process\n- [ ] gt refinery status shows running with PID\n- [ ] gt refinery stop sends SIGTERM and waits\n- [ ] Logs written to .gastown/refinery.log\n- [ ] Survives terminal close","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-16T14:46:53.366619-08:00","updated_at":"2025-12-19T15:24:39.124789-08:00","closed_at":"2025-12-19T14:47:40.165105-08:00"}
@@ -278,6 +283,8 @@
{"id":"gt-er0u","title":"Work on ga-yp3: Polecat inbox system for reliable work as...","description":"Work on ga-yp3: Polecat inbox system for reliable work assignment. This is P1 priority. See bd show ga-yp3 for full design spec.","status":"in_progress","priority":2,"issue_type":"task","created_at":"2025-12-19T21:57:34.473056-08:00","updated_at":"2025-12-19T21:57:34.540384-08:00"}
{"id":"gt-es1i","title":"Polecat health check loop","description":"Implement the Witness health check loop:\n\nEvery 60 seconds:\n1. List active polecats (gt polecats \u003crig\u003e)\n2. For each polecat, check:\n - Is tmux session still alive?\n - Is there a state.json with recent update?\n - Has there been git activity recently?\n3. If stuck (no activity for configurable threshold):\n - First: nudge (send message asking for status)\n - Second: escalate to Mayor\n - Third: force kill after human confirmation\n\nThis is the 'health monitor' part of Witness.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T03:14:21.634932-08:00","updated_at":"2025-12-20T09:32:15.553536-08:00","closed_at":"2025-12-20T09:32:15.553536-08:00","dependencies":[{"issue_id":"gt-es1i","depends_on_id":"gt-53w6","type":"parent-child","created_at":"2025-12-20T03:14:37.235596-08:00","created_by":"daemon"},{"issue_id":"gt-es1i","depends_on_id":"gt-mxyj","type":"blocks","created_at":"2025-12-20T03:14:38.829218-08:00","created_by":"daemon"}]}
{"id":"gt-eu9","title":"Witness session cycling and handoff","description":"Add session cycling and handoff protocol to Witness CLAUDE.md template.\n\n## Session Cycling Protocol\n\n```markdown\n## Session Cycling\n\nYour context will fill over long swarms. Proactively cycle when:\n- Running for many hours\n- Losing track of which workers you've checked\n- Responses getting slower\n- About to start complex operation\n\n### Handoff Protocol\n\n1. **Capture current state**:\n```bash\ntown list . # Worker states\ntown all beads # Pending verifications \ntown inbox # Unprocessed messages\n```\n\n2. **Compose handoff note**:\n```\n[HANDOFF_TYPE]: witness_cycle\n[TIMESTAMP]: \u003cnow\u003e\n[RIG]: \u003crig\u003e\n\n## Active Workers\n\u003clist workers and status\u003e\n\n## Pending Verifications\n\u003cworkers signaled done but not verified\u003e\n\n## Recent Actions\n\u003clast 3-5 actions\u003e\n\n## Warnings/Notes\n\u003canything next session should know\u003e\n\n## Next Steps\n\u003cwhat should happen next\u003e\n```\n\n3. **Send handoff**:\n```bash\ntown mail send \u003crig\u003e/witness -s \"Session Handoff\" -m \"\u003cnote\u003e\"\n```\n\n4. **Exit cleanly**: End session, daemon spawns fresh one.\n\n### On Fresh Session Start\n\n1. Check for handoff: `town inbox | grep \"Session Handoff\"`\n2. If found, read it and resume from handoff state\n3. If not found, do full status check\n```\n\n## Implementation\n\nAdd to WITNESS_CLAUDE.md template.","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-15T19:48:55.484911-08:00","updated_at":"2025-12-15T20:47:30.768506-08:00","dependencies":[{"issue_id":"gt-eu9","depends_on_id":"gt-82y","type":"blocks","created_at":"2025-12-15T19:49:05.846443-08:00","created_by":"daemon"}]}
{"id":"gt-eyi2","title":"Activity feed from wisp state: gt patrol status","description":"Enable mayor and gt tool to quickly see what patrol agents are doing.\n\n## Problem\n\nThe mayor and gt tool cannot quickly see what the deacon (or other patrol agents) are doing.\nNeed a way to extract an activity feed from the current wisp state.\n\n## Desired Commands\n\n- gt patrol status: Show current patrol state (step, timing, cycle count)\n- gt patrol history: Show recent patrol cycles (from digests)\n- gt patrol feed: Live tail of patrol activity\n\n## Data Sources\n\n- .beads-wisp/issues.jsonl: Current wisp with step progress\n- .beads/issues.jsonl: Digests from squashed patrols\n- heartbeat.json: Last activity timestamp\n\n## Use Cases\n\n1. Mayor checking deacon: Is the deacon doing anything?\n2. Debugging hangs: What step is it stuck on?\n3. Operator monitoring: Dashboard of patrol health\n4. Summaries for handoffs: Auto-generate patrol digest\n\n## Related\n\n- gt-id36: Deacon Kernel\n- gt-3x0z: Wisp Molecule Integration","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-22T03:04:15.726155-08:00","updated_at":"2025-12-22T03:04:15.726155-08:00"}
{"id":"gt-f165","title":"Pinned bead naming convention for all roles","description":"Establish consistent naming convention for pinned beads across all roles.\n\n## Problem\n\nEvery role needs a pinned bead for molecule attachment, handoff state, and identity.\nWe need a consistent naming convention so gt tools can find the pinned bead for any role.\n\n## Proposed Convention\n\n {role}.pinned - Singleton roles (deacon, mayor)\n {rig}-{role}.pinned - Per-rig roles (witness, refinery)\n {rig}-{name}.pinned - Named agents (polecats, crew)\n\nExamples:\n- deacon.pinned\n- mayor.pinned\n- gastown-witness.pinned\n- gastown-refinery.pinned\n- gastown-furiosa.pinned (polecat)\n- gastown-max.pinned (crew)\n\n## Storage Location\n\n| Role | Pinned Bead Location |\n|------|---------------------|\n| Mayor | ~/gt/.beads/ (town level) |\n| Deacon | ~/gt/.beads/ (town level) |\n| Witness | {rig}/.beads/ (rig level) |\n| Refinery | {rig}/.beads/ (rig level) |\n| Polecat | {rig}/polecats/{name}/.beads/ |\n| Crew | {rig}/crew/{name}/.beads/ |\n\n## Why This Matters\n\n1. Name recycling: Polecats reuse names so their pinned beads persist\n2. Molecule attachment: gt mol bond needs to find the pinned bead\n3. gt prime: Can show you are working on X from pinned bead\n4. Crash recovery: Resume from pinned beads attached molecule\n\n## Tasks\n\n- Document naming convention in architecture.md\n- Update gt prime to find pinned bead by convention\n- Update gt mol bond to use conventional name\n- Create pinned beads on role startup if missing\n- Add gt pinned command to show/manage pinned beads\n\n## Related\n\n- gt-rana.1: Attachment field on pinned beads (closed)\n- gt-id36.2: Deacon marching orders (pinned bead)","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-22T03:04:17.116117-08:00","updated_at":"2025-12-22T03:04:17.116117-08:00"}
{"id":"gt-f8v","title":"Witness pre-kill verification protocol","description":"Add pre-kill verification protocol to Witness CLAUDE.md template.\n\n## Protocol for Witness Prompting\n\n```markdown\n## Pre-Kill Verification Protocol\n\nBefore killing any worker session, verify workspace is clean.\n\n### Verification Steps\n\nWhen a worker signals done:\n\n1. **Capture worker state**:\n```bash\ntown capture \u003cpolecat\u003e \"git status \u0026\u0026 git stash list \u0026\u0026 bd sync --status\"\n```\n\n2. **Assess the output** (use your judgment):\n- Is working tree clean?\n- Is stash list empty?\n- Is beads synced?\n\n3. **Decision**:\n- **CLEAN**: Proceed to kill session\n- **DIRTY**: Send nudge with specific issues\n\n### Nudge Templates\n\n**Uncommitted Changes**:\n```\ntown inject \u003cpolecat\u003e \"WITNESS CHECK: Uncommitted changes found. Please commit or discard: \u003cfiles\u003e. Signal done when clean.\"\n```\n\n**Beads Not Synced**:\n```\ntown inject \u003cpolecat\u003e \"WITNESS CHECK: Beads not synced. Run 'bd sync' then commit. Signal done when complete.\"\n```\n\n### Kill Sequence\n\nOnly after verification passes:\n```bash\ntown kill \u003cpolecat\u003e\ntown sleep \u003cpolecat\u003e\n```\n\n### Escalation\n\nIf worker fails verification 3+ times:\n```bash\ntown mail send mayor/ -s \"Escalation: \u003cpolecat\u003e stuck\" -m \"Cannot complete cleanup after 3 attempts. Issues: \u003clist\u003e.\"\n```\n```\n\n## Implementation\n\nAdd to WITNESS_CLAUDE.md template.","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-15T19:48:54.065679-08:00","updated_at":"2025-12-15T20:47:30.415244-08:00","dependencies":[{"issue_id":"gt-f8v","depends_on_id":"gt-82y","type":"blocks","created_at":"2025-12-15T19:49:05.763378-08:00","created_by":"daemon"}]}
{"id":"gt-f9x","title":"Town \u0026 Rig Management: install, doctor, federation","description":"Reify the Gas Town installation as a first-class concept.\n\n## Goals\n- Installable: gt install [path] creates complete installation\n- Diagnosable: gt doctor checks and fixes issues\n- Federable: Clone town to VMs with central control\n\n## Architecture Reference\n\nSee docs/architecture.md for full design, especially:\n- Directory structure (Town Level / Rig Level sections)\n- Configuration (town.json, rigs.json schemas)\n- Key design decisions (visible config dir, decentralized agents)","status":"open","priority":1,"issue_type":"epic","created_at":"2025-12-15T16:36:37.344283-08:00","updated_at":"2025-12-15T21:15:13.120038-08:00","dependencies":[{"issue_id":"gt-f9x","depends_on_id":"gt-u1j.1","type":"blocks","created_at":"2025-12-15T16:37:32.3363-08:00","created_by":"daemon"}]}
{"id":"gt-f9x.1","title":"Config package: Config, State types and JSON serialization","description":"Config and state types with JSON serialization.\n\n## Town Config (config/town.json)\n\n```go\ntype TownConfig struct {\n Type string `json:\"type\"` // \"town\"\n Version int `json:\"version\"` // schema version\n Name string `json:\"name\"` // town identifier\n CreatedAt time.Time `json:\"created_at\"`\n}\n```\n\n## Rigs Registry (config/rigs.json)\n\n```go\ntype RigsConfig struct {\n Version int `json:\"version\"`\n Rigs map[string]RigEntry `json:\"rigs\"`\n}\n\ntype RigEntry struct {\n GitURL string `json:\"git_url\"`\n AddedAt time.Time `json:\"added_at\"`\n BeadsConfig *BeadsConfig `json:\"beads,omitempty\"`\n}\n\ntype BeadsConfig struct {\n Repo string `json:\"repo\"` // \"local\" | path | git-url\n Prefix string `json:\"prefix\"` // issue prefix\n}\n```\n\n## Agent State (*/state.json)\n\n```go\ntype AgentState struct {\n Role string `json:\"role\"` // \"mayor\", \"witness\", etc.\n LastActive time.Time `json:\"last_active\"`\n Session string `json:\"session,omitempty\"`\n Extra map[string]any `json:\"extra,omitempty\"`\n}\n```\n\n## Interface\n\n```go\nfunc LoadTownConfig(path string) (*TownConfig, error)\nfunc SaveTownConfig(path string, config *TownConfig) error\n\nfunc LoadRigsConfig(path string) (*RigsConfig, error)\nfunc SaveRigsConfig(path string, config *RigsConfig) error\n\nfunc LoadAgentState(path string) (*AgentState, error)\nfunc SaveAgentState(path string, state *AgentState) error\n```\n\n## Validation\n\n- Version compatibility checks\n- Required field validation\n- Path existence verification","status":"closed","priority":0,"issue_type":"task","created_at":"2025-12-15T16:36:50.163851-08:00","updated_at":"2025-12-16T13:24:26.497685-08:00","closed_at":"2025-12-16T13:24:26.497685-08:00"}
@@ -310,6 +317,7 @@
{"id":"gt-gby","title":"gt handoff: Unified agent lifecycle command","description":"## Summary\n\nUnified `gt handoff` command for ALL agent types to request lifecycle actions.\n\n## Usage\n\ngt handoff # Context-aware default\ngt handoff --shutdown # Terminate, cleanup, don't restart\ngt handoff --cycle # Restart with handoff mail\ngt handoff --restart # Fresh restart, no handoff\n\n## Context-Aware Defaults\n\n| Agent Type | Default | Reason |\n|------------|---------|--------|\n| Polecat | --shutdown | Ephemeral, work is done |\n| Witness | --cycle | Long-running, context full |\n| Refinery | --cycle | Long-running, context full |\n| Mayor | --cycle | Long-running, context full |\n| Crew | (sends mail only) | Human-managed |\n\n## What gt handoff Does\n\n1. **Verify safe to stop**\n - Git state clean (no uncommitted changes)\n - Work handed off (PR exists for polecats)\n\n2. **Send handoff mail to self** (for cycle/restart)\n - Captures current state\n - New session will read this\n\n3. **Send lifecycle request to manager**\n - Polecats/Refinery → Witness\n - Witness/Mayor → Daemon\n - Format: mail to \u003cmanager\u003e with action type\n\n4. **Set state: requesting_\u003caction\u003e**\n - Lifecycle manager checks this before acting\n\n5. **Wait for termination**\n - Don't self-exit - let manager kill session\n - Ensures clean handoff\n\n## Lifecycle Request Flow\n\nAgent Lifecycle Manager\n | |\n | 1. gt handoff --cycle |\n | a. Verify git clean |\n | b. Send handoff mail to self |\n | c. Set requesting_cycle=true |\n | d. Send lifecycle request |\n |------------------------------------→|\n | |\n | 2. Receive request\n | 3. Verify state |\n | 4. Kill session |\n | 5. Start new |\n | (for cycle) |\n | |\n | New session reads handoff |\n | Resumes work |\n\n## Who Manages Whom\n\n| Agent | Sends lifecycle request to |\n|-------|---------------------------|\n| Polecat | \u003crig\u003e/witness |\n| Refinery | \u003crig\u003e/witness |\n| Witness | daemon/ |\n| Mayor | daemon/ |\n\n## Implementation\n\n1. Detect current role (polecat, witness, refinery, mayor, crew)\n2. Apply context-aware default if no flag specified\n3. Run pre-flight checks (git clean, work handed off)\n4. Send handoff mail to self (if cycling)\n5. Send lifecycle request to appropriate manager\n6. Set requesting_\u003caction\u003e in state.json\n7. Wait (manager will kill us)\n\n## For Polecats (--shutdown)\n\nAdditional cleanup after kill:\n- Witness removes worktree\n- Witness deletes polecat branch\n- Polecat ceases to exist\n\n## Related Issues\n\n- gt-99m: Daemon (handles Mayor/Witness lifecycle)\n- gt-7ik: Ephemeral polecats (polecat cleanup)\n- gt-eu9: Witness session cycling","status":"in_progress","priority":1,"issue_type":"task","created_at":"2025-12-18T11:39:40.806863-08:00","updated_at":"2025-12-18T18:18:22.35369-08:00","dependencies":[{"issue_id":"gt-gby","depends_on_id":"gt-7ik","type":"blocks","created_at":"2025-12-18T11:39:46.423945-08:00","created_by":"daemon"},{"issue_id":"gt-gby","depends_on_id":"gt-eu9","type":"blocks","created_at":"2025-12-18T11:39:46.547204-08:00","created_by":"daemon"},{"issue_id":"gt-gby","depends_on_id":"gt-99m","type":"blocks","created_at":"2025-12-18T11:50:24.142182-08:00","created_by":"daemon"}]}
{"id":"gt-gl2","title":"Clarify Mayor vs Witness cleanup responsibilities","description":"Document the cleanup authority model: Witness owns ALL per-worker cleanup, Mayor never involved.\n\n## The Rule\n\n**Witness handles ALL per-worker cleanup. Mayor is never involved.**\n\n## Why This Matters\n\n1. Separation of concerns: Mayor strategic, Witness operational\n2. Reduced coordination overhead: No back-and-forth for routine cleanup\n3. Faster shutdown: Witness kills workers immediately upon verification\n4. Cleaner escalation: Mayor only hears about problems\n\n## What Witness Handles\n\n- Verifying worker git state before kill\n- Nudging workers to fix dirty state\n- Killing worker sessions\n- Updating worker state (sleep/wake)\n- Logging verification results\n\n## What Mayor Handles\n\n- Receiving swarm complete notifications\n- Deciding whether to start new swarms\n- Handling escalations (stuck workers after 3 retries)\n- Cross-rig coordination\n\n## Escalation Path\n\nWorker stuck -\u003e Witness nudges (up to 3x) -\u003e Witness escalates to Mayor -\u003e Mayor decides: force kill, reassign, or human\n\n## Anti-Patterns\n\nDO NOT: Mayor asks Witness if worker X is clean\nDO: Witness reports swarm complete, all workers verified\n\nDO NOT: Mayor kills worker sessions directly\nDO: Mayor tells Witness to abort swarm, Witness handles cleanup\n\nDO NOT: Workers report done to Mayor\nDO: Workers report to Witness, Witness aggregates and reports up","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-15T19:48:56.678724-08:00","updated_at":"2025-12-15T20:48:12.068964-08:00","dependencies":[{"issue_id":"gt-gl2","depends_on_id":"gt-82y","type":"blocks","created_at":"2025-12-15T19:49:05.929877-08:00","created_by":"daemon"}]}
{"id":"gt-h262","title":"bd ready --blockers: prioritize issues that block other work","description":"bd ready should prioritize issues that are blocking other work.\n\n**From VC**: Blocker-first prioritization in GetReadyWork(). ~100 lines.\nAlgorithm: baseline-failure first, then discovered:blocker, then by priority.\n\n**Gas Town implementation**: CLI flag or default behavior:\n```bash\nbd ready --blockers-first # Or make this default\n```\n\nChecks dependency graph. Issues with many dependents surface first.\n\n**Value**: Unblocks parallelism faster. Critical path gets cleared.\n\n**VC lesson**: Without blocker priority, work can starve on discovered issues.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-20T20:30:18.426957-08:00","updated_at":"2025-12-20T20:30:18.426957-08:00","dependencies":[{"issue_id":"gt-h262","depends_on_id":"gt-zhpa","type":"parent-child","created_at":"2025-12-20T20:30:27.664473-08:00","created_by":"daemon"}]}
{"id":"gt-h28m","title":"Deacon patrol banners: visual feedback on atom transitions","description":"Print large ASCII banners when transitioning between patrol atoms.\n\n## Problem\n\nWhen the deacon progresses through patrol atoms (steps), there is no visual feedback.\nThe operator cannot easily see what the deacon is doing without reading the full output.\n\n## Desired Behavior\n\nPrint banners on step start and completion:\n\n INBOX-CHECK - Checking for lifecycle requests, escalations, timers\n INBOX-CHECK COMPLETE - Processed 3 messages, 0 lifecycle requests\n\n## Benefits\n\n1. Scanability: Operator can glance at tmux and see what is happening\n2. Progress tracking: Easy to see where in the patrol loop we are\n3. Debugging: Clear demarcation between steps for troubleshooting\n\n## Implementation Options\n\n1. In deacon CLAUDE.md: Instruct agent to print banners\n2. gt patrol step start/end: Commands that print banners\n3. bd mol step hooks: Automatically on step transitions\n\n## Related\n\n- gt-id36: Deacon Kernel\n- gt-rana: Patrol System","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-22T03:04:14.290474-08:00","updated_at":"2025-12-22T03:04:14.290474-08:00"}
{"id":"gt-h2dc","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-21T22:04:43.421327-08:00","updated_at":"2025-12-21T22:05:10.503573-08:00","closed_at":"2025-12-21T22:05:10.503573-08:00","close_reason":"test cleanup","dependencies":[{"issue_id":"gt-h2dc","depends_on_id":"gt-jvr3","type":"parent-child","created_at":"2025-12-21T22:04:43.424974-08:00","created_by":"stevey"}],"wisp":true}
{"id":"gt-h5n","title":"Merge Queue in Beads: Universal chit system for all work","description":"\n\n**Design doc**: docs/merge-queue-design.md","status":"open","priority":0,"issue_type":"epic","created_at":"2025-12-16T23:01:45.782171-08:00","updated_at":"2025-12-17T13:43:43.211867-08:00"}
{"id":"gt-h5n.1","title":"MR field parsing: extract structured fields from description","description":"Parse merge-request beads to extract structured fields:\n- branch: source branch name\n- target: target branch (main or integration/xxx)\n- source_issue: the work item being merged\n- worker: who did the work\n- rig: which rig\n- merge_commit: (set on close)\n- close_reason: (set on close)\n\nFields stored in description as YAML block or key: value lines.\nProvide helper functions: ParseMRFields(issue) and SetMRFields(issue, fields).\n\nReference: docs/merge-queue-design.md#merge-request-schema","status":"closed","priority":0,"issue_type":"task","created_at":"2025-12-17T13:47:46.682379-08:00","updated_at":"2025-12-18T18:50:42.591901-08:00","closed_at":"2025-12-18T11:46:18.970805-08:00","dependencies":[{"issue_id":"gt-h5n.1","depends_on_id":"gt-h5n","type":"parent-child","created_at":"2025-12-17T13:47:46.682911-08:00","created_by":"daemon"}]}
@@ -338,6 +346,7 @@
{"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-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-i4kq","title":"Update templates for Propulsion Principle","description":"Overhaul agent prompts to embody the Universal Gas Town Propulsion Principle:\n\n\u003e If you find something on your hook, YOU RUN IT.\n\nTemplates to update:\n- [ ] deacon.md.tmpl - Check hook first, no decision logic\n- [ ] polecat.md.tmpl - Propulsion startup, follow molecule\n- [ ] witness.md.tmpl - Sling wisps when spawning agents\n- [ ] refinery.md.tmpl - Accept slung epics\n\nKey changes:\n1. Remove 'should I run this?' decision points\n2. Add 'check your hook' as step 1 of startup\n3. Make molecule-following the default mode\n4. Simplify - agents don't think, they execute","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-22T03:17:46.464968-08:00","updated_at":"2025-12-22T03:17:46.464968-08:00","dependencies":[{"issue_id":"gt-i4kq","depends_on_id":"gt-4ev4","type":"blocks","created_at":"2025-12-22T12:10:42.245621-08:00","created_by":"daemon"},{"issue_id":"gt-i4kq","depends_on_id":"gt-uym5","type":"blocks","created_at":"2025-12-22T12:10:42.320803-08:00","created_by":"daemon"}]}
{"id":"gt-i4lo","title":"mol-polecat-work","description":"Full polecat lifecycle from assignment to decommission.\n\nThis proto enables nondeterministic idempotence for polecat work.\nA polecat that crashes after any step can restart, read its molecule state,\nand continue from the last completed step. No work is lost.\n\nVariables:\n- gt-test123 - The source issue ID being worked on","status":"in_progress","priority":2,"issue_type":"epic","assignee":"stevey","created_at":"2025-12-21T21:48:26.320963-08:00","updated_at":"2025-12-21T21:48:26.332718-08:00","wisp":true}
{"id":"gt-ic0j","title":"🤝 HANDOFF: Timing fixes applied","description":"Fixed mayor attach timing bug. Completed: timing fix, gt-tulx, Emma beads-6v2. Remaining P1: gt-17zr, gt-kcee, gt-szsq. Run gt prime on startup.","status":"closed","priority":2,"issue_type":"message","created_at":"2025-12-18T22:19:57.731032-08:00","updated_at":"2025-12-18T23:28:33.950423-08:00","closed_at":"2025-12-18T23:28:33.950423-08:00"}
{"id":"gt-id36","title":"Deacon Kernel: event processing molecule architecture","description":"\nExtend the Deacon from \"health orchestrator\" to \"event processing kernel\" that runs a \nmolecule (rounds) each wake cycle, like an OS kernel scheduler.\n\n## Core Insight\n\nThe Deacon already has:\n- Wake cycle (daemon poke, timer, lifecycle request)\n- Mail as event queue\n- Health scanning\n- Lifecycle processing\n\nBut it is REACTIVE. This epic makes it PROACTIVE with a structured molecule:\n\n```\nDeacon Wake\n├── Step 0: Session Check (should I cycle myself?)\n├── Step 1: Health Scan (Mayor, Witnesses, Crew, Refineries)\n├── Step 2: Lifecycle Processing (cycle/restart/shutdown requests)\n├── Step 3: Plugin Execution (scheduled, event-triggered, human-requested)\n├── Step 4: Event Callbacks (timers, subscriptions)\n└── Step 5: Heartbeat + Wait\n```\n\n## Key Design Decisions\n\n1. **Session cycling first** - Token costs are quadratic with session length.\n Deacon should aggressively cycle to fresh sessions. First step of every\n wake is \"do I need a new session?\" based on context budget.\n\n2. **Pinned bead with marching orders** - A pinned bead (like gt prime for\n agents) defines the Deacon's rounds molecule. This is the Deacon's\n \"kernel\" - its operating loop.\n\n3. **Keepalive file for daemon quieting** - Instead of daemon tmux-poking\n the Deacon (which interrupts work), Deacon writes a keepalive file.\n Daemon reads it and backs off. Worst case: Deacon forgets, gets one\n extra heartbeat it squelches.\n\n4. **Molecule-based rounds** - The wake cycle becomes a molecule with steps.\n Each step can have plugins (inline attention). Steps can be added/modified\n by updating the pinned bead.\n\n## Architecture\n\n```\nGo Daemon (minimal, dumb)\n├── Reads {townRoot}/deacon/keepalive.json\n├── If fresh: do nothing\n├── If stale: poke Deacon (fallback)\n└── Process lifecycle requests (still daemon's job)\n\nDeacon (Claude agent, smart)\n├── Wakes: poke, timer, mail event\n├── Writes keepalive (quiets daemon for duration of rounds)\n├── Runs rounds molecule:\n│ ├── session-check: cycle if context budget low\n│ ├── health-scan: check agents, remediate\n│ ├── lifecycle: process requests\n│ ├── plugins: run scheduled/triggered plugins\n│ ├── events: process timer/event callbacks\n│ └── complete: update heartbeat, wait\n└── Reads marching orders from pinned bead\n```\n\n## Relation to Existing Work\n\n- Extends gt-5af (Deacon infrastructure) - CLOSED\n- Relates to gt-axz (Plugin architecture) - P3\n- Fits into phase3-deacon of gt-ngpz (Christmas Plan)\n- Enables gt-976 (Crew lifecycle) as part of health-scan step\n","status":"open","priority":1,"issue_type":"epic","created_at":"2025-12-20T21:46:08.076178-08:00","updated_at":"2025-12-20T21:46:08.076178-08:00","dependencies":[{"issue_id":"gt-id36","depends_on_id":"gt-976","type":"blocks","created_at":"2025-12-20T21:48:05.215593-08:00","created_by":"daemon"}]}
@@ -362,8 +371,18 @@
{"id":"gt-j4nu","title":"Merge: gt-g44u.3","description":"branch: polecat/Ace\ntarget: main\nsource_issue: gt-g44u.3\nrig: gastown","status":"closed","priority":0,"issue_type":"merge-request","created_at":"2025-12-19T16:14:52.767156-08:00","updated_at":"2025-12-19T17:35:36.663796-08:00","closed_at":"2025-12-19T17:35:36.663796-08:00"}
{"id":"gt-j5tk","title":"Work assignment messages should auto-close on completion","description":"When a polecat completes work on an issue, the work assignment message (msg-type:task) stays open. Found 7 stale work assignments in gastown after swarm completed.\n\nProposal: When bd close is called on an issue, auto-close any work assignment messages that reference that issue in their body.\n\nAlternative: Work assignment messages could use a different lifecycle - perhaps they should be acked (closed) when the polecat starts working, not when they finish.","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-20T03:12:28.403974-08:00","updated_at":"2025-12-20T03:12:28.403974-08:00"}
{"id":"gt-j87","title":"Design: Work flow simulation and validation","description":"Validate GGT designs through simulation before implementation.\n\n## Validation Approaches\n\n### 1. Dry-Run Simulation (Recommended First)\nMayor walks through scenarios mentally/on paper:\n- \"If polecat Toast signals done with dirty git state, what happens?\"\n- \"If Witness context fills mid-verification, what state is lost?\"\n- \"If two polecats try to close same issue, what happens?\"\n\nCreate beads for any gaps discovered.\n\n### 2. Real Work in gastown-py\nUse Python Gas Town to stress-test assumptions:\n- Run actual batch work on test repos\n- Observe edge cases in practice\n- Document issues found\n\n### 3. Edge Case Analysis\nSystematic review of failure modes:\n- Agent crashes mid-operation\n- Network failures during sync\n- Concurrent access to shared state\n- Context limits hit at bad times\n\n## Key Scenarios to Validate\n\n- [ ] Witness session cycling (state preservation)\n- [ ] Polecat decommission with dirty state\n- [ ] Merge conflicts in queue\n- [ ] Beads sync conflicts between workers\n- [ ] Escalation path (stuck worker -\u003e Mayor)\n- [ ] Cross-rig communication\n- [ ] Federation mail routing (future)\n\n## Success Criteria\n\n- No data loss scenarios identified\n- Clear recovery paths for all failure modes\n- Edge cases either handled or documented as limitations\n- Design improves as model cognition improves\n\n## Output\n\nFor each scenario validated:\n1. Document in relevant bead if issue found\n2. Create new beads for missing functionality\n3. Update architecture.md if design changes","status":"open","priority":1,"issue_type":"epic","created_at":"2025-12-15T20:24:11.251841-08:00","updated_at":"2025-12-16T17:25:49.858717-08:00"}
{"id":"gt-jgdx","title":"Digest: mol-deacon-patrol","description":"Test patrol cycle - first run, no actual work done","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-22T02:07:03.388821-08:00","updated_at":"2025-12-22T02:07:03.388821-08:00","closed_at":"2025-12-22T02:07:03.388793-08:00","close_reason":"Squashed from 5 wisps"}
{"id":"gt-jpt","title":"Town-level beads: Real DB for coordination mail","description":"Implement Option A from mail redesign: Town gets real beads DB for coordination.\n\n## Background\n\nMail is now Beads. But currently:\n- Town .beads/redirect points to rig beads\n- mayor/mail/ has legacy JSONL files\n- Cross-rig coordination has no clear home\n\n## Design\n\nTown beads = coordination, cross-rig mail, mayor inbox, handoffs\nRig beads = project issues, work items\n\nMatches HOP hierarchy: platform \u003e project \u003e worker\n\n## Structure\n\n~/gt/\n .beads/ # REAL beads DB (prefix: gm-)\n mayor/\n town.json\n state.json # NO mail/ directory\n gastown/\n .beads/ # Rig beads (prefix: ga-)\n\n## Tasks\n\n1. Delete ~/gt/.beads/redirect\n2. Run bd init --prefix gm at ~/gt/ (town beads)\n3. Delete ~/gt/mayor/mail/ directory\n4. Update gt mail to use beads not JSONL\n5. Add mail fields (thread_id, reply_to, msg_type)\n6. Update gt prime for two-tier model\n7. Update docs/architecture.md\n\n## Addressing\n\n- mayor/ -\u003e town beads\n- rig/agent -\u003e rig beads\n- Cross-rig -\u003e town beads","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-17T19:09:55.855955-08:00","updated_at":"2025-12-19T01:57:17.032558-08:00","closed_at":"2025-12-19T01:57:17.032558-08:00"}
{"id":"gt-jvr3","title":"mol-polecat-work","description":"Full polecat lifecycle from assignment to decommission.\n\nThis proto enables nondeterministic idempotence for polecat work.\nA polecat that crashes after any step can restart, read its molecule state,\nand continue from the last completed step. No work is lost.\n\nVariables:\n- gt-test - The source issue ID being worked on","status":"closed","priority":2,"issue_type":"epic","assignee":"gastown/test-polecat","created_at":"2025-12-21T22:04:43.420231-08:00","updated_at":"2025-12-21T22:05:10.498762-08:00","closed_at":"2025-12-21T22:05:10.498762-08:00","close_reason":"test cleanup","wisp":true}
{"id":"gt-k1lr","title":"Consolidate configuration architecture: three-tier model","description":"Rationalize Gas Town's scattered configuration into a clean three-tier model:\n\n## Current Problems\n- Config split across mayor/, .gastown/, and rig/config.json\n- Runtime state mixed with configuration\n- Hidden directories (.gastown/) are missed by agents\n- Category confusion: identity vs config vs runtime state\n\n## Proposed Architecture\n\n### Tier 1: Town Config (mayor/)\n```\nmayor/\n├── town.json # Town identity (unchanged)\n├── rigs.json # Rig registry (unchanged)\n└── config.json # NEW: Town-level configuration\n # theme defaults, daemon settings, etc.\n```\n\n### Tier 2: Town Runtime (.runtime/)\n```\n~/gt/.runtime/ # NEW: Gitignored\n├── daemon.json # {pid, started_at, heartbeat}\n├── deacon.json # {cycle, last_action}\n└── agent-requests.json # Lifecycle requests\n```\n\n### Tier 3: Rig Config (settings/)\n```\n\u003crig\u003e/\n├── config.json # Rig identity only (type, git_url, beads.prefix)\n├── settings/ # NEW: Visible, git-tracked\n│ ├── config.json # theme, merge_queue, max_workers\n│ ├── namepool.json # pool settings (style, max)\n│ └── roles/ # Per-role overrides (optional)\n└── .runtime/ # NEW: Gitignored\n ├── witness.json # {state, started_at, stats}\n ├── refinery.json # {state, started_at, stats}\n └── namepool-state.json # {in_use, overflow_next}\n```\n\n## Key Principles\n1. **Visible \u003e Hidden** for config agents need to find\n2. **Git-tracked** for identity and config; **gitignored** for runtime\n3. **Separation of concerns**: identity, config, runtime are distinct\n4. **Locality**: town config at town root, rig config at rig root\n\n## Migration\n- Move .gastown/ contents to appropriate new locations\n- Update all code that reads/writes these files\n- Update .gitignore patterns\n- Update documentation (architecture.md, CLAUDE.md)\n","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-22T01:01:48.96788-08:00","updated_at":"2025-12-22T01:33:05.853643-08:00","closed_at":"2025-12-22T01:33:05.853643-08:00","close_reason":"All 8 tasks complete: config architecture migrated to three-tier model"}
{"id":"gt-k1lr.1","title":"Add mayor/config.json for town-level configuration","description":"Create new town-level config file:\n- Add TownConfig.Config field to types.go\n- Create mayor/config.json with theme defaults, daemon settings\n- Update loader to read/write mayor/config.json\n- Migrate any town-level config from .gastown/ to here","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-22T01:02:20.091293-08:00","updated_at":"2025-12-22T01:21:50.158814-08:00","closed_at":"2025-12-22T01:21:50.158814-08:00","close_reason":"Implemented three-tier config architecture","dependencies":[{"issue_id":"gt-k1lr.1","depends_on_id":"gt-k1lr","type":"parent-child","created_at":"2025-12-22T01:02:20.09177-08:00","created_by":"daemon"}]}
{"id":"gt-k1lr.2","title":"Create .runtime/ for town-level runtime state","description":"Move ephemeral town state to .runtime/:\n- Create ~/gt/.runtime/ directory structure\n- Move daemon/state.json → .runtime/daemon.json\n- Move deacon/heartbeat.json → .runtime/deacon.json \n- Move .gastown/agent-state.json → .runtime/agent-requests.json\n- Move .gastown/keepalive.json → .runtime/keepalive.json\n- Update .gitignore to ignore .runtime/\n- Update all code references","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-22T01:02:21.166304-08:00","updated_at":"2025-12-22T01:21:50.160964-08:00","closed_at":"2025-12-22T01:21:50.160964-08:00","close_reason":"Implemented three-tier config architecture","dependencies":[{"issue_id":"gt-k1lr.2","depends_on_id":"gt-k1lr","type":"parent-child","created_at":"2025-12-22T01:02:21.166715-08:00","created_by":"daemon"}]}
{"id":"gt-k1lr.3","title":"Create rig settings/ directory for rig configuration","description":"Replace .gastown/ with visible settings/ at rig level:\n- Create \u003crig\u003e/settings/ directory\n- Move .gastown/config.json → settings/config.json (theme, merge_queue, max_workers)\n- Create settings/namepool.json for pool settings (style, max - not state)\n- Create settings/roles/ for per-role overrides (optional)\n- Update RigConfig type to reference settings/\n- Update loader to read from settings/","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-22T01:02:22.13096-08:00","updated_at":"2025-12-22T01:21:50.162695-08:00","closed_at":"2025-12-22T01:21:50.162695-08:00","close_reason":"Implemented three-tier config architecture","dependencies":[{"issue_id":"gt-k1lr.3","depends_on_id":"gt-k1lr","type":"parent-child","created_at":"2025-12-22T01:02:22.13369-08:00","created_by":"daemon"}]}
{"id":"gt-k1lr.4","title":"Create rig .runtime/ for rig runtime state","description":"Move ephemeral rig state to .runtime/:\n- Create \u003crig\u003e/.runtime/ directory\n- Move .gastown/witness.json → .runtime/witness.json\n- Move .gastown/refinery.json → .runtime/refinery.json\n- Move .gastown/namepool.json (state portion) → .runtime/namepool-state.json\n- Update .gitignore to ignore .runtime/\n- Update all code references","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-22T01:02:23.072213-08:00","updated_at":"2025-12-22T01:21:50.163941-08:00","closed_at":"2025-12-22T01:21:50.163941-08:00","close_reason":"Implemented three-tier config architecture","dependencies":[{"issue_id":"gt-k1lr.4","depends_on_id":"gt-k1lr","type":"parent-child","created_at":"2025-12-22T01:02:23.073919-08:00","created_by":"daemon"}]}
{"id":"gt-k1lr.5","title":"Slim down rig root config.json to identity only","description":"Rig root config.json should only contain identity:\n- type, version, name, git_url, beads.prefix, created_at\n- Remove any behavioral config (move to settings/config.json)\n- Update RigConfig type to separate identity from settings\n- Ensure loader reads identity from root, settings from settings/","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-22T01:02:24.069337-08:00","updated_at":"2025-12-22T01:21:50.165178-08:00","closed_at":"2025-12-22T01:21:50.165178-08:00","close_reason":"Implemented three-tier config architecture","dependencies":[{"issue_id":"gt-k1lr.5","depends_on_id":"gt-k1lr","type":"parent-child","created_at":"2025-12-22T01:02:24.070897-08:00","created_by":"daemon"}]}
{"id":"gt-k1lr.6","title":"Update gt doctor to check new config locations","description":"Doctor should validate new structure:\n- Check mayor/config.json exists and is valid\n- Check settings/ exists for each rig\n- Warn if old .gastown/ files still exist\n- Offer --fix to migrate old locations to new","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-22T01:02:25.886588-08:00","updated_at":"2025-12-22T01:30:37.871099-08:00","closed_at":"2025-12-22T01:30:37.871099-08:00","close_reason":"Doctor checks implemented and auto-fixed legacy directories","dependencies":[{"issue_id":"gt-k1lr.6","depends_on_id":"gt-k1lr","type":"parent-child","created_at":"2025-12-22T01:02:25.888093-08:00","created_by":"daemon"},{"issue_id":"gt-k1lr.6","depends_on_id":"gt-k1lr.1","type":"blocks","created_at":"2025-12-22T01:02:37.750161-08:00","created_by":"daemon"},{"issue_id":"gt-k1lr.6","depends_on_id":"gt-k1lr.3","type":"blocks","created_at":"2025-12-22T01:02:37.820429-08:00","created_by":"daemon"}]}
{"id":"gt-k1lr.7","title":"Update documentation for new config architecture","description":"Update docs to reflect new structure:\n- docs/architecture.md: Directory structure section\n- CLAUDE.md files: Config references\n- Add docs/configuration.md with full reference","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-22T01:02:27.104869-08:00","updated_at":"2025-12-22T01:32:56.916862-08:00","closed_at":"2025-12-22T01:32:56.916862-08:00","close_reason":"Updated architecture.md and hq.md with three-tier config model","dependencies":[{"issue_id":"gt-k1lr.7","depends_on_id":"gt-k1lr","type":"parent-child","created_at":"2025-12-22T01:02:27.106351-08:00","created_by":"daemon"},{"issue_id":"gt-k1lr.7","depends_on_id":"gt-k1lr.1","type":"blocks","created_at":"2025-12-22T01:02:37.609785-08:00","created_by":"daemon"},{"issue_id":"gt-k1lr.7","depends_on_id":"gt-k1lr.3","type":"blocks","created_at":"2025-12-22T01:02:37.680026-08:00","created_by":"daemon"}]}
{"id":"gt-k1lr.8","title":"Remove .gastown/ after migration complete","description":"Final cleanup:\n- Remove .gastown/ directories at town and rig levels\n- Remove daemon/ and deacon/ directories (replaced by .runtime/)\n- Update .gitignore to remove old patterns\n- Verify all tests pass with new structure","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-22T01:02:28.43634-08:00","updated_at":"2025-12-22T01:30:37.872957-08:00","closed_at":"2025-12-22T01:30:37.872957-08:00","close_reason":"Doctor checks implemented and auto-fixed legacy directories","dependencies":[{"issue_id":"gt-k1lr.8","depends_on_id":"gt-k1lr","type":"parent-child","created_at":"2025-12-22T01:02:28.437853-08:00","created_by":"daemon"},{"issue_id":"gt-k1lr.8","depends_on_id":"gt-k1lr.7","type":"blocks","created_at":"2025-12-22T01:02:37.466318-08:00","created_by":"daemon"},{"issue_id":"gt-k1lr.8","depends_on_id":"gt-k1lr.6","type":"blocks","created_at":"2025-12-22T01:02:37.539854-08:00","created_by":"daemon"}]}
{"id":"gt-k7x0","title":"Merge: gt-h5n.5","description":"branch: polecat/Scabrous\ntarget: main\nsource_issue: gt-h5n.5\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-19T14:53:42.318338-08:00","updated_at":"2025-12-19T14:54:35.021214-08:00","closed_at":"2025-12-19T14:54:35.021214-08:00"}
{"id":"gt-kcee","title":"Witness commands: gt witness start/stop/status needed","description":"## Summary\n\nNo `gt witness` command exists. The witness should:\n- Monitor polecats for stuck/idle state\n- Nudge polecats that seem blocked\n- Report status to mayor\n- Handle polecat lifecycle\n\n## Expected Commands\n\n```bash\ngt witness start gastown # Start witness for rig\ngt witness stop gastown # Stop witness\ngt witness status # Show witness status\n```\n\n## Current State\n\n- Witness directory exists: /Users/stevey/gt/gastown/witness/\n- Has state.json but no active process\n- gt status shows 'Witnesses: 0'\n\n## Context\n\nFull polecat flow needs witness monitoring for production use.","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-18T21:55:24.079671-08:00","updated_at":"2025-12-19T01:33:49.856942-08:00","closed_at":"2025-12-19T01:33:49.856942-08:00"}
{"id":"gt-keqh","title":"self-review","description":"Review your own changes. Look for:\n- Bugs and edge cases\n- Style issues\n- Missing error handling\n- Security concerns\n\nFix any issues found before proceeding.\n\nDepends: implement","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T21:56:18.535003-08:00","updated_at":"2025-12-21T21:56:27.51043-08:00","closed_at":"2025-12-21T21:56:27.51043-08:00","close_reason":"test cleanup","dependencies":[{"issue_id":"gt-keqh","depends_on_id":"gt-zjqs","type":"parent-child","created_at":"2025-12-21T21:56:18.537323-08:00","created_by":"stevey"},{"issue_id":"gt-keqh","depends_on_id":"gt-pwep","type":"blocks","created_at":"2025-12-21T21:56:18.537857-08:00","created_by":"stevey"}],"wisp":true}
@@ -420,7 +439,7 @@
{"id":"gt-ni6a","title":"Witness role template + CLAUDE.md","description":"Create the Witness agent's role context:\n\n1. internal/templates/roles/witness.md.tmpl\n - Witness responsibilities (polecat lifecycle)\n - Core loop description\n - Commands available (gt polecats, bd ready, etc)\n - Escalation protocol\n\n2. Generate CLAUDE.md for witness/ directories\n - Context about the rig\n - Mail address: \u003crig\u003e/witness\n - Startup protocol (gt prime, check inbox)\n\nThe Witness is the per-rig 'pit boss' - NOT a global coordinator. It manages polecats for ONE rig only.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T03:14:18.617496-08:00","updated_at":"2025-12-20T03:54:13.697998-08:00","closed_at":"2025-12-20T03:54:13.697998-08:00","dependencies":[{"issue_id":"gt-ni6a","depends_on_id":"gt-53w6","type":"parent-child","created_at":"2025-12-20T03:14:37.105264-08:00","created_by":"daemon"}]}
{"id":"gt-njem","title":"Remove gt mail dependency on bd mail commands","description":"Replaced bd mail send/inbox/read/ack with bd create/list/show/close. Messages are now stored as beads issues with type=message.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-20T17:52:43.47722-08:00","updated_at":"2025-12-20T17:52:48.155447-08:00","closed_at":"2025-12-20T17:52:48.155447-08:00"}
{"id":"gt-njr","title":"Engineer session restart protocol","description":"Implement session restart flow for when the Engineer needs to split work:\n\n1. Engineer creates subtask(s) in Beads assigned to self\n2. Engineer sends handoff mail to self (🤝 HANDOFF)\n3. Engineer sends restart request to Witness\n4. Witness verifies:\n - Handoff mail exists in Engineer outbox/sent\n - Subtasks filed in Beads\n5. Witness restarts the Refinery session (new Engineer context)\n\nThis enables \"occasionally consistent, eventually convergent\" work patterns.\nThe Refinery continues; the Engineer gets fresh context.","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-16T23:02:48.22994-08:00","updated_at":"2025-12-16T23:07:42.05363-08:00","dependencies":[{"issue_id":"gt-njr","depends_on_id":"gt-h5n","type":"blocks","created_at":"2025-12-16T23:02:56.148564-08:00","created_by":"daemon"}]}
{"id":"gt-nq6j","title":"Rename .beads-ephemeral to .beads-wisps in docs","description":"The wisp storage directory should be named `.beads-wisps/` not `.beads-ephemeral/`.\n\nAlso fix the architecture: Witness and Refinery share mayor/rig's beads and wisps.\nThey don't have separate ephemeral stores.\n\n## Files to update\n- docs/wisp-architecture.md\n- docs/architecture.md \n- ~/gt/docs/patrol-system-design.md\n- ~/gt/CLAUDE.md\n\n## Changes\n1. Rename `.beads-ephemeral/` → `.beads-wisps/` everywhere\n2. Remove incorrect references to witness/.beads-ephemeral/ and refinery/rig/.beads-ephemeral/\n3. Clarify that all rig-level patrols use mayor/rig/.beads-wisps/","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-21T23:38:04.110859-08:00","updated_at":"2025-12-21T23:39:06.119721-08:00"}
{"id":"gt-nq6j","title":"Rename .beads-ephemeral to .beads-wisps in docs","description":"The wisp storage directory should be named `.beads-wisps/` not `.beads-ephemeral/`.\n\nAlso fix the architecture: Witness and Refinery share mayor/rig's beads and wisps.\nThey don't have separate ephemeral stores.\n\n## Files to update\n- docs/wisp-architecture.md\n- docs/architecture.md \n- ~/gt/docs/patrol-system-design.md\n- ~/gt/CLAUDE.md\n\n## Changes\n1. Rename `.beads-ephemeral/` → `.beads-wisps/` everywhere\n2. Remove incorrect references to witness/.beads-ephemeral/ and refinery/rig/.beads-ephemeral/\n3. Clarify that all rig-level patrols use mayor/rig/.beads-wisps/","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-21T23:38:04.110859-08:00","updated_at":"2025-12-22T02:59:00.441145-08:00","closed_at":"2025-12-22T02:59:00.441145-08:00","close_reason":"Renamed .beads-ephemeral to .beads-wisp, unified rig patrol storage"}
{"id":"gt-nriy","title":"Test: Alpha to Beta","description":"Sibling communication test","status":"open","priority":2,"issue_type":"message","assignee":"gastown-beta","created_at":"2025-12-20T21:44:00.731578-08:00","updated_at":"2025-12-20T21:44:00.731578-08:00","labels":["thread:thread-d94865313b74"],"sender":"Steve Yegge","wisp":true}
{"id":"gt-nti8","title":"Polecats should not push branches to remote","description":"## Current Behavior\n\nPolecats push their branches to origin (e.g., `polecat/furiosa`), which pollutes the remote with many short-lived branches.\n\n## Desired Behavior\n\nPolecats should only commit locally. The Refinery handles all remote pushes:\n1. Polecat works on local `polecat/\u003cname\u003e` branch\n2. Polecat signals done (state → idle)\n3. Refinery pulls from local polecat branch\n4. Refinery runs tests, merges to main\n5. Refinery pushes main to remote\n6. If PR review needed, Refinery creates the PR\n\n## Benefits\n\n- Clean remote (no branch pollution)\n- Clear responsibility (Refinery is the quality gate)\n- Simpler cleanup (local branches deleted with worktree)\n- Less noise in GitHub UI\n\n## Trade-offs\n\n- If polecat crashes before Refinery merges, code is lost locally\n- But beads issue remains open, another polecat can redo the work\n- This is acceptable for ephemeral workers\n\n## Implementation\n\nIn polecat CLAUDE.md or landing protocol:\n- Remove `git push origin HEAD` from workflow\n- Replace with just `git commit` + signal done\n- Refinery handles the rest","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-21T14:13:48.804954-08:00","updated_at":"2025-12-21T14:13:48.804954-08:00"}
{"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)"}
@@ -440,6 +459,7 @@
{"id":"gt-pwep","title":"implement","description":"Implement the solution for gt-test123. Follow codebase conventions.\nFile discovered work as new issues with bd create.\n\nMake regular commits with clear messages.\nKeep changes focused on the assigned issue.\n\nDepends: load-context","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T21:56:18.534804-08:00","updated_at":"2025-12-21T21:56:27.509304-08:00","closed_at":"2025-12-21T21:56:27.509304-08:00","close_reason":"test cleanup","dependencies":[{"issue_id":"gt-pwep","depends_on_id":"gt-zjqs","type":"parent-child","created_at":"2025-12-21T21:56:18.536244-08:00","created_by":"stevey"},{"issue_id":"gt-pwep","depends_on_id":"gt-mc4n","type":"blocks","created_at":"2025-12-21T21:56:18.536793-08:00","created_by":"stevey"}],"wisp":true}
{"id":"gt-pyqv","title":"Work on ga-ct2: Add MR workflow to polecat completion. Wh...","description":"Work on ga-ct2: Add MR workflow to polecat completion. When polecat completes work, auto-create MR to integration branch. When done, submit MR (not PR) to integration branch for Refinery.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-19T22:58:35.473928-08:00","updated_at":"2025-12-21T17:20:42.831549-08:00"}
{"id":"gt-q6hl","title":"mol-polecat-work","description":"Full polecat lifecycle from assignment to decommission.\n\nThis proto enables nondeterministic idempotence for polecat work.\nA polecat that crashes after any step can restart, read its molecule state,\nand continue from the last completed step. No work is lost.\n\nVariables:\n- gt-qwyu - The source issue ID being worked on","status":"closed","priority":2,"issue_type":"epic","assignee":"gastown/furiosa","created_at":"2025-12-21T21:58:52.59934-08:00","updated_at":"2025-12-21T21:59:10.937705-08:00","closed_at":"2025-12-21T21:59:10.937705-08:00","close_reason":"test cleanup","wisp":true}
{"id":"gt-q6lg","title":"mol-crew-session: Startup/shutdown protocols for crew workers","description":"Crew workers (like joe, max) don't have patrol molecules keeping them fresh. When gt gets rebuilt, they have stale binaries that cause hangs and bugs.\n\n## Problem\n\n- Crew binaries get stale when gt is rebuilt elsewhere\n- No automatic pull/rebase/rebuild on session start\n- No standardized shutdown protocol (sync, push, handoff)\n\n## Solution: mol-crew-session\n\nA molecule template for crew sessions:\n\n### Startup Phase\n1. `git pull --rebase` - get latest code\n2. `bd sync` - sync beads\n3. `go build -o gt ./cmd/gt` - rebuild gt (if in gastown)\n4. `gt prime` - load context\n\n### Work Phase \n- Open-ended human interaction\n- No molecule steps - just work until done\n\n### Shutdown Phase\n1. `git status` - check for uncommitted changes\n2. `bd sync` - sync beads\n3. `git push` - push code\n4. Handoff if incomplete work\n\n## Implementation\n\n1. Define mol-crew-session in builtin_molecules.go\n2. Update crew CLAUDE.md to reference the protocol\n3. Optionally: gt prime auto-runs startup steps\n\n## Dependencies\n\n- Should implement after deacon/witness/polecat patrols are stable\n- Consider: gt-3x0z.10 (Witness patrol molecules)\n\n## Related\n\n- gt-3x0z.9: Deacon wisp patrol (done)\n- fix-gt script: Current workaround for binary freshness","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-22T02:48:25.658692-08:00","updated_at":"2025-12-22T02:48:25.658692-08:00"}
{"id":"gt-q8du","title":"Configuration in Beads: use pinned beads for rig/agent config","description":"## Summary\n\nMove configuration from JSON files into Beads data plane using pinned beads.\n\n## Motivation\n\n- Config becomes versionable and syncable like issues\n- Agents can read config via `bd show`\n- Unified data model for everything\n- Supports the 'Beads as Universal Data Plane' vision (gt-aqm)\n\n## Config Types to Migrate\n\n### Rig-level (pinned per rig)\n- Theme/colors for tmux status line\n- Default branch naming conventions\n- Merge queue settings\n- Witness thresholds\n\n### Agent-level (pinned per role)\n- Handoffs (already planned - gt-cu7r)\n- Agent preferences\n- Current focus/context\n\n### Town-level (pinned at town root)\n- Cross-rig settings\n- Federation config\n- Global themes\n\n## Implementation\n\n1. Implement StatusPinned (beads-6v2) ✓ in progress\n2. Create config pinned beads on rig init\n3. Add `bd config get/set` commands that read/write pinned beads\n4. Migrate existing config.json fields\n\n## Naming Convention\n\n```\n\u003cprefix\u003e-cfg-\u003cscope\u003e\ngt-cfg-theme # gastown theme\nbd-cfg-merge # beads merge settings\ngm-cfg-town # town-level config\n```\n\n## Dependencies\n\n- beads-6v2: Add StatusPinned to beads schema\n- gm-w13: Pinned Beads epic","status":"open","priority":2,"issue_type":"epic","created_at":"2025-12-18T21:58:59.898116-08:00","updated_at":"2025-12-18T21:58:59.898116-08:00"}
{"id":"gt-qaca","title":"Merge: gt-5af.2","description":"branch: polecat/Doof\ntarget: main\nsource_issue: gt-5af.2\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-19T17:29:36.838038-08:00","updated_at":"2025-12-20T23:17:25.79048-08:00","closed_at":"2025-12-20T23:17:25.79048-08:00","close_reason":"Branches nuked, MRs obsolete"}
{"id":"gt-qao","title":"CLI: mayor commands (start, attach, stop, status)","description":"Mayor management CLI commands.\n\n## Commands\n\n### gt mayor start\n```\ngt mayor start [--continue] [--agent AGENT]\n```\n- --continue: Resume from previous session (check for handoff mail)\n- --agent: claude (default) or other agent type\n\n### gt mayor attach\n```\ngt mayor attach\n```\nAttach to running Mayor session.\n\n### gt mayor stop\n```\ngt mayor stop [--grace-period N]\n```\nStop Mayor session with optional grace period.\n\n### gt mayor status\n```\ngt mayor status [--json]\n```\nShow Mayor running status.\n\n## Session Management\nSession name: `gt-mayor`\nWorking directory: `\u003ctown\u003e/mayor/rig/` or `\u003ctown\u003e/mayor/`\n\n## Implementation\nSimilar to session commands but for special Mayor context.\n\n```go\nfunc getMayorPath(townRoot string) string {\n return filepath.Join(townRoot, \"mayor\")\n}\n\nfunc getMayorSessionName() string {\n return \"gt-mayor\"\n}\n```\n\n## New File\ninternal/cmd/mayor.go\n\n## PGT Reference\ngastown-py/src/gastown/cli/mayor_cmd.py\n\n## Acceptance Criteria\n- [ ] gt mayor start launches Mayor session\n- [ ] gt mayor attach works\n- [ ] gt mayor stop with grace period\n- [ ] gt mayor status shows running state","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-16T14:47:54.721035-08:00","updated_at":"2025-12-16T16:05:45.226324-08:00"}
@@ -457,7 +477,6 @@
{"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-r6c7","title":"loop-or-exit","description":"Decision: burn and loop if context low, exit for respawn if context high.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-21T17:51:45.437894-08:00","updated_at":"2025-12-21T17:51:45.437894-08:00","dependencies":[{"issue_id":"gt-r6c7","depends_on_id":"gt-hbnz","type":"parent-child","created_at":"2025-12-21T17:51:45.444029-08:00","created_by":"stevey"},{"issue_id":"gt-r6c7","depends_on_id":"gt-7iek","type":"blocks","created_at":"2025-12-21T17:51:45.444563-08:00","created_by":"stevey"}],"wisp":true}
{"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"}
@@ -468,14 +487,13 @@
{"id":"gt-rana.5","title":"Phase 2: Quiescent agents (Witness, Refinery)","description":"Enable Witness and Refinery to sleep until triggered.\n\n## Scope\n- Wake triggers: gt spawn, MR submit, mail, Deacon ping\n- Wake SLA: \u003c1 minute\n- mol-witness-patrol and mol-refinery-patrol definitions\n- Quiescent entry/exit protocol\n\n## Implementation\n- Kill tmux session on quiescent entry\n- Preserve sandbox (worktree, state files)\n- Restart session on wake trigger\n- Agent checks pinned, spawns default patrol if naked\n\nDepends: Phase 1 complete","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-21T13:39:12.926917-08:00","updated_at":"2025-12-21T13:39:12.926917-08:00","dependencies":[{"issue_id":"gt-rana.5","depends_on_id":"gt-rana","type":"parent-child","created_at":"2025-12-21T13:39:12.928741-08:00","created_by":"daemon"},{"issue_id":"gt-rana.5","depends_on_id":"gt-rana.4","type":"blocks","created_at":"2025-12-21T13:39:23.067953-08:00","created_by":"daemon"}]}
{"id":"gt-rana.6","title":"Phase 3: Callbacks and plugins","description":"Mail-based callback protocol and plugin surface.\n\n## Callbacks\n- Polecat → Witness: shutdown requests\n- Witness → Deacon: escalations, status\n- Crew → Deacon: recycle requests\n- Deacon → Mayor: escalations\n\n## Plugins\n- .beads/plugins.yaml registry\n- Cooldown tracking\n- Plugin runner in deacon patrol\n\nDepends: Phase 2","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-21T13:39:14.120827-08:00","updated_at":"2025-12-21T13:39:14.120827-08:00","dependencies":[{"issue_id":"gt-rana.6","depends_on_id":"gt-rana","type":"parent-child","created_at":"2025-12-21T13:39:14.122713-08:00","created_by":"daemon"},{"issue_id":"gt-rana.6","depends_on_id":"gt-rana.5","type":"blocks","created_at":"2025-12-21T13:39:23.138268-08:00","created_by":"daemon"}]}
{"id":"gt-rana.7","title":"Phase 4: Polish and observability","description":"Production readiness.\n\n## Commands\n- gt patrol status - Show patrol state for all agents\n- gt patrol history - Recent patrol activity\n\n## Observability\n- Metrics collection\n- Alert thresholds\n- Dashboard (optional)\n\n## Tuning\n- Cooldown optimization\n- Wake SLA verification\n- Error threshold tuning\n\nDepends: Phase 3","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-21T13:39:15.421608-08:00","updated_at":"2025-12-21T13:39:15.421608-08:00","dependencies":[{"issue_id":"gt-rana.7","depends_on_id":"gt-rana","type":"parent-child","created_at":"2025-12-21T13:39:15.423245-08:00","created_by":"daemon"},{"issue_id":"gt-rana.7","depends_on_id":"gt-rana.6","type":"blocks","created_at":"2025-12-21T13:39:23.209512-08:00","created_by":"daemon"}]}
{"id":"gt-rdmw","title":"orphan-check","description":"Find abandoned work. Check for in_progress issues with no active agent.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-21T17:51:45.43733-08:00","updated_at":"2025-12-21T17:51:45.43733-08:00","dependencies":[{"issue_id":"gt-rdmw","depends_on_id":"gt-hbnz","type":"parent-child","created_at":"2025-12-21T17:51:45.440971-08:00","created_by":"stevey"},{"issue_id":"gt-rdmw","depends_on_id":"gt-ac5v","type":"blocks","created_at":"2025-12-21T17:51:45.441475-08:00","created_by":"stevey"}],"wisp":true}
{"id":"gt-rixa","title":"Bug: parseLifecycleRequest always matches 'cycle' due to LIFECYCLE prefix","description":"In lifecycle.go, parseLifecycleRequest checks strings.Contains(title, \"cycle\") first, but the prefix \"LIFECYCLE:\" contains the word \"cycle\". This means ALL lifecycle messages match the cycle action, making restart and shutdown unreachable. Fix: check for restart/shutdown before cycle, or use word boundaries.","status":"open","priority":2,"issue_type":"bug","created_at":"2025-12-19T16:17:16.083512-08:00","updated_at":"2025-12-21T17:20:42.83084-08:00"}
{"id":"gt-rm3","title":"CLI: gt refinery commands (start, stop, status, queue)","description":"CLI commands for managing the Refinery agent.\n\n## Commands\n\n```bash\ngt refinery start \u003crig\u003e # Start refinery for a rig\ngt refinery stop \u003crig\u003e # Stop refinery\ngt refinery status \u003crig\u003e # Show refinery status\ngt refinery queue \u003crig\u003e # Show merge queue\n```\n\n## gt refinery start\n\nStarts the Refinery daemon for the specified rig.\n\nOptions:\n- --foreground: Run in foreground (default: background)\n- --auto-merge: Enable auto-merge (default: from config)\n\n## gt refinery stop\n\nStops a running Refinery. Gracefully finishes current MR if processing.\n\n## gt refinery status\n\nShows:\n- Running state (running/stopped)\n- Current MR being processed (if any)\n- Queue length\n- Last merge time\n- Recent activity\n\n## gt refinery queue\n\nShows the merge queue:\n```\nMerge queue for 'wyvern':\n 1. [pending] Toast/polecat-auth-fix (15m ago)\n 2. [pending] Capable/polecat-new-feature (5m ago)\n \n1 merged today, 0 rejected\n```\n\n## Implementation\n\nUses gt-ov2 (Refinery agent) for daemon functionality.","status":"closed","priority":0,"issue_type":"task","created_at":"2025-12-15T23:22:24.754361-08:00","updated_at":"2025-12-16T14:16:34.593637-08:00","closed_at":"2025-12-16T14:16:34.593637-08:00","dependencies":[{"issue_id":"gt-rm3","depends_on_id":"gt-ov2","type":"blocks","created_at":"2025-12-15T23:22:30.679909-08:00","created_by":"daemon"}]}
{"id":"gt-rr1i","title":"mol-swarm-cleanup: Post-swarm debris cleanup molecule","description":"After a 20+ worker swarm completed, found significant beads debris:\n- 18 stale messages (work assignments, lifecycle requests, swarm instructions)\n- 3 completed issues still open/in_progress\n- Test messages accumulated\n\nNeed: Document a post-swarm checklist or create gt swarm cleanup command that:\n1. Closes stale work assignment messages\n2. Reviews in_progress issues for completion\n3. Closes orphaned lifecycle messages\n4. Optionally archives test messages","status":"open","priority":3,"issue_type":"chore","created_at":"2025-12-20T03:12:28.646175-08:00","updated_at":"2025-12-20T03:15:45.521085-08:00"}
{"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-s1eo","title":"plugin-run","description":"Execute plugins from ~/gt/plugins/. Check gates, run eligible plugins.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-21T17:51:45.437113-08:00","updated_at":"2025-12-21T17:51:45.437113-08:00","dependencies":[{"issue_id":"gt-s1eo","depends_on_id":"gt-hbnz","type":"parent-child","created_at":"2025-12-21T17:51:45.439961-08:00","created_by":"stevey"},{"issue_id":"gt-s1eo","depends_on_id":"gt-ac5v","type":"blocks","created_at":"2025-12-21T17:51:45.440466-08:00","created_by":"stevey"}],"wisp":true}
{"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-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"}
{"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"}
{"id":"gt-shnp","title":"Create Refinery role template","description":"Add Refinery template to internal/templates/roles/:\n- refinery.md.tmpl with full role context\n- Variables: rig name, working directory, handoff bead ID\n- Update SeedRoleTemplates to include it\n- gt prime uses this template for Refinery context","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-19T18:09:28.951284-08:00","updated_at":"2025-12-19T18:09:28.951284-08:00","dependencies":[{"issue_id":"gt-shnp","depends_on_id":"gt-ktal","type":"blocks","created_at":"2025-12-19T18:09:39.706849-08:00","created_by":"daemon"}]}
@@ -536,7 +554,7 @@
{"id":"gt-upom","title":"Witness patrol: cleanup idle orphan polecats","description":"Add patrol step to find and cleanup polecats that are idle with no assigned issue. These orphans occur when polecats crash before sending DONE or Witness misses the message. Patrol should verify git is clean before removing worktree. Part of gt-rana.","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-21T23:09:41.756753-08:00","updated_at":"2025-12-21T23:09:41.756753-08:00"}
{"id":"gt-us8","title":"Daemon: configurable heartbeat interval","description":"Heartbeat interval is hardcoded to 60s. Should be configurable via:\n- town.json config\n- Command line flag\n- Environment variable\n\nDefault 60s is reasonable but some deployments may want faster/slower.","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-18T13:38:14.282216-08:00","updated_at":"2025-12-18T13:38:14.282216-08:00","dependencies":[{"issue_id":"gt-us8","depends_on_id":"gt-99m","type":"blocks","created_at":"2025-12-18T13:38:26.704111-08:00","created_by":"daemon"}]}
{"id":"gt-usy0","title":"Merge: gt-3x0z.3","description":"branch: polecat/rictus\ntarget: main\nsource_issue: gt-3x0z.3\nrig: gastown","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-21T16:03:43.535266-08:00","updated_at":"2025-12-21T17:20:27.505696-08:00","closed_at":"2025-12-21T17:20:27.505696-08:00","close_reason":"ORPHANED: Branch never pushed, worktree deleted"}
{"id":"gt-uvog","title":"session-gc","description":"Clean dead sessions. Run gt gc --sessions.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-21T17:51:45.437524-08:00","updated_at":"2025-12-21T17:51:45.437524-08:00","dependencies":[{"issue_id":"gt-uvog","depends_on_id":"gt-hbnz","type":"parent-child","created_at":"2025-12-21T17:51:45.441973-08:00","created_by":"stevey"},{"issue_id":"gt-uvog","depends_on_id":"gt-rdmw","type":"blocks","created_at":"2025-12-21T17:51:45.442477-08:00","created_by":"stevey"}],"wisp":true}
{"id":"gt-uym5","title":"Implement gt mol status command","description":"Show what's on an agent's hook.\n\n```bash\ngt mol status [target]\n```\n\nOutput:\n- What's slung (molecule name, associated issue)\n- Current phase and progress\n- Whether it's a wisp\n- Next action hint\n\nIf no target, shows current agent's status.\n\nAcceptance:\n- [ ] Read pinned bead attachment\n- [ ] Display molecule/issue info\n- [ ] Show phase progress\n- [ ] Indicate wisp vs durable","status":"in_progress","priority":1,"issue_type":"task","assignee":"gastown/nux","created_at":"2025-12-22T03:17:34.679963-08:00","updated_at":"2025-12-22T12:12:57.452225-08:00"}
{"id":"gt-v2ed","title":"inbox-check","description":"Handle callbacks from agents. Check gt mail inbox, process lifecycle requests.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-21T17:51:45.436677-08:00","updated_at":"2025-12-21T17:51:45.436677-08:00","wisp":true}
{"id":"gt-v5hv","title":"Work on ga-y6b: Implement Refinery as Claude agent. Conve...","description":"Work on ga-y6b: Implement Refinery as Claude agent. Convert from shell to Claude agent that processes MRs in merge queue, runs tests, merges to integration branch. When done, submit MR (not PR) to integration branch for Refinery.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-19T22:58:17.576892-08:00","updated_at":"2025-12-19T23:23:22.778407-08:00","closed_at":"2025-12-19T23:23:22.778407-08:00"}
{"id":"gt-v5k","title":"Design: Failure modes and recovery","description":"Document failure modes and recovery strategies for Gas Town operations.\n\n## Critical Failure Modes\n\n### 1. Agent Crash Mid-Operation\n\n**Scenario**: Polecat crashes while committing, Witness crashes while verifying\n\n**Detection**:\n- Session suddenly gone (tmux check fails)\n- State shows 'working' but no session\n- Heartbeat stops (for Witness)\n\n**Recovery**:\n- Doctor detects via ZombieSessionCheck\n- Capture any recoverable state\n- Reset agent state to 'idle'\n- For Witness: auto-restart via supervisor or manual gt witness start\n\n### 2. Git State Corruption\n\n**Scenario**: Merge conflict, failed rebase, detached HEAD\n\n**Detection**:\n- Git commands fail\n- Dirty state that won't commit\n- Branch diverged from origin\n\n**Recovery**:\n- gt doctor reports git health issues\n- Manual intervention recommended\n- Severe cases: remove clone, re-clone\n\n### 3. Beads Sync Conflict\n\n**Scenario**: Two polecats modify same issue\n\n**Detection**:\n- bd sync fails with conflict\n- Beads tombstone mechanism handles most cases\n\n**Recovery**:\n- Beads has last-write-wins semantics\n- bd sync --force in extreme cases\n- Issues may need manual dedup\n\n### 4. Tmux Failure\n\n**Scenario**: Tmux server crashes, socket issues\n\n**Detection**:\n- All sessions inaccessible\n- \"no server running\" errors\n\n**Recovery**:\n- Kill any orphan processes\n- tmux kill-server \u0026\u0026 tmux start-server\n- All agent states reset to idle\n- Re-spawn active work\n\n### 5. Claude API Issues\n\n**Scenario**: Rate limits, outages, context limits\n\n**Detection**:\n- Sessions hang or produce errors\n- Repeated failure patterns\n\n**Recovery**:\n- Exponential backoff (handled by Claude Code)\n- For context limits: session cycling (mail-to-self)\n- For outages: wait and retry\n\n### 6. Disk Full\n\n**Scenario**: Clones, logs, or beads fill disk\n\n**Detection**:\n- Write operations fail\n- git/bd commands error\n\n**Recovery**:\n- Clean up logs: rm ~/.gastown/logs/*\n- Remove old polecat clones\n- gt doctor --fix can clean some cruft\n\n### 7. Network Failure\n\n**Scenario**: Can't reach GitHub, API servers\n\n**Detection**:\n- git fetch/push fails\n- Claude sessions hang\n\n**Recovery**:\n- Work continues locally\n- Queue pushes for later\n- Sync when connectivity restored\n\n## Recovery Principles\n\n1. **Fail safe**: Prefer stopping over corrupting\n2. **State is recoverable**: Git and beads have recovery mechanisms\n3. **Doctor heals**: gt doctor --fix handles common issues\n4. **Emergency stop**: gt stop --all as last resort\n5. **Human escalation**: Some failures need Overseer intervention\n\n## Implementation\n\n- Document each failure mode in architecture.md\n- Ensure doctor checks cover detection\n- Add recovery hints to error messages\n- Log all failures for debugging","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-15T23:19:07.198289-08:00","updated_at":"2025-12-15T23:19:28.171942-08:00"}
@@ -560,6 +578,7 @@
{"id":"gt-x2cx","title":"gt handoff: Deadlock bug in runHandoff","notes":"Running 'gt handoff' from a polecat causes a deadlock:\n\nStack trace shows:\n- goroutine 1 [select (no cases)] in runHandoff\n- File: internal/cmd/handoff.go:125\n\nThe command successfully sends the shutdown request but then hangs with 'fatal error: all goroutines are asleep - deadlock!'","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-20T08:01:33.827354-08:00","updated_at":"2025-12-20T08:47:47.599975-08:00","closed_at":"2025-12-20T08:47:47.599975-08:00"}
{"id":"gt-x7c","title":"Work assignment mail not received by polecat","description":"When gt spawn sends a work assignment:\n\n1. gt spawn says '✓ Work assignment sent'\n2. Polecat runs 'gt mail inbox' \n3. Shows '0 messages, 0 unread'\n\nThe work assignment mail never arrived at the polecat's inbox.\n\n## Observed in session\n- Spawned polecat dementus on gt-th7\n- Polecat checked inbox: empty\n- Polecat couldn't find issue (separate sync bug)\n\n## Possible causes\n- Mail routing issue for polecat addresses\n- gt spawn not actually sending mail\n- Mail sent to wrong address format","notes":"This was likely caused by stale beads in old polecats. With gt-9nf (fresh polecats), polecats now use shared rig beads via redirect file, eliminating sync issues. Mail routing uses town beads correctly.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-20T15:18:12.39878-08:00","updated_at":"2025-12-21T10:16:00.862028-08:00","closed_at":"2025-12-21T10:16:00.862028-08:00","close_reason":"Fixed by gt-9nf: fresh polecats use shared beads, mail routes correctly to town beads"}
{"id":"gt-x9m7","title":"Molecule converge: iterate until AI says done","description":"Work isn't 'done' until AI is confident it's done. Fixes the 85% problem.\n\n**From VC**: internal/iterative/converge.go - 3-7 iterations with AI convergence detection. ~600 lines.\nTarget: 20%+ more issues discovered. Observed: ~25% average improvement.\n\n**Gas Town implementation**: Molecule converge config:\n```yaml\nconverge:\n strategy: ai\n min_iterations: 3\n max_iterations: 7\n confidence: 0.85\n```\n\nPolecat iterates, AI checks convergence. Stop when AI is confident or max reached.\n\n**Value**: Raw agents get to ~85% and stop. Iteration catches the remaining 15%.\n\n**VC metrics**: Convergence rate \u003e70%, mean 4-5 iterations for complex work.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-20T20:30:18.671862-08:00","updated_at":"2025-12-20T20:30:18.671862-08:00","dependencies":[{"issue_id":"gt-x9m7","depends_on_id":"gt-zhpa","type":"parent-child","created_at":"2025-12-20T20:30:27.728971-08:00","created_by":"daemon"}]}
{"id":"gt-x9nf","title":"Digest: mol-deacon-patrol","description":"Old test patrol cycle - cleanup","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-22T02:07:15.850595-08:00","updated_at":"2025-12-22T02:07:15.850595-08:00","closed_at":"2025-12-22T02:07:15.850567-08:00","close_reason":"Squashed from 6 wisps","dependencies":[{"issue_id":"gt-x9nf","depends_on_id":"gt-hbnz","type":"parent-child","created_at":"2025-12-22T02:07:15.851081-08:00","created_by":"stevey"}]}
{"id":"gt-xicq","title":"Work on ga-lue: Implement Witness as Claude agent. Conver...","description":"Work on ga-lue: Implement Witness as Claude agent. Convert from shell script to Claude agent that monitors polecats, nudges idle ones, handles escalations. When done, submit MR (not PR) to integration branch for Refinery.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-19T22:58:08.310674-08:00","updated_at":"2025-12-19T23:24:36.692209-08:00","closed_at":"2025-12-19T23:24:36.692209-08:00"}
{"id":"gt-xkbm","title":"Merge: gt-g44u.1","description":"branch: polecat/Ace\ntarget: main\nsource_issue: gt-g44u.1\nrig: gastown","status":"closed","priority":0,"issue_type":"merge-request","created_at":"2025-12-19T16:04:14.367493-08:00","updated_at":"2025-12-19T17:35:38.210747-08:00","closed_at":"2025-12-19T17:35:38.210747-08:00"}
{"id":"gt-xnql","title":"Define constants for magic strings","description":"Several magic strings are hardcoded throughout the codebase:\n- \"mayor\" appears in 20+ places as a path component\n- \"main\" branch name appears in 20+ places\n- \"beads-sync\" branch name in multiple files\n- \"rigs.json\" filename\n\nThese should be constants in a central location for maintainability.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-21T21:34:46.620322-08:00","updated_at":"2025-12-21T22:13:07.292513-08:00","closed_at":"2025-12-21T22:13:07.292513-08:00","close_reason":"Created internal/constants/constants.go with centralized definitions for:\n- Directory names (mayor, polecats, crew, etc.)\n- File names (rigs.json, town.json, state.json)\n- Git branches (main, beads-sync)\n- Session names (gt-mayor, gt-deacon)\n- Agent roles\n\nUpdated key files (rig_helpers.go, daemon.go, status.go) to use the new constants package. Full migration of all usages (~100 files) can be done incrementally."}
@@ -577,6 +596,7 @@
{"id":"gt-ysfw","title":"self-review","description":"Review your own changes. Look for:\n- Bugs and edge cases\n- Style issues\n- Missing error handling\n- Security concerns\n\nFix any issues found before proceeding.\n\nDepends: implement","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-21T21:48:26.321856-08:00","updated_at":"2025-12-21T21:48:26.321856-08:00","dependencies":[{"issue_id":"gt-ysfw","depends_on_id":"gt-i4lo","type":"parent-child","created_at":"2025-12-21T21:48:26.325126-08:00","created_by":"stevey"},{"issue_id":"gt-ysfw","depends_on_id":"gt-vhby","type":"blocks","created_at":"2025-12-21T21:48:26.3257-08:00","created_by":"stevey"}],"wisp":true}
{"id":"gt-yx4","title":"Town root .beads has schema mismatch with bd","description":"The .beads directory at town root (/Users/stevey/gt/.beads) has an incompatible schema:\n\n```\nError: failed to open database: failed to initialize schema: sqlite3: SQL logic error: no such column: thread_id\n```\n\nMeanwhile, gastown/.beads (symlinked to mayor/rig/.beads) works fine.\n\n## Impact\n\n- gt mail inbox fails at town root\n- gt handoff sends mail to broken db\n- Daemon can't check its inbox\n\n## Options\n\n1. Delete town root .beads/beads.db and let it recreate\n2. Symlink town root .beads to gastown/.beads\n3. Run schema migration on existing db\n\n## Root Cause\n\nLikely a beads version upgrade that added thread_id column, but the town root db was created before that.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-18T14:31:35.559042-08:00","updated_at":"2025-12-19T00:39:32.211083-08:00","closed_at":"2025-12-19T00:39:32.211083-08:00"}
{"id":"gt-yzms","title":"Merge polecat/rictus: Add molecule phase lifecycle diagram","description":"Branch: polecat/rictus\n\nAdds molecule phase lifecycle diagram to architecture.md showing Proto → Mol/Wisp → Digest state transitions with the 'states of matter' metaphor. Also documents when to use Mol (durable) vs Wisp (ephemeral).\n\nCloses: gt-c6zs","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-21T16:41:58.139439-08:00","updated_at":"2025-12-21T17:20:27.50075-08:00","closed_at":"2025-12-21T17:20:27.50075-08:00","close_reason":"ORPHANED: Branch never pushed, worktree deleted"}
{"id":"gt-z3qf","title":"Overhaul gt mol to match bd mol chemistry interface","description":"## The Sling: Unified Work Dispatch\n\nThis issue tracks the overhaul of `gt molecule` to align with chemistry metaphor and introduce the **Universal Gas Town Propulsion Principle**.\n\n### The Propulsion Principle\n\n\u003e **If you find something on your hook, YOU RUN IT.**\n\nThis is the one rule that drives all Gas Town agents.\n\n### The Sling Operation\n\n`gt sling \u003cthing\u003e \u003ctarget\u003e [options]` - unified command for spawn + assign + pin.\n\nSee: `gastown/mayor/rig/docs/sling-design.md`\n\n### Implementation Tasks\n\n| Issue | Title | Priority |\n|-------|-------|----------|\n| gt-4ev4 | Implement gt sling command | P1 |\n| gt-uym5 | Implement gt mol status command | P1 |\n| gt-i4kq | Update templates for Propulsion Principle | P1 |\n| gt-7hor | Document the Propulsion Principle | P2 |\n\n### Command Changes\n\n| Old | New |\n|-----|-----|\n| `gt molecule instantiate` | `gt sling` |\n| `gt molecule attach` | `gt sling --force` |\n| `gt molecule detach` | `gt mol burn` |\n| `gt molecule progress` | `gt mol status` |\n| `gt molecule list` | `gt mol catalog` |\n| `gt spawn --molecule` | `gt sling` |\n\n### Acceptance Criteria\n\n- [ ] `gt sling` works for protos, issues, and epics\n- [ ] `gt mol status` shows hook state\n- [ ] Templates updated for propulsion principle\n- [ ] Old commands deprecated with warnings\n- [ ] Documentation complete","status":"open","priority":1,"issue_type":"feature","created_at":"2025-12-22T03:02:38.049324-08:00","updated_at":"2025-12-22T03:18:06.517742-08:00","dependencies":[{"issue_id":"gt-z3qf","depends_on_id":"gt-4ev4","type":"blocks","created_at":"2025-12-22T12:10:42.394653-08:00","created_by":"daemon"},{"issue_id":"gt-z3qf","depends_on_id":"gt-uym5","type":"blocks","created_at":"2025-12-22T12:10:42.46834-08:00","created_by":"daemon"},{"issue_id":"gt-z3qf","depends_on_id":"gt-i4kq","type":"blocks","created_at":"2025-12-22T12:10:42.541384-08:00","created_by":"daemon"},{"issue_id":"gt-z3qf","depends_on_id":"gt-7hor","type":"blocks","created_at":"2025-12-22T12:10:42.613099-08:00","created_by":"daemon"}]}
{"id":"gt-z4g","title":"Plugin: Plan-to-Epic converter","description":"## Purpose\n\nHelp users create beads epics from various planning inputs.\n\n## Inputs\n- Markdown task lists\n- GitHub issues\n- Linear/Jira exports\n- Free-form descriptions\n- Existing beads epics\n\n## Output\n- Beads epic with properly structured children\n- Dependencies set for wave ordering\n- Priorities assigned\n- Ready for `gt spawn --epic \u003cid\u003e`\n\n## Implementation Options\n\n### Option A: CLI Tool\n```bash\ngt plan import --from github --repo owner/repo --label batch-candidate\ngt plan import --from markdown tasks.md\ngt plan structure \u003cepic-id\u003e # analyze and add dependencies\n```\n\n### Option B: Plugin Agent\nA plugin at `\u003crig\u003e/plugins/plan-oracle/` that:\n- Receives planning requests via mail\n- Analyzes scope and requirements\n- Creates structured beads epic\n- Sets dependencies based on analysis\n\n### Option C: Interactive Mode\n```bash\ngt plan create\n# Walks through questions, creates epic interactively\n```\n\n## Axiom\n\nAs stated: 'The Planning phase should end in the creation of a workable Beads plan.'\n\nThis plugin bridges the gap between human planning and machine-executable work.\n\n## Priority\n\nP2 - Nice to have for MVP. Manual epic creation works for now.\n\n## Note\n\nNo \"swarm IDs\" - output is just a beads epic with children. Workers process it independently.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-16T02:10:20.663549-08:00","updated_at":"2025-12-16T17:26:41.087304-08:00"}
{"id":"gt-zayu","title":"Refinery tmux status: show merge queue length","description":"Add refinery-specific status line showing:\n- MQ length (pending merges)\n- Currently processing item (if any)\n- Maybe: success/failure counts\n\nImplement in runRefineryStatusLine() in internal/cmd/statusline.go","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-21T15:40:30.569547-08:00","updated_at":"2025-12-21T15:47:49.493735-08:00","closed_at":"2025-12-21T15:47:49.493735-08:00","close_reason":"Implemented status line functions for witness and refinery"}
{"id":"gt-zbx5","title":"Merge: gt-rana.2","description":"branch: polecat/nux\ntarget: main\nsource_issue: gt-rana.2\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-21T16:17:31.287004-08:00","updated_at":"2025-12-21T17:20:27.502817-08:00","closed_at":"2025-12-21T17:20:27.502817-08:00","close_reason":"ORPHANED: Branch never pushed, worktree deleted"}