bd sync: 2025-12-24 20:56:14

This commit is contained in:
Steve Yegge
2025-12-24 20:56:14 -08:00
parent 32cac078e5
commit afe67fafbb

View File

@@ -17,11 +17,9 @@
{"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":"closed","priority":1,"issue_type":"task","created_at":"2025-12-15T23:18:03.177633-08:00","updated_at":"2025-12-15T23:22:51.477786-08:00","closed_at":"2025-12-15T23:22:51.477786-08:00"}
{"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":"closed","priority":1,"issue_type":"task","created_at":"2025-12-17T14:10:27.611612-08:00","updated_at":"2025-12-17T14:22:00.715979-08:00","closed_at":"2025-12-17T14:22:00.715979-08:00"}
{"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"}],"wisp":true}
{"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"}
{"id":"gt-0yn0","title":"test pin fix 2","notes":"Released: displaced by new sling","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T12:15:48.827437-08:00","updated_at":"2025-12-23T16:06:47.308299-08:00","closed_at":"2025-12-23T16:06:47.308299-08:00","close_reason":"test issue - cleaning up"}
{"id":"gt-14hd","title":"Work on ga-xxp: Define mol-polecat-work standard molecule...","description":"Work on ga-xxp: Define mol-polecat-work standard molecule. See bd show ga-xxp for full details.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-19T21:49:14.070072-08:00","updated_at":"2025-12-19T22:01:24.336471-08:00","closed_at":"2025-12-19T22:01:24.336471-08:00"}
{"id":"gt-16rv","title":"implement","description":"Implement the solution for gt-test. Follow codebase conventions.\nFile discovered work as new issues with bd create.\n\nMake regular commits with clear messages.\nKeep changes focused on the assigned issue.\n\nDepends: load-context","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T22:04:43.420903-08:00","updated_at":"2025-12-21T22:05:10.501473-08:00","closed_at":"2025-12-21T22:05:10.501473-08:00","close_reason":"test cleanup","dependencies":[{"issue_id":"gt-16rv","depends_on_id":"gt-jvr3","type":"parent-child","created_at":"2025-12-21T22:04:43.422515-08:00","created_by":"stevey"},{"issue_id":"gt-16rv","depends_on_id":"gt-g844","type":"blocks","created_at":"2025-12-21T22:04:43.423201-08:00","created_by":"stevey"}],"wisp":true}
{"id":"gt-17r","title":"Doctor check: Zombie session cleanup","description":"Detect and clean up zombie tmux sessions via gt doctor.\n\n## Problem\n\nZombie sessions occur when:\n- Agent crashes without cleanup\n- gt kill fails mid-operation\n- System restart leaves orphan sessions\n- Session naming collision\n\n## Checks\n\n### ZombieSessionCheck\n- List all tmux sessions matching gt-* pattern\n- Cross-reference with known polecats\n- Flag sessions with no corresponding polecat state\n- Flag sessions for removed polecats\n- Check session age vs polecat creation time\n\n### Detection Criteria\n- Session exists but polecat directory doesn't\n- Session name doesn't match any registered polecat\n- Polecat state=idle but session running\n- Multiple sessions for same polecat\n\n## Output\n\n```\n[WARN] Zombie tmux sessions detected:\n - gt-wyvern-OldPolecat (polecat removed)\n - gt-beads-Unknown (no matching polecat)\n - gt-wyvern-Toast (duplicate session)\n\n Run 'gt doctor --fix' to clean up\n```\n\n## Auto-Fix (--fix flag)\n\n- Kill orphan tmux sessions\n- Update polecat state to match reality\n- Log all cleanup actions\n\n## Safety\n\n- Never kill sessions where polecat state=working\n- Prompt before killing if --fix used without --force\n- Create audit log of killed sessions","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-15T23:18:01.446702-08:00","updated_at":"2025-12-23T14:27:07.858717-08:00","dependencies":[{"issue_id":"gt-17r","depends_on_id":"gt-f9x.4","type":"blocks","created_at":"2025-12-15T23:19:05.66301-08:00","created_by":"daemon"},{"issue_id":"gt-17r","depends_on_id":"gt-7ik","type":"blocks","created_at":"2025-12-17T15:44:41.945064-08:00","created_by":"daemon"}]}
{"id":"gt-17zr","title":"gt refinery start: doesn't actually start a session","description":"## Problem\n\n`gt refinery start gastown` reports success but doesn't start a tmux session.\n\n## Evidence\n\n```\n$ gt refinery start gastown\nStarting refinery for gastown...\n✓ Refinery started for gastown\n\n$ tmux list-sessions | grep refinery\n(nothing)\n\n$ gt refinery status gastown\nState: ○ stopped\n```\n\n## Expected\n\nShould start a tmux session (e.g., gt-gastown-refinery) with Claude processing the merge queue.\n\n## Related\n\n- gt-kcee: Witness commands also need implementation\n- The refinery 'start' may just be updating state.json without spawning a session","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-18T21:58:57.188389-08:00","updated_at":"2025-12-19T01:33:49.858934-08:00","closed_at":"2025-12-19T01:33:49.858934-08:00"}
{"id":"gt-189d","title":"Digest: mol-deacon-patrol @ 2025-12-24 19:27","description":"Patrol 14","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T19:27:18.422413-08:00","updated_at":"2025-12-24T19:27:18.422413-08:00","closed_at":"2025-12-24T19:27:18.422339-08:00","close_reason":"Squashed from wisp gt-ubu (9 issues)"}
@@ -59,7 +57,7 @@
{"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-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":"open","priority":2,"issue_type":"epic","created_at":"2025-12-22T23:41:25.342615-08:00","updated_at":"2025-12-22T23:43:25.95034-08:00","labels":["template"]}
{"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":"open","priority":2,"issue_type":"task","created_at":"2025-12-22T23:43:41.517464-08:00","updated_at":"2025-12-22T23:43:41.517464-08:00"}
{"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":"open","priority":2,"issue_type":"task","created_at":"2025-12-22T23:43:41.517464-08:00","updated_at":"2025-12-22T23:43:41.517464-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"}]}
{"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":"open","priority":2,"issue_type":"task","created_at":"2025-12-22T23:43:42.77616-08:00","updated_at":"2025-12-22T23:43:42.77616-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"}]}
{"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":"open","priority":2,"issue_type":"task","created_at":"2025-12-22T23:43:44.676322-08:00","updated_at":"2025-12-22T23:43:44.676322-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"}]}
{"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"}
@@ -69,7 +67,6 @@
{"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":"closed","priority":3,"issue_type":"bug","created_at":"2025-12-16T13:55:11.326407-08:00","updated_at":"2025-12-16T13:56:39.089057-08:00","closed_at":"2025-12-16T13:56:39.089057-08:00"}
{"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":"closed","priority":1,"issue_type":"task","created_at":"2025-12-17T21:47:16.175246-08:00","updated_at":"2025-12-17T22:31:12.816428-08:00","closed_at":"2025-12-17T22:31:12.816428-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"}]}
{"id":"gt-2x79","title":"mol-deacon-patrol","description":"[RESURRECTED] This issue was deleted but recreated as a tombstone to preserve hierarchical structure.\n\nOriginal description:\nDeacon patrol molecule template. Label: template","status":"open","priority":4,"issue_type":"epic","created_at":"2025-12-23T14:27:33.98823-08:00","updated_at":"2025-12-23T14:27:33.98823-08:00","wisp":true}
{"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."}
{"id":"gt-2z6s","title":"bd sync: Handle mol-* prefix for protos gracefully","description":"When bd sync imports protos (mol-*), it warns about prefix mismatch. The allowed_prefixes config doesn't seem to apply to imports.\n\nCurrent behavior: bd sync fails import step with prefix mismatch error\nExpected: mol-* should be recognized as valid proto prefix, or allowed_prefixes should be respected\n\nWorkaround: The export/push still succeeds, only import fails.\n\nRelated: bd-47qx","status":"closed","priority":3,"issue_type":"bug","created_at":"2025-12-24T14:07:34.525817-08:00","updated_at":"2025-12-24T14:28:39.120965-08:00","closed_at":"2025-12-24T14:28:39.120965-08:00","close_reason":"Fixed in beads commit 25402184 - allowed_prefixes config now respected during import"}
@@ -119,14 +116,12 @@
{"id":"gt-3zg","title":"Verify architecture.md shows correct harness and rig structure","description":"Review architecture.md diagrams:\n- Verify town-level structure shows harness correctly\n- Confirm rig-level mayor/rig/ is shown (it appears to be there at line 197)\n- Check mermaid diagrams match ASCII diagrams\n- Update if any inconsistencies found\n- Cross-reference with new harness.md docs","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-17T17:15:45.10268-08:00","updated_at":"2025-12-19T12:06:49.800234-08:00","closed_at":"2025-12-19T12:06:49.800234-08:00","dependencies":[{"issue_id":"gt-3zg","depends_on_id":"gt-cr9","type":"blocks","created_at":"2025-12-17T17:15:52.090317-08:00","created_by":"daemon"}]}
{"id":"gt-3zw","title":"Policy beads: config in data plane","description":"Use sentinel/policy beads for configuration instead of external config. Examples: daemon notifications on/off, heartbeat intervals. Config lives in the bead graph, can be toggled by closing/opening policy beads.","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-18T18:18:32.857389-08:00","updated_at":"2025-12-18T18:18:32.857389-08:00"}
{"id":"gt-40k6","title":"Merge: gt-qz2l","description":"branch: polecat/dementus\ntarget: main\nsource_issue: gt-qz2l\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-23T19:39:31.550068-08:00","updated_at":"2025-12-24T00:18:03.056462-08:00","closed_at":"2025-12-23T23:30:30.834785-08:00"}
{"id":"gt-415l","title":"request-shutdown","description":"Send shutdown request to Witness.\nWait for termination.\n\nThe polecat is now ready to be cleaned up.\nDo not exit directly - wait for Witness to kill the session.\n\nDepends: generate-summary","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T21:56:18.535199-08:00","updated_at":"2025-12-21T21:56:27.511558-08:00","closed_at":"2025-12-21T21:56:27.511558-08:00","close_reason":"test cleanup","dependencies":[{"issue_id":"gt-415l","depends_on_id":"gt-zjqs","type":"parent-child","created_at":"2025-12-21T21:56:18.538385-08:00","created_by":"stevey"}],"wisp":true}
{"id":"gt-43qg","title":"Test: release command verification","notes":"Released: testing release command","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-19T16:15:30.845537-08:00","updated_at":"2025-12-19T16:15:55.084052-08:00","closed_at":"2025-12-19T16:15:55.084052-08:00"}
{"id":"gt-43tw","title":"Digest: mol-deacon-patrol","description":"Patrol cycle 1: inbox clear, 8 in-progress issues, sessions healthy, gc not implemented","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-23T13:14:27.653577-08:00","updated_at":"2025-12-23T13:14:27.653577-08:00","closed_at":"2025-12-23T13:14:27.653542-08:00","close_reason":"Squashed from 4 wisps"}
{"id":"gt-44wh","title":"Polecats must not create GitHub PRs","description":"Polecats should never use 'gh pr create' or create GitHub pull requests.\n\n## Correct Workflow\n1. Polecat works on polecat/\u003cname\u003e branch\n2. Commits and pushes to origin\n3. Creates beads MR issue (type: merge-request)\n4. Refinery processes the MR and merges to main\n\n## Wrong Workflow\n- Using gh pr create\n- Creating GitHub pull requests directly\n\n## Why\n- Refinery is our merge queue processor\n- GitHub PRs bypass our workflow\n- Beads MRs are the coordination mechanism","status":"in_progress","priority":1,"issue_type":"bug","created_at":"2025-12-21T16:40:33.204449-08:00","updated_at":"2025-12-21T19:54:00.481393-08:00"}
{"id":"gt-47tq","title":"gt spawn should use bd mol run for molecule attachment","description":"Simplify Gas Town to use bd mol run for work tracking.\n\n## Key Insight\nTwo distinct mechanisms, not duplicative:\n\n| Mechanism | Purpose | Query |\n|-----------|---------|-------|\n| **Pinned molecule** (bd mol run) | What am I working on? | `bd list --pinned --assignee=me` |\n| **Handoff mail** | Context notes for restart | `gt mail read` (self-addressed) |\n\nThe handoff is just **mail to yourself** - optional context notes.\nThe molecule is **the actual work** - required state.\n\n## Current State (Overengineered)\nGas Town has custom attachment system:\n- Permanent \"Foo Handoff\" pinned beads per identity\n- AttachMolecule(pinnedBeadID, moleculeID) \n- Attachment fields parsed from description\n- Separate from beads pinning\n\n## New Model (Simplified)\nUse bd mol run directly:\n\n```bash\n# Spawn polecat with molecule\nbd mol run mol-polecat-work --var issue=gt-xyz\n# This: spawns, assigns to caller, pins root, sets in_progress\n```\n\nQuery current work:\n```bash\nbd list --pinned --assignee=gastown/furiosa --status=in_progress\n```\n\nHandoff context (when needed):\n```bash\ngt mail send gastown/furiosa -s \"Context notes\" -m \"Was on step 4...\"\n```\n\n## Changes Required\n\n### Remove from Gas Town\n- AttachMolecule() / DetachMolecule()\n- AttachmentFields struct and parsing\n- GetAttachment() / SetAttachmentFields()\n- Permanent pinned handoff beads per identity\n- Daemon attachment detection (checkDeaconAttachment)\n\n### Update gt spawn\n```go\n// Old: custom molecule instantiation + attachment\n// New: just call bd mol run\ncmd := exec.Command(\"bd\", \"mol\", \"run\", protoID, \"--var\", \"issue=\"+issueID)\n```\n\n### Update gt prime / agent context\n```go\n// Old: find handoff bead, parse attachment\n// New: query for pinned molecule\ncmd := exec.Command(\"bd\", \"list\", \"--pinned\", \"--assignee=\"+identity, \"--status=in_progress\", \"--json\")\n```\n\n### Update documentation\n- Remove handoff bead attachment docs\n- Clarify: handoff = mail, molecule = work\n- Update CLAUDE.md templates\n\n## Benefits\n1. One system for work tracking (beads)\n2. Simpler Gas Town code\n3. bd mol squash works naturally\n4. Handoff is just mail (already works)\n\n## Related\n- gt-3x0z: Wisp Molecule Integration\n- gt-rana: Patrol System\n- gt-lek6: gt rig reset --stale\n- gt-ay1r: gt molecule current","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-21T21:34:21.808261-08:00","updated_at":"2025-12-21T21:59:54.041276-08:00","closed_at":"2025-12-21T21:59:54.041276-08:00","close_reason":"Simplified spawn.go to use bd mol run"}
{"id":"gt-480b","title":"Improve test coverage in low-coverage packages","description":"Several packages have low test coverage:\n- internal/cmd: 6.8%\n- internal/mail: 3.6%\n- internal/daemon: 12.1%\n- internal/doctor: 14.5%\n- internal/refinery: 20.6%\n- internal/session: 27.8%\n- internal/git: 28.8%\n\nPriority should be given to mail, cmd, and daemon packages which handle critical functionality.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T21:34:47.807929-08:00","updated_at":"2025-12-21T22:19:59.416507-08:00","closed_at":"2025-12-21T22:19:59.416507-08:00","close_reason":"Deferred to post-launch. Test coverage improvement is ongoing work, not blocking for launch. Current tests cover critical paths; additional coverage can be added incrementally."}
{"id":"gt-48bs","title":"gt rig reset: clear stale mail on reset/land","description":"## Problem\n\nWhen resetting or landing a rig/town, stale mail messages can confuse agents on startup. Old handoff messages, daemon notifications, and inter-agent mail should be cleaned up as part of reset.\n\n## Current State\n\n- `gt rig reset` exists but doesn't clear mail\n- Stale messages accumulate (e.g., daemon SHUTDOWN messages)\n- Agents may read outdated context on startup\n\n## Proposed Behavior\n\n`gt rig reset` and `gt town reset` should:\n1. Close all open messages (`--type=message`) in the relevant beads\n2. Optionally preserve pinned handoff beads (clear content, keep bead)\n3. Log what was cleaned up\n\n```bash\ngt rig reset gastown # Clears gastown mail\ngt rig reset gastown --mail # Only clear mail, keep other state\ngt town reset # Clears all town-level mail\ngt town reset --all # Clears mail in all rigs too\n```\n\n## Implementation\n\n1. Query `bd list --type=message --status=open`\n2. Close each with reason 'Cleared during reset'\n3. For pinned handoffs: `bd update \u003cid\u003e --description=''` instead of close","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-19T11:42:17.769674-08:00","updated_at":"2025-12-21T11:27:49.532203-08:00","closed_at":"2025-12-21T11:27:49.532203-08:00","close_reason":"Added --mail flag to gt rig reset"}
{"id":"gt-4cfp","title":"plugin-run","description":"Execute plugins from ~/gt/plugins/. Check gates, run eligible plugins.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T13:03:21.516836-08:00","updated_at":"2025-12-24T19:17:11.389552-08:00","closed_at":"2025-12-24T19:17:11.389552-08:00","close_reason":"Incomplete patrol, creating fresh","dependencies":[{"issue_id":"gt-4cfp","depends_on_id":"gt-7tmh","type":"parent-child","created_at":"2025-12-23T13:03:21.525603-08:00","created_by":"stevey"}],"wisp":true}
{"id":"gt-4eim","title":"gt nudge should accept flexible session identifiers","description":"Currently `gt nudge` requires the exact tmux session name (e.g., `gt-gastown-furiosa`).\n\nIt should also accept:\n- `gastown/furiosa` (rig/polecat format)\n- `furiosa` (polecat name, infer rig from cwd or require if ambiguous)\n\nThe session list command shows `gastown/furiosa` format, but nudge rejects it:\n```\ngt session list → shows 'gastown/furiosa'\ngt nudge gastown/furiosa 'msg' → 'session not found'\ngt nudge gt-gastown-furiosa 'msg' → works\n```\n\nShould normalize all these formats to the tmux session name internally.","status":"open","priority":2,"issue_type":"bug","created_at":"2025-12-21T15:36:45.013475-08:00","updated_at":"2025-12-23T14:30:11.942309-08:00"}
{"id":"gt-4ev4","title":"Implement gt sling command","description":"The unified work dispatch command.\n\n```bash\ngt sling \u003cthing\u003e \u003ctarget\u003e [options]\n```\n\nImplements spawn + assign + pin in one operation. See sling-design.md.\n\nAcceptance:\n- [ ] Parse thing (proto name, issue ID, epic ID)\n- [ ] Parse target (agent address) \n- [ ] Spawn molecule if proto\n- [ ] Assign to target agent\n- [ ] Pin to agent's hook (pinned bead)\n- [ ] Support --wisp flag for ephemeral\n- [ ] Support --molecule flag for issue+workflow\n- [ ] Error if hook already occupied (unless --force)","status":"closed","priority":1,"issue_type":"task","assignee":"gastown/furiosa","created_at":"2025-12-22T03:17:27.273013-08:00","updated_at":"2025-12-22T12:33:43.076291-08:00","closed_at":"2025-12-22T12:33:43.076291-08:00","close_reason":"Closed"}
{"id":"gt-4fdi","title":"Digest: mol-deacon-patrol @ 2025-12-24 19:48","description":"Patrol 20: All healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T19:48:32.167102-08:00","updated_at":"2025-12-24T19:48:32.167102-08:00","closed_at":"2025-12-24T19:48:32.167045-08:00","close_reason":"Squashed from wisp gt-8uy (9 issues)"}
@@ -136,6 +131,7 @@
{"id":"gt-4nn.2","title":"Molecule instantiation: create child beads from template","description":"When instantiating a molecule on a work bead:\n\n## Transaction Flow\n\n1. Parse molecule's `## Step:` sections from description\n2. Begin SQLite transaction\n3. For each step, create child issue:\n - ID: `{parent-id}.{step-ref}` or generated\n - Title: step title (from header or first line)\n - Description: step prose instructions\n - Type: task\n - Priority: inherit from parent\n4. Add `instantiated-from` edge from each step to molecule:\n ```sql\n INSERT INTO dependencies (issue_id, depends_on_id, type, metadata)\n VALUES (step_id, mol_id, 'instantiated-from', '{\"step\": \"implement\"}');\n ```\n5. Wire inter-step dependencies from `Needs:` lines\n6. Commit transaction (atomic - all or nothing)\n\n## Parsing Conventions\n\n```markdown\n## Step: \u003cref\u003e\n\u003cprose instructions\u003e\nNeeds: \u003cstep\u003e, \u003cstep\u003e # optional\nTier: haiku|sonnet|opus # optional hint\n```\n\n## Parameterization\n\nSteps can have `{{variable}}` placeholders:\n```markdown\n## Step: implement\nImplement {{feature_name}} in {{target_file}}.\n```\n\nContext map provided at instantiation time.\n\n## API\n\n```go\nfunc (s *Store) InstantiateMolecule(mol *Issue, parent *Issue, ctx map[string]string) ([]*Issue, error)\nfunc ParseMoleculeSteps(description string) ([]MoleculeStep, error)\n```\n\nImplementation lives in `internal/beads/molecule.go`.","status":"closed","priority":0,"issue_type":"task","created_at":"2025-12-18T18:06:52.071066-08:00","updated_at":"2025-12-19T01:57:17.028198-08:00","closed_at":"2025-12-19T01:57:17.028198-08:00","dependencies":[{"issue_id":"gt-4nn.2","depends_on_id":"gt-4nn","type":"parent-child","created_at":"2025-12-18T18:06:52.072554-08:00","created_by":"daemon"},{"issue_id":"gt-4nn.2","depends_on_id":"gt-4nn.1","type":"blocks","created_at":"2025-12-18T18:07:02.949242-08:00","created_by":"daemon"}]}
{"id":"gt-4nn.3","title":"Molecule CLI: bd molecule commands","description":"Add molecule commands to bd:\n\n## Commands\n\n```bash\nbd molecule list # List molecules (type: molecule)\nbd molecule show \u003cid\u003e # Show molecule with parsed steps\nbd molecule parse \u003cid\u003e # Validate and show parsed structure \nbd molecule instantiate \u003cmol-id\u003e --parent=\u003cissue-id\u003e # Create steps\nbd molecule instances \u003cmol-id\u003e # Show all instantiations\n```\n\n## gt spawn integration\n\n```bash\ngt spawn --issue \u003cid\u003e --molecule \u003cmol-id\u003e\n```\n\nThis should:\n1. Call `bd molecule instantiate` (creates child beads atomically)\n2. Spawn polecat on first ready step\n3. Polecat grinds through via `bd ready`\n\n## Output Examples\n\n```\n$ bd molecule show mol-abc\n\nmol-abc: Engineer in a Box\nType: molecule\n\nSteps (5):\n design → (ready first)\n implement → Needs: design\n review → Needs: implement\n test → Needs: implement \n submit → Needs: review, test\n \nInstances: 3\n```\n\n```\n$ bd molecule instances mol-abc\n\nParent Status Created\ngt-xyz done 2025-12-15\ngt-abc active 2025-12-17 (3/5 complete)\ngt-def pending 2025-12-18\n```","status":"closed","priority":0,"issue_type":"task","created_at":"2025-12-18T18:06:53.919884-08:00","updated_at":"2025-12-19T12:00:37.165927-08:00","closed_at":"2025-12-19T12:00:37.165927-08:00","dependencies":[{"issue_id":"gt-4nn.3","depends_on_id":"gt-4nn","type":"parent-child","created_at":"2025-12-18T18:06:53.921621-08:00","created_by":"daemon"},{"issue_id":"gt-4nn.3","depends_on_id":"gt-4nn.2","type":"blocks","created_at":"2025-12-18T18:07:03.048941-08:00","created_by":"daemon"}]}
{"id":"gt-4nn.4","title":"Built-in molecules: engineer-in-box, quick-fix, research","description":"Create built-in molecules as Beads issues:\n\n## engineer-in-box\n\n```markdown\nid: mol-engineer-in-box\ntype: molecule\ntitle: Engineer in a Box\n\nFull workflow from design to merge.\n\n## Step: design\nThink carefully about architecture. Consider:\n- Existing patterns in the codebase\n- Trade-offs between approaches \n- Testability and maintainability\n\nWrite a brief design summary before proceeding.\n\n## Step: implement\nWrite the code. Follow codebase conventions.\nNeeds: design\n\n## Step: review\nSelf-review the changes. Look for:\n- Bugs and edge cases\n- Style issues\n- Missing error handling\nNeeds: implement\n\n## Step: test\nWrite and run tests. Cover happy path and edge cases.\nFix any failures before proceeding.\nNeeds: implement\n\n## Step: submit\nSubmit for merge via refinery.\nNeeds: review, test\n```\n\n## quick-fix\n\n```markdown\nid: mol-quick-fix\ntype: molecule \ntitle: Quick Fix\n\nFast path for small changes.\n\n## Step: implement\nMake the fix. Keep it focused.\n\n## Step: test\nRun relevant tests. Fix any regressions.\nNeeds: implement\n\n## Step: submit\nSubmit for merge.\nNeeds: test\n```\n\n## research\n\n```markdown\nid: mol-research\ntype: molecule\ntitle: Research\n\nInvestigation workflow.\n\n## Step: investigate\nExplore the question. Search code, read docs, \nunderstand context. Take notes.\n\n## Step: document\nWrite up findings. Include:\n- What you learned\n- Recommendations\n- Open questions\nNeeds: investigate\n```\n\n## Storage\n\nBuilt-in molecules live in `\u003ctown\u003e/.beads/` as regular issues.\nCreated during `gt install` or `bd init`.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-18T18:07:04.574565-08:00","updated_at":"2025-12-19T12:02:19.332406-08:00","closed_at":"2025-12-19T12:02:19.332406-08:00","dependencies":[{"issue_id":"gt-4nn.4","depends_on_id":"gt-4nn","type":"parent-child","created_at":"2025-12-18T18:07:04.576587-08:00","created_by":"daemon"}]}
{"id":"gt-4put","title":"execute-actions","description":"Send nudges, process shutdowns, escalate as decided.\n\nNeeds: decide-actions","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T16:18:21.59918-08:00","updated_at":"2025-12-23T16:18:21.59918-08:00","dependencies":[{"issue_id":"gt-4put","depends_on_id":"gt-qp2w","type":"parent-child","created_at":"2025-12-23T16:18:21.606851-08:00","created_by":"stevey"}]}
{"id":"gt-4qey","title":"gt mail: Cross-level routing is broken","description":"When Mayor sends mail to rig worker, message lands in wrong beads database. Sender's beads vs recipient's.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-20T17:57:35.617292-08:00","updated_at":"2025-12-20T18:35:53.30276-08:00","closed_at":"2025-12-20T18:35:53.30276-08:00"}
{"id":"gt-4u5z","title":"Refinery as Worktree: Local MR Integration","description":"Move refinery from separate clone to git worktree. Polecats stop pushing to origin - refinery sees their branches locally. MRs become wisps (ephemeral). Only main gets pushed after merge.\n\n## Goals\n- Origin stays clean (only main + beads-sync branches)\n- No orphaned polecat branches ever\n- Simpler mental model for MR coordination\n- Faster integration (no network for local MR ops)\n\n## Trade-offs\n- Machine crash = redo pending work (acceptable, beads track state)\n- Future federation needs different approach (bundles or integration branch)\n\n## Components Affected\n- Rig initialization (refinery setup)\n- Spawn/polecat workflow (remove origin push)\n- Refinery manager (local branch access)\n- Documentation (architecture, workflows)\n- Molecule templates (remove push instructions)","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-12-23T20:24:56.517669-08:00","updated_at":"2025-12-23T21:28:22.512455-08:00","closed_at":"2025-12-23T21:28:22.512455-08:00","close_reason":"Complete: refinery as worktree, local branches, wisp MRs"}
{"id":"gt-4u5z.1","title":"Update rig init to create refinery as worktree","description":"Modify rig initialization to create refinery as a git worktree instead of a separate clone.\n\n## Changes\n- internal/rig/init.go or similar - change refinery setup\n- Create worktree at \u003crig\u003e/refinery/ with branch 'refinery'\n- Remove clone logic for refinery\n- Update any path assumptions\n\n## Considerations\n- Refinery worktree should track main (or its own branch?)\n- May need to handle existing rigs (migration path)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T20:25:25.927013-08:00","updated_at":"2025-12-23T20:31:07.100875-08:00","closed_at":"2025-12-23T20:31:07.100875-08:00","close_reason":"Rig init now creates refinery as worktree of mayor clone","dependencies":[{"issue_id":"gt-4u5z.1","depends_on_id":"gt-4u5z","type":"parent-child","created_at":"2025-12-23T20:25:25.92745-08:00","created_by":"daemon"}]}
@@ -218,7 +214,6 @@
{"id":"gt-71i","title":"Update architecture.md: Engineer role and Beads merge queue","description":"Update docs/architecture.md with recent design decisions:\n\n1. Agent table: Change \"Refinery\" role to \"Engineer\"\n - Refinery = place/module/directory\n - Engineer = role (agent that works in the Refinery)\n\n2. Merge Queue section: Document Beads-native model\n - MRs are beads issues with --type=merge-request\n - gt mq commands (submit, list, next, process, reorder)\n - Ordering via depends-on links\n\n3. CLI section: Add gt mq commands\n\n4. Key Design Decisions: Add decisions for:\n - #15: Merge Queue in Beads\n - #16: Engineer role (distinct from Refinery place)\n - #17: Session restart protocol for Engineer","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-16T23:12:03.616159-08:00","updated_at":"2025-12-16T23:12:03.616159-08:00","dependencies":[{"issue_id":"gt-71i","depends_on_id":"gt-h5n","type":"blocks","created_at":"2025-12-16T23:12:14.92163-08:00","created_by":"daemon"}]}
{"id":"gt-72so","title":"gt mq list: doesn't show submitted MRs","description":"After submitting MRs with gt mq submit, gt mq list gastown shows empty queue.\n\n## Reproduction\n1. gt mq submit --issue gt-h5n.5 --branch polecat/Scabrous\n2. gt mq list gastown → (empty)\n3. bd list --type=merge-request → shows the MR\n\n## Expected\ngt mq list should show submitted MRs\n\n## MR example\ngt-ts4u has rig: gastown in description, type=merge-request, status=open","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-19T14:54:26.731813-08:00","updated_at":"2025-12-19T17:22:52.552662-08:00","closed_at":"2025-12-19T16:19:53.82455-08:00"}
{"id":"gt-74a7","title":"Wire GT_ACCOUNT env var into spawn/attach","description":"When spawning Claude Code (gt spawn, gt crew attach), check GT_ACCOUNT env var. If set, look up account in config and set CLAUDE_CONFIG_DIR accordingly.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T03:24:22.86335-08:00","updated_at":"2025-12-23T04:04:18.382571-08:00","closed_at":"2025-12-23T04:04:18.382571-08:00","close_reason":"Implemented GT_ACCOUNT env var support with priority resolution","dependencies":[{"issue_id":"gt-74a7","depends_on_id":"gt-58tu","type":"blocks","created_at":"2025-12-23T03:24:34.897966-08:00","created_by":"daemon"}]}
{"id":"gt-751s","title":"mol-witness-patrol","description":"Per-rig worker monitor patrol loop.\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\nThis molecule uses wisp storage (.beads-wisp/) for ephemeral patrol state.\nPersistent state (nudge counts, handoffs) is stored in a witness handoff bead.","status":"closed","priority":4,"issue_type":"epic","assignee":"gastown/witness","created_at":"2025-12-23T01:41:54.504354-08:00","updated_at":"2025-12-23T04:39:30.10448-08:00","closed_at":"2025-12-23T04:39:30.10448-08:00","close_reason":"Superseded by Christmas Ornament pattern (gt-tnow, gt-qflq). Older flat patrol design replaced by dynamic bonding architecture.","wisp":true}
{"id":"gt-7918","title":"Patrols: Cyclic molecules for autonomous maintenance","description":"## Vision\n\nPatrols are **cyclic molecules** - workflow loops that give Gas Town its autonomous nervous system. While regular molecules are DAGs that terminate, patrols loop forever, performing maintenance tasks at varying cadences.\n\nThis is the \"steam engine\" of Gas Town: converting episodic Claude sessions into continuous autonomous operation.\n\n## Core Concepts\n\n### 1. Cyclic Molecules\n\nRegular molecule: A -\u003e B -\u003e C -\u003e done\nPatrol molecule: A -\u003e B -\u003e C --+\n ^ |\n +-------------+\n\nPatrols have a loop_to field specifying where to restart.\n\n### 2. Cooldown-Aware Steps (Atoms)\n\nSteps encode their own cadence. When patrol reaches a step:\n1. Check: now - last_run \u003e cooldown?\n2. If yes: execute, update last_run\n3. If no: skip (immediately close)\n\nThe patrol runner is simple - steps self-skip. Complexity distributed into atoms.\n\n### 3. The Beacon\n\nThe heartbeat that fires patrol triggers:\n- Internal ticker in Deacon (goroutine)\n- Or external cron firing gt deacon tick\n- Or mail-based triggers\n\nWithout beacon, nothing proactive happens.\n\n### 4. Session Reset as Patrol Step\n\nConnects to auto-handoff (gt-bcwn). Session reset is a patrol step, not a separate mechanism.\n\n### 5. Multi-Role Patrols\n\nEach supervisor has its own patrol:\n\n**Deacon patrol:** health-check (30s), session-gc (5m), beacon-tick (10s)\n**Witness patrol:** orphan-scan (10m), stuck-check (2m), molecule-progress (1m)\n**Refinery patrol:** queue-check (30s), pr-status (1m), merge-ready (30s)\n\n### 6. Cadence Tiers\n\n- Critical (10-30s): Health checks\n- Active (1-5m): Progress, nudges\n- Maintenance (10-30m): Orphans, GC\n- Periodic (1h+): Reports\n\n### 7. Best-Effort Scheduling\n\nNot real-time - more like cron. No hard deadlines. Catch-up, dont pile-up.\nPriority preemption (mail interrupts patrol). Graceful degradation under load.\n\n## Open Questions\n\n1. State persistence: Beads (self-describing) or file (faster)?\n2. Interruption: How does urgent mail preempt patrol?\n3. Error recovery: Backoff? Escalate? Circuit breaker?\n4. Coordination: Can patrols send mail to trigger other patrols?\n\n## Related\n\n- gt-bcwn: Auto-handoff (session reset is a patrol step)\n- Molecule system (patrols extend molecules with loops)\n- Deacon lifecycle management\n\n## Metaphor\n\nClaude was fire. Claude Code was steam. Gas Town is the steam engine. Beads is the train tracks.\n\nThe steam engine converts episodic combustion into continuous rotary motion.\nGas Town converts episodic Claude sessions into continuous autonomous work.","status":"open","priority":1,"issue_type":"epic","created_at":"2025-12-21T12:18:22.99128-08:00","updated_at":"2025-12-21T12:18:22.99128-08:00","dependencies":[{"issue_id":"gt-7918","depends_on_id":"gt-bcwn","type":"blocks","created_at":"2025-12-21T12:18:30.86651-08:00","created_by":"daemon"}]}
{"id":"gt-7919","title":"Fix failing beads tests: TestIntegration and TestPolecatWorkMolecule","status":"closed","priority":1,"issue_type":"bug","assignee":"gastown/furiosa","created_at":"2025-12-22T12:46:29.649-08:00","updated_at":"2025-12-22T23:41:07.64316-08:00","closed_at":"2025-12-22T23:41:07.64316-08:00","close_reason":"Fixed test expectations for molecule counts and step names"}
{"id":"gt-7920","title":"Create mol-refinery-patrol with test failure gates","description":"## Problem\n\nThe Refinery role lacks:\n1. A formal patrol molecule (Deacon has mol-deacon-patrol)\n2. Engineer identity/philosophy guidance\n3. Structural enforcement of failure handling (not just documentation)\n\nWhen tests fail during merge processing, the current guidance doesn't prevent 'disavowal' - noting a problem exists and proceeding without tracking it.\n\n## The Structural Solution\n\nCreate `mol-refinery-patrol` with **verification gates** that make disavowal structurally impossible:\n\n```markdown\n## Molecule: mol-refinery-patrol\n\n## Step: inbox-check\nCheck mail for MR submissions, escalations, messages.\nProcess any urgent items first.\n\n## Step: queue-scan\nFetch remote, identify polecat branches waiting.\nIf queue empty, skip to context-check.\nTrack branch list for this cycle.\nNeeds: inbox-check\n\n## Step: process-branch\nPick next branch. Rebase on current main.\nIf rebase conflicts: notify polecat, skip to next branch.\nNeeds: queue-scan\n\n## Step: run-tests\nRun go test ./...\nTrack results (pass/fail count).\nNeeds: process-branch\n\n## Step: handle-failures\n**GATE**: If tests passed, this step auto-completes.\nIf tests failed:\n- Diagnose: branch regression or pre-existing?\n- Branch regression → abort, notify polecat\n- Pre-existing → EITHER fix OR \\`bd create --type=bug\\`\n**VERIFY**: Fix committed OR bead filed before proceeding.\nNeeds: run-tests\n\n## Step: merge-push\nMerge to main (ff-only preferred).\nPush immediately.\nDelete polecat branch.\nNeeds: handle-failures\n\n## Step: loop-check\nMore branches? Return to process-branch.\nOtherwise continue to summary.\nNeeds: merge-push\n\n## Step: generate-summary\nSummarize cycle: branches processed, tests results, issues filed.\nNeeds: loop-check\n\n## Step: context-check\nCheck context usage.\nIf high: write handoff, prepare for burn/respawn.\nNeeds: generate-summary\n\n## Step: burn-or-loop\nIf context LOW and queue non-empty: loop (return to queue-scan)\nIf context HIGH or queue empty: burn and exit\nNeeds: context-check\n```\n\n## Implementation Tasks\n\n### 1. Add RefineryPatrolMolecule() to builtin_molecules.go\n- Copy pattern from DeaconPatrolMolecule\n- Include all steps with proper `Needs:` dependencies\n- Emphasize handle-failures gate in description\n\n### 2. Update Refinery CLAUDE.md\nAdd sections:\n- **The Engineer Mindset** (identity/philosophy)\n- **The Scotty Test** (Would Scotty walk past this?)\n- **Patrol Molecule** reference (mol-refinery-patrol)\n- **Test Failure Protocol** (explicit decision tree)\n\n### 3. Create prompts/roles/refinery.md\n- Follow pattern of deacon.md\n- Include patrol execution loop diagram\n- Reference the molecule\n\n### 4. Consider mol-witness-patrol\n- Witness has detailed heartbeat protocol but no formal molecule\n- Similar pattern could apply\n\n## Why This Matters\n\nGUPP: 'If you have work on your hook, you have to run it.'\nThe patrol molecule puts failure handling ON THE HOOK as a mandatory step.\nYou can't skip handle-failures to get to merge-push.\nThe structure enforces good behavior.\n\n## Related\n- gt-7919: Fix failing beads tests (discovered during this session)\n- mol-deacon-patrol (existing pattern to follow)\n- docs/molecular-chemistry.md (chemistry concepts)\n- docs/wisp-architecture.md (wisp vs mol decision)","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-22T13:01:48.588945-08:00","updated_at":"2025-12-22T13:20:37.565029-08:00","closed_at":"2025-12-22T13:13:36.329669-08:00"}
@@ -227,14 +222,12 @@
{"id":"gt-7923","title":"gt rig add / gt doctor: patrol awareness and wiring","description":"## Problem\n\nWhen a rig is installed or audited, we need to ensure all built-in patrols and role hooks are properly wired up.\n\n## gt rig add Changes\n\nWhen adding a rig, automatically:\n\n1. **Create patrol molecules** for each role:\n - mol-deacon-patrol (town-level)\n - mol-witness-patrol (per-rig)\n - mol-refinery-patrol (per-rig)\n\n2. **Set up hooks** that trigger patrols:\n - Deacon: daemon timer / heartbeat\n - Witness: daemon timer / polecat lifecycle events\n - Refinery: MR submission events / daemon timer\n\n3. **Configure daemon** to manage these patrols:\n - Register patrol molecules in daemon config\n - Set up respawn behavior for each role\n\n4. **Create plugin directories**:\n - ~/gt/plugins/ (town-level)\n - \u003crig\u003e/plugins/ (rig-level, if needed)\n\n## gt doctor Changes\n\nAdd patrol health checks:\n\n### patrol-molecules-exist\n- Verify mol-deacon-patrol, mol-witness-patrol, mol-refinery-patrol exist\n- Check they parse correctly (valid steps, dependencies)\n\n### patrol-hooks-wired\n- Verify hooks trigger patrol execution\n- Check daemon is configured to manage patrols\n\n### patrol-not-stuck\n- Detect wisps that have been in-progress too long\n- Flag orphaned patrol molecules (no active session)\n\n### patrol-plugins-accessible\n- Verify plugin directories exist and are readable\n- Check plugin frontmatter parses correctly\n\n### patrol-roles-have-prompts\n- Verify prompts/roles/*.md exist for each role\n- Check they reference the correct patrol molecule\n\n## Auto-fix\n\ngt doctor --fix can:\n- Create missing patrol molecules\n- Wire up missing hooks\n- Create plugin directories\n- NOT restart stuck patrols (needs human decision)\n\n## Related\n- gt-7920 (mol-refinery-patrol)\n- gt-7921 (await-work and plugin-run)\n- docs/wisp-architecture.md","status":"closed","priority":1,"issue_type":"feature","assignee":"gastown/rictus","created_at":"2025-12-22T13:24:43.158379-08:00","updated_at":"2025-12-23T01:16:16.773474-08:00","closed_at":"2025-12-23T01:16:16.773474-08:00","close_reason":"Merged to main"}
{"id":"gt-7hor","title":"Document the Propulsion Principle","description":"Write canonical documentation for the Universal Gas Town Propulsion Principle.\n\nLocation: gastown/mayor/rig/docs/propulsion-principle.md\n\nContent:\n- The One Rule (hook has work → work happens)\n- Why it works (stateless agents, molecule-driven)\n- The sling lifecycle diagram\n- Agent startup protocol\n- Examples and anti-patterns\n\nThis is foundational theory-of-operation documentation.","status":"closed","priority":2,"issue_type":"task","assignee":"gastown/slit","created_at":"2025-12-22T03:17:47.790012-08:00","updated_at":"2025-12-22T12:31:43.230007-08:00","closed_at":"2025-12-22T12:31:43.230007-08:00","close_reason":"Documentation complete. Created docs/propulsion-principle.md covering the One Rule, sling lifecycle, agent startup protocol, and examples/anti-patterns."}
{"id":"gt-7hz3","title":"Merge: gt-92l","description":"branch: polecat/Ace\ntarget: main\nsource_issue: gt-92l\nrig: gastown","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-19T16:31:37.716367-08:00","updated_at":"2025-12-19T18:26:14.102101-08:00","closed_at":"2025-12-19T17:48:09.627376-08:00"}
{"id":"gt-7iek","title":"context-check","description":"Assess own context usage. If high, prepare for handoff.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T17:51:45.43771-08:00","updated_at":"2025-12-23T04:40:34.00709-08:00","closed_at":"2025-12-23T04:40:34.00709-08:00","close_reason":"Parent gt-hbnz closed (duplicate mol-deacon-patrol)","dependencies":[{"issue_id":"gt-7iek","depends_on_id":"gt-hbnz","type":"parent-child","created_at":"2025-12-21T17:51:45.442974-08:00","created_by":"stevey"}],"wisp":true}
{"id":"gt-7ik","title":"Ephemeral polecats: spawn fresh, delete on completion","description":"## Design Decision\n\nSwitch from pooled/idle polecats to ephemeral model:\n- Spawn creates fresh worktree from main\n- Polecat requests shutdown when done (bottom-up)\n- Witness verifies handoff, kills session, deletes worktree\n- No 'idle' state - polecats exist only while working\n\n## Rationale\n\n1. **Git worktrees are fast** - pooling optimization is obsolete\n2. **Pooling creates maintenance burden:**\n - Git stashes accumulate\n - Untracked artifacts pile up\n - Branches drift from main\n - Beads DB gets stale\n3. **PGT sync problems** came from persistent branches\n4. **Support infrastructure exists** - Witness, Refinery, Mayor handle continuity\n5. **Simpler mental model** - polecat exists = work in progress\n\n## Lifecycle\n\n```\nSpawn:\n gt spawn --issue \u003cid\u003e\n → Creates fresh worktree: git worktree add polecats/\u003cname\u003e -b polecat/\u003cname\u003e\n → Initializes beads in worktree\n → Starts session, assigns work\n\nWorking:\n Polecat does task\n → Pushes to polecat/\u003cname\u003e branch\n → Submits to merge queue when ready\n\nCompletion (POLECAT-INITIATED):\n Polecat runs: gt handoff\n → Verifies git state clean\n → Sends mail to Witness: \"Ready for shutdown\"\n → Marks itself done, waits for termination\n\nCleanup (WITNESS-OWNED):\n Witness receives shutdown request\n → Verifies PR merged or in queue\n → Verifies no uncommitted changes\n → Kills session: gt session stop \u003crig\u003e/\u003cpolecat\u003e\n → Deletes worktree: git worktree remove polecats/\u003cname\u003e\n → Deletes branch: git branch -d polecat/\u003cname\u003e\n → Optionally: Notifies Mayor of completion\n```\n\n## Key Insight: Bottom-Up Shutdown\n\n**Old model (wrong)**: Top-down batch shutdown - \"cancel the swarm\"\n**New model (right)**: Bottom-up individual shutdown - polecat requests, Witness executes\n\nThis enables streaming:\n- Workers come and go continuously\n- No \"swarm end\" to trigger cleanup\n- Each worker manages its own lifecycle\n- Witness is the lifecycle authority\n\n## Implementation\n\n1. Add `gt handoff` command for polecats to request shutdown\n2. Modify gt spawn to always create fresh worktree\n3. Run bd init in new worktree (beads needs initialization)\n4. Add shutdown request handler to Witness\n5. Witness verifies handoff, then cleans up:\n - Kill session\n - Remove worktree\n - Delete branch\n6. Remove 'idle' state from polecat state machine\n7. Simplify gt polecat list (only shows active)\n\n## Impact on Other Tasks\n\n- gt-17r (Zombie cleanup): Becomes trivial - orphan worktrees\n- gt-4my (Worker health): Simpler - no idle/stuck ambiguity\n- gt-f9x.5/f9x.6 (Doctor): Fewer states to validate\n- gt-eu9 (Witness handoff): Witness receives polecat shutdown requests","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-17T15:44:31.139964-08:00","updated_at":"2025-12-19T01:57:17.033547-08:00","closed_at":"2025-12-19T01:57:17.033547-08:00"}
{"id":"gt-7lt","title":"gt mail send should tmux-notify recipient","description":"## Problem\n\nWhen mail is sent via gt mail send, the recipient session does not get a tmux notification. In Python Gas Town (PGT), mail delivery triggers a tmux display-message or similar notification so the agent knows mail arrived.\n\n## Expected Behavior\n\nWhen gt mail send \u003caddr\u003e is called:\n1. Mail is delivered to recipient inbox\n2. If recipient has an active tmux session, send notification\n3. Notification should be visible (display-message or bell)\n\n## Current Behavior\n\nMail is delivered but no notification. Agent has to poll inbox to discover new mail.\n\n## Impact\n\n- Agents miss time-sensitive messages\n- Heartbeat pokes from daemon will not wake agents\n- Coordination is slower (polling vs push)\n\n## Implementation Notes\n\nAfter successful mail delivery, check if recipient has active session:\n- gt session list can identify active sessions\n- tmux display-message or send-keys can notify\n- Could inject a visible prompt like \"[MAIL] New message from \u003csender\u003e\"\n\n## Reference\n\nCheck PGT implementation for how it handles this.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-18T12:28:50.142075-08:00","updated_at":"2025-12-18T20:09:53.112902-08:00","closed_at":"2025-12-18T20:09:53.112902-08:00"}
{"id":"gt-7o7","title":"Session pre-shutdown checks","description":"Session stop should verify clean state before killing, like PGT.\n\n## Pre-Shutdown Checks\n\n### 1. Git Working Tree Clean\n```go\nfunc checkGitClean(clonePath string) error {\n // git status --porcelain\n // Fail if any output\n}\n```\n\n### 2. All Commits Pushed\n```go\nfunc checkCommitsPushed(clonePath string) error {\n // git log origin/HEAD..HEAD\n // Fail if any unpushed commits\n}\n```\n\n### 3. Assigned Issues Handled\n```go\nfunc checkIssuesHandled(polecat *Polecat) error {\n // If polecat.Issue != \"\", check if closed or reassigned\n}\n```\n\n### 4. Beads Synced\n```go\nfunc checkBeadsSynced(clonePath string) error {\n // bd sync --status in clone directory\n}\n```\n\n## Behavior on Failure\n1. First attempt: Nudge worker to fix\n2. Retry up to 3 times with delay\n3. After retries: Escalate to Witness/Mayor\n\n## Integration\nModify internal/session/manager.go Stop():\n```go\nfunc (m *Manager) Stop(polecat string, force bool) error {\n if !force {\n if err := m.runPreShutdownChecks(polecat); err != nil {\n return fmt.Errorf(\"pre-shutdown checks failed: %w\", err)\n }\n }\n // existing stop logic\n}\n```\n\n## Flags\n- --force: Skip checks\n- --grace-period N: Time to wait for fixes\n\n## Dependencies\n- Ties into gt-69l (hook system) - can be hook-based\n- Ties into gt-f8v (Witness pre-kill verification)\n\n## Acceptance Criteria\n- [ ] Stop fails if uncommitted changes (without --force)\n- [ ] Stop fails if unpushed commits\n- [ ] Clear error messages with fix instructions\n- [ ] --force bypasses all checks","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-16T14:47:55.968983-08:00","updated_at":"2025-12-16T16:05:02.795812-08:00"}
{"id":"gt-7oow","title":"gt mail: Cross-level routing is broken","description":"**Problem:**\nWhen Mayor (at ~/gt) sends mail to a rig worker (gastown/crew/max), the message lands in town-level beads (~/.beads/) but the recipient checks rig-level beads (crew/max/.beads/).\n\n**Reproduction:**\n```bash\ncd ~/gt\ngt mail send gastown/crew/max -s 'Test' -m 'body'\n# Message goes to ~/gt/.beads/ with prefix hq-*\n\ncd ~/gt/gastown/crew/max \ngt mail inbox\n# Does NOT see the message - it's looking in crew/max/.beads/\n```\n\n**Root cause:**\n`findBeadsWorkDir()` walks up from CWD to find .beads. `Router.Send()` runs `bd create` in that directory. This means messages always go to the sender's beads, not the recipient's.\n\n**Fix options:**\n1. Route based on recipient address - if sending to rig/*, use that rig's .beads\n2. Use a single shared beads database for all mail (simpler but less isolated)\n3. Teach agents to check both levels (workaround, not fix)\n\n**Related:**\n- gt-ngu1: Pinned beads sorting (done but pointless if mail doesn't route)\n- This blocks all cross-level mail functionality","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-20T17:57:30.258991-08:00","updated_at":"2025-12-20T18:35:54.390121-08:00","closed_at":"2025-12-20T18:35:54.390121-08:00"}
{"id":"gt-7q4","title":"HOP: Skill vectors on work items","description":"Add skill embeddings to work items for capability-based matching. See ~/ai/stevey-gastown/hop/CONTEXT.md. Post-v0.1 work.","status":"open","priority":3,"issue_type":"feature","created_at":"2025-12-17T01:00:43.251085-08:00","updated_at":"2025-12-17T01:00:43.251085-08:00"}
{"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-7tmh","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":"closed","priority":4,"issue_type":"epic","assignee":"deacon","created_at":"2025-12-23T13:03:21.516072-08:00","updated_at":"2025-12-24T19:17:11.404751-08:00","closed_at":"2025-12-24T19:17:11.404751-08:00","close_reason":"Incomplete patrol, creating fresh","wisp":true}
{"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":"open","priority":1,"issue_type":"task","created_at":"2025-12-24T13:04:51.751097-08:00","updated_at":"2025-12-24T13:04:51.751097-08:00","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":"closed","priority":2,"issue_type":"task","created_at":"2025-12-16T16:51:02.716629-08:00","updated_at":"2025-12-16T17:23:18.589027-08:00","closed_at":"2025-12-16T17:23:18.589027-08:00"}
@@ -243,7 +236,6 @@
{"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-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":"closed","priority":0,"issue_type":"bug","created_at":"2025-12-17T22:28:02.583003-08:00","updated_at":"2025-12-17T22:31:58.847834-08:00","closed_at":"2025-12-17T22:31:58.847834-08:00"}
{"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":"closed","priority":1,"issue_type":"task","created_at":"2025-12-16T14:46:34.721484-08:00","updated_at":"2025-12-16T16:03:17.405433-08:00","closed_at":"2025-12-16T16:03:17.405433-08:00"}
{"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","assignee":"witness","created_at":"2025-12-23T16:23:42.025546-08:00","updated_at":"2025-12-23T16:23:42.79036-08:00","wisp":true}
{"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"}
{"id":"gt-8bx","title":"Adaptive backoff for daemon heartbeat","description":"Track agent responsiveness and adjust heartbeat frequency.\n\n## Per-Agent State\n\n```go\ntype AgentBackoff struct {\n BaseInterval time.Duration // 60s default\n CurrentInterval time.Duration // grows when busy\n MaxInterval time.Duration // 10min cap\n ConsecutiveMiss int // pokes with no response\n}\n```\n\n## Strategy Options\n\n- **Fixed**: Always 60s (current, simple)\n- **Geometric**: 60s → 90s → 135s → 202s (factor 1.5)\n- **Exponential**: 60s → 120s → 240s (factor 2, aggressive)\n\n## Recovery\n\nWhen agent responds (runs a command):\n- Reset ConsecutiveMiss to 0\n- Return to BaseInterval immediately\n\n## Benefits\n\n- Reduces noise for busy agents\n- Saves resources during quiet periods\n- Still catches stuck agents (max interval cap)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-18T14:19:33.083844-08:00","updated_at":"2025-12-19T12:09:31.613912-08:00","closed_at":"2025-12-19T12:09:31.613912-08:00","dependencies":[{"issue_id":"gt-8bx","depends_on_id":"gt-bfd","type":"blocks","created_at":"2025-12-18T14:19:46.912289-08:00","created_by":"daemon"}]}
@@ -257,13 +249,12 @@
{"id":"gt-8nmy","title":"Update Deacon template to emphasize staying in ~/gt/deacon directory","description":"The Deacon template should instruct the agent to stay in ~/gt/deacon/ as much as possible, and always return there after any excursion. This prevents issues with identity detection (mail, mol status) which depend on cwd.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T13:30:27.969826-08:00","updated_at":"2025-12-23T13:30:27.969826-08:00"}
{"id":"gt-8os8","title":"Work on ga-p6r: Add handoff protocol to spawn priming. En...","description":"Work on ga-p6r: Add handoff protocol to spawn priming. Ensure polecats receive handoff context when spawned. When done, submit MR (not PR) to integration branch for Refinery.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-19T22:57:59.334003-08:00","updated_at":"2025-12-19T23:22:07.076974-08:00","closed_at":"2025-12-19T23:22:07.076974-08:00"}
{"id":"gt-8pcb","title":"Plugin/molecule catalog integration design","description":"Two currently independent systems:\n1. Disk-based plugins (~~/gt/plugins/) - Deacon patrol extensions\n2. Molecule catalog (protos in beads) - bd pour/wisp/bond\n\nInvestigate integration points:\n- User-contributed molecules bonded to catalog\n- Dynamic molecule attachment during execution (e.g., 'attach security sniffer because we noticed condition X')\n- How plugins could contribute protos\n- How protos could trigger plugins\n\nNot blocking launch. Future design investigation.","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-22T21:52:47.897048-08:00","updated_at":"2025-12-22T21:52:47.897048-08:00"}
{"id":"gt-8qv3","title":"request-shutdown","description":"Send shutdown request to Witness.\nWait for termination.\n\nThe polecat is now ready to be cleaned up.\nDo not exit directly - wait for Witness to kill the session.\n\nDepends: generate-summary","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T21:58:52.600349-08:00","updated_at":"2025-12-21T21:59:10.938756-08:00","closed_at":"2025-12-21T21:59:10.938756-08:00","close_reason":"test cleanup","dependencies":[{"issue_id":"gt-8qv3","depends_on_id":"gt-q6hl","type":"parent-child","created_at":"2025-12-21T21:58:52.603957-08:00","created_by":"stevey"}],"wisp":true}
{"id":"gt-8r7","title":"Enhance Mayor CLAUDE.md with GGT milestone tracking","description":"Update ~/ai/CLAUDE.md (Mayor startup context) with:\n\n1. GGT Self-Hosting Milestone section\n - Track progress toward gt replacing town\n - Key blockers: gt-h5n (merge queue), gt-974 (daemon)\n - What \"self-hosting\" means (GGT working on itself)\n\n2. Recent Architecture Decisions\n - Engineer = role, Refinery = place\n - Merge queue in Beads (not branch discovery)\n - Session restart protocol\n\n3. Transition Plan\n - Current: use town commands (PGT)\n - Target: use gt commands (GGT)\n - Switch criteria: gt-b1g closed\n\nKeep it concise - Mayor context should be quick to scan.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-16T23:12:07.260653-08:00","updated_at":"2025-12-16T23:12:07.260653-08:00","dependencies":[{"issue_id":"gt-8r7","depends_on_id":"gt-h5n","type":"blocks","created_at":"2025-12-16T23:12:15.124842-08:00","created_by":"daemon"}]}
{"id":"gt-8tmz","title":"Molecule Algebra: Work Composition DSL","description":"Implement the molecule algebra - a declarative language for composing, transforming, and executing structured work. Enables mechanical composition without AI.\n\nThe Three Phases: Rig → Cook → Run\n\n- **Rig**: Source-level composition (formula YAML with extends/compose)\n- **Cook**: Instantiation (formula → proto → mol/wisp)\n- **Run**: Execution (agents complete steps)\n\nTwo Composition Operators:\n- **Rig** operates on formulas (source level)\n- **Bond** operates on artifacts (protos, mols, wisps)\n\nKey components:\n- Formulas: YAML source with composition rules (.formula.yaml)\n- Cook: Pre-expand macros/aspects to flat proto\n- Phase verbs (pour, wisp)\n- Bond: Artifact-level polymorphic composition\n- Composition operators (sequence, parallel, branch, loop, gate)\n- Advice operators (before, after, around - Lisp style)\n- Expansion operators (macros like Rule of Five)\n- Aspects (AOP cross-cutting concerns)\n\nSee docs/rig-cook-run.md for the lifecycle spec.\nSee docs/molecule-algebra.md for full algebra specification.\nExample formulas in .beads/formulas/","status":"open","priority":1,"issue_type":"epic","created_at":"2025-12-23T18:03:48.824827-08:00","updated_at":"2025-12-23T19:19:52.260736-08:00"}
{"id":"gt-8tmz.1","title":"Phase verbs: pour and wisp commands","description":"Implement the phase transition verbs:\n- bd pour \u003cproto\u003e - instantiate as persistent mol\n- bd wisp \u003cproto\u003e - instantiate as ephemeral wisp\n- Update bd mol bond to inherit phase from target\n\nThese replace the current --wisp flag with cleaner verb semantics.","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-23T18:03:57.280647-08:00","updated_at":"2025-12-23T18:03:57.280647-08:00"}
{"id":"gt-8tmz.1","title":"Phase verbs: pour and wisp commands","description":"Implement the phase transition verbs:\n- bd pour \u003cproto\u003e - instantiate as persistent mol\n- bd wisp \u003cproto\u003e - instantiate as ephemeral wisp\n- Update bd mol bond to inherit phase from target\n\nThese replace the current --wisp flag with cleaner verb semantics.","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-23T18:03:57.280647-08:00","updated_at":"2025-12-23T18:03:57.280647-08:00","dependencies":[{"issue_id":"gt-8tmz.1","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-23T18:03:57.281096-08:00","created_by":"daemon"}]}
{"id":"gt-8tmz.10","title":"Rename Engineer in Box to Shiny","description":"Rename mol-engineer-in-box to mol-shiny (or just 'shiny').\n\nMad Max reference - the canonical 'right way to engineer'.\nUpdate all references in docs and code.","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-23T18:04:40.434948-08:00","updated_at":"2025-12-23T18:04:40.434948-08:00","dependencies":[{"issue_id":"gt-8tmz.10","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-23T18:04:40.437009-08:00","created_by":"daemon"}]}
{"id":"gt-8tmz.11","title":"Rule of Five expansion template","description":"Create rule-of-five as an expansion template:\n- Jeffrey's discovery: agents converge in 4-5 iterations\n- Template expands any step into 5-pass refinement\n- draft → refine-1 → refine-2 → refine-3 → refine-4\n\nFirst example of a macro-style expansion proto.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T18:04:41.438135-08:00","updated_at":"2025-12-23T18:04:41.438135-08:00","dependencies":[{"issue_id":"gt-8tmz.11","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-23T18:04:41.439635-08:00","created_by":"daemon"}]}
{"id":"gt-8tmz.12","title":"Formula parser and YAML schema","description":"Implement formula parsing from YAML:\n- Define YAML schema for .formula.yaml files\n- Parse steps, compose rules, vars\n- Support extends for formula inheritance\n- Validate formula structure\n\nSchema should support:\n- formula: name\n- description: text\n- version: number\n- type: workflow|expansion|aspect\n- vars: variable definitions\n- steps: step definitions\n- compose: composition rules\n\n**Beads issue: bd-weu8**","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T18:20:02.788306-08:00","updated_at":"2025-12-24T13:44:21.239181-08:00","closed_at":"2025-12-24T13:44:21.239181-08:00","close_reason":"Implemented in Beads (bd-weu8, bd-wa2l)"}
{"id":"gt-8tmz.12","title":"Formula parser and YAML schema","description":"Implement formula parsing from YAML:\n- Define YAML schema for .formula.yaml files\n- Parse steps, compose rules, vars\n- Support extends for formula inheritance\n- Validate formula structure\n\nSchema should support:\n- formula: name\n- description: text\n- version: number\n- type: workflow|expansion|aspect\n- vars: variable definitions\n- steps: step definitions\n- compose: composition rules\n\n**Beads issue: bd-weu8**","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T18:20:02.788306-08:00","updated_at":"2025-12-24T13:44:21.239181-08:00","closed_at":"2025-12-24T13:44:21.239181-08:00","close_reason":"Implemented in Beads (bd-weu8, bd-wa2l)","dependencies":[{"issue_id":"gt-8tmz.12","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-23T18:20:02.788811-08:00","created_by":"daemon"}]}
{"id":"gt-8tmz.13","title":"bd cook command: Formula to Proto","description":"Implement the 'bd cook' command that transforms formulas into protos.\n\nUsage: bd cook \u003cformula-file\u003e [options]\n bd cook .beads/formulas/*.formula.yaml\n\nProcess:\n1. Parse formula YAML (uses formula parser)\n2. Resolve extends (formula inheritance)\n3. Expand macros (expansion rules)\n4. Apply aspects (cross-cutting concerns)\n5. Generate flat proto bead\n\nOutput:\n- Creates proto bead in .beads/ with mol-prefix\n- Proto has all steps pre-expanded\n- Proto is ready for pour/wisp instantiation\n\n**Beads issue: bd-wa2l**","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T18:20:03.9306-08:00","updated_at":"2025-12-24T13:44:21.26078-08:00","closed_at":"2025-12-24T13:44:21.26078-08:00","close_reason":"Implemented in Beads (bd-weu8, bd-wa2l)","dependencies":[{"issue_id":"gt-8tmz.13","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-23T18:20:03.933113-08:00","created_by":"daemon"},{"issue_id":"gt-8tmz.13","depends_on_id":"gt-8tmz.12","type":"blocks","created_at":"2025-12-23T18:20:11.133013-08:00","created_by":"daemon"}]}
{"id":"gt-8tmz.14","title":"bd formula list/show commands","description":"Implement formula management commands:\n\n bd formula list\n # Lists formulas from all search paths\n\n bd formula show rule-of-five\n # Shows formula details, steps, compose rules\n\nSearch paths (in order):\n1. .beads/formulas/ (project)\n2. ~/gt/.beads/formulas/ (town)\n3. ~/.beads/formulas/ (user)\n4. Built-in formulas (embedded)","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T18:20:05.02817-08:00","updated_at":"2025-12-23T18:20:05.02817-08:00","dependencies":[{"issue_id":"gt-8tmz.14","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-23T18:20:05.03005-08:00","created_by":"daemon"}]}
{"id":"gt-8tmz.15","title":"Formula cycle detection during cooking","description":"Detect and error on circular extends chains during bd cook. E.g., if formula A extends B extends A, cooking should fail with clear error message pointing to the cycle.","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-23T18:45:06.751822-08:00","updated_at":"2025-12-23T18:45:06.751822-08:00","dependencies":[{"issue_id":"gt-8tmz.15","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-23T18:45:06.752271-08:00","created_by":"daemon"},{"issue_id":"gt-8tmz.15","depends_on_id":"gt-8tmz.13","type":"blocks","created_at":"2025-12-23T18:48:18.543425-08:00","created_by":"daemon"}]}
@@ -288,9 +279,9 @@
{"id":"gt-8tmz.32","title":"Consolidate molecular-chemistry.md with rig-cook-run.md","description":"Merge rig-cook-run.md into molecular-chemistry.md as the canonical chemical algebra spec:\n- Rig/Cook/Run as the lifecycle backbone\n- Full generation graph: Formula → Compound Formula → Proto → Mol/Wisp\n- Bond table at artifact level (symmetric)\n- Rig operator at source level\n- Unified vocabulary\n- Archive or redirect rig-cook-run.md","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T20:06:48.82201-08:00","updated_at":"2025-12-23T20:09:55.176385-08:00","closed_at":"2025-12-23T20:09:55.176385-08:00","close_reason":"Consolidated rig-cook-run.md into molecular-chemistry.md. Updated all references.","dependencies":[{"issue_id":"gt-8tmz.32","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-23T20:06:48.823692-08:00","created_by":"daemon"}]}
{"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":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T18:04:34.128562-08:00","updated_at":"2025-12-23T18:04:34.128562-08:00","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":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T18:04:35.447482-08:00","updated_at":"2025-12-23T18:04:35.447482-08:00"}
{"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":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T18:04:36.820385-08:00","updated_at":"2025-12-23T18:04:36.820385-08:00"}
{"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"}
{"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":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T18:04:35.447482-08:00","updated_at":"2025-12-23T18:04:35.447482-08:00","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":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T18:04:36.820385-08:00","updated_at":"2025-12-23T18:04:36.820385-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.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":"open","priority":1,"issue_type":"task","created_at":"2025-12-23T18:04:39.209305-08:00","updated_at":"2025-12-23T18:04:39.209305-08:00","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"}
{"id":"gt-8wf","title":"Polecat prompting: gt mq submit on completion","description":"Update Polecat CLAUDE.md prompting to:\n\n1. On task completion, run: gt mq submit --issue \u003cid\u003e\n2. This creates a merge-request bead in the queue\n3. Engineer will process it\n\nThe Polecat self-reports completion to the merge queue.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-16T23:02:39.914724-08:00","updated_at":"2025-12-16T23:02:39.914724-08:00","dependencies":[{"issue_id":"gt-8wf","depends_on_id":"gt-h5n","type":"blocks","created_at":"2025-12-16T23:02:55.930679-08:00","created_by":"daemon"},{"issue_id":"gt-8wf","depends_on_id":"gt-svi","type":"blocks","created_at":"2025-12-16T23:03:12.950782-08:00","created_by":"daemon"}]}
@@ -306,7 +297,7 @@
{"id":"gt-99a","title":"Add unit tests for daemon package","description":"The daemon package has no unit tests. Need tests for:\n- Config and state serialization\n- Session name pattern matching (isWitnessSession)\n- Lifecycle request parsing\n- Identity to session mapping","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-18T13:38:10.458609-08:00","updated_at":"2025-12-19T17:22:52.552189-08:00","closed_at":"2025-12-19T16:17:43.92102-08:00","dependencies":[{"issue_id":"gt-99a","depends_on_id":"gt-99m","type":"blocks","created_at":"2025-12-18T13:38:26.466501-08:00","created_by":"daemon"}]}
{"id":"gt-99m","title":"gt daemon: Background service management","description":"## Summary\n\nONE daemon for all Gas Town - a simple Go process (not a Claude agent) that:\n1. Pokes agents periodically (heartbeat)\n2. Processes lifecycle requests\n3. Restarts sessions when agents request cycling\n\n## Architecture\n\nDaemon (gt daemon)\n- Pokes Mayor: \"HEARTBEAT: check your rigs\"\n- Pokes each Witness: \"HEARTBEAT: check your workers\"\n- Has inbox at daemon/ for lifecycle requests\n- Restarts sessions on cycle requests\n\n## NOT the daemon's job:\n- Making decisions (Witnesses do that)\n- Running Claude (it's a Go process)\n- Processing work (polecats do that)\n- Direct polecat management (Witnesses do that)\n\nThe daemon is a **dumb scheduler** - poke things, execute lifecycle requests. All intelligence is in agents.\n\n## Commands\n\n- gt daemon start: Start daemon (background)\n- gt daemon stop: Stop daemon\n- gt daemon status: Show daemon status\n- gt daemon logs: View daemon logs\n\n## Daemon Loop\n\nEvery heartbeat interval:\n1. Poke Mayor\n2. For each rig: Poke Witness\n3. Process lifecycle requests from daemon/ inbox\n4. Check for dead sessions, restart if cycle requested\n\n## Lifecycle Request Handling\n\nDaemon checks its inbox (daemon/) for lifecycle requests:\n- From Mayor: cycle/restart Mayor session\n- From Witnesses: cycle/restart Witness session\n\nOn request:\n1. Verify agent state shows requesting_cycle\n2. Kill session\n3. Start new session\n4. Clear requesting_cycle flag\n\n## Poke Protocol\n\nPoke = tmux inject \"HEARTBEAT: do your job\"\n- Agent ignores if already working\n- Agent wakes up if idle\n- Idempotent - multiple pokes are fine\n\n## Lifecycle Hierarchy\n\n- Daemon manages: Mayor, all Witnesses\n- Witness manages: Polecats, Refinery (per rig)\n- Crew: self-managed (human workspace)\n\n## Related Issues\n\n- gt-kmn.11: Daemon heartbeat details\n- gt-gby: gt handoff command (unified lifecycle)\n- gt-u1j.9: Fold witness daemon into this","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-17T21:50:09.763719-08:00","updated_at":"2025-12-19T12:05:27.33958-08:00","closed_at":"2025-12-19T12:05:27.33958-08:00","dependencies":[{"issue_id":"gt-99m","depends_on_id":"gt-hw6","type":"blocks","created_at":"2025-12-17T22:23:43.253877-08:00","created_by":"daemon"}]}
{"id":"gt-9a2","title":"Federation: Wasteland architecture for cross-town coordination","description":"## Overview\n\nFederation enables Gas Town to scale across machines via **Outposts** - remote compute environments that can run workers.\n\n**Design doc**: docs/federation-design.md\n\n## Outpost Types\n\n| Type | Description | Cost Model |\n|------|-------------|------------|\n| Local | Current model (tmux panes) | Free |\n| SSH/VM | Full Gas Town clone on VM | Always-on |\n| CloudRun | Container workers on GCP | Pay-per-use |\n\n## Key Concepts\n\n### Outpost Abstraction\n```go\ntype Outpost interface {\n Name() string\n Type() OutpostType // local, ssh, cloudrun\n MaxWorkers() int\n Spawn(issue string, config WorkerConfig) (Worker, error)\n Workers() []Worker\n Ping() error\n}\n```\n\n### Cloud Run Workers\n- Persistent HTTP/2 connections solve zero-to-one cold start\n- Pay only when working (~$0.017 per 5-min session)\n- Scale 0→N automatically\n- Git clone via persistent volumes\n\n### SSH/VM Outposts \n- Full Gas Town clone on remote machine\n- SSH for commands, git for sync\n- Good for long-running autonomous work\n\n## Design Principles\n\n1. **Outpost abstraction** - support multiple backends\n2. **Local-first** - remote is for overflow/burst\n3. **Git as source of truth** - code and beads sync everywhere\n4. **HTTP for Cloud Run** - dont force mail onto containers\n5. **Graceful degradation** - works with any subset of outposts\n\n## Related\n\n- gt-f9x.7-10: Connection interface (lower-level abstraction)\n- docs/federation-design.md: Full architectural analysis","status":"open","priority":3,"issue_type":"epic","created_at":"2025-12-15T19:21:32.462063-08:00","updated_at":"2025-12-16T18:01:24.224349-08:00"}
{"id":"gt-9a2.1","title":"Outpost/Worker interfaces: Core abstractions for remote compute","description":"## Overview\n\nDefine the core interfaces that all outpost types implement.\n\n## Interfaces\n\n```go\ntype OutpostType string\nconst (\n OutpostLocal OutpostType = \"local\"\n OutpostSSH OutpostType = \"ssh\"\n OutpostCloudRun OutpostType = \"cloudrun\"\n)\n\ntype Outpost interface {\n Name() string\n Type() OutpostType\n MaxWorkers() int\n ActiveWorkers() int\n Spawn(issue string, config WorkerConfig) (Worker, error)\n Workers() []Worker\n Ping() error\n SendMail(worker string, msg Message) error // optional\n}\n\ntype Worker interface {\n ID() string\n Outpost() string\n Status() WorkerStatus // idle, working, done, failed\n Issue() string\n Attach() error // for interactive outposts\n Logs() (io.Reader, error)\n Stop() error\n}\n\ntype WorkerConfig struct {\n RigPath string\n BeadsDir string\n GitBranch string\n Context map[string]string // hints for worker\n}\n```\n\n## Files\n\n- `internal/outpost/outpost.go` - Outpost interface\n- `internal/outpost/worker.go` - Worker interface\n- `internal/outpost/config.go` - WorkerConfig, OutpostType\n\n## Notes\n\nThis is the foundation for all federation work. Keep interfaces minimal - we can extend later.","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-16T18:01:38.268086-08:00","updated_at":"2025-12-16T18:01:38.268086-08:00"}
{"id":"gt-9a2.1","title":"Outpost/Worker interfaces: Core abstractions for remote compute","description":"## Overview\n\nDefine the core interfaces that all outpost types implement.\n\n## Interfaces\n\n```go\ntype OutpostType string\nconst (\n OutpostLocal OutpostType = \"local\"\n OutpostSSH OutpostType = \"ssh\"\n OutpostCloudRun OutpostType = \"cloudrun\"\n)\n\ntype Outpost interface {\n Name() string\n Type() OutpostType\n MaxWorkers() int\n ActiveWorkers() int\n Spawn(issue string, config WorkerConfig) (Worker, error)\n Workers() []Worker\n Ping() error\n SendMail(worker string, msg Message) error // optional\n}\n\ntype Worker interface {\n ID() string\n Outpost() string\n Status() WorkerStatus // idle, working, done, failed\n Issue() string\n Attach() error // for interactive outposts\n Logs() (io.Reader, error)\n Stop() error\n}\n\ntype WorkerConfig struct {\n RigPath string\n BeadsDir string\n GitBranch string\n Context map[string]string // hints for worker\n}\n```\n\n## Files\n\n- `internal/outpost/outpost.go` - Outpost interface\n- `internal/outpost/worker.go` - Worker interface\n- `internal/outpost/config.go` - WorkerConfig, OutpostType\n\n## Notes\n\nThis is the foundation for all federation work. Keep interfaces minimal - we can extend later.","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-16T18:01:38.268086-08:00","updated_at":"2025-12-16T18:01:38.268086-08:00","dependencies":[{"issue_id":"gt-9a2.1","depends_on_id":"gt-9a2","type":"parent-child","created_at":"2025-12-16T18:01:38.27131-08:00","created_by":"daemon"}]}
{"id":"gt-9a2.10","title":"VM outpost setup: Terraform and documentation","description":"## Overview\n\nDocumentation and optional Terraform for setting up VM outposts.\n\n## Manual Setup Guide\n\n```markdown\n# Setting Up a VM Outpost\n\n## Prerequisites\n- GCE VM (or any Linux machine with SSH access)\n- SSH key pair\n- Git configured on VM\n\n## Steps\n\n1. Install Claude Code on VM:\n ```bash\n ssh user@vm\n npm install -g @anthropic-ai/claude-code\n ```\n\n2. Clone Gas Town:\n ```bash\n mkdir -p ~/ai\n cd ~/ai\n gt install .\n ```\n\n3. Configure Git credentials:\n ```bash\n git config --global user.name \"Your Name\"\n git config --global credential.helper store\n ```\n\n4. Add outpost to local config:\n ```bash\n gt outpost add ssh \\\n --name gce-burst \\\n --host 10.0.0.5 \\\n --user steve \\\n --key ~/.ssh/gce_worker \\\n --town-path /home/steve/ai \\\n --max-workers 8\n ```\n\n5. Test connectivity:\n ```bash\n gt outpost ping gce-burst\n ```\n```\n\n## Terraform Module (Optional)\n\n```hcl\n# deploy/terraform/vm-outpost/main.tf\n\nvariable \"project\" {}\nvariable \"zone\" { default = \"us-central1-a\" }\nvariable \"machine_type\" { default = \"e2-standard-4\" }\n\nresource \"google_compute_instance\" \"outpost\" {\n name = \"gastown-outpost\"\n machine_type = var.machine_type\n zone = var.zone\n\n boot_disk {\n initialize_params {\n image = \"ubuntu-2204-lts\"\n size = 100\n }\n }\n\n network_interface {\n network = \"default\"\n access_config {}\n }\n\n metadata_startup_script = file(\"${path.module}/startup.sh\")\n}\n\noutput \"external_ip\" {\n value = google_compute_instance.outpost.network_interface[0].access_config[0].nat_ip\n}\n```\n\n## Files\n\n- `docs/vm-outpost-setup.md`\n- `deploy/terraform/vm-outpost/` (optional)\n\nDepends on: gt-9a2.5 (SSHOutpost)","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-16T18:03:34.782908-08:00","updated_at":"2025-12-16T18:03:34.782908-08:00","dependencies":[{"issue_id":"gt-9a2.10","depends_on_id":"gt-9a2","type":"parent-child","created_at":"2025-12-16T18:03:34.78496-08:00","created_by":"daemon"},{"issue_id":"gt-9a2.10","depends_on_id":"gt-9a2.5","type":"blocks","created_at":"2025-12-16T18:03:46.408609-08:00","created_by":"daemon"}]}
{"id":"gt-9a2.11","title":"HTTP work server: gt worker serve command","description":"## Overview\n\nHTTP server that runs inside Cloud Run containers, accepting work requests.\n\n## Command\n\n```bash\ngt worker serve --port 8080\n```\n\n## Implementation\n\n```go\ntype WorkServer struct {\n port int\n handler *WorkHandler\n}\n\nfunc (s *WorkServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {\n switch r.URL.Path {\n case \"/work\":\n s.handleWork(w, r)\n case \"/health\":\n s.handleHealth(w, r)\n default:\n http.NotFound(w, r)\n }\n}\n\nfunc (s *WorkServer) handleWork(w http.ResponseWriter, r *http.Request) {\n // 1. Parse WorkRequest\n // 2. Clone/pull repo\n // 3. Start Claude on issue\n // 4. Stream WorkEvents as NDJSON\n // 5. Return WorkResult\n}\n```\n\n## Streaming Response\n\n```go\nfunc (s *WorkServer) streamEvents(w http.ResponseWriter, events \u003c-chan WorkEvent) {\n flusher, _ := w.(http.Flusher)\n encoder := json.NewEncoder(w)\n for event := range events {\n encoder.Encode(event)\n flusher.Flush()\n }\n}\n```\n\n## Files\n\n- `internal/cloudrun/server.go`\n- `cmd/gt/worker_serve.go` - Cobra command\n\n## Dependencies\n\nDepends on: gt-9a2.7 (protocol types)","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-16T18:15:00.244823-08:00","updated_at":"2025-12-16T18:15:00.244823-08:00","dependencies":[{"issue_id":"gt-9a2.11","depends_on_id":"gt-9a2","type":"parent-child","created_at":"2025-12-16T18:15:00.246808-08:00","created_by":"daemon"},{"issue_id":"gt-9a2.11","depends_on_id":"gt-9a2.7","type":"blocks","created_at":"2025-12-16T18:15:10.751351-08:00","created_by":"daemon"}]}
{"id":"gt-9a2.12","title":"HTTP work client: CloudRun dispatch client","description":"## Overview\n\nHTTP client for dispatching work to Cloud Run and streaming results back.\n\n## Implementation\n\n```go\ntype WorkClient struct {\n serviceURL string\n httpClient *http.Client // HTTP/2 enabled\n}\n\nfunc NewWorkClient(serviceURL string) *WorkClient {\n return \u0026WorkClient{\n serviceURL: serviceURL,\n httpClient: \u0026http.Client{\n Transport: \u0026http2.Transport{},\n Timeout: 0, // No timeout for streaming\n },\n }\n}\n\nfunc (c *WorkClient) DispatchWork(ctx context.Context, req WorkRequest) (\u003c-chan WorkEvent, error) {\n // 1. POST to /work\n // 2. Return channel that streams WorkEvents\n // 3. Close channel when done/error\n}\n```\n\n## Streaming Reader\n\n```go\nfunc (c *WorkClient) streamEvents(body io.Reader, events chan\u003c- WorkEvent) {\n defer close(events)\n decoder := json.NewDecoder(body)\n for {\n var event WorkEvent\n if err := decoder.Decode(\u0026event); err != nil {\n return\n }\n events \u003c- event\n }\n}\n```\n\n## Files\n\n- `internal/cloudrun/client.go`\n\n## Dependencies\n\nDepends on: gt-9a2.7 (protocol types)\nUsed by: gt-9a2.8 (CloudRunOutpost)","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-16T18:15:10.881936-08:00","updated_at":"2025-12-16T18:15:10.881936-08:00","dependencies":[{"issue_id":"gt-9a2.12","depends_on_id":"gt-9a2","type":"parent-child","created_at":"2025-12-16T18:15:10.882339-08:00","created_by":"daemon"},{"issue_id":"gt-9a2.12","depends_on_id":"gt-9a2.7","type":"blocks","created_at":"2025-12-16T18:15:20.974167-08:00","created_by":"daemon"}]}
@@ -325,7 +316,6 @@
{"id":"gt-9g82","title":"Polecat wisp architecture: Proto → Wisp → Mol pattern","description":"Design the three-layer architecture for polecat lifecycle:\n\n## The Insight\n\nPolecats should run a ONE-SHOT WISP (not looping like patrols):\n\n**Step 1: Onboard**\n- Read full polecat protocol (polecat.md template)\n- Learn Gas Town operation, exit strategies, molecule protocol\n- This is the 'how to be a polecat' education\n\n**Step 2: Execute Mol**\n- Run the assigned molecule (the actual work item)\n- Could span multiple sessions via session continuity\n- The mol is pure work content (epic, issue, feature)\n\n**Step 3: Cleanup**\n- Run final step of the wisp\n- Self-delete / request shutdown\n\n## Three Layers\n\n- **Proto**: polecat.md template (instructions for being a polecat)\n- **Wisp**: One-shot harness instantiated from proto (wraps the mol)\n- **Mol**: The work item (issue/epic being processed)\n\n## Why This Matters\n\n1. **Separation of concerns**: Protocol (how) vs Work (what)\n2. **Reusability**: Same wisp harness wraps any mol\n3. **Extensibility**: Plugin points for custom behavior\n4. **Session continuity**: Wisp handles multi-session, not the mol\n5. **Blurred control/data planes**: Intentional in Gas Town\n\n## Design Questions\n\n1. How does proto (polecat.md) become a wisp instance?\n2. What are the plugin/extension points?\n3. Should all 'engineer in a box' mols use proto → wisp → mol?\n4. How does this relate to refinery/deacon patterns?","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-22T15:54:17.446941-08:00","updated_at":"2025-12-22T16:15:02.608799-08:00","closed_at":"2025-12-22T16:15:02.608799-08:00","close_reason":"Implemented Proto → Wisp → Mol architecture with mol-crew-session, mol-polecat-session, and auto-continue logic in gt prime"}
{"id":"gt-9j9","title":"CLI: worker status reporting commands","description":"Worker status reporting CLI for polecats to report progress.\n\n## Commands\n\n### gt worker started\n```\ngt worker started \u003cissue-id\u003e [-m MESSAGE]\n```\nReports work started on issue.\n\n### gt worker progress\n```\ngt worker progress \u003cissue-id\u003e \u003c0-100\u003e [-m MESSAGE]\n```\nReports percentage complete.\n\n### gt worker blocked\n```\ngt worker blocked \u003cissue-id\u003e \u003creason\u003e [-m MESSAGE]\n```\nReports blocked status with reason.\n\n### gt worker completed\n```\ngt worker completed \u003cissue-id\u003e [-m MESSAGE]\n```\nReports task completion.\n\n### gt worker failed\n```\ngt worker failed \u003cissue-id\u003e \u003creason\u003e [-m MESSAGE]\n```\nReports task failure.\n\n## Implementation\nEach command sends mail to refinery with structured content:\n```go\ntype WorkerStatusReport struct {\n IssueID string\n Status string // started|progress|blocked|completed|failed\n Progress int // 0-100 for progress\n Reason string // for blocked/failed\n Message string // optional detail\n ReportedAt time.Time\n}\n```\n\n## Message Format\nSubject: \"[STATUS] \u003cissue-id\u003e: \u003cstatus\u003e\"\nBody: JSON-encoded WorkerStatusReport\n\n## Default Recipient\n```go\n// Determine from context\nfunc getDefaultRecipient() string {\n rig := os.Getenv(\"GT_RIG\")\n if rig != \"\" {\n return rig + \"/refinery\"\n }\n return \"refinery/\"\n}\n```\n\n## New File\ninternal/cmd/worker.go\n\n## PGT Reference\ngastown-py/src/gastown/cli/worker_cmd.py\n\n## Acceptance Criteria\n- [ ] All 5 commands implemented\n- [ ] Status sent as mail to refinery\n- [ ] Structured JSON body for parsing\n- [ ] Works from polecat session context","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-16T14:47:52.795695-08:00","updated_at":"2025-12-16T16:05:26.715967-08:00"}
{"id":"gt-9kc2","title":"Refinery needs manual restart/handoff mechanism","description":"Refinery sessions can get stuck or need restart. Currently requires manual intervention. Need: 1) gt refinery restart command, 2) Refinery self-handoff on context fill, 3) Auto-recovery from stuck states.","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-23T00:19:10.944679-08:00","updated_at":"2025-12-23T03:55:58.414106-08:00","closed_at":"2025-12-23T03:55:58.414106-08:00","close_reason":"Implemented gt refinery restart and gt witness restart commands. Added self-cycling docs to refinery template. Filed gt-zxgu for shell loop removal (separate concern)."}
{"id":"gt-9lx4","title":"generate-summary","description":"Generate a summary for molecule squash.\nFile any remaining work as issues.\n\nDocument any important context for the squash digest.\n\nDepends: submit-merge","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-21T21:48:26.322644-08:00","updated_at":"2025-12-21T21:48:26.322644-08:00","dependencies":[{"issue_id":"gt-9lx4","depends_on_id":"gt-i4lo","type":"parent-child","created_at":"2025-12-21T21:48:26.330177-08:00","created_by":"stevey"},{"issue_id":"gt-9lx4","depends_on_id":"gt-0s99","type":"blocks","created_at":"2025-12-21T21:48:26.330703-08:00","created_by":"stevey"}],"wisp":true}
{"id":"gt-9m9g","title":"Refinery startup: Use Claude agent instead of foreground mode","description":"WIP found in stash: Refactor refinery startup to spawn Claude as the refinery agent rather than using gt refinery start --foreground.\n\nChanges needed:\n- Use refineryDir (refinery/rig) as working directory\n- Start Claude with --dangerously-skip-permissions \n- Wait for shell ready, then Claude ready\n- Send gt prime, then refinery startup prompt\n- Remove foreground mode complexity\n\nRelated: gt-n7z7 (refinery --foreground race condition bug)","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-20T13:35:04.300493-08:00","updated_at":"2025-12-20T13:35:04.300493-08:00"}
{"id":"gt-9mb","title":"Recreate beads rigs with fresh clones","description":"## Problem\n\nBeads rigs have schema mismatches (missing thread_id column, etc.) from development iteration.\n\n## Tasks\n\n1. Shut down any active polecats\n2. Delete existing beads rigs: mayor/rig, refinery/rig, witness/rig, crew/*\n3. Re-clone from beads repo\n4. Run bd init in each new clone\n\n## Rigs to recreate\n\n- /Users/stevey/gt/beads/mayor/rig\n- /Users/stevey/gt/beads/refinery/rig\n- /Users/stevey/gt/beads/crew/* (if any)\n\n## Source\n\nClone from beads repo (need to confirm remote URL)","status":"closed","priority":0,"issue_type":"task","created_at":"2025-12-18T19:13:32.208448-08:00","updated_at":"2025-12-18T19:16:27.096311-08:00","closed_at":"2025-12-18T19:16:27.096311-08:00"}
{"id":"gt-9mgn","title":"Digest: mol-deacon-patrol @ 2025-12-24 19:25","description":"Patrol 10: quiet","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T19:25:35.360033-08:00","updated_at":"2025-12-24T19:25:35.360033-08:00","closed_at":"2025-12-24T19:25:35.359975-08:00","close_reason":"Squashed from wisp gt-68u (9 issues)"}
@@ -347,8 +337,6 @@
{"id":"gt-a95","title":"Refinery background daemon mode","description":"Refinery currently only works in foreground mode. Background daemon is stubbed.\n\n## Current State\nmanager.go line 128-129:\n```go\n// Background mode: spawn a new process\n// For MVP, we just mark as running - actual daemon implementation in gt-ov2\nreturn nil\n```\n\n## Requirements\n\n### 1. Background Process Spawning\n```go\nfunc (m *Manager) Start(foreground bool) error {\n if !foreground {\n // Spawn gt refinery start --foreground as subprocess\n cmd := exec.Command(os.Args[0], \"refinery\", \"start\", m.rig.Name, \"--foreground\")\n cmd.Start() // Don't wait\n // Record PID\n }\n}\n```\n\n### 2. PID File Management\n- Write PID to .gastown/refinery.pid\n- Check PID validity on status\n- Clean up stale PID files\n\n### 3. Log Output\n- Redirect stdout/stderr to .gastown/refinery.log\n- Log rotation (optional for MVP)\n\n### 4. Graceful Shutdown\n- Handle SIGTERM/SIGINT\n- Complete current merge before exit\n- Update state to stopped\n\n### 5. Health Check\n- Process existence check via kill -0\n- Optional: heartbeat file with timestamp\n\n## Files to Modify\n- internal/refinery/manager.go: Start(), Status(), process spawning\n\n## Acceptance Criteria\n- [ ] gt refinery start \u003crig\u003e spawns background process\n- [ ] gt refinery status shows running with PID\n- [ ] gt refinery stop sends SIGTERM and waits\n- [ ] Logs written to .gastown/refinery.log\n- [ ] Survives terminal close","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-16T14:46:53.366619-08:00","updated_at":"2025-12-19T15:24:39.124789-08:00","closed_at":"2025-12-19T14:47:40.165105-08:00"}
{"id":"gt-a9y","title":"File locking for concurrent access","description":"Add file locking for concurrent access safety.\n\n## At-Risk Files\n- .gastown/swarms.json (or per-swarm state.json)\n- .gastown/refinery.json\n- polecats/\u003cname\u003e/state.json\n- inbox.jsonl files\n\n## Go File Locking\nUse syscall.Flock for advisory locking:\n```go\ntype FileLock struct {\n file *os.File\n}\n\nfunc AcquireLock(path string, timeout time.Duration) (*FileLock, error) {\n f, err := os.OpenFile(path+\".lock\", os.O_CREATE|os.O_RDWR, 0644)\n if err != nil {\n return nil, err\n }\n // Use syscall.Flock with timeout\n}\n\nfunc (l *FileLock) Release() error\n```\n\n## Integration Pattern\n```go\nfunc (m *Manager) saveState(ref *Refinery) error {\n lock, err := AcquireLock(m.stateFile(), 5*time.Second)\n if err != nil {\n return fmt.Errorf(\"could not acquire lock: %w\", err)\n }\n defer lock.Release()\n \n // Read-modify-write cycle\n}\n```\n\n## New Package\ninternal/filelock/\n├── lock.go # FileLock, AcquireLock\n└── lock_test.go\n\n## Apply To\n- internal/refinery/manager.go: loadState/saveState\n- internal/cmd/swarm.go: SwarmStore\n- internal/mail/mailbox.go: Append, rewrite\n- internal/polecat/manager.go: state operations\n\n## Timeout Handling\nDefault 5 second timeout. Return error if lock not acquired.\n\n## Acceptance Criteria\n- [ ] Lock files created (.lock extension)\n- [ ] Timeout on lock contention\n- [ ] All state files protected\n- [ ] Locks released on error paths","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-16T14:48:15.641938-08:00","updated_at":"2025-12-16T16:06:32.441426-08:00"}
{"id":"gt-abfu","title":"Polecat template: simplify completion section to just 'gt done'","description":"Completion section lists multiple options (gt done, gt handoff, bd sync). Should just say 'gt done' with succinct guidance on when bd sync is needed. Remove the alternatives that cause confusion.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T16:56:48.024442-08:00","updated_at":"2025-12-23T17:09:02.125352-08:00","closed_at":"2025-12-23T17:09:02.125352-08:00","close_reason":"Completed in commit 1931ec7","dependencies":[{"issue_id":"gt-abfu","depends_on_id":"gt-t9u7","type":"parent-child","created_at":"2025-12-23T16:57:16.45135-08:00","created_by":"daemon"}]}
{"id":"gt-ac5v","title":"health-scan","description":"Ping Witnesses and Refineries. Run gt status --health. Remediate if down.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T17:51:45.436913-08:00","updated_at":"2025-12-23T04:40:34.014779-08:00","closed_at":"2025-12-23T04:40:34.014779-08:00","close_reason":"Parent gt-hbnz closed (duplicate mol-deacon-patrol)","dependencies":[{"issue_id":"gt-ac5v","depends_on_id":"gt-hbnz","type":"parent-child","created_at":"2025-12-21T17:51:45.438923-08:00","created_by":"stevey"}],"wisp":true}
{"id":"gt-adc9","title":"implement","description":"Implement the solution for gt-qwyu. Follow codebase conventions.\nFile discovered work as new issues with bd create.\n\nMake regular commits with clear messages.\nKeep changes focused on the assigned issue.\n\nDepends: load-context","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T21:58:52.599953-08:00","updated_at":"2025-12-21T21:59:10.939807-08:00","closed_at":"2025-12-21T21:59:10.939807-08:00","close_reason":"test cleanup","dependencies":[{"issue_id":"gt-adc9","depends_on_id":"gt-q6hl","type":"parent-child","created_at":"2025-12-21T21:58:52.601414-08:00","created_by":"stevey"},{"issue_id":"gt-adc9","depends_on_id":"gt-leeb","type":"blocks","created_at":"2025-12-21T21:58:52.601977-08:00","created_by":"stevey"}],"wisp":true}
{"id":"gt-aedd","title":"Polecat template: fix hard-to-parse sentence about persistence","description":"This sentence is hard to parse: 'When in doubt, prefer bd—persistence you don't need beats lost context'. Rewrite for clarity, e.g., 'When in doubt, use bd for tracking - unnecessary persistence is better than lost context.'","status":"closed","priority":3,"issue_type":"bug","created_at":"2025-12-23T16:56:53.99389-08:00","updated_at":"2025-12-23T17:09:08.929035-08:00","closed_at":"2025-12-23T17:09:08.929035-08:00","close_reason":"Not found - sentence does not exist in templates","dependencies":[{"issue_id":"gt-aedd","depends_on_id":"gt-t9u7","type":"parent-child","created_at":"2025-12-23T16:57:16.69287-08:00","created_by":"daemon"}]}
{"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"}
@@ -377,7 +365,6 @@
{"id":"gt-bd02.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-bd02\nbonded_ref: arm-toast\nbonded_at: 2025-12-23T10:00:00Z\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T22:06:07.039702-08:00","updated_at":"2025-12-23T22:06:07.223599-08:00","closed_at":"2025-12-23T22:06:07.223599-08:00","close_reason":"Closed","dependencies":[{"issue_id":"gt-bd02.1","depends_on_id":"gt-bd02","type":"parent-child","created_at":"2025-12-23T22:06:07.040075-08:00","created_by":"daemon"}]}
{"id":"gt-bd2l","title":"Witness tmux status: show polecat count under management","description":"Add witness-specific status line showing:\n- Number of polecats under management\n- Active/idle status\n- Maybe: last nudge time, blocked count\n\nImplement in runWitnessStatusLine() in internal/cmd/statusline.go","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-21T15:40:29.482141-08:00","updated_at":"2025-12-21T15:47:49.492436-08:00","closed_at":"2025-12-21T15:47:49.492436-08:00","close_reason":"Implemented status line functions for witness and refinery"}
{"id":"gt-beqp","title":"Merge: gt-72so","description":"branch: polecat/Doof\ntarget: main\nsource_issue: gt-72so\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-19T16:19:11.814962-08:00","updated_at":"2025-12-19T18:26:14.103556-08:00","closed_at":"2025-12-19T17:47:03.61793-08:00"}
{"id":"gt-bf95","title":"rebase-main","description":"Rebase against main to incorporate any changes.\nResolve conflicts if needed.\n\ngit fetch origin main\ngit rebase origin/main\n\nIf there are conflicts, resolve them carefully and continue the rebase.\n\nDepends: self-review, verify-tests","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-21T21:48:26.322259-08:00","updated_at":"2025-12-21T21:48:26.322259-08:00","dependencies":[{"issue_id":"gt-bf95","depends_on_id":"gt-i4lo","type":"parent-child","created_at":"2025-12-21T21:48:26.327372-08:00","created_by":"stevey"},{"issue_id":"gt-bf95","depends_on_id":"gt-ldm4","type":"blocks","created_at":"2025-12-21T21:48:26.328498-08:00","created_by":"stevey"}],"wisp":true}
{"id":"gt-bfd","title":"Keepalive signal from bd/gt commands","description":"Every bd and gt command should touch a keepalive file to signal 'agent is alive/working'.\n\n## Implementation\n\nTouch `\u003cworkspace\u003e/.gastown/keepalive.json`:\n```json\n{\"last_command\": \"bd show gt-99m\", \"timestamp\": \"2025-12-18T13:45:00Z\"}\n```\n\n## Usage by Daemon\n\n- Fresh (\u003c 2 min) → agent is working, skip heartbeat\n- Stale (2-5 min) → might be thinking, gentle poke\n- Very stale (\u003e 5 min) → likely idle, safe to interrupt\n\n## Benefits\n\n- Zero cost (just file I/O)\n- Works during long tool calls\n- Doesn't require agent cooperation\n- Foundation for smarter backoff strategies","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-18T14:19:26.241957-08:00","updated_at":"2025-12-18T20:03:43.816952-08:00","closed_at":"2025-12-18T20:03:43.816952-08:00","dependencies":[{"issue_id":"gt-bfd","depends_on_id":"gt-99m","type":"blocks","created_at":"2025-12-18T14:19:46.407664-08:00","created_by":"daemon"}]}
{"id":"gt-bho9","title":"stderr suppression hides critical errors","description":"Multiple files set cmd.Stderr = nil:\n- prime.go\n- up.go\n- orphans.go\n- daemon.go\n\nThis hides git errors and command failures.\n\nShould capture stderr for debugging and log when errors occur,\nrather than suppressing entirely.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-24T12:51:41.108782-08:00","updated_at":"2025-12-24T12:51:41.108782-08:00","dependencies":[{"issue_id":"gt-bho9","depends_on_id":"gt-jo9n","type":"blocks","created_at":"2025-12-24T12:52:07.908317-08:00","created_by":"daemon"}]}
{"id":"gt-bi21","title":"gt sling should accept raw issues, not just molecules","description":"Currently gt sling only works with molecules. When you try to sling a raw issue:\n\n gt sling gt-9uy0 gastown/crew/max\n Error: invalid thing: issue not found\n\nOptions:\n1. Auto-wrap issues in a simple work molecule (mol-issue-work?)\n2. Create a minimal 'envelope' molecule on the fly\n3. Just pin the issue directly without a molecule wrapper\n\nThe friction of needing a molecule for every piece of work discourages using the sling mechanism for ad-hoc tasks.\n\nRelated: crew workers often want to pick up an issue without formal molecule choreography.","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-24T13:46:54.92516-08:00","updated_at":"2025-12-24T13:46:54.92516-08:00","dependencies":[{"issue_id":"gt-bi21","depends_on_id":"gt-jo9n","type":"blocks","created_at":"2025-12-24T13:47:01.221497-08:00","created_by":"daemon"}]}
@@ -395,7 +382,7 @@
{"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":"open","priority":2,"issue_type":"epic","created_at":"2025-12-23T00:19:45.521561-08:00","updated_at":"2025-12-23T00:19:45.521561-08:00","labels":["template"]}
{"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":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T00:20:08.841559-08:00","updated_at":"2025-12-23T00:20:08.841559-08:00","labels":["template"]}
{"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":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T00:20:08.841559-08:00","updated_at":"2025-12-23T00:20:08.841559-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"}]}
{"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":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T00:20:38.421986-08:00","updated_at":"2025-12-23T00:20:38.421986-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"}]}
{"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":"open","priority":2,"issue_type":"epic","created_at":"2025-12-23T00:20:57.468339-08:00","updated_at":"2025-12-23T00:20:57.468339-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"}]}
{"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":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T00:21:08.041873-08:00","updated_at":"2025-12-23T00:21:08.041873-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"}]}
@@ -406,7 +393,7 @@
{"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":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T00:22:14.671916-08:00","updated_at":"2025-12-23T00:22:14.671916-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"}]}
{"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"}
{"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"}]}
{"id":"gt-ca4v.10","title":"End of patrol cycle decision.","description":"End of patrol cycle decision.\n\nIf queue non-empty AND context LOW:\n- Burn this wisp, start fresh patrol\n- Return to inbox-check\n\nIf queue empty OR context HIGH:\n- Burn wisp with summary digest\n- Exit (daemon will respawn if needed)\n\ninstantiated_from: mol-refinery-patrol\nstep: burn-or-loop","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-22T17:13:47.988747-08:00","updated_at":"2025-12-22T17:13:47.988747-08:00","dependencies":[{"issue_id":"gt-ca4v.10","depends_on_id":"gt-ca4v","type":"parent-child","created_at":"2025-12-22T17:13:47.989088-08:00","created_by":"daemon"},{"issue_id":"gt-ca4v.10","depends_on_id":"gt-ca4v.9","type":"blocks","created_at":"2025-12-22T17:13:48.696513-08:00","created_by":"daemon"}]}
{"id":"gt-ca4v.2","title":"Fetch remote and identify polecat branches waiting.","description":"Fetch remote and identify polecat branches waiting.\n\n```bash\ngit fetch origin\ngit branch -r | grep polecat\ngt refinery queue \u003crig\u003e\n```\n\nIf queue empty, skip to context-check step.\nTrack branch list for this cycle.\n\ninstantiated_from: mol-refinery-patrol\nstep: queue-scan","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-22T17:13:47.345738-08:00","updated_at":"2025-12-22T17:13:47.345738-08:00","dependencies":[{"issue_id":"gt-ca4v.2","depends_on_id":"gt-ca4v","type":"parent-child","created_at":"2025-12-22T17:13:47.346064-08:00","created_by":"daemon"},{"issue_id":"gt-ca4v.2","depends_on_id":"gt-ca4v.1","type":"blocks","created_at":"2025-12-22T17:13:48.062679-08:00","created_by":"daemon"}]}
{"id":"gt-ca4v.3","title":"Pick next branch. Rebase on current main.","description":"Pick next branch. Rebase on current main.\n\n```bash\ngit checkout -b temp origin/\u003cpolecat-branch\u003e\ngit rebase origin/main\n```\n\nIf rebase conflicts and unresolvable:\n- git rebase --abort\n- Notify polecat to fix and resubmit\n- Skip to loop-check for next branch\n\ninstantiated_from: mol-refinery-patrol\nstep: process-branch","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-22T17:13:47.425895-08:00","updated_at":"2025-12-22T17:13:47.425895-08:00","dependencies":[{"issue_id":"gt-ca4v.3","depends_on_id":"gt-ca4v","type":"parent-child","created_at":"2025-12-22T17:13:47.426246-08:00","created_by":"daemon"},{"issue_id":"gt-ca4v.3","depends_on_id":"gt-ca4v.2","type":"blocks","created_at":"2025-12-22T17:13:48.141331-08:00","created_by":"daemon"}]}
@@ -479,7 +466,6 @@
{"id":"gt-edos","title":"Digest: mol-deacon-patrol @ 2025-12-24 19:27","description":"Patrol 15","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T19:27:45.347605-08:00","updated_at":"2025-12-24T19:27:45.347605-08:00","closed_at":"2025-12-24T19:27:45.347523-08:00","close_reason":"Squashed from wisp gt-n7i (9 issues)"}
{"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":"closed","priority":1,"issue_type":"task","created_at":"2025-12-17T21:47:19.164342-08:00","updated_at":"2025-12-17T22:28:45.661097-08:00","closed_at":"2025-12-17T22:28:45.661097-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"}]}
{"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"}
{"id":"gt-ep7f","title":"survey-workers","description":"List polecats and categorize by status.\n\n```bash\ngt polecat list \u003crig\u003e\n```\n\nNeeds: load-state","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T01:41:54.506038-08:00","updated_at":"2025-12-23T04:39:39.657265-08:00","closed_at":"2025-12-23T04:39:39.657265-08:00","close_reason":"Parent gt-751s superseded by Christmas Ornament pattern","dependencies":[{"issue_id":"gt-ep7f","depends_on_id":"gt-751s","type":"parent-child","created_at":"2025-12-23T01:41:54.555919-08:00","created_by":"stevey"},{"issue_id":"gt-ep7f","depends_on_id":"gt-z94m","type":"blocks","created_at":"2025-12-23T01:41:54.562822-08:00","created_by":"stevey"}],"wisp":true}
{"id":"gt-eqys","title":"gt spawn: pasted work assignment needs manual Enter to start","description":"## Problem\n\nAfter `gt spawn` pastes the work assignment into Claude, the session waits for Enter.\n\n## Current Behavior\n\n1. `gt spawn gastown/Rictus --issue gt-xxx`\n2. Session starts, work is pasted\n3. Claude shows 'Pasted text #1 +53 lines' but doesn't start\n4. Must manually send Enter or attach and press Enter\n\n## Expected\n\nThe spawn should send Enter after pasting to kick off the work.\n\n## Related\n\nSame debounce issue as tmux notifications (gt-vnp9).","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-18T21:54:14.111101-08:00","updated_at":"2025-12-19T12:01:32.74364-08:00","closed_at":"2025-12-19T12:01:32.74364-08:00"}
{"id":"gt-er0u","title":"Work on ga-yp3: Polecat inbox system for reliable work as...","description":"Work on ga-yp3: Polecat inbox system for reliable work assignment. This is P1 priority. See bd show ga-yp3 for full design spec.","status":"in_progress","priority":2,"issue_type":"task","created_at":"2025-12-19T21:57:34.473056-08:00","updated_at":"2025-12-19T21:57:34.540384-08:00"}
{"id":"gt-es1i","title":"Polecat health check loop","description":"Implement the Witness health check loop:\n\nEvery 60 seconds:\n1. List active polecats (gt polecats \u003crig\u003e)\n2. For each polecat, check:\n - Is tmux session still alive?\n - Is there a state.json with recent update?\n - Has there been git activity recently?\n3. If stuck (no activity for configurable threshold):\n - First: nudge (send message asking for status)\n - Second: escalate to Mayor\n - Third: force kill after human confirmation\n\nThis is the 'health monitor' part of Witness.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T03:14:21.634932-08:00","updated_at":"2025-12-20T09:32:15.553536-08:00","closed_at":"2025-12-20T09:32:15.553536-08:00","dependencies":[{"issue_id":"gt-es1i","depends_on_id":"gt-53w6","type":"parent-child","created_at":"2025-12-20T03:14:37.235596-08:00","created_by":"daemon"},{"issue_id":"gt-es1i","depends_on_id":"gt-mxyj","type":"blocks","created_at":"2025-12-20T03:14:38.829218-08:00","created_by":"daemon"}]}
@@ -502,11 +488,10 @@
{"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":"closed","priority":1,"issue_type":"task","created_at":"2025-12-15T16:37:03.81542-08:00","updated_at":"2025-12-17T16:14:33.83426-08:00","closed_at":"2025-12-17T15:48:19.92644-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"}]}
{"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"}
{"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"}]}
{"id":"gt-f9x.8","title":"LocalConnection: Local file/exec/tmux operations","description":"LocalConnection implementation for local machine operations.\n\n## Implementation\n\n```go\ntype LocalConnection struct {\n tmux *Tmux\n}\n\nfunc NewLocalConnection() *LocalConnection\n\nfunc (c *LocalConnection) Name() string { return \"local\" }\nfunc (c *LocalConnection) IsLocal() bool { return true }\n```\n\n## File Operations\n\nDirect passthrough to os package:\n```go\nfunc (c *LocalConnection) ReadFile(path string) ([]byte, error) {\n return os.ReadFile(path)\n}\n// etc.\n```\n\n## Command Execution\n\nUses exec.Command:\n```go\nfunc (c *LocalConnection) Exec(cmd string, args ...string) ([]byte, error) {\n return exec.Command(cmd, args...).Output()\n}\n```\n\n## Tmux\n\nDelegates to Tmux wrapper:\n```go\nfunc (c *LocalConnection) TmuxNewSession(name, dir string) error {\n return c.tmux.NewSession(name, dir)\n}\n```\n\n## Notes\n\nStraightforward implementation - this is the \"baseline\" connection that SSHConnection will mirror remotely.","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-15T16:37:19.879102-08:00","updated_at":"2025-12-15T23:17:18.556669-08:00","dependencies":[{"issue_id":"gt-f9x.8","depends_on_id":"gt-f9x","type":"parent-child","created_at":"2025-12-15T16:37:19.879451-08:00","created_by":"daemon"},{"issue_id":"gt-f9x.8","depends_on_id":"gt-f9x.7","type":"blocks","created_at":"2025-12-15T16:37:36.087392-08:00","created_by":"daemon"}]}
{"id":"gt-f9x.9","title":"Machine registry: Store and manage machine configs","description":"Registry for managing remote machines in federation.\n\n## Data Model\n\n```go\ntype Machine struct {\n Name string `json:\"name\"`\n Type string `json:\"type\"` // \"local\", \"ssh\", \"gcp\"\n Host string `json:\"host\"` // for ssh: user@host\n KeyPath string `json:\"key_path\"` // SSH key path\n TownPath string `json:\"town_path\"` // Path to town on remote\n}\n```\n\n## Interface\n\n```go\ntype MachineRegistry struct {\n path string // config/federation.json\n machines map[string]*Machine\n}\n\nfunc NewMachineRegistry(configPath string) *MachineRegistry\nfunc (r *MachineRegistry) Get(name string) (*Machine, error)\nfunc (r *MachineRegistry) Add(m *Machine) error\nfunc (r *MachineRegistry) Remove(name string) error\nfunc (r *MachineRegistry) List() []*Machine\nfunc (r *MachineRegistry) Connection(name string) (Connection, error)\n```\n\n## Storage\n\nfederation.json in config/:\n```json\n{\n \"version\": 1,\n \"machines\": {\n \"local\": {\"type\": \"local\"},\n \"gcp-vm-1\": {\n \"type\": \"ssh\",\n \"host\": \"user@10.0.0.1\",\n \"key_path\": \"~/.ssh/gcp_key\",\n \"town_path\": \"/home/user/ai\"\n }\n }\n}\n```\n\n## Connection Factory\n\n```go\nfunc (r *MachineRegistry) Connection(name string) (Connection, error) {\n m := r.machines[name]\n switch m.Type {\n case \"local\":\n return NewLocalConnection(), nil\n case \"ssh\":\n return NewSSHConnection(m.Host, m.KeyPath), nil\n }\n}\n```","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-15T16:37:21.968099-08:00","updated_at":"2025-12-15T23:17:18.644857-08:00","dependencies":[{"issue_id":"gt-f9x.9","depends_on_id":"gt-f9x","type":"parent-child","created_at":"2025-12-15T16:37:21.968442-08:00","created_by":"daemon"},{"issue_id":"gt-f9x.9","depends_on_id":"gt-f9x.7","type":"blocks","created_at":"2025-12-15T16:37:36.174052-08:00","created_by":"daemon"}]}
{"id":"gt-fax0","title":"test pin fix 2","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T12:15:43.240045-08:00","updated_at":"2025-12-23T12:15:43.240045-08:00"}
{"id":"gt-fc0d","title":"self-review","description":"Review your own changes. Look for:\n- Bugs and edge cases\n- Style issues\n- Missing error handling\n- Security concerns\n\nFix any issues found before proceeding.\n\nDepends: implement","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T21:58:52.600154-08:00","updated_at":"2025-12-21T21:59:10.940985-08:00","closed_at":"2025-12-21T21:59:10.940985-08:00","close_reason":"test cleanup","dependencies":[{"issue_id":"gt-fc0d","depends_on_id":"gt-q6hl","type":"parent-child","created_at":"2025-12-21T21:58:52.60252-08:00","created_by":"stevey"},{"issue_id":"gt-fc0d","depends_on_id":"gt-adc9","type":"blocks","created_at":"2025-12-21T21:58:52.603308-08:00","created_by":"stevey"}],"wisp":true}
{"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-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":"closed","priority":2,"issue_type":"task","created_at":"2025-12-17T16:42:46.445526-08:00","updated_at":"2025-12-17T17:00:36.466742-08:00","closed_at":"2025-12-17T17:00:36.466742-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"}]}
@@ -518,6 +503,7 @@
{"id":"gt-frs","title":"Polecat name pooling: Bounded reusable names","description":"Polecats reuse names from a bounded pool (50) with overflow to sequence numbers.\n\n## Naming Scheme\n- Pool: polecat-01 through polecat-50 (prefer low numbers)\n- Overflow: \u003crigname\u003e-\u003csequenceNumber\u003e (e.g., beads-51, gastown-52)\n\n## Design\n- Witness tracks which pool names are in use\n- On spawn: pick first available from pool\n- If pool exhausted: use rigname-N format\n- On completion: pool name returns, sequence numbers don't\n\n## Why?\n- User experience: tmux sessions survive polecat restarts\n- Users stay attached, see new polecat start (like mayor respawn loop)\n- Bounded resource usage for common case\n- Scales beyond 50 when needed\n\n## Implementation\n- Witness maintains name allocation in beads or local state\n- Tmux session runs respawn loop (like mayor)\n- Name released on graceful exit or when witness detects dead session","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-18T18:32:28.43866-08:00","updated_at":"2025-12-19T17:22:52.551244-08:00","closed_at":"2025-12-19T16:29:30.648439-08:00"}
{"id":"gt-fryp","title":"Merge: gt-ih0s","description":"branch: polecat/capable\ntarget: main\nsource_issue: gt-ih0s\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-20T03:53:33.935017-08:00","updated_at":"2025-12-20T23:17:25.791409-08:00","closed_at":"2025-12-20T23:17:25.791409-08:00","close_reason":"Branches nuked, MRs obsolete"}
{"id":"gt-fuqx","title":"Merge: gt-ci84","description":"branch: polecat/slit\ntarget: main\nsource_issue: gt-ci84\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-23T19:38:21.954136-08:00","updated_at":"2025-12-24T00:18:03.075287-08:00","closed_at":"2025-12-23T23:30:30.859023-08:00"}
{"id":"gt-g086","title":"Digest: mol-deacon-patrol","description":"Patrol 2: All healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T20:55:17.018799-08:00","updated_at":"2025-12-24T20:55:17.018799-08:00","closed_at":"2025-12-24T20:55:17.018754-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-g086","depends_on_id":"gt-zfxf","type":"parent-child","created_at":"2025-12-24T20:55:17.01946-08:00","created_by":"stevey"}]}
{"id":"gt-g0cp","title":"Digest: mol-deacon-patrol","description":"Patrol OK: town quiet","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-23T02:46:38.594856-08:00","updated_at":"2025-12-23T02:46:38.594856-08:00","closed_at":"2025-12-23T02:46:38.594818-08:00","close_reason":"Squashed from 5 wisps"}
{"id":"gt-g1ud","title":"Direct test","description":"Testing direct bd create","status":"open","priority":2,"issue_type":"message","created_at":"2025-12-20T17:45:55.058067-08:00","updated_at":"2025-12-20T17:45:55.058067-08:00","labels":["from:test-sender"]}
{"id":"gt-g261","title":"generate-summary","description":"Summarize patrol cycle for digest.\n\nNeeds: save-state","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T01:41:54.507401-08:00","updated_at":"2025-12-23T04:39:39.664176-08:00","closed_at":"2025-12-23T04:39:39.664176-08:00","close_reason":"Parent gt-751s superseded by Christmas Ornament pattern","dependencies":[{"issue_id":"gt-g261","depends_on_id":"gt-751s","type":"parent-child","created_at":"2025-12-23T01:41:54.627957-08:00","created_by":"stevey"},{"issue_id":"gt-g261","depends_on_id":"gt-n9o2","type":"blocks","created_at":"2025-12-23T01:41:54.634797-08:00","created_by":"stevey"}]}
@@ -530,7 +516,6 @@
{"id":"gt-g44u.3","title":"Create mol-gastown-polecat derived molecule","description":"Create the standard Gas Town polecat workflow molecule.\n\n## Molecule Definition\n\\`\\`\\`markdown\n## Molecule: gastown-polecat\nFull workflow for Gas Town polecats including binary installation.\n\nIncludes: mol-engineer-in-box\n\n## Step: install-binary\nAfter merge is submitted, rebuild and install the local gt binary.\nThis ensures the latest code is available to all local agents.\n\nRun from the rig directory:\n\\`\\`\\`\ngo build -o gt ./cmd/gt\ngo install ./cmd/gt\n\\`\\`\\`\n\nNeeds: submit\n\\`\\`\\`\n\n## Why This Molecule\nEvery polecat that pushes to main should also rebuild the binary.\nThis ensures the installed gt is always current with main.\n\n## Implementation\n1. Add to builtin_molecules.go (after Includes support lands)\n2. Update SeedBuiltinMolecules\n3. Run gt molecule seed\n\n## Acceptance\n- [ ] mol-gastown-polecat exists\n- [ ] Includes all engineer-in-box steps\n- [ ] Adds install-binary step after submit\n- [ ] Can be used with gt spawn --molecule","status":"closed","priority":0,"issue_type":"task","created_at":"2025-12-19T15:50:12.702275-08:00","updated_at":"2025-12-19T16:14:43.859946-08:00","closed_at":"2025-12-19T16:14:43.859946-08:00","dependencies":[{"issue_id":"gt-g44u.3","depends_on_id":"gt-g44u","type":"parent-child","created_at":"2025-12-19T15:50:12.704439-08:00","created_by":"daemon"},{"issue_id":"gt-g44u.3","depends_on_id":"gt-g44u.1","type":"blocks","created_at":"2025-12-19T15:50:31.019186-08:00","created_by":"daemon"},{"issue_id":"gt-g44u.3","depends_on_id":"gt-g44u.2","type":"blocks","created_at":"2025-12-19T15:50:31.14432-08:00","created_by":"daemon"}]}
{"id":"gt-g44u.4","title":"Step recovery: timeout and release","description":"Implement recovery mechanism for stuck molecule steps.\n\n## Problem\nWhen a worker dies mid-step, the step stays in_progress forever.\nNeed timeout/release mechanism for nondeterministic idempotence.\n\n## Solution\n1. Track step start time (claimed_at timestamp)\n2. Timeout: After 30 min in_progress, step returns to pending\n3. Manual release: bd release \u003cstep-id\u003e\n\n## Implementation Options\n\n### Option A: Beads-level timeout\n- Add claimed_at field to issues\n- bd ready excludes items in_progress \u003c 30 min\n- bd ready includes items in_progress \u003e 30 min (auto-recovery)\n\n### Option B: Daemon-level timeout \n- Daemon watches in_progress items\n- Moves back to pending after timeout\n\n### Option C: Manual only (MVP)\n- bd release \u003cid\u003e manually moves in_progress → pending\n- Document recovery procedure\n- Witness can automate for polecats\n\n## Recommendation\nStart with Option C (manual) for Christmas. Add Option A later.\n\n## Acceptance\n- [ ] bd release command works\n- [ ] Stuck steps can be recovered\n- [ ] Documented recovery procedure","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T15:50:15.072833-08:00","updated_at":"2025-12-19T16:16:32.325856-08:00","closed_at":"2025-12-19T16:16:32.325856-08:00","dependencies":[{"issue_id":"gt-g44u.4","depends_on_id":"gt-g44u","type":"parent-child","created_at":"2025-12-19T15:50:15.07451-08:00","created_by":"daemon"}]}
{"id":"gt-g44u.5","title":"Spawn --molecule integration","description":"Implement gt spawn --molecule flag for molecule-based polecat workflows.\n\nUsage: gt spawn --issue gt-xyz --molecule mol-gastown-polecat\n\nBehavior:\n1. Validate molecule exists and is well-formed\n2. Create molecule instance (child beads) under the issue \n3. Find first ready step(s) in the instance\n4. Spawn polecat with first ready step as initial work\n\nImplementation:\n1. Add --molecule flag to spawn command\n2. Call molecule.Instantiate()\n3. Query ready steps from instance\n4. Pass first ready step to polecat context\n\nFiles: internal/cmd/spawn.go\n\nAcceptance:\n- --molecule flag works\n- Creates proper molecule instance\n- Polecat starts on first ready step\n- End-to-end test with actual polecat","status":"closed","priority":0,"issue_type":"task","created_at":"2025-12-19T15:50:24.519069-08:00","updated_at":"2025-12-19T16:13:10.086807-08:00","closed_at":"2025-12-19T16:13:10.086807-08:00","dependencies":[{"issue_id":"gt-g44u.5","depends_on_id":"gt-g44u","type":"parent-child","created_at":"2025-12-19T15:50:24.521029-08:00","created_by":"daemon"},{"issue_id":"gt-g44u.5","depends_on_id":"gt-g44u.1","type":"blocks","created_at":"2025-12-19T15:50:31.275526-08:00","created_by":"daemon"}]}
{"id":"gt-g844","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-test) and understand the requirements.\nIdentify any blockers or missing information.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T22:04:43.420661-08:00","updated_at":"2025-12-21T22:05:10.50027-08:00","closed_at":"2025-12-21T22:05:10.50027-08:00","close_reason":"test cleanup","dependencies":[{"issue_id":"gt-g844","depends_on_id":"gt-jvr3","type":"parent-child","created_at":"2025-12-21T22:04:43.421644-08:00","created_by":"stevey"}],"wisp":true}
{"id":"gt-gaxo","title":"ZFC Cleanup: Move Go heuristics to Deacon molecule","description":"Remove Go code that makes workflow decisions. All health checking, staleness \ndetection, nudging, and escalation belongs in the Deacon molecule where Claude \nexecutes it once per minute.\n\n## The Problem\n\nGo code currently implements polling-based health inference:\n- Daemon watches heartbeats with hardcoded thresholds\n- Decides if agents are \"stuck\" based on timestamps \n- Sends nudges, triggers restarts\n- Parses mail subjects with regex to extract intent\n\nThis is a ZFC violation. Go should be message transport, not decision-maker.\n\n## The Fix\n\nMove all health/oversight logic to Deacon patrol molecule:\n- Deacon runs once per minute\n- Claude reads molecule steps, executes them\n- Claude decides if agents are stuck (by checking mail, activity, etc.)\n- Claude sends nudges/escalations via mail\n- Go just routes messages\n\n## Scope\n\n1. daemon/daemon.go - heartbeat staleness logic\n2. daemon/backoff.go - exponential backoff decisions\n3. daemon/lifecycle.go - regex parsing of lifecycle intent\n4. keepalive/keepalive.go - staleness thresholds\n5. deacon/heartbeat.go - heartbeat age classification\n6. doctor/stale_check.go - staleness detection\n7. polecat/manager.go - state derivation from issues\n\n## Success Criteria\n\n- Go code has no hardcoded time.Duration for health decisions\n- No regex parsing of mail subjects for intent\n- No switch statements deciding agent state\n- Deacon molecule has all oversight logic\n- Go daemon is just a message router","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-23T23:58:18.684884-08:00","updated_at":"2025-12-24T00:23:53.320194-08:00","closed_at":"2025-12-24T00:23:53.320194-08:00","close_reason":"All ZFC cleanup tasks complete"}
{"id":"gt-gaxo.1","title":"Remove daemon heartbeat staleness logic","description":"**Files:** daemon/daemon.go (lines 272-325), daemon/backoff.go\n\n**Current behavior:**\n- Hardcoded 2min/5min thresholds classify agent health\n- Exponential backoff decides nudge intervals\n- Go decides \"is this agent stuck?\" based on timestamps\n\n**Fix:**\n- Remove staleness classification from Go\n- Remove backoff algorithm\n- Daemon becomes pure message router\n- Deacon molecule step checks agent health instead\n\n**Lines to remove/refactor:**\n- daemon.go:272-274 (staleness thresholds)\n- daemon.go:282-295 (poke decision logic)\n- daemon.go:317-325 (conditional nudging)\n- backoff.go:108-120 (backoff calculations)","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T23:59:00.146652-08:00","updated_at":"2025-12-24T00:05:44.186939-08:00","closed_at":"2025-12-24T00:05:44.186939-08:00","dependencies":[{"issue_id":"gt-gaxo.1","depends_on_id":"gt-gaxo","type":"parent-child","created_at":"2025-12-23T23:59:00.147277-08:00","created_by":"daemon"}]}
{"id":"gt-gaxo.2","title":"Remove keepalive/heartbeat staleness thresholds","description":"**Files:** \n- keepalive/keepalive.go (lines 94-111)\n- deacon/heartbeat.go (lines 88-108)\n\n**Current behavior:**\n- Hardcoded thresholds: 2min=fresh, 5min=stale, 15min=very stale\n- Used by daemon to decide whether to poke agents\n- Go classifies agent responsiveness\n\n**Fix:**\n- Remove all hardcoded time.Duration thresholds\n- Keepalive becomes pure timestamp storage\n- Deacon molecule step does health assessment:\n \"Check if Witness responded in last N minutes\" (N from mol config)\n\n**Lines to remove:**\n- keepalive.go:96-110 (classification logic)\n- heartbeat.go:91-107 (age classification)","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T23:59:02.956489-08:00","updated_at":"2025-12-24T00:05:44.309675-08:00","closed_at":"2025-12-24T00:05:44.309675-08:00","dependencies":[{"issue_id":"gt-gaxo.2","depends_on_id":"gt-gaxo","type":"parent-child","created_at":"2025-12-23T23:59:02.957013-08:00","created_by":"daemon"}]}
@@ -550,13 +535,12 @@
{"id":"gt-h1n5","title":"Witness patrol: Add banners and wisp-based execution","description":"Bring Witness patrol up to Deacon's level of sophistication:\n\n## Current state\n- mol-witness-patrol exists (gt-qflq)\n- Basic step definitions\n\n## Needed\n1. **Banners** - Print step banners like Deacon does:\n ```\n ═══════════════════════════════════════════════════════════════\n 👁️ POLECAT-SCAN\n Checking polecat health and nudging stale workers\n ═══════════════════════════════════════════════════════════════\n ```\n\n2. **Wisp-based execution** - Spawn patrol as wisp, squash when complete\n3. **Handoff bead attachment** - Witness 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.503122-08:00","updated_at":"2025-12-24T00:18:03.016743-08:00","closed_at":"2025-12-23T19:37:33.432323-08:00","close_reason":"Implemented in witness.md.tmpl: banners, wisp-based execution, handoff bead attachment, loop-or-exit, patrol summary","dependencies":[{"issue_id":"gt-h1n5","depends_on_id":"gt-y481","type":"parent-child","created_at":"2025-12-23T13:20:15.684048-08:00","created_by":"daemon"}]}
{"id":"gt-h262","title":"bd ready --blockers: prioritize issues that block other work","description":"bd ready should prioritize issues that are blocking other work.\n\n**From VC**: Blocker-first prioritization in GetReadyWork(). ~100 lines.\nAlgorithm: baseline-failure first, then discovered:blocker, then by priority.\n\n**Gas Town implementation**: CLI flag or default behavior:\n```bash\nbd ready --blockers-first # Or make this default\n```\n\nChecks dependency graph. Issues with many dependents surface first.\n\n**Value**: Unblocks parallelism faster. Critical path gets cleared.\n\n**VC lesson**: Without blocker priority, work can starve on discovered issues.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-20T20:30:18.426957-08:00","updated_at":"2025-12-20T20:30:18.426957-08:00","dependencies":[{"issue_id":"gt-h262","depends_on_id":"gt-zhpa","type":"parent-child","created_at":"2025-12-20T20:30:27.664473-08:00","created_by":"daemon"}]}
{"id":"gt-h28m","title":"Deacon patrol banners: visual feedback on atom transitions","description":"Print large ASCII banners when transitioning between patrol atoms.\n\n## Problem\n\nWhen the deacon progresses through patrol atoms (steps), there is no visual feedback.\nThe operator cannot easily see what the deacon is doing without reading the full output.\n\n## Desired Behavior\n\nPrint banners on step start and completion:\n\n INBOX-CHECK - Checking for lifecycle requests, escalations, timers\n INBOX-CHECK COMPLETE - Processed 3 messages, 0 lifecycle requests\n\n## Benefits\n\n1. Scanability: Operator can glance at tmux and see what is happening\n2. Progress tracking: Easy to see where in the patrol loop we are\n3. Debugging: Clear demarcation between steps for troubleshooting\n\n## Implementation Options\n\n1. In deacon CLAUDE.md: Instruct agent to print banners\n2. gt patrol step start/end: Commands that print banners\n3. bd mol step hooks: Automatically on step transitions\n\n## Related\n\n- gt-id36: Deacon Kernel\n- gt-rana: Patrol System","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-22T03:04:14.290474-08:00","updated_at":"2025-12-22T14:54:55.972256-08:00","closed_at":"2025-12-22T14:54:55.972256-08:00","close_reason":"Implemented in deacon.md.tmpl - startup banner, step banners with emojis, cycle summary banner. Commit 8f47c92."}
{"id":"gt-h2dc","title":"request-shutdown","description":"Send shutdown request to Witness.\nWait for termination.\n\nThe polecat is now ready to be cleaned up.\nDo not exit directly - wait for Witness to kill the session.\n\nDepends: generate-summary","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T22:04:43.421327-08:00","updated_at":"2025-12-21T22:05:10.503573-08:00","closed_at":"2025-12-21T22:05:10.503573-08:00","close_reason":"test cleanup","dependencies":[{"issue_id":"gt-h2dc","depends_on_id":"gt-jvr3","type":"parent-child","created_at":"2025-12-21T22:04:43.424974-08:00","created_by":"stevey"}],"wisp":true}
{"id":"gt-h5e0","title":"Patrol hygiene: Witness/Refinery/Deacon inbox cleanup","description":"## Summary\nPatrol roles should clean up their inboxes as part of normal operation, not let messages accumulate.\n\n## Witness Patrol Cleanup\n- POLECAT_STARTED: archive after acknowledging\n- POLECAT_DONE: archive after cleanup complete\n- LIFECYCLE requests: archive after processing\n- Keep only: active work, unprocessed requests\n\n## Refinery Patrol Cleanup \n- MR Ready: archive after merge/reject decision\n- Swarm notices: archive after dispatch\n- Keep only: pending MRs in queue\n\n## Deacon Patrol Cleanup\n- Rotate daemon.log when \u003e10MB\n- Prune state.json of dead sessions\n- Archive old daemon logs (gzip, date-suffix)\n\n## Implementation\nEach patrol molecule should have a 'cleanup' phase at end of cycle.\n\n## Related\n- mol-town-shutdown (nuclear cleanup)\n- mol-witness-patrol, mol-refinery-patrol, mol-deacon-patrol","status":"open","priority":1,"issue_type":"feature","created_at":"2025-12-24T17:25:47.860346-08:00","updated_at":"2025-12-24T17:25:47.860346-08:00"}
{"id":"gt-h5n","title":"Merge Queue in Beads: Universal chit system for all work","description":"\n\n**Design doc**: docs/merge-queue-design.md","status":"open","priority":0,"issue_type":"epic","created_at":"2025-12-16T23:01:45.782171-08:00","updated_at":"2025-12-17T13:43:43.211867-08:00"}
{"id":"gt-h5n.1","title":"MR field parsing: extract structured fields from description","description":"Parse merge-request beads to extract structured fields:\n- branch: source branch name\n- target: target branch (main or integration/xxx)\n- source_issue: the work item being merged\n- worker: who did the work\n- rig: which rig\n- merge_commit: (set on close)\n- close_reason: (set on close)\n\nFields stored in description as YAML block or key: value lines.\nProvide helper functions: ParseMRFields(issue) and SetMRFields(issue, fields).\n\nReference: docs/merge-queue-design.md#merge-request-schema","status":"closed","priority":0,"issue_type":"task","created_at":"2025-12-17T13:47:46.682379-08:00","updated_at":"2025-12-18T18:50:42.591901-08:00","closed_at":"2025-12-18T11:46:18.970805-08:00","dependencies":[{"issue_id":"gt-h5n.1","depends_on_id":"gt-h5n","type":"parent-child","created_at":"2025-12-17T13:47:46.682911-08:00","created_by":"daemon"}]}
{"id":"gt-h5n.10","title":"Auto-rebase on conflict: optional automatic rebase","description":"Implement automatic rebase as conflict resolution option.\n\nWhen on_conflict=auto_rebase and conflicts detected:\n1. Attempt: git rebase \u003ctarget\u003e \u003csource-branch\u003e\n2. If clean rebase: update source branch, continue merge\n3. If conflicts in rebase: abort, fall back to assign_back\n4. Force push rebased branch (worker's branch)\n\nRequires:\n- Worker branch must be force-pushable\n- Config: on_conflict: auto_rebase\n\nRisks:\n- Force push can confuse workers\n- Complex conflicts still need manual resolution\n\nReference: docs/merge-queue-design.md#conflict-resolution-strategies","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-17T13:52:26.397214-08:00","updated_at":"2025-12-17T13:52:26.397214-08:00","dependencies":[{"issue_id":"gt-h5n.10","depends_on_id":"gt-h5n","type":"parent-child","created_at":"2025-12-17T13:52:26.399236-08:00","created_by":"daemon"},{"issue_id":"gt-h5n.10","depends_on_id":"gt-3x1.4","type":"blocks","created_at":"2025-12-17T13:53:23.158089-08:00","created_by":"daemon"}]}
{"id":"gt-h5n.11","title":"Retry logic: exponential backoff for transient failures","description":"Implement retry logic for transient failures.\n\nRetryable failures:\n- Push failed (network, auth transient)\n- Test flaky (config: retry_flaky_tests)\n- Fetch failed (network)\n\nRetry strategy:\n- Max retries: 3 (configurable)\n- Backoff: 1s, 2s, 4s (exponential)\n- On final failure: treat as permanent, assign back\n\nNon-retryable failures:\n- Merge conflict\n- Test consistently fails\n- Build error\n\nTrack retry count in MR metadata for debugging.\n\nReference: docs/merge-queue-design.md#failure-recovery","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-17T13:52:28.300658-08:00","updated_at":"2025-12-17T13:52:28.300658-08:00","dependencies":[{"issue_id":"gt-h5n.11","depends_on_id":"gt-h5n","type":"parent-child","created_at":"2025-12-17T13:52:28.302268-08:00","created_by":"daemon"},{"issue_id":"gt-h5n.11","depends_on_id":"gt-3x1.4","type":"blocks","created_at":"2025-12-17T13:53:23.277535-08:00","created_by":"daemon"}]}
{"id":"gt-h5n.12","title":"MQ metrics: pending count, processing time, success rate","description":"Implement merge queue metrics collection.\n\nMetrics to track:\n- mq_pending_count: MRs waiting\n- mq_processing_time: Time from submit to merge (histogram)\n- mq_success_rate: Merges vs rejections\n- mq_conflict_rate: How often conflicts occur\n- mq_test_failure_rate: Test failures\n\nStorage options:\n- Simple: JSON file with rolling stats\n- Advanced: Prometheus-compatible metrics endpoint\n\nDisplay via:\n- gt mq stats: summary statistics\n- Dashboard widget (separate task)\n\nReference: docs/merge-queue-design.md#observability","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-17T13:52:30.716666-08:00","updated_at":"2025-12-17T13:52:30.716666-08:00","dependencies":[{"issue_id":"gt-h5n.12","depends_on_id":"gt-3x1.5","type":"blocks","created_at":"2025-12-17T13:53:23.392465-08:00","created_by":"daemon"}]}
{"id":"gt-h5n.12","title":"MQ metrics: pending count, processing time, success rate","description":"Implement merge queue metrics collection.\n\nMetrics to track:\n- mq_pending_count: MRs waiting\n- mq_processing_time: Time from submit to merge (histogram)\n- mq_success_rate: Merges vs rejections\n- mq_conflict_rate: How often conflicts occur\n- mq_test_failure_rate: Test failures\n\nStorage options:\n- Simple: JSON file with rolling stats\n- Advanced: Prometheus-compatible metrics endpoint\n\nDisplay via:\n- gt mq stats: summary statistics\n- Dashboard widget (separate task)\n\nReference: docs/merge-queue-design.md#observability","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-17T13:52:30.716666-08:00","updated_at":"2025-12-17T13:52:30.716666-08:00","dependencies":[{"issue_id":"gt-h5n.12","depends_on_id":"gt-h5n","type":"parent-child","created_at":"2025-12-17T13:52:30.718745-08:00","created_by":"daemon"},{"issue_id":"gt-h5n.12","depends_on_id":"gt-3x1.5","type":"blocks","created_at":"2025-12-17T13:53:23.392465-08:00","created_by":"daemon"}]}
{"id":"gt-h5n.13","title":"MQ dashboard widget: queue status in TUI","description":"Add merge queue status widget to the Bubbletea TUI dashboard.\n\nDisplay:\n┌─────────────────────────────────────────────────┐\n│ MERGE QUEUE STATUS │\n├─────────────────────────────────────────────────┤\n│ Pending: 3 In Progress: 1 Merged (24h): 12 │\n├─────────────────────────────────────────────────┤\n│ QUEUE: │\n│ ► gt-mr-004 P0 Nux/gt-xyz Processing... │\n│ gt-mr-005 P1 Toast/gt-abc Ready │\n│ gt-mr-006 P1 Capable/gt-def Blocked (005) │\n└─────────────────────────────────────────────────┘\n\nInteractive features:\n- Navigate queue entries\n- View MR details\n- Retry/reject from dashboard\n\nDepends on: gt-u1j.2 (Bubbletea TUI dashboard)\n\nReference: docs/merge-queue-design.md#dashboard","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-17T13:52:34.770778-08:00","updated_at":"2025-12-17T13:52:34.770778-08:00","dependencies":[{"issue_id":"gt-h5n.13","depends_on_id":"gt-h5n","type":"parent-child","created_at":"2025-12-17T13:52:34.772838-08:00","created_by":"daemon"},{"issue_id":"gt-h5n.13","depends_on_id":"gt-u1j.2","type":"blocks","created_at":"2025-12-17T13:53:23.509566-08:00","created_by":"daemon"},{"issue_id":"gt-h5n.13","depends_on_id":"gt-h5n.12","type":"blocks","created_at":"2025-12-17T13:53:23.628668-08:00","created_by":"daemon"}]}
{"id":"gt-h5n.14","title":"Direct landing integration: gt land uses MR or bypasses","description":"Integrate direct landing with merge queue.\n\n'gt land --direct' should:\n1. Check if MR exists for the polecat's work\n2. If MR exists: process it directly (skip queue)\n3. If no MR: create temporary MR, process, close\n\nOptions:\n- --direct: bypass queue (existing)\n- --via-queue: ensure goes through queue (new)\n- --force: skip safety checks (existing)\n\nThis ensures direct landing still creates proper records.\n\nReference: docs/merge-queue-design.md#direct-landing-bypass-queue","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-17T13:52:48.952108-08:00","updated_at":"2025-12-17T13:52:48.952108-08:00","dependencies":[{"issue_id":"gt-h5n.14","depends_on_id":"gt-h5n","type":"parent-child","created_at":"2025-12-17T13:52:48.954874-08:00","created_by":"daemon"},{"issue_id":"gt-h5n.14","depends_on_id":"gt-3x1.5","type":"blocks","created_at":"2025-12-17T13:53:23.744413-08:00","created_by":"daemon"}]}
{"id":"gt-h5n.15","title":"Rollback support: gt mq revert for problematic merges","description":"Implement 'gt mq revert \u003cmr-id\u003e' for rolling back merges.\n\nActions:\n1. Find merge commit from closed MR\n2. Create revert commit: git revert \u003cmerge-commit\u003e\n3. Push revert to target branch\n4. Create 'reverted' MR tracking the revert\n5. Optionally reopen source issue\n\nOptions:\n- --reason REASON: required explanation\n- --reopen-issue: reopen the source work item\n\nTrack revert in MR metadata for audit trail.\n\nReference: docs/merge-queue-design.md#open-questions","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-17T13:52:51.440782-08:00","updated_at":"2025-12-17T13:52:51.440782-08:00","dependencies":[{"issue_id":"gt-h5n.15","depends_on_id":"gt-h5n","type":"parent-child","created_at":"2025-12-17T13:52:51.442642-08:00","created_by":"daemon"},{"issue_id":"gt-h5n.15","depends_on_id":"gt-3x1.5","type":"blocks","created_at":"2025-12-17T13:53:23.862389-08:00","created_by":"daemon"}]}
@@ -580,7 +564,6 @@
{"id":"gt-h6eq.9","title":"Update role prompts with hook protocol","description":"Update role prompt templates to include hook-first protocol.\n\nTemplates to update:\n- polecat.md.tmpl\n- deacon.md.tmpl \n- witness.md.tmpl\n- refinery.md.tmpl\n- crew.md.tmpl\n\nEach should include:\n1. Check hook first (gt mol status)\n2. If empty, check mail for attached work\n3. Self-pin protocol if needed","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T05:07:16.952787-08:00","updated_at":"2025-12-23T12:22:35.984781-08:00","closed_at":"2025-12-23T12:22:35.984781-08:00","close_reason":"Completed and merged to main in gt-h6eq swarm","dependencies":[{"issue_id":"gt-h6eq.9","depends_on_id":"gt-h6eq","type":"parent-child","created_at":"2025-12-23T05:07:16.954371-08:00","created_by":"daemon"}]}
{"id":"gt-h8ye","title":"session-gc","description":"Clean dead sessions. Run gt gc --sessions.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T13:14:35.794672-08:00","updated_at":"2025-12-23T13:14:35.794672-08:00"}
{"id":"gt-hbg5","title":"Cross-project dependency workflow (Gas Town side)","description":"Gas Town integration for cross-project dependencies.\n\n## Components\n- gt-zniu: gt park command (park molecule on external dep)\n- gt-in3x: gt spawn --continue (resume parked molecule)\n- gt-5uf3: Patrol auto-resume (future)\n\n## Design Doc\nSee: docs/cross-project-deps.md\n\n## Depends on Beads\n- bd-h807: Cross-project dependency support (epic)\n\n## Launch Plan\nPhase 1 (launch): gt park + gt spawn --continue (manual resume)\nPhase 2 (later): Patrol auto-resume","status":"open","priority":2,"issue_type":"epic","created_at":"2025-12-21T22:39:36.395383-08:00","updated_at":"2025-12-21T22:39:36.395383-08:00"}
{"id":"gt-hbnz","title":"mol-deacon-patrol","description":"Deacon patrol molecule template. Label: template","status":"closed","priority":2,"issue_type":"epic","assignee":"deacon","created_at":"2025-12-21T17:51:45.436236-08:00","updated_at":"2025-12-23T04:40:26.763694-08:00","closed_at":"2025-12-23T04:40:26.763694-08:00","close_reason":"mol-deacon-patrol already implemented in gt-rana.3. These are stale template duplicates.","wisp":true}
{"id":"gt-hcc0","title":"gt polecat remove --all: bulk polecat teardown","description":"Currently gt polecat remove only accepts one polecat at a time. Need bulk operations:\n\n## Requested\n- `gt polecat remove gastown --all` - remove all polecats from a rig\n- `gt polecat remove gastown/A gastown/B ...` - remove multiple by name\n\n## Context\nAfter a swarm completes, tearing down 20 polecats one at a time is tedious.\nEphemeral workers should be easy to create and destroy in bulk.\n\n## Related\n- gt-c92: CLI: all command for batch polecat operations","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-19T14:06:43.892225-08:00","updated_at":"2025-12-20T13:16:06.901839-08:00","closed_at":"2025-12-20T13:16:06.901839-08:00"}
{"id":"gt-hcsz","title":"Track merge requests as beads (type=merge-request)","description":"Currently MRs are tracked in .gastown/refinery.json. For HOP audit trail and entity CV tracking, merge requests should be Beads entries with type=merge-request. This enables:\n- Full audit trail of what was merged, when, by whom\n- Entity chain contributions (who validated what)\n- Cross-rig visibility of merge activity\n\nThe refinery would create an MR bead when work enters the queue, update status as it progresses (open → in_progress → merged/rejected).\n\nPart of Beads-as-data-plane vision from HOP.","status":"open","priority":4,"issue_type":"feature","created_at":"2025-12-21T22:07:28.836388-08:00","updated_at":"2025-12-21T22:07:28.836388-08:00"}
{"id":"gt-hgk","title":"Mail system: message types and threading","description":"GGT mail system needs message types and threading like PGT.\n\n## 1. Message Types\nAdd to internal/mail/types.go:\n```go\ntype MessageType string\nconst (\n TypeTask MessageType = \"task\" // Required processing\n TypeScavenge MessageType = \"scavenge\" // Optional first-come work\n TypeNotification MessageType = \"notification\" // Informational\n TypeReply MessageType = \"reply\" // Response to message\n)\n\n// Update Message struct\ntype Message struct {\n // existing fields...\n Type MessageType `json:\"type\"`\n ThreadID string `json:\"thread_id,omitempty\"`\n ReplyTo string `json:\"reply_to,omitempty\"`\n}\n```\n\n## 2. Priority Levels\nExpand from 2 to 4:\n```go\ntype Priority string\nconst (\n PriorityLow Priority = \"low\"\n PriorityNormal Priority = \"normal\"\n PriorityHigh Priority = \"high\"\n PriorityUrgent Priority = \"urgent\"\n)\n```\n\n## 3. CLI Updates\ninternal/cmd/mail.go:\n- Add --type flag to send: `gt mail send ... --type task`\n- Add --reply-to flag: `gt mail send ... --reply-to \u003cmsg-id\u003e`\n- Add thread command: `gt mail thread \u003cthread-id\u003e`\n\n## 4. Threading Logic\nNewMessage() should auto-generate thread_id if not a reply.\nReply messages inherit thread_id from original.\n\n## Files to Modify\n- internal/mail/types.go: Add types, expand Priority\n- internal/mail/mailbox.go: Thread filtering\n- internal/cmd/mail.go: CLI flags and thread command\n\n## PGT Reference\ngastown-py/src/gastown/mail/message.py\n\n## Acceptance Criteria\n- [ ] Messages have type field (default: notification)\n- [ ] 4 priority levels supported\n- [ ] Reply creates thread with shared thread_id\n- [ ] gt mail thread \u003cid\u003e shows conversation","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-16T14:46:55.29463-08:00","updated_at":"2025-12-18T20:14:28.308997-08:00","closed_at":"2025-12-18T20:14:28.308997-08:00"}
@@ -598,7 +581,6 @@
{"id":"gt-hzr","title":"gt witness: Witness management commands","description":"Add 'gt witness' command group for witness lifecycle management.\n\nSubcommands:\n- gt witness start [rig] - Start witness for a rig\n- gt witness stop [rig] - Stop witness\n- gt witness status [rig] - Show witness status\n- gt witness attach [rig] - Attach to witness session\n\nWitness monitors polecats and handles:\n- Idle detection and cleanup\n- Session health checks\n- Nudging stuck agents","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-17T21:47:32.210917-08:00","updated_at":"2025-12-19T12:05:27.343254-08:00","closed_at":"2025-12-19T12:05:27.343254-08:00","dependencies":[{"issue_id":"gt-hzr","depends_on_id":"gt-hw6","type":"blocks","created_at":"2025-12-17T22:23:42.955006-08:00","created_by":"daemon"}]}
{"id":"gt-i4i2","title":"Update deacon.md.tmpl with correct molecule commands","description":"The deacon prompt references commands that don't exist:\n- gt mol bond → should be bd mol run or gt mol arm\n- gt mol status → needs gt mol command tree first\n\nUpdate after gt mol command tree is implemented.\n\nDepends on: gt mol command tree issue","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-22T13:12:26.401739-08:00","updated_at":"2025-12-22T13:19:50.641767-08:00","closed_at":"2025-12-22T13:19:50.641767-08:00","close_reason":"Updated deacon.md with correct commands: gt mol status, bd mol spawn, gt mol squash","dependencies":[{"issue_id":"gt-i4i2","depends_on_id":"gt-x74c","type":"blocks","created_at":"2025-12-22T13:12:35.69774-08:00","created_by":"daemon"}]}
{"id":"gt-i4kq","title":"Update templates for Propulsion Principle","description":"Overhaul agent prompts to embody the Universal Gas Town Propulsion Principle:\n\n\u003e If you find something on your hook, YOU RUN IT.\n\nTemplates to update:\n- [ ] deacon.md.tmpl - Check hook first, no decision logic\n- [ ] polecat.md.tmpl - Propulsion startup, follow molecule\n- [ ] witness.md.tmpl - Sling wisps when spawning agents\n- [ ] refinery.md.tmpl - Accept slung epics\n\nKey changes:\n1. Remove 'should I run this?' decision points\n2. Add 'check your hook' as step 1 of startup\n3. Make molecule-following the default mode\n4. Simplify - agents don't think, they execute","status":"closed","priority":1,"issue_type":"task","assignee":"gastown/slit","created_at":"2025-12-22T03:17:46.464968-08:00","updated_at":"2025-12-22T23:44:05.155061-08:00","closed_at":"2025-12-22T23:44:05.155061-08:00","close_reason":"All four templates updated with Propulsion Principle","dependencies":[{"issue_id":"gt-i4kq","depends_on_id":"gt-4ev4","type":"blocks","created_at":"2025-12-22T12:10:42.245621-08:00","created_by":"daemon"},{"issue_id":"gt-i4kq","depends_on_id":"gt-uym5","type":"blocks","created_at":"2025-12-22T12:10:42.320803-08:00","created_by":"daemon"}]}
{"id":"gt-i4lo","title":"mol-polecat-work","description":"Full polecat lifecycle from assignment to decommission.\n\nThis proto enables nondeterministic idempotence for polecat work.\nA polecat that crashes after any step can restart, read its molecule state,\nand continue from the last completed step. No work is lost.\n\nVariables:\n- gt-test123 - The source issue ID being worked on","status":"in_progress","priority":2,"issue_type":"epic","assignee":"stevey","created_at":"2025-12-21T21:48:26.320963-08:00","updated_at":"2025-12-21T21:48:26.332718-08:00","wisp":true}
{"id":"gt-i6b9","title":"Merge: gt-cp2s","description":"branch: polecat/rictus\ntarget: main\nsource_issue: gt-cp2s\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-22T23:45:29.171329-08:00","updated_at":"2025-12-22T23:47:52.667765-08:00","closed_at":"2025-12-22T23:47:52.667765-08:00","close_reason":"Already merged (stale branch)"}
{"id":"gt-i6k1","title":"Clean up duplicate patrol protos (gt-qflq, gt-iep9)","description":"There are duplicate protos for patrol molecules:\n\n## Duplicates\n\n| Old Proto | New Proto | Name |\n|-----------|-----------|------|\n| gt-qflq | mol-witness-patrol | mol-witness-patrol |\n| gt-iep9 | mol-deacon-patrol | mol-deacon-patrol |\n\nThe old gt-* prefix protos were created before the formula cooking system.\nThe new mol-* prefix protos were created by `bd cook`.\n\n## Action\n\n1. Close or delete the old gt-* protos\n2. Update any references to use the new mol-* protos\n3. Verify `bd mol list` shows clean output\n\n## Root Cause\n\nThe bd cook command uses the formula name as the proto ID (mol-*), \nnot the project prefix (gt-*). This is probably correct behavior,\nbut means we have legacy protos to clean up.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T13:50:11.424341-08:00","updated_at":"2025-12-24T14:05:53.23666-08:00","closed_at":"2025-12-24T14:05:53.23666-08:00","close_reason":"Closed gt-qflq as superseded by mol-witness-patrol"}
{"id":"gt-ia0s","title":"Review: Beads Universal Data Plane documentation","description":"Review new docs/beads-data-plane.md (275 lines) for accuracy.\n\n## Commit\n- 54c8269: Add Beads Universal Data Plane documentation\n\n## Review focus\n- Accuracy of beads architecture description\n- Correct field mappings (mail → beads fields)\n- Two-level architecture (town vs rig beads) correctly explained","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-23T14:27:49.410707-08:00","updated_at":"2025-12-23T14:27:49.410707-08:00"}
@@ -619,7 +601,7 @@
{"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":"closed","priority":0,"issue_type":"task","created_at":"2025-12-15T19:21:19.913928-08:00","updated_at":"2025-12-15T19:21:40.461186-08:00","closed_at":"2025-12-15T19:21:40.461186-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"}]}
{"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"}
{"id":"gt-ilav.1","title":"Refinery: Add lifecycle-notify step to patrol","description":"After successful merge in handleSuccess(), send lifecycle notification to Witness.\n\n## Implementation\n\n1. Add new mail type: `LIFECYCLE: work merged`\n2. In engineer.go handleSuccess(), after closing MR and source issue:\n ```\n gt mail send \u003crig\u003e/witness -s \"LIFECYCLE: work merged\" -m \"\n Worker: \u003cpolecat\u003e\n MR: \u003cmr-id\u003e\n Issue: \u003csource-issue\u003e\n Commit: \u003cmerge-commit\u003e\n Action: Polecat work merged. Worktree eligible for recycling.\n \"\n ```\n\n3. Update mol-refinery-patrol to include lifecycle-notify step between merge-push and loop-check\n\n## Acceptance\n- Successful merges send mail to Witness\n- Mail includes worker name, MR id, source issue, commit SHA","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T12:07:46.715807-08:00","updated_at":"2025-12-23T12:07:46.715807-08:00"}
{"id":"gt-ilav.1","title":"Refinery: Add lifecycle-notify step to patrol","description":"After successful merge in handleSuccess(), send lifecycle notification to Witness.\n\n## Implementation\n\n1. Add new mail type: `LIFECYCLE: work merged`\n2. In engineer.go handleSuccess(), after closing MR and source issue:\n ```\n gt mail send \u003crig\u003e/witness -s \"LIFECYCLE: work merged\" -m \"\n Worker: \u003cpolecat\u003e\n MR: \u003cmr-id\u003e\n Issue: \u003csource-issue\u003e\n Commit: \u003cmerge-commit\u003e\n Action: Polecat work merged. Worktree eligible for recycling.\n \"\n ```\n\n3. Update mol-refinery-patrol to include lifecycle-notify step between merge-push and loop-check\n\n## Acceptance\n- Successful merges send mail to Witness\n- Mail includes worker name, MR id, source issue, commit SHA","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T12:07:46.715807-08:00","updated_at":"2025-12-23T12:07:46.715807-08:00","dependencies":[{"issue_id":"gt-ilav.1","depends_on_id":"gt-ilav","type":"parent-child","created_at":"2025-12-23T12:07:46.716238-08:00","created_by":"daemon"}]}
{"id":"gt-ilav.2","title":"Witness: Handle LIFECYCLE work-merged mail","description":"Witness should process the `LIFECYCLE: work merged` notification from Refinery.\n\n## Implementation\n\n1. In Witness mail processing, add handler for subject containing \"LIFECYCLE: work merged\"\n2. Parse worker name from mail body\n3. Update polecat state to `merged` (new state - see sibling task)\n4. Log completion for metrics\n5. Worktree is now eligible for cleanup on next gc cycle\n\n## Acceptance\n- Witness correctly parses and handles work-merged mail\n- Polecat state updated to merged\n- No action taken if polecat already cleaned up (idempotent)","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T12:07:47.878019-08:00","updated_at":"2025-12-23T12:07:47.878019-08:00","dependencies":[{"issue_id":"gt-ilav.2","depends_on_id":"gt-ilav","type":"parent-child","created_at":"2025-12-23T12:07:47.880327-08:00","created_by":"daemon"},{"issue_id":"gt-ilav.2","depends_on_id":"gt-ilav.1","type":"blocks","created_at":"2025-12-23T12:08:06.585766-08:00","created_by":"daemon"},{"issue_id":"gt-ilav.2","depends_on_id":"gt-ilav.5","type":"blocks","created_at":"2025-12-23T12:08:06.667459-08:00","created_by":"daemon"}]}
{"id":"gt-ilav.3","title":"MQ Submit: Notify Witness on MR submission","description":"When `gt mq submit` is run, notify the Witness so it can verify the submission.\n\n## Implementation\n\n1. In mq_submit.go after successful MR creation:\n ```\n gt mail send \u003crig\u003e/witness -s \"LIFECYCLE: mr submitted\" -m \"\n Worker: \u003cpolecat\u003e\n MR: \u003cmr-id\u003e\n Branch: \u003cbranch-name\u003e\n Target: \u003ctarget-branch\u003e\n Action: Verify MR submission, help polecat if needed.\n \"\n ```\n\n2. This happens BEFORE the existing polecat auto-cleanup logic\n\n## Acceptance\n- MR submission sends notification to Witness\n- Witness receives mail with all relevant details\n- Works for both polecat and crew submissions","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T12:07:49.07255-08:00","updated_at":"2025-12-23T12:07:49.07255-08:00","dependencies":[{"issue_id":"gt-ilav.3","depends_on_id":"gt-ilav","type":"parent-child","created_at":"2025-12-23T12:07:49.07304-08:00","created_by":"daemon"},{"issue_id":"gt-ilav.3","depends_on_id":"gt-ilav.5","type":"blocks","created_at":"2025-12-23T12:08:06.337807-08:00","created_by":"daemon"}]}
{"id":"gt-ilav.4","title":"Witness: Verify MR submission on notification","description":"When Witness receives `LIFECYCLE: mr submitted`, verify the submission was clean.\n\n## Implementation\n\n1. Add handler for \"LIFECYCLE: mr submitted\" mail\n2. Check MR status: `gt mq status \u003cmr-id\u003e`\n3. If MR looks good (status=open, no errors): log success, allow polecat to idle\n4. If MR has issues:\n - Check polecat git state\n - Nudge polecat to fix if session still alive\n - Log issue for monitoring\n\n## Acceptance\n- Witness verifies MR after submission notification\n- Can detect problematic submissions\n- Provides early intervention opportunity","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T12:07:50.607753-08:00","updated_at":"2025-12-23T12:07:50.607753-08:00","dependencies":[{"issue_id":"gt-ilav.4","depends_on_id":"gt-ilav","type":"parent-child","created_at":"2025-12-23T12:07:50.60974-08:00","created_by":"daemon"},{"issue_id":"gt-ilav.4","depends_on_id":"gt-ilav.3","type":"blocks","created_at":"2025-12-23T12:08:06.420836-08:00","created_by":"daemon"},{"issue_id":"gt-ilav.4","depends_on_id":"gt-ilav.5","type":"blocks","created_at":"2025-12-23T12:08:06.502487-08:00","created_by":"daemon"}]}
@@ -637,7 +619,6 @@
{"id":"gt-ingm.5","title":"Standardize bd mol vs gt mol commands","description":"Audit all docs and templates for command usage.\n\nClarify:\n- gt mol = Gas Town wrapper (what does it add?)\n- bd mol = Beads molecule commands (authoritative)\n\nIf gt mol is thin wrapper, consider removing.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-24T12:38:15.50826-08:00","updated_at":"2025-12-24T12:38:15.50826-08:00"}
{"id":"gt-ingm.6","title":"Remove spawn - use pour/wisp only (see bd-8y9t)","description":"Remove bd mol spawn entirely from vocabulary.\n\nReplace all references with:\n- bd pour \u003cproto\u003e - Create persistent mol (liquid)\n- bd wisp \u003cproto\u003e - Create ephemeral wisp (vapor)\n\n'spawn' doesn't fit the chemistry metaphor. Two phase transitions (pour/wisp) are clearer than one command with flags.\n\nSee bd-XXX for Beads-side removal.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-24T12:38:16.595926-08:00","updated_at":"2025-12-24T12:41:01.859024-08:00"}
{"id":"gt-ioij","title":"mol-town-shutdown: Full Gas Town reset molecule","description":"## Summary\nMolecule for clean town shutdown/restart. Sling it to Mayor when ready to reboot.\n\n## Steps\n1. Clear all inboxes (witness, refinery, crew - all rigs)\n2. Unhook all agents (remove stale molecule attachments)\n3. Kill any active polecats\n4. Stop daemon\n5. Rotate/archive logs\n6. bd sync + git push\n7. Send Mayor handoff (what's next)\n8. Restart daemon fresh\n\n## Invocation\n```\ngt hook mol-town-shutdown # attach it\n# Mayor runs it on next session\n```\n\n## Related\n- Patrol cleanup (continuous) vs shutdown (nuclear)\n- See gt-xxx for patrol hygiene","status":"open","priority":1,"issue_type":"feature","created_at":"2025-12-24T17:25:45.295151-08:00","updated_at":"2025-12-24T17:25:45.295151-08:00"}
{"id":"gt-is3e","title":"self-review","description":"Review your own changes. Look for:\n- Bugs and edge cases\n- Style issues\n- Missing error handling\n- Security concerns\n\nFix any issues found before proceeding.\n\nDepends: implement","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T22:04:43.421121-08:00","updated_at":"2025-12-21T22:05:10.502518-08:00","closed_at":"2025-12-21T22:05:10.502518-08:00","close_reason":"test cleanup","dependencies":[{"issue_id":"gt-is3e","depends_on_id":"gt-jvr3","type":"parent-child","created_at":"2025-12-21T22:04:43.423812-08:00","created_by":"stevey"},{"issue_id":"gt-is3e","depends_on_id":"gt-16rv","type":"blocks","created_at":"2025-12-21T22:04:43.424395-08:00","created_by":"stevey"}],"wisp":true}
{"id":"gt-isje","title":"Implement mol bond command for dynamic child molecules","description":"Add 'gt mol bond' command that creates child molecules at runtime with variable substitution.\n\nUsage from mol-witness-patrol survey-workers step:\n```bash\nbd mol bond mol-polecat-arm $PATROL_WISP_ID \\\n --ref arm-$polecat \\\n --var polecat_name=$polecat \\\n --var rig=\u003crig\u003e\n```\n\nThis creates child wisps like patrol-x7k.arm-ace with variables expanded.\n\nImplementation:\n1. Add 'bond' subcommand to mol command\n2. Accept: proto ID, parent ID, --ref for child suffix, --var key=value pairs\n3. Call InstantiateMolecule with Context map populated from --var flags\n4. Return created child ID\n\nCritical for Christmas Ornament pattern - without this, Witness cannot spawn per-polecat inspection arms.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T21:35:56.192637-08:00","updated_at":"2025-12-23T21:43:44.601758-08:00","closed_at":"2025-12-23T21:43:44.601758-08:00","close_reason":"Implemented mol bond command for dynamic child molecule creation"}
{"id":"gt-it0e","title":"Merge: gt-oiv0","description":"branch: polecat/furiosa\ntarget: main\nsource_issue: gt-oiv0\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-22T22:09:36.611121-08:00","updated_at":"2025-12-22T22:21:03.024596-08:00","closed_at":"2025-12-22T22:21:03.024596-08:00","close_reason":"Merged to main"}
{"id":"gt-iu23","title":"Polecat doesn't auto-start after spawn inject - requires manual nudge","description":"## Problem\n\nAfter `gt spawn --issue \u003cid\u003e --create`, the polecat session shows Claude Code started with the injected prompt, but Claude doesn't begin processing. The prompt just sits there until manually nudged.\n\n## Evidence\n\n```\n$ gt spawn --issue gt-rixa --rig gastown --create\n...\n✓ Session started. Attach with: gt session at gastown/furiosa\n Polecat nudged to start working\n Witness notified to monitor startup\n```\n\nSession shows:\n```\n\u003e You have a work assignment. Run 'gt mail inbox' to see it, then start\n working on issue gt-rixa.\n\n ⏵⏵ bypass permissions on (shift+tab to cycle)\n```\n\nBut Claude doesn't respond. Manual nudge required:\n```\n$ gt nudge gt-gastown-furiosa \"Please start working...\"\n```\n\nAfter nudge, polecat immediately starts working correctly.\n\n## Hypothesis\n\nThe spawn inject happens before Claude Code is fully initialized. The text arrives in the input buffer, but Claude hasn't started listening yet. By the time Claude starts, the input has already been 'consumed' as initial prompt text but not submitted.\n\n## Resolution Plan\n\nThis will be solved by the **polecat molecule workflow** (mol-polecat-work), which provides structured lifecycle management. The molecule approach handles startup, work, and shutdown as discrete steps with proper state tracking.\n\n**Blocked on**: beads/crew/dave completing ephemeral molecules (bd mol bond, ephemeral beads repo).\n\n## Workaround\n\nFor now, use `gt nudge` if a polecat doesn't start within ~30 seconds of spawn.","status":"in_progress","priority":1,"issue_type":"bug","created_at":"2025-12-21T14:06:27.375686-08:00","updated_at":"2025-12-21T19:53:46.940942-08:00"}
@@ -657,7 +638,6 @@
{"id":"gt-jq0f","title":"Merge: gt-yd98","description":"branch: polecat/valkyrie\ntarget: main\nsource_issue: gt-yd98\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-23T00:23:57.718716-08:00","updated_at":"2025-12-23T01:16:15.694749-08:00","closed_at":"2025-12-23T01:16:15.694749-08:00","close_reason":"Merged to main"}
{"id":"gt-jqpm","title":"Digest: mol-deacon-patrol @ 2025-12-24 19:23","description":"Patrol 6: quiet","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T19:23:13.766787-08:00","updated_at":"2025-12-24T19:23:13.766787-08:00","closed_at":"2025-12-24T19:23:13.76673-08:00","close_reason":"Squashed from wisp gt-zgk (9 issues)"}
{"id":"gt-jsup","title":"gt sling: patrol spawning must use wisp storage, not main DB","description":"**P0 Launch Blocker**\n\ngt sling to patrol roles (witness/refinery/deacon) currently spawns patrols into the main beads database instead of wisp storage. This will pollute the permanent database with ephemeral patrol cycles.\n\n**Root cause:**\nspawnMoleculeFromProto() with IsWisp=true uses `--db .beads-wisp/beads.db`, but the patrol TEMPLATE (e.g., gt-qp2w for mol-witness-patrol) only exists in the main database. So bd mol run fails with 'no issue found'.\n\n**The fix:**\nbd mol run needs to support reading the template from the main DB while writing the spawned instance to wisp storage. This is a cross-database spawn operation.\n\nOptions:\n1. Add `--template-db` flag to bd mol run (read template from here, write instance to --db)\n2. Copy template to wisp DB before spawning\n3. Make bd mol run automatically check main DB for templates when using wisp storage\n\n**Workaround applied (MUST REVERT):**\nSet IsWisp=false in slingToWitness/slingToRefinery/slingToDeacon patrol spawning.\n\n**Files:**\n- internal/cmd/sling.go: lines 680, 883, 1050 (IsWisp: false)\n- Needs fix in bd mol run (beads repo)","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-12-23T16:30:56.128658-08:00","updated_at":"2025-12-23T16:39:04.848671-08:00","closed_at":"2025-12-23T16:39:04.848671-08:00","close_reason":"Fixed by adding cross-database spawning support to bd mol run"}
{"id":"gt-jvr3","title":"mol-polecat-work","description":"Full polecat lifecycle from assignment to decommission.\n\nThis proto enables nondeterministic idempotence for polecat work.\nA polecat that crashes after any step can restart, read its molecule state,\nand continue from the last completed step. No work is lost.\n\nVariables:\n- gt-test - The source issue ID being worked on","status":"closed","priority":2,"issue_type":"epic","assignee":"gastown/test-polecat","created_at":"2025-12-21T22:04:43.420231-08:00","updated_at":"2025-12-21T22:05:10.498762-08:00","closed_at":"2025-12-21T22:05:10.498762-08:00","close_reason":"test cleanup","wisp":true}
{"id":"gt-jzot","title":"gt done: Notify Witness with exit outcome","description":"When polecat runs gt done, it should send mail to Witness:\n\n```\ngt mail send \u003crig\u003e/witness -s 'POLECAT_DONE \u003cname\u003e' -m 'Exit: COMPLETED\nIssue: \u003cissue-id\u003e\nMR: \u003cmr-id\u003e\nBranch: \u003cbranch\u003e'\n```\n\nExit types:\n- COMPLETED: Work done, MR submitted\n- ESCALATED: Hit blocker, needs human\n- DEFERRED: Work paused, issue still open\n\nThis enables Witness patrol to:\n1. See completion in inbox-check step\n2. Verify git state is clean\n3. Kill session and prune worktree\n4. Close the polecat lease in its patrol wisp\n\nPaired with gt-r6td (spawn notification) - together they bracket polecat lifecycle.","status":"closed","priority":1,"issue_type":"task","assignee":"gastown/nux","created_at":"2025-12-22T22:31:31.266716-08:00","updated_at":"2025-12-22T22:55:15.215207-08:00","closed_at":"2025-12-22T22:55:15.215207-08:00","close_reason":"Closed"}
{"id":"gt-k08o","title":"test pin fix","status":"closed","priority":2,"issue_type":"task","assignee":"max","created_at":"2025-12-23T12:14:47.293815-08:00","updated_at":"2025-12-23T12:26:48.724819-08:00","closed_at":"2025-12-23T12:26:48.724819-08:00","close_reason":"Test issues for gt-o3is investigation"}
{"id":"gt-k1lr","title":"Consolidate configuration architecture: three-tier model","description":"Rationalize Gas Town's scattered configuration into a clean three-tier model:\n\n## Current Problems\n- Config split across mayor/, .gastown/, and rig/config.json\n- Runtime state mixed with configuration\n- Hidden directories (.gastown/) are missed by agents\n- Category confusion: identity vs config vs runtime state\n\n## Proposed Architecture\n\n### Tier 1: Town Config (mayor/)\n```\nmayor/\n├── town.json # Town identity (unchanged)\n├── rigs.json # Rig registry (unchanged)\n└── config.json # NEW: Town-level configuration\n # theme defaults, daemon settings, etc.\n```\n\n### Tier 2: Town Runtime (.runtime/)\n```\n~/gt/.runtime/ # NEW: Gitignored\n├── daemon.json # {pid, started_at, heartbeat}\n├── deacon.json # {cycle, last_action}\n└── agent-requests.json # Lifecycle requests\n```\n\n### Tier 3: Rig Config (settings/)\n```\n\u003crig\u003e/\n├── config.json # Rig identity only (type, git_url, beads.prefix)\n├── settings/ # NEW: Visible, git-tracked\n│ ├── config.json # theme, merge_queue, max_workers\n│ ├── namepool.json # pool settings (style, max)\n│ └── roles/ # Per-role overrides (optional)\n└── .runtime/ # NEW: Gitignored\n ├── witness.json # {state, started_at, stats}\n ├── refinery.json # {state, started_at, stats}\n └── namepool-state.json # {in_use, overflow_next}\n```\n\n## Key Principles\n1. **Visible \u003e Hidden** for config agents need to find\n2. **Git-tracked** for identity and config; **gitignored** for runtime\n3. **Separation of concerns**: identity, config, runtime are distinct\n4. **Locality**: town config at town root, rig config at rig root\n\n## Migration\n- Move .gastown/ contents to appropriate new locations\n- Update all code that reads/writes these files\n- Update .gitignore patterns\n- Update documentation (architecture.md, CLAUDE.md)\n","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-22T01:01:48.96788-08:00","updated_at":"2025-12-22T01:33:05.853643-08:00","closed_at":"2025-12-22T01:33:05.853643-08:00","close_reason":"All 8 tasks complete: config architecture migrated to three-tier model"}
@@ -673,7 +653,6 @@
{"id":"gt-k7x0","title":"Merge: gt-h5n.5","description":"branch: polecat/Scabrous\ntarget: main\nsource_issue: gt-h5n.5\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-19T14:53:42.318338-08:00","updated_at":"2025-12-19T14:54:35.021214-08:00","closed_at":"2025-12-19T14:54:35.021214-08:00"}
{"id":"gt-kabx","title":"Build context self-check into patrol molecules","description":"Patrol molecules (witness-patrol, refinery-patrol, deacon-patrol) should have\nexplicit context self-check as part of each cycle:\n\nAfter each patrol cycle step:\n- Self-assess context pressure\n- If high: complete current step, then initiate handoff\n- If OK: continue to next cycle\n\nThis could be:\n1. Explicit step in molecule: 'context-check'\n2. Guidance in step instructions: 'Before continuing, assess context...'\n3. Protocol baked into the patrol loop description\n\nThe key is making it unavoidable - not optional guidance that gets ignored.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T01:46:57.067465-08:00","updated_at":"2025-12-23T01:46:57.067465-08:00"}
{"id":"gt-kcee","title":"Witness commands: gt witness start/stop/status needed","description":"## Summary\n\nNo `gt witness` command exists. The witness should:\n- Monitor polecats for stuck/idle state\n- Nudge polecats that seem blocked\n- Report status to mayor\n- Handle polecat lifecycle\n\n## Expected Commands\n\n```bash\ngt witness start gastown # Start witness for rig\ngt witness stop gastown # Stop witness\ngt witness status # Show witness status\n```\n\n## Current State\n\n- Witness directory exists: /Users/stevey/gt/gastown/witness/\n- Has state.json but no active process\n- gt status shows 'Witnesses: 0'\n\n## Context\n\nFull polecat flow needs witness monitoring for production use.","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-18T21:55:24.079671-08:00","updated_at":"2025-12-19T01:33:49.856942-08:00","closed_at":"2025-12-19T01:33:49.856942-08:00"}
{"id":"gt-keqh","title":"self-review","description":"Review your own changes. Look for:\n- Bugs and edge cases\n- Style issues\n- Missing error handling\n- Security concerns\n\nFix any issues found before proceeding.\n\nDepends: implement","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T21:56:18.535003-08:00","updated_at":"2025-12-21T21:56:27.51043-08:00","closed_at":"2025-12-21T21:56:27.51043-08:00","close_reason":"test cleanup","dependencies":[{"issue_id":"gt-keqh","depends_on_id":"gt-zjqs","type":"parent-child","created_at":"2025-12-21T21:56:18.537323-08:00","created_by":"stevey"},{"issue_id":"gt-keqh","depends_on_id":"gt-pwep","type":"blocks","created_at":"2025-12-21T21:56:18.537857-08:00","created_by":"stevey"}],"wisp":true}
{"id":"gt-kgk5","title":"Test Patrol for Bonding","description":"Parent issue for mol bond CLI test","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T12:46:15.710782-08:00","updated_at":"2025-12-24T12:46:16.07481-08:00","closed_at":"2025-12-24T12:46:16.07481-08:00","close_reason":"Closed"}
{"id":"gt-kgk5.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-kgk5\nbonded_ref: arm-toast\nbonded_at: 2025-12-23T10:00:00Z\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T12:46:15.807528-08:00","updated_at":"2025-12-24T12:46:15.981032-08:00","closed_at":"2025-12-24T12:46:15.981032-08:00","close_reason":"Closed","dependencies":[{"issue_id":"gt-kgk5.1","depends_on_id":"gt-kgk5","type":"parent-child","created_at":"2025-12-24T12:46:15.808252-08:00","created_by":"daemon"}]}
{"id":"gt-kh6q","title":"Remove Go-based witness patrol - Claude session is the executor","description":"## Problem\n\nThe witness has 1370 lines of Go code in internal/witness/manager.go that reimplements what mol-witness-patrol does:\n- healthCheck() - polls polecats\n- autoSpawnForReadyWork() - spawns polecats for ready issues \n- handleStuckPolecat() - nudge logic\n- processShutdownRequests() - cleanup logic\n- verifyPolecatState() - git state checks\n\nThis is backwards. The molecule should drive the work, Claude should execute it.\n\n## The Wrong Architecture (gt-59zd, now cancelled)\n\nThe cancelled gt-59zd tried to use molecules as 'tracking ledgers' for Go code:\n- Go code runs patrol logic\n- Molecule just records what Go did\n- Duplicates work, adds complexity\n\n## The Right Architecture\n\n1. Witness runs as Claude session (via gt sling witness or tmux)\n2. Claude executes mol-witness-patrol steps directly\n3. No Go patrol loop needed\n4. Molecule IS the executor, not bookkeeping\n\n## Scope\n\n1. Remove patrol-related functions from manager.go:\n - run(), checkAndProcess(), healthCheck()\n - handleStuckPolecat(), getNudgeCount(), recordNudge()\n - processShutdownRequests(), verifyPolecatState()\n - autoSpawnForReadyWork(), etc.\n\n2. Keep session management functions:\n - Start(), Stop(), Status() - for starting/stopping Claude session\n - State persistence for session identity\n\n3. Update gt witness commands to use Claude session model\n\n4. Test that mol-witness-patrol executes correctly in Claude session\n\n## Related\n\n- gt-zde4: Fixed Witness CLAUDE.md to emphasize mol-following\n- gt-59zd: Cancelled - wrong architecture\n- witness.md.tmpl: Already rewritten with ZFC principle","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-23T22:42:13.02343-08:00","updated_at":"2025-12-24T00:18:03.093897-08:00","closed_at":"2025-12-23T23:45:02.782485-08:00"}
@@ -708,9 +687,7 @@
{"id":"gt-l7cd","title":"Work on gt-role-template: Refine witness/CLAUDE.md role t...","description":"Work on gt-role-template: Refine witness/CLAUDE.md role template. See issue for details. Run 'bd show gt-role-template' to see the full issue.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-20T03:47:29.414394-08:00","updated_at":"2025-12-20T03:54:13.699528-08:00","closed_at":"2025-12-20T03:54:13.699528-08:00"}
{"id":"gt-l9g","title":"Beads epic templates for batch work patterns","description":"Optional: Define templates for common batch work patterns.\n\n## Concept\n\nA template encodes a workflow pattern that can be instantiated as beads:\n\n```yaml\n# templates/batch-basic.yaml\nname: basic-batch\ndescription: Simple batch work pattern\nphases:\n - name: startup\n issues:\n - title: \"Verify workers ready\"\n - name: working\n # Actual work issues added separately\n - name: cleanup\n issues:\n - title: \"Merge all branches\"\n - title: \"Clean up workers\"\n - title: \"Report to Mayor\"\n```\n\n## Usage\n\n```bash\ngt spawn --template basic-batch --epic gt-u1j --workers 3\n```\n\nCreates beads epic with template phases + actual work from gt-u1j children.\n\n## Decision Point\n\nTemplates are OPTIONAL. The core design (beads as state, multi-wave orchestration) works without templates. Templates are sugar for common patterns.\n\nConsider deferring to P3 or dropping entirely if beads epics with dependencies suffice.\n\n## Note\n\nNo \"swarm IDs\" involved - templates just pre-populate epic/issue structure.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-16T01:51:24.399235-08:00","updated_at":"2025-12-16T17:26:08.868396-08:00"}
{"id":"gt-ldk8","title":"Witness should verify polecat submitted before stopping session","description":"## Problem\n\nWitness stopped dementus's session before it could call `gt done`, losing the MR submission. I had to manually push and submit the branch.\n\n## Root Cause\n\nWitness cleanup is triggered by nudge/manual check rather than by receiving POLECAT_DONE message. When Witness cleans up based on issue status (closed), it doesn't wait for the polecat to complete its shutdown sequence.\n\n## Expected Behavior\n\nWitness should only stop a polecat session after:\n1. Receiving POLECAT_DONE message from that polecat, OR\n2. Timeout waiting for POLECAT_DONE after issue is closed\n\n## Current Behavior\n\nWitness stops sessions immediately when asked to check for completions, even if polecat hasn't called `gt done` yet.\n\n## Fix\n\nIn mol-witness-patrol inbox-check step:\n- Only clean up polecats that have sent POLECAT_DONE\n- For polecats with closed issues but no DONE message, nudge them to complete\n- Add timeout before force-killing","status":"closed","priority":1,"issue_type":"bug","assignee":"gastown/nux","created_at":"2025-12-22T23:54:12.969528-08:00","updated_at":"2025-12-23T01:16:16.794303-08:00","closed_at":"2025-12-23T01:16:16.794303-08:00","close_reason":"Merged to main"}
{"id":"gt-ldm4","title":"verify-tests","description":"Run existing tests. Add new tests for new functionality.\nEnsure adequate coverage.\n\ngo test ./...\n\nFix any test failures before proceeding.\n\nDepends: implement","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-21T21:48:26.322056-08:00","updated_at":"2025-12-21T21:48:26.322056-08:00","dependencies":[{"issue_id":"gt-ldm4","depends_on_id":"gt-i4lo","type":"parent-child","created_at":"2025-12-21T21:48:26.326258-08:00","created_by":"stevey"},{"issue_id":"gt-ldm4","depends_on_id":"gt-vhby","type":"blocks","created_at":"2025-12-21T21:48:26.326815-08:00","created_by":"stevey"}],"wisp":true}
{"id":"gt-le1a","title":"Merge: gt-3x1","description":"branch: polecat/Slit\ntarget: main\nsource_issue: gt-3x1\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-19T14:53:47.674479-08:00","updated_at":"2025-12-19T18:30:24.050697-08:00","closed_at":"2025-12-19T18:30:24.0507-08:00"}
{"id":"gt-leeb","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-qwyu) and understand the requirements.\nIdentify any blockers or missing information.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T21:58:52.59974-08:00","updated_at":"2025-12-21T21:59:10.94207-08:00","closed_at":"2025-12-21T21:59:10.94207-08:00","close_reason":"test cleanup","dependencies":[{"issue_id":"gt-leeb","depends_on_id":"gt-q6hl","type":"parent-child","created_at":"2025-12-21T21:58:52.600633-08:00","created_by":"stevey"}],"wisp":true}
{"id":"gt-lek6","title":"gt rig reset --stale: Clear orphaned in_progress items","description":"Reset in_progress issues when their assigned agent no longer exists.\n\n## Problem\nWhen polecats die without cleanup, their issues remain in_progress forever.\nNeed a way to bulk-reset these orphaned items.\n\n## Command\n```bash\ngt rig reset --stale [--dry-run]\n```\n\n## Logic\nFor each in_progress issue in rig:\n1. Parse assignee (e.g., \"gastown/furiosa\")\n2. Map to tmux session name (gt-gastown-furiosa)\n3. If session does NOT exist:\n - Reset status to \"open\"\n - Clear assignee\n4. Exception: skip crew/* assignees (persistent identities)\n OR check if crew tmux session exists\n\n## Output\n```\nResetting stale work in gastown:\n gt-abc: gastown/furiosa (no session) → open\n gt-def: gastown/nux (no session) → open\n Skipped: gt-xyz: gastown/crew/max (persistent)\nReset 2 issues, skipped 1\n```\n\n## Related\n- gt-2kz: CLI cleanup commands for stale state\n- gt-rdmw: orphan-check in deacon patrol\n- gt-orphans command (list orphaned molecules)","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-21T21:33:46.962413-08:00","updated_at":"2025-12-22T15:16:22.295127-08:00","closed_at":"2025-12-22T15:16:22.295127-08:00","close_reason":"Implemented --stale flag for gt rig reset with dry-run support"}
{"id":"gt-lg66","title":"Mail should use wisps for ephemeral orchestration messages","description":"## Problem\n\nTown HQ beads are polluted with lifecycle orchestration messages:\n- POLECAT_STARTED notifications\n- Work assignments to polecats\n- \"Start work\" nudges\n- Test messages\n\nThese should never have been persistent beads. They accumulate forever.\n\n## Analysis\n\nMail serves two purposes:\n1. **Durable messages** - Handoffs, escalations, human-agent comms (need persistence)\n2. **Ephemeral signals** - Lifecycle pings, work assignments, nudges (should be wisps)\n\n## Options\n\n### Option A: Dual-inbox architecture\n- `gt mail inbox` checks both `.beads/` and `.beads-wisp/`\n- Sender specifies `--ephemeral` flag for transient messages\n- Ephemeral messages auto-expire or squash to digests\n\n### Option B: All mail becomes wisps\n- Default to wisp storage for all mail\n- Important messages explicitly promoted to persistent\n- Simpler model but loses audit trail for some messages\n\n### Option C: Message type determines storage\n- `message` type beads go to wisps by default\n- `handoff` type stays persistent\n- Automatic routing based on content\n\n## Recommendation\n\nOption A (dual-inbox) seems cleanest:\n- Explicit control via `--ephemeral`\n- Backwards compatible\n- Clear mental model\n\n## Acceptance Criteria\n\n- Lifecycle pings (POLECAT_STARTED, etc.) go to wisps\n- Work assignments go to wisps\n- Handoffs stay persistent\n- `gt mail inbox` shows both\n- Wisps auto-cleanup on patrol squash\n\n## Blocks\n\nThis blocks reliable swarm operations - every spawn pollutes HQ indefinitely.","status":"closed","priority":0,"issue_type":"feature","created_at":"2025-12-24T19:17:43.874045-08:00","updated_at":"2025-12-24T20:03:43.305367-08:00","closed_at":"2025-12-24T20:03:43.305367-08:00","close_reason":"Implemented dual-inbox architecture: ephemeral messages go to wisps, lifecycle messages auto-detect"}
{"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)"}
@@ -719,7 +696,7 @@
{"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-20T17:41:59.8038-08:00","closed_at":"2025-12-20T17:41:59.8038-08:00"}
{"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-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":"open","priority":2,"issue_type":"epic","created_at":"2025-12-21T21:47:15.553926-08:00","updated_at":"2025-12-21T21:47:15.553926-08:00","labels":["template"]}
{"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":"open","priority":2,"issue_type":"task","created_at":"2025-12-21T21:47:23.880531-08:00","updated_at":"2025-12-21T21:47:23.880531-08:00","labels":["template"]}
{"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":"open","priority":2,"issue_type":"task","created_at":"2025-12-21T21:47:23.880531-08:00","updated_at":"2025-12-21T21:47:23.880531-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"}]}
{"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":"open","priority":2,"issue_type":"task","created_at":"2025-12-21T21:47:46.876765-08:00","updated_at":"2025-12-21T21:47:46.876765-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"}]}
{"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":"open","priority":2,"issue_type":"task","created_at":"2025-12-21T21:47:48.035315-08:00","updated_at":"2025-12-21T21:47:48.035315-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"}]}
{"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":"open","priority":2,"issue_type":"task","created_at":"2025-12-21T21:47:53.776509-08:00","updated_at":"2025-12-21T21:47:53.776509-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"}]}
@@ -731,18 +708,16 @@
{"id":"gt-m0fx.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-m0fx\nbonded_ref: arm-toast\nbonded_at: 2025-12-23T10:00:00Z\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T23:28:07.781991-08:00","updated_at":"2025-12-23T23:28:07.95513-08:00","closed_at":"2025-12-23T23:28:07.95513-08:00","close_reason":"Closed","dependencies":[{"issue_id":"gt-m0fx.1","depends_on_id":"gt-m0fx","type":"parent-child","created_at":"2025-12-23T23:28:07.782459-08:00","created_by":"daemon"}]}
{"id":"gt-m3hh","title":"Merge: gt-7hor","description":"branch: polecat/slit\ntarget: main\nsource_issue: gt-7hor\nrig: gastown","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-22T12:32:43.108463-08:00","updated_at":"2025-12-22T16:01:13.501585-08:00","closed_at":"2025-12-22T16:01:13.501585-08:00","close_reason":"Merged to main"}
{"id":"gt-m72d","title":"Digest: mol-deacon-patrol @ 2025-12-24 19:21","description":"Patrol 4: quiet","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T19:21:43.191633-08:00","updated_at":"2025-12-24T19:21:43.191633-08:00","closed_at":"2025-12-24T19:21:43.191566-08:00","close_reason":"Squashed from wisp gt-7ip (9 issues)"}
{"id":"gt-mc4n","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-test123) and understand the requirements.\nIdentify any blockers or missing information.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T21:56:18.534569-08:00","updated_at":"2025-12-21T21:56:27.508015-08:00","closed_at":"2025-12-21T21:56:27.508015-08:00","close_reason":"test cleanup","dependencies":[{"issue_id":"gt-mc4n","depends_on_id":"gt-zjqs","type":"parent-child","created_at":"2025-12-21T21:56:18.535487-08:00","created_by":"stevey"}],"wisp":true}
{"id":"gt-mcjd","title":"Work on gt-o9j: Fix tmux status bar polecat count - exclu...","description":"Work on gt-o9j: Fix tmux status bar polecat count - exclude static roles (mayor, deacon, witnesses, refineries, docs, hop). Run 'bd show gt-o9j' for details.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-20T07:52:51.623541-08:00","updated_at":"2025-12-20T07:56:41.861992-08:00","closed_at":"2025-12-20T07:56:41.861992-08:00"}
{"id":"gt-mh5s","title":"Refinery gates: test/lint/build before merge","description":"Before merging polecat work to main, run configurable quality gates.\n\n**From VC**: internal/gates/ - parallel execution with timeout, any failure = overall failure.\n\n**Gas Town implementation**: Refinery config with gate commands:\n```yaml\ngates:\n test:\n cmd: go test ./...\n timeout: 5m\n lint:\n cmd: golangci-lint run\n timeout: 2m\n build:\n cmd: go build ./...\n timeout: 3m\nparallel: true\n```\n\nIf gates fail, don't merge. Polecat can iterate and retry.\n\n**Value**: Prevents broken code from reaching main. VC had 90.9% gate pass rate.\n\n**VC complexity**: ~200 lines Go\n**Gas Town complexity**: ~10 lines YAML","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-20T20:30:12.44681-08:00","updated_at":"2025-12-20T20:30:12.44681-08:00","dependencies":[{"issue_id":"gt-mh5s","depends_on_id":"gt-zhpa","type":"parent-child","created_at":"2025-12-20T20:30:27.402708-08:00","created_by":"daemon"}]}
{"id":"gt-mjso","title":"Merge: gt-rixa","description":"branch: polecat/furiosa\ntarget: main\nsource_issue: gt-rixa\nrig: gastown","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-21T14:09:26.367745-08:00","updated_at":"2025-12-21T17:20:27.506572-08:00","closed_at":"2025-12-21T17:20:27.506572-08:00","close_reason":"ORPHANED: Branch never pushed, worktree deleted"}
{"id":"gt-mkh7","title":"check-refinery","description":"Ensure the refinery is alive and processing merge requests.\n\nNeeds: inbox-check","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T16:18:21.598893-08:00","updated_at":"2025-12-23T16:18:21.598893-08:00","dependencies":[{"issue_id":"gt-mkh7","depends_on_id":"gt-qp2w","type":"parent-child","created_at":"2025-12-23T16:18:21.599546-08:00","created_by":"stevey"}],"wisp":true}
{"id":"gt-mmbh","title":"Fix out-of-sync molecule test expectations","description":"Tests in builtin_molecules_test.go have hardcoded expectations that no longer match actual molecules:\n- TestBuiltinMolecules: expects 9 molecules, got 11\n- TestPolecatWorkMolecule: step refs out of sync\n- TestDeaconPatrolMolecule: step count and refs out of sync\n\nThis is pre-existing on main, not introduced by any polecat work.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-22T22:20:38.8105-08:00","updated_at":"2025-12-22T23:49:28.405487-08:00","closed_at":"2025-12-22T23:49:28.405487-08:00","close_reason":"Merged to main - tests now pass"}
{"id":"gt-mqbm","title":"Digest: mol-deacon-patrol","description":"Patrol: TRACER BULLET SUCCESS - gt-oiv0 merged to main, furiosa completed and exited cleanly, 0 polecats now, all agents up","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-22T23:13:30.087307-08:00","updated_at":"2025-12-22T23:13:30.087307-08:00","closed_at":"2025-12-22T23:13:30.087271-08:00","close_reason":"Squashed from 5 wisps"}
{"id":"gt-mx6s","title":"Witness patrol wisp with polecat leases","description":"Witness should maintain a rolling patrol wisp that tracks active polecats:\n\n```\nwisp-witness-patrol\n├── lease: furiosa (boot → working → done)\n├── lease: nux (working)\n└── lease: slit (done, closed)\n```\n\nWhen POLECAT_STARTED arrives:\n- bd mol bond mol-polecat-lease wisp-patrol --var polecat=X\n\nPatrol loop iterates leases:\n- gt peek $polecat\n- If idle: gt nudge\n- If shutdown received: close lease\n\nWhen all leases closed:\n- bd mol squash wisp-xxx --summary='N polecats processed'\n\nRequires mol-polecat-lease proto definition.","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-22T22:01:13.640901-08:00","updated_at":"2025-12-23T04:39:28.525208-08:00","closed_at":"2025-12-23T04:39:28.525208-08:00","close_reason":"Superseded by Christmas Ornament pattern (gt-tnow, gt-qflq). Lease-based patrol replaced by mol-polecat-arm dynamic bonding.","dependencies":[{"issue_id":"gt-mx6s","depends_on_id":"gt-cp2s","type":"blocks","created_at":"2025-12-22T22:31:40.126113-08:00","created_by":"daemon"},{"issue_id":"gt-mx6s","depends_on_id":"gt-83k0","type":"blocks","created_at":"2025-12-22T22:31:40.204487-08:00","created_by":"daemon"}]}
{"id":"gt-mxyj","title":"Witness session startup (gt witness start)","description":"Implement gt witness start \u003crig\u003e\n\nShould:\n1. Verify rig exists and has witness/ directory\n2. Check for existing witness session (don't double-start)\n3. Create tmux session: gt-\u003crig\u003e-witness\n4. Start Claude Code with --dangerously-skip-permissions\n5. Send gt prime to load context\n6. Send startup prompt\n\nSimilar pattern to refinery startup in internal/refinery/manager.go","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T03:14:20.38027-08:00","updated_at":"2025-12-20T09:25:31.369825-08:00","closed_at":"2025-12-20T09:25:31.369825-08:00","dependencies":[{"issue_id":"gt-mxyj","depends_on_id":"gt-53w6","type":"parent-child","created_at":"2025-12-20T03:14:37.170879-08:00","created_by":"daemon"},{"issue_id":"gt-mxyj","depends_on_id":"gt-ni6a","type":"blocks","created_at":"2025-12-20T03:14:38.764636-08:00","created_by":"daemon"}]}
{"id":"gt-mzal","title":"mol-gastown-boot: Mayor-driven town bootstrap","description":"Mayor bootstraps Gas Town via a verification-gated lifecycle molecule.\n\n## Vision\n\nWhen user says \"boot up gas town\", Mayor slings `mol-gastown-boot` and executes it.\nEach step has **action + verification** - steps stay open until outcome is confirmed.\n\n## Key Principles\n\n1. **No daemon-based timeouts** - Mayor keeps trying until verified\n2. **Verification-gated steps** - Not \"command ran\" but \"outcome confirmed\"\n3. **gt peek for verification** - Capture session output to detect stalls\n4. **gt nudge for recovery** - Reliable message delivery to unstick agents\n5. **Parallel where possible** - Witnesses can start in parallel\n6. **Ephemeral execution** - Boot is a wisp, squashed to digest\n\n## Proto Catalog\n\nTown maintains a catalog of protos at `~/gt/molecules/`:\n\n```\n~/gt/molecules/\n├── lifecycle/\n│ ├── gastown-boot/ # Full town bootstrap\n│ ├── rig-spinup/ # Add a rig at runtime\n│ ├── rig-spindown/ # Remove a rig gracefully\n│ └── agent-restart/ # Restart single agent\n├── patrol/\n│ ├── deacon-patrol/ # Deacon health loop\n│ ├── witness-patrol/ # Witness polecat loop\n│ └── refinery-patrol/ # Refinery merge loop\n└── work/\n ├── polecat-work/ # Standard issue workflow\n ├── code-review/ # Pluggable review\n └── feature/ # Feature development\n```\n\n## mol-gastown-boot Structure\n\n```\nmol-gastown-boot (proto)\n├── ensure-daemon # Verify daemon running\n├── ensure-deacon # Start deacon, verify patrol active\n├── ensure-witnesses # Parallel: all rig witnesses\n│ ├── ensure-gastown-witness\n│ └── ensure-beads-witness\n├── ensure-refineries # Parallel: all rig refineries\n│ ├── ensure-gastown-refinery\n│ └── ensure-beads-refinery\n└── verify-town-health # Final gt status check\n```\n\n## Step Template\n\nEach step in description includes action + verification:\n\n```markdown\n## Step: ensure-deacon\n\n### Action\ngt deacon start\n\n### Verify\n1. Session gt-deacon exists: `tmux has-session -t gt-deacon`\n2. Not stalled: `gt peek deacon/` does NOT show \"\u003e Try\"\n3. Recent heartbeat: deacon/heartbeat.json \u003c 2 min old\n\n### On Stall\ngt nudge deacon/ \"Start patrol.\"\nWait 30s, re-verify.\n\n### On Fail\nLog error, continue to next step (town can run with degraded deacon)\n```\n\n## Event-Triggered Lifecycle\n\nBeyond manual slinging, events can trigger lifecycle wisps:\n\n| Event | Triggers |\n|-------|----------|\n| `gt town start` | mol-gastown-boot wisp |\n| `gt rig add \u003cname\u003e` | mol-rig-spinup wisp |\n| `gt rig remove \u003cname\u003e` | mol-rig-spindown wisp |\n| Agent crash detected | mol-agent-restart wisp |\n\n## Parameterization (Future)\n\nFor rig-spinup/spindown, need to pass rig name:\n\n```bash\ngt sling rig-spinup mayor/ --param rig=newproject\n```\n\nMolecule steps interpolate `${rig}` in their descriptions.\n\n## Related Issues\n\n- gt-lx3n: Witness startup bond\n- gt-j6s8: Refinery startup bond \n- gt-rana: Patrol System epic\n- gt-sye: Mayor startup protocol\n","status":"open","priority":1,"issue_type":"epic","created_at":"2025-12-22T20:59:15.795091-08:00","updated_at":"2025-12-22T20:59:15.795091-08:00"}
{"id":"gt-mzal.1","title":"Define mol-gastown-boot proto structure","description":"Create the proto molecule definition with all steps.\n\n## Proto Definition\n\nEach step has:\n- Title (step name)\n- Description with Action/Verify/OnStall/OnFail sections\n- Dependencies (Needs: directive)\n\n## Steps\n\n1. ensure-daemon\n - Action: gt daemon status || gt daemon start\n - Verify: daemon PID exists and responding\n\n2. ensure-deacon \n - Action: gt deacon start\n - Verify: session exists, not stalled, heartbeat fresh\n - OnStall: gt nudge deacon/ \"Start patrol.\"\n\n3. ensure-witnesses (parallel container)\n - ensure-gastown-witness\n - ensure-beads-witness\n - Verify each: session exists, not stalled\n\n4. ensure-refineries (parallel container) \n - ensure-gastown-refinery\n - ensure-beads-refinery\n - Verify each: session exists, not stalled\n\n5. verify-town-health\n - Action: gt status\n - Verify: all expected agents shown\n\n## Output\n\nProto stored in beads as molecule type issue.\n","status":"closed","priority":1,"issue_type":"task","assignee":"gastown/scrotus","created_at":"2025-12-22T21:00:08.736237-08:00","updated_at":"2025-12-23T00:23:09.966948-08:00","closed_at":"2025-12-23T00:23:09.966948-08:00","close_reason":"Created mol-gastown-boot proto (gt-c8ca) with 10 steps: ensure-daemon, ensure-deacon, ensure-witnesses (with gastown/beads children), ensure-refineries (with gastown/beads children), verify-town-health. Dependencies wired for correct execution order.","dependencies":[{"issue_id":"gt-mzal.1","depends_on_id":"gt-mzal","type":"parent-child","created_at":"2025-12-22T21:00:08.736738-08:00","created_by":"daemon"}]}
{"id":"gt-mzal.2","title":"Implement verification patterns for boot steps","description":"Define and implement the verification logic Mayor uses.\n\n## Verification Utilities\n\nMayor needs to check:\n\n### Session Exists\n```bash\ntmux has-session -t \u003csession\u003e 2\u003e/dev/null \u0026\u0026 echo \"exists\"\n```\n\n### Not Stalled (Claude waiting at prompt)\n```bash\ngt peek \u003cagent\u003e 10 | grep -q \"\u003e Try\" \u0026\u0026 echo \"stalled\"\n```\n\nPattern: `\u003e Try \"...\"` indicates Claude started but no message sent.\n\n### Recent Heartbeat\n```bash\n# For deacon\nage=$(( $(date +%s) - $(stat -f %m ~/gt/deacon/heartbeat.json) ))\n[ $age -lt 120 ] \u0026\u0026 echo \"fresh\"\n```\n\n### Active Work Output\n```bash\ngt peek \u003cagent\u003e 20 | grep -q \"⏺\" \u0026\u0026 echo \"working\"\n```\n\nPattern: `⏺` indicates Claude is executing tools.\n\n## Mayor Execution Pattern\n\n```\nfor each step in molecule:\n run action\n loop:\n check verification\n if verified: close step, continue\n if stalled: run on_stall recovery\n if timeout (5 attempts): log warning, continue\n sleep 10s\n```\n\nNo hard timeout - Mayor keeps trying with increasing backoff.\n","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-22T21:00:14.665689-08:00","updated_at":"2025-12-22T21:00:14.665689-08:00"}
{"id":"gt-mzal.2","title":"Implement verification patterns for boot steps","description":"Define and implement the verification logic Mayor uses.\n\n## Verification Utilities\n\nMayor needs to check:\n\n### Session Exists\n```bash\ntmux has-session -t \u003csession\u003e 2\u003e/dev/null \u0026\u0026 echo \"exists\"\n```\n\n### Not Stalled (Claude waiting at prompt)\n```bash\ngt peek \u003cagent\u003e 10 | grep -q \"\u003e Try\" \u0026\u0026 echo \"stalled\"\n```\n\nPattern: `\u003e Try \"...\"` indicates Claude started but no message sent.\n\n### Recent Heartbeat\n```bash\n# For deacon\nage=$(( $(date +%s) - $(stat -f %m ~/gt/deacon/heartbeat.json) ))\n[ $age -lt 120 ] \u0026\u0026 echo \"fresh\"\n```\n\n### Active Work Output\n```bash\ngt peek \u003cagent\u003e 20 | grep -q \"⏺\" \u0026\u0026 echo \"working\"\n```\n\nPattern: `⏺` indicates Claude is executing tools.\n\n## Mayor Execution Pattern\n\n```\nfor each step in molecule:\n run action\n loop:\n check verification\n if verified: close step, continue\n if stalled: run on_stall recovery\n if timeout (5 attempts): log warning, continue\n sleep 10s\n```\n\nNo hard timeout - Mayor keeps trying with increasing backoff.\n","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-22T21:00:14.665689-08:00","updated_at":"2025-12-22T21:00:14.665689-08:00","dependencies":[{"issue_id":"gt-mzal.2","depends_on_id":"gt-mzal","type":"parent-child","created_at":"2025-12-22T21:00:14.666085-08:00","created_by":"daemon"}]}
{"id":"gt-mzal.3","title":"Create molecules catalog directory structure","description":"Establish the proto catalog at ~/gt/molecules/.\n\n## Structure\n\n```\n~/gt/molecules/\n├── README.md # Catalog overview\n├── lifecycle/\n│ ├── gastown-boot/\n│ │ └── PROTO.md # Proto definition in markdown\n│ ├── rig-spinup/\n│ ├── rig-spindown/\n│ └── agent-restart/\n├── patrol/\n│ ├── deacon-patrol/\n│ ├── witness-patrol/\n│ └── refinery-patrol/\n└── work/\n ├── polecat-work/\n ├── code-review/\n └── feature/\n```\n\n## PROTO.md Format\n\n```markdown\n---\ntype: lifecycle\nparallel: [ensure-witnesses, ensure-refineries]\nephemeral: true\n---\n\n# mol-gastown-boot\n\nTown bootstrap molecule.\n\n## Step: ensure-daemon\n...\n```\n\n## Catalog Loading\n\n`gt sling gastown-boot` should find the proto by:\n1. Check beads for existing proto issue\n2. If not found, scan ~/gt/molecules/lifecycle/gastown-boot/\n3. Auto-create proto issue from PROTO.md\n\nThis enables file-based proto development with beads tracking.\n","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-22T21:00:16.200342-08:00","updated_at":"2025-12-22T21:00:16.200342-08:00","dependencies":[{"issue_id":"gt-mzal.3","depends_on_id":"gt-mzal","type":"parent-child","created_at":"2025-12-22T21:00:16.202058-08:00","created_by":"daemon"}]}
{"id":"gt-mzal.4","title":"Add parallel step support to molecules","description":"Enable steps to run in parallel within a molecule.\n\n## Current State\n\nMolecules have linear step dependencies via \"Needs:\" directive.\nSteps run sequentially.\n\n## Proposed Change\n\nAdd parallel grouping:\n\n```markdown\n## Step: ensure-witnesses\nParallel: true\n\n### Sub-steps\n- ensure-gastown-witness\n- ensure-beads-witness\n```\n\nOr via frontmatter:\n\n```yaml\n---\nparallel: [ensure-witnesses, ensure-refineries]\n---\n```\n\nSteps in parallel group:\n- Start simultaneously\n- Parent step closes when all children complete\n- Failures in one dont block others\n\n## Implementation\n\n1. Parse parallel directive in proto\n2. When bonding, create child steps with same dependency\n3. Executor spawns parallel children concurrently\n4. Track completion, close parent when all done\n\n## For Mayor Bootstrap\n\nMayor can check all witnesses in parallel, then all refineries,\nrather than sequentially. Faster boot time.\n","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-22T21:00:21.347723-08:00","updated_at":"2025-12-22T21:00:21.347723-08:00","dependencies":[{"issue_id":"gt-mzal.4","depends_on_id":"gt-mzal","type":"parent-child","created_at":"2025-12-22T21:00:21.348229-08:00","created_by":"daemon"}]}
{"id":"gt-mzal.5","title":"Add event-triggered lifecycle wisps","description":"Commands like `gt town start` should auto-trigger lifecycle wisps.\n\n## Event → Wisp Mapping\n\n| Command | Triggers Wisp |\n|---------|---------------|\n| gt town start | mol-gastown-boot |\n| gt rig add \u003cname\u003e | mol-rig-spinup (param: rig=\u003cname\u003e) |\n| gt rig remove \u003cname\u003e | mol-rig-spindown (param: rig=\u003cname\u003e) |\n| gt daemon restart | mol-gastown-boot |\n\n## Implementation\n\n1. Command implementation checks for lifecycle proto\n2. Auto-slings wisp to Mayor with --wisp flag\n3. Mayor picks up via molecule attachment\n\n## Alternative: Explicit Sling\n\nKeep commands simple, require explicit:\n\n```bash\ngt town start # Just starts sessions\ngt sling gastown-boot mayor/ --wisp # Bootstrap with verification\n```\n\nThis is more transparent - user sees the sling happen.\n\n## Recommendation\n\nStart with explicit sling. Add auto-trigger later once pattern proven.\n`gt town start --verified` could trigger the wisp.\n","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-22T21:00:22.311873-08:00","updated_at":"2025-12-22T21:00:22.311873-08:00","dependencies":[{"issue_id":"gt-mzal.5","depends_on_id":"gt-mzal","type":"parent-child","created_at":"2025-12-22T21:00:22.313864-08:00","created_by":"daemon"},{"issue_id":"gt-mzal.5","depends_on_id":"gt-mzal.3","type":"blocks","created_at":"2025-12-22T21:01:00.190423-08:00","created_by":"daemon"}]}
@@ -776,14 +751,14 @@
{"id":"gt-nq1a","title":"Add 'gt account add' command","description":"Register new account: create config dir, spawn claude with CLAUDE_CONFIG_DIR set, user completes /login, add entry to accounts.yaml.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T03:24:19.444213-08:00","updated_at":"2025-12-23T04:00:20.079908-08:00","closed_at":"2025-12-23T04:00:20.079908-08:00","close_reason":"Implemented gt account add with email/desc flags","dependencies":[{"issue_id":"gt-nq1a","depends_on_id":"gt-58tu","type":"blocks","created_at":"2025-12-23T03:24:34.722487-08:00","created_by":"daemon"}]}
{"id":"gt-nq6j","title":"Rename .beads-ephemeral to .beads-wisps in docs","description":"The wisp storage directory should be named `.beads-wisps/` not `.beads-ephemeral/`.\n\nAlso fix the architecture: Witness and Refinery share mayor/rig's beads and wisps.\nThey don't have separate ephemeral stores.\n\n## Files to update\n- docs/wisp-architecture.md\n- docs/architecture.md \n- ~/gt/docs/patrol-system-design.md\n- ~/gt/CLAUDE.md\n\n## Changes\n1. Rename `.beads-ephemeral/` → `.beads-wisps/` everywhere\n2. Remove incorrect references to witness/.beads-ephemeral/ and refinery/rig/.beads-ephemeral/\n3. Clarify that all rig-level patrols use mayor/rig/.beads-wisps/","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-21T23:38:04.110859-08:00","updated_at":"2025-12-22T02:59:00.441145-08:00","closed_at":"2025-12-22T02:59:00.441145-08:00","close_reason":"Renamed .beads-ephemeral to .beads-wisp, unified rig patrol storage"}
{"id":"gt-nqrh","title":"Auto-restart patrol agents after N loops","description":"All patrol roles should auto-restart to keep context usage low. Role-specific heuristics:\n\n**Deacon**: \n- 20 patrol loops without major incident\n- Immediate restart after ANY extraordinary action (lifecycle request, remediation, escalation)\n- Rationale: Keep context short so there's headroom if something big comes up\n\n**Witness**:\n- Based on polecats processed (not loop count)\n- Restart after processing N polecats (spawns, nudges, decommissions)\n- Suggested N: 10-15 polecats\n\n**Refinery**:\n- Based on MRs processed (not loop count) \n- Restart after processing N merge requests\n- Suggested N: 5-10 MRs (merges are context-heavy)\n\nBenefits:\n- Keeps context fresh (better focus/performance)\n- Reduces cost (quadratic increase vs conversation length)\n- Preserves headroom for handling surprises\n- Simple and predictable (no context estimation needed)\n\nEach role tracks their metric in state file and hands off when threshold reached.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T14:00:00.093148-08:00","updated_at":"2025-12-23T14:08:08.931232-08:00","closed_at":"2025-12-23T14:08:08.931232-08:00","close_reason":"Implemented context management heuristics in deacon, witness, and refinery templates"}
{"id":"gt-nriy","title":"Test: Alpha to Beta","description":"Sibling communication test","status":"open","priority":2,"issue_type":"message","assignee":"gastown-beta","created_at":"2025-12-20T21:44:00.731578-08:00","updated_at":"2025-12-20T21:44:00.731578-08:00","labels":["thread:thread-d94865313b74"],"sender":"Steve Yegge","wisp":true}
{"id":"gt-nsyy","title":"Merge: gt-h6eq.7","description":"branch: polecat/dag\ntarget: main\nsource_issue: gt-h6eq.7\nrig: gastown","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-23T11:42:39.260767-08:00","updated_at":"2025-12-23T12:22:23.453965-08:00","closed_at":"2025-12-23T12:22:23.453965-08:00","close_reason":"Merged to main in gt-h6eq swarm"}
{"id":"gt-nti8","title":"Polecats should not push branches to remote","description":"## Current Behavior\n\nPolecats push their branches to origin (e.g., `polecat/furiosa`), which pollutes the remote with many short-lived branches.\n\n## Desired Behavior\n\nPolecats should only commit locally. The Refinery handles all remote pushes:\n1. Polecat works on local `polecat/\u003cname\u003e` branch\n2. Polecat signals done (state → idle)\n3. Refinery pulls from local polecat branch\n4. Refinery runs tests, merges to main\n5. Refinery pushes main to remote\n6. If PR review needed, Refinery creates the PR\n\n## Benefits\n\n- Clean remote (no branch pollution)\n- Clear responsibility (Refinery is the quality gate)\n- Simpler cleanup (local branches deleted with worktree)\n- Less noise in GitHub UI\n\n## Trade-offs\n\n- If polecat crashes before Refinery merges, code is lost locally\n- But beads issue remains open, another polecat can redo the work\n- This is acceptable for ephemeral workers\n\n## Implementation\n\nIn polecat CLAUDE.md or landing protocol:\n- Remove `git push origin HEAD` from workflow\n- Replace with just `git commit` + signal done\n- Refinery handles the rest","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-21T14:13:48.804954-08:00","updated_at":"2025-12-21T14:13:48.804954-08:00"}
{"id":"gt-nvql","title":"max Handoff","status":"pinned","priority":2,"issue_type":"task","created_at":"2025-12-23T11:47:59.020501-08:00","updated_at":"2025-12-24T17:38:29.511168-08:00"}
{"id":"gt-nz6t","title":"Remove unused style helper functions","description":"internal/style/style.go defines RenderSuccess, RenderWarning, RenderError, and RenderInfo helper functions that are never used. Code uses style.Success.Render() directly instead. Either use the helpers consistently or remove them.","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-21T21:34:43.822193-08:00","updated_at":"2025-12-21T21:50:45.224202-08:00","closed_at":"2025-12-21T21:50:45.224202-08:00","close_reason":"Removed 4 unused style helper functions (RenderSuccess, RenderWarning, RenderError, RenderInfo)"}
{"id":"gt-o29j","title":"inspect-workers","description":"Capture output for each working polecat.\n\n```bash\ngt peek \u003crig\u003e/\u003cpolecat\u003e\n```\n\nNeeds: survey-workers","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T01:41:54.506324-08:00","updated_at":"2025-12-23T04:39:39.684381-08:00","closed_at":"2025-12-23T04:39:39.684381-08:00","close_reason":"Parent gt-751s superseded by Christmas Ornament pattern","dependencies":[{"issue_id":"gt-o29j","depends_on_id":"gt-751s","type":"parent-child","created_at":"2025-12-23T01:41:54.56996-08:00","created_by":"stevey"},{"issue_id":"gt-o29j","depends_on_id":"gt-ep7f","type":"blocks","created_at":"2025-12-23T01:41:54.577076-08:00","created_by":"stevey"}]}
{"id":"gt-o3is","title":"gt sling pinToHook doesn't set pinned boolean field","description":"## Updated Root Cause Analysis (2025-12-23)\n\nThe issue is **NOT** in gt as originally thought. It's in the beads (bd) codebase.\n\n### What happens:\n1. `bd pin` correctly sets pinned=1 in SQLite\n2. Any subsequent `bd` command (even `bd show`) resets pinned to 0\n3. This happens even with `--no-auto-import` and `--sandbox` flags\n\n### Evidence:\n```bash\n$ bd --no-daemon pin gt-k08o --for=max\n📌 Pinned gt-k08o to max's hook\n\n$ sqlite3 beads.db 'SELECT id, pinned FROM issues WHERE id=\"gt-k08o\"'\ngt-k08o|1 # ← Correct immediately after pin\n\n$ bd --no-daemon --no-auto-import show gt-k08o\n[shows issue without pinned field]\n\n$ sqlite3 beads.db 'SELECT id, pinned FROM issues WHERE id=\"gt-k08o\"' \ngt-k08o|0 # ← WRONG\\! bd show overwrote it\n```\n\n### Where to look:\nThe bug is likely in one of these beads code paths:\n- Some import/hydration running despite --no-auto-import\n- WAL mode not flushing before subsequent reads\n- Multi-repo or redirect handling corrupting pinned field\n\n### Workaround:\nThe handoff bead attachment mechanism (AttachMolecule) works correctly.\nThe pinned field is cosmetic for `bd hook` visibility only.\ngt sling correctly uses AttachMolecule for work assignment.\n\n### Next steps:\nCreate a beads issue to fix this properly in the bd codebase.\nThis is not a gt issue.","notes":"Created beads bug: bd-phtv in ~/gt/beads","status":"closed","priority":1,"issue_type":"bug","assignee":"gastown/furiosa","created_at":"2025-12-23T04:41:12.668958-08:00","updated_at":"2025-12-23T19:31:43.218529-08:00","closed_at":"2025-12-23T19:31:43.218529-08:00","close_reason":"Root-caused to beads codebase, not gt. Created beads bug bd-phtv to track the actual fix."}
{"id":"gt-o3is","title":"gt sling pinToHook doesn't set pinned boolean field","description":"## Updated Root Cause Analysis (2025-12-23)\n\nThe issue is **NOT** in gt as originally thought. It's in the beads (bd) codebase.\n\n### What happens:\n1. `bd pin` correctly sets pinned=1 in SQLite\n2. Any subsequent `bd` command (even `bd show`) resets pinned to 0\n3. This happens even with `--no-auto-import` and `--sandbox` flags\n\n### Evidence:\n```bash\n$ bd --no-daemon pin gt-k08o --for=max\n📌 Pinned gt-k08o to max's hook\n\n$ sqlite3 beads.db 'SELECT id, pinned FROM issues WHERE id=\"gt-k08o\"'\ngt-k08o|1 # ← Correct immediately after pin\n\n$ bd --no-daemon --no-auto-import show gt-k08o\n[shows issue without pinned field]\n\n$ sqlite3 beads.db 'SELECT id, pinned FROM issues WHERE id=\"gt-k08o\"' \ngt-k08o|0 # ← WRONG\\! bd show overwrote it\n```\n\n### Where to look:\nThe bug is likely in one of these beads code paths:\n- Some import/hydration running despite --no-auto-import\n- WAL mode not flushing before subsequent reads\n- Multi-repo or redirect handling corrupting pinned field\n\n### Workaround:\nThe handoff bead attachment mechanism (AttachMolecule) works correctly.\nThe pinned field is cosmetic for `bd hook` visibility only.\ngt sling correctly uses AttachMolecule for work assignment.\n\n### Next steps:\nCreate a beads issue to fix this properly in the bd codebase.\nThis is not a gt issue.","notes":"Created beads bug: bd-phtv in ~/gt/beads","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-23T04:41:12.668958-08:00","updated_at":"2025-12-24T20:41:58.630975-08:00","closed_at":"2025-12-23T19:31:43.218529-08:00","close_reason":"Root-caused to beads codebase, not gt. Created beads bug bd-phtv to track the actual fix."}
{"id":"gt-o40t","title":"gt sling --force: return displaced work to ready pool","description":"When slinging with --force to an agent with occupied hook, the displaced molecule should be returned to the ready pool rather than silently orphaned.\n\nCurrent behavior:\n- --force overwrites the hook attachment\n- Previous work becomes orphaned (still assigned but not pinned)\n\nDesired behavior:\n1. Unpin the displaced molecule (clear assignee, set pinned=false)\n2. Print warning in tool output: 'Warning: displaced gt-xxx back to ready pool'\n3. Proceed with new sling\n\nThis ensures:\n- No silent data loss\n- Agent sees the warning and can act on it\n- Human caller sees what happened\n- Displaced work is discoverable via 'bd ready'\n\nImplementation location: checkHookCollision() or the sling handlers themselves (after the --force check passes)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T16:00:23.713733-08:00","updated_at":"2025-12-23T16:07:14.482319-08:00","closed_at":"2025-12-23T16:07:14.482319-08:00","close_reason":"Closed"}
{"id":"gt-o5ra","title":"Digest: mol-deacon-patrol","description":"Patrol 1: All healthy, no lifecycle requests, 8 active sessions","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T20:54:13.477737-08:00","updated_at":"2025-12-24T20:54:13.477737-08:00","closed_at":"2025-12-24T20:54:13.477706-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-o5ra","depends_on_id":"gt-66e1","type":"parent-child","created_at":"2025-12-24T20:54:13.47836-08:00","created_by":"stevey"}]}
{"id":"gt-o75l","title":"Merge: gt-h6eq.3","description":"branch: polecat/keeper\ntarget: main\nsource_issue: gt-h6eq.3\nrig: gastown","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-23T11:49:58.84455-08:00","updated_at":"2025-12-23T12:22:23.431739-08:00","closed_at":"2025-12-23T12:22:23.431739-08:00","close_reason":"Merged to main in gt-h6eq swarm"}
{"id":"gt-ob0t","title":"Test Patrol Parent","description":"Test parent for Christmas Ornament pattern","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T12:46:15.328647-08:00","updated_at":"2025-12-24T12:46:15.610572-08:00","closed_at":"2025-12-24T12:46:15.610572-08:00","close_reason":"Closed"}
{"id":"gt-ob0t.1","title":"Test Polecat Arm","description":"Test child for bonding pattern","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T12:46:15.421667-08:00","updated_at":"2025-12-24T12:46:15.514723-08:00","closed_at":"2025-12-24T12:46:15.514723-08:00","close_reason":"Closed","dependencies":[{"issue_id":"gt-ob0t.1","depends_on_id":"gt-ob0t","type":"parent-child","created_at":"2025-12-24T12:46:15.422135-08:00","created_by":"daemon"}]}
@@ -817,15 +792,12 @@
{"id":"gt-plcg","title":"Add --account flag to gt spawn and gt crew attach","description":"Add --account=\u003chandle\u003e flag. Precedence: GT_ACCOUNT env \u003e --account flag \u003e default from config.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T03:24:23.832188-08:00","updated_at":"2025-12-23T04:04:18.491584-08:00","closed_at":"2025-12-23T04:04:18.491584-08:00","close_reason":"Added --account flag to gt spawn and gt crew at commands","dependencies":[{"issue_id":"gt-plcg","depends_on_id":"gt-58tu","type":"blocks","created_at":"2025-12-23T03:24:34.984336-08:00","created_by":"daemon"}]}
{"id":"gt-pmef","title":"Test Patrol Parent","description":"Test parent for Christmas Ornament pattern","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T22:04:44.376339-08:00","updated_at":"2025-12-23T22:04:44.648227-08:00","closed_at":"2025-12-23T22:04:44.648227-08:00","close_reason":"Closed"}
{"id":"gt-pmef.1","title":"Test Polecat Arm","description":"Test child for bonding pattern","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T22:04:44.468753-08:00","updated_at":"2025-12-23T22:04:44.560419-08:00","closed_at":"2025-12-23T22:04:44.560419-08:00","close_reason":"Closed","dependencies":[{"issue_id":"gt-pmef.1","depends_on_id":"gt-pmef","type":"parent-child","created_at":"2025-12-23T22:04:44.469169-08:00","created_by":"daemon"}]}
{"id":"gt-pnu4","title":"Test","description":"Body","status":"open","priority":2,"issue_type":"message","assignee":"gastown/alpha","created_at":"2025-12-20T21:38:39.019559-08:00","updated_at":"2025-12-20T21:38:39.019559-08:00","sender":"Steve Yegge","wisp":true}
{"id":"gt-poxd","title":"Create handoff beads for Witness and Refinery roles","description":"Each patrol role needs a pinned handoff bead to track attached molecules and patrol state.\n\n## Pattern (from Deacon)\n- Title: '\u003crole\u003e Handoff' (e.g., 'witness Handoff', 'refinery Handoff')\n- Status: pinned\n- Description contains structured state\n\n## Witness Handoff State\n\n```yaml\nattached_molecule: mol-witness-patrol\nattached_at: 2025-12-24T10:00:00Z\n\n# Nudge escalation tracking\nnudges:\n toast:\n count: 2\n last: \"2025-12-24T10:30:00Z\"\n ace:\n count: 0\n last: null\n\n# Polecats queued for cleanup\npending_cleanup:\n - nux # received POLECAT_DONE, awaiting verification\n```\n\n## Refinery Handoff State\n\n```yaml\nattached_molecule: mol-refinery-patrol\nattached_at: 2025-12-24T10:00:00Z\n\n# Merge queue tracking\nlast_processed_branch: polecat/toast\nbranches_merged_this_cycle: 3\n```\n\n## Tasks\n1. Create 'witness Handoff' bead in each rig's beads\n2. Create 'refinery Handoff' bead in each rig's beads\n3. Update Witness/Refinery startup to check handoff bead for attached work\n4. Update templates to document handoff bead usage\n5. Include nudge state schema for Witness\n6. Include merge state schema for Refinery\n\n## Note\nThese are rig-level beads (in gastown/.beads/, beads/.beads/), not town-level like deacon Handoff (in ~/gt/.beads/).\n\n## See Also\n- docs/witness-patrol-design.md - Theory of operation","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-23T13:19:41.055563-08:00","updated_at":"2025-12-24T00:18:03.026989-08:00","dependencies":[{"issue_id":"gt-poxd","depends_on_id":"gt-y481","type":"parent-child","created_at":"2025-12-23T13:20:15.89851-08:00","created_by":"daemon"}]}
{"id":"gt-pv93","title":"Post-work discovery: AI analysis finds follow-on issues","description":"AI analyzes completed work to discover: bugs, punted work, follow-on tasks.\n\n**From VC**: Supervisor.AnalyzeResult() with iterative refinement. ~300 lines.\n\n**Gas Town implementation**: Post-work hook in molecule:\n```yaml\npost_work:\n discover:\n - bugs\n - punted_items\n - follow_on_work\n file_as: beads\n```\n\nPolecat output gets analyzed by AI, discovered work becomes beads issues.\n\n**Value**: Nothing gets forgotten. VC found ~25% more issues with refinement.\n\n**Key**: Use semantic deduplication (gt-xxx) to avoid pollution.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-20T20:30:14.723338-08:00","updated_at":"2025-12-20T20:30:14.723338-08:00","dependencies":[{"issue_id":"gt-pv93","depends_on_id":"gt-zhpa","type":"parent-child","created_at":"2025-12-20T20:30:27.534886-08:00","created_by":"daemon"},{"issue_id":"gt-pv93","depends_on_id":"gt-6m3e","type":"related","created_at":"2025-12-20T20:30:35.115095-08:00","created_by":"daemon"}]}
{"id":"gt-pvzj","title":"Digest: mol-deacon-patrol @ 2025-12-24 20:23","description":"Patrol complete: inbox clear, all agents healthy, no orphans","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T20:23:09.751138-08:00","updated_at":"2025-12-24T20:23:09.751138-08:00","closed_at":"2025-12-24T20:23:09.751066-08:00","close_reason":"Squashed from wisp gt-sb2 (9 issues)"}
{"id":"gt-pwep","title":"implement","description":"Implement the solution for gt-test123. Follow codebase conventions.\nFile discovered work as new issues with bd create.\n\nMake regular commits with clear messages.\nKeep changes focused on the assigned issue.\n\nDepends: load-context","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T21:56:18.534804-08:00","updated_at":"2025-12-21T21:56:27.509304-08:00","closed_at":"2025-12-21T21:56:27.509304-08:00","close_reason":"test cleanup","dependencies":[{"issue_id":"gt-pwep","depends_on_id":"gt-zjqs","type":"parent-child","created_at":"2025-12-21T21:56:18.536244-08:00","created_by":"stevey"},{"issue_id":"gt-pwep","depends_on_id":"gt-mc4n","type":"blocks","created_at":"2025-12-21T21:56:18.536793-08:00","created_by":"stevey"}],"wisp":true}
{"id":"gt-pyqv","title":"Work on ga-ct2: Add MR workflow to polecat completion. Wh...","description":"Work on ga-ct2: Add MR workflow to polecat completion. When polecat completes work, auto-create MR to integration branch. When done, submit MR (not PR) to integration branch for Refinery.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-19T22:58:35.473928-08:00","updated_at":"2025-12-21T17:20:42.831549-08:00"}
{"id":"gt-q3ac","title":"Digest: mol-deacon-patrol @ 2025-12-24 19:24","description":"Patrol 9: quiet","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T19:24:50.821721-08:00","updated_at":"2025-12-24T19:24:50.821721-08:00","closed_at":"2025-12-24T19:24:50.821645-08:00","close_reason":"Squashed from wisp gt-dri (9 issues)"}
{"id":"gt-q511","title":"Digest: mol-deacon-patrol @ 2025-12-24 19:21","description":"Patrol 3: all healthy, no work","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T19:21:01.70741-08:00","updated_at":"2025-12-24T19:21:01.70741-08:00","closed_at":"2025-12-24T19:21:01.707329-08:00","close_reason":"Squashed from wisp gt-8ps (9 issues)"}
{"id":"gt-q6hl","title":"mol-polecat-work","description":"Full polecat lifecycle from assignment to decommission.\n\nThis proto enables nondeterministic idempotence for polecat work.\nA polecat that crashes after any step can restart, read its molecule state,\nand continue from the last completed step. No work is lost.\n\nVariables:\n- gt-qwyu - The source issue ID being worked on","status":"closed","priority":2,"issue_type":"epic","assignee":"gastown/furiosa","created_at":"2025-12-21T21:58:52.59934-08:00","updated_at":"2025-12-21T21:59:10.937705-08:00","closed_at":"2025-12-21T21:59:10.937705-08:00","close_reason":"test cleanup","wisp":true}
{"id":"gt-q6lg","title":"mol-crew-session: Startup/shutdown protocols for crew workers","description":"Crew workers (like joe, max) don't have patrol molecules keeping them fresh. When gt gets rebuilt, they have stale binaries that cause hangs and bugs.\n\n## Problem\n\n- Crew binaries get stale when gt is rebuilt elsewhere\n- No automatic pull/rebase/rebuild on session start\n- No standardized shutdown protocol (sync, push, handoff)\n\n## Solution: mol-crew-session\n\nA molecule template for crew sessions:\n\n### Startup Phase\n1. `git pull --rebase` - get latest code\n2. `bd sync` - sync beads\n3. `go build -o gt ./cmd/gt` - rebuild gt (if in gastown)\n4. `gt prime` - load context\n\n### Work Phase \n- Open-ended human interaction\n- No molecule steps - just work until done\n\n### Shutdown Phase\n1. `git status` - check for uncommitted changes\n2. `bd sync` - sync beads\n3. `git push` - push code\n4. Handoff if incomplete work\n\n## Implementation\n\n1. Define mol-crew-session in builtin_molecules.go\n2. Update crew CLAUDE.md to reference the protocol\n3. Optionally: gt prime auto-runs startup steps\n\n## Dependencies\n\n- Should implement after deacon/witness/polecat patrols are stable\n- Consider: gt-3x0z.10 (Witness patrol molecules)\n\n## Related\n\n- gt-3x0z.9: Deacon wisp patrol (done)\n- fix-gt script: Current workaround for binary freshness","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-22T02:48:25.658692-08:00","updated_at":"2025-12-22T02:48:25.658692-08:00"}
{"id":"gt-q8du","title":"Configuration in Beads: use pinned beads for rig/agent config","description":"## Summary\n\nMove configuration from JSON files into Beads data plane using pinned beads.\n\n## Motivation\n\n- Config becomes versionable and syncable like issues\n- Agents can read config via `bd show`\n- Unified data model for everything\n- Supports the 'Beads as Universal Data Plane' vision (gt-aqm)\n\n## Config Types to Migrate\n\n### Rig-level (pinned per rig)\n- Theme/colors for tmux status line\n- Default branch naming conventions\n- Merge queue settings\n- Witness thresholds\n\n### Agent-level (pinned per role)\n- Handoffs (already planned - gt-cu7r)\n- Agent preferences\n- Current focus/context\n\n### Town-level (pinned at town root)\n- Cross-rig settings\n- Federation config\n- Global themes\n\n## Implementation\n\n1. Implement StatusPinned (beads-6v2) ✓ in progress\n2. Create config pinned beads on rig init\n3. Add `bd config get/set` commands that read/write pinned beads\n4. Migrate existing config.json fields\n\n## Naming Convention\n\n```\n\u003cprefix\u003e-cfg-\u003cscope\u003e\ngt-cfg-theme # gastown theme\nbd-cfg-merge # beads merge settings\ngm-cfg-town # town-level config\n```\n\n## Dependencies\n\n- beads-6v2: Add StatusPinned to beads schema\n- gm-w13: Pinned Beads epic","status":"open","priority":2,"issue_type":"epic","created_at":"2025-12-18T21:58:59.898116-08:00","updated_at":"2025-12-18T21:58:59.898116-08:00"}
{"id":"gt-qaca","title":"Merge: gt-5af.2","description":"branch: polecat/Doof\ntarget: main\nsource_issue: gt-5af.2\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-19T17:29:36.838038-08:00","updated_at":"2025-12-20T23:17:25.79048-08:00","closed_at":"2025-12-20T23:17:25.79048-08:00","close_reason":"Branches nuked, MRs obsolete"}
@@ -834,13 +806,13 @@
{"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-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":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-23T01:39:31.895817-08:00","updated_at":"2025-12-24T14:05:05.645834-08:00","closed_at":"2025-12-24T14:05:05.645834-08:00","close_reason":"Superseded by mol-witness-patrol proto","labels":["template"]}
{"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","dependencies":[{"issue_id":"gt-qgbe","depends_on_id":"gt-x0yu","type":"parent-child","created_at":"2025-12-24T20:55:49.187538-08:00","created_by":"stevey"}]}
{"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-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"}
{"id":"gt-qp2w","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","assignee":"stevey","created_at":"2025-12-23T16:18:21.59836-08:00","updated_at":"2025-12-23T16:18:21.614437-08:00","wisp":true}
{"id":"gt-qp98","title":"Refactor: Eliminate state.json, use beads assignee field for polecat state","description":"## Problem\n\nstate.json in each polecat worktree duplicates data that should be in beads:\n- `issue` field duplicates assignment (should be issue.assignee)\n- `state` field duplicates status (derivable from issue.status)\n- `name/rig/branch/clone_path` are all derivable from filesystem/git\n\nThis violates 'Beads as the data plane' (HOP Decision 001).\n\n## Current State\n\n```json\n{\n \"name\": \"Angharad\", // Derivable: basename(cwd)\n \"rig\": \"gastown\", // Derivable: parent dir name\n \"state\": \"working\", // Should be: issue.status\n \"clone_path\": \"/path\", // Derivable: cwd\n \"branch\": \"polecat/X\", // Derivable: git branch\n \"issue\": \"gt-xyz\", // Should be: issue.assignee\n \"timestamps\": \"...\" // Should be in beads history\n}\n```\n\n## Target State\n\n**Polecat identity**: Derived from worktree path\n**Polecat assignment**: `issue.assignee = 'gastown/Angharad'`\n**Polecat state**: Derived from issue.status (in_progress = working, closed = done)\n**Polecat existence**: Worktree directory exists\n\n## Benefits\n\n1. Single source of truth (no sync issues)\n2. Queryable: `bd list --assignee=gastown/Angharad`\n3. History tracking via beads\n4. Cross-agent coordination via beads sync\n5. Simpler code (no state file management)\n\n## Implementation\n\n1. Update `gt spawn` to set issue.assignee instead of writing state.json\n2. Update polecat list/status commands to query beads\n3. Update Witness to query beads for polecat state\n4. Remove state.json read/write code\n5. Keep state.json as optional bootstrap cache (perf optimization only)","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T11:40:33.389689-08:00","updated_at":"2025-12-19T12:07:43.519059-08:00","closed_at":"2025-12-19T12:07:43.519059-08:00"}
{"id":"gt-qqtk","title":"Speed up test suite","description":"Tests are running slow during MQ processing. Investigate and optimize:\n- Profile test execution time\n- Look for slow tests (network, file I/O, sleeps)\n- Consider parallel test execution\n- Cache expensive setup where possible","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-19T17:44:14.597955-08:00","updated_at":"2025-12-19T17:44:14.597955-08:00"}
{"id":"gt-qrze","title":"Work on gt-role-template: Refine witness/CLAUDE.md role t...","description":"Work on gt-role-template: Refine witness/CLAUDE.md role template. Add clearer heartbeat protocol, mail checking procedure, nudge decision criteria, escalation thresholds. Run 'bd show gt-role-template' for details.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-20T07:53:27.305468-08:00","updated_at":"2025-12-20T07:58:39.269234-08:00","closed_at":"2025-12-20T07:58:39.269234-08:00"}
@@ -887,7 +859,7 @@
{"id":"gt-rana.2","title":"Phase 1.2: Daemon attachment detection","description":"Daemon polls Deacon's pinned bead to detect naked state.\n\n## Implementation\n- Daemon knows Deacon's pinned bead ID\n- Every heartbeat cycle: bd show \u003cpinned\u003e --json\n- Parse attached_molecule field\n- If null/empty: Deacon is naked\n\n## Actions on Naked\n- Spawn mol-deacon-patrol\n- Attach to Deacon's pinned\n- Nudge Deacon to start\n\n## Failsafes\n- Keepalive file monitoring\n- Stale detection (\u003e10min no progress)\n- Force nudge on stale\n\nDepends: gt-rana.1","status":"closed","priority":1,"issue_type":"task","assignee":"gastown/nux","created_at":"2025-12-21T13:38:53.520213-08:00","updated_at":"2025-12-21T17:28:16.072229-08:00","closed_at":"2025-12-21T17:28:16.072229-08:00","close_reason":"Already implemented: checkDeaconAttachment() in daemon.go polls pinned bead, detects naked state, spawns patrol, attaches molecule, and nudges Deacon. Failsafes include heartbeat monitoring and stale detection with backoff.","dependencies":[{"issue_id":"gt-rana.2","depends_on_id":"gt-rana","type":"parent-child","created_at":"2025-12-21T13:38:53.521672-08:00","created_by":"daemon"},{"issue_id":"gt-rana.2","depends_on_id":"gt-rana.1","type":"blocks","created_at":"2025-12-21T13:39:11.333008-08:00","created_by":"daemon"}]}
{"id":"gt-rana.3","title":"Phase 1.3: mol-deacon-patrol definition","description":"Define the Deacon patrol molecule in builtin_molecules.go.\n\n## Steps\n1. inbox-check - Handle callbacks from agents\n2. health-scan - Ping Witnesses and Refineries\n3. plugin-run - Execute registered plugins\n4. orphan-check - Find abandoned work\n5. session-gc - Clean dead sessions\n6. context-check - Check own context limit\n7. loop-or-exit - Burn and let daemon respawn, or exit if context high\n\n## Implementation\n- Add DeaconPatrolMolecule() to builtin_molecules.go\n- Add to BuiltinMolecules() list\n- Test with bd mol show mol-deacon-patrol","status":"closed","priority":1,"issue_type":"task","assignee":"gastown/dementus","created_at":"2025-12-21T13:38:54.555938-08:00","updated_at":"2025-12-21T15:39:16.769062-08:00","closed_at":"2025-12-21T15:39:16.769062-08:00","close_reason":"Closed","dependencies":[{"issue_id":"gt-rana.3","depends_on_id":"gt-rana","type":"parent-child","created_at":"2025-12-21T13:38:54.55744-08:00","created_by":"daemon"}]}
{"id":"gt-rana.4","title":"Phase 1.4: Basic patrol runner in Deacon","description":"Deacon CLAUDE.md and prime context for patrol execution.\n\n## Deacon Context\n- Update Deacon CLAUDE.md with patrol instructions\n- On wake: check pinned bead for attachment\n- If attached: resume molecule from current step\n- Execute steps, close each when done\n- On final step: burn molecule, go naked\n\n## gt prime Enhancement\n- Detect if agent has attached molecule\n- Show molecule progress in prime output\n- Include patrol-specific instructions\n\nDepends: gt-rana.3","status":"closed","priority":1,"issue_type":"task","assignee":"gastown/furiosa","created_at":"2025-12-21T13:38:55.457748-08:00","updated_at":"2025-12-21T18:53:30.80872-08:00","closed_at":"2025-12-21T18:53:30.80872-08:00","close_reason":"Fixed Deacon patrol commands: gt mol → bd mol run, gt mol burn → bd close. Prime already detects molecules.","dependencies":[{"issue_id":"gt-rana.4","depends_on_id":"gt-rana","type":"parent-child","created_at":"2025-12-21T13:38:55.459852-08:00","created_by":"daemon"},{"issue_id":"gt-rana.4","depends_on_id":"gt-rana.3","type":"blocks","created_at":"2025-12-21T13:39:11.402784-08:00","created_by":"daemon"},{"issue_id":"gt-rana.4","depends_on_id":"gt-3x0z.8","type":"blocks","created_at":"2025-12-21T15:20:16.297449-08:00","created_by":"daemon"}]}
{"id":"gt-rana.5","title":"Phase 2: Quiescent agents (Witness, Refinery)","description":"Enable Witness and Refinery to sleep until triggered.\n\n## Scope\n- Wake triggers: gt spawn, MR submit, mail, Deacon ping\n- Wake SLA: \u003c1 minute\n- mol-witness-patrol and mol-refinery-patrol definitions\n- Quiescent entry/exit protocol\n\n## Implementation\n- Kill tmux session on quiescent entry\n- Preserve sandbox (worktree, state files)\n- Restart session on wake trigger\n- Agent checks pinned, spawns default patrol if naked\n\nDepends: Phase 1 complete","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-21T13:39:12.926917-08:00","updated_at":"2025-12-21T13:39:12.926917-08:00","dependencies":[{"issue_id":"gt-rana.5","depends_on_id":"gt-rana.4","type":"blocks","created_at":"2025-12-21T13:39:23.067953-08:00","created_by":"daemon"}]}
{"id":"gt-rana.5","title":"Phase 2: Quiescent agents (Witness, Refinery)","description":"Enable Witness and Refinery to sleep until triggered.\n\n## Scope\n- Wake triggers: gt spawn, MR submit, mail, Deacon ping\n- Wake SLA: \u003c1 minute\n- mol-witness-patrol and mol-refinery-patrol definitions\n- Quiescent entry/exit protocol\n\n## Implementation\n- Kill tmux session on quiescent entry\n- Preserve sandbox (worktree, state files)\n- Restart session on wake trigger\n- Agent checks pinned, spawns default patrol if naked\n\nDepends: Phase 1 complete","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-21T13:39:12.926917-08:00","updated_at":"2025-12-21T13:39:12.926917-08:00","dependencies":[{"issue_id":"gt-rana.5","depends_on_id":"gt-rana","type":"parent-child","created_at":"2025-12-21T13:39:12.928741-08:00","created_by":"daemon"},{"issue_id":"gt-rana.5","depends_on_id":"gt-rana.4","type":"blocks","created_at":"2025-12-21T13:39:23.067953-08:00","created_by":"daemon"}]}
{"id":"gt-rana.6","title":"Phase 3: Callbacks and plugins","description":"Mail-based callback protocol and plugin surface.\n\n## Callbacks\n- Polecat → Witness: shutdown requests\n- Witness → Deacon: escalations, status\n- Crew → Deacon: recycle requests\n- Deacon → Mayor: escalations\n\n## Plugins\n- .beads/plugins.yaml registry\n- Cooldown tracking\n- Plugin runner in deacon patrol\n\nDepends: Phase 2","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-21T13:39:14.120827-08:00","updated_at":"2025-12-21T13:39:14.120827-08:00","dependencies":[{"issue_id":"gt-rana.6","depends_on_id":"gt-rana","type":"parent-child","created_at":"2025-12-21T13:39:14.122713-08:00","created_by":"daemon"},{"issue_id":"gt-rana.6","depends_on_id":"gt-rana.5","type":"blocks","created_at":"2025-12-21T13:39:23.138268-08:00","created_by":"daemon"}]}
{"id":"gt-rana.7","title":"Phase 4: Polish and observability","description":"Production readiness.\n\n## Commands\n- gt patrol status - Show patrol state for all agents\n- gt patrol history - Recent patrol activity\n\n## Observability\n- Metrics collection\n- Alert thresholds\n- Dashboard (optional)\n\n## Tuning\n- Cooldown optimization\n- Wake SLA verification\n- Error threshold tuning\n\nDepends: Phase 3","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-21T13:39:15.421608-08:00","updated_at":"2025-12-21T13:39:15.421608-08:00","dependencies":[{"issue_id":"gt-rana.7","depends_on_id":"gt-rana","type":"parent-child","created_at":"2025-12-21T13:39:15.423245-08:00","created_by":"daemon"},{"issue_id":"gt-rana.7","depends_on_id":"gt-rana.6","type":"blocks","created_at":"2025-12-21T13:39:23.209512-08:00","created_by":"daemon"}]}
{"id":"gt-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"}
@@ -953,7 +925,6 @@
{"id":"gt-ts4u","title":"Merge: gt-h5n.5","description":"branch: polecat/Scabrous\ntarget: main\nsource_issue: gt-h5n.5\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-19T14:53:43.268861-08:00","updated_at":"2025-12-20T23:17:25.78812-08:00","closed_at":"2025-12-20T23:17:25.78812-08:00","close_reason":"Branches nuked, MRs obsolete"}
{"id":"gt-tubn","title":"Track operational stats as entity/audit beads","description":"Witness and refinery track operational stats in JSON files:\n- total_merged, today_merged, total_failed (refinery)\n- total_checks, total_nudges, total_escalations (witness)\n\nFor HOP entity CV tracking, these could become:\n- type=audit beads (daily roll-ups of operational metrics)\n- Entity chain entries showing validator activity\n\nThis provides observability and contributes to entity reputation tracking (e.g., refinery X has merged 500 PRs with 2% failure rate).\n\nNot critical for launch but aligns with HOP Platform of Platforms vision.","status":"open","priority":4,"issue_type":"feature","created_at":"2025-12-21T22:07:30.404073-08:00","updated_at":"2025-12-21T22:07:30.404073-08:00"}
{"id":"gt-tulx","title":"gt mq submit: creates task type instead of merge-request type","description":"## Problem\n\n`gt mq submit` creates an issue with `type: task` but should be `type: merge-request`.\n\n## Evidence\n\n```\n$ bd show gt-n508\ngt-n508: Merge: gt-70b3\nStatus: open\nPriority: P1\nType: task \u003c-- WRONG, should be merge-request\n...\nDescription:\ntype: merge-request \u003c-- Correct type is in description, not in actual type field\n```\n\n## Impact\n\n`gt mq list` shows empty queue because it queries for `type: merge-request`\n\n## Fix\n\n`gt mq submit` should set `--type merge-request` when creating the bead.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-18T21:57:37.905848-08:00","updated_at":"2025-12-18T22:16:31.393114-08:00","closed_at":"2025-12-18T22:16:31.393114-08:00"}
{"id":"gt-tvos","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-test123) and understand the requirements.\nIdentify any blockers or missing information.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-21T21:48:26.32141-08:00","updated_at":"2025-12-21T21:48:26.32141-08:00","dependencies":[{"issue_id":"gt-tvos","depends_on_id":"gt-i4lo","type":"parent-child","created_at":"2025-12-21T21:48:26.323129-08:00","created_by":"stevey"}],"wisp":true}
{"id":"gt-tw1g","title":"Startup hook should validate attached molecule is still open","description":"When the SessionStart hook outputs attached_molecule from the handoff bead, it should check if that molecule is still open. If closed, it should:\n1. Clear the stale attachment\n2. Auto-spawn a fresh patrol molecule\n3. Attach the new patrol\n\nCurrently it just outputs the stale reference without validation, leaving the Deacon confused about what to run.","status":"open","priority":2,"issue_type":"bug","created_at":"2025-12-23T13:16:51.73028-08:00","updated_at":"2025-12-23T13:16:51.73028-08:00"}
{"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"}
@@ -1008,14 +979,12 @@
{"id":"gt-vdp0","title":"Crew workers getting wrong CLAUDE.md (shows Refinery)","description":"## Problem\n\nCrew workers (emma, dave) have CLAUDE.md that says they're the Refinery.\n\n## Evidence\n\n```\n$ head -5 /Users/stevey/gt/beads/crew/emma/CLAUDE.md\n# Claude: Beads Refinery\nYou are the **Refinery** for the **beads** rig...\n```\n\n## Expected\n\nShould use crew.md.tmpl which correctly says:\n```\n# Crew Worker Context\nYou are a **crew worker** - the overseer's (human's) personal workspace...\n```\n\n## Impact\n\n- Crew workers have wrong identity in static context\n- `gt prime` correctly outputs crew context, but CLAUDE.md conflicts\n- Confusing role information\n\n## Fix\n\nCheck `gt crew create` or whatever populates CLAUDE.md for crew workers.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-18T21:40:56.518032-08:00","updated_at":"2025-12-19T01:33:49.863259-08:00","closed_at":"2025-12-19T01:33:49.863259-08:00","dependencies":[{"issue_id":"gt-vdp0","depends_on_id":"gt-l4gm","type":"blocks","created_at":"2025-12-18T21:50:04.955247-08:00","created_by":"daemon"}]}
{"id":"gt-vg4n","title":"Use Beads issue status as spawn source of truth","description":"Currently witness tracks spawned issues in .gastown/witness.json to prevent re-spawning:\n\n{\"spawned_issues\": [\"gt-abc1\", \"gt-def2\", ...]}\n\nThis is redundant with Beads issue status (in_progress). The witness could query:\n bd list --status=in_progress\n\nThe local list serves as a performance cache to avoid querying beads every cycle. Consider:\n1. Use Beads as source of truth\n2. Keep local cache with TTL\n3. Sync cache on witness start\n\nThis simplifies state management and ensures consistency.","status":"open","priority":4,"issue_type":"task","created_at":"2025-12-21T22:07:31.756863-08:00","updated_at":"2025-12-21T22:07:31.756863-08:00"}
{"id":"gt-vg6u","title":"TIDY UP: Your previous work (gt-odvf: bd mol CLI docs) wa...","description":"TIDY UP: Your previous work (gt-odvf: bd mol CLI docs) 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/slit","created_at":"2025-12-21T17:26:20.360645-08:00","updated_at":"2025-12-21T17:30:05.985463-08:00","closed_at":"2025-12-21T17:30:05.985463-08:00","close_reason":"Polecats cleaned up after reboot"}
{"id":"gt-vhby","title":"implement","description":"Implement the solution for gt-test123. Follow codebase conventions.\nFile discovered work as new issues with bd create.\n\nMake regular commits with clear messages.\nKeep changes focused on the assigned issue.\n\nDepends: load-context","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-21T21:48:26.321647-08:00","updated_at":"2025-12-21T21:48:26.321647-08:00","dependencies":[{"issue_id":"gt-vhby","depends_on_id":"gt-i4lo","type":"parent-child","created_at":"2025-12-21T21:48:26.323953-08:00","created_by":"stevey"},{"issue_id":"gt-vhby","depends_on_id":"gt-tvos","type":"blocks","created_at":"2025-12-21T21:48:26.324548-08:00","created_by":"stevey"}],"wisp":true}
{"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-23T22:27:56.979927-08:00","closed_at":"2025-12-23T22:27:56.979927-08:00","close_reason":"Closed"}
{"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":"closed","priority":1,"issue_type":"task","created_at":"2025-12-16T01:27:52.796587-08:00","updated_at":"2025-12-16T01:51:37.409965-08:00","closed_at":"2025-12-16T01:51:37.409965-08:00"}
{"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":"open","priority":1,"issue_type":"task","created_at":"2025-12-23T14:35:24.695717-08:00","updated_at":"2025-12-23T22:29:25.077865-08:00"}
{"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)"}
{"id":"gt-vmpo","title":"orphan-check","description":"Find abandoned work. Check for in_progress issues with no active agent.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T14:27:33.988644-08:00","updated_at":"2025-12-23T20:33:21.387139-08:00","closed_at":"2025-12-23T20:33:21.387139-08:00","close_reason":"Patrol complete - 6 polecats working, no orphans","dependencies":[{"issue_id":"gt-vmpo","depends_on_id":"gt-2x79","type":"parent-child","created_at":"2025-12-23T14:27:33.989241-08:00","created_by":"stevey"}],"wisp":true}
{"id":"gt-vnp9","title":"tmux notifications: display-message too subtle, use send-keys instead","description":"## Problem\n\n`tmux display-message` notifications are not visible enough - they appear briefly in the status bar and are easy to miss.\n\n## Current Behavior\n\nrouter.go uses:\n```go\nr.tmux.DisplayMessageDefault(sessionID, notification)\n```\n\n## What Works\n\nSending echo commands directly to the terminal:\n```bash\ntmux send-keys -t \u003csession\u003e \"echo '📬 NEW MAIL from mayor'\" Enter\n```\n\n## Proposed Fix\n\nChange notification method to send visible output to the terminal, perhaps with a box/banner:\n```\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n📬 NEW MAIL from mayor\nSubject: \u003csubject\u003e\nRun: bd mail inbox\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n```\n\n## Considerations\n\n- This interrupts the terminal output (acceptable for important mail)\n- Could check if Claude is mid-response and queue notification\n- Or use tmux popup if available","notes":"Additional issues:\n1. Enter key not sent properly when chained with send-keys\n2. Need to debounce and send Enter separately\n3. Correct pattern: send text, sleep briefly, then send Enter","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-18T21:35:28.542985-08:00","updated_at":"2025-12-19T12:00:29.342381-08:00","closed_at":"2025-12-19T12:00:29.342381-08:00"}
{"id":"gt-vv4i","title":"Polecat template: move session close checklist into molecule steps","description":"Template has prose checklists for 'Before Signaling Done' and 'SESSION CLOSE PROTOCOL'. These should be encoded as tail steps in the polecat molecule, not repeated as prose in CLAUDE.md. Reduces duplication and ensures the steps are actually followed.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T16:56:50.666492-08:00","updated_at":"2025-12-23T17:09:02.141194-08:00","closed_at":"2025-12-23T17:09:02.141194-08:00","close_reason":"Completed in commit 1931ec7","dependencies":[{"issue_id":"gt-vv4i","depends_on_id":"gt-t9u7","type":"parent-child","created_at":"2025-12-23T16:57:16.612852-08:00","created_by":"daemon"}]}
{"id":"gt-vzic","title":"README missing prerequisites section (tmux required)","description":"The README.md does not mention that tmux is required.\nAll agent sessions use tmux, but fresh users have no way to know this.\n\nAdd prerequisites section:\n- Go 1.23+\n- Git\n- tmux (required for agent sessions)\n- Claude Code CLI (for agents)","status":"open","priority":1,"issue_type":"bug","created_at":"2025-12-24T12:50:28.988771-08:00","updated_at":"2025-12-24T12:50:28.988771-08:00","dependencies":[{"issue_id":"gt-vzic","depends_on_id":"gt-jo9n","type":"blocks","created_at":"2025-12-24T12:52:04.860313-08:00","created_by":"daemon"}]}
@@ -1032,7 +1001,6 @@
{"id":"gt-wmhj","title":"tmux link-window auto-selects new window, causing agent confusion","description":"## Summary\n\nWhen running `gt crew at \u003cother\u003e` from inside a tmux session, the linked window auto-selects, causing the user to unknowingly switch agents.\n\n## Root Cause\n\n`internal/tmux/tmux.go:535-538` - `LinkWindow` doesn't use `-d` flag:\n```go\n_, err := t.run(\"link-window\", \"-s\", source) // Missing -d!\n```\n\nBy default, `tmux link-window` selects the newly linked window.\n\n## Reproduction\n\n1. Be in Max's tmux session talking to Max\n2. Ask Max to run `gt crew at joe`\n3. Max creates Joe's session and links it\n4. User is now in Joe's window without realizing it\n5. Max appears to have 'disappeared'\n\n## Fix\n\nAdd `-d` flag to prevent auto-selection:\n```go\n_, err := t.run(\"link-window\", \"-s\", source, \"-d\")\n```\n\n## Related\n\n- gt-09i4: Unify tmux session lifecycle (broader epic Max filed)\n","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-24T14:33:40.40319-08:00","updated_at":"2025-12-24T14:34:01.227518-08:00","closed_at":"2025-12-24T14:34:01.227518-08:00","close_reason":"Fixed by adding -d flag to link-window"}
{"id":"gt-wpg","title":"Replaceable notifications via Claude Code queue","description":"Leverage Claude Code's ability to replace queued text for notifications that supersede previous ones.\n\n## Problem\n\nIf daemon sends 10 heartbeats while agent is busy, agent returns to see 10 stacked messages. Wasteful and noisy.\n\n## Solution\n\nUse Claude Code's queue replacement for:\n- Heartbeat messages (only latest matters)\n- Status updates that supersede previous\n- Progress notifications\n\n## Implementation\n\nNotifications get a 'slot' identifier. New notification in same slot replaces old one:\n- Slot: 'heartbeat' → only one heartbeat queued at a time\n- Slot: 'status-\u003crig\u003e' → latest status per rig\n- No slot → stacks normally (for unique messages)\n\n## Research Needed\n\n- How does Claude Code expose queue replacement?\n- tmux send-keys behavior with pending input\n- Alternative: clear + resend pattern","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-18T14:19:29.821949-08:00","updated_at":"2025-12-20T13:19:00.398942-08:00","closed_at":"2025-12-20T13:19:00.398942-08:00","dependencies":[{"issue_id":"gt-wpg","depends_on_id":"gt-99m","type":"blocks","created_at":"2025-12-18T14:19:46.656972-08:00","created_by":"daemon"}]}
{"id":"gt-wqck","title":"bd doctor: detect clone divergence emergencies","description":"Add doctor check to detect:\n1. Crew/Mayor on feature branches (should always be on main)\n2. Significant divergence between clones that should be in sync\n3. Distinguish from normal beads-sync vs main divergence (expected)\n\nContext: bd sync --status shows all divergence as equal, but some is emergency (clones drifted) vs normal (sync branch mechanics).","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-24T20:26:32.71018-08:00","updated_at":"2025-12-24T20:26:32.71018-08:00"}
{"id":"gt-wrw2","title":"Test2","description":"Testing gt mail","status":"open","priority":2,"issue_type":"message","assignee":"gastown-alpha","created_at":"2025-12-20T21:39:05.875792-08:00","updated_at":"2025-12-20T21:39:05.875792-08:00","labels":["thread:thread-1fd9f932cef0"],"sender":"Steve Yegge","wisp":true}
{"id":"gt-wusk","title":"Layered context onboarding pattern","description":"Pattern from handoff discussion:\n\n## Pattern: Layered Context Onboarding\n\nTown CLAUDE.md (user/org) -\u003e Rig CLAUDE.md (project) -\u003e Role priming\n\n## Ultra-compressed HOP for workers (no reveal)\n\n- Permanent record: All work tracked. Outcomes matter.\n- Quality gates: Molecule steps exist for a reason.\n- Attribution: Completions build your track record.\n- Handoff clean: Leave state any worker can continue.\n\n## Recommendation\n\nCreate Town @AGENTS.md for shared worker context that all workers see.\nThis provides common behavioral guidance without revealing full HOP context.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-20T00:55:11.984103-08:00","updated_at":"2025-12-20T00:55:11.984103-08:00"}
{"id":"gt-wvyi","title":"sling pin test 2","status":"closed","priority":2,"issue_type":"task","assignee":"max","created_at":"2025-12-23T11:51:01.899435-08:00","updated_at":"2025-12-23T12:03:22.256591-08:00","closed_at":"2025-12-23T12:03:22.256591-08:00","close_reason":"test issue for gt-o3is debugging"}
{"id":"gt-wy8t","title":"Add live polling and updates","description":"Implement live polling (500ms default) for activity updates. Merge new events into view without flickering. Show connection status indicator. Handle daemon disconnects gracefully.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T16:27:18.127611-08:00","updated_at":"2025-12-23T16:27:18.127611-08:00","dependencies":[{"issue_id":"gt-wy8t","depends_on_id":"gt-3p77","type":"blocks","created_at":"2025-12-23T16:27:38.7256-08:00","created_by":"daemon"},{"issue_id":"gt-wy8t","depends_on_id":"gt-rivr","type":"parent-child","created_at":"2025-12-23T16:28:30.942591-08:00","created_by":"daemon"}]}
@@ -1075,7 +1043,6 @@
{"id":"gt-z4bw","title":"Refactor sling to hook plus handoff","description":"Replace gt sling with gt hook (durability) and gt handoff bead (hook+restart)","status":"closed","priority":0,"issue_type":"task","created_at":"2025-12-24T16:42:00.384256-08:00","updated_at":"2025-12-24T20:41:36.266572-08:00","closed_at":"2025-12-24T20:41:36.266572-08:00","close_reason":"Implemented gt hook and updated gt handoff to accept bead arg. Deprecated gt sling."}
{"id":"gt-z4g","title":"Plugin: Plan-to-Epic converter","description":"## Purpose\n\nHelp users create beads epics from various planning inputs.\n\n## Inputs\n- Markdown task lists\n- GitHub issues\n- Linear/Jira exports\n- Free-form descriptions\n- Existing beads epics\n\n## Output\n- Beads epic with properly structured children\n- Dependencies set for wave ordering\n- Priorities assigned\n- Ready for `gt spawn --epic \u003cid\u003e`\n\n## Implementation Options\n\n### Option A: CLI Tool\n```bash\ngt plan import --from github --repo owner/repo --label batch-candidate\ngt plan import --from markdown tasks.md\ngt plan structure \u003cepic-id\u003e # analyze and add dependencies\n```\n\n### Option B: Plugin Agent\nA plugin at `\u003crig\u003e/plugins/plan-oracle/` that:\n- Receives planning requests via mail\n- Analyzes scope and requirements\n- Creates structured beads epic\n- Sets dependencies based on analysis\n\n### Option C: Interactive Mode\n```bash\ngt plan create\n# Walks through questions, creates epic interactively\n```\n\n## Axiom\n\nAs stated: 'The Planning phase should end in the creation of a workable Beads plan.'\n\nThis plugin bridges the gap between human planning and machine-executable work.\n\n## Priority\n\nP2 - Nice to have for MVP. Manual epic creation works for now.\n\n## Note\n\nNo \"swarm IDs\" - output is just a beads epic with children. Workers process it independently.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-16T02:10:20.663549-08:00","updated_at":"2025-12-16T17:26:41.087304-08:00"}
{"id":"gt-z6a5","title":"Digest: mol-deacon-patrol @ 2025-12-24 19:43","description":"Patrol 3: All healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T19:43:12.75587-08:00","updated_at":"2025-12-24T19:43:12.75587-08:00","closed_at":"2025-12-24T19:43:12.755801-08:00","close_reason":"Squashed from wisp gt-8ow (9 issues)"}
{"id":"gt-z94m","title":"load-state","description":"Read handoff bead and get nudge counts.\n\nNeeds: check-refinery","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T01:41:54.505607-08:00","updated_at":"2025-12-23T04:39:39.698069-08:00","closed_at":"2025-12-23T04:39:39.698069-08:00","close_reason":"Parent gt-751s superseded by Christmas Ornament pattern","dependencies":[{"issue_id":"gt-z94m","depends_on_id":"gt-751s","type":"parent-child","created_at":"2025-12-23T01:41:54.542384-08:00","created_by":"stevey"}],"wisp":true}
{"id":"gt-z9xv","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-23T00:18:18.894709-08:00","updated_at":"2025-12-23T01:18:52.583727-08:00","closed_at":"2025-12-23T01:18:52.583727-08:00","close_reason":"Already merged (duplicate MRs)"}
{"id":"gt-zayu","title":"Refinery tmux status: show merge queue length","description":"Add refinery-specific status line showing:\n- MQ length (pending merges)\n- Currently processing item (if any)\n- Maybe: success/failure counts\n\nImplement in runRefineryStatusLine() in internal/cmd/statusline.go","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-21T15:40:30.569547-08:00","updated_at":"2025-12-21T15:47:49.493735-08:00","closed_at":"2025-12-21T15:47:49.493735-08:00","close_reason":"Implemented status line functions for witness and refinery"}
{"id":"gt-zb9v","title":"Digest: mol-deacon-patrol @ 2025-12-24 19:47","description":"Patrol 15: All healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T19:47:12.561963-08:00","updated_at":"2025-12-24T19:47:12.561963-08:00","closed_at":"2025-12-24T19:47:12.561902-08:00","close_reason":"Squashed from wisp gt-atk (9 issues)"}
@@ -1085,7 +1052,6 @@
{"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-zjqs","title":"mol-polecat-work","description":"Full polecat lifecycle from assignment to decommission.\n\nThis proto enables nondeterministic idempotence for polecat work.\nA polecat that crashes after any step can restart, read its molecule state,\nand continue from the last completed step. No work is lost.\n\nVariables:\n- gt-test123 - The source issue ID being worked on","status":"closed","priority":2,"issue_type":"epic","assignee":"stevey","created_at":"2025-12-21T21:56:18.53415-08:00","updated_at":"2025-12-21T21:56:27.506153-08:00","closed_at":"2025-12-21T21:56:27.506153-08:00","close_reason":"test cleanup","wisp":true}
{"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":"closed","priority":1,"issue_type":"task","created_at":"2025-12-17T21:47:17.879255-08:00","updated_at":"2025-12-17T22:29:46.970197-08:00","closed_at":"2025-12-17T22:29:46.970197-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"}]}
{"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":"closed","priority":2,"issue_type":"task","created_at":"2025-12-16T01:21:45.37072-08:00","updated_at":"2025-12-16T01:28:40.74469-08:00","closed_at":"2025-12-16T01:28:40.74469-08:00"}
{"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"}]}