bd sync: 2025-12-28 15:43:30
This commit is contained in:
@@ -46,6 +46,7 @@
|
||||
{"id":"gt-0xuso","title":"Digest: mol-deacon-patrol","description":"P10: stable","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:59:07.504644-08:00","updated_at":"2025-12-25T19:59:07.504644-08:00","closed_at":"2025-12-25T19:59:07.504589-08:00"}
|
||||
{"id":"gt-0yn0","title":"test pin fix 2","notes":"Released: displaced by new sling","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-23T12:15:48.827437-08:00","updated_at":"2025-12-27T21:29:56.001943-08:00","deleted_at":"2025-12-27T21:29:56.001943-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"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":"tombstone","priority":2,"issue_type":"epic","created_at":"2025-12-25T13:39:38.624096-08:00","updated_at":"2025-12-27T21:29:55.215073-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"}],"deleted_at":"2025-12-27T21:29:55.215073-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"epic"}
|
||||
{"id":"gt-0zefw","title":"Standardize error handling and warning output patterns","description":"Inconsistent patterns across codebase:\n\nError wrapping:\n- Some: fmt.Errorf(\"context: %w\", err) (good)\n- Some: return err (loses context)\n- Some: fmt.Errorf(\"message\", rigName) without wrapping original\n\nExit handling in Cobra commands:\n- Some use os.Exit(1) inside RunE (bad - loses error chain)\n- Some properly return errors\n\nWarning output styles:\n- fmt.Printf(\"%s Warning: ...\", style.Dim.Render(\"⚠\"))\n- fmt.Printf(\"Warning: %s\", ...)\n- fmt.Fprintf(os.Stderr, \"warning: ...\")\n\nSuggestion:\n1. Always wrap errors with %w\n2. Never call os.Exit() in RunE handlers\n3. Standardize on style.Warning.Render(\"Warning:\") pattern","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-28T15:43:18.89794-08:00","created_by":"gastown/crew/max","updated_at":"2025-12-28T15:43:18.89794-08:00"}
|
||||
{"id":"gt-0zpdn","title":"Day 4.5: Test multi-step molecule lifecycle","description":"Integration test:\n1. Create 3-step molecule\n2. Sling to polecat\n3. Watch step 1 complete → recycle\n4. Watch step 2 complete → recycle\n5. Watch step 3 complete → MERGE_READY\n6. Watch merge → nuke\n7. Verify clean state\n\nParent: gt-4a2qt","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-27T20:58:08.06509-08:00","created_by":"mayor","updated_at":"2025-12-27T20:58:08.06509-08:00","dependencies":[{"issue_id":"gt-0zpdn","depends_on_id":"gt-4a2qt","type":"parent-child","created_at":"2025-12-27T20:58:47.568249-08:00","created_by":"daemon"},{"issue_id":"gt-0zpdn","depends_on_id":"gt-zb0io","type":"blocks","created_at":"2025-12-27T20:58:56.884662-08:00","created_by":"daemon"},{"issue_id":"gt-0zpdn","depends_on_id":"gt-ztpe8","type":"blocks","created_at":"2025-12-27T20:58:57.915265-08:00","created_by":"daemon"}]}
|
||||
{"id":"gt-110m","title":"Digest: mol-deacon-patrol","description":"Patrol 1: All healthy, no lifecycle requests, no orphans","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-24T23:05:14.439933-08:00","updated_at":"2025-12-27T21:26:04.507497-08:00","deleted_at":"2025-12-27T21:26:04.507497-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-11zdz","title":"Digest: mol-deacon-patrol","description":"Cycle 3: quiet patrol","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-28T13:08:45.744596-08:00","updated_at":"2025-12-28T13:08:45.744596-08:00","closed_at":"2025-12-28T13:08:45.744565-08:00","close_reason":"Squashed from 9 wisps","dependencies":[{"issue_id":"gt-11zdz","depends_on_id":"gt-eph-js7","type":"parent-child","created_at":"2025-12-28T13:08:45.745438-08:00","created_by":"deacon"}]}
|
||||
@@ -125,6 +126,7 @@
|
||||
{"id":"gt-2f3h","title":"Digest: mol-deacon-patrol","description":"Patrol #20: Stable, handoff threshold reached","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-24T23:35:50.776172-08:00","updated_at":"2025-12-27T21:26:04.235471-08:00","deleted_at":"2025-12-27T21:26:04.235471-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-2f3z9","title":"Digest: mol-deacon-patrol","description":"Patrol cycle 12: routine","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-26T13:27:13.064608-08:00","updated_at":"2025-12-27T21:26:01.871711-08:00","deleted_at":"2025-12-27T21:26:01.871711-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-2ffjo","title":"Digest: mol-deacon-patrol","description":"Patrol 19: routine","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-26T18:47:07.877911-08:00","updated_at":"2025-12-27T21:26:00.871228-08:00","deleted_at":"2025-12-27T21:26:00.871228-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-2g130","title":"Remove dead code: splitLines first loop, unused methods","description":"Dead code identified:\n\ninternal/cmd/polecat.go (lines 1093-1106):\nsplitLines function has a first loop using filepath.SplitList (wrong for newlines) that's immediately discarded before the correct strings.Split loop.\n\ninternal/townlog/logger.go (lines 277-279):\nEvent.JSON() method defined but never called anywhere.\n\ninternal/lock/lock.go (line 27):\nErrStaleLock error defined but never returned.\n\ninternal/witness/types.go (line 19):\nStatePaused state defined but no code paths set it.\n\ninternal/refinery/manager.go (lines 527-538):\ngetTestCommand method defined but getMergeConfig().TestCommand used instead.\n\nSuggestion: Remove all dead code or add tests if functionality is needed.","status":"open","priority":4,"issue_type":"task","created_at":"2025-12-28T15:43:17.034253-08:00","created_by":"gastown/crew/max","updated_at":"2025-12-28T15:43:17.034253-08:00"}
|
||||
{"id":"gt-2g15j","title":"Digest: mol-deacon-patrol","description":"Patrol 12: Quick cycle, all quiet","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-25T17:08:11.988711-08:00","updated_at":"2025-12-27T21:26:02.9593-08:00","deleted_at":"2025-12-27T21:26:02.9593-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-2hzl4","title":"Day 2.4: Add timeout fallback for dead agents","description":"For truly dead agents that can't report their own death:\n- Daemon tracks last_seen timestamp from heartbeats\n- If no heartbeat for N minutes AND state=running, mark state=dead\n- This is fallback only, not primary state source\n\nParent: gt-d0jqp","status":"closed","priority":1,"issue_type":"task","assignee":"mayor","created_at":"2025-12-27T20:58:10.896874-08:00","created_by":"mayor","updated_at":"2025-12-28T01:56:01.080382-08:00","closed_at":"2025-12-28T01:56:01.080382-08:00","close_reason":"Implemented checkStaleAgents() and markAgentDead(). Daemon now detects agents with stale 'running' state (\u003e15min) and marks them dead.","dependencies":[{"issue_id":"gt-2hzl4","depends_on_id":"gt-39ttg","type":"blocks","created_at":"2025-12-27T20:58:48.958042-08:00","created_by":"daemon"}]}
|
||||
{"id":"gt-2jl","title":"Add bulk polecat remove command (gt polecat remove --all)","description":"When decommissioning a rig, need to remove multiple polecats one at a time. A --all or --rig flag would allow: gt polecat remove --rig gastown --force","status":"tombstone","priority":3,"issue_type":"feature","created_at":"2025-12-18T11:33:35.206637-08:00","updated_at":"2025-12-27T21:29:57.614219-08:00","deleted_at":"2025-12-27T21:29:57.614219-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"feature"}
|
||||
@@ -296,6 +298,7 @@
|
||||
{"id":"gt-54kn","title":"Test: New Router","description":"Testing bd create for mail","status":"tombstone","priority":2,"issue_type":"message","created_at":"2025-12-20T21:57:10.688733-08:00","updated_at":"2025-12-25T14:12:42.293448-08:00","deleted_at":"2025-12-25T14:12:42.293448-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"message"}
|
||||
{"id":"gt-552hb","title":"Epic: Fix swarm orchestration - witness/refinery/polecat lifecycle","description":"## Problem Statement\n\nThe bd-9115 swarm execution required excessive manual intervention from Mayor. The witness, refinery, and polecat lifecycle components didn't coordinate automatically.\n\n## What Should Have Happened\n\n```\nMayor slings 6 beads to rig\n ↓\nPolecats auto-spawn with synced beads, work pinned\n ↓\nPolecats work autonomously\n ↓\nWitness monitors progress, nudges stuck polecats\n ↓\nPolecat completes → pushes branch → signals completion\n ↓\nRefinery detects ready branch → rebases → merges → deletes branch\n ↓\nWitness detects merge → nukes polecat worktree\n ↓\nWhen all done → Witness notifies Mayor\n```\n\n## What Actually Happened\n\n1. **gt sling failed to pin beads** - polecat worktrees had stale JSONL\n2. **Manual intervention** - had to checkout latest JSONL, pin, nudge each polecat\n3. **Witness was passive** - never nudged or checked on polecats\n4. **Refinery waited for requests** - didn't detect completed branches\n5. **Manual lifecycle** - Mayor had to close beads, nuke polecats\n6. **Manual merge coordination** - had to mail refinery with merge order\n\n## Root Cause: Branch Hysteresis\n\nPolecat branches persist across runs and drift from main/beads-sync:\n- `polecat/foo` created weeks ago from old main\n- New work slung to `polecat/foo` \n- JSONL in branch doesn't have new beads\n- Pin fails\n\n## Open Questions\n\n### Q1: Fresh branches per run?\nShould each polecat spawn create a NEW branch from latest main/beads-sync?\n```\ngt sling bd-xxx rig\n → creates polecat/foo-20251227-1630 from origin/main\n → ensures JSONL is current\n → after merge, branch deleted forever\n```\nPros: No drift, always current\nCons: Branch proliferation, naming complexity\n\n### Q2: Rebase existing branches?\nOr should we rebase persistent polecat branches before work?\n```\ngt sling bd-xxx rig/foo\n → git fetch origin\n → git rebase origin/main\n → now JSONL is current\n```\nPros: Keeps simple naming\nCons: Rebase can fail with conflicts\n\n### Q3: Just cherry-pick JSONL?\nMinimal fix - grab latest JSONL before pinning:\n```\ngit checkout origin/beads-sync -- .beads/issues.jsonl\nbd import # refresh DB\nbd pin bd-xxx\n```\nPros: Simple, surgical\nCons: Doesn't fix code drift, just beads\n\n### Q4: Shared beads DB?\nCould polecats share a DB (via symlink or sqlite over network)?\nPros: Always consistent\nCons: Locking complexity, daemon conflicts\n\n### Q5: Who owns polecat lifecycle?\n- Witness? (current assumption)\n- Refinery? (after merge)\n- gt sling? (on spawn)\n- New \"foreman\" role?\n\n## Proposed Solutions\n\nSee child issues for implementation details. Need to resolve open questions first.\n","status":"pinned","priority":1,"issue_type":"epic","assignee":"mayor","created_at":"2025-12-27T16:40:10.727376-08:00","created_by":"mayor","updated_at":"2025-12-27T17:53:02.90996-08:00","dependencies":[{"issue_id":"gt-552hb","depends_on_id":"gt-ake0m","type":"blocks","created_at":"2025-12-27T16:41:15.984785-08:00","created_by":"daemon"},{"issue_id":"gt-552hb","depends_on_id":"gt-dtw9u","type":"blocks","created_at":"2025-12-27T16:41:16.036312-08:00","created_by":"daemon"},{"issue_id":"gt-552hb","depends_on_id":"gt-qpwv4","type":"blocks","created_at":"2025-12-27T16:41:16.08566-08:00","created_by":"daemon"},{"issue_id":"gt-552hb","depends_on_id":"gt-6qyt1","type":"blocks","created_at":"2025-12-27T16:41:16.134048-08:00","created_by":"daemon"},{"issue_id":"gt-552hb","depends_on_id":"gt-budeb","type":"blocks","created_at":"2025-12-27T16:41:16.182989-08:00","created_by":"daemon"},{"issue_id":"gt-552hb","depends_on_id":"gt-5j3ia","type":"blocks","created_at":"2025-12-27T16:41:16.231484-08:00","created_by":"daemon"}]}
|
||||
{"id":"gt-55kx","title":"Build activity stream component","description":"Bubbletea component showing scrollable activity stream for a selected worker. Shows mutation events with timestamps, symbols, and issue titles. Displayed when user expands/selects a worker.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T16:27:17.091004-08:00","updated_at":"2025-12-23T16:27:17.091004-08:00","dependencies":[{"issue_id":"gt-55kx","depends_on_id":"gt-3p77","type":"blocks","created_at":"2025-12-23T16:27:38.640018-08:00","created_by":"daemon"},{"issue_id":"gt-55kx","depends_on_id":"gt-rivr","type":"parent-child","created_at":"2025-12-23T16:28:30.857389-08:00","created_by":"daemon"}]}
|
||||
{"id":"gt-560ge","title":"Extract duplicated processExists function to shared package","description":"The processExists function is duplicated identically in:\n- internal/witness/manager.go (lines 136-144)\n- internal/refinery/manager.go (lines 646-654)\n\nBoth have identical implementations for checking if a process exists via signal(0).\n\nSuggestion: Extract to internal/process or internal/util package.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-28T15:43:08.119167-08:00","created_by":"gastown/crew/max","updated_at":"2025-12-28T15:43:08.119167-08:00"}
|
||||
{"id":"gt-56et5","title":"Digest: mol-deacon-patrol","description":"Patrol 14: All healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T13:32:21.006139-08:00","updated_at":"2025-12-25T13:32:21.006139-08:00","closed_at":"2025-12-25T13:32:21.006104-08:00"}
|
||||
{"id":"gt-56fv","title":"Merge: gt-5af.2","description":"branch: polecat/Doof\ntarget: main\nsource_issue: gt-5af.2\nrig: gastown","status":"tombstone","priority":1,"issue_type":"merge-request","created_at":"2025-12-19T17:36:24.884931-08:00","updated_at":"2025-12-27T21:27:22.708874-08:00","deleted_at":"2025-12-27T21:27:22.708874-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"merge-request"}
|
||||
{"id":"gt-56po","title":"Merge: gt-g44u.2","description":"branch: polecat/Doof\ntarget: main\nsource_issue: gt-g44u.2\nrig: gastown","status":"tombstone","priority":0,"issue_type":"merge-request","created_at":"2025-12-19T16:03:10.388461-08:00","updated_at":"2025-12-27T21:27:22.385154-08:00","deleted_at":"2025-12-27T21:27:22.385154-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"merge-request"}
|
||||
@@ -407,6 +410,7 @@
|
||||
{"id":"gt-6tf","title":"Implement gt harness create command","description":"Add scaffolding command to create a new harness:\n- gt harness create [path]\n- Creates config/, mayor/, .beads/redirect (optional)\n- Optionally initializes git\n- Generates CLAUDE.md with Mayor role\n- Could also offer a template repo alternative","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-17T17:15:34.342552-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-6tf","depends_on_id":"gt-cr9","type":"blocks","created_at":"2025-12-17T17:15:51.845578-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"}
|
||||
{"id":"gt-6vks","title":"Bug: LIFECYCLE messages use literal \u003crig\u003e placeholder","description":"Found stale LIFECYCLE messages addressed to @\u003crig\u003e/witness instead of actual rig names like @gastown/witness. Template substitution not happening.\n\nExamples found:\n- gm-bay: LIFECYCLE: polecat requesting shutdown (to @\u003crig\u003e/witness)\n- gm-7du, gm-94e, gm-u5x, gm-89b: same issue\n\nFix: Ensure rig name is substituted in lifecycle mail templates.","status":"tombstone","priority":2,"issue_type":"bug","created_at":"2025-12-20T03:12:28.146613-08:00","updated_at":"2025-12-27T21:29:56.855943-08:00","deleted_at":"2025-12-27T21:29:56.855943-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"bug"}
|
||||
{"id":"gt-6wyeg","title":"Digest: mol-deacon-patrol","description":"Patrol 21: all healthy, no lifecycle requests, 4 in-progress issues noted, handoff triggered at threshold","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-25T19:01:52.406307-08:00","updated_at":"2025-12-27T21:26:02.789713-08:00","deleted_at":"2025-12-27T21:26:02.789713-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-6xe2u","title":"Centralize session name construction patterns","description":"Session name patterns like fmt.Sprintf(\"gt-%s-\u003crole\u003e\", rigName) scattered across files:\n- witness.go:287\n- refinery.go:383\n- start.go:275\n- crew_helpers.go:68-70\n\nAlso: sessionToAgentID logic duplicated in sling.go:365-391 and handoff.go:374-402.\n\nSuggestion: Create session_names.go with WitnessSessionName(), RefinerySessionName(), CrewSessionName() functions plus AgentIdentity type with FromSessionName()/ToSessionName() methods.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-28T15:43:10.481903-08:00","created_by":"gastown/crew/max","updated_at":"2025-12-28T15:43:10.481903-08:00"}
|
||||
{"id":"gt-6y5b","title":"Polecat mood command and status line display","description":"CLI and status line support for polecat mood.\n\n## CLI Command\n```\ngt polecat mood \u003cname\u003e \u003cemoji\u003e # Set mood\ngt polecat mood \u003cname\u003e # Get mood\n```\n\nSets GT_MOOD environment variable in the polecat's tmux session.\n\n## Status Line Integration\nUpdate runWorkerStatusLine() to read mood:\n```go\nmood, _ := t.GetEnvironment(session, \"GT_MOOD\")\nif mood != \"\" {\n icon = mood // Use mood emoji instead of default\n} else {\n icon = AgentTypeIcons[AgentPolecat] // Fallback to 😺\n}\n```\n\n## Storage\nMood stored in tmux session environment (ephemeral, per-session).\nNo persistence needed - mood is reassessed each patrol cycle.\n\nDepends on: gt-u818 (plugin system)","status":"tombstone","priority":2,"issue_type":"feature","created_at":"2025-12-21T16:17:14.111807-08:00","updated_at":"2025-12-27T21:29:56.553925-08:00","dependencies":[{"issue_id":"gt-6y5b","depends_on_id":"gt-u818","type":"blocks","created_at":"2025-12-21T16:17:20.53466-08:00","created_by":"daemon"}],"deleted_at":"2025-12-27T21:29:56.553925-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"feature"}
|
||||
{"id":"gt-6y8u","title":"Deacon patrol: Janitorial cleanup patterns","description":"Patterns discovered during town cleanup that could be automated in Deacon's patrol step:\n\n## Stale Issue Detection\n\n1. **Stale in_progress issues** - Issues marked in_progress for \u003eN days without activity\n - Example: 9 issues in_progress, some likely complete\n - Action: Report list, optionally nudge assignee\n\n2. **Duplicate issues** - Same title with different IDs\n - Example: gt-87jz and gt-qp2w both 'mol-witness-patrol'\n - Action: Flag for human review\n\n3. **Orphaned issues** - Referenced in commits but still open\n - bd doctor already detects: 'hq-65jk (commit f9e9034d)'\n - Action: Report, suggest closing\n\n4. **Stale test messages** - Messages with 'test' in title older than N days\n - Example: gt-54kn, gt-1ero, gt-nriy, gt-wrw2, gt-pnu4, gt-g1ud, gt-b5sh\n - Action: Auto-close or flag\n\n## File System Cleanup\n\n5. **Log file accumulation** - daemon.log and rotated .log.gz files\n - Found 8+ log files across rigs\n - Action: Rotate, compress, delete old (\u003e7 days)\n\n6. **Beads directory size** - Town .beads/ is 65MB\n - Action: Monitor growth, alert on threshold\n\n## Database Health\n\n7. **Legacy database fingerprints** - Older DBs without fingerprint\n - bd doctor warns about this\n - Action: Report, suggest migration\n\n## Cross-Reference Integrity\n\n8. **Gastown↔Beads issue sync** - Issues filed in wrong project\n - Example: gt-8tmz.* describes Beads work but no bd-* issues\n - Action: Detect cross-references, verify both sides exist\n\n## Implementation Notes\n\nThese could be added to mol-deacon-patrol.formula.yaml as cleanup substeps:\n- Daily: Log rotation, stale issue report\n- Weekly: Duplicate detection, orphan check\n- Monthly: Size monitoring, archive old closed issues","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-24T13:25:03.212307-08:00","updated_at":"2025-12-24T13:25:03.212307-08:00","dependencies":[{"issue_id":"gt-6y8u","depends_on_id":"gt-ingm","type":"relates-to","created_at":"2025-12-24T13:25:18.850583-08:00","created_by":"daemon"}]}
|
||||
{"id":"gt-6yq9","title":"Digest: mol-deacon-patrol @ 2025-12-24 19:24","description":"Patrol 8: quiet, 8 sessions healthy","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-24T19:24:22.913616-08:00","updated_at":"2025-12-27T21:26:05.28903-08:00","deleted_at":"2025-12-27T21:26:05.28903-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
@@ -598,7 +602,7 @@
|
||||
{"id":"gt-9a2.8","title":"CloudRunOutpost: Basic implementation","description":"## Overview\n\nBasic CloudRunOutpost implementation. Persistent connections and cost tracking are separate tasks.\n\n## Implementation\n\n```go\ntype CloudRunOutpost struct {\n name string\n project string\n region string\n service string\n maxWorkers int\n client *WorkClient\n workers map[string]*CloudRunWorker\n mu sync.RWMutex\n}\n\nfunc NewCloudRunOutpost(cfg OutpostConfig) (*CloudRunOutpost, error) {\n serviceURL := fmt.Sprintf(\n \"https://%s-%s.a.run.app\",\n cfg.Service, cfg.Region,\n )\n return \u0026CloudRunOutpost{\n name: cfg.Name,\n project: cfg.Project,\n region: cfg.Region,\n service: cfg.Service,\n maxWorkers: cfg.MaxWorkers,\n client: NewWorkClient(serviceURL),\n workers: make(map[string]*CloudRunWorker),\n }, nil\n}\n```\n\n## Spawn\n\n```go\nfunc (o *CloudRunOutpost) Spawn(issue string, cfg WorkerConfig) (Worker, error) {\n req := WorkRequest{\n IssueID: issue,\n Rig: RigConfig{URL: cfg.RigURL, Branch: cfg.GitBranch},\n Beads: BeadsConfig{URL: cfg.BeadsURL, Branch: \"beads-sync\"},\n Branch: \"polecat/\" + issue,\n }\n \n events, err := o.client.DispatchWork(context.Background(), req)\n if err != nil {\n return nil, err\n }\n \n worker := \u0026CloudRunWorker{\n id: uuid.New().String(),\n outpost: o.name,\n issue: issue,\n events: events,\n status: WorkerStatusWorking,\n }\n \n o.mu.Lock()\n o.workers[worker.id] = worker\n o.mu.Unlock()\n \n go worker.monitor()\n return worker, nil\n}\n```\n\n## CloudRunWorker\n\n```go\ntype CloudRunWorker struct {\n id string\n outpost string\n issue string\n status WorkerStatus\n events \u003c-chan WorkEvent\n logs []string\n}\n\nfunc (w *CloudRunWorker) Attach() error {\n return errors.New(\"Cloud Run workers do not support attach\")\n}\n\nfunc (w *CloudRunWorker) Logs() (io.Reader, error) {\n return strings.NewReader(strings.Join(w.logs, \"\\n\")), nil\n}\n```\n\n## Files\n\n- `internal/outpost/cloudrun.go`\n\n## Dependencies\n\nDepends on: gt-9a2.1 (interfaces), gt-9a2.12 (HTTP client)\nBlocks: gt-9a2.13 (persistent connections), gt-9a2.14 (cost tracking)","status":"tombstone","priority":3,"issue_type":"task","created_at":"2025-12-16T18:03:06.803401-08:00","updated_at":"2025-12-27T21:29:57.692806-08:00","dependencies":[{"issue_id":"gt-9a2.8","depends_on_id":"gt-9a2","type":"parent-child","created_at":"2025-12-16T18:03:06.805524-08:00","created_by":"daemon"},{"issue_id":"gt-9a2.8","depends_on_id":"gt-9a2.1","type":"blocks","created_at":"2025-12-16T18:03:46.081721-08:00","created_by":"daemon"},{"issue_id":"gt-9a2.8","depends_on_id":"gt-9a2.12","type":"blocks","created_at":"2025-12-16T18:15:54.915831-08:00","created_by":"daemon"}],"deleted_at":"2025-12-27T21:29:57.692806-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-9a2.9","title":"Outpost assignment policy: Smart work routing","description":"## Overview\n\nPolicy engine for deciding which outpost gets which work.\n\n## Policy Configuration\n\n```yaml\npolicy:\n # Default order of preference\n default_preference: [local, gce-burst, cloudrun-burst]\n \n # Rules applied in order\n rules:\n # Background work → Cloud Run (cheap)\n - condition: \"priority \u003e= P3\"\n prefer: cloudrun-burst\n \n # Long tasks → VM (persistent)\n - condition: \"estimated_duration \u003e 30m\"\n prefer: gce-burst\n \n # Specific epic → specific outpost\n - condition: \"epic == gt-abc\"\n prefer: local\n```\n\n## Implementation\n\n```go\ntype AssignmentPolicy struct {\n DefaultPreference []string\n Rules []PolicyRule\n}\n\ntype PolicyRule struct {\n Condition string // Simple expression\n Prefer string // Outpost name\n Require string // Must use this outpost\n}\n\nfunc (p *AssignmentPolicy) SelectOutpost(\n issue Issue, \n outposts map[string]Outpost,\n) Outpost {\n // Check rules in order\n for _, rule := range p.Rules {\n if rule.Matches(issue) {\n if op, ok := outposts[rule.Prefer]; ok {\n if op.ActiveWorkers() \u003c op.MaxWorkers() {\n return op\n }\n }\n }\n }\n \n // Fall back to default preference\n for _, name := range p.DefaultPreference {\n if op, ok := outposts[name]; ok {\n if op.ActiveWorkers() \u003c op.MaxWorkers() {\n return op\n }\n }\n }\n \n return nil // All outposts at capacity\n}\n```\n\n## Condition Language\n\nSimple expressions, not a full DSL:\n\n```\npriority \u003e= P3\npriority == P0\nestimated_duration \u003e 30m\nepic == gt-abc\ntype == bug\nlabel contains \"urgent\"\n```\n\n## Files\n\n- `internal/outpost/policy.go`\n- `internal/outpost/condition.go`\n\nDepends on: gt-9a2.3 (config)","status":"tombstone","priority":3,"issue_type":"task","created_at":"2025-12-16T18:03:21.08101-08:00","updated_at":"2025-12-27T21:29:57.684514-08:00","dependencies":[{"issue_id":"gt-9a2.9","depends_on_id":"gt-9a2","type":"parent-child","created_at":"2025-12-16T18:03:21.083256-08:00","created_by":"daemon"},{"issue_id":"gt-9a2.9","depends_on_id":"gt-9a2.3","type":"blocks","created_at":"2025-12-16T18:03:46.300288-08:00","created_by":"daemon"}],"deleted_at":"2025-12-27T21:29:57.684514-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-9ae69","title":"mol-deacon-patrol","description":"Mayor's daemon patrol loop.\n\nThe Deacon is the Mayor's background process that runs continuously,\nhandling callbacks, monitoring rig health, and performing cleanup.\nEach patrol cycle runs these steps in sequence, then loops or exits.\n","status":"tombstone","priority":2,"issue_type":"epic","created_at":"2025-12-25T13:43:08.241676-08:00","updated_at":"2025-12-25T14:12:41.853879-08:00","deleted_at":"2025-12-25T14:12:41.853879-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"epic"}
|
||||
{"id":"gt-9ar8x","title":"Polecat identity confusion leads to direct main commits","description":"When polecats spawn without proper identity (due to gt-si6am and gt-y41ep):\n1. They think they're mayor\n2. They may commit from wrong directory (mayor/rig instead of polecats/\u003cname\u003e)\n3. Work goes directly to main, bypassing merge queue\n\nObserved: slit pushed 'gt polecat recycle' directly to main instead of its branch\n\nRoot cause: \n- gt-si6am: Wrong CLAUDE.md template (says 'Mayor Rig Context')\n- gt-y41ep: Env vars not exported (falls back to mayor detection)\n\nImpact: CRITICAL - merge queue entirely bypassed, no refinery review","status":"open","priority":0,"issue_type":"bug","created_at":"2025-12-28T14:18:37.061075-08:00","created_by":"mayor","updated_at":"2025-12-28T14:18:37.061075-08:00","dependencies":[{"issue_id":"gt-9ar8x","depends_on_id":"gt-si6am","type":"blocks","created_at":"2025-12-28T14:18:44.032422-08:00","created_by":"daemon"},{"issue_id":"gt-9ar8x","depends_on_id":"gt-y41ep","type":"blocks","created_at":"2025-12-28T14:18:44.060806-08:00","created_by":"daemon"}]}
|
||||
{"id":"gt-9ar8x","title":"Polecat identity confusion leads to direct main commits","description":"When polecats spawn without proper identity (due to gt-si6am and gt-y41ep):\n1. They think they're mayor\n2. They may commit from wrong directory (mayor/rig instead of polecats/\u003cname\u003e)\n3. Work goes directly to main, bypassing merge queue\n\nObserved: slit pushed 'gt polecat recycle' directly to main instead of its branch\n\nRoot cause: \n- gt-si6am: Wrong CLAUDE.md template (says 'Mayor Rig Context')\n- gt-y41ep: Env vars not exported (falls back to mayor detection)\n\nImpact: CRITICAL - merge queue entirely bypassed, no refinery review","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-12-28T14:18:37.061075-08:00","created_by":"mayor","updated_at":"2025-12-28T15:34:17.811462-08:00","closed_at":"2025-12-28T15:34:17.811462-08:00","close_reason":"Root causes fixed: gt-si6am (template path) and gt-y41ep (env export). Polecats now get correct identity.","dependencies":[{"issue_id":"gt-9ar8x","depends_on_id":"gt-si6am","type":"blocks","created_at":"2025-12-28T14:18:44.032422-08:00","created_by":"daemon"},{"issue_id":"gt-9ar8x","depends_on_id":"gt-y41ep","type":"blocks","created_at":"2025-12-28T14:18:44.060806-08:00","created_by":"daemon"}]}
|
||||
{"id":"gt-9bpji","title":"Digest: mol-deacon-patrol","description":"P20: stable - handoff after 20 patrols","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-25T20:00:46.97186-08:00","updated_at":"2025-12-27T21:26:02.343606-08:00","deleted_at":"2025-12-27T21:26:02.343606-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-9d5zz","title":"Digest: mol-deacon-patrol","description":"Patrol 11: All clear","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-25T00:03:13.84255-08:00","updated_at":"2025-12-27T21:26:04.001681-08:00","deleted_at":"2025-12-27T21:26:04.001681-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-9e8q","title":"Digest: mol-deacon-patrol","description":"Patrol 14","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-24T23:10:11.832142-08:00","updated_at":"2025-12-27T21:26:04.425053-08:00","deleted_at":"2025-12-27T21:26:04.425053-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
@@ -788,12 +792,14 @@
|
||||
{"id":"gt-caih","title":"Witness handoff bead state persistence","description":"Implement state persistence for Witness across wisp cycles.\n\n## Problem\nWisps burn between cycles, but Witness needs to remember:\n- Which workers have been nudged\n- How many times (nudge_count)\n- When was last nudge\n- Last observed activity\n\n## Solution\nWitness handoff bead with worker_states field:\n\n```json\n{\n \"id\": \"gt-witness-state\",\n \"type\": \"handoff\",\n \"assignee\": \"\u003crig\u003e/witness\",\n \"pinned\": true,\n \"worker_states\": {\n \"furiosa\": {\n \"issue\": \"gt-123\",\n \"nudge_count\": 2,\n \"last_nudge\": \"2024-12-22T10:00:00Z\"\n }\n },\n \"last_patrol\": \"2024-12-22T10:05:00Z\"\n}\n```\n\n## Implementation\n1. On patrol start: bd show \u003cwitness-handoff-id\u003e to load state\n2. During patrol: update in-memory state\n3. On save-state step: bd update to persist\n4. State survives wisp burn/squash\n\n## Depends on\n- gt-83k0 (mol-witness-patrol definition)","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-22T16:42:57.427131-08:00","updated_at":"2025-12-27T21:29:53.183672-08:00","dependencies":[{"issue_id":"gt-caih","depends_on_id":"gt-83k0","type":"blocks","created_at":"2025-12-22T16:43:59.609821-08:00","created_by":"daemon"}],"deleted_at":"2025-12-27T21:29:53.183672-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-camx5","title":"Campaign: Large-Scale Work Graph Execution","description":"A Campaign is a Molecule-wrapped Epic graph ready for orchestrated execution.\n\n## Concept\n\nCampaign = Molecule + Epics + Dependency Graph + Execution Strategy\n\nKey properties:\n1. **Work graph**: Linked epics with dependency edges (possibly from different authors)\n2. **Combinators as glue**: \u003e\u003e, |, wrap define bridging/shaping between epics\n3. **Molecule shell**: Provides execution state, persistence across sessions\n4. **Witness-aware**: Can be parallelized across polecats on independent branches\n5. **Single-rig scoped**: One rig executes it (spans sessions/polecats)\n\n## The \"Maximum Speed\" Model\n\nWitness becomes a scheduler that:\n- Watches campaign progress\n- Identifies ready nodes (all dependencies satisfied)\n- Spawns/assigns polecats to ready nodes\n- Respects parallelism constraints\n- Handles failures (retry? skip? escalate?)\n\n## Where Campaign Fits in MEOW\n\nCampaign is the convergence point where work-tracking meets workflow-execution:\n- An Epic-of-Epics (work dimension)\n- A Molecule (workflow dimension)\n\n## Open Questions\n\n1. Campaign creation UX - manual wire vs declare intent?\n2. Partial completion - can you commit progress and resume?\n3. Distinct entity type or molecule with type=\"campaign\"?\n4. Cross-rig campaigns - can graph span multiple rigs?\n\n## Related\n\n- docs/formula_evolution.md - original discussion\n- gt-8tmz - molecule algebra (foundation)\n","status":"open","priority":4,"issue_type":"epic","created_at":"2025-12-26T01:00:51.274207-08:00","updated_at":"2025-12-27T14:20:33.93319-08:00"}
|
||||
{"id":"gt-caz","title":"Timed Beads: Scheduled recurring work","description":"## Summary\n\nTimed beads wake up periodically and get injected into the ready queue by the daemon.\n\n## Schema Extension\n\n```yaml\nid: gt-weekly-sync\ntype: task # or sentinel\nschedule: \"0 9 * * 1\" # cron: Monday 9am\n# OR\ninterval: 24h # every 24 hours\ntier: haiku # cheap model for routine checks\nnext_run: 2025-12-20T09:00:00Z\n```\n\n## Daemon Integration\n\nDaemon heartbeat loop:\n1. Check timed beads where `next_run \u003c= now`\n2. For each due bead:\n - Inject into ready queue (set status to open if needed)\n - Update `next_run` based on schedule/interval\n3. Witnesses pick up work via `bd ready`\n\n## Use Cases\n\n- Weekly team sync reminders\n- Daily health checks\n- Periodic cleanup tasks\n- Scheduled reports\n\n## Interaction with Pinned Beads\n\nA pinned bead can be timed - it wakes up periodically but never closes.\nThis is how you model \"background services\" in Gas Town.","status":"tombstone","priority":2,"issue_type":"epic","created_at":"2025-12-18T18:07:39.665294-08:00","updated_at":"2025-12-27T21:29:57.143372-08:00","deleted_at":"2025-12-27T21:29:57.143372-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"epic"}
|
||||
{"id":"gt-cbjzr","title":"Break up long functions in start.go","description":"Several functions in internal/cmd/start.go exceed recommended length:\n- runStart: 126 lines (129-255) - handles mayor, deacon, rig agents, crew auto-start\n- runStartCrew: 155 lines (638-792) - handles crew target parsing, workspace, session\n- cleanupPolecats: 91 lines (543-634) - handles polecat cleanup loop\n\nSuggestion: Extract into focused helpers:\n- runStart → startMayorAndDeacon(), startRigAgents(), startConfiguredCrew()\n- runStartCrew → parseCrewTarget(), ensureCrewWorkspace(), startOrAttachCrewSession()\n- cleanupPolecats → cleanupSinglePolecat()","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-28T15:43:11.539536-08:00","created_by":"gastown/crew/max","updated_at":"2025-12-28T15:43:11.539536-08:00"}
|
||||
{"id":"gt-cbrv","title":"Digest: mol-deacon-patrol @ 2025-12-24 19:46","description":"Patrol 12: All healthy","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-24T19:46:24.801062-08:00","updated_at":"2025-12-27T21:26:05.095851-08:00","deleted_at":"2025-12-27T21:26:05.095851-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-cbyt7","title":"Digest: mol-deacon-patrol","description":"Patrol 19: Nominal","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-24T23:53:41.512678-08:00","updated_at":"2025-12-27T21:26:04.075351-08:00","deleted_at":"2025-12-27T21:26:04.075351-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-cd5bi","title":"Digest: mol-deacon-patrol","description":"Patrol 15: routine","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-26T18:45:00.403136-08:00","updated_at":"2025-12-26T18:45:00.403136-08:00","closed_at":"2025-12-26T18:45:00.403089-08:00"}
|
||||
{"id":"gt-cejv9","title":"Digest: mol-deacon-patrol","description":"Patrol 2: All healthy, no events","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-24T23:59:38.421743-08:00","updated_at":"2025-12-27T21:26:04.058981-08:00","deleted_at":"2025-12-27T21:26:04.058981-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-cekg","title":"Wisp squash design: cadences, rules, templates","description":"Design how wisps squash to digests: When to squash (cadences), what to include (summary templates), retention rules. Currently under-designed. Should cover patrol wisps (squash per cycle) and work wisps (squash on completion). Consider allowing formulas to define squash templates.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T18:45:27.315937-08:00","updated_at":"2025-12-23T18:45:27.315937-08:00"}
|
||||
{"id":"gt-cgl3u","title":"Digest: mol-deacon-patrol","description":"Patrol 5: 9 sessions healthy","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-25T07:25:56.412065-08:00","updated_at":"2025-12-27T21:26:03.651889-08:00","deleted_at":"2025-12-27T21:26:03.651889-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-chk7z","title":"Extract interfaces for Git and Tmux to enable testing","description":"Git and Tmux packages use concrete types that make testing difficult:\n\ninternal/git/git.go:\n- Git struct with 40+ methods\n- No interface - tests must use real git\n- Many packages directly depend on concrete type\n\ninternal/tmux/tmux.go:\n- Tmux struct with 30+ methods\n- No interface - tests must use real tmux\n- Contains Claude-specific detection logic mixed in\n\nSuggestion:\n1. Extract GitOperations interface with common operations\n2. Extract TmuxRunner interface for subprocess operations\n3. Allow mock injection for unit tests\n4. Move Claude-specific tmux logic to internal/claude/","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-28T15:43:16.088336-08:00","created_by":"gastown/crew/max","updated_at":"2025-12-28T15:43:16.088336-08:00"}
|
||||
{"id":"gt-ci84","title":"Deacon patrol wisps should use town beads, not gastown rig beads","description":"## Problem\n\nThe deacon is a town-level role but stores patrol wisps in gastown/mayor/rig/.beads/ (see internal/cmd/prime.go:691). This fails for users who don't have the gastown rig installed.\n\n## Correct Architecture\n\nDeacon -\u003e ~/gt/.beads-wisp/ (town-level, no rig dependency)\n\nTown-level ephemeral work (deacon patrols) should use town wisp storage, just like rig-level ephemeral work (witness/refinery patrols) uses rig wisp storage.\n\n## Implementation Tasks\n\n### 1. Town Setup (gt install / gt town init)\n\n- Create ~/gt/.beads-wisp/ directory during town initialization\n- Initialize as git repo (for local commits, not synced)\n- Add config.yaml with wisp: true\n- Ensure .beads-wisp/ is gitignored at town level\n\nFiles:\n- internal/cmd/install.go (or equivalent town init)\n- internal/town/manager.go (if exists)\n\n### 2. Rig Setup (gt rig init)\n\nAlready creates \u003crig\u003e/.beads-wisp/ - verify this is working:\n- internal/rig/manager.go:375 (beadsDir := filepath.Join(rigPath, \".beads-wisp\"))\n- internal/rig/manager.go:394 (ensureGitignoreEntry)\n\n### 3. Deacon Code Fixes\n\nUpdate deacon to use town wisp storage:\n- internal/cmd/prime.go:691 - change rigBeadsDir to townWispDir\n- internal/cmd/sling.go - route deacon wisps to town level\n- internal/daemon/daemon.go - any deacon-specific wisp handling\n\n### 4. gt doctor Checks\n\nAdd/update doctor checks for wisp directories:\n- internal/doctor/wisp_check.go - already checks rig wisps\n- Add TownWispCheck to verify ~/gt/.beads-wisp/ exists\n- Add TownWispGitCheck to verify it is a valid git repo\n- Update existing checks to handle both town and rig levels\n\nFiles:\n- internal/doctor/wisp_check.go (extend for town level)\n- internal/doctor/checks.go (register new checks)\n\n### 5. Documentation\n\n- docs/beads-data-plane.md - already updated with three-tier architecture\n- Verify wisp-architecture.md reflects town-level wisps\n\n## Testing\n\n1. Fresh gt install should create ~/gt/.beads-wisp/\n2. gt doctor should pass with no rig installed\n3. Deacon patrol should work without gastown rig\n4. gt sling patrol deacon/ --wisp should route to town wisps","status":"tombstone","priority":1,"issue_type":"bug","created_at":"2025-12-23T14:28:03.636334-08:00","updated_at":"2025-12-27T21:29:52.982224-08:00","deleted_at":"2025-12-27T21:29:52.982224-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"bug"}
|
||||
{"id":"gt-cicem","title":"Digest: mol-deacon-patrol","description":"Patrol 17: All healthy.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-28T03:10:23.403733-08:00","updated_at":"2025-12-28T03:10:23.403733-08:00","closed_at":"2025-12-28T03:10:23.403694-08:00","close_reason":"Squashed from 9 wisps"}
|
||||
{"id":"gt-cik","title":"Overseer Crew: User-managed persistent workspaces","description":"## Overview\n\nCrew workers are the overseer's (human's) personal workspaces within a rig. Unlike polecats which are witness-managed and ephemeral, crew workers are:\n\n- **Persistent**: Not auto-garbage-collected\n- **User-managed**: Overseer controls lifecycle\n- **Long-lived identities**: dave, emma, fred - recognizable names\n- **Gas Town integrated**: Mail, handoff mechanics work\n- **Tmux optional**: Can work in terminal directly\n\n## Directory Structure\n\n```\n\u003crig\u003e/\n polecats/ # Managed workers (witness controls)\n refinery/ # Merge queue processor\n witness/ # Pit boss\n crew/ # Overseer's personal workspaces\n dave/ # Full clone, persistent\n emma/ # Full clone, persistent\n fred/ # Full clone, persistent\n```\n\n## Key Differences from Polecats\n\n- Location: crew/ instead of polecats/\n- Lifecycle: User-managed, not witness-managed\n- Auto-cleanup: Never (polecats auto-cleanup on swarm land)\n- Issue assignment: Optional (polecats require it)\n- Tmux: Optional (polecats require it)\n- Mail \u0026 Handoff: Yes for both\n- Identity: Persistent (polecats are ephemeral)\n\n## CLI Commands\n\n- gt crew add \u003cname\u003e [--rig \u003crig\u003e] - Create crew workspace\n- gt crew list [--rig \u003crig\u003e] - List crew workspaces\n- gt crew at \u003crig\u003e/\u003cname\u003e - Attach to workspace (start session)\n- gt crew attach \u003cname\u003e - Attach (infer rig from cwd)\n- gt crew refresh \u003cname\u003e - Handoff + restart (context cycling)\n- gt crew remove \u003cname\u003e [--force] - Remove workspace\n- gt crew status [\u003cname\u003e] - Show workspace status\n\n## Design Notes\n\n- Crew workers use full git clones (not worktrees)\n- Optional beads integration via BEADS_DIR\n- Mail-to-self handoff works for context cycling\n- No witness monitoring or nudging\n- No automatic issue assignment required\n\n## Background\n\nUsers often maintain separate repo clones for serial agent work. This is tedious to set up manually. Crew workspaces bring these into Gas Town's infrastructure while keeping user control.","status":"tombstone","priority":1,"issue_type":"epic","created_at":"2025-12-16T16:47:37.529887-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"epic"}
|
||||
@@ -815,8 +821,8 @@
|
||||
{"id":"gt-cr0","title":"Consolidate design docs into beads descriptions","description":"The markdown design docs (swarm-shutdown-design.md, polecat-beads-access-design.md, mayor-handoff-design.md) will decay. Extract key decisions and prompting templates into the beads descriptions themselves, then archive or remove the markdown files. Beads are the source of truth.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-15T20:24:05.45131-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"}
|
||||
{"id":"gt-cr9","title":"Harness Design \u0026 Documentation","description":"The harness (Gas Town installation directory) needs design cleanup, documentation, and tooling.\n\n## Current Problems\n\n1. **Shared harness confusion**: ~/ai is shared by PGT and GGT with overlapping structures\n - PGT uses ~/ai/mayor/ as town-level Mayor home\n - GGT Mayor works in ~/ai/mayor/rigs/gastown/\n - ~/ai/gastown/ has both .gastown/ (PGT) and mayor/ (git clone)\n\n2. **Beads redirect**: ~/ai/.beads/redirect → mayor/rigs/gastown/.beads\n - This is specific to GGT's decentralized structure\n - Should be documented as an example\n\n3. **architecture.md**: Verify rig-level mayor/rig/ is shown correctly\n\n4. **No harness creation tooling**: Users must manually set up\n\n## Proposed Work\n\n- Document what a harness IS (installation directory)\n- Create harness creation command or template repo\n- Update architecture.md if needed \n- Create example harness configuration for docs\n- Resolve PGT/GGT sharing issue","status":"tombstone","priority":1,"issue_type":"epic","created_at":"2025-12-17T17:15:08.769961-08:00","updated_at":"2025-12-27T21:29:54.253374-08:00","deleted_at":"2025-12-27T21:29:54.253374-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"epic"}
|
||||
{"id":"gt-crew-gastown-jack","title":"Crew worker jack in gastown - human-managed persistent workspace.","description":"Crew worker jack in gastown - human-managed persistent workspace.\n\nrole_type: crew\nrig: gastown\nagent_state: idle\nhook_bead: null\nrole_bead: gt-crew-gastown-jack-role","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-28T10:06:26.487688-08:00","created_by":"gastown/crew/max","updated_at":"2025-12-28T10:06:26.487688-08:00"}
|
||||
{"id":"gt-crew-gastown-joe","title":"gt-crew-gastown-joe","description":"gt-crew-gastown-joe\n\nrole_type: \nrig: null\nagent_state: running\nhook_bead: null\nrole_bead: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-28T10:04:05.03443-08:00","created_by":"gastown/crew/joe","updated_at":"2025-12-28T12:49:18.335717-08:00"}
|
||||
{"id":"gt-crew-gastown-max","title":"gt-crew-gastown-max","description":"gt-crew-gastown-max\n\nrole_type: crew\nrig: gastown\nagent_state: running\nhook_bead: null\nrole_bead: gt-crew-gastown-max-role","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-28T09:51:58.720059-08:00","created_by":"gastown/crew/max","updated_at":"2025-12-28T11:03:54.19596-08:00"}
|
||||
{"id":"gt-crew-gastown-joe","title":"gt-crew-gastown-joe","description":"gt-crew-gastown-joe\n\nrole_type: \nrig: null\nagent_state: running\nhook_bead: null\nrole_bead: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-28T10:04:05.03443-08:00","created_by":"gastown/crew/joe","updated_at":"2025-12-28T15:34:10.235889-08:00"}
|
||||
{"id":"gt-crew-gastown-max","title":"gt-crew-gastown-max","description":"gt-crew-gastown-max\n\nrole_type: crew\nrig: gastown\nagent_state: running\nhook_bead: null\nrole_bead: gt-crew-gastown-max-role","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-28T09:51:58.720059-08:00","created_by":"gastown/crew/max","updated_at":"2025-12-28T15:38:57.234068-08:00"}
|
||||
{"id":"gt-crh3q","title":"Digest: mol-deacon-patrol","description":"Patrol 1: all agents healthy, no callbacks, clone divergence detected (zoey 52 behind)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-28T01:26:07.334875-08:00","updated_at":"2025-12-28T01:26:07.334875-08:00","closed_at":"2025-12-28T01:26:07.334841-08:00","close_reason":"Squashed from 9 wisps"}
|
||||
{"id":"gt-csba","title":"Digest: mol-deacon-patrol","description":"Patrol 20: Routine - handoff threshold reached","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-24T22:39:00.441055-08:00","updated_at":"2025-12-27T21:26:04.515663-08:00","deleted_at":"2025-12-27T21:26:04.515663-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-csmlp","title":"Digest: mol-deacon-patrol","description":"Patrol 6: routine","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-26T18:40:07.959422-08:00","updated_at":"2025-12-26T18:40:07.959422-08:00","closed_at":"2025-12-26T18:40:07.959369-08:00"}
|
||||
@@ -851,6 +857,7 @@
|
||||
{"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":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-16T23:02:20.400818-08:00","updated_at":"2025-12-27T21:29:54.419335-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"}],"deleted_at":"2025-12-27T21:29:54.419335-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-dcxz8","title":"Digest: mol-deacon-patrol","description":"Patrol 12: All clear","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-25T00:03:31.988364-08:00","updated_at":"2025-12-27T21:26:03.98515-08:00","deleted_at":"2025-12-27T21:26:03.98515-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"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":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-19T14:13:27.432957-08:00","updated_at":"2025-12-27T21:29:54.033508-08:00","deleted_at":"2025-12-27T21:29:54.033508-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-ddw3y","title":"Extract duplicate boilerplate in molecule_lifecycle.go","description":"internal/cmd/molecule_lifecycle.go has ~50 lines duplicated:\n\nrunMoleculeBurn (lines 17-53) and runMoleculeSquash (lines 121-165) share nearly identical target detection code:\n- Get cwd\n- Find workspace\n- Parse target argument\n- Determine rig from address or role\n\nSuggestion: Extract getTargetAgentContext(args []string) (*AgentContext, error) function that handles all target detection logic.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-28T15:43:21.155883-08:00","created_by":"gastown/crew/max","updated_at":"2025-12-28T15:43:21.155883-08:00"}
|
||||
{"id":"gt-ddz7f","title":"Test Patrol Parent","description":"[RESURRECTED] This issue was deleted but recreated as a tombstone to preserve hierarchical structure.\n\nOriginal description:\nTest parent for Christmas Ornament pattern","status":"tombstone","priority":4,"issue_type":"task","created_at":"2025-12-25T02:11:13.802672-08:00","updated_at":"2025-12-27T21:29:57.775637-08:00","deleted_at":"2025-12-27T21:29:57.775637-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-deacon","title":"gt-deacon","description":"Deacon (daemon beacon) - receives mechanical heartbeats, runs town plugins and monitoring.\n\nrole_type: deacon\nrig: null\nagent_state: idle\nhook_bead: null\nrole_bead: gt-deacon-role","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-28T00:46:17.666539-08:00","created_by":"stevey","updated_at":"2025-12-28T00:46:17.666539-08:00"}
|
||||
{"id":"gt-dfeho","title":"P4: Graceful degradation without tmux","description":"Low-priority: Add graceful degradation for environments without tmux.\n\nCurrent state: Patrol formulas use tmux capture-pane for observing agent state.\n\ntmux-independent alternatives (degraded mode):\n1. Tail Claude Code session logs if available\n2. Rely solely on agent bead state (less real-time)\n3. Use claude --output-file and tail that\n4. IPC mechanisms (named pipes, sockets)\n\nNOT launch-blocking. By summer 2025, Claude Code is expected to add signaling and reflection features that will obviate tmux scraping.\n\nFor now:\n- Keep tmux as primary observation mechanism\n- Document the tmux dependency\n- Add --no-tmux flag that falls back to bead-only observation\n\nThis is P4 backlog - address after liftoff.","status":"open","priority":4,"issue_type":"task","created_at":"2025-12-27T22:02:33.397709-08:00","created_by":"mayor","updated_at":"2025-12-27T22:02:33.397709-08:00"}
|
||||
@@ -964,6 +971,7 @@
|
||||
{"id":"gt-fdbh4","title":"Digest: mol-deacon-patrol","description":"Patrol complete: cleaned 1 orphaned process, all 8 sessions healthy, no stuck wisps","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-26T15:31:06.147061-08:00","updated_at":"2025-12-27T21:26:01.469404-08:00","deleted_at":"2025-12-27T21:26:01.469404-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-ff9h","title":"Digest: mol-deacon-patrol","description":"Patrol 17: OK","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-24T21:01:37.50237-08:00","updated_at":"2025-12-27T21:26:04.886323-08:00","deleted_at":"2025-12-27T21:26:04.886323-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-fgms","title":"Simplify mail wisps: remove dual-routing, use ephemeral flag","description":"\n## Context\n\ngt-lg66 implemented dual-inbox architecture with separate .beads-wisp/ directory.\nThis was over-engineered. See bd-bkul for the simpler approach.\n\n## Work\n\nOnce beads implements bd-bkul (ephemeral flag in single db):\n\n1. Revert/simplify router.go:\n - Remove resolveWispDir()\n - Remove shouldBeEphemeral() auto-detection (beads handles this)\n - Send() just passes --ephemeral flag to bd create\n\n2. Revert/simplify mailbox.go:\n - Remove wispDir field\n - Remove listFromDir/getFromDir dual-source logic\n - Remove closeInDir dual-source logic\n - Single query, beads returns both types with Source marked\n\n3. Keep in mail.go:\n - --ephemeral flag (passed through to bd)\n - (ephemeral) display indicator\n\n4. Keep in spawn.go:\n - Ephemeral: true on lifecycle messages\n\n## Depends On\n\nbd-bkul: Simplify wisp architecture in beads\n","status":"tombstone","priority":0,"issue_type":"task","created_at":"2025-12-24T20:08:18.111862-08:00","updated_at":"2025-12-27T21:29:45.25982-08:00","deleted_at":"2025-12-27T21:29:45.25982-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-fgmw1","title":"Add tests for critical untested packages","description":"Several packages have no tests:\n\nHigh priority (critical functionality):\n- internal/lock/ - file locking\n- internal/mail/router.go, mailbox.go - agent communication\n- internal/mrqueue/ - merge request queue\n- internal/refinery/ (manager_test.go missing for complex merge logic)\n\nMedium priority:\n- internal/claude/ - settings management\n- internal/wisp/ - ephemeral workflow\n- internal/constants/ - constant values\n\nLow priority:\n- internal/style/ - terminal styling\n\nThe refinery package is especially concerning - it has complex merge, conflict, and retry logic with no tests.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-28T15:43:15.001052-08:00","created_by":"gastown/crew/max","updated_at":"2025-12-28T15:43:15.001052-08:00"}
|
||||
{"id":"gt-fgvw3","title":"Digest: mol-deacon-patrol","description":"Patrol 9: Quiet","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-25T19:16:44.542525-08:00","updated_at":"2025-12-27T21:26:02.724436-08:00","deleted_at":"2025-12-27T21:26:02.724436-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-fiu91","title":"Digest: mol-deacon-patrol","description":"Patrol 14: Mayor OK, 11 sessions","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-25T20:37:07.77565-08:00","updated_at":"2025-12-27T21:26:02.098084-08:00","deleted_at":"2025-12-27T21:26:02.098084-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-fjvo","title":"mol-code-review: Self-improving code review molecule","description":"Create a code review molecule that enables Gas Town to self-improve through automated PR review. Flywheel: review generates quality checks, discovered issues, pattern learning.","status":"tombstone","priority":1,"issue_type":"feature","created_at":"2025-12-20T21:03:10.117272-08:00","updated_at":"2025-12-27T21:29:53.618727-08:00","deleted_at":"2025-12-27T21:29:53.618727-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"feature"}
|
||||
@@ -987,6 +995,7 @@
|
||||
{"id":"gt-fuqx","title":"Merge: gt-ci84","description":"branch: polecat/slit\ntarget: main\nsource_issue: gt-ci84\nrig: gastown","status":"tombstone","priority":1,"issue_type":"merge-request","created_at":"2025-12-23T19:38:21.954136-08:00","updated_at":"2025-12-27T21:27:22.401828-08:00","deleted_at":"2025-12-27T21:27:22.401828-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"merge-request"}
|
||||
{"id":"gt-fuz6p","title":"Digest: mol-deacon-patrol","description":"Patrol 3: All healthy, quiet","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-25T00:29:38.649433-08:00","updated_at":"2025-12-27T21:26:03.927591-08:00","deleted_at":"2025-12-27T21:26:03.927591-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-fv80v","title":"Digest: mol-deacon-patrol","description":"Patrol 9: All healthy, no messages","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-25T17:58:55.897968-08:00","updated_at":"2025-12-27T21:26:02.87115-08:00","deleted_at":"2025-12-27T21:26:02.87115-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-fvuje","title":"Extract shared state load/save pattern to generic helper","description":"Nearly identical loadState/saveState methods in:\n- internal/witness/manager.go (lines 39-72)\n- internal/refinery/manager.go (lines 63-96)\n- internal/crew/manager.go (lines 257-306)\n\nAll use the same pattern: read JSON file, handle not-exists, unmarshal/marshal.\n\nSuggestion: Create a generic stateStore[T any] helper in a shared package.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-28T15:43:08.980157-08:00","created_by":"gastown/crew/max","updated_at":"2025-12-28T15:43:08.980157-08:00"}
|
||||
{"id":"gt-fw6am","title":"Digest: mol-deacon-patrol","description":"Patrol 18: healthy","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-27T20:24:57.143299-08:00","updated_at":"2025-12-27T21:26:00.010651-08:00","close_reason":"Squashed from 9 wisps","dependencies":[{"issue_id":"gt-fw6am","depends_on_id":"gt-eph-2kt","type":"parent-child","created_at":"2025-12-27T20:24:57.144064-08:00","created_by":"deacon"}],"deleted_at":"2025-12-27T21:26:00.010651-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-fy11w","title":"Daemon patrol should clean stale locks","description":"The gt daemon patrol cycle should detect and clean up stale locks.\n\n## Problem\nIf daemon crashes or there are orphaned locks, they can block operations indefinitely.\n\n## Proposed Solution\nDuring patrol cycle:\n1. Check for lock files older than threshold (e.g., 5 minutes)\n2. Verify owning process is dead (check PID if stored)\n3. Remove stale locks\n4. Log cleanup for audit","status":"open","priority":3,"issue_type":"feature","created_at":"2025-12-26T23:13:37.681972-08:00","created_by":"mayor","updated_at":"2025-12-26T23:13:37.681972-08:00"}
|
||||
{"id":"gt-fz2o1","title":"Digest: mol-deacon-patrol","description":"Patrol 5: clear","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-26T14:23:14.185469-08:00","updated_at":"2025-12-26T14:23:14.185469-08:00","closed_at":"2025-12-26T14:23:14.18543-08:00"}
|
||||
@@ -1016,6 +1025,7 @@
|
||||
{"id":"gt-gaxo.5","title":"Design Deacon molecule health-check step","description":"**Context:** After removing Go heuristics, Deacon molecule needs the logic.\n\n**New molecule step: health-scan**\n\nClaude executes:\n1. Check Witness heartbeat: gt witness status \u003crig\u003e\n2. Check Refinery heartbeat: gt refinery status \u003crig\u003e\n3. For each, assess: responsive? stuck? needs restart?\n4. If unresponsive for N cycles, send escalation mail\n\n**Key difference from Go approach:**\n- Claude makes the judgment call, not hardcoded thresholds\n- Claude can read context (what was the agent working on?)\n- Claude can ask questions or check additional signals\n- Thresholds come from molecule config, not Go constants\n\n**Deliverables:**\n- Update mol-deacon-patrol health-scan step\n- Add configurable thresholds as molecule variables\n- Test with simulated stuck agents","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-23T23:59:07.247548-08:00","updated_at":"2025-12-27T21:29:55.629245-08:00","dependencies":[{"issue_id":"gt-gaxo.5","depends_on_id":"gt-gaxo","type":"parent-child","created_at":"2025-12-23T23:59:07.248049-08:00","created_by":"daemon"}],"deleted_at":"2025-12-27T21:29:55.629245-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-gaxo.6","title":"Remove lifecycle intent parsing from Go","description":"daemon/lifecycle.go parses mail subjects with regex looking for restart/shutdown/cycle keywords, then executes actions. Fix: use structured message types in mail body instead of parsing subjects. Go reads action field, does not interpret text.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-23T23:59:15.765947-08:00","updated_at":"2025-12-27T21:29:52.72171-08:00","dependencies":[{"issue_id":"gt-gaxo.6","depends_on_id":"gt-gaxo","type":"parent-child","created_at":"2025-12-23T23:59:15.766409-08:00","created_by":"daemon"}],"deleted_at":"2025-12-27T21:29:52.72171-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-gby","title":"gt handoff: Unified agent lifecycle command","description":"## Summary\n\nUnified `gt handoff` command for ALL agent types to request lifecycle actions.\n\n## Usage\n\ngt handoff # Context-aware default\ngt handoff --shutdown # Terminate, cleanup, don't restart\ngt handoff --cycle # Restart with handoff mail\ngt handoff --restart # Fresh restart, no handoff\n\n## Context-Aware Defaults\n\n| Agent Type | Default | Reason |\n|------------|---------|--------|\n| Polecat | --shutdown | Ephemeral, work is done |\n| Witness | --cycle | Long-running, context full |\n| Refinery | --cycle | Long-running, context full |\n| Mayor | --cycle | Long-running, context full |\n| Crew | (sends mail only) | Human-managed |\n\n## What gt handoff Does\n\n1. **Verify safe to stop**\n - Git state clean (no uncommitted changes)\n - Work handed off (PR exists for polecats)\n\n2. **Send handoff mail to self** (for cycle/restart)\n - Captures current state\n - New session will read this\n\n3. **Send lifecycle request to manager**\n - Polecats/Refinery → Witness\n - Witness/Mayor → Daemon\n - Format: mail to \u003cmanager\u003e with action type\n\n4. **Set state: requesting_\u003caction\u003e**\n - Lifecycle manager checks this before acting\n\n5. **Wait for termination**\n - Don't self-exit - let manager kill session\n - Ensures clean handoff\n\n## Lifecycle Request Flow\n\nAgent Lifecycle Manager\n | |\n | 1. gt handoff --cycle |\n | a. Verify git clean |\n | b. Send handoff mail to self |\n | c. Set requesting_cycle=true |\n | d. Send lifecycle request |\n |------------------------------------→|\n | |\n | 2. Receive request\n | 3. Verify state |\n | 4. Kill session |\n | 5. Start new |\n | (for cycle) |\n | |\n | New session reads handoff |\n | Resumes work |\n\n## Who Manages Whom\n\n| Agent | Sends lifecycle request to |\n|-------|---------------------------|\n| Polecat | \u003crig\u003e/witness |\n| Refinery | \u003crig\u003e/witness |\n| Witness | daemon/ |\n| Mayor | daemon/ |\n\n## Implementation\n\n1. Detect current role (polecat, witness, refinery, mayor, crew)\n2. Apply context-aware default if no flag specified\n3. Run pre-flight checks (git clean, work handed off)\n4. Send handoff mail to self (if cycling)\n5. Send lifecycle request to appropriate manager\n6. Set requesting_\u003caction\u003e in state.json\n7. Wait (manager will kill us)\n\n## For Polecats (--shutdown)\n\nAdditional cleanup after kill:\n- Witness removes worktree\n- Witness deletes polecat branch\n- Polecat ceases to exist\n\n## Related Issues\n\n- gt-99m: Daemon (handles Mayor/Witness lifecycle)\n- gt-7ik: Ephemeral polecats (polecat cleanup)\n- gt-eu9: Witness session cycling","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-18T11:39:40.806863-08:00","updated_at":"2025-12-27T21:29:54.203457-08:00","dependencies":[{"issue_id":"gt-gby","depends_on_id":"gt-7ik","type":"blocks","created_at":"2025-12-18T11:39:46.423945-08:00","created_by":"daemon"},{"issue_id":"gt-gby","depends_on_id":"gt-eu9","type":"blocks","created_at":"2025-12-18T11:39:46.547204-08:00","created_by":"daemon"},{"issue_id":"gt-gby","depends_on_id":"gt-99m","type":"blocks","created_at":"2025-12-18T11:50:24.142182-08:00","created_by":"daemon"}],"deleted_at":"2025-12-27T21:29:54.203457-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-gcnnr","title":"Add logging for silently ignored errors","description":"Many places use _ = pattern to ignore errors without any logging:\n\n- start.go: lines 167, 322-323, 429, 747-753, 886-888\n- polecat.go, session/manager.go, refinery/manager.go\n- keepalive/keepalive.go (intentionally best-effort but no diagnostics)\n\nThese make debugging difficult when things fail silently.\n\nSuggestion: At minimum log warnings for discarded errors:\n if err := m.saveState(ref); err != nil {\n log.Printf(\"Warning: failed to save state: %v\", err)\n }\nOr add comments explaining why errors are safe to ignore.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-28T15:43:13.787806-08:00","created_by":"gastown/crew/max","updated_at":"2025-12-28T15:43:13.787806-08:00"}
|
||||
{"id":"gt-gczi","title":"Digest: mol-deacon-patrol","description":"Patrol 20 - handoff threshold reached","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-24T23:11:34.570635-08:00","updated_at":"2025-12-27T21:26:04.408676-08:00","deleted_at":"2025-12-27T21:26:04.408676-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-gdhee","title":"Digest: mol-deacon-patrol","description":"Cycle 15: quiet, handoff for fresh context","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-28T13:24:00.135165-08:00","updated_at":"2025-12-28T13:24:00.135165-08:00","closed_at":"2025-12-28T13:24:00.135129-08:00","close_reason":"Squashed from 9 wisps","dependencies":[{"issue_id":"gt-gdhee","depends_on_id":"gt-eph-1ke","type":"parent-child","created_at":"2025-12-28T13:24:00.136041-08:00","created_by":"deacon"}]}
|
||||
{"id":"gt-ggmc","title":"Merge: gt-83k0","description":"branch: polecat/furiosa\ntarget: main\nsource_issue: gt-83k0\nrig: gastown","status":"tombstone","priority":1,"issue_type":"merge-request","created_at":"2025-12-22T23:36:24.551025-08:00","updated_at":"2025-12-27T21:27:22.518303-08:00","deleted_at":"2025-12-27T21:27:22.518303-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"merge-request"}
|
||||
@@ -1124,6 +1134,7 @@
|
||||
{"id":"gt-htto","title":"Heartbeat convention: simple liveness signal for agents","description":"Lightweight liveness signal extracted from Deacon epic (gt-5af).\n\n**Implementation**: Each agent writes a timestamp file on activity:\n```bash\necho '{\"ts\":\"'$(date -Iseconds)'\"}' \u003e ~/gt/\u003crole\u003e/heartbeat.json\n```\n\n**Integration points**:\n- SessionStart hook writes heartbeat\n- Periodic activity (mail check, work completion) refreshes it\n- `gt status` shows staleness (e.g., 'mayor: 5m ago')\n\n**Weight**: ~5 lines per agent\n**Value**: Quick debugging - see which agents are active at a glance\n\nNo monitoring daemon needed - human checks `gt status` when curious.","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-20T20:40:45.459903-08:00","updated_at":"2025-12-20T20:40:45.459903-08:00"}
|
||||
{"id":"gt-hvy7i","title":"Digest: mol-deacon-patrol","description":"Patrol 7: Healthy. Furiosa resolved rig mismatch.","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-25T19:31:22.510409-08:00","updated_at":"2025-12-27T21:26:02.585605-08:00","deleted_at":"2025-12-27T21:26:02.585605-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-hw6","title":"GGT Command Parity: Complete gt command coverage","description":"Complete gt command set to match/exceed PGT town commands.\n\nCovers: uninstall, rig info, refinery attach, witness, session mgmt, mail UX, daemon.","status":"tombstone","priority":1,"issue_type":"epic","created_at":"2025-12-17T22:22:21.720078-08:00","updated_at":"2025-12-27T21:29:54.220109-08:00","deleted_at":"2025-12-27T21:29:54.220109-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"epic"}
|
||||
{"id":"gt-hwf3o","title":"Fix potential race conditions in state file operations","description":"Non-atomic state file operations could cause data loss:\n\nAll packages with state files (witness, refinery, crew, swarm):\nState is loaded, modified, and saved without locking:\n ref, err := m.loadState()\n // ... modify ref ...\n return m.saveState(ref)\n\nIf two processes modify state simultaneously, one update may be lost.\n\ninternal/polecat/namepool.go (lines 179-194):\nSave() uses RLock() but performs file I/O - should use write lock.\n\ninternal/swarm/manager.go:\nswarms map[string]*Swarm accessed without mutex but multiple goroutines could call Create/GetSwarm.\n\nSuggestion:\n1. Use file locking (flock) for critical state updates\n2. Or use atomic write pattern (write to temp, then rename)\n3. Add mutex to swarm.Manager.swarms map","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-28T15:43:20.026309-08:00","created_by":"gastown/crew/max","updated_at":"2025-12-28T15:43:20.026309-08:00"}
|
||||
{"id":"gt-hwka3","title":"Pillar 2: Patrol Ignition","description":"Witness and Refinery patrol loops fire reliably.\n\nKey deliverables:\n- Witness patrol reads agent beads for polecat state\n- Witness sends MERGE_READY to refinery on completion\n- Refinery processes MERGE_READY mail\n- Both send completion signals\n\nSubsumes existing work:\n- gt-6qyt1: Refinery event-driven merge queue\n- gt-qpwv4: Witness detect completion\n- gt-dtw9u: Witness active monitoring\n\nReference: ~/gt/docs/liftoff-plan.md\n\nParent: gt-oki8p","status":"closed","priority":1,"issue_type":"epic","assignee":"mayor","created_at":"2025-12-27T20:56:05.225946-08:00","created_by":"mayor","updated_at":"2025-12-28T14:08:37.606361-08:00","closed_at":"2025-12-28T14:08:37.606361-08:00","close_reason":"All 5 children complete: patrol wiring, witness reads agent beads, MERGE_READY flow, refinery processes, integration test passed","dependencies":[{"issue_id":"gt-hwka3","depends_on_id":"gt-d0jqp","type":"blocks","created_at":"2025-12-27T20:56:22.812515-08:00","created_by":"daemon"}]}
|
||||
{"id":"gt-hwma","title":"Digest: mol-deacon-patrol","description":"Patrol OK: archived old handoff, all agents up, furiosa on gt-oiv0","status":"tombstone","priority":4,"issue_type":"task","created_at":"2025-12-22T22:03:54.568334-08:00","updated_at":"2025-12-27T21:26:05.458439-08:00","deleted_at":"2025-12-27T21:26:05.458439-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-hxlt","title":"Merge: gt-odvf","description":"branch: polecat/slit\ntarget: main\nsource_issue: gt-odvf\nrig: gastown","status":"tombstone","priority":2,"issue_type":"merge-request","created_at":"2025-12-21T16:42:57.748003-08:00","updated_at":"2025-12-27T21:27:22.878258-08:00","deleted_at":"2025-12-27T21:27:22.878258-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"merge-request"}
|
||||
@@ -1612,7 +1623,7 @@
|
||||
{"id":"gt-polecat-gastown-rictus","title":"gt-polecat-gastown-rictus","description":"gt-polecat-gastown-rictus\n\nrole_type: polecat\nrig: gastown\nagent_state: running\nhook_bead: gt-z99nh\nrole_bead: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-28T14:09:49.112812-08:00","created_by":"mayor","updated_at":"2025-12-28T14:09:49.445633-08:00"}
|
||||
{"id":"gt-polecat-gastown-slit","title":"gt-polecat-gastown-slit","description":"gt-polecat-gastown-slit\n\nrole_type: polecat\nrig: gastown\nagent_state: running\nhook_bead: gt-j9ddg\nrole_bead: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-28T14:09:42.286637-08:00","created_by":"mayor","updated_at":"2025-12-28T14:09:42.609688-08:00"}
|
||||
{"id":"gt-polecat-gastown-test-cat","title":"gt-polecat-gastown-test-cat","description":"gt-polecat-gastown-test-cat\n\nrole_type: polecat\nrig: gastown\nagent_state: spawning\nhook_bead: null\nrole_bead: null","status":"tombstone","priority":2,"issue_type":"agent","created_at":"2025-12-28T02:16:55.810497-08:00","created_by":"mayor","updated_at":"2025-12-28T02:17:01.786065-08:00","deleted_at":"2025-12-28T02:17:01.786065-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"agent"}
|
||||
{"id":"gt-polecat-gastown-testcat","title":"gt-polecat-gastown-testcat","description":"gt-polecat-gastown-testcat\n\nrole_type: polecat\nrig: gastown\nagent_state: running\nhook_bead: null\nrole_bead: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-28T15:32:27.70761-08:00","created_by":"mayor","updated_at":"2025-12-28T15:32:43.084754-08:00"}
|
||||
{"id":"gt-polecat-gastown-testcat","title":"gt-polecat-gastown-testcat","description":"gt-polecat-gastown-testcat\n\nrole_type: polecat\nrig: gastown\nagent_state: running\nhook_bead: null\nrole_bead: null","status":"tombstone","priority":2,"issue_type":"agent","created_at":"2025-12-28T15:32:27.70761-08:00","created_by":"mayor","updated_at":"2025-12-28T15:33:38.022666-08:00","deleted_at":"2025-12-28T15:33:38.022666-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"agent"}
|
||||
{"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":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-23T13:19:41.055563-08:00","updated_at":"2025-12-27T21:29:53.007253-08:00","dependencies":[{"issue_id":"gt-poxd","depends_on_id":"gt-y481","type":"parent-child","created_at":"2025-12-23T13:20:15.89851-08:00","created_by":"daemon"}],"deleted_at":"2025-12-27T21:29:53.007253-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-ppdmm","title":"Digest: mol-deacon-patrol","description":"Patrol 10: clear","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-26T18:15:09.272455-08:00","updated_at":"2025-12-27T21:26:01.022637-08:00","deleted_at":"2025-12-27T21:26:01.022637-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-pqhka","title":"Digest: mol-deacon-patrol","description":"Patrol 20: All agents healthy - triggering handoff","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-25T06:46:30.78827-08:00","updated_at":"2025-12-27T21:26:03.693445-08:00","deleted_at":"2025-12-27T21:26:03.693445-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
@@ -1782,7 +1793,7 @@
|
||||
{"id":"gt-sfr83","title":"Digest: mol-deacon-patrol","description":"Patrol 5: all clear","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-28T08:14:50.542708-08:00","updated_at":"2025-12-28T08:14:50.542708-08:00","closed_at":"2025-12-28T08:14:50.542675-08:00","close_reason":"Squashed from 9 wisps"}
|
||||
{"id":"gt-shj28","title":"Digest: mol-deacon-patrol","description":"P15: stable","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:59:23.72785-08:00","updated_at":"2025-12-25T19:59:23.72785-08:00","closed_at":"2025-12-25T19:59:23.72782-08:00"}
|
||||
{"id":"gt-shnp","title":"Create Refinery role template","description":"Add Refinery template to internal/templates/roles/:\n- refinery.md.tmpl with full role context\n- Variables: rig name, working directory, handoff bead ID\n- Update SeedRoleTemplates to include it\n- gt prime uses this template for Refinery context","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-19T18:09:28.951284-08:00","updated_at":"2025-12-27T21:29:53.898723-08:00","dependencies":[{"issue_id":"gt-shnp","depends_on_id":"gt-ktal","type":"blocks","created_at":"2025-12-19T18:09:39.706849-08:00","created_by":"daemon"}],"deleted_at":"2025-12-27T21:29:53.898723-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-si6am","title":"Polecat spawn: CLAUDE.md template lookup path is wrong","description":"Template lookup uses rig.Path/templates/ but templates are in mayor/rig/templates/\n\nIn internal/polecat/manager.go installCLAUDETemplate():\n templatePath := filepath.Join(m.rig.Path, \"templates\", \"polecat-CLAUDE.md\")\n // Looks for: /Users/stevey/gt/gastown/templates/polecat-CLAUDE.md\n // But templates are at: /Users/stevey/gt/gastown/mayor/rig/templates/\n\nThis causes silent failure (template not found is OK) and polecats inherit the wrong CLAUDE.md from the git worktree.\n\nFix options:\n1. Copy templates to rig root during rig init\n2. Change lookup to use mayor/rig/templates/\n3. Embed templates in binary","status":"open","priority":1,"issue_type":"bug","created_at":"2025-12-28T14:16:07.309527-08:00","created_by":"mayor","updated_at":"2025-12-28T14:16:07.309527-08:00"}
|
||||
{"id":"gt-si6am","title":"Polecat spawn: CLAUDE.md template lookup path is wrong","description":"Template lookup uses rig.Path/templates/ but templates are in mayor/rig/templates/\n\nIn internal/polecat/manager.go installCLAUDETemplate():\n templatePath := filepath.Join(m.rig.Path, \"templates\", \"polecat-CLAUDE.md\")\n // Looks for: /Users/stevey/gt/gastown/templates/polecat-CLAUDE.md\n // But templates are at: /Users/stevey/gt/gastown/mayor/rig/templates/\n\nThis causes silent failure (template not found is OK) and polecats inherit the wrong CLAUDE.md from the git worktree.\n\nFix options:\n1. Copy templates to rig root during rig init\n2. Change lookup to use mayor/rig/templates/\n3. Embed templates in binary","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-28T14:16:07.309527-08:00","created_by":"mayor","updated_at":"2025-12-28T15:34:02.9819-08:00","closed_at":"2025-12-28T15:34:02.9819-08:00","close_reason":"Fixed template lookup to use mayor/rig/templates/ instead of rig root"}
|
||||
{"id":"gt-sij0a","title":"GT_ROLE env var not set correctly for crew workers","status":"tombstone","priority":1,"issue_type":"bug","created_at":"2025-12-26T16:49:12.570524-08:00","updated_at":"2025-12-27T21:29:45.815017-08:00","deleted_at":"2025-12-27T21:29:45.815017-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"bug"}
|
||||
{"id":"gt-sj02z","title":"Digest: mol-deacon-patrol","description":"Patrol 16: Quiet","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-25T19:19:09.886984-08:00","updated_at":"2025-12-27T21:26:02.675108-08:00","deleted_at":"2025-12-27T21:26:02.675108-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-sl5rw","title":"Digest: mol-deacon-patrol","description":"Patrol cycle 20: final before handoff","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-26T13:31:45.905226-08:00","updated_at":"2025-12-27T21:26:01.804017-08:00","deleted_at":"2025-12-27T21:26:01.804017-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
@@ -2074,6 +2085,7 @@
|
||||
{"id":"gt-ws8ol.3","title":"Daemon: Implement exponential backoff based on activity file","description":"Modify daemon heartbeat logic to use exponential backoff when idle.\n\nRead ~/gt/daemon/activity.json on each heartbeat.\nCompute idle duration: time.Since(activity.Timestamp)\nAdjust next ticker interval based on idle duration:\n\n| Idle Duration | Next Heartbeat |\n|---------------|----------------|\n| 0-5 min | 5 min (base) |\n| 5-15 min | 10 min |\n| 15-45 min | 30 min |\n| 45+ min | 60 min (max) |\n\nImplementation:\n1. Add activity file reading to daemon heartbeat\n2. Replace fixed ticker with dynamic interval calculation\n3. Reset to base interval when activity is fresh\n\nNo counter tracking needed - pure discovery from single timestamp.\n\nCROSS-RIG DEPENDENCY: Also requires beads:bd-v8ku (assigned to beads/crew/dave)","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-26T19:22:14.170114-08:00","updated_at":"2025-12-27T21:29:54.739515-08:00","dependencies":[{"issue_id":"gt-ws8ol.3","depends_on_id":"gt-ws8ol","type":"parent-child","created_at":"2025-12-26T19:22:14.170719-08:00","created_by":"daemon"},{"issue_id":"gt-ws8ol.3","depends_on_id":"gt-ws8ol.1","type":"blocks","created_at":"2025-12-26T19:22:19.844324-08:00","created_by":"daemon"},{"issue_id":"gt-ws8ol.3","depends_on_id":"gt-ws8ol.2","type":"blocks","created_at":"2025-12-26T19:22:19.90297-08:00","created_by":"daemon"}],"deleted_at":"2025-12-27T21:29:54.739515-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-wsa2","title":"Digest: mol-deacon-patrol","description":"Patrol #6: Routine","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-24T22:22:39.448813-08:00","updated_at":"2025-12-27T21:26:04.785304-08:00","deleted_at":"2025-12-27T21:26:04.785304-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-wsjg.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-wsjg\nbonded_ref: arm-toast\nbonded_at: 2025-12-23T10:00:00Z\n","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-24T21:17:02.197808-08:00","updated_at":"2025-12-27T21:29:55.446289-08:00","deleted_at":"2025-12-27T21:29:55.446289-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-wtfb4","title":"Extract magic values to named constants","description":"Magic strings and numbers throughout codebase:\n\nShells list repeated 4x:\n- start.go:729, 773, 907\n- crew_helpers.go\nPattern: []string{\"bash\", \"zsh\", \"sh\", \"fish\", \"tcsh\", \"ksh\"}\n\nTiming values:\n- time.Sleep(500 * time.Millisecond) in multiple places\n- WaitForCommand 15*time.Second\n- WaitForShellReady 5*time.Second\n- Debounce 100ms default\n\nOther magic values:\n- \"gt-\" session prefix\n- priority = 2 default\n- Mail preview length 500 chars\n- Heartbeat ages 5min/15min\n- Divergence thresholds 10/50 commits\n\nSuggestion: Add to constants/constants.go:\n- SupportedShells\n- ShutdownNotifyDelay, ClaudeStartTimeout, ShellReadyTimeout\n- SessionPrefix\n- DefaultPriority\n- MailPreviewMaxLength","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-28T15:43:12.603942-08:00","created_by":"gastown/crew/max","updated_at":"2025-12-28T15:43:12.603942-08:00"}
|
||||
{"id":"gt-wtfej","title":"gt done: MR bead not created","description":"Integration test gt-7psb8 revealed that gt done says 'Work submitted to merge queue' but no MR bead is created.\n\nObserved:\n- gt done output: 'MR ID: mr-1766956116-b02fb1e5'\n- bd show mr-1766956116-b02fb1e5: 'no issue found'\n- gt mq list gastown: '(empty)'\n\nExpected: MR bead should exist with issue_type=merge-request and appear in gt mq list.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-28T13:11:52.664858-08:00","created_by":"mayor","updated_at":"2025-12-28T13:55:54.404887-08:00","closed_at":"2025-12-28T13:55:54.404887-08:00","close_reason":"Fixed: gt done now creates MR bead instead of writing to .beads/mq/","dependencies":[{"issue_id":"gt-wtfej","depends_on_id":"gt-7psb8","type":"blocks","created_at":"2025-12-28T13:13:50.227153-08:00","created_by":"daemon"}]}
|
||||
{"id":"gt-wtnb5","title":"Digest: mol-deacon-patrol","description":"Patrol 5: routine","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T10:16:31.082548-08:00","updated_at":"2025-12-25T10:16:31.082548-08:00","closed_at":"2025-12-25T10:16:31.082511-08:00"}
|
||||
{"id":"gt-wugqp","title":"Digest: mol-deacon-patrol","description":"Patrol 20: Final patrol, 11 sessions healthy, no incidents","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-25T19:20:38.900039-08:00","updated_at":"2025-12-27T21:26:02.642504-08:00","deleted_at":"2025-12-27T21:26:02.642504-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
@@ -2141,7 +2153,7 @@
|
||||
{"id":"gt-y3jb9","title":"Protocol: Type System for Formulas","description":"Protocols define interfaces that formulas implement - a type system for workflows.\n\n## Concept\n\n```toml\n# reviewable.protocol\n[protocol]\nname = \"Reviewable\"\n\n[requires]\nsteps = [\"review\"] # Must have a step tagged \"review\"\noutputs = [\"review_decision\"] # Must produce this\n\n[guarantees]\n\"review completes before any deploy step\"\n```\n\nFormulas declare: `implements = [\"Reviewable\", \"Deployable\"]`\n\nSystem verifies compliance statically.\n\n## Use Cases\n\n1. Ensure all deploy formulas have review steps\n2. Define compliance requirements as protocols\n3. Enable formula discovery: \"Give me all Deployable formulas\"\n4. Validate formula composition compatibility\n\n## Properties\n\n- Static verification (before execution)\n- Composable (protocol can extend protocol)\n- Documentation value (self-describing contracts)\n\n## Open Questions\n\n1. Protocol syntax - embedded in formula or separate files?\n2. Verification timing - cook time? load time?\n3. Protocol versioning - how do protocols evolve?\n4. Inheritance - can protocols extend other protocols?\n\n## Related\n\n- docs/formula_evolution.md - \"Formula Schemas\" section\n- gt-8tmz - molecule algebra\n","status":"open","priority":4,"issue_type":"epic","created_at":"2025-12-26T01:00:53.856997-08:00","updated_at":"2025-12-27T14:20:33.880636-08:00"}
|
||||
{"id":"gt-y3k55","title":"Digest: mol-deacon-patrol","description":"Patrol 1: No callbacks, no gates, all agents healthy, cleaned 2 orphan processes + 1 stale lock","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-26T14:42:43.612775-08:00","updated_at":"2025-12-27T21:26:01.568888-08:00","deleted_at":"2025-12-27T21:26:01.568888-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-y3y7","title":"Polecat template: move startup announcement into molecule","description":"Template has STARTUP PROTOCOL with 'Announce: beads Polecat furiosa, checking in.' This should be a startup step in the polecat molecule, not prose instruction in CLAUDE.md. The molecule drives behavior, not the template prose.","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-23T16:56:56.302648-08:00","updated_at":"2025-12-27T21:29:55.897668-08:00","dependencies":[{"issue_id":"gt-y3y7","depends_on_id":"gt-t9u7","type":"parent-child","created_at":"2025-12-23T16:57:16.855004-08:00","created_by":"daemon"}],"deleted_at":"2025-12-27T21:29:55.897668-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-y41ep","title":"Polecat spawn: Environment vars not exported to shell","description":"Polecat sessions set tmux environment but don't export to shell before Claude\n\nIn session/manager.go Start():\n _ = m.tmux.SetEnvironment(sessionID, \"GT_RIG\", m.rig.Name)\n _ = m.tmux.SetEnvironment(sessionID, \"GT_POLECAT\", polecat)\n ...\n command = \"claude --dangerously-skip-permissions\"\n\nCompare to crew_lifecycle.go which exports inline:\n claudeCmd := fmt.Sprintf(\"export GT_ROLE=crew GT_RIG=%s GT_CREW=%s \u0026\u0026 claude ...\")\n\nResult: Claude can't detect polecat identity, falls back to 'mayor', shows wrong hook.\n\nFix: Export GT_ROLE=polecat GT_RIG=X GT_POLECAT=Y inline before running Claude.","status":"open","priority":1,"issue_type":"bug","created_at":"2025-12-28T14:16:18.410705-08:00","created_by":"mayor","updated_at":"2025-12-28T14:16:18.410705-08:00"}
|
||||
{"id":"gt-y41ep","title":"Polecat spawn: Environment vars not exported to shell","description":"Polecat sessions set tmux environment but don't export to shell before Claude\n\nIn session/manager.go Start():\n _ = m.tmux.SetEnvironment(sessionID, \"GT_RIG\", m.rig.Name)\n _ = m.tmux.SetEnvironment(sessionID, \"GT_POLECAT\", polecat)\n ...\n command = \"claude --dangerously-skip-permissions\"\n\nCompare to crew_lifecycle.go which exports inline:\n claudeCmd := fmt.Sprintf(\"export GT_ROLE=crew GT_RIG=%s GT_CREW=%s \u0026\u0026 claude ...\")\n\nResult: Claude can't detect polecat identity, falls back to 'mayor', shows wrong hook.\n\nFix: Export GT_ROLE=polecat GT_RIG=X GT_POLECAT=Y inline before running Claude.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-28T14:16:18.410705-08:00","created_by":"mayor","updated_at":"2025-12-28T15:34:03.01152-08:00","closed_at":"2025-12-28T15:34:03.01152-08:00","close_reason":"Export GT_ROLE, GT_RIG, GT_POLECAT, BD_ACTOR inline before Claude starts"}
|
||||
{"id":"gt-y481","title":"Epic: Patrol parity - Witness and Refinery match Deacon sophistication","description":"Bring Witness and Refinery patrols up to Deacon's level of sophistication.\n\n## Deacon has\n1. Defined patrol molecule with clear steps\n2. Wisp-based execution (spawn, run, squash, loop)\n3. Daemon monitoring with auto-nudge on naked state\n4. Handoff bead attachment mechanism\n5. Banners for observability\n6. Context-aware loop-or-exit\n\n## Children\n- gt-h1n5: Witness patrol: Add banners and wisp-based execution\n- gt-qz2l: Refinery patrol: Add banners and wisp-based execution\n- gt-poxd: Create handoff beads for Witness and Refinery roles\n\n## Success criteria\n- Tailing a Witness or Refinery session shows clear banners\n- Patrols spawn as wisps and squash to digests\n- Each role has a handoff bead with attached_molecule\n- Daemon monitors Witness/Refinery nakedness (stretch goal)","status":"tombstone","priority":1,"issue_type":"epic","created_at":"2025-12-23T13:19:51.934063-08:00","updated_at":"2025-12-27T21:29:52.998933-08:00","deleted_at":"2025-12-27T21:29:52.998933-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"epic"}
|
||||
{"id":"gt-y5o","title":"Daemon: verify requesting_cycle before kill","description":"Per gt-gby spec, daemon should verify agent state shows requesting_cycle=true before killing session. Currently kills on any lifecycle request without verification.\n\nRequires state.json in agent workspace with requesting_cycle field.","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-18T13:38:13.049988-08:00","updated_at":"2025-12-27T21:29:57.197132-08:00","dependencies":[{"issue_id":"gt-y5o","depends_on_id":"gt-99m","type":"blocks","created_at":"2025-12-18T13:38:26.590883-08:00","created_by":"daemon"}],"deleted_at":"2025-12-27T21:29:57.197132-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
{"id":"gt-y68zm","title":"Digest: mol-deacon-patrol","description":"Patrol 5: 11 sessions, all healthy","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-25T20:36:05.583458-08:00","updated_at":"2025-12-27T21:26:02.171656-08:00","deleted_at":"2025-12-27T21:26:02.171656-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"last_failure": "2025-12-28T14:24:28.741486-08:00",
|
||||
"last_failure": "2025-12-28T15:40:09.996988-08:00",
|
||||
"failure_count": 1,
|
||||
"backoff_until": "2025-12-28T14:24:58.741486-08:00",
|
||||
"backoff_until": "2025-12-28T15:40:39.996988-08:00",
|
||||
"needs_manual_sync": false,
|
||||
"failure_reason": "git pull failed in worktree: exit status 128\nFrom github.com:steveyegge/gastown\n * branch beads-sync -\u003e FETCH_HEAD\nfatal: Cannot rebase onto multiple branches.\n"
|
||||
}
|
||||
Reference in New Issue
Block a user