bd sync: 2025-12-23 21:44:14

This commit is contained in:
Steve Yegge
2025-12-23 21:44:14 -08:00
parent b685879b63
commit f9585fc3ab

View File

@@ -118,14 +118,14 @@
{"id":"gt-4nn.4","title":"Built-in molecules: engineer-in-box, quick-fix, research","description":"Create built-in molecules as Beads issues:\n\n## engineer-in-box\n\n```markdown\nid: mol-engineer-in-box\ntype: molecule\ntitle: Engineer in a Box\n\nFull workflow from design to merge.\n\n## Step: design\nThink carefully about architecture. Consider:\n- Existing patterns in the codebase\n- Trade-offs between approaches \n- Testability and maintainability\n\nWrite a brief design summary before proceeding.\n\n## Step: implement\nWrite the code. Follow codebase conventions.\nNeeds: design\n\n## Step: review\nSelf-review the changes. Look for:\n- Bugs and edge cases\n- Style issues\n- Missing error handling\nNeeds: implement\n\n## Step: test\nWrite and run tests. Cover happy path and edge cases.\nFix any failures before proceeding.\nNeeds: implement\n\n## Step: submit\nSubmit for merge via refinery.\nNeeds: review, test\n```\n\n## quick-fix\n\n```markdown\nid: mol-quick-fix\ntype: molecule \ntitle: Quick Fix\n\nFast path for small changes.\n\n## Step: implement\nMake the fix. Keep it focused.\n\n## Step: test\nRun relevant tests. Fix any regressions.\nNeeds: implement\n\n## Step: submit\nSubmit for merge.\nNeeds: test\n```\n\n## research\n\n```markdown\nid: mol-research\ntype: molecule\ntitle: Research\n\nInvestigation workflow.\n\n## Step: investigate\nExplore the question. Search code, read docs, \nunderstand context. Take notes.\n\n## Step: document\nWrite up findings. Include:\n- What you learned\n- Recommendations\n- Open questions\nNeeds: investigate\n```\n\n## Storage\n\nBuilt-in molecules live in `\u003ctown\u003e/.beads/` as regular issues.\nCreated during `gt install` or `bd init`.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-18T18:07:04.574565-08:00","updated_at":"2025-12-19T12:02:19.332406-08:00","closed_at":"2025-12-19T12:02:19.332406-08:00","dependencies":[{"issue_id":"gt-4nn.4","depends_on_id":"gt-4nn","type":"parent-child","created_at":"2025-12-18T18:07:04.576587-08:00","created_by":"daemon"}]}
{"id":"gt-4put","title":"execute-actions","description":"Send nudges, process shutdowns, escalate as decided.\n\nNeeds: decide-actions","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T16:18:21.59918-08:00","updated_at":"2025-12-23T16:18:21.59918-08:00","dependencies":[{"issue_id":"gt-4put","depends_on_id":"gt-qp2w","type":"parent-child","created_at":"2025-12-23T16:18:21.606851-08:00","created_by":"stevey"}],"wisp":true}
{"id":"gt-4qey","title":"gt mail: Cross-level routing is broken","description":"When Mayor sends mail to rig worker, message lands in wrong beads database. Sender's beads vs recipient's.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-20T17:57:35.617292-08:00","updated_at":"2025-12-20T18:35:53.30276-08:00","closed_at":"2025-12-20T18:35:53.30276-08:00"}
{"id":"gt-4u5z","title":"Refinery as Worktree: Local MR Integration","description":"Move refinery from separate clone to git worktree. Polecats stop pushing to origin - refinery sees their branches locally. MRs become wisps (ephemeral). Only main gets pushed after merge.\n\n## Goals\n- Origin stays clean (only main + beads-sync branches)\n- No orphaned polecat branches ever\n- Simpler mental model for MR coordination\n- Faster integration (no network for local MR ops)\n\n## Trade-offs\n- Machine crash = redo pending work (acceptable, beads track state)\n- Future federation needs different approach (bundles or integration branch)\n\n## Components Affected\n- Rig initialization (refinery setup)\n- Spawn/polecat workflow (remove origin push)\n- Refinery manager (local branch access)\n- Documentation (architecture, workflows)\n- Molecule templates (remove push instructions)","status":"open","priority":2,"issue_type":"epic","created_at":"2025-12-23T20:24:56.517669-08:00","updated_at":"2025-12-23T20:24:56.517669-08:00"}
{"id":"gt-4u5z","title":"Refinery as Worktree: Local MR Integration","description":"Move refinery from separate clone to git worktree. Polecats stop pushing to origin - refinery sees their branches locally. MRs become wisps (ephemeral). Only main gets pushed after merge.\n\n## Goals\n- Origin stays clean (only main + beads-sync branches)\n- No orphaned polecat branches ever\n- Simpler mental model for MR coordination\n- Faster integration (no network for local MR ops)\n\n## Trade-offs\n- Machine crash = redo pending work (acceptable, beads track state)\n- Future federation needs different approach (bundles or integration branch)\n\n## Components Affected\n- Rig initialization (refinery setup)\n- Spawn/polecat workflow (remove origin push)\n- Refinery manager (local branch access)\n- Documentation (architecture, workflows)\n- Molecule templates (remove push instructions)","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-12-23T20:24:56.517669-08:00","updated_at":"2025-12-23T21:28:22.512455-08:00","closed_at":"2025-12-23T21:28:22.512455-08:00","close_reason":"Complete: refinery as worktree, local branches, wisp MRs"}
{"id":"gt-4u5z.1","title":"Update rig init to create refinery as worktree","description":"Modify rig initialization to create refinery as a git worktree instead of a separate clone.\n\n## Changes\n- internal/rig/init.go or similar - change refinery setup\n- Create worktree at \u003crig\u003e/refinery/ with branch 'refinery'\n- Remove clone logic for refinery\n- Update any path assumptions\n\n## Considerations\n- Refinery worktree should track main (or its own branch?)\n- May need to handle existing rigs (migration path)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T20:25:25.927013-08:00","updated_at":"2025-12-23T20:31:07.100875-08:00","closed_at":"2025-12-23T20:31:07.100875-08:00","close_reason":"Rig init now creates refinery as worktree of mayor clone","dependencies":[{"issue_id":"gt-4u5z.1","depends_on_id":"gt-4u5z","type":"parent-child","created_at":"2025-12-23T20:25:25.92745-08:00","created_by":"daemon"}]}
{"id":"gt-4u5z.2","title":"Remove origin push from polecat workflow","description":"Polecats should no longer push their branches to origin.\n\n## Changes\n- internal/cmd/done.go - remove 'git push origin HEAD'\n- internal/cmd/mq_submit.go - remove branch push\n- Molecule templates - remove push instructions\n- Any hooks that push polecat branches\n\n## Verification\n- Polecat completes work without pushing\n- Branch stays local\n- Refinery can still see the branch (via shared .git)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T20:25:27.079456-08:00","updated_at":"2025-12-23T20:33:43.173059-08:00","closed_at":"2025-12-23T20:33:43.173059-08:00","close_reason":"Removed origin push from done.go, mq_submit.go, spawn.go, and molecule templates","dependencies":[{"issue_id":"gt-4u5z.2","depends_on_id":"gt-4u5z","type":"parent-child","created_at":"2025-12-23T20:25:27.081989-08:00","created_by":"daemon"},{"issue_id":"gt-4u5z.2","depends_on_id":"gt-4u5z.1","type":"blocks","created_at":"2025-12-23T20:25:43.547484-08:00","created_by":"daemon"}]}
{"id":"gt-4u5z.3","title":"Update refinery to read local branches","description":"Refinery manager needs to access polecat branches locally instead of fetching from origin.\n\n## Changes\n- internal/refinery/manager.go - remove origin fetch for MR branches\n- internal/refinery/engineer.go - local branch access\n- Remove DeleteRemoteBranch calls (branches are local now)\n- Update merge workflow to work with local refs\n\n## Key insight\nAll worktrees share the same .git - refinery can see polecat/nux branch directly.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T20:25:28.500632-08:00","updated_at":"2025-12-23T20:34:33.879575-08:00","closed_at":"2025-12-23T20:34:33.879575-08:00","close_reason":"Refinery now deletes local branches instead of remote branches","dependencies":[{"issue_id":"gt-4u5z.3","depends_on_id":"gt-4u5z","type":"parent-child","created_at":"2025-12-23T20:25:28.502671-08:00","created_by":"daemon"},{"issue_id":"gt-4u5z.3","depends_on_id":"gt-4u5z.1","type":"blocks","created_at":"2025-12-23T20:25:43.633822-08:00","created_by":"daemon"}]}
{"id":"gt-4u5z.4","title":"Convert MR queue to wisp storage","description":"MR queue should use wisp storage (.beads-wisp/) instead of durable beads.\n\n## Design (Simplified)\n\nWith refinery as worktree, polecats and refinery share the same machine. No cross-machine MR coordination needed. Wisps are the natural fit.\n\n### Storage\n- Location: `.beads-wisp/mq/\u003cmr-id\u003e.json`\n- Format: Same MRFields structure (branch, target, source_issue, worker, rig)\n- Lifecycle: Create on submit, delete after merge\n\n### Code Changes\n\n1. **MR Creation** (done.go, mq_submit.go)\n - Write to `.beads-wisp/mq/` instead of `bd create --type=merge-request`\n - Generate ID: `mr-\u003ctimestamp\u003e-\u003crandom\u003e` or similar\n\n2. **Refinery Query** (refinery/manager.go, engineer.go)\n - Read from `.beads-wisp/mq/` directory\n - List files, parse JSON, process in order\n\n3. **Cleanup**\n - Delete MR file after successful merge\n - On failure, leave file (refinery retries)\n\n### What Stays in Beads\n- Source issues (the work being merged) - still tracked in beads\n- Merge commits reference source issue ID\n- `bd close \u003cissue\u003e` still happens on merge\n\n### Benefits\n- No sync overhead for transient MR state\n- Simpler model (file per MR, delete when done)\n- Consistent with wisp philosophy (ephemeral operational state)\n\n### Not Needed\n- Digest squashing (MRs are deleted, not accumulated)\n- Cross-machine visibility (single-machine architecture)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T20:25:29.716788-08:00","updated_at":"2025-12-23T21:22:32.180049-08:00","closed_at":"2025-12-23T21:22:32.180049-08:00","close_reason":"MR queue now uses wisp storage (.beads-wisp/mq/). MRs are created as JSON files, read by refinery, deleted after merge.","dependencies":[{"issue_id":"gt-4u5z.4","depends_on_id":"gt-4u5z","type":"parent-child","created_at":"2025-12-23T20:25:29.717201-08:00","created_by":"daemon"},{"issue_id":"gt-4u5z.4","depends_on_id":"gt-4u5z.3","type":"blocks","created_at":"2025-12-23T20:25:43.719801-08:00","created_by":"daemon"}]}
{"id":"gt-4u5z.5","title":"Update architecture documentation","description":"Update all documentation to reflect refinery-as-worktree model.\n\n## Files to update\n- docs/architecture.md (if exists)\n- CLAUDE.md references to refinery\n- mayor/rig/docs/*.md - any refinery docs\n- wisp-architecture.md - add MR wisp details\n- README files mentioning clone vs worktree\n\n## Key messages\n- Refinery is worktree, not clone\n- Polecat branches stay local\n- Only main pushed to origin\n- MRs are wisps (ephemeral)","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-23T20:25:31.192025-08:00","updated_at":"2025-12-23T21:24:01.184709-08:00","closed_at":"2025-12-23T21:24:01.184709-08:00","close_reason":"Updated merge-queue-design.md with new architecture: wisp MRs, local branches, refinery worktree","dependencies":[{"issue_id":"gt-4u5z.5","depends_on_id":"gt-4u5z","type":"parent-child","created_at":"2025-12-23T20:25:31.194085-08:00","created_by":"daemon"},{"issue_id":"gt-4u5z.5","depends_on_id":"gt-4u5z.2","type":"blocks","created_at":"2025-12-23T20:25:43.819111-08:00","created_by":"daemon"},{"issue_id":"gt-4u5z.5","depends_on_id":"gt-4u5z.3","type":"blocks","created_at":"2025-12-23T20:25:43.907113-08:00","created_by":"daemon"},{"issue_id":"gt-4u5z.5","depends_on_id":"gt-4u5z.4","type":"blocks","created_at":"2025-12-23T20:25:43.99734-08:00","created_by":"daemon"}]}
{"id":"gt-4u5z.6","title":"Design future federation model","description":"Document how remote/federated refinery would work in the future.\n\n## Options to document\n1. Git bundles - portable patches, no branches on origin\n2. Dedicated integration branch pattern (integration/*)\n3. Hybrid - local for same-machine, bundles for remote\n\n## Deliverable\nDesign doc in docs/federation-refinery.md or similar.\nNot implementing now - just capturing the design for when needed.","status":"open","priority":4,"issue_type":"task","created_at":"2025-12-23T20:25:32.265488-08:00","updated_at":"2025-12-23T20:25:32.265488-08:00","dependencies":[{"issue_id":"gt-4u5z.6","depends_on_id":"gt-4u5z","type":"parent-child","created_at":"2025-12-23T20:25:32.267467-08:00","created_by":"daemon"}]}
{"id":"gt-4u5z.7","title":"Add migration path for existing rigs","description":"Existing rigs have refinery as clone. Need migration path.\n\n## Options\n1. Manual: User runs 'gt rig migrate' or similar\n2. Automatic: Detect clone, convert to worktree on next start\n3. Deprecation: Old rigs work but warn, new rigs use worktree\n\n## Considerations\n- Don't break existing setups\n- Clear upgrade path\n- Handle in-flight MRs during migration","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-23T20:25:33.746893-08:00","updated_at":"2025-12-23T20:25:33.746893-08:00","dependencies":[{"issue_id":"gt-4u5z.7","depends_on_id":"gt-4u5z","type":"parent-child","created_at":"2025-12-23T20:25:33.749766-08:00","created_by":"daemon"},{"issue_id":"gt-4u5z.7","depends_on_id":"gt-4u5z.1","type":"blocks","created_at":"2025-12-23T20:25:44.086388-08:00","created_by":"daemon"}]}
{"id":"gt-4u5z.6","title":"Design future federation model","description":"Document how remote/federated refinery would work in the future.\n\n## Options to document\n1. Git bundles - portable patches, no branches on origin\n2. Dedicated integration branch pattern (integration/*)\n3. Hybrid - local for same-machine, bundles for remote\n\n## Deliverable\nDesign doc in docs/federation-refinery.md or similar.\nNot implementing now - just capturing the design for when needed.","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-23T20:25:32.265488-08:00","updated_at":"2025-12-23T21:28:20.96312-08:00","closed_at":"2025-12-23T21:28:20.96312-08:00","close_reason":"Deferred - will address if/when needed","dependencies":[{"issue_id":"gt-4u5z.6","depends_on_id":"gt-4u5z","type":"parent-child","created_at":"2025-12-23T20:25:32.267467-08:00","created_by":"daemon"}]}
{"id":"gt-4u5z.7","title":"Add migration path for existing rigs","description":"Existing rigs have refinery as clone. Need migration path.\n\n## Options\n1. Manual: User runs 'gt rig migrate' or similar\n2. Automatic: Detect clone, convert to worktree on next start\n3. Deprecation: Old rigs work but warn, new rigs use worktree\n\n## Considerations\n- Don't break existing setups\n- Clear upgrade path\n- Handle in-flight MRs during migration","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-23T20:25:33.746893-08:00","updated_at":"2025-12-23T21:28:20.972695-08:00","closed_at":"2025-12-23T21:28:20.972695-08:00","close_reason":"Deferred - will address if/when needed","dependencies":[{"issue_id":"gt-4u5z.7","depends_on_id":"gt-4u5z","type":"parent-child","created_at":"2025-12-23T20:25:33.749766-08:00","created_by":"daemon"},{"issue_id":"gt-4u5z.7","depends_on_id":"gt-4u5z.1","type":"blocks","created_at":"2025-12-23T20:25:44.086388-08:00","created_by":"daemon"}]}
{"id":"gt-4xas","title":"Merge fix/spawn-beads-path branch to main","description":"Branch has gt nudge command; main has notification deduplication. Both valuable.\n\nKey insight: Only ~10 commits diverged each way in mayor/rig.\n- Branch: 9509afa feat(nudge): Add gt nudge command (MISSING from main)\n- Main: d2fccd5 slot-based notification deduplication (KEEP)\n\nMerge plan:\n1. git merge fix/spawn-beads-path --no-ff\n2. Keep nudge.go from branch\n3. Keep notification.go from main\n4. Merge tmux.go (both NudgeSession AND SendKeysReplace)\n5. go build \u0026\u0026 go test\n6. Deploy to ~/.local/bin/gt","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T13:28:01.684557-08:00","updated_at":"2025-12-20T13:30:55.817964-08:00","closed_at":"2025-12-20T13:30:55.817964-08:00"}
{"id":"gt-4z7j","title":"Test patrol queue feature","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-23T16:17:34.358185-08:00","updated_at":"2025-12-23T16:24:15.56255-08:00","closed_at":"2025-12-23T16:24:15.56255-08:00","close_reason":"test issue - cleaning up"}
{"id":"gt-51x","title":"Fix golangci-lint errcheck warnings (~160 issues)","description":"Running golangci-lint shows ~160 errcheck warnings for unchecked error returns.\n\nCommon patterns:\n- t.SetEnvironment() return values\n- os.WriteFile(), os.RemoveAll() \n- MarkFlagRequired() on cobra commands\n- Various manager methods\n\nRun: golangci-lint run ./...\n\nCould batch fix with:\n1. Add explicit _ = for intentionally ignored errors\n2. Handle errors properly where they matter\n3. Consider adding //nolint:errcheck for cobra flag setup","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-17T15:02:39.807659-08:00","updated_at":"2025-12-19T12:09:58.544102-08:00","closed_at":"2025-12-19T12:09:58.544102-08:00"}
@@ -473,7 +473,7 @@
{"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":"in_progress","priority":1,"issue_type":"task","created_at":"2025-12-18T11:39:40.806863-08:00","updated_at":"2025-12-18T18:18:22.35369-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"}]}
{"id":"gt-ggmc","title":"Merge: gt-83k0","description":"branch: polecat/furiosa\ntarget: main\nsource_issue: gt-83k0\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-22T23:36:24.551025-08:00","updated_at":"2025-12-22T23:38:38.536524-08:00","closed_at":"2025-12-22T23:38:38.536524-08:00","close_reason":"Merged to main"}
{"id":"gt-gl2","title":"Clarify Mayor vs Witness cleanup responsibilities","description":"Document the cleanup authority model: Witness owns ALL per-worker cleanup, Mayor never involved.\n\n## The Rule\n\n**Witness handles ALL per-worker cleanup. Mayor is never involved.**\n\n## Why This Matters\n\n1. Separation of concerns: Mayor strategic, Witness operational\n2. Reduced coordination overhead: No back-and-forth for routine cleanup\n3. Faster shutdown: Witness kills workers immediately upon verification\n4. Cleaner escalation: Mayor only hears about problems\n\n## What Witness Handles\n\n- Verifying worker git state before kill\n- Nudging workers to fix dirty state\n- Killing worker sessions\n- Updating worker state (sleep/wake)\n- Logging verification results\n\n## What Mayor Handles\n\n- Receiving swarm complete notifications\n- Deciding whether to start new swarms\n- Handling escalations (stuck workers after 3 retries)\n- Cross-rig coordination\n\n## Escalation Path\n\nWorker stuck -\u003e Witness nudges (up to 3x) -\u003e Witness escalates to Mayor -\u003e Mayor decides: force kill, reassign, or human\n\n## Anti-Patterns\n\nDO NOT: Mayor asks Witness if worker X is clean\nDO: Witness reports swarm complete, all workers verified\n\nDO NOT: Mayor kills worker sessions directly\nDO: Mayor tells Witness to abort swarm, Witness handles cleanup\n\nDO NOT: Workers report done to Mayor\nDO: Workers report to Witness, Witness aggregates and reports up","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-15T19:48:56.678724-08:00","updated_at":"2025-12-15T20:48:12.068964-08:00","dependencies":[{"issue_id":"gt-gl2","depends_on_id":"gt-82y","type":"blocks","created_at":"2025-12-15T19:49:05.929877-08:00","created_by":"daemon"}]}
{"id":"gt-gl6s","title":"gt spawn: polecats report success but no work actually happens","description":"## Problem\n\ngt spawn appears to succeed (creates worktree, sends mail notifications, reports 'Session started') but:\n1. No actual Claude session runs\n2. Polecats send POLECAT_DONE messages without doing work\n3. No code is committed or pushed\n4. MR issues are created but branches don't exist\n\n## Observed Behavior\n\nSpawned 12 polecats with gt spawn beads/\u003cname\u003e --create --issue \u003cid\u003e\n- All reported 'Session started'\n- All sent POLECAT_STARTED notifications\n- All sent POLECAT_DONE notifications\n- But: no worktrees remained, no branches pushed, no code written\n\n## Expected Behavior\n\nPolecats should actually run Claude Code and complete assigned work before sending POLECAT_DONE.\n\n## Impact\n\nSilent failure causes false completion signals, wasted witness time processing fake completions, and stale MR/assignee pollution in beads.","status":"open","priority":1,"issue_type":"bug","created_at":"2025-12-23T21:22:45.498303-08:00","updated_at":"2025-12-23T21:22:45.498303-08:00"}
{"id":"gt-gl6s","title":"gt spawn: polecats report success but no work actually happens","description":"## Problem\n\ngt spawn polecats have multiple silent failure modes:\n\n### Failure Mode 1: No gt prime\n- Claude starts at prompt and waits for input\n- SessionStart hook doesn't auto-run 'gt prime'\n- Without gt prime, polecats don't pick up work\n\n### Failure Mode 2: No git push (CRITICAL)\n- Polecat commits code locally\n- Polecat closes the beads issue\n- Polecat sends POLECAT_DONE\n- **But code is never pushed to remote branch**\n- When worktree is cleaned up, commits are lost forever\n- Issue appears closed but no code exists\n\n## Evidence\n\ntestcat on bd-d28c:\n- Reported 'Work Complete' with commits 7d3447b9, cd87e541\n- Closed bd-d28c\n- Submitted MR bd-yx22\n- But: `grep -r 'TestCreateTombstone' cmd/bd/*.go` returns nothing\n- No polecat/testcat branch on remote\n\n## Required Fixes\n\n1. Polecats MUST push their branch before closing issues\n2. Witness MUST verify branch exists on remote before cleanup\n3. gt spawn should auto-nudge 'gt prime'\n4. Consider: Polecat handoff should fail if unpushed commits exist\n\n## Verification Protocol for Witness\n\nBefore accepting POLECAT_DONE:\n```bash\n# 1. Verify branch pushed\ngit branch -r | grep polecat/\u003cname\u003e\n\n# 2. Verify code exists\ngrep -r '\u003cexpected_function\u003e' path/to/files\n\n# 3. Only then cleanup\n```","status":"open","priority":1,"issue_type":"bug","created_at":"2025-12-23T21:22:45.498303-08:00","updated_at":"2025-12-23T21:36:55.53829-08:00"}
{"id":"gt-glzm","title":"Digest: mol-deacon-patrol","description":"Patrol: 4 msgs (2 blocked on bd mol current, 2 handoffs). 11 polecats, 18 sessions. Swarm in progress.","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-23T00:23:09.331459-08:00","updated_at":"2025-12-23T00:23:09.331459-08:00","closed_at":"2025-12-23T00:23:09.331412-08:00","close_reason":"Squashed from 5 wisps"}
{"id":"gt-gswn","title":"Integration test: agent waits for CI via gate","description":"End-to-end test of the gate workflow.\n\n## Test Scenario\n1. Agent creates gate: bd gate create --await gh:run:123 --timeout 5m --notify beads/dave\n2. Agent writes handoff and exits\n3. Deacon patrol checks gate condition\n4. (Mock) GitHub run completes\n5. Deacon notifies waiter and closes gate\n6. New agent session reads mail and resumes\n\n## Test Requirements\n- Mock GitHub API responses\n- Test timeout path\n- Test multiple waiters\n- Verify mail notifications sent\n\n## Moved from beads\nOriginally bd-rl5t. Tests Deacon patrol which is in gastown.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T12:23:56.582834-08:00","updated_at":"2025-12-23T12:23:56.582834-08:00","dependencies":[{"issue_id":"gt-gswn","depends_on_id":"gt-dh65","type":"blocks","created_at":"2025-12-23T12:24:01.787444-08:00","created_by":"stevey"}]}
{"id":"gt-h0v5","title":"Add keyboard navigation and filtering","description":"Keyboard navigation: j/k or arrows to move, enter to expand/collapse, q to quit. Filtering: by rig name, worker name, event type. Search within activity stream.","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-23T16:27:20.27464-08:00","updated_at":"2025-12-23T16:27:20.27464-08:00","dependencies":[{"issue_id":"gt-h0v5","depends_on_id":"gt-tr0a","type":"blocks","created_at":"2025-12-23T16:27:40.14167-08:00","created_by":"daemon"},{"issue_id":"gt-h0v5","depends_on_id":"gt-55kx","type":"blocks","created_at":"2025-12-23T16:27:40.224089-08:00","created_by":"daemon"},{"issue_id":"gt-h0v5","depends_on_id":"gt-rivr","type":"parent-child","created_at":"2025-12-23T16:28:31.027436-08:00","created_by":"daemon"}]}
@@ -554,6 +554,7 @@
{"id":"gt-in3x","title":"gt spawn --continue for resuming parked molecules","description":"Add `--continue` flag to gt spawn for resuming parked molecules:\n\n```bash\ngt spawn --continue gt-mol-root\n```\n\nThis:\n1. Finds molecule root\n2. Verifies molecule is in \"parked\" state (in_progress, no assignee)\n3. Checks external deps are now satisfied\n4. Spawns polecat with molecule context\n5. Polecat reads handoff mail and continues from blocked step\n\nPart of cross-project dependency system.\nSee: docs/cross-project-deps.md\n\nDepends on: gt-zniu (gt park)\nDepends on Beads: bd-zmmy (bd ready resolution)","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-21T22:39:13.154462-08:00","updated_at":"2025-12-21T22:39:13.154462-08:00","dependencies":[{"issue_id":"gt-in3x","depends_on_id":"gt-zniu","type":"blocks","created_at":"2025-12-21T22:39:44.707231-08:00","created_by":"daemon"}]}
{"id":"gt-in7b","title":"gt sling: nudge crew/mayor if session is running","description":"When slinging to crew or mayor, if they have an active tmux session, send a nudge notification so they know work has landed on their hook.\n\nCurrently only slingToPolecat nudges (lines 514-521 in internal/cmd/sling.go).\n\nMissing nudge in:\n- slingToCrew (line ~669)\n- slingToMayor (line ~876)\n\nNOT applicable to patrol-based agents (witness, refinery, deacon) - they run on cycles and pick up work via hook check, not interactive nudge.\n\nImplementation:\n1. For crew: need to determine session name (e.g., gastown-crew-max)\n2. Check if session running via tmux\n3. If running, call t.NudgeSession() with appropriate message","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T15:56:22.30857-08:00","updated_at":"2025-12-23T15:57:01.19806-08:00"}
{"id":"gt-is3e","title":"self-review","description":"Review your own changes. Look for:\n- Bugs and edge cases\n- Style issues\n- Missing error handling\n- Security concerns\n\nFix any issues found before proceeding.\n\nDepends: implement","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T22:04:43.421121-08:00","updated_at":"2025-12-21T22:05:10.502518-08:00","closed_at":"2025-12-21T22:05:10.502518-08:00","close_reason":"test cleanup","dependencies":[{"issue_id":"gt-is3e","depends_on_id":"gt-jvr3","type":"parent-child","created_at":"2025-12-21T22:04:43.423812-08:00","created_by":"stevey"},{"issue_id":"gt-is3e","depends_on_id":"gt-16rv","type":"blocks","created_at":"2025-12-21T22:04:43.424395-08:00","created_by":"stevey"}],"wisp":true}
{"id":"gt-isje","title":"Implement mol bond command for dynamic child molecules","description":"Add 'gt mol bond' command that creates child molecules at runtime with variable substitution.\n\nUsage from mol-witness-patrol survey-workers step:\n```bash\nbd mol bond mol-polecat-arm $PATROL_WISP_ID \\\n --ref arm-$polecat \\\n --var polecat_name=$polecat \\\n --var rig=\u003crig\u003e\n```\n\nThis creates child wisps like patrol-x7k.arm-ace with variables expanded.\n\nImplementation:\n1. Add 'bond' subcommand to mol command\n2. Accept: proto ID, parent ID, --ref for child suffix, --var key=value pairs\n3. Call InstantiateMolecule with Context map populated from --var flags\n4. Return created child ID\n\nCritical for Christmas Ornament pattern - without this, Witness cannot spawn per-polecat inspection arms.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T21:35:56.192637-08:00","updated_at":"2025-12-23T21:43:44.601758-08:00","closed_at":"2025-12-23T21:43:44.601758-08:00","close_reason":"Implemented mol bond command for dynamic child molecule creation"}
{"id":"gt-it0e","title":"Merge: gt-oiv0","description":"branch: polecat/furiosa\ntarget: main\nsource_issue: gt-oiv0\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-22T22:09:36.611121-08:00","updated_at":"2025-12-22T22:21:03.024596-08:00","closed_at":"2025-12-22T22:21:03.024596-08:00","close_reason":"Merged to main"}
{"id":"gt-iu23","title":"Polecat doesn't auto-start after spawn inject - requires manual nudge","description":"## Problem\n\nAfter `gt spawn --issue \u003cid\u003e --create`, the polecat session shows Claude Code started with the injected prompt, but Claude doesn't begin processing. The prompt just sits there until manually nudged.\n\n## Evidence\n\n```\n$ gt spawn --issue gt-rixa --rig gastown --create\n...\n✓ Session started. Attach with: gt session at gastown/furiosa\n Polecat nudged to start working\n Witness notified to monitor startup\n```\n\nSession shows:\n```\n\u003e You have a work assignment. Run 'gt mail inbox' to see it, then start\n working on issue gt-rixa.\n\n ⏵⏵ bypass permissions on (shift+tab to cycle)\n```\n\nBut Claude doesn't respond. Manual nudge required:\n```\n$ gt nudge gt-gastown-furiosa \"Please start working...\"\n```\n\nAfter nudge, polecat immediately starts working correctly.\n\n## Hypothesis\n\nThe spawn inject happens before Claude Code is fully initialized. The text arrives in the input buffer, but Claude hasn't started listening yet. By the time Claude starts, the input has already been 'consumed' as initial prompt text but not submitted.\n\n## Resolution Plan\n\nThis will be solved by the **polecat molecule workflow** (mol-polecat-work), which provides structured lifecycle management. The molecule approach handles startup, work, and shutdown as discrete steps with proper state tracking.\n\n**Blocked on**: beads/crew/dave completing ephemeral molecules (bd mol bond, ephemeral beads repo).\n\n## Workaround\n\nFor now, use `gt nudge` if a polecat doesn't start within ~30 seconds of spawn.","status":"in_progress","priority":1,"issue_type":"bug","created_at":"2025-12-21T14:06:27.375686-08:00","updated_at":"2025-12-21T19:53:46.940942-08:00"}
{"id":"gt-iua8","title":"Merge: gt-frs","description":"branch: polecat/Slit\ntarget: main\nsource_issue: gt-frs\nrig: gastown","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-19T16:30:05.529099-08:00","updated_at":"2025-12-19T18:26:14.104887-08:00","closed_at":"2025-12-19T17:48:44.654109-08:00"}
@@ -683,6 +684,7 @@
{"id":"gt-o75l","title":"Merge: gt-h6eq.3","description":"branch: polecat/keeper\ntarget: main\nsource_issue: gt-h6eq.3\nrig: gastown","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-23T11:49:58.84455-08:00","updated_at":"2025-12-23T12:22:23.431739-08:00","closed_at":"2025-12-23T12:22:23.431739-08:00","close_reason":"Merged to main in gt-h6eq swarm"}
{"id":"gt-oc2","title":"Daemon: proper rig discovery","description":"Currently discovers rigs by scanning tmux session names for gt-*-witness pattern. Should instead:\n- Read rigs from mayor/rigs.json\n- Or scan town directory for .gastown subdirs\n- Handle rigs that exist but don't have running witnesses","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-18T13:38:15.825299-08:00","updated_at":"2025-12-19T17:22:52.554474-08:00","closed_at":"2025-12-19T16:28:39.497935-08:00","dependencies":[{"issue_id":"gt-oc2","depends_on_id":"gt-99m","type":"blocks","created_at":"2025-12-18T13:38:26.826697-08:00","created_by":"daemon"}]}
{"id":"gt-od1g","title":"Mail inbox from witness/refinery dirs shows Mayor inbox","description":"When running `gt mail inbox` from the witness or refinery directories, it shows the Mayor's inbox instead of the agent's own inbox.\n\nReproduction:\n```\n$ cd ~/gt/beads/witness \u0026\u0026 gt mail inbox\n📬 Inbox: mayor/ (1 messages, 1 unread)\n ● 🤝 HANDOFF: Swarm session complete...\n```\n\nExpected: Should show beads/witness inbox\n\nLikely cause: The cwd-based identity resolution isn't recognizing witness/refinery as valid mail identities, so it falls back to Mayor.","status":"open","priority":2,"issue_type":"bug","created_at":"2025-12-23T20:29:58.817388-08:00","updated_at":"2025-12-23T20:29:58.817388-08:00"}
{"id":"gt-odfr","title":"Add WaitsFor parsing to molecule steps","description":"Add WaitsFor field to MoleculeStep struct and parse 'WaitsFor: all-children' (and future variants) from molecule descriptions.\n\nThis enables:\n- mol progress to understand fanout patterns\n- Validation that WaitsFor references valid constructs\n- Future automated orchestration\n\nImplementation:\n1. Add WaitsFor []string to MoleculeStep struct\n2. Add waitsForLineRegex to parse 'WaitsFor: ...' lines\n3. Update ParseMoleculeSteps to extract WaitsFor\n4. Update tests","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T21:35:55.004767-08:00","updated_at":"2025-12-23T21:41:27.539959-08:00","closed_at":"2025-12-23T21:41:27.539959-08:00","close_reason":"Implemented WaitsFor parsing with tests"}
{"id":"gt-odvf","title":"Document bd mol bond/squash/burn CLI","description":"Create CLI reference documentation for molecule commands:\n\n## bd mol bond\n\nInstantiate a proto into a runnable molecule.\n\n```bash\nbd mol bond \u003cproto-id\u003e [--wisp] [--assignee=\u003caddr\u003e]\n```\n\n- Default: creates a Mol (durable, in main beads)\n- --wisp: creates a Wisp (ephemeral, in .beads-ephemeral/)\n- --assignee: who will execute this molecule\n\n## bd mol squash\n\nComplete a molecule and generate digest.\n\n```bash\nbd mol squash \u003cmol-id\u003e --summary='...'\n```\n\n- For Mol: creates digest in git history\n- For Wisp: evaporates (no permanent record)\n- --summary: required summary of what was accomplished\n\n## bd mol burn\n\nAbandon a molecule without completing.\n\n```bash\nbd mol burn \u003cmol-id\u003e [--reason='...']\n```\n\n- Discards molecule state\n- No digest created\n- Use when molecule is no longer needed","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T16:33:06.462105-08:00","updated_at":"2025-12-23T02:14:23.810794-08:00","closed_at":"2025-12-23T02:14:23.810794-08:00","close_reason":"Already documented in docs/molecules.md lines 70-235","dependencies":[{"issue_id":"gt-odvf","depends_on_id":"gt-62hm","type":"blocks","created_at":"2025-12-21T16:33:17.530156-08:00","created_by":"daemon"}]}
{"id":"gt-odvr","title":"Merge: gt-r6td","description":"branch: polecat/furiosa\ntarget: main\nsource_issue: gt-r6td\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-22T22:54:01.000047-08:00","updated_at":"2025-12-22T22:55:43.764376-08:00","closed_at":"2025-12-22T22:55:43.764376-08:00","close_reason":"Merged to main"}
{"id":"gt-ogpk","title":"Add neighbor-check steps to all patrol molecules","description":"Part of the 'Gas Town is a Village' antifragility design.\n\nEvery patrol molecule should include optional neighbor-checking:\n- Deacon checks Witness and Refinery health\n- Witness checks Refinery health \n- Refinery checks Witness health\n- Polecats can peek other polecats\n\nUse gt peek to check health states.\nIf stuck neighbor found, can nudge or escalate.\n\nThis creates distributed monitoring - no single point of failure.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-22T22:01:16.358314-08:00","updated_at":"2025-12-22T22:01:16.358314-08:00"}