bd sync: 2025-12-25 02:23:36

This commit is contained in:
Steve Yegge
2025-12-25 02:23:36 -08:00
parent 8f54d6c3c5
commit f443f4b83a

View File

@@ -224,6 +224,7 @@
{"id":"gt-5j2x","title":"Test Patrol for Bonding","description":"Parent issue for mol bond CLI test","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T21:04:10.199911-08:00","updated_at":"2025-12-25T01:33:00.451765-08:00","closed_at":"2025-12-25T01:33:00.451765-08:00","close_reason":"Test pollution cleanup"}
{"id":"gt-5j2x.1","title":"Polecat Arm (arm-toast)","description":"Single polecat inspection and action cycle.\n\nThis molecule is bonded dynamically by mol-witness-patrol's survey-workers step.\nEach polecat being monitored gets one arm that runs in parallel with other arms.\n\n## Variables\n\n| Variable | Required | Description |\n|----------|----------|-------------|\n| polecat_name | Yes | Name of the polecat to inspect |\n| rig | Yes | Rig containing the polecat |\n\n## Step: capture\nCapture recent tmux output for toast.\n\n```bash\ntmux capture-pane -t gt-gastown-toast -p | tail -50\n```\n\nRecord:\n- Last activity timestamp (when was last tool call?)\n- Visible errors or stack traces\n- Completion indicators (\"Done\", \"Finished\", etc.)\n\n## Step: assess\nCategorize polecat state based on captured output.\n\nStates:\n- **working**: Recent tool calls, active processing\n- **idle**: At prompt, no recent activity\n- **error**: Showing errors or stack traces\n- **requesting_shutdown**: Sent LIFECYCLE/Shutdown mail\n- **done**: Showing completion indicators\n\nCalculate: minutes since last activity.\nNeeds: capture\n\n## Step: load-history\nRead nudge history for toast from patrol state.\n\n```\nnudge_count = state.nudges[toast].count\nlast_nudge_time = state.nudges[toast].timestamp\n```\n\nThis data was loaded by the parent patrol's load-state step and passed\nto the arm via the bonding context.\nNeeds: assess\n\n## Step: decide\nApply the nudge matrix to determine action for toast.\n\n| State | Idle Time | Nudge Count | Action |\n|-------|-----------|-------------|--------|\n| working | any | any | none |\n| idle | \u003c10min | any | none |\n| idle | 10-15min | 0 | nudge-1 (gentle) |\n| idle | 15-20min | 1 | nudge-2 (direct) |\n| idle | 20+min | 2 | nudge-3 (final) |\n| idle | any | 3 | escalate |\n| error | any | any | assess-severity |\n| requesting_shutdown | any | any | pre-kill-verify |\n| done | any | any | pre-kill-verify |\n\nNudge text:\n1. \"How's progress? Need any help?\"\n2. \"Please wrap up soon. What's blocking you?\"\n3. \"Final check. Will escalate in 5 min if no response.\"\n\nRecord decision and rationale.\nNeeds: load-history\n\n## Step: execute\nTake the decided action for toast.\n\n**nudge-N**:\n```bash\ntmux send-keys -t gt-gastown-toast \"{{nudge_text}}\" Enter\n```\n\n**pre-kill-verify**:\n```bash\ncd polecats/toast\ngit status # Must be clean\ngit log origin/main..HEAD # Check for unpushed\nbd show \u003cassigned-issue\u003e # Verify closed/deferred\n```\nIf clean: kill session, remove worktree, delete branch\nIf dirty: record failure, retry next cycle\n\n**escalate**:\n```bash\ngt mail send mayor/ -s \"Escalation: toast stuck\" -m \"...\"\n```\n\n**none**: No action needed.\n\nRecord: action taken, result, updated nudge count.\nNeeds: decide\n\n## Output\n\nThe arm completes with:\n- action_taken: none | nudge-1 | nudge-2 | nudge-3 | killed | escalated\n- result: success | failed | pending\n- updated_state: New nudge count and timestamp for toast\n\nThis data feeds back to the parent patrol's aggregate step.\n---\nbonded_from: mol-polecat-arm\nbonded_to: gt-5j2x\nbonded_ref: arm-toast\nbonded_at: 2025-12-23T10:00:00Z\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T21:04:10.282891-08:00","updated_at":"2025-12-24T21:04:10.454575-08:00","closed_at":"2025-12-24T21:04:10.454575-08:00","close_reason":"Closed","dependencies":[{"issue_id":"gt-5j2x.1","depends_on_id":"gt-5j2x","type":"parent-child","created_at":"2025-12-24T21:04:10.283404-08:00","created_by":"daemon"}]}
{"id":"gt-5klh","title":"Remove legacy .beads-wisp/ infrastructure","description":"The wisp simplification (gt-fgms + bd-bkul) changed wisps to be just a flag on issues in the main .beads/ database. JSONL export filters Wisp=true issues. No separate directory needed.\n\nBut legacy .beads-wisp/ infrastructure still exists and should be removed:\n\n## Gas Town (gt) cleanup:\n- `internal/rig/manager.go`: Remove `initWispBeads()` call from `AddRig()`\n- `internal/wisp/io.go`: Delete entire file (old abstraction layer)\n- `internal/cmd/install.go`: Remove any .beads-wisp setup\n- `docs/wisp-architecture.md`: Update to reflect 'just a flag' model\n\n## Beads (bd) cleanup:\n- `cmd/bd/doctor/wisp_check.go`: Remove WispExistsCheck, WispGitCheck, WispSizeCheck (check .beads-wisp dirs)\n- Keep WispOrphansCheck and WispStaleCheck but rewrite to query main DB for Wisp=true issues\n\n## Filesystem cleanup:\n- Delete ~/gt/.beads-wisp/\n- Delete ~/gt/gastown/.beads-wisp/\n- Delete all per-rig .beads-wisp/ directories\n- Remove .beads-wisp from .gitignore entries\n\n## Verify:\n- `gt mail send --wisp` still works (creates issue with Wisp=true in main DB)\n- `bd sync` still filters wisps from JSONL\n- `bd mol squash/burn` still work on Wisp=true issues","status":"closed","priority":2,"issue_type":"chore","created_at":"2025-12-24T21:22:31.378327-08:00","updated_at":"2025-12-24T21:51:39.361865-08:00","closed_at":"2025-12-24T21:51:39.361865-08:00","close_reason":"Removed legacy .beads-wisp infrastructure. Hooks now stored in .beads/, wisps are just Wisp=true flag on issues.","comments":[{"id":2,"issue_id":"gt-5klh","author":"stevey","text":"Additional finding: wisps ARE leaking into town-level JSONL (~/gt/.beads/issues.jsonl). Saw hq-3g9e and hq-94i with wisp:true in the file. The filtering works for rig-level beads but apparently not town-level. Need to investigate why town beads uses different export path.","created_at":"2025-12-25T05:23:42Z"}]}
{"id":"gt-5moq5","title":"Digest: mol-deacon-patrol","description":"Patrol 9: All agents healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T02:11:33.463463-08:00","updated_at":"2025-12-25T02:11:33.463463-08:00","closed_at":"2025-12-25T02:11:33.46343-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-5moq5","depends_on_id":"gt-96u2u","type":"parent-child","created_at":"2025-12-25T02:11:33.464221-08:00","created_by":"stevey"}]}
{"id":"gt-5n2f","title":"Tech Debt: Code Review December 2024","description":"Tech debt identified during code review on 2024-12-21. Contains 11 issues ranging from P2-P4 covering:\n\n- Code duplication (manager creation boilerplate)\n- Test coverage gaps (cmd 6.8%, mail 3.6%)\n- Magic strings needing constants\n- Error handling inconsistencies\n- Large files needing splitting\n- Unused code removal\n\nWork through these incrementally to improve codebase maintainability.","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-12-21T21:37:36.114862-08:00","updated_at":"2025-12-21T22:20:12.869211-08:00","closed_at":"2025-12-21T22:20:12.869211-08:00","close_reason":"Tech debt review complete for launch. Completed:\n- gt-ai1z: Cycle detection in molecule deps\n- gt-7sqi: Manager boilerplate refactoring\n- gt-zhm5: Epic child filtering in Witness\n- gt-xnql: Constants for magic strings\n- gt-cvfg: io.Writer for refinery output\n- gt-nz6t: Removed unused style helpers\n\nAudited and closed:\n- gt-2xsh: Silent error handling (patterns are intentional)\n- gt-2n6z: Error wrapping (deferred to v0.2)\n\nDeferred to post-launch:\n- gt-480b: Test coverage (ongoing)\n- gt-92of: Large file splitting (refactoring)\n- gt-pbr3: Godoc comments (documentation)\n\nCodebase is launch-ready.","dependencies":[{"issue_id":"gt-5n2f","depends_on_id":"gt-ai1z","type":"blocks","created_at":"2025-12-21T21:37:45.973674-08:00","created_by":"daemon"},{"issue_id":"gt-5n2f","depends_on_id":"gt-zhm5","type":"blocks","created_at":"2025-12-21T21:37:46.048395-08:00","created_by":"daemon"},{"issue_id":"gt-5n2f","depends_on_id":"gt-7sqi","type":"blocks","created_at":"2025-12-21T21:37:46.120505-08:00","created_by":"daemon"},{"issue_id":"gt-5n2f","depends_on_id":"gt-nz6t","type":"blocks","created_at":"2025-12-21T21:37:46.194096-08:00","created_by":"daemon"},{"issue_id":"gt-5n2f","depends_on_id":"gt-xnql","type":"blocks","created_at":"2025-12-21T21:37:46.268652-08:00","created_by":"daemon"},{"issue_id":"gt-5n2f","depends_on_id":"gt-480b","type":"blocks","created_at":"2025-12-21T21:37:46.341243-08:00","created_by":"daemon"},{"issue_id":"gt-5n2f","depends_on_id":"gt-cvfg","type":"blocks","created_at":"2025-12-21T21:37:46.417073-08:00","created_by":"daemon"},{"issue_id":"gt-5n2f","depends_on_id":"gt-92of","type":"blocks","created_at":"2025-12-21T21:37:46.489042-08:00","created_by":"daemon"},{"issue_id":"gt-5n2f","depends_on_id":"gt-2xsh","type":"blocks","created_at":"2025-12-21T21:37:46.562771-08:00","created_by":"daemon"},{"issue_id":"gt-5n2f","depends_on_id":"gt-2n6z","type":"blocks","created_at":"2025-12-21T21:37:46.63439-08:00","created_by":"daemon"},{"issue_id":"gt-5n2f","depends_on_id":"gt-pbr3","type":"blocks","created_at":"2025-12-21T21:37:46.706067-08:00","created_by":"daemon"}]}
{"id":"gt-5q9u","title":"Digest: mol-deacon-patrol","description":"Patrol #15: Stable","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T23:34:25.357778-08:00","updated_at":"2025-12-24T23:34:25.357778-08:00","closed_at":"2025-12-24T23:34:25.357737-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-5q9u","depends_on_id":"gt-z0ru","type":"parent-child","created_at":"2025-12-24T23:34:25.358493-08:00","created_by":"stevey"}]}
{"id":"gt-5qc","title":"Document how to configure a Gas Town Harness","description":"Create docs explaining what a harness is (private repo containing GT installation with rigs gitignored), why you'd want one, and how to set it up with beads redirects","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-17T16:42:43.370167-08:00","updated_at":"2025-12-19T12:00:39.274285-08:00","closed_at":"2025-12-19T12:00:39.274285-08:00","dependencies":[{"issue_id":"gt-5qc","depends_on_id":"gt-l1o","type":"blocks","created_at":"2025-12-17T16:42:54.620984-08:00","created_by":"daemon"},{"issue_id":"gt-5qc","depends_on_id":"gt-cr9","type":"blocks","created_at":"2025-12-17T17:15:59.17545-08:00","created_by":"daemon"}]}
@@ -248,7 +249,6 @@
{"id":"gt-6bhu.1","title":"Test Polecat Arm","description":"Test child for bonding pattern","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T22:06:13.426123-08:00","updated_at":"2025-12-25T01:33:01.011607-08:00","closed_at":"2025-12-25T01:33:01.011607-08:00","close_reason":"Test pollution cleanup","dependencies":[{"issue_id":"gt-6bhu.1","depends_on_id":"gt-6bhu","type":"parent-child","created_at":"2025-12-23T22:06:13.426633-08:00","created_by":"daemon"}]}
{"id":"gt-6cok","title":"Digest: mol-deacon-patrol","description":"Patrol #4: Stable","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T23:31:01.457636-08:00","updated_at":"2025-12-24T23:31:01.457636-08:00","closed_at":"2025-12-24T23:31:01.457602-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-6cok","depends_on_id":"gt-ma6d","type":"parent-child","created_at":"2025-12-24T23:31:01.458313-08:00","created_by":"stevey"}]}
{"id":"gt-6db","title":"gt rig shutdown: Gracefully stop all rig agents","description":"Add 'gt rig shutdown \u003crig\u003e' command to gracefully stop all agents in a rig.\n\nShould:\n- Stop all polecat sessions\n- Stop refinery\n- Stop witness\n- Optionally wait for graceful shutdown with timeout","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-17T21:50:07.938698-08:00","updated_at":"2025-12-19T12:05:27.341209-08:00","closed_at":"2025-12-19T12:05:27.341209-08:00","dependencies":[{"issue_id":"gt-6db","depends_on_id":"gt-hw6","type":"blocks","created_at":"2025-12-17T22:23:43.179236-08:00","created_by":"daemon"}]}
{"id":"gt-6ise7","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-25T01:59:05.782658-08:00","updated_at":"2025-12-25T01:59:05.782658-08:00","dependencies":[{"issue_id":"gt-6ise7","depends_on_id":"gt-kp3s3","type":"parent-child","created_at":"2025-12-25T01:59:05.832357-08:00","created_by":"stevey"},{"issue_id":"gt-6ise7","depends_on_id":"gt-rsxwb","type":"blocks","created_at":"2025-12-25T01:59:05.848887-08:00","created_by":"stevey"}]}
{"id":"gt-6k8","title":"Interrupt vs Queue mail semantics","description":"Add priority/delivery semantics to mail messages.\n\n## Semantics\n\n| Type | Delivery | Use Case |\n|------|----------|----------|\n| Interrupt | tmux send-keys | Lifecycle, URGENT, stuck detection |\n| Queue | Create message only | Normal mail, status, heartbeat |\n\n## Implementation\n\n- `bd mail send --interrupt` uses tmux send-keys notification\n- Default is queue (agent checks with `gt mail check`)\n- Urgent flag on messages for interrupt delivery\n\n## Agent Side\n\n- `gt mail check --quiet` - non-blocking check for queued mail\n- `gt mail wait` - block until mail arrives (for idle agents)\n- Heartbeats become queued, agent checks at natural breakpoints","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-18T14:19:28.408196-08:00","updated_at":"2025-12-19T17:22:52.555329-08:00","closed_at":"2025-12-19T16:31:00.450061-08:00","dependencies":[{"issue_id":"gt-6k8","depends_on_id":"gt-99m","type":"blocks","created_at":"2025-12-18T14:19:46.529252-08:00","created_by":"daemon"}]}
{"id":"gt-6l2au","title":"Digest: mol-deacon-patrol","description":"Patrol 14: All clear","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T00:04:09.604588-08:00","updated_at":"2025-12-25T00:04:09.604588-08:00","closed_at":"2025-12-25T00:04:09.604555-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-6l2au","depends_on_id":"gt-ky1hm","type":"parent-child","created_at":"2025-12-25T00:04:09.605328-08:00","created_by":"stevey"}]}
{"id":"gt-6lt3","title":"Work on ga-rd4: Add gt polecat status command. Show detai...","description":"Work on ga-rd4: Add gt polecat status command. Show detailed polecat status including current issue, session state, last activity time. When done, submit MR (not PR) to integration branch for Refinery.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-19T22:58:26.320627-08:00","updated_at":"2025-12-19T23:23:07.448718-08:00","closed_at":"2025-12-19T23:23:07.448718-08:00"}
@@ -274,8 +274,7 @@
{"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-75b0","title":"Digest: mol-deacon-patrol","description":"Patrol 12: Routine","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T22:37:48.776182-08:00","updated_at":"2025-12-24T22:37:48.776182-08:00","closed_at":"2025-12-24T22:37:48.776147-08:00","close_reason":"Squashed from 8 wisps"}
{"id":"gt-78hpv","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-25T01:59:05.782998-08:00","updated_at":"2025-12-25T01:59:05.782998-08:00","dependencies":[{"issue_id":"gt-78hpv","depends_on_id":"gt-kp3s3","type":"parent-child","created_at":"2025-12-25T01:59:05.865604-08:00","created_by":"stevey"}]}
{"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-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":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-21T12:18:22.99128-08:00","updated_at":"2025-12-25T02:15:59.232015-08:00","closed_at":"2025-12-25T02:15:59.232015-08:00","close_reason":"Design doc superseded by gt-rana (Patrol System implementation).","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"}
{"id":"gt-7921","title":"Add await-work and plugin-run steps to mol-refinery-patrol","description":"## Context\n\nThe mol-refinery-patrol needs two additional steps:\n\n### 1. await-work (Decision Point)\n\nNot just 'wait for signal' but a crossroads:\n- Check for pending signals (mail, nudge, human)\n- Check plugin gates (any plugins need to run?)\n- Check maintenance schedule (daily/weekly due?)\n- Evaluate context and decide next action\n\nPosition: Between burn-or-loop and inbox-check (the loop point)\n\n### 2. plugin-run (Like Deacon)\n\nRefinery needs plugin support for:\n- **Monitors**: Flag PRs touching sensitive code\n- **Gates**: Block merges under certain conditions\n- **Schedulers**: Reorder queue based on priority/urgency\n- **Maintenance**: Weekly cleanup, audits, stats\n- **Audits**: Log merge statistics, track patterns\n\nPosition: After queue-scan, before process-branch\n\n## Implementation\n\nUpdate RefineryPatrolMolecule() in builtin_molecules.go to include:\n- await-work step with decision tree\n- plugin-run step with gate types\n\n## Related\n- gt-7920 (original mol-refinery-patrol)\n- docs/deacon-plugins.md (existing plugin model)","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-22T13:24:11.267237-08:00","updated_at":"2025-12-22T13:24:11.267237-08:00"}
@@ -324,7 +323,7 @@
{"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"}]}
{"id":"gt-8tmz.16","title":"Prevent aspect self-matching (infinite recursion)","description":"Aspects should only match original steps, not steps inserted by the same aspect application. Document this and implement guard during cooking. Without this, a pointcut like *.implement that inserts security-prescan could match its own insertion infinitely.","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-23T18:45:07.855882-08:00","updated_at":"2025-12-23T18:45:07.855882-08:00","dependencies":[{"issue_id":"gt-8tmz.16","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-23T18:45:07.861131-08:00","created_by":"daemon"},{"issue_id":"gt-8tmz.16","depends_on_id":"gt-8tmz.5","type":"blocks","created_at":"2025-12-23T18:48:18.885103-08:00","created_by":"daemon"}]}
{"id":"gt-8tmz.17","title":"Max expansion depth limit (default 5)","description":"Add maxExpansionDepth config (default 5) to prevent runaway nested expansions. This still allows massive work generation but with a safety bound. Note: distinguish compile-time cooking (produces proto with placeholders) vs runtime cooking (produces mol with real issue IDs). Compile-time is for modeling/estimation/contractor handoff.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T18:45:09.107895-08:00","updated_at":"2025-12-23T18:45:09.107895-08:00","dependencies":[{"issue_id":"gt-8tmz.17","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-23T18:45:09.109857-08:00","created_by":"daemon"},{"issue_id":"gt-8tmz.17","depends_on_id":"gt-8tmz.3","type":"blocks","created_at":"2025-12-23T18:48:19.037958-08:00","created_by":"daemon"}]}
{"id":"gt-8tmz.17","title":"Max expansion depth limit (default 5)","description":"Add maxExpansionDepth config (default 5) to prevent runaway nested expansions. This still allows massive work generation but with a safety bound. Note: distinguish compile-time cooking (produces proto with placeholders) vs runtime cooking (produces mol with real issue IDs). Compile-time is for modeling/estimation/contractor handoff.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T18:45:09.107895-08:00","updated_at":"2025-12-25T02:23:29.995924-08:00","closed_at":"2025-12-25T02:23:29.995924-08:00","close_reason":"Implemented: DefaultMaxExpansionDepth=5 constant, depth tracking in expandStep, error on limit exceeded","dependencies":[{"issue_id":"gt-8tmz.17","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-23T18:45:09.109857-08:00","created_by":"daemon"},{"issue_id":"gt-8tmz.17","depends_on_id":"gt-8tmz.3","type":"blocks","created_at":"2025-12-23T18:48:19.037958-08:00","created_by":"daemon"}]}
{"id":"gt-8tmz.18","title":"Cooking metadata: source tracing","description":"Add source_formula and source_location metadata to cooked steps so you can trace a step in a proto back to its origin formula. Useful for debugging complex compositions.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T18:45:10.295767-08:00","updated_at":"2025-12-23T18:45:10.295767-08:00","dependencies":[{"issue_id":"gt-8tmz.18","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-23T18:45:10.29809-08:00","created_by":"daemon"}]}
{"id":"gt-8tmz.19","title":"Meta-formulas: formula generators","description":"Support meta-formulas that generate multiple formulas from a template. Example: multi-lang-shiny that generates shiny-go, shiny-python, shiny-typescript from a for-each loop over languages. Enables DRY formula libraries.","status":"open","priority":3,"issue_type":"feature","created_at":"2025-12-23T18:45:28.847972-08:00","updated_at":"2025-12-23T18:45:28.847972-08:00","dependencies":[{"issue_id":"gt-8tmz.19","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-23T18:45:28.849855-08:00","created_by":"daemon"}]}
{"id":"gt-8tmz.2","title":"Advice operators: before, after, around","description":"Implement Lisp-style advice operators for molecules:\n- before(target, step) - insert step before target\n- after(target, step) - insert step after target\n- around(target, wrapper) - wrap target with before/after\n\nSupport glob patterns for targeting (*.implement, shiny.*, etc).","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T18:04:30.429759-08:00","updated_at":"2025-12-25T01:54:01.974745-08:00","closed_at":"2025-12-25T01:54:01.974745-08:00","close_reason":"Implemented advice operators: before, after, around with glob pattern matching","dependencies":[{"issue_id":"gt-8tmz.2","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-23T18:04:30.430206-08:00","created_by":"daemon"},{"issue_id":"gt-8tmz.2","depends_on_id":"gt-8tmz.1","type":"blocks","created_at":"2025-12-23T18:04:49.721471-08:00","created_by":"daemon"},{"issue_id":"gt-8tmz.2","depends_on_id":"gt-8tmz.13","type":"blocks","created_at":"2025-12-23T18:48:18.633013-08:00","created_by":"daemon"},{"issue_id":"gt-8tmz.2","depends_on_id":"gt-mdgt8","type":"blocks","created_at":"2025-12-25T01:23:13.415509-08:00","created_by":"daemon"}]}
@@ -396,7 +395,6 @@
{"id":"gt-9o9s","title":"gt mail inbox shows wrong identity when run from deacon directory","description":"When running 'gt mail inbox' from ~/gt/deacon/, it shows 'Inbox: mayor/' instead of 'Inbox: deacon/'. The role detection works (deacon checks in correctly), but mail identity detection is broken.","status":"open","priority":2,"issue_type":"bug","created_at":"2025-12-23T13:29:11.801311-08:00","updated_at":"2025-12-23T13:29:11.801311-08:00"}
{"id":"gt-9ojgy","title":"Digest: mol-deacon-patrol","description":"Patrol 6: Nominal","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T23:48:38.058041-08:00","updated_at":"2025-12-24T23:48:38.058041-08:00","closed_at":"2025-12-24T23:48:38.058007-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-9ojgy","depends_on_id":"gt-m3am","type":"parent-child","created_at":"2025-12-24T23:48:38.058721-08:00","created_by":"stevey"}]}
{"id":"gt-9pyg","title":"Deacon tmux status bar: heartbeat timing and patrol state","description":"## Problem\n\nThe deacon shows patrol output but lacks real-time observability:\n- No indication of when last heartbeat occurred\n- No indication of when next heartbeat is scheduled\n- No visibility into current patrol step\n\n## Desired Behavior\n\nThe tmux status bar for gt-deacon should show:\n\n```\n⛪ Deacon | ❤️ 2m ago | ⏰ 3m | 📍 health-scan (3/7)\n```\n\nComponents:\n- **Role icon**: ⛪ (deacon identity)\n- **Last heartbeat**: ❤️ 2m ago (time since last heartbeat file update)\n- **Next heartbeat**: ⏰ 3m (time until daemon would poke)\n- **Current step**: 📍 health-scan (3/7) (current patrol atom, step N of M)\n\n## Implementation\n\n1. **Read heartbeat.json** for last update time\n2. **Calculate next poke** based on daemon interval (default 5m)\n3. **Read current wisp** from .beads-wisp/ to get patrol progress\n4. **Update tmux status** periodically or on state change\n\nOptions:\n- tmux status-right with shell script\n- gt deacon status --tmux for formatted output\n- Hook into patrol step completion\n\n## Related\n\n- gt-id36: Deacon Kernel epic\n- gt-3x0z: Wisp Molecule Integration","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-22T03:03:38.693983-08:00","updated_at":"2025-12-22T03:03:38.693983-08:00"}
{"id":"gt-9qr9","title":"mol-deacon-patrol","description":"Mayor's daemon patrol loop.\n\nThe Deacon is the Mayor's background process that runs continuously,\nhandling callbacks, monitoring rig health, and performing cleanup.\nEach patrol cycle runs these steps in sequence, then loops or exits.\n","status":"open","priority":2,"issue_type":"epic","created_at":"2025-12-24T22:14:43.403396-08:00","updated_at":"2025-12-24T22:14:43.403396-08:00"}
{"id":"gt-9rmm","title":"Merge: gt-a95","description":"branch: polecat/Ace\ntarget: main\nsource_issue: gt-a95\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-19T14:53:53.973816-08:00","updated_at":"2025-12-19T19:13:27.736445-08:00","closed_at":"2025-12-19T17:48:09.608699-08:00"}
{"id":"gt-9t14","title":"Wire up --wisp flag for ephemeral molecules","description":"The --wisp flag exists in gt sling but isn't wired through to bd mol.\n\nNeed:\n1. bd mol run --wisp - spawn to .beads-wisp/ instead of .beads/\n2. Automatic burn on molecule completion\n3. Optional squash to digest for audit trail\n\nCurrently:\n- sling.go sets thing.IsWisp but never uses it\n- bd mol run has no --wisp flag\n- .beads-wisp/ exists but nothing writes to it","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-22T13:12:25.192854-08:00","updated_at":"2025-12-22T13:18:50.72531-08:00","closed_at":"2025-12-22T13:18:50.72531-08:00","close_reason":"Wired --wisp flag: uses .beads-wisp/ storage when available, propagates IsWisp through MoleculeContext"}
{"id":"gt-9uxr","title":"Critical packages lack test coverage","description":"Several packages have no test files:\n- internal/lock/ - Core identity locking (212 lines UNTESTED)\n- internal/witness/ - Worker monitoring\n- internal/mrqueue/ - MR queue management\n- internal/claude/ - Claude integration\n- internal/style/ - Terminal styling\n- internal/constants/ - Constants\n\nPriority for testing:\n1. lock/ - prevents duplicate agents, critical for correctness\n2. witness/ - agent lifecycle management\n3. mrqueue/ - merge request processing\n\nOverall: 37 test files for 160 Go files (23% by file count)","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-24T12:51:01.154427-08:00","updated_at":"2025-12-24T12:51:01.154427-08:00","dependencies":[{"issue_id":"gt-9uxr","depends_on_id":"gt-jo9n","type":"blocks","created_at":"2025-12-24T12:52:07.558885-08:00","created_by":"daemon"}]}
@@ -744,7 +742,7 @@
{"id":"gt-ingm","title":"Molecular Chemistry Cleanup: Fix inaccurate molecule depictions","description":"## The Correct Model\n\nAccording to molecular-chemistry.md, the hierarchy is:\n\nFormula (YAML DSL) --cook--\u003e Proto (template beads) --pour/wisp--\u003e Mol/Wisp (actual work)\n\n- **Formulas**: YAML files in .beads/formulas/ that define workflow structure\n- **Cook**: Transform formula to proto beads (with [template] label)\n- **Proto**: Template beads with child beads for each step\n- **Pour**: Proto to Mol (persistent liquid)\n- **Wisp**: Proto to Wisp (ephemeral vapor)\n\n## What's Wrong\n\nWe have legacy code and docs that use the OLD model where molecules are defined\nin Go code as structs with embedded markdown, instead of as formula YAML cooked into proto beads.\n\n---\n\n## MAJOR ISSUES\n\n### 1. Go Code: molecules_*.go (DELETE OR REWRITE)\n\n**Files:**\n- internal/beads/builtin_molecules.go\n- internal/beads/molecules_patrol.go (19KB!)\n- internal/beads/molecules_session.go (13KB)\n- internal/beads/molecules_work.go (13KB)\n\n**Problem:** Defines molecules as Go structs with embedded markdown descriptions.\nThis is completely wrong. Molecules should come from:\n1. Formula YAML files cooked into proto beads\n2. Proto beads with child beads for each step\n\n**Used by:**\n- install.go:seedBuiltinMolecules() - seeds during install\n- catalog.go - includes in catalog\n- molecule_list.go:ExportBuiltinMolecules()\n\n**Fix:** Delete these files. Create formula YAML files instead. Update seeding\nto cook formulas into protos.\n\n### 2. Role Templates: Steps Listed in Markdown (REWRITE)\n\n**Files:**\n- prompts/roles/deacon.md - Lists 7 patrol steps\n- prompts/roles/refinery.md - Lists 10 patrol steps\n- prompts/roles/witness.md - Procedural \"Heartbeat Protocol\" (not molecule-based!)\n- prompts/roles/polecat.md - References molecule steps\n\n**Problem:** The steps are listed in the markdown template, but they should be\ndiscovered from the proto beads via bd mol current. Templates should say\n\"check your hook, run your patrol\" without duplicating step definitions.\n\n**Fix:** Templates should describe HOW to run a patrol (propulsion principle,\nbd mol current, bd close --continue), not WHAT the steps are.\n\n### 3. Protos are Empty/Missing (CREATE)\n\n**Current state:**\n- gt-iep9 (mol-deacon-patrol) - Only 2 child steps\n- gt-qflq (mol-witness-patrol) - EMPTY (0 children)\n- mol-refinery-patrol - DOESN'T EXIST\n\n**Fix:** Create formula YAML files for each patrol, cook them into proper protos\nwith child beads for each step.\n\n---\n\n## MEDIUM ISSUES\n\n### 4. Command Confusion: spawn vs pour/wisp\n\n**Files:**\n- prompts/roles/deacon.md - Uses bd mol spawn ... --assignee=deacon\n- prompts/roles/refinery.md - Uses bd mol spawn ... --wisp\n- Various docs\n\n**Problem:** The correct commands per molecular-chemistry.md:\n- bd pour proto - Create persistent mol (liquid)\n- bd wisp proto - Create ephemeral wisp (vapor)\n- bd mol spawn - Old/deprecated\n\n**Fix:** Update all references to use bd wisp for patrols, bd pour for\npersistent work.\n\n### 5. Command Confusion: gt mol vs bd mol\n\n**Files:** Various docs and templates\n\n**Problem:** Some use gt mol status, others bd mol status. Need to clarify:\n- gt mol = Gas Town wrapper (if it exists, what does it add?)\n- bd mol = Beads molecule commands (authoritative)\n\n**Fix:** Audit and standardize. If gt mol is a thin wrapper, remove it.\n\n### 6. polecat-wisp-architecture.md (UPDATE OR DELETE)\n\n**File:** docs/polecat-wisp-architecture.md\n\n**Problem:** References adding molecules to builtin_molecules.go - old model.\n\n### 7. manager.go (UPDATE)\n\n**File:** internal/rig/manager.go\n\n**Problem:** Comment references \"subset of builtin_molecules.go for seeding\"\n\n---\n\n## IMPLEMENTATION ORDER\n\n1. **Create formula YAML files** for the 3 patrol molecules:\n - mol-deacon-patrol.formula.yaml\n - mol-witness-patrol.formula.yaml\n - mol-refinery-patrol.formula.yaml\n\n2. **Implement bd cook** if not already working to create protos from formulas\n\n3. **Cook the formulas** into proto beads with proper child beads\n\n4. **Update role templates** to use propulsion principle without step lists\n\n5. **Delete molecules_*.go** once formulas are working\n\n6. **Update install.go** to cook formulas instead of seeding Go structs\n\n7. **Audit gt mol vs bd mol** and standardize","status":"open","priority":1,"issue_type":"epic","created_at":"2025-12-24T12:37:49.601971-08:00","updated_at":"2025-12-24T12:37:49.601971-08:00","dependencies":[{"issue_id":"gt-ingm","depends_on_id":"gt-6y8u","type":"relates-to","created_at":"2025-12-24T13:25:18.856554-08:00","created_by":"daemon"}]}
{"id":"gt-ingm.1","title":"Create patrol formula YAML files","description":"Create formula YAML files for:\n- mol-deacon-patrol.formula.yaml\n- mol-witness-patrol.formula.yaml \n- mol-refinery-patrol.formula.yaml\n\nUse the step definitions currently in molecules_patrol.go as reference.\nStore in .beads/formulas/","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-24T12:38:10.472804-08:00","updated_at":"2025-12-24T12:59:44.504798-08:00","closed_at":"2025-12-24T12:59:44.504798-08:00","close_reason":"Created 4 patrol formula YAML files in .beads/formulas/"}
{"id":"gt-ingm.2","title":"Cook patrol formulas into proto beads","description":"Use bd cook to transform formula YAML into proto beads with proper child beads for each step.\n\nVerify with bd mol show that protos have all children.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-24T12:38:11.762962-08:00","updated_at":"2025-12-24T13:47:43.467344-08:00","closed_at":"2025-12-24T13:47:43.467344-08:00","close_reason":"Cooked 4 patrol formulas: deacon(9), witness(10), refinery(11), polecat-arm(6)","dependencies":[{"issue_id":"gt-ingm.2","depends_on_id":"gt-ingm.1","type":"blocks","created_at":"2025-12-24T12:38:23.880593-08:00","created_by":"daemon"},{"issue_id":"gt-ingm.2","depends_on_id":"gt-8tmz.13","type":"blocks","created_at":"2025-12-24T13:01:04.581551-08:00","created_by":"daemon"}]}
{"id":"gt-ingm.3","title":"Delete molecules_*.go files","description":"Remove legacy Go-defined molecules:\n- internal/beads/builtin_molecules.go\n- internal/beads/molecules_patrol.go\n- internal/beads/molecules_session.go\n- internal/beads/molecules_work.go\n\nUpdate install.go to cook formulas instead of seeding Go structs.\nUpdate catalog.go if needed.","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-24T12:38:13.028833-08:00","updated_at":"2025-12-24T12:38:13.028833-08:00","dependencies":[{"issue_id":"gt-ingm.3","depends_on_id":"gt-ingm.2","type":"blocks","created_at":"2025-12-24T12:38:23.964643-08:00","created_by":"daemon"}]}
{"id":"gt-ingm.3","title":"Delete molecules_*.go files","description":"Remove legacy Go-defined molecules:\n- internal/beads/builtin_molecules.go\n- internal/beads/molecules_patrol.go\n- internal/beads/molecules_session.go\n- internal/beads/molecules_work.go\n\nUpdate install.go to cook formulas instead of seeding Go structs.\nUpdate catalog.go if needed.","status":"in_progress","priority":1,"issue_type":"task","created_at":"2025-12-24T12:38:13.028833-08:00","updated_at":"2025-12-25T02:22:59.185943-08:00","dependencies":[{"issue_id":"gt-ingm.3","depends_on_id":"gt-ingm.2","type":"blocks","created_at":"2025-12-24T12:38:23.964643-08:00","created_by":"daemon"}]}
{"id":"gt-ingm.4","title":"Rewrite role templates without step lists","description":"Update:\n- prompts/roles/deacon.md\n- prompts/roles/refinery.md\n- prompts/roles/witness.md\n\nTemplates should describe HOW to run patrols (propulsion principle, bd mol current, bd close --continue) not WHAT the steps are. Steps come from proto beads.","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-24T12:38:14.388135-08:00","updated_at":"2025-12-24T12:38:14.388135-08:00","dependencies":[{"issue_id":"gt-ingm.4","depends_on_id":"gt-ingm.2","type":"blocks","created_at":"2025-12-24T12:38:24.049212-08:00","created_by":"daemon"}]}
{"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"}
@@ -771,6 +769,7 @@
{"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-js27","title":"Digest: mol-deacon-patrol","description":"Patrol #10: Halfway checkpoint","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T22:23:51.816965-08:00","updated_at":"2025-12-24T22:23:51.816965-08:00","closed_at":"2025-12-24T22:23:51.816935-08:00","close_reason":"Squashed from 8 wisps"}
{"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-jypn","title":"mol-deacon-patrol","description":"Mayor's daemon patrol loop.\n\nThe Deacon is the Mayor's background process that runs continuously,\nhandling callbacks, monitoring rig health, and performing cleanup.\nEach patrol cycle runs these steps in sequence, then loops or exits.\n","status":"open","priority":2,"issue_type":"epic","created_at":"2025-12-24T20:57:15.132887-08:00","updated_at":"2025-12-24T20:57:15.132887-08:00"}
{"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-25T01:33:01.132043-08:00","closed_at":"2025-12-25T01:33:01.132043-08:00","close_reason":"Test pollution cleanup"}
{"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"}
@@ -795,7 +794,7 @@
{"id":"gt-kktj","title":"Patrol agent state.json not updated on activity","description":"Witness and Refinery state.json files show last_active from Dec 19 even though sessions have been running. The state should update each patrol cycle.\n\nEvidence:\n```\n$ cat beads/witness/state.json\n{\"role\": \"witness\", \"last_active\": \"2025-12-19T17:50:00Z\"}\n\n$ cat beads/refinery/state.json \n{\"role\": \"refinery\", \"last_active\": \"2025-12-19T17:50:00Z\"}\n```\n\nExpected: last_active should update each time the agent runs a patrol cycle.\n\nImpact: Can't tell if patrol agents are actually active vs just having an open tmux session.","status":"open","priority":2,"issue_type":"bug","created_at":"2025-12-23T20:29:58.515591-08:00","updated_at":"2025-12-23T20:29:58.515591-08:00"}
{"id":"gt-kl5e","title":"Digest: mol-deacon-patrol","description":"Patrol 4: Routine","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T22:36:01.786393-08:00","updated_at":"2025-12-24T22:36:01.786393-08:00","closed_at":"2025-12-24T22:36:01.786359-08:00","close_reason":"Squashed from 8 wisps"}
{"id":"gt-kmc7","title":"Digest: mol-deacon-patrol","description":"Patrol 2: Quick scan, no changes","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T23:05:53.201478-08:00","updated_at":"2025-12-24T23:05:53.201478-08:00","closed_at":"2025-12-24T23:05:53.201451-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-kmc7","depends_on_id":"gt-z674","type":"parent-child","created_at":"2025-12-24T23:05:53.202102-08:00","created_by":"stevey"}]}
{"id":"gt-kmn","title":"Batch Work System: Integration branch, merge queue, landing","description":"## Overview\n\nThis epic tracks batch work coordination in GGT. Key insight: **work is a stream, not discrete swarms**.\n\nThere are no \"swarm IDs\" - the epic IS the grouping, the merge queue IS the coordination. \"Swarming an epic\" is colloquial for spawning multiple workers on its children.\n\n## Architecture\n\n- **Epics** group related work\n- **Issues** are individual tasks \n- **Dependencies** encode ordering (multi-wave emerges automatically)\n- **Merge queue** coordinates completed work\n- **Workers** process issues independently\n\nSee Key Decision #11 in docs/architecture.md: \"Work is a Stream (No Swarm IDs)\"\n\n## What This Epic Covers\n\n1. Integration branch management for batch merges\n2. Refinery semantic merge processing\n3. Witness landing protocol (cleanup)\n4. Report generation (epic-based, not swarm-ID-based)\n5. Git safety auditing\n6. Work reconciliation\n\n## What Was Removed\n\n- Swarm IDs (sw-1, sw-2, etc.)\n- Per-swarm directories (.gastown/swarms/\u003cid\u003e/)\n- Swarm manifest/state/events files\n- swarm-started/swarm-landed beads\n\nThese were redundant - beads already provides hierarchy, status, dependencies, and history.\n\n## References\n\n- Architecture: docs/architecture.md (Key Decision #11, Multi-Wave Work Processing)\n- PGT: swarm/manager.py, swarm/landing.py (behavioral reference, but ignore swarm ID patterns)","status":"open","priority":0,"issue_type":"epic","created_at":"2025-12-16T00:08:15.339127-08:00","updated_at":"2025-12-16T17:25:33.208338-08:00"}
{"id":"gt-kmn","title":"Batch Work System: Integration branch, merge queue, landing","description":"## Overview\n\nThis epic tracks batch work coordination in GGT. Key insight: **work is a stream, not discrete swarms**.\n\nThere are no \"swarm IDs\" - the epic IS the grouping, the merge queue IS the coordination. \"Swarming an epic\" is colloquial for spawning multiple workers on its children.\n\n## Architecture\n\n- **Epics** group related work\n- **Issues** are individual tasks \n- **Dependencies** encode ordering (multi-wave emerges automatically)\n- **Merge queue** coordinates completed work\n- **Workers** process issues independently\n\nSee Key Decision #11 in docs/architecture.md: \"Work is a Stream (No Swarm IDs)\"\n\n## What This Epic Covers\n\n1. Integration branch management for batch merges\n2. Refinery semantic merge processing\n3. Witness landing protocol (cleanup)\n4. Report generation (epic-based, not swarm-ID-based)\n5. Git safety auditing\n6. Work reconciliation\n\n## What Was Removed\n\n- Swarm IDs (sw-1, sw-2, etc.)\n- Per-swarm directories (.gastown/swarms/\u003cid\u003e/)\n- Swarm manifest/state/events files\n- swarm-started/swarm-landed beads\n\nThese were redundant - beads already provides hierarchy, status, dependencies, and history.\n\n## References\n\n- Architecture: docs/architecture.md (Key Decision #11, Multi-Wave Work Processing)\n- PGT: swarm/manager.py, swarm/landing.py (behavioral reference, but ignore swarm ID patterns)","status":"closed","priority":0,"issue_type":"epic","created_at":"2025-12-16T00:08:15.339127-08:00","updated_at":"2025-12-25T02:16:00.322691-08:00","closed_at":"2025-12-25T02:16:00.322691-08:00","close_reason":"Swarm concept abandoned (7 tombstones). Core batch work now handled by merge queue (gt-h5n). Remaining items are enhancements."}
{"id":"gt-kmn.1","title":"Swarm package: Swarm, SwarmTask, SwarmState types","description":"Define core swarm types.\n\n## Types (in `internal/swarm/`)\n\n```go\n// SwarmState represents swarm lifecycle\ntype SwarmState string\nconst (\n SwarmCreated SwarmState = \"created\"\n SwarmActive SwarmState = \"active\"\n SwarmMerging SwarmState = \"merging\"\n SwarmLanded SwarmState = \"landed\"\n SwarmFailed SwarmState = \"failed\"\n SwarmCancelled SwarmState = \"cancelled\"\n)\n\n// Swarm references a beads epic that tracks swarm work\ntype Swarm struct {\n ID string // matches beads epic ID\n RigName string\n EpicID string // beads epic tracking this swarm\n BaseCommit string // git SHA all workers branch from\n Integration string // integration branch name\n State SwarmState\n CreatedAt time.Time\n Workers []string // polecat names assigned\n}\n\n// SwarmTask represents a single task in the swarm (maps to beads issue)\ntype SwarmTask struct {\n IssueID string // beads issue ID\n Assignee string // polecat name\n Branch string // worker branch name\n State string // mirrors beads status\n}\n```\n\n## Note\n\nSwarm state is primarily stored IN beads. These types are in-memory representations for the SwarmManager to work with. No separate manifest.json files.","status":"tombstone","priority":0,"issue_type":"task","created_at":"2025-12-16T00:08:30.364047-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-kmn.1","depends_on_id":"gt-kmn","type":"parent-child","created_at":"2025-12-16T00:08:30.364431-08:00","created_by":"daemon"},{"issue_id":"gt-kmn.1","depends_on_id":"gt-u1j.1","type":"blocks","created_at":"2025-12-16T00:11:20.646487-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"}
{"id":"gt-kmn.10","title":"Batch work landing report generation","description":"Generate reports on batch work completion.\n\n## Trigger\n\nWhen all children of an epic are closed, generate a completion report.\n\n## Report Contents\n\n- Epic metadata (ID, title, created by, duration)\n- Task summary (completed counts, timing)\n- Per-task details (issue, assignee, time taken)\n- Git stats (commits merged, lines changed)\n- Cleanup stats (branches deleted)\n\n## Output Locations\n\n1. Mail to Mayor - summary report\n2. Optional: save to file with --save flag\n\n## Command\n\n```bash\ngt report --epic \u003cepic-id\u003e [--save report.md]\n```\n\n## Format\n\nMarkdown with sections:\n- Summary\n- Tasks\n- Workers\n- Timeline\n\n## Note\n\nThis replaces the swarm-based reporting (gt-662). Reports are generated from epic/issue data, not from separate swarm state files.\n\n## Reference\n\nPGT: swarm/report.py (for format ideas, ignore swarm ID patterns)","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-16T00:10:23.242931-08:00","updated_at":"2025-12-16T17:26:27.99208-08:00","dependencies":[{"issue_id":"gt-kmn.10","depends_on_id":"gt-kmn","type":"parent-child","created_at":"2025-12-16T00:10:23.243287-08:00","created_by":"daemon"}]}
{"id":"gt-kmn.11","title":"Daemon heartbeat: worker and queue monitoring","description":"Daemon periodic checks for work progress.\n\n## Heartbeat Actions\n\nEvery N seconds (configurable):\n\n1. Check Witness health per rig\n - Poke if witness needs to nudge workers\n \n2. Check Refinery queue per rig\n - Poke if pending work in queue\n \n3. Check work completion\n - If epic children all closed, notify Mayor\n\n## Eventually Convergent\n\nMultiple signals reinforce state:\n- Polecat signals done → Witness notices → pokes Refinery\n- Daemon heartbeat → checks queue → pokes Refinery\n- Beads status → queryable by any agent\n\nEven if one signal missed, system converges.\n\n## Interface\n\n```go\nfunc (d *Daemon) HeartbeatLoop() {\n for {\n for _, rig := range d.rigs {\n d.CheckWitness(rig)\n d.CheckRefinery(rig)\n d.CheckWorkProgress(rig)\n }\n time.Sleep(d.config.HeartbeatInterval)\n }\n}\n```\n\n## Notifications\n\nUse mail with low priority for heartbeat pokes.\nAgents can ignore if already processing.","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-16T00:10:25.169417-08:00","updated_at":"2025-12-16T17:24:46.380497-08:00","dependencies":[{"issue_id":"gt-kmn.11","depends_on_id":"gt-kmn","type":"parent-child","created_at":"2025-12-16T00:10:25.169767-08:00","created_by":"daemon"},{"issue_id":"gt-kmn.11","depends_on_id":"gt-99m","type":"blocks","created_at":"2025-12-18T11:50:17.699125-08:00","created_by":"daemon"}]}
@@ -957,7 +956,7 @@
{"id":"gt-pio","title":"Plugin: merge-oracle (merge queue analysis)","description":"Example plugin that analyzes changesets before Refinery processes them. Builds overlap graph, classifies disjointness (parallel-safe vs needs-sequencing), uses LLM for semantic complexity, identifies high-risk patterns. Based on merge-orchestration proposal. See docs/architecture.md.","status":"open","priority":3,"issue_type":"feature","created_at":"2025-12-15T22:53:04.027073-08:00","updated_at":"2025-12-15T23:17:06.507108-08:00","dependencies":[{"issue_id":"gt-pio","depends_on_id":"gt-axz","type":"blocks","created_at":"2025-12-15T22:53:17.507459-08:00","created_by":"daemon"}]}
{"id":"gt-pk1e3","title":"Digest: mol-deacon-patrol","description":"Patrol 19: All healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T00:36:44.088454-08:00","updated_at":"2025-12-25T00:36:44.088454-08:00","closed_at":"2025-12-25T00:36:44.088422-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-pk1e3","depends_on_id":"gt-ktj9q","type":"parent-child","created_at":"2025-12-25T00:36:44.089136-08:00","created_by":"stevey"}]}
{"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-pln0","title":"Digest: mol-deacon-patrol","description":"Patrol 6: OK","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T20:57:32.057118-08:00","updated_at":"2025-12-24T20:57:32.057118-08:00","closed_at":"2025-12-24T20:57:32.057089-08:00","close_reason":"Squashed from 8 wisps"}
{"id":"gt-pln0","title":"Digest: mol-deacon-patrol","description":"Patrol 6: OK","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T20:57:32.057118-08:00","updated_at":"2025-12-24T20:57:32.057118-08:00","closed_at":"2025-12-24T20:57:32.057089-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-pln0","depends_on_id":"gt-jypn","type":"parent-child","created_at":"2025-12-24T20:57:32.057799-08:00","created_by":"stevey"}]}
{"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-25T01:33:01.077971-08:00","closed_at":"2025-12-25T01:33:01.077971-08:00","close_reason":"Test pollution cleanup"}
{"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-25T01:33:01.061399-08:00","closed_at":"2025-12-25T01:33:01.061399-08:00","close_reason":"Test pollution cleanup","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-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":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T13:19:41.055563-08:00","updated_at":"2025-12-24T23:21:03.212038-08:00","closed_at":"2025-12-24T23:21:03.212038-08:00","close_reason":"witness Handoff (gt-w98d) and refinery Handoff (gt-j3cx) beads exist; templates updated with documentation","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"}]}
@@ -1083,7 +1082,7 @@
{"id":"gt-t9u7","title":"Polecat template cleanup","description":"Collection of improvements to the polecat role template (polecat.md.tmpl). Focus: reduce prose redundancy, move behavior into molecules, fix terminology, improve clarity.","status":"closed","priority":2,"issue_type":"epic","assignee":"gastown/furiosa","created_at":"2025-12-23T16:57:05.03738-08:00","updated_at":"2025-12-23T17:09:14.498634-08:00","closed_at":"2025-12-23T17:09:14.498634-08:00","close_reason":"All 9 child issues completed"}
{"id":"gt-tca","title":"Polecats should auto-cleanup after MR submission","description":"Currently polecats must manually run 'gt handoff --shutdown' after completing work. This is error-prone and leaves stale polecats around.\n\n## Desired Flow\n\n1. Polecat completes work\n2. Polecat runs 'gt mq submit' (or similar)\n3. MR is added to integration queue\n4. **Polecat automatically cleans up** (no manual handoff needed)\n\n## Implementation Options\n\n### Option A: mq submit triggers cleanup\nIn 'gt mq submit':\n1. Submit MR to queue\n2. Automatically run cleanup (same as gt handoff --shutdown)\n3. Polecat session terminates\n\n### Option B: Refinery triggers cleanup\nWhen Refinery picks up MR:\n1. Refinery processes MR\n2. Sends message to Witness: 'CLEANUP: \u003cpolecat\u003e'\n3. Witness cleans up polecat\n\n### Option C: Molecule-driven\nDefine cleanup as final phase of polecat-work molecule:\n1. code → test → submit-mr → cleanup\n\n## Note\nThis reinforces the ephemeral model: polecats exist only for the duration of a single task.","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-20T15:22:54.485456-08:00","updated_at":"2025-12-21T11:44:14.020856-08:00","closed_at":"2025-12-21T11:44:14.020856-08:00","close_reason":"Implemented: mq submit now auto-cleanups polecats after MR submission","dependencies":[{"issue_id":"gt-tca","depends_on_id":"gt-9nf","type":"related","created_at":"2025-12-20T15:40:08.998908-08:00","created_by":"daemon"}]}
{"id":"gt-tcv8","title":"Digest: mol-deacon-patrol","description":"Patrol 2: All healthy, routine","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T22:35:11.507838-08:00","updated_at":"2025-12-24T22:35:11.507838-08:00","closed_at":"2025-12-24T22:35:11.507795-08:00","close_reason":"Squashed from 8 wisps"}
{"id":"gt-tfg1","title":"Digest: mol-deacon-patrol","description":"Patrol #2: Routine - all 6 agents healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T22:15:34.682289-08:00","updated_at":"2025-12-24T22:15:34.682289-08:00","closed_at":"2025-12-24T22:15:34.682254-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-tfg1","depends_on_id":"gt-9qr9","type":"parent-child","created_at":"2025-12-24T22:15:34.683037-08:00","created_by":"stevey"}]}
{"id":"gt-tfg1","title":"Digest: mol-deacon-patrol","description":"Patrol #2: Routine - all 6 agents healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T22:15:34.682289-08:00","updated_at":"2025-12-24T22:15:34.682289-08:00","closed_at":"2025-12-24T22:15:34.682254-08:00","close_reason":"Squashed from 8 wisps"}
{"id":"gt-th7","title":"Add agent abstraction layer to support non-Claude agents","description":"Currently Gas Town hardcodes 'claude --dangerously-skip-permissions' throughout the codebase for spawning agents. We should add an abstraction layer to support other AI agents (e.g., Gemini CLI, OpenAI agents, local models).\n\nLocations that spawn Claude:\n- internal/cmd/mayor.go:131\n- internal/cmd/deacon.go:150 \n- internal/cmd/witness.go:280\n- internal/cmd/crew.go (multiple locations)\n- internal/cmd/up.go:190, 229\n- internal/session/manager.go:146\n- internal/refinery/manager.go:207\n\nSuggested approach:\n1. Create an agent package with an interface\n2. Add configuration for agent type in town/rig config\n3. Replace hardcoded claude commands with agent.Spawn() calls\n4. Support agents: claude, gemini, openai, local (ollama, etc.)","status":"open","priority":3,"issue_type":"feature","created_at":"2025-12-20T15:11:15.931048-08:00","updated_at":"2025-12-20T15:26:54.236995-08:00"}
{"id":"gt-tj0wa","title":"Digest: mol-deacon-patrol","description":"Patrol 11: All healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T00:33:30.496944-08:00","updated_at":"2025-12-25T00:33:30.496944-08:00","closed_at":"2025-12-25T00:33:30.496914-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-tj0wa","depends_on_id":"gt-tjuha","type":"parent-child","created_at":"2025-12-25T00:33:30.497643-08:00","created_by":"stevey"}]}
{"id":"gt-tj1k","title":"Digest: mol-deacon-patrol @ 2025-12-24 19:45","description":"Patrol 10: All healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T19:45:36.775542-08:00","updated_at":"2025-12-24T19:45:36.775542-08:00","closed_at":"2025-12-24T19:45:36.775467-08:00","close_reason":"Squashed from wisp gt-gjw (9 issues)"}
@@ -1096,7 +1095,7 @@
{"id":"gt-tnca.2","title":"Implement context-checking for agent sessions","description":"Implement the context-checking step that allows agents to assess their remaining context capacity.\n\n## Challenge\n\nAgents don't have direct access to token counts. Need heuristics:\n\n### Approach 1: Message count heuristic\n- Count messages in conversation\n- Estimate tokens per message\n- Compare to model's context window\n\n### Approach 2: External tool\n- Claude Code could expose a /context command\n- Returns estimated usage percentage\n- Agent queries before each work item\n\n### Approach 3: Conservative fixed limits\n- After N work items, always handoff\n- Simple but may waste context or handoff too early\n\n### Approach 4: Hook-based injection\n- SessionStart hook injects context estimate\n- Updated periodically via tool call\n\n## Recommendation\n\nStart with Approach 3 (fixed limits) as MVP:\n- Default: 3-5 work items per session\n- Agent can override via variable\n- Upgrade to smarter heuristics later\n\n## Integration\n\n- Add check-context step to mol-ready-work\n- Implement handoff trigger logic\n- Test with various context states","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-22T23:46:28.414584-08:00","updated_at":"2025-12-22T23:46:28.414584-08:00","dependencies":[{"issue_id":"gt-tnca.2","depends_on_id":"gt-tnca","type":"parent-child","created_at":"2025-12-22T23:46:28.414964-08:00","created_by":"daemon"}]}
{"id":"gt-tnca.3","title":"Implement/document gt sling mechanism","description":"Investigate and implement the gt sling command for attaching molecules to crew workers. Check if gt sling exists, design the flow (mail-based vs direct pin vs wisp spawn), implement in gastown CLI, integrate with bd mol/wisp/pin commands.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-22T23:46:38.592538-08:00","updated_at":"2025-12-22T23:46:38.592538-08:00","dependencies":[{"issue_id":"gt-tnca.3","depends_on_id":"gt-tnca","type":"parent-child","created_at":"2025-12-22T23:46:38.592961-08:00","created_by":"daemon"}]}
{"id":"gt-tnca.4","title":"Document crew worker patrol integration","description":"Document how mol-ready-work integrates with crew worker workflow. Cover: starting the patrol, patrol vs normal operation, backlog configuration, handoff mechanics, discovered work handling. Update CLAUDE.md with patrol section.","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-22T23:46:38.867975-08:00","updated_at":"2025-12-22T23:46:38.867975-08:00","dependencies":[{"issue_id":"gt-tnca.4","depends_on_id":"gt-tnca","type":"parent-child","created_at":"2025-12-22T23:46:38.868332-08:00","created_by":"daemon"}]}
{"id":"gt-tnow","title":"Implement Christmas Ornament pattern for mol-witness-patrol","description":"Integrate dynamic bonding into mol-witness-patrol once Beads primitives are ready.\n\n## Completed\n\n- ✅ WaitsFor parsing (gt-odfr) - Parser now extracts WaitsFor: all-children\n- ✅ mol bond command (gt-isje) - gt mol bond creates dynamic children with --var expansion\n- ✅ WitnessPatrolMolecule() updated with Christmas Ornament structure (gt-tnow.1)\n- ✅ PolecatArmMolecule() created for per-polecat inspection (gt-tnow.2)\n\n## Remaining\n\n- gt-tnow.3: Plugin hook support (P2)\n- gt-tnow.4: Integration test with live polecats (P2)\n\n## Design Docs\n\n- docs/molecular-chemistry.md (already updated with pattern)\n- docs/architecture.md (already updated with activity feed)\n- gt-qflq: mol-witness-patrol design bead (updated)\n- gt-dapb: mol-polecat-arm proto","status":"open","priority":1,"issue_type":"epic","created_at":"2025-12-23T02:37:16.975171-08:00","updated_at":"2025-12-23T21:50:25.346137-08:00"}
{"id":"gt-tnow","title":"Implement Christmas Ornament pattern for mol-witness-patrol","description":"Integrate dynamic bonding into mol-witness-patrol once Beads primitives are ready.\n\n## Completed\n\n- ✅ WaitsFor parsing (gt-odfr) - Parser now extracts WaitsFor: all-children\n- ✅ mol bond command (gt-isje) - gt mol bond creates dynamic children with --var expansion\n- ✅ WitnessPatrolMolecule() updated with Christmas Ornament structure (gt-tnow.1)\n- ✅ PolecatArmMolecule() created for per-polecat inspection (gt-tnow.2)\n\n## Remaining\n\n- gt-tnow.3: Plugin hook support (P2)\n- gt-tnow.4: Integration test with live polecats (P2)\n\n## Design Docs\n\n- docs/molecular-chemistry.md (already updated with pattern)\n- docs/architecture.md (already updated with activity feed)\n- gt-qflq: mol-witness-patrol design bead (updated)\n- gt-dapb: mol-polecat-arm proto","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-23T02:37:16.975171-08:00","updated_at":"2025-12-25T02:15:58.296992-08:00","closed_at":"2025-12-25T02:15:58.296992-08:00","close_reason":"Core Christmas Ornament pattern implemented. P2 plugin hooks can be tracked separately."}
{"id":"gt-tnow.1","title":"Update WitnessPatrolMolecule() with Christmas Ornament structure","description":"Update builtin_molecules.go WitnessPatrolMolecule() to use dynamic bonding pattern.\n\nChanges:\n1. Add survey-workers step that documents dynamic bonding\n2. Add run-plugins step for plugin hook support\n3. Add aggregate step with WaitsFor: all-children\n4. Update step dependencies for new structure\n\nThe molecule prose guides the Witness agent on how to use bd mol bond.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T02:37:42.989186-08:00","updated_at":"2025-12-23T21:21:50.253682-08:00","closed_at":"2025-12-23T21:21:50.253682-08:00","close_reason":"Implemented Christmas Ornament pattern for mol-witness-patrol and mol-polecat-arm","dependencies":[{"issue_id":"gt-tnow.1","depends_on_id":"gt-tnow","type":"parent-child","created_at":"2025-12-23T02:37:42.98963-08:00","created_by":"daemon"}]}
{"id":"gt-tnow.2","title":"Create PolecatArmMolecule() for per-polecat inspection","description":"Add PolecatArmMolecule() to builtin_molecules.go.\n\nSteps:\n- capture: Capture tmux output\n- assess: Categorize state\n- load-history: Get nudge counts\n- decide: Apply nudge matrix\n- execute: Take action\n\nUses variable substitution:\n- {{polecat_name}}\n- {{rig}}\n\nThis proto is bonded dynamically by survey-workers step.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T02:37:43.081562-08:00","updated_at":"2025-12-23T21:21:50.264133-08:00","closed_at":"2025-12-23T21:21:50.264133-08:00","close_reason":"Implemented Christmas Ornament pattern for mol-witness-patrol and mol-polecat-arm","dependencies":[{"issue_id":"gt-tnow.2","depends_on_id":"gt-tnow","type":"parent-child","created_at":"2025-12-23T02:37:43.081898-08:00","created_by":"daemon"}]}
{"id":"gt-tnow.3","title":"Add witness plugin hook support","description":"Implement plugin directories for witness patrol.\n\nStructure:\n \u003crig\u003e/plugins/witness/\n ├── pre-inspection/\n │ └── stale-branch-check/\n │ └── CLAUDE.md\n └── post-action/\n └── mq-health/\n └── CLAUDE.md\n\nrun-plugins step scans these directories and bonds mol-plugin-runner for each.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T02:37:43.175287-08:00","updated_at":"2025-12-23T02:37:43.175287-08:00","dependencies":[{"issue_id":"gt-tnow.3","depends_on_id":"gt-tnow","type":"parent-child","created_at":"2025-12-23T02:37:43.175635-08:00","created_by":"daemon"}]}