From 5acdf597d732a7517d4894f6fb963537b6dd4655 Mon Sep 17 00:00:00 2001 From: Steve Yegge Date: Thu, 25 Dec 2025 20:48:40 -0800 Subject: [PATCH] bd sync: 2025-12-25 20:48:40 --- .beads/issues.jsonl | 52 ++++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index cacf0512..57010e93 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -29,7 +29,7 @@ {"id":"gt-0ol","title":"Update prompts.md: Engineer role and templates","description":"Update docs/prompts.md with Engineer role:\n\n1. Role Prompts table: Change Refinery to Engineer\n2. Add Engineer-specific prompts:\n - Session restart request template\n - Subtask filing template\n - Handoff mail template\n3. Update refinery.md template name to engineer.md\n4. Ensure consistency with architecture.md","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-16T23:12:05.279233-08:00","updated_at":"2025-12-16T23:12:05.279233-08:00","dependencies":[{"issue_id":"gt-0ol","depends_on_id":"gt-h5n","type":"blocks","created_at":"2025-12-16T23:12:15.013747-08:00","created_by":"daemon"}]} {"id":"gt-0pc","title":"Document Overseer role (human operator)","description":"Document the Overseer role in Gas Town architecture.\n\n## The Overseer\n\nThe **Overseer** is the human operator of Gas Town. Not an agent - a person.\n\n## Responsibilities\n\n| Area | Overseer Does | Mayor/Agents Do |\n|------|---------------|-----------------|\n| Strategy | Define project goals | Execute toward goals |\n| Priorities | Set priority order | Work in priority order |\n| Escalations | Final decision on stuck work | Escalate to Overseer |\n| Resources | Provision machines | Use allocated resources |\n| Quality | Review \u0026 approve swarm output | Produce output |\n| Operations | Run gt commands, monitor dashboards | Do the work |\n\n## Key Interactions\n\n### Overseer → Mayor\n- Start/stop Mayor sessions\n- Direct Mayor via conversation\n- Review Mayor recommendations\n- Approve cross-rig decisions\n\n### Mayor → Overseer (Escalations)\n- Stuck workers after retries\n- Resource decisions (add machines, polecats)\n- Ambiguous requirements\n- Architecture decisions\n\n## Operating Cadence\n\nTypical Overseer workflow:\n1. Morning: Check status, review overnight work\n2. During day: Monitor, respond to escalations, adjust priorities\n3. End of day: Review progress, plan next batch\n\n## Commands for Overseers\n\n```bash\ngt status # Quick health check\ngt doctor # Detailed diagnostics \ngt doctor --fix # Auto-repair issues\ngt inbox # Messages from agents\ngt stop --all # Emergency halt\n```\n\n## Documentation Updates\n\nAdd to docs/architecture.md:\n- Overseer section under Agent Roles\n- Clarify Mayor reports to Overseer\n- Add Overseer to workflow diagrams","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-15T23:18:03.177633-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-0pl","title":"Polecat CLAUDE.md: configure auto-approve for bd and gt commands","description":"Polecats get stuck waiting for bash command approval when running\nbd and gt commands. Need to configure Claude Code to auto-approve these.\n\nOptions:\n1. Add allowedTools to polecat CLAUDE.md\n2. Configure .claude/settings.json in polecat directory\n3. Use --dangerously-skip-permissions flag (not recommended)\n\nShould auto-approve:\n- bd (beads commands)\n- gt (gastown commands)\n- go build/test\n- git status/add/commit/push\n\nShould still require approval:\n- rm -rf\n- Arbitrary commands outside project\n\nRelated to polecat prompting (gt-e1y, gt-sd6).","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-17T14:10:27.611612-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} -{"id":"gt-0qki","title":"Refinery-Witness communication protocol","description":"Define mail protocol between Refinery and Witness:\n\nFROM Witness → Refinery:\n- 'Polecat ready': polecat X completed work, ready for merge\n- 'Rework complete': polecat Y finished requested rework\n\nFROM Refinery → Witness:\n- 'Merge success': polecat X merged, can be cleaned up\n- 'Merge failed': polecat X needs rework on \u003creason\u003e\n- 'Rework request': please have a polecat rebase X on current main\n\nImplement as structured mail with parseable format.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-19T18:09:27.451344-08:00","updated_at":"2025-12-19T18:09:27.451344-08:00","dependencies":[{"issue_id":"gt-0qki","depends_on_id":"gt-ktal","type":"blocks","created_at":"2025-12-19T18:09:39.58445-08:00","created_by":"daemon"}]} +{"id":"gt-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":"closed","priority":2,"issue_type":"task","created_at":"2025-12-19T18:09:27.451344-08:00","updated_at":"2025-12-25T20:47:06.914405-08:00","closed_at":"2025-12-25T20:47:06.914405-08:00","close_reason":"Superseded by gt-m5w4g (Agent Communication Protocol) - consolidated into new epic structure","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":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-21T21:48:26.322452-08:00","updated_at":"2025-12-25T14:12:42.195231-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"}],"deleted_at":"2025-12-25T14:12:42.195231-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} {"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-0skyg","title":"Nudge newly spawned polecats","description":"Nudge newly spawned polecats that are ready for input.\n\nWhen polecats are spawned, their Claude session takes 10-20 seconds to initialize.\nThe spawn command returns immediately without waiting. This step finds spawned\npolecats that are now ready and sends them a trigger to start working.\n\n```bash\n# For each rig with polecats\nfor rig in gastown beads; do\n gt polecats $rig\n # For each working polecat, check if Claude is ready\n # Use tmux capture-pane to look for \"\u003e \" prompt\ndone\n```\n\nFor each ready polecat that hasn't been triggered yet:\n1. Send \"Begin.\" to trigger UserPromptSubmit hook\n2. The hook injects mail, polecat sees its assignment\n3. Mark polecat as triggered in state\n\nUse WaitForClaudeReady from tmux package (polls for \"\u003e \" prompt).\nTimeout: 60 seconds per polecat. If not ready, try again next cycle.\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T02:11:33.777565-08:00","updated_at":"2025-12-25T11:27:47.578347-08:00","closed_at":"2025-12-25T11:27:47.578347-08:00","close_reason":"No polecats to nudge","dependencies":[{"issue_id":"gt-0skyg","depends_on_id":"gt-uru8z","type":"blocks","created_at":"2025-12-25T02:11:33.977731-08:00","created_by":"stevey"}]} @@ -37,7 +37,7 @@ {"id":"gt-0yqqw","title":"Messaging infrastructure: lists, queues, and channels","description":"## Problem\n\nCurrent messaging is point-to-point only:\n- Mail: A → B (durable, polling)\n- Nudge: A → B (ephemeral, real-time)\n\nNo support for broadcast, work queues, or pub/sub patterns.\n\n## Design\n\n### Addressing Syntax\n\n| Prefix | System | Resolution | Storage | Claim? |\n|--------|--------|------------|---------|--------|\n| `agent/` | Mail | Direct | Recipient inbox | N/A |\n| `@group` | Mail | Dynamic (filesystem) | Fan-out (N copies) | No |\n| `list:name` | Mail | Static config | Fan-out (N copies) | No |\n| `queue:name` | Mail | Static config | Shared (1 copy) | Yes |\n| `announce:name` | Mail | Static config | Shared (1 copy) | No |\n| `#channel` | Nudge | Dynamic (tmux) | None (ephemeral) | No |\n\n### Dynamic Aliases\n\n- `@rig/gastown` → scan ~/gt/gastown/ for agent dirs (witness, refinery, crew/*, polecats/*)\n- `@town` → scan ~/gt/ for all agent dirs\n- `@witnesses` → for each rig, include \u003crig\u003e/witness\n- `@crew/gastown` → scan ~/gt/gastown/crew/*\n- `#rig/gastown` → scan tmux for gastown/* sessions\n- `#town` → scan tmux for all Gas Town sessions\n\n**Mail** resolves against filesystem (agents that exist)\n**Channels** resolve against tmux (agents that are running)\n\n### Static Config\n\nLocation: `~/gt/config/` (JSON format, machine-edited)\n\n```json\n// lists.json\n{\n \"oncall\": [\"mayor/\", \"gastown/witness\", \"beads/witness\"],\n \"cleanup/gastown\": [\"gastown/witness\", \"deacon/\"]\n}\n```\n\n### Work Queue Semantics\n\n- `gt mail send queue:cleanup/gastown -s \"Task\" -m \"...\"`\n- `bd update \u003cmsg-id\u003e --claim` → atomic claim (sets assignee + in_progress)\n- If already claimed, returns error \"already claimed by X\"\n\n### Use Cases\n\n1. **Polecat spawn**: `gt mail send @rig/gastown` → Witness + Deacon both notified\n2. **Polecat cleanup**: `gt mail send queue:cleanup/gastown` → first to claim handles it\n3. **Town broadcast**: `gt mail send @town -s \"Handoff now\"` → everyone gets copy\n4. **Real-time alert**: `gt channel publish #witnesses \"Swarm incoming\"`\n\n## Implementation Tasks\n\n1. Create ~/gt/config/ directory structure\n2. Implement dynamic alias resolution (filesystem scan)\n3. Implement static list lookup (config/lists.json)\n4. Add fan-out at send time for @/list: addresses\n5. Implement queue: with shared storage\n6. Add `bd update --claim` for work queue semantics\n7. Implement channel resolution (tmux scan)\n8. Add `gt channel publish` command","status":"open","priority":2,"issue_type":"epic","created_at":"2025-12-25T13:39:38.624096-08:00","updated_at":"2025-12-25T13:39:38.624096-08:00","dependencies":[{"issue_id":"gt-0yqqw","depends_on_id":"gt-s89rg","type":"blocks","created_at":"2025-12-25T14:57:38.134092-08:00","created_by":"daemon"},{"issue_id":"gt-0yqqw","depends_on_id":"gt-flje1","type":"blocks","created_at":"2025-12-25T14:57:38.221076-08:00","created_by":"daemon"}]} {"id":"gt-110m","title":"Digest: mol-deacon-patrol","description":"Patrol 1: All healthy, no lifecycle requests, no orphans","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T23:05:14.439933-08:00","updated_at":"2025-12-24T23:05:14.439933-08:00","closed_at":"2025-12-24T23:05:14.439903-08:00","close_reason":"Squashed from 8 wisps"} {"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-14w3x","title":"Digest: mol-deacon-patrol","description":"Patrol 18: Green","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:36:04.72988-08:00","updated_at":"2025-12-25T19:36:04.72988-08:00","closed_at":"2025-12-25T19:36:04.729833-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-14w3x","depends_on_id":"gt-wisp-072","type":"parent-child","created_at":"2025-12-25T19:36:04.730737-08:00","created_by":"deacon"}]} +{"id":"gt-14w3x","title":"Digest: mol-deacon-patrol","description":"Patrol 18: Green","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:36:04.72988-08:00","updated_at":"2025-12-25T19:36:04.72988-08:00","closed_at":"2025-12-25T19:36:04.729833-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-15p32","title":"Digest: mol-deacon-patrol","description":"Patrol 15: routine","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T13:45:12.609172-08:00","updated_at":"2025-12-25T13:45:12.609172-08:00","closed_at":"2025-12-25T13:45:12.609139-08:00","dependencies":[{"issue_id":"gt-15p32","depends_on_id":"gt-k1m21","type":"parent-child","created_at":"2025-12-25T13:45:12.609934-08:00","created_by":"stevey"}]} {"id":"gt-161rp","title":"Digest: mol-deacon-patrol","description":"P5: stable","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:56:02.332455-08:00","updated_at":"2025-12-25T19:56:02.332455-08:00","closed_at":"2025-12-25T19:56:02.332424-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-161rp","depends_on_id":"gt-wisp-tmm","type":"parent-child","created_at":"2025-12-25T19:56:02.333133-08:00","created_by":"deacon"}]} {"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"}]} @@ -118,7 +118,7 @@ {"id":"gt-2zfi3","title":"Digest: mol-deacon-patrol","description":"P17: stable","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T20:14:39.841949-08:00","updated_at":"2025-12-25T20:14:39.841949-08:00","closed_at":"2025-12-25T20:14:39.841892-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-2zfi3","depends_on_id":"gt-wisp-7vp","type":"parent-child","created_at":"2025-12-25T20:14:39.842789-08:00","created_by":"deacon"}]} {"id":"gt-30o","title":"Error handling improvements: retry logic and recovery hints","description":"Improve error handling across GGT codebase.\n\n## Issues Found\n\n### 1. Silent Failures in Refinery\nmanager.go ProcessMR():\n- git pull errors ignored\n- Continues processing even on partial failures\n\n### 2. Missing Beads CLI\nMany operations silently continue if `bd` not found:\n```go\n// Current\ntasks, err := m.loadTasksFromBeads(epicID)\nif err != nil {\n // Non-fatal - swarm can start without tasks\n}\n\n// Better\nif err != nil {\n return nil, fmt.Errorf(\"beads required: %w\", err)\n}\n```\n\n### 3. No Retry Logic\nNetwork/lock errors should retry:\n```go\nfunc withRetry(attempts int, delay time.Duration, fn func() error) error {\n for i := 0; i \u003c attempts; i++ {\n if err := fn(); err == nil {\n return nil\n }\n time.Sleep(delay)\n }\n return fmt.Errorf(\"failed after %d attempts\", attempts)\n}\n```\n\n### 4. Recovery Hints\nError messages should include fix suggestions:\n```go\n// Current\nreturn fmt.Errorf(\"polecat not found\")\n\n// Better\nreturn fmt.Errorf(\"polecat '%s' not found. Use 'gt polecat list' to see available polecats\", name)\n```\n\n## Domain Error Types\n```go\ntype SessionError struct {\n Op string\n Polecat string\n Err error\n}\n\nfunc (e *SessionError) Error() string {\n return fmt.Sprintf(\"session %s for %s: %v\", e.Op, e.Polecat, e.Err)\n}\n```\n\n## Files to Review\n- internal/refinery/manager.go\n- internal/swarm/manager.go\n- internal/session/manager.go\n- All cmd/*.go files\n\n## Acceptance Criteria\n- [ ] No silent error swallowing\n- [ ] Retry logic for transient failures\n- [ ] Helpful error messages with hints\n- [ ] Consistent error types per domain","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-16T14:48:48.183421-08:00","updated_at":"2025-12-16T16:06:52.751546-08:00"} {"id":"gt-3133","title":"Account management for multi-account Claude Code usage","description":"Enable Gas Town to manage multiple Claude Code accounts (e.g., personal vs work) with easy switching. Core mechanism: CLAUDE_CONFIG_DIR env var per account. See docs/design/account-management.md for full design.","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-12-23T03:23:35.825288-08:00","updated_at":"2025-12-23T04:04:28.216463-08:00","closed_at":"2025-12-23T04:04:28.216463-08:00","close_reason":"Account management fully implemented - config parsing, list/add/default commands, GT_ACCOUNT env var, --account flag","dependencies":[{"issue_id":"gt-3133","depends_on_id":"gt-58tu","type":"blocks","created_at":"2025-12-23T03:24:37.170307-08:00","created_by":"daemon"},{"issue_id":"gt-3133","depends_on_id":"gt-hs6y","type":"blocks","created_at":"2025-12-23T03:24:37.263123-08:00","created_by":"daemon"},{"issue_id":"gt-3133","depends_on_id":"gt-nq1a","type":"blocks","created_at":"2025-12-23T03:24:37.353483-08:00","created_by":"daemon"},{"issue_id":"gt-3133","depends_on_id":"gt-0c7s","type":"blocks","created_at":"2025-12-23T03:24:37.443494-08:00","created_by":"daemon"},{"issue_id":"gt-3133","depends_on_id":"gt-74a7","type":"blocks","created_at":"2025-12-23T03:24:37.534229-08:00","created_by":"daemon"},{"issue_id":"gt-3133","depends_on_id":"gt-plcg","type":"blocks","created_at":"2025-12-23T03:24:37.625162-08:00","created_by":"daemon"}]} -{"id":"gt-31eg","title":"Epic: Async Gates for Agent Coordination","description":"## Summary\n\nAgents need an async primitive for waiting on external events (CI completion,\nAPI responses, human approval). Currently they either poll wastefully or cant\nresume after handoff.\n\n## Design: Deacon-Managed Gates\n\n### Core Concepts\n\n**Gate** = wisp issue that blocks until external condition is met\n- Type: `gate`\n- Phase: wisp (never synced, ephemeral)\n- Assignee: `deacon/` (Deacon monitors it)\n- Fields: `await_type`, `await_id`, `timeout`, `waiters[]`\n\n**Await Types:**\n- `gh:run:\u003cid\u003e` - GitHub Actions run completion\n- `gh:pr:\u003cid\u003e` - PR merged/closed\n- `timer:\u003cduration\u003e` - Simple delay (e.g., \"5m\", \"1h\")\n- `human:\u003cprompt\u003e` - Human approval required\n- `mail:\u003cpattern\u003e` - Wait for mail matching pattern\n\n### Commands\n\n```bash\nbd gate create --await \u003ctype\u003e:\u003cid\u003e --timeout \u003cduration\u003e --notify \u003caddr\u003e\nbd gate show \u003cid\u003e\nbd gate list\nbd gate close \u003cid\u003e --reason \"completed\"\nbd gate wait \u003cid\u003e --notify \u003caddr\u003e\n```\n\n## Children (suggested breakdown)\n\n1. Add `gate` issue type to beads\n2. Add gate fields: await_type, await_id, timeout, waiters\n3. Implement `bd gate create/show/list/close/wait` commands\n4. Add gate checking to Deacon patrol loop\n5. Implement await type handlers (gh:run, gh:pr, timer, human, mail)\n6. Add gate timeout tracking and notification\n7. Integration test: agent waits for CI via gate\n\n## Open Questions\n\n- Should gates live in wisp storage or main storage with wisp flag?\n- Do we need a gate catalog (like molecule catalog)?\n- Should `waits-for` dep type work with gates?","status":"open","priority":1,"issue_type":"epic","created_at":"2025-12-24T19:19:17.774543-08:00","updated_at":"2025-12-24T19:19:17.774543-08:00"} +{"id":"gt-31eg","title":"Epic: Async Gates for Agent Coordination","description":"## Summary\n\nAgents need an async primitive for waiting on external events (CI completion,\nAPI responses, human approval). Currently they either poll wastefully or cant\nresume after handoff.\n\n## Design: Deacon-Managed Gates\n\n### Core Concepts\n\n**Gate** = wisp issue that blocks until external condition is met\n- Type: `gate`\n- Phase: wisp (never synced, ephemeral)\n- Assignee: `deacon/` (Deacon monitors it)\n- Fields: `await_type`, `await_id`, `timeout`, `waiters[]`\n\n**Await Types:**\n- `gh:run:\u003cid\u003e` - GitHub Actions run completion\n- `gh:pr:\u003cid\u003e` - PR merged/closed\n- `timer:\u003cduration\u003e` - Simple delay (e.g., \"5m\", \"1h\")\n- `human:\u003cprompt\u003e` - Human approval required\n- `mail:\u003cpattern\u003e` - Wait for mail matching pattern\n\n### Commands\n\n```bash\nbd gate create --await \u003ctype\u003e:\u003cid\u003e --timeout \u003cduration\u003e --notify \u003caddr\u003e\nbd gate show \u003cid\u003e\nbd gate list\nbd gate close \u003cid\u003e --reason \"completed\"\nbd gate wait \u003cid\u003e --notify \u003caddr\u003e\n```\n\n## Children (suggested breakdown)\n\n1. Add `gate` issue type to beads\n2. Add gate fields: await_type, await_id, timeout, waiters\n3. Implement `bd gate create/show/list/close/wait` commands\n4. Add gate checking to Deacon patrol loop\n5. Implement await type handlers (gh:run, gh:pr, timer, human, mail)\n6. Add gate timeout tracking and notification\n7. Integration test: agent waits for CI via gate\n\n## Open Questions\n\n- Should gates live in wisp storage or main storage with wisp flag?\n- Do we need a gate catalog (like molecule catalog)?\n- Should `waits-for` dep type work with gates?","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-24T19:19:17.774543-08:00","updated_at":"2025-12-25T20:47:05.798754-08:00","closed_at":"2025-12-25T20:47:05.798754-08:00","close_reason":"Superseded by gt-twjr5 (Async Coordination Gates) - consolidated into new epic structure"} {"id":"gt-346","title":"Update harness beads redirect for GGT","description":"Change ~/ai/.beads/redirect from mayor/rigs/gastown/.beads to gastown/mayor/.beads for the GGT directory structure","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-17T16:42:41.650571-08:00","updated_at":"2025-12-19T12:00:39.272977-08:00","closed_at":"2025-12-19T12:00:39.272977-08:00","dependencies":[{"issue_id":"gt-346","depends_on_id":"gt-l1o","type":"blocks","created_at":"2025-12-17T16:42:54.495061-08:00","created_by":"daemon"},{"issue_id":"gt-346","depends_on_id":"gt-cr9","type":"blocks","created_at":"2025-12-17T17:15:59.04264-08:00","created_by":"daemon"}]} {"id":"gt-35s","title":"Architecture: beads config and direct landing docs","description":"Added to architecture.md:\n- Beads multi-agent configuration table (daemon, worktree, sync-branch)\n- ASCII directory layout for non-mermaid rendering\n- Direct landing workflow (bypass merge queue)\n- Design decisions 9 and 10 for direct landing and daemon awareness\n- CLI commands for gt land","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-16T00:29:52.395906-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-35x","title":"Plugin: plan-oracle (work decomposition)","description":"Plugin that helps decompose epics/issues into sub-tasks. Analyzes scope, identifies dependencies, estimates complexity for parallelization, creates beads for sub-tasks with dependency links.","status":"open","priority":3,"issue_type":"feature","created_at":"2025-12-15T22:53:05.772986-08:00","updated_at":"2025-12-15T23:17:06.423894-08:00","dependencies":[{"issue_id":"gt-35x","depends_on_id":"gt-axz","type":"blocks","created_at":"2025-12-15T22:53:17.587726-08:00","created_by":"daemon"}]} @@ -250,7 +250,7 @@ {"id":"gt-5af.6","title":"Add Deacon heartbeat mechanism","description":"Deacon writes deacon/heartbeat.json on each wake. Go daemon reads it to decide whether to poke. Add heartbeat read/write helpers.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T17:13:52.057582-08:00","updated_at":"2025-12-19T17:26:36.573141-08:00","closed_at":"2025-12-19T17:26:36.573141-08:00","dependencies":[{"issue_id":"gt-5af.6","depends_on_id":"gt-5af","type":"parent-child","created_at":"2025-12-19T17:13:52.059708-08:00","created_by":"daemon"}]} {"id":"gt-5af.7","title":"Add crew session pattern to lifecycle handling","description":"Update identityToSession and restartSession to handle crew patterns: gastown/max -\u003e gt-gastown-max. Crew workers can request lifecycle but are not proactively monitored.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T17:13:57.662197-08:00","updated_at":"2025-12-20T21:00:03.949545-08:00","closed_at":"2025-12-20T20:40:29.514592-08:00","dependencies":[{"issue_id":"gt-5af.7","depends_on_id":"gt-5af","type":"parent-child","created_at":"2025-12-19T17:13:57.664036-08:00","created_by":"daemon"}]} {"id":"gt-5af.8","title":"Add human escalation configuration","description":"Add overseer contact config to mayor/town.json. Deacon uses this for escalation when it cannot resolve issues. Support email and/or other notification methods.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-19T17:14:02.770713-08:00","updated_at":"2025-12-20T21:00:03.94794-08:00","closed_at":"2025-12-20T20:40:29.515593-08:00","dependencies":[{"issue_id":"gt-5af.8","depends_on_id":"gt-5af","type":"parent-child","created_at":"2025-12-19T17:14:02.772612-08:00","created_by":"daemon"}]} -{"id":"gt-5e50a","title":"Digest: mol-deacon-patrol","description":"Patrol 15: Green","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:35:02.300302-08:00","updated_at":"2025-12-25T19:35:02.300302-08:00","closed_at":"2025-12-25T19:35:02.300256-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-5e50a","depends_on_id":"gt-wisp-hig","type":"parent-child","created_at":"2025-12-25T19:35:02.301098-08:00","created_by":"deacon"}]} +{"id":"gt-5e50a","title":"Digest: mol-deacon-patrol","description":"Patrol 15: Green","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:35:02.300302-08:00","updated_at":"2025-12-25T19:35:02.300302-08:00","closed_at":"2025-12-25T19:35:02.300256-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-5fa3i","title":"Digest: mol-deacon-patrol","description":"Patrol 1: inbox empty, Mayor OK, 2 witnesses, 2 refineries healthy, no orphans","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T13:40:42.819905-08:00","updated_at":"2025-12-25T13:40:42.819905-08:00","closed_at":"2025-12-25T13:40:42.819873-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-5fa3i","depends_on_id":"gt-xn0y6","type":"parent-child","created_at":"2025-12-25T13:40:42.820658-08:00","created_by":"stevey"}]} {"id":"gt-5ft3","title":"Merge: gt-99a","description":"branch: polecat/Slit\ntarget: main\nsource_issue: gt-99a\nrig: gastown","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-19T16:18:15.329358-08:00","updated_at":"2025-12-19T18:26:14.101606-08:00","closed_at":"2025-12-19T17:48:44.671082-08:00"} {"id":"gt-5ggc","title":"Digest: mol-deacon-patrol","description":"Patrol 4: All healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T21:16:30.523256-08:00","updated_at":"2025-12-24T21:16:30.523256-08:00","closed_at":"2025-12-24T21:16:30.523221-08:00"} @@ -539,7 +539,7 @@ {"id":"gt-b5sh","title":"test-after-fix","description":"test","status":"closed","priority":2,"issue_type":"message","created_at":"2025-12-19T16:05:08.538763-08:00","updated_at":"2025-12-25T01:33:01.230553-08:00","closed_at":"2025-12-25T01:33:01.230553-08:00","close_reason":"Test pollution cleanup"} {"id":"gt-b6qm","title":"gt spawn/crew setup should create .beads/redirect for worktrees","description":"Crew clones and polecats need a .beads/redirect file pointing to the shared beads database (../../mayor/rig/.beads). Currently:\n\n- redirect files can get deleted by git clean\n- not auto-created during gt spawn or worktree setup\n- missing redirects cause 'no beads database found' errors\n\nFound missing in: gastown/joe, beads/zoey (after git clean)\n\nFix options:\n1. gt spawn creates redirect during worktree setup\n2. gt prime regenerates missing redirects\n3. bd commands auto-detect worktree and find shared beads\n\nThis should be standard Gas Town rig configuration.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-21T17:51:11.222073-08:00","updated_at":"2025-12-21T21:16:53.518631-08:00","closed_at":"2025-12-21T21:16:53.518631-08:00","close_reason":"Fixed: crew.Add() creates redirect, gt prime regenerates missing redirects"} {"id":"gt-b83nx","title":"Digest: mol-deacon-patrol","description":"Patrol 14: all clear","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T11:05:34.850044-08:00","updated_at":"2025-12-25T11:05:34.850044-08:00","closed_at":"2025-12-25T11:05:34.850015-08:00","close_reason":"Squashed from 8 wisps"} -{"id":"gt-badfi","title":"Digest: mol-deacon-patrol","description":"Patrol 16: Green","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:35:25.272732-08:00","updated_at":"2025-12-25T19:35:25.272732-08:00","closed_at":"2025-12-25T19:35:25.27268-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-badfi","depends_on_id":"gt-wisp-n69","type":"parent-child","created_at":"2025-12-25T19:35:25.273545-08:00","created_by":"deacon"}]} +{"id":"gt-badfi","title":"Digest: mol-deacon-patrol","description":"Patrol 16: Green","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:35:25.272732-08:00","updated_at":"2025-12-25T19:35:25.272732-08:00","closed_at":"2025-12-25T19:35:25.27268-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-bbb1","title":"Merge: gt-rana.4","description":"branch: polecat/ace\ntarget: main\nsource_issue: gt-rana.4\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-21T16:47:29.769226-08:00","updated_at":"2025-12-21T17:20:27.498389-08:00","closed_at":"2025-12-21T17:20:27.498389-08:00","close_reason":"ORPHANED: Branch never pushed, worktree deleted"} {"id":"gt-bcwn","title":"Auto-handoff: self-cycling with guaranteed work pickup","description":"## Summary\n\nA mechanism for agents to self-cycle: send handoff mail, request Deacon to kill the process, and automatically restart to pick up the work.\n\n## Use Case\n\nUser says: `auto-handoff: gt-bug3`\n\nThe agent:\n1. Sends handoff mail documenting current state\n2. Requests Deacon to terminate the session\n3. Deacon restarts the agent in background\n4. New session picks up the handoff and continues working\n\nWhen the user returns to terminal, the old session is gone but work continues in background. User can reattach.\n\n## Key Requirements\n\n- **Guaranteed pickup**: Something in the hook and/or handoff must ensure the new session picks up the work (not just a passive \"check inbox\")\n- **Background execution**: Work continues without user presence\n- **Reattachability**: User can reconnect to see progress\n\n## Design Questions\n\n1. Can molecules help coordinate this? (e.g., molecule binds the handoff + auto-restart)\n2. What hook handles the pickup guarantee? \n3. How does Deacon know to restart vs just kill?\n4. How does user reattach to a background agent?\n\n## Related\n\n- Molecules system\n- Deacon lifecycle management\n- Handoff hooks","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-21T11:59:50.352286-08:00","updated_at":"2025-12-21T12:00:06.867846-08:00"} {"id":"gt-bd02","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:06:06.94872-08:00","updated_at":"2025-12-25T01:33:01.044793-08:00","closed_at":"2025-12-25T01:33:01.044793-08:00","close_reason":"Test pollution cleanup"} @@ -618,7 +618,7 @@ {"id":"gt-ct0u","title":"Merge: gt-3x1.4","description":"branch: polecat/Nux\ntarget: main\nsource_issue: gt-3x1.4\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-19T14:53:53.140259-08:00","updated_at":"2025-12-19T18:26:14.104002-08:00","closed_at":"2025-12-19T17:49:09.234713-08:00"} {"id":"gt-ctr","title":"GGT vs PGT Gap Analysis Summary","description":"Summary of gaps comparing GGT (~4,500 LOC) to PGT (~27,700 LOC).\n\n## Critical Gaps (P1) - Existing Issues\n- gt-u1j.17: Polecat CLI (add, list, wake, sleep) - DETAILED\n- gt-u1j.16: Rig CLI (add, list, show, remove) - DETAILED\n- gt-u1j.18: Witness CLI (start, stop, status) - DETAILED\n- gt-f9x.4: Doctor framework - DETAILED\n- gt-f9x.5: Workspace doctor checks - DETAILED\n- gt-f9x.6: Rig doctor checks - DETAILED\n\n## Critical Gaps (P1) - New Issues\n- gt-a95: Refinery background daemon mode - ENHANCED\n- gt-hgk: Mail message types and threading - ENHANCED\n\n## Significant Gaps (P2) - New Issues\n- gt-d46: Mail CLI archive/purge/search - ENHANCED\n- gt-e9k: Swarm preflight/postflight - ENHANCED\n- gt-662: Swarm report generation - ENHANCED\n- gt-69l: Hook system - ENHANCED\n- gt-3yj: Agent monitoring - ENHANCED\n- gt-1ky: Workspace CLI (may overlap f9x.3) - ENHANCED\n- gt-9j9: Worker status reporting - ENHANCED\n- gt-qao: Mayor CLI - ENHANCED\n- gt-7o7: Session pre-shutdown checks - ENHANCED\n- gt-c92: Batch all command - ENHANCED\n- gt-lno: Swarm state persistence - ENHANCED\n- gt-a9y: File locking - ENHANCED\n- gt-30o: Error handling improvements - ENHANCED\n\n## Significant Gaps (P2) - Existing Issues\n- gt-kmn.12: Ephemeral rig support - DETAILED\n\n## Lower Priority (P3) - New Issues\n- gt-3fm: Mail orchestrator daemon - ENHANCED\n- gt-2kz: Cleanup commands - ENHANCED\n- gt-ebl: Names commands - ENHANCED\n- gt-1u9: Interactive prompts - ENHANCED\n- gt-8lz: Help text improvements - ENHANCED\n\n## Closed as Duplicates\n- gt-3tz → gt-u1j.17 (polecat CLI)\n- gt-e1r → gt-u1j.16 (rig CLI)\n- gt-86w → gt-f9x.4/5/6 (doctor)\n- gt-alx → gt-kmn.12 (ephemeral rigs)\n\n## Execution Order Recommendation\n1. P1 CLI commands (existing detailed issues ready to implement)\n2. gt-a95: Refinery daemon (blocks autonomous operation)\n3. gt-7o7: Pre-shutdown checks (prevents data loss)\n4. gt-a9y: File locking (prevents corruption)\n5. gt-hgk + gt-d46: Mail improvements\n6. gt-69l: Hook system (enables extensibility)\n7. Remaining P2s in any order\n8. P3s as time permits","status":"open","priority":1,"issue_type":"epic","created_at":"2025-12-16T14:49:09.555759-08:00","updated_at":"2025-12-16T16:07:58.413016-08:00"} {"id":"gt-cu7r","title":"Implement handoffs using pinned beads","description":"Replace the current mail-based handoff system with pinned beads.\n\n## Current Problem\n\nHandoff messages get closed before the successor can read them because:\n1. `gt mail read` auto-acks (closes) messages\n2. `bd mail inbox` only shows open messages\n3. Successor sees empty inbox\n\n## Solution\n\nUse pinned beads for handoffs:\n- One pinned bead per role: `mayor-handoff`, `\u003crig\u003e-refinery-handoff`, etc.\n- Predecessor updates the content before cycling\n- Successor reads on startup via `gt prime`\n- Never closes - always available\n\n## Implementation\n\n### 1. Create handoff beads on first cycle\n- `bd create --title='Mayor Handoff' --type=task --status=pinned --assignee=mayor`\n- Store ID in role config or use well-known naming convention\n\n### 2. Update gt handoff command\n- Instead of `bd mail send`, update the pinned handoff bead\n- `bd update \u003chandoff-id\u003e --description='...handoff content...'`\n\n### 3. Update gt prime\n- Read the role's handoff bead\n- Display content to successor\n\n### 4. Compression/reset\n- `gt rig reset` clears handoff content\n- Or manual: `bd update \u003chandoff-id\u003e --description=''`\n\n## Dependencies\n\nRequires beads-6v2 (StatusPinned) to be implemented first.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-18T21:28:05.738035-08:00","updated_at":"2025-12-19T01:57:17.034513-08:00","closed_at":"2025-12-19T01:57:17.034513-08:00"} -{"id":"gt-cv3lb","title":"Digest: mol-deacon-patrol","description":"Patrol 19: Green","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:36:22.291924-08:00","updated_at":"2025-12-25T19:36:22.291924-08:00","closed_at":"2025-12-25T19:36:22.291869-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-cv3lb","depends_on_id":"gt-wisp-clo","type":"parent-child","created_at":"2025-12-25T19:36:22.29271-08:00","created_by":"deacon"}]} +{"id":"gt-cv3lb","title":"Digest: mol-deacon-patrol","description":"Patrol 19: Green","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:36:22.291924-08:00","updated_at":"2025-12-25T19:36:22.291924-08:00","closed_at":"2025-12-25T19:36:22.291869-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-cv9a","title":"Merge: gt-ay1r","description":"branch: polecat/dementus\ntarget: main\nsource_issue: gt-ay1r\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-22T23:51:54.383198-08:00","updated_at":"2025-12-22T23:53:02.089556-08:00","closed_at":"2025-12-22T23:53:02.089556-08:00","close_reason":"Merged to main"} {"id":"gt-cvfg","title":"Use cmd.OutOrStdout instead of fmt.Print in refinery","description":"refinery/manager.go and refinery/engineer.go use fmt.Print/Println directly for user output (30+ occurrences). This breaks testability and doesn't follow cobra best practices. Should use cmd.OutOrStdout() or pass an io.Writer.\n\nAffected files:\n- internal/refinery/manager.go (lines 222, 360-361, 369, 387-393, 519, 537, 672)\n- internal/refinery/engineer.go (lines 190-211, 249, 294-297, 325-353, 362-366)","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-21T21:35:08.080292-08:00","updated_at":"2025-12-21T22:18:10.18202-08:00","closed_at":"2025-12-21T22:18:10.18202-08:00","close_reason":"Added io.Writer field to Manager and Engineer structs with SetOutput() methods for testability. Replaced all 30+ fmt.Print calls with fmt.Fprintf using the configurable output writer."} {"id":"gt-cwndo","title":"Digest: mol-deacon-patrol","description":"Patrol 15: All healthy, no messages","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T18:29:00.960438-08:00","updated_at":"2025-12-25T18:29:00.960438-08:00","closed_at":"2025-12-25T18:29:00.960388-08:00","close_reason":"Squashed from 8 wisps"} @@ -635,7 +635,7 @@ {"id":"gt-d5tgv","title":"Digest: mol-deacon-patrol","description":"Patrol 8: Mayor OK, 11 sessions","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T20:36:31.187594-08:00","updated_at":"2025-12-25T20:36:31.187594-08:00","closed_at":"2025-12-25T20:36:31.187552-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-d5tgv","depends_on_id":"gt-wisp-mmt","type":"parent-child","created_at":"2025-12-25T20:36:31.188361-08:00","created_by":"deacon"}]} {"id":"gt-d7i","title":"gt session capture: Support positional line count argument","description":"Make 'gt session capture gastown/Toast 50' work.\n\nCurrently requires: gt session capture gastown/Toast -n 50\nShould also accept: gt session capture gastown/Toast 50\n\nAgent UX principle: commands should work the way agents guess they work.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-17T22:28:44.291285-08:00","updated_at":"2025-12-19T01:33:49.860862-08:00","closed_at":"2025-12-19T01:33:49.860862-08:00"} {"id":"gt-d7i38","title":"Digest: mol-deacon-patrol","description":"Patrol 20: All healthy - handoff threshold reached","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T18:53:56.983327-08:00","updated_at":"2025-12-25T18:53:56.983327-08:00","closed_at":"2025-12-25T18:53:56.983278-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-d7i38","depends_on_id":"gt-wisp-bhp","type":"parent-child","created_at":"2025-12-25T18:53:56.984173-08:00","created_by":"deacon"}]} -{"id":"gt-d8a8x","title":"Digest: mol-deacon-patrol","description":"Patrol 13: All green","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:34:25.657224-08:00","updated_at":"2025-12-25T19:34:25.657224-08:00","closed_at":"2025-12-25T19:34:25.657173-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-d8a8x","depends_on_id":"gt-wisp-wn5","type":"parent-child","created_at":"2025-12-25T19:34:25.657994-08:00","created_by":"deacon"}]} +{"id":"gt-d8a8x","title":"Digest: mol-deacon-patrol","description":"Patrol 13: All green","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:34:25.657224-08:00","updated_at":"2025-12-25T19:34:25.657224-08:00","closed_at":"2025-12-25T19:34:25.657173-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-dapb","title":"mol-polecat-arm","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.\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## Steps\n\n### capture\nCapture recent tmux output for this polecat.\n\n```bash\ntmux capture-pane -t gt-{{rig}}-{{polecat_name}} -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### assess\nCategorize polecat state.\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### load-history\nRead nudge history for this polecat from patrol state.\n\n```\nnudge_count = state.nudges[{{polecat_name}}].count\nlast_nudge_time = state.nudges[{{polecat_name}}].timestamp\n```\n\nNeeds: assess\n\n### decide\nApply the nudge matrix to determine action.\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### execute\nTake the decided action.\n\n**nudge-N**:\n```bash\ntmux send-keys -t gt-{{rig}}-{{polecat_name}} \"{{nudge_text}}\" Enter\n```\n\n**pre-kill-verify**:\n```bash\ncd polecats/{{polecat_name}}\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: {{polecat_name}} 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\n\nThis data feeds back to the patrol's aggregate step.\n\nLabels: [template, christmas-ornament, polecat-arm]","status":"open","priority":2,"issue_type":"epic","created_at":"2025-12-23T02:37:03.754926-08:00","updated_at":"2025-12-23T02:37:03.754926-08:00"} {"id":"gt-db4x","title":"Merge: gt-7919","description":"branch: polecat/furiosa\ntarget: main\nsource_issue: gt-7919\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-22T23:41:28.898315-08:00","updated_at":"2025-12-22T23:49:28.398755-08:00","closed_at":"2025-12-22T23:49:28.398755-08:00","close_reason":"Merged to main - tests now pass"} {"id":"gt-dck","title":"Update config location: .gastown/ → config/","description":"Move rig configuration from hidden .gastown/ to visible config/:\n- config/rig.json: Rig configuration\n- config/engineer.json: Engineer settings (test command, etc.)\n- config/witness.json: Witness settings (heartbeat interval, etc.)\n\nHidden directories are poorly discovered by AI agents.","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-16T23:02:20.400818-08:00","updated_at":"2025-12-16T23:02:20.400818-08:00","dependencies":[{"issue_id":"gt-dck","depends_on_id":"gt-h5n","type":"blocks","created_at":"2025-12-16T23:02:55.69517-08:00","created_by":"daemon"}]} @@ -643,7 +643,7 @@ {"id":"gt-dd8s","title":"gt molecule seed: create built-in molecules as beads","description":"The molecule infrastructure is complete but built-in molecules (engineer-in-box, quick-fix, research) need to be seeded into the beads database.\n\n## Current State\n- `gt molecule list` works but shows 0 molecules\n- BuiltinMolecules() in internal/beads/builtin_molecules.go has 3 molecules defined\n- No way to create them as beads\n\n## Needed\nAdd `gt molecule seed` command that:\n1. Reads BuiltinMolecules()\n2. Creates each as a bead with type: molecule\n3. Uses well-known IDs (mol-engineer-in-box, mol-quick-fix, mol-research)\n4. Idempotent (skip if already exists)\n\n## Acceptance Criteria\n```\ngt molecule seed\ngt molecule list # Shows 3 built-in molecules\n```\n\n## Parent\ngt-4nn: Molecules epic","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T14:13:27.432957-08:00","updated_at":"2025-12-19T15:24:39.125244-08:00","closed_at":"2025-12-19T14:44:40.092009-08:00"} {"id":"gt-ddz7f","title":"Test Patrol Parent","description":"Test parent for Christmas Ornament pattern","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T02:11:13.802672-08:00","updated_at":"2025-12-25T02:11:14.115831-08:00","closed_at":"2025-12-25T02:11:14.115831-08:00","close_reason":"Closed"} {"id":"gt-ddz7f.1","title":"Test Polecat Arm","description":"Test child for bonding pattern","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T02:11:13.901143-08:00","updated_at":"2025-12-25T02:11:14.007583-08:00","closed_at":"2025-12-25T02:11:14.007583-08:00","close_reason":"Closed","dependencies":[{"issue_id":"gt-ddz7f.1","depends_on_id":"gt-ddz7f","type":"parent-child","created_at":"2025-12-25T02:11:13.901586-08:00","created_by":"daemon"}]} -{"id":"gt-dft6a","title":"Digest: mol-deacon-patrol","description":"Patrol 10: All green - halfway mark","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:32:55.926182-08:00","updated_at":"2025-12-25T19:32:55.926182-08:00","closed_at":"2025-12-25T19:32:55.926125-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-dft6a","depends_on_id":"gt-wisp-0nb","type":"parent-child","created_at":"2025-12-25T19:32:55.92699-08:00","created_by":"deacon"}]} +{"id":"gt-dft6a","title":"Digest: mol-deacon-patrol","description":"Patrol 10: All green - halfway mark","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:32:55.926182-08:00","updated_at":"2025-12-25T19:32:55.926182-08:00","closed_at":"2025-12-25T19:32:55.926125-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-dh65","title":"Add gate checking to Deacon patrol loop","description":"Integrate gate checking into Deacon's patrol cycle.\n\n## Patrol Integration\n```go\nfunc (d *Deacon) checkGates(ctx context.Context) {\n gates, _ := d.store.ListOpenGates(ctx)\n \n for _, gate := range gates {\n // Check timeout\n if time.Since(gate.CreatedAt) \u003e gate.Timeout {\n d.notifyWaiters(gate, \"timeout\")\n d.closeGate(gate, \"timed out\")\n continue\n }\n \n // Check condition\n if d.checkCondition(gate.AwaitType, gate.AwaitID) {\n d.notifyWaiters(gate, \"cleared\")\n d.closeGate(gate, \"condition met\")\n }\n }\n}\n```\n\n## Moved from beads\nOriginally bd-is6m. Deacon is in gastown, not beads.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T12:19:06.768752-08:00","updated_at":"2025-12-23T12:19:06.768752-08:00"} {"id":"gt-dich","title":"gt handoff deadlock at handoff.go:125","description":"When running 'gt handoff -m \"message\"' after successful MR submit, go panics with 'fatal error: all goroutines are asleep - deadlock\\!' at handoff.go:125. The shutdown request still appears to be sent successfully but the command crashes. Stack trace shows issue is in runHandoff select statement.","status":"open","priority":2,"issue_type":"bug","created_at":"2025-12-21T17:51:18.441808-08:00","updated_at":"2025-12-21T17:51:18.441808-08:00"} {"id":"gt-djzh","title":"Merge: gt-ldk8","description":"branch: polecat/nux\ntarget: main\nsource_issue: gt-ldk8\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-23T01:15:25.915147-08:00","updated_at":"2025-12-23T01:16:15.726698-08:00","closed_at":"2025-12-23T01:16:15.726698-08:00","close_reason":"Merged to main"} @@ -658,7 +658,7 @@ {"id":"gt-dt5","title":"Define Engineer as the Refinery agent role","description":"Clarify the distinction:\n\n- **Refinery** = place/module/directory/workspace\n - `\u003crig\u003e/refinery/` directory structure\n - `gt refinery start/stop/status` commands\n - tmux session name: `refinery` or `\u003crig\u003e-refinery`\n\n- **Engineer** = role/agent who works in the Refinery\n - CLAUDE.md prompting: \"You are an Engineer...\"\n - Documentation: \"The Engineer processes merge requests...\"\n - Mail address: `\u003crig\u003e/engineer` (or `\u003crig\u003e/refinery`?)\n\nUpdates needed:\n- Add Engineer role description to docs\n- Update CLAUDE.md templates for refinery agents\n- Keep `gt refinery` commands as-is (they manage the place)\n- Internal code stays `internal/refinery/` (the module)\n\nFuture consideration: Multiple Engineers in one Refinery for parallel merge processing.","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-16T23:02:18.591842-08:00","updated_at":"2025-12-16T23:07:21.93783-08:00","dependencies":[{"issue_id":"gt-dt5","depends_on_id":"gt-h5n","type":"blocks","created_at":"2025-12-16T23:02:55.577196-08:00","created_by":"daemon"}]} {"id":"gt-dw6v","title":"Review: Deacon town-level wisp storage (gt-ci84)","description":"Polecat slit implemented town-level wisp storage for deacon patrol. Review the changes to ensure deacon wisps are correctly stored in ~/gt/.beads-wisp/ instead of gastown rig beads.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T19:57:36.967604-08:00","updated_at":"2025-12-23T19:57:36.967604-08:00"} {"id":"gt-dx5c","title":"Update swarm terminology to streams","description":"Gas Town moved from batch swarms to continuous streaming of polecats. Update:\n- Docs and designs\n- Code comments\n- CLI flags (remove --swarm if present, or reframe)\n- Variable/function names where appropriate\n\nStreams reflect the reality: polecats flow continuously, not in discrete batches.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-22T21:42:19.559957-08:00","updated_at":"2025-12-22T21:42:19.559957-08:00"} -{"id":"gt-dxsvj","title":"Digest: mol-deacon-patrol","description":"Patrol 17: Green","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:35:45.54298-08:00","updated_at":"2025-12-25T19:35:45.54298-08:00","closed_at":"2025-12-25T19:35:45.542933-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-dxsvj","depends_on_id":"gt-wisp-1x1","type":"parent-child","created_at":"2025-12-25T19:35:45.543787-08:00","created_by":"deacon"}]} +{"id":"gt-dxsvj","title":"Digest: mol-deacon-patrol","description":"Patrol 17: Green","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:35:45.54298-08:00","updated_at":"2025-12-25T19:35:45.54298-08:00","closed_at":"2025-12-25T19:35:45.542933-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-dyz3","title":"Test Patrol for Bonding","description":"Parent issue for mol bond CLI test","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T21:55:26.734746-08:00","updated_at":"2025-12-25T01:33:00.204059-08:00","closed_at":"2025-12-25T01:33:00.204059-08:00","close_reason":"Test pollution cleanup"} {"id":"gt-dyz3.1","title":"Polecat Arm (arm-toast)","description":"Single polecat inspection and action cycle.\n\nThis molecule is bonded dynamically by mol-witness-patrol's survey-workers step.\nEach polecat being monitored gets one arm that runs in parallel with other arms.\n\n## Variables\n\n| Variable | Required | Description |\n|----------|----------|-------------|\n| polecat_name | Yes | Name of the polecat to inspect |\n| rig | Yes | Rig containing the polecat |\n\n## Step: capture\nCapture recent tmux output for toast.\n\n```bash\ntmux capture-pane -t gt-gastown-toast -p | tail -50\n```\n\nRecord:\n- Last activity timestamp (when was last tool call?)\n- Visible errors or stack traces\n- Completion indicators (\"Done\", \"Finished\", etc.)\n\n## Step: assess\nCategorize polecat state based on captured output.\n\nStates:\n- **working**: Recent tool calls, active processing\n- **idle**: At prompt, no recent activity\n- **error**: Showing errors or stack traces\n- **requesting_shutdown**: Sent LIFECYCLE/Shutdown mail\n- **done**: Showing completion indicators\n\nCalculate: minutes since last activity.\nNeeds: capture\n\n## Step: load-history\nRead nudge history for toast from patrol state.\n\n```\nnudge_count = state.nudges[toast].count\nlast_nudge_time = state.nudges[toast].timestamp\n```\n\nThis data was loaded by the parent patrol's load-state step and passed\nto the arm via the bonding context.\nNeeds: assess\n\n## Step: decide\nApply the nudge matrix to determine action for toast.\n\n| State | Idle Time | Nudge Count | Action |\n|-------|-----------|-------------|--------|\n| working | any | any | none |\n| idle | \u003c10min | any | none |\n| idle | 10-15min | 0 | nudge-1 (gentle) |\n| idle | 15-20min | 1 | nudge-2 (direct) |\n| idle | 20+min | 2 | nudge-3 (final) |\n| idle | any | 3 | escalate |\n| error | any | any | assess-severity |\n| requesting_shutdown | any | any | pre-kill-verify |\n| done | any | any | pre-kill-verify |\n\nNudge text:\n1. \"How's progress? Need any help?\"\n2. \"Please wrap up soon. What's blocking you?\"\n3. \"Final check. Will escalate in 5 min if no response.\"\n\nRecord decision and rationale.\nNeeds: load-history\n\n## Step: execute\nTake the decided action for toast.\n\n**nudge-N**:\n```bash\ntmux send-keys -t gt-gastown-toast \"{{nudge_text}}\" Enter\n```\n\n**pre-kill-verify**:\n```bash\ncd polecats/toast\ngit status # Must be clean\ngit log origin/main..HEAD # Check for unpushed\nbd show \u003cassigned-issue\u003e # Verify closed/deferred\n```\nIf clean: kill session, remove worktree, delete branch\nIf dirty: record failure, retry next cycle\n\n**escalate**:\n```bash\ngt mail send mayor/ -s \"Escalation: toast stuck\" -m \"...\"\n```\n\n**none**: No action needed.\n\nRecord: action taken, result, updated nudge count.\nNeeds: decide\n\n## Output\n\nThe arm completes with:\n- action_taken: none | nudge-1 | nudge-2 | nudge-3 | killed | escalated\n- result: success | failed | pending\n- updated_state: New nudge count and timestamp for toast\n\nThis data feeds back to the parent patrol's aggregate step.\n---\nbonded_from: mol-polecat-arm\nbonded_to: gt-dyz3\nbonded_ref: arm-toast\nbonded_at: 2025-12-23T10:00:00Z\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T21:55:26.823047-08:00","updated_at":"2025-12-24T21:55:26.997293-08:00","closed_at":"2025-12-24T21:55:26.997293-08:00","close_reason":"Closed","dependencies":[{"issue_id":"gt-dyz3.1","depends_on_id":"gt-dyz3","type":"parent-child","created_at":"2025-12-24T21:55:26.823942-08:00","created_by":"daemon"}]} {"id":"gt-e1n86","title":"Template and Formula Distribution: Embed in binary, detect staleness","description":"## Problem\n\nTwo types of Gas Town infrastructure live in `.beads/` but have unclear distribution:\n\n1. **Role templates** (`*.md.tmpl`) - embedded in binary, rendered to CLAUDE.md on setup\n2. **Patrol formulas** (`*.formula.json`) - currently just exist, no clear seeding path\n\nWhen `gt` is rebuilt with updated templates/formulas, existing installations don't auto-update.\n\n## Current State\n\n- Templates: embedded via `//go:embed`, written on `gt install`/`gt rig init`\n- Formulas: exist in `.beads/formulas/` but no seeding mechanism\n- `bd init` creates empty structure (correct - bd shouldn't know Gas Town)\n- No staleness detection for either\n\n## Proposed Solution\n\n### 1. Embed formulas in `gt` binary\n\n```go\n//go:embed formulas/*.formula.json\nvar formulaFS embed.FS\n```\n\n### 2. Seed formulas during setup\n\n`gt install` and `gt rig init` write embedded formulas to `.beads/formulas/`.\n\n### 3. Hash-based staleness detection\n\n`gt doctor` checks:\n- CLAUDE.md hash vs embedded template hash\n- Formula files hash vs embedded formula hash\n\nIf stale → warn. `gt doctor --fix` refreshes.\n\n### 4. Keep bd/gt boundary clean\n\n- `bd` stays generic: `bd cook \u003cpath\u003e` takes any formula path\n- `gt` knows where formulas live, handles distribution\n- Patrol formulas are Gas Town infrastructure, not beads concern\n\n## Tasks\n\n1. Move formulas to embedded FS in gt binary\n2. Add formula seeding to `gt install` / `gt rig init`\n3. Add hash storage for templates and formulas\n4. Add staleness detection to `gt doctor`\n5. Add `--fix` flag to refresh stale files","status":"open","priority":2,"issue_type":"epic","created_at":"2025-12-25T20:04:28.044085-08:00","updated_at":"2025-12-25T20:04:28.044085-08:00"} @@ -861,12 +861,12 @@ {"id":"gt-ib6y","title":"Digest: mol-deacon-patrol @ 2025-12-24 19:48","description":"Patrol 19: All healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T19:48:16.252232-08:00","updated_at":"2025-12-24T19:48:16.252232-08:00","closed_at":"2025-12-24T19:48:16.252177-08:00","close_reason":"Squashed from wisp gt-h7w (9 issues)"} {"id":"gt-ic0j","title":"🤝 HANDOFF: Timing fixes applied","description":"Fixed mayor attach timing bug. Completed: timing fix, gt-tulx, Emma beads-6v2. Remaining P1: gt-17zr, gt-kcee, gt-szsq. Run gt prime on startup.","status":"closed","priority":2,"issue_type":"message","created_at":"2025-12-18T22:19:57.731032-08:00","updated_at":"2025-12-18T23:28:33.950423-08:00","closed_at":"2025-12-18T23:28:33.950423-08:00"} {"id":"gt-id36","title":"Deacon Kernel: event processing molecule architecture","description":"\nExtend the Deacon from \"health orchestrator\" to \"event processing kernel\" that runs a \nmolecule (rounds) each wake cycle, like an OS kernel scheduler.\n\n## Core Insight\n\nThe Deacon already has:\n- Wake cycle (daemon poke, timer, lifecycle request)\n- Mail as event queue\n- Health scanning\n- Lifecycle processing\n\nBut it is REACTIVE. This epic makes it PROACTIVE with a structured molecule:\n\n```\nDeacon Wake\n├── Step 0: Session Check (should I cycle myself?)\n├── Step 1: Health Scan (Mayor, Witnesses, Crew, Refineries)\n├── Step 2: Lifecycle Processing (cycle/restart/shutdown requests)\n├── Step 3: Plugin Execution (scheduled, event-triggered, human-requested)\n├── Step 4: Event Callbacks (timers, subscriptions)\n└── Step 5: Heartbeat + Wait\n```\n\n## Key Design Decisions\n\n1. **Session cycling first** - Token costs are quadratic with session length.\n Deacon should aggressively cycle to fresh sessions. First step of every\n wake is \"do I need a new session?\" based on context budget.\n\n2. **Pinned bead with marching orders** - A pinned bead (like gt prime for\n agents) defines the Deacon's rounds molecule. This is the Deacon's\n \"kernel\" - its operating loop.\n\n3. **Keepalive file for daemon quieting** - Instead of daemon tmux-poking\n the Deacon (which interrupts work), Deacon writes a keepalive file.\n Daemon reads it and backs off. Worst case: Deacon forgets, gets one\n extra heartbeat it squelches.\n\n4. **Molecule-based rounds** - The wake cycle becomes a molecule with steps.\n Each step can have plugins (inline attention). Steps can be added/modified\n by updating the pinned bead.\n\n## Architecture\n\n```\nGo Daemon (minimal, dumb)\n├── Reads {townRoot}/deacon/keepalive.json\n├── If fresh: do nothing\n├── If stale: poke Deacon (fallback)\n└── Process lifecycle requests (still daemon's job)\n\nDeacon (Claude agent, smart)\n├── Wakes: poke, timer, mail event\n├── Writes keepalive (quiets daemon for duration of rounds)\n├── Runs rounds molecule:\n│ ├── session-check: cycle if context budget low\n│ ├── health-scan: check agents, remediate\n│ ├── lifecycle: process requests\n│ ├── plugins: run scheduled/triggered plugins\n│ ├── events: process timer/event callbacks\n│ └── complete: update heartbeat, wait\n└── Reads marching orders from pinned bead\n```\n\n## Relation to Existing Work\n\n- Extends gt-5af (Deacon infrastructure) - CLOSED\n- Relates to gt-axz (Plugin architecture) - P3\n- Fits into phase3-deacon of gt-ngpz (Christmas Plan)\n- Enables gt-976 (Crew lifecycle) as part of health-scan step\n","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-20T21:46:08.076178-08:00","updated_at":"2025-12-25T20:45:33.620523-08:00","closed_at":"2025-12-25T20:45:33.620523-08:00","close_reason":"Deacon kernel operational: running mol-deacon-patrol, processing callbacks, health scanning. Keepalive and plugin scheduler are polish items.","dependencies":[{"issue_id":"gt-id36","depends_on_id":"gt-976","type":"blocks","created_at":"2025-12-20T21:48:05.215593-08:00","created_by":"daemon"}]} -{"id":"gt-id36.1","title":"Deacon session cycling: first step of rounds","description":"\nFirst step of every Deacon wake cycle: check if a fresh session is needed.\n\n## Why First\n\nToken costs are quadratic with session length. A Deacon running for hours\naccumulates massive context. Better to cycle early and often.\n\n## Implementation\n\nAt wake, before doing anything else:\n\n1. Check context budget estimate (conversation turns, tool calls, etc.)\n2. If budget is low (e.g., \u003e50% consumed), request cycle:\n - Write handoff mail to self with current state\n - Request lifecycle: cycle via daemon\n - Daemon kills session, starts fresh\n - New session reads handoff mail, continues\n\n## Decision Criteria\n\n- Conversation turns \u003e N (configurable, default 50?)\n- Explicit \"context feels heavy\" signal from Claude\n- Time since last cycle \u003e M hours (configurable, default 4?)\n- Forced cycle on certain events (e.g., major config change)\n\n## State to Preserve in Handoff\n\n- Current health status\n- Pending lifecycle requests (in flight)\n- Plugin state (last run times, outcomes)\n- Any active timers\n\n## Relation to Daemon\n\nThe Deacon requests its own cycle via the same lifecycle mechanism:\n```\ngt mail send deacon/ -s \"LIFECYCLE: deacon/ requesting cycle\" -m \"...\"\n```\n\nDaemon sees this, kills gt-deacon session, respawn loop restarts it.\n","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-20T21:46:44.700695-08:00","updated_at":"2025-12-20T21:46:44.700695-08:00","dependencies":[{"issue_id":"gt-id36.1","depends_on_id":"gt-id36","type":"parent-child","created_at":"2025-12-20T21:46:44.703642-08:00","created_by":"daemon"}]} -{"id":"gt-id36.2","title":"Deacon marching orders: pinned bead with rounds molecule","description":"\nCreate a pinned bead that defines the Deacon's rounds molecule - its \"kernel\".\n\n## Concept\n\nLike `gt prime` gives agents their context, a pinned bead gives the Deacon\nits operating instructions. This bead defines:\n\n1. The rounds molecule (steps to execute each wake)\n2. Registered plugins (scheduled, event-triggered)\n3. Configuration (timeouts, thresholds, escalation rules)\n\n## Pinned Bead Structure\n\n```yaml\n# gt-deacon-kernel (pinned)\ntitle: \"Deacon Kernel Configuration\"\ntype: policy\npinned: true\n\nmolecule: mol-deacon-rounds\n steps:\n - session-check: \"Check context budget, cycle if needed\"\n - health-scan: \"Check Mayor, Witnesses, Refineries, Crew\"\n - lifecycle: \"Process pending lifecycle requests\"\n - plugins: \"Run due scheduled plugins\"\n - events: \"Process timer callbacks, event subscriptions\"\n - complete: \"Update heartbeat, return to wait\"\n\nplugins:\n scheduled:\n - name: beads-hygiene\n schedule: \"0 2 * * *\" # 2 AM daily\n - name: branch-cleanup\n schedule: \"0 4 * * 0\" # 4 AM Sundays\n \n event_triggers:\n - event: \"issue.created\"\n plugin: work-oracle\n - event: \"mr.submitted\"\n plugin: review-oracle\n\nconfig:\n session_cycle_threshold_turns: 50\n session_cycle_threshold_hours: 4\n health_scan_timeout_seconds: 60\n plugin_timeout_minutes: 30\n escalation_after_failures: 3\n```\n\n## Reading Marching Orders\n\nOn wake, Deacon:\n1. `bd show --pinned` to find the kernel bead\n2. Parse molecule steps\n3. Execute in order\n\n## Updating the Kernel\n\nTo change Deacon behavior:\n1. `bd update gt-deacon-kernel` with new config\n2. Next wake cycle picks up changes\n3. No code changes required\n\n## Bootstrap\n\nIf no pinned bead exists, Deacon uses hardcoded defaults from DEACON.md.\nFirst installation creates the pinned bead.\n","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-20T21:46:45.892112-08:00","updated_at":"2025-12-20T21:46:45.892112-08:00","dependencies":[{"issue_id":"gt-id36.2","depends_on_id":"gt-id36","type":"parent-child","created_at":"2025-12-20T21:46:45.893803-08:00","created_by":"daemon"}]} -{"id":"gt-id36.3","title":"Deacon keepalive: quiet daemon during rounds","description":"\nReplace tmux-poke interrupts with a keepalive file the daemon respects.\n\n## Problem\n\nCurrent daemon pokes Deacon via tmux SendKeys every ~5 minutes if heartbeat\nis stale. This can INTERRUPT the Deacon mid-work, especially during long\nplugin execution or health remediation.\n\n## Solution\n\nDeacon writes a keepalive file at start of rounds:\n```json\n{\n \"timestamp\": \"2025-12-20T15:30:00Z\",\n \"expected_duration_minutes\": 10,\n \"action\": \"executing mol-deacon-rounds\"\n}\n```\n\nDaemon reads this and backs off:\n- If keepalive is fresh AND within expected_duration: skip poke\n- If keepalive is stale OR past expected_duration: poke (fallback)\n\n## Files\n\n- `{townRoot}/deacon/keepalive.json` - Written by Deacon\n- Daemon already reads `{townRoot}/deacon/heartbeat.json` - similar pattern\n\n## Deacon Behavior\n\n1. Start of rounds: write keepalive with expected duration\n2. End of rounds: write heartbeat (existing), clear/update keepalive\n3. If rounds take longer than expected: Deacon gets one poke, squelches it\n\n## Daemon Changes\n\nModify `pokeDeacon()` in daemon.go:\n1. Check keepalive.json freshness and expected_duration\n2. If within bounds: skip poke, log \"Deacon active\"\n3. If past bounds: poke as fallback\n\n## Worst Case\n\nDeacon crashes mid-rounds without clearing keepalive:\n- Daemon waits until expected_duration expires\n- Then pokes, triggering respawn loop\n- Max delay: expected_duration (configurable, default 10-15 min)\n\n## Configuration\n\nIn pinned kernel bead:\n```yaml\nconfig:\n rounds_expected_duration_minutes: 10\n```\n","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-20T21:46:47.212234-08:00","updated_at":"2025-12-20T21:46:47.212234-08:00","dependencies":[{"issue_id":"gt-id36.3","depends_on_id":"gt-id36","type":"parent-child","created_at":"2025-12-20T21:46:47.213911-08:00","created_by":"daemon"}]} -{"id":"gt-id36.4","title":"Deacon rounds molecule: the kernel execution loop","description":"\nDefine and implement mol-deacon-rounds - the molecule the Deacon executes each wake.\n\n## Molecule Definition\n\n```markdown\n# mol-deacon-rounds\n\nThe Deacon kernel - executed on every wake cycle.\n\n## Step: session-check\nCheck context budget. If low, cycle to fresh session.\nNeeds: (none - always runs first)\n\n## Step: health-scan\nCheck health of all monitored agents:\n- Mayor (gt-mayor session)\n- Witnesses (gt-*-witness sessions)\n- Refineries (gt-*-refinery sessions)\n- Crew (gt-*-* sessions, lifecycle only)\n\nRemediate unhealthy agents:\n- Restart dead sessions\n- Nudge stuck agents\n- Escalate if remediation fails\n\nNeeds: session-check\n\n## Step: lifecycle\nProcess pending lifecycle requests from mail:\n- LIFECYCLE: \u003cidentity\u003e requesting cycle\n- LIFECYCLE: \u003cidentity\u003e requesting restart\n- LIFECYCLE: \u003cidentity\u003e requesting shutdown\n\nNeeds: health-scan\n\n## Step: plugins\nRun due plugins:\n1. Check scheduled plugins (cron-like)\n2. Check event-triggered plugins (from mail events)\n3. Check human-requested plugins (from mail)\n4. Execute each, record outcomes\n\nNeeds: lifecycle\n\n## Step: events\nProcess timer and event callbacks:\n- TIMER: \u003cidentity\u003e wake at \u003ctime\u003e\n- EVENT: \u003ctype\u003e \u003cpayload\u003e\n\nNotify relevant agents or trigger actions.\n\nNeeds: plugins\n\n## Step: complete\nFinalize the cycle:\n1. Update heartbeat.json\n2. Clear/update keepalive.json\n3. Log summary\n4. Return to prompt (wait for next wake)\n\nNeeds: events\n```\n\n## Execution\n\nThe Deacon reads this molecule from its pinned bead and executes steps in order.\nEach step:\n1. Announces \"Starting \u003cstep\u003e\"\n2. Performs the step logic\n3. Records outcome\n4. Proceeds to next step\n\n## Step Plugins\n\nEach step can have inline plugins (additional attention):\n```yaml\nstep: health-scan\n plugins:\n - advanced-diagnostics # Run if basic scan finds issues\n```\n\n## Relation to bd mol\n\nUses the same molecule format as bd mol for polecats.\nDeacon molecule is special: it's the kernel, not work.\n","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-20T21:47:30.218457-08:00","updated_at":"2025-12-20T21:47:30.218457-08:00","dependencies":[{"issue_id":"gt-id36.4","depends_on_id":"gt-id36","type":"parent-child","created_at":"2025-12-20T21:47:30.220204-08:00","created_by":"daemon"}]} -{"id":"gt-id36.5","title":"Deacon plugin scheduler: cron-like execution","description":"\nImplement scheduled plugin execution in the Deacon's plugins step.\n\n## Concept\n\nPlugins are just directories with config. Deacon checks which are due\nand executes them during the plugins step of rounds.\n\n## Plugin Registration\n\nPlugins are registered in:\n1. Pinned kernel bead (preferred)\n2. `{townRoot}/plugins/` directory scan (fallback)\n\nEach plugin has:\n```json\n{\n \"name\": \"beads-hygiene\",\n \"schedule\": \"0 2 * * *\",\n \"last_run\": \"2025-12-20T02:00:00Z\",\n \"enabled\": true,\n \"attention_budget\": \"low\",\n \"max_duration_minutes\": 30\n}\n```\n\n## Schedule Format\n\nStandard cron format: `minute hour day month weekday`\n- `0 2 * * *` - 2 AM daily\n- `0 4 * * 0` - 4 AM Sundays\n- `*/15 * * * *` - Every 15 minutes\n\n## Execution\n\nDuring plugins step:\n1. Load plugin schedules from kernel bead + directory\n2. For each plugin:\n a. Parse schedule, check if due (last_run + schedule)\n b. If due, execute:\n - Read `plugins/{name}/CLAUDE.md` for context\n - Run plugin logic (inline or spawn subagent)\n - Record outcome and update last_run\n3. Continue to next step\n\n## Plugin Execution Modes\n\n- **inline**: Deacon runs the plugin logic directly (simple, fast)\n- **subagent**: Spawn a polecat-like agent for the plugin (complex, parallel)\n- **mail**: Send mail to another agent to do the work (delegation)\n\n## State Tracking\n\n`{townRoot}/deacon/plugin-state.json`:\n```json\n{\n \"plugins\": {\n \"beads-hygiene\": {\n \"last_run\": \"2025-12-20T02:00:00Z\",\n \"last_outcome\": \"success\",\n \"run_count\": 42,\n \"failure_count\": 2\n }\n }\n}\n```\n\n## Relation to gt-axz\n\nThis implements the execution side of the plugin architecture (gt-axz).\ngt-axz defines the format; this task implements the scheduler.\n","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-20T21:47:31.798518-08:00","updated_at":"2025-12-20T21:47:31.798518-08:00","dependencies":[{"issue_id":"gt-id36.5","depends_on_id":"gt-id36","type":"parent-child","created_at":"2025-12-20T21:47:31.800001-08:00","created_by":"daemon"}]} -{"id":"gt-id36.6","title":"Deacon event/timer callbacks: reactive triggers","description":"\nImplement event-triggered and timer-based callbacks in the Deacon.\n\n## Timer Callbacks\n\nAgents can schedule future wakes by mailing the Deacon:\n```\nSubject: TIMER: gastown/witness wake at 2025-12-20T16:00:00Z\nBody: Please nudge me - I'm waiting for external dependency\n```\n\nDeacon processing:\n1. Parse timer mail\n2. Check if time has passed\n3. If yes: mail the agent \"WAKE: Timer fired\"\n4. Close the timer mail\n\n## Event Subscriptions\n\nPlugins/agents can subscribe to events:\n```yaml\n# In kernel bead or plugin config\nevent_triggers:\n - event: \"issue.created\"\n action: mail\n target: \"plugins/work-oracle\"\n \n - event: \"mr.submitted\"\n action: run\n plugin: \"review-oracle\"\n \n - event: \"agent.stuck\"\n action: escalate\n target: human\n```\n\n## Event Sources\n\nEvents come through mail to deacon/:\n```\nSubject: EVENT: issue.created gt-abc123\nBody: New issue created in gastown rig\n```\n\n## Event Types\n\nInitial event types:\n- `issue.created` - New bead created\n- `issue.closed` - Bead closed\n- `mr.submitted` - Merge request submitted\n- `mr.merged` - Merge request merged\n- `agent.stuck` - Agent appears stuck (from health scan)\n- `agent.failed` - Agent remediation failed\n\n## Event Processing\n\nDuring events step:\n1. Read event mail from inbox\n2. Match against subscriptions\n3. Execute actions:\n - `mail`: Send mail to target\n - `run`: Execute plugin inline\n - `spawn`: Spawn subagent for plugin\n - `escalate`: Mail human\n\n## Relation to Mail\n\nMail IS the event bus. No separate event system.\nEvents are just specially-formatted mail to deacon/.\n","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-20T21:47:32.99498-08:00","updated_at":"2025-12-20T21:47:32.99498-08:00","dependencies":[{"issue_id":"gt-id36.6","depends_on_id":"gt-id36","type":"parent-child","created_at":"2025-12-20T21:47:32.996649-08:00","created_by":"daemon"}]} +{"id":"gt-id36.1","title":"Deacon session cycling: first step of rounds","description":"\nFirst step of every Deacon wake cycle: check if a fresh session is needed.\n\n## Why First\n\nToken costs are quadratic with session length. A Deacon running for hours\naccumulates massive context. Better to cycle early and often.\n\n## Implementation\n\nAt wake, before doing anything else:\n\n1. Check context budget estimate (conversation turns, tool calls, etc.)\n2. If budget is low (e.g., \u003e50% consumed), request cycle:\n - Write handoff mail to self with current state\n - Request lifecycle: cycle via daemon\n - Daemon kills session, starts fresh\n - New session reads handoff mail, continues\n\n## Decision Criteria\n\n- Conversation turns \u003e N (configurable, default 50?)\n- Explicit \"context feels heavy\" signal from Claude\n- Time since last cycle \u003e M hours (configurable, default 4?)\n- Forced cycle on certain events (e.g., major config change)\n\n## State to Preserve in Handoff\n\n- Current health status\n- Pending lifecycle requests (in flight)\n- Plugin state (last run times, outcomes)\n- Any active timers\n\n## Relation to Daemon\n\nThe Deacon requests its own cycle via the same lifecycle mechanism:\n```\ngt mail send deacon/ -s \"LIFECYCLE: deacon/ requesting cycle\" -m \"...\"\n```\n\nDaemon sees this, kills gt-deacon session, respawn loop restarts it.\n","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T21:46:44.700695-08:00","updated_at":"2025-12-25T20:48:18.242356-08:00","closed_at":"2025-12-25T20:48:18.242356-08:00","close_reason":"Deacon rounds molecule operational - running mol-deacon-patrol with step execution","dependencies":[{"issue_id":"gt-id36.1","depends_on_id":"gt-id36","type":"parent-child","created_at":"2025-12-20T21:46:44.703642-08:00","created_by":"daemon"}]} +{"id":"gt-id36.2","title":"Deacon marching orders: pinned bead with rounds molecule","description":"\nCreate a pinned bead that defines the Deacon's rounds molecule - its \"kernel\".\n\n## Concept\n\nLike `gt prime` gives agents their context, a pinned bead gives the Deacon\nits operating instructions. This bead defines:\n\n1. The rounds molecule (steps to execute each wake)\n2. Registered plugins (scheduled, event-triggered)\n3. Configuration (timeouts, thresholds, escalation rules)\n\n## Pinned Bead Structure\n\n```yaml\n# gt-deacon-kernel (pinned)\ntitle: \"Deacon Kernel Configuration\"\ntype: policy\npinned: true\n\nmolecule: mol-deacon-rounds\n steps:\n - session-check: \"Check context budget, cycle if needed\"\n - health-scan: \"Check Mayor, Witnesses, Refineries, Crew\"\n - lifecycle: \"Process pending lifecycle requests\"\n - plugins: \"Run due scheduled plugins\"\n - events: \"Process timer callbacks, event subscriptions\"\n - complete: \"Update heartbeat, return to wait\"\n\nplugins:\n scheduled:\n - name: beads-hygiene\n schedule: \"0 2 * * *\" # 2 AM daily\n - name: branch-cleanup\n schedule: \"0 4 * * 0\" # 4 AM Sundays\n \n event_triggers:\n - event: \"issue.created\"\n plugin: work-oracle\n - event: \"mr.submitted\"\n plugin: review-oracle\n\nconfig:\n session_cycle_threshold_turns: 50\n session_cycle_threshold_hours: 4\n health_scan_timeout_seconds: 60\n plugin_timeout_minutes: 30\n escalation_after_failures: 3\n```\n\n## Reading Marching Orders\n\nOn wake, Deacon:\n1. `bd show --pinned` to find the kernel bead\n2. Parse molecule steps\n3. Execute in order\n\n## Updating the Kernel\n\nTo change Deacon behavior:\n1. `bd update gt-deacon-kernel` with new config\n2. Next wake cycle picks up changes\n3. No code changes required\n\n## Bootstrap\n\nIf no pinned bead exists, Deacon uses hardcoded defaults from DEACON.md.\nFirst installation creates the pinned bead.\n","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T21:46:45.892112-08:00","updated_at":"2025-12-25T20:48:18.257522-08:00","closed_at":"2025-12-25T20:48:18.257522-08:00","close_reason":"Deacon rounds molecule operational - running mol-deacon-patrol with step execution","dependencies":[{"issue_id":"gt-id36.2","depends_on_id":"gt-id36","type":"parent-child","created_at":"2025-12-20T21:46:45.893803-08:00","created_by":"daemon"}]} +{"id":"gt-id36.3","title":"Deacon keepalive: quiet daemon during rounds","description":"\nReplace tmux-poke interrupts with a keepalive file the daemon respects.\n\n## Problem\n\nCurrent daemon pokes Deacon via tmux SendKeys every ~5 minutes if heartbeat\nis stale. This can INTERRUPT the Deacon mid-work, especially during long\nplugin execution or health remediation.\n\n## Solution\n\nDeacon writes a keepalive file at start of rounds:\n```json\n{\n \"timestamp\": \"2025-12-20T15:30:00Z\",\n \"expected_duration_minutes\": 10,\n \"action\": \"executing mol-deacon-rounds\"\n}\n```\n\nDaemon reads this and backs off:\n- If keepalive is fresh AND within expected_duration: skip poke\n- If keepalive is stale OR past expected_duration: poke (fallback)\n\n## Files\n\n- `{townRoot}/deacon/keepalive.json` - Written by Deacon\n- Daemon already reads `{townRoot}/deacon/heartbeat.json` - similar pattern\n\n## Deacon Behavior\n\n1. Start of rounds: write keepalive with expected duration\n2. End of rounds: write heartbeat (existing), clear/update keepalive\n3. If rounds take longer than expected: Deacon gets one poke, squelches it\n\n## Daemon Changes\n\nModify `pokeDeacon()` in daemon.go:\n1. Check keepalive.json freshness and expected_duration\n2. If within bounds: skip poke, log \"Deacon active\"\n3. If past bounds: poke as fallback\n\n## Worst Case\n\nDeacon crashes mid-rounds without clearing keepalive:\n- Daemon waits until expected_duration expires\n- Then pokes, triggering respawn loop\n- Max delay: expected_duration (configurable, default 10-15 min)\n\n## Configuration\n\nIn pinned kernel bead:\n```yaml\nconfig:\n rounds_expected_duration_minutes: 10\n```\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-20T21:46:47.212234-08:00","updated_at":"2025-12-25T20:48:20.524388-08:00","closed_at":"2025-12-25T20:48:20.524388-08:00","close_reason":"Polish items - Deacon operational without these; tracked as enhancements if needed","dependencies":[{"issue_id":"gt-id36.3","depends_on_id":"gt-id36","type":"parent-child","created_at":"2025-12-20T21:46:47.213911-08:00","created_by":"daemon"}]} +{"id":"gt-id36.4","title":"Deacon rounds molecule: the kernel execution loop","description":"\nDefine and implement mol-deacon-rounds - the molecule the Deacon executes each wake.\n\n## Molecule Definition\n\n```markdown\n# mol-deacon-rounds\n\nThe Deacon kernel - executed on every wake cycle.\n\n## Step: session-check\nCheck context budget. If low, cycle to fresh session.\nNeeds: (none - always runs first)\n\n## Step: health-scan\nCheck health of all monitored agents:\n- Mayor (gt-mayor session)\n- Witnesses (gt-*-witness sessions)\n- Refineries (gt-*-refinery sessions)\n- Crew (gt-*-* sessions, lifecycle only)\n\nRemediate unhealthy agents:\n- Restart dead sessions\n- Nudge stuck agents\n- Escalate if remediation fails\n\nNeeds: session-check\n\n## Step: lifecycle\nProcess pending lifecycle requests from mail:\n- LIFECYCLE: \u003cidentity\u003e requesting cycle\n- LIFECYCLE: \u003cidentity\u003e requesting restart\n- LIFECYCLE: \u003cidentity\u003e requesting shutdown\n\nNeeds: health-scan\n\n## Step: plugins\nRun due plugins:\n1. Check scheduled plugins (cron-like)\n2. Check event-triggered plugins (from mail events)\n3. Check human-requested plugins (from mail)\n4. Execute each, record outcomes\n\nNeeds: lifecycle\n\n## Step: events\nProcess timer and event callbacks:\n- TIMER: \u003cidentity\u003e wake at \u003ctime\u003e\n- EVENT: \u003ctype\u003e \u003cpayload\u003e\n\nNotify relevant agents or trigger actions.\n\nNeeds: plugins\n\n## Step: complete\nFinalize the cycle:\n1. Update heartbeat.json\n2. Clear/update keepalive.json\n3. Log summary\n4. Return to prompt (wait for next wake)\n\nNeeds: events\n```\n\n## Execution\n\nThe Deacon reads this molecule from its pinned bead and executes steps in order.\nEach step:\n1. Announces \"Starting \u003cstep\u003e\"\n2. Performs the step logic\n3. Records outcome\n4. Proceeds to next step\n\n## Step Plugins\n\nEach step can have inline plugins (additional attention):\n```yaml\nstep: health-scan\n plugins:\n - advanced-diagnostics # Run if basic scan finds issues\n```\n\n## Relation to bd mol\n\nUses the same molecule format as bd mol for polecats.\nDeacon molecule is special: it's the kernel, not work.\n","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T21:47:30.218457-08:00","updated_at":"2025-12-25T20:48:18.272055-08:00","closed_at":"2025-12-25T20:48:18.272055-08:00","close_reason":"Deacon rounds molecule operational - running mol-deacon-patrol with step execution","dependencies":[{"issue_id":"gt-id36.4","depends_on_id":"gt-id36","type":"parent-child","created_at":"2025-12-20T21:47:30.220204-08:00","created_by":"daemon"}]} +{"id":"gt-id36.5","title":"Deacon plugin scheduler: cron-like execution","description":"\nImplement scheduled plugin execution in the Deacon's plugins step.\n\n## Concept\n\nPlugins are just directories with config. Deacon checks which are due\nand executes them during the plugins step of rounds.\n\n## Plugin Registration\n\nPlugins are registered in:\n1. Pinned kernel bead (preferred)\n2. `{townRoot}/plugins/` directory scan (fallback)\n\nEach plugin has:\n```json\n{\n \"name\": \"beads-hygiene\",\n \"schedule\": \"0 2 * * *\",\n \"last_run\": \"2025-12-20T02:00:00Z\",\n \"enabled\": true,\n \"attention_budget\": \"low\",\n \"max_duration_minutes\": 30\n}\n```\n\n## Schedule Format\n\nStandard cron format: `minute hour day month weekday`\n- `0 2 * * *` - 2 AM daily\n- `0 4 * * 0` - 4 AM Sundays\n- `*/15 * * * *` - Every 15 minutes\n\n## Execution\n\nDuring plugins step:\n1. Load plugin schedules from kernel bead + directory\n2. For each plugin:\n a. Parse schedule, check if due (last_run + schedule)\n b. If due, execute:\n - Read `plugins/{name}/CLAUDE.md` for context\n - Run plugin logic (inline or spawn subagent)\n - Record outcome and update last_run\n3. Continue to next step\n\n## Plugin Execution Modes\n\n- **inline**: Deacon runs the plugin logic directly (simple, fast)\n- **subagent**: Spawn a polecat-like agent for the plugin (complex, parallel)\n- **mail**: Send mail to another agent to do the work (delegation)\n\n## State Tracking\n\n`{townRoot}/deacon/plugin-state.json`:\n```json\n{\n \"plugins\": {\n \"beads-hygiene\": {\n \"last_run\": \"2025-12-20T02:00:00Z\",\n \"last_outcome\": \"success\",\n \"run_count\": 42,\n \"failure_count\": 2\n }\n }\n}\n```\n\n## Relation to gt-axz\n\nThis implements the execution side of the plugin architecture (gt-axz).\ngt-axz defines the format; this task implements the scheduler.\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-20T21:47:31.798518-08:00","updated_at":"2025-12-25T20:48:20.539878-08:00","closed_at":"2025-12-25T20:48:20.539878-08:00","close_reason":"Polish items - Deacon operational without these; tracked as enhancements if needed","dependencies":[{"issue_id":"gt-id36.5","depends_on_id":"gt-id36","type":"parent-child","created_at":"2025-12-20T21:47:31.800001-08:00","created_by":"daemon"}]} +{"id":"gt-id36.6","title":"Deacon event/timer callbacks: reactive triggers","description":"\nImplement event-triggered and timer-based callbacks in the Deacon.\n\n## Timer Callbacks\n\nAgents can schedule future wakes by mailing the Deacon:\n```\nSubject: TIMER: gastown/witness wake at 2025-12-20T16:00:00Z\nBody: Please nudge me - I'm waiting for external dependency\n```\n\nDeacon processing:\n1. Parse timer mail\n2. Check if time has passed\n3. If yes: mail the agent \"WAKE: Timer fired\"\n4. Close the timer mail\n\n## Event Subscriptions\n\nPlugins/agents can subscribe to events:\n```yaml\n# In kernel bead or plugin config\nevent_triggers:\n - event: \"issue.created\"\n action: mail\n target: \"plugins/work-oracle\"\n \n - event: \"mr.submitted\"\n action: run\n plugin: \"review-oracle\"\n \n - event: \"agent.stuck\"\n action: escalate\n target: human\n```\n\n## Event Sources\n\nEvents come through mail to deacon/:\n```\nSubject: EVENT: issue.created gt-abc123\nBody: New issue created in gastown rig\n```\n\n## Event Types\n\nInitial event types:\n- `issue.created` - New bead created\n- `issue.closed` - Bead closed\n- `mr.submitted` - Merge request submitted\n- `mr.merged` - Merge request merged\n- `agent.stuck` - Agent appears stuck (from health scan)\n- `agent.failed` - Agent remediation failed\n\n## Event Processing\n\nDuring events step:\n1. Read event mail from inbox\n2. Match against subscriptions\n3. Execute actions:\n - `mail`: Send mail to target\n - `run`: Execute plugin inline\n - `spawn`: Spawn subagent for plugin\n - `escalate`: Mail human\n\n## Relation to Mail\n\nMail IS the event bus. No separate event system.\nEvents are just specially-formatted mail to deacon/.\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-20T21:47:32.99498-08:00","updated_at":"2025-12-25T20:48:20.554624-08:00","closed_at":"2025-12-25T20:48:20.554624-08:00","close_reason":"Polish items - Deacon operational without these; tracked as enhancements if needed","dependencies":[{"issue_id":"gt-id36.6","depends_on_id":"gt-id36","type":"parent-child","created_at":"2025-12-20T21:47:32.996649-08:00","created_by":"daemon"}]} {"id":"gt-ie33.1","title":"Polecat Arm (arm-toast)","description":"Single polecat inspection and action cycle.\n\nThis molecule is bonded dynamically by mol-witness-patrol's survey-workers step.\nEach polecat being monitored gets one arm that runs in parallel with other arms.\n\n## Variables\n\n| Variable | Required | Description |\n|----------|----------|-------------|\n| polecat_name | Yes | Name of the polecat to inspect |\n| rig | Yes | Rig containing the polecat |\n\n## Step: capture\nCapture recent tmux output for toast.\n\n```bash\ntmux capture-pane -t gt-gastown-toast -p | tail -50\n```\n\nRecord:\n- Last activity timestamp (when was last tool call?)\n- Visible errors or stack traces\n- Completion indicators (\"Done\", \"Finished\", etc.)\n\n## Step: assess\nCategorize polecat state based on captured output.\n\nStates:\n- **working**: Recent tool calls, active processing\n- **idle**: At prompt, no recent activity\n- **error**: Showing errors or stack traces\n- **requesting_shutdown**: Sent LIFECYCLE/Shutdown mail\n- **done**: Showing completion indicators\n\nCalculate: minutes since last activity.\nNeeds: capture\n\n## Step: load-history\nRead nudge history for toast from patrol state.\n\n```\nnudge_count = state.nudges[toast].count\nlast_nudge_time = state.nudges[toast].timestamp\n```\n\nThis data was loaded by the parent patrol's load-state step and passed\nto the arm via the bonding context.\nNeeds: assess\n\n## Step: decide\nApply the nudge matrix to determine action for toast.\n\n| State | Idle Time | Nudge Count | Action |\n|-------|-----------|-------------|--------|\n| working | any | any | none |\n| idle | \u003c10min | any | none |\n| idle | 10-15min | 0 | nudge-1 (gentle) |\n| idle | 15-20min | 1 | nudge-2 (direct) |\n| idle | 20+min | 2 | nudge-3 (final) |\n| idle | any | 3 | escalate |\n| error | any | any | assess-severity |\n| requesting_shutdown | any | any | pre-kill-verify |\n| done | any | any | pre-kill-verify |\n\nNudge text:\n1. \"How's progress? Need any help?\"\n2. \"Please wrap up soon. What's blocking you?\"\n3. \"Final check. Will escalate in 5 min if no response.\"\n\nRecord decision and rationale.\nNeeds: load-history\n\n## Step: execute\nTake the decided action for toast.\n\n**nudge-N**:\n```bash\ntmux send-keys -t gt-gastown-toast \"{{nudge_text}}\" Enter\n```\n\n**pre-kill-verify**:\n```bash\ncd polecats/toast\ngit status # Must be clean\ngit log origin/main..HEAD # Check for unpushed\nbd show \u003cassigned-issue\u003e # Verify closed/deferred\n```\nIf clean: kill session, remove worktree, delete branch\nIf dirty: record failure, retry next cycle\n\n**escalate**:\n```bash\ngt mail send mayor/ -s \"Escalation: toast stuck\" -m \"...\"\n```\n\n**none**: No action needed.\n\nRecord: action taken, result, updated nudge count.\nNeeds: decide\n\n## Output\n\nThe arm completes with:\n- action_taken: none | nudge-1 | nudge-2 | nudge-3 | killed | escalated\n- result: success | failed | pending\n- updated_state: New nudge count and timestamp for toast\n\nThis data feeds back to the parent patrol's aggregate step.\n---\nbonded_from: mol-polecat-arm\nbonded_to: gt-ie33\nbonded_ref: arm-toast\nbonded_at: 2025-12-23T10:00:00Z\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T00:10:09.989188-08:00","updated_at":"2025-12-24T00:10:10.192864-08:00","closed_at":"2025-12-24T00:10:10.192864-08:00"} {"id":"gt-ieem","title":"Test Patrol Parent","description":"Test parent for Christmas Ornament pattern","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T21:04:09.817241-08:00","updated_at":"2025-12-25T01:33:00.484839-08:00","closed_at":"2025-12-25T01:33:00.484839-08:00","close_reason":"Test pollution cleanup"} {"id":"gt-ieem.1","title":"Test Polecat Arm","description":"Test child for bonding pattern","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T21:04:09.907713-08:00","updated_at":"2025-12-25T01:33:00.467952-08:00","closed_at":"2025-12-25T01:33:00.467952-08:00","close_reason":"Test pollution cleanup","dependencies":[{"issue_id":"gt-ieem.1","depends_on_id":"gt-ieem","type":"parent-child","created_at":"2025-12-24T21:04:09.908178-08:00","created_by":"daemon"}]} @@ -1011,7 +1011,7 @@ {"id":"gt-lf7c8","title":"Digest: mol-deacon-patrol","description":"Patrol 20: Final patrol, handing off","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T00:06:01.256064-08:00","updated_at":"2025-12-25T00:06:01.256064-08:00","closed_at":"2025-12-25T00:06:01.25603-08:00","close_reason":"Squashed from 8 wisps"} {"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)"} -{"id":"gt-lly5x","title":"Digest: mol-deacon-patrol","description":"Patrol 11: All green","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:33:27.266684-08:00","updated_at":"2025-12-25T19:33:27.266684-08:00","closed_at":"2025-12-25T19:33:27.266631-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-lly5x","depends_on_id":"gt-wisp-vdr","type":"parent-child","created_at":"2025-12-25T19:33:27.267448-08:00","created_by":"deacon"}]} +{"id":"gt-lly5x","title":"Digest: mol-deacon-patrol","description":"Patrol 11: All green","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:33:27.266684-08:00","updated_at":"2025-12-25T19:33:27.266684-08:00","closed_at":"2025-12-25T19:33:27.266631-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-lnji","title":"gt polecat git-state command for pre-kill verification","description":"Add git-state subcommand to gt polecat for Witness pre-kill verification.\n\n## Usage\n```bash\ngt polecat git-state \u003crig\u003e/\u003cpolecat\u003e\n```\n\n## Output\n```\nGit State: gastown/furiosa\n\n Working Tree: clean | dirty\n Uncommitted: 0 files | N files (list)\n Unpushed: 0 commits | N commits ahead\n Stashes: 0 | N stashes\n\n Verdict: CLEAN (safe to kill) | DIRTY (needs cleanup)\n```\n\n## JSON output (--json flag)\n```json\n{\n \"clean\": true,\n \"uncommitted_files\": [],\n \"unpushed_commits\": 0,\n \"stash_count\": 0\n}\n```\n\n## Used by\n- Witness pre-kill verification (mol-witness-patrol)\n- Manual cleanup checks\n\n## Implementation\n- Check git status in polecat worktree\n- Check git log origin/main..HEAD\n- Check git stash list","status":"closed","priority":1,"issue_type":"task","assignee":"gastown/nux","created_at":"2025-12-22T16:43:10.035052-08:00","updated_at":"2025-12-22T23:35:06.34384-08:00","closed_at":"2025-12-22T23:35:06.34384-08:00","close_reason":"Implemented gt polecat git-state command for pre-kill verification"} {"id":"gt-lno","title":"Swarm state persistence: manifest + state + events","description":"Upgrade swarm persistence to match PGT pattern.\n\n## Current State\nSingle .gastown/swarms.json with all swarms.\n\n## Target State (per-swarm)\n```\n.gastown/swarms/\n└── \u003cswarm-id\u003e/\n ├── manifest.json # Immutable config\n ├── state.json # Mutable progress\n ├── events.jsonl # Audit log\n └── report.md # Generated report\n```\n\n## File Schemas\n\n### manifest.json (immutable after creation)\n```json\n{\n \"id\": \"sw-1\",\n \"title\": \"Epic description\",\n \"epic_id\": \"gt-abc\",\n \"rig\": \"gastown\",\n \"base_commit\": \"abc123\",\n \"integration_branch\": \"swarm/sw-1\",\n \"target_branch\": \"main\",\n \"workers\": [\"Toast\", \"Nux\"],\n \"tasks\": [{\"id\": \"gt-xyz\", \"title\": \"...\"}],\n \"created_at\": \"2024-01-01T00:00:00Z\"\n}\n```\n\n### state.json (mutable)\n```json\n{\n \"state\": \"active\",\n \"task_states\": {\n \"gt-xyz\": {\"state\": \"merged\", \"assignee\": \"Toast\"}\n },\n \"updated_at\": \"2024-01-01T01:00:00Z\",\n \"error\": null\n}\n```\n\n### events.jsonl (append-only audit)\n```jsonl\n{\"event\": \"created\", \"ts\": \"...\", \"data\": {...}}\n{\"event\": \"task_assigned\", \"ts\": \"...\", \"data\": {...}}\n{\"event\": \"task_merged\", \"ts\": \"...\", \"data\": {...}}\n```\n\n## Benefits\n- Audit trail via events.jsonl\n- Manifest immutability prevents corruption\n- Cleaner separation of concerns\n- Per-swarm isolation\n\n## Migration\nKeep backward compat with swarms.json during transition.\n\n## Files to Modify\n- internal/swarm/manager.go: Refactor persistence\n- internal/cmd/swarm.go: SwarmStore → directory-based\n\n## Acceptance Criteria\n- [ ] Per-swarm directory structure\n- [ ] Events logged to JSONL\n- [ ] Manifest immutable after creation\n- [ ] List command aggregates from directories","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-16T14:48:14.151538-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-lom0","title":"Digest: mol-deacon-patrol","description":"Patrol 20: OK - Handoff threshold reached","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T21:02:40.085741-08:00","updated_at":"2025-12-24T21:02:40.085741-08:00","closed_at":"2025-12-24T21:02:40.085706-08:00","close_reason":"Squashed from 8 wisps"} @@ -1034,9 +1034,9 @@ {"id":"gt-m0fx","title":"Test Patrol for Bonding","description":"Parent issue for mol bond CLI test","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T23:28:07.694215-08:00","updated_at":"2025-12-25T01:33:00.812869-08:00","closed_at":"2025-12-25T01:33:00.812869-08:00","close_reason":"Test pollution cleanup"} {"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-m5w4g","title":"Agent Communication Protocol","description":"Structured mail between agents for coordination.\n\n## Problem\nAgents communicate via freeform mail. This works but lacks parseable structure for automated handling.\n\n## Protocols\n\n### Witness to Refinery\n- POLECAT_READY: worker X completed, branch ready for merge\n- REWORK_COMPLETE: worker Y finished requested rework\n\n### Refinery to Witness \n- MERGE_SUCCESS: worker X merged, can be cleaned up\n- MERGE_FAILED: worker X needs rework (reason attached)\n- REWORK_REQUEST: please have worker X rebase on current main\n\n### Polecat to Witness\n- WORK_COMPLETE: done with assigned issue\n- NEED_HELP: stuck, requesting intervention\n\n### Any to Deacon\n- ESCALATION: problem requiring Mayor attention\n\n## Mail Format\nSubject: [PROTOCOL_TYPE] brief description\nBody: Structured YAML or JSON payload\n\n## Success Criteria\n- Patrol steps parse protocol messages automatically\n- Handlers exist for each protocol type\n- Integration test: polecat completes -\u003e witness notifies -\u003e refinery merges -\u003e witness cleans up\n\nConsolidates gt-0qki.","status":"open","priority":2,"issue_type":"epic","created_at":"2025-12-25T20:46:35.538744-08:00","updated_at":"2025-12-25T20:46:35.538744-08:00"} +{"id":"gt-m5w4g","title":"Agent Communication Protocol","description":"Structured mail between agents for coordination.\n\n## Problem\nAgents communicate via freeform mail. This works but lacks parseable structure for automated handling.\n\n## Protocols\n\n### Witness to Refinery\n- POLECAT_READY: worker X completed, branch ready for merge\n- REWORK_COMPLETE: worker Y finished requested rework\n\n### Refinery to Witness \n- MERGE_SUCCESS: worker X merged, can be cleaned up\n- MERGE_FAILED: worker X needs rework (reason attached)\n- REWORK_REQUEST: please have worker X rebase on current main\n\n### Polecat to Witness\n- WORK_COMPLETE: done with assigned issue\n- NEED_HELP: stuck, requesting intervention\n\n### Any to Deacon\n- ESCALATION: problem requiring Mayor attention\n\n## Mail Format\nSubject: [PROTOCOL_TYPE] brief description\nBody: Structured YAML or JSON payload\n\n## Success Criteria\n- Patrol steps parse protocol messages automatically\n- Handlers exist for each protocol type\n- Integration test: polecat completes -\u003e witness notifies -\u003e refinery merges -\u003e witness cleans up\n\nConsolidates gt-0qki.","status":"open","priority":2,"issue_type":"epic","created_at":"2025-12-25T20:46:35.538744-08:00","updated_at":"2025-12-25T20:46:35.538744-08:00","dependencies":[{"issue_id":"gt-m5w4g","depends_on_id":"gt-psj76","type":"blocks","created_at":"2025-12-25T20:47:18.478538-08:00","created_by":"daemon"}]} {"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-m9uq3","title":"Digest: mol-deacon-patrol","description":"Patrol 12: All green","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:33:56.421573-08:00","updated_at":"2025-12-25T19:33:56.421573-08:00","closed_at":"2025-12-25T19:33:56.421523-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-m9uq3","depends_on_id":"gt-wisp-ovv","type":"parent-child","created_at":"2025-12-25T19:33:56.422427-08:00","created_by":"deacon"}]} +{"id":"gt-m9uq3","title":"Digest: mol-deacon-patrol","description":"Patrol 12: All green","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:33:56.421573-08:00","updated_at":"2025-12-25T19:33:56.421573-08:00","closed_at":"2025-12-25T19:33:56.421523-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-mat34","title":"Digest: mol-deacon-patrol","description":"Patrol 8: all clear","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T11:05:02.92058-08:00","updated_at":"2025-12-25T11:05:02.92058-08:00","closed_at":"2025-12-25T11:05:02.920553-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-mat34","depends_on_id":"gt-1caj8","type":"parent-child","created_at":"2025-12-25T11:05:02.921303-08:00","created_by":"stevey"}]} {"id":"gt-mbyy","title":"CLI API Audit: gt and bd command structure review before OSS launch","description":"# CLI API Audit for OSS Launch\n\nBefore launching Gas Town + Beads as an SDK, we need to ensure the command-line\nAPI is intelligently designed, consistent, intuitive, and structurally sound.\n\n## Current State Audit\n\n### gt (Gas Town) - 50+ top-level commands\n\n**Agent Lifecycle:**\n- `gt mayor`, `gt deacon`, `gt witness`, `gt refinery` - agent management\n- `gt polecat` - worker management (subcommands: add, remove, list, etc.)\n- `gt crew` - persistent workspace management\n- `gt spawn` - create polecat with work\n\n**Work Lifecycle:**\n- `gt spawn` - assign work to new polecat\n- `gt sling` - hook work + start immediately\n- `gt hook` - attach work durably\n- `gt handoff` - pass work to fresh session\n- `gt done` - signal work complete\n- `gt release` - release stuck issues\n\n**Infrastructure:**\n- `gt daemon`, `gt up`, `gt down`, `gt start`, `gt stop`, `gt shutdown`\n- `gt init`, `gt install`, `gt doctor`\n\n**Communication:**\n- `gt mail` (subcommands: send, inbox, read, etc.)\n- `gt nudge`, `gt broadcast`\n\n**Molecules:**\n- `gt molecule` / `gt mol` (17 subcommands!)\n\n### bd (Beads) - Well-categorized but some sprawl\n\n**Core CRUD:**\n- `bd create`, `bd show`, `bd update`, `bd close`, `bd list`\n\n**Molecules:**\n- `bd mol` (5 subcommands: catalog, show, bond, run, distill)\n- `bd wisp` (3 subcommands: create, gc, list)\n- `bd pour` (top-level alias for instantiation)\n- `bd cook` (compile formula to proto)\n\n**Hook/Pin:**\n- `bd pin` - attach mol to agent hook\n- `bd unpin` - remove from hook\n- `bd hook` - inspect what's on hook\n\n## Structural Concerns\n\n### 1. gt is sprawling (50+ top-level commands)\n\nMany commands could be subcommands:\n```\n# Current # Could be\ngt up/down/start/stop gt daemon {up|down|start|stop}\ngt spawn/sling/hook/handoff gt work {spawn|sling|hook|handoff}\ngt mayor/deacon/witness gt agent {mayor|deacon|witness|...}\n```\n\n### 2. Overlap between gt and bd\n\n| Concept | gt | bd |\n|---------|----|----|\n| Hook | `gt hook` | `bd pin`, `bd hook` |\n| Mail | `gt mail` | `bd mail` (delegates) |\n| Molecules | `gt mol` (17 cmds) | `bd mol` (5 cmds) |\n\nWhich owns what? User confusion likely.\n\n### 3. Naming inconsistencies\n\n- `gt polecat` (noun) vs `gt spawn` (verb) - both about polecats\n- `gt done` vs `gt handoff` - both end work but different\n- `bd mol run` vs `bd pour` - both instantiate\n\n### 4. Subcommand depth decisions\n\n**Good patterns:**\n- `bd mol {catalog|show|bond|run|distill}` - coherent group\n- `gt mail {send|inbox|read|archive}` - coherent group\n\n**Questionable patterns:**\n- `bd create --wisp` AND `bd wisp create` - two ways to do same thing\n- `gt spawn --molecule X` AND `gt mol instantiate` - overlap\n\n### 5. Flag vs subcommand guidelines needed\n\nWhen to use flags vs subcommands?\n- `--json` as flag ✓ (modifier)\n- `--wisp` as flag for create? Or separate `bd wisp create`?\n- `--molecule` on spawn? Or separate workflow?\n\n## Recommendations to Evaluate\n\n### A. Consolidate gt top-level commands\n\nGroup related commands:\n```\ngt agent {mayor|deacon|witness|refinery|polecat}\ngt work {spawn|sling|hook|handoff|done}\ngt infra {daemon|up|down|doctor}\n```\n\n### B. Clarify gt vs bd ownership\n\n| Domain | Owner | Other defers |\n|--------|-------|--------------|\n| Issues | bd | gt uses bd |\n| Agents | gt | bd doesn't touch |\n| Molecules | bd mol | gt mol wraps for UX |\n| Hooks | bd pin/hook | gt hook wraps |\n| Mail | gt mail | bd mail delegates |\n\n### C. Apply consistent naming\n\n- All agent commands: nouns (`gt polecat`, `gt mayor`)\n- All work commands: verbs (`gt spawn`, `gt sling`, `gt hook`)\n- Avoid synonyms: pick one term and stick with it\n\n### D. Flag vs subcommand rule\n\n- Flags: modify behavior of command (`--json`, `--force`, `--wisp`)\n- Subcommands: distinct operations (`mol run`, `mol squash`, `mol burn`)\n- Exception: very common operations can have top-level aliases\n\n## Tasks\n\n1. [ ] Review gt command groupings - propose consolidation\n2. [ ] Review bd command groupings - check for sprawl\n3. [ ] Document gt vs bd ownership boundaries\n4. [ ] Identify and resolve naming inconsistencies\n5. [ ] Document flag vs subcommand decision criteria\n6. [ ] Create migration plan for any breaking changes\n7. [ ] Update help text to be consistent\n8. [ ] Test agent UX: can Claude guess commands correctly?\n\n## Success Criteria\n\n- New user can guess command structure intuitively\n- `gt --help` fits on one screen (or is well-categorized)\n- No duplicate functionality between gt and bd\n- Consistent naming throughout\n- Claude agents can discover commands without documentation","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-24T23:48:42.420867-08:00","updated_at":"2025-12-25T12:12:21.188501-08:00","closed_at":"2025-12-25T12:12:21.188501-08:00","close_reason":"CLI API audit completed - structure reviewed and documented","dependencies":[{"issue_id":"gt-mbyy","depends_on_id":"gt-jo9n","type":"blocks","created_at":"2025-12-24T23:48:52.221824-08:00","created_by":"daemon"}]} {"id":"gt-mcch0","title":"Digest: mol-deacon-patrol","description":"Patrol 16: Quiet","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T07:28:57.926784-08:00","updated_at":"2025-12-25T07:28:57.926784-08:00","closed_at":"2025-12-25T07:28:57.926736-08:00"} @@ -1074,7 +1074,7 @@ {"id":"gt-mtj4","title":"Digest: mol-deacon-patrol","description":"Patrol 11: OK","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T20:59:34.040451-08:00","updated_at":"2025-12-24T20:59:34.040451-08:00","closed_at":"2025-12-24T20:59:34.040423-08:00","close_reason":"Squashed from 8 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","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","dependencies":[{"issue_id":"gt-mzal","depends_on_id":"gt-psj76","type":"blocks","created_at":"2025-12-25T20:47:20.336192-08:00","created_by":"daemon"},{"issue_id":"gt-mzal","depends_on_id":"gt-p3v5n","type":"blocks","created_at":"2025-12-25T20:47:21.588707-08:00","created_by":"daemon"}]} {"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","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"}]} @@ -1083,12 +1083,12 @@ {"id":"gt-mzal.6","title":"Design molecule parameterization","description":"Enable protos to accept parameters for customization.\n\n## Use Cases\n\n1. rig-spinup needs rig name: `gt sling rig-spinup --param rig=newproject`\n2. agent-restart needs agent: `gt sling agent-restart --param agent=gastown/witness`\n3. code-review needs scope: `gt sling code-review --param scope=src/auth/`\n\n## Proposed Syntax\n\n### In Proto\n\n```markdown\n## Step: create-rig-structure\nmkdir -p ~/gt/${rig}/refinery ~/gt/${rig}/witness\n```\n\n### In Sling\n\n```bash\ngt sling rig-spinup mayor/ --param rig=newproject --wisp\n```\n\n### In Bonded Molecule\n\nInterpolation happens at bond time. Step descriptions have concrete values.\n\n## Implementation\n\n1. Proto declares params in frontmatter: `params: [rig]`\n2. gt sling validates required params provided\n3. bd mol bond receives params, interpolates descriptions\n4. Bonded molecule has concrete step text\n\n## Edge Cases\n\n- Missing required param → error\n- Unused param → warning\n- Param in step title → interpolate there too\n","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-22T21:00:23.35376-08:00","updated_at":"2025-12-22T21:00:23.35376-08:00","dependencies":[{"issue_id":"gt-mzal.6","depends_on_id":"gt-mzal","type":"parent-child","created_at":"2025-12-22T21:00:23.354175-08:00","created_by":"daemon"}]} {"id":"gt-mzal.7","title":"Proto marketplace: shareable molecule templates","description":"Enable sharing protos between Gas Town installations.\n\n## Vision\n\nA public registry of protos that users can pull and use:\n\n```bash\ngt proto search \"code review\"\ngt proto install gastown/code-review\ngt sling code-review gastown/Toast --wisp\n```\n\n## Registry Design\n\n### Local Catalog\n`~/gt/molecules/` - user-defined and installed protos\n\n### Remote Registry\n`registry.gastown.dev/protos/` (future)\n- Browse online catalog\n- Version-controlled protos\n- Rating/reviews\n- Usage statistics\n\n## Proto Package Format\n\n```\ngastown-code-review-1.0.0/\n├── PROTO.md # Main proto definition\n├── README.md # Usage documentation\n├── LICENSE # Usage terms\n└── plugins/ # For pluggable molecules\n ├── security/\n └── performance/\n```\n\n## Commands\n\n```bash\ngt proto list # Show installed protos\ngt proto search \u003cquery\u003e # Search registry\ngt proto install \u003cname\u003e # Install from registry\ngt proto publish \u003cpath\u003e # Publish to registry\ngt proto update # Update all installed\n```\n\n## For Now\n\nStart with local catalog. Marketplace is future phase.\nEnsure proto format is registry-compatible from the start.\n","status":"open","priority":3,"issue_type":"feature","created_at":"2025-12-22T21:00:49.124222-08:00","updated_at":"2025-12-22T21:00:49.124222-08:00","dependencies":[{"issue_id":"gt-mzal.7","depends_on_id":"gt-mzal","type":"parent-child","created_at":"2025-12-22T21:00:49.124687-08:00","created_by":"daemon"},{"issue_id":"gt-mzal.7","depends_on_id":"gt-mzal.3","type":"blocks","created_at":"2025-12-22T21:01:01.874557-08:00","created_by":"daemon"}]} {"id":"gt-mzal.8","title":"Update Mayor startup protocol for bootstrap","description":"Teach Mayor to respond to \"boot up gas town\" by slinging mol-gastown-boot.\n\n## Current Protocol\n\n1. Announce: \"Mayor, checking in.\"\n2. Check mail\n3. If handoff, continue\n4. Await user instruction\n\n## Enhanced Protocol\n\n1. Announce: \"Mayor, checking in.\"\n2. Check mail\n3. If handoff, continue\n4. **If user says \"boot\"/\"startup\"/\"bootstrap\":**\n - Sling mol-gastown-boot as wisp\n - Execute verification-gated steps\n - Report town status when complete\n5. Otherwise await instruction\n\n## Trigger Phrases\n\n- \"boot up gas town\"\n- \"bootstrap the town\"\n- \"start gas town\"\n- \"bring up the town\"\n\n## Execution\n\nMayor runs the molecule manually (not via subagent):\n\n```\n1. Bond the proto: bd mol bond mol-gastown-boot --wisp\n2. For each step:\n a. Run action command\n b. Loop verification with backoff\n c. On stall, run recovery\n d. Close step when verified\n3. Squash wisp with summary\n4. Report: \"Gas Town is up. All agents healthy.\"\n```\n\n## CLAUDE.md Update\n\nAdd to Mayor CLAUDE.md:\n\n```markdown\n## Bootstrap Command\n\nWhen user requests town bootstrap:\n1. gt sling gastown-boot mayor/ --wisp\n2. Execute molecule steps with verification\n3. Keep trying until all agents healthy\n4. No timeouts - you are the town engineer\n```\n","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-22T21:00:50.429735-08:00","updated_at":"2025-12-22T21:00:50.429735-08:00","dependencies":[{"issue_id":"gt-mzal.8","depends_on_id":"gt-mzal","type":"parent-child","created_at":"2025-12-22T21:00:50.430131-08:00","created_by":"daemon"},{"issue_id":"gt-mzal.8","depends_on_id":"gt-mzal.1","type":"blocks","created_at":"2025-12-22T21:00:59.16763-08:00","created_by":"daemon"},{"issue_id":"gt-mzal.8","depends_on_id":"gt-mzal.2","type":"blocks","created_at":"2025-12-22T21:00:59.231779-08:00","created_by":"daemon"}]} -{"id":"gt-mzzl9","title":"Digest: mol-deacon-patrol","description":"Patrol complete: inbox checked (4 msgs, 1 escalation resolved), all agents healthy (2 witnesses, 2 refineries, 3 polecats, 5 crew), cleaned 66 abandoned wisps","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:42:46.3183-08:00","updated_at":"2025-12-25T19:42:46.3183-08:00","closed_at":"2025-12-25T19:42:46.318252-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-mzzl9","depends_on_id":"gt-wisp-2cz","type":"parent-child","created_at":"2025-12-25T19:42:46.319035-08:00","created_by":"deacon"}]} +{"id":"gt-mzzl9","title":"Digest: mol-deacon-patrol","description":"Patrol complete: inbox checked (4 msgs, 1 escalation resolved), all agents healthy (2 witnesses, 2 refineries, 3 polecats, 5 crew), cleaned 66 abandoned wisps","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:42:46.3183-08:00","updated_at":"2025-12-25T19:42:46.3183-08:00","closed_at":"2025-12-25T19:42:46.318252-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-n33lx","title":"Digest: mol-deacon-patrol","description":"Patrol 16: routine","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T10:19:26.175734-08:00","updated_at":"2025-12-25T10:19:26.175734-08:00","closed_at":"2025-12-25T10:19:26.175704-08:00"} {"id":"gt-n3i7","title":"Digest: mol-deacon-patrol","description":"Patrol 15: OK","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T21:00:56.816258-08:00","updated_at":"2025-12-24T21:00:56.816258-08:00","closed_at":"2025-12-24T21:00:56.816225-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-n508","title":"Merge: gt-70b3","description":"type: merge-request\nbranch: polecat/Rictus\ntarget: main\nsource_issue: gt-70b3\nrig: gastown","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-18T21:56:57.840796-08:00","updated_at":"2025-12-18T22:16:39.940524-08:00","closed_at":"2025-12-18T22:16:39.940524-08:00"} {"id":"gt-n5uy","title":"Digest: mol-deacon-patrol","description":"Patrol OK: 8 polecats, 4 witness/refineries up","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-23T01:06:42.456269-08:00","updated_at":"2025-12-23T01:06:42.456269-08:00","closed_at":"2025-12-23T01:06:42.456235-08:00","close_reason":"Squashed from 5 wisps"} -{"id":"gt-n7cm4","title":"Digest: mol-deacon-patrol","description":"Patrol 14: Green","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:34:39.56723-08:00","updated_at":"2025-12-25T19:34:39.56723-08:00","closed_at":"2025-12-25T19:34:39.567175-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-n7cm4","depends_on_id":"gt-wisp-c9p","type":"parent-child","created_at":"2025-12-25T19:34:39.568057-08:00","created_by":"deacon"}]} +{"id":"gt-n7cm4","title":"Digest: mol-deacon-patrol","description":"Patrol 14: Green","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:34:39.56723-08:00","updated_at":"2025-12-25T19:34:39.56723-08:00","closed_at":"2025-12-25T19:34:39.567175-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-n7z7","title":"Bug: refinery --foreground detects parent session as already running","description":"When gt refinery start gastown runs:\n1. Creates tmux session gt-gastown-refinery\n2. Sends 'gt refinery start gastown --foreground' into the session\n3. The foreground command checks HasSession() - finds the session it's inside\n4. Returns 'already running' error\n\nThe foreground mode check should either:\n- Skip the tmux session check (only check PID)\n- Use a different indicator that the daemon loop is running\n- Pass a flag to indicate we're being called from the background starter\n\nWorkaround: Manually run 'gt refinery start gastown --foreground' from a fresh session.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-20T00:56:20.326369-08:00","updated_at":"2025-12-20T03:52:11.20518-08:00","closed_at":"2025-12-20T03:52:11.20518-08:00"} {"id":"gt-n8s1","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:06:13.730874-08:00","updated_at":"2025-12-25T01:33:00.995117-08:00","closed_at":"2025-12-25T01:33:00.995117-08:00","close_reason":"Test pollution cleanup"} {"id":"gt-n8s1.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-n8s1\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:13.827065-08:00","updated_at":"2025-12-23T22:06:14.00142-08:00","closed_at":"2025-12-23T22:06:14.00142-08:00","close_reason":"Closed","dependencies":[{"issue_id":"gt-n8s1.1","depends_on_id":"gt-n8s1","type":"parent-child","created_at":"2025-12-23T22:06:13.827585-08:00","created_by":"daemon"}]} @@ -1167,7 +1167,7 @@ {"id":"gt-ox9","title":"Test from Mayor","description":"This is a test message via GGT mail","status":"tombstone","priority":2,"issue_type":"message","created_at":"2025-12-16T22:04:31.483843-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"message"} {"id":"gt-oxtdp","title":"Digest: mol-deacon-patrol","description":"Patrol 11: Quiet","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:17:35.222414-08:00","updated_at":"2025-12-25T19:17:35.222414-08:00","closed_at":"2025-12-25T19:17:35.222361-08:00"} {"id":"gt-p2l2","title":"gt doctor: add Claude settings.json validation","description":"Add a new doctor check to validate Claude Code settings in worker directories:\n\n**Check for:**\n1. .claude/settings.json exists in polecats/*, crew/*, witness/rig, refinery/rig\n2. SessionStart hook has 'gt prime' command\n3. Autonomous roles (polecat, witness, refinery) have 'gt mail check --inject' in SessionStart\n4. Interactive roles (crew, mayor) have mail check in UserPromptSubmit only\n\n**Auto-fix capability:**\nUse internal/claude.EnsureSettingsForRole() to create missing settings files.\n\nContext: The spawn priming race condition fix (gt-6957) added embedded settings templates. Doctor should validate these are in place.","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-22T17:59:02.326127-08:00","updated_at":"2025-12-22T17:59:02.326127-08:00"} -{"id":"gt-p3v5n","title":"Witness Arm Bonding","description":"Witness manages polecats using Christmas Ornament pattern.\n\n## Problem\nWitness needs to monitor and intervene on multiple polecats. Current approach lacks per-worker tracking and the dynamic bonding pattern.\n\n## Christmas Ornament Pattern\n * mol-witness-patrol (trunk)\n /|\\\n +-----+ | +-----+\n o o o mol-polecat-arm (dynamic)\n ace nux toast\n\nEach polecat gets its own arm molecule bonded to the patrol. Fanout gate waits for all arms to complete.\n\n## Requirements\n- mol-polecat-arm bonded per active worker (bd mol bond)\n- Fanout gate aggregates arm results (waits-for: all-children)\n- State persists across witness sessions\n- Spawn/nudge/kill operations work from arm context\n\n## Key Commands\n- bd mol bond mol-polecat-arm \u003cpatrol-id\u003e --var worker=ace\n- bd gate create --await all-children\n\n## Success Criteria\n- Witness patrols with 3+ polecats work correctly\n- Arms capture and assess each worker independently\n- Aggregation step waits for all arms before proceeding","status":"open","priority":1,"issue_type":"epic","created_at":"2025-12-25T20:46:22.29819-08:00","updated_at":"2025-12-25T20:46:22.29819-08:00"} +{"id":"gt-p3v5n","title":"Witness Arm Bonding","description":"Witness manages polecats using Christmas Ornament pattern.\n\n## Problem\nWitness needs to monitor and intervene on multiple polecats. Current approach lacks per-worker tracking and the dynamic bonding pattern.\n\n## Christmas Ornament Pattern\n * mol-witness-patrol (trunk)\n /|\\\n +-----+ | +-----+\n o o o mol-polecat-arm (dynamic)\n ace nux toast\n\nEach polecat gets its own arm molecule bonded to the patrol. Fanout gate waits for all arms to complete.\n\n## Requirements\n- mol-polecat-arm bonded per active worker (bd mol bond)\n- Fanout gate aggregates arm results (waits-for: all-children)\n- State persists across witness sessions\n- Spawn/nudge/kill operations work from arm context\n\n## Key Commands\n- bd mol bond mol-polecat-arm \u003cpatrol-id\u003e --var worker=ace\n- bd gate create --await all-children\n\n## Success Criteria\n- Witness patrols with 3+ polecats work correctly\n- Arms capture and assess each worker independently\n- Aggregation step waits for all arms before proceeding","status":"open","priority":1,"issue_type":"epic","created_at":"2025-12-25T20:46:22.29819-08:00","updated_at":"2025-12-25T20:46:22.29819-08:00","dependencies":[{"issue_id":"gt-p3v5n","depends_on_id":"gt-psj76","type":"blocks","created_at":"2025-12-25T20:47:17.026491-08:00","created_by":"daemon"}]} {"id":"gt-p4s9","title":"Digest: mol-deacon-patrol","description":"Patrol 7: Routine","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T22:36:49.392521-08:00","updated_at":"2025-12-24T22:36:49.392521-08:00","closed_at":"2025-12-24T22:36:49.392494-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-p9zh","title":"gt doctor: detect orphaned code on beads-sync branch","description":"After merging beads-sync to main, some code changes can be lost if the merge conflict resolution drops files.\n\nAdd a doctor check that runs:\n git diff main..beads-sync -- '*.go' '*.md'\n\nIf there are differences in code files (not just .beads/), warn about potentially orphaned work.\n\nToday's incident: Merge 96c773f lost mailbox.go and router.go changes from 5791752, requiring re-implementation.\n\nAcceptance:\n- gt doctor warns if beads-sync has unmerged code changes\n- Excludes .beads/ directory (expected to differ)\n- Shows file list of orphaned changes","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-20T22:01:56.794648-08:00","updated_at":"2025-12-20T22:19:59.777921-08:00","closed_at":"2025-12-20T22:19:59.777921-08:00","close_reason":"Implemented both checks: persistent-role-branches and beads-sync-orphans. Also added ensureMainBranch() to crew attach."} {"id":"gt-pbjim","title":"Digest: mol-deacon-patrol","description":"Patrol 15: All healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T00:35:05.785047-08:00","updated_at":"2025-12-25T00:35:05.785047-08:00","closed_at":"2025-12-25T00:35:05.785013-08:00"} @@ -1187,7 +1187,7 @@ {"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"} {"id":"gt-pnch9","title":"Digest: mol-deacon-patrol","description":"Patrol 19: Quiet","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T07:29:48.868198-08:00","updated_at":"2025-12-25T07:29:48.868198-08:00","closed_at":"2025-12-25T07:29:48.868161-08:00"} {"id":"gt-pnu4","title":"Test","description":"Body","status":"tombstone","priority":2,"issue_type":"message","created_at":"2025-12-20T21:38:39.019559-08:00","updated_at":"2025-12-25T14:12:42.272191-08:00","deleted_at":"2025-12-25T14:12:42.272191-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"message"} -{"id":"gt-pnurj","title":"Digest: mol-deacon-patrol","description":"Patrol 20: Green - routine cycle complete, handing off","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:36:47.596964-08:00","updated_at":"2025-12-25T19:36:47.596964-08:00","closed_at":"2025-12-25T19:36:47.59691-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-pnurj","depends_on_id":"gt-wisp-ttu","type":"parent-child","created_at":"2025-12-25T19:36:47.598727-08:00","created_by":"deacon"}]} +{"id":"gt-pnurj","title":"Digest: mol-deacon-patrol","description":"Patrol 20: Green - routine cycle complete, handing off","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:36:47.596964-08:00","updated_at":"2025-12-25T19:36:47.596964-08:00","closed_at":"2025-12-25T19:36:47.59691-08:00","close_reason":"Squashed from 8 wisps"} {"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"}]} {"id":"gt-pqhka","title":"Digest: mol-deacon-patrol","description":"Patrol 20: All agents healthy - triggering handoff","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T06:46:30.78827-08:00","updated_at":"2025-12-25T06:46:30.78827-08:00","closed_at":"2025-12-25T06:46:30.788236-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-psj76","title":"Patrol Lifecycle Completion","description":"Patrols complete their full cycle without wisp accumulation.\n\n## Problem\nPatrol wisps accumulate (73+ observed) because burn-or-loop step does not complete. This wastes storage and makes bd list noisy.\n\n## Requirements\n- Burn-or-loop step executes and burns completed wisps\n- Fresh wisp instantiated for next patrol cycle \n- Wisp GC runs periodically as safety net (orphan-check step)\n- Context cycling triggers gt handoff when budget exhausted\n- No wisp accumulation over time\n\n## Success Criteria\n- bd wisp list shows fewer than 5 wisps at any time\n- Patrols run indefinitely without intervention\n- Context cycles cleanly produce handoff mail\n\nThis is the foundation for all autonomous patrol work.","status":"open","priority":1,"issue_type":"epic","created_at":"2025-12-25T20:45:54.435395-08:00","updated_at":"2025-12-25T20:45:54.435395-08:00"} @@ -1268,9 +1268,9 @@ {"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","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-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":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T13:39:12.926917-08:00","updated_at":"2025-12-25T20:48:19.286811-08:00","closed_at":"2025-12-25T20:48:19.286811-08:00","close_reason":"Superseded by new epics: gt-psj76 (Patrol Lifecycle), gt-m5w4g (Agent Protocol), gt-twjr5 (Async Gates)","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":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T13:39:14.120827-08:00","updated_at":"2025-12-25T20:48:19.3018-08:00","closed_at":"2025-12-25T20:48:19.3018-08:00","close_reason":"Superseded by new epics: gt-psj76 (Patrol Lifecycle), gt-m5w4g (Agent Protocol), gt-twjr5 (Async Gates)","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":"closed","priority":3,"issue_type":"task","created_at":"2025-12-21T13:39:15.421608-08:00","updated_at":"2025-12-25T20:48:19.315977-08:00","closed_at":"2025-12-25T20:48:19.315977-08:00","close_reason":"Superseded by new epics: gt-psj76 (Patrol Lifecycle), gt-m5w4g (Agent Protocol), gt-twjr5 (Async Gates)","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-rbp6","title":"Test Patrol Parent","description":"Test parent for Christmas Ornament pattern","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T21:32:00.561088-08:00","updated_at":"2025-12-25T01:33:00.33632-08:00","closed_at":"2025-12-25T01:33:00.33632-08:00","close_reason":"Test pollution cleanup"} {"id":"gt-rbp6.1","title":"Test Polecat Arm","description":"Test child for bonding pattern","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T21:32:00.648392-08:00","updated_at":"2025-12-25T01:33:00.320016-08:00","closed_at":"2025-12-25T01:33:00.320016-08:00","close_reason":"Test pollution cleanup","dependencies":[{"issue_id":"gt-rbp6.1","depends_on_id":"gt-rbp6","type":"parent-child","created_at":"2025-12-24T21:32:00.64877-08:00","created_by":"daemon"}]} {"id":"gt-rhfji","title":"gt up: set BD_ACTOR env var when spawning agents","description":"When gt spawns agents (polecats, crew, patrol roles), it should set BD_ACTOR env var so that bd commands (like `bd hook`) know the agent identity.\n\nCurrently gt sets GT_ROLE but bd can't check that (no coupling to gt). bd already checks BD_ACTOR, so gt just needs to set it.\n\nPlaces to update:\n- `gt up` for polecats/crew\n- Deacon, Witness, Refinery spawning\n- Any other agent spawn points\n\nRelated: closed bd-fej5 in beads repo as obsolete (fix belongs here).","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T12:41:21.092758-08:00","updated_at":"2025-12-25T13:26:47.176904-08:00","closed_at":"2025-12-25T13:26:47.176904-08:00","close_reason":"Closed"}