From 25fa31882668f0e4237f72cfac24998d47ede3e4 Mon Sep 17 00:00:00 2001 From: beads/refinery Date: Mon, 12 Jan 2026 00:35:33 -0800 Subject: [PATCH] bd daemon sync: 2026-01-12 00:35:33 --- .beads/issues.jsonl | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index eaeb4990..3edf48e7 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -66,6 +66,7 @@ {"id":"bd-0yzm","title":"GH#508: Orphan detection false positive when directory name contains dot","description":"Directory names with dots trigger orphan issue detection because dot is also used for orphan ID format. bd rename-prefix fixes it. See: https://github.com/steveyegge/beads/issues/508","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-14T16:32:01.725196-08:00","updated_at":"2025-12-16T01:27:29.023299-08:00","closed_at":"2025-12-16T01:27:29.023299-08:00"} {"id":"bd-0zcnh","title":"Session ended: gt-beads-crew-dave","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T22:08:30.693688-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-09T22:08:30.735481-08:00","closed_at":"2026-01-09T22:08:30.735481-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-0zp7","title":"Add missing hook calls in mail reply and ack","description":"The mail commands are missing hook calls:\n\n1. runMailReply (mail.go:525-672) creates a message but doesn't call hookRunner.Run(hooks.EventMessage, ...) after creating the reply in direct mode (around line 640)\n\n2. runMailAck (mail.go:432-523) closes messages but doesn't call hookRunner.Run(hooks.EventClose, ...) after closing each message (around line 487 for daemon mode, 493 for direct mode)\n\nThis means GGT hooks won't fire for replies or message acknowledgments.","status":"tombstone","priority":1,"issue_type":"bug","created_at":"2025-12-16T20:52:53.069412-08:00","updated_at":"2025-12-25T01:21:01.952723-08:00","deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} +{"id":"bd-0zpye","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T00:34:41.149866-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T00:34:41.213552-08:00","closed_at":"2026-01-12T00:34:41.213552-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-1022","title":"Use external_ref as primary matching key for import updates","description":"Enable re-syncing from external systems (Jira, GitHub, Linear) by using external_ref as the primary matching key during imports. Currently imports treat any content change as a collision, making it impossible to sync updates from external systems without creating duplicates.\n\nSee GH #142 for detailed proposal and implementation plan.\n\nKey changes needed:\n1. Add findByExternalRef() query function\n2. Update DetectCollisions() to match by external_ref first\n3. Update import_shared.go to update existing issues when external_ref matches\n4. Add index on external_ref for performance\n5. Preserve local issues (no external_ref) from being overwritten\n\nThis enables hybrid workflows: import external backlog, break down with local tasks, re-sync anytime.","notes":"## Code Review Complete ✅\n\n**Overall Assessment**: EXCELLENT - Production ready\n\n### Implementation Quality\n- ✓ Clean architecture with proper interface extension\n- ✓ Dual backend support (SQLite + Memory)\n- ✓ Smart matching priority: external_ref → ID → content hash\n- ✓ O(1) lookups with database index\n- ✓ Timestamp-based conflict resolution\n- ✓ Comprehensive test coverage (11 test cases)\n\n### Follow-up Issues Filed\nHigh Priority (P2):\n- bd-897a: Add UNIQUE constraint on external_ref column\n- bd-7315: Add validation for duplicate external_ref in batch imports\n\nMedium Priority (P3):\n- bd-f9a1: Add index usage verification test\n- bd-3f6a: Add concurrent import race condition tests\n\nLow Priority (P4):\n- bd-e166: Improve timestamp comparison readability\n- bd-9e23: Optimize Memory backend with index\n- bd-537e: Add external_ref change tracking\n- bd-df11: Add import metrics\n- bd-9f4a: Document external_ref in content hash\n\n### Key Features\n✅ External systems (Jira, GitHub, Linear) can re-sync without duplicates\n✅ Hybrid workflows: import external backlog, add local tasks, re-sync anytime\n✅ Local issues protected from being overwritten\n✅ Timestamp checking ensures only newer updates applied\n✅ Performance optimized with database index\n\n**Confidence Level**: 95% - Ship it! 🚀","status":"closed","priority":0,"issue_type":"feature","created_at":"2025-11-02T14:55:56.355813-08:00","updated_at":"2025-11-02T15:52:05.786625-08:00","closed_at":"2025-11-02T15:52:05.78663-08:00"} {"id":"bd-1048","title":"Daemon crashes silently on RPC query after startup","description":"The daemon fails to handle 'show' RPC commands when:\n1) JSONL is newer than database (needs import)\n2) git pull fails due to uncommitted changes\n\nSymptoms:\n- Daemon appears to run (ps shows process)\n- 'bd list' and other commands work fine \n- 'bd show \u003cid\u003e' returns \"failed to read response: EOF\"\n- No panic or error logged in daemon.log\n\nRoot cause likely: auto-import deadlock or state corruption when import is blocked by git conflicts.\n\nWorkaround: \n- Restart daemon after syncing git state (commit/push changes)\n- OR use --no-daemon flag for all commands\n\nThe panic recovery added in server_lifecycle_conn.go:183 didn't catch any panics, confirming this isn't a panic-based crash.","notes":"Root cause found and fixed: Two bugs - (1) nil pointer check missing in handleShow causing panic, (2) double JSON encoding in show.go ID resolution. Both fixed. bd show now works with daemon.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-02T17:05:03.658333-08:00","updated_at":"2025-11-03T12:08:12.947672-08:00","closed_at":"2025-11-03T12:08:12.947676-08:00"} {"id":"bd-10wg","title":"Migrate config.yaml to config.json","description":"The beads config file uses YAML format (config.yaml) but should use JSON (config.json) for consistency with the rest of the system. gastown has a fallback in internal/rig/manager.go:initBeads that writes YAML format - this needs to be updated once beads supports JSON config.","status":"closed","priority":3,"issue_type":"bug","created_at":"2026-01-01T11:16:55.668209-08:00","created_by":"gastown/crew/gus","updated_at":"2026-01-01T11:19:34.640683-08:00","closed_at":"2026-01-01T11:19:34.640683-08:00","close_reason":"Beads already migrating away from YAML config"} @@ -126,6 +127,7 @@ {"id":"bd-1ls","title":"Override test","description":"## Overview\n\n[Describe the high-level goal and scope of this epic]\n\n## Success Criteria\n\n- [ ] Criteria 1\n- [ ] Criteria 2\n- [ ] Criteria 3\n\n## Background\n\n[Provide context and motivation]\n\n## Scope\n\n**In Scope:**\n- Item 1\n- Item 2\n\n**Out of Scope:**\n- Item 1\n- Item 2\n","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-03T20:15:10.01471-08:00","updated_at":"2025-11-03T22:07:10.946574-08:00","closed_at":"2025-11-03T22:07:10.946574-08:00"} {"id":"bd-1mc7t","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-11T00:10:16.382073-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T00:10:16.416022-08:00","closed_at":"2026-01-11T00:10:16.416022-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-1mzt","title":"Client self-heal: remove stale pid when lock free + socket missing","description":"When client detects:\n- Socket is missing AND\n- tryDaemonLock shows lock NOT held\n\nThen automatically:\n1. Remove stale daemon.pid file\n2. Optionally auto-start daemon (behind BEADS_AUTO_START_DAEMON=1 env var)\n\nThis prevents stale artifacts from accumulating after daemon crashes.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-07T16:42:12.75205-08:00","updated_at":"2025-11-07T22:07:17.342845-08:00","closed_at":"2025-11-07T21:21:15.317562-08:00","dependencies":[{"issue_id":"bd-1mzt","depends_on_id":"bd-ndyz","type":"discovered-from","created_at":"2025-11-07T16:42:12.753099-08:00","created_by":"daemon"}]} +{"id":"bd-1onmd","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T00:05:16.256633-08:00","created_by":"beads/refinery","updated_at":"2026-01-12T00:05:16.321546-08:00","closed_at":"2026-01-12T00:05:16.321546-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-1p8jx","title":"Digest: mol-refinery-patrol","description":"Patrol: Queue empty, no branches processed, inbox clear","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T23:04:23.826002-08:00","updated_at":"2026-01-10T23:04:23.826002-08:00","closed_at":"2026-01-10T23:04:23.82595-08:00","close_reason":"Squashed from 11 wisps","dependencies":[{"issue_id":"bd-1p8jx","depends_on_id":"bd-wisp-da9","type":"parent-child","created_at":"2026-01-10T23:04:23.82686-08:00","created_by":"beads/refinery"}]} {"id":"bd-1pj6","title":"Proposal: Custom status states via config","description":"Proposal to add 'custom status states' via `bd config`.\nUsers could define an optional issue status enum (e.g., awaiting_review, review_in_progress) in the config.\nThis would enable multi-step pipelines to process issues where each step correlates to a specific status.\n\nExamples:\n- awaiting_verification\n- awaiting_docs\n- awaiting_testing\n","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-11-20T18:55:48.670499-05:00","updated_at":"2025-12-09T18:38:37.668809171-05:00","closed_at":"2025-11-28T23:18:45.862553-08:00"} {"id":"bd-1pr6","title":"Time-dependent worktree detection tests may be flaky","status":"hooked","priority":3,"issue_type":"task","created_at":"2025-12-26T01:21:22.065353-08:00","updated_at":"2025-12-30T15:44:43.360441-08:00"} @@ -618,6 +620,7 @@ {"id":"bd-85d1","title":"Add integration tests for multi-repo sync","description":"Test: Clone A deletes issue, Clone B imports Clone A's JSONL. Verify Clone B handles deletion gracefully with resurrection. Test concurrent imports with same orphans (should be idempotent). Test round-trip fidelity (export→delete parent→import→verify structure).","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-04T12:32:21.410318-08:00","updated_at":"2025-11-05T00:44:27.948465-08:00","closed_at":"2025-11-05T00:44:27.948467-08:00"} {"id":"bd-85prz","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T20:00:20.407921-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T20:00:20.472665-08:00","closed_at":"2026-01-11T20:00:20.472665-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-85tns","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-08T18:22:23.16716-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-08T18:22:23.206176-08:00","closed_at":"2026-01-08T18:22:23.206176-08:00","close_reason":"auto-closed session event"} +{"id":"bd-85wo8","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T00:35:32.499868-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T00:35:32.54784-08:00","closed_at":"2026-01-12T00:35:32.54784-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-85yfx","title":"Session ended: gt-beads-crew-grip","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T13:53:21.000466-08:00","created_by":"beads/crew/grip","updated_at":"2026-01-09T13:53:21.037256-08:00","closed_at":"2026-01-09T13:53:21.037256-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-86vci","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T17:42:09.119939-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-07T17:42:09.160293-08:00","closed_at":"2026-01-07T17:42:09.160293-08:00","close_reason":"auto-closed session event"} {"id":"bd-873k","title":"Merge: jasper-mjxcarqd","description":"branch: polecat/jasper-mjxcarqd\ntarget: main\nsource_issue: jasper-mjxcarqd\nrig: beads\nagent_bead: bd-beads-polecat-jasper","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2026-01-02T12:49:27.658037-08:00","created_by":"beads/polecats/jasper","updated_at":"2026-01-02T13:41:56.626743-08:00","closed_at":"2026-01-02T13:41:56.626743-08:00","close_reason":"Branches merged, cleaning up stale MR beads"} @@ -647,6 +650,7 @@ {"id":"bd-8hf","title":"Auto-routing and maintainer detection","description":"Implement intelligent routing to automatically send new issues to correct repo based on user's maintainer vs contributor status, with discovered issues inheriting parent's source_repo.","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-04T11:21:50.961196-08:00","updated_at":"2025-11-05T00:08:42.813482-08:00","closed_at":"2025-11-05T00:08:42.813484-08:00","dependencies":[{"issue_id":"bd-8hf","depends_on_id":"bd-4ms","type":"parent-child","created_at":"2025-11-04T11:22:24.262815-08:00","created_by":"daemon"}]} {"id":"bd-8hy","title":"Kill running daemons","description":"Stop all bd daemons before release:\n\n```bash\npkill -f 'bd.*daemon' || true\nsleep 1\npgrep -lf 'bd.*daemon' # Should show nothing\n```","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-18T22:42:58.255478-08:00","updated_at":"2025-12-24T16:25:30.371693-08:00","dependencies":[{"issue_id":"bd-8hy","depends_on_id":"bd-qqc","type":"parent-child","created_at":"2025-12-18T22:43:16.23168-08:00","created_by":"daemon"}],"deleted_at":"2025-12-24T16:25:30.371693-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} {"id":"bd-8ift","title":"Debug test","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-08T00:04:35.254385-08:00","updated_at":"2025-11-08T00:06:46.179396-08:00","closed_at":"2025-11-08T00:06:46.179396-08:00"} +{"id":"bd-8ihx3","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T00:31:42.061991-08:00","created_by":"beads/refinery","updated_at":"2026-01-12T00:31:42.126002-08:00","closed_at":"2026-01-12T00:31:42.126002-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-8kde","title":"bd delete bulk operations fight with auto-import/daemon causing data resurrection","description":"When bulk deleting issues (e.g., 244 closed issues older than 24h), the process fights with auto-import and daemon infrastructure:\n\n**Expected behavior:**\n- Delete 244 issues from 468-issue database\n- Export to JSONL (224 lines)\n- Commit and push\n- Result: 224 issues\n\n**Actual behavior:**\n- Delete 244 issues \n- Import runs (from stale git JSONL with 468 issues)\n- Resurrects deleted issues back into database\n- Export writes 356 lines (not 224)\n- Math: 468 - 244 = 224, but got 356 (132 issues resurrected)\n\n**Root cause:**\nAuto-import keeps re-importing from git during the delete operation, before the new JSONL is committed. The workflow is:\n1. Delete from DB\n2. Auto-import runs (reads old JSONL from git with deleted issues still present)\n3. Issues come back\n4. Export writes partially-deleted state\n\n**Solution options:**\n1. Add `--no-auto-import` flag to bulk delete operations\n2. Atomic delete-export-commit operation that suppresses imports\n3. Dedicated `bd prune` command that handles this correctly\n4. Lock file to prevent auto-import during bulk mutations\n\n**Impact:**\n- Bulk cleanup operations don't work reliably\n- Makes it nearly impossible to prune old closed issues\n- Confusing UX (delete 244, but only 112 actually removed)","notes":"**FIXED**: Auto-import now skips during delete operations to prevent resurrection.\n\n**Root cause confirmed**: Auto-import was running in PersistentPreRun before delete executed, causing it to re-import stale JSONL from git and resurrect deleted issues.\n\n**Solution implemented**:\n1. Added delete to skip list in main.go PersistentPreRun (alongside import and sync --dry-run)\n2. Delete operations now complete atomically without auto-import interference\n3. Added comprehensive test (TestBulkDeleteNoResurrection) to prevent regression\n\n**Test verification**:\n- Creates 20 issues, deletes 10\n- Verifies no resurrection after delete\n- Confirms JSONL has correct count (10 remaining)\n- All existing tests still pass","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-08T03:01:09.796852-08:00","updated_at":"2025-11-08T03:06:04.416994-08:00","closed_at":"2025-11-08T03:06:04.416994-08:00"} {"id":"bd-8mfn","title":"bd message: Implement full message reading functionality","description":"The `bd message read` command is incomplete and doesn't actually fetch or display message content.\n\n**Location:** cmd/bd/message.go:413-441\n\n**Current Behavior:**\n- Only marks message as read\n- Prints placeholder text\n- Doesn't fetch message body\n\n**Expected:**\n- Fetch full message from Agent Mail resource API\n- Display sender, subject, timestamp, body\n- Consider markdown rendering\n\n**Blocker:** Core feature for message system MVP","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-08T12:54:24.018957-08:00","updated_at":"2025-11-08T12:57:32.91854-08:00","closed_at":"2025-11-08T12:57:32.91854-08:00","dependencies":[{"issue_id":"bd-8mfn","depends_on_id":"bd-6uix","type":"parent-child","created_at":"2025-11-08T12:55:54.811368-08:00","created_by":"daemon"}]} {"id":"bd-8muou","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T16:20:27.585922-08:00","created_by":"beads/refinery","updated_at":"2026-01-10T16:20:27.625532-08:00","closed_at":"2026-01-10T16:20:27.625532-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} @@ -831,6 +835,7 @@ {"id":"bd-b8h","title":"Refactor check-health DB access to avoid repeated path resolution","description":"The runCheckHealth lightweight checks (hintsDisabled, checkVersionMismatch, checkSyncBranchQuick) each have duplicated database path resolution logic. Extract a helper function to DRY this up.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-25T19:27:35.075929-08:00","updated_at":"2025-11-25T19:50:21.272961-08:00","closed_at":"2025-11-25T19:50:21.272961-08:00"} {"id":"bd-b92a","title":"Wire config to import pipeline","description":"Connect import.orphan_handling config to importer.go and sqlite validation functions. Pass mode flag through call chain. Implement all four modes (strict/resurrect/skip/allow) with proper error messages and logging.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-04T12:32:08.612142-08:00","updated_at":"2025-11-05T00:44:27.949021-08:00","closed_at":"2025-11-05T00:44:27.949024-08:00"} {"id":"bd-bb08","title":"Add ON DELETE CASCADE to child_counters schema","description":"Update schema.go child_counters table foreign key with ON DELETE CASCADE. When parent deleted, child counter should also be deleted. If parent is resurrected, counter gets recreated from scratch. Add migration for existing databases.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-04T12:32:30.681452-08:00","updated_at":"2025-11-05T11:31:27.505024-08:00","closed_at":"2025-11-05T00:55:12.427194-08:00"} +{"id":"bd-bb0qp","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T23:06:04.982987-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-11T23:06:05.044718-08:00","closed_at":"2026-01-11T23:06:05.044718-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-bb63y","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-08T20:28:58.54436-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-08T20:28:58.580461-08:00","closed_at":"2026-01-08T20:28:58.580461-08:00","close_reason":"auto-closed session event"} {"id":"bd-bc2c6191","title":"Audit Current Cache Usage","description":"Understand exactly what code depends on the storage cache","notes":"Audit complete. See CACHE_AUDIT.md for full findings.\n\nSummary:\n- Cache was already removed in commit 322ab63 (2025-10-28)\n- server_cache_storage.go deleted (~286 lines)\n- All getStorageForRequest calls replaced with s.storage\n- All environment variables removed\n- MCP multi-repo works via per-project daemon architecture\n- All tests updated and passing\n- Only stale comment in server.go needed fixing","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-27T23:02:43.506373-07:00","updated_at":"2025-12-14T12:12:46.566499-08:00","closed_at":"2025-11-06T19:48:30.520616-08:00"} {"id":"bd-bc7l","title":"Issue 2 to reopen","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-22T14:57:44.523769552-05:00","updated_at":"2025-11-22T14:57:44.523769552-05:00","closed_at":"2025-11-07T21:57:59.91095-08:00"} @@ -1242,6 +1247,7 @@ {"id":"bd-gr4q","title":"Gate await fields cleared by auto-flush/auto-import cycle","description":"## Problem\n\nWhen creating a gate with `--await` fields (e.g., `gh:run:123`), the await_type and await_id are initially stored correctly in the SQLite database. However, they get cleared (set to empty strings) during subsequent bd commands due to the auto-flush/auto-import cycle.\n\n## Reproduction Steps\n\n1. Create a gate with await:\n ```\n bd gate create --molecule test-mol --await gh:run:20517738002\n ```\n Output shows correct `await_type: gh:run, await_id: 20517738002`\n\n2. Check database - fields are present\n\n3. Run any bd command (e.g., `bd list`)\n\n4. Check database again - await_type and await_id are now empty\n\n## Root Cause\n\nGates are wisps (ephemeral issues). During the auto-flush cycle:\n1. Auto-flush exports issues to JSONL (filtering out wisps)\n2. Auto-import reads JSONL and updates DB rows\n3. The update clears fields that weren't in the JSONL (including await fields)\n\n## Workaround\n\nUsing `--no-auto-import --no-auto-flush` flags preserves the fields, but this isn't practical for normal use.\n\n## Impact\n\nGitHub gate evaluation (`bd gate eval`) cannot work because by the time eval runs, the await fields have been cleared.\n\n## Suggested Fix\n\nEither:\n1. Don't clear await fields during auto-import if they weren't in the source\n2. Store wisp fields separately from the main JSONL export\n3. Include wisps in export but filter them at sync time","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-25T22:59:11.309657-08:00","updated_at":"2025-12-25T23:20:20.33151-08:00","closed_at":"2025-12-25T23:20:20.33151-08:00"} {"id":"bd-gra","title":"Add error handling test for cmd.Help() in search command","description":"Test coverage gap identified by automated analysis (vc-217).\n\n**Original Issue:** [deleted:bd-da96-baseline-lint]\n\nIn cmd/bd/search.go:39, the return value of cmd.Help() is not checked, flagged by errcheck linter.\n\nAdd test to verify:\n- Error handling when cmd.Help() fails (e.g., output redirection fails)\n- Proper error propagation to caller\n- Command still exits gracefully on help error\n\nThis ensures the search command handles help errors properly and doesn't silently ignore failures.\n\n_This issue was automatically created by AI test coverage analysis._","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-21T10:25:33.52308-05:00","updated_at":"2025-11-21T21:29:36.982333456-05:00","closed_at":"2025-11-21T19:31:21.889039-05:00","dependencies":[{"issue_id":"bd-gra","depends_on_id":"bd-da96-baseline-lint","type":"discovered-from","created_at":"2025-11-21T10:25:33.526016-05:00","created_by":"ai-supervisor"}]} {"id":"bd-gret5","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T08:56:17.798115-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T08:56:17.861971-08:00","closed_at":"2026-01-11T08:56:17.861971-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} +{"id":"bd-gro1f","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T00:18:37.770832-08:00","created_by":"beads/refinery","updated_at":"2026-01-12T00:18:37.833468-08:00","closed_at":"2026-01-12T00:18:37.833468-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-guc","title":"bd sync should not stage gitignored snapshot files","description":"## Problem\n\n`gitCommitBeadsDir` in `cmd/bd/sync.go` runs `git add .beads/` which stages all files in the directory, including snapshot files that are listed in `.beads/.gitignore`.\n\nIf a snapshot file (e.g., `beads.left.meta.json`) was ever committed before being added to `.gitignore`, git continues to track it. This causes merge conflicts when multiple polecats run `bd sync` concurrently, since each one modifies and commits these temporary files.\n\n## Root Cause\n\nLine ~568 in sync.go:\n```go\naddCmd := exec.CommandContext(ctx, \"git\", \"add\", beadsDir)\n```\n\nThis stages everything in `.beads/`, but `.gitignore` only prevents *untracked* files from being added - it doesn't affect already-tracked files.\n\n## Suggested Fix\n\nOption A: After `git add .beads/`, run `git reset` on snapshot files:\n```go\nexec.Command(\"git\", \"reset\", \"HEAD\", \".beads/beads.*.jsonl\", \".beads/*.meta.json\")\n```\n\nOption B: Stage only specific files instead of the whole directory:\n```go\nexec.Command(\"git\", \"add\", \".beads/issues.jsonl\", \".beads/deletions.jsonl\", \".beads/metadata.json\")\n```\n\nOption C: Detect and untrack snapshot files if they're tracked:\n```go\n// Check if file is tracked: git ls-files --error-unmatch \u003cfile\u003e\n// If tracked, run: git rm --cached \u003cfile\u003e\n```\n\nOption B is probably cleanest - explicitly add only the files that should be committed.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-27T20:47:14.603799-08:00","updated_at":"2025-11-28T17:28:55.54563-08:00","closed_at":"2025-11-27T22:34:23.336713-08:00"} {"id":"bd-gwwr1","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T00:26:09.860235-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T00:26:09.896478-08:00","closed_at":"2026-01-09T00:26:09.896478-08:00","close_reason":"auto-closed session event"} {"id":"bd-gxaf","title":"BUG: gt rig shutdown doesn't kill tmux sessions","description":"## Problem\n\n`gt rig shutdown wyvern` updates runtime JSON to `state: stopped` but does NOT kill the tmux sessions (`gt-wyvern-witness`, `gt-wyvern-refinery`).\n\nSince `gt rig status` checks for tmux sessions (correctly), it shows them as running.\n\n## Evidence\n\nAfter `gt rig shutdown wyvern`:\n- Runtime JSON: `state: stopped` ✓\n- tmux sessions: still exist ✗\n\n## Impact\n\n- Rig appears running after shutdown\n- tmux status shows green icon for 'stopped' rigs\n- User confusion\n\n## Root Cause\n\n`gt rig shutdown` in internal/cmd/rig.go updates runtime state but doesn't call `tmux kill-session` for witness/refinery.\n\n## Fix\n\nIn shutdown logic, after setting state to stopped, kill:\n- `gt-{rig}-witness` session\n- `gt-{rig}-refinery` session","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-01-06T13:07:49.503732-08:00","created_by":"mayor","updated_at":"2026-01-06T13:17:46.264981-08:00","closed_at":"2026-01-06T13:17:46.264981-08:00","close_reason":"Fixed: Added tmux kill-session to witness.Manager.Stop() matching refinery's implementation"} @@ -1319,6 +1325,7 @@ {"id":"bd-i54l","title":"Extract Gas Town-specific issue types from beads core","description":"dispatched_by: beads/crew/dave\n\n## Problem\n\nBeads has accumulated issue types that are specific to Gas Town's orchestration model:\n\n```go\nTypeAgent IssueType = \"agent\" // Agent identity bead\nTypeRole IssueType = \"role\" // Agent role definition \nTypeRig IssueType = \"rig\" // Rig identity bead (project container)\nTypeConvoy IssueType = \"convoy\" // Cross-project tracking\nTypeSlot IssueType = \"slot\" // Exclusive access slot (merge-slot gate)\n```\n\nThis violates separation of concerns. Beads is supposed to be a **generic AI-friendly issue tracker** that Gas Town happens to use - not \"Gas Town's issue tracker.\"\n\n## Impact\n\n- **Credibility**: Beads can't be presented as a standalone tool when it has hardcoded knowledge of a specific orchestration system\n- **Coupling**: Changes to Gas Town's identity model require beads releases\n- **Confusion**: Users outside Gas Town see types that don't apply to them\n\n## Solution\n\n### Option A: Labels instead of types\nGas Town uses labels like `gt:agent`, `gt:role`, `gt:rig` instead of dedicated types. Beads stays generic.\n\n### Option B: Type extension mechanism\nBeads supports custom type registration via config. Gas Town registers its types at init time.\n\n### Option C: Separate identity store\nGas Town maintains agent/role/rig identity outside beads entirely. Beads only tracks work items.\n\n## Types to evaluate\n\n| Type | Keep in beads? | Rationale |\n|------|----------------|-----------|\n| `gate` | Yes | Generic workflow concept (async waits) |\n| `molecule` | Yes | Generic workflow templates |\n| `agent` | **No** | Gas Town identity |\n| `role` | **No** | Gas Town identity |\n| `rig` | **No** | Gas Town identity |\n| `convoy` | **No** | Gas Town cross-rig tracking |\n| `slot` | Maybe | Could be generic \"mutex\" concept |\n\n## Files affected\n\n- `internal/types/types.go` - Type definitions\n- `cmd/bd/create.go` - Type validation\n- `cmd/bd/update.go` - Type validation \n- `internal/storage/sqlite/migrations/030_agent_fields.go` - Schema fields\n- Possibly others with type switch statements","status":"closed","priority":1,"issue_type":"epic","assignee":"beads/crew/dave","created_at":"2026-01-06T20:26:52.332746-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-06T22:19:33.376638-08:00","closed_at":"2026-01-06T22:19:33.376638-08:00","close_reason":"Core type extraction complete. All Gas Town types (agent, role, rig, convoy, slot) removed from beads core and replaced with label-based identification. Remaining task bd-jybi is a data migration for existing beads, which is a deployment concern.","labels":["architecture","separation-of-concerns"]} {"id":"bd-i5l","title":"Witness Patrol","description":"Per-rig worker monitor patrol loop with progressive nudging.","status":"tombstone","priority":2,"issue_type":"molecule","created_at":"2025-12-26T21:20:47.650732-08:00","created_by":"deacon","updated_at":"2025-12-27T00:10:54.176287-08:00","deleted_at":"2025-12-27T00:10:54.176287-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"molecule"} {"id":"bd-i5zq3","title":"Assigned issue","status":"open","priority":1,"issue_type":"task","assignee":"testuser","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T18:16:13.648845-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-11T18:16:13.648845-08:00"} +{"id":"bd-i63qd","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T00:24:57.008528-08:00","created_by":"beads/refinery","updated_at":"2026-01-12T00:24:57.078803-08:00","closed_at":"2026-01-12T00:24:57.078803-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-i6fx4","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T12:44:57.191053-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-10T12:44:57.245416-08:00","closed_at":"2026-01-10T12:44:57.245416-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-i6lc4","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T21:09:12.693523-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T21:09:12.761759-08:00","closed_at":"2026-01-11T21:09:12.761759-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-i7a6","title":"Test actor flag","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-26T20:47:28.470006-08:00","updated_at":"2025-12-28T09:26:06.084894-08:00","closed_at":"2025-12-28T09:26:06.084894-08:00"} @@ -1387,6 +1394,7 @@ {"id":"bd-jcdrt","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T09:41:07.26351-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T09:41:07.328097-08:00","closed_at":"2026-01-11T09:41:07.328097-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-jdz3","title":"Add pager support to bd list","description":"Add pager support following gh cli conventions:\n\nFlags:\n- --no-pager: disable pager for this command\n\nEnvironment variables:\n- BD_PAGER / PAGER: pager program (default: less)\n- BD_NO_PAGER: disable pager globally\n\nBehavior:\n- Auto-enable pager when output exceeds terminal height\n- Respect LESS env var for pager options\n- Disable pager when stdout is not a TTY (pipes/scripts)","notes":"## Implementation Plan\n\n### Dependencies\n```go\nimport \"github.com/muesli/termenv\" // or golang.org/x/term\n```\n\n### Code Changes\n\n1. **Add pager helper** (internal/ui/pager.go):\n```go\nfunc ToPager(content string) error {\n // Check BD_NO_PAGER or --no-pager\n if os.Getenv(\"BD_NO_PAGER\") \\!= \"\" {\n fmt.Print(content)\n return nil\n }\n \n // Get pager command\n pager := os.Getenv(\"BD_PAGER\")\n if pager == \"\" {\n pager = os.Getenv(\"PAGER\")\n }\n if pager == \"\" {\n pager = \"less\"\n }\n \n // Check if content exceeds terminal height\n // If not, just print directly\n \n // Pipe to pager\n cmd := exec.Command(pager)\n cmd.Stdin = strings.NewReader(content)\n cmd.Stdout = os.Stdout\n cmd.Stderr = os.Stderr\n return cmd.Run()\n}\n```\n\n2. **Add --no-pager flag** (cmd/bd/list.go init):\n```go\nlistCmd.Flags().Bool(\"no-pager\", false, \"Disable pager output\")\n```\n\n3. **Use pager in list output** (end of Run):\n```go\nif \\!noPager \u0026\u0026 isTerminal(os.Stdout) {\n ui.ToPager(output.String())\n} else {\n fmt.Print(output.String())\n}\n```\n\n### Environment Variables\n- `BD_PAGER`: pager program (overrides PAGER)\n- `BD_NO_PAGER`: set to any value to disable\n- `PAGER`: fallback pager\n- `LESS`: passed through for less options\n\n### Testing\n- `bd list` pipes to pager when output \u003e terminal height\n- `bd list --no-pager` prints directly\n- `BD_NO_PAGER=1 bd list` prints directly\n- `bd list | cat` auto-disables pager (not a TTY)","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-12-29T15:25:09.109258-08:00","created_by":"stevey","updated_at":"2025-12-30T15:44:43.356435-08:00","closed_at":"2025-12-30T00:41:45.168318-08:00","close_reason":"Merged via refinery"} {"id":"bd-jgxi","title":"Auto-migrate database on CLI version bump","description":"When CLI is upgraded (e.g., 0.24.0 → 0.24.1), database version becomes stale. Add auto-migration in PersistentPreRun or daemon startup. Check dbVersion != CLIVersion and run bd migrate automatically. Fixes recurring UX issue where bd doctor shows version mismatch after every CLI upgrade.","status":"tombstone","priority":0,"issue_type":"feature","created_at":"2025-11-21T23:16:09.004619-08:00","updated_at":"2025-12-25T01:21:01.952723-08:00","dependencies":[{"issue_id":"bd-jgxi","depends_on_id":"bd-tbz3","type":"parent-child","created_at":"2025-11-21T23:16:09.005513-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature"} +{"id":"bd-ji2bv","title":"Session ended: gt-beads-crew-wolf","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T23:05:51.450724-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-11T23:05:51.496745-08:00","closed_at":"2026-01-11T23:05:51.496745-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-jijf","title":"Fix: --parent flag doesn't create parent-child dependency","description":"When using `bd create --parent \u003cid\u003e`, the code generates a hierarchical child ID (e.g., bd-123.1) but never creates a parent-child dependency. This causes `bd epic status` to show zero children even though child issues exist.\n\nRoot cause: create.go generates child ID using store.GetNextChildID() but never calls store.AddDependency() with type parent-child.\n\nFix: After creating the issue when parentID is set, automatically add a parent-child dependency linking child -\u003e parent.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-15T13:15:22.138854-08:00","updated_at":"2025-11-15T13:18:29.301788-08:00","closed_at":"2025-11-15T13:18:29.301788-08:00"} {"id":"bd-jjua","title":"Auto-invoke 3-way merge for JSONL conflicts","description":"Currently when git pull encounters merge conflicts in .beads/issues.jsonl, the post-merge hook fails with an error message pointing users to manual resolution or the beads-merge tool.\n\nThis is a poor user experience - the conflict detection is working, but we should automatically invoke the advanced 3-way merging instead of just telling users about it.\n\n**Current behavior:**\n- Detect conflict markers in JSONL\n- Display error with manual resolution options\n- Exit with failure\n\n**Desired behavior:**\n- Detect conflict markers in JSONL\n- Automatically invoke beads-merge 3-way merge\n- Only fail if automatic merge cannot resolve the conflicts\n\n**Reference:**\n- beads-merge tool: https://github.com/neongreen/mono/tree/main/beads-merge\n- Error occurs in post-merge hook during bd sync after git pull","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-08T03:09:18.258708-08:00","updated_at":"2025-11-08T03:15:55.529652-08:00","closed_at":"2025-11-08T03:15:55.529652-08:00"} {"id":"bd-jjzz","title":"Merge: obsidian-1767106243818","description":"branch: polecat/obsidian-1767106243818\ntarget: main\nsource_issue: obsidian-1767106243818\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T07:00:26.328349-08:00","created_by":"beads/polecats/obsidian","updated_at":"2025-12-30T15:44:43.366109-08:00","closed_at":"2025-12-30T10:27:23.070855-08:00"} @@ -1812,6 +1820,7 @@ {"id":"bd-pi34h","title":"Session ended: gt-beads-witness","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T21:03:04.896388-08:00","created_by":"beads/witness","updated_at":"2026-01-10T21:03:04.94166-08:00","closed_at":"2026-01-10T21:03:04.94166-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-pi8yh","title":"Session ended: gt-beads-crew-fang","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T13:52:05.083333-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-09T13:52:05.119062-08:00","closed_at":"2026-01-09T13:52:05.119062-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-piywi","title":"Review PR #953: Fix --due/--defer in daemon mode","description":"dispatched_by: beads/crew/emma\n\nReview and verify PR #953 (steveyegge/beads)\n\nPR: https://github.com/steveyegge/beads/pull/953\nAuthor: peterkc\nFixes: #952, #950\n\nFixes daemon mode silently ignoring --due and --defer flags.\n- gh pr view 953 --repo steveyegge/beads\n- gh pr diff 953 --repo steveyegge/beads\n- If good: gh pr merge 953 --repo steveyegge/beads --squash","status":"closed","priority":2,"issue_type":"task","assignee":"beads/crew/wolf","created_at":"2026-01-08T14:30:25.036198-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-08T14:37:01.629172-08:00","closed_at":"2026-01-08T14:37:01.629172-08:00","close_reason":"PR #953 merged. Fixes daemon mode ignoring --due/--defer flags (GH#952, GH#950)."} +{"id":"bd-pjiwh","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T00:21:22.357328-08:00","created_by":"beads/refinery","updated_at":"2026-01-12T00:21:22.421968-08:00","closed_at":"2026-01-12T00:21:22.421968-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-pjm1a","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-08T20:34:16.296526-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-08T20:34:16.336496-08:00","closed_at":"2026-01-08T20:34:16.336496-08:00","close_reason":"auto-closed session event"} {"id":"bd-pmuu","title":"Create architecture decision record (ADR)","description":"Document why we chose Agent Mail, alternatives considered, and tradeoffs.\n\nAcceptance Criteria:\n- Problem statement (git traffic, no locks)\n- Alternatives considered (custom RPC, Redis, etc.)\n- Why Agent Mail fits Beads\n- Integration principles (optional, graceful degradation)\n- Future considerations\n\nFile: docs/adr/002-agent-mail-integration.md","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-07T22:42:51.420203-08:00","updated_at":"2025-11-08T00:06:01.816892-08:00","closed_at":"2025-11-08T00:06:01.816892-08:00","dependencies":[{"issue_id":"bd-pmuu","depends_on_id":"bd-spmx","type":"parent-child","created_at":"2025-11-08T00:02:47.93119-08:00","created_by":"daemon"}]} {"id":"bd-pn0t","title":"Add 0.33.2 to versionChanges in info.go","description":"Add new entry at TOP of versionChanges in cmd/bd/info.go with release notes from CHANGELOG.md. Must do before bump-version.sh --commit.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T16:10:13.760056-08:00","updated_at":"2025-12-21T17:29:31.791368-08:00","deleted_at":"2025-12-21T17:29:31.791368-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} @@ -1835,6 +1844,7 @@ {"id":"bd-q7sd","title":"Test issue A","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-04T11:26:43.935609-08:00","created_by":"beads/polecats/onyx","updated_at":"2026-01-04T11:27:38.747869-08:00","closed_at":"2026-01-04T11:27:38.747869-08:00","close_reason":"test cleanup","dependencies":[{"issue_id":"bd-q7sd","depends_on_id":"bd-vuc2","type":"blocks","created_at":"2026-01-04T11:27:28.425196-08:00","created_by":"beads/polecats/onyx"}]} {"id":"bd-qci3j","title":"Digest: mol-refinery-patrol","description":"Patrol: queue empty, 0 branches processed, no issues","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-11T22:06:24.386038-08:00","updated_at":"2026-01-11T22:06:24.386038-08:00","closed_at":"2026-01-11T22:06:24.385996-08:00","close_reason":"Squashed from 11 wisps"} {"id":"bd-qcts0","title":"Digest: mol-refinery-patrol","description":"Patrol: queue empty, 0 branches merged","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T22:15:09.28425-08:00","updated_at":"2026-01-10T22:15:09.28425-08:00","closed_at":"2026-01-10T22:15:09.282072-08:00","close_reason":"Squashed from 11 wisps","dependencies":[{"issue_id":"bd-qcts0","depends_on_id":"bd-wisp-3uv","type":"parent-child","created_at":"2026-01-10T22:15:09.285194-08:00","created_by":"beads/refinery"}]} +{"id":"bd-qcwsy","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T00:16:08.290726-08:00","created_by":"beads/refinery","updated_at":"2026-01-12T00:16:08.353902-08:00","closed_at":"2026-01-12T00:16:08.353902-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-qd5w","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T00:37:31.393703-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-07T00:37:31.426087-08:00","closed_at":"2026-01-07T00:37:31.426087-08:00","close_reason":"auto-closed session event"} {"id":"bd-qdsx","title":"Support daemon.auto_commit and daemon.auto_push in config.yaml (GH#871)","description":"Allow team-wide auto-sync settings via config.yaml instead of SQLite. This enables teams to share auto-commit/auto-push settings through version control.","status":"closed","priority":2,"issue_type":"feature","created_at":"2026-01-04T10:38:09.815971-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-04T10:42:32.823135-08:00","closed_at":"2026-01-04T10:42:32.823135-08:00","close_reason":"Fixed in 9880eaf7 - daemon.auto_* settings now in config.yaml"} {"id":"bd-qe7j","title":"Code smell: Incomplete TODOs in formula/types.go","description":"internal/formula/types.go has multiple TODO items for features that are defined in the schema but not implemented:\n\n- Line 170: Expand field not implemented in bd cook\n- Line 174: ExpandVars field not implemented\n- Line 179: Gate integration pending (bd-udsi gates)\n- Line 186: Condition evaluation not implemented\n- Line 210: Additional expansion features\n\n**Problem:**\n- Schema defines features that aren't implemented\n- Can confuse users who try to use these fields\n- Creates maintenance burden of unused code paths\n\n**Acceptance Criteria:**\n- [ ] Either implement the features OR\n- [ ] Remove unimplemented fields from schema OR\n- [ ] Document clearly which fields are future-only\n- [ ] Update related beads issues if they exist","status":"closed","priority":3,"issue_type":"chore","created_at":"2025-12-28T18:59:59.460434-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-30T15:44:43.358286-08:00","closed_at":"2025-12-30T00:39:56.504522-08:00","close_reason":"Merged via refinery","dependencies":[{"issue_id":"bd-qe7j","depends_on_id":"bd-ox1o","type":"blocks","created_at":"2025-12-28T19:00:23.747872-08:00","created_by":"daemon"}]} @@ -2081,6 +2091,7 @@ {"id":"bd-uyf3","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-06T23:52:08.520371-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-06T23:52:08.556361-08:00","closed_at":"2026-01-06T23:52:08.556361-08:00","close_reason":"auto-closed session event"} {"id":"bd-uyq10","title":"Digest: mol-refinery-patrol","description":"Patrol: queue empty, main synced to 355ce734","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-11T18:45:37.150101-08:00","updated_at":"2026-01-11T18:45:37.150101-08:00","closed_at":"2026-01-11T18:45:37.149985-08:00","close_reason":"Squashed from 11 wisps","dependencies":[{"issue_id":"bd-uyq10","depends_on_id":"bd-wisp-i97","type":"parent-child","created_at":"2026-01-11T18:45:37.151093-08:00","created_by":"beads/refinery"}]} {"id":"bd-uyrt4","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T12:38:29.302861-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T12:38:29.336056-08:00","closed_at":"2026-01-09T12:38:29.336056-08:00","close_reason":"auto-closed session event"} +{"id":"bd-uz6oq","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T00:08:16.910485-08:00","created_by":"beads/refinery","updated_at":"2026-01-12T00:08:16.978274-08:00","closed_at":"2026-01-12T00:08:16.978274-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-uz8r","title":"Phase 2.3: TOON deletion tracking","description":"Implement deletion tracking in TOON format.\n\n## Overview\nPhase 2.2 switched storage to TOON format. Phase 2.3 adds deletion tracking in TOON format for propagating deletions across clones.\n\n## Required Work\n\n### 2.3.1 Deletion Tracking (TOON Format)\n- [ ] Implement deletions.toon file (tracking deleted issue records)\n- [ ] Add DeleteTracker struct to record deleted issue IDs and metadata\n- [ ] Update bdt delete command to record in deletions.toon\n- [ ] Design deletion record format (ID, timestamp, reason, hash)\n- [ ] Implement auto-prune of old deletion records (configurable TTL)\n\n### 2.3.2 Sync Propagation\n- [ ] Load deletions.toon during import\n- [ ] Remove deleted issues from local database when imported from remote\n- [ ] Handle edge cases (delete same issue in multiple clones)\n- [ ] Deletion ordering and conflict resolution\n\n### 2.3.3 Testing\n- [ ] Unit tests for deletion tracking\n- [ ] Integration tests for deletion propagation\n- [ ] Multi-clone deletion scenarios\n- [ ] TTL expiration tests\n\n## Success Criteria\n- deletions.toon stores deletion records in TOON format\n- Deletions propagate across clones via git sync\n- Old records auto-prune after TTL\n- All 70+ tests still passing\n- bdt delete command works seamlessly","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T14:37:23.722066816-07:00","updated_at":"2025-12-21T14:42:27.491932-08:00","closed_at":"2025-12-21T14:42:27.491932-08:00","dependencies":[{"issue_id":"bd-uz8r","depends_on_id":"bd-iic1","type":"discovered-from","created_at":"2025-12-19T14:37:23.726825771-07:00","created_by":"daemon"}]} {"id":"bd-v0lkx","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T21:05:39.667104-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T21:05:39.7386-08:00","closed_at":"2026-01-11T21:05:39.7386-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-v0x","title":"Auto-detect issue prefix from existing JSONL in 'bd init'","description":"When running `bd init` in a fresh clone with existing JSONL, it should auto-detect the issue prefix from the JSONL file instead of requiring `--prefix`.\n\nCurrently you must specify `--prefix ef` manually. But the JSONL file already contains issues like `ef-1it`, `ef-1jp` etc., so the prefix is known.\n\n**Ideal UX**:\n```\n$ bd init\nDetected issue prefix 'ef' from existing JSONL (38 issues).\n✓ Database initialized...\n```\n\nThis would make fresh clone hydration a single command: `bd init` with no flags.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-27T20:21:21.049215-08:00","updated_at":"2025-12-02T17:11:19.751009583-05:00","closed_at":"2025-11-28T21:57:11.164293-08:00"} @@ -2118,6 +2129,7 @@ {"id":"bd-vqh9","title":"Code smell: init.go is 1928 lines - needs splitting","description":"cmd/bd/init.go is 1928 lines covering multiple init modes, contributor/team setup, hooks setup, and stealth mode.\n\n**Problem:**\n- File is too large to understand and maintain\n- Multiple responsibilities within single file\n- Harder to test individual components\n\n**Acceptance Criteria:**\n- [ ] Split into logical files (init_setup.go, init_hooks.go, init_stealth.go, etc.)\n- [ ] Each file under 500 lines\n- [ ] No functionality changes\n- [ ] Tests pass","status":"closed","priority":2,"issue_type":"chore","created_at":"2025-12-28T18:58:59.37092-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T19:01:18.403417-08:00","closed_at":"2025-12-28T19:01:18.403417-08:00","dependencies":[{"issue_id":"bd-vqh9","depends_on_id":"bd-ox1o","type":"blocks","created_at":"2025-12-28T19:00:23.586968-08:00","created_by":"daemon"}]} {"id":"bd-vqm0","title":"Swarm: Code Review: Swarm commands consolidation","description":"Swarm molecule orchestrating epic bd-2ubv.\n\nEpic: bd-2ubv\nCoordinator: ","status":"closed","priority":2,"issue_type":"molecule","created_at":"2025-12-28T22:06:58.82489-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-29T13:40:29.709541-08:00","closed_at":"2025-12-29T13:40:29.709541-08:00","close_reason":"Stale/spurious - test artifacts, merged PRs, or auto-close candidates","dependencies":[{"issue_id":"bd-vqm0","depends_on_id":"bd-2ubv","type":"relates-to","created_at":"2025-12-28T22:06:58.825608-08:00","created_by":"beads/crew/dave"}]} {"id":"bd-vs9","title":"Fix unparam unused parameter in cmd/bd/doctor.go:541","description":"Linting issue: checkHooksQuick - path is unused (unparam) at cmd/bd/doctor.go:541:22. Error: func checkHooksQuick(path string) string {","status":"tombstone","priority":0,"issue_type":"bug","created_at":"2025-12-07T15:35:17.02177046-07:00","updated_at":"2025-12-25T01:21:01.952723-08:00","deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} +{"id":"bd-vtpd4","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T00:28:01.836025-08:00","created_by":"beads/refinery","updated_at":"2026-01-12T00:28:01.905304-08:00","closed_at":"2026-01-12T00:28:01.905304-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-vuc2","title":"Test issue B","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-04T11:26:51.502286-08:00","created_by":"beads/polecats/onyx","updated_at":"2026-01-04T11:27:38.789774-08:00","closed_at":"2026-01-04T11:27:38.789774-08:00","close_reason":"test cleanup"} {"id":"bd-vwjl","title":"Witness Patrol","description":"Per-rig worker monitor patrol loop with progressive nudging.","status":"closed","priority":2,"issue_type":"molecule","created_at":"2025-12-27T19:24:01.894777-08:00","created_by":"deacon","updated_at":"2026-01-09T21:15:43.012063-08:00","closed_at":"2026-01-09T21:15:43.012063-08:00","close_reason":"Orphaned patrol molecules"} {"id":"bd-vxdr","title":"Investigate database pollution - issue count anomalies","description":"Multiple repos showing inflated issue counts suggesting cross-repo pollution:\n- ~/src/dave/beads: 895 issues (675 open) - clearly polluted\n- ~/src/stevey/src/beads: 280 issues (expected ~209-220) - possibly polluted\n\nNeed to investigate:\n1. Source of pollution (multi-repo sync issues?)\n2. How many duplicate/foreign issues exist\n3. Whether recent sync operations caused cross-contamination\n4. How to clean up and prevent future pollution","notes":"Investigation findings:\n\n**Root cause identified:**\n- NOT cross-repo contamination\n- NOT automated test leakage (tests properly use t.TempDir())\n- Manual testing during template feature development (Nov 2-4)\n- Commit ba325a2: \"test issues were accidentally committed during template feature development\"\n\n**Database growth timeline:**\n- Nov 3: 19 issues (baseline)\n- Nov 2-5: +244 issues (massive development spike)\n- Nov 6-7: +40 issues (continued growth)\n- Current: 291 issues → 270 after cleanup\n\n**Test pollution breakdown:**\n- 21 issues matching \"Test \" prefix pattern\n- Most created Nov 2-5 during feature development\n- Pollution from manual `./bd create \"Test issue\"` commands in production workspace\n- All automated tests properly isolated with t.TempDir()\n\n**Cleanup completed:**\n- Ran scripts/cleanup-test-pollution.sh successfully\n- Removed 21 test issues\n- Database reduced from 291 → 270 issues (7.2% cleanup)\n- JSONL synced to git\n\n**Prevention strategy:**\n- Filed follow-up issue for prevention mechanisms\n- Script can be deleted once prevention is in place\n- Tests are already properly isolated - no code changes needed there","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-06T22:34:40.137483-08:00","updated_at":"2025-11-07T16:07:28.274136-08:00","closed_at":"2025-11-07T16:04:02.199807-08:00"} @@ -2168,12 +2180,16 @@ {"id":"bd-wisp-4qx","title":"mol-refinery-patrol","description":"Merge queue processor patrol loop.\n\nThe Refinery is the Engineer in the engine room. You process polecat branches, merging them to main one at a time with sequential rebasing.\n\n**The Scotty Test**: Before proceeding past any failure, ask yourself: \"Would Scotty walk past a warp core leak because it existed before his shift?\"\n\n## Merge Flow\n\nThe Refinery receives MERGE_READY mail from Witnesses when polecats complete work:\n\n```\nWitness Refinery Git\n │ │ │\n │ MERGE_READY │ │\n │─────────────────────────\u003e│ │\n │ │ │\n │ (verify branch) │\n │ │ fetch \u0026 rebase │\n │ │──────────────────────────\u003e│\n │ │ │\n │ (run tests) │\n │ │ │\n │ (if pass) │\n │ │ merge \u0026 push │\n │ │──────────────────────────\u003e│\n │ │ │\n │ MERGED │ │\n │\u003c─────────────────────────│ │\n │ │ │\n```\n\nAfter successful merge, Refinery sends MERGED mail back to Witness so it can\ncomplete cleanup (nuke the polecat worktree).","status":"closed","priority":2,"issue_type":"epic","assignee":"beads/refinery","created_at":"2026-01-10T23:19:39.804733-08:00","updated_at":"2026-01-10T23:26:02.8044-08:00","closed_at":"2026-01-10T23:26:02.8044-08:00","close_reason":"Patrol complete: queue empty, no branches to merge","ephemeral":true} {"id":"bd-wisp-540","title":"Update CHANGELOG.md","description":"Write the [Unreleased] section with all changes for 0.45.0.\n\nFormat: Keep a Changelog (https://keepachangelog.com)\n\nSections:\n- ### Added\n- ### Changed\n- ### Fixed\n- ### Documentation\n\nThe bump script will stamp the date automatically.\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.256772-08:00","updated_at":"2026-01-06T20:09:49.901996-08:00","closed_at":"2026-01-06T20:09:49.901996-08:00","close_reason":"CHANGELOG.md updated with 0.45.0 changes","dependencies":[{"issue_id":"bd-wisp-540","depends_on_id":"bd-wisp-9jo","type":"blocks","created_at":"2026-01-06T20:07:32.273791-08:00","created_by":"beads/crew/dave"}]} {"id":"bd-wisp-5yc","title":"Scan merge queue","description":"Check the beads merge queue - this is the SOURCE OF TRUTH for pending merges.\n\n```bash\ngit fetch --prune origin\ngt mq list \u003crig\u003e\n```\n\nThe beads MQ tracks all pending merge requests. Do NOT rely on `git branch -r | grep polecat`\nas branches may exist without MR beads, or MR beads may exist for already-merged work.\n\nIf queue empty, skip to context-check step.\n\nFor each MR in the queue, verify the branch still exists:\n```bash\ngit branch -r | grep \u003cbranch\u003e\n```\n\nIf branch doesn't exist for a queued MR:\n- Close the MR bead: `bd close \u003cmr-id\u003e --reason \"Branch no longer exists\"`\n- Remove from processing queue\n\nTrack verified MR list for this cycle.","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-11T14:50:43.332356-08:00","updated_at":"2026-01-11T14:50:43.332356-08:00","dependencies":[{"issue_id":"bd-wisp-5yc","depends_on_id":"bd-wisp-apf","type":"blocks","created_at":"2026-01-11T14:50:43.344514-08:00","created_by":"beads/refinery"}],"ephemeral":true} +{"id":"bd-wisp-6fb","title":"Check refinery mail","description":"Check mail for MERGE_READY submissions, escalations, and messages.\n\n```bash\ngt mail inbox\n```\n\nFor each message:\n\n**MERGE_READY**:\nA polecat's work is ready for merge. Extract details and track for processing.\n\n```bash\n# Parse MERGE_READY message body:\n# Branch: \u003cbranch\u003e\n# Issue: \u003cissue-id\u003e\n# Polecat: \u003cpolecat-name\u003e\n# MR: \u003cmr-bead-id\u003e\n# Verified: clean git state, issue closed\n\n# Track in your merge queue for this patrol cycle:\n# - Branch name\n# - Issue ID\n# - Polecat name (REQUIRED for MERGED notification)\n# - MR bead ID (REQUIRED for closing after merge)\n```\n\n**IMPORTANT**: You MUST track the polecat name, MR bead ID, AND message ID - you will need them\nin merge-push step to send MERGED notification, close the MR bead, and archive the mail.\n\nMark as read. The work will be processed in queue-scan/process-branch.\n**Do NOT archive yet** - archive after merge/reject decision in merge-push step.\n\n**PATROL: Wake up**:\nWitness detected MRs waiting but refinery idle. Acknowledge and archive:\n```bash\ngt mail archive \u003cmessage-id\u003e\n```\n\n**HELP / Blocked**:\nAssess and respond. If you can't help, escalate to Mayor.\nArchive after handling:\n```bash\ngt mail archive \u003cmessage-id\u003e\n```\n\n**HANDOFF**:\nRead predecessor context. Check for in-flight merges.\nArchive after absorbing context:\n```bash\ngt mail archive \u003cmessage-id\u003e\n```\n\n**Hygiene principle**: Archive messages after they're fully processed.\nKeep only: pending MRs in queue. Inbox should be near-empty.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T00:34:44.778123-08:00","updated_at":"2026-01-12T00:34:59.807466-08:00","closed_at":"2026-01-12T00:34:59.807466-08:00","close_reason":"No messages in inbox","dependencies":[{"issue_id":"bd-wisp-6fb","depends_on_id":"bd-wisp-bs7","type":"parent-child","created_at":"2026-01-12T00:34:44.781797-08:00","created_by":"beads/refinery"}],"ephemeral":true} {"id":"bd-wisp-734","title":"Run test suite","description":"Run the test suite.\n\n```bash\ngo test ./...\n```\n\nTrack results: pass count, fail count, specific failures.","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-11T14:50:43.332954-08:00","updated_at":"2026-01-11T14:50:43.332954-08:00","dependencies":[{"issue_id":"bd-wisp-734","depends_on_id":"bd-wisp-a9e","type":"blocks","created_at":"2026-01-11T14:50:43.346397-08:00","created_by":"beads/refinery"}],"ephemeral":true} {"id":"bd-wisp-7gd","title":"mol-refinery-patrol","description":"Merge queue processor patrol loop.\n\nThe Refinery is the Engineer in the engine room. You process polecat branches, merging them to main one at a time with sequential rebasing.\n\n**The Scotty Test**: Before proceeding past any failure, ask yourself: \"Would Scotty walk past a warp core leak because it existed before his shift?\"\n\n## Merge Flow\n\nThe Refinery receives MERGE_READY mail from Witnesses when polecats complete work:\n\n```\nWitness Refinery Git\n │ │ │\n │ MERGE_READY │ │\n │─────────────────────────\u003e│ │\n │ │ │\n │ (verify branch) │\n │ │ fetch \u0026 rebase │\n │ │──────────────────────────\u003e│\n │ │ │\n │ (run tests) │\n │ │ │\n │ (if pass) │\n │ │ merge \u0026 push │\n │ │──────────────────────────\u003e│\n │ │ │\n │ MERGED │ │\n │\u003c─────────────────────────│ │\n │ │ │\n```\n\nAfter successful merge, Refinery sends MERGED mail back to Witness so it can\ncomplete cleanup (nuke the polecat worktree).","status":"open","priority":2,"issue_type":"epic","created_at":"2026-01-10T23:36:16.074525-08:00","updated_at":"2026-01-10T23:36:16.074525-08:00","ephemeral":true} {"id":"bd-wisp-7qw","title":"Push to main","description":"Push the release commit to origin.\n\n```bash\ngit push origin main\n```\n\nIf rejected, someone else pushed. Pull, rebase, try again.\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.257955-08:00","updated_at":"2026-01-06T20:12:28.230572-08:00","closed_at":"2026-01-06T20:12:28.230572-08:00","close_reason":"Pushed to main","dependencies":[{"issue_id":"bd-wisp-7qw","depends_on_id":"bd-wisp-cf3","type":"blocks","created_at":"2026-01-06T20:07:32.279279-08:00","created_by":"beads/crew/dave"}]} {"id":"bd-wisp-84x","title":"Push release tag","description":"Push the version tag to trigger CI release.\n\n```bash\ngit push origin v0.45.0\n```\n\nThis triggers GitHub Actions to build artifacts and publish.\n\n**Phase 1 Complete**: After this step, signal phase-complete:\n```bash\ngt done --phase-complete\n```\n\nThe gate will block until CI finishes. A new session will resume at Phase 2.\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.258143-08:00","updated_at":"2026-01-06T20:12:35.736045-08:00","closed_at":"2026-01-06T20:12:35.736045-08:00","close_reason":"Tag v0.45.0 pushed - CI triggered","dependencies":[{"issue_id":"bd-wisp-84x","depends_on_id":"bd-wisp-7qw","type":"blocks","created_at":"2026-01-06T20:07:32.280347-08:00","created_by":"beads/crew/dave"}]} +{"id":"bd-wisp-8ke","title":"Run test suite","description":"Run the test suite.\n\n```bash\ngo test ./...\n```\n\nTrack results: pass count, fail count, specific failures.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T00:34:44.77926-08:00","updated_at":"2026-01-12T00:35:15.898241-08:00","closed_at":"2026-01-12T00:35:15.898241-08:00","close_reason":"Skipped - no branches in queue","dependencies":[{"issue_id":"bd-wisp-8ke","depends_on_id":"bd-wisp-bs7","type":"parent-child","created_at":"2026-01-12T00:34:44.787549-08:00","created_by":"beads/refinery"},{"issue_id":"bd-wisp-8ke","depends_on_id":"bd-wisp-s9j","type":"blocks","created_at":"2026-01-12T00:34:44.806934-08:00","created_by":"beads/refinery"}],"ephemeral":true} {"id":"bd-wisp-99t","title":"Gate: gh:run release.yml","description":"Async gate for step await-ci","status":"closed","priority":2,"issue_type":"gate","created_at":"2026-01-06T20:07:32.258514-08:00","updated_at":"2026-01-06T20:17:28.461889-08:00","closed_at":"2026-01-06T20:17:28.461889-08:00","close_reason":"Release workflow completed successfully"} {"id":"bd-wisp-9b0","title":"mol-refinery-patrol","description":"Merge queue processor patrol loop.\n\nThe Refinery is the Engineer in the engine room. You process polecat branches, merging them to main one at a time with sequential rebasing.\n\n**The Scotty Test**: Before proceeding past any failure, ask yourself: \"Would Scotty walk past a warp core leak because it existed before his shift?\"\n\n## Merge Flow\n\nThe Refinery receives MERGE_READY mail from Witnesses when polecats complete work:\n\n```\nWitness Refinery Git\n │ │ │\n │ MERGE_READY │ │\n │─────────────────────────\u003e│ │\n │ │ │\n │ (verify branch) │\n │ │ fetch \u0026 rebase │\n │ │──────────────────────────\u003e│\n │ │ │\n │ (run tests) │\n │ │ │\n │ (if pass) │\n │ │ merge \u0026 push │\n │ │──────────────────────────\u003e│\n │ │ │\n │ MERGED │ │\n │\u003c─────────────────────────│ │\n │ │ │\n```\n\nAfter successful merge, Refinery sends MERGED mail back to Witness so it can\ncomplete cleanup (nuke the polecat worktree).","status":"closed","priority":2,"issue_type":"epic","assignee":"beads/refinery","created_at":"2026-01-10T18:35:46.606209-08:00","updated_at":"2026-01-10T18:41:19.369613-08:00","closed_at":"2026-01-10T18:41:19.369613-08:00","close_reason":"Closed","ephemeral":true} +{"id":"bd-wisp-9ej","title":"Merge and push to main","description":"Merge to main and push. CRITICAL: Notifications come IMMEDIATELY after push.\n\n**Step 1: Merge and Push**\n```bash\ngit checkout main\ngit merge --ff-only temp\ngit push origin main\n```\n\n⚠️ **STOP HERE - DO NOT PROCEED UNTIL STEPS 2-3 COMPLETE**\n\n**Step 2: Send MERGED Notification (REQUIRED - DO THIS IMMEDIATELY)**\n\nRIGHT NOW, before any cleanup, send MERGED mail to Witness:\n\n```bash\ngt mail send \u003crig\u003e/witness -s \"MERGED \u003cpolecat-name\u003e\" -m \"Branch: \u003cbranch\u003e\nIssue: \u003cissue-id\u003e\nMerged-At: $(date -u +%Y-%m-%dT%H:%M:%SZ)\"\n```\n\nThis signals the Witness to nuke the polecat worktree. WITHOUT THIS NOTIFICATION,\nPOLECAT WORKTREES ACCUMULATE INDEFINITELY AND THE LIFECYCLE BREAKS.\n\n**Step 3: Close MR Bead (REQUIRED - DO THIS IMMEDIATELY)**\n\n⚠️ **VERIFICATION BEFORE CLOSING**: Confirm the work is actually on main:\n```bash\n# Get the commit message/issue from the branch\ngit log origin/main --oneline | grep \"\u003cissue-id\u003e\"\n# OR verify the commit SHA is on main:\ngit branch --contains \u003ccommit-sha\u003e | grep main\n```\n\nIf work is NOT on main, DO NOT close the MR bead. Investigate first.\n\n```bash\nbd close \u003cmr-bead-id\u003e --reason \"Merged to main at $(git rev-parse --short HEAD)\"\n```\n\nThe MR bead ID was in the MERGE_READY message or find via:\n```bash\nbd list --type=merge-request --status=open | grep \u003cpolecat-name\u003e\n```\n\n**VALIDATION**: The MR bead's source_issue should be a valid bead ID (gt-xxxxx),\nnot a branch name. If source_issue contains a branch name, flag for investigation.\n\n**Step 4: Archive the MERGE_READY mail (REQUIRED)**\n```bash\ngt mail archive \u003cmerge-ready-message-id\u003e\n```\nThe message ID was tracked when you processed inbox-check.\n\n**Step 5: Cleanup (only after Steps 2-4 confirmed)**\n```bash\ngit branch -d temp\ngit push origin --delete \u003cpolecat-branch\u003e\n```\n\n**VERIFICATION GATE**: You CANNOT proceed to loop-check without:\n- [x] MERGED mail sent to witness\n- [x] MR bead closed\n- [x] MERGE_READY mail archived\n\nIf you skipped notifications or archiving, GO BACK AND DO THEM NOW.\n\nMain has moved. Any remaining branches need rebasing on new baseline.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T00:34:44.779884-08:00","updated_at":"2026-01-12T00:35:17.476883-08:00","closed_at":"2026-01-12T00:35:17.476883-08:00","close_reason":"Skipped - no branches in queue","dependencies":[{"issue_id":"bd-wisp-9ej","depends_on_id":"bd-wisp-bs7","type":"parent-child","created_at":"2026-01-12T00:34:44.791376-08:00","created_by":"beads/refinery"},{"issue_id":"bd-wisp-9ej","depends_on_id":"bd-wisp-tkf","type":"blocks","created_at":"2026-01-12T00:34:44.811787-08:00","created_by":"beads/refinery"}],"ephemeral":true} +{"id":"bd-wisp-9go","title":"Burn and respawn or loop","description":"End of patrol cycle decision.\n\n**Step 1: Estimate remaining context**\n\nAsk yourself:\n- Have I processed many branches this cycle?\n- Is the conversation getting long?\n- Am I starting to lose track of earlier context?\n\nRule of thumb: If you've done 3+ merges or processed significant cleanup work,\nit's time for a fresh session.\n\n**Step 2: Decision tree**\n\nIf queue non-empty AND context LOW:\n- Squash this wisp to digest\n- Spawn fresh patrol wisp\n- Return to inbox-check\n\nIf queue empty OR context HIGH OR good stopping point:\n- Squash wisp with summary digest\n- Use `gt handoff` for clean session transition:\n\n```bash\ngt handoff -s \"Patrol complete\" -m \"Merged X branches, Y tests passed.\nQueue: empty/N remaining\nNext: [any notes for successor]\"\n```\n\n**Why gt handoff?**\n- Sends handoff mail to yourself with context\n- Respawns with fresh Claude instance\n- SessionStart hook runs gt prime\n- Successor picks up from your hook\n\n**DO NOT just exit.** Always use `gt handoff` for proper lifecycle.","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-12T00:34:44.781374-08:00","updated_at":"2026-01-12T00:34:44.781374-08:00","dependencies":[{"issue_id":"bd-wisp-9go","depends_on_id":"bd-wisp-bs7","type":"parent-child","created_at":"2026-01-12T00:34:44.800729-08:00","created_by":"beads/refinery"},{"issue_id":"bd-wisp-9go","depends_on_id":"bd-wisp-qx6","type":"blocks","created_at":"2026-01-12T00:34:44.825728-08:00","created_by":"beads/refinery"}],"ephemeral":true} {"id":"bd-wisp-9jo","title":"Review changes since last release","description":"Understand what's being released.\n\n```bash\ngit log $(git describe --tags --abbrev=0)..HEAD --oneline\n```\n\nCategorize changes:\n- Features (feat:)\n- Fixes (fix:)\n- Breaking changes\n- Documentation\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.256572-08:00","updated_at":"2026-01-06T20:08:55.146264-08:00","closed_at":"2026-01-06T20:08:55.146264-08:00","close_reason":"Reviewed 34 commits since v0.44.0","dependencies":[{"issue_id":"bd-wisp-9jo","depends_on_id":"bd-wisp-z85","type":"blocks","created_at":"2026-01-06T20:07:32.273034-08:00","created_by":"beads/crew/dave"}]} {"id":"bd-wisp-9ka","title":"Commit release","description":"Stage and commit all version changes.\n\n```bash\ngit add -A\ngit commit -m \"chore: Bump version to 0.45.0\"\n```\n\nReview the commit to ensure all expected files are included.\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.257545-08:00","updated_at":"2026-01-06T20:11:53.72207-08:00","closed_at":"2026-01-06T20:11:53.72207-08:00","close_reason":"Release committed","dependencies":[{"issue_id":"bd-wisp-9ka","depends_on_id":"bd-wisp-v0n","type":"blocks","created_at":"2026-01-06T20:07:32.277252-08:00","created_by":"beads/crew/dave"}]} {"id":"bd-wisp-9kb","title":"Update info.go versionChanges","description":"Add entry to versionChanges in cmd/bd/info.go.\n\nThis powers `bd info --whats-new` for agents.\n\n```go\n\"0.45.0\": {\n \"summary\": \"Brief description\",\n \"changes\": []string{\n \"Key change 1\",\n \"Key change 2\",\n },\n},\n```\n\nFocus on workflow-impacting changes agents need to know.\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.256963-08:00","updated_at":"2026-01-06T20:10:31.456687-08:00","closed_at":"2026-01-06T20:10:31.456687-08:00","close_reason":"info.go versionChanges updated for 0.45.0","dependencies":[{"issue_id":"bd-wisp-9kb","depends_on_id":"bd-wisp-540","type":"blocks","created_at":"2026-01-06T20:07:32.27459-08:00","created_by":"beads/crew/dave"}]} @@ -2182,6 +2198,8 @@ {"id":"bd-wisp-apf","title":"Check refinery mail","description":"Check mail for MERGE_READY submissions, escalations, and messages.\n\n```bash\ngt mail inbox\n```\n\nFor each message:\n\n**MERGE_READY**:\nA polecat's work is ready for merge. Extract details and track for processing.\n\n```bash\n# Parse MERGE_READY message body:\n# Branch: \u003cbranch\u003e\n# Issue: \u003cissue-id\u003e\n# Polecat: \u003cpolecat-name\u003e\n# MR: \u003cmr-bead-id\u003e\n# Verified: clean git state, issue closed\n\n# Track in your merge queue for this patrol cycle:\n# - Branch name\n# - Issue ID\n# - Polecat name (REQUIRED for MERGED notification)\n# - MR bead ID (REQUIRED for closing after merge)\n```\n\n**IMPORTANT**: You MUST track the polecat name, MR bead ID, AND message ID - you will need them\nin merge-push step to send MERGED notification, close the MR bead, and archive the mail.\n\nMark as read. The work will be processed in queue-scan/process-branch.\n**Do NOT archive yet** - archive after merge/reject decision in merge-push step.\n\n**PATROL: Wake up**:\nWitness detected MRs waiting but refinery idle. Acknowledge and archive:\n```bash\ngt mail archive \u003cmessage-id\u003e\n```\n\n**HELP / Blocked**:\nAssess and respond. If you can't help, escalate to Mayor.\nArchive after handling:\n```bash\ngt mail archive \u003cmessage-id\u003e\n```\n\n**HANDOFF**:\nRead predecessor context. Check for in-flight merges.\nArchive after absorbing context:\n```bash\ngt mail archive \u003cmessage-id\u003e\n```\n\n**Hygiene principle**: Archive messages after they're fully processed.\nKeep only: pending MRs in queue. Inbox should be near-empty.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-11T14:50:43.332033-08:00","updated_at":"2026-01-11T15:06:13.099965-08:00","closed_at":"2026-01-11T15:06:13.099965-08:00","close_reason":"Inbox empty, no messages","ephemeral":true} {"id":"bd-wisp-aut","title":"Generate handoff summary","description":"Summarize this patrol cycle.\n\n**VERIFICATION**: Before generating summary, confirm for each merged branch:\n- [ ] MERGED mail was sent to witness\n- [ ] MR bead was closed\n- [ ] MERGE_READY mail archived\n\nIf any notifications or archiving were missed, do them now!\n\nInclude in summary:\n- Branches merged (count, names)\n- MERGED mails sent (count - should match branches merged)\n- MR beads closed (count - should match branches merged)\n- MERGE_READY mails archived (count - should match branches merged)\n- Test results (pass/fail)\n- Branches with conflicts (count, names)\n- Conflict-resolution tasks created (IDs)\n- Issues filed (if any)\n- Any escalations sent\n\n**Conflict tracking is important** for monitoring MQ health. If many branches\nconflict, it may indicate main is moving too fast or branches are too stale.\n\nThis becomes the digest when the patrol is squashed.","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-11T14:50:43.334099-08:00","updated_at":"2026-01-11T14:50:43.334099-08:00","dependencies":[{"issue_id":"bd-wisp-aut","depends_on_id":"bd-wisp-3xy","type":"blocks","created_at":"2026-01-11T14:50:43.351822-08:00","created_by":"beads/refinery"}],"ephemeral":true} {"id":"bd-wisp-bkf","title":"Restart daemons","description":"Restart bd daemons to pick up new version.\n\n```bash\nbd daemons killall\n```\n\nDaemons will auto-restart with new version on next bd command.\n\nVerify:\n```bash\nbd daemons list\n```\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.259461-08:00","updated_at":"2026-01-06T20:18:20.108169-08:00","closed_at":"2026-01-06T20:18:20.108169-08:00","close_reason":"Release v0.45.0 complete","dependencies":[{"issue_id":"bd-wisp-bkf","depends_on_id":"bd-wisp-fm4","type":"blocks","created_at":"2026-01-06T20:07:32.290802-08:00","created_by":"beads/crew/dave"}]} +{"id":"bd-wisp-bmc","title":"Check for more work","description":"More branches to process?\n\n**Entry paths:**\n- Normal: After successful merge-push\n- Conflict-skip: After process-branch created conflict-resolution task\n\nIf yes: Return to process-branch with next branch.\nIf no: Continue to generate-summary.\n\n**Track for this cycle:**\n- branches_merged: count and names of successfully merged branches\n- branches_conflict: count and names of branches skipped due to conflicts\n- conflict_tasks: IDs of conflict-resolution tasks created\n\nThis tracking feeds into generate-summary for the patrol digest.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T00:34:44.780188-08:00","updated_at":"2026-01-12T00:35:19.408028-08:00","closed_at":"2026-01-12T00:35:19.408028-08:00","close_reason":"Queue was empty - no loop needed","dependencies":[{"issue_id":"bd-wisp-bmc","depends_on_id":"bd-wisp-bs7","type":"parent-child","created_at":"2026-01-12T00:34:44.793322-08:00","created_by":"beads/refinery"},{"issue_id":"bd-wisp-bmc","depends_on_id":"bd-wisp-9ej","type":"blocks","created_at":"2026-01-12T00:34:44.814328-08:00","created_by":"beads/refinery"}],"ephemeral":true} +{"id":"bd-wisp-bs7","title":"mol-refinery-patrol","description":"Merge queue processor patrol loop.\n\nThe Refinery is the Engineer in the engine room. You process polecat branches, merging them to main one at a time with sequential rebasing.\n\n**The Scotty Test**: Before proceeding past any failure, ask yourself: \"Would Scotty walk past a warp core leak because it existed before his shift?\"\n\n## Merge Flow\n\nThe Refinery receives MERGE_READY mail from Witnesses when polecats complete work:\n\n```\nWitness Refinery Git\n │ │ │\n │ MERGE_READY │ │\n │─────────────────────────\u003e│ │\n │ │ │\n │ (verify branch) │\n │ │ fetch \u0026 rebase │\n │ │──────────────────────────\u003e│\n │ │ │\n │ (run tests) │\n │ │ │\n │ (if pass) │\n │ │ merge \u0026 push │\n │ │──────────────────────────\u003e│\n │ │ │\n │ MERGED │ │\n │\u003c─────────────────────────│ │\n │ │ │\n```\n\nAfter successful merge, Refinery sends MERGED mail back to Witness so it can\ncomplete cleanup (nuke the polecat worktree).","status":"open","priority":2,"issue_type":"epic","created_at":"2026-01-12T00:34:44.777542-08:00","updated_at":"2026-01-12T00:34:44.777542-08:00","ephemeral":true} {"id":"bd-wisp-bye","title":"Run bump-version.sh","description":"Update all component versions atomically.\n\n```bash\n./scripts/bump-version.sh 0.45.0\n```\n\nThis updates:\n- cmd/bd/version.go\n- .claude-plugin/*.json\n- integrations/beads-mcp/pyproject.toml\n- integrations/beads-mcp/src/beads_mcp/__init__.py\n- npm-package/package.json\n- Hook templates\n- README.md\n- CHANGELOG.md (adds date)\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.257161-08:00","updated_at":"2026-01-06T20:11:24.896526-08:00","closed_at":"2026-01-06T20:11:24.896526-08:00","close_reason":"Version bumped and verified: 0.45.0","dependencies":[{"issue_id":"bd-wisp-bye","depends_on_id":"bd-wisp-9kb","type":"blocks","created_at":"2026-01-06T20:07:32.275432-08:00","created_by":"beads/crew/dave"}]} {"id":"bd-wisp-c3g","title":"mol-refinery-patrol","description":"Merge queue processor patrol loop.\n\nThe Refinery is the Engineer in the engine room. You process polecat branches, merging them to main one at a time with sequential rebasing.\n\n**The Scotty Test**: Before proceeding past any failure, ask yourself: \"Would Scotty walk past a warp core leak because it existed before his shift?\"\n\n## Merge Flow\n\nThe Refinery receives MERGE_READY mail from Witnesses when polecats complete work:\n\n```\nWitness Refinery Git\n │ │ │\n │ MERGE_READY │ │\n │─────────────────────────\u003e│ │\n │ │ │\n │ (verify branch) │\n │ │ fetch \u0026 rebase │\n │ │──────────────────────────\u003e│\n │ │ │\n │ (run tests) │\n │ │ │\n │ (if pass) │\n │ │ merge \u0026 push │\n │ │──────────────────────────\u003e│\n │ │ │\n │ MERGED │ │\n │\u003c─────────────────────────│ │\n │ │ │\n```\n\nAfter successful merge, Refinery sends MERGED mail back to Witness so it can\ncomplete cleanup (nuke the polecat worktree).","status":"open","priority":2,"issue_type":"epic","created_at":"2026-01-10T22:51:49.272262-08:00","updated_at":"2026-01-10T22:51:49.272262-08:00","ephemeral":true} {"id":"bd-wisp-cf3","title":"Create release tag","description":"Create annotated git tag.\n\n```bash\ngit tag -a v0.45.0 -m \"Release v0.45.0\"\n```\n\nVerify: `git tag -l | tail -5`\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.257743-08:00","updated_at":"2026-01-06T20:12:04.079541-08:00","closed_at":"2026-01-06T20:12:04.079541-08:00","close_reason":"Tag v0.45.0 created","dependencies":[{"issue_id":"bd-wisp-cf3","depends_on_id":"bd-wisp-9ka","type":"blocks","created_at":"2026-01-06T20:07:32.278265-08:00","created_by":"beads/crew/dave"}]} @@ -2193,18 +2211,24 @@ {"id":"bd-wisp-eh4","title":"Verify npm package","description":"Confirm npm package published.\n\n```bash\nnpm show @beads/bd version\n```\n\nShould show 0.45.0.\n\nAlso check: https://www.npmjs.com/package/@beads/bd\n\nNote: npm registry may have a small propagation delay (1-2 min).\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.258891-08:00","updated_at":"2026-01-06T20:17:52.238932-08:00","closed_at":"2026-01-06T20:17:52.238932-08:00","close_reason":"All release artifacts verified: GitHub (9 assets), npm 0.45.0, PyPI 0.45.0","dependencies":[{"issue_id":"bd-wisp-eh4","depends_on_id":"bd-wisp-u9o","type":"blocks","created_at":"2026-01-06T20:07:32.283957-08:00","created_by":"beads/crew/dave"}]} {"id":"bd-wisp-fbz","title":"Merge and push to main","description":"Merge to main and push. CRITICAL: Notifications come IMMEDIATELY after push.\n\n**Step 1: Merge and Push**\n```bash\ngit checkout main\ngit merge --ff-only temp\ngit push origin main\n```\n\n⚠️ **STOP HERE - DO NOT PROCEED UNTIL STEPS 2-3 COMPLETE**\n\n**Step 2: Send MERGED Notification (REQUIRED - DO THIS IMMEDIATELY)**\n\nRIGHT NOW, before any cleanup, send MERGED mail to Witness:\n\n```bash\ngt mail send \u003crig\u003e/witness -s \"MERGED \u003cpolecat-name\u003e\" -m \"Branch: \u003cbranch\u003e\nIssue: \u003cissue-id\u003e\nMerged-At: $(date -u +%Y-%m-%dT%H:%M:%SZ)\"\n```\n\nThis signals the Witness to nuke the polecat worktree. WITHOUT THIS NOTIFICATION,\nPOLECAT WORKTREES ACCUMULATE INDEFINITELY AND THE LIFECYCLE BREAKS.\n\n**Step 3: Close MR Bead (REQUIRED - DO THIS IMMEDIATELY)**\n\n⚠️ **VERIFICATION BEFORE CLOSING**: Confirm the work is actually on main:\n```bash\n# Get the commit message/issue from the branch\ngit log origin/main --oneline | grep \"\u003cissue-id\u003e\"\n# OR verify the commit SHA is on main:\ngit branch --contains \u003ccommit-sha\u003e | grep main\n```\n\nIf work is NOT on main, DO NOT close the MR bead. Investigate first.\n\n```bash\nbd close \u003cmr-bead-id\u003e --reason \"Merged to main at $(git rev-parse --short HEAD)\"\n```\n\nThe MR bead ID was in the MERGE_READY message or find via:\n```bash\nbd list --type=merge-request --status=open | grep \u003cpolecat-name\u003e\n```\n\n**VALIDATION**: The MR bead's source_issue should be a valid bead ID (gt-xxxxx),\nnot a branch name. If source_issue contains a branch name, flag for investigation.\n\n**Step 4: Archive the MERGE_READY mail (REQUIRED)**\n```bash\ngt mail archive \u003cmerge-ready-message-id\u003e\n```\nThe message ID was tracked when you processed inbox-check.\n\n**Step 5: Cleanup (only after Steps 2-4 confirmed)**\n```bash\ngit branch -d temp\ngit push origin --delete \u003cpolecat-branch\u003e\n```\n\n**VERIFICATION GATE**: You CANNOT proceed to loop-check without:\n- [x] MERGED mail sent to witness\n- [x] MR bead closed\n- [x] MERGE_READY mail archived\n\nIf you skipped notifications or archiving, GO BACK AND DO THEM NOW.\n\nMain has moved. Any remaining branches need rebasing on new baseline.","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-11T14:50:43.33352-08:00","updated_at":"2026-01-11T14:50:43.33352-08:00","dependencies":[{"issue_id":"bd-wisp-fbz","depends_on_id":"bd-wisp-kkf","type":"blocks","created_at":"2026-01-11T14:50:43.348874-08:00","created_by":"beads/refinery"}],"ephemeral":true} {"id":"bd-wisp-fm4","title":"Update local installation","description":"Update local bd to the new version.\n\nOption 1 - Homebrew:\n```bash\nbrew upgrade bd\n```\n\nOption 2 - Install script:\n```bash\ncurl -fsSL https://raw.githubusercontent.com/steveyegge/beads/main/scripts/install.sh | bash\n```\n\nVerify:\n```bash\nbd --version\n```\n\nShould show 0.45.0.\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.259261-08:00","updated_at":"2026-01-06T20:18:20.106709-08:00","closed_at":"2026-01-06T20:18:20.106709-08:00","close_reason":"Release v0.45.0 complete","dependencies":[{"issue_id":"bd-wisp-fm4","depends_on_id":"bd-wisp-gnr","type":"blocks","created_at":"2026-01-06T20:07:32.286541-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-wisp-fm4","depends_on_id":"bd-wisp-eh4","type":"blocks","created_at":"2026-01-06T20:07:32.287962-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-wisp-fm4","depends_on_id":"bd-wisp-04d","type":"blocks","created_at":"2026-01-06T20:07:32.289399-08:00","created_by":"beads/crew/dave"}]} +{"id":"bd-wisp-gco","title":"Check own context limit","description":"Check own context usage.\n\nIf context is HIGH (\u003e80%):\n- Write handoff summary\n- Prepare for burn/respawn\n\nIf context is LOW:\n- Can continue processing","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T00:34:44.780785-08:00","updated_at":"2026-01-12T00:35:30.918931-08:00","closed_at":"2026-01-12T00:35:30.918931-08:00","close_reason":"Context low - fresh session","dependencies":[{"issue_id":"bd-wisp-gco","depends_on_id":"bd-wisp-bs7","type":"parent-child","created_at":"2026-01-12T00:34:44.797162-08:00","created_by":"beads/refinery"},{"issue_id":"bd-wisp-gco","depends_on_id":"bd-wisp-ztj","type":"blocks","created_at":"2026-01-12T00:34:44.81984-08:00","created_by":"beads/refinery"}],"ephemeral":true} {"id":"bd-wisp-gnr","title":"Verify GitHub release","description":"Check the GitHub releases page.\n\nhttps://github.com/steveyegge/beads/releases/tag/v0.45.0\n\nVerify:\n- Release created\n- Binaries attached (linux, darwin, windows)\n- Checksums present\n\n```bash\ngh release view v0.45.0 --json assets --jq '.assets[].name'\n```\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.258704-08:00","updated_at":"2026-01-06T20:17:52.237306-08:00","closed_at":"2026-01-06T20:17:52.237306-08:00","close_reason":"All release artifacts verified: GitHub (9 assets), npm 0.45.0, PyPI 0.45.0","dependencies":[{"issue_id":"bd-wisp-gnr","depends_on_id":"bd-wisp-u9o","type":"blocks","created_at":"2026-01-06T20:07:32.282733-08:00","created_by":"beads/crew/dave"}]} {"id":"bd-wisp-i97","title":"mol-refinery-patrol","description":"Merge queue processor patrol loop.\n\nThe Refinery is the Engineer in the engine room. You process polecat branches, merging them to main one at a time with sequential rebasing.\n\n**The Scotty Test**: Before proceeding past any failure, ask yourself: \"Would Scotty walk past a warp core leak because it existed before his shift?\"\n\n## Merge Flow\n\nThe Refinery receives MERGE_READY mail from Witnesses when polecats complete work:\n\n```\nWitness Refinery Git\n │ │ │\n │ MERGE_READY │ │\n │─────────────────────────\u003e│ │\n │ │ │\n │ (verify branch) │\n │ │ fetch \u0026 rebase │\n │ │──────────────────────────\u003e│\n │ │ │\n │ (run tests) │\n │ │ │\n │ (if pass) │\n │ │ merge \u0026 push │\n │ │──────────────────────────\u003e│\n │ │ │\n │ MERGED │ │\n │\u003c─────────────────────────│ │\n │ │ │\n```\n\nAfter successful merge, Refinery sends MERGED mail back to Witness so it can\ncomplete cleanup (nuke the polecat worktree).","status":"closed","priority":2,"issue_type":"epic","assignee":"beads/refinery","created_at":"2026-01-11T18:41:41.403781-08:00","updated_at":"2026-01-11T18:48:24.943006-08:00","closed_at":"2026-01-11T18:48:24.943006-08:00","close_reason":"Patrol cycle: queue empty, no branches to merge, local main synced to 764f3747","ephemeral":true} {"id":"bd-wisp-kkf","title":"Handle test failures","description":"**VERIFICATION GATE**: This step enforces the Beads Promise.\n\nIf tests PASSED: This step auto-completes. Proceed to merge.\n\nIf tests FAILED:\n1. Diagnose: Is this a branch regression or pre-existing on main?\n2. If branch caused it:\n - Abort merge\n - Notify polecat: \"Tests failing. Please fix and resubmit.\"\n - Skip to loop-check\n3. If pre-existing on main:\n - Option A: Fix it yourself (you're the Engineer!)\n - Option B: File a bead: bd create --type=bug --priority=1 --title=\"...\"\n\n**GATE REQUIREMENT**: You CANNOT proceed to merge-push without:\n- Tests passing, OR\n- Fix committed, OR\n- Bead filed for the failure\n\nThis is non-negotiable. Never disavow. Never \"note and proceed.\" ","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-11T14:50:43.333236-08:00","updated_at":"2026-01-11T14:50:43.333236-08:00","dependencies":[{"issue_id":"bd-wisp-kkf","depends_on_id":"bd-wisp-734","type":"blocks","created_at":"2026-01-11T14:50:43.347585-08:00","created_by":"beads/refinery"}],"ephemeral":true} {"id":"bd-wisp-qm8","title":"mol-refinery-patrol","description":"Merge queue processor patrol loop.\n\nThe Refinery is the Engineer in the engine room. You process polecat branches, merging them to main one at a time with sequential rebasing.\n\n**The Scotty Test**: Before proceeding past any failure, ask yourself: \"Would Scotty walk past a warp core leak because it existed before his shift?\"\n\n## Merge Flow\n\nThe Refinery receives MERGE_READY mail from Witnesses when polecats complete work:\n\n```\nWitness Refinery Git\n │ │ │\n │ MERGE_READY │ │\n │─────────────────────────\u003e│ │\n │ │ │\n │ (verify branch) │\n │ │ fetch \u0026 rebase │\n │ │──────────────────────────\u003e│\n │ │ │\n │ (run tests) │\n │ │ │\n │ (if pass) │\n │ │ merge \u0026 push │\n │ │──────────────────────────\u003e│\n │ │ │\n │ MERGED │ │\n │\u003c─────────────────────────│ │\n │ │ │\n```\n\nAfter successful merge, Refinery sends MERGED mail back to Witness so it can\ncomplete cleanup (nuke the polecat worktree).","status":"open","priority":2,"issue_type":"epic","created_at":"2026-01-10T20:51:46.780686-08:00","updated_at":"2026-01-10T20:51:46.780686-08:00","ephemeral":true} +{"id":"bd-wisp-qx6","title":"End-of-cycle inbox hygiene","description":"Verify inbox hygiene before ending patrol cycle.\n\n**Step 1: Check inbox state**\n```bash\ngt mail inbox\n```\n\nInbox should contain ONLY:\n- Unprocessed MERGE_READY messages (will process next cycle)\n- Active work items\n\n**Step 2: Archive any stale messages**\n\nLook for messages that were processed but not archived:\n- PATROL: Wake up that was acknowledged → archive\n- HELP/Blocked that was handled → archive\n- MERGE_READY where merge completed but archive was missed → archive\n\n```bash\n# For each stale message found:\ngt mail archive \u003cmessage-id\u003e\n```\n\n**Step 3: Check for orphaned MR beads**\n\nLook for open MR beads with no corresponding branch:\n```bash\nbd list --type=merge-request --status=open\n```\n\nFor each open MR bead:\n1. Check if branch exists: `git ls-remote origin refs/heads/\u003cbranch\u003e`\n2. If branch gone, verify work is on main: `git log origin/main --oneline | grep \"\u003csource_issue\u003e\"`\n3. If work on main → close MR with reason \"Merged (verified on main)\"\n4. If work NOT on main → investigate before closing:\n - Check source_issue validity (should be gt-xxxxx, not branch name)\n - Search reflog/dangling commits if possible\n - If unverifiable, close with reason \"Unverifiable - no audit trail\"\n - File bead if this indicates lost work\n\n**NEVER close an MR bead without verifying the work landed or is unrecoverable.**\n\n**Goal**: Inbox should have ≤3 active messages at end of cycle.\nKeep only: pending MRs in queue.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T00:34:44.781078-08:00","updated_at":"2026-01-12T00:35:31.731741-08:00","closed_at":"2026-01-12T00:35:31.731741-08:00","close_reason":"No mail to process","dependencies":[{"issue_id":"bd-wisp-qx6","depends_on_id":"bd-wisp-bs7","type":"parent-child","created_at":"2026-01-12T00:34:44.798955-08:00","created_by":"beads/refinery"},{"issue_id":"bd-wisp-qx6","depends_on_id":"bd-wisp-gco","type":"blocks","created_at":"2026-01-12T00:34:44.822838-08:00","created_by":"beads/refinery"}],"ephemeral":true} {"id":"bd-wisp-r4u","title":"Burn and respawn or loop","description":"End of patrol cycle decision.\n\n**Step 1: Estimate remaining context**\n\nAsk yourself:\n- Have I processed many branches this cycle?\n- Is the conversation getting long?\n- Am I starting to lose track of earlier context?\n\nRule of thumb: If you've done 3+ merges or processed significant cleanup work,\nit's time for a fresh session.\n\n**Step 2: Decision tree**\n\nIf queue non-empty AND context LOW:\n- Squash this wisp to digest\n- Spawn fresh patrol wisp\n- Return to inbox-check\n\nIf queue empty OR context HIGH OR good stopping point:\n- Squash wisp with summary digest\n- Use `gt handoff` for clean session transition:\n\n```bash\ngt handoff -s \"Patrol complete\" -m \"Merged X branches, Y tests passed.\nQueue: empty/N remaining\nNext: [any notes for successor]\"\n```\n\n**Why gt handoff?**\n- Sends handoff mail to yourself with context\n- Respawns with fresh Claude instance\n- SessionStart hook runs gt prime\n- Successor picks up from your hook\n\n**DO NOT just exit.** Always use `gt handoff` for proper lifecycle.","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-11T14:50:43.334942-08:00","updated_at":"2026-01-11T14:50:43.334942-08:00","dependencies":[{"issue_id":"bd-wisp-r4u","depends_on_id":"bd-wisp-vgq","type":"blocks","created_at":"2026-01-11T14:50:43.356968-08:00","created_by":"beads/refinery"}],"ephemeral":true} +{"id":"bd-wisp-s9j","title":"Mechanical rebase","description":"Pick next branch from queue. Attempt mechanical rebase on current main.\n\n**Step 1: Checkout and attempt rebase**\n```bash\ngit checkout -b temp origin/\u003cpolecat-branch\u003e\ngit rebase origin/main\n```\n\n**Step 2: Check rebase result**\n\nThe rebase exits with:\n- Exit code 0: Success - proceed to run-tests\n- Exit code 1 (conflicts): Conflict detected - proceed to Step 3\n\nTo detect conflict state after rebase fails:\n```bash\n# Check if we're in a conflicted rebase state\nls .git/rebase-merge 2\u003e/dev/null \u0026\u0026 echo \"CONFLICT_STATE\"\n```\n\n**Step 3: Handle conflicts (if any)**\n\nIf rebase SUCCEEDED (exit code 0):\n- Skip to run-tests step (continue normal merge flow)\n\nIf rebase FAILED with conflicts:\n\n1. **Abort the rebase** (DO NOT leave repo in conflicted state):\n```bash\ngit rebase --abort\n```\n\n2. **Record conflict metadata**:\n```bash\n# Capture main SHA for reference\nMAIN_SHA=$(git rev-parse origin/main)\nBRANCH_SHA=$(git rev-parse origin/\u003cpolecat-branch\u003e)\n```\n\n3. **Create conflict-resolution task**:\n```bash\nbd create --type=task --priority=1 --title=\"Resolve merge conflicts: \u003coriginal-issue-title\u003e\" --description=\"## Conflict Resolution Required\n\nOriginal MR: \u003cmr-bead-id\u003e\nBranch: \u003cpolecat-branch\u003e\nOriginal Issue: \u003cissue-id\u003e\nConflict with main at: ${MAIN_SHA}\nBranch SHA: ${BRANCH_SHA}\n\n## Instructions\n1. Clone/checkout the branch\n2. Rebase on current main: git rebase origin/main\n3. Resolve conflicts\n4. Force push: git push -f origin \u003cbranch\u003e\n5. Close this task when done\n\nThe MR will be re-queued for processing after conflicts are resolved.\"\n```\n\n4. **Skip this MR** (do NOT delete branch or close MR bead):\n- Leave branch intact for conflict resolution\n- Leave MR bead open (will be re-processed after resolution)\n- Continue to loop-check for next branch\n\n**CRITICAL**: Never delete a branch that has conflicts. The branch contains\nthe original work and must be preserved for conflict resolution.\n\nTrack: rebase result (success/conflict), conflict task ID if created.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T00:34:44.7789-08:00","updated_at":"2026-01-12T00:35:15.077005-08:00","closed_at":"2026-01-12T00:35:15.077005-08:00","close_reason":"Skipped - no branches in queue","dependencies":[{"issue_id":"bd-wisp-s9j","depends_on_id":"bd-wisp-bs7","type":"parent-child","created_at":"2026-01-12T00:34:44.785768-08:00","created_by":"beads/refinery"},{"issue_id":"bd-wisp-s9j","depends_on_id":"bd-wisp-vqe","type":"blocks","created_at":"2026-01-12T00:34:44.804577-08:00","created_by":"beads/refinery"}],"ephemeral":true} +{"id":"bd-wisp-tkf","title":"Handle test failures","description":"**VERIFICATION GATE**: This step enforces the Beads Promise.\n\nIf tests PASSED: This step auto-completes. Proceed to merge.\n\nIf tests FAILED:\n1. Diagnose: Is this a branch regression or pre-existing on main?\n2. If branch caused it:\n - Abort merge\n - Notify polecat: \"Tests failing. Please fix and resubmit.\"\n - Skip to loop-check\n3. If pre-existing on main:\n - Option A: Fix it yourself (you're the Engineer!)\n - Option B: File a bead: bd create --type=bug --priority=1 --title=\"...\"\n\n**GATE REQUIREMENT**: You CANNOT proceed to merge-push without:\n- Tests passing, OR\n- Fix committed, OR\n- Bead filed for the failure\n\nThis is non-negotiable. Never disavow. Never \"note and proceed.\" ","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T00:34:44.779587-08:00","updated_at":"2026-01-12T00:35:16.670629-08:00","closed_at":"2026-01-12T00:35:16.670629-08:00","close_reason":"Skipped - no branches in queue","dependencies":[{"issue_id":"bd-wisp-tkf","depends_on_id":"bd-wisp-bs7","type":"parent-child","created_at":"2026-01-12T00:34:44.789407-08:00","created_by":"beads/refinery"},{"issue_id":"bd-wisp-tkf","depends_on_id":"bd-wisp-8ke","type":"blocks","created_at":"2026-01-12T00:34:44.809281-08:00","created_by":"beads/refinery"}],"ephemeral":true} {"id":"bd-wisp-u9o","title":"Await CI: release.yml completion","description":"Gate step: Wait for GitHub Actions release workflow to complete.\n\nThis gate blocks until the release.yml workflow run succeeds.\nThe Refinery auto-discovers the workflow run triggered by v0.45.0\nand closes this gate when it completes.\n\nExpected time: 5-10 minutes\n\nThe gate monitors:\n- Build artifacts (all platforms)\n- Test suite pass\n- npm publish\n- PyPI publish\n\nIf the workflow fails, this gate remains open and requires manual intervention.\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.258324-08:00","updated_at":"2026-01-06T20:17:28.463543-08:00","closed_at":"2026-01-06T20:17:28.463543-08:00","close_reason":"Release workflow completed successfully","dependencies":[{"issue_id":"bd-wisp-u9o","depends_on_id":"bd-wisp-99t","type":"blocks","created_at":"2026-01-06T20:07:32.268008-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-wisp-u9o","depends_on_id":"bd-wisp-84x","type":"blocks","created_at":"2026-01-06T20:07:32.281571-08:00","created_by":"beads/crew/dave"}]} {"id":"bd-wisp-uvd","title":"mol-refinery-patrol","description":"Merge queue processor patrol loop.\n\nThe Refinery is the Engineer in the engine room. You process polecat branches, merging them to main one at a time with sequential rebasing.\n\n**The Scotty Test**: Before proceeding past any failure, ask yourself: \"Would Scotty walk past a warp core leak because it existed before his shift?\"\n\n## Merge Flow\n\nThe Refinery receives MERGE_READY mail from Witnesses when polecats complete work:\n\n```\nWitness Refinery Git\n │ │ │\n │ MERGE_READY │ │\n │─────────────────────────\u003e│ │\n │ │ │\n │ (verify branch) │\n │ │ fetch \u0026 rebase │\n │ │──────────────────────────\u003e│\n │ │ │\n │ (run tests) │\n │ │ │\n │ (if pass) │\n │ │ merge \u0026 push │\n │ │──────────────────────────\u003e│\n │ │ │\n │ MERGED │ │\n │\u003c─────────────────────────│ │\n │ │ │\n```\n\nAfter successful merge, Refinery sends MERGED mail back to Witness so it can\ncomplete cleanup (nuke the polecat worktree).","status":"closed","priority":2,"issue_type":"epic","assignee":"beads/refinery","created_at":"2026-01-10T17:57:56.356923-08:00","updated_at":"2026-01-10T18:01:38.662587-08:00","closed_at":"2026-01-10T18:01:38.662587-08:00","close_reason":"Patrol: queue empty, no branches to merge","ephemeral":true} {"id":"bd-wisp-v0n","title":"Verify version consistency","description":"Confirm all versions match 0.45.0.\n\n```bash\ngrep 'Version = ' cmd/bd/version.go\njq -r '.version' .claude-plugin/plugin.json\njq -r '.version' npm-package/package.json\ngrep 'version = ' integrations/beads-mcp/pyproject.toml\n```\n\nAll should show 0.45.0.\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.257354-08:00","updated_at":"2026-01-06T20:11:24.898472-08:00","closed_at":"2026-01-06T20:11:24.898472-08:00","close_reason":"Version bumped and verified: 0.45.0","dependencies":[{"issue_id":"bd-wisp-v0n","depends_on_id":"bd-wisp-bye","type":"blocks","created_at":"2026-01-06T20:07:32.276314-08:00","created_by":"beads/crew/dave"}]} {"id":"bd-wisp-vgq","title":"End-of-cycle inbox hygiene","description":"Verify inbox hygiene before ending patrol cycle.\n\n**Step 1: Check inbox state**\n```bash\ngt mail inbox\n```\n\nInbox should contain ONLY:\n- Unprocessed MERGE_READY messages (will process next cycle)\n- Active work items\n\n**Step 2: Archive any stale messages**\n\nLook for messages that were processed but not archived:\n- PATROL: Wake up that was acknowledged → archive\n- HELP/Blocked that was handled → archive\n- MERGE_READY where merge completed but archive was missed → archive\n\n```bash\n# For each stale message found:\ngt mail archive \u003cmessage-id\u003e\n```\n\n**Step 3: Check for orphaned MR beads**\n\nLook for open MR beads with no corresponding branch:\n```bash\nbd list --type=merge-request --status=open\n```\n\nFor each open MR bead:\n1. Check if branch exists: `git ls-remote origin refs/heads/\u003cbranch\u003e`\n2. If branch gone, verify work is on main: `git log origin/main --oneline | grep \"\u003csource_issue\u003e\"`\n3. If work on main → close MR with reason \"Merged (verified on main)\"\n4. If work NOT on main → investigate before closing:\n - Check source_issue validity (should be gt-xxxxx, not branch name)\n - Search reflog/dangling commits if possible\n - If unverifiable, close with reason \"Unverifiable - no audit trail\"\n - File bead if this indicates lost work\n\n**NEVER close an MR bead without verifying the work landed or is unrecoverable.**\n\n**Goal**: Inbox should have ≤3 active messages at end of cycle.\nKeep only: pending MRs in queue.","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-11T14:50:43.334659-08:00","updated_at":"2026-01-11T14:50:43.334659-08:00","dependencies":[{"issue_id":"bd-wisp-vgq","depends_on_id":"bd-wisp-2wh","type":"blocks","created_at":"2026-01-11T14:50:43.355144-08:00","created_by":"beads/refinery"}],"ephemeral":true} +{"id":"bd-wisp-vqe","title":"Scan merge queue","description":"Check the beads merge queue - this is the SOURCE OF TRUTH for pending merges.\n\n```bash\ngit fetch --prune origin\ngt mq list \u003crig\u003e\n```\n\nThe beads MQ tracks all pending merge requests. Do NOT rely on `git branch -r | grep polecat`\nas branches may exist without MR beads, or MR beads may exist for already-merged work.\n\nIf queue empty, skip to context-check step.\n\nFor each MR in the queue, verify the branch still exists:\n```bash\ngit branch -r | grep \u003cbranch\u003e\n```\n\nIf branch doesn't exist for a queued MR:\n- Close the MR bead: `bd close \u003cmr-id\u003e --reason \"Branch no longer exists\"`\n- Remove from processing queue\n\nTrack verified MR list for this cycle.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T00:34:44.778524-08:00","updated_at":"2026-01-12T00:35:06.623602-08:00","closed_at":"2026-01-12T00:35:06.623602-08:00","close_reason":"Merge queue empty - no branches waiting","dependencies":[{"issue_id":"bd-wisp-vqe","depends_on_id":"bd-wisp-bs7","type":"parent-child","created_at":"2026-01-12T00:34:44.783927-08:00","created_by":"beads/refinery"},{"issue_id":"bd-wisp-vqe","depends_on_id":"bd-wisp-6fb","type":"blocks","created_at":"2026-01-12T00:34:44.802492-08:00","created_by":"beads/refinery"}],"ephemeral":true} {"id":"bd-wisp-w75","title":"Preflight: Check git status","description":"Ensure working tree is clean before starting release.\n\n```bash\ngit status\n```\n\nIf there are uncommitted changes, either:\n- Commit them first\n- Stash them: `git stash`\n- Abort and resolve\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.256152-08:00","updated_at":"2026-01-06T20:08:35.66615-08:00","closed_at":"2026-01-06T20:08:35.66615-08:00","close_reason":"Preflight checks passed"} {"id":"bd-wisp-xwx","title":"mol-refinery-patrol","description":"Merge queue processor patrol loop.\n\nThe Refinery is the Engineer in the engine room. You process polecat branches, merging them to main one at a time with sequential rebasing.\n\n**The Scotty Test**: Before proceeding past any failure, ask yourself: \"Would Scotty walk past a warp core leak because it existed before his shift?\"\n\n## Merge Flow\n\nThe Refinery receives MERGE_READY mail from Witnesses when polecats complete work:\n\n```\nWitness Refinery Git\n │ │ │\n │ MERGE_READY │ │\n │─────────────────────────\u003e│ │\n │ │ │\n │ (verify branch) │\n │ │ fetch \u0026 rebase │\n │ │──────────────────────────\u003e│\n │ │ │\n │ (run tests) │\n │ │ │\n │ (if pass) │\n │ │ merge \u0026 push │\n │ │──────────────────────────\u003e│\n │ │ │\n │ MERGED │ │\n │\u003c─────────────────────────│ │\n │ │ │\n```\n\nAfter successful merge, Refinery sends MERGED mail back to Witness so it can\ncomplete cleanup (nuke the polecat worktree).","status":"closed","priority":2,"issue_type":"epic","assignee":"beads/refinery","created_at":"2026-01-10T18:23:27.131593-08:00","updated_at":"2026-01-10T18:29:19.904299-08:00","closed_at":"2026-01-10T18:29:19.904299-08:00","close_reason":"Patrol complete: queue empty, no branches to merge","ephemeral":true} {"id":"bd-wisp-z85","title":"Preflight: Pull latest","description":"Ensure we're up to date with origin.\n\n```bash\ngit pull --rebase\n```\n\nResolve any conflicts before proceeding.\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.25637-08:00","updated_at":"2026-01-06T20:08:35.668191-08:00","closed_at":"2026-01-06T20:08:35.668191-08:00","close_reason":"Preflight checks passed","dependencies":[{"issue_id":"bd-wisp-z85","depends_on_id":"bd-wisp-w75","type":"blocks","created_at":"2026-01-06T20:07:32.272193-08:00","created_by":"beads/crew/dave"}]} +{"id":"bd-wisp-ztj","title":"Generate handoff summary","description":"Summarize this patrol cycle.\n\n**VERIFICATION**: Before generating summary, confirm for each merged branch:\n- [ ] MERGED mail was sent to witness\n- [ ] MR bead was closed\n- [ ] MERGE_READY mail archived\n\nIf any notifications or archiving were missed, do them now!\n\nInclude in summary:\n- Branches merged (count, names)\n- MERGED mails sent (count - should match branches merged)\n- MR beads closed (count - should match branches merged)\n- MERGE_READY mails archived (count - should match branches merged)\n- Test results (pass/fail)\n- Branches with conflicts (count, names)\n- Conflict-resolution tasks created (IDs)\n- Issues filed (if any)\n- Any escalations sent\n\n**Conflict tracking is important** for monitoring MQ health. If many branches\nconflict, it may indicate main is moving too fast or branches are too stale.\n\nThis becomes the digest when the patrol is squashed.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T00:34:44.780484-08:00","updated_at":"2026-01-12T00:35:24.735684-08:00","closed_at":"2026-01-12T00:35:24.735684-08:00","close_reason":"Summary: Queue empty, no branches processed this cycle","dependencies":[{"issue_id":"bd-wisp-ztj","depends_on_id":"bd-wisp-bs7","type":"parent-child","created_at":"2026-01-12T00:34:44.795336-08:00","created_by":"beads/refinery"},{"issue_id":"bd-wisp-ztj","depends_on_id":"bd-wisp-bmc","type":"blocks","created_at":"2026-01-12T00:34:44.816888-08:00","created_by":"beads/refinery"}],"ephemeral":true} {"id":"bd-wlzsd","title":"Merge: obsidian-mk99kht7","description":"branch: polecat/obsidian-mk99kht7\ntarget: main\nsource_issue: obsidian-mk99kht7\nrig: beads\nagent_bead: bd-beads-polecat-obsidian\nretry_count: 0\nlast_conflict_sha: null\nconflict_task_id: null","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T21:03:34.490385-08:00","created_by":"beads/polecats/obsidian","updated_at":"2026-01-10T21:53:11.57128-08:00","closed_at":"2026-01-10T21:53:11.57128-08:00","close_reason":"Branch no longer exists on remote","labels":["gt:merge-request"]} {"id":"bd-wmo","title":"PruneDeletions iterates map non-deterministically","description":"## Problem\n\n`PruneDeletions` iterates over `loadResult.Records` which is a map. Go maps iterate in random order, so:\n\n1. `result.PrunedIDs` order is non-deterministic\n2. `kept` slice order is non-deterministic → `WriteDeletions` output order varies\n\n## Location\n`internal/deletions/deletions.go:213`\n\n## Impact\n- Git diffs are noisy (file changes order on each prune)\n- Tests could be flaky if they depend on order\n- Harder to debug/audit\n\n## Fix\nSort by ID or timestamp before iterating:\n\n```go\n// Convert map to slice and sort\nvar records []DeletionRecord\nfor _, r := range loadResult.Records {\n records = append(records, r)\n}\nsort.Slice(records, func(i, j int) bool {\n return records[i].ID \u003c records[j].ID\n})\n```","status":"closed","priority":3,"issue_type":"bug","created_at":"2025-11-25T12:49:11.290916-08:00","updated_at":"2025-11-25T15:15:21.903649-08:00","closed_at":"2025-11-25T15:15:21.903649-08:00"} {"id":"bd-wn34g","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T16:33:37.9308-08:00","created_by":"beads/refinery","updated_at":"2026-01-10T16:33:37.997565-08:00","closed_at":"2026-01-10T16:33:37.997565-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} @@ -2215,6 +2239,7 @@ {"id":"bd-wr1sh","title":"Session ended: gt-beads-crew-giles","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T13:38:35.967504-08:00","created_by":"beads/crew/giles","updated_at":"2026-01-10T13:38:36.008725-08:00","closed_at":"2026-01-10T13:38:36.008725-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-wsqt","title":"bd sync outputs excessive 'Skipping' messages for tombstoned issues","description":"During sync, every tombstoned issue outputs a 'Skipping bd-xxx (in deletions manifest)' message. With 96+ tombstones, this creates ~200 lines of noise that obscures the actual sync status.\n\n**Current behavior:**\n```\nSkipping bd-0ih (in deletions manifest: deleted 0001-01-01 by )\nSkipping bd-0is (in deletions manifest: deleted 0001-01-01 by )\n... (96 more lines)\n✓ Sync complete\n```\n\n**Expected behavior:**\n- Suppress individual skip messages by default\n- Show summary: 'Skipped 96 tombstoned issues'\n- Or add --verbose flag to show individual skips\n\n**Impact:** Makes sync output unreadable, hard to spot actual errors or warnings.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-15T17:28:34.592319-08:00","updated_at":"2025-12-16T00:41:33.166393-08:00","closed_at":"2025-12-16T00:41:33.166393-08:00"} {"id":"bd-wta","title":"Add performance benchmarks for multi-repo hydration","description":"The contributor-workflow-analysis.md asserts sub-second queries (line 702) and describes smart caching via file mtime tracking (Decision #4, lines 584-618), but doesn't provide concrete performance benchmarks.\n\nVC's requirement (from VC feedback section):\n- Executor polls GetReadyWork() every 5-10 seconds\n- Queries must be sub-second (ideally \u003c100ms)\n- Smart caching must avoid re-parsing JSONLs on every query\n\nSuggested performance targets to validate:\n- File stat overhead: \u003c1ms per repo\n- Hydration (when needed): \u003c500ms for typical JSONL (\u003c25k)\n- Query (from cache): \u003c10ms\n- Total GetReadyWork(): \u003c100ms (VC's requirement)\n\nAlso test at scale:\n- N=1 repo (baseline)\n- N=3 repos (typical)\n- N=10 repos (edge case)\n\nThese benchmarks are critical for library consumers like VC that run automated polling loops.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-03T20:24:39.331528-08:00","updated_at":"2025-11-05T14:17:15.079226-08:00","closed_at":"2025-11-05T14:17:15.079226-08:00"} +{"id":"bd-wv0le","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T00:33:03.528736-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T00:33:03.599857-08:00","closed_at":"2026-01-12T00:33:03.599857-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-wv9l","title":"Code Review Sweep: thorough","description":"Perform thorough code review sweep based on accumulated activity.\n\n**AI Reasoning:**\nSignificant code activity with 7608 lines added and 120 files changed indicates substantial modifications. Multiple high-churn areas (cmd/bd, internal/rpc) suggest potential for subtle issues and emerging patterns that warrant review.\n\n**Scope:** thorough\n**Target Areas:** cmd/bd, internal/rpc, .beads\n**Estimated Files:** 12\n**Estimated Cost:** $5\n\n**Task:**\nReview files for non-obvious issues that agents miss during focused work:\n- Inefficiencies (algorithmic, resource usage)\n- Subtle bugs (race conditions, off-by-one, copy-paste)\n- Poor patterns (coupling, complexity, duplication)\n- Missing best practices (error handling, docs, tests)\n- Unnamed anti-patterns\n\nFile discovered issues with detailed reasoning and suggestions.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-21T23:23:16.056392-08:00","updated_at":"2025-12-14T00:32:11.049104-08:00","closed_at":"2025-12-13T23:33:16.519977-08:00"} {"id":"bd-wvoka","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T21:55:26.926721-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T21:55:26.995528-08:00","closed_at":"2026-01-11T21:55:26.995528-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-ww0g","title":"MCP server: \"No workspace set\" and \"chunk longer than limit\" errors","description":"Two related errors reported in beads-mcp v0.21:\n\n**Error 1: \"No workspace set\" after successful set_context**\n```\n✓ Set beads context\n✗ list\n Error calling tool 'list': No workspace set. Either provide workspace_root\n parameter or call set_context() first.\n```\n\nHypothesis: Environment variable persistence issue between MCP tool calls, or ContextVar not being set correctly by @with_workspace decorator.\n\n**Error 2: \"Separator is found, but chunk is longer than limit\"**\n```\n✗ list\n Error calling tool 'list': Separator is found, but chunk is longer than limit\n```\n\nHypothesis: MCP protocol output size limit exceeded. Large issue databases may produce JSON output that exceeds MCP stdio buffer limits.\n\nPlatform: Fedora 43, using copilot-cli with Sonnet 4.5\n\nWorkaround: CLI works fine (`bd list --status open --json`)","notes":"## Fixes Implemented\n\n**Issue 1: \"No workspace set\" after successful set_context** ✅ FIXED\n\nRoot cause: os.environ doesn't persist across MCP tool calls. When set_context() set BEADS_WORKING_DIR in os.environ, that change was lost on the next tool call.\n\nSolution:\n- Added module-level _workspace_context dict for persistent storage (server.py:51)\n- Modified set_context() to store in both persistent dict and os.environ (server.py:265-287)\n- Modified with_workspace() decorator to check persistent context first (server.py:129-133)\n- Updated where_am_i() to check persistent context (server.py:302-330)\n\n**Issue 2: \"chunk longer than limit\"** ✅ FIXED\n\nRoot cause: MCP stdio protocol has buffer limits. Large issue lists with full dependencies/dependents exceed this.\n\nSolution:\n- Reduced default list limit from 50 to 20 (server.py:356, models.py:122)\n- Reduced max list limit from 1000 to 100 (models.py:122)\n- Strip dependencies/dependents from list() and ready() responses (server.py:343-350, 368-373)\n- Full dependency details still available via show() command\n\n## Testing\n\n✅ Python syntax validated with py_compile\n✅ Changes are backward compatible\n✅ Persistent context falls back to os.environ for compatibility\n\nUsers should now be able to call set_context() once and have it persist across all subsequent tool calls. Large databases will no longer cause buffer overflow errors.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-07T14:32:18.315155-08:00","updated_at":"2025-11-07T21:02:55.470937-08:00","closed_at":"2025-11-07T16:53:46.929942-08:00"} @@ -2297,6 +2322,7 @@ {"id":"bd-yiigv","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T15:34:22.921317-08:00","created_by":"beads/refinery","updated_at":"2026-01-10T15:34:22.959566-08:00","closed_at":"2026-01-10T15:34:22.959566-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-yjer4","title":"Digest: mol-refinery-patrol","description":"Patrol: queue empty, updated main (3 commits), no work processed","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-11T00:00:07.77986-08:00","updated_at":"2026-01-11T00:00:07.77986-08:00","closed_at":"2026-01-11T00:00:07.779825-08:00","close_reason":"Squashed from 11 wisps","dependencies":[{"issue_id":"bd-yjer4","depends_on_id":"bd-wisp-19q","type":"parent-child","created_at":"2026-01-11T00:00:07.780798-08:00","created_by":"beads/refinery"}]} {"id":"bd-yk9iz","title":"Fix rename-prefix to update blocked_issues_cache (GH#1016)","description":"dispatched_by: beads/crew/dave\n\nbd rename-prefix doesn't update blocked_issues_cache table. Add rebuildBlockedCache() call after rename.","status":"closed","priority":2,"issue_type":"bug","assignee":"beads/crew/giles","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T20:42:20.668502-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-11T20:45:16.647304-08:00","closed_at":"2026-01-11T20:45:16.647304-08:00","close_reason":"Fixed by adding invalidateBlockedCache() call to RenameDependencyPrefix. Committed 02488952.","external_ref":"gh-1016"} +{"id":"bd-ykavk","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T00:11:56.241135-08:00","created_by":"beads/refinery","updated_at":"2026-01-12T00:11:56.305719-08:00","closed_at":"2026-01-12T00:11:56.305719-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-ykd9","title":"Add bd doctor --fix flag to automatically repair issues","description":"Add bd doctor --fix flag to automatically repair detected issues.\n\n## Current State\n- Doctor checks return issues with \"Fix\" field containing fix instructions\n- No automatic fix execution\n- User must manually follow fix instructions\n\n## Implementation\n\n### 1. Add --fix flag to doctor.go\n```go\n// In cmd/bd/doctor.go init()\ndoctorCmd.Flags().Bool(\"fix\", false, \"Automatically fix detected issues\")\ndoctorCmd.Flags().Bool(\"yes\", false, \"Skip confirmation prompts (use with --fix)\")\n```\n\n### 2. Create fix registry (cmd/bd/doctor/fix/registry.go)\n```go\npackage fix\n\n// Fixer can automatically repair an issue\ntype Fixer interface {\n // CanFix returns true if this fixer handles the given check name\n CanFix(checkName string) bool\n // Fix attempts to repair the issue, returns error if failed\n Fix(ctx context.Context, issue *CheckResult) error\n // Description returns human-readable description of what will be fixed\n Description() string\n}\n\nvar registry []Fixer\n\nfunc Register(f Fixer) {\n registry = append(registry, f)\n}\n\nfunc GetFixer(checkName string) Fixer {\n for _, f := range registry {\n if f.CanFix(checkName) {\n return f\n }\n }\n return nil\n}\n```\n\n### 3. Implement fixers (one per file)\n\n**cmd/bd/doctor/fix/hooks.go**\n```go\ntype HooksFixer struct{}\n\nfunc (f *HooksFixer) CanFix(name string) bool {\n return name == \"git-hooks\" || name == \"hooks-outdated\"\n}\n\nfunc (f *HooksFixer) Fix(ctx context.Context, issue *CheckResult) error {\n return hooks.Install(\".\", true) // force reinstall\n}\n\nfunc (f *HooksFixer) Description() string {\n return \"Reinstall git hooks\"\n}\n\nfunc init() {\n Register(\u0026HooksFixer{})\n}\n```\n\n**cmd/bd/doctor/fix/sync_branch.go**\n```go\ntype SyncBranchFixer struct{}\n\nfunc (f *SyncBranchFixer) CanFix(name string) bool {\n return name == \"sync-branch-missing\" || name == \"sync-branch-diverged\"\n}\n\nfunc (f *SyncBranchFixer) Fix(ctx context.Context, issue *CheckResult) error {\n // Reset to remote or create branch\n return syncbranch.ResetToRemote(ctx, repoRoot, branch, jsonlPath)\n}\n```\n\n**cmd/bd/doctor/fix/merge_driver.go**\n```go\ntype MergeDriverFixer struct{}\n\nfunc (f *MergeDriverFixer) CanFix(name string) bool {\n return name == \"merge-driver-missing\" || name == \"merge-driver-outdated\"\n}\n\nfunc (f *MergeDriverFixer) Fix(ctx context.Context, issue *CheckResult) error {\n return setupMergeDriver()\n}\n```\n\n### 4. Update doctor run logic\n\n```go\nfunc runDoctor(cmd *cobra.Command, args []string) {\n issues := runAllChecks()\n \n if \\!fixFlag {\n // Existing behavior - just display issues\n displayIssues(issues)\n return\n }\n \n // Collect fixable issues\n var fixable []FixableIssue\n for _, issue := range issues {\n if fixer := fix.GetFixer(issue.CheckName); fixer \\!= nil {\n fixable = append(fixable, FixableIssue{issue, fixer})\n }\n }\n \n if len(fixable) == 0 {\n fmt.Println(\"No automatically fixable issues found\")\n return\n }\n \n // Show what will be fixed\n fmt.Printf(\"Found %d fixable issues:\\n\", len(fixable))\n for i, f := range fixable {\n fmt.Printf(\" %d. [%s] %s\\n\", i+1, f.Issue.CheckName, f.Fixer.Description())\n }\n \n // Confirm unless --yes\n if \\!yesFlag {\n fmt.Print(\"\\nProceed with fixes? [Y/n] \")\n // ... read confirmation\n }\n \n // Apply fixes\n for _, f := range fixable {\n fmt.Printf(\"Fixing %s... \", f.Issue.CheckName)\n if err := f.Fixer.Fix(ctx, f.Issue); err \\!= nil {\n fmt.Printf(\"FAILED: %v\\n\", err)\n } else {\n fmt.Println(\"OK\")\n }\n }\n}\n```\n\n## Fixable Checks (Initial Set)\n\n| Check | Fixer | Action |\n|-------|-------|--------|\n| git-hooks | HooksFixer | Reinstall hooks |\n| hooks-outdated | HooksFixer | Update hooks |\n| merge-driver-missing | MergeDriverFixer | Configure merge driver |\n| sync-branch-diverged | SyncBranchFixer | Reset to remote |\n| daemon-version-mismatch | DaemonFixer | Restart daemon |\n\n## Testing\n```bash\n# Test with broken hooks\nrm .git/hooks/pre-commit\nbd doctor --fix --yes\n\n# Verify fix applied\nbd doctor # Should pass now\n```\n\n## Success Criteria\n- --fix flag triggers automatic repair\n- User prompted for confirmation (unless --yes)\n- Clear output showing what was fixed\n- Graceful handling of fix failures\n- At least 5 common issues auto-fixable","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-14T18:17:48.411264-08:00","updated_at":"2025-12-23T13:34:05.646445-08:00","closed_at":"2025-12-23T13:34:05.646445-08:00","dependencies":[{"issue_id":"bd-ykd9","depends_on_id":"bd-iz5t","type":"parent-child","created_at":"2025-12-23T12:44:07.732505-08:00","created_by":"daemon"}]} {"id":"bd-ykqu","title":"Add gate timeout tracking and notification","description":"Implement timeout and notification logic for gates.\n\n## Timeout Behavior\n1. Gate created with timeout (e.g., 30m)\n2. Deacon tracks elapsed time during patrol\n3. If timeout reached:\n - Notify all waiters: \"Gate timed out\"\n - Close gate with timeout reason\n - Waiter can retry, escalate, or fail gracefully\n\n## Notification\n- Use gt mail send to notify waiters\n- Include gate ID, await type, and reason in message\n- Support multiple waiters notification\n\n## Escalation Path\n- Witness sees stuck worker, nudges them\n- Worker can escalate to human if needed","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T11:44:40.1825-08:00","updated_at":"2025-12-23T12:19:44.362527-08:00","closed_at":"2025-12-23T12:19:44.362527-08:00","dependencies":[{"issue_id":"bd-ykqu","depends_on_id":"bd-udsi","type":"parent-child","created_at":"2025-12-23T11:44:53.072862-08:00","created_by":"daemon"},{"issue_id":"bd-ykqu","depends_on_id":"bd-is6m","type":"blocks","created_at":"2025-12-23T11:44:56.595085-08:00","created_by":"daemon"}]} {"id":"bd-yl6gd","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T08:22:07.455133-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T08:22:07.520023-08:00","closed_at":"2026-01-11T08:22:07.520023-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true}