diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index 68e62a93..5886e131 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -1,5 +1,6 @@ {"id":"gt-00cu","title":"mol-theme-generate: Custom name pool generation via cognition","description":"Currently polecat name themes are hardcoded in namepool.go. Simple theme selection is fine as static config, but custom name generation should be a molecule.\n\nExamples requiring cognition:\n- \"Generate 50 polecat names in the style of [book/movie/game]\"\n- \"Create names that match the project's domain (medical, financial, etc.)\"\n- \"Extend the mad-max theme with 20 more obscure characters\"\n\n## Molecule: theme-generate\nGenerate custom polecat names for a rig.\n\n## Step: analyze-request\nUnderstand the naming request:\n- Theme style or source material\n- Number of names needed\n- Any constraints (length, format)\n\n## Step: generate-candidates\nGenerate candidate names matching the style.\nAim for 2x the requested count.\n\n## Step: validate-names\nFilter candidates:\n- No duplicates with existing themes\n- Appropriate length (3-15 chars)\n- No problematic terms\n\n## Step: create-theme\nWrite the custom theme to rig config or beads.\nRegister in name pool.\nNeeds: validate-names\n\n## Notes\n- Output is a new theme entry in BuiltinThemes equivalent\n- Could be stored as a pinned bead for persistence","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-20T03:25:59.727107-08:00","updated_at":"2025-12-20T03:25:59.727107-08:00","dependencies":[{"issue_id":"gt-00cu","depends_on_id":"gt-3zw","type":"related","created_at":"2025-12-20T03:26:45.400818-08:00","created_by":"daemon"}]} {"id":"gt-00ur","title":"Merge: beads-2nh","description":"branch: fix/spawn-beads-path\ntarget: main\nsource_issue: beads-2nh\nrig: gastown","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-20T01:12:22.587758-08:00","updated_at":"2025-12-21T17:20:27.50754-08:00","closed_at":"2025-12-21T17:20:27.50754-08:00","close_reason":"ORPHANED: Branch never pushed, worktree deleted"} +{"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":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-16T02:10:18.32879-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-02or","title":"Digest: mol-deacon-patrol","description":"Patrol 10: Routine","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T22:37:21.062369-08:00","updated_at":"2025-12-24T22:37:21.062369-08:00","closed_at":"2025-12-24T22:37:21.062335-08:00","close_reason":"Squashed from 8 wisps"} {"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-05cx","title":"Merge: gt-h6eq.1","description":"branch: polecat/nux\ntarget: main\nsource_issue: gt-h6eq.1\nrig: gastown","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-23T11:44:11.942999-08:00","updated_at":"2025-12-23T12:22:23.446685-08:00","closed_at":"2025-12-23T12:22:23.446685-08:00","close_reason":"Merged to main in gt-h6eq swarm"} @@ -24,6 +25,8 @@ {"id":"gt-0nh8","title":"gt prime should detect mayor role from any rig's mayor/ folder","description":"Currently gt prime only detects the Mayor role when run from town root (~/gt). It should also detect Mayor when run from:\n- ~/gt/gastown/mayor/rig (rig's internal mayor dir)\n- Any path containing /mayor/ under a rig\n\nThis would allow the mayor session to work correctly regardless of which rig directory it's attached to.","status":"open","priority":2,"issue_type":"bug","created_at":"2025-12-20T21:56:10.281534-08:00","updated_at":"2025-12-20T21:56:10.281534-08:00"} {"id":"gt-0odbt","title":"Replace WaitForClaudeReady with gt peek for steady-state agent observation","description":"## Problem\n\nWaitForClaudeReady uses regex to detect Claude's prompt, which is a ZFC violation.\n\n## Architectural Fix\n\n**Bootstrap (ZFC violation acceptable):**\nDuring cold town startup, no AI is available. Regex to get Deacon online is acceptable.\n\n**Steady State (proper ZFC):**\nOnce any agent is running, AI should observe AI:\n- Deacon starting polecats → Deacon uses gt peek\n- Deacon restarting → Mayor watches via gt peek\n- Mayor restarting → Deacon watches via gt peek\n\n## Implementation\n\n1. Keep WaitForClaudeReady for daemon bootstrap only\n2. Update gt deacon trigger-pending to use gt peek\n3. Document bootstrap vs steady-state distinction\n","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-25T12:34:32.712726-08:00","updated_at":"2025-12-25T12:40:48.082699-08:00","closed_at":"2025-12-25T12:40:48.082699-08:00","close_reason":"Implemented gt deacon pending for ZFC-compliant AI observation. Added bootstrap vs steady-state documentation."} {"id":"gt-0ol","title":"Update prompts.md: Engineer role and templates","description":"Update docs/prompts.md with Engineer role:\n\n1. Role Prompts table: Change Refinery to Engineer\n2. Add Engineer-specific prompts:\n - Session restart request template\n - Subtask filing template\n - Handoff mail template\n3. Update refinery.md template name to engineer.md\n4. Ensure consistency with architecture.md","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-16T23:12:05.279233-08:00","updated_at":"2025-12-16T23:12:05.279233-08:00","dependencies":[{"issue_id":"gt-0ol","depends_on_id":"gt-h5n","type":"blocks","created_at":"2025-12-16T23:12:15.013747-08:00","created_by":"daemon"}]} +{"id":"gt-0pc","title":"Document Overseer role (human operator)","description":"Document the Overseer role in Gas Town architecture.\n\n## The Overseer\n\nThe **Overseer** is the human operator of Gas Town. Not an agent - a person.\n\n## Responsibilities\n\n| Area | Overseer Does | Mayor/Agents Do |\n|------|---------------|-----------------|\n| Strategy | Define project goals | Execute toward goals |\n| Priorities | Set priority order | Work in priority order |\n| Escalations | Final decision on stuck work | Escalate to Overseer |\n| Resources | Provision machines | Use allocated resources |\n| Quality | Review \u0026 approve swarm output | Produce output |\n| Operations | Run gt commands, monitor dashboards | Do the work |\n\n## Key Interactions\n\n### Overseer → Mayor\n- Start/stop Mayor sessions\n- Direct Mayor via conversation\n- Review Mayor recommendations\n- Approve cross-rig decisions\n\n### Mayor → Overseer (Escalations)\n- Stuck workers after retries\n- Resource decisions (add machines, polecats)\n- Ambiguous requirements\n- Architecture decisions\n\n## Operating Cadence\n\nTypical Overseer workflow:\n1. Morning: Check status, review overnight work\n2. During day: Monitor, respond to escalations, adjust priorities\n3. End of day: Review progress, plan next batch\n\n## Commands for Overseers\n\n```bash\ngt status # Quick health check\ngt doctor # Detailed diagnostics \ngt doctor --fix # Auto-repair issues\ngt inbox # Messages from agents\ngt stop --all # Emergency halt\n```\n\n## Documentation Updates\n\nAdd to docs/architecture.md:\n- Overseer section under Agent Roles\n- Clarify Mayor reports to Overseer\n- Add Overseer to workflow diagrams","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-15T23:18:03.177633-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-0pl","title":"Polecat CLAUDE.md: configure auto-approve for bd and gt commands","description":"Polecats get stuck waiting for bash command approval when running\nbd and gt commands. Need to configure Claude Code to auto-approve these.\n\nOptions:\n1. Add allowedTools to polecat CLAUDE.md\n2. Configure .claude/settings.json in polecat directory\n3. Use --dangerously-skip-permissions flag (not recommended)\n\nShould auto-approve:\n- bd (beads commands)\n- gt (gastown commands)\n- go build/test\n- git status/add/commit/push\n\nShould still require approval:\n- rm -rf\n- Arbitrary commands outside project\n\nRelated to polecat prompting (gt-e1y, gt-sd6).","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-17T14:10:27.611612-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-0qki","title":"Refinery-Witness communication protocol","description":"Define mail protocol between Refinery and Witness:\n\nFROM Witness → Refinery:\n- 'Polecat ready': polecat X completed work, ready for merge\n- 'Rework complete': polecat Y finished requested rework\n\nFROM Refinery → Witness:\n- 'Merge success': polecat X merged, can be cleaned up\n- 'Merge failed': polecat X needs rework on \u003creason\u003e\n- 'Rework request': please have a polecat rebase X on current main\n\nImplement as structured mail with parseable format.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-19T18:09:27.451344-08:00","updated_at":"2025-12-19T18:09:27.451344-08:00","dependencies":[{"issue_id":"gt-0qki","depends_on_id":"gt-ktal","type":"blocks","created_at":"2025-12-19T18:09:39.58445-08:00","created_by":"daemon"}]} {"id":"gt-0s99","title":"submit-merge","description":"Submit to merge queue. Create branch if needed.\nVerify CI passes.\n\ngt done # Signal work ready for merge queue\n\nIf there are CI failures, fix them before proceeding.\n\nDepends: rebase-main","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-21T21:48:26.322452-08:00","updated_at":"2025-12-21T21:48:26.322452-08:00","dependencies":[{"issue_id":"gt-0s99","depends_on_id":"gt-i4lo","type":"parent-child","created_at":"2025-12-21T21:48:26.329069-08:00","created_by":"stevey"},{"issue_id":"gt-0s99","depends_on_id":"gt-bf95","type":"blocks","created_at":"2025-12-21T21:48:26.329601-08:00","created_by":"stevey"}]} {"id":"gt-0sf2","title":"Add gt rig rename command","description":"Allow renaming a rig after creation. Similar to gt crew rename, this should:\n\n- Update the directory name\n- Update mayor/rigs.json entry\n- Update the rig's config.json\n- Handle running agents gracefully (require shutdown first or --force)\n\nUse case: User creates a rig, later wants to change its name for better organization.","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-23T04:46:41.988492-08:00","updated_at":"2025-12-23T04:46:41.988492-08:00"} @@ -48,6 +51,7 @@ {"id":"gt-1f01","title":"Digest: mol-deacon-patrol","description":"Patrol 8: OK","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T20:58:26.967654-08:00","updated_at":"2025-12-24T20:58:26.967654-08:00","closed_at":"2025-12-24T20:58:26.967617-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-1fl","title":"gt crew restart command","description":"Add a 'gt crew restart' command that kills the tmux session and restarts fresh. Useful when a crew member gets confused or needs a clean slate.\n\nShould:\n- Kill existing tmux session if running\n- Start fresh session with claude\n- Run gt prime to reinitialize context\n\nAlias: gt crew rs","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-17T19:47:32.131386-08:00","updated_at":"2025-12-19T12:07:06.762207-08:00","closed_at":"2025-12-19T12:07:06.762207-08:00"} {"id":"gt-1gbf","title":"Digest: mol-deacon-patrol","description":"Patrol #5: Routine - 6 sessions healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T22:22:06.354723-08:00","updated_at":"2025-12-24T22:22:06.354723-08:00","closed_at":"2025-12-24T22:22:06.354692-08:00","close_reason":"Squashed from 8 wisps"} +{"id":"gt-1gy","title":"gt mail read: Support numeric indices for message ID","description":"Allow 'gt mail read 1' to read the first message in inbox.\n\nCurrent behavior requires full message ID like 'msg-abc123'.\nShould support:\n- Numeric index: 'gt mail read 1' reads first/newest message\n- Partial ID match: 'gt mail read abc' matches 'msg-abc123'\n\nThis is a UX improvement - agents frequently type 'gt mail read 1'.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-17T21:49:54.60582-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-1gy","depends_on_id":"gt-hw6","type":"blocks","created_at":"2025-12-17T22:22:47.658947-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-1i8r","title":"Digest: mol-deacon-patrol","description":"Patrol 1: All healthy - Mayor OK, 2 witnesses, 2 refineries, 0 polecats, 8 sessions, no callbacks","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T23:44:43.300311-08:00","updated_at":"2025-12-24T23:44:43.300311-08:00","closed_at":"2025-12-24T23:44:43.30028-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-1iwk","title":"Test Patrol for Bonding","description":"Parent issue for mol bond CLI test","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T00:20:50.772007-08:00","updated_at":"2025-12-25T01:33:00.763525-08:00","closed_at":"2025-12-25T01:33:00.763525-08:00","close_reason":"Test pollution cleanup"} {"id":"gt-1iwk.1","title":"Polecat Arm (arm-toast)","description":"Single polecat inspection and action cycle.\n\nThis molecule is bonded dynamically by mol-witness-patrol's survey-workers step.\nEach polecat being monitored gets one arm that runs in parallel with other arms.\n\n## Variables\n\n| Variable | Required | Description |\n|----------|----------|-------------|\n| polecat_name | Yes | Name of the polecat to inspect |\n| rig | Yes | Rig containing the polecat |\n\n## Step: capture\nCapture recent tmux output for toast.\n\n```bash\ntmux capture-pane -t gt-gastown-toast -p | tail -50\n```\n\nRecord:\n- Last activity timestamp (when was last tool call?)\n- Visible errors or stack traces\n- Completion indicators (\"Done\", \"Finished\", etc.)\n\n## Step: assess\nCategorize polecat state based on captured output.\n\nStates:\n- **working**: Recent tool calls, active processing\n- **idle**: At prompt, no recent activity\n- **error**: Showing errors or stack traces\n- **requesting_shutdown**: Sent LIFECYCLE/Shutdown mail\n- **done**: Showing completion indicators\n\nCalculate: minutes since last activity.\nNeeds: capture\n\n## Step: load-history\nRead nudge history for toast from patrol state.\n\n```\nnudge_count = state.nudges[toast].count\nlast_nudge_time = state.nudges[toast].timestamp\n```\n\nThis data was loaded by the parent patrol's load-state step and passed\nto the arm via the bonding context.\nNeeds: assess\n\n## Step: decide\nApply the nudge matrix to determine action for toast.\n\n| State | Idle Time | Nudge Count | Action |\n|-------|-----------|-------------|--------|\n| working | any | any | none |\n| idle | \u003c10min | any | none |\n| idle | 10-15min | 0 | nudge-1 (gentle) |\n| idle | 15-20min | 1 | nudge-2 (direct) |\n| idle | 20+min | 2 | nudge-3 (final) |\n| idle | any | 3 | escalate |\n| error | any | any | assess-severity |\n| requesting_shutdown | any | any | pre-kill-verify |\n| done | any | any | pre-kill-verify |\n\nNudge text:\n1. \"How's progress? Need any help?\"\n2. \"Please wrap up soon. What's blocking you?\"\n3. \"Final check. Will escalate in 5 min if no response.\"\n\nRecord decision and rationale.\nNeeds: load-history\n\n## Step: execute\nTake the decided action for toast.\n\n**nudge-N**:\n```bash\ntmux send-keys -t gt-gastown-toast \"{{nudge_text}}\" Enter\n```\n\n**pre-kill-verify**:\n```bash\ncd polecats/toast\ngit status # Must be clean\ngit log origin/main..HEAD # Check for unpushed\nbd show \u003cassigned-issue\u003e # Verify closed/deferred\n```\nIf clean: kill session, remove worktree, delete branch\nIf dirty: record failure, retry next cycle\n\n**escalate**:\n```bash\ngt mail send mayor/ -s \"Escalation: toast stuck\" -m \"...\"\n```\n\n**none**: No action needed.\n\nRecord: action taken, result, updated nudge count.\nNeeds: decide\n\n## Output\n\nThe arm completes with:\n- action_taken: none | nudge-1 | nudge-2 | nudge-3 | killed | escalated\n- result: success | failed | pending\n- updated_state: New nudge count and timestamp for toast\n\nThis data feeds back to the parent patrol's aggregate step.\n---\nbonded_from: mol-polecat-arm\nbonded_to: gt-1iwk\nbonded_ref: arm-toast\nbonded_at: 2025-12-23T10:00:00Z\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T00:20:50.854609-08:00","updated_at":"2025-12-24T00:20:51.018152-08:00","closed_at":"2025-12-24T00:20:51.018152-08:00","close_reason":"Closed","dependencies":[{"issue_id":"gt-1iwk.1","depends_on_id":"gt-1iwk","type":"parent-child","created_at":"2025-12-24T00:20:50.855058-08:00","created_by":"daemon"}]} @@ -57,6 +61,7 @@ {"id":"gt-1l7h","title":"Digest: mol-deacon-patrol @ 2025-12-24 19:47","description":"Patrol 16: All healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T19:47:28.476069-08:00","updated_at":"2025-12-24T19:47:28.476069-08:00","closed_at":"2025-12-24T19:47:28.47598-08:00","close_reason":"Squashed from wisp gt-u80 (9 issues)"} {"id":"gt-1le","title":"town handoff command (optional)","description":"CLI commands for session handoff workflow (optional convenience).\n\n## Commands\n\n### gt handoff\nGenerate handoff interactively.\n```\ngt handoff [--send]\n```\n- Collects current state (status, inbox, beads)\n- Prompts for additional notes\n- --send: Mail to self and exit\n\n### gt resume\nCheck for and display pending handoff.\n```\ngt resume\n```\n- Checks inbox for handoff message\n- Displays formatted handoff if found\n- Suggests next actions\n\n## Implementation\n\nThese are convenience wrappers. The same workflow can be done manually:\n```bash\n# Manual handoff\ntown status \u003e /tmp/handoff\ntown inbox \u003e\u003e /tmp/handoff\nbd ready \u003e\u003e /tmp/handoff\n# Edit and send\ntown mail send mayor/ -s \"Session Handoff\" -f /tmp/handoff\n```\n\n## Priority\n\nP2 - Optional. Manual workflow works fine. Nice to have for UX.\n\n## Notes\n\nPart of session cycling workflow designed in [deleted:gt-u82].","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-15T20:15:31.954724-08:00","updated_at":"2025-12-25T01:30:41.735893-08:00","dependencies":[{"issue_id":"gt-1le","depends_on_id":"gt-u82","type":"blocks","created_at":"2025-12-15T20:15:39.647043-08:00","created_by":"daemon"}]} {"id":"gt-1qti","title":"Mayor restart loop: auto-prime and mail check on attach","description":"When mayor session cycles (after /exit, gt mayor attach reconnects), the new session lacks context.\n\n## Current Behavior\n- Mayor exits, shell script loop restarts claude\n- New session starts cold - no gt prime, no mail check\n- Mayor is disoriented, doesn't know prior context\n- Strong 'antimemetic properties' - we discuss fixing it, then forget\n\n## Expected Behavior\nAfter restart, mayor should automatically:\n1. Run gt prime (load role context)\n2. Check gt mail inbox (find handoff messages)\n3. Look for 🤝 HANDOFF messages from predecessor\n\n## Possible Fixes\n1. Startup hook in Claude Code settings that runs gt prime\n2. CLAUDE.md instructions that say 'FIRST THING: run gt prime'\n3. Shell script wrapper that injects context before attach\n4. Modify gt mayor attach to inject prime command\n\n## Related\n- gt-vci: Mayor handoff mail template\n- gt-sye: Mayor startup protocol prompting","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-19T14:44:43.188588-08:00","updated_at":"2025-12-19T17:22:52.550264-08:00","closed_at":"2025-12-19T16:03:20.714077-08:00"} +{"id":"gt-1su","title":"Spawn inject: Enter not submitted after multiline paste","description":"When gt spawn injects a multiline context (85+ lines), Claude Code shows \n'[Pasted text #1 +85 lines]' but the prompt is not submitted.\n\nThe tmux SendKeys function does include 'Enter' but it appears to not work\nfor long pasted text:\n\n```go\nfunc (t *Tmux) SendKeys(session, keys string) error {\n _, err := t.run(\"send-keys\", \"-t\", session, keys, \"Enter\")\n return err\n}\n```\n\nPossible fixes:\n1. Use tmux paste-buffer instead of send-keys for long text\n2. Send Enter separately after the text\n3. Use bracketed paste mode correctly\n\nReproduction:\n```bash\ngt spawn gastown/Nux --issue gt-u1j.13 --create\n# Session shows pasted text but waits at prompt\n```","status":"tombstone","priority":1,"issue_type":"bug","created_at":"2025-12-17T14:09:20.774203-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} {"id":"gt-1tqy","title":"Digest: mol-deacon-patrol","description":"Patrol 15","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T23:10:24.121681-08:00","updated_at":"2025-12-24T23:10:24.121681-08:00","closed_at":"2025-12-24T23:10:24.121649-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-1u9","title":"Interactive prompts for destructive operations","description":"Add interactive confirmations for destructive operations.\n\n## Operations Needing Confirmation\n- `gt swarm cancel` - Cancels active swarm\n- `gt swarm land --force` - Force landing\n- `gt polecat decommission` - Removes polecat\n- `gt rig remove` - Removes rig\n- `gt stop --all` - Stops all sessions\n- `gt mail purge` - Permanently deletes mail\n\n## Implementation Options\n\n### Option 1: promptui library\n```go\nimport \"github.com/manifoldco/promptui\"\n\nprompt := promptui.Prompt{\n Label: \"Delete polecat Toast\",\n IsConfirm: true,\n}\nresult, err := prompt.Run()\n```\n\n### Option 2: Simple stdin\n```go\nfunc confirm(prompt string) bool {\n fmt.Printf(\"%s [y/N]: \", prompt)\n var response string\n fmt.Scanln(\u0026response)\n return strings.ToLower(response) == \"y\"\n}\n```\n\n## Bypass Flags\nAll confirmations skippable with --force or --yes:\n```go\nif !force \u0026\u0026 !confirm(\"Really cancel swarm?\") {\n return nil\n}\n```\n\n## Acceptance Criteria\n- [ ] Destructive ops prompt by default\n- [ ] --force or --yes bypasses\n- [ ] Clear prompt text explaining action\n- [ ] Non-interactive mode (piped input) auto-fails","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-16T14:48:51.551594-08:00","updated_at":"2025-12-16T16:06:54.283696-08:00"} {"id":"gt-1wmw","title":"E2E Test: Verify mol-polecat-work spawn","description":"Simple test task for Phase 5 E2E validation","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-24T22:53:38.996878-08:00","updated_at":"2025-12-24T22:56:09.701942-08:00","closed_at":"2025-12-24T22:56:09.701942-08:00","close_reason":"Test issues - cleaned up"} @@ -74,16 +79,25 @@ {"id":"gt-272b","title":"Work on gt-role-template: Refine witness/CLAUDE.md role t...","description":"Work on gt-role-template: Refine witness/CLAUDE.md role template. Run 'bd show gt-role-template' to see the full issue.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-20T07:44:10.203384-08:00","updated_at":"2025-12-20T07:46:55.666605-08:00","closed_at":"2025-12-20T07:46:55.666605-08:00"} {"id":"gt-29k50","title":"Digest: mol-deacon-patrol","description":"Patrol 17: All agents healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T05:01:26.919989-08:00","updated_at":"2025-12-25T05:01:26.919989-08:00","closed_at":"2025-12-25T05:01:26.919958-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-2b9b","title":"Digest: mol-deacon-patrol","description":"Patrol 19","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T23:11:19.536607-08:00","updated_at":"2025-12-24T23:11:19.536607-08:00","closed_at":"2025-12-24T23:11:19.53657-08:00","close_reason":"Squashed from 8 wisps"} +{"id":"gt-2bz","title":"Swarm learning: Refinery merge queue automation","description":"Manually merging 15 polecat branches was painful and error-prone. Refinery should automate: detect completed work, run tests, merge to main, handle conflicts. This is core Refinery value prop.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-16T01:21:51.137974-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-2c1","title":"Swarm learning: Spawn should auto-notify polecats","description":"town spawn assigns issues but doesn't notify polecats. Required separate 'town session send' to inject prompts. This should be one atomic operation - spawn assigns AND pokes the polecat to start working.","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-16T01:21:47.223608-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-2cd7","title":"Self-test","description":"Testing gt mail works","status":"closed","priority":2,"issue_type":"message","created_at":"2025-12-20T17:55:31.928025-08:00","updated_at":"2025-12-20T17:55:37.483125-08:00","closed_at":"2025-12-20T17:55:37.483125-08:00","labels":["from:gastown-crew-max","thread:thread-3a0ea7a99fce"]} {"id":"gt-2dpg","title":"Digest: mol-deacon-patrol","description":"Patrol #8: Stable","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T23:32:34.26298-08:00","updated_at":"2025-12-24T23:32:34.26298-08:00","closed_at":"2025-12-24T23:32:34.262948-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-2ebi","title":"Merge: gt-4ev4","description":"branch: polecat/furiosa\ntarget: main\nsource_issue: gt-4ev4\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-22T12:36:57.533878-08:00","updated_at":"2025-12-22T16:01:13.496679-08:00","closed_at":"2025-12-22T16:01:13.496679-08:00","close_reason":"Merged to main"} {"id":"gt-2f3h","title":"Digest: mol-deacon-patrol","description":"Patrol #20: Stable, handoff threshold reached","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T23:35:50.776172-08:00","updated_at":"2025-12-24T23:35:50.776172-08:00","closed_at":"2025-12-24T23:35:50.776141-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-2jl","title":"Add bulk polecat remove command (gt polecat remove --all)","description":"When decommissioning a rig, need to remove multiple polecats one at a time. A --all or --rig flag would allow: gt polecat remove --rig gastown --force","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-12-18T11:33:35.206637-08:00","updated_at":"2025-12-18T11:38:53.829321-08:00","closed_at":"2025-12-18T11:38:53.829321-08:00"} +{"id":"gt-2k4f","title":"mol-polecat-lease","description":"Semaphore tracking a single polecat's lifecycle.\nVars: {{polecat}}, {{issue}}\n\nUsed by Witness to track polecat lifecycle during patrol. The Witness bonds\nthis proto for each active polecat, creating a lease that tracks the polecat\nfrom spawn through work to cleanup.\n\n## Step: boot\nSpawned. Verify it starts working.\n\nCheck if the polecat is alive and working:\n```bash\ngt peek {{polecat}}\n```\n\nIf idle for too long, nudge:\n```bash\ngt nudge {{polecat}} \"Please start working on your assigned issue.\"\n```\n\nTimeout: 60s before escalation to Mayor.\n\n## Step: working\nActively working. Monitor for stuck.\n\nThe polecat is processing its assigned issue ({{issue}}).\nMonitor via peek. Watch for:\n- Progress on commits\n- Status updates in beads\n- SHUTDOWN mail when done\n\nWait for SHUTDOWN signal from the polecat.\nNeeds: boot\n\n## Step: done\nExit received. Ready for cleanup.\n\nThe polecat has completed its work and sent SHUTDOWN.\nPerform cleanup:\n```bash\ngt session kill {{polecat}}\ngt worktree prune {{polecat}}\n```\n\nUpdate beads state and close the lease.\nNeeds: working","status":"tombstone","priority":2,"issue_type":"epic","created_at":"2025-12-22T23:41:25.342615-08:00","updated_at":"2025-12-25T11:45:02.114796-08:00","labels":["template"],"deleted_at":"2025-12-25T11:45:02.114796-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"epic"} +{"id":"gt-2k4f.1","title":"boot","description":"Spawned. Verify the polecat starts working.\n\nCheck if the polecat is alive and working:\n```bash\ngt peek {{polecat}}\n```\n\nIf idle for too long (\u003e60s), nudge:\n```bash\ngt nudge {{polecat}} \"Please start working on your assigned issue.\"\n```\n\nTimeout: 60s before escalation to Mayor.\nVariables: {{polecat}}, {{issue}}","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-22T23:43:41.517464-08:00","updated_at":"2025-12-25T11:45:02.114796-08:00","dependencies":[{"issue_id":"gt-2k4f.1","depends_on_id":"gt-2k4f","type":"parent-child","created_at":"2025-12-22T23:43:41.517901-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T11:45:02.114796-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-2k4f.2","title":"working","description":"Actively working. Monitor for stuck.\n\nThe polecat is processing its assigned issue ({{issue}}).\nMonitor via peek. Watch for:\n- Progress on commits\n- Status updates in beads\n- SHUTDOWN mail when done\n\nWait for SHUTDOWN signal from the polecat.\nVariables: {{polecat}}, {{issue}}","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-22T23:43:42.77616-08:00","updated_at":"2025-12-25T11:45:02.114796-08:00","dependencies":[{"issue_id":"gt-2k4f.2","depends_on_id":"gt-2k4f","type":"parent-child","created_at":"2025-12-22T23:43:42.778213-08:00","created_by":"daemon"},{"issue_id":"gt-2k4f.2","depends_on_id":"gt-2k4f.1","type":"blocks","created_at":"2025-12-22T23:43:55.78046-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T11:45:02.114796-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-2k4f.3","title":"done","description":"Exit received. Ready for cleanup.\n\nThe polecat has completed its work and sent SHUTDOWN.\nPerform cleanup:\n```bash\ngt session kill {{polecat}}\ngt worktree prune {{polecat}}\n```\n\nUpdate beads state and close the lease.\nVariables: {{polecat}}, {{issue}}","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-22T23:43:44.676322-08:00","updated_at":"2025-12-25T11:45:02.114796-08:00","dependencies":[{"issue_id":"gt-2k4f.3","depends_on_id":"gt-2k4f","type":"parent-child","created_at":"2025-12-22T23:43:44.676783-08:00","created_by":"daemon"},{"issue_id":"gt-2k4f.3","depends_on_id":"gt-2k4f.2","type":"blocks","created_at":"2025-12-22T23:43:55.898358-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T11:45:02.114796-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-2kz","title":"CLI: cleanup commands for stale state","description":"Cleanup commands for recovering from stale state.\n\n## Commands\n\n### gt cleanup \u003cpolecat\u003e\nClean stale state for specific polecat.\n```\ngt cleanup \u003crig\u003e/\u003cpolecat\u003e [--dry-run]\n```\n\nActions:\n- Remove orphaned state.json if clone missing\n- Clear stale session references\n- Reset stuck state (working → idle after timeout)\n\n### gt cleanup --all\nClean all polecats in workspace.\n```\ngt cleanup --all [--dry-run]\n```\n\n## Implementation\n```go\nfunc CleanupPolecat(rigName, polecatName string, dryRun bool) (*CleanupResult, error)\n\ntype CleanupResult struct {\n OrphanedStateRemoved bool\n SessionsCleared int\n StateReset bool\n Warnings []string\n}\n```\n\n## Overlap with Doctor\n- Doctor diagnoses and offers --fix\n- Cleanup is more aggressive state recovery\n- Consider merging into doctor --fix\n\n## New File\ninternal/cmd/cleanup.go\n\n## Acceptance Criteria\n- [ ] Removes orphaned state files\n- [ ] Clears stale session refs\n- [ ] --dry-run shows what would happen\n- [ ] Reports all actions taken","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-16T14:48:31.944982-08:00","updated_at":"2025-12-16T16:07:12.430696-08:00"} {"id":"gt-2n3f","title":"Merge conflicts: Buzzard/mq-status, Dementus/harness-docs","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T12:08:07.486349-08:00","updated_at":"2025-12-19T14:28:14.462028-08:00","closed_at":"2025-12-19T14:28:14.462028-08:00"} {"id":"gt-2n6z","title":"Inconsistent error wrapping patterns","description":"Error handling is inconsistent across the codebase:\n\n1. Some functions use fmt.Errorf with %w for wrapping, others don't\n2. return nil, nil patterns (40+ occurrences) sometimes represent 'not found' and sometimes 'error but continue' - should use sentinel errors\n3. Some places return nil for errors when they should propagate them\n\nExamples of nil,nil that might need review:\n- internal/git/git.go:272, 308\n- internal/crew/manager.go:227\n- internal/witness/manager.go:517, 523, 530, 775\n- internal/beads/beads.go:225, 492","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-21T21:35:25.451396-08:00","updated_at":"2025-12-21T22:19:27.618156-08:00","closed_at":"2025-12-21T22:19:27.618156-08:00","close_reason":"Deferred to post-launch. The patterns work correctly for current functionality:\n- nil,nil returns are idiomatic Go for 'not found' cases\n- Error wrapping inconsistency is cosmetic, not functional\n- Would require significant refactoring to standardize\n\nTagged for v0.2 cleanup. Consider defining sentinel errors (ErrNotFound, etc.) for clearer semantics."} +{"id":"gt-2p2","title":"Test message","description":"Testing GGT mail integration","status":"tombstone","priority":2,"issue_type":"message","created_at":"2025-12-17T14:04:50.045948-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"message"} {"id":"gt-2qnj","title":"Digest: mol-deacon-patrol","description":"Patrol 17","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T23:10:56.381997-08:00","updated_at":"2025-12-24T23:10:56.381997-08:00","closed_at":"2025-12-24T23:10:56.38197-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-2sw","title":"Plugin surface for daemon lifecycle hooks","description":"Allow rigs to customize daemon behavior via hooks/plugins.\n\n## Hook Points\n\n- on_heartbeat: Called during daemon heartbeat cycle\n- on_worker_idle: Called when worker goes idle\n- on_worker_stuck: Called when stuck detection triggers\n- on_lifecycle_request: Called before processing lifecycle\n\n## Configuration\n\n```\n\u003crig\u003e/config/daemon-hooks.json\n{\n \"on_heartbeat\": \"./hooks/check-ci-status.sh\",\n \"on_worker_idle\": \"./hooks/maybe-assign-work.sh\",\n \"idle_threshold\": \"5m\",\n \"custom_signals\": [\n {\"name\": \"ci_status\", \"command\": \"./hooks/get-ci.sh\"}\n ]\n}\n```\n\n## Signal Contribution\n\nHooks can return signals that feed into decision engine:\n- SKIP_POKE: Don't poke this agent\n- FORCE_POKE: Override backoff, poke now\n- CUSTOM_DATA: Extra context for logging\n\n## Use Cases\n\n- Check CI status before interrupting test runs\n- Auto-assign work when worker becomes idle\n- Custom stuck detection for specific workflows","status":"open","priority":3,"issue_type":"feature","created_at":"2025-12-18T14:19:34.702624-08:00","updated_at":"2025-12-18T14:19:34.702624-08:00","dependencies":[{"issue_id":"gt-2sw","depends_on_id":"gt-99m","type":"blocks","created_at":"2025-12-18T14:19:47.035848-08:00","created_by":"daemon"}]} +{"id":"gt-2tp","title":"init.go: Replace custom contains() with strings.Contains","status":"tombstone","priority":3,"issue_type":"bug","created_at":"2025-12-16T13:55:11.326407-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} +{"id":"gt-2ux","title":"gt uninstall: Clean removal of Gas Town harness","description":"Add 'gt uninstall' command to cleanly remove a Gas Town installation.\n\nShould:\n- Remove harness directory structure\n- Optionally preserve rigs/data with --keep-data flag\n- Warn about running sessions\n- Clean up any global config references","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-17T21:47:16.175246-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-2ux","depends_on_id":"gt-hw6","type":"blocks","created_at":"2025-12-17T22:22:47.419553-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-2x8ch","title":"Digest: mol-deacon-patrol","description":"Patrol 14: routine","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T13:45:00.922407-08:00","updated_at":"2025-12-25T13:45:00.922407-08:00","closed_at":"2025-12-25T13:45:00.922369-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-2x8ch","depends_on_id":"gt-2llw3","type":"parent-child","created_at":"2025-12-25T13:45:00.923141-08:00","created_by":"stevey"}]} {"id":"gt-2xiv","title":"gt mail inbox doesn't find crew worker mail - identity mismatch","description":"## Problem\n\nCrew workers don't see their handoff messages when running `gt mail inbox` from their working directory.\n\n## Root Cause\n\ngt derives identity from cwd path, but crew workers have a different path structure:\n- **cwd**: `/Users/stevey/gt/beads/crew/dave`\n- **gt derives**: `beads/crew/dave` (wrong)\n- **should be**: `beads/dave` (crew workers use `rig/name` format)\n\nMessages sent to `beads/dave` don't show up because gt is looking for `beads/crew/dave`.\n\n## Workaround\n\nUse explicit identity flag:\n```bash\ngt mail inbox --identity \"beads/dave\"\n```\n\n## Fix\n\nIdentity detection in gt should handle crew/ subdirectory:\n- Path `\u003crig\u003e/crew/\u003cname\u003e` should derive identity as `\u003crig\u003e/\u003cname\u003e`\n- This matches how polecats work: `\u003crig\u003e/polecats/\u003cname\u003e` → `\u003crig\u003e/\u003cname\u003e`\n\n## Affected\n\nAll crew workers in all rigs.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-12-22T00:34:02.290132-08:00","updated_at":"2025-12-22T00:39:32.499063-08:00","closed_at":"2025-12-22T00:39:32.499063-08:00","close_reason":"Fixed by normalizing crew/ and polecats/ to canonical form in addressToIdentity()"} {"id":"gt-2xsh","title":"Silent error handling with _ = err patterns","description":"Multiple locations intentionally ignore errors with comments like 'Ignore errors'. While some are valid (best-effort operations), others should be audited:\n\n- witness/manager.go:542 - Ignores cmd.Run() error\n- refinery/manager.go:411, 438, 509 - Ignores loadState and git pull errors\n- swarm/manager.go:47 - Ignores getGitHead error\n- polecat/manager.go:69, 284 - Ignores pool.Load and DeleteBranch errors\n- swarm/integration.go:101, 137 - Ignores git pull and push errors\n\nEach should be evaluated: log it, handle it, or confirm ignoring is intentional.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-21T21:35:11.239439-08:00","updated_at":"2025-12-21T22:19:09.113803-08:00","closed_at":"2025-12-21T22:19:09.113803-08:00","close_reason":"Audited all 10 '_ = err' patterns. All are intentional best-effort operations with appropriate comments:\n- Process signals: expected to fail if process already terminated\n- Git pull/push in recovery paths: best-effort, failures handled downstream\n- Message ack: will naturally retry on next cycle if fails\n- Pool loading: intentional for new rig initialization\n\nThese patterns are acceptable for launch. Consider adding structured logging for observability in future iterations."} @@ -93,6 +107,7 @@ {"id":"gt-3133","title":"Account management for multi-account Claude Code usage","description":"Enable Gas Town to manage multiple Claude Code accounts (e.g., personal vs work) with easy switching. Core mechanism: CLAUDE_CONFIG_DIR env var per account. See docs/design/account-management.md for full design.","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-12-23T03:23:35.825288-08:00","updated_at":"2025-12-23T04:04:28.216463-08:00","closed_at":"2025-12-23T04:04:28.216463-08:00","close_reason":"Account management fully implemented - config parsing, list/add/default commands, GT_ACCOUNT env var, --account flag","dependencies":[{"issue_id":"gt-3133","depends_on_id":"gt-58tu","type":"blocks","created_at":"2025-12-23T03:24:37.170307-08:00","created_by":"daemon"},{"issue_id":"gt-3133","depends_on_id":"gt-hs6y","type":"blocks","created_at":"2025-12-23T03:24:37.263123-08:00","created_by":"daemon"},{"issue_id":"gt-3133","depends_on_id":"gt-nq1a","type":"blocks","created_at":"2025-12-23T03:24:37.353483-08:00","created_by":"daemon"},{"issue_id":"gt-3133","depends_on_id":"gt-0c7s","type":"blocks","created_at":"2025-12-23T03:24:37.443494-08:00","created_by":"daemon"},{"issue_id":"gt-3133","depends_on_id":"gt-74a7","type":"blocks","created_at":"2025-12-23T03:24:37.534229-08:00","created_by":"daemon"},{"issue_id":"gt-3133","depends_on_id":"gt-plcg","type":"blocks","created_at":"2025-12-23T03:24:37.625162-08:00","created_by":"daemon"}]} {"id":"gt-31eg","title":"Epic: Async Gates for Agent Coordination","description":"## Summary\n\nAgents need an async primitive for waiting on external events (CI completion,\nAPI responses, human approval). Currently they either poll wastefully or cant\nresume after handoff.\n\n## Design: Deacon-Managed Gates\n\n### Core Concepts\n\n**Gate** = wisp issue that blocks until external condition is met\n- Type: `gate`\n- Phase: wisp (never synced, ephemeral)\n- Assignee: `deacon/` (Deacon monitors it)\n- Fields: `await_type`, `await_id`, `timeout`, `waiters[]`\n\n**Await Types:**\n- `gh:run:\u003cid\u003e` - GitHub Actions run completion\n- `gh:pr:\u003cid\u003e` - PR merged/closed\n- `timer:\u003cduration\u003e` - Simple delay (e.g., \"5m\", \"1h\")\n- `human:\u003cprompt\u003e` - Human approval required\n- `mail:\u003cpattern\u003e` - Wait for mail matching pattern\n\n### Commands\n\n```bash\nbd gate create --await \u003ctype\u003e:\u003cid\u003e --timeout \u003cduration\u003e --notify \u003caddr\u003e\nbd gate show \u003cid\u003e\nbd gate list\nbd gate close \u003cid\u003e --reason \"completed\"\nbd gate wait \u003cid\u003e --notify \u003caddr\u003e\n```\n\n## Children (suggested breakdown)\n\n1. Add `gate` issue type to beads\n2. Add gate fields: await_type, await_id, timeout, waiters\n3. Implement `bd gate create/show/list/close/wait` commands\n4. Add gate checking to Deacon patrol loop\n5. Implement await type handlers (gh:run, gh:pr, timer, human, mail)\n6. Add gate timeout tracking and notification\n7. Integration test: agent waits for CI via gate\n\n## Open Questions\n\n- Should gates live in wisp storage or main storage with wisp flag?\n- Do we need a gate catalog (like molecule catalog)?\n- Should `waits-for` dep type work with gates?","status":"open","priority":1,"issue_type":"epic","created_at":"2025-12-24T19:19:17.774543-08:00","updated_at":"2025-12-24T19:19:17.774543-08:00"} {"id":"gt-346","title":"Update harness beads redirect for GGT","description":"Change ~/ai/.beads/redirect from mayor/rigs/gastown/.beads to gastown/mayor/.beads for the GGT directory structure","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-17T16:42:41.650571-08:00","updated_at":"2025-12-19T12:00:39.272977-08:00","closed_at":"2025-12-19T12:00:39.272977-08:00","dependencies":[{"issue_id":"gt-346","depends_on_id":"gt-l1o","type":"blocks","created_at":"2025-12-17T16:42:54.495061-08:00","created_by":"daemon"},{"issue_id":"gt-346","depends_on_id":"gt-cr9","type":"blocks","created_at":"2025-12-17T17:15:59.04264-08:00","created_by":"daemon"}]} +{"id":"gt-35s","title":"Architecture: beads config and direct landing docs","description":"Added to architecture.md:\n- Beads multi-agent configuration table (daemon, worktree, sync-branch)\n- ASCII directory layout for non-mermaid rendering\n- Direct landing workflow (bypass merge queue)\n- Design decisions 9 and 10 for direct landing and daemon awareness\n- CLI commands for gt land","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-16T00:29:52.395906-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-35x","title":"Plugin: plan-oracle (work decomposition)","description":"Plugin that helps decompose epics/issues into sub-tasks. Analyzes scope, identifies dependencies, estimates complexity for parallelization, creates beads for sub-tasks with dependency links.","status":"open","priority":3,"issue_type":"feature","created_at":"2025-12-15T22:53:05.772986-08:00","updated_at":"2025-12-15T23:17:06.423894-08:00","dependencies":[{"issue_id":"gt-35x","depends_on_id":"gt-axz","type":"blocks","created_at":"2025-12-15T22:53:17.587726-08:00","created_by":"daemon"}]} {"id":"gt-39ej","title":"Digest: mol-deacon-patrol","description":"Patrol #1: No issues found. All 6 agents healthy. No orphans.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T22:14:35.83023-08:00","updated_at":"2025-12-24T22:14:35.83023-08:00","closed_at":"2025-12-24T22:14:35.830195-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-3a4","title":"Add gt decommission command for clean swarm/worker shutdown","description":"Single command to cleanly shut down a swarm and its workers: cancel swarm, stop sessions, optionally remove polecats. E.g. gt decommission gt-hw6 --cleanup","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-18T11:33:37.217682-08:00","updated_at":"2025-12-18T11:38:55.092852-08:00","closed_at":"2025-12-18T11:38:55.092852-08:00"} @@ -119,13 +134,14 @@ {"id":"gt-3tssq","title":"Test Patrol for Bonding","description":"Parent issue for mol bond CLI test","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T00:57:47.316871-08:00","updated_at":"2025-12-25T01:33:00.154321-08:00","closed_at":"2025-12-25T01:33:00.154321-08:00","close_reason":"Test pollution cleanup"} {"id":"gt-3tssq.1","title":"Polecat Arm (arm-toast)","description":"Single polecat inspection and action cycle.\n\nThis molecule is bonded dynamically by mol-witness-patrol's survey-workers step.\nEach polecat being monitored gets one arm that runs in parallel with other arms.\n\n## Variables\n\n| Variable | Required | Description |\n|----------|----------|-------------|\n| polecat_name | Yes | Name of the polecat to inspect |\n| rig | Yes | Rig containing the polecat |\n\n## Step: capture\nCapture recent tmux output for toast.\n\n```bash\ntmux capture-pane -t gt-gastown-toast -p | tail -50\n```\n\nRecord:\n- Last activity timestamp (when was last tool call?)\n- Visible errors or stack traces\n- Completion indicators (\"Done\", \"Finished\", etc.)\n\n## Step: assess\nCategorize polecat state based on captured output.\n\nStates:\n- **working**: Recent tool calls, active processing\n- **idle**: At prompt, no recent activity\n- **error**: Showing errors or stack traces\n- **requesting_shutdown**: Sent LIFECYCLE/Shutdown mail\n- **done**: Showing completion indicators\n\nCalculate: minutes since last activity.\nNeeds: capture\n\n## Step: load-history\nRead nudge history for toast from patrol state.\n\n```\nnudge_count = state.nudges[toast].count\nlast_nudge_time = state.nudges[toast].timestamp\n```\n\nThis data was loaded by the parent patrol's load-state step and passed\nto the arm via the bonding context.\nNeeds: assess\n\n## Step: decide\nApply the nudge matrix to determine action for toast.\n\n| State | Idle Time | Nudge Count | Action |\n|-------|-----------|-------------|--------|\n| working | any | any | none |\n| idle | \u003c10min | any | none |\n| idle | 10-15min | 0 | nudge-1 (gentle) |\n| idle | 15-20min | 1 | nudge-2 (direct) |\n| idle | 20+min | 2 | nudge-3 (final) |\n| idle | any | 3 | escalate |\n| error | any | any | assess-severity |\n| requesting_shutdown | any | any | pre-kill-verify |\n| done | any | any | pre-kill-verify |\n\nNudge text:\n1. \"How's progress? Need any help?\"\n2. \"Please wrap up soon. What's blocking you?\"\n3. \"Final check. Will escalate in 5 min if no response.\"\n\nRecord decision and rationale.\nNeeds: load-history\n\n## Step: execute\nTake the decided action for toast.\n\n**nudge-N**:\n```bash\ntmux send-keys -t gt-gastown-toast \"{{nudge_text}}\" Enter\n```\n\n**pre-kill-verify**:\n```bash\ncd polecats/toast\ngit status # Must be clean\ngit log origin/main..HEAD # Check for unpushed\nbd show \u003cassigned-issue\u003e # Verify closed/deferred\n```\nIf clean: kill session, remove worktree, delete branch\nIf dirty: record failure, retry next cycle\n\n**escalate**:\n```bash\ngt mail send mayor/ -s \"Escalation: toast stuck\" -m \"...\"\n```\n\n**none**: No action needed.\n\nRecord: action taken, result, updated nudge count.\nNeeds: decide\n\n## Output\n\nThe arm completes with:\n- action_taken: none | nudge-1 | nudge-2 | nudge-3 | killed | escalated\n- result: success | failed | pending\n- updated_state: New nudge count and timestamp for toast\n\nThis data feeds back to the parent patrol's aggregate step.\n---\nbonded_from: mol-polecat-arm\nbonded_to: gt-3tssq\nbonded_ref: arm-toast\nbonded_at: 2025-12-23T10:00:00Z\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T00:57:47.407091-08:00","updated_at":"2025-12-25T00:57:47.592959-08:00","closed_at":"2025-12-25T00:57:47.592959-08:00","close_reason":"Closed","dependencies":[{"issue_id":"gt-3tssq.1","depends_on_id":"gt-3tssq","type":"parent-child","created_at":"2025-12-25T00:57:47.407592-08:00","created_by":"daemon"}]} {"id":"gt-3twz","title":"Digest: mol-deacon-patrol","description":"Patrol 2: All systems nominal","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T23:46:05.137994-08:00","updated_at":"2025-12-24T23:46:05.137994-08:00","closed_at":"2025-12-24T23:46:05.137962-08:00","close_reason":"Squashed from 8 wisps"} +{"id":"gt-3tz","title":"CLI: polecat commands (add, list, wake, sleep, decommission)","description":"GGT is missing most polecat management commands that PGT has.\n\nMissing Commands:\n- gt polecat add \u003crig\u003e \u003cname\u003e - Add polecat to rig (creates clone)\n- gt polecat list [\u003crig\u003e] - List polecats with state\n- gt polecat info \u003cpolecat\u003e - Show detailed info\n- gt polecat wake \u003cpolecat\u003e - Mark available\n- gt polecat sleep \u003cpolecat\u003e - Mark unavailable \n- gt polecat decommission \u003cpolecat\u003e - Remove polecat safely\n\nPGT Reference: gastown-py/src/gastown/cli/polecat_cmd.py\n\nNotes:\n- spawn exists but doesn't cover management\n- wake/sleep are in polecat manager but not CLI\n- decommission should check for uncommitted work","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-16T14:46:31.326692-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-3uw5d","title":"Digest: mol-deacon-patrol","description":"Patrol 4: routine, all healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T13:42:30.550966-08:00","updated_at":"2025-12-25T13:42:30.550966-08:00","closed_at":"2025-12-25T13:42:30.550937-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-3uw5d","depends_on_id":"gt-pnoao","type":"parent-child","created_at":"2025-12-25T13:42:30.55167-08:00","created_by":"stevey"}]} {"id":"gt-3x0z","title":"Epic: Wisp Molecule Integration","description":"## Vision\n\nIntegrate Beads wisp molecules into Gas Town. All orchestration work runs as wisp molecules - patrols, polecat workflows, batch operations. Only digests reach main beads.\n\n## The Steam Engine Metaphor\n\n```\nEngine does work → generates steam\nSteam wisps rise → execution trace\nSteam condenses → digest (distillate) \nSteam dissipates → cleaned up (burned)\n```\n\n## Architecture\n\n```\nProto Molecules (templates)\n ↓ bd mol bond\nWisps (.beads-wisps/ or inline)\n ↓ bd mol squash + AI summary\nMain Beads (digests only)\n```\n\n## Vocabulary\n\n| Term | Meaning |\n|------|---------|\n| bond | Attach proto to work (creates wisps) |\n| wisp | Temporary execution step (steam rising) |\n| squash | Condense wisps into digest |\n| burn | Destroy wisps without record |\n| digest | Permanent condensed record (distillate) |\n\n## Key Design Decisions\n\n1. **Wisp location**: Per-rig or inline in main beads with wisp flag\n2. **Summary generation**: Agent that did work generates summary (inversion of control)\n3. **Squash timing**: Final step of molecule workflow, before signaling done\n4. **Crash recovery**: Wisps persist, Witness detects stalls, new agent resumes\n5. **Patrols**: Each cycle is fresh wisp molecule, squashed on completion\n\n## Digest Contents\n\n- Molecule type and instance ID\n- Assignee, start/end times\n- Source issue reference\n- AI-generated summary\n- Outcomes (issues closed, commits, branches)\n\n## Integration Points\n\n- gt rig init: Configure wisp storage\n- gt spawn --molecule: Bond creates wisps\n- gt prime: Show wisp molecule context\n- Polecat CLAUDE.md: Summary + squash protocol\n- gt doctor: Wisp health checks\n- Deacon/Witness/Refinery: Patrol molecules\n\n## Phases\n\nPhase 1: Wisp setup infrastructure\nPhase 2: Spawn integration\nPhase 3: Completion flow (summary + squash)\nPhase 4: Patrol integration\nPhase 5: Documentation and polish","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-21T14:33:03.15592-08:00","updated_at":"2025-12-25T02:11:07.550609-08:00","closed_at":"2025-12-25T02:11:07.550609-08:00","close_reason":"Core functionality complete. Remaining P2/P3 children are enhancements that can be tracked independently."} {"id":"gt-3x0z.1","title":"Phase 1.1: gt rig init creates .beads-ephemeral/","description":"Add ephemeral beads repo creation to rig initialization.\n\n## Implementation\n\nIn `gt rig init` (or equivalent setup):\n1. Create `\u003crig\u003e/.beads-ephemeral/` directory\n2. Initialize as git repo\n3. Create minimal beads config (no sync-branch needed)\n4. Add to .gitignore if not already\n\n## Config\n\n```yaml\n# .beads-ephemeral/config.yaml\nephemeral: true\n# No sync-branch - ephemeral is local only\n```\n\n## Verification\n\n```bash\ngt rig init gastown\nls gastown/.beads-ephemeral/ # Should exist\n```","status":"closed","priority":1,"issue_type":"task","assignee":"gastown/furiosa","created_at":"2025-12-21T14:33:23.699253-08:00","updated_at":"2025-12-21T15:32:05.045296-08:00","closed_at":"2025-12-21T15:32:05.045296-08:00","close_reason":"Added initEphemeralBeads to rig add, creates .beads-ephemeral/ with git init and config.yaml","dependencies":[{"issue_id":"gt-3x0z.1","depends_on_id":"gt-3x0z","type":"parent-child","created_at":"2025-12-21T14:33:23.701082-08:00","created_by":"daemon"}]} {"id":"gt-3x0z.10","title":"Phase 4.2: Witness/Refinery patrol molecules","description":"Extend ephemeral patrol pattern to Witness and Refinery.\n\n## Witness Patrol Cycle\n\nmol-witness-patrol-cycle:\n1. scan-polecats: Check each polecat status\n2. detect-stalls: Find stuck/idle polecats\n3. nudge-or-escalate: Take action on stalls\n4. log-status: Record cycle results\n→ Squash with summary\n\n## Refinery Patrol Cycle\n\nmol-refinery-patrol-cycle:\n1. scan-queue: Check merge queue\n2. process-ready: Merge ready MRs\n3. handle-failures: Deal with conflicts/failures\n4. log-status: Record cycle results\n→ Squash with summary\n\n## Quiescent Mode\n\nWhen no work: just log 'no activity' summary.\nWitness and Refinery can sleep between cycles until triggered.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-21T14:34:13.103951-08:00","updated_at":"2025-12-21T14:34:13.103951-08:00","dependencies":[{"issue_id":"gt-3x0z.10","depends_on_id":"gt-3x0z","type":"parent-child","created_at":"2025-12-21T14:34:13.104305-08:00","created_by":"daemon"},{"issue_id":"gt-3x0z.10","depends_on_id":"gt-3x0z.9","type":"blocks","created_at":"2025-12-21T14:34:40.742967-08:00","created_by":"daemon"}]} {"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":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T14:34:30.074147-08:00","updated_at":"2025-12-22T21:43:34.383954-08:00","closed_at":"2025-12-22T21:43:34.383954-08:00","close_reason":"Wisp documentation complete. Cleaned up redundant ephemeral terminology.","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"}]} +{"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":"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"}]} @@ -193,6 +209,7 @@ {"id":"gt-58it","title":"bd sync --from-main: fresh sync from main branch","description":"## Summary\n\nAdd `--from-main` flag to `bd sync` to pull fresh beads state from main branch.\n\n## Use Case\n\nWhen starting a patrol or fresh session, agent wants clean beads state:\n```bash\nbd sync --from-main # Pull latest from origin/main, ignore local changes\n```\n\n## Behavior\n\n1. Fetch origin/main\n2. Reset local .beads/ to match origin/main\n3. Rebuild SQLite DB from fresh JSONL\n\nUseful for polecats/crew starting work to avoid stale state.","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-23T01:19:14.352299-08:00","updated_at":"2025-12-23T01:19:14.352299-08:00"} {"id":"gt-58tu","title":"Add accounts.yaml config parsing to gt","description":"Parse ~/gt/mayor/accounts.yaml with structure: accounts map (handle -\u003e email, config_dir) and default field. This is the foundational config that other account features depend on. Location follows existing town-level config pattern in mayor/.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T03:24:16.934245-08:00","updated_at":"2025-12-23T03:57:04.069364-08:00","closed_at":"2025-12-23T03:57:04.069364-08:00","close_reason":"Implemented accounts.json config parsing with types, loader, validation, and tests"} {"id":"gt-58yb","title":"Digest: mol-deacon-patrol","description":"Patrol 4: Stable","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T23:07:04.211464-08:00","updated_at":"2025-12-24T23:07:04.211464-08:00","closed_at":"2025-12-24T23:07:04.211427-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-58yb","depends_on_id":"gt-7nwc","type":"parent-child","created_at":"2025-12-24T23:07:04.212136-08:00","created_by":"stevey"}]} +{"id":"gt-59p","title":"Design GGT prompt architecture","description":"Audit PGT prompts and design canonical prompt system for GGT. Create docs/prompts.md with inventory, gap analysis, and Witness prompt design.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-16T00:46:16.916031-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-59zd","title":"Molecule-based Witness Patrol","description":"Wire up mol-witness-patrol as a tracking ledger for the Go-based witness.\n\n## Key Insight\n\nThe molecule is NOT an executor - it's a **tracking structure**. The existing\nGo code in internal/witness/manager.go continues to run the patrol loop.\nThe molecule instance provides visibility, audit trail, and polecat tracking.\n\n## Current State\n\n- Witness runs as Go code with direct patrol logic\n- mol-witness-patrol and mol-polecat-arm exist as molecule definitions\n- gt mol bond creates dynamic children\n- No molecule tracking of actual witness operations\n\n## Target State\n\n1. When witness starts → instantiate mol-witness-patrol on its hook\n2. When Go code discovers polecat → bond mol-polecat-arm child\n3. When polecat completes/dies → close that arm issue\n4. gt mol progress shows current patrol state\n5. Molecule survives wisp burns via handoff bead\n\n## Benefits\n\n- Visibility: gt mol status gastown/witness shows active arms\n- Audit: Each polecat inspection is a trackable issue\n- Consistency: Same tracking model as polecats with molecules\n- Progress: gt mol progress works for witness too\n\n## Non-Goals\n\n- NOT replacing Go code with Claude session\n- NOT running molecule steps as prompts\n- NOT requiring Claude for witness operation","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-23T22:19:33.06695-08:00","updated_at":"2025-12-23T22:36:17.494482-08:00","closed_at":"2025-12-23T22:36:17.494482-08:00","close_reason":"CANCELLED: Wrong architecture. Go-based witness patrol with molecule-as-tracking-ledger is backwards. Claude session executes mol steps directly - the mol IS the executor, not bookkeeping. Also: subtasks were hallucinated as 'done' without actual code commits."} {"id":"gt-59zd.1","title":"mol sling command: attach molecule to agent hook","description":"Add `gt mol sling \u003cmolecule-id\u003e` command to attach a molecule to the current agent's hook.\n\n## Behavior\n\n```bash\ngt mol sling mol-witness-patrol\n```\n\n1. Find agent identity from cwd (witness, polecat, crew, etc.)\n2. Find or create agent's handoff bead\n3. Attach molecule to handoff bead (attached_molecule field)\n4. Create root issue for this molecule instance\n5. Instantiate molecule steps under the root\n\n## Difference from mol attach\n\n- `mol attach` attaches to an existing pinned bead\n- `mol sling` creates a fresh instance for execution\n\n## Output\n\n```\n🧬 Slung mol-witness-patrol on gastown/witness\n Instance: gt-xyz (9 steps)\n First step: inbox-check\n```\n\n## Implementation\n\n- Reuse InstantiateMolecule from molecule.go\n- Create wrapper issue for the instance\n- Set attached_molecule on handoff bead","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T22:19:45.161282-08:00","updated_at":"2025-12-23T22:36:17.505507-08:00","closed_at":"2025-12-23T22:36:17.505507-08:00","close_reason":"CANCELLED: Wrong architecture. Go-based witness patrol with molecule-as-tracking-ledger is backwards. Claude session executes mol steps directly - the mol IS the executor, not bookkeeping. Also: subtasks were hallucinated as 'done' without actual code commits.","dependencies":[{"issue_id":"gt-59zd.1","depends_on_id":"gt-59zd","type":"parent-child","created_at":"2025-12-23T22:19:45.161784-08:00","created_by":"daemon"}]} {"id":"gt-59zd.2","title":"mol progress: track dynamically bonded children","description":"Extend `gt mol progress` to show dynamically bonded children.\n\n## Current Behavior\n\n```\ngt mol progress gt-abc\n```\n\nShows progress through pre-defined steps from InstantiateMolecule.\n\n## New Behavior\n\nAlso show dynamically bonded children:\n\n```\n📊 Progress: mol-witness-patrol (gt-abc)\n\n Steps (9):\n ✓ inbox-check\n ✓ check-refinery\n ✓ load-state\n ◐ survey-workers (bonded 3 children)\n ○ aggregate (WaitsFor: all-children)\n ○ save-state\n ○ generate-summary\n ○ context-check\n ○ burn-or-loop\n\n Bonded Children (3):\n ✓ arm-toast (5/5 steps)\n ◐ arm-nux (3/5 steps)\n ○ arm-furiosa (0/5 steps)\n\n Progress: 4/9 steps, 3 arms (1 complete, 1 in-progress, 1 pending)\n```\n\n## Implementation\n\n1. Find children with bonded_to: \u003cparent-id\u003e in description\n2. Recursively get progress for each bonded child\n3. Aggregate into parent progress display","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T22:19:58.346108-08:00","updated_at":"2025-12-23T22:36:17.515471-08:00","closed_at":"2025-12-23T22:36:17.515471-08:00","close_reason":"CANCELLED: Wrong architecture. Go-based witness patrol with molecule-as-tracking-ledger is backwards. Claude session executes mol steps directly - the mol IS the executor, not bookkeeping. Also: subtasks were hallucinated as 'done' without actual code commits.","dependencies":[{"issue_id":"gt-59zd.2","depends_on_id":"gt-59zd","type":"parent-child","created_at":"2025-12-23T22:19:58.346575-08:00","created_by":"daemon"}]} @@ -219,13 +236,14 @@ {"id":"gt-5ipl","title":"Witness role describes incorrect commands","description":"prompts/roles/witness.md line 44 shows:\n gt polecat list {{ rig }}\n\nBut polecats are worktrees managed by Refinery/Mayor's clone,\nnot a separate polecat manager. The witness shouldn't manage\npolecats directly.\n\nReview and update witness role to match actual architecture.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-24T12:51:44.558565-08:00","updated_at":"2025-12-24T23:38:14.670954-08:00","closed_at":"2025-12-24T23:38:14.670954-08:00","close_reason":"Invalid: gt polecat list and gt polecat remove commands exist and work correctly. Issue based on outdated code.","dependencies":[{"issue_id":"gt-5ipl","depends_on_id":"gt-jo9n","type":"blocks","created_at":"2025-12-24T12:52:08.074809-08:00","created_by":"daemon"}]} {"id":"gt-5j2x","title":"Test Patrol for Bonding","description":"Parent issue for mol bond CLI test","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T21:04:10.199911-08:00","updated_at":"2025-12-25T01:33:00.451765-08:00","closed_at":"2025-12-25T01:33:00.451765-08:00","close_reason":"Test pollution cleanup"} {"id":"gt-5j2x.1","title":"Polecat Arm (arm-toast)","description":"Single polecat inspection and action cycle.\n\nThis molecule is bonded dynamically by mol-witness-patrol's survey-workers step.\nEach polecat being monitored gets one arm that runs in parallel with other arms.\n\n## Variables\n\n| Variable | Required | Description |\n|----------|----------|-------------|\n| polecat_name | Yes | Name of the polecat to inspect |\n| rig | Yes | Rig containing the polecat |\n\n## Step: capture\nCapture recent tmux output for toast.\n\n```bash\ntmux capture-pane -t gt-gastown-toast -p | tail -50\n```\n\nRecord:\n- Last activity timestamp (when was last tool call?)\n- Visible errors or stack traces\n- Completion indicators (\"Done\", \"Finished\", etc.)\n\n## Step: assess\nCategorize polecat state based on captured output.\n\nStates:\n- **working**: Recent tool calls, active processing\n- **idle**: At prompt, no recent activity\n- **error**: Showing errors or stack traces\n- **requesting_shutdown**: Sent LIFECYCLE/Shutdown mail\n- **done**: Showing completion indicators\n\nCalculate: minutes since last activity.\nNeeds: capture\n\n## Step: load-history\nRead nudge history for toast from patrol state.\n\n```\nnudge_count = state.nudges[toast].count\nlast_nudge_time = state.nudges[toast].timestamp\n```\n\nThis data was loaded by the parent patrol's load-state step and passed\nto the arm via the bonding context.\nNeeds: assess\n\n## Step: decide\nApply the nudge matrix to determine action for toast.\n\n| State | Idle Time | Nudge Count | Action |\n|-------|-----------|-------------|--------|\n| working | any | any | none |\n| idle | \u003c10min | any | none |\n| idle | 10-15min | 0 | nudge-1 (gentle) |\n| idle | 15-20min | 1 | nudge-2 (direct) |\n| idle | 20+min | 2 | nudge-3 (final) |\n| idle | any | 3 | escalate |\n| error | any | any | assess-severity |\n| requesting_shutdown | any | any | pre-kill-verify |\n| done | any | any | pre-kill-verify |\n\nNudge text:\n1. \"How's progress? Need any help?\"\n2. \"Please wrap up soon. What's blocking you?\"\n3. \"Final check. Will escalate in 5 min if no response.\"\n\nRecord decision and rationale.\nNeeds: load-history\n\n## Step: execute\nTake the decided action for toast.\n\n**nudge-N**:\n```bash\ntmux send-keys -t gt-gastown-toast \"{{nudge_text}}\" Enter\n```\n\n**pre-kill-verify**:\n```bash\ncd polecats/toast\ngit status # Must be clean\ngit log origin/main..HEAD # Check for unpushed\nbd show \u003cassigned-issue\u003e # Verify closed/deferred\n```\nIf clean: kill session, remove worktree, delete branch\nIf dirty: record failure, retry next cycle\n\n**escalate**:\n```bash\ngt mail send mayor/ -s \"Escalation: toast stuck\" -m \"...\"\n```\n\n**none**: No action needed.\n\nRecord: action taken, result, updated nudge count.\nNeeds: decide\n\n## Output\n\nThe arm completes with:\n- action_taken: none | nudge-1 | nudge-2 | nudge-3 | killed | escalated\n- result: success | failed | pending\n- updated_state: New nudge count and timestamp for toast\n\nThis data feeds back to the parent patrol's aggregate step.\n---\nbonded_from: mol-polecat-arm\nbonded_to: gt-5j2x\nbonded_ref: arm-toast\nbonded_at: 2025-12-23T10:00:00Z\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T21:04:10.282891-08:00","updated_at":"2025-12-24T21:04:10.454575-08:00","closed_at":"2025-12-24T21:04:10.454575-08:00","close_reason":"Closed","dependencies":[{"issue_id":"gt-5j2x.1","depends_on_id":"gt-5j2x","type":"parent-child","created_at":"2025-12-24T21:04:10.283404-08:00","created_by":"daemon"}]} -{"id":"gt-5klh","title":"Remove legacy .beads-wisp/ infrastructure","description":"The wisp simplification (gt-fgms + bd-bkul) changed wisps to be just a flag on issues in the main .beads/ database. JSONL export filters Wisp=true issues. No separate directory needed.\n\nBut legacy .beads-wisp/ infrastructure still exists and should be removed:\n\n## Gas Town (gt) cleanup:\n- `internal/rig/manager.go`: Remove `initWispBeads()` call from `AddRig()`\n- `internal/wisp/io.go`: Delete entire file (old abstraction layer)\n- `internal/cmd/install.go`: Remove any .beads-wisp setup\n- `docs/wisp-architecture.md`: Update to reflect 'just a flag' model\n\n## Beads (bd) cleanup:\n- `cmd/bd/doctor/wisp_check.go`: Remove WispExistsCheck, WispGitCheck, WispSizeCheck (check .beads-wisp dirs)\n- Keep WispOrphansCheck and WispStaleCheck but rewrite to query main DB for Wisp=true issues\n\n## Filesystem cleanup:\n- Delete ~/gt/.beads-wisp/\n- Delete ~/gt/gastown/.beads-wisp/\n- Delete all per-rig .beads-wisp/ directories\n- Remove .beads-wisp from .gitignore entries\n\n## Verify:\n- `gt mail send --wisp` still works (creates issue with Wisp=true in main DB)\n- `bd sync` still filters wisps from JSONL\n- `bd mol squash/burn` still work on Wisp=true issues","status":"closed","priority":2,"issue_type":"chore","created_at":"2025-12-24T21:22:31.378327-08:00","updated_at":"2025-12-24T21:51:39.361865-08:00","closed_at":"2025-12-24T21:51:39.361865-08:00","close_reason":"Removed legacy .beads-wisp infrastructure. Hooks now stored in .beads/, wisps are just Wisp=true flag on issues."} +{"id":"gt-5klh","title":"Remove legacy .beads-wisp/ infrastructure","description":"The wisp simplification (gt-fgms + bd-bkul) changed wisps to be just a flag on issues in the main .beads/ database. JSONL export filters Wisp=true issues. No separate directory needed.\n\nBut legacy .beads-wisp/ infrastructure still exists and should be removed:\n\n## Gas Town (gt) cleanup:\n- `internal/rig/manager.go`: Remove `initWispBeads()` call from `AddRig()`\n- `internal/wisp/io.go`: Delete entire file (old abstraction layer)\n- `internal/cmd/install.go`: Remove any .beads-wisp setup\n- `docs/wisp-architecture.md`: Update to reflect 'just a flag' model\n\n## Beads (bd) cleanup:\n- `cmd/bd/doctor/wisp_check.go`: Remove WispExistsCheck, WispGitCheck, WispSizeCheck (check .beads-wisp dirs)\n- Keep WispOrphansCheck and WispStaleCheck but rewrite to query main DB for Wisp=true issues\n\n## Filesystem cleanup:\n- Delete ~/gt/.beads-wisp/\n- Delete ~/gt/gastown/.beads-wisp/\n- Delete all per-rig .beads-wisp/ directories\n- Remove .beads-wisp from .gitignore entries\n\n## Verify:\n- `gt mail send --wisp` still works (creates issue with Wisp=true in main DB)\n- `bd sync` still filters wisps from JSONL\n- `bd mol squash/burn` still work on Wisp=true issues","status":"closed","priority":2,"issue_type":"chore","created_at":"2025-12-24T21:22:31.378327-08:00","updated_at":"2025-12-24T21:51:39.361865-08:00","closed_at":"2025-12-24T21:51:39.361865-08:00","close_reason":"Removed legacy .beads-wisp infrastructure. Hooks now stored in .beads/, wisps are just Wisp=true flag on issues.","comments":[{"id":2,"issue_id":"gt-5klh","author":"stevey","text":"Additional finding: wisps ARE leaking into town-level JSONL (~/gt/.beads/issues.jsonl). Saw hq-3g9e and hq-94i with wisp:true in the file. The filtering works for rig-level beads but apparently not town-level. Need to investigate why town beads uses different export path.","created_at":"2025-12-25T05:23:42Z"}]} {"id":"gt-5m5cd","title":"Digest: mol-deacon-patrol","description":"Patrol 10: All healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T13:30:35.506276-08:00","updated_at":"2025-12-25T13:30:35.506276-08:00","closed_at":"2025-12-25T13:30:35.506242-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-5m5cd","depends_on_id":"gt-fw960","type":"parent-child","created_at":"2025-12-25T13:30:35.507-08:00","created_by":"stevey"}]} {"id":"gt-5moq5","title":"Digest: mol-deacon-patrol","description":"Patrol 9: All agents healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T02:11:33.463463-08:00","updated_at":"2025-12-25T02:11:33.463463-08:00","closed_at":"2025-12-25T02:11:33.46343-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-5n2f","title":"Tech Debt: Code Review December 2024","description":"Tech debt identified during code review on 2024-12-21. Contains 11 issues ranging from P2-P4 covering:\n\n- Code duplication (manager creation boilerplate)\n- Test coverage gaps (cmd 6.8%, mail 3.6%)\n- Magic strings needing constants\n- Error handling inconsistencies\n- Large files needing splitting\n- Unused code removal\n\nWork through these incrementally to improve codebase maintainability.","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-12-21T21:37:36.114862-08:00","updated_at":"2025-12-21T22:20:12.869211-08:00","closed_at":"2025-12-21T22:20:12.869211-08:00","close_reason":"Tech debt review complete for launch. Completed:\n- gt-ai1z: Cycle detection in molecule deps\n- gt-7sqi: Manager boilerplate refactoring\n- gt-zhm5: Epic child filtering in Witness\n- gt-xnql: Constants for magic strings\n- gt-cvfg: io.Writer for refinery output\n- gt-nz6t: Removed unused style helpers\n\nAudited and closed:\n- gt-2xsh: Silent error handling (patterns are intentional)\n- gt-2n6z: Error wrapping (deferred to v0.2)\n\nDeferred to post-launch:\n- gt-480b: Test coverage (ongoing)\n- gt-92of: Large file splitting (refactoring)\n- gt-pbr3: Godoc comments (documentation)\n\nCodebase is launch-ready.","dependencies":[{"issue_id":"gt-5n2f","depends_on_id":"gt-ai1z","type":"blocks","created_at":"2025-12-21T21:37:45.973674-08:00","created_by":"daemon"},{"issue_id":"gt-5n2f","depends_on_id":"gt-zhm5","type":"blocks","created_at":"2025-12-21T21:37:46.048395-08:00","created_by":"daemon"},{"issue_id":"gt-5n2f","depends_on_id":"gt-7sqi","type":"blocks","created_at":"2025-12-21T21:37:46.120505-08:00","created_by":"daemon"},{"issue_id":"gt-5n2f","depends_on_id":"gt-nz6t","type":"blocks","created_at":"2025-12-21T21:37:46.194096-08:00","created_by":"daemon"},{"issue_id":"gt-5n2f","depends_on_id":"gt-xnql","type":"blocks","created_at":"2025-12-21T21:37:46.268652-08:00","created_by":"daemon"},{"issue_id":"gt-5n2f","depends_on_id":"gt-480b","type":"blocks","created_at":"2025-12-21T21:37:46.341243-08:00","created_by":"daemon"},{"issue_id":"gt-5n2f","depends_on_id":"gt-cvfg","type":"blocks","created_at":"2025-12-21T21:37:46.417073-08:00","created_by":"daemon"},{"issue_id":"gt-5n2f","depends_on_id":"gt-92of","type":"blocks","created_at":"2025-12-21T21:37:46.489042-08:00","created_by":"daemon"},{"issue_id":"gt-5n2f","depends_on_id":"gt-2xsh","type":"blocks","created_at":"2025-12-21T21:37:46.562771-08:00","created_by":"daemon"},{"issue_id":"gt-5n2f","depends_on_id":"gt-2n6z","type":"blocks","created_at":"2025-12-21T21:37:46.63439-08:00","created_by":"daemon"},{"issue_id":"gt-5n2f","depends_on_id":"gt-pbr3","type":"blocks","created_at":"2025-12-21T21:37:46.706067-08:00","created_by":"daemon"}]} {"id":"gt-5q9u","title":"Digest: mol-deacon-patrol","description":"Patrol #15: Stable","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T23:34:25.357778-08:00","updated_at":"2025-12-24T23:34:25.357778-08:00","closed_at":"2025-12-24T23:34:25.357737-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-5qc","title":"Document how to configure a Gas Town Harness","description":"Create docs explaining what a harness is (private repo containing GT installation with rigs gitignored), why you'd want one, and how to set it up with beads redirects","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-17T16:42:43.370167-08:00","updated_at":"2025-12-19T12:00:39.274285-08:00","closed_at":"2025-12-19T12:00:39.274285-08:00","dependencies":[{"issue_id":"gt-5qc","depends_on_id":"gt-l1o","type":"blocks","created_at":"2025-12-17T16:42:54.620984-08:00","created_by":"daemon"},{"issue_id":"gt-5qc","depends_on_id":"gt-cr9","type":"blocks","created_at":"2025-12-17T17:15:59.17545-08:00","created_by":"daemon"}]} {"id":"gt-5tct","title":"gt mail send: add stdin and file input support for complex messages","description":"Current -m flag is fragile with multi-line messages containing backticks, quotes, or shell special chars. Add: 1) --stdin flag to read message body from stdin (heredoc-friendly), 2) -f/--file flag to read from file. This sidesteps shell quoting nightmares for handoff messages with code samples.","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-23T03:47:50.514096-08:00","updated_at":"2025-12-23T03:47:50.514096-08:00"} +{"id":"gt-5tp","title":"Test message","description":"Testing GGT mail via beads","status":"tombstone","priority":2,"issue_type":"message","created_at":"2025-12-16T21:44:27.546781-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"message"} {"id":"gt-5uf3","title":"Patrol step: check parked molecules for unblock","description":"Add patrol step to Deacon for checking parked molecules:\n\n```yaml\n- step: check-parked-molecules\n action: |\n For each molecule with:\n - status: in_progress\n - assignee: null\n - has step with external: blocked_by\n Check if external deps are now satisfied.\n If yes: spawn polecat to resume the molecule.\n```\n\nThis automates the resume process - no manual intervention needed when\nupstream dependencies ship.\n\nPart of cross-project dependency system.\nSee: docs/cross-project-deps.md\n\nDepends on: gt-in3x (spawn --continue)\nPriority: P3 (future automation, not required for launch)","status":"open","priority":3,"issue_type":"feature","created_at":"2025-12-21T22:39:25.167767-08:00","updated_at":"2025-12-21T22:39:25.167767-08:00","dependencies":[{"issue_id":"gt-5uf3","depends_on_id":"gt-in3x","type":"blocks","created_at":"2025-12-21T22:39:44.777023-08:00","created_by":"daemon"}]} {"id":"gt-5uyln","title":"Digest: mol-deacon-patrol","description":"Patrol 12: All healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T13:31:27.068855-08:00","updated_at":"2025-12-25T13:31:27.068855-08:00","closed_at":"2025-12-25T13:31:27.06882-08:00","dependencies":[{"issue_id":"gt-5uyln","depends_on_id":"gt-tknzj","type":"parent-child","created_at":"2025-12-25T13:31:27.069618-08:00","created_by":"stevey"}]} {"id":"gt-5v29","title":"Add 'wit' alias for witness command","description":"ref works as alias for refinery, but wit doesn't work for witness. Add Aliases: []string{\"wit\"} to witnessCmd.","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-20T23:11:53.453692-08:00","updated_at":"2025-12-20T23:11:53.453692-08:00"} @@ -234,8 +252,10 @@ {"id":"gt-5wtw","title":"Shutdown request handler","description":"Handle polecat shutdown requests:\n\nWhen polecat runs 'gt handoff --shutdown':\n1. Polecat sends mail to \u003crig\u003e/witness requesting shutdown\n2. Witness receives mail\n3. Witness verifies:\n - Git working tree is clean\n - Work is submitted (MR exists or in queue)\n - No uncommitted beads changes\n4. If clean:\n - gt session stop \u003crig\u003e/\u003cpolecat\u003e\n - git worktree remove polecats/\u003cname\u003e\n - git branch -d polecat/\u003cname\u003e\n5. If not clean:\n - Send nudge back to polecat\n - Track retry count\n\nDepends on fixing gt-dsfi (handoff deadlock).","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T03:14:22.968711-08:00","updated_at":"2025-12-20T09:28:15.512143-08:00","closed_at":"2025-12-20T09:28:15.512143-08:00","dependencies":[{"issue_id":"gt-5wtw","depends_on_id":"gt-53w6","type":"parent-child","created_at":"2025-12-20T03:14:37.300578-08:00","created_by":"daemon"},{"issue_id":"gt-5wtw","depends_on_id":"gt-mxyj","type":"blocks","created_at":"2025-12-20T03:14:38.893061-08:00","created_by":"daemon"}]} {"id":"gt-5xph","title":"Document session cycling protocol in all templates","description":"Add explicit lifecycle request protocol to all agent templates.\n\n## Problem\nTemplates mention 'request session refresh' but don't show HOW.\nAgents don't know the protocol for requesting a cycle.\n\n## Protocol to document\n1. Write handoff mail to self (for continuity)\n2. Set requesting_cycle=true in state.json\n3. Send LIFECYCLE mail to deacon/:\n Subject: 'LIFECYCLE: \u003crole\u003e requesting cycle'\n Body: Reason for cycle request\n\n## Templates to update\n- prompts/roles/polecat.md\n- prompts/roles/crew.md \n- prompts/roles/witness.md\n- prompts/roles/refinery.md\n\n## Also add\n- Example state.json location for each role\n- When to request cycle (context full, work complete, etc.)\n- What happens after (daemon kills, respawns, new session primes)","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-22T16:43:54.10282-08:00","updated_at":"2025-12-23T14:43:07.452963-08:00","closed_at":"2025-12-23T14:43:07.452963-08:00","close_reason":"Updated crew and polecat templates with session cycling protocol. Patrol workers already had heuristics documented."} {"id":"gt-5y5p","title":"Preflight molecule: verify baseline health before work","description":"Before assigning work, verify baseline (main branch) is healthy.\n\n**From VC**: Self-healing state machine (HEALTHY → SELF_HEALING → ESCALATED). ~200 lines.\n\n**Gas Town implementation**: Preflight molecule or refinery feature:\n```yaml\npreflight:\n gates: [test, lint, build]\n on_failure: create-fix-issue\n```\n\nRun at session start. If baseline broken, file a P0 fix issue and work on that first.\n\n**Value**: Self-healing baseline. Agents don't start from broken state.\n\n**VC lesson**: Prevents cascading failures. Agent shouldn't start work on broken code.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-20T20:30:13.807641-08:00","updated_at":"2025-12-20T20:30:13.807641-08:00","dependencies":[{"issue_id":"gt-5y5p","depends_on_id":"gt-zhpa","type":"parent-child","created_at":"2025-12-20T20:30:27.469804-08:00","created_by":"daemon"}]} +{"id":"gt-61o","title":"Review and audit all GGT beads","description":"Thorough review of all filed beads in gastown GGT repo. Check for: consistency, completeness, correct dependencies, accurate descriptions, proper prioritization. Ensure beads are self-contained and dont rely on external docs.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-15T20:24:07.152386-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-62hm","title":"Molecule Phase Terminology Documentation","description":"Document the three-phase molecule lifecycle with consistent terminology:\n\n## The Phases (States of Matter)\n\n| Phase | State | Nature |\n|-------|-------|--------|\n| **Proto** | Solid/Crystal | Frozen template, static definition in catalog |\n| **Mol** | Liquid | Reified instance, malleable, tracked in git (durable) |\n| **Wisp** | Gas | Evaporates after squash, ephemeral orchestration |\n\n## Documentation Gaps Identified\n\n### High Priority\n1. Update vision.md Steam Engine metaphor to use proto/mol/wisp terminology\n2. Add lifecycle diagram: Proto → bond → Mol or Wisp → squash → Digest\n3. Document Go types for phases (ProtoMolecule, etc.)\n4. Document .beads-ephemeral/ structure and purpose\n\n### Medium Priority\n5. Update CLAUDE.md files (polecat, witness, refinery) with molecule workflow\n6. Document bd mol bond/squash/burn CLI API with examples\n7. Add polecat guide: Executing molecules and generating summaries\n\n### Low Priority\n8. Add terminology glossary to architecture.md\n9. Create troubleshooting playbook for stuck molecules\n10. Add reference diagrams for state transitions\n\n## Current State\n- architecture.md has good molecule basics but uses inconsistent terminology\n- vision.md has Steam Engine metaphor (proto=fuel, wisp=steam, digest=distillate)\n- molecules.md has detailed reference but needs phase clarity\n- builtin_molecules.go has 8 molecules but no phase documentation in code","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-21T16:32:27.537487-08:00","updated_at":"2025-12-23T02:14:33.226923-08:00","closed_at":"2025-12-23T02:14:33.226923-08:00","close_reason":"All children closed - documentation complete"} {"id":"gt-65a2","title":"Merge: gt-lnji","description":"branch: polecat/nux\ntarget: main\nsource_issue: gt-lnji\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-22T23:36:23.454776-08:00","updated_at":"2025-12-22T23:39:17.585769-08:00","closed_at":"2025-12-22T23:39:17.585769-08:00","close_reason":"Merged to main"} +{"id":"gt-662","title":"Swarm: report generation","description":"Generate markdown reports for completed swarms.\n\n## Command\n```\ngt swarm report \u003cswarm-id\u003e [--save \u003cfile\u003e]\n```\n\n## Report Content\n\n### Header\n- Swarm ID and title\n- Created/completed timestamps\n- Duration\n- Rig name\n\n### Task Summary\n| Task | Assignee | Status | Duration |\n|------|----------|--------|----------|\n| gt-xxx | Toast | merged | 15m |\n| gt-yyy | Nux | merged | 22m |\n\n### Worker Contributions\n- Commits per worker\n- Issues closed per worker\n- Lines changed (optional)\n\n### Timeline\n- Chronological events from events.jsonl\n- Key milestones (started, first merge, landing)\n\n### Issues Encountered\n- Conflicts resolved\n- Failed tasks (if any)\n- Escalations\n\n## Implementation\n```go\nfunc GenerateReport(swarmID string) (*SwarmReport, error)\nfunc (r *SwarmReport) ToMarkdown() string\n```\n\n## Storage\n- Save to \u003crig\u003e/.gastown/swarms/\u003cid\u003e/report.md\n- Or user-specified path with --save\n\n## PGT Reference\ngastown-py/src/gastown/swarm/manager.py generate_report()\n\n## Acceptance Criteria\n- [ ] Markdown report generated\n- [ ] Includes all sections above\n- [ ] Auto-saved to swarm directory\n- [ ] --save allows custom path","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-16T14:47:17.96767-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-690z","title":"Test MR","description":"test","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-18T20:15:16.685471-08:00","updated_at":"2025-12-25T01:33:01.263073-08:00","closed_at":"2025-12-25T01:33:01.263073-08:00","close_reason":"Test pollution cleanup"} {"id":"gt-6957","title":"Deacon primes pending workers instead of spawn nudge","description":"## Problem\n\nWhen gt spawn starts a polecat, it tries to send a nudge message immediately:\n1. Starts tmux session with Claude Code\n2. Waits 3 seconds (hardcoded)\n3. Sends nudge via NudgeSession\n\nBut Claude Code takes 10-20+ seconds to be ready. The message arrives before\nthe prompt is ready, so it appears as part of the prompt string instead of\nbeing executed.\n\n## Solution\n\nMove priming responsibility to the Deacon patrol cycle:\n\n1. gt spawn: Mark polecat as pending_prime=true in state, return immediately\n2. Deacon patrol: New step prime-pending-workers that:\n - Scans all rigs for workers with pending_prime=true\n - Uses WaitForClaudeReady() to poll for \"\u003e \" prompt (already exists in tmux.go)\n - Once ready, sends gt prime + assignment nudge\n - Clears pending_prime flag\n\n## Implementation\n\n### spawn.go changes\n- Remove the 3-second sleep (line 368)\n- Remove the NudgeSession call (lines 375-383)\n- Instead: Update polecat state with pending_prime=true\n\n### Polecat state addition\nstatus: assigned, pending_prime: true, issue: gt-xxx\n\n### Deacon patrol addition\nAdd step between inbox-check and plugin-run:\nprime-pending-workers: Check all rigs for workers marked pending_prime.\nFor each pending worker: WaitForClaudeReady(60s), then gt prime + nudge\n\n### Benefits\n- No race condition - we poll until actually ready\n- Deacon already does health checks - priming is natural fit\n- Works for polecats, witnesses, refineries, crew (unified approach)\n- Timeout handling built in\n\n## Depends on\n- Existing WaitForClaudeReady() in tmux.go (lines 384-403)","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-22T17:19:33.589909-08:00","updated_at":"2025-12-22T17:31:27.458838-08:00","closed_at":"2025-12-22T17:31:27.458838-08:00","close_reason":"Implemented: spawn no longer nudges, deacon patrol has trigger-pending-spawns step"} {"id":"gt-69hf","title":"Test Patrol Parent","description":"Test parent for Christmas Ornament pattern","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T00:23:28.795987-08:00","updated_at":"2025-12-25T01:33:00.747267-08:00","closed_at":"2025-12-25T01:33:00.747267-08:00","close_reason":"Test pollution cleanup"} @@ -250,6 +270,7 @@ {"id":"gt-6k8","title":"Interrupt vs Queue mail semantics","description":"Add priority/delivery semantics to mail messages.\n\n## Semantics\n\n| Type | Delivery | Use Case |\n|------|----------|----------|\n| Interrupt | tmux send-keys | Lifecycle, URGENT, stuck detection |\n| Queue | Create message only | Normal mail, status, heartbeat |\n\n## Implementation\n\n- `bd mail send --interrupt` uses tmux send-keys notification\n- Default is queue (agent checks with `gt mail check`)\n- Urgent flag on messages for interrupt delivery\n\n## Agent Side\n\n- `gt mail check --quiet` - non-blocking check for queued mail\n- `gt mail wait` - block until mail arrives (for idle agents)\n- Heartbeats become queued, agent checks at natural breakpoints","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-18T14:19:28.408196-08:00","updated_at":"2025-12-19T17:22:52.555329-08:00","closed_at":"2025-12-19T16:31:00.450061-08:00","dependencies":[{"issue_id":"gt-6k8","depends_on_id":"gt-99m","type":"blocks","created_at":"2025-12-18T14:19:46.529252-08:00","created_by":"daemon"}]} {"id":"gt-6l2au","title":"Digest: mol-deacon-patrol","description":"Patrol 14: All clear","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T00:04:09.604588-08:00","updated_at":"2025-12-25T00:04:09.604588-08:00","closed_at":"2025-12-25T00:04:09.604555-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-6lt3","title":"Work on ga-rd4: Add gt polecat status command. Show detai...","description":"Work on ga-rd4: Add gt polecat status command. Show detailed polecat status including current issue, session state, last activity time. When done, submit MR (not PR) to integration branch for Refinery.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-19T22:58:26.320627-08:00","updated_at":"2025-12-19T23:23:07.448718-08:00","closed_at":"2025-12-19T23:23:07.448718-08:00"} +{"id":"gt-6lwa7","title":"Digest: mol-deacon-patrol","description":"Patrol 1: All healthy, no messages","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T13:50:55.047597-08:00","updated_at":"2025-12-25T13:50:55.047597-08:00","closed_at":"2025-12-25T13:50:55.047565-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-6lwa7","depends_on_id":"gt-37i47","type":"parent-child","created_at":"2025-12-25T13:50:55.048352-08:00","created_by":"deacon"}]} {"id":"gt-6m3e","title":"bd create --dedup: semantic deduplication before issue creation","description":"Before creating issue, check for semantic duplicates using AI similarity.\n\n**From VC**: internal/deduplication/ - AI-powered batch comparison. ~300 lines.\nVC had issue pollution problem: 438 issues with ~350+ spam because no early dedup.\n\n**Gas Town implementation**: CLI flag on bd create:\n```bash\nbd create --dedup --title=\"Fix auth bug\" --description=\"...\"\n```\n\nChecks recent issues (7-day window) with AI similarity. If confidence \u003e0.85, warns or blocks.\n\n**Value**: Prevents pollution from parallel workers discovering same issues.\n\n**VC lesson**: 115 issues filed in single day (Nov 2) because supervisor over-discovered without dedup. Rate limiting + dedup are essential.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-20T20:30:17.305652-08:00","updated_at":"2025-12-20T20:30:17.305652-08:00","dependencies":[{"issue_id":"gt-6m3e","depends_on_id":"gt-zhpa","type":"parent-child","created_at":"2025-12-20T20:30:27.599806-08:00","created_by":"daemon"}]} {"id":"gt-6n13","title":"Competing molecule instantiation mechanisms need resolution","description":"Documentation describes 4 different molecule instantiation methods:\n1. bd mol bond (beads-based, in molecules.md)\n2. gt sling (proposed in sling-design.md)\n3. gt swarm (implemented in code)\n4. gt molecule instantiate (in architecture.md)\n\nRole prompts use different methods:\n- Deacon: bd mol spawn\n- Refinery: gt mol bond\n- Polecat: bd mol current\n\nNeed to:\n1. Decide canonical mechanism\n2. Update all role prompts to use it\n3. Remove/deprecate alternatives\n4. Update architecture docs","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-24T12:50:56.093813-08:00","updated_at":"2025-12-24T23:48:51.018169-08:00","closed_at":"2025-12-24T23:48:51.018169-08:00","close_reason":"Superseded by gt-mbyy: comprehensive CLI API audit that covers molecule mechanisms plus full command structure review","dependencies":[{"issue_id":"gt-6n13","depends_on_id":"gt-jo9n","type":"blocks","created_at":"2025-12-24T12:52:05.105811-08:00","created_by":"daemon"}]} {"id":"gt-6n1cy","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-u2vg - The source issue ID being worked on","status":"closed","priority":2,"issue_type":"epic","assignee":"gastown/furiosa","created_at":"2025-12-25T01:53:37.309868-08:00","updated_at":"2025-12-25T11:13:30.882007-08:00","closed_at":"2025-12-25T11:13:30.882007-08:00","close_reason":"Orphaned - furiosa polecat not running"} @@ -258,10 +279,15 @@ {"id":"gt-6n8fy","title":"Digest: mol-deacon-patrol","description":"Patrol 14: Nominal","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T23:51:51.349775-08:00","updated_at":"2025-12-24T23:51:51.349775-08:00","closed_at":"2025-12-24T23:51:51.349742-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-6qdii","title":"Digest: mol-deacon-patrol","description":"Patrol 13: Nominal","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T23:51:28.696535-08:00","updated_at":"2025-12-24T23:51:28.696535-08:00","closed_at":"2025-12-24T23:51:28.696507-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-6qld","title":"Daemon should auto-start as part of town bootstrap","description":"The Go daemon should be started automatically when the town boots up (mol-gastown-boot). Currently it requires manual 'gt daemon start'.\n\nThe daemon is critical infrastructure - it monitors the Deacon and nudges it when naked. Without it, the Deacon patrol loop doesn't run.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T13:16:52.000929-08:00","updated_at":"2025-12-23T13:16:52.000929-08:00"} +{"id":"gt-6t0","title":"gt swarm: Not discovering tasks from epic dependents","description":"gt swarm create/start shows '0 tasks loaded' even when epic has dependents.\n\nRepro:\n1. Create epic gt-hw6\n2. Create tasks and add deps: bd dep add gt-xxx gt-hw6\n3. gt swarm create gastown --epic gt-hw6 --worker Toast\n4. Swarm shows 'Tasks: 0'\n\nExpected: Swarm should discover tasks that depend on the epic.\nActual: Shows '(no tasks loaded)'","status":"tombstone","priority":0,"issue_type":"bug","created_at":"2025-12-17T22:25:41.653628-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} +{"id":"gt-6tf","title":"Implement gt harness create command","description":"Add scaffolding command to create a new harness:\n- gt harness create [path]\n- Creates config/, mayor/, .beads/redirect (optional)\n- Optionally initializes git\n- Generates CLAUDE.md with Mayor role\n- Could also offer a template repo alternative","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-17T17:15:34.342552-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-6tf","depends_on_id":"gt-cr9","type":"blocks","created_at":"2025-12-17T17:15:51.845578-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-6vks","title":"Bug: LIFECYCLE messages use literal \u003crig\u003e placeholder","description":"Found stale LIFECYCLE messages addressed to @\u003crig\u003e/witness instead of actual rig names like @gastown/witness. Template substitution not happening.\n\nExamples found:\n- gm-bay: LIFECYCLE: polecat requesting shutdown (to @\u003crig\u003e/witness)\n- gm-7du, gm-94e, gm-u5x, gm-89b: same issue\n\nFix: Ensure rig name is substituted in lifecycle mail templates.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-20T03:12:28.146613-08:00","updated_at":"2025-12-20T13:23:08.002122-08:00","closed_at":"2025-12-20T13:23:08.002122-08:00"} {"id":"gt-6y5b","title":"Polecat mood command and status line display","description":"CLI and status line support for polecat mood.\n\n## CLI Command\n```\ngt polecat mood \u003cname\u003e \u003cemoji\u003e # Set mood\ngt polecat mood \u003cname\u003e # Get mood\n```\n\nSets GT_MOOD environment variable in the polecat's tmux session.\n\n## Status Line Integration\nUpdate runWorkerStatusLine() to read mood:\n```go\nmood, _ := t.GetEnvironment(session, \"GT_MOOD\")\nif mood != \"\" {\n icon = mood // Use mood emoji instead of default\n} else {\n icon = AgentTypeIcons[AgentPolecat] // Fallback to 😺\n}\n```\n\n## Storage\nMood stored in tmux session environment (ephemeral, per-session).\nNo persistence needed - mood is reassessed each patrol cycle.\n\nDepends on: gt-u818 (plugin system)","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-21T16:17:14.111807-08:00","updated_at":"2025-12-21T16:17:14.111807-08:00","dependencies":[{"issue_id":"gt-6y5b","depends_on_id":"gt-u818","type":"blocks","created_at":"2025-12-21T16:17:20.53466-08:00","created_by":"daemon"}]} {"id":"gt-6y8u","title":"Deacon patrol: Janitorial cleanup patterns","description":"Patterns discovered during town cleanup that could be automated in Deacon's patrol step:\n\n## Stale Issue Detection\n\n1. **Stale in_progress issues** - Issues marked in_progress for \u003eN days without activity\n - Example: 9 issues in_progress, some likely complete\n - Action: Report list, optionally nudge assignee\n\n2. **Duplicate issues** - Same title with different IDs\n - Example: gt-87jz and gt-qp2w both 'mol-witness-patrol'\n - Action: Flag for human review\n\n3. **Orphaned issues** - Referenced in commits but still open\n - bd doctor already detects: 'hq-65jk (commit f9e9034d)'\n - Action: Report, suggest closing\n\n4. **Stale test messages** - Messages with 'test' in title older than N days\n - Example: gt-54kn, gt-1ero, gt-nriy, gt-wrw2, gt-pnu4, gt-g1ud, gt-b5sh\n - Action: Auto-close or flag\n\n## File System Cleanup\n\n5. **Log file accumulation** - daemon.log and rotated .log.gz files\n - Found 8+ log files across rigs\n - Action: Rotate, compress, delete old (\u003e7 days)\n\n6. **Beads directory size** - Town .beads/ is 65MB\n - Action: Monitor growth, alert on threshold\n\n## Database Health\n\n7. **Legacy database fingerprints** - Older DBs without fingerprint\n - bd doctor warns about this\n - Action: Report, suggest migration\n\n## Cross-Reference Integrity\n\n8. **Gastown↔Beads issue sync** - Issues filed in wrong project\n - Example: gt-8tmz.* describes Beads work but no bd-* issues\n - Action: Detect cross-references, verify both sides exist\n\n## Implementation Notes\n\nThese could be added to mol-deacon-patrol.formula.yaml as cleanup substeps:\n- Daily: Log rotation, stale issue report\n- Weekly: Duplicate detection, orphan check\n- Monthly: Size monitoring, archive old closed issues","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-24T13:25:03.212307-08:00","updated_at":"2025-12-24T13:25:03.212307-08:00","dependencies":[{"issue_id":"gt-6y8u","depends_on_id":"gt-ingm","type":"relates-to","created_at":"2025-12-24T13:25:18.850583-08:00","created_by":"daemon"}]} {"id":"gt-6yq9","title":"Digest: mol-deacon-patrol @ 2025-12-24 19:24","description":"Patrol 8: quiet, 8 sessions healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T19:24:22.913616-08:00","updated_at":"2025-12-24T19:24:22.913616-08:00","closed_at":"2025-12-24T19:24:22.913554-08:00","close_reason":"Squashed from wisp gt-4fy (9 issues)"} +{"id":"gt-6z2","title":"Test Epic: GGT MVP Validation","status":"tombstone","priority":0,"issue_type":"epic","created_at":"2025-12-16T21:57:37.355269-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"epic"} +{"id":"gt-6z2.1","title":"Test Task 1: Add comment to gt.go","status":"tombstone","priority":0,"issue_type":"task","created_at":"2025-12-16T21:57:43.554166-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-6z2.1","depends_on_id":"gt-6z2","type":"parent-child","created_at":"2025-12-16T21:57:43.55748-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-6z2.2","title":"Test Task 2: Add comment to version.go","status":"tombstone","priority":0,"issue_type":"task","created_at":"2025-12-16T21:57:43.693217-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-6z2.2","depends_on_id":"gt-6z2","type":"parent-child","created_at":"2025-12-16T21:57:43.69361-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-6z9m","title":"Test7","description":"Test with fixed workdir","status":"closed","priority":2,"issue_type":"message","created_at":"2025-12-20T17:50:15.993225-08:00","updated_at":"2025-12-20T17:51:17.265938-08:00","closed_at":"2025-12-20T17:51:17.265938-08:00","labels":["from:gastown-max","thread:thread-879ca123f27d"]} {"id":"gt-6zis","title":"Digest: mol-deacon-patrol","description":"Patrol #13","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T22:24:54.316471-08:00","updated_at":"2025-12-24T22:24:54.316471-08:00","closed_at":"2025-12-24T22:24:54.316436-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-70b3","title":"detectSender() doesn't recognize crew workers","description":"## Problem\n\n`detectSender()` in mail.go only detects polecats, not crew workers.\n\n## Current Code (line 445)\n\n```go\n// If in a rig's polecats directory, extract address\nif strings.Contains(cwd, \"/polecats/\") {\n // extract rig/polecat\n}\n\n// Default to mayor\nreturn \"mayor/\"\n```\n\n## Symptom\n\nEmma (crew worker at `/Users/stevey/gt/beads/crew/emma`) runs:\n- `gt mail inbox` → checks `mayor/` inbox (wrong!)\n- Should check `beads/emma` or `beads/crew/emma`\n\n## Fix\n\nAdd crew detection:\n```go\n// If in a rig's crew directory, extract address \nif strings.Contains(cwd, \"/crew/\") {\n parts := strings.Split(cwd, \"/crew/\")\n if len(parts) \u003e= 2 {\n rigPath := parts[0]\n crewName := strings.Split(parts[1], \"/\")[0]\n rigName := filepath.Base(rigPath)\n return fmt.Sprintf(\"%s/%s\", rigName, crewName)\n }\n}\n```\n\n## Also Check\n\n- `gt prime` correctly detects role, so there may be another detection function that works\n- Should unify detection logic","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-18T21:40:26.520559-08:00","updated_at":"2025-12-18T21:55:54.679969-08:00","closed_at":"2025-12-18T21:55:54.679969-08:00","dependencies":[{"issue_id":"gt-70b3","depends_on_id":"gt-l4gm","type":"blocks","created_at":"2025-12-18T21:50:04.812663-08:00","created_by":"daemon"}]} @@ -291,9 +317,13 @@ {"id":"gt-7sqi","title":"Refactor: Extract common manager creation boilerplate","description":"Five nearly identical functions exist for creating managers:\n- getPolecatManager (polecat.go:241)\n- getSessionManager (session.go:183)\n- getCrewManager (crew_helpers.go:44)\n- getRefineryManager (refinery.go:116)\n- getWitnessManager (witness.go:102)\n\nAll follow the same pattern: find workspace, load config, get rig, create manager. Should extract to a common helper that takes a factory function.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T21:34:30.495275-08:00","updated_at":"2025-12-21T21:45:39.65029-08:00","closed_at":"2025-12-21T21:45:39.65029-08:00","close_reason":"Extracted common getRig() helper in internal/cmd/rig_helpers.go, updated all 5 manager creation functions to use it"} {"id":"gt-7tt8","title":"Default crew name should be something better than 'main'","description":"When creating a new rig, the default crew worker name is 'main'. This is confusing since:\n\n1. 'main' is also the git branch name\n2. It doesn't convey that this is the user's personal workspace\n3. Crew names should feel more personal/distinct\n\nConsider alternatives like:\n- 'home' - the user's home base\n- 'desk' - their personal desk\n- 'joe/max/etc' - actual name-based defaults\n- Let user pick during rig init","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-21T16:46:51.049367-08:00","updated_at":"2025-12-21T16:46:59.133599-08:00"} {"id":"gt-7wcf","title":"README: Update Install section for homebrew/npm","description":"README currently shows:\n go install github.com/steveyegge/gastown/cmd/gt@latest\n\nBut users will install via homebrew or npm. Update to show:\n brew install gastown\n # or\n npm install -g @anthropic/gastown\n\nAlso add prerequisites section (tmux, Claude Code CLI).","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-24T13:04:51.751097-08:00","updated_at":"2025-12-24T23:27:52.2809-08:00","closed_at":"2025-12-24T23:27:52.2809-08:00","close_reason":"Updated Install section with prerequisites and future package manager options","dependencies":[{"issue_id":"gt-7wcf","depends_on_id":"gt-jo9n","type":"blocks","created_at":"2025-12-24T13:05:00.100253-08:00","created_by":"daemon"}]} +{"id":"gt-7we","title":"Swarms of One: Lightweight single-worker task dispatch","description":"Design and implement a lightweight pattern for firing off single workers to handle tasks without full swarm overhead.\n\n## Context\n\nCurrently we have:\n- town spawn: Creates a polecat in a rig with issue assignment\n- Swarms (sw-*): Full lifecycle tracking with manifest, state, events, reports\n- Ephemeral rigs (rig-*): Temporary worker groups for swarms\n\nWhat's missing: A simple way to say 'fire off a worker to do X' without swarm ceremony.\n\n## Design Questions\n\n1. Should this be a new command like 'gt fire' or an option on existing commands?\n2. Should single tasks still get swarm IDs (sw-N) for consistency/queryability?\n3. Should it default to creating new workers or support --reuse for idle polecats?\n4. How does this relate to crew workers (gt-cik)?\n\n## Possible Interface\n\ngt fire --rig gastown --issue gt-xyz [--prompt '...']\ngt fire gastown/QuickTask --issue gt-xyz\n\n## Related\n\n- gt-cik: Overseer Crew (user-managed persistent workspaces)\n- gt-kmn: Swarm System epic","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-16T16:51:02.716629-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-7xtn","title":"Bug: MRs appearing in bd ready output","description":"merge-request beads are showing up in `bd ready` output alongside actual work items.\n\n## Problem\n`bd ready` is meant to show work available for polecats to claim. MRs are internal workflow items processed by the Refinery, not polecat work.\n\n## Example\n```\n| P1 | merge-request | bd-3zzh | Merge: bd-tvu3 |\n| P1 | merge-request | bd-fcl1 | Merge: bd-au0.5 |\n```\n\n## Possible Fixes\n1. **Filter by type** - `bd ready` excludes type=merge-request, type=gate, type=molecule\n2. **Set assignee on submit** - MR assigned to refinery/ when created, so not 'unassigned'\n3. **Set status=in_progress** - MR starts in_progress since it's queued for processing\n\n## Related\n- gate beads also showing (bd-hyp6, bd-wu62) - same issue","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-23T14:38:29.507419-08:00","updated_at":"2025-12-23T15:05:34.037593-08:00","closed_at":"2025-12-23T15:05:34.037593-08:00","close_reason":"Fixed in beads commit 33105c96 - workflow types excluded from bd ready"} +{"id":"gt-82y","title":"Design: Swarm shutdown and worker cleanup","description":"Design for graceful swarm shutdown, worker cleanup, and session cycling.\n\n## Key Decisions\n\n1. Pre-kill verification uses model intelligence (not framework rules)\n2. Witness can request restart when context filling (mail self, exit)\n3. Mayor NOT involved in per-worker cleanup (Witness responsibility)\n4. Clear responsibility boundaries between Mayor/Witness/Polecat\n\n## Subtasks (implementation)\n\n- gt-sd6: Polecat decommission checklist prompting\n- gt-f8v: Witness pre-kill verification protocol\n- gt-eu9: Witness session cycling and handoff\n- gt-gl2: Mayor vs Witness cleanup responsibilities\n\n**Design complete.** Each subtask has full specification in its description.","status":"tombstone","priority":1,"issue_type":"epic","created_at":"2025-12-15T19:47:44.936374-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"epic"} {"id":"gt-83k0","title":"mol-witness-patrol molecule definition","description":"Create mol-witness-patrol in builtin_molecules.go.\n\n## Steps (10 total)\n1. inbox-check - Process witness mail (lifecycle, help requests)\n2. load-state - Read handoff bead, get nudge counts\n3. survey-workers - gt polecat list, categorize by status\n4. inspect-workers - tmux capture-pane for each 'working' polecat\n5. decide-actions - Apply nudge matrix, queue actions\n6. execute-actions - Nudge, kill, or escalate as decided\n7. save-state - Update handoff bead with new states\n8. generate-summary - Summarize cycle for digest\n9. context-check - Check own context usage\n10. burn-or-loop - Squash wisp, then loop or cycle session\n\n## Key Behaviors\n- Uses wisp storage (.beads-wisp/)\n- Reads/writes witness handoff bead for state persistence\n- Progressive nudging (3 levels before escalate)\n- Pre-kill verification before killing polecats\n\n## Reference\n- See prompts/roles/witness.md for protocol details\n- See mol-refinery-patrol for similar structure\n- Parent epic: gt-aqd8","status":"closed","priority":1,"issue_type":"task","assignee":"gastown/furiosa","created_at":"2025-12-22T16:42:43.697249-08:00","updated_at":"2025-12-22T23:34:29.174842-08:00","closed_at":"2025-12-22T23:34:29.174842-08:00","close_reason":"Implemented mol-witness-patrol with 10 steps in builtin_molecules.go"} {"id":"gt-83uf","title":"Digest: mol-deacon-patrol","description":"Patrol 8","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T23:08:44.96962-08:00","updated_at":"2025-12-24T23:08:44.96962-08:00","closed_at":"2025-12-24T23:08:44.969592-08:00","close_reason":"Squashed from 8 wisps"} +{"id":"gt-85a","title":"gt spawn: Not injecting work instructions to session","description":"gt spawn starts session but doesn't inject the issue assignment.\n\nRepro:\n1. gt spawn gastown/Toast --issue gt-2ux\n2. Session starts but polecat just sees Claude prompt\n3. No issue context injected\n\nExpected: Polecat should receive issue details automatically.\nActual: Polecat sits at blank prompt, needs manual injection.","status":"tombstone","priority":0,"issue_type":"bug","created_at":"2025-12-17T22:28:02.583003-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} +{"id":"gt-86w","title":"CLI: doctor diagnostics and auto-repair","description":"GGT completely lacks the doctor command which is critical for debugging.\n\nRequired Commands:\n- gt doctor [\u003crig\u003e] - Run diagnostic checks\n- gt doctor --fix - Auto-repair common issues\n\nChecks to Implement:\nWorkspace Level: Config validity, Mayor mailbox, Rig registry\nRig Level: Git state, clone health, witness/refinery presence, beads sync\nSwarm Level: Stuck detection, zombie sessions, heartbeat health\n\nPGT Reference: gastown-py/src/gastown/cli/dashboard_cmd.py","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-16T14:46:34.721484-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-87jz","title":"mol-witness-patrol","description":"Per-rig worker monitor patrol loop using the Christmas Ornament pattern.\n\nThe Witness is the Pit Boss for your rig. You watch polecats, nudge them toward\ncompletion, verify clean git state before kills, and escalate stuck workers.\n\n**You do NOT do implementation work.** Your job is oversight, not coding.\n\n## The Christmas Ornament Shape\n\nThis molecule uses dynamic bonding to create inspection arms per-polecat:\n\n```\n ★ mol-witness-patrol (trunk)\n /|\\\n ┌─────┘ │ └─────┐\n PREFLIGHT DISCOVERY CLEANUP\n │ │ │\n ┌───┴───┐ ┌─┴─┐ ┌───┴───┐\n │inbox │ │sur│ │aggreg │\n │refnry │ │vey│ │save │\n │load │ └─┬─┘ │summary│\n └───────┘ │ │contxt │\n │ │loop │\n ┌─────────┼─────────┐ └───────┘\n │ │ │\n ● ● ● mol-polecat-arm (dynamic)\n ace nux toast\n │ │ │\n ┌──┴──┐ ┌──┴──┐ ┌──┴──┐\n │cap │ │cap │ │cap │\n │ass │ │ass │ │ass │\n │dec │ │dec │ │dec │\n │exec │ │exec │ │exec │\n └──┬──┘ └──┬──┘ └──┬──┘\n │ │ │\n └─────────┴─────────┘\n │\n ⬣ base (cleanup)\n```\n\n## Phases\n\n### PREFLIGHT (fixed steps)\n1. inbox-check - Process lifecycle requests, help messages\n2. check-refinery - Ensure MQ is alive and processing\n3. load-state - Read persistent state (nudge counts, etc.)\n\n### DISCOVERY (spawns dynamic arms)\n4. survey-workers - List polecats, bond mol-polecat-arm per polecat\n5. run-plugins - Bond mol-plugin-runner for each witness plugin\n\n### CLEANUP (gate + fixed steps)\n6. aggregate - GATE: WaitsFor all arms + plugins to complete\n7. save-state - Persist nudge counts, action log\n8. generate-summary - Create digest content\n9. context-check - Check if context is high\n10. burn-or-loop - Squash/burn wisp, then loop or exit\n\n## Dynamic Arms\n\nEach polecat gets mol-polecat-arm bonded as a wisp child:\n- capture - Capture tmux output\n- assess - Categorize state (working/idle/error/done)\n- load-history - Get nudge counts for this polecat\n- decide - Apply nudge matrix\n- execute - Take action (nudge/kill/escalate/none)\n\nArms run in PARALLEL. The aggregate step waits for all to complete.\n\n## Activity Feed\n\nThis design enables real-time visibility:\n\n```\n[14:32:08] + patrol-x7k.arm-ace bonded (5 steps)\n[14:32:09] → patrol-x7k.arm-ace.capture in_progress\n[14:32:10] ✓ patrol-x7k.arm-ace.capture completed\n[14:32:14] ✓ patrol-x7k.arm-ace.decide completed (action: nudge-1)\n[14:32:17] ✓ patrol-x7k.arm-ace COMPLETE\n```\n\n## Storage\n\n- Wisp storage: .beads-wisp/ (ephemeral, gitignored)\n- Persistent state: witness handoff bead (nudge counts, etc.)\n- Digests: Squashed summaries in permanent beads\n\n## Dependencies\n\n- bd-xo1o: Dynamic Molecule Bonding epic (in beads rig)\n - bd mol bond with variable substitution\n - WaitsFor directive for fanout gates\n - Activity feed query\n\nLabels: [template, christmas-ornament]","status":"in_progress","priority":1,"issue_type":"epic","created_at":"2025-12-23T16:23:42.025546-08:00","updated_at":"2025-12-23T16:23:42.79036-08:00"} {"id":"gt-8a0h","title":"Add compaction recovery protocol to role templates","description":"After context compaction (summarization), agents may be disoriented.\n\nAdd guidance to recognize and recover:\n- 'If you feel you've lost earlier context or are disoriented, run: gt prime'\n- 'This re-injects your role, current work, and pending messages'\n- 'It's safe to prime multiple times - it just outputs context'\n\nThis is the fallback path when self-check is missed and compaction happens.\nCompaction isn't catastrophic if priming is robust.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T01:46:21.959626-08:00","updated_at":"2025-12-23T14:27:07.466696-08:00"} {"id":"gt-8bes","title":"Review: Witness patrol template changes (gt-h1n5)","description":"Polecat rictus implemented significant witness.md.tmpl changes: banners, wisp-based execution, handoff bead attachment, loop-or-exit, patrol summary. Review for correctness and consistency with deacon pattern.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T19:57:38.242943-08:00","updated_at":"2025-12-23T19:57:38.242943-08:00"} @@ -346,7 +376,7 @@ {"id":"gt-8tmz.4","title":"Control flow: loop, gate, branch","description":"Implement control flow operators:\n- loop N { body } - fixed iteration\n- loop until COND { body } - conditional iteration with max bound\n- gate COND { body } - wait for condition\n- branch from/steps/join - parallel paths that rejoin\n\nConditions evaluated mechanically (step status, output fields).","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T18:04:33.194896-08:00","updated_at":"2025-12-23T18:04:33.194896-08:00","dependencies":[{"issue_id":"gt-8tmz.4","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-23T18:04:33.196543-08:00","created_by":"daemon"},{"issue_id":"gt-8tmz.4","depends_on_id":"gt-8tmz.7","type":"blocks","created_at":"2025-12-23T18:04:49.985527-08:00","created_by":"daemon"}]} {"id":"gt-8tmz.5","title":"Aspects: AOP cross-cutting concerns","description":"Implement aspect-oriented composition:\n- Define aspects with pointcuts and advice\n- Apply aspects at bond time: bd bond mol --with-aspect security\n- Pointcuts use glob patterns to match join points\n\nEnables security-audit, logging, etc. as reusable concerns.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T18:04:34.128562-08:00","updated_at":"2025-12-25T12:15:53.16092-08:00","closed_at":"2025-12-25T12:15:53.16092-08:00","close_reason":"Aspect composition implemented: compose.aspects field, applied during cooking. Demo: shiny-secure.formula.json","dependencies":[{"issue_id":"gt-8tmz.5","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-23T18:04:34.130564-08:00","created_by":"daemon"},{"issue_id":"gt-8tmz.5","depends_on_id":"gt-8tmz.2","type":"blocks","created_at":"2025-12-23T18:04:49.898125-08:00","created_by":"daemon"},{"issue_id":"gt-8tmz.5","depends_on_id":"gt-8tmz.6","type":"blocks","created_at":"2025-12-23T18:48:18.802195-08:00","created_by":"daemon"}]} {"id":"gt-8tmz.6","title":"Selection operators: glob, filter, children","description":"Implement selection operators for targeting:\n- step(id) - specific step\n- glob(pattern) - pattern match (*.implement)\n- filter(predicate) - status/output predicates\n- children(step), descendants(step) - tree traversal\n\nUsed by advice, expansion, and aspects for targeting.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T18:04:35.447482-08:00","updated_at":"2025-12-25T12:10:31.184745-08:00","closed_at":"2025-12-25T12:10:31.184745-08:00","close_reason":"Core selection operators implemented: MatchGlob (glob patterns), MatchPointcut (type, label), MatchAnyPointcut. Advanced operators (filter, children, descendants) can be added as needed.","dependencies":[{"issue_id":"gt-8tmz.6","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-23T18:04:35.449213-08:00","created_by":"daemon"}]} -{"id":"gt-8tmz.7","title":"Condition evaluator for gates and loops","description":"Implement mechanical condition evaluation:\n- step.status == 'complete'\n- step.output.field == value\n- children(step).all(status == 'complete')\n- file.exists(path), env.VAR\n\nKeep decidable: no arbitrary code, bounded evaluation.","status":"in_progress","priority":2,"issue_type":"task","created_at":"2025-12-23T18:04:36.820385-08:00","updated_at":"2025-12-25T13:49:24.257494-08:00","dependencies":[{"issue_id":"gt-8tmz.7","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-23T18:04:36.820807-08:00","created_by":"daemon"}]} +{"id":"gt-8tmz.7","title":"Condition evaluator for gates and loops","description":"Implement mechanical condition evaluation:\n- step.status == 'complete'\n- step.output.field == value\n- children(step).all(status == 'complete')\n- file.exists(path), env.VAR\n\nKeep decidable: no arbitrary code, bounded evaluation.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T18:04:36.820385-08:00","updated_at":"2025-12-25T13:54:36.414222-08:00","closed_at":"2025-12-25T13:54:36.414222-08:00","close_reason":"Implemented condition evaluator in beads formula package","dependencies":[{"issue_id":"gt-8tmz.7","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-23T18:04:36.820807-08:00","created_by":"daemon"}]} {"id":"gt-8tmz.8","title":"Runtime dynamic expansion (for-each)","description":"Implement runtime expansion for discovered work:\n- on-complete: for-each: output.items\n- Bonds N instances based on step output\n- Christmas Ornament pattern support\n\nEnables dynamic survey-workers → polecat-arm bonding.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T18:04:37.895524-08:00","updated_at":"2025-12-23T18:04:37.895524-08:00","dependencies":[{"issue_id":"gt-8tmz.8","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-23T18:04:37.897159-08:00","created_by":"daemon"}]} {"id":"gt-8tmz.9","title":"gt sling --on flag for wisp scaffolding","description":"Add --on flag to gt sling for applying forms to existing work:\n gt sling shiny gastown/Toast --on gt-abc123\n\nWhen --on is specified, implies --wisp (scaffolding existing work).\nThe form shapes execution of the target bead.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T18:04:39.209305-08:00","updated_at":"2025-12-25T02:00:34.261738-08:00","closed_at":"2025-12-25T02:00:34.261738-08:00","close_reason":"Implemented --on flag for formula scaffolding","dependencies":[{"issue_id":"gt-8tmz.9","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-23T18:04:39.212264-08:00","created_by":"daemon"}]} {"id":"gt-8v8","title":"Polecat cleanup should refuse to lose uncommitted work","description":"The system should stubbornly refuse to lose work from a polecat.\n\n## Current Problem\n\n- gt spawn --force bypasses safety checks\n- gt shutdown doesn't check for uncommitted work\n- Witness cleanup doesn't check git status\n\n## Desired Behavior\n\nBefore any polecat cleanup, check:\n1. git status - any uncommitted changes?\n2. git stash list - any stashes?\n3. Unpushed commits on branch?\n4. Unsynced beads changes?\n\nIf ANY of these exist:\n- REFUSE to clean up\n- Print clear error message listing what would be lost\n- Require explicit --nuclear flag to force (not just --force)\n\n## Implementation\n\nAdd to cleanupPolecat() in witness/manager.go:\n```go\nfunc (m *Manager) checkUncommittedWork(polecatName string) error {\n dir := m.polecatDir(polecatName)\n \n // Check git status\n if hasUncommitted, _ := git.HasUncommittedChanges(dir); hasUncommitted {\n return fmt.Errorf(\"polecat %s has uncommitted changes\", polecatName)\n }\n \n // Check stashes\n if stashCount, _ := git.StashCount(dir); stashCount \u003e 0 {\n return fmt.Errorf(\"polecat %s has %d stashes\", polecatName, stashCount)\n }\n \n // Check unpushed commits\n if unpushed, _ := git.UnpushedCommits(dir); unpushed \u003e 0 {\n return fmt.Errorf(\"polecat %s has %d unpushed commits\", polecatName, unpushed)\n }\n \n return nil\n}\n```\n\n## Affected Commands\n\n- gt shutdown\n- gt rig shutdown\n- Witness cleanup\n- gt spawn --force (should warn if overwriting)","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-20T15:23:09.043717-08:00","updated_at":"2025-12-20T17:42:39.582711-08:00","closed_at":"2025-12-20T15:55:10.658555-08:00"} @@ -356,6 +386,7 @@ {"id":"gt-92l","title":"Daemon: integration test with real lifecycle","description":"Need an end-to-end test that:\n1. Starts daemon\n2. Starts a test agent session\n3. Sends lifecycle request to daemon\n4. Verifies session was killed and restarted\n5. Cleans up\n\nCould use a mock 'agent' that's just a shell script.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-18T13:38:17.261096-08:00","updated_at":"2025-12-19T17:22:52.555739-08:00","closed_at":"2025-12-19T16:31:23.543204-08:00","dependencies":[{"issue_id":"gt-92l","depends_on_id":"gt-99m","type":"blocks","created_at":"2025-12-18T13:38:26.962642-08:00","created_by":"daemon"}]} {"id":"gt-92of","title":"Consider splitting large files (800+ lines)","description":"Several files are getting large and may benefit from splitting:\n- internal/beads/beads.go (990 lines)\n- internal/cmd/molecule.go (981 lines)\n- internal/refinery/manager.go (934 lines)\n- internal/beads/beads_test.go (883 lines)\n- internal/cmd/polecat.go (836 lines)\n- internal/witness/manager.go (808 lines)\n- internal/cmd/mail.go (804 lines)\n\nFor .go files, consider extracting logical subsystems. For test files, this is lower priority.","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-21T21:35:09.138406-08:00","updated_at":"2025-12-21T22:20:00.721055-08:00","closed_at":"2025-12-21T22:20:00.721055-08:00","close_reason":"Deferred to post-launch. Large files (800+ lines) work correctly; splitting is refactoring for maintainability, not functional. Can be addressed incrementally after launch."} {"id":"gt-93ha","title":"Digest: mol-deacon-patrol","description":"Patrol: slit handoff (landing protocol), polecats cleaned (0 now), 4 witness/refineries up","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-23T01:37:17.776898-08:00","updated_at":"2025-12-23T01:37:17.776898-08:00","closed_at":"2025-12-23T01:37:17.776855-08:00","close_reason":"Squashed from 5 wisps"} +{"id":"gt-95x","title":"Remove stale migration docs from gastown-py","description":"The gastown-py repo has migration-related documentation that is now misinformation since we have made design decisions. Remove or clearly mark as obsolete: any docs about migration paths, old architecture assumptions, or superseded designs.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-15T20:24:08.642373-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-96jv2","title":"Digest: mol-deacon-patrol","description":"Patrol 16: All agents healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T04:26:46.271877-08:00","updated_at":"2025-12-25T04:26:46.271877-08:00","closed_at":"2025-12-25T04:26:46.271841-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-974","title":"Refinery background daemon mode","description":"The refinery 'gt refinery start' command only works in foreground mode (--foreground). Need to implement background daemon mode for production use.\n\nOptions:\n1. Use a separate tmux session for the refinery\n2. Implement proper daemonization\n3. Use Claude Code session for the refinery agent\n\nFor MVP, option 1 (tmux session) is probably simplest.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-16T22:08:04.799753-08:00","updated_at":"2025-12-19T14:27:33.858745-08:00","closed_at":"2025-12-19T14:27:33.858745-08:00"} {"id":"gt-975","title":"Molecule execution support for polecats and crew","description":"Enable agents to run bonded molecules through the full lifecycle.\n\n## The Model\n1. BOND - bd mol bond \u003ctemplate\u003e --assignee \u003cidentity\u003e\n Creates concrete issues, assigns root to agent\n\n2. DISCOVER - Agent finds assigned molecules via bd ready\n DAG structure shows unblocked steps\n\n3. WORK - Agent works through DAG, closing steps as done\n Can delegate children to lower-tier agents (haiku)\n\n4. SURVIVE - Agent dies → beads persist\n Any agent resumes from DAG state\n\n5. SUPERVISE - Witness monitors for stalled molecules\n Nudges owner or reassigns if dead\n\n## Questions to Resolve\n- Seed node terminology: seed vs root vs pole vs nucleus\n- Assignee inheritance: single owner vs delegation model\n- Stall detection: heartbeat vs activity timeout vs session monitoring\n\n## Implementation\n- Polecat startup: check for assigned molecules\n- Polecat work loop: follow molecule DAG\n- Witness: monitor molecule progress, detect stalls\n- Mayor: can assign molecules, handle escalations\n\n## Depends On\n- beads: bd mol bond command (bd-usro in beads repo)","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-20T16:57:01.09104-08:00","updated_at":"2025-12-21T12:02:25.133021-08:00","closed_at":"2025-12-21T12:02:25.133021-08:00","close_reason":"Implemented molecule execution support for polecats:\n\n1. spawn.go: Added MoleculeContext to work assignment mail with molecule workflow instructions\n2. prime.go: Added outputMoleculeContext() that detects molecule steps and shows progress\n3. molecule.go: Added 'gt molecule progress' command for Witness monitoring\n\nPolecats now:\n- Receive molecule-aware work assignments showing step N/M and workflow\n- See molecule context in gt prime output when working on molecule steps\n- Can follow the DAG by running 'bd ready --parent \u003croot\u003e' after each step\n\nWitnesses/Mayor can:\n- Monitor molecule progress with 'gt molecule progress \u003croot-id\u003e'\n- See completion percentage, ready/blocked steps"} @@ -426,6 +457,7 @@ {"id":"gt-afe3","title":"Digest: mol-deacon-patrol","description":"Patrol 7: OK","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T20:57:54.201136-08:00","updated_at":"2025-12-24T20:57:54.201136-08:00","closed_at":"2025-12-24T20:57:54.201106-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-afn0","title":"gt sling: use mail queue for patrol roles (witness, refinery, deacon)","description":"When slinging work to patrol agents, queue via mail instead of replacing hook.\n\n**Rationale:**\nPatrol agents run continuous loops. Replacing their hook with discrete work breaks patrol continuity - when the task completes, the patrol stops.\n\n**New behavior for patrol roles (witness, refinery, deacon):**\n1. Check if patrol is running (hook has patrol molecule attached)\n2. If patrol running:\n - Don't touch hook (patrol stays pinned)\n - Send work assignment mail\n - Print 'Queued for next patrol cycle'\n3. If patrol NOT running:\n - Start default patrol for that role (mol-witness-patrol, mol-refinery-patrol, mol-deacon-patrol)\n - Send work assignment mail\n - Print 'Started patrol and queued work'\n\n**New flags:**\n- --urgent: Interrupt current patrol cycle, process this work immediately\n- --replace: Explicitly terminate patrol and pin discrete work (break-glass)\n\n**No change for:**\n- Polecat, Crew, Mayor (discrete task agents - current behavior)\n\n**Dependencies:**\n- Patrol templates must have 'check inbox' step (verify/add)\n- Need to know default patrol molecule for each role","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-23T16:12:58.431633-08:00","updated_at":"2025-12-23T16:24:52.027412-08:00","closed_at":"2025-12-23T16:24:52.027412-08:00","close_reason":"Closed"} {"id":"gt-ai1z","title":"TODO: Detect cycles in molecule dependency graph","description":"molecule.go:302 has a TODO to detect cycles in the dependency graph. Currently, cyclical dependencies could cause issues.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T21:34:28.169096-08:00","updated_at":"2025-12-21T21:48:55.388426-08:00","closed_at":"2025-12-21T21:48:55.388426-08:00","close_reason":"Implemented DFS-based cycle detection in molecule dependency graph with 4 new tests"} +{"id":"gt-alx","title":"Swarm: ephemeral rig support","description":"PGT has ephemeral rigs for swarms - temporary worker groups that are destroyed after landing.\n\nMissing Features:\n- gt swarm init [--rig \u003cname\u003e|--git-url \u003curl\u003e] [--num-workers N]\n- gt swarm worker add/remove/list \u003crig-id\u003e\n- gt swarm rigs - List ephemeral rigs\n- gt swarm destroy \u003crig-id\u003e - Destroy ephemeral rig\n\nDirectory structure:\n\u003cworkspace\u003e/mayor/workers/\u003crig-id\u003e/\n├── rig.json (metadata)\n├── alice/ (git clone)\n├── bob/\n└── carol/\n\nPGT Reference: gastown-py/src/gastown/ephemeral.py\n\nNote: Beads issue gt-kmn.12 mentions this but implementation is missing.","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-16T14:47:14.302762-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-amx5o","title":"Digest: mol-deacon-patrol","description":"Patrol 11: all clear","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T11:05:28.741803-08:00","updated_at":"2025-12-25T11:05:28.741803-08:00","closed_at":"2025-12-25T11:05:28.741771-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-aobh","title":"Polecats should not bd sync on startup","description":"Polecats all share the same beads database at the rig level. The refinery and mayor/witness manage syncing beads.\n\n## Current Behavior\nPolecat startup runs bd sync, causing:\n- Contention when multiple polecats spawn simultaneously\n- Unnecessary sync operations\n- Potential race conditions\n\n## Desired Behavior\n- Polecats should NOT run bd sync on startup\n- They read from the shared beads database\n- Only refinery/witness/mayor sync beads\n\n## Implementation\nRemove bd sync from polecat spawn/startup sequence.","status":"closed","priority":2,"issue_type":"bug","assignee":"gastown/tracer","created_at":"2025-12-21T16:40:18.705507-08:00","updated_at":"2025-12-23T21:49:55.664828-08:00","closed_at":"2025-12-23T21:49:55.664828-08:00","close_reason":"Fixed: removed bd sync from polecat startup in 4 files"} {"id":"gt-aqd8","title":"Witness Patrol Molecule","description":"Create mol-witness-patrol molecule for witness heartbeat loop.\n\nSimilar to DeaconPatrolMolecule but for per-rig witness duties.\n\n## Steps\n1. inbox-check - Process witness mail\n2. survey-workers - List polecats, check status\n3. inspect-workers - Capture pane output, assess state \n4. plugin-run - Execute plugins from \u003crig\u003e/plugins/witness/\n5. decide-actions - Determine nudges, escalations\n6. execute-actions - Send nudges, process shutdowns\n7. context-check - Check own context, handoff if needed\n8. loop-or-exit - Continue or cycle\n\nThe plugin-run step enables user customization of the patrol loop.","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-21T16:16:52.808202-08:00","updated_at":"2025-12-23T04:39:26.805771-08:00","closed_at":"2025-12-23T04:39:26.805771-08:00","close_reason":"Superseded by Christmas Ornament pattern (gt-tnow, gt-qflq). Flat patrol design replaced by dynamic bonding with per-polecat arms."} @@ -436,6 +468,7 @@ {"id":"gt-asz5.1","title":"Test Polecat Arm","description":"Test child for bonding pattern","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T13:17:04.370549-08:00","updated_at":"2025-12-25T01:33:00.631328-08:00","closed_at":"2025-12-25T01:33:00.631328-08:00","close_reason":"Test pollution cleanup","dependencies":[{"issue_id":"gt-asz5.1","depends_on_id":"gt-asz5","type":"parent-child","created_at":"2025-12-24T13:17:04.370981-08:00","created_by":"daemon"}]} {"id":"gt-atr9o","title":"Digest: mol-deacon-patrol","description":"Patrol 7: All healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T00:31:37.450236-08:00","updated_at":"2025-12-25T00:31:37.450236-08:00","closed_at":"2025-12-25T00:31:37.450206-08:00"} {"id":"gt-av4m","title":"execute-actions","description":"Send nudges, process shutdowns, escalate as decided.\n\nNeeds: decide-actions","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T16:23:42.026052-08:00","updated_at":"2025-12-25T01:31:40.365099-08:00","closed_at":"2025-12-25T01:31:40.365099-08:00","close_reason":"Duplicate - closing cruft","dependencies":[{"issue_id":"gt-av4m","depends_on_id":"gt-87jz","type":"parent-child","created_at":"2025-12-23T16:23:42.026713-08:00","created_by":"stevey"}]} +{"id":"gt-av8","title":"Update Mayor prompting in gastown-py","description":"The Mayor CLAUDE.md and related prompting in gastown-py (still in production use) needs to reflect current design decisions: session cycling, handoff protocol, cleanup responsibilities, beads access model. Sync prompting with GGT design work.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-15T20:24:09.953043-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-av92i","title":"Digest: mol-deacon-patrol","description":"Patrol 10: All healthy, halfway mark","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T10:47:59.377355-08:00","updated_at":"2025-12-25T10:47:59.377355-08:00","closed_at":"2025-12-25T10:47:59.377318-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-avq9","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-20T21:23:06.77909-08:00","updated_at":"2025-12-20T21:23:06.858435-08:00","closed_at":"2025-12-20T21:23:06.858435-08:00","close_reason":"Historical import"} {"id":"gt-avv7","title":"Digest: mol-deacon-patrol","description":"Patrol #12: Stable","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T23:33:40.201208-08:00","updated_at":"2025-12-24T23:33:40.201208-08:00","closed_at":"2025-12-24T23:33:40.201169-08:00","close_reason":"Squashed from 8 wisps"} @@ -478,6 +511,16 @@ {"id":"gt-bzn8.1","title":"Test Polecat Arm","description":"Test child for bonding pattern","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T00:20:50.504058-08:00","updated_at":"2025-12-25T01:33:00.779912-08:00","closed_at":"2025-12-25T01:33:00.779912-08:00","close_reason":"Test pollution cleanup","dependencies":[{"issue_id":"gt-bzn8.1","depends_on_id":"gt-bzn8","type":"parent-child","created_at":"2025-12-24T00:20:50.504544-08:00","created_by":"daemon"}]} {"id":"gt-c6zs","title":"Add molecule phase lifecycle diagram to architecture.md","description":"Create a clear lifecycle diagram showing molecule phases:\n\n```\n ┌─────────────┐\n │ Proto │\n │ (crystal) │\n └──────┬──────┘\n │\n bd mol bond\n │\n ┌────────────┴────────────┐\n │ │\n ▼ ▼\n ┌───────────────┐ ┌───────────────┐\n │ Mol │ │ Wisp │\n │ (liquid) │ │ (gas) │\n │ durable │ │ ephemeral │\n │ main beads │ │ .beads-eph/ │\n └───────┬───────┘ └───────┬───────┘\n │ │\n bd mol squash bd mol squash\n │ │\n ▼ ▼\n ┌───────────────┐ ┌───────────────┐\n │ Digest │ │ (nothing) │\n │ (distillate) │ │ evaporates │\n │ in git hist │ └───────────────┘\n └───────────────┘\n```\n\nAlso document:\n- When to use Mol vs Wisp\n- Mol: code review waves, epic implementation, feature work\n- Wisp: orchestration, polecat work sessions, patrol loops","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-21T16:32:47.487341-08:00","updated_at":"2025-12-23T02:14:01.640498-08:00","closed_at":"2025-12-23T02:14:01.640498-08:00","close_reason":"Already documented in vision.md and architecture.md","dependencies":[{"issue_id":"gt-c6zs","depends_on_id":"gt-62hm","type":"blocks","created_at":"2025-12-21T16:33:17.38302-08:00","created_by":"daemon"}]} {"id":"gt-c7z9","title":"Merge: gt-3x0z.1","description":"branch: polecat/furiosa\ntarget: main\nsource_issue: gt-3x0z.1\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-21T15:32:28.799733-08:00","updated_at":"2025-12-21T15:54:12.41489-08:00","closed_at":"2025-12-21T15:54:12.41489-08:00","close_reason":"Merged to main by refinery"} +{"id":"gt-c8ca","title":"mol-gastown-boot","description":"Mayor bootstraps Gas Town via a verification-gated lifecycle molecule.\n\n## Purpose\nWhen Mayor executes \"boot up gas town\", this proto provides the workflow.\nEach step has action + verification - steps stay open until outcome is confirmed.\n\n## Key Principles\n1. **Verification-gated steps** - Not \"command ran\" but \"outcome confirmed\"\n2. **gt peek for verification** - Capture session output to detect stalls\n3. **gt nudge for recovery** - Reliable message delivery to unstick agents\n4. **Parallel where possible** - Witnesses and refineries can start in parallel\n5. **Ephemeral execution** - Boot is a wisp, squashed to digest after completion\n\n## Step Structure\nEach step has Action/Verify/OnStall/OnFail sections.\n\n## Execution\n```bash\nbd mol spawn mol-gastown-boot # Create wisp\nbd mol run \u003cwisp-id\u003e # Execute\n```","status":"tombstone","priority":2,"issue_type":"epic","created_at":"2025-12-23T00:19:45.521561-08:00","updated_at":"2025-12-25T11:45:02.114796-08:00","labels":["template"],"deleted_at":"2025-12-25T11:45:02.114796-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"epic"} +{"id":"gt-c8ca.1","title":"ensure-daemon","description":"Verify the Gas Town daemon is running.\n\n## Action\n```bash\ngt daemon status || gt daemon start\n```\n\n## Verify\n1. Daemon PID file exists: `~/.gt/daemon.pid`\n2. Process is alive: `kill -0 $(cat ~/.gt/daemon.pid)`\n3. Daemon responds: `gt daemon status` returns success\n\n## OnStall\nDaemon startup failed. Try:\n```bash\ngt daemon stop\nsleep 2\ngt daemon start\n```\n\n## OnFail\nCannot start daemon. Log error and continue - some commands work without daemon.","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-23T00:20:08.841559-08:00","updated_at":"2025-12-25T11:45:02.114796-08:00","labels":["template"],"dependencies":[{"issue_id":"gt-c8ca.1","depends_on_id":"gt-c8ca","type":"parent-child","created_at":"2025-12-23T00:20:08.842017-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T11:45:02.114796-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-c8ca.2","title":"ensure-deacon","description":"Start the Deacon and verify patrol mode is active.\n\n## Action\n```bash\ngt deacon start\n```\n\n## Verify\n1. Session exists: `tmux has-session -t gt-deacon 2\u003e/dev/null`\n2. Not stalled: `gt peek deacon/` does NOT show \"\u003e Try\" prompt\n3. Heartbeat fresh: `deacon/heartbeat.json` modified \u003c 2 min ago\n\n## OnStall\n```bash\ngt nudge deacon/ \"Start patrol.\"\nsleep 30\n# Re-verify\n```\n\n## OnFail\nLog error and continue - town can run with degraded deacon.\nThe Witness can still manage polecats without Deacon oversight.","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-23T00:20:38.421986-08:00","updated_at":"2025-12-25T11:45:02.114796-08:00","labels":["template"],"dependencies":[{"issue_id":"gt-c8ca.2","depends_on_id":"gt-c8ca","type":"parent-child","created_at":"2025-12-23T00:20:38.422458-08:00","created_by":"daemon"},{"issue_id":"gt-c8ca.2","depends_on_id":"gt-c8ca.1","type":"blocks","created_at":"2025-12-23T00:20:38.428253-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T11:45:02.114796-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-c8ca.3","title":"ensure-witnesses","description":"Parallel container: Start all rig witnesses.\n\n## Execution\nChildren execute in parallel. Container completes when all children complete.\n\n## Children\n- ensure-gastown-witness\n- ensure-beads-witness\n\n## Verify\nAll child witness steps pass verification.","status":"tombstone","priority":2,"issue_type":"epic","created_at":"2025-12-23T00:20:57.468339-08:00","updated_at":"2025-12-25T11:45:02.114796-08:00","labels":["template"],"dependencies":[{"issue_id":"gt-c8ca.3","depends_on_id":"gt-c8ca","type":"parent-child","created_at":"2025-12-23T00:20:57.46882-08:00","created_by":"daemon"},{"issue_id":"gt-c8ca.3","depends_on_id":"gt-c8ca.2","type":"blocks","created_at":"2025-12-23T00:20:57.474972-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T11:45:02.114796-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"epic"} +{"id":"gt-c8ca.3.1","title":"ensure-gastown-witness","description":"Start the gastown rig Witness.\n\n## Action\n```bash\ngt witness start gastown\n```\n\n## Verify\n1. Session exists: `tmux has-session -t gastown-witness 2\u003e/dev/null`\n2. Not stalled: `gt peek gastown/witness` does NOT show \"\u003e Try\" prompt\n3. Heartbeat fresh: Last patrol cycle \u003c 5 min ago\n\n## OnStall\n```bash\ngt nudge gastown/witness \"Start patrol.\"\nsleep 30\n# Re-verify\n```\n\n## OnFail\nLog error. Rig polecats will be unmonitored until Witness recovers.","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-23T00:21:08.041873-08:00","updated_at":"2025-12-25T11:45:02.114796-08:00","labels":["template"],"dependencies":[{"issue_id":"gt-c8ca.3.1","depends_on_id":"gt-c8ca.3","type":"parent-child","created_at":"2025-12-23T00:21:08.042465-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T11:45:02.114796-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-c8ca.3.2","title":"ensure-beads-witness","description":"Start the beads rig Witness.\n\n## Action\n```bash\ngt witness start beads\n```\n\n## Verify\n1. Session exists: `tmux has-session -t beads-witness 2\u003e/dev/null`\n2. Not stalled: `gt peek beads/witness` does NOT show \"\u003e Try\" prompt\n3. Heartbeat fresh: Last patrol cycle \u003c 5 min ago\n\n## OnStall\n```bash\ngt nudge beads/witness \"Start patrol.\"\nsleep 30\n# Re-verify\n```\n\n## OnFail\nLog error. Rig polecats will be unmonitored until Witness recovers.","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-23T00:21:16.31871-08:00","updated_at":"2025-12-25T11:45:02.114796-08:00","labels":["template"],"dependencies":[{"issue_id":"gt-c8ca.3.2","depends_on_id":"gt-c8ca.3","type":"parent-child","created_at":"2025-12-23T00:21:16.319204-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T11:45:02.114796-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-c8ca.4","title":"ensure-refineries","description":"Parallel container: Start all rig refineries.\n\n## Execution\nChildren execute in parallel. Container completes when all children complete.\n\n## Children\n- ensure-gastown-refinery\n- ensure-beads-refinery\n\n## Verify\nAll child refinery steps pass verification.","status":"tombstone","priority":2,"issue_type":"epic","created_at":"2025-12-23T00:21:40.387618-08:00","updated_at":"2025-12-25T11:45:02.114796-08:00","labels":["template"],"dependencies":[{"issue_id":"gt-c8ca.4","depends_on_id":"gt-c8ca","type":"parent-child","created_at":"2025-12-23T00:21:40.388265-08:00","created_by":"daemon"},{"issue_id":"gt-c8ca.4","depends_on_id":"gt-c8ca.2","type":"blocks","created_at":"2025-12-23T00:21:40.394734-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T11:45:02.114796-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"epic"} +{"id":"gt-c8ca.4.1","title":"ensure-gastown-refinery","description":"Start the gastown rig Refinery.\n\n## Action\n```bash\ngt refinery start gastown\n```\n\n## Verify\n1. Session exists: `tmux has-session -t gastown-refinery 2\u003e/dev/null`\n2. Not stalled: `gt peek gastown/refinery` does NOT show \"\u003e Try\" prompt\n3. Queue processing: Refinery can receive merge requests\n\n## OnStall\n```bash\ngt nudge gastown/refinery \"Start patrol.\"\nsleep 30\n# Re-verify\n```\n\n## OnFail\nLog error. Completed polecat work will queue until Refinery recovers.","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-23T00:21:53.588774-08:00","updated_at":"2025-12-25T11:45:02.114796-08:00","labels":["template"],"dependencies":[{"issue_id":"gt-c8ca.4.1","depends_on_id":"gt-c8ca.4","type":"parent-child","created_at":"2025-12-23T00:21:53.589255-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T11:45:02.114796-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-c8ca.4.2","title":"ensure-beads-refinery","description":"Start the beads rig Refinery.\n\n## Action\n```bash\ngt refinery start beads\n```\n\n## Verify\n1. Session exists: `tmux has-session -t beads-refinery 2\u003e/dev/null`\n2. Not stalled: `gt peek beads/refinery` does NOT show \"\u003e Try\" prompt\n3. Queue processing: Refinery can receive merge requests\n\n## OnStall\n```bash\ngt nudge beads/refinery \"Start patrol.\"\nsleep 30\n# Re-verify\n```\n\n## OnFail\nLog error. Completed polecat work will queue until Refinery recovers.","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-23T00:21:56.877235-08:00","updated_at":"2025-12-25T11:45:02.114796-08:00","labels":["template"],"dependencies":[{"issue_id":"gt-c8ca.4.2","depends_on_id":"gt-c8ca.4","type":"parent-child","created_at":"2025-12-23T00:21:56.877743-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T11:45:02.114796-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-c8ca.5","title":"verify-town-health","description":"Final verification that Gas Town is healthy.\n\n## Action\n```bash\ngt status\n```\n\n## Verify\n1. Daemon running: Shows daemon status OK\n2. Deacon active: Shows deacon in patrol mode\n3. All witnesses: Each rig witness shows active\n4. All refineries: Each rig refinery shows active\n\n## OnStall\nN/A - this is a read-only verification step.\n\n## OnFail\nLog degraded state but consider boot complete. Some agents may need manual recovery.\nRun `gt doctor` for detailed diagnostics.","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-23T00:22:14.671916-08:00","updated_at":"2025-12-25T11:45:02.114796-08:00","labels":["template"],"dependencies":[{"issue_id":"gt-c8ca.5","depends_on_id":"gt-c8ca","type":"parent-child","created_at":"2025-12-23T00:22:14.672543-08:00","created_by":"daemon"},{"issue_id":"gt-c8ca.5","depends_on_id":"gt-c8ca.3","type":"blocks","created_at":"2025-12-23T00:22:14.678972-08:00","created_by":"daemon"},{"issue_id":"gt-c8ca.5","depends_on_id":"gt-c8ca.4","type":"blocks","created_at":"2025-12-23T00:22:14.685012-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T11:45:02.114796-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-c92","title":"CLI: all command for batch polecat operations","description":"Batch operations across multiple polecats.\n\n## Commands\n\n### gt all start\n```\ngt all start [--awake-only] [\u003cspecs\u003e...]\n```\nStart sessions for multiple polecats.\n- --awake-only: Only start awake polecats\n- specs: Polecat names, rig/polecat patterns\n\n### gt all stop\n```\ngt all stop [\u003cspecs\u003e...] [--force]\n```\nStop sessions for multiple polecats.\n\n### gt all status\n```\ngt all status [\u003cspecs\u003e...] [--json]\n```\nShow status of multiple polecats.\n\n### gt all attach\n```\ngt all attach [\u003cspecs\u003e...]\n```\nAttach to multiple sessions in tmux panes/windows.\n\n### gt all run\n```\ngt all run \u003ccommand\u003e [\u003cspecs\u003e...]\n```\nRun command in multiple polecat sessions.\n\n## Spec Patterns\n- `Toast`: Specific polecat (in default/current rig)\n- `gastown/Toast`: Specific rig/polecat\n- `gastown/*`: All polecats in rig\n- `*`: All polecats everywhere\n\n## Implementation\n```go\nfunc expandSpecs(specs []string, awakeOnly bool) ([]*polecat.Polecat, error) {\n // Expand patterns to list of polecats\n}\n\nfunc runForAll(polecats []*polecat.Polecat, action func(*polecat.Polecat) error) error {\n // Run action for each, collect errors\n}\n```\n\n## New File\ninternal/cmd/all.go\n\n## PGT Reference\ngastown-py/src/gastown/cli/all_cmd.py\n\n## Acceptance Criteria\n- [ ] Pattern expansion works\n- [ ] Parallel execution where safe\n- [ ] Aggregate error reporting\n- [ ] --awake-only filter works","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-16T14:48:12.411789-08:00","updated_at":"2025-12-16T16:05:47.255503-08:00"} {"id":"gt-ca4v","title":"Refinery Patrol Cycle","status":"open","priority":2,"issue_type":"epic","created_at":"2025-12-22T17:13:40.785585-08:00","updated_at":"2025-12-22T17:13:40.785585-08:00"} {"id":"gt-ca4v.1","title":"Check mail for MR submissions, escalations, messages.","description":"Check mail for MR submissions, escalations, messages.\n\n```bash\ngt mail inbox\n# Process any urgent items\n```\n\nHandle shutdown requests, escalations, and status queries.\n\ninstantiated_from: mol-refinery-patrol\nstep: inbox-check","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-22T17:13:47.265596-08:00","updated_at":"2025-12-22T17:13:47.265596-08:00","dependencies":[{"issue_id":"gt-ca4v.1","depends_on_id":"gt-ca4v","type":"parent-child","created_at":"2025-12-22T17:13:47.265965-08:00","created_by":"daemon"}]} @@ -498,10 +541,21 @@ {"id":"gt-cekg","title":"Wisp squash design: cadences, rules, templates","description":"Design how wisps squash to digests: When to squash (cadences), what to include (summary templates), retention rules. Currently under-designed. Should cover patrol wisps (squash per cycle) and work wisps (squash on completion). Consider allowing formulas to define squash templates.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T18:45:27.315937-08:00","updated_at":"2025-12-23T18:45:27.315937-08:00"} {"id":"gt-cgl3u","title":"Digest: mol-deacon-patrol","description":"Patrol 5: 9 sessions healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T07:25:56.412065-08:00","updated_at":"2025-12-25T07:25:56.412065-08:00","closed_at":"2025-12-25T07:25:56.412024-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-ci84","title":"Deacon patrol wisps should use town beads, not gastown rig beads","description":"## Problem\n\nThe deacon is a town-level role but stores patrol wisps in gastown/mayor/rig/.beads/ (see internal/cmd/prime.go:691). This fails for users who don't have the gastown rig installed.\n\n## Correct Architecture\n\nDeacon -\u003e ~/gt/.beads-wisp/ (town-level, no rig dependency)\n\nTown-level ephemeral work (deacon patrols) should use town wisp storage, just like rig-level ephemeral work (witness/refinery patrols) uses rig wisp storage.\n\n## Implementation Tasks\n\n### 1. Town Setup (gt install / gt town init)\n\n- Create ~/gt/.beads-wisp/ directory during town initialization\n- Initialize as git repo (for local commits, not synced)\n- Add config.yaml with wisp: true\n- Ensure .beads-wisp/ is gitignored at town level\n\nFiles:\n- internal/cmd/install.go (or equivalent town init)\n- internal/town/manager.go (if exists)\n\n### 2. Rig Setup (gt rig init)\n\nAlready creates \u003crig\u003e/.beads-wisp/ - verify this is working:\n- internal/rig/manager.go:375 (beadsDir := filepath.Join(rigPath, \".beads-wisp\"))\n- internal/rig/manager.go:394 (ensureGitignoreEntry)\n\n### 3. Deacon Code Fixes\n\nUpdate deacon to use town wisp storage:\n- internal/cmd/prime.go:691 - change rigBeadsDir to townWispDir\n- internal/cmd/sling.go - route deacon wisps to town level\n- internal/daemon/daemon.go - any deacon-specific wisp handling\n\n### 4. gt doctor Checks\n\nAdd/update doctor checks for wisp directories:\n- internal/doctor/wisp_check.go - already checks rig wisps\n- Add TownWispCheck to verify ~/gt/.beads-wisp/ exists\n- Add TownWispGitCheck to verify it is a valid git repo\n- Update existing checks to handle both town and rig levels\n\nFiles:\n- internal/doctor/wisp_check.go (extend for town level)\n- internal/doctor/checks.go (register new checks)\n\n### 5. Documentation\n\n- docs/beads-data-plane.md - already updated with three-tier architecture\n- Verify wisp-architecture.md reflects town-level wisps\n\n## Testing\n\n1. Fresh gt install should create ~/gt/.beads-wisp/\n2. gt doctor should pass with no rig installed\n3. Deacon patrol should work without gastown rig\n4. gt sling patrol deacon/ --wisp should route to town wisps","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-23T14:28:03.636334-08:00","updated_at":"2025-12-24T00:18:03.046394-08:00","closed_at":"2025-12-23T19:37:56.701806-08:00","close_reason":"Implemented town-level wisp storage for deacon patrol"} +{"id":"gt-cik","title":"Overseer Crew: User-managed persistent workspaces","description":"## Overview\n\nCrew workers are the overseer's (human's) personal workspaces within a rig. Unlike polecats which are witness-managed and ephemeral, crew workers are:\n\n- **Persistent**: Not auto-garbage-collected\n- **User-managed**: Overseer controls lifecycle\n- **Long-lived identities**: dave, emma, fred - recognizable names\n- **Gas Town integrated**: Mail, handoff mechanics work\n- **Tmux optional**: Can work in terminal directly\n\n## Directory Structure\n\n```\n\u003crig\u003e/\n polecats/ # Managed workers (witness controls)\n refinery/ # Merge queue processor\n witness/ # Pit boss\n crew/ # Overseer's personal workspaces\n dave/ # Full clone, persistent\n emma/ # Full clone, persistent\n fred/ # Full clone, persistent\n```\n\n## Key Differences from Polecats\n\n- Location: crew/ instead of polecats/\n- Lifecycle: User-managed, not witness-managed\n- Auto-cleanup: Never (polecats auto-cleanup on swarm land)\n- Issue assignment: Optional (polecats require it)\n- Tmux: Optional (polecats require it)\n- Mail \u0026 Handoff: Yes for both\n- Identity: Persistent (polecats are ephemeral)\n\n## CLI Commands\n\n- gt crew add \u003cname\u003e [--rig \u003crig\u003e] - Create crew workspace\n- gt crew list [--rig \u003crig\u003e] - List crew workspaces\n- gt crew at \u003crig\u003e/\u003cname\u003e - Attach to workspace (start session)\n- gt crew attach \u003cname\u003e - Attach (infer rig from cwd)\n- gt crew refresh \u003cname\u003e - Handoff + restart (context cycling)\n- gt crew remove \u003cname\u003e [--force] - Remove workspace\n- gt crew status [\u003cname\u003e] - Show workspace status\n\n## Design Notes\n\n- Crew workers use full git clones (not worktrees)\n- Optional beads integration via BEADS_DIR\n- Mail-to-self handoff works for context cycling\n- No witness monitoring or nudging\n- No automatic issue assignment required\n\n## Background\n\nUsers often maintain separate repo clones for serial agent work. This is tedious to set up manually. Crew workspaces bring these into Gas Town's infrastructure while keeping user control.","status":"tombstone","priority":1,"issue_type":"epic","created_at":"2025-12-16T16:47:37.529887-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"epic"} +{"id":"gt-cik.1","title":"Crew directory structure and config","description":"Add crew/ directory support to rig structure. Include:\n- crew/ as peer to polecats/, refinery/, witness/\n- Crew worker subdirectories with full git clones\n- Optional BEADS_DIR configuration for beads integration\n- Crew state tracking (separate from polecat state)","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-16T16:48:00.285499-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-cik.1","depends_on_id":"gt-cik","type":"parent-child","created_at":"2025-12-16T16:48:00.28789-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-cik.2","title":"gt crew add: Create crew workspace","description":"Implement 'gt crew add \u003cname\u003e [--rig \u003crig\u003e]' command:\n- Clone repo into \u003crig\u003e/crew/\u003cname\u003e/\n- Create feature branch (optional, or stay on main)\n- Register for mail delivery\n- Initialize CLAUDE.md with crew worker prompting\n- Do NOT register with witness (user-managed)","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-16T16:48:02.208618-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-cik.2","depends_on_id":"gt-cik","type":"parent-child","created_at":"2025-12-16T16:48:02.210603-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-cik.3","title":"gt crew list: List crew workspaces","description":"Implement 'gt crew list [--rig \u003crig\u003e]' command:\n- List all crew workers in rig(s)\n- Show status (session running, last activity)\n- Show current branch and git status summary\n- Support --json output","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-16T16:48:03.53109-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-cik.3","depends_on_id":"gt-cik","type":"parent-child","created_at":"2025-12-16T16:48:03.532953-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-cik.4","title":"gt crew at/attach: Start session in crew workspace","description":"Implement 'gt crew at \u003crig\u003e/\u003cname\u003e' and 'gt crew attach \u003cname\u003e' commands:\n- Start tmux session (optional - could just print cd instructions)\n- Launch claude code in the workspace\n- Deliver any pending mail\n- Support --no-tmux to just print directory path\n- 'attach' infers rig from cwd","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-16T16:48:04.96786-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-cik.4","depends_on_id":"gt-cik","type":"parent-child","created_at":"2025-12-16T16:48:04.969488-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-cik.5","title":"gt crew refresh: Context cycling with handoff","description":"Implement 'gt crew refresh \u003cname\u003e' command:\n- Send handoff mail to self (context summary)\n- Kill current session cleanly\n- Start new session\n- New session reads handoff mail and resumes\n- Support --message to add custom handoff notes","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-16T16:48:06.934819-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-cik.5","depends_on_id":"gt-cik","type":"parent-child","created_at":"2025-12-16T16:48:06.936381-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-cik.6","title":"gt crew remove: Remove crew workspace","description":"Implement 'gt crew remove \u003cname\u003e [--force]' command:\n- Check for uncommitted changes, unpushed commits\n- Warn and require --force if dirty\n- Kill any running session\n- Remove directory\n- Unregister from mail","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-16T16:48:08.407212-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-cik.6","depends_on_id":"gt-cik","type":"parent-child","created_at":"2025-12-16T16:48:08.408845-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-cik.7","title":"gt crew status: Show workspace status","description":"Implement 'gt crew status [\u003cname\u003e]' command:\n- Show session state (running/stopped)\n- Show git status (branch, uncommitted changes, unpushed)\n- Show last commit info\n- Show mail inbox status (unread count)\n- If no name given, show all crew workers","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-16T16:48:10.476059-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-cik.7","depends_on_id":"gt-cik","type":"parent-child","created_at":"2025-12-16T16:48:10.477638-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-cik.8","title":"Crew worker CLAUDE.md prompting","description":"Create CLAUDE.md template for crew workers:\n- Explain crew worker role (overseer's personal workspace)\n- Include mail-to-self handoff instructions\n- Document gt crew refresh for context cycling\n- Explain no witness monitoring (user-managed)\n- Include beads usage if BEADS_DIR configured","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-16T16:48:12.108074-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-cik.8","depends_on_id":"gt-cik","type":"parent-child","created_at":"2025-12-16T16:48:12.109654-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-cik.9","title":"Complete gt crew commands (list, attach, remove, refresh, status)","description":"Add remaining crew subcommands to internal/cmd/crew.go:\n\n1. gt crew list - List crew workspaces with status\n2. gt crew at/attach - Start tmux session in crew workspace \n3. gt crew remove - Remove crew workspace (with safety checks)\n4. gt crew refresh - Context cycling with mail-to-self handoff\n5. gt crew status - Show detailed workspace status\n\nBuild on existing crew add implementation in internal/cmd/crew.go.\nReference closed issues gt-cik.3-7 for original requirements.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-16T20:53:25.564877-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-cik.9","depends_on_id":"gt-cik","type":"parent-child","created_at":"2025-12-16T20:53:25.566962-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-cjb","title":"Witness updates: Remove issue filing proxy","description":"Update Witness prompting to remove issue filing proxy, since polecats now have direct beads access.\n\n## Remove from Witness Prompting\n\nThe following is NO LONGER Witness responsibility:\n- Processing polecat 'file issue' mail requests\n- Creating issues on behalf of polecats\n- Forwarding issue creation requests\n\n## Add: Legacy Request Handling\n\nIf Witness receives an old-style 'please file issue' request:\n\n1. Respond with update:\n town inject \u003cpolecat\u003e \"UPDATE: You have direct beads access now. Use bd create to file issues yourself.\"\n\n2. Do not file the issue - let the polecat learn the new workflow.\n\n## Keep in Witness Prompting\n\n- Monitoring polecat progress\n- Nudge protocol\n- Pre-kill verification\n- Session lifecycle management","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-15T19:47:19.921561-08:00","updated_at":"2025-12-15T20:48:36.020922-08:00","dependencies":[{"issue_id":"gt-cjb","depends_on_id":"gt-l3c","type":"blocks","created_at":"2025-12-15T19:47:35.896691-08:00","created_by":"daemon"}]} {"id":"gt-cnt","title":"Swarm cleanup: delete merged polecat branches and reset state","description":"After a swarm completes and branches are merged, leftover state remains:\n\n## Current Problem\n\n1. **Remote branches not deleted** - polecat/* branches stay on origin after merge\n2. **Polecat clones not reset** - still on old branch with completed work\n3. **No cleanup command** - manual cleanup required\n\n## Observed After Swarm\n\nRemote branches still present:\n- origin/polecat/Morsov\n- origin/polecat/Nux \n- origin/polecat/Rictus\n- origin/polecat/Slit\n- origin/polecat/Toast\n\n## Proposed Solution\n\nAdd cleanup commands:\n\n1. gt swarm cleanup \u003cswarm-id\u003e - Clean up after swarm completion\n - Delete remote polecat branches that were merged\n - Reset polecat clones to main\n - Clear issue assignments\n \n2. gt polecat reset \u003crig\u003e/\u003cpolecat\u003e - Reset single polecat\n - git checkout main \u0026\u0026 git pull\n - Delete local polecat branch\n - Clear current issue assignment\n\n3. Auto-cleanup option on gt session stop --cleanup\n\n## Manual Cleanup For Now\n\ngit push origin --delete polecat/Nux polecat/Toast ...\ncd polecats/Nux \u0026\u0026 git checkout main \u0026\u0026 git pull","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-17T15:09:08.739193-08:00","updated_at":"2025-12-18T11:38:56.305923-08:00","closed_at":"2025-12-18T11:38:56.305923-08:00"} {"id":"gt-cp2s","title":"mol-polecat-lease: Semaphore proto for tracking polecat lifecycle","description":"Define a small proto for tracking a single polecat in the Witness patrol wisp:\n\n```markdown\n## Molecule: polecat-lease\nSemaphore tracking a single polecat's lifecycle.\nVars: {{polecat}}, {{issue}}\n\n## Step: boot\nSpawned. Verify it starts working.\ngt peek {{polecat}} - if idle, gt nudge.\nTimeout: 60s before escalation.\n\n## Step: working\nActively working. Monitor for stuck.\nWait for SHUTDOWN mail.\nNeeds: boot\n\n## Step: done\nExit received. Ready for cleanup.\nKill session, prune worktree.\nNeeds: working\n```\n\nUsed by Witness: bd mol bond mol-polecat-lease wisp-patrol --var polecat=X","status":"closed","priority":1,"issue_type":"task","assignee":"gastown/rictus","created_at":"2025-12-22T22:01:18.257848-08:00","updated_at":"2025-12-22T23:44:35.556609-08:00","closed_at":"2025-12-22T23:44:35.556609-08:00","close_reason":"Created mol-polecat-lease proto (gt-2k4f) with 3 steps: boot, working, done"} {"id":"gt-cpm2","title":"Automatic spawn for ready work","description":"Auto-spawn polecats for ready work:\n\nWhen Witness has capacity (active_workers \u003c max_workers):\n1. Query bd ready for unblocked issues\n2. Filter to rig-appropriate work (by prefix or epic)\n3. For each ready issue up to capacity:\n - gt spawn --issue \u003cid\u003e\n - Track that we spawned for this issue\n\nConfiguration (in rig config.json):\n- max_workers: 4 (default)\n- spawn_delay: 5s between spawns\n- auto_spawn: true/false\n\nThis enables 'fire and forget' swarming:\n- Mayor creates epic with children\n- Mayor tells Witness to work epic\n- Witness spawns polecats automatically\n- Witness cleans up as they complete","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T03:14:24.724136-08:00","updated_at":"2025-12-20T09:30:28.050001-08:00","closed_at":"2025-12-20T09:30:28.050001-08:00","dependencies":[{"issue_id":"gt-cpm2","depends_on_id":"gt-53w6","type":"parent-child","created_at":"2025-12-20T03:14:37.365334-08:00","created_by":"daemon"},{"issue_id":"gt-cpm2","depends_on_id":"gt-mxyj","type":"blocks","created_at":"2025-12-20T03:14:38.957826-08:00","created_by":"daemon"}]} +{"id":"gt-cr0","title":"Consolidate design docs into beads descriptions","description":"The markdown design docs (swarm-shutdown-design.md, polecat-beads-access-design.md, mayor-handoff-design.md) will decay. Extract key decisions and prompting templates into the beads descriptions themselves, then archive or remove the markdown files. Beads are the source of truth.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-15T20:24:05.45131-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-cr9","title":"Harness Design \u0026 Documentation","description":"The harness (Gas Town installation directory) needs design cleanup, documentation, and tooling.\n\n## Current Problems\n\n1. **Shared harness confusion**: ~/ai is shared by PGT and GGT with overlapping structures\n - PGT uses ~/ai/mayor/ as town-level Mayor home\n - GGT Mayor works in ~/ai/mayor/rigs/gastown/\n - ~/ai/gastown/ has both .gastown/ (PGT) and mayor/ (git clone)\n\n2. **Beads redirect**: ~/ai/.beads/redirect → mayor/rigs/gastown/.beads\n - This is specific to GGT's decentralized structure\n - Should be documented as an example\n\n3. **architecture.md**: Verify rig-level mayor/rig/ is shown correctly\n\n4. **No harness creation tooling**: Users must manually set up\n\n## Proposed Work\n\n- Document what a harness IS (installation directory)\n- Create harness creation command or template repo\n- Update architecture.md if needed \n- Create example harness configuration for docs\n- Resolve PGT/GGT sharing issue","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-17T17:15:08.769961-08:00","updated_at":"2025-12-19T12:02:12.135837-08:00","closed_at":"2025-12-19T12:02:12.135837-08:00"} {"id":"gt-csba","title":"Digest: mol-deacon-patrol","description":"Patrol 20: Routine - handoff threshold reached","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T22:39:00.441055-08:00","updated_at":"2025-12-24T22:39:00.441055-08:00","closed_at":"2025-12-24T22:39:00.441027-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-ct0u","title":"Merge: gt-3x1.4","description":"branch: polecat/Nux\ntarget: main\nsource_issue: gt-3x1.4\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-19T14:53:53.140259-08:00","updated_at":"2025-12-19T18:26:14.104002-08:00","closed_at":"2025-12-19T17:49:09.234713-08:00"} @@ -512,6 +566,7 @@ {"id":"gt-cwpj","title":"Digest: mol-deacon-patrol","description":"Patrol OK: 0 mail, all agents healthy, 3 polecats working","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-22T20:58:32.040465-08:00","updated_at":"2025-12-22T20:58:32.040465-08:00","closed_at":"2025-12-22T20:58:32.040432-08:00","close_reason":"Squashed from 5 wisps"} {"id":"gt-cx41","title":"Role templates: rename 'Dependency Trap' to 'Gotchas when Filing Beads'","description":"The 'Dependency Trap' heading is too specific. Rename to something like 'Gotchas when Filing Beads' or 'Beads Filing Tips'. Applies to all role templates (polecat, crew, mayor, witness, refinery, deacon).","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T16:56:45.526464-08:00","updated_at":"2025-12-23T17:09:02.117784-08:00","closed_at":"2025-12-23T17:09:02.117784-08:00","close_reason":"Completed in commit 1931ec7","dependencies":[{"issue_id":"gt-cx41","depends_on_id":"gt-t9u7","type":"parent-child","created_at":"2025-12-23T16:57:16.288402-08:00","created_by":"daemon"}]} {"id":"gt-cxtu","title":"Implement shared beads architecture for rig","description":"Implement redirect-based shared beads to eliminate git sync overhead within a rig.\n\n## Background\nEach polecat currently has its own .beads/ directory synced via git. This burns tokens on sync operations.\n\n## Solution\nUse bd's redirect feature:\n1. Create single shared .beads/ at rig root\n2. Polecats get redirect files pointing to shared location\n3. All agents connect to same daemon\n4. SQLite WAL + daemon serialization handles concurrency\n\n## Implementation\n1. Create shared .beads/ at rig root (e.g., ~/gt/gastown/.beads/)\n2. Update gt spawn to create redirect files:\n mkdir -p polecats/nux/.beads\n echo ../../.beads \u003e polecats/nux/.beads/redirect\n3. Test that all polecats connect to same daemon\n4. Remove git sync from intra-rig workflow\n5. Keep JSONL export for backup/cross-rig only\n\n## Reference\nbeads/polecats/rictus/internal/beads/beads.go:45 - followRedirect()","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-20T20:19:53.6549-08:00","updated_at":"2025-12-21T14:27:43.957132-08:00","closed_at":"2025-12-21T14:27:43.957132-08:00","close_reason":"Shared beads architecture implemented: crew/polecats use redirects to mayor/rig/.beads. Also fixed mail identity format to use slashes (rig/role/name) instead of dashes."} +{"id":"gt-cxx","title":"Swarm learning: Witness needs automated context cycling","description":"Furiosa hit 2% context during swarm work. Witness role needs automated detection of low context and should trigger session cycling before agents get stuck. Add to Witness responsibilities in prompts.md.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-16T01:21:49.67756-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-d0a","title":"Haiku-based smart stuck detection","description":"Use Haiku to analyze tmux state when signals are ambiguous.\n\n## When to Invoke\n\nOnly as escalation tier:\n1. Keepalive is stale (\u003e 2 min)\n2. Tmux shows claude is running (not idle shell)\n3. Heuristics can't determine state\n\n## Prompt\n\nCapture last 50 lines of tmux pane, ask Haiku:\n'Is this Claude agent: WORKING | STUCK | IDLE | WAITING_FOR_HUMAN?'\n\n## Cost\n\n~$0.001 per check. At 1 check/min worst case = $0.06/hour.\nIn practice, most checks avoided by keepalive signal.\n\n## Configuration\n\n```toml\n[daemon]\nsmart_detection = true\nsmart_model = \"haiku\"\nsmart_threshold = \"2m\" # only check if stale \u003e 2min\n```","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-18T14:19:31.287215-08:00","updated_at":"2025-12-18T14:19:31.287215-08:00","dependencies":[{"issue_id":"gt-d0a","depends_on_id":"gt-bfd","type":"blocks","created_at":"2025-12-18T14:19:46.788667-08:00","created_by":"daemon"}]} {"id":"gt-d0en","title":"Digest: mol-deacon-patrol","description":"Patrol 14: Routine","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T22:38:06.620731-08:00","updated_at":"2025-12-24T22:38:06.620731-08:00","closed_at":"2025-12-24T22:38:06.620697-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-d2l13","title":"Digest: mol-deacon-patrol","description":"Patrol 6: All healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T13:28:46.06052-08:00","updated_at":"2025-12-25T13:28:46.06052-08:00","closed_at":"2025-12-25T13:28:46.060491-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-d2l13","depends_on_id":"gt-v88mb","type":"parent-child","created_at":"2025-12-25T13:28:46.061177-08:00","created_by":"stevey"}]} @@ -530,6 +585,7 @@ {"id":"gt-dh65","title":"Add gate checking to Deacon patrol loop","description":"Integrate gate checking into Deacon's patrol cycle.\n\n## Patrol Integration\n```go\nfunc (d *Deacon) checkGates(ctx context.Context) {\n gates, _ := d.store.ListOpenGates(ctx)\n \n for _, gate := range gates {\n // Check timeout\n if time.Since(gate.CreatedAt) \u003e gate.Timeout {\n d.notifyWaiters(gate, \"timeout\")\n d.closeGate(gate, \"timed out\")\n continue\n }\n \n // Check condition\n if d.checkCondition(gate.AwaitType, gate.AwaitID) {\n d.notifyWaiters(gate, \"cleared\")\n d.closeGate(gate, \"condition met\")\n }\n }\n}\n```\n\n## Moved from beads\nOriginally bd-is6m. Deacon is in gastown, not beads.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T12:19:06.768752-08:00","updated_at":"2025-12-23T12:19:06.768752-08:00"} {"id":"gt-dich","title":"gt handoff deadlock at handoff.go:125","description":"When running 'gt handoff -m \"message\"' after successful MR submit, go panics with 'fatal error: all goroutines are asleep - deadlock\\!' at handoff.go:125. The shutdown request still appears to be sent successfully but the command crashes. Stack trace shows issue is in runHandoff select statement.","status":"open","priority":2,"issue_type":"bug","created_at":"2025-12-21T17:51:18.441808-08:00","updated_at":"2025-12-21T17:51:18.441808-08:00"} {"id":"gt-djzh","title":"Merge: gt-ldk8","description":"branch: polecat/nux\ntarget: main\nsource_issue: gt-ldk8\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-23T01:15:25.915147-08:00","updated_at":"2025-12-23T01:16:15.726698-08:00","closed_at":"2025-12-23T01:16:15.726698-08:00","close_reason":"Merged to main"} +{"id":"gt-dkc","title":"Add harness overview to Mayor priming","description":"Update gt prime Mayor context to explain the harness concept: umbrella repo for GT installation, rigs underneath, Mayor sits above all rigs","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-17T16:42:44.864606-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-dkc","depends_on_id":"gt-l1o","type":"blocks","created_at":"2025-12-17T16:42:54.736437-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-dlrn","title":"Digest: mol-deacon-patrol @ 2025-12-24 19:46","description":"Patrol 13: All healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T19:46:40.722551-08:00","updated_at":"2025-12-24T19:46:40.722551-08:00","closed_at":"2025-12-24T19:46:40.722485-08:00","close_reason":"Squashed from wisp gt-9o6 (9 issues)"} {"id":"gt-dm7k","title":"Digest: mol-deacon-patrol","description":"Patrol #17: Stable","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T23:34:59.419736-08:00","updated_at":"2025-12-24T23:34:59.419736-08:00","closed_at":"2025-12-24T23:34:59.419688-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-dq3","title":"Split PGT/GGT harness or migrate to GGT-only","description":"Current ~/ai harness is shared by PGT and GGT with confusing overlap. Options:\n1. Keep separate (document the coexistence)\n2. Migrate fully to GGT structure\n3. Create separate harnesses\n\nThis affects the beads redirect, Mayor home location, and rig structure.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-17T17:15:32.308192-08:00","updated_at":"2025-12-19T12:08:48.653114-08:00","closed_at":"2025-12-19T12:08:48.653114-08:00","dependencies":[{"issue_id":"gt-dq3","depends_on_id":"gt-cr9","type":"blocks","created_at":"2025-12-17T17:15:51.717903-08:00","created_by":"daemon"}]} @@ -542,8 +598,10 @@ {"id":"gt-dx5c","title":"Update swarm terminology to streams","description":"Gas Town moved from batch swarms to continuous streaming of polecats. Update:\n- Docs and designs\n- Code comments\n- CLI flags (remove --swarm if present, or reframe)\n- Variable/function names where appropriate\n\nStreams reflect the reality: polecats flow continuously, not in discrete batches.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-22T21:42:19.559957-08:00","updated_at":"2025-12-22T21:42:19.559957-08:00"} {"id":"gt-dyz3","title":"Test Patrol for Bonding","description":"Parent issue for mol bond CLI test","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T21:55:26.734746-08:00","updated_at":"2025-12-25T01:33:00.204059-08:00","closed_at":"2025-12-25T01:33:00.204059-08:00","close_reason":"Test pollution cleanup"} {"id":"gt-dyz3.1","title":"Polecat Arm (arm-toast)","description":"Single polecat inspection and action cycle.\n\nThis molecule is bonded dynamically by mol-witness-patrol's survey-workers step.\nEach polecat being monitored gets one arm that runs in parallel with other arms.\n\n## Variables\n\n| Variable | Required | Description |\n|----------|----------|-------------|\n| polecat_name | Yes | Name of the polecat to inspect |\n| rig | Yes | Rig containing the polecat |\n\n## Step: capture\nCapture recent tmux output for toast.\n\n```bash\ntmux capture-pane -t gt-gastown-toast -p | tail -50\n```\n\nRecord:\n- Last activity timestamp (when was last tool call?)\n- Visible errors or stack traces\n- Completion indicators (\"Done\", \"Finished\", etc.)\n\n## Step: assess\nCategorize polecat state based on captured output.\n\nStates:\n- **working**: Recent tool calls, active processing\n- **idle**: At prompt, no recent activity\n- **error**: Showing errors or stack traces\n- **requesting_shutdown**: Sent LIFECYCLE/Shutdown mail\n- **done**: Showing completion indicators\n\nCalculate: minutes since last activity.\nNeeds: capture\n\n## Step: load-history\nRead nudge history for toast from patrol state.\n\n```\nnudge_count = state.nudges[toast].count\nlast_nudge_time = state.nudges[toast].timestamp\n```\n\nThis data was loaded by the parent patrol's load-state step and passed\nto the arm via the bonding context.\nNeeds: assess\n\n## Step: decide\nApply the nudge matrix to determine action for toast.\n\n| State | Idle Time | Nudge Count | Action |\n|-------|-----------|-------------|--------|\n| working | any | any | none |\n| idle | \u003c10min | any | none |\n| idle | 10-15min | 0 | nudge-1 (gentle) |\n| idle | 15-20min | 1 | nudge-2 (direct) |\n| idle | 20+min | 2 | nudge-3 (final) |\n| idle | any | 3 | escalate |\n| error | any | any | assess-severity |\n| requesting_shutdown | any | any | pre-kill-verify |\n| done | any | any | pre-kill-verify |\n\nNudge text:\n1. \"How's progress? Need any help?\"\n2. \"Please wrap up soon. What's blocking you?\"\n3. \"Final check. Will escalate in 5 min if no response.\"\n\nRecord decision and rationale.\nNeeds: load-history\n\n## Step: execute\nTake the decided action for toast.\n\n**nudge-N**:\n```bash\ntmux send-keys -t gt-gastown-toast \"{{nudge_text}}\" Enter\n```\n\n**pre-kill-verify**:\n```bash\ncd polecats/toast\ngit status # Must be clean\ngit log origin/main..HEAD # Check for unpushed\nbd show \u003cassigned-issue\u003e # Verify closed/deferred\n```\nIf clean: kill session, remove worktree, delete branch\nIf dirty: record failure, retry next cycle\n\n**escalate**:\n```bash\ngt mail send mayor/ -s \"Escalation: toast stuck\" -m \"...\"\n```\n\n**none**: No action needed.\n\nRecord: action taken, result, updated nudge count.\nNeeds: decide\n\n## Output\n\nThe arm completes with:\n- action_taken: none | nudge-1 | nudge-2 | nudge-3 | killed | escalated\n- result: success | failed | pending\n- updated_state: New nudge count and timestamp for toast\n\nThis data feeds back to the parent patrol's aggregate step.\n---\nbonded_from: mol-polecat-arm\nbonded_to: gt-dyz3\nbonded_ref: arm-toast\nbonded_at: 2025-12-23T10:00:00Z\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T21:55:26.823047-08:00","updated_at":"2025-12-24T21:55:26.997293-08:00","closed_at":"2025-12-24T21:55:26.997293-08:00","close_reason":"Closed","dependencies":[{"issue_id":"gt-dyz3.1","depends_on_id":"gt-dyz3","type":"parent-child","created_at":"2025-12-24T21:55:26.823942-08:00","created_by":"daemon"}]} +{"id":"gt-e1r","title":"CLI: rig commands (add, list, show, remove)","description":"GGT needs rig management commands.\n\nMissing Commands:\n- gt rig add \u003cgit-url\u003e [--name NAME] - Add rig to workspace\n- gt rig list - List all rigs with status\n- gt rig show \u003crig\u003e - Show detailed rig info\n- gt rig remove \u003crig\u003e - Remove a rig\n\nPGT Reference: gastown-py/src/gastown/cli/rig_cmd.py\n\nCurrent State:\n- gt init creates rig structure but no ongoing management\n- Rig discovery in internal/rig/manager.go but not exposed via CLI","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-16T14:46:33.23951-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-e1y","title":"Worker prompting: Beads write access","description":"Add beads write access section to polecat AGENTS.md.template.\n\n## Beads Access Section for Prompting\n\n```markdown\n## Beads Access\n\nYou have **full beads access** - create, update, and close issues.\n\n### Quick Reference\n\n```bash\n# View work\nbd ready # Issues ready (no blockers)\nbd list # All open issues\nbd show \u003cid\u003e # Issue details\n\n# Create issues\nbd create --title=\"Fix bug\" --type=bug --priority=2\nbd create --title=\"Add feature\" --type=feature\n\n# Update issues\nbd update \u003cid\u003e --status=in_progress # Claim work\nbd close \u003cid\u003e # Mark complete\n\n# Sync (required before merge!)\nbd sync # Commit beads changes to git\n```\n\n### When to Create Issues\n\nCreate beads issues when you discover work that:\n- Is outside your current task scope\n- Would benefit from tracking\n- Should be done by someone else\n\n**Good examples**:\n```bash\nbd create --title=\"Race condition in auth\" --type=bug --priority=1\nbd create --title=\"Document API rate limits\" --type=task --priority=3\n```\n\n**Don't create for**:\n- Tiny fixes you can do in 2 minutes\n- Vague \"improvements\" with no scope\n- Work already tracked elsewhere\n\n### Beads Sync Protocol\n\n**CRITICAL**: Always sync beads before merging!\n\n```bash\nbd sync # Commits beads changes\ngit add .beads/\ngit commit -m \"beads: sync\"\n```\n\nIf you forget to sync, beads changes are lost when session ends.\n```\n\n## Implementation\n\nAdd to AGENTS.md.template polecat section.","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-15T19:47:18.459363-08:00","updated_at":"2025-12-15T20:48:03.813068-08:00","dependencies":[{"issue_id":"gt-e1y","depends_on_id":"gt-l3c","type":"blocks","created_at":"2025-12-15T19:47:35.81183-08:00","created_by":"daemon"}]} {"id":"gt-e3ya","title":"Remove redundant gt prime SendKeys from crew commands","description":"The crew commands (gt crew at, gt crew restart) still send 'gt prime' via SendKeys after session creation:\n- internal/cmd/crew_at.go:97, 121\n- internal/cmd/crew_lifecycle.go:202\n\nThis is now redundant because SessionStart hook handles priming automatically.\n\n**Low priority** - these aren't causing bugs (just duplicate work), unlike the spawn race condition that was fixed. Can be cleaned up when convenient.","status":"open","priority":4,"issue_type":"task","created_at":"2025-12-22T18:00:05.798858-08:00","updated_at":"2025-12-22T18:00:05.798858-08:00"} +{"id":"gt-e5o","title":"Fix role detection for nested rig structures","description":"When gastown/ has its own mayor/ dir, workspace detection finds it as town root instead of ~/ai. This breaks polecat/refinery/witness detection when running from within a rig.","status":"tombstone","priority":2,"issue_type":"bug","created_at":"2025-12-17T16:47:18.519581-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} {"id":"gt-e74q","title":"Digest: mol-deacon-patrol @ 2025-12-24 19:44","description":"Patrol 5: All healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T19:44:17.155633-08:00","updated_at":"2025-12-24T19:44:17.155633-08:00","closed_at":"2025-12-24T19:44:17.155556-08:00","close_reason":"Squashed from wisp gt-co5 (9 issues)"} {"id":"gt-e76","title":"gt mail reply/thread: Conversation support","description":"Add mail conversation features:\n\n- gt mail reply \u003cid\u003e -m 'message' - Reply to a message\n- gt mail thread \u003cid\u003e - Show all messages in a thread\n\nEnables back-and-forth communication between agents.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-17T21:50:06.215773-08:00","updated_at":"2025-12-19T12:05:27.342212-08:00","closed_at":"2025-12-19T12:05:27.342212-08:00","dependencies":[{"issue_id":"gt-e76","depends_on_id":"gt-hw6","type":"blocks","created_at":"2025-12-17T22:23:43.106435-08:00","created_by":"daemon"}]} {"id":"gt-e9k","title":"Workspace cleanup: preflight and postflight","description":"Workspace preflight and postflight commands for clean state management.\n\n## Preflight\n```\ngt preflight [--rig \u003crig\u003e] [--dry-run]\n```\n\nRun before starting batch work:\n1. Clean stale mail in inboxes\n2. Check for stuck workers (warn)\n3. Check rig health (polecats, refinery)\n4. Verify git state is clean\n5. Run bd sync to ensure beads current\n\n## Postflight\n```\ngt postflight [--rig \u003crig\u003e] [--archive-mail] [--dry-run]\n```\n\nRun after batch work completes:\n1. Archive old mail with --archive-mail\n2. Clean up stale integration branches\n3. Sync beads\n4. Report on rig state\n\n## Implementation\n```go\nfunc Preflight(rigName string, dryRun bool) (*PreflightReport, error)\nfunc Postflight(rigName string, opts PostflightOptions) (*PostflightReport, error)\n```\n\n## Report Structures\n```go\ntype PreflightReport struct {\n MailCleaned int\n RigHealthy bool\n StuckWorkers []string\n Warnings []string\n}\n\ntype PostflightReport struct {\n MailArchived int\n BranchesCleaned int\n Warnings []string\n}\n```\n\n## Note\n\nThese are workspace maintenance commands, not tied to \"swarm\" lifecycle. Run them anytime to keep the rig clean.\n\n## Acceptance Criteria\n- [ ] Preflight cleans stale state\n- [ ] Postflight archives old mail\n- [ ] Both have --dry-run mode\n- [ ] Clear reports of actions taken","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-16T14:47:15.997677-08:00","updated_at":"2025-12-16T17:25:01.55269-08:00"} @@ -557,6 +615,7 @@ {"id":"gt-eevs","title":"Digest: mol-deacon-patrol","description":"Patrol #6: Stable","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T23:31:47.668271-08:00","updated_at":"2025-12-24T23:31:47.668271-08:00","closed_at":"2025-12-24T23:31:47.668238-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-eg1es","title":"Test Patrol for Bonding","description":"Parent issue for mol bond CLI test","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T01:05:28.517626-08:00","updated_at":"2025-12-25T01:33:00.104285-08:00","closed_at":"2025-12-25T01:33:00.104285-08:00","close_reason":"Test pollution cleanup"} {"id":"gt-eg1es.1","title":"Polecat Arm (arm-toast)","description":"Single polecat inspection and action cycle.\n\nThis molecule is bonded dynamically by mol-witness-patrol's survey-workers step.\nEach polecat being monitored gets one arm that runs in parallel with other arms.\n\n## Variables\n\n| Variable | Required | Description |\n|----------|----------|-------------|\n| polecat_name | Yes | Name of the polecat to inspect |\n| rig | Yes | Rig containing the polecat |\n\n## Step: capture\nCapture recent tmux output for toast.\n\n```bash\ntmux capture-pane -t gt-gastown-toast -p | tail -50\n```\n\nRecord:\n- Last activity timestamp (when was last tool call?)\n- Visible errors or stack traces\n- Completion indicators (\"Done\", \"Finished\", etc.)\n\n## Step: assess\nCategorize polecat state based on captured output.\n\nStates:\n- **working**: Recent tool calls, active processing\n- **idle**: At prompt, no recent activity\n- **error**: Showing errors or stack traces\n- **requesting_shutdown**: Sent LIFECYCLE/Shutdown mail\n- **done**: Showing completion indicators\n\nCalculate: minutes since last activity.\nNeeds: capture\n\n## Step: load-history\nRead nudge history for toast from patrol state.\n\n```\nnudge_count = state.nudges[toast].count\nlast_nudge_time = state.nudges[toast].timestamp\n```\n\nThis data was loaded by the parent patrol's load-state step and passed\nto the arm via the bonding context.\nNeeds: assess\n\n## Step: decide\nApply the nudge matrix to determine action for toast.\n\n| State | Idle Time | Nudge Count | Action |\n|-------|-----------|-------------|--------|\n| working | any | any | none |\n| idle | \u003c10min | any | none |\n| idle | 10-15min | 0 | nudge-1 (gentle) |\n| idle | 15-20min | 1 | nudge-2 (direct) |\n| idle | 20+min | 2 | nudge-3 (final) |\n| idle | any | 3 | escalate |\n| error | any | any | assess-severity |\n| requesting_shutdown | any | any | pre-kill-verify |\n| done | any | any | pre-kill-verify |\n\nNudge text:\n1. \"How's progress? Need any help?\"\n2. \"Please wrap up soon. What's blocking you?\"\n3. \"Final check. Will escalate in 5 min if no response.\"\n\nRecord decision and rationale.\nNeeds: load-history\n\n## Step: execute\nTake the decided action for toast.\n\n**nudge-N**:\n```bash\ntmux send-keys -t gt-gastown-toast \"{{nudge_text}}\" Enter\n```\n\n**pre-kill-verify**:\n```bash\ncd polecats/toast\ngit status # Must be clean\ngit log origin/main..HEAD # Check for unpushed\nbd show \u003cassigned-issue\u003e # Verify closed/deferred\n```\nIf clean: kill session, remove worktree, delete branch\nIf dirty: record failure, retry next cycle\n\n**escalate**:\n```bash\ngt mail send mayor/ -s \"Escalation: toast stuck\" -m \"...\"\n```\n\n**none**: No action needed.\n\nRecord: action taken, result, updated nudge count.\nNeeds: decide\n\n## Output\n\nThe arm completes with:\n- action_taken: none | nudge-1 | nudge-2 | nudge-3 | killed | escalated\n- result: success | failed | pending\n- updated_state: New nudge count and timestamp for toast\n\nThis data feeds back to the parent patrol's aggregate step.\n---\nbonded_from: mol-polecat-arm\nbonded_to: gt-eg1es\nbonded_ref: arm-toast\nbonded_at: 2025-12-23T10:00:00Z\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T01:05:28.606112-08:00","updated_at":"2025-12-25T01:05:28.804164-08:00","closed_at":"2025-12-25T01:05:28.804164-08:00","close_reason":"Closed","dependencies":[{"issue_id":"gt-eg1es.1","depends_on_id":"gt-eg1es","type":"parent-child","created_at":"2025-12-25T01:05:28.606517-08:00","created_by":"daemon"}]} +{"id":"gt-egu","title":"gt refinery attach: Attach to refinery session","description":"Add 'gt refinery attach [rig]' command to attach to refinery tmux session.\n\nMirrors 'gt mayor attach' pattern. If rig not specified, use current rig context.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-17T21:47:19.164342-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-egu","depends_on_id":"gt-hw6","type":"blocks","created_at":"2025-12-17T22:22:47.578871-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-egyyq","title":"Digest: mol-deacon-patrol","description":"Patrol 4: all clear","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T11:04:17.854699-08:00","updated_at":"2025-12-25T11:04:17.854699-08:00","closed_at":"2025-12-25T11:04:17.85467-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-eh7p","title":"Digest: mol-deacon-patrol","description":"Patrol #1: All agents healthy, no messages, no orphans","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T23:28:50.209258-08:00","updated_at":"2025-12-24T23:28:50.209258-08:00","closed_at":"2025-12-24T23:28:50.209233-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-eln2","title":"Digest: mol-deacon-patrol","description":"Patrol OK: 0 polecats, 6 core sessions up, town quiet","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-23T02:11:42.107532-08:00","updated_at":"2025-12-23T02:11:42.107532-08:00","closed_at":"2025-12-23T02:11:42.107497-08:00","close_reason":"Squashed from 5 wisps"} @@ -586,7 +645,11 @@ {"id":"gt-f8rlu","title":"Digest: mol-deacon-patrol","description":"Patrol 19: All agents healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T06:11:26.150957-08:00","updated_at":"2025-12-25T06:11:26.150957-08:00","closed_at":"2025-12-25T06:11:26.150923-08:00","close_reason":"Squashed from 8 wisps"} {"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":"tombstone","priority":0,"issue_type":"task","created_at":"2025-12-15T16:36:50.163851-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-f9x.10","title":"Extended addressing: Parse [machine:]rig/polecat","description":"Extended addressing for cross-machine operations.\n\n## Address Format\n\n```\n[machine:]rig/polecat\n```\n\nExamples:\n- `wyvern/Toast` - Local machine, wyvern rig, Toast polecat\n- `gcp-vm-1:wyvern/Toast` - Remote machine\n- `wyvern/` - Broadcast to rig\n- `gcp-vm-1:wyvern/` - Broadcast to remote rig\n\n## Parser\n\n```go\ntype Address struct {\n Machine string // empty = local\n Rig string\n Polecat string // empty = broadcast\n}\n\nfunc ParseAddress(s string) (*Address, error)\nfunc (a *Address) String() string\nfunc (a *Address) IsLocal() bool\nfunc (a *Address) IsBroadcast() bool\n```\n\n## Validation\n\n```go\nfunc (a *Address) Validate(registry *MachineRegistry) error\n```\n- Machine must exist in registry (if specified)\n- Rig must exist on machine\n- Polecat must exist (if specified)\n\n## Usage\n\nAll CLI commands that take addresses use ParseAddress:\n```go\n// gt mail send gcp-vm-1:wyvern/Toast -s \"Hello\"\naddr, _ := ParseAddress(\"gcp-vm-1:wyvern/Toast\")\nconn, _ := registry.Connection(addr.Machine)\n// Use conn for operations\n```\n\n## Backward Compatibility\n\nExisting `rig/polecat` addresses work unchanged (Machine defaults to local).","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-15T16:37:23.426567-08:00","updated_at":"2025-12-15T23:17:18.734281-08:00","dependencies":[{"issue_id":"gt-f9x.10","depends_on_id":"gt-f9x","type":"parent-child","created_at":"2025-12-15T16:37:23.426926-08:00","created_by":"daemon"}]} +{"id":"gt-f9x.2","title":"Workspace detection: Find() walking up directory tree","description":"Find workspace root by walking up directory tree looking for Gas Town markers.\n\n## Detection Logic\n\nWalk up from current directory, looking for:\n1. `config/town.json` - Primary marker (visible config dir per gt-iib)\n2. `mayor/` directory at town level - Secondary marker\n\nStop at filesystem root if neither found.\n\n## Interface\n\n```go\n// Find locates the town root from the given directory\nfunc Find(startDir string) (string, error)\n\n// FindOrError is like Find but returns a user-friendly error\nfunc FindOrError(startDir string) (string, error)\n```\n\n## Return Values\n\n- Success: Absolute path to town root\n- Not found: Empty string + specific error\n- Error: Empty string + wrapped error\n\n## Edge Cases\n\n- Symlinks: Follow them (use filepath.EvalSymlinks)\n- Permissions: Return error if can't read directory\n- Nested towns: Return nearest ancestor (shouldn't happen in practice\nEOF\n)","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-15T16:36:51.419316-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-f9x.2","depends_on_id":"gt-f9x","type":"parent-child","created_at":"2025-12-15T16:36:51.419635-08:00","created_by":"daemon"},{"issue_id":"gt-f9x.2","depends_on_id":"gt-f9x.1","type":"blocks","created_at":"2025-12-15T16:37:32.426416-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-f9x.3","title":"gt install command: Create workspace structure","description":"Create Gas Town workspace structure.\n\n## Command\n\n```\ngt install [path]\n```\n\nIf path omitted, uses current directory.\n\n## Created Structure\n\n```\n\u003cpath\u003e/\n├── config/\n│ ├── town.json # {\"type\": \"town\", \"version\": 1, ...}\n│ └── rigs.json # {\"version\": 1, \"rigs\": {}}\n│\n└── mayor/\n ├── CLAUDE.md # Mayor role prompting (from template)\n ├── mail/\n │ └── inbox.jsonl # Empty inbox\n └── state.json # Initial mayor state\n```\n\n## Implementation\n\n```go\nfunc Install(path string, opts InstallOptions) error\n\ntype InstallOptions struct {\n TownName string // defaults to directory name\n Force bool // overwrite existing\n}\n```\n\n## Steps\n\n1. Validate path (exists, writable)\n2. Check not already a town (unless --force)\n3. Create config/ directory\n4. Write town.json with name and timestamp\n5. Write empty rigs.json\n6. Create mayor/ directory structure\n7. Write CLAUDE.md from template\n8. Create empty inbox.jsonl\n9. Write initial state.json\n\n## Error Cases\n\n- Path does not exist: Create it (like mkdir -p)\n- Already a town: Error unless --force\n- Permission denied: Clear error message\n- Inside existing town: Warn (nested towns not recommended)\n\n## Templates\n\nMayor CLAUDE.md comes from embedded template (see gt-u1j.20).","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-15T16:36:53.455589-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-f9x.3","depends_on_id":"gt-f9x","type":"parent-child","created_at":"2025-12-15T16:36:53.455924-08:00","created_by":"daemon"},{"issue_id":"gt-f9x.3","depends_on_id":"gt-f9x.1","type":"blocks","created_at":"2025-12-15T16:37:32.513796-08:00","created_by":"daemon"},{"issue_id":"gt-f9x.3","depends_on_id":"gt-f9x.2","type":"blocks","created_at":"2025-12-15T16:37:32.597456-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-f9x.4","title":"Doctor framework: Check interface, Result types, Report","description":"Framework for gt doctor health checks.\n\n## Check Interface\n\n```go\ntype Check interface {\n Name() string\n Description() string\n Run(ctx *CheckContext) *CheckResult\n Fix(ctx *CheckContext) error // optional auto-fix\n CanFix() bool\n}\n\ntype CheckContext struct {\n TownRoot string\n RigName string // empty for town-level checks\n Verbose bool\n}\n\ntype CheckResult struct {\n Status CheckStatus\n Message string\n Details []string // additional info\n FixHint string // suggestion if not auto-fixable\n}\n\ntype CheckStatus int\nconst (\n StatusOK CheckStatus = iota\n StatusWarning\n StatusError\n)\n```\n\n## Report\n\n```go\ntype Report struct {\n Timestamp time.Time\n Checks []CheckResult\n Summary ReportSummary\n}\n\ntype ReportSummary struct {\n Total int\n OK int\n Warnings int\n Errors int\n}\n\nfunc (r *Report) Print(w io.Writer, verbose bool)\n```\n\n## Doctor Runner\n\n```go\ntype Doctor struct {\n checks []Check\n}\n\nfunc NewDoctor() *Doctor\nfunc (d *Doctor) Register(check Check)\nfunc (d *Doctor) Run(ctx *CheckContext) *Report\nfunc (d *Doctor) Fix(ctx *CheckContext) *Report // run with auto-fix\n```\n\n## Built-in Checks\n\nTown-level (gt-f9x.5):\n- ConfigExists, ConfigValid\n- StateExists, StateValid\n- MayorMailboxExists\n- RigsRegistryValid\n\nRig-level (gt-f9x.6):\n- RigCloneExists\n- GitExcludeConfigured\n- WitnessExists, RefineryExists\n- PolecatClonesValid","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-15T16:37:03.81542-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-f9x.4","depends_on_id":"gt-f9x","type":"parent-child","created_at":"2025-12-15T16:37:03.815763-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-f9x.5","title":"Workspace doctor checks: Config, state, mail, Mayor, rigs","description":"Workspace-level doctor checks.\n\n## Checks\n\n### ConfigExists\n- Verify config/ directory exists\n- Verify config/town.json exists\n- Fix: Cannot auto-fix (need gt install)\n\n### ConfigValid\n- Parse town.json\n- Verify required fields (type, version, name)\n- Verify type == \"town\"\n- Fix: Cannot auto-fix\n\n### RigsRegistryValid\n- Parse config/rigs.json\n- Verify each registered rig directory exists\n- Warn on missing rigs\n- Fix: Remove missing rigs from registry\n\n### MayorExists\n- Verify mayor/ directory exists\n- Verify mayor/CLAUDE.md exists\n- Fix: Create from template\n\n### MayorMailboxExists\n- Verify mayor/mail/ directory exists\n- Verify mayor/mail/inbox.jsonl exists (can be empty)\n- Fix: Create directory and empty file\n\n### MayorStateValid\n- Parse mayor/state.json if exists\n- Verify valid JSON\n- Fix: Reset to default state\n\n## Implementation\n\n```go\nvar WorkspaceChecks = []Check{\n \u0026ConfigExistsCheck{},\n \u0026ConfigValidCheck{},\n \u0026RigsRegistryValidCheck{},\n \u0026MayorExistsCheck{},\n \u0026MayorMailboxExistsCheck{},\n \u0026MayorStateValidCheck{},\n}\n```","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-15T16:37:05.267701-08:00","updated_at":"2025-12-23T14:27:07.665114-08:00","dependencies":[{"issue_id":"gt-f9x.5","depends_on_id":"gt-f9x","type":"parent-child","created_at":"2025-12-15T16:37:05.268035-08:00","created_by":"daemon"},{"issue_id":"gt-f9x.5","depends_on_id":"gt-f9x.4","type":"blocks","created_at":"2025-12-15T16:37:34.289236-08:00","created_by":"daemon"},{"issue_id":"gt-f9x.5","depends_on_id":"gt-f9x.2","type":"blocks","created_at":"2025-12-15T16:37:34.380374-08:00","created_by":"daemon"}]} {"id":"gt-f9x.6","title":"Rig doctor checks: Refinery health, clones, gitignore","description":"Rig-level doctor checks.\n\n## Checks\n\n### RigIsGitRepo\n- Verify .git/ directory exists\n- Verify git status works\n- Fix: Cannot auto-fix\n\n### GitExcludeConfigured\n- Check .git/info/exclude contains Gas Town dirs\n- Required entries: polecats/ witness/ refinery/ mayor/\n- Fix: Append missing entries\n\n### WitnessExists\n- Verify witness/ directory exists\n- Verify witness/rig/ is a git clone\n- Verify witness/mail/inbox.jsonl exists\n- Fix: Create structure, clone repo\n\n### RefineryExists\n- Verify refinery/ directory exists\n- Verify refinery/rig/ is a git clone\n- Verify refinery/mail/inbox.jsonl exists\n- Fix: Create structure, clone repo\n\n### MayorCloneExists\n- Verify mayor/ directory exists\n- Verify mayor/rig/ is a git clone\n- Fix: Create structure, clone repo\n\n### PolecatClonesValid\n- For each polecat in polecats/:\n - Verify is a git clone\n - Verify on polecat branch\n - Warn if has uncommitted changes\n- Fix: Cannot auto-fix (data loss risk)\n\n### BeadsConfigValid (if applicable)\n- If .beads/ exists, verify bd commands work\n- Check beads sync status\n- Warn if out of sync\n- Fix: Run bd sync\n\n## Implementation\n\n```go\nvar RigChecks = []Check{\n \u0026RigIsGitRepoCheck{},\n \u0026GitExcludeConfiguredCheck{},\n \u0026WitnessExistsCheck{},\n \u0026RefineryExistsCheck{},\n \u0026MayorCloneExistsCheck{},\n \u0026PolecatClonesValidCheck{},\n \u0026BeadsConfigValidCheck{},\n}\n```","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-15T16:37:06.543281-08:00","updated_at":"2025-12-23T14:27:07.763085-08:00","dependencies":[{"issue_id":"gt-f9x.6","depends_on_id":"gt-f9x","type":"parent-child","created_at":"2025-12-15T16:37:06.543796-08:00","created_by":"daemon"},{"issue_id":"gt-f9x.6","depends_on_id":"gt-f9x.4","type":"blocks","created_at":"2025-12-15T16:37:34.46868-08:00","created_by":"daemon"}]} {"id":"gt-f9x.7","title":"Connection interface: Protocol for local/remote ops","description":"Abstract interface for local vs remote (SSH) operations.\n\n## Concept\n\nEnable Gas Town to manage rigs on remote machines via SSH. The Connection interface abstracts whether operations happen locally or remotely.\n\n## Interface\n\n```go\ntype Connection interface {\n // Identification\n Name() string\n IsLocal() bool\n\n // File operations\n ReadFile(path string) ([]byte, error)\n WriteFile(path string, data []byte, perm os.FileMode) error\n MkdirAll(path string, perm os.FileMode) error\n Remove(path string) error\n Stat(path string) (os.FileInfo, error)\n Glob(pattern string) ([]string, error)\n\n // Command execution\n Exec(cmd string, args ...string) ([]byte, error)\n ExecDir(dir, cmd string, args ...string) ([]byte, error)\n\n // Tmux (for session management)\n TmuxNewSession(name, dir string) error\n TmuxKillSession(name string) error\n TmuxSendKeys(session, keys string) error\n TmuxCapturePane(session string, lines int) (string, error)\n}\n```\n\n## Implementations\n\n- LocalConnection (gt-f9x.8): Direct file/exec operations\n- SSHConnection (future): Operations via SSH\n\n## Usage\n\n```go\nfunc NewRigManager(conn Connection, ...) *RigManager\n\n// Operations work the same regardless of connection type\nrm.DiscoverRigs() // uses conn.Glob, conn.ReadFile\n```\n\n## Design Notes\n\n- Connection obtained from MachineRegistry (gt-f9x.9)\n- Default is always local\n- SSH connection requires machine config (host, key, user)","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-15T16:37:07.764838-08:00","updated_at":"2025-12-15T23:17:18.465919-08:00","dependencies":[{"issue_id":"gt-f9x.7","depends_on_id":"gt-f9x","type":"parent-child","created_at":"2025-12-15T16:37:07.765169-08:00","created_by":"daemon"}]} @@ -598,6 +661,7 @@ {"id":"gt-fgms","title":"Simplify mail wisps: remove dual-routing, use ephemeral flag","description":"\n## Context\n\ngt-lg66 implemented dual-inbox architecture with separate .beads-wisp/ directory.\nThis was over-engineered. See bd-bkul for the simpler approach.\n\n## Work\n\nOnce beads implements bd-bkul (ephemeral flag in single db):\n\n1. Revert/simplify router.go:\n - Remove resolveWispDir()\n - Remove shouldBeEphemeral() auto-detection (beads handles this)\n - Send() just passes --ephemeral flag to bd create\n\n2. Revert/simplify mailbox.go:\n - Remove wispDir field\n - Remove listFromDir/getFromDir dual-source logic\n - Remove closeInDir dual-source logic\n - Single query, beads returns both types with Source marked\n\n3. Keep in mail.go:\n - --ephemeral flag (passed through to bd)\n - (ephemeral) display indicator\n\n4. Keep in spawn.go:\n - Ephemeral: true on lifecycle messages\n\n## Depends On\n\nbd-bkul: Simplify wisp architecture in beads\n","status":"closed","priority":0,"issue_type":"task","created_at":"2025-12-24T20:08:18.111862-08:00","updated_at":"2025-12-24T20:16:01.457558-08:00","closed_at":"2025-12-24T20:16:01.457558-08:00","close_reason":"Simplified mail wisps: removed dual-routing, now uses --wisp flag to bd create"} {"id":"gt-fjvo","title":"mol-code-review: Self-improving code review molecule","description":"Create a code review molecule that enables Gas Town to self-improve through automated PR review. Flywheel: review generates quality checks, discovered issues, pattern learning.","status":"open","priority":1,"issue_type":"feature","created_at":"2025-12-20T21:03:10.117272-08:00","updated_at":"2025-12-20T21:03:10.117272-08:00"} {"id":"gt-fk8ys","title":"Digest: mol-deacon-patrol","description":"Patrol 6: All agents healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T01:26:31.406007-08:00","updated_at":"2025-12-25T01:26:31.406007-08:00","closed_at":"2025-12-25T01:26:31.405973-08:00","close_reason":"Squashed from 8 wisps"} +{"id":"gt-fko","title":"Add Gas Town theory of operation to all role primings","description":"All roles (Mayor, Witness, Refinery, Polecat) should get basic GT architecture context: harness, rigs, agents, mail, beads workflow","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-17T16:42:46.445526-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-fko","depends_on_id":"gt-l1o","type":"blocks","created_at":"2025-12-17T16:42:54.87032-08:00","created_by":"daemon"},{"issue_id":"gt-fko","depends_on_id":"gt-dkc","type":"blocks","created_at":"2025-12-17T16:42:56.409618-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-fly0","title":"bd close --continue: auto-advance to next molecule step","description":"Add --continue flag to bd close for seamless molecule step transitions.\n\n## Usage\n\nbd close \u003cstep-id\u003e --continue [--no-auto]\n\n## Behavior\n\n1. Closes the specified step\n2. Finds next ready step in same molecule (sibling/child)\n3. By default, marks it in_progress (--no-auto to skip)\n4. Outputs the transition\n\n## Output\n\n[checkmark] Closed gt-abc.3: Implement feature\n\nNext ready in molecule:\n gt-abc.4: Write tests\n\n[arrow] Marked in_progress (use --no-auto to skip)\n\n## If no next step\n\n[checkmark] Closed gt-abc.6: Exit decision\n\nMolecule gt-abc complete! All steps closed.\nConsider: bd mol squash gt-abc --summary '...'\n\n## Key behaviors\n- Detects parent molecule from closed step\n- Finds next unblocked sibling\n- Auto-claims by default (propulsion principle)\n- Graceful handling when molecule is complete\n\n## Beads feature\nThis is a bd command - needs implementation in beads repo.","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-22T17:01:00.437929-08:00","updated_at":"2025-12-22T17:04:13.464939-08:00","closed_at":"2025-12-22T17:04:13.464939-08:00","close_reason":"Moved to beads: bd-ieyy"} {"id":"gt-fm75","title":"os.Exit() calls in library code prevent proper error handling","description":"internal/cmd/mail.go and other files have os.Exit() calls.\n\nIssues:\n- Hard to test\n- Prevents graceful shutdown\n- Can lose unsaved state\n- Doesn't compose well in library code\n\nShould return errors instead of calling os.Exit() directly.\nLet main() decide how to exit.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-24T12:51:19.086806-08:00","updated_at":"2025-12-24T12:51:19.086806-08:00","dependencies":[{"issue_id":"gt-fm75","depends_on_id":"gt-jo9n","type":"blocks","created_at":"2025-12-24T12:52:07.642098-08:00","created_by":"daemon"}]} {"id":"gt-fmkr","title":"Merge: gt-pyqv","description":"branch: polecat/dementus\ntarget: main\nsource_issue: gt-pyqv\nrig: gastown","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-20T01:11:33.237777-08:00","updated_at":"2025-12-21T17:20:27.508367-08:00","closed_at":"2025-12-21T17:20:27.508367-08:00","close_reason":"ORPHANED: Branch never pushed, worktree deleted"} @@ -728,7 +792,11 @@ {"id":"gt-ie33.1","title":"Polecat Arm (arm-toast)","description":"Single polecat inspection and action cycle.\n\nThis molecule is bonded dynamically by mol-witness-patrol's survey-workers step.\nEach polecat being monitored gets one arm that runs in parallel with other arms.\n\n## Variables\n\n| Variable | Required | Description |\n|----------|----------|-------------|\n| polecat_name | Yes | Name of the polecat to inspect |\n| rig | Yes | Rig containing the polecat |\n\n## Step: capture\nCapture recent tmux output for toast.\n\n```bash\ntmux capture-pane -t gt-gastown-toast -p | tail -50\n```\n\nRecord:\n- Last activity timestamp (when was last tool call?)\n- Visible errors or stack traces\n- Completion indicators (\"Done\", \"Finished\", etc.)\n\n## Step: assess\nCategorize polecat state based on captured output.\n\nStates:\n- **working**: Recent tool calls, active processing\n- **idle**: At prompt, no recent activity\n- **error**: Showing errors or stack traces\n- **requesting_shutdown**: Sent LIFECYCLE/Shutdown mail\n- **done**: Showing completion indicators\n\nCalculate: minutes since last activity.\nNeeds: capture\n\n## Step: load-history\nRead nudge history for toast from patrol state.\n\n```\nnudge_count = state.nudges[toast].count\nlast_nudge_time = state.nudges[toast].timestamp\n```\n\nThis data was loaded by the parent patrol's load-state step and passed\nto the arm via the bonding context.\nNeeds: assess\n\n## Step: decide\nApply the nudge matrix to determine action for toast.\n\n| State | Idle Time | Nudge Count | Action |\n|-------|-----------|-------------|--------|\n| working | any | any | none |\n| idle | \u003c10min | any | none |\n| idle | 10-15min | 0 | nudge-1 (gentle) |\n| idle | 15-20min | 1 | nudge-2 (direct) |\n| idle | 20+min | 2 | nudge-3 (final) |\n| idle | any | 3 | escalate |\n| error | any | any | assess-severity |\n| requesting_shutdown | any | any | pre-kill-verify |\n| done | any | any | pre-kill-verify |\n\nNudge text:\n1. \"How's progress? Need any help?\"\n2. \"Please wrap up soon. What's blocking you?\"\n3. \"Final check. Will escalate in 5 min if no response.\"\n\nRecord decision and rationale.\nNeeds: load-history\n\n## Step: execute\nTake the decided action for toast.\n\n**nudge-N**:\n```bash\ntmux send-keys -t gt-gastown-toast \"{{nudge_text}}\" Enter\n```\n\n**pre-kill-verify**:\n```bash\ncd polecats/toast\ngit status # Must be clean\ngit log origin/main..HEAD # Check for unpushed\nbd show \u003cassigned-issue\u003e # Verify closed/deferred\n```\nIf clean: kill session, remove worktree, delete branch\nIf dirty: record failure, retry next cycle\n\n**escalate**:\n```bash\ngt mail send mayor/ -s \"Escalation: toast stuck\" -m \"...\"\n```\n\n**none**: No action needed.\n\nRecord: action taken, result, updated nudge count.\nNeeds: decide\n\n## Output\n\nThe arm completes with:\n- action_taken: none | nudge-1 | nudge-2 | nudge-3 | killed | escalated\n- result: success | failed | pending\n- updated_state: New nudge count and timestamp for toast\n\nThis data feeds back to the parent patrol's aggregate step.\n---\nbonded_from: mol-polecat-arm\nbonded_to: gt-ie33\nbonded_ref: arm-toast\nbonded_at: 2025-12-23T10:00:00Z\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T00:10:09.989188-08:00","updated_at":"2025-12-24T00:10:10.192864-08:00","closed_at":"2025-12-24T00:10:10.192864-08:00"} {"id":"gt-ieem","title":"Test Patrol Parent","description":"Test parent for Christmas Ornament pattern","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T21:04:09.817241-08:00","updated_at":"2025-12-25T01:33:00.484839-08:00","closed_at":"2025-12-25T01:33:00.484839-08:00","close_reason":"Test pollution cleanup"} {"id":"gt-ieem.1","title":"Test Polecat Arm","description":"Test child for bonding pattern","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T21:04:09.907713-08:00","updated_at":"2025-12-25T01:33:00.467952-08:00","closed_at":"2025-12-25T01:33:00.467952-08:00","close_reason":"Test pollution cleanup","dependencies":[{"issue_id":"gt-ieem.1","depends_on_id":"gt-ieem","type":"parent-child","created_at":"2025-12-24T21:04:09.908178-08:00","created_by":"daemon"}]} +{"id":"gt-iep9","title":"mol-deacon-patrol","description":"[RESURRECTED] This issue was deleted but recreated as a tombstone to preserve hierarchical structure.\n\nOriginal description:\nDeacon patrol molecule template. Label: template","status":"tombstone","priority":4,"issue_type":"epic","created_at":"2025-12-21T17:50:22.545763-08:00","updated_at":"2025-12-25T11:44:16.881599-08:00","labels":["template"],"deleted_at":"2025-12-25T11:44:16.881599-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"epic"} +{"id":"gt-iep9.1","title":"inbox-check","description":"Handle callbacks from agents. Check gt mail inbox, process lifecycle requests.","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-21T17:50:57.090986-08:00","updated_at":"2025-12-25T11:44:16.881599-08:00","dependencies":[{"issue_id":"gt-iep9.1","depends_on_id":"gt-iep9","type":"parent-child","created_at":"2025-12-21T17:50:57.092836-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T11:44:16.881599-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-iep9.7","title":"loop-or-exit","description":"Decision: burn and loop if context low, exit for respawn if context high.","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-21T17:51:04.755716-08:00","updated_at":"2025-12-25T11:44:16.881599-08:00","dependencies":[{"issue_id":"gt-iep9.7","depends_on_id":"gt-iep9","type":"parent-child","created_at":"2025-12-21T17:51:04.75713-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T11:44:16.881599-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-ih0s","title":"Fix blocking bugs (gt-dsfi, gt-n7z7, gm-c6b)","description":"Fix bugs blocking Witness functionality:\n\n1. gt-dsfi: handoff deadlock\n - Polecats hang when trying to exit\n - Blocks shutdown request handler\n\n2. gt-n7z7: refinery foreground race condition \n - Sometimes detects parent as already running\n - Blocks reliable Refinery startup\n\n3. gm-c6b: mail coordination\n - Cross-rig mail should use town-level database\n - Affects Witness \u003c-\u003e Mayor communication\n\nThese should be fixed early as they'll block integration testing.","notes":"Fixed gt-dsfi and gt-n7z7. Issue gm-c6b not found in database.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T03:14:25.803822-08:00","updated_at":"2025-12-20T07:47:50.444171-08:00","closed_at":"2025-12-20T07:47:50.444171-08:00","dependencies":[{"issue_id":"gt-ih0s","depends_on_id":"gt-53w6","type":"parent-child","created_at":"2025-12-20T03:14:37.430142-08:00","created_by":"daemon"}]} +{"id":"gt-iib","title":"Architecture: Decentralized rig structure with per-rig agents","description":"## Decision\n\nAdopt decentralized architecture where each rig contains all its agents (mayor/, witness/, refinery/, polecats/) rather than centralizing mayor clones at town level.\n\n## Town Level Structure\n\n```\n~/ai/ # Town root\n├── config/ # Town config (VISIBLE, not hidden)\n│ ├── town.json # {\"type\": \"town\"}\n│ ├── rigs.json # Registry of managed rigs\n│ └── federation.json # Wasteland config (future)\n│\n├── mayor/ # Mayor's HOME at town level\n│ ├── CLAUDE.md\n│ ├── mail/inbox.jsonl\n│ └── state.json\n│\n└── \u003crigs\u003e/ # Managed projects\n```\n\n## Rig Level Structure (e.g., wyvern)\n\n```\nwyvern/ # Rig = clone of project repo\n├── .git/info/exclude # Gas Town adds: polecats/ refinery/ witness/ mayor/\n├── .beads/ # Beads (if project uses it)\n├── [project files] # Clean project code on main\n│\n├── polecats/ # Worker clones\n│ └── \u003cname\u003e/ # Each is a git clone\n│\n├── refinery/\n│ ├── rig/ # Refinery's clone\n│ ├── state.json\n│ └── mail/inbox.jsonl\n│\n├── witness/ # NEW: Per-rig pit boss\n│ ├── rig/ # Witness's clone\n│ ├── state.json\n│ └── mail/inbox.jsonl\n│\n└── mayor/\n ├── rig/ # Mayor's clone for this rig\n └── state.json\n```\n\n## Key Decisions\n\n1. **Visible config dir**: `config/` not `.gastown/` (models don't find hidden dirs)\n2. **Witness per-rig**: Each rig has its own Witness (pit boss) with its own clone\n3. **Mayor decentralized**: Mayor's clones live IN each rig at `\u003crig\u003e/mayor/rig/`\n4. **Minimal invasiveness**: Only `.git/info/exclude` modified, no commits to project\n5. **Clone subdir name**: Keep `rig/` for consistency (refinery/rig/, witness/rig/, mayor/rig/)\n\n## Role Detection\n\n- Town root or mayor/ → Mayor (town level)\n- Rig root → Mayor (canonical main)\n- \u003crig\u003e/mayor/rig/ → Mayor (rig-specific)\n- \u003crig\u003e/refinery/rig/ → Refinery\n- \u003crig\u003e/witness/rig/ → Witness\n- \u003crig\u003e/polecats/\u003cname\u003e/ → Polecat\n\n## Migration from PGT\n\n- `mayor/rigs/\u003crig\u003e/` → `\u003crig\u003e/mayor/rig/`\n- `\u003crig\u003e/town/` → eliminated (rig root IS the clone)\n- Add `witness/` to each rig","status":"tombstone","priority":0,"issue_type":"task","created_at":"2025-12-15T19:21:19.913928-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-iib","depends_on_id":"gt-u1j","type":"blocks","created_at":"2025-12-15T19:21:40.374551-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-ijmgg","title":"Digest: mol-deacon-patrol","description":"Patrol 2: All agents healthy, routine check","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T00:45:14.673074-08:00","updated_at":"2025-12-25T00:45:14.673074-08:00","closed_at":"2025-12-25T00:45:14.673033-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-ikyh","title":"Digest: mol-deacon-patrol","description":"Patrol #3: Stable, no changes","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T23:30:26.503345-08:00","updated_at":"2025-12-24T23:30:26.503345-08:00","closed_at":"2025-12-24T23:30:26.503314-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-ilav","title":"Polecat Lifecycle Events: Refinery-Witness Coordination","description":"## Problem\n\nPolecat work completion is currently treated as a single event (MR submission), but the true completion is when the Refinery merges the work. This creates a lifecycle gap:\n\n1. Polecat submits MR → considered \"done\" by Witness\n2. But MR might fail to merge (conflicts, test failures)\n3. No one notifies anyone when merge actually succeeds\n\n## Solution: Two-Event Lifecycle\n\n**Event 1: MR Submitted**\n- `gt mq submit` notifies Witness\n- Witness verifies submission was clean\n- Polecat can go idle (but worktree retained)\n- If submission had issues, Witness can help\n\n**Event 2: MR Merged**\n- Refinery sends `LIFECYCLE: work merged` to Witness\n- Witness updates polecat state to `merged`\n- Worktree now eligible for full cleanup/recycling\n\n## Village Sibling Watch\n\nFor robustness, patrol roles check on their siblings:\n- Refinery checks Witness via `gt peek`\n- Witness checks Refinery via `gt peek`\n- Creates defense in depth - if primary notification fails, someone catches it\n\n## Recovery\n\nIf Refinery misses sending lifecycle notification:\n- Witness polecat-scan can detect: polecat in mr_submitted but MR shows merged\n- Deacon orphan-check can detect: merged MRs with stale polecats","status":"open","priority":2,"issue_type":"epic","created_at":"2025-12-23T12:06:56.746185-08:00","updated_at":"2025-12-23T12:07:07.719057-08:00"} @@ -805,10 +873,17 @@ {"id":"gt-kl5e","title":"Digest: mol-deacon-patrol","description":"Patrol 4: Routine","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T22:36:01.786393-08:00","updated_at":"2025-12-24T22:36:01.786393-08:00","closed_at":"2025-12-24T22:36:01.786359-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-kmc7","title":"Digest: mol-deacon-patrol","description":"Patrol 2: Quick scan, no changes","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T23:05:53.201478-08:00","updated_at":"2025-12-24T23:05:53.201478-08:00","closed_at":"2025-12-24T23:05:53.201451-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-kmn","title":"Batch Work System: Integration branch, merge queue, landing","description":"## Overview\n\nThis epic tracks batch work coordination in GGT. Key insight: **work is a stream, not discrete swarms**.\n\nThere are no \"swarm IDs\" - the epic IS the grouping, the merge queue IS the coordination. \"Swarming an epic\" is colloquial for spawning multiple workers on its children.\n\n## Architecture\n\n- **Epics** group related work\n- **Issues** are individual tasks \n- **Dependencies** encode ordering (multi-wave emerges automatically)\n- **Merge queue** coordinates completed work\n- **Workers** process issues independently\n\nSee Key Decision #11 in docs/architecture.md: \"Work is a Stream (No Swarm IDs)\"\n\n## What This Epic Covers\n\n1. Integration branch management for batch merges\n2. Refinery semantic merge processing\n3. Witness landing protocol (cleanup)\n4. Report generation (epic-based, not swarm-ID-based)\n5. Git safety auditing\n6. Work reconciliation\n\n## What Was Removed\n\n- Swarm IDs (sw-1, sw-2, etc.)\n- Per-swarm directories (.gastown/swarms/\u003cid\u003e/)\n- Swarm manifest/state/events files\n- swarm-started/swarm-landed beads\n\nThese were redundant - beads already provides hierarchy, status, dependencies, and history.\n\n## References\n\n- Architecture: docs/architecture.md (Key Decision #11, Multi-Wave Work Processing)\n- PGT: swarm/manager.py, swarm/landing.py (behavioral reference, but ignore swarm ID patterns)","status":"closed","priority":0,"issue_type":"epic","created_at":"2025-12-16T00:08:15.339127-08:00","updated_at":"2025-12-25T02:16:00.322691-08:00","closed_at":"2025-12-25T02:16:00.322691-08:00","close_reason":"Swarm concept abandoned (7 tombstones). Core batch work now handled by merge queue (gt-h5n). Remaining items are enhancements."} +{"id":"gt-kmn.1","title":"Swarm package: Swarm, SwarmTask, SwarmState types","description":"Define core swarm types.\n\n## Types (in `internal/swarm/`)\n\n```go\n// SwarmState represents swarm lifecycle\ntype SwarmState string\nconst (\n SwarmCreated SwarmState = \"created\"\n SwarmActive SwarmState = \"active\"\n SwarmMerging SwarmState = \"merging\"\n SwarmLanded SwarmState = \"landed\"\n SwarmFailed SwarmState = \"failed\"\n SwarmCancelled SwarmState = \"cancelled\"\n)\n\n// Swarm references a beads epic that tracks swarm work\ntype Swarm struct {\n ID string // matches beads epic ID\n RigName string\n EpicID string // beads epic tracking this swarm\n BaseCommit string // git SHA all workers branch from\n Integration string // integration branch name\n State SwarmState\n CreatedAt time.Time\n Workers []string // polecat names assigned\n}\n\n// SwarmTask represents a single task in the swarm (maps to beads issue)\ntype SwarmTask struct {\n IssueID string // beads issue ID\n Assignee string // polecat name\n Branch string // worker branch name\n State string // mirrors beads status\n}\n```\n\n## Note\n\nSwarm state is primarily stored IN beads. These types are in-memory representations for the SwarmManager to work with. No separate manifest.json files.","status":"tombstone","priority":0,"issue_type":"task","created_at":"2025-12-16T00:08:30.364047-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-kmn.1","depends_on_id":"gt-kmn","type":"parent-child","created_at":"2025-12-16T00:08:30.364431-08:00","created_by":"daemon"},{"issue_id":"gt-kmn.1","depends_on_id":"gt-u1j.1","type":"blocks","created_at":"2025-12-16T00:11:20.646487-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-kmn.10","title":"Batch work landing report generation","description":"Generate reports on batch work completion.\n\n## Trigger\n\nWhen all children of an epic are closed, generate a completion report.\n\n## Report Contents\n\n- Epic metadata (ID, title, created by, duration)\n- Task summary (completed counts, timing)\n- Per-task details (issue, assignee, time taken)\n- Git stats (commits merged, lines changed)\n- Cleanup stats (branches deleted)\n\n## Output Locations\n\n1. Mail to Mayor - summary report\n2. Optional: save to file with --save flag\n\n## Command\n\n```bash\ngt report --epic \u003cepic-id\u003e [--save report.md]\n```\n\n## Format\n\nMarkdown with sections:\n- Summary\n- Tasks\n- Workers\n- Timeline\n\n## Note\n\nThis replaces the swarm-based reporting (gt-662). Reports are generated from epic/issue data, not from separate swarm state files.\n\n## Reference\n\nPGT: swarm/report.py (for format ideas, ignore swarm ID patterns)","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-16T00:10:23.242931-08:00","updated_at":"2025-12-16T17:26:27.99208-08:00","dependencies":[{"issue_id":"gt-kmn.10","depends_on_id":"gt-kmn","type":"parent-child","created_at":"2025-12-16T00:10:23.243287-08:00","created_by":"daemon"}]} {"id":"gt-kmn.11","title":"Daemon heartbeat: worker and queue monitoring","description":"Daemon periodic checks for work progress.\n\n## Heartbeat Actions\n\nEvery N seconds (configurable):\n\n1. Check Witness health per rig\n - Poke if witness needs to nudge workers\n \n2. Check Refinery queue per rig\n - Poke if pending work in queue\n \n3. Check work completion\n - If epic children all closed, notify Mayor\n\n## Eventually Convergent\n\nMultiple signals reinforce state:\n- Polecat signals done → Witness notices → pokes Refinery\n- Daemon heartbeat → checks queue → pokes Refinery\n- Beads status → queryable by any agent\n\nEven if one signal missed, system converges.\n\n## Interface\n\n```go\nfunc (d *Daemon) HeartbeatLoop() {\n for {\n for _, rig := range d.rigs {\n d.CheckWitness(rig)\n d.CheckRefinery(rig)\n d.CheckWorkProgress(rig)\n }\n time.Sleep(d.config.HeartbeatInterval)\n }\n}\n```\n\n## Notifications\n\nUse mail with low priority for heartbeat pokes.\nAgents can ignore if already processing.","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-16T00:10:25.169417-08:00","updated_at":"2025-12-16T17:24:46.380497-08:00","dependencies":[{"issue_id":"gt-kmn.11","depends_on_id":"gt-kmn","type":"parent-child","created_at":"2025-12-16T00:10:25.169767-08:00","created_by":"daemon"},{"issue_id":"gt-kmn.11","depends_on_id":"gt-99m","type":"blocks","created_at":"2025-12-18T11:50:17.699125-08:00","created_by":"daemon"}]} {"id":"gt-kmn.12","title":"Ephemeral rig support for ad-hoc batch work","description":"Support for temporary worker rigs for ad-hoc batch work.\n\n## Use Case\n\nAd-hoc batch work where you want temporary workers:\n- gt spawn --epic \u003cepic-id\u003e --ephemeral --workers 3\n- Creates temp rig with 3 clones\n- Workers process epic children\n- Work merges through queue\n- Clones cleaned up when done\n\n## Interface\n\n```go\ntype EphemeralRig struct {\n ID string\n GitURL string\n BaseCommit string\n Workers []string\n IntegrationBranch string\n EpicID string // associated epic (for cleanup trigger)\n CreatedAt time.Time\n}\n\nfunc InitEphemeralRig(gitURL string, numWorkers int) (*EphemeralRig, error)\nfunc (r *EphemeralRig) AddWorker(name string) error\nfunc (r *EphemeralRig) Destroy(force bool) error\n```\n\n## Directory Structure\n\n```\n\u003crig\u003e/ephemeral/\n└── rig-a3f7/\n ├── config.json\n ├── Alice/ # clone\n ├── Bob/ # clone\n └── Carol/ # clone\n```\n\n## Cleanup Trigger\n\nWhen all issues in the associated epic are closed AND merged, the ephemeral rig can be destroyed.\n\n## Note\n\nNo swarm ID needed - the epic ID provides the grouping. Ephemeral rig is just a convenience for temporary clones.\n\n## Reference\n\nPGT: ephemeral.py (for structure, ignore swarm ID coupling)","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-16T00:10:44.915982-08:00","updated_at":"2025-12-16T17:26:30.080125-08:00","dependencies":[{"issue_id":"gt-kmn.12","depends_on_id":"gt-kmn","type":"parent-child","created_at":"2025-12-16T00:10:44.916346-08:00","created_by":"daemon"}]} {"id":"gt-kmn.13","title":"Plugin: work-oracle (pre-dispatch analysis)","description":"Plugin for pre-dispatch task analysis and decomposition.\n\n## Purpose\n\nBefore dispatching workers for an epic, ask work-oracle to:\n- Validate task breakdown\n- Identify parallelization opportunities\n- Predict conflicts between tasks\n- Suggest worker count\n\n## Hook Point\n\nMayor consults work-oracle before spawning workers.\n\n## Interface\n\nInput (via mail):\n- Epic ID with proposed child issues\n- Rig context (current state of codebase)\n\nOutput (via mail + bead):\n- Recommended task groupings\n- Dependency suggestions\n- Risk assessment (which files might conflict)\n- Optimal worker count\n\n## Structure\n\n```\n\u003crig\u003e/plugins/work-oracle/\n├── CLAUDE.md # Analysis prompts\n├── mail/inbox.jsonl\n└── state.json\n```\n\nUses existing plugin-as-agent architecture.\n\n## Note\n\nWas \"swarm-oracle\" - renamed because there are no swarm IDs. This plugin helps plan batch work, not manage swarm entities.","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-16T00:10:46.139004-08:00","updated_at":"2025-12-16T17:25:14.424029-08:00","dependencies":[{"issue_id":"gt-kmn.13","depends_on_id":"gt-kmn","type":"parent-child","created_at":"2025-12-16T00:10:46.139369-08:00","created_by":"daemon"}]} +{"id":"gt-kmn.2","title":"SwarmManager: create, start, update, query operations","description":"SwarmManager operations for creating and managing swarms.\n\n## Interface\n\n```go\ntype SwarmManager struct {\n rig *Rig\n beads *BeadsWrapper // shells out to bd CLI\n}\n\nfunc NewSwarmManager(rig *Rig) *SwarmManager\n\n// Lifecycle\nfunc (m *SwarmManager) Create(epicID string, workers []string) (*Swarm, error)\nfunc (m *SwarmManager) Start(swarmID string) error\nfunc (m *SwarmManager) UpdateState(swarmID string, state SwarmState) error\nfunc (m *SwarmManager) Cancel(swarmID string, reason string) error\n\n// Queries (delegate to beads)\nfunc (m *SwarmManager) GetSwarm(id string) (*Swarm, error)\nfunc (m *SwarmManager) GetReadyTasks(swarmID string) ([]SwarmTask, error)\nfunc (m *SwarmManager) GetActiveTasks(swarmID string) ([]SwarmTask, error)\nfunc (m *SwarmManager) IsComplete(swarmID string) (bool, error)\n```\n\n## Implementation Notes\n\n- `GetReadyTasks` wraps `bd ready --parent \u003cepicID\u003e`\n- `IsComplete` checks if all child issues are closed\n- State transitions update the epic's description or a tag field\n- No separate manifest files - beads IS the source of truth","status":"tombstone","priority":0,"issue_type":"task","created_at":"2025-12-16T00:09:04.814385-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-kmn.2","depends_on_id":"gt-kmn","type":"parent-child","created_at":"2025-12-16T00:09:04.814876-08:00","created_by":"daemon"},{"issue_id":"gt-kmn.2","depends_on_id":"gt-kmn.1","type":"blocks","created_at":"2025-12-16T00:11:20.744039-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-kmn.3","title":"Integration branch management for swarms","description":"Manage integration branches for swarm merging strategy.\n\n## Branch Naming\n\n- Integration branch: `integration/\u003cswarm-id\u003e` (e.g., integration/sw-1)\n- Worker branches: `\u003cswarm-id\u003e/\u003cpolecat\u003e` (e.g., sw-1/Toast)\n\n## Operations\n\n```go\n// Create integration branch at swarm start\nfunc (m *SwarmManager) CreateIntegrationBranch(swarmID string) error\n// - Creates from BaseCommit\n// - Pushes to origin\n\n// Merge worker branch to integration\nfunc (r *Refinery) MergeToIntegration(swarmID, workerBranch string) error\n// - Fetches worker branch\n// - Merges to integration/\u003cswarm-id\u003e\n// - Handles conflicts (semantic merge)\n\n// Land integration to main\nfunc (r *Refinery) LandToMain(swarmID string) error\n// - Merges integration/\u003cswarm-id\u003e to main\n// - Pushes to origin\n// - Triggers cleanup\n\n// Cleanup branches after landing\nfunc (m *SwarmManager) CleanupBranches(swarmID string) error\n// - Deletes integration/\u003cswarm-id\u003e (local + remote)\n// - Deletes all \u003cswarm-id\u003e/\u003cpolecat\u003e branches\n```\n\n## All Workers Same Base\n\nWhen swarm starts:\n1. Record current main HEAD as BaseCommit\n2. All polecats branch from BaseCommit\n3. Integration branch also starts at BaseCommit\n\nThis ensures clean merges within the swarm.\n\n## Reference\n\nPGT: ephemeral.py (create_integration_branch, merge_integration_to_main)","status":"tombstone","priority":0,"issue_type":"task","created_at":"2025-12-16T00:09:06.825718-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-kmn.3","depends_on_id":"gt-kmn","type":"parent-child","created_at":"2025-12-16T00:09:06.82608-08:00","created_by":"daemon"},{"issue_id":"gt-kmn.3","depends_on_id":"gt-kmn.1","type":"blocks","created_at":"2025-12-16T00:11:20.848983-08:00","created_by":"daemon"},{"issue_id":"gt-kmn.3","depends_on_id":"gt-u1j.3","type":"blocks","created_at":"2025-12-16T00:11:20.943465-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-kmn.4","title":"Refinery semantic merge processing loop","description":"Implement the Refinery semantic merge loop for processing polecat work.\n\n## Overview\n\nThe Refinery is a fully empowered Claude Code agent that:\n1. Fetches polecat branches\n2. Merges to integration branch\n3. Resolves conflicts semantically (re-implements if needed)\n4. Runs tests\n5. Escalates only when truly stuck\n\n## Processing Loop\n\n1. Check queue for completed tasks (polecat done, not yet merged)\n2. For each task:\n - Fetch polecat branch\n - Attempt merge to integration/\u003cswarm-id\u003e\n - On conflict: semantic resolution (understand intent, re-implement)\n - Run tests if configured\n - On success: mark merged, file bead, notify witness\n - On failure: notify polecat (test fail) or escalate (stuck)\n3. When all tasks merged: land integration to main\n\n## Semantic Merge\n\nWhen git merge fails, Refinery:\n1. Reads polecat changes and beads issue\n2. Understands intent\n3. Re-implements on current integration branch\n4. Only escalates if truly blocked\n\n## Daemon Poking\n\nRefinery is poked by:\n- Daemon heartbeat (periodic)\n- Witness notification (polecat done)\n- Mayor request (check queue)\n\n## Dependencies\n\nNeeds: gt-u1j.6 (mail), gt-u1j.3 (git), gt-u1j.14 (merge queue)\n\n## Reference\n\nSee PGT ephemeral.py for branch operations.","status":"tombstone","priority":0,"issue_type":"task","created_at":"2025-12-16T00:09:19.536429-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-kmn.4","depends_on_id":"gt-kmn","type":"parent-child","created_at":"2025-12-16T00:09:19.536808-08:00","created_by":"daemon"},{"issue_id":"gt-kmn.4","depends_on_id":"gt-kmn.3","type":"blocks","created_at":"2025-12-16T00:11:22.86454-08:00","created_by":"daemon"},{"issue_id":"gt-kmn.4","depends_on_id":"gt-u1j.6","type":"blocks","created_at":"2025-12-16T00:11:22.952967-08:00","created_by":"daemon"},{"issue_id":"gt-kmn.4","depends_on_id":"gt-u1j.3","type":"blocks","created_at":"2025-12-16T00:11:23.046741-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-kmn.5","title":"Swarm beads naming convention and auto-filing","description":"Beads naming convention for swarm lifecycle events.\n\n## Bead IDs\n\n- swarm-started:\u003cswarm-id\u003e # Filed when swarm begins\n- swarm-task-merged:\u003cswarm-id\u003e:\u003ctask-id\u003e # Filed per task merge\n- swarm-landed:\u003cswarm-id\u003e # Filed when merged to main\n- swarm-failed:\u003cswarm-id\u003e # Filed on unrecoverable failure\n\n## swarm-started Bead\n\nFiled by: Mayor/Refinery at swarm creation\nContains:\n- Swarm title and description\n- List of tasks (issue IDs)\n- List of workers (polecat names)\n- Base commit SHA\n\n## swarm-task-merged Bead\n\nFiled by: Refinery after each successful merge\nContains:\n- Task issue ID and title\n- Polecat name\n- Merge commit SHA\n- Test results summary\n\n## swarm-landed Bead\n\nFiled by: Refinery after landing to main\nContains:\n- Final merge commit SHA\n- Stats: tasks completed, time taken\n- List of all merged task beads\n- Integration branch name (now deleted)\n\n## swarm-failed Bead\n\nFiled by: Refinery on unrecoverable failure\nContains:\n- Failure reason\n- Tasks merged vs not merged\n- Recovery guidance\n\n## Why Beads (not just mail)\n\n- Persistent, queryable, synced to git\n- Other agents can check status without mail\n- Creates audit trail\n- Works when agents offline","status":"tombstone","priority":0,"issue_type":"task","created_at":"2025-12-16T00:09:46.930708-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-kmn.5","depends_on_id":"gt-kmn","type":"parent-child","created_at":"2025-12-16T00:09:46.931086-08:00","created_by":"daemon"},{"issue_id":"gt-kmn.5","depends_on_id":"gt-kmn.1","type":"blocks","created_at":"2025-12-16T00:11:24.746439-08:00","created_by":"daemon"},{"issue_id":"gt-kmn.5","depends_on_id":"gt-u1j.13","type":"blocks","created_at":"2025-12-16T00:11:24.81726-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-kmn.6","title":"Witness swarm landing protocol","description":"Witness responsibilities for swarm landing cleanup.\n\n## Trigger\n\nWitness receives \"swarm-landed\" mail from Refinery containing:\n- swarm_id\n- merge_commit\n- action: \"cleanup\"\n\n## Landing Protocol\n\n### Phase 1: Preflight\nVerify all polecat sessions stopped:\n- Check tmux for active sessions\n- Kill any remaining sessions\n- Wait for graceful shutdown\n\n### Phase 2: Git Audit\nFor each polecat in swarm:\n- Check for uncommitted changes\n- Check for unpushed commits\n- Check for stashes\n- Classify as \"beads-only\" (safe) or \"code at risk\"\n- If code at risk: escalate, abort landing\n\n### Phase 3: Cleanup\nFor each polecat:\n- Clear state entry (mark as idle)\n- Delete inbox (or archive)\n- Delete worker branch (local + remote)\n\n### Phase 4: Final Report\n- Update swarm state to \"landed\"\n- File landing report bead\n- Mail Mayor with summary\n\n## Code at Risk Handling\n\nIf git audit finds code at risk:\n1. Abort cleanup for that polecat\n2. Mail Mayor with details\n3. Human intervention required\n\n## Reference\n\nPGT: swarm/landing.py (6-phase protocol), swarm/git_audit.py","status":"tombstone","priority":0,"issue_type":"task","created_at":"2025-12-16T00:09:49.002317-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-kmn.6","depends_on_id":"gt-kmn","type":"parent-child","created_at":"2025-12-16T00:09:49.002696-08:00","created_by":"daemon"},{"issue_id":"gt-kmn.6","depends_on_id":"gt-kmn.8","type":"blocks","created_at":"2025-12-16T00:11:26.758388-08:00","created_by":"daemon"},{"issue_id":"gt-kmn.6","depends_on_id":"gt-u1j.6","type":"blocks","created_at":"2025-12-16T00:11:26.839345-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-kmn.7","title":"CLI: gt swarm commands (create, status, list, land)","description":"CLI commands for swarm management.\n\n## Commands\n\n### gt swarm create\nCreate a new swarm in a rig.\n\n```\ngt swarm create \u003crig\u003e --title \"Fix all P1 bugs\" \\\n --task gt-abc --task gt-def \\\n --worker Toast --worker Nux\n```\n\nOptions:\n- --title: Swarm title (required)\n- --task: Beads issue IDs to include (repeatable)\n- --worker: Polecat names (repeatable, or --workers=3 to auto-assign)\n- --start: Start swarm immediately after creation\n\n### gt swarm status \u003cswarm-id\u003e\nShow swarm status and progress.\n\nOutput:\n- Swarm metadata (title, created, workers)\n- Task status (pending/in_progress/completed/merged)\n- Integration branch status\n- Overall progress percentage\n\n### gt swarm list [rig]\nList swarms, optionally filtered by rig or status.\n\n```\ngt swarm list --status=active\ngt swarm list gastown --status=landed\n```\n\n### gt swarm land \u003cswarm-id\u003e\nTrigger manual landing (normally automatic).\n\n### gt swarm cancel \u003cswarm-id\u003e\nCancel a swarm in progress.\n\n## Output Format\n\nSupport --json for machine-readable output.\n\n## Dependencies\n\nNeeds: gt-kmn.1 (types), gt-kmn.2 (manager)","status":"tombstone","priority":0,"issue_type":"task","created_at":"2025-12-16T00:09:50.57674-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-kmn.7","depends_on_id":"gt-kmn","type":"parent-child","created_at":"2025-12-16T00:09:50.577096-08:00","created_by":"daemon"},{"issue_id":"gt-kmn.7","depends_on_id":"gt-kmn.2","type":"blocks","created_at":"2025-12-16T00:11:29.0905-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-kmn.8","title":"Git safety audit module","description":"Port git_audit.py safety checks to Go.\n\n## Purpose\n\nBefore destroying polecat clones, verify no code is at risk.\n\n## Checks\n\n1. Uncommitted changes (staged and unstaged)\n2. Unpushed commits\n3. Git stashes\n4. Local-only branches (not tracking remote)\n\n## Beads-Only Classification\n\nSome files are safe to discard:\n- .beads/*\n- .claude/settings.json\n\nChanges only affecting these = \"beads-only\" = safe to destroy.\n\n## Interface\n\n```go\ntype GitAuditResult struct {\n Polecat string\n Path string\n UncommittedFiles []string\n UncommittedIsBeadsOnly bool\n UnpushedCommits int\n Stashes []StashInfo\n StashesAreBeadsOnly bool\n LocalBranches []string\n Error error\n}\n\nfunc (r *GitAuditResult) HasCodeAtRisk() bool\n\nfunc AuditPolecat(name string, path string) *GitAuditResult\nfunc AuditPolecats(polecats []PolecatInfo) []*GitAuditResult\n```\n\n## Reference\n\nPGT: swarm/git_audit.py","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-16T00:10:19.52029-08:00","updated_at":"2025-12-16T00:10:19.52029-08:00","dependencies":[{"issue_id":"gt-kmn.8","depends_on_id":"gt-kmn","type":"parent-child","created_at":"2025-12-16T00:10:19.520646-08:00","created_by":"daemon"},{"issue_id":"gt-kmn.8","depends_on_id":"gt-u1j.3","type":"blocks","created_at":"2025-12-16T00:11:29.174184-08:00","created_by":"daemon"}]} {"id":"gt-kmn.9","title":"Work reconciliation module","description":"Port reconcile.py work verification to Go.\n\n## Purpose\n\nVerify assigned issues are completed before landing.\n\n## Interface\n\n```go\ntype ReconcileResult struct {\n CompletedIssues []IssueInfo\n IncompleteIssues []IssueInfo\n AllComplete bool\n PolecatsChecked []string\n Errors []string\n}\n\nfunc ReconcileWork(rig string, polecats []string) *ReconcileResult\nfunc GetAssignedIssues(assignee string) []IssueInfo\nfunc UnassignIssue(issueID string, resetStatus bool) error\n```\n\n## Logic\n\n1. Get list of polecats in swarm\n2. For each polecat, query beads for assigned issues\n3. Categorize as completed (closed) or incomplete (open/in_progress)\n4. Return summary for landing decision\n\n## Handling Incomplete Work\n\nIf issues incomplete:\n- Abort landing (default)\n- Or force landing (leaves work unfinished)\n- Unassign incomplete issues for future work\n\n## Reference\n\nPGT: swarm/reconcile.py","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-16T00:10:21.351476-08:00","updated_at":"2025-12-16T00:10:21.351476-08:00","dependencies":[{"issue_id":"gt-kmn.9","depends_on_id":"gt-kmn","type":"parent-child","created_at":"2025-12-16T00:10:21.351869-08:00","created_by":"daemon"},{"issue_id":"gt-kmn.9","depends_on_id":"gt-u1j.13","type":"blocks","created_at":"2025-12-16T00:11:29.259187-08:00","created_by":"daemon"}]} {"id":"gt-kndf","title":"Digest: mol-deacon-patrol","description":"Patrol 19: OK","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T21:02:19.530366-08:00","updated_at":"2025-12-24T21:02:19.530366-08:00","closed_at":"2025-12-24T21:02:19.530333-08:00","close_reason":"Squashed from 8 wisps"} @@ -821,8 +896,10 @@ {"id":"gt-ktal","title":"Epic: Refinery Engineer Autonomy","description":"Make Refinery Engineer fully autonomous:\n\n## Goal\nRefinery can run indefinitely, processing all polecat work through merge queue, cycling sessions as needed, without human intervention.\n\n## Key Components\n1. Role prompting (CLAUDE.md, templates)\n2. Handoff mechanism (pinned beads)\n3. Context detection (gt prime)\n4. Communication protocol (Witness, Deacon)\n5. Future: Merge orchestration plugins\n\n## Success Criteria\n- Refinery starts, reads handoff, knows what to do\n- Processes merges sequentially with conflict resolution\n- Cycles sessions cleanly via Deacon\n- Communicates results to Witness\n- No work left behind","status":"open","priority":1,"issue_type":"epic","created_at":"2025-12-19T18:09:30.84543-08:00","updated_at":"2025-12-19T18:09:30.84543-08:00"} {"id":"gt-ktf3","title":"bd ready --type: missing type filter for MQ integration","description":"bd ready lacks --type flag that engineer.go expects.\n\n## Code (internal/refinery/engineer.go)\nreadyMRs, err := e.beads.ReadyWithType(\"merge-request\")\n\n## Actual bd ready\nNo --type flag - only supports assignee, label, priority filters.\n\n## Impact\nRefinery can't find merge-requests in queue, so MQ doesn't process anything.\n\n## Fix Options\n1. Add --type flag to bd ready\n2. Use bd list --type=merge-request --status=open instead\n3. Both (ready filters for unblocked, list for all)\n\nThis is blocking the entire MQ pipeline.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-12-19T14:57:16.297847-08:00","updated_at":"2025-12-19T15:04:17.322508-08:00","closed_at":"2025-12-19T15:04:17.322508-08:00"} {"id":"gt-ku1y","title":"Digest: mol-deacon-patrol","description":"Patrol 13","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T23:10:00.990435-08:00","updated_at":"2025-12-24T23:10:00.990435-08:00","closed_at":"2025-12-24T23:10:00.990401-08:00","close_reason":"Squashed from 8 wisps"} +{"id":"gt-kut","title":"Test message","description":"Testing GGT mail system","status":"tombstone","priority":2,"issue_type":"message","created_at":"2025-12-17T16:12:11.437529-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"message"} {"id":"gt-l1o","title":"Harness \u0026 Priming: Document architecture and update all role contexts","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-17T16:42:29.314113-08:00","updated_at":"2025-12-19T12:00:51.410053-08:00","closed_at":"2025-12-19T12:00:51.410053-08:00"} {"id":"gt-l32kx","title":"implement","description":"Implement the solution for gt-u2vg. 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":"open","priority":2,"issue_type":"task","created_at":"2025-12-25T01:53:37.31087-08:00","updated_at":"2025-12-25T01:53:37.31087-08:00","dependencies":[{"issue_id":"gt-l32kx","depends_on_id":"gt-6n1cy","type":"parent-child","created_at":"2025-12-25T01:53:37.328352-08:00","created_by":"stevey"},{"issue_id":"gt-l32kx","depends_on_id":"gt-hkf8j","type":"blocks","created_at":"2025-12-25T01:53:37.344719-08:00","created_by":"stevey"}]} +{"id":"gt-l3c","title":"Design: Polecat Beads write access","description":"Design for granting polecats direct beads write access.\n\n## Background\n\nWith Beads v0.30.0 tombstone-based rearchitecture, we have solid multi-agent support. Reversing the original read-only decision.\n\n## Benefits\n\n- Simplifies architecture (no mail-based issue filing proxy)\n- Empowers polecats to file discovered work\n- Beads handles work-disavowal\n\n## Complications\n\nFor OSS projects where you cannot commit to project .beads/, need per-rig beads repo configuration.\n\n## Subtasks (implementation)\n\n- gt-zx3: Per-rig beads configuration schema\n- gt-e1y: Worker prompting updates for beads access\n- gt-cjb: Witness proxy removal\n- gt-082: Beads sync in decommission checklist\n\n**Design complete.** Each subtask has full specification in its description.","status":"tombstone","priority":1,"issue_type":"epic","created_at":"2025-12-15T19:37:42.191734-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"epic"} {"id":"gt-l3gfn","title":"Digest: mol-deacon-patrol","description":"Patrol 18: Quiet","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T07:29:32.029593-08:00","updated_at":"2025-12-25T07:29:32.029593-08:00","closed_at":"2025-12-25T07:29:32.029556-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-l42h","title":"load-context","description":"Run gt prime and bd prime. Verify issue assignment.\nCheck inbox for any relevant messages.\n\nRead the assigned issue (gt-1wmw) and understand the requirements.\nIdentify any blockers or missing information.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-24T22:55:01.79541-08:00","updated_at":"2025-12-24T22:55:01.79541-08:00","dependencies":[{"issue_id":"gt-l42h","depends_on_id":"gt-ir74","type":"parent-child","created_at":"2025-12-24T22:55:01.796786-08:00","created_by":"stevey"}]} {"id":"gt-l4gm","title":"Crew workers: design documentation and remaining work","description":"## Summary\n\nCrew workers are user-managed persistent workspaces within a rig, distinct from polecats.\n\n## Current Implementation\n\n### Commands (all working)\n- `gt crew add \u003cname\u003e` - Create workspace (git clone)\n- `gt crew list` - List workspaces with status\n- `gt crew at \u003cname\u003e` - Attach to tmux session\n- `gt crew remove \u003cname\u003e` - Remove workspace\n- `gt crew pristine [\u003cname\u003e]` - git pull + bd sync\n- `gt crew refresh \u003cname\u003e` - Context cycle with handoff mail\n- `gt crew status [\u003cname\u003e]` - Detailed status\n- `gt crew rename \u003cname\u003e` - Rename workspace\n\n### Crew vs Polecat\n\n| Aspect | Crew | Polecat |\n|--------|------|---------|\n| Lifecycle | User-managed | Witness-managed |\n| Scheduling | Manual | `gt spawn` |\n| Merge flow | Direct push OK | Integration branch → refinery |\n| Garbage collection | Never | Auto on completion |\n| Identity | Long-lived (emma, dave) | Ephemeral (Nux, Toast) |\n\n## Known Bugs\n\n- **gt-70b3**: detectSender() doesn't recognize crew workers\n- **gt-vdp0**: Crew CLAUDE.md shows Refinery template\n\n## Potential Enhancements\n\n1. Rebase helper in `gt crew pristine` for conflict resolution\n2. Cross-rig crew support (crew worker in multiple rigs?)\n3. Better mail identity auto-detection for crew","status":"open","priority":2,"issue_type":"epic","created_at":"2025-12-18T21:49:58.524424-08:00","updated_at":"2025-12-18T21:49:58.524424-08:00"} @@ -838,10 +915,16 @@ {"id":"gt-lij09","title":"Digest: mol-deacon-patrol","description":"Patrol 4: All healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T13:27:48.617617-08:00","updated_at":"2025-12-25T13:27:48.617617-08:00","closed_at":"2025-12-25T13:27:48.617583-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-lij09","depends_on_id":"gt-icrfd","type":"parent-child","created_at":"2025-12-25T13:27:48.618327-08:00","created_by":"stevey"}]} {"id":"gt-ljow","title":"Digest: mol-deacon-patrol @ 2025-12-24 19:43","description":"Patrol 4: All healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T19:43:45.317294-08:00","updated_at":"2025-12-24T19:43:45.317294-08:00","closed_at":"2025-12-24T19:43:45.317226-08:00","close_reason":"Squashed from wisp gt-6ix (9 issues)"} {"id":"gt-lnji","title":"gt polecat git-state command for pre-kill verification","description":"Add git-state subcommand to gt polecat for Witness pre-kill verification.\n\n## Usage\n```bash\ngt polecat git-state \u003crig\u003e/\u003cpolecat\u003e\n```\n\n## Output\n```\nGit State: gastown/furiosa\n\n Working Tree: clean | dirty\n Uncommitted: 0 files | N files (list)\n Unpushed: 0 commits | N commits ahead\n Stashes: 0 | N stashes\n\n Verdict: CLEAN (safe to kill) | DIRTY (needs cleanup)\n```\n\n## JSON output (--json flag)\n```json\n{\n \"clean\": true,\n \"uncommitted_files\": [],\n \"unpushed_commits\": 0,\n \"stash_count\": 0\n}\n```\n\n## Used by\n- Witness pre-kill verification (mol-witness-patrol)\n- Manual cleanup checks\n\n## Implementation\n- Check git status in polecat worktree\n- Check git log origin/main..HEAD\n- Check git stash list","status":"closed","priority":1,"issue_type":"task","assignee":"gastown/nux","created_at":"2025-12-22T16:43:10.035052-08:00","updated_at":"2025-12-22T23:35:06.34384-08:00","closed_at":"2025-12-22T23:35:06.34384-08:00","close_reason":"Implemented gt polecat git-state command for pre-kill verification"} +{"id":"gt-lno","title":"Swarm state persistence: manifest + state + events","description":"Upgrade swarm persistence to match PGT pattern.\n\n## Current State\nSingle .gastown/swarms.json with all swarms.\n\n## Target State (per-swarm)\n```\n.gastown/swarms/\n└── \u003cswarm-id\u003e/\n ├── manifest.json # Immutable config\n ├── state.json # Mutable progress\n ├── events.jsonl # Audit log\n └── report.md # Generated report\n```\n\n## File Schemas\n\n### manifest.json (immutable after creation)\n```json\n{\n \"id\": \"sw-1\",\n \"title\": \"Epic description\",\n \"epic_id\": \"gt-abc\",\n \"rig\": \"gastown\",\n \"base_commit\": \"abc123\",\n \"integration_branch\": \"swarm/sw-1\",\n \"target_branch\": \"main\",\n \"workers\": [\"Toast\", \"Nux\"],\n \"tasks\": [{\"id\": \"gt-xyz\", \"title\": \"...\"}],\n \"created_at\": \"2024-01-01T00:00:00Z\"\n}\n```\n\n### state.json (mutable)\n```json\n{\n \"state\": \"active\",\n \"task_states\": {\n \"gt-xyz\": {\"state\": \"merged\", \"assignee\": \"Toast\"}\n },\n \"updated_at\": \"2024-01-01T01:00:00Z\",\n \"error\": null\n}\n```\n\n### events.jsonl (append-only audit)\n```jsonl\n{\"event\": \"created\", \"ts\": \"...\", \"data\": {...}}\n{\"event\": \"task_assigned\", \"ts\": \"...\", \"data\": {...}}\n{\"event\": \"task_merged\", \"ts\": \"...\", \"data\": {...}}\n```\n\n## Benefits\n- Audit trail via events.jsonl\n- Manifest immutability prevents corruption\n- Cleaner separation of concerns\n- Per-swarm isolation\n\n## Migration\nKeep backward compat with swarms.json during transition.\n\n## Files to Modify\n- internal/swarm/manager.go: Refactor persistence\n- internal/cmd/swarm.go: SwarmStore → directory-based\n\n## Acceptance Criteria\n- [ ] Per-swarm directory structure\n- [ ] Events logged to JSONL\n- [ ] Manifest immutable after creation\n- [ ] List command aggregates from directories","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-16T14:48:14.151538-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-lom0","title":"Digest: mol-deacon-patrol","description":"Patrol 20: OK - Handoff threshold reached","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T21:02:40.085741-08:00","updated_at":"2025-12-24T21:02:40.085741-08:00","closed_at":"2025-12-24T21:02:40.085706-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-lpki","title":"test message","status":"closed","priority":2,"issue_type":"message","created_at":"2025-12-20T17:41:51.652131-08:00","updated_at":"2025-12-25T01:33:01.214326-08:00","closed_at":"2025-12-25T01:33:01.214326-08:00","close_reason":"Test pollution cleanup"} {"id":"gt-lqgf","title":"burn-or-loop","description":"Squash wisp and decide: loop or cycle session.\n\nIf context low: spawn new wisp and loop\nIf context high: handoff and request cycle\n\nNeeds: generate-summary","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T01:41:54.505125-08:00","updated_at":"2025-12-23T04:39:39.670609-08:00","closed_at":"2025-12-23T04:39:39.670609-08:00","close_reason":"Parent gt-751s superseded by Christmas Ornament pattern","dependencies":[{"issue_id":"gt-lqgf","depends_on_id":"gt-751s","type":"parent-child","created_at":"2025-12-23T01:41:54.514929-08:00","created_by":"stevey"},{"issue_id":"gt-lqgf","depends_on_id":"gt-g261","type":"blocks","created_at":"2025-12-23T01:41:54.521716-08:00","created_by":"stevey"}]} {"id":"gt-lve0","title":"Digest: mol-deacon-patrol","description":"Patrol #2: All healthy, no changes","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T23:29:43.926838-08:00","updated_at":"2025-12-24T23:29:43.926838-08:00","closed_at":"2025-12-24T23:29:43.926802-08:00","close_reason":"Squashed from 8 wisps"} +{"id":"gt-lwuu","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- {{issue}} - The source issue ID being worked on","status":"tombstone","priority":2,"issue_type":"epic","created_at":"2025-12-21T21:47:15.553926-08:00","updated_at":"2025-12-25T11:45:02.114796-08:00","labels":["template"],"deleted_at":"2025-12-25T11:45:02.114796-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"epic"} +{"id":"gt-lwuu.1","title":"load-context","description":"Run gt prime and bd prime. Verify issue assignment.\nCheck inbox for any relevant messages.\n\nRead the assigned issue ({{issue}}) and understand the requirements.\nIdentify any blockers or missing information.","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-21T21:47:23.880531-08:00","updated_at":"2025-12-25T11:45:02.114796-08:00","labels":["template"],"dependencies":[{"issue_id":"gt-lwuu.1","depends_on_id":"gt-lwuu","type":"parent-child","created_at":"2025-12-21T21:47:23.882049-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T11:45:02.114796-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-lwuu.2","title":"implement","description":"Implement the solution for {{issue}}. 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":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-21T21:47:46.876765-08:00","updated_at":"2025-12-25T11:45:02.114796-08:00","labels":["template"],"dependencies":[{"issue_id":"gt-lwuu.2","depends_on_id":"gt-lwuu","type":"parent-child","created_at":"2025-12-21T21:47:46.878332-08:00","created_by":"daemon"},{"issue_id":"gt-lwuu.2","depends_on_id":"gt-lwuu.1","type":"blocks","created_at":"2025-12-21T21:48:04.4865-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T11:45:02.114796-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-lwuu.3","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":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-21T21:47:48.035315-08:00","updated_at":"2025-12-25T11:45:02.114796-08:00","labels":["template"],"dependencies":[{"issue_id":"gt-lwuu.3","depends_on_id":"gt-lwuu","type":"parent-child","created_at":"2025-12-21T21:47:48.037154-08:00","created_by":"daemon"},{"issue_id":"gt-lwuu.3","depends_on_id":"gt-lwuu.2","type":"blocks","created_at":"2025-12-21T21:48:04.559802-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T11:45:02.114796-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-lwuu.8","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":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-21T21:47:53.776509-08:00","updated_at":"2025-12-25T11:45:02.114796-08:00","labels":["template"],"dependencies":[{"issue_id":"gt-lwuu.8","depends_on_id":"gt-lwuu","type":"parent-child","created_at":"2025-12-21T21:47:53.777872-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T11:45:02.114796-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-lx3n","title":"Witness startup: bond mol-witness-patrol on start","description":"Wire up Witness to automatically bond its patrol molecule on startup.\n\n## Desired behavior\nOn Witness session start:\n1. gt prime detects RoleWitness\n2. Check for existing in-progress patrol\n3. If found: resume from current step\n4. If not found: bd mol bond mol-witness-patrol --wisp\n5. Output patrol context to agent\n\n## Depends on\n- gt-83k0 (mol-witness-patrol definition)\n- gt-caih (handoff bead state persistence)","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-22T16:43:42.840567-08:00","updated_at":"2025-12-23T01:42:49.34897-08:00","closed_at":"2025-12-23T01:42:49.34897-08:00","close_reason":"Implemented in prime.go - witness now auto-bonds mol-witness-patrol on startup","dependencies":[{"issue_id":"gt-lx3n","depends_on_id":"gt-83k0","type":"blocks","created_at":"2025-12-22T16:43:59.685455-08:00","created_by":"daemon"},{"issue_id":"gt-lx3n","depends_on_id":"gt-caih","type":"blocks","created_at":"2025-12-22T16:43:59.760763-08:00","created_by":"daemon"}]} {"id":"gt-lxsw","title":"gt done: Command doesn't exist but documented in polecat CLAUDE.md","notes":"The polecat CLAUDE.md documents 'gt done' as the command to signal work is ready for merge queue, but running it gives 'unknown command'. Either implement the command or update the documentation.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-20T07:59:44.548479-08:00","updated_at":"2025-12-20T13:20:50.919481-08:00","closed_at":"2025-12-20T13:20:50.919481-08:00"} {"id":"gt-lxv2z","title":"Digest: mol-deacon-patrol","description":"Patrol 20: routine, handing off","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T10:20:25.378692-08:00","updated_at":"2025-12-25T10:20:25.378692-08:00","closed_at":"2025-12-25T10:20:25.378666-08:00","close_reason":"Squashed from 8 wisps"} @@ -951,7 +1034,10 @@ {"id":"gt-ooz6","title":"bd close hooks: context check and notifications","description":"Add hook system to bd close for context checking and notifications.\n\n## Concept\n\nRegister hooks that run on every bd close:\n\n# .beads/config.yaml\nhooks:\n on_close:\n - command: 'gt context-check'\n - notify: 'Next step ready'\n\n## Use cases\n\n### Context check on close\nAfter closing a step, check if context is getting full.\nIf \u003e80%, output warning suggesting session cycling.\n\n### Next step notification \nAutomatically show next ready step (complements --continue).\n\n### Custom actions\nUser-defined scripts for workflow automation.\n\n## Hook types\n\n- command: Run shell command with env vars (BEAD_ID, BEAD_TITLE, etc)\n- notify: Send message to agent\n- webhook: POST to URL (future)\n\n## Integration with context detection\n\nThe context-check hook could:\n1. Capture tmux pane (if in tmux session)\n2. Estimate context usage (turn count, output length)\n3. If high, output: 'Context at ~85%. Consider cycling.'\n\n## Priority\nP2 - nice to have, not blocking launch.\n\n## Related\n- gt-qswb (bd mol current)\n- gt-fly0 (bd close --continue)","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-22T17:01:44.717704-08:00","updated_at":"2025-12-22T17:04:13.540659-08:00","closed_at":"2025-12-22T17:04:13.540659-08:00","close_reason":"Moved to beads: bd-g4b4"} {"id":"gt-op78","title":"Session cycling: Auto-spawn successor when context full","description":"Enable automatic session succession for crew workers.\n\nWhen a crew worker's context fills up (\u003e80%), they should:\n1. Write handoff mail to themselves\n2. Signal session end\n3. System auto-spawns successor session\n4. Successor reads handoff, finds attached work, auto-continues\n\nThis completes the autonomous overnight work pattern from gt-9g82.\n\nDepends on:\n- Detecting context fullness (Claude Code API?)\n- Session spawning mechanism (tmux/daemon)\n- Handoff protocol already implemented","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-22T16:18:27.570996-08:00","updated_at":"2025-12-22T16:18:27.570996-08:00"} {"id":"gt-oqzf","title":"Digest: mol-deacon-patrol","description":"Patrol #15: 3/4 through","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T22:25:28.130003-08:00","updated_at":"2025-12-24T22:25:28.130003-08:00","closed_at":"2025-12-24T22:25:28.129971-08:00","close_reason":"Squashed from 8 wisps"} +{"id":"gt-ouo","title":"gt swarm start: Does not spawn polecat sessions","description":"gt swarm start marks swarm as 'active' but doesn't start any polecat sessions.\n\nRepro:\n1. gt swarm create gastown --epic gt-hw6 --worker Toast --worker Nux\n2. gt swarm start gt-hw6\n3. gt session list - shows no new sessions\n\nExpected: Polecat sessions should start for each worker.\nActual: No sessions started, workers sit idle.","status":"tombstone","priority":0,"issue_type":"bug","created_at":"2025-12-17T22:25:43.430981-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} +{"id":"gt-ov2","title":"Refinery agent: merge queue processing loop","description":"The Refinery agent processes the merge queue, merging polecat work to main.\n\n## Interface\n\n```go\ntype Refinery struct {\n rig *Rig\n queue *MergeQueue\n git *Git\n mail *Mailbox\n config RefineryConfig\n}\n\ntype RefineryConfig struct {\n AutoMerge bool // Auto-merge passing MRs\n RunTests bool // Run tests before merge\n TestCommand string // Command to run tests\n RequireReview bool // Require review before merge (future)\n}\n\nfunc NewRefinery(rig *Rig, ...) *Refinery\n\n// Lifecycle\nfunc (r *Refinery) Start() error\nfunc (r *Refinery) Stop() error\nfunc (r *Refinery) IsRunning() bool\n\n// Processing\nfunc (r *Refinery) ProcessQueue() error\nfunc (r *Refinery) ProcessMR(mr *MergeRequest) error\n```\n\n## Processing Loop\n\n1. Check queue for pending MRs\n2. For each pending MR:\n a. Fetch polecat branch\n b. Attempt merge to refinery/rig (local main)\n c. Run tests if configured\n d. If pass: push to origin, mark merged\n e. If fail: mark rejected, notify polecat\n3. Sleep, repeat\n\n## Merge Strategy\n\n- Fast-forward when possible\n- Merge commit when not\n- On conflict: reject MR, polecat must rebase\n\n## Test Integration\n\nIf tests configured:\n```bash\ncd refinery/rig\ngit merge polecat/branch\n\u003ctest_command\u003e # e.g., go test ./...\n```\nResult determines merge/reject.\n\n## Notifications\n\nOn merge success:\n- Mail to polecat: \"Your work merged\"\n- Update bead if issue tracked\n\nOn merge failure:\n- Mail to polecat: \"Merge failed: \u003creason\u003e\"\n- Include conflict details if applicable\n\n## Dependencies\n\nNeeds: Rig management, Git wrapper, Mail system, Merge queue","status":"tombstone","priority":0,"issue_type":"task","created_at":"2025-12-15T23:22:08.498771-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-ov2","depends_on_id":"gt-u1j.14","type":"blocks","created_at":"2025-12-15T23:22:21.801826-08:00","created_by":"daemon"},{"issue_id":"gt-ov2","depends_on_id":"gt-u1j.6","type":"blocks","created_at":"2025-12-15T23:22:21.89716-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-ox67","title":"Maintenance: Regular cleanup of closed MR/gate beads","description":"Closed merge-request and gate beads accumulate over time. Need regular cleanup.\n\n## Cleanup Candidates\n- type=merge-request with status=closed\n- type=gate with status=closed\n- type=molecule with status=closed (completed workflows)\n\n## Options\n1. **Deacon patrol step** - squash closed MRs periodically\n2. **Refinery post-merge** - close and tombstone MR after successful merge\n3. **bd doctor check** - warn when stale MR count exceeds threshold\n\n## Consideration\nKeep some audit trail? Or just tombstone after N days?","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T14:38:31.532094-08:00","updated_at":"2025-12-23T14:38:31.532094-08:00"} +{"id":"gt-ox9","title":"Test from Mayor","description":"This is a test message via GGT mail","status":"tombstone","priority":2,"issue_type":"message","created_at":"2025-12-16T22:04:31.483843-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"message"} {"id":"gt-p2l2","title":"gt doctor: add Claude settings.json validation","description":"Add a new doctor check to validate Claude Code settings in worker directories:\n\n**Check for:**\n1. .claude/settings.json exists in polecats/*, crew/*, witness/rig, refinery/rig\n2. SessionStart hook has 'gt prime' command\n3. Autonomous roles (polecat, witness, refinery) have 'gt mail check --inject' in SessionStart\n4. Interactive roles (crew, mayor) have mail check in UserPromptSubmit only\n\n**Auto-fix capability:**\nUse internal/claude.EnsureSettingsForRole() to create missing settings files.\n\nContext: The spawn priming race condition fix (gt-6957) added embedded settings templates. Doctor should validate these are in place.","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-22T17:59:02.326127-08:00","updated_at":"2025-12-22T17:59:02.326127-08:00"} {"id":"gt-p4s9","title":"Digest: mol-deacon-patrol","description":"Patrol 7: Routine","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T22:36:49.392521-08:00","updated_at":"2025-12-24T22:36:49.392521-08:00","closed_at":"2025-12-24T22:36:49.392494-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-p9zh","title":"gt doctor: detect orphaned code on beads-sync branch","description":"After merging beads-sync to main, some code changes can be lost if the merge conflict resolution drops files.\n\nAdd a doctor check that runs:\n git diff main..beads-sync -- '*.go' '*.md'\n\nIf there are differences in code files (not just .beads/), warn about potentially orphaned work.\n\nToday's incident: Merge 96c773f lost mailbox.go and router.go changes from 5791752, requiring re-implementation.\n\nAcceptance:\n- gt doctor warns if beads-sync has unmerged code changes\n- Excludes .beads/ directory (expected to differ)\n- Shows file list of orphaned changes","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-20T22:01:56.794648-08:00","updated_at":"2025-12-20T22:19:59.777921-08:00","closed_at":"2025-12-20T22:19:59.777921-08:00","close_reason":"Implemented both checks: persistent-role-branches and beads-sync-orphans. Also added ensureMainBranch() to crew attach."} @@ -987,10 +1073,12 @@ {"id":"gt-qcr6","title":"Polecat template: fix 'git clone' to 'git worktree'","description":"Template says 'You're in a project git clone' but polecats use worktrees, not clones. Fix terminology.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-23T16:56:44.091888-08:00","updated_at":"2025-12-23T17:09:02.10909-08:00","closed_at":"2025-12-23T17:09:02.10909-08:00","close_reason":"Completed in commit 1931ec7","dependencies":[{"issue_id":"gt-qcr6","depends_on_id":"gt-t9u7","type":"parent-child","created_at":"2025-12-23T16:57:16.207186-08:00","created_by":"daemon"}]} {"id":"gt-qdnmm","title":"Digest: mol-deacon-patrol","description":"Patrol 9: routine, all healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T13:43:53.751357-08:00","updated_at":"2025-12-25T13:43:53.751357-08:00","closed_at":"2025-12-25T13:43:53.751316-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-qdnmm","depends_on_id":"gt-ii6aa","type":"parent-child","created_at":"2025-12-25T13:43:53.752084-08:00","created_by":"stevey"}]} {"id":"gt-qe9w","title":"Simplify and reorganize molecular chemistry docs","description":"The Gas Town molecular chemistry docs (molecules.md, molecular-chemistry.md, molecule-algebra.md) are too dramatic and verbose. They need a simplification pass to be more reference-manual style.\n\n**Current problems:**\n1. Too much metaphor and philosophy, not enough practical reference\n2. Start with the chemistry abstraction instead of what users care about (patrols, workflows)\n3. Layer cake is presented top-down (formulas → protos → molecules) instead of bottom-up (issues → dependencies → execution)\n\n**Proposed structure (inverted pyramid):**\n\n1. **Start with execution semantics:**\n - Work = issues with dependencies\n - Dependencies control execution (blocks = sequential, no dep = parallel)\n - Agents traverse dependency graphs until blocked\n - Multi-day workflows via compound bonding\n\n2. **Move to molecules:**\n - Molecules are just epics with workflow intent\n - Bonding = creating dependencies between work graphs\n - No protos required for ad-hoc workflows\n\n3. **Then templates (protos/wisps):**\n - Phase metaphor for storage locations\n - pour/wisp/squash/burn operations\n - When to use each phase\n\n4. **Finally formulas (for advanced users):**\n - YAML compile-time composition\n - extends, compose, aspects\n - Only needed for complex reusable patterns\n\n**Style guidelines:**\n- Reference manual with quick examples\n- Written like agent priming (context they need to execute)\n- Less dramatic, more straightforward\n- TL;DR at top of each doc\n\n**See also:**\n- beads/docs/MOLECULES.md has a simplified version to use as template\n- The execution model section explains multi-day traversal clearly","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-24T19:51:42.43826-08:00","updated_at":"2025-12-24T19:51:42.43826-08:00"} +{"id":"gt-qflq","title":"mol-witness-patrol","description":"Per-rig worker monitor patrol loop using the Christmas Ornament pattern.\n\nThe Witness is the Pit Boss for your rig. You watch polecats, nudge them toward\ncompletion, verify clean git state before kills, and escalate stuck workers.\n\n**You do NOT do implementation work.** Your job is oversight, not coding.\n\n## The Christmas Ornament Shape\n\nThis molecule uses dynamic bonding to create inspection arms per-polecat:\n\n```\n ★ mol-witness-patrol (trunk)\n /|\\\n ┌─────┘ │ └─────┐\n PREFLIGHT DISCOVERY CLEANUP\n │ │ │\n ┌───┴───┐ ┌─┴─┐ ┌───┴───┐\n │inbox │ │sur│ │aggreg │\n │refnry │ │vey│ │save │\n │load │ └─┬─┘ │summary│\n └───────┘ │ │contxt │\n │ │loop │\n ┌─────────┼─────────┐ └───────┘\n │ │ │\n ● ● ● mol-polecat-arm (dynamic)\n ace nux toast\n │ │ │\n ┌──┴──┐ ┌──┴──┐ ┌──┴──┐\n │cap │ │cap │ │cap │\n │ass │ │ass │ │ass │\n │dec │ │dec │ │dec │\n │exec │ │exec │ │exec │\n └──┬──┘ └──┬──┘ └──┬──┘\n │ │ │\n └─────────┴─────────┘\n │\n ⬣ base (cleanup)\n```\n\n## Phases\n\n### PREFLIGHT (fixed steps)\n1. inbox-check - Process lifecycle requests, help messages\n2. check-refinery - Ensure MQ is alive and processing\n3. load-state - Read persistent state (nudge counts, etc.)\n\n### DISCOVERY (spawns dynamic arms)\n4. survey-workers - List polecats, bond mol-polecat-arm per polecat\n5. run-plugins - Bond mol-plugin-runner for each witness plugin\n\n### CLEANUP (gate + fixed steps)\n6. aggregate - GATE: WaitsFor all arms + plugins to complete\n7. save-state - Persist nudge counts, action log\n8. generate-summary - Create digest content\n9. context-check - Check if context is high\n10. burn-or-loop - Squash/burn wisp, then loop or exit\n\n## Dynamic Arms\n\nEach polecat gets mol-polecat-arm bonded as a wisp child:\n- capture - Capture tmux output\n- assess - Categorize state (working/idle/error/done)\n- load-history - Get nudge counts for this polecat\n- decide - Apply nudge matrix\n- execute - Take action (nudge/kill/escalate/none)\n\nArms run in PARALLEL. The aggregate step waits for all to complete.\n\n## Activity Feed\n\nThis design enables real-time visibility:\n\n```\n[14:32:08] + patrol-x7k.arm-ace bonded (5 steps)\n[14:32:09] → patrol-x7k.arm-ace.capture in_progress\n[14:32:10] ✓ patrol-x7k.arm-ace.capture completed\n[14:32:14] ✓ patrol-x7k.arm-ace.decide completed (action: nudge-1)\n[14:32:17] ✓ patrol-x7k.arm-ace COMPLETE\n```\n\n## Storage\n\n- Wisp storage: .beads-wisp/ (ephemeral, gitignored)\n- Persistent state: witness handoff bead (nudge counts, etc.)\n- Digests: Squashed summaries in permanent beads\n\n## Dependencies\n\n- bd-xo1o: Dynamic Molecule Bonding epic (in beads rig)\n - bd mol bond with variable substitution\n - WaitsFor directive for fanout gates\n - Activity feed query\n\nLabels: [template, christmas-ornament]","status":"tombstone","priority":1,"issue_type":"epic","created_at":"2025-12-23T01:39:31.895817-08:00","updated_at":"2025-12-25T11:44:16.881599-08:00","close_reason":"Superseded by mol-witness-patrol proto","labels":["template"],"deleted_at":"2025-12-25T11:44:16.881599-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"epic"} {"id":"gt-qgbe","title":"Digest: mol-deacon-patrol","description":"Patrol 3: OK","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T20:55:49.186887-08:00","updated_at":"2025-12-24T20:55:49.186887-08:00","closed_at":"2025-12-24T20:55:49.186851-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-qh2","title":"Session cycling UX: smooth transitions via TUI wrapper","description":"## Problem\n\nCurrent CLI agent session cycling is painful:\n- Shell → CC starts → priming → context loads → ready → work → exit/crash → repeat\n- Each cycle is 30-60 seconds of cold boot\n- No continuity between shell and agent's inner state\n- Raw \"session not running, starting...\" loop is the baseline\n\n## GGT Advantages (already have)\n\n- Beads: Work state survives session death completely\n- Mail: Handoff notes from past-self to future-self \n- Prime commands: Structured context reload\n\n## Gap: Transition Mechanics\n\nIdeas to explore when actively using CLI:\n\n1. **In-band cycling** - `/restart` or `/cycle` command, agent handles own restart without dropping to shell\n\n2. **Hot standby** - TUI maintains pre-warmed session in background, switch to already-primed agent\n\n3. **Persistent wrapper** - Bubbletea TUI stays running across session cycles, CC sessions come/go inside it\n\n4. **Session pooling** - Keep 2-3 primed sessions ready, never wait for cold start\n\n## Deferred\n\nDeliberately P4 until we're actively using the simpler CLI and feel the pain firsthand.","status":"open","priority":4,"issue_type":"task","created_at":"2025-12-15T20:38:12.660716-08:00","updated_at":"2025-12-15T23:17:34.27061-08:00"} {"id":"gt-qivm","title":"gt crew at: auto-prime when exec'ing Claude in-session","description":"When running 'gt crew at \u003cname\u003e' from inside the target session, we exec Claude directly. But this means we can't send 'gt prime' afterward since we ARE the process.\n\nPossible solutions:\n1. Claude startup hook that runs gt prime\n2. Pass prompt as argument to claude CLI\n3. Wrapper script approach\n\nRelated: crew resume prompt also can't be sent in this path.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-19T15:13:38.035775-08:00","updated_at":"2025-12-21T11:50:55.924767-08:00","closed_at":"2025-12-21T11:50:55.924767-08:00","close_reason":"Implemented: execClaude now passes 'gt prime' as initial prompt to Claude CLI"} {"id":"gt-qj12","title":"Obsolete beads issues need cleanup","description":"Found obsolete issues that should be closed or fixed:\n\nTest artifacts to close:\n- gt-nriy: Test: Alpha to Beta (message test)\n- gt-gswn: Integration test (test artifact)\n- gt-54kn: Test: New Router\n\nBroken dependencies (reference non-existent gt-test123):\n- gt-vhby: implement\n- gt-tvos: load-context\n- gt-lwuu.2: implement (template variable unresolved)\n\nCloudRun references (non-existent /deploy/cloudrun/):\n- gt-9a2.6, gt-9a2.7, gt-9a2.11\n\nReview and close/update these before launch.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-24T12:50:57.843146-08:00","updated_at":"2025-12-24T12:50:57.843146-08:00","dependencies":[{"issue_id":"gt-qj12","depends_on_id":"gt-jo9n","type":"blocks","created_at":"2025-12-24T12:52:07.394519-08:00","created_by":"daemon"}]} +{"id":"gt-qkoah","title":"Digest: mol-deacon-patrol","description":"Patrol 2: All healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T13:54:19.67205-08:00","updated_at":"2025-12-25T13:54:19.67205-08:00","closed_at":"2025-12-25T13:54:19.67202-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-qkoah","depends_on_id":"gt-rrvyk","type":"parent-child","created_at":"2025-12-25T13:54:19.672791-08:00","created_by":"deacon"}]} {"id":"gt-qn4l","title":"bd create should support molecule type","description":"gt molecule commands expect type=molecule but bd validates against bug|feature|task|epic|chore|merge-request only","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-19T18:25:31.591953-08:00","updated_at":"2025-12-19T18:41:15.654491-08:00","closed_at":"2025-12-19T18:41:15.654491-08:00"} {"id":"gt-qna4","title":"gt done: Missing command referenced in polecat docs","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-20T01:10:57.495372-08:00","updated_at":"2025-12-20T07:47:01.733466-08:00","closed_at":"2025-12-20T07:47:01.733466-08:00"} {"id":"gt-qns0","title":"TIDY UP: Your previous work (patrol runner) was already m...","description":"TIDY UP: Your previous work (patrol runner) was already merged to main. Check your git status is clean, sync beads, and if nothing to do, just run 'gt done'.","status":"closed","priority":2,"issue_type":"task","assignee":"gastown/ace","created_at":"2025-12-21T17:26:39.343497-08:00","updated_at":"2025-12-21T17:30:05.98355-08:00","closed_at":"2025-12-21T17:30:05.98355-08:00","close_reason":"Polecats cleaned up after reboot"} @@ -1030,6 +1118,7 @@ {"id":"gt-qy6u","title":"Test Patrol Parent","description":"Test parent for Christmas Ornament pattern","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T20:40:58.593162-08:00","updated_at":"2025-12-25T01:33:00.538969-08:00","closed_at":"2025-12-25T01:33:00.538969-08:00","close_reason":"Test pollution cleanup"} {"id":"gt-qy6u.1","title":"Test Polecat Arm","description":"Test child for bonding pattern","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T20:40:58.680513-08:00","updated_at":"2025-12-25T01:33:00.520382-08:00","closed_at":"2025-12-25T01:33:00.520382-08:00","close_reason":"Test pollution cleanup","dependencies":[{"issue_id":"gt-qy6u.1","depends_on_id":"gt-qy6u","type":"parent-child","created_at":"2025-12-24T20:40:58.680943-08:00","created_by":"daemon"}]} {"id":"gt-qz2l","title":"Refinery patrol: Add banners and wisp-based execution","description":"Bring Refinery patrol up to Deacon's level of sophistication:\n\n## Current state\n- mol-refinery-patrol exists (needs verification)\n- Basic merge queue processing\n\n## Needed\n1. **Banners** - Print step banners like Deacon does:\n ```\n ═══════════════════════════════════════════════════════════════\n ⚗️ QUEUE-CHECK\n Processing merge queue entries\n ═══════════════════════════════════════════════════════════════\n ```\n\n2. **Wisp-based execution** - Spawn patrol as wisp, squash when complete\n3. **Handoff bead attachment** - Refinery needs its own handoff bead with attached_molecule\n4. **Loop-or-exit step** - Context-aware cycling like Deacon\n5. **Patrol summary banner** at end of each cycle\n\n## Reference\nSee Deacon patrol implementation in ~/gt/deacon/CLAUDE.md","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T13:19:40.777589-08:00","updated_at":"2025-12-24T00:18:03.103523-08:00","closed_at":"2025-12-23T19:39:03.524185-08:00","close_reason":"Implemented banners, wisp-based execution, and propulsion protocol for Refinery patrol","dependencies":[{"issue_id":"gt-qz2l","depends_on_id":"gt-y481","type":"parent-child","created_at":"2025-12-23T13:20:15.787696-08:00","created_by":"daemon"}]} +{"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":"tombstone","priority":0,"issue_type":"task","created_at":"2025-12-16T13:12:02.676883-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-r6td","title":"gt spawn: Notify Deacon and Witness on polecat start","description":"When gt spawn creates a polecat, it should mail both Deacon and Witness:\n\n```\ngt mail send \u003crig\u003e/witness -s 'POLECAT_STARTED furiosa' -m 'Issue: gt-xxx'\ngt mail send deacon/ -s 'POLECAT_STARTED gastown/furiosa' -m 'Issue: gt-xxx'\n```\n\nThis enables:\n- Witness to bond a lease to its patrol wisp\n- Deacon to verify worker started (redundancy)\n- Both to nudge if worker is idle at prompt\n\nPart of the village self-monitoring architecture.","status":"closed","priority":1,"issue_type":"feature","assignee":"gastown/furiosa","created_at":"2025-12-22T22:01:11.790203-08:00","updated_at":"2025-12-22T22:53:01.103369-08:00","closed_at":"2025-12-22T22:53:01.103369-08:00","close_reason":"Closed"} {"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-r7jj2","title":"Move mol run semantics from bd into gt spawn","description":"Currently gt spawn shells out to bd mol run for the pour+assign+pin combo. This blurs the architectural boundary between bd (data layer) and gt (orchestration layer).\n\n## Current State\n- bd mol run = bd pour + bd update --status=in_progress + bd pin --for me\n- gt spawn calls: exec.Command(\"bd\", \"mol\", \"run\", ...)\n\n## Proposed Change\nMove the combo logic into gt spawn directly:\n1. gt spawn calls bd pour (create issues from template)\n2. gt spawn calls bd update --status=in_progress (claim work)\n3. gt spawn calls bd pin (set pinned flag)\n4. gt spawn does session/tmux orchestration\n\nThis keeps bd as pure data operations and gt as the orchestration layer.\n\n## Why\n- Cleaner separation of concerns\n- bd mol run feels like orchestration but it's in the data layer\n- gt should own the \"start a workflow\" semantics\n\n## Coordination\nbeads side will deprecate bd mol run once gt no longer depends on it.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T00:59:01.873712-08:00","updated_at":"2025-12-25T01:05:35.761412-08:00","closed_at":"2025-12-25T01:05:35.761412-08:00","close_reason":"Moved mol run semantics into gt spawn - now uses bd pour + bd update + bd pin"} @@ -1048,6 +1137,7 @@ {"id":"gt-rhfji","title":"gt up: set BD_ACTOR env var when spawning agents","description":"When gt spawns agents (polecats, crew, patrol roles), it should set BD_ACTOR env var so that bd commands (like `bd hook`) know the agent identity.\n\nCurrently gt sets GT_ROLE but bd can't check that (no coupling to gt). bd already checks BD_ACTOR, so gt just needs to set it.\n\nPlaces to update:\n- `gt up` for polecats/crew\n- Deacon, Witness, Refinery spawning\n- Any other agent spawn points\n\nRelated: closed bd-fej5 in beads repo as obsolete (fix belongs here).","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T12:41:21.092758-08:00","updated_at":"2025-12-25T13:26:47.176904-08:00","closed_at":"2025-12-25T13:26:47.176904-08:00","close_reason":"Closed"} {"id":"gt-rivr","title":"Activity Feed TUI","description":"Terminal UI for browsing Gas Town activity. Shows hierarchical view of rigs, workers, and their current state. Features: live updates, expandable details, molecule progress (step X of Y). Built with bubbletea/lipgloss. Design doc: history/activity-feed-tui-design.md","status":"open","priority":1,"issue_type":"epic","created_at":"2025-12-23T16:26:45.667677-08:00","updated_at":"2025-12-23T16:26:45.667677-08:00"} {"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":"tombstone","priority":0,"issue_type":"task","created_at":"2025-12-15T23:22:24.754361-08:00","updated_at":"2025-12-25T01:30:41.67682-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"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-rp0f4","title":"Digest: mol-deacon-patrol","description":"Patrol 6: all clear","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T11:04:58.835959-08:00","updated_at":"2025-12-25T11:04:58.835959-08:00","closed_at":"2025-12-25T11:04:58.835926-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-rp0f4","depends_on_id":"gt-b1wia","type":"parent-child","created_at":"2025-12-25T11:04:58.836661-08:00","created_by":"stevey"}]} {"id":"gt-rp0k","title":"Extend auto-continue to polecats (not just crew)","description":"gt prime currently only outputs AUTO-CONTINUE MODE for crew workers.\nPolecats with attached work should also auto-continue.\n\n## Current behavior\noutputCrewAttachmentStatus() in prime.go:\n- Only runs for RoleCrew\n- Outputs '→ AUTO-CONTINUE MODE' when attached work detected\n\n## Desired behavior\n- Rename to outputAttachmentStatus() or similar\n- Run for RoleCrew AND RolePolecat\n- Same directive: if attachment exists, work immediately\n\n## The Propulsion Principle\n'If you find something on your hook, YOU RUN IT.'\n\nThis applies to ALL workers, not just crew.\n\n## Implementation\n1. Extend role check in outputCrewAttachmentStatus()\n2. Adjust assignee detection for polecats vs crew\n3. Test with both worker types","status":"closed","priority":1,"issue_type":"task","assignee":"gastown/nux","created_at":"2025-12-22T16:43:22.149252-08:00","updated_at":"2025-12-22T23:40:12.049577-08:00","closed_at":"2025-12-22T23:40:12.049577-08:00","close_reason":"Extended auto-continue to polecats via outputAttachmentStatus"} {"id":"gt-rpsu2","title":"Digest: mol-deacon-patrol","description":"Patrol 6: All healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T00:31:06.415769-08:00","updated_at":"2025-12-25T00:31:06.415769-08:00","closed_at":"2025-12-25T00:31:06.415734-08:00"} @@ -1072,6 +1162,7 @@ {"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-23T14:27:07.15923-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"}]} +{"id":"gt-slo","title":"Fix TestHasPolecat test failure","status":"tombstone","priority":0,"issue_type":"bug","created_at":"2025-12-17T17:30:19.474356-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} {"id":"gt-sn8if","title":"Digest: mol-deacon-patrol","description":"Patrol 8: routine, all healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T13:43:39.832046-08:00","updated_at":"2025-12-25T13:43:39.832046-08:00","closed_at":"2025-12-25T13:43:39.832015-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-sn8if","depends_on_id":"gt-4kovx","type":"parent-child","created_at":"2025-12-25T13:43:39.832777-08:00","created_by":"stevey"}]} {"id":"gt-sp18","title":"Digest: mol-deacon-patrol","description":"Patrol #18","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T22:26:11.030566-08:00","updated_at":"2025-12-24T22:26:11.030566-08:00","closed_at":"2025-12-24T22:26:11.030537-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-spdof","title":"Digest: mol-deacon-patrol","description":"Patrol 1: All healthy, no messages, no orphans","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T13:25:58.151972-08:00","updated_at":"2025-12-25T13:25:58.151972-08:00","closed_at":"2025-12-25T13:25:58.151943-08:00"} @@ -1132,13 +1223,27 @@ {"id":"gt-ty3w4","title":"Digest: mol-deacon-patrol","description":"Final patrol cycle 20: all systems healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T11:22:00.43096-08:00","updated_at":"2025-12-25T11:22:00.43096-08:00","closed_at":"2025-12-25T11:22:00.430928-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-u0c1","title":"Merge: gt-qna4","description":"branch: polecat/capable\ntarget: main\nsource_issue: gt-qna4\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-20T07:47:28.453817-08:00","updated_at":"2025-12-20T23:17:25.792255-08:00","closed_at":"2025-12-20T23:17:25.792255-08:00","close_reason":"Branches nuked, MRs obsolete"} {"id":"gt-u1j","title":"Port Gas Town to Go","description":"Complete rewrite of Gas Town in Go for improved performance and single-binary distribution.\n\n## Goals\n- Single installable binary (gt)\n- All Python functionality ported\n- Federation support built-in\n- Improved performance\n\n## Phases\n1. Core infrastructure (config, workspace, git wrapper)\n2. Rig \u0026 polecat management\n3. Session \u0026 tmux operations\n4. Mail system\n5. CLI commands\n6. TUI (optional)","status":"closed","priority":0,"issue_type":"epic","created_at":"2025-12-15T16:36:28.769343-08:00","updated_at":"2025-12-23T01:49:44.85631-08:00","closed_at":"2025-12-23T01:49:44.85631-08:00","close_reason":"Go port complete - Python version deprecated"} +{"id":"gt-u1j.1","title":"Go scaffolding: cmd/gt, go.mod, Cobra setup","description":"Set up Go project structure with CLI framework.\n\n**Stack:**\n- Cobra for command/flag handling\n- Lipgloss for styled terminal output\n\n**Deliverables:**\n- cmd/gt/main.go with Cobra root command\n- Basic subcommands: version, help\n- Lipgloss styles for status output (success, warning, error)\n- go.mod with dependencies","status":"tombstone","priority":0,"issue_type":"task","created_at":"2025-12-15T16:36:48.376267-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-u1j.1","depends_on_id":"gt-u1j","type":"parent-child","created_at":"2025-12-15T16:36:48.376622-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-u1j.10","title":"CLI: core commands (status, prime, version, init)","description":"Essential CLI commands for Gas Town operation.\n\n## Commands\n\n### gt status\nShow overall town status.\n```\ngt status [--json]\n```\nOutput:\n- Town name and location\n- Number of rigs\n- Active polecats across all rigs\n- Witness status per rig\n- Recent activity summary\n\n### gt prime\nOutput role context for current directory.\n```\ngt prime\n```\nDetects role from directory:\n- Town root or mayor/ → Mayor context\n- \u003crig\u003e/witness/rig/ → Witness context\n- \u003crig\u003e/refinery/rig/ → Refinery context\n- \u003crig\u003e/polecats/\u003cname\u003e/ → Polecat context\n\n### gt version\nShow version information.\n```\ngt version [--short]\n```\nOutput: version, git commit, build date.\n\n### gt init\nInitialize current rig for Gas Town (alternative to gt install for existing repos).\n```\ngt init [--force]\n```\nCreates Gas Town structure in existing git repo.\n\n## Implementation\n\nEach command is a Cobra subcommand under root:\n```go\nvar statusCmd = \u0026cobra.Command{...}\nvar primeCmd = \u0026cobra.Command{...}\nvar versionCmd = \u0026cobra.Command{...}\nvar initCmd = \u0026cobra.Command{...}\n```\n\nRegister in cmd/gt/main.go.","status":"tombstone","priority":0,"issue_type":"task","created_at":"2025-12-15T17:12:38.367667-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-u1j.10","depends_on_id":"gt-u1j","type":"parent-child","created_at":"2025-12-15T17:12:38.368006-08:00","created_by":"daemon"},{"issue_id":"gt-u1j.10","depends_on_id":"gt-u1j.5","type":"blocks","created_at":"2025-12-15T17:14:06.123332-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-u1j.11","title":"CLI: session commands (start, stop, at, list, capture, inject)","description":"Session management CLI commands.\n\n## Commands\n\n### gt session start\nStart a polecat session.\n```\ngt session start \u003crig\u003e/\u003cpolecat\u003e [--issue \u003cid\u003e]\n```\n- Creates tmux session\n- Launches claude in polecat workdir\n- Optionally injects initial issue context\n\n### gt session stop\nStop a polecat session.\n```\ngt session stop \u003crig\u003e/\u003cpolecat\u003e [--force]\n```\n- Graceful shutdown by default\n- --force kills immediately\n\n### gt session at (attach)\nAttach to running session.\n```\ngt session at \u003crig\u003e/\u003cpolecat\u003e\n```\n- Attaches tmux session to current terminal\n- Detach with Ctrl-B D\n\n### gt session list\nList all sessions.\n```\ngt session list [--rig \u003crig\u003e] [--json]\n```\n- Shows running/stopped status\n- Optionally filter by rig\n\n### gt session capture\nCapture recent output from session.\n```\ngt session capture \u003crig\u003e/\u003cpolecat\u003e [--lines \u003cn\u003e]\n```\n- Default: last 100 lines\n- Useful for checking polecat progress\n\n### gt session inject\nSend message to session.\n```\ngt session inject \u003crig\u003e/\u003cpolecat\u003e -m \"message\"\ngt session inject \u003crig\u003e/\u003cpolecat\u003e -f \u003cfile\u003e\n```\n- Injects text via tmux send-keys\n- Used for nudges, notifications\n\n## Address Format\n\n`\u003crig\u003e/\u003cpolecat\u003e` e.g., `wyvern/Toast`\n\n## Implementation\n\nSession subcommand group:\n```go\nvar sessionCmd = \u0026cobra.Command{Use: \"session\"}\nsessionCmd.AddCommand(startCmd, stopCmd, atCmd, listCmd, captureCmd, injectCmd)\n```","status":"tombstone","priority":0,"issue_type":"task","created_at":"2025-12-15T17:12:40.70671-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-u1j.11","depends_on_id":"gt-u1j","type":"parent-child","created_at":"2025-12-15T17:12:40.707072-08:00","created_by":"daemon"},{"issue_id":"gt-u1j.11","depends_on_id":"gt-u1j.7","type":"blocks","created_at":"2025-12-15T17:14:06.23195-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-u1j.12","title":"CLI: mail commands (send, inbox, read)","description":"CLI: mail commands wrapping bd mail.\n\n## Status\n\nCurrent implementation works with JSONL files. Refactor to wrap bd mail CLI.\n\n## Commands\n\n### gt mail inbox\n```\ngt mail inbox [--unread] [--json]\n```\nWraps: `bd mail inbox [--json]`\n\n### gt mail read\n```\ngt mail read \u003cid\u003e\n```\nWraps: `bd mail read \u003cid\u003e \u0026\u0026 bd mail ack \u003cid\u003e`\nNote: bd mail read + ack marks as read.\n\n### gt mail send\n```\ngt mail send \u003caddress\u003e -s \"Subject\" -m \"Body\" [--notify]\n```\nWraps: `bd mail send \u003crecipient\u003e -s \"Subject\" -m \"Body\"`\nIf --notify: inject tmux notification after send.\n\n### gt mail delete\n```\ngt mail delete \u003cid\u003e\n```\nWraps: `bd mail ack \u003cid\u003e` (closes the message issue)\n\n## Address Translation\n\nSame as gt-u1j.6:\n- `mayor/` → `mayor`\n- `\u003crig\u003e/refinery` → `\u003crig\u003e-refinery`\n- `\u003crig\u003e/\u003cpolecat\u003e` → `\u003crig\u003e-\u003cpolecat\u003e`\n\n## Dependencies\n\n- gt-u1j.6: Mail system backend","status":"tombstone","priority":0,"issue_type":"task","created_at":"2025-12-15T17:12:42.038558-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-u1j.12","depends_on_id":"gt-u1j","type":"parent-child","created_at":"2025-12-15T17:12:42.038885-08:00","created_by":"daemon"},{"issue_id":"gt-u1j.12","depends_on_id":"gt-u1j.6","type":"blocks","created_at":"2025-12-15T17:14:06.328188-08:00","created_by":"daemon"},{"issue_id":"gt-u1j.12","depends_on_id":"gt-r01","type":"blocks","created_at":"2025-12-16T13:12:08.639736-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-u1j.13","title":"Beads CLI wrapper: shell out to bd","description":"Wrapper for bd (beads CLI) commands.\n\n## Interface\n\n```go\ntype Beads struct {\n workDir string\n}\n\nfunc NewBeads(workDir string) *Beads\n\n// Query\nfunc (b *Beads) List(opts ListOptions) ([]*Issue, error)\nfunc (b *Beads) Ready() ([]*Issue, error)\nfunc (b *Beads) Show(id string) (*Issue, error)\nfunc (b *Beads) Blocked() ([]*Issue, error)\n\n// Mutations\nfunc (b *Beads) Create(opts CreateOptions) (*Issue, error)\nfunc (b *Beads) Update(id string, opts UpdateOptions) error\nfunc (b *Beads) Close(ids ...string) error\n\n// Sync\nfunc (b *Beads) Sync() error\nfunc (b *Beads) SyncStatus() (*SyncStatus, error)\n```\n\n## Data Types\n\n```go\ntype Issue struct {\n ID string\n Title string\n Status string\n Priority int\n Type string\n Description string\n Parent string\n Children []string\n DependsOn []string\n Blocks []string\n}\n\ntype ListOptions struct {\n Status string // \"open\", \"closed\", \"all\"\n Type string\n Priority int\n}\n\ntype CreateOptions struct {\n Title string\n Type string\n Priority int\n Description string\n Parent string\n}\n```\n\n## Implementation\n\nShell out to bd binary, parse JSON output where available.\n```go\nfunc (b *Beads) runBd(args ...string) ([]byte, error) {\n cmd := exec.Command(\"bd\", args...)\n cmd.Dir = b.workDir\n return cmd.Output()\n}\n```\n\n## Error Handling\n\n- bd not installed: Clear error with install instructions\n- Not a beads repo: Detect and report\n- Sync conflicts: Parse and report","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-15T17:12:55.926393-08:00","updated_at":"2025-12-25T01:26:08.552857-08:00","closed_at":"2025-12-25T01:26:08.552857-08:00","close_reason":"Beads CLI wrapper fully implemented in internal/beads/beads.go","dependencies":[{"issue_id":"gt-u1j.13","depends_on_id":"gt-u1j","type":"parent-child","created_at":"2025-12-15T17:12:55.926744-08:00","created_by":"daemon"},{"issue_id":"gt-u1j.13","depends_on_id":"gt-u1j.1","type":"blocks","created_at":"2025-12-15T17:14:21.168049-08:00","created_by":"daemon"}]} +{"id":"gt-u1j.14","title":"Merge queue: per-rig queue management","description":"Per-rig merge queue for coordinating polecat work.\n\n## Concept\n\nWhen polecats complete work, they submit to the merge queue. The Refinery processes the queue, merging work to main in order.\n\n## Data Model\n\n```go\ntype MergeRequest struct {\n ID string `json:\"id\"`\n Polecat string `json:\"polecat\"`\n Branch string `json:\"branch\"`\n Issue string `json:\"issue,omitempty\"`\n Status MRStatus `json:\"status\"`\n CreatedAt time.Time `json:\"created_at\"`\n UpdatedAt time.Time `json:\"updated_at\"`\n}\n\ntype MRStatus string\nconst (\n MRPending MRStatus = \"pending\"\n MRReviewing MRStatus = \"reviewing\"\n MRMerged MRStatus = \"merged\"\n MRRejected MRStatus = \"rejected\"\n)\n```\n\n## Interface\n\n```go\ntype MergeQueue struct {\n rig *Rig\n path string // \u003crig\u003e/refinery/queue.jsonl\n}\n\nfunc NewMergeQueue(rig *Rig) *MergeQueue\n\n// Queue operations\nfunc (mq *MergeQueue) Submit(polecat, branch string, issue string) (*MergeRequest, error)\nfunc (mq *MergeQueue) List() ([]*MergeRequest, error)\nfunc (mq *MergeQueue) Next() (*MergeRequest, error) // oldest pending\nfunc (mq *MergeQueue) Get(id string) (*MergeRequest, error)\n\n// Status updates\nfunc (mq *MergeQueue) SetStatus(id string, status MRStatus) error\nfunc (mq *MergeQueue) MarkMerged(id string) error\nfunc (mq *MergeQueue) MarkRejected(id, reason string) error\n```\n\n## Queue Storage\n\nJSONL file at `\u003crig\u003e/refinery/queue.jsonl`. FIFO ordering.\n\n## Git Coordination\n\nRefinery processes queue:\n1. Fetch polecat branch\n2. Attempt merge to main\n3. Run tests (if configured)\n4. Push to origin\n5. Update queue status\n\n## Conflict Handling\n\nIf merge fails:\n- Mark MR as rejected\n- Notify polecat to rebase","status":"tombstone","priority":0,"issue_type":"task","created_at":"2025-12-15T17:12:57.707908-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-u1j.14","depends_on_id":"gt-u1j","type":"parent-child","created_at":"2025-12-15T17:12:57.708254-08:00","created_by":"daemon"},{"issue_id":"gt-u1j.14","depends_on_id":"gt-u1j.3","type":"blocks","created_at":"2025-12-15T17:14:18.469302-08:00","created_by":"daemon"},{"issue_id":"gt-u1j.14","depends_on_id":"gt-u1j.5","type":"blocks","created_at":"2025-12-15T17:14:18.549859-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-u1j.15","title":"Plugin system: subprocess JSON protocol","description":"Language-agnostic plugin system via subprocess JSON protocol.\n\n## Concept\n\nAllow extending Gas Town with external scripts/programs. Plugins communicate via stdin/stdout JSON.\n\n## Protocol\n\nRequest (gt → plugin):\n```json\n{\"method\": \"check\", \"params\": {\"rig\": \"wyvern\", \"polecat\": \"Toast\"}}\n```\n\nResponse (plugin → gt):\n```json\n{\"result\": {...}, \"error\": null}\n```\n\nError response:\n```json\n{\"result\": null, \"error\": {\"code\": 1, \"message\": \"...\"}}\n```\n\n## Interface\n\n```go\ntype Plugin struct {\n Name string\n Path string // executable path\n Methods []string\n}\n\ntype PluginManager struct {\n plugins map[string]*Plugin\n}\n\nfunc NewPluginManager() *PluginManager\nfunc (pm *PluginManager) Register(plugin *Plugin) error\nfunc (pm *PluginManager) Call(plugin, method string, params any) (any, error)\nfunc (pm *PluginManager) Discover(dir string) error // auto-discover plugins\n```\n\n## Plugin Discovery\n\nLook in:\n1. `\u003ctown\u003e/plugins/`\n2. `~/.config/gastown/plugins/`\n3. System path with `gt-plugin-*` prefix\n\n## Built-in Hooks\n\nPlugins can register for events:\n- `polecat.started` - Polecat session started\n- `polecat.done` - Polecat signals done\n- `merge.requested` - MR submitted\n- `merge.completed` - MR merged\n\n## Use Cases\n\n- Custom health checks\n- Integration with external systems (Slack, etc.)\n- Custom merge policies\n- Metrics collection\n\n## Future\n\nConsider MCP integration for richer plugin capabilities.","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-15T17:12:59.200876-08:00","updated_at":"2025-12-15T23:17:22.102624-08:00","dependencies":[{"issue_id":"gt-u1j.15","depends_on_id":"gt-u1j","type":"parent-child","created_at":"2025-12-15T17:12:59.201236-08:00","created_by":"daemon"},{"issue_id":"gt-u1j.15","depends_on_id":"gt-u1j.1","type":"blocks","created_at":"2025-12-15T17:14:21.246945-08:00","created_by":"daemon"}]} {"id":"gt-u1j.16","title":"CLI: rig commands (list, show, add)","description":"Rig management CLI commands.\n\n## Commands\n\n### gt rig list\nList all registered rigs.\n```\ngt rig list [--json]\n```\nOutput:\n- Rig name\n- Git URL\n- Polecat count\n- Witness/Refinery status\n\n### gt rig show\nShow details for a specific rig.\n```\ngt rig show \u003cname\u003e [--json]\n```\nOutput:\n- Full rig info\n- Polecats with status\n- Recent activity\n- Beads summary (open issues)\n\n### gt rig add\nAdd a new rig to the town.\n```\ngt rig add \u003cname\u003e \u003cgit-url\u003e\ngt rig add \u003cname\u003e --local \u003cpath\u003e\n```\nSteps:\n- Clone repo to town root (or link local)\n- Register in rigs.json\n- Create agent directories\n- Configure git exclude\n\n### gt rig remove\nRemove a rig from the town.\n```\ngt rig remove \u003cname\u003e [--force]\n```\n- Warns if active polecats\n- --force required if uncommitted changes\n\n## Implementation\n\n```go\nvar rigCmd = \u0026cobra.Command{Use: \"rig\"}\nrigCmd.AddCommand(rigListCmd, rigShowCmd, rigAddCmd, rigRemoveCmd)\n```","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-15T17:13:01.075697-08:00","updated_at":"2025-12-15T21:20:44.918399-08:00","dependencies":[{"issue_id":"gt-u1j.16","depends_on_id":"gt-u1j","type":"parent-child","created_at":"2025-12-15T17:13:01.076033-08:00","created_by":"daemon"},{"issue_id":"gt-u1j.16","depends_on_id":"gt-u1j.5","type":"blocks","created_at":"2025-12-15T17:14:08.30402-08:00","created_by":"daemon"}]} {"id":"gt-u1j.17","title":"CLI: polecat commands (add, remove, list, wake, sleep)","description":"Polecat management CLI commands.\n\n## Commands\n\n### gt polecat list\nList polecats in a rig.\n```\ngt polecat list \u003crig\u003e [--json]\ngt polecat list --all [--json]\n```\nOutput:\n- Name\n- State (idle/active/working/done/stuck)\n- Current issue (if any)\n- Session status (running/stopped)\n\n### gt polecat add\nAdd a new polecat to a rig.\n```\ngt polecat add \u003crig\u003e \u003cname\u003e\n```\n- Creates polecat directory\n- Clones rig repo\n- Creates work branch\n- Initializes state\n\n### gt polecat remove\nRemove a polecat from a rig.\n```\ngt polecat remove \u003crig\u003e/\u003cpolecat\u003e [--force]\n```\n- Fails if session running\n- Warns if uncommitted changes\n- --force bypasses checks\n\n### gt polecat wake\nMark polecat as active (ready for work).\n```\ngt polecat wake \u003crig\u003e/\u003cpolecat\u003e\n```\nTransitions: idle → active\n\n### gt polecat sleep\nMark polecat as idle (not available).\n```\ngt polecat sleep \u003crig\u003e/\u003cpolecat\u003e\n```\nTransitions: active → idle\nFails if session running (stop first).\n\n## Address Format\n\n`\u003crig\u003e/\u003cpolecat\u003e` for operations on specific polecat.\n`\u003crig\u003e` for list command.\n\n## Implementation\n\n```go\nvar polecatCmd = \u0026cobra.Command{Use: \"polecat\"}\npolecatCmd.AddCommand(listCmd, addCmd, removeCmd, wakeCmd, sleepCmd)\n```","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-15T17:13:13.683142-08:00","updated_at":"2025-12-15T21:20:56.485805-08:00","dependencies":[{"issue_id":"gt-u1j.17","depends_on_id":"gt-u1j","type":"parent-child","created_at":"2025-12-15T17:13:13.683486-08:00","created_by":"daemon"},{"issue_id":"gt-u1j.17","depends_on_id":"gt-u1j.8","type":"blocks","created_at":"2025-12-15T17:14:08.405807-08:00","created_by":"daemon"}]} {"id":"gt-u1j.18","title":"CLI: witness commands (start, stop, status)","description":"Witness daemon CLI commands.\n\n## Commands\n\n### gt witness start\nStart the witness daemon for a rig.\n```\ngt witness start \u003crig\u003e [--interval \u003cseconds\u003e]\n```\n- Starts background daemon process\n- Default heartbeat interval: 30s\n- Logs to \u003crig\u003e/witness/witness.log\n\n### gt witness stop\nStop the witness daemon.\n```\ngt witness stop \u003crig\u003e\n```\n- Graceful shutdown\n- Completes current heartbeat cycle\n\n### gt witness status\nShow witness status.\n```\ngt witness status \u003crig\u003e [--json]\n```\nOutput:\n- Running/stopped\n- Last heartbeat time\n- Polecats being monitored\n- Recent nudges/escalations\n\n### gt witness logs\nView witness logs.\n```\ngt witness logs \u003crig\u003e [--follow] [--lines \u003cn\u003e]\n```\n- --follow: Continuous output (like tail -f)\n- --lines: Number of lines (default 50)\n\n## Daemon Management\n\nWitness runs as background process:\n- PID stored in \u003crig\u003e/witness/witness.pid\n- Uses nohup for persistence\n- Logs structured JSON events\n\n## Implementation\n\n```go\nvar witnessCmd = \u0026cobra.Command{Use: \"witness\"}\nwitnessCmd.AddCommand(startCmd, stopCmd, statusCmd, logsCmd)\n```\n\nStart launches daemon via exec, status reads PID file and pings process.","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-15T17:13:15.022371-08:00","updated_at":"2025-12-15T21:21:07.27635-08:00","dependencies":[{"issue_id":"gt-u1j.18","depends_on_id":"gt-u1j","type":"parent-child","created_at":"2025-12-15T17:13:15.022774-08:00","created_by":"daemon"},{"issue_id":"gt-u1j.18","depends_on_id":"gt-u1j.9","type":"blocks","created_at":"2025-12-15T17:14:08.490417-08:00","created_by":"daemon"}]} +{"id":"gt-u1j.19","title":"CLI: spawn command","description":"High-level command to spawn a polecat with work assignment.\n\n## Command\n\n```\ngt spawn \u003crig\u003e/\u003cpolecat\u003e --issue \u003cid\u003e\ngt spawn \u003crig\u003e --issue \u003cid\u003e # auto-select available polecat\ngt spawn \u003crig\u003e/\u003cpolecat\u003e -m \"Work on X\" # free-form task\n```\n\n## What It Does\n\n1. Select or create polecat\n2. Ensure polecat is in idle/active state\n3. Assign the issue (update beads, set polecat state)\n4. Start session (gt session start)\n5. Inject initial context\n\n## Options\n\n- `--issue \u003cid\u003e`: Beads issue to assign\n- `-m \"message\"`: Free-form work description\n- `--create`: Create polecat if it does not exist\n- `--no-start`: Assign work but do not start session\n\n## Auto-Select Logic\n\nIf polecat not specified:\n1. Look for idle polecats in rig\n2. Prefer ones that worked on similar issues before\n3. If none available, fail (or create if --create)\n\n## Initial Context\n\nInjects into session:\n```\n[SPAWN] You have been assigned: \u003cissue-title\u003e\nIssue: \u003cid\u003e\nPriority: \u003cpriority\u003e\n\n\u003cdescription\u003e\n\nWork on this issue. Signal DONE when complete.\n```\n\n## Implementation\n\nOrchestrates PolecatManager + SessionManager + Beads:\n```go\nfunc Spawn(rig, polecat, issue string, opts SpawnOptions) error\n```","status":"tombstone","priority":0,"issue_type":"task","created_at":"2025-12-15T17:13:16.676891-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-u1j.19","depends_on_id":"gt-u1j","type":"parent-child","created_at":"2025-12-15T17:13:16.677248-08:00","created_by":"daemon"},{"issue_id":"gt-u1j.19","depends_on_id":"gt-u1j.8","type":"blocks","created_at":"2025-12-15T17:14:09.726436-08:00","created_by":"daemon"},{"issue_id":"gt-u1j.19","depends_on_id":"gt-u1j.6","type":"blocks","created_at":"2025-12-15T17:14:09.821801-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-u1j.2","title":"Bubbletea TUI dashboard","description":"Interactive TUI using Charm Bubbletea. Root model, view routing, Lipgloss theme. Includes: dashboard, rig explorer, polecat detail with live tail, mail view, beads view, spawn wizard.","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-15T16:52:02.390539-08:00","updated_at":"2025-12-15T23:17:16.487399-08:00","dependencies":[{"issue_id":"gt-u1j.2","depends_on_id":"gt-u1j","type":"parent-child","created_at":"2025-12-15T16:52:02.39089-08:00","created_by":"daemon"},{"issue_id":"gt-u1j.2","depends_on_id":"gt-u1j.1","type":"blocks","created_at":"2025-12-15T16:52:10.351879-08:00","created_by":"daemon"},{"issue_id":"gt-u1j.2","depends_on_id":"gt-f9x.3","type":"blocks","created_at":"2025-12-15T16:52:10.441448-08:00","created_by":"daemon"}]} +{"id":"gt-u1j.20","title":"Prompt templates: role contexts, nudge messages","description":"Prompt templates for role contexts and messages.\n\n## Template Types\n\n### Role CLAUDE.md Templates\n\nFor gt prime and CLAUDE.md generation:\n- Mayor template\n- Witness template\n- Refinery template\n- Polecat template\n\n### Message Templates\n\nFor notifications and nudges:\n- Spawn assignment\n- Witness nudge\n- Escalation to Mayor\n- Session handoff\n\n## Implementation\n\n```go\n//go:embed templates/*.md.tmpl\nvar templateFS embed.FS\n\ntype Templates struct {\n fs embed.FS\n}\n\nfunc NewTemplates() *Templates\nfunc (t *Templates) RenderRole(role string, data RoleData) (string, error)\nfunc (t *Templates) RenderMessage(name string, data any) (string, error)\n```\n\n## Template Data\n\n```go\ntype RoleData struct {\n Role string\n RigName string\n TownRoot string\n Polecats []string\n Commands []CommandHelp\n}\n\ntype SpawnData struct {\n Issue string\n Title string\n Priority int\n Description string\n}\n\ntype NudgeData struct {\n Polecat string\n Reason string\n NudgeCount int\n MaxNudges int\n}\n```\n\n## Template Location\n\nEmbedded in binary via go:embed:\n```\ninternal/templates/\n├── roles/\n│ ├── mayor.md.tmpl\n│ ├── witness.md.tmpl\n│ ├── refinery.md.tmpl\n│ └── polecat.md.tmpl\n└── messages/\n ├── spawn.md.tmpl\n ├── nudge.md.tmpl\n └── escalation.md.tmpl\n```\n\n## Usage\n\ngt prime uses role templates.\ngt spawn uses spawn template.\nWitness uses nudge/escalation templates.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-15T17:13:18.711762-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-u1j.20","depends_on_id":"gt-u1j","type":"parent-child","created_at":"2025-12-15T17:13:18.712116-08:00","created_by":"daemon"},{"issue_id":"gt-u1j.20","depends_on_id":"gt-u1j.1","type":"blocks","created_at":"2025-12-15T17:14:21.32864-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-u1j.21","title":"Test infrastructure: fixtures, mocks, integration tests","description":"Test infrastructure for Gas Town.\n\n## Test Categories\n\n### Unit Tests\n- Config parsing\n- Mail operations\n- Merge queue operations\n- Template rendering\n\n### Integration Tests\n- Git operations (uses real git in temp dirs)\n- Full workflows (spawn → work → merge)\n- CLI command tests\n\n## Fixtures\n\n```go\npackage testutil\n\n// Creates temp town with minimal structure\nfunc NewTestTown(t *testing.T) *TestTown\n\n// Creates temp rig with git repo\nfunc NewTestRig(t *testing.T, town *TestTown, name string) *TestRig\n\n// Creates test polecat\nfunc NewTestPolecat(t *testing.T, rig *TestRig, name string) *TestPolecat\n```\n\n## Mocks\n\n```go\n// Mock tmux for session tests (avoid actual tmux)\ntype MockTmux struct {\n Sessions map[string][]string // captured send-keys\n}\n\nfunc (m *MockTmux) NewSession(name, dir string) error\nfunc (m *MockTmux) SendKeys(session, keys string) error\nfunc (m *MockTmux) CapturePane(session string, lines int) (string, error)\n```\n\n## Test Helpers\n\n```go\n// Run test in temp directory\nfunc InTempDir(t *testing.T, fn func(dir string))\n\n// Initialize git repo for testing\nfunc InitGitRepo(t *testing.T, dir string)\n\n// Assert file exists with content\nfunc AssertFileContains(t *testing.T, path, substr string)\n\n// Assert JSON file has field\nfunc AssertJSONField(t *testing.T, path, field string, expected any)\n```\n\n## CI Integration\n\n- go test ./... runs all tests\n- Integration tests skip with -short flag\n- Coverage report generation\n\n## Test Data\n\nEmbedded test fixtures:\n```go\n//go:embed testdata/*\nvar testdataFS embed.FS\n```","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-15T17:13:28.755475-08:00","updated_at":"2025-12-15T21:21:56.470205-08:00","dependencies":[{"issue_id":"gt-u1j.21","depends_on_id":"gt-u1j","type":"parent-child","created_at":"2025-12-15T17:13:28.755866-08:00","created_by":"daemon"},{"issue_id":"gt-u1j.21","depends_on_id":"gt-u1j.1","type":"blocks","created_at":"2025-12-15T17:14:21.425389-08:00","created_by":"daemon"}]} +{"id":"gt-u1j.22","title":"CLI: gt stop --all (emergency swarm kill)","description":"Emergency kill command for swarm operations.\n\n## Commands\n\n```bash\ngt stop --all # Kill ALL sessions across all rigs\ngt stop --rig \u003cname\u003e # Kill all sessions in one rig\ngt stop --rig \u003cname\u003e --graceful # Try graceful first, then force\n```\n\n## Implementation\n\n### --all flag\n1. List all tmux sessions matching gt-*\n2. For each: capture final output, kill session\n3. Update all polecat states to idle\n4. Log all killed sessions\n5. Send mail to Mayor: \"Emergency stop executed\"\n\n### --rig flag\n1. List sessions for specific rig\n2. Same as above but scoped\n\n### --graceful flag\n1. First, try to inject \"exit\" command\n2. Wait 5 seconds\n3. If still running, force kill\n\n## Output\n\n```\nStopping all Gas Town sessions...\n [wyvern] Toast: captured output, killed\n [wyvern] Capable: captured output, killed\n [beads] Nux: captured output, killed\n \n3 sessions stopped.\nAll polecat states set to 'idle'.\nMail sent to mayor/.\n```\n\n## Safety\n\n- Always capture output before killing\n- Update state files to reflect reality\n- Log all operations to gt.log\n- Warn if uncommitted changes detected (but still kill)\n\n## Dependencies\n\nNeeds: Tmux wrapper, Session management, Polecat management","status":"tombstone","priority":0,"issue_type":"task","created_at":"2025-12-15T23:17:51.455669-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-u1j.22","depends_on_id":"gt-u1j","type":"parent-child","created_at":"2025-12-15T23:17:51.456008-08:00","created_by":"daemon"},{"issue_id":"gt-u1j.22","depends_on_id":"gt-u1j.7","type":"blocks","created_at":"2025-12-15T23:18:58.198873-08:00","created_by":"daemon"},{"issue_id":"gt-u1j.22","depends_on_id":"gt-u1j.8","type":"blocks","created_at":"2025-12-15T23:18:58.297176-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-u1j.3","title":"Git wrapper: shell out to git","description":"Wrapper for git operations via subprocess.\n\n## Interface\n\n```go\ntype Git struct {\n workDir string\n}\n\nfunc NewGit(workDir string) *Git\n\n// Core operations\nfunc (g *Git) Clone(url, dest string) error\nfunc (g *Git) Checkout(ref string) error\nfunc (g *Git) Fetch(remote string) error\nfunc (g *Git) Pull(remote, branch string) error\nfunc (g *Git) Push(remote, branch string, force bool) error\n\n// Commit operations\nfunc (g *Git) Add(paths ...string) error\nfunc (g *Git) Commit(message string) error\nfunc (g *Git) CommitAll(message string) error\n\n// Query operations\nfunc (g *Git) Status() (*GitStatus, error)\nfunc (g *Git) CurrentBranch() (string, error)\nfunc (g *Git) HasUncommittedChanges() (bool, error)\nfunc (g *Git) RemoteURL(remote string) (string, error)\n\n// Merge operations\nfunc (g *Git) Merge(branch string) error\nfunc (g *Git) Rebase(onto string) error\nfunc (g *Git) AbortMerge() error\nfunc (g *Git) AbortRebase() error\n```\n\n## Implementation\n\nShell out to git binary via exec.Command. Parse output where needed (Status, CurrentBranch).\n\n## Error Handling\n\n- Wrap git stderr in error messages\n- Detect specific failures (merge conflict, auth failure, not a repo)\n- Return structured errors for callers to handle\n\n## Testing\n\n- Use temp directories with real git repos\n- Test both success and failure paths","status":"tombstone","priority":0,"issue_type":"task","created_at":"2025-12-15T17:12:11.907807-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-u1j.3","depends_on_id":"gt-u1j","type":"parent-child","created_at":"2025-12-15T17:12:11.908262-08:00","created_by":"daemon"},{"issue_id":"gt-u1j.3","depends_on_id":"gt-u1j.1","type":"blocks","created_at":"2025-12-15T17:13:47.220423-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-u1j.4","title":"Tmux wrapper: session operations","description":"Wrapper for tmux session operations via subprocess.\n\n## Interface\n\n```go\ntype Tmux struct{}\n\nfunc NewTmux() *Tmux\n\n// Session lifecycle\nfunc (t *Tmux) NewSession(name, workDir string) error\nfunc (t *Tmux) KillSession(name string) error\nfunc (t *Tmux) HasSession(name string) (bool, error)\nfunc (t *Tmux) ListSessions() ([]string, error)\n\n// Session interaction\nfunc (t *Tmux) SendKeys(session, keys string) error\nfunc (t *Tmux) CapturePane(session string, lines int) (string, error)\nfunc (t *Tmux) AttachSession(session string) error\n\n// Window operations (if needed)\nfunc (t *Tmux) SelectWindow(session string, index int) error\n```\n\n## Session Naming\n\nConvention: `gt-\u003crig\u003e-\u003cpolecat\u003e` (e.g., `gt-wyvern-Toast`)\n\n## Implementation\n\n- Shell out to tmux binary\n- CapturePane uses `tmux capture-pane -p -t \u003csession\u003e -S -\u003clines\u003e`\n- SendKeys uses `tmux send-keys -t \u003csession\u003e '\u003ckeys\u003e' Enter`\n\n## Error Handling\n\n- \"no server running\": tmux not started (not an error for HasSession)\n- \"session not found\": session doesn't exist\n- Wrap all tmux errors with context\n\n## Environment\n\nRequires TMUX_TMPDIR or uses default socket. Don't assume tmux is running.","status":"tombstone","priority":0,"issue_type":"task","created_at":"2025-12-15T17:12:13.432706-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-u1j.4","depends_on_id":"gt-u1j","type":"parent-child","created_at":"2025-12-15T17:12:13.433043-08:00","created_by":"daemon"},{"issue_id":"gt-u1j.4","depends_on_id":"gt-u1j.1","type":"blocks","created_at":"2025-12-15T17:13:47.298442-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-u1j.5","title":"Rig management: discover, load, create rigs","description":"Rig discovery, loading, and creation.\n\n## Interface\n\n```go\ntype Rig struct {\n Name string\n Path string\n GitURL string\n Config RigConfig\n Polecats []string\n HasWitness bool\n HasRefinery bool\n}\n\ntype RigManager struct {\n townRoot string\n config *Config\n git *Git\n}\n\nfunc NewRigManager(townRoot string, config *Config, git *Git) *RigManager\n\n// Discovery\nfunc (rm *RigManager) DiscoverRigs() ([]*Rig, error)\nfunc (rm *RigManager) GetRig(name string) (*Rig, error)\nfunc (rm *RigManager) RigExists(name string) bool\n\n// Creation\nfunc (rm *RigManager) AddRig(name, gitURL string) (*Rig, error)\nfunc (rm *RigManager) RemoveRig(name string) error\n\n// Rig state\nfunc (rm *RigManager) LoadRigConfig(rig *Rig) error\nfunc (rm *RigManager) SaveRigConfig(rig *Rig) error\n```\n\n## Discovery Logic\n\n1. Read rigs.json from config/\n2. For each registered rig, verify directory exists\n3. Load rig-level config if present\n4. Scan for polecats/ subdirectory\n5. Check for witness/, refinery/ directories\n\n## Rig Creation\n\n1. Clone repo to town root\n2. Add entry to rigs.json\n3. Create agent directories (polecats/, witness/, refinery/, mayor/)\n4. Update .git/info/exclude to ignore agent dirs\n5. Initialize rig config\n\n## Rig Structure\n\nPer docs/architecture.md:\n```\n\u003crig\u003e/\n├── polecats/\n├── refinery/rig/\n├── witness/rig/\n└── mayor/rig/\n```","status":"tombstone","priority":0,"issue_type":"task","created_at":"2025-12-15T17:12:15.034694-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-u1j.5","depends_on_id":"gt-u1j","type":"parent-child","created_at":"2025-12-15T17:12:15.035022-08:00","created_by":"daemon"},{"issue_id":"gt-u1j.5","depends_on_id":"gt-u1j.3","type":"blocks","created_at":"2025-12-15T17:13:49.93957-08:00","created_by":"daemon"},{"issue_id":"gt-u1j.5","depends_on_id":"gt-f9x.1","type":"blocks","created_at":"2025-12-15T17:13:50.047236-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-u1j.6","title":"Mail system: JSONL inbox, delivery, tmux injection","description":"Refactor mail system to wrap bd mail commands.\n\n## Status\n\nCurrent implementation uses JSONL files directly. Now that Beads mail is available (gt-r01 closed), refactor to use bd mail as the backend.\n\n## Implementation\n\nReplace internal/mail/* with thin wrappers around bd CLI:\n\n```go\n// Send wraps: bd mail send \u003cto\u003e -s \u003csubject\u003e -m \u003cbody\u003e\nfunc (r *Router) Send(msg *Message) error\n\n// List wraps: bd mail inbox --json\nfunc (m *Mailbox) List() ([]*Message, error)\n\n// Get wraps: bd mail read \u003cid\u003e --json\nfunc (m *Mailbox) Get(id string) (*Message, error)\n\n// MarkRead wraps: bd mail ack \u003cid\u003e\nfunc (m *Mailbox) MarkRead(id string) error\n```\n\n## Address Translation\n\nGGT addresses → Beads recipients:\n- `mayor/` → `mayor`\n- `\u003crig\u003e/refinery` → `\u003crig\u003e-refinery`\n- `\u003crig\u003e/\u003cpolecat\u003e` → `\u003crig\u003e-\u003cpolecat\u003e`\n\n## Tmux Notification\n\nKeep the tmux injection for --notify flag. After bd mail send, optionally inject notification into tmux session.\n\n## Migration\n\nNo migration needed - bd mail creates messages as beads issues with type=message. Old JSONL inboxes can be ignored or cleaned up.\n\n## Dependencies\n\n- gt-r01: CLOSED (Beads mail available)\n- gt-u1j.4: Tmux wrapper (for notifications)","status":"tombstone","priority":0,"issue_type":"task","created_at":"2025-12-15T17:12:16.226478-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-u1j.6","depends_on_id":"gt-u1j","type":"parent-child","created_at":"2025-12-15T17:12:16.226821-08:00","created_by":"daemon"},{"issue_id":"gt-u1j.6","depends_on_id":"gt-u1j.4","type":"blocks","created_at":"2025-12-15T17:13:51.98774-08:00","created_by":"daemon"},{"issue_id":"gt-u1j.6","depends_on_id":"gt-r01","type":"blocks","created_at":"2025-12-16T13:12:08.753309-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-u1j.7","title":"Session management: start, stop, attach, capture","description":"Polecat session lifecycle management.\n\n## Interface\n\n```go\ntype SessionManager struct {\n tmux *Tmux\n rig *Rig\n}\n\nfunc NewSessionManager(tmux *Tmux, rig *Rig) *SessionManager\n\n// Lifecycle\nfunc (sm *SessionManager) Start(polecat string, opts StartOptions) error\nfunc (sm *SessionManager) Stop(polecat string) error\nfunc (sm *SessionManager) IsRunning(polecat string) (bool, error)\nfunc (sm *SessionManager) List() ([]SessionInfo, error)\n\n// Interaction\nfunc (sm *SessionManager) Attach(polecat string) error\nfunc (sm *SessionManager) Capture(polecat string, lines int) (string, error)\nfunc (sm *SessionManager) Inject(polecat string, message string) error\n\ntype StartOptions struct {\n WorkDir string // defaults to polecat clone dir\n Issue string // optional: issue to work on\n Command string // optional: override claude command\n}\n\ntype SessionInfo struct {\n Polecat string\n SessionID string\n Running bool\n StartedAt time.Time\n}\n```\n\n## Session Naming\n\n`gt-\u003crig\u003e-\u003cpolecat\u003e` (e.g., `gt-wyvern-Toast`)\n\n## Start Flow\n\n1. Verify polecat clone exists\n2. Check no existing session\n3. Create tmux session in polecat workdir\n4. Send initial command: `claude` or custom\n5. If issue provided, inject initial prompt\n\n## Stop Flow\n\n1. Capture final output (for logging)\n2. Send exit/quit command\n3. Wait briefly for graceful shutdown\n4. Kill session if still running\n\n## Capture\n\nUses tmux capture-pane to get recent output. Returns last N lines.\n\n## Inject\n\nSends text to session via tmux send-keys. Used for:\n- Mail notifications\n- Witness nudges\n- User messages","status":"tombstone","priority":0,"issue_type":"task","created_at":"2025-12-15T17:12:25.473674-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-u1j.7","depends_on_id":"gt-u1j","type":"parent-child","created_at":"2025-12-15T17:12:25.473993-08:00","created_by":"daemon"},{"issue_id":"gt-u1j.7","depends_on_id":"gt-u1j.4","type":"blocks","created_at":"2025-12-15T17:13:52.081053-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-u1j.8","title":"Polecat management: add, remove, list, state","description":"Polecat lifecycle: add, remove, list, state tracking.\n\n## Data Model\n\n```go\ntype Polecat struct {\n Name string `json:\"name\"`\n Rig string `json:\"rig\"`\n State PolecatState `json:\"state\"`\n ClonePath string `json:\"clone_path\"`\n Branch string `json:\"branch\"`\n Issue string `json:\"issue,omitempty\"`\n CreatedAt time.Time `json:\"created_at\"`\n UpdatedAt time.Time `json:\"updated_at\"`\n}\n\ntype PolecatState string\nconst (\n StateIdle PolecatState = \"idle\"\n StateActive PolecatState = \"active\"\n StateWorking PolecatState = \"working\"\n StateDone PolecatState = \"done\"\n StateStuck PolecatState = \"stuck\"\n)\n```\n\n## Interface\n\n```go\ntype PolecatManager struct {\n rig *Rig\n git *Git\n}\n\nfunc NewPolecatManager(rig *Rig, git *Git) *PolecatManager\n\n// Lifecycle\nfunc (pm *PolecatManager) Add(name string) (*Polecat, error)\nfunc (pm *PolecatManager) Remove(name string) error\nfunc (pm *PolecatManager) List() ([]*Polecat, error)\nfunc (pm *PolecatManager) Get(name string) (*Polecat, error)\n\n// State\nfunc (pm *PolecatManager) SetState(name string, state PolecatState) error\nfunc (pm *PolecatManager) AssignIssue(name, issue string) error\nfunc (pm *PolecatManager) ClearIssue(name string) error\n\n// Convenience\nfunc (pm *PolecatManager) Wake(name string) error // idle → active\nfunc (pm *PolecatManager) Sleep(name string) error // active → idle\n```\n\n## Add Flow\n\n1. Create directory: `\u003crig\u003e/polecats/\u003cname\u003e/`\n2. Clone rig repo into it (or copy from rig root)\n3. Create new branch: `polecat/\u003cname\u003e`\n4. Initialize polecat state file\n5. Create mail inbox\n\n## Remove Flow\n\n1. Verify session not running\n2. Check for uncommitted changes (warn/error)\n3. Remove directory\n4. Clean up state\n\n## State Persistence\n\nStore in `\u003crig\u003e/polecats/\u003cname\u003e/state.json`","status":"tombstone","priority":0,"issue_type":"task","created_at":"2025-12-15T17:12:27.402824-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-u1j.8","depends_on_id":"gt-u1j","type":"parent-child","created_at":"2025-12-15T17:12:27.403171-08:00","created_by":"daemon"},{"issue_id":"gt-u1j.8","depends_on_id":"gt-u1j.5","type":"blocks","created_at":"2025-12-15T17:13:53.747126-08:00","created_by":"daemon"},{"issue_id":"gt-u1j.8","depends_on_id":"gt-u1j.3","type":"blocks","created_at":"2025-12-15T17:13:53.831197-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-u1j.9","title":"Witness daemon: heartbeat loop, spawn ephemeral agent","description":"Background daemon for agent lifecycle and monitoring.\n\n## Core Responsibilities\n\n1. **Heartbeat monitoring**: Check agent health periodically\n2. **Session lifecycle**: Restart agents after handoff (Witness Protection)\n3. **Polecat monitoring**: Track worker progress, nudging\n4. **Escalation**: Report failures to Mayor\n\n## Session Lifecycle (Witness Protection)\n\nThe daemon enables autonomous long-running operation by cycling agent sessions:\n\n```go\ntype SessionLifecycle struct {\n AgentType string // \"witness\", \"refinery\"\n StatePath string // path to state.json\n}\n\nfunc (d *Daemon) monitorSessionLifecycle(agent SessionLifecycle) {\n // 1. Detect session exit\n // 2. Check state.json for requesting_cycle: true\n // 3. If cycle requested: start new session, clear flag\n // 4. If unexpected exit: escalate to Mayor\n}\n```\n\nSee architecture.md Key Decision #12: Agent Session Lifecycle.\n\n## Interface\n\n```go\ntype Daemon struct {\n rig *Rig\n polecats *PolecatManager\n sessions *SessionManager\n config DaemonConfig\n}\n\ntype DaemonConfig struct {\n HeartbeatInterval time.Duration // default: 30s\n NudgeThreshold int // nudges before escalation\n MaxWorkers int // from rig config\n}\n\nfunc NewDaemon(rig *Rig) *Daemon\nfunc (d *Daemon) Start() error\nfunc (d *Daemon) Stop() error\n\n// Lifecycle\nfunc (d *Daemon) CycleSession(agentType string) error\nfunc (d *Daemon) SpawnWorker(issueID string) error\nfunc (d *Daemon) ShutdownWorker(polecat string) error\n```\n\n## Heartbeat Loop\n\nEvery HeartbeatInterval:\n1. Check Witness session (restart if cycle requested)\n2. Check Refinery session (restart if cycle requested)\n3. For each active polecat: assess progress, nudge if stuck\n4. Query `bd ready` for new work, spawn up to max_workers","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-15T17:12:29.389103-08:00","updated_at":"2025-12-18T11:50:12.047959-08:00","closed_at":"2025-12-18T11:50:12.047959-08:00","dependencies":[{"issue_id":"gt-u1j.9","depends_on_id":"gt-u1j","type":"parent-child","created_at":"2025-12-15T17:12:29.389428-08:00","created_by":"daemon"},{"issue_id":"gt-u1j.9","depends_on_id":"gt-u1j.7","type":"blocks","created_at":"2025-12-15T17:14:04.353775-08:00","created_by":"daemon"},{"issue_id":"gt-u1j.9","depends_on_id":"gt-u1j.8","type":"blocks","created_at":"2025-12-15T17:14:04.440363-08:00","created_by":"daemon"}]} {"id":"gt-u1k","title":"gt shutdown should fully cleanup polecats (worktrees, branches, inboxes)","description":"Current gt shutdown only kills tmux sessions but leaves:\n\n1. Git worktrees in polecats/ directory\n2. Polecat branches (polecat/\u003cname\u003e)\n3. Inbox messages\n4. Beads assignee state\n\nThis causes stale polecats to be reused on next startup.\n\n## Expected Behavior\n\ngt shutdown should:\n1. Kill all polecat tmux sessions (current behavior)\n2. For each polecat with StateIdle or StateDone:\n - Remove worktree\n - Delete branch\n - Clear inbox\n3. For polecats with uncommitted work:\n - REFUSE to clean up\n - Report which polecats have uncommitted changes\n - Require --force or --nuclear to proceed\n\n## Current Code\n\n- start.go:runImmediateShutdown() only calls t.KillSession()\n- Witness cleanupPolecat() does full cleanup but isn't called by shutdown\n\n## Fix\n\nEither:\n1. Call Witness cleanup for each polecat during shutdown\n2. OR add rig.ShutdownPolecats() that does the full cleanup","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-20T15:22:42.921949-08:00","updated_at":"2025-12-21T10:32:47.205012-08:00","closed_at":"2025-12-21T10:32:47.205012-08:00","close_reason":"Implemented polecat cleanup in gt shutdown","dependencies":[{"issue_id":"gt-u1k","depends_on_id":"gt-8v8","type":"blocks","created_at":"2025-12-20T15:23:15.226189-08:00","created_by":"daemon"}]} {"id":"gt-u1lf","title":"Digest: mol-deacon-patrol @ 2025-12-24 19:26","description":"Patrol 12: quiet","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T19:26:31.865491-08:00","updated_at":"2025-12-24T19:26:31.865491-08:00","closed_at":"2025-12-24T19:26:31.865414-08:00","close_reason":"Squashed from wisp gt-35r (9 issues)"} @@ -1147,6 +1252,7 @@ {"id":"gt-u41w","title":"Merge: gt-5af.1","description":"branch: polecat/Ace\ntarget: main\nsource_issue: gt-5af.1\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-19T17:30:40.48203-08:00","updated_at":"2025-12-19T18:26:14.105767-08:00","closed_at":"2025-12-19T17:48:09.550789-08:00"} {"id":"gt-u4fh","title":"Remove stubbed ProcessMRFromQueue and mrqueue package","description":"internal/refinery/engineer.go has stubbed ProcessMRFromQueue() that returns hardcoded failure.\ninternal/mrqueue/ package exists but isn't used.\n\nThis was aspirational 'beads-based MR automation' but:\n1. Refinery agent just runs git commands per role prompt\n2. manager.ProcessMR() is already fully implemented if we need Go automation\n3. The stub creates confusion about what's working\n\nEither:\n1. Remove engineer.ProcessMRFromQueue and mrqueue package entirely\n2. Or finish implementing it if there's a real use case\n\nLeaning toward removal - YAGNI.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-24T13:04:53.050803-08:00","updated_at":"2025-12-24T13:04:53.050803-08:00","dependencies":[{"issue_id":"gt-u4fh","depends_on_id":"gt-jo9n","type":"blocks","created_at":"2025-12-24T13:05:00.183378-08:00","created_by":"daemon"}]} {"id":"gt-u818","title":"Witness Plugin System","description":"Patrol extensions via molecule bonding.\n\n## Core Insight\n\nPlugins ARE molecules. No separate format needed.\n\n## How It Works\n\n```\nmol-witness-patrol\n │\n ├── survey-workers\n │\n ├── plugin-run ←── bonds registered plugin molecules\n │ │\n │ ├── mol-mood-check (if registered)\n │ ├── mol-security-scan (if registered)\n │ └── mol-custom-X (user-installed)\n │\n └── aggregate (WaitsFor: all-children)\n```\n\n## Plugin Molecule Structure\n\nA plugin is just a molecule proto with specific labels:\n\n```json\n{\n \"id\": \"mol-mood-check\",\n \"title\": \"Polecat Mood Check\",\n \"description\": \"Assess polecat emotional state from output. Vars: {{polecat_name}}, {{captured_output}}\",\n \"labels\": [\"template\", \"plugin\", \"witness\", \"tier:haiku\"],\n \"issue_type\": \"task\"\n}\n```\n\nLabels encode metadata:\n- `plugin` - marks as bondable plugin\n- `witness` / `deacon` / `refinery` - which patrol can use it\n- `tier:haiku` / `tier:sonnet` - model tier hint\n\n## Registration\n\nPlugins registered in rig config or molecules.jsonl:\n\n```bash\n# Install from Mol Mall\nbd mol install mol-mood-check\n\n# Or add to ~/.beads/molecules.jsonl manually\n```\n\n## Execution\n\nThe `plugin-run` step in patrol:\n\n```bash\n# For each registered plugin molecule matching this patrol:\nbd mol bond mol-mood-check $PATROL_WISP \\\n --ref mood-{{polecat_name}} \\\n --var polecat_name=$POLECAT \\\n --var captured_output=\"$OUTPUT\"\n```\n\n## CLI\n\n- `bd mol list --label plugin` - List available plugins\n- `bd mol install \u003cid\u003e` - Install from Mol Mall\n- `gt patrol plugins \u003crole\u003e` - Show plugins for a patrol role\n\n## Benefits\n\n- No YAML schema to maintain\n- No separate plugin loading code\n- Plugins are versioned, synced, auditable (they are beads)\n- Distribution via Mol Mall (molecules.jsonl registry)\n- Same {{var}} substitution as all molecules","status":"open","priority":1,"issue_type":"feature","created_at":"2025-12-21T16:16:53.886931-08:00","updated_at":"2025-12-23T05:07:12.471303-08:00"} +{"id":"gt-u82","title":"Design: Mayor session cycling and handoff","description":"Design for Mayor session cycling and structured handoff.\n\n## Overview\n\nMayor coordinates across all rigs and runs for extended periods. Needs session cycling pattern with structured handoff notes.\n\n## Key Elements\n\n1. Session cycling recognition (when to cycle)\n2. Handoff note format (structured state capture)\n3. Handoff delivery (mail to self)\n4. Fresh session startup (reading and resuming)\n\n## Subtasks (implementation)\n\n- gt-g2d: Mayor session cycling prompting\n- gt-sye: Mayor startup protocol prompting\n- gt-vci: Mayor handoff mail template\n- gt-1le: town handoff command (optional, P2)\n\n**Design complete.** Each subtask has full specification in its description.","status":"tombstone","priority":1,"issue_type":"epic","created_at":"2025-12-15T20:03:16.125725-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"epic"} {"id":"gt-u8ybw","title":"Digest: mol-deacon-patrol","description":"Patrol 18: Nominal","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T23:53:19.814904-08:00","updated_at":"2025-12-24T23:53:19.814904-08:00","closed_at":"2025-12-24T23:53:19.81487-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-ua5f","title":"Digest: mol-deacon-patrol","description":"Patrol: read mayor handoff (gt-mzal boot design), all agents up, furiosa working gt-oiv0, note: gt-4eim orphaned (angharad gone)","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-22T21:29:07.064593-08:00","updated_at":"2025-12-22T21:29:07.064593-08:00","closed_at":"2025-12-22T21:29:07.064557-08:00","close_reason":"Squashed from 5 wisps"} {"id":"gt-uadg","title":"Digest: mol-deacon-patrol","description":"Patrol complete: all agents healthy, no lifecycle requests, 9 in-progress items noted","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T23:20:11.959796-08:00","updated_at":"2025-12-24T23:20:11.959796-08:00","closed_at":"2025-12-24T23:20:11.959761-08:00","close_reason":"Squashed from 8 wisps"} @@ -1187,6 +1293,7 @@ {"id":"gt-vhn1","title":"Test Patrol for Bonding","description":"Parent issue for mol bond CLI test","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T22:27:56.627443-08:00","updated_at":"2025-12-25T01:33:00.961948-08:00","closed_at":"2025-12-25T01:33:00.961948-08:00","close_reason":"Test pollution cleanup"} {"id":"gt-vhn1.1","title":"Polecat Arm (arm-toast)","description":"Single polecat inspection and action cycle.\n\nThis molecule is bonded dynamically by mol-witness-patrol's survey-workers step.\nEach polecat being monitored gets one arm that runs in parallel with other arms.\n\n## Variables\n\n| Variable | Required | Description |\n|----------|----------|-------------|\n| polecat_name | Yes | Name of the polecat to inspect |\n| rig | Yes | Rig containing the polecat |\n\n## Step: capture\nCapture recent tmux output for toast.\n\n```bash\ntmux capture-pane -t gt-gastown-toast -p | tail -50\n```\n\nRecord:\n- Last activity timestamp (when was last tool call?)\n- Visible errors or stack traces\n- Completion indicators (\"Done\", \"Finished\", etc.)\n\n## Step: assess\nCategorize polecat state based on captured output.\n\nStates:\n- **working**: Recent tool calls, active processing\n- **idle**: At prompt, no recent activity\n- **error**: Showing errors or stack traces\n- **requesting_shutdown**: Sent LIFECYCLE/Shutdown mail\n- **done**: Showing completion indicators\n\nCalculate: minutes since last activity.\nNeeds: capture\n\n## Step: load-history\nRead nudge history for toast from patrol state.\n\n```\nnudge_count = state.nudges[toast].count\nlast_nudge_time = state.nudges[toast].timestamp\n```\n\nThis data was loaded by the parent patrol's load-state step and passed\nto the arm via the bonding context.\nNeeds: assess\n\n## Step: decide\nApply the nudge matrix to determine action for toast.\n\n| State | Idle Time | Nudge Count | Action |\n|-------|-----------|-------------|--------|\n| working | any | any | none |\n| idle | \u003c10min | any | none |\n| idle | 10-15min | 0 | nudge-1 (gentle) |\n| idle | 15-20min | 1 | nudge-2 (direct) |\n| idle | 20+min | 2 | nudge-3 (final) |\n| idle | any | 3 | escalate |\n| error | any | any | assess-severity |\n| requesting_shutdown | any | any | pre-kill-verify |\n| done | any | any | pre-kill-verify |\n\nNudge text:\n1. \"How's progress? Need any help?\"\n2. \"Please wrap up soon. What's blocking you?\"\n3. \"Final check. Will escalate in 5 min if no response.\"\n\nRecord decision and rationale.\nNeeds: load-history\n\n## Step: execute\nTake the decided action for toast.\n\n**nudge-N**:\n```bash\ntmux send-keys -t gt-gastown-toast \"{{nudge_text}}\" Enter\n```\n\n**pre-kill-verify**:\n```bash\ncd polecats/toast\ngit status # Must be clean\ngit log origin/main..HEAD # Check for unpushed\nbd show \u003cassigned-issue\u003e # Verify closed/deferred\n```\nIf clean: kill session, remove worktree, delete branch\nIf dirty: record failure, retry next cycle\n\n**escalate**:\n```bash\ngt mail send mayor/ -s \"Escalation: toast stuck\" -m \"...\"\n```\n\n**none**: No action needed.\n\nRecord: action taken, result, updated nudge count.\nNeeds: decide\n\n## Output\n\nThe arm completes with:\n- action_taken: none | nudge-1 | nudge-2 | nudge-3 | killed | escalated\n- result: success | failed | pending\n- updated_state: New nudge count and timestamp for toast\n\nThis data feeds back to the parent patrol's aggregate step.\n---\nbonded_from: mol-polecat-arm\nbonded_to: gt-vhn1\nbonded_ref: arm-toast\nbonded_at: 2025-12-23T10:00:00Z\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T22:27:56.71661-08:00","updated_at":"2025-12-23T22:27:56.888968-08:00","closed_at":"2025-12-23T22:27:56.888968-08:00","close_reason":"Closed","dependencies":[{"issue_id":"gt-vhn1.1","depends_on_id":"gt-vhn1","type":"parent-child","created_at":"2025-12-23T22:27:56.717145-08:00","created_by":"daemon"}]} {"id":"gt-vjv","title":"Add bulk session stop command (gt session stop --all)","description":"When decommissioning a rig, need to stop multiple sessions one at a time. A --all or --rig flag would allow: gt session stop --rig gastown","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-12-18T11:33:33.394649-08:00","updated_at":"2025-12-18T11:38:51.399298-08:00","closed_at":"2025-12-18T11:38:51.399298-08:00"} +{"id":"gt-vjw","title":"Swarm learning: Session cleanup missing from swarm workflow","description":"## Problem\n\nAfter Enders Game swarm completed (18 issues merged), 16 polecat sessions were left running but idle. No automated cleanup occurred.\n\n## What Should Happen\n\n1. Witness detects polecat completed work (idle at prompt)\n2. Witness verifies git state is clean\n3. Witness shuts down session\n4. Witness reports completion to Mayor\n\n## GGT Components\n\n- gt-cxx: Witness context cycling (covers self-cycling)\n- gt-u1j.9: Witness daemon heartbeat loop\n- gt-kmn.6: Witness swarm landing protocol\n\n## Recommendation\n\nAdd to Witness responsibilities:\n- Monitor for 'work complete' signals (DONE keyword, idle detection)\n- Automated session shutdown after verification\n- Swarm completion reporting to Mayor\n\nSee also: architecture.md 'Worker Cleanup (Witness-Owned)' section which describes this but it wasn't implemented in PGT.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-16T01:27:52.796587-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-vlpvi","title":"Digest: mol-deacon-patrol","description":"Patrol 15: All agents healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T03:56:28.353902-08:00","updated_at":"2025-12-25T03:56:28.353902-08:00","closed_at":"2025-12-25T03:56:28.35387-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-vmk7","title":"Guardrail: Verify commits exist before closing polecat issues","description":"## Updated Approach (ZFC)\n\nThe original proposal was for mechanical guardrails in bd close. This contradicts the ZFC principle: all decisions go to models, not code.\n\n## Correct Solution\n\nThe verification should happen in **mol-polecat-arm** execute step, not bd close:\n\nIn the pre-kill-verify action:\n```bash\n# Current steps\ngit status # Must be clean\ngit log origin/main..HEAD # Check for unpushed\nbd show \u003cassigned-issue\u003e # Verify closed/deferred\n\n# ADD: Verify productive work\ngit log --oneline --grep='\u003cissue-id\u003e' | head -1\n# If no commits AND issue being closed as 'done' → flag for review\n```\n\nThe agent (Witness) makes the decision. The mol gives it the verification step.\n\n## Why Not Code Guardrails\n\nPolecats have legitimate reasons to close issues without commits:\n- Already done (someone else fixed it)\n- Deferred (out of scope)\n- Escalated (needs human decision)\n- Duplicate (merged with another issue)\n\nA code guardrail would block all these. The mol step lets the agent verify AND make the judgment call.\n\n## Implementation\n\nUpdate mol-polecat-arm execute step to include commit verification for 'done' closures.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T14:35:24.695717-08:00","updated_at":"2025-12-25T00:51:13.479024-08:00","closed_at":"2025-12-25T00:51:13.479024-08:00","close_reason":"Added commit verification to mol-polecat-arm execute step. Agent verifies issue-referencing commits exist for done closures per ZFC principle."} {"id":"gt-vmm9","title":"Digest: mol-deacon-patrol @ 2025-12-24 19:26","description":"Patrol 13: quiet","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T19:26:56.830842-08:00","updated_at":"2025-12-24T19:26:56.830842-08:00","closed_at":"2025-12-24T19:26:56.830768-08:00","close_reason":"Squashed from wisp gt-s46 (9 issues)"} @@ -1257,6 +1364,7 @@ {"id":"gt-xw7b","title":"Add --fart as easter egg alias for bd mol bond","description":"Add a hidden alias for the bond command:\n\n```bash\nbd mol fart mol-polecat-work --wisp\n# equivalent to:\nbd mol bond mol-polecat-work --wisp\n```\n\n## Context\nThe fart joke: instantiating a proto can produce either:\n- A Mol (solid/substantial output)\n- A Wisp (gas/ephemeral output)\n\n## Implementation\n- Add 'fart' as an alias in the mol subcommand\n- No documentation needed (easter egg)\n- Maybe a fun message: 'Bonding molecule...' or similar\n\nLow priority, just for fun.","status":"open","priority":4,"issue_type":"task","created_at":"2025-12-21T16:33:18.822868-08:00","updated_at":"2025-12-21T17:20:42.83232-08:00"} {"id":"gt-xx5u","title":"Digest: mol-deacon-patrol","description":"Patrol 10: OK","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T20:59:10.084625-08:00","updated_at":"2025-12-24T20:59:10.084625-08:00","closed_at":"2025-12-24T20:59:10.084595-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-xxtl","title":"Implement bd mol bond --ephemeral flag","description":"Add --ephemeral flag to bd mol bond command to support ephemeral molecule bonding.\n\n## Context\nPhase 1.2 of Wisp Molecule Integration (gt-3x0z.2) discovered that this flag doesn't exist.\n\n## Requirements\n\n1. Add --ephemeral flag to mol bond command\n2. When --ephemeral is set:\n - Mark spawned issues with wisp=true\n - Optionally write to separate .beads-ephemeral/ storage (Phase 2)\n\n## Architecture Reference\nSee gastown architecture.md lines 487-491 for the full ephemeral storage design.\n\n## Related\n- gt-3x0z.2: Configure bd for ephemeral molecule bonding (closed - blocked on this)","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-21T16:00:04.924875-08:00","updated_at":"2025-12-21T16:00:04.924875-08:00"} +{"id":"gt-y0t","title":"session stop: --force flag is defined but not used","status":"tombstone","priority":2,"issue_type":"bug","created_at":"2025-12-16T13:55:12.848848-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} {"id":"gt-y2p6","title":"Merge: gt-3x1.5","description":"branch: polecat/Immortan\ntarget: main\nsource_issue: gt-3x1.5\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-19T14:53:53.544887-08:00","updated_at":"2025-12-19T18:26:14.106598-08:00","closed_at":"2025-12-19T17:49:09.215705-08:00"} {"id":"gt-y3y7","title":"Polecat template: move startup announcement into molecule","description":"Template has STARTUP PROTOCOL with 'Announce: beads Polecat furiosa, checking in.' This should be a startup step in the polecat molecule, not prose instruction in CLAUDE.md. The molecule drives behavior, not the template prose.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T16:56:56.302648-08:00","updated_at":"2025-12-23T17:09:08.781666-08:00","closed_at":"2025-12-23T17:09:08.781666-08:00","close_reason":"Not in template - announcement is in gt prime command output (internal/cmd/prime.go)","dependencies":[{"issue_id":"gt-y3y7","depends_on_id":"gt-t9u7","type":"parent-child","created_at":"2025-12-23T16:57:16.855004-08:00","created_by":"daemon"}]} {"id":"gt-y481","title":"Epic: Patrol parity - Witness and Refinery match Deacon sophistication","description":"Bring Witness and Refinery patrols up to Deacon's level of sophistication.\n\n## Deacon has\n1. Defined patrol molecule with clear steps\n2. Wisp-based execution (spawn, run, squash, loop)\n3. Daemon monitoring with auto-nudge on naked state\n4. Handoff bead attachment mechanism\n5. Banners for observability\n6. Context-aware loop-or-exit\n\n## Children\n- gt-h1n5: Witness patrol: Add banners and wisp-based execution\n- gt-qz2l: Refinery patrol: Add banners and wisp-based execution\n- gt-poxd: Create handoff beads for Witness and Refinery roles\n\n## Success criteria\n- Tailing a Witness or Refinery session shows clear banners\n- Patrols spawn as wisps and squash to digests\n- Each role has a handoff bead with attached_molecule\n- Daemon monitors Witness/Refinery nakedness (stretch goal)","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-23T13:19:51.934063-08:00","updated_at":"2025-12-24T23:21:04.53892-08:00","closed_at":"2025-12-24T23:21:04.53892-08:00","close_reason":"All children complete: patrol banners exist, handoff beads created, templates updated"} @@ -1268,6 +1376,7 @@ {"id":"gt-yg6u3","title":"Digest: mol-deacon-patrol","description":"Patrol 7: Quiet","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T07:26:30.255841-08:00","updated_at":"2025-12-25T07:26:30.255841-08:00","closed_at":"2025-12-25T07:26:30.255812-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-yhq23","title":"Digest: mol-deacon-patrol","description":"Patrol 13: All clear","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T00:03:51.430921-08:00","updated_at":"2025-12-25T00:03:51.430921-08:00","closed_at":"2025-12-25T00:03:51.430876-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-yk4r","title":"Digest: mol-deacon-patrol","description":"Patrol 19: Routine","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T22:38:50.175501-08:00","updated_at":"2025-12-24T22:38:50.175501-08:00","closed_at":"2025-12-24T22:38:50.175458-08:00","close_reason":"Squashed from 8 wisps"} +{"id":"gt-yls","title":"Document merge queue architecture","description":"Update docs/architecture.md with:\n\n- Merge Queue section explaining Beads-native approach\n- Engineer role (renamed from Refinery)\n- Session restart protocol\n- gt mq command reference\n- Federation considerations for queue\n\nAlso update any references to .gastown/ → config/.","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-16T23:02:41.533065-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-yls","depends_on_id":"gt-h5n","type":"blocks","created_at":"2025-12-16T23:02:56.043373-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-ynp6","title":"gt context --usage: estimate remaining context via tmux line count","description":"## Summary\n\nImplement `gt context --usage` to estimate remaining context capacity.\n\n## Approach\n\nUse tmux scrollback buffer line count as proxy for token usage:\n- `tmux capture-pane -p | wc -l` gives current line count\n- Heuristics (tunable per model):\n - Opus 4.5: ~1800 lines = warning threshold\n - ~2000+ lines = critical, need handoff\n\n## Output Format\n```\nContext Usage: 1642 lines (~82%)\nStatus: WARNING - consider handoff soon\n```\n\n## Notes\n- Heuristics are model-specific, need config\n- Line count is proxy, not exact token count\n- Good enough for autonomous patrol decisions","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-23T01:19:13.108332-08:00","updated_at":"2025-12-23T01:19:13.108332-08:00"} {"id":"gt-yt6g","title":"Standardize session end: gt handoff for all roles","description":"## Summary\n\nStandardize session ending across all agent roles to use `gt handoff` as the canonical command. This is critical for the beads propulsion cycle - turning agent sessions from pets into cattle.\n\n## Current State (Inconsistent)\n\n| Role | Current Guidance | Command |\n|------|-----------------|---------|\n| Mayor | Manual mail send | `gt mail send mayor/ -s 'HANDOFF:...' -m '...'` |\n| Crew | Manual mail send | `gt mail send \u003crig\u003e/crew/\u003cname\u003e -s 'HANDOFF:...' -m '...'` |\n| Witness | Manual mail send | `gt mail send \u003crig\u003e/witness -s 'HANDOFF:...' -m '...'` |\n| Refinery | Manual mail send | `gt mail send \u003crig\u003e/refinery -s 'HANDOFF:...' -m '...'` |\n| Deacon | Exit on high context | (implicit) |\n| Polecat | `gt done` | `gt done [--exit TYPE]` |\n\n## Target State (Unified)\n\nAll roles use `gt handoff`:\n- `gt handoff` - Hand off current session to fresh instance\n- `gt handoff -s 'context' -m 'details'` - Hand off with custom message\n- For polecats: `gt handoff` internally calls `gt done`\n\n## Changes Required\n\n### 1. Code Changes\n- [ ] Update `gt handoff` to detect polecat role and call `gt done` internally\n- [ ] Consider adding `--exit` flag to `gt handoff` for polecat compatibility\n\n### 2. CLAUDE.md Updates (gastown)\n- [ ] ~/gt/CLAUDE.md (Mayor)\n- [ ] gastown/crew/max/CLAUDE.md\n- [ ] gastown/crew/joe/CLAUDE.md\n- [ ] gastown/witness/CLAUDE.md\n- [ ] gastown/refinery/CLAUDE.md (and rig/)\n- [ ] deacon/CLAUDE.md\n\n### 3. CLAUDE.md Updates (beads)\n- [ ] beads/mayor/rig/CLAUDE.md\n- [ ] beads/crew/dave/CLAUDE.md\n- [ ] beads/crew/zoey/CLAUDE.md\n- [ ] beads/witness/CLAUDE.md\n- [ ] beads/refinery/CLAUDE.md (and rig/)\n\n### 4. Architecture Docs\n- [ ] docs/patrol-system-design.md\n- [ ] gastown/mayor/rig/docs/prompts.md\n- [ ] gastown/mayor/rig/docs/session-management.md\n\n## New Session End Checklist (Universal)\n\n```\n# SESSION CLOSE PROTOCOL\n\n[ ] 1. git status (check uncommitted changes)\n[ ] 2. git add \u003cfiles\u003e (stage changes)\n[ ] 3. git commit -m '...' (commit with issue ID)\n[ ] 4. bd sync (sync beads)\n[ ] 5. git push (push to remote - CRITICAL)\n[ ] 6. gt handoff (hand off to fresh session)\n OR gt handoff -s 'Context' -m 'Details for next session'\n```\n\n## Why This Matters\n\nThe handoff mechanism is what turns agent sessions from **pets** (precious, long-lived) into **cattle** (disposable, replaceable). At any time, any agent can:\n1. Send itself a detailed handoff mail (or sling itself a mol)\n2. System shuts them down and restarts them\n3. Fresh session runs priming and reads mail\n4. Work continues seamlessly\n\nThis enables:\n- Unlimited context through automatic cycling\n- Clean recovery from any state\n- Consistent behavior across all roles\n- Simplified agent instructions","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T12:57:25.246279-08:00","updated_at":"2025-12-23T13:05:12.92201-08:00","closed_at":"2025-12-23T13:05:12.92201-08:00","close_reason":"Standardized session end guidance across all roles to use gt handoff as canonical method"} {"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"} @@ -1292,6 +1401,8 @@ {"id":"gt-zhm5","title":"TODO: Check if issue is child of configured epic in Witness","description":"witness/manager.go:688 has a TODO to filter issues by whether they're children of the configured epic. Currently this filter is skipped.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-21T21:34:29.358103-08:00","updated_at":"2025-12-21T21:55:38.926916-08:00","closed_at":"2025-12-21T21:55:38.926916-08:00","close_reason":"Implemented epic child filtering via isChildOfEpic() which checks if issue blocks the configured epic"} {"id":"gt-zhpa","title":"VC Pattern Integration: Bring validated ideas to Gas Town","description":"Analysis of ~/src/vc identified 6 validated patterns from the 2nd orchestrator attempt that map cleanly to Gas Town primitives. VC achieved 254 issues closed, 90.9% gate pass rate, and 24 successful missions.\n\nKey insight: VC built ~4300 lines of Go for features that become ~65 lines of YAML + CLI flags in Gas Town's architecture.\n\nChild tasks track each pattern to integrate.","status":"open","priority":2,"issue_type":"epic","created_at":"2025-12-20T20:29:30.994181-08:00","updated_at":"2025-12-20T20:29:30.994181-08:00"} {"id":"gt-zivp","title":"mol-outpost-assign: Intelligent work routing to outposts","description":"The federation design shows outposts.yaml with a static policy section. Simple preference ordering is fine as config, but intelligent work routing should be a molecule.\n\nCurrent static approach:\n```yaml\npolicy:\n default_preference: [local, gce-burst, cloudrun-burst]\n```\n\nCases requiring cognition:\n- \"This is a long-running research task, route to VM not CloudRun\"\n- \"This touches sensitive code, keep local\"\n- \"These 5 issues are related, batch them to same outpost\"\n- \"CloudRun cost is high today, prefer local even if slower\"\n\n## Molecule: outpost-assign\nIntelligent work-to-outpost routing.\n\n## Step: classify-work\nAnalyze the issue/work item:\n- Expected duration (quick fix vs multi-hour)\n- Resource requirements\n- Sensitivity/security tier\n- Related work (same epic?)\n\n## Step: check-capacity\nQuery outpost status:\n- Current load on each\n- Cost accrued today\n- Health status\n\n## Step: select-outpost\nChoose optimal outpost based on:\n- Work classification\n- Capacity/cost\n- Policy constraints\nNeeds: classify-work, check-capacity\n\n## Step: emit-assignment\nRecord decision in beads for audit.\nNeeds: select-outpost\n\n## Notes\n- This molecule is invoked by Mayor/Witness when spawning\n- Simple cases can short-circuit to static policy\n- Full analysis only for ambiguous cases","status":"open","priority":3,"issue_type":"feature","created_at":"2025-12-20T03:26:17.964834-08:00","updated_at":"2025-12-20T03:26:17.964834-08:00"} +{"id":"gt-zko","title":"gt rig info: Show detailed rig information","description":"Add 'gt rig info \u003crig\u003e' command to show detailed rig status.\n\nShould show:\n- Rig path and git URL\n- Active polecats with status\n- Refinery status\n- Witness status\n- Recent activity\n- Beads summary (open issues count)","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-17T21:47:17.879255-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-zko","depends_on_id":"gt-hw6","type":"blocks","created_at":"2025-12-17T22:22:47.502099-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-zly","title":"Swarm learning: Beads database locality gap","description":"## PGT Bug (GGT Design Already Correct)\n\nMayor created issues in `~/ai/mayor/rigs/beads/.beads/` but polecats use `~/ai/beads/.beads/`. Different databases = polecats can't see Mayor's beads.\n\n**GGT Fix**: architecture.md already specifies:\n- All agents use BEADS_DIR pointing to rig-level `.beads/`\n- Lines 116-143: Beads Configuration for Multi-Agent\n- Lines 573-586: Rig-Level Beads via BEADS_DIR\n\nThis is a PGT implementation gap, not a design issue. GGT spawn must set BEADS_DIR correctly.","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-16T01:21:45.37072-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-zn9m","title":"142 instances of error suppression with _ = pattern","description":"Code has 142 instances of '_ = ' error suppression in non-test code.\nExamples:\n- internal/polecat/manager.go: _ = pool.Load() - ignores state loading\n- internal/daemon/notification.go: _ = os.WriteFile() - ignores file write\n- internal/mail/router.go: _ = r.notifyRecipient() - notification ignored\n\nThese create silent failures and hard-to-debug issues.\n\nOptions:\n1. Document intentional suppressions with comments\n2. Handle errors properly where appropriate\n3. At minimum, log suppressed errors at debug level","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-24T12:50:59.241303-08:00","updated_at":"2025-12-24T12:50:59.241303-08:00","dependencies":[{"issue_id":"gt-zn9m","depends_on_id":"gt-jo9n","type":"blocks","created_at":"2025-12-24T12:52:07.478225-08:00","created_by":"daemon"}]} {"id":"gt-zniu","title":"gt park command for parking molecules on external deps","description":"Add `gt park` command for when polecat hits external dependency:\n\n```bash\ngt park --step=gt-mol.3 --waiting=\"beads:mol-run-assignee\"\n```\n\nThis command:\n1. Adds blocked_by: external:beads:mol-run-assignee to the step\n2. Clears assignee on the step\n3. Clears assignee on molecule root\n4. Sends handoff mail to self with context\n5. Shuts down polecat session\n\nThe molecule enters \"parked\" state (derived: in_progress + no assignee + blocked step).\n\nPart of cross-project dependency system.\nSee: docs/cross-project-deps.md\n\nDepends on Beads: bd-om4a (external: blocked_by support)","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-21T22:39:01.401567-08:00","updated_at":"2025-12-21T22:39:01.401567-08:00"} {"id":"gt-zq7f","title":"Test Patrol for Bonding","description":"Parent issue for mol bond CLI test","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T21:24:17.909812-08:00","updated_at":"2025-12-25T01:33:00.353028-08:00","closed_at":"2025-12-25T01:33:00.353028-08:00","close_reason":"Test pollution cleanup"}