From dedb5c57efd5e7168e1407192f447cb99b401804 Mon Sep 17 00:00:00 2001 From: beads/refinery Date: Sun, 11 Jan 2026 00:31:16 -0800 Subject: [PATCH] bd daemon sync: 2026-01-11 00:31:16 --- .beads/issues.jsonl | 160 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 152 insertions(+), 8 deletions(-) diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index cb7930b6..a613a136 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -35,13 +35,16 @@ {"id":"bd-0e3","title":"Remove duplicate countIssuesInJSONLFile function","description":"init.go and doctor.go both defined countIssuesInJSONLFile. Removed the init.go version which is now unused. The doctor.go version (which calls countJSONLIssues) is the canonical implementation.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-29T00:35:52.359237464-07:00","updated_at":"2025-11-29T00:36:18.03477857-07:00","closed_at":"2025-11-29T00:36:18.034782016-07:00","dependencies":[{"issue_id":"bd-0e3","depends_on_id":"bd-63l","type":"discovered-from","created_at":"2025-11-29T00:35:52.366221162-07:00","created_by":"matt"}]} {"id":"bd-0e3m","title":"Merge: jade-1767138549967","description":"branch: polecat/jade-1767138549967\ntarget: main\nsource_issue: jade-1767138549967\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T15:55:27.93798-08:00","created_by":"beads/polecats/jade","updated_at":"2025-12-30T18:12:30.971134-08:00","closed_at":"2025-12-30T18:11:08.020787-08:00"} {"id":"bd-0e74","title":"Comprehensive testing for separate branch workflow","description":"Comprehensive testing for separate branch workflow including unit tests, integration tests, and performance testing.\n\nTasks:\n- Unit tests for worktree management\n- Unit tests for config parsing\n- Integration tests: create/update/close → beads branch\n- Integration test: merge beads → main\n- Integration test: protected branch scenario\n- Integration test: network failure recovery\n- Integration test: config change handling\n- Manual testing guide\n- Performance testing (worktree overhead)\n\nTest scenarios: fresh setup, issue operations, merge workflow, protected branch, error handling, migration, multiple workspaces, sparse checkout\n\nEstimated effort: 4-5 days","notes":"Completed comprehensive test coverage. Added 4 new integration tests: config change handling, multiple concurrent clones (3-way), performance testing (avg 77ms \u003c 150ms target), and network failure recovery. All tests pass. Coverage includes fresh setup, issue ops, error handling, multiple workspaces, sparse checkout, config changes, network failures, and performance.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-02T15:22:35.580741-08:00","updated_at":"2025-12-14T12:12:46.529579-08:00","closed_at":"2025-11-02T21:40:35.337468-08:00","dependencies":[{"issue_id":"bd-0e74","depends_on_id":"bd-a101","type":"parent-child","created_at":"2025-11-02T15:22:51.348226-08:00","created_by":"stevey"}]} +{"id":"bd-0fhj2","title":"Session ended: gt-beads-crew-fang","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T13:39:16.74575-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-10T13:39:16.78045-08:00","closed_at":"2026-01-10T13:39:16.78045-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-0fvq","title":"bd doctor should recommend bd prime migration for existing repos","description":"bd doctor should detect old beads integration patterns and recommend migrating to bd prime approach.\n\n## Current behavior\n- bd doctor checks if Claude hooks are installed globally\n- Doesn't check project-level integration (AGENTS.md, CLAUDE.md)\n- Doesn't recommend migration for repos using old patterns\n\n## Desired behavior\nbd doctor should detect and suggest:\n\n1. **Old slash command pattern detected**\n - Check for /beads:* references in AGENTS.md, CLAUDE.md\n - Suggest: These slash commands are deprecated, use bd prime hooks instead\n \n2. **No agent documentation**\n - Check if AGENTS.md or CLAUDE.md exists\n - Suggest: Run 'bd onboard' or 'bd setup claude' to document workflow\n \n3. **Old MCP-only pattern**\n - Check for instructions to use MCP tools but no bd prime hooks\n - Suggest: Add bd prime hooks for better token efficiency\n\n4. **Migration path**\n - Show: 'Run bd setup claude to add SessionStart/PreCompact hooks'\n - Show: 'Update AGENTS.md to reference bd prime instead of slash commands'\n\n## Example output\n\n⚠ Warning: Old beads integration detected in CLAUDE.md\n Found: /beads:* slash command references (deprecated)\n Recommend: Migrate to bd prime hooks for better token efficiency\n Fix: Run 'bd setup claude' and update CLAUDE.md\n\n💡 Tip: bd prime + hooks reduces token usage by 80-99% vs slash commands\n MCP mode: ~50 tokens vs ~10.5k for full MCP scan\n CLI mode: ~1-2k tokens with automatic context recovery\n\n## Benefits\n- Helps existing repos adopt new best practices\n- Clear migration path for users\n- Better token efficiency messaging","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-12T03:20:25.567748-08:00","updated_at":"2025-12-23T22:33:23.931274-08:00","closed_at":"2025-12-23T22:33:23.931274-08:00"} {"id":"bd-0hi7","title":"Add --dry-run flag to bd create","description":"bd create should support a --dry-run flag to preview what would be created without actually creating the issue. Useful for scripting and validation.","status":"closed","priority":2,"issue_type":"feature","created_at":"2026-01-07T00:56:03.188474-08:00","created_by":"gastown/crew/george","updated_at":"2026-01-07T01:05:05.866595-08:00","closed_at":"2026-01-07T01:05:05.866595-08:00","close_reason":"Implemented --dry-run flag for bd create"} {"id":"bd-0io","title":"Sync should cleanup snapshot files after completion","description":"## Problem\n`bd sync` leaves orphaned merge artifact files (beads.base.jsonl, beads.left.jsonl) after completion, causing:\n1. Doctor warnings about 'Multiple JSONL files found'\n2. Confusion during debugging\n3. Potential stale data issues on next sync\n\n## Root Cause\n`SnapshotManager` creates these files for 3-way merge deletion tracking but `Cleanup()` is never called after sync completes (success or failure).\n\n## Fix\nCall `SnapshotManager.Cleanup()` at end of successful sync:\n\n```go\n// sync.go after successful validation\nsm := NewSnapshotManager(jsonlPath)\nsm.Cleanup()\n```\n\n## Files\n- cmd/bd/sync.go (add cleanup call)\n- cmd/bd/snapshot_manager.go (Cleanup method exists at line 188)","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-28T17:06:20.881183-08:00","updated_at":"2025-12-02T17:11:19.725746076-05:00","closed_at":"2025-11-28T21:53:44.37689-08:00"} +{"id":"bd-0j5si","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T14:53:02.03388-08:00","created_by":"beads/refinery","updated_at":"2026-01-10T14:53:02.070183-08:00","closed_at":"2026-01-10T14:53:02.070183-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-0j5y","title":"Merge: bd-05a8","description":"branch: polecat/valkyrie\ntarget: main\nsource_issue: bd-05a8\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-23T20:50:27.125378-08:00","updated_at":"2025-12-23T21:21:57.69697-08:00","closed_at":"2025-12-23T21:21:57.69697-08:00"} {"id":"bd-0kai","title":"Work on beads-ocs: Thin shim hooks to eliminate version d...","description":"Work on beads-ocs: Thin shim hooks to eliminate version drift (GH#615). Replace full hook scripts with thin shims that call bd hooks run. When done, submit MR (not PR) to integration branch for Refinery.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-19T22:57:22.91347-08:00","updated_at":"2025-12-20T00:49:51.926425-08:00","closed_at":"2025-12-19T23:24:08.828172-08:00"} {"id":"bd-0kue","title":"Merge: onyx-1767106262992","description":"branch: polecat/onyx-1767106262992\ntarget: main\nsource_issue: onyx-1767106262992\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T06:59:46.964658-08:00","created_by":"beads/polecats/onyx","updated_at":"2025-12-30T15:44:43.3647-08:00","closed_at":"2025-12-30T10:27:23.072233-08:00"} {"id":"bd-0kz8","title":"Fix default .beads/.gitignore to ignore merge artifacts (GH #274)","description":"Updated the default .gitignore template created by `bd init` to properly ignore merge artifacts and fix overly broad patterns.\n\nChanges:\n- Added `*.db?*` pattern for database files with query strings\n- Added explicit patterns for merge artifacts: beads.{base,left,right}.{jsonl,meta.json}\n- Changed `!*.jsonl` to `!issues.jsonl` to avoid including merge artifact JSONL files\n\nThis fixes GitHub issue #274 reported by rscorer.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-09T11:23:25.595551-08:00","updated_at":"2025-11-09T11:23:28.780095-08:00","closed_at":"2025-11-09T11:23:28.780095-08:00"} +{"id":"bd-0nn96","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T22:57:24.005917-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T22:57:24.043245-08:00","closed_at":"2026-01-09T22:57:24.043245-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-0oqz","title":"Add GetMoleculeProgress RPC endpoint","description":"New RPC endpoint to get detailed progress for a specific molecule. Returns: moleculeID, title, assignee, and list of steps with their status (done/current/ready/blocked), start/close times. Used when user expands a worker in the activity feed TUI.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-23T16:26:38.137866-08:00","updated_at":"2025-12-23T18:27:49.033335-08:00","closed_at":"2025-12-23T18:27:49.033335-08:00"} {"id":"bd-0qeg","title":"Fix bd doctor hash ID detection for short all-numeric hashes","description":"bd doctor incorrectly flags hash-based IDs as sequential when they are short (3-4 chars) and all-numeric (e.g., pf-158).\n\nRoot cause: isHashID() in cmd/bd/migrate_hash_ids.go:328-358 uses faulty heuristic:\n- For IDs \u003c 5 chars, only returns true if contains letters\n- But base36 hash IDs can be 3+ chars and all-numeric (MinLength: 3)\n- Example: pf-158 is valid hash ID but flagged as sequential\n\nFix: Check multiple IDs (10-20 samples) instead of single-ID pattern matching:\n- Sample IDs across database \n- Check majority pattern (sequential vs hash format)\n- Sequential: 1-4 digits (bd-1, bd-2...)\n- Hash: 3-8 chars base36 (pf-158, pf-3s9...)\n\nImpact: False positive warnings in bd doctor output","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-16T13:45:20.733761-08:00","updated_at":"2025-11-16T14:27:48.143485-08:00","closed_at":"2025-11-16T14:27:48.143485-08:00"} {"id":"bd-0qx5","title":"Implement Jira issue timestamp comparison for sync","description":"In cmd/bd/jira.go:633, there's a TODO for a full implementation that would fetch the Jira issue and compare timestamps to detect conflicts during sync.\n\nFile: cmd/bd/jira.go:633","status":"closed","priority":4,"issue_type":"feature","created_at":"2025-12-28T16:32:52.601594-08:00","created_by":"stevey","updated_at":"2025-12-30T18:12:30.977631-08:00","closed_at":"2025-12-30T16:00:07.968921-08:00","close_reason":"Implemented Jira timestamp comparison for sync. Added fetchJiraIssueTimestamp() to fetch timestamps from Jira REST API, updated detectJiraConflicts() to compare actual timestamps, and improved conflict resolution functions to display timestamp details."} @@ -54,6 +57,7 @@ {"id":"bd-0w5","title":"Fix update-hooks verification in version-bump.yaml","description":"The update-hooks task verification command at version-bump.yaml:358 always succeeds due to '|| echo ...' fallback. Remove the fallback so verification actually fails when hooks aren't installed.","status":"tombstone","priority":3,"issue_type":"bug","created_at":"2025-12-17T22:23:06.55467-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-0ydb","title":"Review PR #834: Add Windows ARM64 build support","description":"Review and potentially merge PR #834 from ramarivera adding native Windows ARM64 (aarch64) build support.\n\nKey changes:\n- GoReleaser: Added bd-windows-arm64 build configuration\n- CI Workflow: Installed gcc-mingw-w64-aarch64 toolchain\n- WinGet Manifest: Added ARM64 installer entry\n- Release Notes: Updated to mention Windows ARM64 support\n\nFixes #833. No code changes - purely build configuration.","status":"closed","priority":2,"issue_type":"task","assignee":"beads/crew/wolf","created_at":"2026-01-01T10:45:50.99742-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-01T10:50:05.502922-08:00","closed_at":"2026-01-01T10:50:05.502922-08:00","close_reason":"Reviewed PR #834. Requested changes: gcc-mingw-w64-aarch64 package doesn't exist in Ubuntu. Recommended using CGO_ENABLED=0 since ncruces/go-sqlite3 is CGO-free."} {"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-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"} @@ -62,6 +66,7 @@ {"id":"bd-11e0","title":"Database import silently fails when daemon version != CLI version","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-10-31T21:08:09.096749-07:00","updated_at":"2025-11-01T19:29:35.267817-07:00","closed_at":"2025-11-01T19:29:35.267817-07:00"} {"id":"bd-11lm","title":"Increase ClaudeStartTimeout for slow startup machines","description":"ClaudeStartTimeout is 15s but Claude can take 30s+ to start on some machines. If Claude takes longer than timeout, GUPP nudges arrive before Claude is ready.\n\nOptions:\n1. Increase timeout to 60s (simple)\n2. Improve WaitForClaudeReady detection (harder - has false positives)\n3. Retry nudge if no response within N seconds\n\nLocation: internal/constants/constants.go","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-30T21:20:58.529924-08:00","created_by":"mayor","updated_at":"2026-01-04T15:22:08.70212-08:00","closed_at":"2025-12-30T22:15:49.115555-08:00","close_reason":"Fixed: increased ClaudeStartTimeout from 15s to 60s in gastown commit 49117c9"} {"id":"bd-1200","title":"Merge: jasper-1767106250817","description":"branch: polecat/jasper-1767106250817\ntarget: main\nsource_issue: jasper-1767106250817\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T07:05:01.45534-08:00","created_by":"beads/polecats/jasper","updated_at":"2025-12-30T18:12:30.984243-08:00","closed_at":"2025-12-30T18:11:08.06873-08:00"} +{"id":"bd-120z3","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T15:02:38.013724-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T15:02:38.050763-08:00","closed_at":"2026-01-09T15:02:38.050763-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-1231","title":"CI failing on all 3/4 test jobs despite individual tests passing","description":"CI has been broken for a day+ with mysterious test failures. Issue #173 on GitHub tracks this.\n\n## Current Status\n- **Lint job**: ✅ PASSING\n- **Test (Linux)**: ❌ FAILING (exit code 1)\n- **Test (Windows)**: ❌ FAILING (exit code 1)\n- **Test Nix Flake**: ❌ FAILING (exit code 1)\n\n## Key Observations\nAll three failing jobs show identical pattern:\n- Individual test output shows PASS for every test\n- Final result: `FAIL github.com/steveyegge/beads/cmd/bd`\n- Exit code 1 despite no visible test failures\n- Last visible test output before failure: \"No Reason Issue\" test (TestCloseCommand/close_without_reason)\n\n## Investigation So Far\n1. All tests appear to pass when examined individually\n2. Likely causes:\n - Race detector finding data races during test cleanup (`-race` flag)\n - Panic/error occurring after main tests complete\n - Test harness issue not reporting actual failure\n - Possible regression from PR #203 (dependency_type changes)\n\n## Recent CI Runs\n- Run 19015040655 (latest): 3/4 failing\n- Multiple recent commits tried to fix Windows/lint issues\n- Agent on rrnewton/beads fork attempting fixes (2/4 passing there)\n\n## Next Steps\n1. Run tests locally with `-race -v` to see full output\n2. Check for unreported test failures or panics\n3. Examine test cleanup/teardown code\n4. Review recent changes around close command tests\n5. Consider if race detector is too sensitive or catching real issues","notes":"## Progress Update\n\n### ✅ Fixed (commits 09bd4d3, 21a29bc)\n1. **Daemon auto-import** - Always recompute content_hash in importer to avoid stale hashes\n2. **TestScripts failures** - Added bd binary to PATH for shell subprocess tests\n3. **Test infrastructure** - Added .gitignore to test repos, fixed last_import_time metadata\n\n### ✅ CI Status (Run 19015638968)\n- **Test (Linux)**: ✅ SUCCESS - All tests passing\n- **Test (Windows)**: ❌ FAILURE - Pre-existing Windows test failures\n- **Test Nix Flake**: ❌ FAILURE - Build fails with same test errors\n- **Lint**: ❌ FAILURE - Pre-existing issue in migrate.go:647\n\n### ❌ Remaining Issues (not related to original bd-1231)\n\n**Windows failures:**\n- TestFindDatabasePathEnvVar\n- TestHashIDs_MultiCloneConverge \n- TestHashIDs_IdenticalContentDedup\n- TestDatabaseReinitialization (5 subtests)\n- TestFindBeadsDir_NotFound\n- TestMetricsSnapshot/uptime\n\n**Lint failure:**\n- cmd/bd/migrate.go:647:37: cleanupWALFiles - result 0 (error) is always nil (unparam)\n\n**Nix failure:**\n- Build fails during test phase with same test errors\n\n### Next Steps\n1. Investigate Windows-specific test failures\n2. Fix linting issue in migrate.go\n3. Debug Nix build test failures","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-02T08:42:16.142128-08:00","updated_at":"2025-12-14T12:12:46.519626-08:00","closed_at":"2025-11-02T12:32:00.158346-08:00"} {"id":"bd-1258f","title":"Fix: bd doctor doesn't detect lefthook jobs syntax (GH#981)","description":"dispatched_by: beads/crew/dave\n\nGitHub issue #981. Doctor only detects lefthook 'commands' not 'jobs' syntax.","status":"closed","priority":2,"issue_type":"bug","assignee":"beads/crew/dave","created_at":"2026-01-09T22:20:15.272208-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-09T22:56:14.017859-08:00","closed_at":"2026-01-09T22:56:14.017859-08:00","close_reason":"Fixed: added support for lefthook jobs array syntax"} {"id":"bd-12c2","title":"Add comprehensive tests for show.go commands (show, update, edit, close)","description":"Need to add tests for cmd/bd/show.go which contains show, update, edit, and close commands.\n\n**Challenge**: The existing test patterns use rootCmd.SetArgs() and rootCmd.Execute(), but the global `store` variable needs to match what the commands use. Initial attempt created tests that failed with \"no issue found\" because the test's store instance wasn't the same as the command's store.\n\n**Files to test**:\n- show.go (contains showCmd, updateCmd, editCmd, closeCmd)\n\n**Coverage needed**:\n- show command (single issue, multiple issues, JSON output, with dependencies, with labels, with compaction)\n- update command (status, priority, title, assignee, description, multiple fields, multiple issues)\n- edit command (requires $EDITOR, may need mocking)\n- close command (single issue, multiple issues, with reason, JSON output)\n\n**Test approach**:\n1. Study working test patterns in init_test.go, list_test.go, etc.\n2. Ensure BEADS_NO_DAEMON=1 is set\n3. Properly initialize database with bd init\n4. Use the command's global store, not a separate instance\n5. May need to reset global state between tests\n\n**Success criteria**: \n- All test functions pass\n- Coverage for show.go increases significantly\n- Tests follow existing patterns in cmd/bd/*_test.go","status":"closed","priority":0,"issue_type":"task","created_at":"2025-10-31T20:08:40.545173-07:00","updated_at":"2025-10-31T20:19:22.411066-07:00","closed_at":"2025-10-31T20:19:22.411066-07:00"} @@ -74,6 +79,7 @@ {"id":"bd-16z7","title":"Update convoy queries to use labels","description":"Change convoy-related SQL queries to use gt:convoy label instead of TypeConvoy.\n\n## Work\n- Update closeConvoyIfComplete() in queries.go\n- Update closeConvoyIfCompleteTx() in transaction.go\n- Change issue_type='convoy' checks to label-based queries\n\n## Files\n- internal/storage/sqlite/queries.go\n- internal/storage/sqlite/transaction.go","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:40:23.24327-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-06T22:07:23.212033-08:00","closed_at":"2026-01-06T22:07:23.212033-08:00","close_reason":"Changed convoy queries to use gt:convoy label instead of issue_type","dependencies":[{"issue_id":"bd-16z7","depends_on_id":"bd-i54l","type":"parent-child","created_at":"2026-01-06T20:41:11.645917-08:00","created_by":"beads/crew/dave"}]} {"id":"bd-17d5","title":"bd sync false positive: conflict detection triggers on JSON-encoded angle brackets in issue content","description":"The bd sync --import-only command incorrectly detects conflict markers when issue descriptions contain the text '\u003c\u003c\u003c\u003c\u003c\u003c\u003c' or '\u003e\u003e\u003e\u003e\u003e\u003e\u003e' as legitimate content (e.g., documentation about git conflict markers).\n\n**Reproduction:**\n1. Create issue with design field containing: 'Read file, extract \u003c\u003c\u003c\u003c\u003c\u003c\u003c / ======= / \u003e\u003e\u003e\u003e\u003e\u003e\u003e markers'\n2. Export to JSONL (gets JSON-encoded as \\u003c\\u003c\\u003c...)\n3. Commit and push\n4. Pull from remote\n5. bd sync --import-only fails with: 'Git conflict markers detected in JSONL file'\n\n**Root cause:**\nThe conflict detection appears to decode JSON before checking for conflict markers, causing false positives when issue content legitimately contains these strings.\n\n**Expected behavior:**\nConflict detection should only trigger on actual git conflict markers (literal '\u003c\u003c\u003c\u003c\u003c\u003c\u003c' bytes in the raw file), not on JSON-encoded content within issue fields.\n\n**Test case:**\nVC project at ~/src/dave/vc has vc-85 'JSONL Conflict Parser' which documents conflict parsing and triggers this bug.\n\n**Suggested fixes:**\n1. Only scan for literal '\u003c\u003c\u003c\u003c\u003c\u003c\u003c' bytes (not decoded JSON content)\n2. Parse JSONL first and only flag unparseable lines\n3. Check git merge state (git status) to confirm actual conflict\n4. Add --skip-conflict-check flag for override","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-08T13:02:54.730745-08:00","updated_at":"2025-11-08T13:07:37.108225-08:00","closed_at":"2025-11-08T13:07:37.108225-08:00"} {"id":"bd-17fa2d21","title":"Batch test 2","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-29T15:29:01.877052-07:00","updated_at":"2025-10-31T12:00:43.183657-07:00","closed_at":"2025-10-31T12:00:43.183657-07:00"} +{"id":"bd-181ng","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T18:43:11.888621-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T18:43:11.922565-08:00","closed_at":"2026-01-09T18:43:11.922565-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-1863608e","title":"Add TestNWayCollision for 5+ clones","description":"## Overview\nAdd comprehensive tests for N-way (5+) collision resolution to verify the solution scales beyond 3 clones.\n\n## Purpose\nWhile TestThreeCloneCollision validates the basic N-way case, we need to verify:\n1. Solution scales to arbitrary N\n2. Performance is acceptable with more clones\n3. Convergence time is bounded\n4. No edge cases in larger collision groups\n\n## Implementation Tasks\n\n### 1. Create TestFiveCloneCollision\nFile: beads_twoclone_test.go (or new beads_nway_test.go)\n\n```go\nfunc TestFiveCloneCollision(t *testing.T) {\n // Test with 5 clones creating same ID with different content\n // Verify all 5 clones converge after sync rounds\n \n t.Run(\"SequentialSync\", func(t *testing.T) {\n testNCloneCollision(t, 5, \"A\", \"B\", \"C\", \"D\", \"E\")\n })\n \n t.Run(\"ReverseSync\", func(t *testing.T) {\n testNCloneCollision(t, 5, \"E\", \"D\", \"C\", \"B\", \"A\")\n })\n \n t.Run(\"RandomSync\", func(t *testing.T) {\n testNCloneCollision(t, 5, \"C\", \"A\", \"E\", \"B\", \"D\")\n })\n}\n```\n\n### 2. Implement generalized testNCloneCollision\nGeneralize the 3-clone test to handle arbitrary N:\n\n```go\nfunc testNCloneCollision(t *testing.T, numClones int, syncOrder ...string) {\n t.Helper()\n \n if len(syncOrder) != numClones {\n t.Fatalf(\"syncOrder length (%d) must match numClones (%d)\", \n len(syncOrder), numClones)\n }\n \n tmpDir := t.TempDir()\n \n // Setup remote and N clones\n remoteDir := setupBareRepo(t, tmpDir)\n cloneDirs := make(map[string]string)\n \n for i := 0; i \u003c numClones; i++ {\n name := string(rune('A' + i))\n cloneDirs[name] = setupClone(t, tmpDir, remoteDir, name)\n }\n \n // Each clone creates issue with same ID but different content\n for name, dir := range cloneDirs {\n createIssue(t, dir, fmt.Sprintf(\"Issue from clone %s\", name))\n }\n \n // Sync in specified order\n for _, name := range syncOrder {\n syncClone(t, cloneDirs[name], name)\n }\n \n // Final pull for convergence\n for name, dir := range cloneDirs {\n finalPull(t, dir, name)\n }\n \n // Verify all clones have all N issues\n expectedTitles := make(map[string]bool)\n for i := 0; i \u003c numClones; i++ {\n name := string(rune('A' + i))\n expectedTitles[fmt.Sprintf(\"Issue from clone %s\", name)] = true\n }\n \n for name, dir := range cloneDirs {\n titles := getTitles(t, dir)\n if !compareTitleSets(titles, expectedTitles) {\n t.Errorf(\"Clone %s missing issues: expected %v, got %v\", \n name, expectedTitles, titles)\n }\n }\n \n t.Log(\"✓ All\", numClones, \"clones converged successfully\")\n}\n```\n\n### 3. Add performance benchmarks\nTest convergence time and memory usage:\n\n```go\nfunc BenchmarkNWayCollision(b *testing.B) {\n for _, n := range []int{3, 5, 10, 20} {\n b.Run(fmt.Sprintf(\"N=%d\", n), func(b *testing.B) {\n for i := 0; i \u003c b.N; i++ {\n // Run N-way collision and measure time\n testNCloneCollisionBench(b, n)\n }\n })\n }\n}\n```\n\n### 4. Add convergence time tests\nVerify bounded convergence:\n\n```go\nfunc TestConvergenceTime(t *testing.T) {\n // Test that convergence happens within expected rounds\n // For N clones, should converge in at most N-1 sync rounds\n \n for n := 3; n \u003c= 10; n++ {\n t.Run(fmt.Sprintf(\"N=%d\", n), func(t *testing.T) {\n rounds := measureConvergenceRounds(t, n)\n maxExpected := n - 1\n if rounds \u003e maxExpected {\n t.Errorf(\"Convergence took %d rounds, expected ≤ %d\", \n rounds, maxExpected)\n }\n })\n }\n}\n```\n\n### 5. Add edge case tests\nTest boundary conditions:\n- All N clones have identical content (dedup works)\n- N-1 clones have same content, 1 differs\n- All N clones have unique content\n- Mix of collisions and non-collisions\n\n## Acceptance Criteria\n- TestFiveCloneCollision passes with all sync orders\n- All 5 clones converge to identical content\n- Performance is acceptable (\u003c 5 seconds for 5 clones)\n- Convergence time is bounded (≤ N-1 rounds)\n- Edge cases handled correctly\n- Benchmarks show scalability to 10+ clones\n\n## Files to Create/Modify\n- beads_twoclone_test.go or beads_nway_test.go\n- Add helper functions for N-clone setup\n\n## Testing Strategy\n\n### Test Matrix\n| N Clones | Sync Orders | Expected Result |\n|----------|-------------|-----------------|\n| 3 | A→B→C | Pass |\n| 3 | C→B→A | Pass |\n| 5 | A→B→C→D→E | Pass |\n| 5 | E→D→C→B→A | Pass |\n| 5 | Random | Pass |\n| 10 | Sequential | Pass |\n\n### Performance Targets\n- 3 clones: \u003c 2 seconds\n- 5 clones: \u003c 5 seconds\n- 10 clones: \u003c 15 seconds\n\n## Dependencies\n- Requires bd-cbed9619.5, bd-cbed9619.4, bd-0dcea000, bd-4d7fca8a to be completed\n- TestThreeCloneCollision must pass first\n\n## Success Metrics\n- All tests pass for N ∈ {3, 5, 10}\n- Convergence time scales linearly (O(N))\n- Memory usage reasonable (\u003c 100MB for 10 clones)\n- No data corruption or loss in any scenario","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-29T20:02:47.954306-07:00","updated_at":"2025-10-30T17:12:58.182217-07:00","closed_at":"2025-10-28T20:47:28.317007-07:00"} {"id":"bd-197b","title":"Set up WASM build pipeline","description":"Configure Go→WASM compilation pipeline. Child of epic bd-44d0.\n\n## Tasks\n- [ ] Create build-wasm.sh script (GOOS=js GOARCH=wasm)\n- [ ] Test basic WASM module loading in Node.js\n- [ ] Set up wasm_exec.js wrapper\n- [ ] Add WASM build to CI/CD\n- [ ] Document build process\n\n## Validation\n- bd.wasm compiles successfully\n- Can load in Node.js without errors\n- Bundle size \u003c10MB","status":"closed","priority":0,"issue_type":"task","created_at":"2025-11-02T18:33:19.407373-08:00","updated_at":"2025-12-14T12:12:46.565523-08:00","closed_at":"2025-11-05T00:55:48.755941-08:00","dependencies":[{"issue_id":"bd-197b","depends_on_id":"bd-44d0","type":"blocks","created_at":"2025-11-02T18:33:19.407904-08:00","created_by":"daemon"}]} {"id":"bd-19er","title":"Create backup and restore procedures","description":"Disaster recovery procedures for Agent Mail data.\n\nAcceptance Criteria:\n- Automated daily snapshots (GCP persistent disk)\n- SQLite backup script\n- Git repository backup\n- Restore procedure documentation\n- Test restore from backup\n\nFile: deployment/agent-mail/backup.sh","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-07T22:43:43.417403-08:00","updated_at":"2025-12-14T00:32:11.045902-08:00","closed_at":"2025-12-13T23:30:58.726086-08:00","dependencies":[{"issue_id":"bd-19er","depends_on_id":"bd-z3s3","type":"blocks","created_at":"2025-11-07T23:04:28.122501-08:00","created_by":"daemon"}]} @@ -105,6 +111,7 @@ {"id":"bd-1hu59","title":"Test failures: schema mismatch after owner field addition","description":"Pre-existing test failures detected during refinery patrol:\n\n1. cmd/bd: TestResolveProtoIDOrTitle - sql: expected 31 destination arguments in Scan, not 32\n2. internal/storage/sqlite: TestGetIssuesByLabel - same scan mismatch\n3. internal/storage/sqlite: TestMigrateContentHashColumn - no such column: owner\n\nRoot cause: The 'owner' field was added (ceb5769c) but tests/fixtures are not updated to match the new schema.\n\nFiles affected:\n- cmd/bd template tests\n- internal/storage/sqlite/labels_test.go\n- internal/storage/sqlite/migrations_test.go","status":"open","priority":1,"issue_type":"bug","created_at":"2026-01-10T22:00:41.275253-08:00","created_by":"beads/refinery","updated_at":"2026-01-10T22:00:41.275253-08:00"} {"id":"bd-1juu","title":"Merge: obsidian-mjxeci6l","description":"branch: polecat/obsidian-mjxeci6l\ntarget: main\nsource_issue: obsidian-mjxeci6l\nrig: beads\nagent_bead: bd-beads-polecat-obsidian","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2026-01-02T13:44:06.098083-08:00","created_by":"beads/polecats/obsidian","updated_at":"2026-01-02T17:14:50.490086-08:00","closed_at":"2026-01-02T17:14:50.490086-08:00","close_reason":"Orphaned MR - obsidian stopped (merged no-op), branch never pushed"} {"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-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"} @@ -122,10 +129,11 @@ {"id":"bd-1vv","title":"Add WebSocket support","description":"## Feature Request\n\n[Describe the desired feature]\n\n## Motivation\n\n[Why is this feature needed? What problem does it solve?]\n\n## Use Cases\n\n1. **Use Case 1**: [description]\n2. **Use Case 2**: [description]\n\n## Proposed Solution\n\n[High-level approach to implementing this feature]\n\n## Alternatives Considered\n\n- **Alternative 1**: [description and why not chosen]\n- **Alternative 2**: [description and why not chosen]\n","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-03T19:56:41.271215-08:00","updated_at":"2025-12-14T00:32:11.04773-08:00","closed_at":"2025-12-13T23:30:18.69345-08:00"} {"id":"bd-1wmwp","title":"Cost tracking performance and reliability improvements","description":"Post-merge improvements for the wisp-based cost tracking system (gt-cm900).\n\nThese are non-critical enhancements identified during code review.","status":"closed","priority":3,"issue_type":"epic","assignee":"mayor","created_at":"2026-01-08T22:54:54.812479-08:00","created_by":"mayor","updated_at":"2026-01-09T00:47:17.309176-08:00","closed_at":"2026-01-09T00:47:17.309176-08:00","close_reason":"All 4 child tasks completed and merged","dependencies":[{"issue_id":"bd-1wmwp","depends_on_id":"bd-3hqvs","type":"blocks","created_at":"2026-01-08T22:55:44.702562-08:00","created_by":"mayor"},{"issue_id":"bd-1wmwp","depends_on_id":"bd-i8zab","type":"blocks","created_at":"2026-01-08T22:55:44.730968-08:00","created_by":"mayor"},{"issue_id":"bd-1wmwp","depends_on_id":"bd-qv8f9","type":"blocks","created_at":"2026-01-08T22:55:44.758375-08:00","created_by":"mayor"},{"issue_id":"bd-1wmwp","depends_on_id":"bd-66z6a","type":"blocks","created_at":"2026-01-08T22:55:44.785431-08:00","created_by":"mayor"}]} {"id":"bd-1yi5","title":"Use -short flag in CI for PR checks","description":"Update CI configuration to use -short flag for PR checks, run full tests nightly.\n\nThe slow tests already support testing.Short() and will be skipped.\n\nExpected savings: ~20 seconds for PR checks (fast tests only)\n\nImplementation:\n- Update .github/workflows/ci.yml to add -short flag for PR tests\n- Create/update nightly workflow for full test runs\n- Update README/docs about test strategy\n\nFile: .github/workflows/ci.yml:30","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-04T01:24:17.279618-08:00","updated_at":"2025-11-04T10:25:10.616119-08:00","closed_at":"2025-11-04T10:25:10.616119-08:00","dependencies":[{"issue_id":"bd-1yi5","depends_on_id":"bd-l5gq","type":"blocks","created_at":"2025-11-04T01:24:17.280453-08:00","created_by":"daemon"}]} +{"id":"bd-1zxcy","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T15:02:35.139135-08:00","created_by":"beads/refinery","updated_at":"2026-01-10T15:02:35.177414-08:00","closed_at":"2026-01-10T15:02:35.177414-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-20j","title":"sync branch not match config","description":"./bd sync\n→ Exporting pending changes to JSONL...\n→ No changes to commit\n→ Pulling from sync branch 'gh-386'...\nError pulling from sync branch: failed to create worktree: failed to create worktree parent directory: mkdir /var/home/matt/dev/beads/worktree-db-fail/.git: not a directory\nmatt@blufin-framation ~/d/b/worktree-db-fail (worktree-db-fail) [1]\u003e bd config list\n\nConfiguration:\n auto_compact_enabled = false\n compact_batch_size = 50\n compact_model = claude-3-5-haiku-20241022\n compact_parallel_workers = 5\n compact_tier1_days = 30\n compact_tier1_dep_levels = 2\n compact_tier2_commits = 100\n compact_tier2_days = 90\n compact_tier2_dep_levels = 5\n compaction_enabled = false\n issue_prefix = worktree-db-fail\n sync.branch = worktree-db-fail","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-08T06:49:04.449094018-07:00","updated_at":"2025-12-29T14:03:14.980166-08:00","closed_at":"2025-12-29T14:03:14.980166-08:00","close_reason":"Config mismatch: added warning to bd config list when config.yaml overrides database settings. Worktree issue was already fixed by GH#639."} {"id":"bd-22e0bde9","title":"Add TestNWayCollision for 5+ clones","description":"## Overview\nAdd comprehensive tests for N-way (5+) collision resolution to verify the solution scales beyond 3 clones.\n\n## Purpose\nWhile TestThreeCloneCollision validates the basic N-way case, we need to verify:\n1. Solution scales to arbitrary N\n2. Performance is acceptable with more clones\n3. Convergence time is bounded\n4. No edge cases in larger collision groups\n\n## Implementation Tasks\n\n### 1. Create TestFiveCloneCollision\nFile: beads_twoclone_test.go (or new beads_nway_test.go)\n\n```go\nfunc TestFiveCloneCollision(t *testing.T) {\n // Test with 5 clones creating same ID with different content\n // Verify all 5 clones converge after sync rounds\n \n t.Run(\"SequentialSync\", func(t *testing.T) {\n testNCloneCollision(t, 5, \"A\", \"B\", \"C\", \"D\", \"E\")\n })\n \n t.Run(\"ReverseSync\", func(t *testing.T) {\n testNCloneCollision(t, 5, \"E\", \"D\", \"C\", \"B\", \"A\")\n })\n \n t.Run(\"RandomSync\", func(t *testing.T) {\n testNCloneCollision(t, 5, \"C\", \"A\", \"E\", \"B\", \"D\")\n })\n}\n```\n\n### 2. Implement generalized testNCloneCollision\nGeneralize the 3-clone test to handle arbitrary N:\n\n```go\nfunc testNCloneCollision(t *testing.T, numClones int, syncOrder ...string) {\n t.Helper()\n \n if len(syncOrder) != numClones {\n t.Fatalf(\"syncOrder length (%d) must match numClones (%d)\", \n len(syncOrder), numClones)\n }\n \n tmpDir := t.TempDir()\n \n // Setup remote and N clones\n remoteDir := setupBareRepo(t, tmpDir)\n cloneDirs := make(map[string]string)\n \n for i := 0; i \u003c numClones; i++ {\n name := string(rune('A' + i))\n cloneDirs[name] = setupClone(t, tmpDir, remoteDir, name)\n }\n \n // Each clone creates issue with same ID but different content\n for name, dir := range cloneDirs {\n createIssue(t, dir, fmt.Sprintf(\"Issue from clone %s\", name))\n }\n \n // Sync in specified order\n for _, name := range syncOrder {\n syncClone(t, cloneDirs[name], name)\n }\n \n // Final pull for convergence\n for name, dir := range cloneDirs {\n finalPull(t, dir, name)\n }\n \n // Verify all clones have all N issues\n expectedTitles := make(map[string]bool)\n for i := 0; i \u003c numClones; i++ {\n name := string(rune('A' + i))\n expectedTitles[fmt.Sprintf(\"Issue from clone %s\", name)] = true\n }\n \n for name, dir := range cloneDirs {\n titles := getTitles(t, dir)\n if !compareTitleSets(titles, expectedTitles) {\n t.Errorf(\"Clone %s missing issues: expected %v, got %v\", \n name, expectedTitles, titles)\n }\n }\n \n t.Log(\"✓ All\", numClones, \"clones converged successfully\")\n}\n```\n\n### 3. Add performance benchmarks\nTest convergence time and memory usage:\n\n```go\nfunc BenchmarkNWayCollision(b *testing.B) {\n for _, n := range []int{3, 5, 10, 20} {\n b.Run(fmt.Sprintf(\"N=%d\", n), func(b *testing.B) {\n for i := 0; i \u003c b.N; i++ {\n // Run N-way collision and measure time\n testNCloneCollisionBench(b, n)\n }\n })\n }\n}\n```\n\n### 4. Add convergence time tests\nVerify bounded convergence:\n\n```go\nfunc TestConvergenceTime(t *testing.T) {\n // Test that convergence happens within expected rounds\n // For N clones, should converge in at most N-1 sync rounds\n \n for n := 3; n \u003c= 10; n++ {\n t.Run(fmt.Sprintf(\"N=%d\", n), func(t *testing.T) {\n rounds := measureConvergenceRounds(t, n)\n maxExpected := n - 1\n if rounds \u003e maxExpected {\n t.Errorf(\"Convergence took %d rounds, expected ≤ %d\", \n rounds, maxExpected)\n }\n })\n }\n}\n```\n\n### 5. Add edge case tests\nTest boundary conditions:\n- All N clones have identical content (dedup works)\n- N-1 clones have same content, 1 differs\n- All N clones have unique content\n- Mix of collisions and non-collisions\n\n## Acceptance Criteria\n- TestFiveCloneCollision passes with all sync orders\n- All 5 clones converge to identical content\n- Performance is acceptable (\u003c 5 seconds for 5 clones)\n- Convergence time is bounded (≤ N-1 rounds)\n- Edge cases handled correctly\n- Benchmarks show scalability to 10+ clones\n\n## Files to Create/Modify\n- beads_twoclone_test.go or beads_nway_test.go\n- Add helper functions for N-clone setup\n\n## Testing Strategy\n\n### Test Matrix\n| N Clones | Sync Orders | Expected Result |\n|----------|-------------|-----------------|\n| 3 | A→B→C | Pass |\n| 3 | C→B→A | Pass |\n| 5 | A→B→C→D→E | Pass |\n| 5 | E→D→C→B→A | Pass |\n| 5 | Random | Pass |\n| 10 | Sequential | Pass |\n\n### Performance Targets\n- 3 clones: \u003c 2 seconds\n- 5 clones: \u003c 5 seconds\n- 10 clones: \u003c 15 seconds\n\n## Dependencies\n- Requires bd-cbed9619.5, bd-cbed9619.4, bd-cbed9619.3, bd-cbed9619.2 to be completed\n- TestThreeCloneCollision must pass first\n\n## Success Metrics\n- All tests pass for N ∈ {3, 5, 10}\n- Convergence time scales linearly (O(N))\n- Memory usage reasonable (\u003c 100MB for 10 clones)\n- No data corruption or loss in any scenario","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-29T23:05:13.974702-07:00","updated_at":"2025-10-31T12:00:43.197709-07:00","closed_at":"2025-10-31T12:00:43.197709-07:00"} {"id":"bd-23a8","title":"Test simple issue","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-02T17:11:04.464726-08:00","updated_at":"2025-11-04T11:10:23.529727-08:00","closed_at":"2025-11-04T11:10:23.529731-08:00"} -{"id":"bd-23jdp","title":"No ref test","status":"open","priority":1,"issue_type":"task","created_at":"2026-01-10T20:37:30.470102-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-10T20:37:30.470102-08:00"} +{"id":"bd-23jdp","title":"No ref test","status":"open","priority":1,"issue_type":"task","owner":"steve.yegge@gmail.com","created_at":"2026-01-10T20:37:30.470102-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-10T20:37:30.470102-08:00"} {"id":"bd-23z9","title":"Upgrade beads-mcp to 0.33.2","description":"Upgrade the MCP server via pip:\n\n```bash\npip install --upgrade beads-mcp\npip show beads-mcp | grep Version # Verify 0.33.2\n```\n\nNote: Restart Claude Code or MCP session to use new version.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T16:10:13.761057-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"} {"id":"bd-248bdc3e","title":"Add optional post-merge git hook example for bd sync","description":"Create example git hook that auto-runs bd sync after git pull/merge.\n\nAdd to examples/git-hooks/:\n- post-merge hook that checks if .beads/issues.jsonl changed\n- If changed: run `bd sync` automatically\n- Make it optional/documented (not auto-installed)\n\nBenefits:\n- Zero-friction sync after git pull\n- Complements auto-detection as belt-and-suspenders\n\nNote: post-merge hook already exists for pre-commit/post-merge. Extend it to support sync.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-25T22:47:14.668842-07:00","updated_at":"2025-12-14T12:12:46.506326-08:00","closed_at":"2025-11-06T19:51:37.787964-08:00"} {"id":"bd-2530","title":"Issue with labels","description":"This is a description","status":"closed","priority":0,"issue_type":"feature","created_at":"2025-10-31T21:40:34.630173-07:00","updated_at":"2025-11-01T11:11:57.93151-07:00","closed_at":"2025-11-01T11:11:57.93151-07:00"} @@ -167,6 +175,7 @@ {"id":"bd-2f0f","title":"Merge: obsidian-mjvtl03h","description":"branch: polecat/obsidian-mjvtl03h\ntarget: main\nsource_issue: obsidian-mjvtl03h\nrig: beads\nagent_bead: gt-beads-polecat-obsidian","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2026-01-01T11:12:56.221323-08:00","created_by":"beads/polecats/obsidian","updated_at":"2026-01-01T15:48:48.262491-08:00","closed_at":"2026-01-01T15:48:48.262491-08:00","close_reason":"Branch already merged and deleted by previous refinery session"} {"id":"bd-2f388ca7","title":"Fix TestTwoCloneCollision timeout","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-10-28T14:11:25.219607-07:00","updated_at":"2025-10-30T17:12:58.217635-07:00","closed_at":"2025-10-28T16:12:26.286611-07:00"} {"id":"bd-2fs7","title":"Move pour/ephemeral under bd mol subcommand","description":"For consistency, bd pour and bd ephemeral should become bd mol pour and bd mol ephemeral:\n\nCurrent:\n bd mol list # Available protos\n bd mol show \u003cid\u003e # Proto details\n bd pour \u003cproto\u003e # Create mol ← sticks out\n bd ephemeral \u003cproto\u003e # Create ephemeral ← sticks out \n bd mol bond \u003cproto\u003e \u003cparent\u003e # Attach to existing mol\n bd mol squash \u003cid\u003e # Condense to digest\n bd mol burn \u003cid\u003e # Discard\n\nProposed:\n bd mol list\n bd mol show \u003cid\u003e\n bd mol pour \u003cproto\u003e # Moved under mol\n bd mol ephemeral \u003cproto\u003e # Moved under mol\n bd mol bond \u003cproto\u003e \u003cparent\u003e\n bd mol squash \u003cid\u003e\n bd mol burn \u003cid\u003e\n\nAll molecule operations should be under bd mol for discoverability and consistency.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-26T23:36:23.945902-08:00","created_by":"stevey","updated_at":"2025-12-26T23:41:01.096333-08:00","closed_at":"2025-12-26T23:41:01.096333-08:00"} +{"id":"bd-2g79w","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-11T00:14:48.858858-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T00:14:48.893797-08:00","closed_at":"2026-01-11T00:14:48.893797-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-2gkg","title":"Fix path casing mismatch on macOS causing sync failures (GH#880)","description":"bd sync fails with exit status 128 when daemon started from terminal with different path casing than git worktree registry. macOS case-insensitive filesystem causes mismatch. Fix: normalize paths using realpath or canonical lowercase when daemon starts.","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-01-04T16:09:19.727279-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-04T16:11:30.968102-08:00","closed_at":"2026-01-04T16:11:30.968102-08:00","close_reason":"Fixed: use utils.PathsEqual() for case-insensitive path comparison in worktree validation"} {"id":"bd-2ifg","title":"bd-hv01: Silent partial deletion failures cause DB inconsistency","description":"Problem: deletion_tracking.go:76-77 logs deletion errors as warnings but continues. If deletion fails midway (database locked, disk full), some issues delete but others don't. System thinks all deletions succeeded.\n\nImpact: Database diverges from JSONL, silent corruption, issues may resurrect on next sync.\n\nFix: Collect errors and fail the operation:\nvar deletionErrors []error\nfor _, id := range acceptedDeletions {\n if err := d.DeleteIssue(ctx, id); err != nil {\n deletionErrors = append(deletionErrors, fmt.Errorf(\"issue %s: %w\", id, err))\n }\n}\nif len(deletionErrors) \u003e 0 {\n return false, fmt.Errorf(\"deletion failures: %v\", deletionErrors)\n}\n\nFiles: cmd/bd/deletion_tracking.go:73-82","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-06T18:16:19.465137-08:00","updated_at":"2025-11-06T18:46:55.901973-08:00","closed_at":"2025-11-06T18:46:55.901973-08:00","dependencies":[{"issue_id":"bd-2ifg","depends_on_id":"bd-rbxi","type":"parent-child","created_at":"2025-11-06T18:19:14.833477-08:00","created_by":"daemon"}]} {"id":"bd-2k5f","title":"GH#510: Document sync-branch worktree behavior","description":"User confused about beads creating worktree on main branch. Need docs explaining sync-branch worktree mechanism. See: https://github.com/steveyegge/beads/issues/510","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-14T16:31:58.800071-08:00","updated_at":"2025-12-16T01:27:29.057639-08:00","closed_at":"2025-12-16T01:27:29.057639-08:00"} @@ -244,8 +253,10 @@ {"id":"bd-3gc","title":"Audit remaining cmd/bd files for error handling consistency","description":"Extend ERROR_HANDLING_AUDIT.md to cover: daemon_sync.go, update.go, list.go, show.go, close.go, reopen.go, dep.go, label.go, comments.go, delete.go, compact.go, config.go, validate.go and other high-usage command files","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-24T00:28:55.890991-08:00","updated_at":"2025-12-02T17:11:19.730805433-05:00","closed_at":"2025-11-28T23:37:52.251887-08:00"} {"id":"bd-3ggb","title":"Rebuild local binary","description":"Build and verify: go build -o bd ./cmd/bd \u0026\u0026 ./bd version","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-18T22:43:03.101428-08:00","updated_at":"2025-12-24T16:25:30.089869-08:00","dependencies":[{"issue_id":"bd-3ggb","depends_on_id":"bd-qqc","type":"parent-child","created_at":"2025-12-18T22:43:16.748289-08:00","created_by":"daemon"},{"issue_id":"bd-3ggb","depends_on_id":"bd-4y4g","type":"blocks","created_at":"2025-12-18T22:43:20.950376-08:00","created_by":"daemon"}],"deleted_at":"2025-12-24T16:25:30.089869-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} {"id":"bd-3ghze","title":"Session ended: gt-beads-crew-fang","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T13:45:16.630678-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-09T13:45:16.667978-08:00","closed_at":"2026-01-09T13:45:16.667978-08:00","close_reason":"auto-closed session event"} +{"id":"bd-3h5z8","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T14:13:14.861861-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T14:13:14.89741-08:00","closed_at":"2026-01-09T14:13:14.89741-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-3hqvs","title":"Fix N+1 query pattern in querySessionCostWisps","description":"## Problem\n\n`querySessionCostWisps()` (internal/cmd/costs.go:1010-1026) makes a separate `bd show` call for each wisp. With many session cost wisps, this creates O(n) subprocess calls.\n\n## Location\n\ninternal/cmd/costs.go:1010-1026\n\n## Solution\n\nBatch the `bd show` calls - collect all wisp IDs first, then call `bd show id1 id2 id3...` once.\n\nSimilar pattern already exists in `querySessionEvents()` (lines 382-396).","status":"closed","priority":3,"issue_type":"task","assignee":"beads/polecats/obsidian","created_at":"2026-01-08T22:55:12.441572-08:00","created_by":"mayor","updated_at":"2026-01-09T00:27:43.046636-08:00","closed_at":"2026-01-09T00:27:43.046636-08:00","close_reason":"Fixed N+1 query by batching bd show calls into single command"} {"id":"bd-3j0zd","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T20:59:08.577039-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-07T20:59:08.61379-08:00","closed_at":"2026-01-07T20:59:08.61379-08:00","close_reason":"auto-closed session event"} +{"id":"bd-3jcq2","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T13:52:59.892608-08:00","created_by":"beads/refinery","updated_at":"2026-01-10T13:52:59.92813-08:00","closed_at":"2026-01-10T13:52:59.92813-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-3jcw","title":"activity.go: Missing test coverage","description":"The new activity.go command (from bd-xo1o.3) has no test coverage. At minimum, tests should cover:\n- parseDurationString() for various formats (5m, 1h, 2d, invalid)\n- filterEvents() for --mol and --type filtering\n- formatEvent() and getEventDisplay() for all mutation types\n\nDiscovered during code review of bd-xo1o implementation.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T04:06:15.563579-08:00","updated_at":"2025-12-23T04:14:56.150151-08:00","closed_at":"2025-12-23T04:14:56.150151-08:00"} {"id":"bd-3jrb","title":"bd close lacks cross-rig routing support","description":"The `bd close` command doesn't support cross-rig routing like `bd show` does.\n\n**Reproduction:**\n```\n# From gastown directory\nbd show bd-xyz # Works (routes to beads)\nbd close bd-xyz # Fails with 'no issue found matching'\n```\n\n**Root cause:**\n- `show.go` uses `needsRouting()` and `resolveAndGetIssueWithRouting()`\n- `close.go` only uses `utils.ResolvePartialIDs()` without routing\n\n**Other affected commands (likely):**\n- reopen\n- dep \n- comments\n- label\n- duplicate\n- defer/undefer\n\n**Fix:**\nAdd routing support to `close.go` similar to `show.go` lines 44-147.","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-01-01T11:20:41.195141-08:00","created_by":"gastown/crew/gus","updated_at":"2026-01-01T11:24:25.322979-08:00","closed_at":"2026-01-01T11:24:25.322979-08:00","close_reason":"test"} {"id":"bd-3mky","title":"Merge: amber-mk0evltm","description":"branch: polecat/amber-mk0evltm\ntarget: main\nsource_issue: amber-mk0evltm\nrig: beads\nagent_bead: bd-beads-polecat-amber\nretry_count: 0\nlast_conflict_sha: null\nconflict_task_id: null","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2026-01-04T16:21:45.827782-08:00","created_by":"beads/polecats/amber","updated_at":"2026-01-05T19:45:43.98093-08:00","closed_at":"2026-01-05T19:45:43.98093-08:00","close_reason":"Branch deleted, already merged"} @@ -264,14 +275,17 @@ {"id":"bd-401h","title":"Work on beads-7jl: Fix Windows installer file locking iss...","description":"Work on beads-7jl: Fix Windows installer file locking issue (GH#652). Close file handle before extraction in postinstall.js. When done, submit MR (not PR) to integration branch for Refinery.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-19T22:55:57.873767-08:00","updated_at":"2025-12-19T23:20:05.747664-08:00","closed_at":"2025-12-19T23:20:05.747664-08:00"} {"id":"bd-40a0","title":"bd doctor should check for multiple DBs, multiple JSONLs, daemon health","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-10-31T21:16:47.042913-07:00","updated_at":"2025-10-31T21:21:27.093525-07:00","closed_at":"2025-10-31T21:21:27.093525-07:00"} {"id":"bd-40c2","title":"bd init --from-jsonl: Skip git history scan","description":"## Problem\n\n`bd init` scans git history to find all issues ever created, which:\n- Resurrects deleted/compacted issues\n- Takes a long time on large repos\n- Defeats manual JSONL cleanup\n\n## Solution\n\nAdd `bd init --from-jsonl` flag that:\n1. Creates fresh database\n2. Imports ONLY from current .beads/issues.jsonl\n3. Skips git history scan entirely\n\n## Use Case\n\nAfter manually cleaning JSONL or receiving a clean JSONL from another source:\n```bash\n# Clean JSONL manually or via script\nbd init --from-jsonl # Use current JSONL as-is\n```\n\n(Moved from hq-c21fj)","status":"closed","priority":3,"issue_type":"feature","created_at":"2026-01-02T01:37:20.481211-08:00","created_by":"gastown/crew/joe","updated_at":"2026-01-02T12:41:30.784964-08:00","closed_at":"2026-01-02T12:41:30.784964-08:00","close_reason":"Duplicate of bd-c0b6"} +{"id":"bd-40ceb","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T18:37:41.200328-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T18:37:41.240457-08:00","closed_at":"2026-01-09T18:37:41.240457-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-411u","title":"Document BEADS_DIR pattern for multi-agent workspaces (Gas Town)","description":"Gas Town and similar multi-agent systems need to configure separate beads databases per workspace/rig, distinct from any project-level beads.\n\n## Use Case\n\nIn Gas Town:\n- Each 'rig' (managed project) has multiple agents (polecats, refinery, witness)\n- All agents in a rig should share a single beads database at the rig level\n- This should be separate from any .beads/ the project itself uses\n- The BEADS_DIR env var enables this\n\n## Documentation Needed\n\n1. Add a section to docs explaining BEADS_DIR for multi-agent setups\n2. Example: setting BEADS_DIR in agent startup scripts/hooks\n3. Clarify interaction with project-level .beads/ (BEADS_DIR takes precedence)\n\n## Current Support\n\nAlready implemented in internal/beads/beads.go:FindDatabasePath():\n- BEADS_DIR env var is checked first (preferred)\n- BEADS_DB env var still supported (deprecated)\n- Falls back to .beads/ search in tree\n\nJust needs documentation for the multi-agent workspace pattern.","status":"hooked","priority":3,"issue_type":"task","created_at":"2025-12-15T22:08:22.158027-08:00","updated_at":"2025-12-30T15:44:43.351778-08:00"} {"id":"bd-43xj","title":"Add thread-safety warning to git.ResetCaches() doc comment","description":"Code review finding from bd-7di fix.\n\nResetCaches() reassigns sync.Once values which is not thread-safe. While this is only used in tests (which are single-threaded), the function is exported and could be misused.\n\nAdd a warning comment:\n```go\n// ResetCaches resets all cached git information.\n// WARNING: Not thread-safe. Only call from single-threaded test contexts.\n```\n\nFile: internal/git/gitdir.go","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-25T22:08:51.125399-08:00","updated_at":"2025-12-25T22:43:54.508097-08:00","closed_at":"2025-12-25T22:43:54.508097-08:00"} {"id":"bd-4462","title":"Test basic bd commands in WASM (init, create, list)","description":"Compile and verify basic bd functionality works in WASM:\n- Test bd init --quiet\n- Test bd create with simple issue\n- Test bd list --json output\n- Verify SQLite database creation and queries work\n- Document any runtime issues or workarounds needed","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-02T21:58:07.291771-08:00","updated_at":"2025-11-02T23:07:10.273212-08:00","closed_at":"2025-11-02T23:07:10.273212-08:00","dependencies":[{"issue_id":"bd-4462","depends_on_id":"bd-44d0","type":"parent-child","created_at":"2025-11-02T22:23:49.448668-08:00","created_by":"stevey"},{"issue_id":"bd-4462","depends_on_id":"bd-b4b0","type":"blocks","created_at":"2025-11-02T22:23:55.596771-08:00","created_by":"stevey"}]} {"id":"bd-44d0","title":"WASM port of bd for Claude Code Web sandboxes","description":"Enable beads to work in Claude Code Web sandboxes by compiling bd to WebAssembly.\n\n## Problem\nClaude Code Web sandboxes cannot install bd CLI due to network restrictions:\n- GitHub releases return 403\n- go install fails with DNS errors\n- Binary cannot be downloaded\n\n## Solution\nCompile bd Go codebase to WASM, publish to npm as drop-in replacement.\n\n## Technical Approach\n- Use GOOS=js GOARCH=wasm to compile bd\n- modernc.org/sqlite already supports js/wasm target\n- Publish to npm as bd-wasm package\n- Full feature parity with bd CLI\n\n## Success Criteria\n- bd-wasm installs via npm in web sandbox\n- All core bd commands work identically\n- JSONL output matches native bd\n- Performance within 2x of native","notes":"WASM port abandoned - Claude Code Web has full VMs not browser restrictions. Better: npm + native binary","status":"closed","priority":0,"issue_type":"epic","created_at":"2025-11-02T18:32:27.660794-08:00","updated_at":"2025-12-14T12:12:46.553661-08:00","closed_at":"2025-11-02T23:36:38.679515-08:00"} {"id":"bd-44e","title":"Ensure deletions.jsonl is tracked in git","description":"Parent: bd-imj\n\nEnsure deletions.jsonl is tracked in git (not ignored).\n\nUpdate bd init and gitignore upgrade logic to:\n1. NOT add deletions.jsonl to .gitignore\n2. Ensure it is committed alongside beads.jsonl\n\nThe file must be in git for cross-clone propagation to work.\n\nAcceptance criteria:\n- bd init does not ignore deletions.jsonl\n- Existing .gitignore files are not broken\n- File appears in git status when modified","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-25T09:57:21.663196-08:00","updated_at":"2025-11-25T14:55:43.225883-08:00","closed_at":"2025-11-25T14:55:43.225883-08:00"} {"id":"bd-44u2","title":"Merge: obsidian-mjxbi027","description":"branch: polecat/obsidian-mjxbi027\ntarget: main\nsource_issue: obsidian-mjxbi027\nrig: beads\nagent_bead: bd-beads-polecat-obsidian","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2026-01-02T12:27:34.180445-08:00","created_by":"beads/polecats/obsidian","updated_at":"2026-01-02T13:41:56.628182-08:00","closed_at":"2026-01-02T13:41:56.628182-08:00","close_reason":"Branches merged, cleaning up stale MR beads"} +{"id":"bd-450ug","title":"Session ended: gt-beads-crew-grip","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T22:30:16.607791-08:00","created_by":"beads/crew/grip","updated_at":"2026-01-09T22:30:16.645155-08:00","closed_at":"2026-01-09T22:30:16.645155-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-45td","title":"Refactor: Extract shared child-fetching logic in swarm.go","description":"Lines 162-181 (analyzeEpicForSwarm) and 630-649 (getSwarmStatus) have identical logic for fetching epic children via parent-child dependencies.\n\nExtract to a shared helper function like:\n\n```go\nfunc getEpicChildren(ctx context.Context, s StorageInterface, epicID string) ([]*types.Issue, error)\n```\n\nThis will reduce duplication and ensure consistent behavior between validate/status/create commands.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-28T21:37:54.16697-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T21:54:58.827802-08:00","closed_at":"2025-12-28T21:54:58.827802-08:00","dependencies":[{"issue_id":"bd-45td","depends_on_id":"bd-2ubv","type":"parent-child","created_at":"2025-12-28T21:38:44.705879-08:00","created_by":"daemon"}]} {"id":"bd-46381404","title":"Test database naming","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-27T18:27:28.309676-07:00","updated_at":"2025-10-31T12:00:43.185201-07:00","closed_at":"2025-10-31T12:00:43.185201-07:00"} +{"id":"bd-46my3","title":"Session ended: gt-beads-crew-emma","status":"open","priority":2,"issue_type":"event","created_at":"2026-01-10T12:26:11.870345-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-10T12:26:11.870345-08:00","ephemeral":true} {"id":"bd-47qx","title":"bd cook: Proto ID prefix should match project prefix","description":"When `bd cook` creates a proto, it uses the formula name as the proto ID:\n\n```yaml\nformula: mol-deacon-patrol\n```\n\nCreates proto with ID `mol-deacon-patrol`.\n\n## Problem\n\nIf the project uses a different prefix (e.g., `gt-`), the cooked protos have \na different prefix (`mol-`), causing:\n\n1. `bd sync` import warnings about prefix mismatch\n2. Mixed prefix lists in `bd mol list`\n3. Confusion about naming conventions\n\n## Options\n\n1. **Use project prefix**: Cook as `gt-mol-deacon-patrol`\n2. **Allow mol- as special prefix**: Recognize mol-* as valid for protos\n3. **Make prefix configurable**: `bd cook --prefix gt-`\n4. **Keep current behavior**: Document that formulas use their own namespace\n\n## Current Workaround\n\nThe prefix mismatch warning can be ignored, but `bd sync` fails the import step.\n\n## Related\n\ngt-i6k1: Duplicate proto cleanup","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-24T13:50:24.631336-08:00","updated_at":"2025-12-24T13:59:09.933374-08:00","closed_at":"2025-12-24T13:59:09.933374-08:00"} {"id":"bd-47tn","title":"Add bd daemon --stop-all command to kill all daemon processes","description":"Currently there's no easy way to stop all running bd daemon processes. Users must resort to pkill -f 'bd daemon' or similar shell commands.\n\nAdd a --stop-all flag to bd daemon that:\n1. Finds all running bd daemon processes (not just the current repo's daemon)\n2. Gracefully stops them all\n3. Reports how many were stopped\n\nThis is useful when:\n- Multiple daemons are running and causing race conditions\n- User wants a clean slate before running bd sync\n- Debugging daemon-related issues","status":"tombstone","priority":2,"issue_type":"feature","created_at":"2025-12-13T06:34:45.080633-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":"feature"} {"id":"bd-495i6","title":"Merge: topaz-mk9abkx5","description":"branch: polecat/topaz-mk9abkx5\ntarget: main\nsource_issue: topaz-mk9abkx5\nrig: beads\nagent_bead: bd-beads-polecat-topaz\nretry_count: 0\nlast_conflict_sha: null\nconflict_task_id: null","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T21:31:31.043597-08:00","created_by":"stevey","updated_at":"2026-01-10T21:53:13.173233-08:00","closed_at":"2026-01-10T21:53:13.173233-08:00","close_reason":"Branch no longer exists on remote","labels":["gt:merge-request"]} @@ -300,6 +314,7 @@ {"id":"bd-4h3","title":"Add test coverage for internal/git package","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-20T21:21:23.497486-05:00","updated_at":"2025-12-09T18:38:37.677633071-05:00","closed_at":"2025-11-28T21:55:45.2527-08:00","dependencies":[{"issue_id":"bd-4h3","depends_on_id":"bd-ge7","type":"blocks","created_at":"2025-11-20T21:21:31.277639-05:00","created_by":"daemon"}]} {"id":"bd-4hh5","title":"bd sync false-positive force-push detection","description":"bd sync incorrectly detected a force-push when comparing against a commit from main branch instead of beads-sync.\n\nEvidence:\n- bd sync reported: 'Previous known commit: f4d3f674, Current remote commit: 4d24f794'\n- f4d3f674 is a valid beads-sync commit\n- 4d24f794 is a MAIN branch commit: 'refactor: remove unused isFirstRig param (gt-fugmy)'\n\nRoot cause: bd sync is comparing against wrong branch or storing wrong commit reference.\n\nImpact: False force-push warnings during normal operation, requires manual --accept-rebase.","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-01-04T11:13:45.102272-08:00","created_by":"mayor","updated_at":"2026-01-04T23:11:19.073963-08:00","closed_at":"2026-01-04T23:11:19.073963-08:00","close_reason":"Fixed false-positive force-push detection (bd-4hh5):\n- Changed fetch to use explicit refspec: +refs/heads/beads-sync:refs/remotes/origin/beads-sync\n- This ensures the remote-tracking ref is always created/updated\n- Without explicit refspec, git fetch only updates existing refs, causing stale comparisons\n- The + prefix ensures force-update even for non-fast-forward cases"} {"id":"bd-4hn","title":"wish: list \u0026 ready show issues as hierarchy tree","description":"`bd ready` and `bd list` just show a flat list, and it's up to the reader to parse which ones are dependent or sub-issues of others. It would be much easier to understand if they were shown in a tree format","status":"hooked","priority":3,"issue_type":"task","created_at":"2025-12-08T06:38:24.016316945-07:00","updated_at":"2025-12-30T15:44:43.343883-08:00"} +{"id":"bd-4iz32","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T12:43:56.245694-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-10T12:43:56.301242-08:00","closed_at":"2026-01-10T12:43:56.301242-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-4jxh","title":"Update agent.go to use labels instead of type","description":"Change agent bead management to use gt:agent label instead of TypeAgent.\n\n## Work\n- Change IssueType=agent to IssueType=task when creating agents\n- Add gt:agent label when creating agent beads\n- Update agent queries to filter by label instead of type\n- Update agent type checks (agent.IssueType != \"agent\") to check label\n\n## Files\n- cmd/bd/agent.go","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:40:20.415469-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-06T22:10:18.805675-08:00","closed_at":"2026-01-06T22:10:18.805675-08:00","close_reason":"Migrated agent.go and RPC server to use gt:agent label instead of type","dependencies":[{"issue_id":"bd-4jxh","depends_on_id":"bd-i54l","type":"parent-child","created_at":"2026-01-06T20:41:11.578875-08:00","created_by":"beads/crew/dave"}]} {"id":"bd-4k3c","title":"bd cook creates gate beads for gate steps","description":"When cooking a formula, steps with Gate field create corresponding gate beads.\n\n## Behavior\n1. During cook, detect steps with Gate != nil\n2. Create gate bead with ID: `\u003cmol-id\u003e.gate-\u003cstep-id\u003e`\n3. Gate bead has:\n - issue_type: gate\n - await_type: from Gate.Type\n - await_id: from Gate.AwaitID (or auto-discovered)\n - timeout: from Gate.Timeout\n4. Dependent steps get blocking dep on gate bead\n\n## Example\nStep `await-ci` with gate.type=\"gh:run\" creates:\n- bd-mol-xxx.gate-await-ci (type=gate, await_type=gh:run)\n- bd-mol-xxx.verify-github depends on bd-mol-xxx.gate-await-ci\n\n## Acceptance Criteria\n- [ ] Gate beads created during cook\n- [ ] Correct await_type/await_id populated\n- [ ] Dependent steps blocked by gate\n- [ ] Tests for gate creation","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-02T13:27:14.512549-08:00","created_by":"mayor","updated_at":"2026-01-04T15:22:08.702867-08:00","closed_at":"2026-01-02T13:59:57.696282-08:00","close_reason":"Implementation already existed in cook.go (createGateIssue + collectSteps). Added comprehensive tests in cook_test.go covering: gate issue creation, await_type/await_id population, blocking dependencies, parent-child relationships, and timeout parsing.","dependencies":[{"issue_id":"bd-4k3c","depends_on_id":"bd-4bt1","type":"blocks","created_at":"2026-01-02T13:28:08.39967-08:00","created_by":"mayor"},{"issue_id":"bd-4k3c","depends_on_id":"bd-d1n1","type":"parent-child","created_at":"2026-01-02T13:28:18.575284-08:00","created_by":"mayor"}]} {"id":"bd-4kp2","title":"Update Obsidian export for removed types","description":"Remove type-to-tag mappings for Gas Town types in Obsidian export.\n\n## Work\n- Remove TypeAgent, TypeRole, TypeRig, TypeConvoy mappings from issueTypeToTag\n- Consider: add label-to-tag mapping for gt:* labels\n\n## Files\n- cmd/bd/export_obsidian.go","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-06T20:40:49.466568-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-06T22:12:38.010953-08:00","closed_at":"2026-01-06T22:12:38.010953-08:00","close_reason":"Removed Gas Town type mappings from Obsidian export","dependencies":[{"issue_id":"bd-4kp2","depends_on_id":"bd-i54l","type":"parent-child","created_at":"2026-01-06T20:41:11.708755-08:00","created_by":"beads/crew/dave"}]} @@ -327,6 +342,8 @@ {"id":"bd-4t7","title":"Auto-import runs during --no-auto-import operations via stats/ready commands","description":"Even when using --no-auto-import flag, certain commands like 'bd stats' and 'bd ready' still trigger auto-import internally, which can cause the git history backfill bug to corrupt data.\n\nExample:\n bd stats --no-auto-import\n # Still prints 'Purged bd-xxx (recovered from git history...)'\n\nThe flag should completely disable auto-import for the command, but it appears some code paths still trigger it.\n\nWorkaround: Use --allow-stale instead, or --sandbox mode.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-26T22:28:59.305898-08:00","updated_at":"2025-11-27T00:54:20.335013-08:00","closed_at":"2025-11-27T00:54:12.561872-08:00"} {"id":"bd-4u2b","title":"Make MCP compaction settings configurable (COMPACTION_THRESHOLD, PREVIEW_COUNT)","description":"Currently COMPACTION_THRESHOLD (20) and PREVIEW_COUNT (5) are hardcoded constants at the module level. This prevents users from tuning context engineering behavior.\n\n## Current State\n```python\nCOMPACTION_THRESHOLD = 20 # Compact results with more than 20 issues\nPREVIEW_COUNT = 5 # Show first 5 issues in preview\n```\n\n## Problems\n1. No way for MCP clients to request different preview sizes\n2. No way to disable compaction for debugging\n3. No way to adapt to different context window sizes\n4. Values are not documented in tool schema\n\n## Recommended Solution\nAdd environment variables or MCP tool parameters:\n- `BEADS_MCP_COMPACTION_THRESHOLD` env var (default: 20)\n- `BEADS_MCP_PREVIEW_COUNT` env var (default: 5)\n- Optional `compact_threshold` and `preview_size` parameters to list/ready tools\n\n## Implementation Notes\n- Keep current defaults for backward compatibility\n- Read from environment at server initialization\n- Document in CONTEXT_ENGINEERING.md\n- Add tests verifying env var behavior","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-14T14:24:34.037997-08:00","updated_at":"2025-12-14T14:40:48.79752-08:00","closed_at":"2025-12-14T14:40:48.79752-08:00","dependencies":[{"issue_id":"bd-4u2b","depends_on_id":"bd-otf4","type":"discovered-from","created_at":"2025-12-14T14:24:34.039165-08:00","created_by":"stevey"}]} {"id":"bd-4uoc","title":"Code Review Followup Summary: PR #481 + PR #551","description":"## Merged PRs Summary\n\n### PR #551: Persist close_reason to issues table\n- ✅ Merged successfully\n- ✅ Bug fix: close_reason now persisted in database column (not just events table)\n- ✅ Comprehensive test coverage added\n- ✅ Handles reopen case (clearing close_reason)\n\n**Followup Issues Filed:**\n- bd-lxzx: Document close_reason in JSONL export format\n- bd-077e: Update CLI documentation for close_reason field\n\n---\n\n### PR #481: Context Engineering Optimizations (80-90% context reduction)\n- ✅ Merged successfully \n- ✅ Lazy tool discovery: discover_tools() + get_tool_info()\n- ✅ Minimal issue models: IssueMinimal (~80% smaller than full Issue)\n- ✅ Result compaction: Auto-compacts results \u003e20 items\n- ✅ All 28 tests passing\n- ⚠️ Breaking change: ready() and list() return type changed\n\n**Followup Issues Filed:**\n- bd-b318: Add integration tests for CompactedResult\n- bd-4u2b: Make compaction settings configurable (THRESHOLD, PREVIEW_COUNT)\n- bd-2kf8: Document CompactedResult response format in CONTEXT_ENGINEERING.md\n- bd-pdr2: Document backwards compatibility considerations\n\n---\n\n## Overall Assessment\n\nBoth PRs are production-ready with solid implementations. All critical functionality works and tests pass. Followup issues focus on:\n1. Documentation improvements (5 issues)\n2. Integration test coverage (1 issue)\n3. Configuration flexibility (1 issue)\n4. Backwards compatibility guidance (1 issue)\n\nNo critical bugs or design issues found.\n\n## Review Completed By\nCode review process completed. Issues auto-created for tracking improvements.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-14T14:25:59.214886-08:00","updated_at":"2025-12-29T13:40:29.723233-08:00","closed_at":"2025-12-29T13:40:29.723233-08:00","close_reason":"Stale/spurious - test artifacts, merged PRs, or auto-close candidates","dependencies":[{"issue_id":"bd-4uoc","depends_on_id":"bd-otf4","type":"discovered-from","created_at":"2025-12-14T14:25:59.216884-08:00","created_by":"stevey"},{"issue_id":"bd-4uoc","depends_on_id":"bd-z86n","type":"discovered-from","created_at":"2025-12-14T14:25:59.217296-08:00","created_by":"stevey"}]} +{"id":"bd-4vsob","title":"Session ended: gt-beads-crew-emma","status":"open","priority":2,"issue_type":"event","created_at":"2026-01-10T12:04:46.861935-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-10T12:04:46.861935-08:00","ephemeral":true} +{"id":"bd-4xtku","title":"Test agent bead","status":"tombstone","priority":2,"issue_type":"agent","created_at":"2026-01-10T23:25:03.058364-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-10T23:25:08.142927-08:00","labels":["role_type:polecat"],"deleted_at":"2026-01-10T23:25:08.142927-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"agent"} {"id":"bd-4y4g","title":"Bump version in all files","description":"Run ./scripts/bump-version.sh {{version}} to update 10 version files. Then run with --commit after info.go is updated.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-18T22:43:01.859728-08:00","updated_at":"2025-12-24T16:25:30.160776-08:00","dependencies":[{"issue_id":"bd-4y4g","depends_on_id":"bd-qqc","type":"parent-child","created_at":"2025-12-18T22:43:16.623724-08:00","created_by":"daemon"},{"issue_id":"bd-4y4g","depends_on_id":"bd-8v2","type":"blocks","created_at":"2025-12-18T22:43:20.823329-08:00","created_by":"daemon"}],"deleted_at":"2025-12-24T16:25:30.160776-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} {"id":"bd-4yb9","title":"Add tests for IDPrefix filter optimization","description":"Commit 5dfb838d added IDPrefix field to IssueFilter for efficient prefix filtering but lacks tests.\n\nIDPrefix enables database-level filtering of issue IDs by prefix, improving\nshell completion performance by avoiding fetching all issues.\n\nTest cases needed:\n- ListIssues with IDPrefix returns only matching issues\n- IDPrefix filtering works in sqlite store\n- IDPrefix filtering works in transaction store\n- IDPrefix filtering works in memory store\n- Empty IDPrefix returns all issues\n- IDPrefix combined with other filters\n\nLocation: internal/types/types.go (IssueFilter), internal/storage/sqlite/queries.go\nSuggested test files: internal/storage/sqlite/sqlite_test.go, internal/storage/storage_test.go","status":"open","priority":3,"issue_type":"task","created_at":"2026-01-07T01:18:14.705475-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-07T01:18:14.705475-08:00"} {"id":"bd-5012","title":"Merge: ux-1766978911613","description":"branch: polecat/Nux-1766978911613\ntarget: main\nsource_issue: ux-1766978911613\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-28T19:35:42.938017-08:00","created_by":"beads/polecats/Nux","updated_at":"2025-12-29T13:40:29.719953-08:00","closed_at":"2025-12-29T13:40:29.719953-08:00","close_reason":"Stale/spurious - test artifacts, merged PRs, or auto-close candidates"} @@ -377,21 +394,25 @@ {"id":"bd-5nu1","title":"Mega-molecule progress support for Hanoi demo","description":"Beads-side work for million-step molecule monitoring.\n\n## Context\nTowers of Hanoi with 20 disks = 1,048,575 steps.\nNeed efficient progress queries and display guards.\n\n## Requirements\n1. bd mol progress command (summary without listing all steps)\n2. Display guards in bd mol current (detect large molecules)\n3. Efficient child count queries (already indexed)","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-31T00:52:40.474932-08:00","created_by":"gastown/crew/max","updated_at":"2025-12-31T13:08:29.656523-08:00","closed_at":"2025-12-31T13:08:29.656523-08:00","close_reason":"All children complete: mol progress command and display guards implemented"} {"id":"bd-5o9k8","title":"Review and merge PR #980: gitignore sync state files","description":"dispatched_by: beads/crew/emma\n\n## Task\nReview and merge PR #980 from peterkc.\n\n**PR**: https://github.com/steveyegge/beads/pull/980\n\n## What it does\n- Adds .sync.lock and sync_base.jsonl to GitignoreTemplate\n- Adds both patterns to requiredPatterns for bd doctor validation\n- Fixes SYNC.md documentation\n\n## Easy-win criteria met\n- Bug fix with clear scope\n- Has tests\n- Documentation fix included\n- Low risk\n\n## Instructions\n1. Clone/fetch the PR: gh pr checkout 980 --repo steveyegge/beads\n2. Run tests: go test ./cmd/bd/doctor/...\n3. Review the diff: gh pr diff 980 --repo steveyegge/beads\n4. If tests pass and code looks good, approve and merge\n5. Close this bead when done","status":"closed","priority":2,"issue_type":"task","assignee":"beads/crew/dave","created_at":"2026-01-09T10:59:57.727774-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T11:04:54.725911-08:00","closed_at":"2026-01-09T11:04:54.725911-08:00","close_reason":"PR #980 reviewed, approved, and merged. Adds .sync.lock and sync_base.jsonl to gitignore template and required patterns for bd doctor."} {"id":"bd-5ots","title":"SearchIssues N+1 query causes context timeout with GetLabels","description":"scanIssues() calls GetLabels in a loop for every issue, causing N+1 queries and context deadline exceeded errors when used with short timeouts or in-memory databases. This is especially problematic since SearchIssues already supports label filtering via SQL WHERE clauses.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-05T19:12:02.245879-08:00","updated_at":"2025-11-05T19:22:11.668682-08:00","closed_at":"2025-11-05T19:22:11.668682-08:00"} +{"id":"bd-5owhu","title":"Digest: mol-refinery-patrol","description":"Patrol cycle: MQ empty, 0 branches merged, no issues","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T23:31:56.072035-08:00","updated_at":"2026-01-10T23:31:56.072035-08:00","closed_at":"2026-01-10T23:31:56.071991-08:00","close_reason":"Squashed from 11 wisps","dependencies":[{"issue_id":"bd-5owhu","depends_on_id":"bd-wisp-2j5","type":"parent-child","created_at":"2026-01-10T23:31:56.073043-08:00","created_by":"beads/refinery"}]} {"id":"bd-5qim","title":"Optimize GetReadyWork performance - 752ms on 10K database (target: \u003c50ms)","notes":"# Performance Analysis (10K Issue Database)\n\nAnalyzed using CPU profiles from benchmark suite on Apple M2 Pro.\n\n## Operation Performance\n\n| Operation | Time | Allocations | Memory |\n|----------------------------------|---------|-------------|--------|\n| bd ready (GetReadyWork) | ~752ms | 167,466 | 16MB |\n| bd list (SearchIssues no filter) | ~11.6ms | 89,214 | 5.8MB |\n| bd list (SearchIssues filtered) | ~9.2ms | 62,365 | 3.5MB |\n| bd create (CreateIssue) | ~2.6ms | 146 | 8.6KB |\n| bd update (UpdateIssue) | ~0.32ms | 364 | 15KB |\n| bd close (UpdateIssue) | ~0.32ms | 364 | 15KB |\n\n**Target: \u003c50ms for all operations on 10K database**\n\n**Current issue: GetReadyWork is 15x over target (752ms vs 50ms)**\n\n## Root Cause\n\nGetReadyWork (internal/storage/sqlite/ready.go:90-128) uses recursive CTE to propagate blocking:\n- 65x slower than SearchIssues\n- Recalculates entire blocked issue tree on every call\n- Algorithm:\n 1. Find directly blocked issues via 'blocks' dependencies\n 2. Recursively propagate blockage to descendants (max depth: 50)\n 3. Exclude all blocked issues from results\n\n## CPU Profile Analysis\n\n- Database syscalls (pthread_cond_signal, syscall6): ~75%\n- SQLite engine overhead: inherent to recursive CTE\n- Application code (query construction): \u003c1%\n\n**Bottleneck is the recursive CTE query execution, not application code.**\n\n## Optimization Recommendations\n\n### High Impact (Likely to achieve \u003c50ms target)\n\n1. **Cache blocked issue calculation**\n - Add `blocked_issues` table updated on dependency changes\n - Trade write complexity for read speed (ready called \u003e\u003e dependency changes)\n - Eliminates recursive CTE on every read\n\n2. **Add/verify database indexes**\n ```sql\n CREATE INDEX IF NOT EXISTS idx_dependencies_blocked \n ON dependencies(issue_id, type, depends_on_id);\n CREATE INDEX IF NOT EXISTS idx_issues_status \n ON issues(status);\n ```\n\n### Medium Impact\n\n3. **Reduce allocations** (167K allocations for GetReadyWork)\n - Profile `scanIssues()` for object pooling opportunities\n - Reuse slice capacity for repeated calls\n\n### Low Impact (Not recommended)\n- Query optimization for CRUD operations (already \u003c3ms)\n- Connection pooling tuning (not showing in profiles)\n\n## Verification\n\nRun benchmarks to validate optimization:\n```bash\nmake bench-quick\ngo tool pprof -http=:8080 internal/storage/sqlite/bench-cpu-*.prof\n```\n\nProfile files automatically generated in `internal/storage/sqlite/`.","status":"tombstone","priority":0,"issue_type":"bug","created_at":"2025-11-14T09:02:46.507526-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-5r5md","title":"test","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T19:26:53.245563-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-10T19:27:06.494897-08:00","closed_at":"2026-01-10T19:27:06.494897-08:00","close_reason":"Closed"} {"id":"bd-5rj1","title":"Merge: bd-gqxd","description":"branch: polecat/furiosa\ntarget: main\nsource_issue: bd-gqxd\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-23T16:40:21.707706-08:00","updated_at":"2025-12-23T19:12:08.349245-08:00","closed_at":"2025-12-23T19:12:08.349245-08:00"} {"id":"bd-5s91","title":"CLI API Audit for OSS Launch","description":"Comprehensive CLI API audit before OSS launch.\n\n## Tasks\n1. Review gt command groupings - propose consolidation\n2. Review bd command groupings \n3. Document gt vs bd ownership boundaries\n4. Identify naming inconsistencies\n5. Document flag vs subcommand criteria\n\n## Context\n- Pre-OSS launch cleanup\n- Goal: clean, consistent, discoverable CLI surface","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-25T00:15:41.355013-08:00","updated_at":"2025-12-25T13:26:25.587476-08:00","closed_at":"2025-12-25T13:26:25.587476-08:00"} -{"id":"bd-5v32e","title":"No ref test","status":"open","priority":1,"issue_type":"task","created_at":"2026-01-10T20:36:05.678546-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-10T20:36:05.678546-08:00"} +{"id":"bd-5tc1a","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T16:25:39.874093-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-10T16:25:39.944348-08:00","closed_at":"2026-01-10T16:25:39.944348-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} +{"id":"bd-5v32e","title":"No ref test","status":"open","priority":1,"issue_type":"task","owner":"steve.yegge@gmail.com","created_at":"2026-01-10T20:36:05.678546-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-10T20:36:05.678546-08:00"} {"id":"bd-5x0j","title":"bd swarm status command","description":"Add bd swarm status to show swarm state derived from beads.\n\n## Context\nThis is the key command that demonstrates 'discovery over tracking'. \nSwarm status is COMPUTED from:\n- Epic children statuses\n- Dependency structure\n- Issue assignments\n\nNOT stored separately. If beads changes, status changes.\n\n## Implementation\n1. New command: bd swarm status \u003cswarm-mol-id\u003e\n2. Find linked epic from swarm molecule\n3. Query all children of epic\n4. Compute and display:\n - Ready front (unblocked, open issues)\n - In progress (in_progress status)\n - Completed (closed)\n - Blocked (has unmet dependencies)\n - Progress percentage\n - Coordinator\n - Estimated remaining (based on avg session time)\n\n## Output Format\nReady Front Analysis: gt-epic-xxx\n\nCompleted: ✓ gt-001 (2h ago)\nActive: ⟳ gt-002 [nux], ⟳ gt-003 [toast]\nReady: ○ gt-004, ○ gt-005\nBlocked: ◌ gt-006 (needs 004, 005)\n\nProgress: 1/6 complete, 2/6 active (17%)\n\n## Reference\n~/gt/docs/swarm-architecture.md - 'Ready Front Visualization'\n\n## Acceptance\n- bd swarm status \u003cmol\u003e shows accurate state\n- State reflects current beads (not cached)\n- --json output for programmatic use","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-28T19:11:36.594118-08:00","created_by":"mayor","updated_at":"2025-12-28T21:28:21.976756-08:00","closed_at":"2025-12-28T21:28:21.976756-08:00","dependencies":[{"issue_id":"bd-5x0j","depends_on_id":"bd-oxgi","type":"blocks","created_at":"2025-12-28T19:11:52.464245-08:00","created_by":"daemon"}]} {"id":"bd-5xt","title":"Log errors from timer-triggered flushes instead of discarding","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-20T21:22:06.694953-05:00","updated_at":"2025-11-20T21:35:53.117434-05:00","closed_at":"2025-11-20T21:35:53.117434-05:00"} {"id":"bd-600yu","title":"Merge: quartz-lmqhe","description":"branch: polecat/quartz-lmqhe\ntarget: main\nsource_issue: quartz-lmqhe\nrig: beads\nagent_bead: bd-beads-polecat-quartz\nretry_count: 0\nlast_conflict_sha: null\nconflict_task_id: null","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T21:26:06.954058-08:00","created_by":"stevey","updated_at":"2026-01-10T22:12:08.876703-08:00","closed_at":"2026-01-10T22:12:08.876703-08:00","close_reason":"merged","labels":["gt:merge-request"]} {"id":"bd-6049","title":"bd doctor --json flag not working","description":"The --json flag on bd doctor command doesn't produce JSON output. It continues to show human-readable output instead. The flag is registered locally on doctorCmd but the code uses the global jsonOutput variable set by PersistentPreRun. Need to investigate why the flag isn't being honored.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-02T17:08:18.170428-08:00","updated_at":"2025-11-02T18:41:01.376783-08:00","closed_at":"2025-11-02T18:41:01.376786-08:00"} +{"id":"bd-60jcg","title":"Session ended: gt-beads-crew-dave","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T22:10:03.291142-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-09T22:10:03.329346-08:00","closed_at":"2026-01-09T22:10:03.329346-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-615z","title":"Add ValidateTemplate() function","description":"Add internal/validation package with ValidateTemplate(issueType, description) that checks for missing sections and returns actionable errors.","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-01T11:19:07.136885-08:00","created_by":"beads/crew/grip","updated_at":"2026-01-01T12:42:26.397143-08:00","closed_at":"2026-01-01T12:42:26.397143-08:00","close_reason":"Implemented ValidateTemplate() and LintIssue() with tests","dependencies":[{"issue_id":"bd-615z","depends_on_id":"bd-ou35","type":"parent-child","created_at":"2026-01-01T11:19:22.71669-08:00","created_by":"beads/crew/grip"},{"issue_id":"bd-615z","depends_on_id":"bd-v2mr","type":"blocks","created_at":"2026-01-01T11:19:23.924134-08:00","created_by":"beads/crew/grip"}]} {"id":"bd-6214875c","title":"Split internal/rpc/server.go into focused modules","description":"The file `internal/rpc/server.go` is 2,273 lines with 50+ methods, making it difficult to navigate and prone to merge conflicts. Split into 8 focused files with clear responsibilities.\n\nCurrent structure: Single 2,273-line file with:\n- Connection handling\n- Request routing\n- All 40+ RPC method implementations\n- Storage caching\n- Health checks \u0026 metrics\n- Cleanup loops\n\nTarget structure:\n```\ninternal/rpc/\n├── server.go # Core server, connection handling (~300 lines)\n├── methods_issue.go # Issue operations (~400 lines)\n├── methods_deps.go # Dependency operations (~200 lines)\n├── methods_labels.go # Label operations (~150 lines)\n├── methods_ready.go # Ready work queries (~150 lines)\n├── methods_compact.go # Compaction operations (~200 lines)\n├── methods_comments.go # Comment operations (~150 lines)\n├── storage_cache.go # Storage caching logic (~300 lines)\n└── health.go # Health \u0026 metrics (~200 lines)\n```\n\nMigration strategy:\n1. Create new files with appropriate methods\n2. Keep `server.go` as main file with core server logic\n3. Test incrementally after each file split\n4. Final verification with full test suite","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-28T14:21:37.51524-07:00","updated_at":"2025-10-30T17:12:58.2179-07:00","closed_at":"2025-10-28T14:11:04.399811-07:00"} {"id":"bd-6221bdcd","title":"Optimize cmd/bd test suite performance (currently 30+ minutes)","description":"CLI test suite is extremely slow (~30+ minutes for full run). Tests are poorly designed and need performance optimization before expanding coverage.\n\nCurrent coverage: 24.8% (improved from 20.2%)\n\n**Problem**: Tests take far too long to run, making development iteration painful.\n\n**Priority**: Fix test performance FIRST, then consider increasing coverage.\n\n**Investigation needed**:\n- Profile test execution to identify bottlenecks\n- Look for redundant git operations, database initialization, or daemon operations\n- Identify opportunities for test parallelization\n- Consider mocking or using in-memory databases where appropriate\n- Review test design patterns\n\n**Related**: bd-ktng mentions 13 CLI tests with redundant git init calls (31s total)\n\n**Goal**: Get full test suite under 1-2 minutes before adding more tests.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T14:06:27.951656-07:00","updated_at":"2025-12-14T12:12:46.533162-08:00","closed_at":"2025-11-08T22:41:05.766749-08:00","dependencies":[{"issue_id":"bd-6221bdcd","depends_on_id":"bd-4d7fca8a","type":"blocks","created_at":"2025-10-29T19:52:05.532391-07:00","created_by":"import-remap"}]} {"id":"bd-627d","title":"AI-supervised database migrations for safer schema evolution","description":"## Problem\n\nDatabase migrations can lose user data through edge cases that are hard to anticipate (e.g., GH #201 where bd migrate failed to set issue_prefix, or bd-d355a07d false positive data loss warnings). Since beads is designed to be run by AI agents, we should leverage AI to make migrations safer.\n\n## Current State\n\nMigrations run blindly with:\n- No pre-flight validation\n- No data integrity verification\n- No rollback on failure\n- Limited post-migration testing\n\nRecent issues:\n- GH #201: Migration didn't set issue_prefix config, breaking commands\n- bd-d355a07d: False positive \"data loss\" warnings on collision resolution\n- Users reported migration data loss (fixed but broader problem remains)\n\n## Proposal: AI-Supervised Migration Framework\n\nUse AI to supervise migrations through structured verification:\n\n### 1. Pre-Migration Analysis\n- AI reads migration code and current schema\n- Identifies potential data loss scenarios\n- Generates validation queries to verify assumptions\n- Creates snapshot queries for before/after comparison\n\n### 2. Migration Execution\n- Take database backup/snapshot\n- Run validation queries (pre-state)\n- Execute migration in transaction\n- Run validation queries (post-state)\n\n### 3. Post-Migration Verification\n- AI compares pre/post snapshots\n- Verifies data integrity invariants\n- Checks for unexpected data loss\n- Validates config completeness (like issue_prefix)\n\n### 4. Rollback on Anomalies\n- If AI detects data loss, rollback transaction\n- Present human-readable error report\n- Suggest fix before retrying\n\n## Example Flow\n\n```\n$ bd migrate\n\n→ Analyzing migration plan...\n→ AI identified 3 potential data loss scenarios\n→ Generating validation queries...\n→ Creating pre-migration snapshot...\n→ Running migration in transaction...\n→ Verifying post-migration state...\n✓ All 247 issues accounted for\n✓ Config table complete (issue_prefix: \"mcp\")\n✓ Dependencies intact (342 relationships verified)\n→ Migration successful!\n```\n\nIf something goes wrong:\n```\n$ bd migrate\n\n→ Analyzing migration plan...\n→ AI identified issue: Missing issue_prefix config after migration\n→ Recommendation: Add prefix detection step\n→ Aborting migration - database unchanged\n```\n\n## Implementation Ideas\n\n### A. Migration Validator Tool\nCreate `bd migrate --validate` that:\n- Simulates migration on copy of database\n- Uses AI to verify data integrity\n- Reports potential issues before real migration\n\n### B. Migration Test Generator\nAI generates test cases for migrations:\n- Edge cases (empty DB, large DB, missing config)\n- Data integrity checks\n- Regression tests\n\n### C. Migration Invariants\nDefine invariants that AI checks:\n- Issue count should not decrease (unless collision resolution)\n- All required config keys present\n- Foreign key relationships intact\n- No orphaned dependencies\n\n### D. Self-Healing Migrations\nAI detects incomplete migrations and suggests fixes:\n- Missing config values (like GH #201)\n- Orphaned data\n- Index inconsistencies\n\n## Benefits\n\n1. **Catch edge cases**: AI explores scenarios humans miss\n2. **Self-documenting**: AI explains what migration does\n3. **Agent-friendly**: Agents can run migrations confidently\n4. **Fewer rollbacks**: Detect issues before committing\n5. **Better testing**: AI generates comprehensive test suites\n\n## Open Questions\n\n1. Which AI model? (Fast: Haiku, Thorough: Sonnet/GPT-4)\n2. How to balance safety vs migration speed?\n3. Should AI validation be required or optional?\n4. How to handle offline scenarios (no API access)?\n5. What invariants should always be checked?\n\n## Related Work\n\n- bd-b245: Migration registry (makes migrations introspectable)\n- GH #201: issue_prefix migration bug (motivating example)\n- bd-d355a07d: False positive data loss warnings","notes":"## Progress\n\n### ✅ Phase 1: Migration Invariants (COMPLETED)\n\n**Implemented:**\n- Created internal/storage/sqlite/migration_invariants.go with 3 invariants\n- Updated RunMigrations() to verify invariants after migrations\n- All tests pass ✓\n\n### ✅ Phase 2: Inspection Tools (COMPLETED \u0026 PUSHED)\n\n**Commit:** 1abe4e7 - \"Add migration inspection tools for AI agents (bd-627d Phase 2)\"\n\n**Implemented:**\n1. ✅ bd migrate --inspect --json - Shows migration plan\n2. ✅ bd info --schema --json - Returns schema details\n3. ✅ Migration warnings system\n4. ✅ Documentation updated in AGENTS.md\n5. ✅ All tests pass\n\n### ✅ Phase 3: MCP Tools (COMPLETED \u0026 PUSHED)\n\n**Commit:** 2493693 - \"Add MCP tools for migration inspection (bd-627d Phase 3)\"\n\n**Implemented:**\n1. ✅ inspect_migration(workspace_root) tool in beads-mcp\n2. ✅ get_schema_info(workspace_root) tool in beads-mcp\n3. ✅ Abstract methods in BdClientBase\n4. ✅ CLI client implementations\n5. ✅ All tests pass\n\n**All phases complete!** Migration inspection fully integrated into MCP server.","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-02T12:57:10.722048-08:00","updated_at":"2025-12-14T12:12:46.522298-08:00","closed_at":"2025-11-02T14:31:25.095308-08:00"} {"id":"bd-62a0","title":"Create WASM build infrastructure (Makefile, scripts)","description":"Set up build tooling for WASM compilation:\n- Add GOOS=js GOARCH=wasm build target\n- Copy wasm_exec.js from Go distribution\n- Create wrapper script for Node.js execution\n- Add build task to Makefile or build script","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-02T21:58:07.286826-08:00","updated_at":"2025-11-02T22:23:49.376789-08:00","closed_at":"2025-11-02T22:23:49.376789-08:00","dependencies":[{"issue_id":"bd-62a0","depends_on_id":"bd-44d0","type":"parent-child","created_at":"2025-11-02T22:23:49.423064-08:00","created_by":"stevey"}]} {"id":"bd-62g22","title":"Add bd doctor check for child repo custom types","description":"Add a diagnostic check to `bd doctor` that discovers custom types from child repos and reports any potential issues.\n\nThis is the \"discover\" part of \"trust + discover\". We don't track child types in parent config, but we can discover them on demand for diagnostics.\n\nImplementation:\n1. In `cmd/bd/doctor/`, add a new check\n2. For each configured child repo in `repos.additional`:\n - Try to read child's config.yaml or beads.db\n - Extract their `types.custom` setting\n - Report what types each child uses\n3. Optionally warn if hydrated issues use types not found in any config\n\nThis is informational/diagnostic only - not blocking.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-09T14:05:53.324297-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T14:26:42.17532-08:00","closed_at":"2026-01-09T14:26:42.17532-08:00","close_reason":"Added CheckMultiRepoTypes to bd doctor","dependencies":[{"issue_id":"bd-62g22","depends_on_id":"bd-9ji4z","type":"parent-child","created_at":"2026-01-09T14:06:00.869885-08:00","created_by":"beads/crew/emma"}]} +{"id":"bd-62ycw","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T21:23:05.336785-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T21:23:05.376983-08:00","closed_at":"2026-01-09T21:23:05.376983-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-63e9","title":"Fix Nix flake build test failures","description":"Nix build is failing during test phase with same test errors as Windows.\n\n**Error:**\n```\nerror: Cannot build '/nix/store/rgyi1j44dm6ylrzlg2h3z97axmfq9hzr-beads-0.9.9.drv'.\nReason: builder failed with exit code 1.\nFAIL github.com/steveyegge/beads/cmd/bd 16.141s\n```\n\nThis may be related to test environment setup or the same issues affecting Windows tests.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-02T09:29:37.2851-08:00","updated_at":"2025-11-04T11:10:23.531386-08:00","closed_at":"2025-11-04T11:10:23.531389-08:00","dependencies":[{"issue_id":"bd-63e9","depends_on_id":"bd-1231","type":"blocks","created_at":"2025-11-02T09:29:37.28618-08:00","created_by":"stevey"}]} {"id":"bd-63l","title":"bd hooks install fails in git worktrees","description":"When bd is used in a git worktree, bd hooks install fails with 'mkdir .git: not a directory' because .git is a file (gitdir pointer) not a directory. Beads should detect and follow the .git gitdir pointer to install hooks in the correct location. This blocks normal worktree workflows.\n\n## Symptoms of this bug:\n- Git hooks don't install automatically\n- Auto-sync doesn't run (5-second debounce)\n- Hash mismatch warnings in bd output\n- Daemon fails to start with 'auto_start_failed'\n\n## Workaround:\nUse `git rev-parse --git-dir` to find the actual hooks directory and copy hooks manually:\n```bash\nmkdir -p $(git rev-parse --git-dir)/hooks\ncp -r .beads-hooks/* $(git rev-parse --git-dir)/hooks/\n```","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-29T00:27:59.111163003-07:00","updated_at":"2025-11-29T23:20:04.196608-08:00","closed_at":"2025-11-29T23:20:01.394894-08:00"} {"id":"bd-649s","title":"Add custom type support to beads config","description":"Add types.custom config key mirroring status.custom pattern.\n\n## Work\n- Add CustomTypeConfigKey constant to config.go\n- Add GetCustomTypes() to storage interface \n- Add GetCustomTypes() implementation in sqlite/config.go and memory/memory.go\n- Add IssueType.IsValidWithCustom(customTypes []string) method\n- Update ValidateWithCustomStatuses to ValidateWithCustom (handle both)\n- Update all validation call sites to use GetCustomTypes()\n\n## Files\n- internal/storage/sqlite/config.go\n- internal/storage/storage.go\n- internal/storage/memory/memory.go\n- internal/types/types.go\n- internal/storage/sqlite/queries.go\n- internal/storage/sqlite/transaction.go\n- internal/storage/sqlite/batch_ops.go\n- internal/storage/sqlite/multirepo.go","status":"closed","priority":1,"issue_type":"task","assignee":"beads/crew/dave","created_at":"2026-01-06T20:40:04.168738-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-06T21:30:02.035131-08:00","closed_at":"2026-01-06T21:30:02.035131-08:00","close_reason":"Implemented custom type support mirroring custom status pattern","dependencies":[{"issue_id":"bd-649s","depends_on_id":"bd-i54l","type":"parent-child","created_at":"2026-01-06T20:41:11.514971-08:00","created_by":"beads/crew/dave"}]} @@ -423,6 +444,7 @@ {"id":"bd-6dnt","title":"Code smell: Duplicated IssueDetails struct in show.go (4 definitions)","description":"The IssueDetails struct is defined 4 times within show.go at lines 109, 159, 190, and 372 with identical structure but slightly different JSON tag configurations.\n\n**Problem:**\n- Violates DRY principle\n- Makes maintenance harder - changes must be applied to multiple locations\n- Increases risk of inconsistency between definitions\n- Takes up ~50 lines of duplicated code\n\n**Acceptance Criteria:**\n- [ ] Extract IssueDetails to a single package-level type\n- [ ] Update all 4 locations to use the shared type\n- [ ] Ensure JSON output remains consistent\n- [ ] Tests pass","status":"closed","priority":2,"issue_type":"chore","created_at":"2025-12-28T18:58:58.42739-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-29T14:04:04.398691-08:00","closed_at":"2025-12-29T14:04:04.398691-08:00","close_reason":"Extracted IssueDetails to types.IssueDetails - removed 5 duplicate definitions","dependencies":[{"issue_id":"bd-6dnt","depends_on_id":"bd-ox1o","type":"blocks","created_at":"2025-12-28T19:00:23.554676-08:00","created_by":"daemon"}]} {"id":"bd-6ed8","title":"Fixture Generator for Realistic Test Data","description":"Create internal/testutil/fixtures/fixtures.go with functions to generate realistic test data at scale.\n\nFunctions:\n- LargeSQLite(storage) - 10K issues, native SQLite\n- XLargeSQLite(storage) - 20K issues, native SQLite \n- LargeFromJSONL(storage) - 10K issues imported from JSONL\n- XLargeFromJSONL(storage) - 20K issues imported from JSONL\n\nData characteristics:\n- Epic hierarchies (depth 4): Epic → Feature → Task → Subtask\n- Cross-linked dependencies (tasks blocking across epics)\n- Realistic status/priority/label distribution\n- Representative assignees and temporal data\n\nImplementation:\n- Single file: internal/testutil/fixtures/fixtures.go\n- No config structs, simple direct functions\n- Seeded RNG for reproducibility\n- Reusable by both benchmarks and tests","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-13T22:22:28.233977-08:00","updated_at":"2025-11-13T22:40:19.485552-08:00","closed_at":"2025-11-13T22:40:19.485552-08:00","dependencies":[{"issue_id":"bd-6ed8","depends_on_id":"bd-3tfh","type":"blocks","created_at":"2025-11-13T22:23:58.120794-08:00","created_by":"daemon"},{"issue_id":"bd-6ed8","depends_on_id":"bd-m62x","type":"blocks","created_at":"2025-11-13T22:24:02.598071-08:00","created_by":"daemon"}]} {"id":"bd-6fe4622f","title":"Remove unreachable utility functions","description":"Several small utility functions are unreachable:\n\nFiles to clean:\n1. `internal/storage/sqlite/hash.go` - `computeIssueContentHash` (line 17)\n - Check if entire file can be deleted if only contains this function\n\n2. `internal/config/config.go` - `FileUsed` (line 151)\n - Delete unused config helper\n\n3. `cmd/bd/git_sync_test.go` - `verifyIssueOpen` (line 300)\n - Delete dead test helper\n\n4. `internal/compact/haiku.go` - `HaikuClient.SummarizeTier2` (line 81)\n - Tier 2 summarization not implemented\n - Options: implement feature OR delete method\n\nImpact: Removes 50-100 LOC depending on decisions","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-10-28T16:20:02.434573-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":"task"} +{"id":"bd-6gclq","title":"Session ended: gt-beads-crew-emma","status":"open","priority":2,"issue_type":"event","created_at":"2026-01-10T12:04:11.793827-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-10T12:04:11.793827-08:00","ephemeral":true} {"id":"bd-6gd","title":"Remove legacy MCP Agent Mail integration","description":"## Summary\n\nRemove the legacy MCP Agent Mail system that requires an external HTTP server. Keep the native `bd mail` system which stores messages as git-synced issues.\n\n## Background\n\nTwo mail systems exist in the codebase:\n1. **Legacy Agent Mail** (`bd message`) - External server dependency, complex setup\n2. **Native bd mail** (`bd mail`) - Built-in, git-synced, no dependencies\n\nThe legacy system causes confusion and is no longer needed. Gas Town's Town Mail will use the native `bd mail` system.\n\n## Files to Delete\n\n### CLI Command\n- [ ] `cmd/bd/message.go` - The `bd message` command implementation\n\n### MCP Integration\n- [ ] `integrations/beads-mcp/src/beads_mcp/mail.py` - HTTP wrapper for Agent Mail server\n- [ ] `integrations/beads-mcp/src/beads_mcp/mail_tools.py` - MCP tool definitions\n- [ ] `integrations/beads-mcp/tests/test_mail.py` - Tests for legacy mail\n\n### Documentation\n- [ ] `docs/AGENT_MAIL.md`\n- [ ] `docs/AGENT_MAIL_QUICKSTART.md`\n- [ ] `docs/AGENT_MAIL_DEPLOYMENT.md`\n- [ ] `docs/AGENT_MAIL_MULTI_WORKSPACE_SETUP.md`\n- [ ] `docs/adr/002-agent-mail-integration.md`\n\n## Code to Update\n\n- [ ] Remove `message` command registration from `cmd/bd/main.go`\n- [ ] Remove mail tool imports/registration from MCP server `__init__.py` or `server.py`\n- [ ] Check for any other references to Agent Mail in the codebase\n\n## Verification\n\n- [ ] `bd message` command no longer exists\n- [ ] `bd mail` command still works\n- [ ] MCP server starts without errors\n- [ ] Tests pass\n","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-17T23:04:04.099935-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":"task"} {"id":"bd-6hji","title":"Test exclusive file reservations with two agents","description":"Simulate two agents racing to claim the same issue and verify that exclusive reservations prevent collision.\n\nAcceptance Criteria:\n- Agent A reserves bd-123 → succeeds\n- Agent B tries to reserve bd-123 → fails with clear error message\n- Agent B can see who has the reservation\n- Reservation expires after TTL\n- Agent B can claim after expiration","notes":"Successfully tested file reservations:\n- Agent BrownBear reserved bd-123 → granted\n- Agent ChartreuseHill tried same → conflicts returned\n- System correctly prevents collision","status":"closed","priority":0,"issue_type":"task","created_at":"2025-11-07T22:41:59.963468-08:00","updated_at":"2025-11-08T00:03:18.004972-08:00","closed_at":"2025-11-08T00:03:18.004972-08:00","dependencies":[{"issue_id":"bd-6hji","depends_on_id":"bd-muls","type":"blocks","created_at":"2025-11-07T23:03:52.897843-08:00","created_by":"daemon"},{"issue_id":"bd-6hji","depends_on_id":"bd-27xm","type":"blocks","created_at":"2025-11-07T23:20:21.911222-08:00","created_by":"daemon"},{"issue_id":"bd-6hji","depends_on_id":"bd-spmx","type":"parent-child","created_at":"2025-11-08T00:02:47.904652-08:00","created_by":"daemon"}]} {"id":"bd-6kpc4","title":"Session ended: gt-beads-crew-giles","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-08T20:08:51.798306-08:00","created_by":"beads/crew/giles","updated_at":"2026-01-08T20:08:51.834314-08:00","closed_at":"2026-01-08T20:08:51.834314-08:00","close_reason":"auto-closed session event"} @@ -457,6 +479,7 @@ {"id":"bd-7315","title":"Add validation for duplicate external_ref in batch imports","description":"Currently, if a batch import contains multiple issues with the same external_ref, the behavior is undefined. We should detect and handle this case.\n\nCurrent behavior:\n- No validation for duplicate external_ref within a batch\n- Last-write-wins or non-deterministic behavior\n\nProposed solution:\n- Detect duplicate external_ref values in incoming batch\n- Fail with clear error message OR\n- Merge duplicates intelligently (use newest timestamp)\n- Add test case for this scenario\n\nRelated: bd-1022","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-02T15:31:55.85634-08:00","updated_at":"2025-11-02T16:40:01.022143-08:00","closed_at":"2025-11-02T16:40:01.022143-08:00"} {"id":"bd-7324","title":"Add is_tombstone flag to schema","description":"Optionally add is_tombstone boolean field to issues table. Marks resurrected parents that were deleted. Allows distinguishing tombstones from normal deleted issues. Update schema.go and create migration.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-04T12:31:59.745076-08:00","updated_at":"2025-11-05T00:44:27.947578-08:00","closed_at":"2025-11-05T00:44:27.947584-08:00"} {"id":"bd-736d","title":"Refactor path canonicalization into helper function","description":"The path canonicalization logic (filepath.Abs + EvalSymlinks) is duplicated in 3 places:\n- beads.go:131-137 (BEADS_DIR handling)\n- cmd/bd/main.go:446-451 (--no-db cleanup)\n- cmd/bd/nodb.go:26-31 (--no-db initialization)\n\nRefactoring suggestion:\nExtract to a helper function like:\n func canonicalizePath(path string) string\n\nThis would:\n- Reduce code duplication\n- Make the logic easier to maintain\n- Ensure consistent behavior across all path handling\n\nRelated to bd-e16b implementation.","status":"closed","priority":3,"issue_type":"chore","created_at":"2025-11-02T18:33:47.727443-08:00","updated_at":"2025-12-09T18:38:37.678853071-05:00","closed_at":"2025-11-25T22:27:33.738672-08:00"} +{"id":"bd-738r6","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T16:02:03.9906-08:00","created_by":"beads/refinery","updated_at":"2026-01-10T16:02:04.025522-08:00","closed_at":"2026-01-10T16:02:04.025522-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-73got","title":"Refactor beads-release formula to use gate step","description":"Update beads-release.formula.toml to use gate-based async for CI wait:\n\nReplace the spin-wait `wait-ci` step with a proper gate step:\n\n```toml\n[[steps]]\nid = \"wait-ci\"\ntitle = \"Await CI completion\"\nneeds = [\"push-tag\"]\ngate = \"gh:run\"\ngate_hint = \"release.yml\"\ntimeout = \"30m\"\ndescription = \"\"\"\nGate step awaiting GitHub Actions release workflow.\nResolves automatically when workflow succeeds.\nEscalates if workflow fails or times out.\n\nNo polling needed - Deacon patrol evaluates gates periodically.\n\"\"\"\n```\n\nDepends on gate infrastructure being complete.\n\nParent: bd-ka761","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-08T20:53:43.3345-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-08T21:20:50.372013-08:00","closed_at":"2026-01-08T21:20:50.372013-08:00","close_reason":"Already complete: beads-release.formula.toml has await-ci step with gate (type=gh:run, id=release.yml, timeout=30m). No spin-wait code found.","dependencies":[{"issue_id":"bd-73got","depends_on_id":"bd-ka761","type":"parent-child","created_at":"2026-01-08T20:54:04.116426-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-73got","depends_on_id":"bd-1ep6e","type":"blocks","created_at":"2026-01-08T20:54:11.719414-08:00","created_by":"beads/crew/emma"}]} {"id":"bd-73iz","title":"Test issue 1","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-07T19:04:17.430269-08:00","updated_at":"2025-11-07T22:07:17.344468-08:00","closed_at":"2025-11-07T21:55:09.427697-08:00"} {"id":"bd-746","title":"Fix resolvePartialID stub in workflow.go","description":"The resolvePartialID function at workflow.go:921-925 is a stub that just returns the ID unchanged. Should use utils.ResolvePartialID for proper partial ID resolution in direct mode (non-daemon).","status":"tombstone","priority":2,"issue_type":"bug","created_at":"2025-12-17T22:22:57.586917-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"} @@ -465,10 +488,12 @@ {"id":"bd-74w1","title":"Consolidate duplicate path-finding utilities (findJSONLPath, findBeadsDir, findGitRoot)","description":"Code health review found these functions defined in multiple places:\n\n- findJSONLPath() in autoflush.go:45-73 and doctor/fix/migrate.go\n- findBeadsDir() in autoimport.go:197-239 (with git worktree handling)\n- findGitRoot() in autoimport.go:242-269 (Windows path conversion)\n\nThe beads package has public FindBeadsDir() and FindJSONLPath() APIs that should be used consistently.\n\nImpact: Bug fixes need to be applied in multiple places. Git worktree handling may not be replicated everywhere.\n\nFix: Consolidate all implementations to use the beads package APIs. Remove duplicates.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-16T18:17:16.694293-08:00","updated_at":"2025-12-22T21:13:46.83103-08:00","closed_at":"2025-12-22T21:13:46.83103-08:00"} {"id":"bd-754r","title":"Merge: bd-thgk","description":"branch: polecat/Compactor\ntarget: main\nsource_issue: bd-thgk\nrig: beads","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-23T13:41:43.965771-08:00","updated_at":"2025-12-23T19:12:08.345449-08:00","closed_at":"2025-12-23T19:12:08.345449-08:00"} {"id":"bd-763c","title":"~/src/beads daemon has 'sql: database is closed' errors - zombie daemon","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-10-31T21:08:03.388007-07:00","updated_at":"2025-10-31T21:52:04.214274-07:00","closed_at":"2025-10-31T21:52:04.214274-07:00","dependencies":[{"issue_id":"bd-763c","depends_on_id":"bd-2752a7a2","type":"discovered-from","created_at":"2025-10-31T21:08:03.388716-07:00","created_by":"stevey"}]} +{"id":"bd-76edo","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T15:27:53.581059-08:00","created_by":"beads/refinery","updated_at":"2026-01-10T15:27:53.616381-08:00","closed_at":"2026-01-10T15:27:53.616381-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-77gm","title":"Import reports misleading '0 created, 0 updated' when actually importing all issues","description":"When running 'bd import' on a fresh database (no existing issues), the command reports 'Import complete: 0 created, 0 updated' even though it successfully imported all issues from the JSONL file.\n\n**Steps to reproduce:**\n1. Delete .beads/beads.db\n2. Run: bd import .beads/issues.jsonl\n3. Observe output: 'Import complete: 0 created, 0 updated'\n4. Run: bd list\n5. Confirm: All issues are actually present in the database\n\n**Expected behavior:**\nReport the actual number of issues imported, e.g., 'Import complete: 523 created, 0 updated'\n\n**Actual behavior:**\n'Import complete: 0 created, 0 updated' (misleading - makes user think import failed)\n\n**Impact:**\n- Users think import failed when it succeeded\n- Confusing during database sync operations (e.g., after git pull)\n- Makes debugging harder (can't tell if import actually worked)\n\n**Context:**\nDiscovered during VC session when syncing database after git pull. The misleading message caused confusion about whether the database was properly synced with the canonical JSONL file.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-09T16:20:13.191156-08:00","updated_at":"2025-12-21T21:13:27.057292-08:00","closed_at":"2025-12-21T21:13:27.057292-08:00"} {"id":"bd-784c","title":"Code Review: Beads Refactoring Sprint","description":"Epic for code smell fixes identified during Beads code review.\n\n## Scope\n11 issues covering:\n- P2: Duplicated code in cook.go (2 issues)\n- P3: Long functions and God Objects (5 issues) \n- P4: Technical debt and cleanup (4 issues)\n\n## Approach\nSwarm with polecats, each taking 1-2 issues. All changes should:\n1. Pass existing tests\n2. Not change external behavior\n3. Improve code maintainability\n\n## Success Criteria\nAll 11 child issues closed with passing CI.","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-12-28T15:37:54.076091-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T18:45:51.192153-08:00","closed_at":"2025-12-28T18:45:51.192153-08:00"} {"id":"bd-78w","title":"Test Epic 2","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":"epic","created_at":"2025-11-03T20:15:03.878216-08:00","updated_at":"2025-11-05T00:25:06.566242-08:00","closed_at":"2025-11-05T00:25:06.566242-08:00"} {"id":"bd-790","title":"Document which files to commit after bd init --branch","description":"GH #312 reported confusion about which files should be committed after running 'bd init --branch beads-metadata'. Updated PROTECTED_BRANCHES.md to clearly document:\n\n1. Files that should be committed to protected branch (main):\n - .beads/.gitignore\n - .gitattributes\n\n2. Files that are automatically gitignored\n3. Files that live in the sync branch (beads-metadata)\n\nChanges:\n- Added step-by-step instructions in Quick Start section\n- Added 'What lives in each branch' section to How It Works\n- Clarified the directory structure diagram\n\nFixes: https://github.com/steveyegge/beads/issues/312","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-20T21:47:25.813954-05:00","updated_at":"2025-11-20T21:47:33.567649-05:00","closed_at":"2025-11-20T21:47:33.567651-05:00"} +{"id":"bd-79wlf","title":"Session ended: gt-beads-crew-fang","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T13:51:28.674805-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-09T13:51:28.713511-08:00","closed_at":"2026-01-09T13:51:28.713511-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-7a00c94e","title":"Rapid 2","status":"closed","priority":3,"issue_type":"task","created_at":"2025-10-29T19:11:57.430725-07:00","updated_at":"2025-12-14T12:12:46.53405-08:00","closed_at":"2025-11-07T23:18:52.352188-08:00"} {"id":"bd-7a2b58fc","title":"Implement clone-scoped ID allocation to prevent N-way collisions","description":"## Problem\nCurrent ID allocation uses per-clone atomic counters (issue_counters table) that sync based on local database state. In N-way collision scenarios:\n- Clone B sees {test-1} locally, allocates test-2\n- Clone D sees {test-1, test-2, test-3} locally, allocates test-4\n- When same content gets assigned test-2 and test-4, convergence fails\n\nRoot cause: Each clone independently allocates IDs without global coordination, leading to overlapping assignments for the same content.\n\n## Solution\nAdd clone UUID to ID allocation to make every ID globally unique:\n\n**Current format:** `test-1`, `test-2`, `test-3`\n**New format:** `test-1-a7b3`, `test-2-a7b3`, `test-3-c4d9`\n\nWhere suffix is first 4 chars of clone UUID.\n\n## Implementation\n\n### 1. Add clone_identity table\n```sql\nCREATE TABLE clone_identity (\n clone_uuid TEXT PRIMARY KEY,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP\n);\n```\n\n### 2. Modify getNextIDForPrefix()\n```go\nfunc (s *SQLiteStorage) getNextIDForPrefix(ctx context.Context, prefix string) (string, error) {\n cloneUUID := s.getOrCreateCloneUUID(ctx)\n shortUUID := cloneUUID[:4]\n \n nextNum := s.getNextCounterForPrefix(ctx, prefix)\n return fmt.Sprintf(\"%s-%d-%s\", prefix, nextNum, shortUUID), nil\n}\n```\n\n### 3. Update ID parsing logic\nAll places that parse IDs (utils.ExtractIssueNumber, etc.) need to handle new format.\n\n### 4. Migration strategy\n- Existing IDs remain unchanged (no suffix)\n- New IDs get clone suffix automatically\n- Display layer can hide suffix in UI: `bd-cb64c226.3-a7b3` → `#42`\n\n## Benefits\n- **Zero collision risk**: Same content in different clones gets different IDs\n- **Maintains readability**: Still sequential numbering within clone\n- **No coordination needed**: Works offline, no central authority\n- **Scales to 100+ clones**: 4-char hex = 65,536 unique clones\n\n## Concerns\n- ID format change may break existing integrations\n- Need migration path for existing databases\n- Display logic needs update to hide/show suffixes appropriately\n\n## Success Criteria\n- 10+ clone collision test passes without failures\n- Existing issues continue to work (backward compatibility)\n- Documentation updated with new ID format\n- Migration guide for v1.x → v2.x\n\n## Timeline\nMedium-term (v1.1-v1.2), 2-3 weeks implementation\n\n## References\n- Related to bd-0dcea000 (immediate fix)\n- See beads_nway_test.go for failing N-way tests","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-10-29T20:02:47.952447-07:00","updated_at":"2025-12-14T12:12:46.506819-08:00","closed_at":"2025-11-06T19:27:29.41629-08:00"} {"id":"bd-7b7h","title":"bd sync --merge fails due to chicken-and-egg: .beads/ always dirty","description":"## Problem\n\nWhen sync.branch is configured (e.g., beads-sync), the bd sync workflow creates a chicken-and-egg problem:\n\n1. `bd sync` commits changes to beads-sync via worktree\n2. `bd sync` copies JSONL to main working dir via `copyJSONLToMainRepo()` (sync.go line 364, worktree.go line 678-685)\n3. The copy is NOT committed to main - it just updates the working tree\n4. `bd sync --merge` checks for clean working dir (sync.go line 1547-1548)\n5. `bd sync --merge` FAILS because .beads/issues.jsonl is uncommitted!\n\n## Impact\n\n- sync.branch workflow is fundamentally broken\n- Users cannot periodically merge beads-sync → main\n- Main branch always shows as dirty\n- Creates confusion about git state\n\n## Root Cause\n\nsync.go:1547-1548:\n```go\nif len(strings.TrimSpace(string(statusOutput))) \u003e 0 {\n return fmt.Errorf(\"main branch has uncommitted changes, please commit or stash them first\")\n}\n```\n\nThis check blocks merge when ANY uncommitted changes exist, including the .beads/ changes that `bd sync` itself created.\n\n## Proposed Fix\n\nOption A: Exclude .beads/ from the clean check in `mergeSyncBranch`:\n```go\n// Check if there are non-beads uncommitted changes\nstatusCmd := exec.CommandContext(ctx, \"git\", \"status\", \"--porcelain\", \"--\", \":!.beads/\")\n```\n\nOption B: Auto-stash .beads/ changes before merge, restore after\n\nOption C: Change the workflow - do not copy JSONL to main working dir, instead always read from worktree\n\n## Files to Modify\n\n- cmd/bd/sync.go:1540-1549 (mergeSyncBranch function)\n- Possibly internal/syncbranch/worktree.go (copyJSONLToMainRepo)","notes":"## Fix Implemented\n\nModified cmd/bd/sync.go mergeSyncBranch function:\n\n1. **Exclude .beads/ from dirty check** (line 1543):\n Changed `git status --porcelain` to `git status --porcelain -- :!.beads/`\n This allows merge to proceed when only .beads/ has uncommitted changes.\n\n2. **Restore .beads/ to HEAD before merge** (lines 1553-1561):\n Added `git checkout HEAD -- .beads/` before merge to prevent\n \"Your local changes would be overwritten by merge\" errors.\n The .beads/ changes are redundant since they came FROM beads-sync.\n\n## Testing\n\n- All cmd/bd sync/merge tests pass\n- All internal/syncbranch tests pass\n- Manual verification needed for full workflow","status":"tombstone","priority":0,"issue_type":"bug","created_at":"2025-12-16T23:06:06.97703-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} @@ -512,12 +537,15 @@ {"id":"bd-7r4l","title":"GH#488: Support claude.local.md for local-only config","description":"Allow CLAUDE.local.md for testing bd without committing to repo or overriding shared CLAUDE.md. Not every repo wants committed AI config. See: https://github.com/steveyegge/beads/issues/488","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-14T16:32:19.944847-08:00","updated_at":"2025-12-16T01:17:26.116311-08:00","closed_at":"2025-12-14T17:29:34.624157-08:00"} {"id":"bd-7t9a","title":"MCP plugin: _find_beads_db_in_tree() should follow .beads/redirect files","description":"## Problem\nThe `_find_beads_db_in_tree()` function in `integrations/beads-mcp/src/beads_mcp/tools.py` does not follow `.beads/redirect` files.\n\n## Impact\nMCP beads tools fail from polecat/crew directories that use redirect files to share a beads database.\n\n## Root Cause\nWhen auto-detecting workspace, the MCP plugin looks for `.beads/*.db` files directly but doesn't check for or follow `redirect` files:\n\n```python\nbeads_dir = os.path.join(current, '.beads')\nif os.path.isdir(beads_dir):\n db_files = glob.glob(os.path.join(beads_dir, '*.db')) # Only looks for .db files\n valid_dbs = [f for f in db_files if '.backup' not in os.path.basename(f)]\n if valid_dbs:\n return current\n```\n\nPolecat directories have `.beads/redirect` files (e.g., containing `../../mayor/rig/.beads`) but no `.db` files, so `_find_beads_db_in_tree()` doesn't find them.\n\n## Expected Behavior\nThe function should:\n1. Check for `.beads/redirect` file first\n2. If found, follow the redirect to the actual beads location\n3. Verify the redirected location has a valid database\n\n## Reference\nThe Go implementation handles this correctly in `ResolveBeadsDir()` - see gastown `internal/beads/beads.go:23-60`.\n\n## Related\n- gt-tnw: MCP beads tools fail from polecat directories","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-29T23:57:21.710278-08:00","created_by":"gastown/polecats/capable","updated_at":"2025-12-30T00:05:38.307967-08:00","closed_at":"2025-12-30T00:05:38.307967-08:00","close_reason":"Fixed: added _resolve_beads_redirect() to follow .beads/redirect files in MCP plugin auto-detection"} {"id":"bd-7tuu","title":"Commit and push release","description":"git add -A \u0026\u0026 git commit \u0026\u0026 git push to trigger CI","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T22:56:02.053382-08:00","updated_at":"2025-12-20T01:23:52.484043-08:00","closed_at":"2025-12-20T01:23:52.484043-08:00","dependencies":[{"issue_id":"bd-7tuu","depends_on_id":"bd-6s61","type":"parent-child","created_at":"2025-12-19T22:56:15.021087-08:00","created_by":"daemon"},{"issue_id":"bd-7tuu","depends_on_id":"bd-hw3w","type":"blocks","created_at":"2025-12-19T22:56:23.291591-08:00","created_by":"daemon"}]} +{"id":"bd-7u877","title":"Session ended: gt-beads-crew-fang","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T18:32:13.066915-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-09T18:32:13.10513-08:00","closed_at":"2026-01-09T18:32:13.10513-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-7ujdi","title":"Refinery Patrol","description":"Merge queue processor patrol loop with verification gates.","status":"open","priority":2,"issue_type":"molecule","created_at":"2026-01-09T21:39:23.66476-08:00","created_by":"deacon","updated_at":"2026-01-09T21:39:23.66476-08:00"} {"id":"bd-7v3","title":"Add commit and branch to bd version output","description":"The 'bd version' command reports commit and branch correctly when built with 'go build' (thanks to Go 1.25+ automatic VCS info embedding), but NOT when installed with 'go install' or 'make install'. Need to either: 1) Update Makefile to use 'go build' instead of 'go install', or 2) Add explicit ldflags to both Makefile and .goreleaser.yml to ensure commit/branch are always set regardless of build method.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-09T05:56:13.642971756-07:00","updated_at":"2025-12-09T06:01:56.787528774-07:00","closed_at":"2025-12-09T06:01:56.787528774-07:00"} +{"id":"bd-7war0","title":"Session ended: gt-beads-witness","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T21:05:14.597493-08:00","created_by":"beads/witness","updated_at":"2026-01-10T21:05:14.672065-08:00","closed_at":"2026-01-10T21:05:14.672065-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-7wr2w","title":"Fix: bd sync fails on fresh clone v0.46.0 (GH#963)","description":"dispatched_by: beads/crew/dave\n\nGitHub issue #963. bd sync fails on freshly cloned repos in v0.46.0.","status":"closed","priority":1,"issue_type":"bug","assignee":"beads/crew/grip","created_at":"2026-01-09T22:19:56.735403-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-09T22:30:06.446063-08:00","closed_at":"2026-01-09T22:30:06.446063-08:00","close_reason":"Fixed: added custom types support to batch issue validation. Changes: 1) Added GetCustomTypes to storage interface and implementations 2) Added IssueType.IsValidWithCustom for custom type validation 3) Added Issue.ValidateWithCustom that checks both custom statuses and types 4) Updated CreateIssuesWithFullOptions to fetch and use custom types during validation"} {"id":"bd-7wrh","title":"Merge: jasper-1767083473604","description":"branch: polecat/jasper-1767083473604\ntarget: main\nsource_issue: jasper-1767083473604\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T00:39:04.84733-08:00","created_by":"beads/polecats/jasper","updated_at":"2025-12-30T00:54:58.805495-08:00","closed_at":"2025-12-30T00:54:58.805495-08:00","close_reason":"Branch polecat/jasper-1767083473604 no longer exists on remote"} {"id":"bd-7xd7","title":"Update tests for type extraction changes","description":"Update all tests affected by Gas Town type extraction.\n\n## Test files to update\n- internal/types/types_test.go (type validation tests)\n- cmd/bd/agent_routing_test.go (agent type checks)\n- internal/storage/sqlite/sqlite_test.go (convoy tests)\n- internal/validation/bead_test.go (type validation)\n- internal/ui/styles_test.go (style rendering)\n\n## Work\n- Update test cases that use TypeAgent, TypeRole, TypeRig, TypeConvoy, TypeSlot\n- Add tests for custom type support via types.custom config\n- Add tests for label-based filtering","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:40:52.758221-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-06T22:17:53.972176-08:00","closed_at":"2026-01-06T22:17:53.972176-08:00","close_reason":"Tests already updated as part of type extraction work","dependencies":[{"issue_id":"bd-7xd7","depends_on_id":"bd-i54l","type":"parent-child","created_at":"2026-01-06T20:41:11.770837-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-7xd7","depends_on_id":"bd-4jxh","type":"blocks","created_at":"2026-01-06T20:41:29.0029-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-7xd7","depends_on_id":"bd-cn56","type":"blocks","created_at":"2026-01-06T20:41:29.039305-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-7xd7","depends_on_id":"bd-16z7","type":"blocks","created_at":"2026-01-06T20:41:29.078573-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-7xd7","depends_on_id":"bd-mgt2","type":"blocks","created_at":"2026-01-06T20:41:29.113145-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-7xd7","depends_on_id":"bd-4kp2","type":"blocks","created_at":"2026-01-06T20:41:29.147522-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-7xd7","depends_on_id":"bd-fen8","type":"blocks","created_at":"2026-01-06T22:06:27.177221-08:00","created_by":"beads/crew/dave"}]} {"id":"bd-7xrg","title":"Refinery Patrol","description":"Merge queue processor patrol loop with verification gates.","status":"closed","priority":2,"issue_type":"molecule","created_at":"2025-12-27T18:14:31.190713-08:00","updated_at":"2025-12-30T18:12:30.974709-08:00","closed_at":"2025-12-30T18:11:14.234636-08:00"} +{"id":"bd-7ybku","title":"Session ended: gt-beads-crew-dave","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T22:23:36.321186-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-09T22:23:36.358579-08:00","closed_at":"2026-01-09T22:23:36.358579-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-7yg","title":"Git merge driver uses invalid placeholders (%L, %R instead of %A, %B)","description":"## Problem\n\nThe beads git merge driver is configured with invalid Git placeholders:\n\n```\ngit config merge.beads.driver \"bd merge %A %O %L %R\"\n```\n\nGit doesn't recognize `%L` or `%R` as valid merge driver placeholders. The valid placeholders are:\n- `%O` = base (common ancestor)\n- `%A` = current version (ours)\n- `%B` = other version (theirs)\n\n## Impact\n\n- Affects ALL users when they have `.beads/beads.jsonl` merge conflicts\n- Automatic JSONL merge fails with error: \"error reading left file: failed to open file: open 7: no such file or directory\"\n- Users must manually resolve conflicts instead of getting automatic merge\n\n## Root Cause\n\nThe `bd init` command (or wherever the merge driver is configured) is using non-standard placeholders. When Git encounters `%L` and `%R`, it either passes them literally or interprets them incorrectly.\n\n## Fix\n\nUpdate the merge driver configuration to:\n```\ngit config merge.beads.driver \"bd merge %A %O %A %B\"\n```\n\nWhere:\n- 1st `%A` = output file (current file, will be overwritten)\n- `%O` = base (common ancestor)\n- 2nd `%A` = left/current version\n- `%B` = right/other version\n\n## Action Items\n\n1. Fix `bd init` (or equivalent setup command) to use correct placeholders\n2. Add migration/warning for existing users with misconfigured merge driver\n3. Update documentation with correct merge driver setup\n4. Consider adding validation when `bd init` is run","status":"tombstone","priority":1,"issue_type":"bug","created_at":"2025-11-21T19:51:55.747608-05: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-7z4","title":"Add tests for delete operations","description":"Core delete functionality including deleteViaDaemon, createTombstone, and deleteIssue functions have 0% coverage. These are critical for data integrity and need comprehensive test coverage.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-18T07:00:34.867680882-07:00","updated_at":"2025-12-23T23:48:50.087306-08:00","closed_at":"2025-12-23T23:48:50.087306-08:00","dependencies":[{"issue_id":"bd-7z4","depends_on_id":"bd-6ss","type":"discovered-from","created_at":"2025-12-18T07:00:34.870254935-07:00","created_by":"matt"}]} {"id":"bd-7zka","title":"Implement formula features: Step.Condition and Step.Gate","description":"Multiple formula features in internal/formula/types.go are marked as \"Not yet implemented\":\n\nIMPLEMENTED (TODOs removed):\n- Step.Expand: Inline expansion - implemented in ApplyInlineExpansions (expand.go)\n- Step.ExpandVars: Variable overrides for expansion - implemented alongside Expand\n\nSTILL NOT IMPLEMENTED (TODOs remain):\n- Step.Condition: Make step optional based on variable (types.go:177-180)\n- Step.Gate: Async wait condition for step (types.go:185-187)\n- Gate struct: Schema defined but not processed in bd cook (types.go:209-210)\n\nFile: internal/formula/types.go","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-12-28T16:32:54.493002-08:00","created_by":"stevey","updated_at":"2026-01-04T15:22:08.705595-08:00","closed_at":"2026-01-01T16:24:44.939885-08:00","close_reason":"Both features implemented: Step.Condition and Step.Gate (Phase 1)"} @@ -538,12 +566,14 @@ {"id":"bd-85487065","title":"Add tests for internal/autoimport package","description":"Currently 0.0% coverage. Need tests for auto-import functionality that detects and imports updated JSONL files.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-29T14:06:18.154805-07:00","updated_at":"2025-12-14T12:12:46.566161-08:00","closed_at":"2025-11-08T18:06:25.811317-08:00"} {"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-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-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"} {"id":"bd-879d","title":"Test issue 1","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-02T09:44:12.538697729Z","updated_at":"2025-11-02T09:45:20.76214671Z","closed_at":"2025-11-02T09:45:20.76214671Z","dependencies":[{"issue_id":"bd-879d","depends_on_id":"bd-d3e5","type":"discovered-from","created_at":"2025-11-02T09:44:22.103468321Z","created_by":"mrdavidlaing"}]} {"id":"bd-87a0","title":"Publish @beads/bd package to npm registry","description":"Publish the npm package to the public npm registry:\n\n## Prerequisites\n- npm account created\n- Organization @beads created (or use different namespace)\n- npm login completed locally\n- Package tested locally (bd-f282 completed)\n\n## Publishing steps\n1. Verify package.json version matches current bd version\n2. Run npm pack and inspect tarball contents\n3. Test installation from tarball one more time\n4. Run npm publish --access public\n5. Verify package appears on https://www.npmjs.com/package/@beads/bd\n6. Test installation from registry: npm install -g @beads/bd\n\n## Post-publish\n- Add npm badge to README.md\n- Update CHANGELOG.md with npm package release\n- Announce in release notes\n\n## Note\n- May need to choose different name if @beads namespace unavailable\n- Alternative: beads-cli, bd-cli, or unscoped beads-issue-tracker","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-02T23:40:25.263569-08:00","updated_at":"2025-11-03T10:39:41.772338-08:00","closed_at":"2025-11-03T10:39:41.772338-08:00","dependencies":[{"issue_id":"bd-87a0","depends_on_id":"bd-febc","type":"parent-child","created_at":"2025-11-02T23:40:33.014043-08:00","created_by":"daemon"}]} {"id":"bd-8900f145","title":"Testing event-driven mode!","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-29T15:28:33.564871-07:00","updated_at":"2025-10-30T17:12:58.186325-07:00","closed_at":"2025-10-29T19:12:54.43368-07:00"} {"id":"bd-8931","title":"Daemon gets stuck when auto-import blocked by git conflicts","description":"CRITICAL: The daemon enters a corrupt state that breaks RPC commands when auto-import is triggered but git pull fails due to uncommitted changes.\n\nImpact: This is a data integrity and usability issue that could cause users to lose trust in Beads. The daemon silently fails for certain commands while appearing healthy.\n\nReproduction:\n1. Make local changes to issues (creates uncommitted .beads/beads.jsonl)\n2. Remote has updates (JSONL newer, triggers auto-import)\n3. Daemon tries to pull but fails: 'cannot pull with rebase: You have unstaged changes'\n4. Daemon enters bad state - 'bd show' and other commands return EOF\n5. 'bd list' still works, daemon process is running, no errors logged\n\nTechnical details:\n- Auto-import check runs in handleRequest() before processing RPC commands\n- When import is blocked, it appears to corrupt daemon state\n- Likely: deadlock, unclosed transaction, or storage handle corruption\n- Panic recovery (server_lifecycle_conn.go:183) didn't catch anything - not a panic\n\nRequired fix:\n- Auto-import must not block RPC command execution\n- Handle git pull failures gracefully without corrupting state\n- Consider: skip auto-import if git is dirty, queue import for later, or use separate goroutine\n- Add timeout/circuit breaker for import operations\n- Log clear warnings when auto-import is skipped\n\nWithout this fix, users in collaborative environments will frequently encounter mysterious EOF errors that require daemon restarts.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-02T17:15:25.181425-08:00","updated_at":"2025-12-14T12:12:46.564936-08:00","closed_at":"2025-11-03T12:08:12.949064-08:00","dependencies":[{"issue_id":"bd-8931","depends_on_id":"bd-1048","type":"blocks","created_at":"2025-11-02T17:15:25.181857-08:00","created_by":"stevey"}]} +{"id":"bd-8972j","title":"Session ended: gt-beads-crew-wolf","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T12:31:47.178724-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-10T12:31:47.21488-08:00","closed_at":"2026-01-10T12:31:47.21488-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-897a","title":"Add UNIQUE constraint on external_ref column","description":"The external_ref column should have a UNIQUE constraint to prevent multiple issues from having the same external reference. This ensures data integrity when syncing from external systems (Jira, GitHub, Linear).\n\nCurrent behavior:\n- Multiple issues can have the same external_ref\n- GetIssueByExternalRef returns first match (non-deterministic with duplicates)\n\nProposed solution:\n- Add UNIQUE constraint to external_ref column\n- Add migration to check for and resolve existing duplicates\n- Update tests to verify constraint enforcement\n\nRelated: bd-1022","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-02T15:31:54.718005-08:00","updated_at":"2025-11-02T16:40:01.020314-08:00","closed_at":"2025-11-02T16:40:01.020314-08:00"} {"id":"bd-89e2","title":"Daemon race condition: stale export overwrites recent DB changes","description":"**Symptom:**\nMerged bd-fc2d into bd-fb05 in ~/src/beads (commit ce4d756), pushed to remote. The ~/src/fred/beads daemon then exported its stale DB state and committed (8cc1bb4), reverting bd-fc2d back to \"open\" status.\n\n**Timeline:**\n1. 21:45:12 - Merge committed from ~/src/beads (ce4d756): bd-fc2d closed\n2. 21:49:42 - Daemon in ~/src/fred/beads exported stale state (8cc1bb4): bd-fc2d open again\n\n**Root cause:**\nThe fred/beads daemon had a stale database (bd-fc2d still open) and didn't auto-import the newer JSONL before exporting. When it exported, it overwrote the merge with its stale state.\n\n**Expected behavior:**\nDaemon should detect that JSONL is newer than its last export and import before exporting.\n\n**Actual behavior:**\nDaemon exported stale DB state, creating a conflicting commit that reverted upstream changes.\n\n**Impact:**\nMulti-workspace setups with daemons can silently lose changes if one daemon has stale state and exports.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-01T21:53:07.930819-07:00","updated_at":"2025-11-01T22:01:25.54126-07:00","closed_at":"2025-11-01T22:01:25.54126-07:00"} {"id":"bd-89f89fc0","title":"Remove unreachable RPC methods","description":"Several RPC server and client methods are unreachable and should be removed:\n\nServer methods (internal/rpc/server.go):\n- `Server.GetLastImportTime` (line 2116)\n- `Server.SetLastImportTime` (line 2123)\n- `Server.findJSONLPath` (line 2255)\n\nClient methods (internal/rpc/client.go):\n- `Client.Import` (line 311) - RPC import not used (daemon uses autoimport)\n\nEvidence:\n```bash\ngo run golang.org/x/tools/cmd/deadcode@latest -test ./...\n```\n\nImpact: Removes ~80 LOC of unused RPC code","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-10-28T16:20:02.432202-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":"task"} @@ -567,6 +597,7 @@ {"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-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} {"id":"bd-8nhm","title":"Verify docs/property-layers.md exists after merge","description":"During property layers implementation, docs/property-layers.md was deleted in multiple polecat branches. Verify this file exists after all merges complete. If missing, restore from backup or recreate based on ~/gt/docs/hop/PROPERTY-LAYERS.md.","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-06T20:10:42.679659-08:00","created_by":"mayor","updated_at":"2026-01-06T20:14:25.936813-08:00","closed_at":"2026-01-06T20:14:25.936813-08:00","close_reason":"Refiling as gt- issue"} {"id":"bd-8och0","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T00:45:27.251991-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T00:45:27.289355-08:00","closed_at":"2026-01-09T00:45:27.289355-08:00","close_reason":"auto-closed session event"} {"id":"bd-8oqpg","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-08T20:44:24.827026-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-08T20:44:24.864433-08:00","closed_at":"2026-01-08T20:44:24.864433-08:00","close_reason":"auto-closed session event"} @@ -576,6 +607,7 @@ {"id":"bd-8ql","title":"Remove misleading placeholder 'bd merge' command from duplicates output","description":"**Problem:**\nThe `bd duplicates` command suggests running a command that doesn't exist:\n```\nbd merge \u003csource-ids\u003e --into \u003ctarget-id\u003e\n```\n\nThis is confusing because:\n1. `bd merge` is actually a git 3-way JSONL merge driver (takes 4 file paths)\n2. The suggested syntax for merging duplicate issues is not implemented\n3. Line 75 in duplicates.go even has: `// TODO: performMerge implementation pending`\n\n**Current behavior:**\n- Users see suggested command that doesn't work\n- No indication that feature is unimplemented\n- Related to issue #349 item #2\n\n**Proposed fix:**\nReplace line 77 in cmd/bd/duplicates.go with either:\n\nOption A (conservative):\n```go\ncmd := fmt.Sprintf(\"# TODO: Merge %s into %s (merge command not yet implemented)\", \n strings.Join(sources, \" \"), target.ID)\n```\n\nOption B (actionable):\n```go\ncmd := fmt.Sprintf(\"# Duplicate found: %s\\n# Manual merge: Close duplicates with 'bd close %s' and link to %s as 'related'\", \n strings.Join(sources, \" \"), strings.Join(sources, \" \"), target.ID)\n```\n\n**Files to modify:**\n- cmd/bd/duplicates.go (line ~77)","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-20T20:48:01.707967-05:00","updated_at":"2025-11-20T20:59:13.416865-05:00","closed_at":"2025-11-20T20:59:13.416865-05:00"} {"id":"bd-8rd","title":"Migration and onboarding for multi-repo","description":"Create migration tools, wizards, and documentation to help users adopt multi-repo workflow, with special focus on OSS contributor onboarding and team adoption scenarios.","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-11-04T11:22:13.491033-08:00","updated_at":"2025-11-07T16:08:24.951261-08:00","closed_at":"2025-11-07T16:03:09.75064-08:00","dependencies":[{"issue_id":"bd-8rd","depends_on_id":"bd-4ms","type":"parent-child","created_at":"2025-11-04T11:22:21.858002-08:00","created_by":"daemon"}]} {"id":"bd-8rssb","title":"Session ended: gt-beads-crew-fang","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T21:33:52.477938-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-09T21:15:40.694317-08:00","closed_at":"2026-01-09T21:15:40.694317-08:00","close_reason":"Stale session ended events"} +{"id":"bd-8uwdi","title":"Session ended: gt-beads-crew-dave","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T19:29:09.223322-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-10T19:29:09.26506-08:00","closed_at":"2026-01-10T19:29:09.26506-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-8v2","title":"Add {{version}} 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-18T22:43:00.482846-08:00","updated_at":"2025-12-24T16:25:30.231077-08:00","dependencies":[{"issue_id":"bd-8v2","depends_on_id":"bd-qqc","type":"parent-child","created_at":"2025-12-18T22:43:16.496649-08:00","created_by":"daemon"},{"issue_id":"bd-8v2","depends_on_id":"bd-kyo","type":"blocks","created_at":"2025-12-18T22:43:20.69619-08:00","created_by":"daemon"}],"deleted_at":"2025-12-24T16:25:30.231077-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} {"id":"bd-8v5o","title":"bd doctor --fix hydrates issues that remain in deletions manifest, causing perpetual skip warnings","description":"When bd doctor --fix hydrates issues from git history, it doesn't remove them from the deletions manifest. This causes a conflict where:\n1. Issue exists in database as 'open'\n2. Issue also exists in deletions manifest\n3. Every sync reports 'Skipping bd-xxx (in deletions manifest)'\n4. Issue is 'Protected from incorrect sanitization'\n\n**Reproduction:**\n1. Run bd doctor --fix (which hydrates issues from git history)\n2. Run bd sync\n3. Observe conflicting messages about protected issues being skipped\n\n**Affected issues in this session:**\nbd-eyto, bd-6rl, bd-y2v, bd-abjw, bd-a0cp, bd-mql4, bd-nl2\n\n**Expected behavior:**\nWhen hydrating an issue, also remove it from the deletions manifest to prevent conflict.\n\n**Workaround:** Manually remove conflicting IDs from deletions.jsonl","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-15T17:28:40.060713-08:00","updated_at":"2025-12-16T00:41:33.165408-08:00","closed_at":"2025-12-16T00:41:33.165408-08:00"} {"id":"bd-8wa","title":"Code Review Sweep: thorough","description":"Perform thorough code review sweep based on accumulated activity.\n\n**AI Reasoning:**\nSignificant code volume added (150,273 lines) across multiple critical areas, including cmd/bd, internal/storage/sqlite, and internal/rpc. High file change count (616) indicates substantial refactoring or new functionality. The metrics suggest potential for subtle architectural or implementation issues that warrant review.\n\n**Scope:** thorough\n**Target Areas:** cmd/bd, internal/storage/sqlite, internal/rpc\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-21T10:25:37.081296-05:00","updated_at":"2025-12-14T00:32:11.046909-08:00","closed_at":"2025-12-13T23:33:16.521045-08:00"} @@ -592,6 +624,7 @@ {"id":"bd-908z","title":"Add bd hooks install command to embed git hooks in binary","description":"Currently git hooks are installed via `examples/git-hooks/install.sh`, which only exists in the beads source repo. Users who install bd via installer/homebrew/npm can't easily install hooks.\n\n**Proposal:**\nAdd `bd hooks install` command that:\n- Embeds hook scripts in the bd binary (using go:embed)\n- Installs them to .git/hooks/ in current repo\n- Backs up existing hooks\n- Makes them executable\n\n**Commands:**\n- `bd hooks install` - Install all hooks\n- `bd hooks uninstall` - Remove hooks\n- `bd hooks list` - Show installed hooks status\n\n**Benefits:**\n- Works for all bd users, not just source repo users\n- More discoverable (shows in bd --help)\n- Consistent with bd workflow\n- Can version hooks with bd releases","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-11-08T01:23:24.362827-08:00","updated_at":"2025-11-08T01:28:08.842516-08:00","closed_at":"2025-11-08T01:28:08.842516-08:00"} {"id":"bd-90a5","title":"Extract hash ID generation functions to hash_ids.go","description":"Move generateHashID, getNextChildNumber, GetNextChildID to hash_ids.go","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-01T19:28:54.890883-07:00","updated_at":"2025-11-02T12:32:00.159056-08:00","closed_at":"2025-11-02T12:32:00.159058-08:00"} {"id":"bd-90fs","title":"Merge: amber-1767138546434","description":"branch: polecat/amber-1767138546434\ntarget: main\nsource_issue: amber-1767138546434\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T15:57:38.681293-08:00","created_by":"beads/polecats/amber","updated_at":"2025-12-30T18:12:30.966277-08:00","closed_at":"2025-12-30T18:11:08.005131-08:00"} +{"id":"bd-90pai","title":"Session ended: gt-beads-witness","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T21:03:34.776998-08:00","created_by":"beads/witness","updated_at":"2026-01-10T21:03:34.819592-08:00","closed_at":"2026-01-10T21:03:34.819592-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-90v","title":"bd prime: AI context loading and Claude Code integration","description":"Implement `bd prime` command and Claude Code hooks for context recovery. Hooks work with BOTH MCP server and CLI approaches - they solve the context memory problem (keeping bd workflow fresh after compaction) not the tool access problem (MCP vs CLI).","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-11-11T23:31:12.119012-08:00","updated_at":"2025-12-25T22:26:54.442614-08:00","closed_at":"2025-12-25T22:26:54.442614-08:00"} {"id":"bd-9115","title":"CLI cleanup: Consolidate bd top-level commands","description":"## Problem\nbd has 76 top-level commands, making it hard to discover and remember.\n\n## Proposed Changes\n\n### Remove from top-level (nest instead):\n- `bd cook` → `bd formula cook` (cooking is a formula operation)\n- `bd pin` → already covered by `bd mol` commands\n- `bd thanks` → `bd info --thanks` or just README\n- `bd quickstart` → `bd help quickstart` or docs\n- `bd detect-pollution` → `bd doctor --check=pollution`\n\n### Consolidate migrations under `bd migrate`:\n- `bd migrate-hash-ids` → `bd migrate hash-ids`\n- `bd migrate-issues` → `bd migrate issues`\n- `bd migrate-sync` → `bd migrate sync`\n- `bd migrate-tombstones` → `bd migrate tombstones`\n\n### Consolidate admin under `bd admin`:\n- `bd cleanup` → `bd admin cleanup`\n- `bd compact` → `bd admin compact`\n- `bd reset` → `bd admin reset`\n\n## Backwards Compatibility\nKeep old commands as hidden aliases for one release cycle.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-27T14:28:03.299469-08:00","created_by":"mayor","updated_at":"2025-12-27T16:19:44.580326-08:00","closed_at":"2025-12-27T16:19:44.580326-08:00","dependencies":[{"issue_id":"bd-9115","depends_on_id":"bd-w3z7","type":"blocks","created_at":"2025-12-27T15:11:44.88081-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-do8e","type":"blocks","created_at":"2025-12-27T15:11:44.905058-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-3u8m","type":"blocks","created_at":"2025-12-27T15:11:44.929207-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-x0zl","type":"blocks","created_at":"2025-12-27T15:11:44.953799-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-wb9g","type":"blocks","created_at":"2025-12-27T15:11:44.977559-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-twbi","type":"blocks","created_at":"2025-12-27T15:11:45.002403-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-kff0","type":"blocks","created_at":"2025-12-27T15:11:45.027177-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-bxqv","type":"blocks","created_at":"2025-12-27T15:11:45.051629-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-5e9q","type":"blocks","created_at":"2025-12-27T15:11:45.07537-08:00","created_by":"daemon"}]} {"id":"bd-942469b8","title":"Rapid 5","status":"closed","priority":3,"issue_type":"task","created_at":"2025-10-29T19:11:57.508166-07:00","updated_at":"2025-12-14T12:12:46.502217-08:00","closed_at":"2025-11-07T23:18:52.298739-08:00"} @@ -618,15 +651,19 @@ {"id":"bd-9f20","title":"DetectCycles SQL query has bug preventing cycle detection","description":"The DetectCycles function's SQL query has a bug in the LIKE filter that prevents it from detecting cycles.\n\nCurrent code (line 571):\n```sql\nAND p.path NOT LIKE '%' || d.depends_on_id || '→%'\n```\n\nThis prevents ANY revisit to nodes, including returning to the start node to complete a cycle.\n\nFix:\n```sql\nAND (d.depends_on_id = p.start_id OR p.path NOT LIKE '%' || d.depends_on_id || '→%')\n```\n\nThis allows revisiting the start node (to detect the cycle) while still preventing intermediate node revisits.\n\nImpact: Currently DetectCycles cannot detect any cycles, but this hasn't been noticed because AddDependency prevents cycles from being created. The function would only matter if cycles were manually inserted into the database.","status":"closed","priority":3,"issue_type":"bug","created_at":"2025-11-01T22:50:32.552763-07:00","updated_at":"2025-11-01T22:52:02.247443-07:00","closed_at":"2025-11-01T22:52:02.247443-07:00"} {"id":"bd-9f4a","title":"Document external_ref in content hash behavior","description":"The content hash includes external_ref, which has implications that should be documented.\n\nCurrent behavior:\n- external_ref is included in content hash calculation (collision.go:158-160)\n- Changing external_ref changes content hash\n- This means: local issue → add external_ref → different hash\n\nImplications:\n- Local issue + external_ref addition = looks like 'new content'\n- May not match by content hash in some scenarios\n- Generally correct behavior, but subtle\n\nAction items:\n- Document in code comments\n- Add to ARCHITECTURE.md or similar\n- Add test demonstrating this behavior\n- Consider if this is desired long-term\n\nRelated: bd-1022\nFiles: internal/storage/sqlite/collision.go:158-160","status":"closed","priority":4,"issue_type":"task","created_at":"2025-11-02T15:32:47.715458-08:00","updated_at":"2025-12-14T12:12:46.559128-08:00","closed_at":"2025-11-08T02:20:01.004638-08:00"} {"id":"bd-9f86-baseline-test","title":"Baseline quality gate failure: test","description":"The test quality gate is failing on the baseline (main branch).\n\nThis blocks the executor from claiming work until fixed.\n\nError: go test failed: exit status 1\n\nOutput:\n```\n? \tgithub.com/steveyegge/beads\t[no test files]\n# github.com/steveyegge/beads/internal/beads_test [github.com/steveyegge/beads/internal/beads.test]\ninternal/beads/routing_integration_test.go:142:27: not enough arguments in call to sqlite.New\n\thave (string)\n\twant (context.Context, string)\n# github.com/steveyegge/beads/internal/compact [github.com/steveyegge/beads/internal/compact.test]\ninternal/compact/compactor_test.go:17:27: not enough arguments in call to sqlite.New\n\thave (string)\n\twant (context.Context, string)\n# github.com/steveyegge/beads/cmd/bd [github.com/steveyegge/beads/cmd/bd.test]\ncmd/bd/integrity_content_test.go:31:32: undefined: ctx\ncmd/bd/integrity_content_test.go:183:32: undefined: ctx\nFAIL\tgithub.com/steveyegge/beads/cmd/bd [build failed]\n# github.com/steveyegge/beads/internal/daemon [github.com/steveyegge/beads/internal/daemon.test]\ninternal/daemon/discovery_test.go:21:27: not enough arguments in call to sqlite.New\n\thave (string)\n\twant (context.Context, string)\ninternal/daemon/discovery_test.go:59:27: not enough arguments in call to sqlite.New\n\thave (string)\n\twant (context.Context, string)\ninternal/daemon/discovery_test.go:232:27: not enough arguments in call to sqlite.New\n\thave (string)\n\twant (context.Context, string)\n# github.com/steveyegge/beads/internal/importer [github.com/steveyegge/beads/internal/importer.test]\ninternal/importer/external_ref_test.go:22:27: not enough arguments in call to sqlite.New\n\thave (string)\n\twant (context.Context, string)\ninternal/importer/external_ref_test.go:106:27: not enough arguments in call to sqlite.New\n\thave (string)\n\twant (context.Context, string)\ninternal/importer/external_ref_test.go:197:27: not enough arguments in call to sqlite.New\n\thave (string)\n\twant (context.Context, string)\ninternal/importer/external_ref_test.go:295:27: not enough arguments in call to sqlite.New\n\thave (string)\n\twant (context.Context, string)\ninternal/importer/importer_test.go:566:27: not enough arguments in call to sqlite.New\n\thave (st\n... (truncated, see full output in logs)\n```","notes":"Released by executor after budget limit hit. Tests were already fixed manually. Issue can be closed when tests are verified to pass.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-21T10:17:25.962406-05:00","updated_at":"2025-11-21T11:04:33.570067-05:00","closed_at":"2025-11-21T11:04:33.570067-05:00"} +{"id":"bd-9fvf9","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T14:18:37.56943-08:00","created_by":"beads/refinery","updated_at":"2026-01-10T14:18:37.603957-08:00","closed_at":"2026-01-10T14:18:37.603957-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-9g1z","title":"Fix or remove TestFindJSONLPathDefault (issue #356)","description":"Code health review found .test-skip permanently skips TestFindJSONLPathDefault.\n\nThe test references issue #356 about wrong JSONL filename expectations (issues.jsonl vs beads.jsonl).\n\nTest file: internal/beads/beads_test.go\n\nThe underlying migration from beads.jsonl to issues.jsonl may be complete, so either:\n1. Fix the test expectations\n2. Remove the test if no longer needed\n3. Document why it remains skipped","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-16T18:17:31.33975-08:00","updated_at":"2025-12-22T21:24:50.357688-08:00","closed_at":"2025-12-22T21:24:50.357688-08:00"} {"id":"bd-9gvf","title":"Add prefix-based routing with routes.jsonl","description":"## Summary\n\nWhen running `bd show gt-xyz` from a location where that bead doesn't exist locally,\nbd should check a `routes.jsonl` file to find where beads with that prefix live.\n\n## Problem\n\nFrom ~/gt (town root):\n- `bd show hq-xxx` works (hq-* beads are local)\n- `bd show gt-xxx` fails (gt-* beads live in gastown/mayor/rig)\n\nThis breaks `gt hook`, `gt handoff`, and `gt prime` which need to verify beads exist.\n\n## Solution\n\nAdd `.beads/routes.jsonl` for prefix-based routing:\n\n\\`\\`\\`json\n{\"prefix\": \"gt-\", \"path\": \"gastown/mayor/rig\"}\n{\"prefix\": \"hq-\", \"path\": \".\"}\n{\"prefix\": \"bd-\", \"path\": \"beads/crew/dave\"}\n\\`\\`\\`\n\n### Lookup Algorithm\n\n1. Try local .beads/ first (current behavior)\n2. If not found, check for routes.jsonl in current .beads/\n3. Match ID prefix against routes\n4. If match found, resolve path relative to routes file location and retry\n5. If still not found, error as usual\n\n### Affected Commands\n\nRead operations that take a bead ID:\n- bd show \u003cid\u003e\n- bd update \u003cid\u003e\n- bd close \u003cid\u003e\n- bd dep add \u003cid\u003e \u003cdep\u003e (both IDs)\n\nWrite operations (bd create) still go to local .beads/ - no change needed.\n\n## Implementation Notes\n\n1. New file: routes.jsonl in .beads/ directory\n2. New function: resolveBeadsPath(id string) (string, error)\n3. Update: beads.Show(), beads.Update(), beads.Close(), etc. to use resolver\n4. Caching: Can cache routes in memory since file rarely changes\n\n## Context\n\nThis unblocks the gt handoff flow for Mayor. Currently gt handoff gt-xyz fails\nbecause it can't verify the bead exists when running from town root.","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-26T14:18:19.399691-08:00","updated_at":"2025-12-26T14:36:43.551435-08:00","closed_at":"2025-12-26T14:36:43.551435-08:00"} {"id":"bd-9hc9","title":"Code smell: Long function flushToJSONLWithState (~280 lines)","description":"The flushToJSONLWithState() function in cmd/bd/autoflush.go (lines 490-772) is ~280 lines with:\n\n1. Multiple nested conditionals\n2. Inline helper function definitions (recordFailure, recordSuccess)\n3. Complex multi-repo filtering logic\n4. Mixed concerns (validation, export, error handling)\n\nConsider breaking into:\n- validateJSONLIntegrity() - already exists but could absorb more\n- getIssuesToExport(fullExport bool) - determines what to export\n- mergeWithExistingJSONL(issueMap, dirtyIDs) - handles incremental merge\n- filterByPrefix(issues) - multi-repo prefix filtering\n- performExport(issues, jsonlPath) - the actual write\n- updateMetadataAfterExport() - hash/timestamp updates\n\nLocation: cmd/bd/autoflush.go:490-772","status":"closed","priority":3,"issue_type":"chore","created_at":"2025-12-28T15:32:20.909843-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T16:45:12.921052-08:00","closed_at":"2025-12-28T16:45:12.921052-08:00","dependencies":[{"issue_id":"bd-9hc9","depends_on_id":"bd-784c","type":"parent-child","created_at":"2025-12-28T15:38:04.223682-08:00","created_by":"daemon"}]} +{"id":"bd-9hvrn","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T00:13:15.492742-08:00","created_by":"beads/refinery","updated_at":"2026-01-10T00:13:15.532959-08:00","closed_at":"2026-01-10T00:13:15.532959-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} +{"id":"bd-9jbx1","title":"Session ended: gt-beads-crew-fang","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T18:32:46.663257-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-09T18:32:46.699456-08:00","closed_at":"2026-01-09T18:32:46.699456-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-9ji4z","title":"Trust child repos during multi-repo hydration (replaces PR #971)","description":"## Problem\n\nPR #971 (https://github.com/steveyegge/beads/pull/971) tries to solve a real problem: when hydrating issues from child repos, custom types defined in the child fail validation because the parent doesn't know about them.\n\nExample:\n- Child repo `oss/` has `types.custom = [bd, pm, llm]`\n- Parent hydrates issue `oss-abc` with type `pm`\n- Parent's config doesn't have `pm` → validation fails\n\nPR #971's solution: Add `custom_types` to `repos.additional` config so parent explicitly tracks child types.\n\n## Why PR #971 Is Wrong\n\nIt violates **Discover, Don't Track** (PRIMING.md):\n\n\u003e Don't maintain separate tracking for what's observable. The beads ARE the source of truth.\n\nThe child repo already knows its own types. Duplicating them in parent config is:\n- Redundant state that can drift\n- Manual sync burden when child adds types \n- Anti-pattern in Gas Town's federation model\n\n## The Right Solution: Trust + Discover\n\n### Trust (Primary)\n\nFrom CONTEXT.md federation model: each chain validates its own work. The child repo already validated these issues when they were created. The JSONL is a \"signed export\" from a working Beads database.\n\n**Don't re-validate custom types during import. Trust the source.**\n\n- Built-in types (task, bug, feature, epic, chore): validate normally\n- Custom types: skip validation - child already validated them\n\n### Discover (When Needed)\n\nIf we ever need to know child's types (diagnostics, UI, routing):\n- Read from child's config/DB on demand\n- Never cache in parent config\n- `bd doctor` can discover and report mismatches as warnings\n\n## Implementation\n\n### Phase 1: Trust during import\n\nModify `upsertIssueInTx` in `internal/storage/sqlite/multirepo.go`:\n\n```go\n// Add to types/types.go\nfunc (t IssueType) IsBuiltIn() bool {\n switch t {\n case TypeTask, TypeBug, TypeFeature, TypeEpic, TypeChore:\n return true\n }\n return false\n}\n\n// In ValidateWithCustom or upsertIssueInTx:\n// For multi-repo import, only validate built-in types\n// Custom types are trusted from source repo\n```\n\n### Phase 2: Discovery for diagnostics (optional)\n\nAdd `bd doctor` check that:\n1. Reads each child repo's config/DB\n2. Discovers their custom types\n3. Reports any issues with unknown types as warnings (not errors)\n\n## Benefits\n\n- Simpler than PR #971 (removes 1200 lines of config plumbing)\n- No new config format needed\n- Backwards compatible\n- Aligned with Gas Town federation model\n- Child repos can evolve freely without updating parent\n\n## Test Plan\n\n- [ ] Hydrate child with custom type not in parent → succeeds\n- [ ] Hydrate child with invalid built-in type → fails (still validated)\n- [ ] Existing single-repo validation unchanged\n- [ ] `bd doctor` discovers and reports child types\n\n## References\n\n- PR #971: https://github.com/steveyegge/beads/pull/971\n- PRIMING.md: Discover, Don't Track principle\n- CONTEXT.md: Federation model","status":"closed","priority":1,"issue_type":"epic","created_at":"2026-01-09T14:05:36.130151-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T14:26:42.207449-08:00","closed_at":"2026-01-09T14:26:42.207449-08:00","close_reason":"Federation trust model implemented: trust non-built-in types from child repos, discover types via bd doctor"} {"id":"bd-9jsw","title":"Test event","status":"tombstone","priority":2,"issue_type":"event","created_at":"2025-12-30T16:07:42.213668-08:00","created_by":"beads/polecats/obsidian","updated_at":"2025-12-30T16:08:59.772362-08:00","deleted_at":"2025-12-30T16:08:59.772362-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"event"} {"id":"bd-9l0h","title":"Run tests and linting","description":"go test -short ./... \u0026\u0026 golangci-lint run ./...","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T21:53:19.527602-08:00","updated_at":"2025-12-20T21:55:29.660914-08:00","closed_at":"2025-12-20T21:55:29.660914-08:00","dependencies":[{"issue_id":"bd-9l0h","depends_on_id":"bd-an4s","type":"parent-child","created_at":"2025-12-20T21:53:19.529203-08:00","created_by":"daemon"},{"issue_id":"bd-9l0h","depends_on_id":"bd-gocx","type":"blocks","created_at":"2025-12-20T21:53:29.753682-08:00","created_by":"daemon"}]} {"id":"bd-9li4","title":"Create Docker image for Agent Mail","description":"Containerize Agent Mail server for easy deployment.\n\nAcceptance Criteria:\n- Dockerfile with Python 3.14\n- Health check endpoint\n- Volume mount for storage\n- Environment variable configuration\n- Multi-arch builds (amd64, arm64)\n\nFile: deployment/agent-mail/Dockerfile","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-07T22:43:43.231964-08:00","updated_at":"2025-12-09T18:38:37.682767072-05:00","closed_at":"2025-11-25T17:47:30.777486-08:00"} {"id":"bd-9msn","title":"Add monitoring and alerting","description":"Observability for production Agent Mail server.\n\nAcceptance Criteria:\n- Health check endpoint (/health)\n- Prometheus metrics export\n- Grafana dashboard\n- Alerts for server downtime\n- Alerts for high error rate\n- Log aggregation config\n\nFile: deployment/agent-mail/monitoring/","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-07T22:43:43.354117-08:00","updated_at":"2025-12-14T00:32:11.050086-08:00","closed_at":"2025-12-13T23:30:58.72719-08:00","dependencies":[{"issue_id":"bd-9msn","depends_on_id":"bd-z3s3","type":"blocks","created_at":"2025-11-07T23:04:28.050074-08:00","created_by":"daemon"}]} {"id":"bd-9nw","title":"Document sandbox workarounds for GH #353","description":"Add documentation for sandbox troubleshooting and new flags.\n\n**Tasks:**\n1. Create or update TROUBLESHOOTING.md with sandbox section\n2. Document new flags in CLI reference\n3. Add comment to GH #353 with immediate workarounds\n\n**Content needed:**\n- Symptoms of daemon lock issues in sandboxed environments\n- Usage guide for --sandbox, --force, and --allow-stale flags\n- Step-by-step troubleshooting for Codex users\n- Examples of each escape hatch\n\n**Files to update:**\n- docs/TROUBLESHOOTING.md (create if needed)\n- docs/CLI_REFERENCE.md or README.md\n- GitHub issue #353\n\n**References:**\n- docs/GH353_INVESTIGATION.md (lines 240-276)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-21T18:52:30.794526-05:00","updated_at":"2025-11-22T14:57:44.495978927-05:00","closed_at":"2025-11-21T19:25:19.216834-05:00"} +{"id":"bd-9ockw","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T13:35:32.061019-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-10T13:35:32.121347-08:00","closed_at":"2026-01-10T13:35:32.121347-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-9qj5","title":"Merge: bd-c7y5","description":"branch: polecat/toast\ntarget: main\nsource_issue: bd-c7y5\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-23T20:45:02.626929-08:00","updated_at":"2025-12-23T21:21:57.699742-08:00","closed_at":"2025-12-23T21:21:57.699742-08:00"} {"id":"bd-9rw1","title":"Support P-prefix priority format (P0-P4) in create and update commands","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-11-05T13:56:04.796826-08:00","updated_at":"2025-11-05T13:56:08.157061-08:00","closed_at":"2025-11-05T13:56:08.157061-08:00"} {"id":"bd-9szg","title":"Test prefix bd","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-27T14:24:41.470665-08:00","created_by":"stevey","updated_at":"2025-12-27T14:24:50.420887-08:00","deleted_at":"2025-12-27T14:24:50.420887-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} @@ -662,8 +699,10 @@ {"id":"bd-ag35","title":"Add daemon RPC endpoints for config and stale check","description":"Two TODOs request daemon RPC endpoints:\n\n1. cmd/bd/create.go:208 - Add RPC method to get config in daemon mode\n2. cmd/bd/mol_stale.go:67 - Add RPC endpoint for stale check\n\nThese would allow the CLI to query the daemon for configuration and staleness checks instead of reading directly.\n\nFiles:\n- cmd/bd/create.go:208\n- cmd/bd/mol_stale.go:67","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-12-28T16:32:38.113203-08:00","created_by":"stevey","updated_at":"2025-12-30T15:44:43.354686-08:00","closed_at":"2025-12-30T07:00:00.209327-08:00","close_reason":"Implemented GetConfig and MolStale RPC endpoints. CLI commands now work in daemon mode."} {"id":"bd-agye","title":"Merge: quartz-1767083470444","description":"branch: polecat/quartz-1767083470444\ntarget: main\nsource_issue: quartz-1767083470444\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T00:36:39.737365-08:00","created_by":"beads/polecats/quartz","updated_at":"2025-12-30T00:54:59.2694-08:00","closed_at":"2025-12-30T00:54:59.2694-08:00","close_reason":"Branch polecat/quartz-1767083470444 no longer exists on remote"} {"id":"bd-ahot","title":"HANDOFF: Molecule bonding - spawn done, bond next","description":"## Context\n\nContinuing work on bd-o5xe (Molecule bonding epic).\n\n## Completed This Session\n\n- bd-mh4w: Renamed bond to spawn in mol.go\n- bd-rnnr: Added BondRef data model to types.go\n\n## Now Unblocked\n\n1. bd-o91r: Polymorphic bond command [P1]\n2. bd-iw4z: Compound visualization [P2] \n3. bd-iq19: Distill command [P2]\n\n## Key Files\n\n- cmd/bd/mol.go\n- internal/types/types.go\n\n## Next Step\n\nStart with bd-o91r. Run bd show bd-o5xe for context.","status":"closed","priority":1,"issue_type":"message","created_at":"2025-12-21T01:32:13.940757-08:00","updated_at":"2025-12-21T11:24:30.171048-08:00","closed_at":"2025-12-21T11:24:30.171048-08:00"} +{"id":"bd-aim2r","title":"Digest: mol-refinery-patrol","description":"Patrol: queue empty, no branches to merge","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-11T00:20:40.702333-08:00","updated_at":"2026-01-11T00:20:40.702333-08:00","closed_at":"2026-01-11T00:20:40.702288-08:00","close_reason":"Squashed from 11 wisps","dependencies":[{"issue_id":"bd-aim2r","depends_on_id":"bd-wisp-1k6","type":"parent-child","created_at":"2026-01-11T00:20:40.703245-08:00","created_by":"beads/refinery"}]} {"id":"bd-air9","title":"bd create --parent allocates colliding child IDs when child_counters not backfilled","description":"GH#728: When explicit child IDs are created (--id bd-test.1) or imported from JSONL, child_counters table isn't updated. Then --parent auto-allocation starts at 1 and collides.\n\nFix approach: Update child_counters when creating issues with explicit hierarchical IDs that match \u003cparent\u003e.\u003cn\u003e pattern.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-24T14:27:11.990171-08:00","updated_at":"2025-12-24T14:28:40.154864-08:00","closed_at":"2025-12-24T14:28:40.154864-08:00"} {"id":"bd-ajdv","title":"Push release v0.33.2 to remote","description":"Push the commit and tag:\n\n```bash\ngit push \u0026\u0026 git push --tags\n```\n\nVerify on GitHub that the tag appears in releases.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T16:10:13.762058-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"} +{"id":"bd-ak82y","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T18:40:33.875901-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T18:40:33.916139-08:00","closed_at":"2026-01-09T18:40:33.916139-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-akcq","title":"Design molecule step hooks","description":"Hooks that fire between molecule steps. When a bead in a molecule closes, trigger hook that can spawn agent attention to prompts/requests. This enables reactive orchestration - the molecule drives, hooks respond. Gas Town feature built on Beads data plane.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-20T23:52:18.63487-08:00","updated_at":"2025-12-21T17:53:19.284064-08:00","closed_at":"2025-12-21T17:53:19.284064-08:00","dependencies":[{"issue_id":"bd-akcq","depends_on_id":"bd-icnf","type":"blocks","created_at":"2025-12-20T23:52:25.935274-08:00","created_by":"daemon"}]} {"id":"bd-aks","title":"Add tests for import/export functionality","description":"Import/export functions like ImportIssues, exportToJSONLWithStore, and AutoImportIfNewer have low coverage. These are critical for data integrity and multi-repo synchronization.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-18T07:00:53.067006711-07:00","updated_at":"2025-12-19T09:54:57.011374404-07:00","closed_at":"2025-12-18T10:13:11.821944156-07:00","dependencies":[{"issue_id":"bd-aks","depends_on_id":"bd-6ss","type":"discovered-from","created_at":"2025-12-18T07:00:53.07185201-07:00","created_by":"matt"}]} {"id":"bd-alpw2","title":"Skip custom type validation during multi-repo import","description":"Modify the multi-repo import path to skip validation of custom types. Trust that child repos validated their own issues.\n\nLocation: internal/storage/sqlite/multirepo.go\n\nThe key insight: during `importJSONLFile`, when calling `upsertIssueInTx`, we need to either:\n1. Pass a flag indicating this is a multi-repo import (trust custom types), OR\n2. Modify `ValidateWithCustom` to accept a \"trust custom\" flag, OR \n3. Simply not validate types at all during import (simplest)\n\nOption 3 is probably cleanest - the JSONL came from a valid Beads database, so trust it entirely for types. We can still validate other fields.\n\nTest:\n- Create child repo with custom type `pm`\n- Create issue with type `pm` in child\n- Export child to JSONL\n- Hydrate into parent (which doesn't have `pm`)\n- Should succeed (currently fails)","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-09T14:05:53.284005-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T14:11:49.840608-08:00","closed_at":"2026-01-09T14:11:49.840608-08:00","close_reason":"Implemented federation trust model: ValidateForImport trusts non-built-in types from child repos","dependencies":[{"issue_id":"bd-alpw2","depends_on_id":"bd-9ji4z","type":"parent-child","created_at":"2026-01-09T14:06:00.837653-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-alpw2","depends_on_id":"bd-dqwuf","type":"blocks","created_at":"2026-01-09T14:06:00.901711-08:00","created_by":"beads/crew/emma"}]} @@ -671,6 +710,7 @@ {"id":"bd-anv2","title":"Implement bd mol stale command","description":"Add command to detect complete-but-unclosed molecules.\n\n**Definition of stale:**\nA molecule is stale if:\n1. All children are closed (Completed \u003e= Total)\n2. Root issue is still open\n3. Not assigned to anyone\n4. Not pinned to any hook\n5. AND it's blocking other assigned work (graph pressure)\n\n**Command design:**\n```bash\nbd mol stale # List stale mols\nbd mol stale --json # Machine-readable\nbd mol stale --blocking # Only show those blocking other work\nbd mol stale --all # Include orphaned-but-not-blocking\n```\n\n**Output:**\n```\nStale molecules (complete but unclosed, blocking work):\n\n bd-xyz \"Version bump v0.36.0\" (blocking: bd-abc, bd-def)\n → Close with: bd close bd-xyz\n → Or squash: bd mol squash bd-xyz\n\nOrphaned molecules (complete but unclosed, not blocking):\n bd-uvw \"Old patrol cycle\"\n → Consider: bd mol burn bd-uvw\n```\n\n**Implementation:**\n1. Query all open issues with children (potential mols)\n2. Compute progress for each (Completed vs Total)\n3. Filter to complete ones\n4. Check assigned_to field\n5. Check pinned status (may need gt integration)\n6. Check if blocking other assigned work\n\nDoes NOT use time-based staleness. Graph pressure only.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-24T18:23:24.27032-08:00","updated_at":"2025-12-25T12:31:14.315214-08:00","closed_at":"2025-12-25T12:31:14.315214-08:00"} {"id":"bd-ao0s","title":"bd graph crashes with --no-daemon on closed issues","description":"The `bd graph` command panics with nil pointer dereference when using `--no-daemon` flag on an issue with closed children.\n\n**Reproduction:**\n```bash\nbd graph bd-qqc --no-daemon\n# panic: runtime error: invalid memory address or nil pointer dereference\n# in main.computeDependencyCounts\n```\n\n**Stack trace:**\n```\npanic: runtime error: invalid memory address or nil pointer dereference\n[signal SIGSEGV: segmentation violation code=0x2 addr=0x20 pc=0x1010bdfb0]\n\ngoroutine 1 [running]:\nmain.computeDependencyCounts(...)\n /Users/stevey/gt/beads/crew/emma/cmd/bd/graph.go:428\nmain.renderGraph(0x1400033bb80, 0x0)\n /Users/stevey/gt/beads/crew/emma/cmd/bd/graph.go:307 +0x300\n```\n\n**Location:** cmd/bd/graph.go:428 - computeDependencyCounts() not handling nil case","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-18T22:57:36.972585-08:00","updated_at":"2025-12-20T01:13:29.206821-08:00","closed_at":"2025-12-20T01:13:29.206821-08:00"} {"id":"bd-aonh9","title":"Test isolation: TestGetNextChildID_ConfigMaxDepth modifies global config state","description":"The new test in internal/storage/sqlite/child_id_test.go modifies global config state:\n\n```go\nconfig.Set(\"hierarchy.max-depth\", 5)\ndefer config.Set(\"hierarchy.max-depth\", 3) // Reset to default after test\n```\n\nThis could cause flaky tests if tests run in parallel and share the config singleton.\n\nOptions:\n1. Use t.Setenv() if config supports env var override\n2. Add config.Reset() or scoped config for tests\n3. Mark test as t.Parallel()-incompatible\n\nLow priority - tests currently pass.","status":"open","priority":3,"issue_type":"task","created_at":"2026-01-10T13:36:15.500091-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-10T13:36:15.500091-08:00","labels":["test"]} +{"id":"bd-apgyq","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T21:21:44.736568-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T21:21:44.769667-08:00","closed_at":"2026-01-09T21:21:44.769667-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-aq3s","title":"Merge: bd-u2sc.3","description":"branch: polecat/Modular\ntarget: main\nsource_issue: bd-u2sc.3\nrig: beads","status":"closed","priority":3,"issue_type":"merge-request","created_at":"2025-12-23T13:47:14.281479-08:00","updated_at":"2025-12-23T19:12:08.354548-08:00","closed_at":"2025-12-23T19:12:08.354548-08:00"} {"id":"bd-ar2","title":"Code review follow-up for bd-dvd and bd-ymj fixes","description":"Track improvements and issues identified during code review of parent resurrection (bd-dvd) and export metadata (bd-ymj) bug fixes.\n\n## Context\nCode review identified several areas for improvement:\n- Code duplication in metadata updates\n- Missing multi-repo support\n- Test coverage gaps\n- Potential race conditions\n\n## Related Issues\nOriginal bugs fixed: bd-dvd, bd-ymj\n\n## Goals\n- Eliminate code duplication\n- Add multi-repo support where needed\n- Improve test coverage\n- Address edge cases","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-11-21T10:24:05.78635-05:00","updated_at":"2025-11-22T14:57:44.501624057-05:00","closed_at":"2025-11-21T15:04:48.692231-05:00"} {"id":"bd-ar2.1","title":"Extract duplicated metadata update code in daemon_sync.go","description":"## Problem\nThe same 22-line metadata update block appears identically in both:\n- createExportFunc (lines 309-328)\n- createSyncFunc (lines 520-539)\n\nThis violates DRY principle and makes maintenance harder.\n\n## Solution\nExtract to helper function:\n\n```go\n// updateExportMetadata updates last_import_hash and related metadata after a successful export.\n// This prevents \"JSONL content has changed since last import\" errors on subsequent exports (bd-ymj fix).\nfunc updateExportMetadata(ctx context.Context, store storage.Storage, jsonlPath string, log daemonLogger) {\n currentHash, err := computeJSONLHash(jsonlPath)\n if err != nil {\n log.log(\"Warning: failed to compute JSONL hash for metadata update: %v\", err)\n return\n }\n \n if err := store.SetMetadata(ctx, \"last_import_hash\", currentHash); err != nil {\n log.log(\"Warning: failed to update last_import_hash: %v\", err)\n }\n \n exportTime := time.Now().Format(time.RFC3339)\n if err := store.SetMetadata(ctx, \"last_import_time\", exportTime); err != nil {\n log.log(\"Warning: failed to update last_import_time: %v\", err)\n }\n \n // Store mtime for fast-path optimization\n if jsonlInfo, statErr := os.Stat(jsonlPath); statErr == nil {\n mtimeStr := fmt.Sprintf(\"%d\", jsonlInfo.ModTime().Unix())\n if err := store.SetMetadata(ctx, \"last_import_mtime\", mtimeStr); err != nil {\n log.log(\"Warning: failed to update last_import_mtime: %v\", err)\n }\n }\n}\n```\n\n## Files\n- cmd/bd/daemon_sync.go\n\n## Benefits\n- Easier maintenance\n- Single source of truth\n- Consistent behavior","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-21T10:24:18.888412-05:00","updated_at":"2025-11-21T10:47:24.430037-05:00","closed_at":"2025-11-21T10:47:24.430037-05:00","dependencies":[{"issue_id":"bd-ar2.1","depends_on_id":"bd-ar2","type":"parent-child","created_at":"2025-11-21T10:24:18.889171-05:00","created_by":"daemon"}]} @@ -738,10 +778,11 @@ {"id":"bd-bdaf24d5","title":"Final validation test","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-27T18:27:28.310533-07:00","updated_at":"2025-10-31T12:00:43.184995-07:00","closed_at":"2025-10-31T12:00:43.184995-07:00"} {"id":"bd-bdc9","title":"Update Homebrew formula","description":"Update the Homebrew tap with new version:\n\n```bash\n./scripts/update-homebrew.sh 0.33.2\n```\n\nThis script waits for GitHub Actions to complete (~5 min), then updates the formula with new SHA256 hashes.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T16:10:13.762399-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"} {"id":"bd-bdhn","title":"bd message: Add input validation for --importance flag","description":"The --importance flag accepts any string without validation, leading to confusing server errors.\n\n**Location:** cmd/bd/message.go:256-258\n\n**Fix:**\n- Add flag validation for: low, normal, high, urgent\n- Add shell completion support\n- Validate in runMessageSend before sending\n\n**Impact:** Better UX, prevents confusing errors","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-08T12:54:26.43027-08:00","updated_at":"2025-11-08T12:57:59.65367-08:00","closed_at":"2025-11-08T12:57:59.65367-08:00","dependencies":[{"issue_id":"bd-bdhn","depends_on_id":"bd-6uix","type":"parent-child","created_at":"2025-11-08T12:55:54.910841-08:00","created_by":"daemon"}]} +{"id":"bd-bdmwf","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-11T00:21:01.891501-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T00:21:01.932445-08:00","closed_at":"2026-01-11T00:21:01.932445-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-be7a","title":"Create npm package structure with package.json","description":"Set up initial npm package structure for @beads/bd:\n\n## Files to create\n- npm/package.json - Package metadata, dependencies, scripts\n- npm/bin/bd - CLI wrapper script that invokes native binary\n- npm/.gitignore - Ignore downloaded binaries\n- npm/README.md - Installation and usage instructions\n\n## package.json structure\n- Name: @beads/bd (scoped package)\n- Main: index.js (exports binary path)\n- Bin: bin/bd (CLI entry point)\n- Scripts: postinstall (download binary)\n- Keywords: issue-tracker, cli, beads, bd\n- License: MIT\n\n## Bin wrapper\nSimple Node.js script that:\n- Spawns native binary with child_process.spawn\n- Passes through all arguments and stdio\n- Exits with binary's exit code","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-02T23:39:47.416779-08:00","updated_at":"2025-11-03T10:31:45.381258-08:00","closed_at":"2025-11-03T10:31:45.381258-08:00","dependencies":[{"issue_id":"bd-be7a","depends_on_id":"bd-febc","type":"parent-child","created_at":"2025-11-02T23:40:32.923859-08:00","created_by":"daemon"}]} -{"id":"bd-beads-crew-dave","title":"Crew worker dave in beads - human-managed persistent workspace.","description":"Crew worker dave in beads - human-managed persistent workspace.\n\nrole_type: crew\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-crew-role\ncleanup_status: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-30T23:14:04.538389-08:00","created_by":"deacon","updated_at":"2026-01-10T23:21:26.698569-08:00"} +{"id":"bd-beads-crew-dave","title":"Crew worker dave in beads - human-managed persistent workspace.","description":"Crew worker dave in beads - human-managed persistent workspace.\n\nrole_type: crew\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-crew-role\ncleanup_status: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-30T23:14:04.538389-08:00","created_by":"deacon","updated_at":"2026-01-11T00:03:40.047069-08:00"} {"id":"bd-beads-crew-emma","title":"Crew worker emma in beads - human-managed persistent workspace.","description":"Crew worker emma in beads - human-managed persistent workspace.\n\nrole_type: crew\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-crew-role\ncleanup_status: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-30T23:14:04.604042-08:00","created_by":"deacon","updated_at":"2026-01-06T23:51:55.013518-08:00"} -{"id":"bd-beads-crew-fang","title":"Crew worker fang in beads - human-managed persistent workspace.","description":"Crew worker fang in beads - human-managed persistent workspace.\n\nrole_type: crew\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-crew-role\ncleanup_status: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-30T23:14:04.672037-08:00","created_by":"deacon","updated_at":"2026-01-10T19:33:33.065077-08:00"} +{"id":"bd-beads-crew-fang","title":"Crew worker fang in beads - human-managed persistent workspace.","description":"Crew worker fang in beads - human-managed persistent workspace.\n\nrole_type: crew\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-crew-role\ncleanup_status: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-30T23:14:04.672037-08:00","created_by":"deacon","updated_at":"2026-01-11T00:22:27.157358-08:00"} {"id":"bd-beads-crew-giles","title":"Crew worker giles in beads - human-managed persistent workspace.","description":"Crew worker giles in beads - human-managed persistent workspace.\n\nrole_type: crew\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-crew-role\ncleanup_status: null\nactive_mr: null\nnotification_level: null","status":"open","priority":2,"issue_type":"agent","created_at":"2026-01-04T11:22:11.009942-08:00","created_by":"mayor","updated_at":"2026-01-10T19:39:44.455704-08:00"} {"id":"bd-beads-crew-grip","title":"Crew worker grip in beads - human-managed persistent workspace.","description":"Crew worker grip in beads - human-managed persistent workspace.\n\nrole_type: crew\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-crew-role\ncleanup_status: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-30T23:14:04.739788-08:00","created_by":"deacon","updated_at":"2026-01-10T23:19:27.444724-08:00"} {"id":"bd-beads-crew-testcrew456","title":"Crew worker testcrew456 in beads - human-managed persistent workspace.","description":"Crew worker testcrew456 in beads - human-managed persistent workspace.\n\nrole_type: crew\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: hq-crew-role\ncleanup_status: null\nactive_mr: null\nnotification_level: null","status":"open","priority":2,"issue_type":"agent","created_at":"2026-01-09T22:03:44.377795-08:00","created_by":"deacon","updated_at":"2026-01-09T22:03:44.639847-08:00"} @@ -777,9 +818,11 @@ {"id":"bd-bok","title":"bd doctor --fix needs non-interactive mode (-y/--yes flag)","description":"When running `bd doctor --fix` in non-interactive mode (scripts, CI, Claude Code), it prompts 'Continue? (Y/n):' and fails with EOF.\n\n**Expected**: A `-y` or `--yes` flag to auto-confirm fixes.\n\n**Workaround**: Currently have to run `bd init` instead, but that's not discoverable from the doctor output.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-27T20:21:10.290649-08:00","updated_at":"2025-12-02T17:11:19.734961473-05:00","closed_at":"2025-11-28T21:56:14.708313-08:00"} {"id":"bd-bpc4f","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-08T20:25:01.003771-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-08T20:25:01.040024-08:00","closed_at":"2026-01-08T20:25:01.040024-08:00","close_reason":"auto-closed session event"} {"id":"bd-bqcc","title":"Consolidate maintenance commands into bd doctor --fix","description":"Per rsnodgrass in GH#692:\n\u003e \"The biggest improvement to beads from an ergonomics perspective would be to prune down commands. We have a lot of 'maintenance' commands that probably should just be folded into 'bd doctor --fix' automatically.\"\n\nCurrent maintenance commands that could be consolidated:\n- clean - Clean up temporary git merge artifacts\n- cleanup - Delete closed issues and prune expired tombstones\n- compact - Compact old closed issues\n- detect-pollution - Detect and clean test issues\n- migrate-* (5 commands) - Various migration utilities\n- repair-deps - Fix orphaned dependency references\n- validate - Database health checks\n\nProposal:\n1. Make `bd doctor` the single entry point for health checks\n2. Add `bd doctor --fix` to auto-fix common issues\n3. Deprecate (but keep working) individual commands\n4. Add `bd doctor --all` for comprehensive maintenance\n\nThis would reduce cognitive load for users - they just need to remember 'bd doctor'.\n\nNote: This is higher impact but also higher risk - needs careful design to avoid breaking existing workflows.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-22T14:27:31.466556-08:00","updated_at":"2025-12-23T01:33:25.732363-08:00","closed_at":"2025-12-23T01:33:25.732363-08:00"} +{"id":"bd-bqidi","title":"Session ended: gt-beads-crew-wolf","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T13:38:36.045742-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-10T13:38:36.08369-08:00","closed_at":"2026-01-10T13:38:36.08369-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-br8","title":"Implement `bd setup claude` command for Claude Code integration","description":"Create a `bd setup claude` command that installs Claude Code integration files (slash commands and hooks). This is idempotent and safe to run multiple times.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-11T23:28:59.374019-08:00","updated_at":"2025-11-12T08:51:23.281292-08:00","closed_at":"2025-11-12T08:51:23.281292-08:00","dependencies":[{"issue_id":"bd-br8","depends_on_id":"bd-rpn","type":"blocks","created_at":"2025-11-11T23:28:59.375616-08:00","created_by":"daemon"},{"issue_id":"bd-br8","depends_on_id":"bd-90v","type":"parent-child","created_at":"2025-11-11T23:31:23.762685-08:00","created_by":"daemon"}]} {"id":"bd-bs5j","title":"Release v0.33.2","description":"Version bump workflow for beads release 0.33.2.\n\n## Variables\n- `0.33.2` - The new version number (e.g., 0.31.0)\n- `2025-12-21` - Release date (YYYY-MM-DD format)\n\n## Workflow Steps\n1. Kill running daemons\n2. Run tests and linting\n3. Bump version in all files (10 files total)\n4. Update cmd/bd/info.go with release notes\n5. Commit and push version bump\n6. Create and push git tag\n7. Update Homebrew formula\n8. Upgrade local Homebrew installation\n9. Verify installation\n\n## Files Updated by bump-version.sh\n- cmd/bd/version.go\n- .claude-plugin/plugin.json\n- .claude-plugin/marketplace.json\n- integrations/beads-mcp/pyproject.toml\n- integrations/beads-mcp/src/beads_mcp/__init__.py\n- README.md\n- npm-package/package.json\n- cmd/bd/templates/hooks/* (4 files)\n- CHANGELOG.md\n\n## Manual Step Required\n- cmd/bd/info.go - Add versionChanges entry with release notes","status":"tombstone","priority":1,"issue_type":"epic","created_at":"2025-12-21T16:10:13.759062-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":"epic"} {"id":"bd-bscs","title":"GH#518: Document bd setup command","description":"bd setup (e.g. bd setup cursor) is undocumented. Users only find it by grepping source. Need proper docs. See: https://github.com/steveyegge/beads/issues/518","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-14T16:31:35.881408-08:00","updated_at":"2025-12-16T14:39:19.052118-08:00","closed_at":"2025-12-16T01:09:09.420428-08:00"} +{"id":"bd-bsr4h","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T15:21:29.75805-08:00","created_by":"beads/refinery","updated_at":"2026-01-10T15:21:29.793632-08:00","closed_at":"2026-01-10T15:21:29.793632-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-bt6y","title":"Improve compact/daemon/merge documentation and UX","description":"Multiple documentation and UX issues encountered:\n1. \"bd compact --analyze\" fails with misleading \"requires SQLite storage\" error when daemon is running. Needs --no-daemon or better error.\n2. \"bd merge\" help text is outdated (refers to 3-way merge instead of issue merging).\n3. Daemon mode purpose isn't clear to local-only users.\n4. Compact/cleanup commands are hard to discover.\n\nProposed fixes:\n- Fix compact+daemon interaction or error message.\n- Update \"bd merge\" help text.\n- Add \"when to use daemon\" section to docs.\n- Add maintenance section to quickstart.\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-20T18:55:43.637047-05:00","updated_at":"2025-12-09T18:38:37.684256672-05:00","closed_at":"2025-11-28T23:10:43.884784-08:00"} {"id":"bd-buol","title":"Invert control for compact: provide tools for agent-driven compaction","description":"Currently compact requires Anthropic API key because bd calls the AI directly. This is backwards - we should provide tools (like all other bd commands) that let an AI agent perform the compaction. The agent decides what to keep/merge, not bd. Related to GH #243 complaint about API key requirement.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-07T00:27:28.498069-08:00","updated_at":"2025-11-07T23:18:08.38606-08:00","closed_at":"2025-11-07T23:08:51.67473-08:00"} {"id":"bd-bur4u","title":"Review PR #16605: ralph-wiggum nix/nixos fix","description":"dispatched_by: beads/crew/emma\n\nReview and verify PR #16605 (anthropics/claude-code)\n\nPR: https://github.com/anthropics/claude-code/pull/16605\nAuthor: onsails\nStatus: APPROVED by otavio and philiptaron\n\nNix/NixOS environment fix.\n- gh pr view 16605 --repo anthropics/claude-code\n- gh pr diff 16605 --repo anthropics/claude-code\n- If good: gh pr merge 16605 --repo anthropics/claude-code --squash","status":"closed","priority":2,"issue_type":"task","assignee":"beads/crew/fang","created_at":"2026-01-08T14:20:26.834702-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-08T14:29:35.603515-08:00","closed_at":"2026-01-08T14:29:35.603515-08:00","close_reason":"Wrong repo - these were for anthropics/claude-code, not steveyegge/beads"} @@ -853,7 +896,9 @@ {"id":"bd-cnwx","title":"Refactor mol.go: split 1200+ line file into subcommands","description":"## Problem\n\ncmd/bd/mol.go has grown to 1200+ lines with all molecule subcommands in one file.\n\n## Current State\n- mol.go: 1218 lines (bond, spawn, run, distill, catalog, show, etc.)\n- Hard to navigate, review, and maintain\n\n## Proposed Structure\nSplit into separate files by subcommand:\n```\ncmd/bd/\n├── mol.go # Root command, shared helpers\n├── mol_bond.go # bd mol bond\n├── mol_spawn.go # bd mol spawn \n├── mol_run.go # bd mol run\n├── mol_distill.go # bd mol distill\n├── mol_catalog.go # bd mol catalog\n├── mol_show.go # bd mol show\n└── mol_test.go # Tests (already separate)\n```\n\n## Benefits\n- Easier code review\n- Better separation of concerns\n- Simpler navigation\n- Each subcommand self-contained","status":"closed","priority":2,"issue_type":"chore","created_at":"2025-12-21T11:30:58.832192-08:00","updated_at":"2025-12-21T11:42:49.390824-08:00","closed_at":"2025-12-21T11:42:49.390824-08:00"} {"id":"bd-co29","title":"Merge: bd-n386","description":"branch: polecat/immortan\ntarget: main\nsource_issue: bd-n386\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-23T20:41:45.644113-08:00","updated_at":"2025-12-23T21:21:57.70152-08:00","closed_at":"2025-12-23T21:21:57.70152-08:00"} {"id":"bd-crgr","title":"GH#517: Claude sets priority wrong on new install","description":"Claude uses 'medium/high/low' for priority instead of P0-P4. Update bd prime/onboard output to be clearer about priority syntax. See GitHub issue #517.","status":"tombstone","priority":2,"issue_type":"bug","created_at":"2025-12-16T01:03:34.803084-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} +{"id":"bd-crncp","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T14:06:30.524914-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T14:06:30.558713-08:00","closed_at":"2026-01-09T14:06:30.558713-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-cs2l","title":"Test Agent","status":"tombstone","priority":2,"issue_type":"agent","created_at":"2025-12-28T01:55:35.621013-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T02:21:06.391783-08:00","deleted_at":"2025-12-28T02:21:06.391783-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"agent"} +{"id":"bd-csnep","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T16:27:05.392572-08:00","created_by":"beads/refinery","updated_at":"2026-01-10T16:27:05.428055-08:00","closed_at":"2026-01-10T16:27:05.428055-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-csnr","title":"activity --follow: Silent error handling","description":"In activity.go:175-179, when the daemon is down or errors occur during polling in --follow mode, errors are silently ignored:\n\n```go\nnewEvents, err := fetchMutations(lastPoll)\nif err != nil {\n // Daemon might be down, continue trying\n continue\n}\n```\n\nThis means:\n- Users won't know if the daemon is unreachable\n- Could appear frozen when actually failing\n- No indication of lost events\n\nShould at least show a warning after N consecutive failures, or show '...' indicator to show polling status.\n\nDiscovered during code review of bd-xo1o implementation.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-23T04:06:18.590743-08:00","updated_at":"2025-12-23T04:16:04.64978-08:00","closed_at":"2025-12-23T04:16:04.64978-08:00"} {"id":"bd-csvy","title":"Add tests for merge driver auto-config in bd init","description":"Add comprehensive tests for the merge driver auto-configuration functionality in `bd init`.\n\n**Test cases needed:**\n- Auto-install in quiet mode\n- Skip with --skip-merge-driver flag\n- Detect already-installed merge driver\n- Append to existing .gitattributes\n- Interactive prompt behavior (if feasible)\n\n**File:** `cmd/bd/init_test.go`","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-05T19:27:04.133078-08:00","updated_at":"2025-11-06T18:19:16.233673-08:00","closed_at":"2025-11-06T15:56:36.014814-08:00","dependencies":[{"issue_id":"bd-csvy","depends_on_id":"bd-32nm","type":"discovered-from","created_at":"2025-11-05T19:27:04.134299-08:00","created_by":"daemon"}]} {"id":"bd-ctmg","title":"CLI cleanup: Rename bd mol catalog to bd formula list","description":"## Problem\n`bd mol catalog` shows formulas, not molecules. This is confusing.\n\nCurrent state:\n- `bd formula list` - lists formulas\n- `bd mol catalog` - ALSO lists formulas (duplicate!)\n\nThe \"mol\" namespace should be for molecules (instantiated work), not formulas (templates).\n\n## Proposed Change\n- Remove `bd mol catalog`\n- Keep `bd formula list` as the canonical command\n- Update docs to use `bd formula list`\n\n## Alternative\nIf we want a \"catalog\" concept separate from \"list\", make it `bd formula catalog`.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-27T14:28:04.647593-08:00","created_by":"mayor","updated_at":"2025-12-27T14:33:44.517362-08:00","closed_at":"2025-12-27T14:33:44.517362-08:00"} @@ -875,8 +920,10 @@ {"id":"bd-d4ec5a82","title":"Add MCP functions for repair commands","description":"Add repair commands to beads-mcp for agent access:\n- beads_resolve_conflicts()\n- beads_find_duplicates()\n- beads_detect_pollution()\n- beads_validate()\n\nFiles: integrations/beads-mcp/src/beads_mcp/server.py","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-28T14:48:29.071495-07:00","updated_at":"2025-12-14T12:12:46.509914-08:00","closed_at":"2025-11-06T19:27:19.170894-08:00"} {"id":"bd-d4i","title":"Create tip system infrastructure for contextual hints","description":"Implement a tip/hint system that shows helpful contextual messages after successful commands. This is different from the existing error-path \"Hint:\" messages - tips appear on success paths to educate users about features they might not know about.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-11T23:29:15.693956-08:00","updated_at":"2025-12-09T18:38:37.687749872-05:00","closed_at":"2025-11-25T17:47:30.747566-08:00"} {"id":"bd-d4jl","title":"Commit and push release","description":"git add -A \u0026\u0026 git commit -m 'chore: bump version to 0.32.1' \u0026\u0026 git push","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T21:53:21.928138-08:00","updated_at":"2025-12-20T21:57:12.81943-08:00","closed_at":"2025-12-20T21:57:12.81943-08:00","dependencies":[{"issue_id":"bd-d4jl","depends_on_id":"bd-an4s","type":"parent-child","created_at":"2025-12-20T21:53:21.930015-08:00","created_by":"daemon"},{"issue_id":"bd-d4jl","depends_on_id":"bd-tj00","type":"blocks","created_at":"2025-12-20T21:53:29.884457-08:00","created_by":"daemon"}]} +{"id":"bd-d5kpr","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T18:39:32.989194-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T18:39:33.028295-08:00","closed_at":"2026-01-09T18:39:33.028295-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-d68f","title":"Add tests for Comments API (AddIssueComment, GetIssueComments)","description":"Comments API currently has 0% coverage. Need tests for:\n- AddIssueComment - adding comments to issues\n- GetIssueComments - retrieving comments\n- Comment ordering and pagination\n- Edge cases (non-existent issues, empty comments)","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-01T22:40:58.980688-07:00","updated_at":"2025-11-01T22:53:42.124391-07:00","closed_at":"2025-11-01T22:53:42.124391-07:00"} {"id":"bd-d6aq","title":"Test reservation expiration and renewal","description":"Verify TTL-based reservation expiration works correctly.\n\nAcceptance Criteria:\n- Reserve with short TTL (30s)\n- Verify other agents can't claim\n- Wait for expiration\n- Verify reservation auto-released\n- Other agent can now claim\n- Test renewal/heartbeat mechanism\n\nFile: tests/integration/test_reservation_ttl.py","notes":"Implemented comprehensive TTL/expiration test suite in tests/integration/test_reservation_ttl.py\n\nTest Coverage:\n✅ Short TTL reservations (30s) - verifies TTL is properly set\n✅ Reservation blocking - confirms agent2 cannot claim while agent1 holds reservation\n✅ Auto-release after expiration - validates expired reservations are auto-cleaned and become available\n✅ Renewal/heartbeat - tests that re-reserving extends expiration time\n\nAll 4 tests passing in 56.9s total (including 30s+ wait time for expiration tests).\n\nMock server implements full TTL management:\n- Reservation class with expiration tracking\n- Auto-cleanup of expired reservations on each request\n- Renewal support (same agent re-reserving)\n- 409 conflict for cross-agent reservation attempts","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-07T22:43:21.547821-08:00","updated_at":"2025-11-08T02:24:30.296982-08:00","closed_at":"2025-11-08T02:24:30.296982-08:00","dependencies":[{"issue_id":"bd-d6aq","depends_on_id":"bd-m9th","type":"blocks","created_at":"2025-11-07T22:43:21.548731-08:00","created_by":"daemon"}]} +{"id":"bd-d6qyx","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T15:41:06.496811-08:00","created_by":"beads/refinery","updated_at":"2026-01-10T15:41:06.531149-08:00","closed_at":"2026-01-10T15:41:06.531149-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-d73u","title":"Re: Thread Test 2","description":"Great! Thread is working well.","status":"tombstone","priority":2,"issue_type":"message","created_at":"2025-12-16T18:21:46.655093-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","dependencies":[{"issue_id":"bd-d73u","depends_on_id":"bd-vpan","type":"replies-to","created_at":"2025-12-18T13:45:31.137191-08:00","created_by":"migration"}],"deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"message"} {"id":"bd-d76d","title":"Modify EnsureIDs to support parent resurrection","description":"Update internal/storage/sqlite/ids.go:189-202 to call TryResurrectParent before failing on missing parent. Add resurrection mode flag, log resurrected parents for transparency. Maintain backwards compatibility with strict validation mode.","status":"closed","priority":0,"issue_type":"task","created_at":"2025-11-04T12:31:59.659507-08:00","updated_at":"2025-11-05T00:08:42.814463-08:00","closed_at":"2025-11-05T00:08:42.814466-08:00"} {"id":"bd-d7e88238","title":"Rapid 3","status":"closed","priority":3,"issue_type":"task","created_at":"2025-10-29T19:11:57.459655-07:00","updated_at":"2025-12-14T12:12:46.510484-08:00","closed_at":"2025-11-07T23:18:52.333825-08:00"} @@ -901,6 +948,7 @@ {"id":"bd-dju6","title":"Commit and push release","description":"git add -A \u0026\u0026 git commit \u0026\u0026 git push to trigger CI","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T13:52:33.065863-08:00","updated_at":"2025-12-21T13:53:49.957804-08:00","deleted_at":"2025-12-21T13:53:49.957804-08:00","deleted_by":"stevey","delete_reason":"manual delete","original_type":"task"} {"id":"bd-dkf1g","title":"Add 'owner' field for human attribution (HOP CV chains)","description":"dispatched_by: beads/crew/emma\n\nProblem: created_by tracks executor (agent), but HOP CV needs owner (human email).\n\nSolution: Add owner field to Issue struct.\n\nDesign: Decision 008 says human identity = git author email. This is the foundation of CV accumulation.\n\nMigration: Add column, populate from GIT_AUTHOR_EMAIL.\n\nAcceptance Criteria:\n- owner field added to types.go\n- Migration adds column\n- bd create populates from git author\n- Owner included in content hash","status":"closed","priority":1,"issue_type":"task","assignee":"beads/crew/dave","created_at":"2026-01-10T16:33:31.010936-08:00","created_by":"gastown/crew/max","updated_at":"2026-01-10T19:28:26.126028-08:00","closed_at":"2026-01-10T19:28:26.126028-08:00","close_reason":"Implemented: owner field added for human attribution (commit ceb5769c)","dependencies":[{"issue_id":"bd-dkf1g","depends_on_id":"bd-imi7w","type":"parent-child","created_at":"2026-01-10T16:33:44.786109-08:00","created_by":"gastown/crew/max"}]} {"id":"bd-dl8pb","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T00:35:17.86501-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T00:35:17.899663-08:00","closed_at":"2026-01-09T00:35:17.899663-08:00","close_reason":"auto-closed session event"} +{"id":"bd-dlk31","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T14:31:34.382228-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T14:31:34.417966-08:00","closed_at":"2026-01-09T14:31:34.417966-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-dmb","title":"Fresh clone: bd should suggest 'bd init' when no database exists","description":"On a fresh clone of a repo using beads, running `bd stats` or `bd list` gives a cryptic error:\n\n```\nError: failed to open database: post-migration validation failed: migration invariants failed:\n - required_config_present: required config key missing: issue_prefix (database has 2 issues)\n```\n\n**Expected**: A helpful message like:\n```\nNo database found. This appears to be a fresh clone.\nRun 'bd init --prefix \u003cprefix\u003e' to hydrate from the committed JSONL file.\nFound: .beads/beads.jsonl (38 issues)\n```\n\n**Why this matters**: The current UX is confusing for new contributors or fresh clones. The happy path should be obvious.","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-11-27T20:21:04.947959-08:00","updated_at":"2025-11-27T22:40:11.654051-08:00","closed_at":"2025-11-27T22:40:11.654051-08:00"} {"id":"bd-do8e","title":"Consolidate migrate-* commands under bd migrate","description":"## Task\nMove standalone migrate commands under `bd migrate` parent:\n- `bd migrate-hash-ids` → `bd migrate hash-ids`\n- `bd migrate-issues` → `bd migrate issues`\n- `bd migrate-sync` → `bd migrate sync`\n- `bd migrate-tombstones` → `bd migrate tombstones`\n\n## Implementation\n\n### 1. Update migrate.go\nAdd subcommands to migrateCmd:\n```go\nfunc init() {\n migrateCmd.AddCommand(migrateHashIDsCmd)\n migrateCmd.AddCommand(migrateIssuesCmd)\n migrateCmd.AddCommand(migrateSyncCmd)\n migrateCmd.AddCommand(migrateTombstonesCmd)\n}\n```\n\n### 2. Update each migrate_*.go file\n- Change `Use:` from `migrate-foo` to `foo`\n- Remove `rootCmd.AddCommand()` from init()\n\n### 3. Create hidden aliases for backwards compatibility\nIn main.go, add hidden top-level commands that forward to subcommands.\n\n### 4. Update docs\n- docs/DELETIONS.md - references `bd migrate-tombstones`\n- docs/CLI_REFERENCE.md - migration section\n\n## Files to modify\n- cmd/bd/migrate.go\n- cmd/bd/migrate_hash_ids.go \n- cmd/bd/migrate_issues.go\n- cmd/bd/migrate_sync.go\n- cmd/bd/migrate_tombstones.go\n- cmd/bd/main.go (aliases)\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-27T15:10:41.618026-08:00","created_by":"mayor","updated_at":"2025-12-27T16:01:32.021299-08:00","closed_at":"2025-12-27T16:01:32.021299-08:00"} {"id":"bd-do8v","title":"Merge: opal-mjxl27un","description":"branch: polecat/opal-mjxl27un\ntarget: main\nsource_issue: opal-mjxl27un\nrig: beads\nagent_bead: bd-beads-polecat-opal","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2026-01-02T16:52:42.06401-08:00","created_by":"beads/polecats/opal","updated_at":"2026-01-02T17:14:47.279945-08:00","closed_at":"2026-01-02T17:14:47.279945-08:00","close_reason":"Orphaned MR - opal stopped (closed no-op), branch never pushed"} @@ -919,6 +967,7 @@ {"id":"bd-dsp","title":"Test stdin body-file","status":"tombstone","priority":4,"issue_type":"task","created_at":"2025-12-17T17:27:32.098806-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":"task"} {"id":"bd-dtl8","title":"Test deleteViaDaemon RPC client integration","description":"Add comprehensive tests for the deleteViaDaemon function (cmd/bd/delete.go:21) which handles client-side RPC deletion calls.\n\n## Function under test\n- deleteViaDaemon: CLI command handler that sends delete requests to daemon via RPC\n\n## Test scenarios needed\n1. Successful deletion via daemon\n2. Cascade deletion through daemon\n3. Force deletion through daemon\n4. Dry-run mode (no actual deletion)\n5. Error handling:\n - Daemon unavailable\n - Invalid issue IDs\n - Dependency conflicts\n6. JSON output validation\n7. Human-readable output formatting\n\n## Coverage target\nCurrent: 0%\nTarget: \u003e80%\n\n## Related\n- Parent epic: bd-kyll\n- Original issue: bd-7z4","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-18T13:08:29.805706253-07:00","updated_at":"2025-12-23T23:50:35.615163-08:00","closed_at":"2025-12-23T23:50:35.615163-08:00","dependencies":[{"issue_id":"bd-dtl8","depends_on_id":"bd-kyll","type":"parent-child","created_at":"2025-12-18T13:08:29.807984381-07:00","created_by":"mhwilkie"}]} {"id":"bd-du9h","title":"Add Validation type and validations field to Issue","description":"Add Validation struct (Validator *EntityRef, Outcome string, Timestamp time.Time, Score *float32) and Validations []Validation field to Issue. Tracks who validated/approved work completion. Core to HOP proof-of-stake concept - validators stake reputation on approvals.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-22T17:53:37.725701-08:00","updated_at":"2025-12-22T20:08:59.925028-08:00","closed_at":"2025-12-22T20:08:59.925028-08:00","dependencies":[{"issue_id":"bd-du9h","depends_on_id":"bd-7pwh","type":"parent-child","created_at":"2025-12-22T17:53:43.470984-08:00","created_by":"daemon"},{"issue_id":"bd-du9h","depends_on_id":"bd-nmch","type":"blocks","created_at":"2025-12-22T17:53:47.896552-08:00","created_by":"daemon"}]} +{"id":"bd-durco","title":"Session ended: gt-beads-crew-wolf","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T22:33:32.558686-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-09T22:33:32.595092-08:00","closed_at":"2026-01-09T22:33:32.595092-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-duyg","title":"Feature: bd swarm list - discover existing swarm molecules","description":"No command to list existing swarm molecules.\n\nAdd `bd swarm list` to show all swarm molecules:\n\n```\nbd swarm list\n\nActive swarms:\n bd-xyz: Swarm: Feature X (3/10 complete, 2 active)\n bd-abc: Swarm: Bug fixes (0/5 complete)\n```\n\nCould also be achieved via `bd list --mol-type=swarm` but dedicated command would show richer info.","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-12-28T21:38:11.773961-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T22:03:49.97246-08:00","closed_at":"2025-12-28T22:03:49.97246-08:00","dependencies":[{"issue_id":"bd-duyg","depends_on_id":"bd-2ubv","type":"parent-child","created_at":"2025-12-28T21:38:44.775264-08:00","created_by":"daemon"}]} {"id":"bd-dvd","title":"GetNextChildID doesn't attempt parent resurrection from JSONL history","description":"When creating a child issue with --parent flag, GetNextChildID fails immediately if parent doesn't exist in DB, without attempting to resurrect it from JSONL history. This breaks the intended resurrection workflow and causes 'parent issue X does not exist' errors even when the parent exists in JSONL.\n\nRelated to GH #334 and #278.\n\nCurrent behavior:\n- GetNextChildID checks if parent exists in DB\n- If not found, returns error immediately\n- No resurrection attempt\n\nExpected behavior:\n- GetNextChildID should call TryResurrectParent before failing\n- Parent should be restored as tombstone if found in JSONL history\n- Child creation should succeed if resurrection succeeds\n\nImpact: Users cannot create child issues for parents that were deleted but exist in JSONL history.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-21T10:02:51.496365-05:00","updated_at":"2025-11-22T14:57:44.534796097-05:00","closed_at":"2025-11-21T15:09:02.731171-05:00"} {"id":"bd-dvw8","title":"GH#523: Fix closed issues missing closed_at timestamp during db upgrade","description":"Old beads databases may have closed issues without closed_at timestamps, causing 'closed issues must have closed_at timestamp' validation errors on upgrade to 0.29.0. Need defensive handling during import. See: https://github.com/steveyegge/beads/issues/523","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-14T16:31:30.421555-08:00","updated_at":"2025-12-16T14:39:19.052482-08:00","closed_at":"2025-12-14T17:29:34.746247-08:00"} @@ -942,6 +991,7 @@ {"id":"bd-e6d71828","title":"Add transaction + retry logic for N-way collision resolution","description":"## Problem\nCurrent N-way collision resolution fails on UNIQUE constraint violations during convergence rounds when 5+ clones sync. The RemapCollisions function is non-atomic and performs operations sequentially:\n1. Delete old issues (CASCADE deletes dependencies)\n2. Create remapped issues (can fail with UNIQUE constraint)\n3. Recreate dependencies\n4. Update text references\n\nFailure at step 2 leaves database in inconsistent state.\n\n## Solution\nWrap collision resolution in database transaction with retry logic:\n- Make entire RemapCollisions operation atomic\n- Retry up to 3 times on UNIQUE constraint failures\n- Re-sync counters between retries\n- Add better error messages for debugging\n\n## Implementation\nLocation: internal/storage/sqlite/collision.go:342 (RemapCollisions function)\n\n```go\n// Retry up to 3 times on UNIQUE constraint failures\nfor attempt := 0; attempt \u003c 3; attempt++ {\n err := s.db.ExecInTransaction(func(tx *sql.Tx) error {\n // All collision resolution operations\n })\n if !isUniqueConstraintError(err) {\n return err\n }\n s.SyncAllCounters(ctx)\n}\n```\n\n## Success Criteria\n- 5-clone collision test passes reliably\n- No partial state on UNIQUE constraint errors\n- Automatic recovery from transient ID conflicts\n\n## References\n- See beads_nway_test.go:124 for the KNOWN LIMITATION comment\n- Related to-7c5915ae (transaction support)","notes":"## Progress Made\n\n1. Added `ExecInTransaction` helper to SQLiteStorage for atomic database operations\n2. Added `IsUniqueConstraintError` function to detect UNIQUE constraint violations\n3. Wrapped `RemapCollisions` with retry logic (up to 3 attempts) with counter sync between retries\n4. Enhanced `handleRename` to detect and handle race conditions where target ID already exists\n5. Added defensive checks for when old ID has been deleted by another clone\n\n## Test Results\n\nThe changes improve N-way collision handling but don't fully solve the problem:\n- Original error: `UNIQUE constraint failed: issues.id` during first convergence round\n- With changes: Test proceeds further but encounters different collision scenarios\n- New error: `target ID already exists with different content` in later convergence rounds\n\n## Root Cause Analysis\n\nThe issue is more complex than initially thought. In N-way scenarios:\n1. Clone A remaps bd-1c63eb84 → test-2 → test-4\n2. Clone B remaps bd-1c63eb84 → test-3 → test-4 \n3. Both try to create test-4, but with different intermediate states\n4. This creates legitimate content collisions that require additional resolution\n\n## Next Steps \n\nThe full solution requires:\n1. Making remapping fully deterministic across clones (same input → same remapped ID)\n2. OR making `handleRename` more tolerant of mid-flight collisions\n3. OR implementing full transaction support for multi-step collision resolution -7c5915ae)\n\nThe retry logic added here provides a foundation but isn't sufficient for complex N-way scenarios.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T10:22:32.716678-07:00","updated_at":"2025-11-02T17:08:52.043475-08:00","closed_at":"2025-11-02T17:08:52.043477-08:00"} {"id":"bd-e6x","title":"bd sync --squash: batch multiple syncs into single commit","description":"For solo developers who don't need real-time multi-agent coordination, add a --squash option to bd sync that accumulates changes and commits them in a single commit rather than one commit per sync.\n\nThis addresses the git history pollution concern (many 'bd sync: timestamp' commits) while preserving the default behavior needed for orchestration.\n\n**Proposed behavior:**\n- `bd sync --squash` accumulates pending exports without committing\n- Commits accumulated changes on session end or explicit `bd sync` (without --squash)\n- Default behavior unchanged (immediate commits for orchestration)\n\n**Use case:** Solo developers who want cleaner git history but don't need real-time coordination between agents.\n\n**Related:** PR #411 (docs: reduce bd sync commit pollution)\n**See also:** Multi-repo support as alternative solution (docs/MULTI_REPO_AGENTS.md)","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-11-28T18:21:47.789887-08:00","updated_at":"2025-12-02T17:11:19.738252987-05:00","closed_at":"2025-11-28T21:56:57.608777-08:00"} {"id":"bd-e7ou","title":"Fix --as flag: uses title instead of ID in mol bond","description":"In bondProtoProto, the --as flag is documented as 'Custom ID for compound proto' but the implementation uses it as the title, not the issue ID.\n\n**Current behavior (mol.go:637-638):**\n```go\nif customID != '' {\n compoundTitle = customID // Used as title, not ID\n}\n```\n\n**Options:**\n1. Change flag description to say 'Custom title' (documentation fix)\n2. Actually use it as a custom ID prefix or full ID (feature change)\n3. Add separate --title flag and make --as actually set ID\n\nRecommend option 1 for simplest fix - change 'Custom ID' to 'Custom title' in the flag description.","status":"closed","priority":3,"issue_type":"bug","created_at":"2025-12-21T10:22:59.069368-08:00","updated_at":"2025-12-21T21:18:48.514513-08:00","closed_at":"2025-12-21T21:18:48.514513-08:00"} +{"id":"bd-e7v0c","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T15:08:38.465263-08:00","created_by":"beads/refinery","updated_at":"2026-01-10T15:08:38.498968-08:00","closed_at":"2026-01-10T15:08:38.498968-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-e8be4224","title":"Batch test 3","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-29T15:29:01.964091-07:00","updated_at":"2025-10-31T12:00:43.183212-07:00","closed_at":"2025-10-31T12:00:43.183212-07:00"} {"id":"bd-e8kq","title":"Consolidate migrate-* commands into migrate subcommands","description":"Move migrate-hash-ids, migrate-issues, migrate-sync, migrate-tombstones under 'migrate' as subcommands. Reduces 5 top-level commands to 1.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-28T12:59:09.187369-08:00","created_by":"stevey","updated_at":"2025-12-28T13:02:51.321846-08:00","closed_at":"2025-12-28T13:02:51.321848-08:00"} {"id":"bd-e92","title":"Add test coverage for internal/autoimport package","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-20T21:21:22.338577-05:00","updated_at":"2025-12-09T18:38:37.690070772-05:00","closed_at":"2025-11-28T21:52:34.222127-08:00","dependencies":[{"issue_id":"bd-e92","depends_on_id":"bd-ge7","type":"blocks","created_at":"2025-11-20T21:21:31.128625-05:00","created_by":"daemon"}]} @@ -949,6 +999,7 @@ {"id":"bd-eb3c","title":"UX nightmare: multiple ways daemon can fail with misleading messages","status":"closed","priority":0,"issue_type":"epic","created_at":"2025-10-31T21:08:09.090553-07:00","updated_at":"2025-11-01T20:27:42.79962-07:00","closed_at":"2025-11-01T20:27:42.79962-07:00"} {"id":"bd-ecmd","title":"Add type: event for state transitions","description":"Events capture operational state changes as immutable records.\n\nFields needed:\n- event_type: string (namespaced category like patrol.muted, agent.started) \n- actor: string (entity URI who caused this)\n- target: string (entity URI or bead ID affected)\n- payload: object (event-specific JSON data)\n\nExample:\n id: evt-x7k2\n type: event\n event_type: patrol.muted\n actor: human:overseer\n target: agent:deacon\n payload: {reason: fixing deadlock, until: gt-abc1}\n\nThis enables:\n- bd activity --follow showing events\n- bd list --type=event --target=agent:deacon\n- Full audit trail for operational state\n- HOP-compatible transaction records","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-30T15:15:23.440095-08:00","created_by":"gastown/crew/max","updated_at":"2025-12-30T18:12:30.97233-08:00","closed_at":"2025-12-30T16:13:57.467275-08:00","close_reason":"Implemented type: event for state transitions with all required fields"} {"id":"bd-ee1","title":"Add security tests for WriteFile permissions in doctor command","description":"Test coverage gap identified by automated analysis (vc-217).\n\n**Original Issue:** [deleted:[deleted:bd-da96-baseline-lint]]\n\nIn cmd/bd/doctor/gitignore.go:98, os.WriteFile uses 0644 permissions, flagged by gosec G306 as potentially too permissive.\n\nAdd tests to verify:\n- File is created with appropriate permissions (0600 or less)\n- Existing file permissions are not loosened\n- File ownership is correct\n- Sensitive data handling if .gitignore contains secrets\n\nThis ensures .gitignore files are created with secure permissions to prevent unauthorized access.\n\n_This issue was automatically created by AI test coverage analysis._","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-21T10:25:33.529153-05:00","updated_at":"2025-11-22T14:57:44.539058246-05:00","dependencies":[{"issue_id":"bd-ee1","depends_on_id":"bd-da96-baseline-lint","type":"discovered-from","created_at":"2025-11-21T10:25:33.530705-05:00","created_by":"ai-supervisor"}]} +{"id":"bd-ee58w","title":"Session ended: gt-beads-crew-giles","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T22:29:40.041794-08:00","created_by":"beads/crew/giles","updated_at":"2026-01-09T22:29:40.077721-08:00","closed_at":"2026-01-09T22:29:40.077721-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-eef03e0a","title":"Stress test: event storm handling","description":"Simulate 100+ rapid JSONL writes. Verify debouncer batches to single import. Verify no data loss. Test daemon stability.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T20:49:49.138725-07:00","updated_at":"2025-10-31T19:18:50.682925-07:00","closed_at":"2025-10-31T19:18:50.682925-07:00"} {"id":"bd-eeqf","title":"GH#486: Claude forgets beads workflow mid-session","description":"Claude progressively reverts to TodoWrite or skips tracking despite CLAUDE.md instructions. Happens after context resets or long sessions. Need stronger prompting or hooks. See: https://github.com/steveyegge/beads/issues/486","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-14T16:32:21.544338-08:00","updated_at":"2025-12-16T01:27:29.005426-08:00","closed_at":"2025-12-16T01:27:29.005426-08:00"} {"id":"bd-ef72b864","title":"Add MCP server functions for repair commands","description":"Expose new repair commands via MCP server for agent access:\n\nFunctions to add:\n- beads_repair_deps()\n- beads_detect_pollution()\n- beads_validate()\n- beads_resolve_conflicts() (when implemented)\n\nUpdate integrations/beads-mcp/src/beads_mcp/server.py\n\nSee repair_commands.md lines 803-884 for design.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-28T19:38:02.227921-07:00","updated_at":"2025-10-30T17:12:58.180404-07:00","closed_at":"2025-10-29T23:14:44.187562-07:00"} @@ -967,10 +1018,14 @@ {"id":"bd-epvx","title":"Create Go adapter library (optional)","description":"For agents written in Go, provide native adapter library instead of shelling out to curl.\n\nAcceptance Criteria:\n- agentmail.Client struct\n- HTTP client with timeout/retry logic\n- Same API as Python adapter\n- Example usage in examples/go-agent/\n- Unit tests\n\nFile: pkg/agentmail/client.go\n\nNote: Lower priority - can shell out to curl initially","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-11-07T22:42:28.781577-08:00","updated_at":"2025-11-08T15:58:37.146674-08:00","closed_at":"2025-11-08T15:48:57.83973-08:00","dependencies":[{"issue_id":"bd-epvx","depends_on_id":"bd-m9th","type":"blocks","created_at":"2025-11-07T23:04:01.47471-08:00","created_by":"daemon"}]} {"id":"bd-epww","title":"Document pinned status in CLI_REFERENCE.md","description":"## Task\n\nThe `pinned` status is a valid issue status but is not documented in CLI_REFERENCE.md.\n\n## Current Status Values (from types.go:295-301)\n\n- open\n- in_progress\n- blocked\n- deferred\n- closed\n- tombstone\n- **pinned** ← undocumented\n\n## Definition\n\n`StatusPinned Status = \"pinned\" // Persistent bead that stays open indefinitely (bd-6v2)`\n\n## Where to Document\n\nAdd to the 'Issue Types' or create a new 'Issue Statuses' section in docs/CLI_REFERENCE.md.\n\n## Related\n\nThe pinned status is heavily used by gt for hook management (`--status=pinned`).","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-27T17:12:35.296002-08:00","created_by":"gastown/crew/joe","updated_at":"2025-12-27T19:13:05.640767-08:00","closed_at":"2025-12-27T19:13:05.640767-08:00"} {"id":"bd-eqjc","title":"bd init creates nested .beads directories","description":"bd init sometimes creates .beads/.beads/ nested directories, which should never happen. This occurs fairly often and can cause confusion about which .beads directory is active. Need to add validation to detect if already inside a .beads directory and either error or use the parent .beads location.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-06T22:21:22.948727-08:00","updated_at":"2025-11-06T22:22:41.04958-08:00","closed_at":"2025-11-06T22:22:41.04958-08:00"} +{"id":"bd-er7d7","title":"Session ended: gt-beads-crew-fang","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T23:05:23.999666-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-09T23:05:24.037438-08:00","closed_at":"2026-01-09T23:05:24.037438-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-er7r","title":"GH#509: bd fails to find .beads from nested worktrees","description":"findDatabaseInTree stops at worktree git root, missing .beads in parent repo. Should check git-common-dir and search past worktree root. See: https://github.com/steveyegge/beads/issues/509","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-14T16:32:00.082813-08:00","updated_at":"2025-12-16T01:27:29.033379-08:00","closed_at":"2025-12-16T01:27:29.033379-08:00"} {"id":"bd-es19","title":"BG's issue to reopen","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-22T14:57:44.542501548-05:00","updated_at":"2025-11-22T14:57:44.542501548-05:00","closed_at":"2025-11-07T21:57:59.90981-08:00"} {"id":"bd-etyv","title":"Smart --var detection for mol distill","description":"Implemented bidirectional syntax support for mol distill --var flag.\n\n**Problem:**\n- spawn uses: --var variable=value (assignment style)\n- distill used: --var value=variable (substitution style)\n- Agents would naturally guess spawn-style for both\n\n**Solution:**\nSmart detection that accepts BOTH syntaxes by checking which side appears in the epic text:\n- --var branch=feature-auth → finds 'feature-auth' in text → works\n- --var feature-auth=branch → finds 'feature-auth' in text → also works\n\n**Changes:**\n- Added parseDistillVar() with smart detection\n- Added collectSubgraphText() helper\n- Restructured runMolDistill to load subgraph before parsing vars\n- Updated help text to document both syntaxes\n- Added comprehensive tests in mol_test.go\n\n**Edge cases handled:**\n- Both sides found: prefers spawn-style (more common guess)\n- Neither found: helpful error message\n- Empty sides: validation error\n- Values containing '=' (e.g., KEY=VALUE): works via SplitN\n\nEmbodies the Beads philosophy: watch what agents do, make their guess correct.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T11:08:50.83923-08:00","updated_at":"2025-12-21T11:08:56.432536-08:00","closed_at":"2025-12-21T11:08:56.432536-08:00"} +{"id":"bd-etzsr","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T13:45:28.7952-08:00","created_by":"beads/refinery","updated_at":"2026-01-10T13:45:28.946382-08:00","closed_at":"2026-01-10T13:45:28.946382-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-ewcd","title":"Merge: onyx-mjxcs6um","description":"branch: polecat/onyx-mjxcs6um\ntarget: main\nsource_issue: onyx-mjxcs6um\nrig: beads\nagent_bead: bd-beads-polecat-onyx","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2026-01-02T13:07:05.288722-08:00","created_by":"beads/polecats/onyx","updated_at":"2026-01-02T13:41:56.622999-08:00","closed_at":"2026-01-02T13:41:56.622999-08:00","close_reason":"Branches merged, cleaning up stale MR beads"} +{"id":"bd-ex51t","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T14:28:12.477526-08:00","created_by":"beads/refinery","updated_at":"2026-01-10T14:28:12.51271-08:00","closed_at":"2026-01-10T14:28:12.51271-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} +{"id":"bd-exd2p","title":"Session ended: gt-beads-witness","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T21:43:50.525702-08:00","created_by":"beads/witness","updated_at":"2026-01-10T21:43:50.595327-08:00","closed_at":"2026-01-10T21:43:50.595327-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-expt","title":"RPC fast-fail: stat socket before dial, cap timeouts to 200ms","description":"Eliminate 5s delay when daemon socket is missing by:\n1. Add os.Stat(socketPath) check before dialing in TryConnect\n2. Return (nil, nil) immediately if socket doesn't exist\n3. Set default dial timeout to 200ms in TryConnect\n4. Keep TryConnectWithTimeout for explicit health/status checks (1-2s)\n\nThis prevents clients from waiting through full timeout when no daemon is running.","status":"closed","priority":0,"issue_type":"task","created_at":"2025-11-07T16:42:12.688526-08:00","updated_at":"2025-11-07T22:07:17.345918-08:00","closed_at":"2025-11-07T21:04:21.671436-08:00","dependencies":[{"issue_id":"bd-expt","depends_on_id":"bd-ndyz","type":"discovered-from","created_at":"2025-11-07T16:42:12.689284-08:00","created_by":"daemon"}]} {"id":"bd-exy3","title":"Ephemeral patrol molecules leaking into beads","description":"## Problem\n\nEphemeral patrol orchestration molecules (e.g., mol-deacon-patrol, wisp step issues) keep appearing in `bd ready` output in gastown beads.\n\nThese are ephemeral/wisp issues that should:\n1. Never be synced to the beads-sync branch\n2. Live only in .beads-wisp/ (ephemeral storage)\n3. Be squashed to digests, not persisted as regular beads\n\n## Examples found\n\n- gt-wisp-6ue: mol-deacon-patrol\n- gt-pacdm: mol-deacon-patrol \n- gt-wisp-mpm: Check own context limit\n- gt-wisp-lkc: Clean dead sessions\n\n## Investigation needed\n\n1. Where are these being created? (gt mol bond? manual bd create?)\n2. Why are they using the gt- prefix instead of staying ephemeral?\n3. Is the wisp storage (.beads-wisp/) being used correctly?\n4. Is bd sync accidentally picking up ephemeral issues?\n\n## Expected behavior\n\nPatrol molecules and their steps should be ephemeral and never appear in `bd ready` or `bd list`.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-27T17:04:16.51075-08:00","created_by":"gastown/crew/joe","updated_at":"2025-12-27T19:18:16.809273-08:00","closed_at":"2025-12-27T19:18:16.809273-08:00"} {"id":"bd-eylk","title":"Full event test","status":"tombstone","priority":2,"issue_type":"event","created_at":"2025-12-30T16:08:32.342126-08:00","created_by":"beads/polecats/obsidian","updated_at":"2025-12-30T16:08:59.772362-08:00","deleted_at":"2025-12-30T16:08:59.772362-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"event"} @@ -1027,6 +1082,7 @@ {"id":"bd-fcl1","title":"Merge: bd-au0.5","description":"branch: polecat/Searcher\ntarget: main\nsource_issue: bd-au0.5\nrig: beads","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-23T13:39:11.946667-08:00","updated_at":"2025-12-23T19:12:08.346454-08:00","closed_at":"2025-12-23T19:12:08.346454-08:00"} {"id":"bd-fd56","title":"Wrap git operations in GitClient interface","description":"Create internal/daemonrunner/git.go with GitClient interface (HasUpstream, HasChanges, Commit, Push, Pull). Default implementation using os/exec. Use in Syncer and Run loop for testability.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-01T11:41:14.88734-07:00","updated_at":"2025-11-02T12:32:00.159595-08:00","closed_at":"2025-11-02T12:32:00.159597-08:00"} {"id":"bd-fd8753d9","title":"Document bd edit command and verify MCP exclusion","description":"Follow-up from PR #152:\n1. Add \"bd edit\" to AGENTS.md with \"Humans only\" note\n2. Verify MCP server doesn't expose bd edit command\n3. Consider adding test for command registration","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-26T13:23:47.982295-07:00","updated_at":"2025-12-14T12:12:46.527274-08:00","closed_at":"2025-11-06T19:41:08.675575-08:00"} +{"id":"bd-fdiuw","title":"Session ended: gt-beads-witness","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T21:10:18.24073-08:00","created_by":"beads/witness","updated_at":"2026-01-10T21:10:18.280577-08:00","closed_at":"2026-01-10T21:10:18.280577-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-febc","title":"npm package for bd with native binaries","description":"Create an npm package that wraps native bd binaries for easy installation in Claude Code for Web and other Node.js environments.\n\n## Problem\nClaude Code for Web sandboxes are full Linux VMs with npm support, but cannot easily download binaries from GitHub releases due to network restrictions or tooling limitations.\n\n## Solution\nPublish bd as an npm package that:\n- Downloads platform-specific native binaries during postinstall\n- Provides a CLI wrapper that invokes the native binary\n- Works seamlessly in Claude Code for Web SessionStart hooks\n- Maintains full feature parity (uses native SQLite)\n\n## Benefits vs WASM\n- ✅ Full SQLite support (no custom VFS needed)\n- ✅ All features work identically to native bd\n- ✅ Better performance (native vs WASM overhead)\n- ✅ ~4 hours effort vs ~2 days for WASM\n- ✅ Minimal maintenance burden\n\n## Success Criteria\n- npm install @beads/bd works in Claude Code for Web\n- All bd commands function identically to native binary\n- SessionStart hook documented for auto-installation\n- Package published to npm registry","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-02T23:39:37.684109-08:00","updated_at":"2025-11-03T10:39:44.932565-08:00","closed_at":"2025-11-03T10:39:44.932565-08:00"} {"id":"bd-fedb","title":"Polecats should spawn with auto-accept mode enabled","description":"During swarm bd-784c, polecats (Toast, Nux) were spawned without --dangerously-skip-permissions or equivalent auto-accept mode.\n\n**Problem:**\nEvery edit, bash command, and tool use required manual confirmation via tmux send-keys. This defeats the purpose of autonomous polecat operation.\n\n**Expected:**\nPolecats in a swarm should run with permissions bypassed so they can work autonomously.\n\n**Workaround used:**\n- Manually sent Enter keys via tmux to accept prompts\n- Eventually polecats entered 'bypass permissions on' mode after restart\n\n**Suggestion:**\n- gt sling should pass --dangerously-skip-permissions by default for polecats\n- Or polecats should have a .claude/settings.local.json pre-configured for auto-accept","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-28T16:17:47.061327-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T22:14:19.109728-08:00","closed_at":"2025-12-28T22:14:19.109728-08:00"} {"id":"bd-fej5","title":"bd hook: detect agent from cwd instead of defaulting to $USER","description":"**Problem:**\n`bd hook` without `--agent` defaults to `$USER` (e.g., \"stevey\") instead of detecting the agent identity from the current working directory.\n\n**Expected behavior:**\nWhen running from `/Users/stevey/gt/beads/crew/dave`, the agent should be detected as `beads/crew/dave`.\n\n**Current behavior:**\n```bash\n$ pwd\n/Users/stevey/gt/beads/crew/dave\n$ bd hook\nHook: stevey\n (empty)\n\n$ bd hook --agent beads/crew/dave\nHook: beads/crew/dave\n 📌 bd-hobo (mol) - open\n```\n\n**Fix:**\nbd hook should use the same cwd-based agent detection that other commands use (similar to how `gt mail` determines identity from cwd).","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-24T20:01:27.613892-08:00","updated_at":"2025-12-25T12:41:10.65257-08:00","closed_at":"2025-12-25T12:41:10.65257-08:00"} @@ -1041,6 +1097,7 @@ {"id":"bd-fjth5","title":"Refactor: Use types.MaxHierarchyDepth constant for fallback default","description":"The GH#995 fix added fallback defaults in two places:\n\n- internal/storage/sqlite/hash_ids.go:58: `maxDepth = 3 // fallback default`\n- internal/storage/memory/memory.go:1606: `maxDepth = 3 // fallback default`\n\nThese duplicate the value from types.MaxHierarchyDepth (internal/types/id_generator.go:92).\n\nShould reference the constant instead of hardcoding 3 to maintain single source of truth.\n\nLow priority - cosmetic improvement.","status":"open","priority":3,"issue_type":"task","created_at":"2026-01-10T13:36:08.122138-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-10T13:36:08.122138-08:00","labels":["refactor"]} {"id":"bd-fjuf","title":"Work on gt-8tmz.10: Rename Engineer in Box to Shiny. Rena...","description":"Work on gt-8tmz.10: Rename Engineer in Box to Shiny. Rename mol-engineer-in-box references to mol-shiny or just 'shiny'. Update docs and code in internal/formula/ and .beads/formulas/. When done: 1) bd close gt-8tmz.10, 2) bd sync, 3) git push, 4) gt mq submit","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:26:18.426959-08:00","updated_at":"2025-12-25T19:30:19.947382-08:00","closed_at":"2025-12-25T19:30:19.947382-08:00"} {"id":"bd-fkdw","title":"Update bash-agent example with Agent Mail integration","description":"Add Agent Mail integration to examples/bash-agent/agent.sh using curl for HTTP calls.\n\nAcceptance Criteria:\n- Health check function using curl\n- Reserve issue before claiming\n- Send notifications on status change\n- Release on completion\n- Graceful degradation if curl fails\n- No bash errors when Agent Mail unavailable\n\nFile: examples/bash-agent/agent.sh","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-07T22:42:28.722048-08:00","updated_at":"2025-11-08T01:09:25.900138-08:00","closed_at":"2025-11-08T01:09:25.900138-08:00","dependencies":[{"issue_id":"bd-fkdw","depends_on_id":"bd-m9th","type":"blocks","created_at":"2025-11-07T23:04:01.398259-08:00","created_by":"daemon"}]} +{"id":"bd-fkp68","title":"Digest: mol-refinery-patrol","description":"Patrol: queue empty, no work processed","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T23:37:26.823421-08:00","updated_at":"2026-01-10T23:37:26.823421-08:00","closed_at":"2026-01-10T23:37:26.823378-08:00","close_reason":"Squashed from 11 wisps","dependencies":[{"issue_id":"bd-fkp68","depends_on_id":"bd-wisp-7gd","type":"parent-child","created_at":"2026-01-10T23:37:26.824301-08:00","created_by":"beads/refinery"}]} {"id":"bd-fl9xb","title":"Review PR #960: Fix filepath.Rel sync error","description":"dispatched_by: beads/crew/emma\n\nReview and verify PR #960 (steveyegge/beads)\n\nPR: https://github.com/steveyegge/beads/pull/960\nAuthor: peterkc\nFixes: #959\n\nFixes bd sync failing with filepath.Rel error when dbPath is relative.\n- gh pr view 960 --repo steveyegge/beads\n- gh pr diff 960 --repo steveyegge/beads\n- If good: gh pr merge 960 --repo steveyegge/beads --squash","status":"closed","priority":2,"issue_type":"task","assignee":"beads/crew/giles","created_at":"2026-01-08T14:30:23.843917-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-08T14:37:19.657459-08:00","closed_at":"2026-01-08T14:37:19.657459-08:00","close_reason":"PR #960 reviewed and merged. Fix ensures dbPath is always absolute via CanonicalizePath, preventing filepath.Rel errors in sync-branch mode."} {"id":"bd-fmdy","title":"Merge: bd-kzda","description":"branch: polecat/toast\ntarget: main\nsource_issue: bd-kzda\nrig: beads","status":"closed","priority":3,"issue_type":"merge-request","created_at":"2025-12-23T00:27:28.952413-08:00","updated_at":"2025-12-23T01:33:25.731326-08:00","closed_at":"2025-12-23T01:33:25.731326-08:00"} {"id":"bd-fom","title":"Remove all deletions.jsonl code except migration","description":"There's deletions manifest code spread across the entire codebase that should have been removed after tombstone migration:\n\nFiles with deletions code (non-migration):\n- internal/deletions/ - entire package\n- cmd/bd/sync.go - 25+ references, auto-compact, sanitize\n- cmd/bd/delete.go - dual-writes to deletions.jsonl\n- internal/importer/importer.go - checks deletions manifest\n- internal/syncbranch/worktree.go - merges deletions.jsonl\n- cmd/bd/doctor/fix/sync.go - cleanupDeletionsManifest\n- cmd/bd/doctor/fix/deletions.go - HydrateDeletionsManifest\n- cmd/bd/integrity.go - checks deletions for data loss\n- cmd/bd/deleted.go - entire command\n- cmd/bd/compact.go - pruneDeletionsManifest\n- cmd/bd/doctor.go - checkDeletionsManifest\n- Plus many more\n\nAction: Aggressively remove all non-migration deletions code. Tombstones are the only deletion mechanism now.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-16T13:29:04.960863-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} @@ -1067,8 +1124,10 @@ {"id":"bd-gdn","title":"Add functional tests for FlushManager correctness verification","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-20T21:21:53.967757-05:00","updated_at":"2025-11-20T21:35:53.1183-05:00","closed_at":"2025-11-20T21:35:53.1183-05:00"} {"id":"bd-gdzd","title":"Import fails on same-content-different-ID instead of treating as update","description":"## Problem\n\nThe importer still has rename detection (importer.go:482-500) that triggers when same content hash has different IDs. With hash IDs, this shouldn't happen, but when it does (test data, bugs, legacy data), the import fails:\n\n```\nfailed to handle rename bd-ce75 -\u003e bd-5a90: rename collision handling removed - should not occur with hash IDs\n```\n\n## Current Behavior\n\n1. Importer finds same content hash with different IDs\n2. Calls handleRename() (line 490)\n3. handleRename() errors out (line 294): \"rename collision handling removed\"\n4. Import fails\n\n## Expected Behavior\n\nSame content hash + different IDs should be treated as an **update**, not a rename:\n- Keep existing ID (already in database)\n- Update fields if incoming has newer timestamp\n- Discard incoming ID (it's wrong - hash should have generated same ID)\n\n## Impact\n\n- Import fails on legitimate edge cases (test data, data corruption)\n- Cryptic error message\n- Blocks sync operations\n\n## Fix\n\nIn handleRename() or import loop, instead of erroring:\n```go\n// Same content, different ID - treat as update\nif incoming.UpdatedAt.After(existing.UpdatedAt) {\n existing.Status = incoming.Status\n // ... copy other fields\n s.UpdateIssue(ctx, existing)\n}\nresult.Updated++\n```\n\n## Files\n- internal/importer/importer.go:271-294 (handleRename)\n- internal/importer/importer.go:482-500 (rename detection)\n\n## Repro\nImport JSONL with bd-ce75 and bd-5a90 (both \"Test parent issue\" but different content hashes).","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-05T00:27:51.150233-08:00","updated_at":"2025-11-05T01:02:54.469971-08:00","closed_at":"2025-11-05T01:02:54.469979-08:00"} {"id":"bd-ge7","title":"Improve Beads test coverage from 46% to 80%","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-20T21:21:03.700271-05:00","updated_at":"2025-12-09T18:38:37.691262172-05:00","closed_at":"2025-11-28T21:56:04.085939-08:00"} +{"id":"bd-gf7q3","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T18:13:05.704064-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T18:13:05.744994-08:00","closed_at":"2026-01-09T18:13:05.744994-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-gfo3","title":"Merge: bd-ykd9","description":"branch: polecat/Doctor\ntarget: main\nsource_issue: bd-ykd9\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-23T13:34:43.778808-08:00","updated_at":"2025-12-23T19:12:08.353427-08:00","closed_at":"2025-12-23T19:12:08.353427-08:00"} {"id":"bd-ggbc","title":"Update documentation for merge driver auto-config","description":"Update documentation to reflect the new merge driver auto-configuration during `bd init`.\n\n**Files to update:**\n- README.md - Mention merge driver setup in initialization section\n- AGENTS.md - Update onboarding section about merge driver\n- Possibly QUICKSTART.md\n\n**Content:**\n- Explain what the merge driver does\n- Show --skip-merge-driver flag usage\n- Manual installation steps for post-init setup","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-05T19:27:04.155662-08:00","updated_at":"2025-11-05T19:29:55.188122-08:00","closed_at":"2025-11-05T19:29:55.188122-08:00","dependencies":[{"issue_id":"bd-ggbc","depends_on_id":"bd-32nm","type":"discovered-from","created_at":"2025-11-05T19:27:04.156491-08:00","created_by":"daemon"}]} +{"id":"bd-gghoz","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T00:36:41.190814-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-10T00:36:41.227337-08:00","closed_at":"2026-01-10T00:36:41.227337-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-ghb","title":"Add --yes flag to bd doctor --fix for non-interactive mode","description":"## Feature Request\n\nAdd a `--yes` or `-y` flag to `bd doctor --fix` that automatically confirms all prompts, enabling non-interactive usage in scripts and CI/CD pipelines.\n\n## Current Behavior\n`bd doctor --fix` prompts for confirmation before applying fixes, which blocks automated workflows.\n\n## Desired Behavior\n`bd doctor --fix --yes` should apply all fixes without prompting.\n\n## Use Cases\n- CI/CD pipelines that need to auto-fix issues\n- Scripts that automate repository setup\n- Pre-commit hooks that want to silently fix issues","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-11-26T23:22:45.486584-08:00","updated_at":"2025-12-02T17:11:19.741550211-05:00","closed_at":"2025-11-28T21:55:06.895066-08:00"} {"id":"bd-gi2ol","title":"Session ended: gt-beads-crew-dave","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T13:46:05.186629-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-09T13:46:05.220272-08:00","closed_at":"2026-01-09T13:46:05.220272-08:00","close_reason":"auto-closed session event"} {"id":"bd-gigi","title":"bd admin compact --older-than=0 ignores the flag, uses default 30 days","description":"When running bd admin compact --prune --older-than=0, the output says 'No expired tombstones to prune (TTL: 30 days)' - the flag value is ignored.\n\nRoot cause: In runCompactPrune() in compact_tombstone.go:180, the check 'if compactOlderThan \u003e 0' means that --older-than=0 is treated the same as not passing the flag, defaulting to 30 days.\n\nFix: Change the default flag value in compact.go:785 to -1 (sentinel for 'use default'), and treat 0 as 'expire all tombstones' by passing a negative TTL to pruneExpiredTombstones().\n\nMoved from gt-65gwa (gastown) - was filed in wrong rig.","status":"closed","priority":2,"issue_type":"bug","assignee":"beads/crew/emma","created_at":"2025-12-29T23:34:41.255352-08:00","created_by":"gastown/polecats/dementus","updated_at":"2025-12-30T00:00:43.476085-08:00","closed_at":"2025-12-30T00:00:43.476085-08:00","close_reason":"Fixed: flag default changed to -1 sentinel, 0 now means expire all"} @@ -1095,11 +1154,13 @@ {"id":"bd-h0we","title":"Review SQLite indexes and scaling bottlenecks","description":"Audit the beads SQLite schema for:\n\n## Index Review\n- Are all frequently-queried columns indexed?\n- Are compound indexes needed for common query patterns?\n- Any missing indexes on foreign keys or filter columns?\n\n## Scaling Bottlenecks\n- How does performance degrade with 10k, 100k, 1M issues?\n- Full table scans in hot paths?\n- JSONL export/import performance at scale\n- Transaction contention in multi-agent scenarios\n\n## Common Query Patterns to Optimize\n- bd ready (status + blocked_by resolution)\n- bd list with filters (status, type, priority, labels)\n- bd show with dependency graph traversal\n- bd sync import/export\n\n## Deliverables\n- Document current indexes\n- Identify missing indexes\n- Benchmark key operations at scale\n- Recommend schema improvements","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T23:41:06.481881-08:00","updated_at":"2025-12-22T22:59:25.178175-08:00","closed_at":"2025-12-22T22:59:25.178175-08:00"} {"id":"bd-h27p","title":"Merge: bd-g4b4","description":"branch: polecat/Hooker\ntarget: main\nsource_issue: bd-g4b4\nrig: beads","status":"closed","priority":3,"issue_type":"merge-request","created_at":"2025-12-23T13:38:50.707153-08:00","updated_at":"2025-12-23T19:12:08.357806-08:00","closed_at":"2025-12-23T19:12:08.357806-08:00"} {"id":"bd-h2er0","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-08T14:10:47.245565-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-08T14:10:47.279058-08:00","closed_at":"2026-01-08T14:10:47.279058-08:00","close_reason":"auto-closed session event"} +{"id":"bd-h4ffe","title":"Session ended: gt-beads-witness","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T00:24:24.330198-08:00","created_by":"beads/witness","updated_at":"2026-01-10T00:24:24.38733-08:00","closed_at":"2026-01-10T00:24:24.38733-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-h4hc","title":"Test child issue","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-05T13:00:42.368282-08:00","updated_at":"2025-11-05T13:01:11.64526-08:00","closed_at":"2025-11-05T13:01:11.64526-08:00"} {"id":"bd-h4tj","title":"Refinery Patrol","description":"Merge queue processor patrol loop with verification gates.","status":"closed","priority":2,"issue_type":"molecule","created_at":"2025-12-27T19:24:07.068355-08:00","created_by":"deacon","updated_at":"2025-12-30T18:12:30.964309-08:00","closed_at":"2025-12-30T18:11:14.218164-08:00"} {"id":"bd-h502","title":"Swarm: Test epic for duplicate swarm","description":"Swarm molecule orchestrating epic bd-4d9d.\n\nEpic: bd-4d9d\nCoordinator: ","status":"closed","priority":2,"issue_type":"molecule","created_at":"2025-12-28T21:59:45.597534-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-29T13:40:29.713516-08:00","closed_at":"2025-12-29T13:40:29.713516-08:00","close_reason":"Stale/spurious - test artifacts, merged PRs, or auto-close candidates","dependencies":[{"issue_id":"bd-h502","depends_on_id":"bd-4d9d","type":"relates-to","created_at":"2025-12-28T21:59:45.598237-08:00","created_by":"beads/crew/dave"}]} {"id":"bd-h5n1","title":"bd cleanup should also prune expired tombstones","description":"## Problem\n\n`bd cleanup` deletes closed issues (converting them to tombstones) but does NOT prune expired tombstones. Users expect 'cleanup' to do comprehensive cleanup.\n\n## Current Behavior\n\n1. `bd cleanup --force` → converts closed issues to tombstones\n2. Expired tombstones (\u003e30 days) remain in issues.jsonl\n3. User must separately run `bd compact` to prune tombstones\n4. `bd doctor` warns about expired tombstones: 'Run bd compact to prune'\n\n## Expected Behavior\n\n`bd cleanup` should also prune expired tombstones from issues.jsonl.\n\n## Impact\n\nWith v0.30.0 making tombstones the default migration path, this UX gap becomes more visible. Users cleaning up their database shouldn't need to know about a separate `bd compact` command.\n\n## Proposed Solution\n\nCall `pruneExpiredTombstones()` at the end of the cleanup command (same function used by compact). Report results:\n\n```\n✓ Deleted 15 closed issue(s)\n✓ Pruned 3 expired tombstone(s) (older than 30 days)\n```\n\n## Files to Modify\n\n- `cmd/bd/cleanup.go` - Add call to pruneExpiredTombstones after deleteBatch\n- May need to move pruneExpiredTombstones to shared location if not already accessible\n\n## Acceptance Criteria\n\n- [ ] `bd cleanup --force` prunes expired tombstones after deleting closed issues\n- [ ] `bd cleanup --dry-run` shows what tombstones would be pruned\n- [ ] JSON output includes tombstone prune results","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-13T23:49:35.963356-08:00","updated_at":"2025-12-16T02:19:57.237989-08:00","closed_at":"2025-12-14T17:29:50.073906-08:00"} {"id":"bd-h6bo","title":"Protos should have distinct prefix (e.g., proto-)","description":"Currently protos use the same bd- prefix as regular issues, making them visually indistinguishable. When you see bd-7bs4 it looks like work to squash, not a reusable template.\n\n**Problem:**\n- Protos look like regular issues\n- No visual signal that something is a template vs active work\n- Easy to accidentally close/modify protos thinking they're issues\n\n**Proposed Solution:**\n- Protos should have their own prefix (e.g., `proto-`, `mol-`, or `tpl-`)\n- Could be a separate database/storage for the proto library\n- Or a convention where proto IDs are generated differently\n\n**Alternatives:**\n1. Separate proto database with `proto-` prefix\n2. Special ID format for protos (e.g., `bd:proto:release`)\n3. Visual indicator in bd list/show output (already have labels, but not enough)\n\n**Current workaround:** Label with `template` and `molecule`, but IDs still look like regular issues.","status":"tombstone","priority":2,"issue_type":"feature","created_at":"2025-12-24T16:30:28.677791-08:00","updated_at":"2025-12-24T16:45:24.862627-08:00","deleted_at":"2025-12-24T16:45:24.862627-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"feature"} +{"id":"bd-h7k89","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T13:52:16.325362-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T13:52:16.360347-08:00","closed_at":"2026-01-09T13:52:16.360347-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-h7vij","title":"test","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T19:26:12.092181-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-10T19:27:06.374364-08:00","closed_at":"2026-01-10T19:27:06.374364-08:00","close_reason":"Closed"} {"id":"bd-h807","title":"Cross-project dependency support","description":"Enable tracking dependencies across project boundaries.\n\n## Mechanism\n- Producer: `bd ship \u003ccapability\u003e` adds `provides:\u003ccapability\u003e` label\n- Consumer: `blocked_by: external:\u003cproject\u003e:\u003ccapability\u003e`\n- Resolution: `bd ready` checks external deps via config\n\n## Design Doc\nSee: gastown/docs/cross-project-deps.md\n\n## Children\n- bd-eijl: bd ship command\n- bd-om4a: external: prefix in blocked_by\n- bd-66w1: external_projects config\n- bd-zmmy: bd ready resolution","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-21T22:38:01.116241-08:00","updated_at":"2025-12-22T00:02:09.271076-08:00","closed_at":"2025-12-22T00:02:09.271076-08:00"} {"id":"bd-h8q","title":"Add tests for validation functions","description":"Validation functions like ParseIssueType have 0% coverage. These are critical for ensuring data quality and preventing invalid data from entering the system.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-18T07:01:02.843488344-07:00","updated_at":"2025-12-18T07:03:53.561016965-07:00","closed_at":"2025-12-18T07:03:53.561016965-07:00","dependencies":[{"issue_id":"bd-h8q","depends_on_id":"bd-6ss","type":"discovered-from","created_at":"2025-12-18T07:01:02.846419747-07:00","created_by":"matt"}]} @@ -1109,6 +1170,9 @@ {"id":"bd-hcppl","title":"Merge: ruby-mk905whv","description":"branch: polecat/ruby-mk905whv\ntarget: main\nsource_issue: ruby-mk905whv\nrig: beads\nagent_bead: bd-beads-polecat-ruby\nretry_count: 0\nlast_conflict_sha: null\nconflict_task_id: null","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T21:03:04.892148-08:00","created_by":"beads/polecats/ruby","updated_at":"2026-01-10T22:05:21.848032-08:00","closed_at":"2026-01-10T22:05:21.848032-08:00","close_reason":"Changes already on main (patch dropped during rebase)","labels":["gt:merge-request"]} {"id":"bd-hdt","title":"Implement auto-merge functionality in duplicates command","description":"The duplicates.go file has a TODO at line 95 to implement the performMerge function for automatic duplicate merging. Currently it just prints a warning message. This would automate the merge process instead of just suggesting commands.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-21T18:55:02.828619-05:00","updated_at":"2025-12-09T18:38:37.693818772-05:00","closed_at":"2025-11-27T22:36:11.517878-08:00"} {"id":"bd-hfyz","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T01:09:26.199301-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-07T01:09:26.233806-08:00","closed_at":"2026-01-07T01:09:26.233806-08:00","close_reason":"auto-closed session event"} +{"id":"bd-hg867","title":"Session ended: gt-beads-crew-emma","status":"open","priority":2,"issue_type":"event","created_at":"2026-01-10T12:16:52.908216-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-10T12:16:52.908216-08:00","ephemeral":true} +{"id":"bd-hgswd","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T21:16:20.67497-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T21:16:20.709134-08:00","closed_at":"2026-01-09T21:16:20.709134-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} +{"id":"bd-hhjqr","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T14:04:31.381615-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T14:04:31.420548-08:00","closed_at":"2026-01-09T14:04:31.420548-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-hhv3","title":"Test and document molecular chemistry commands","description":"## Context\n\nImplemented the molecular chemistry UX commands per the design docs:\n- gastown/mayor/rig/docs/molecular-chemistry.md\n- gastown/mayor/rig/docs/chemistry-design-changes.md\n\nCommit: cadf798b\n\n## New Commands to Test\n\n| Command | Purpose |\n|---------|---------|\n| `bd pour \u003cproto\u003e` | Instantiate proto as persistent mol |\n| `bd wisp create \u003cproto\u003e` | Instantiate proto as ephemeral wisp |\n| `bd hook [--agent]` | Inspect what's on an agent's hook |\n\n## Enhanced Commands to Test\n\n| Command | Changes |\n|---------|---------|\n| `bd mol spawn --pour` | New flag, `--persistent` deprecated |\n| `bd mol bond --pour` | Force liquid phase on wisp target |\n| `bd pin --for \u003cagent\u003e --start` | Chemistry workflow support |\n\n## Test Scenarios\n\n1. **bd pour**: Create persistent mol from a proto\n - Verify creates in .beads/ (not .beads-wisp/)\n - Verify variable substitution works\n - Verify --dry-run works\n\n2. **bd wisp create**: Create ephemeral wisp from proto\n - Verify creates in .beads-wisp/\n - Verify bd wisp list shows it\n - Verify bd mol squash works\n - Verify bd mol burn works\n\n3. **bd hook**: Inspect pinned work\n - Pin something, verify bd hook shows it\n - Test --agent flag\n - Test --json output\n\n4. **bd pin --for**: Assign work to agent\n - Verify sets pinned=true\n - Verify sets assignee\n - Verify --start sets status=in_progress\n\n5. **bd mol bond --pour**: Force liquid on wisp target\n - Bond a proto to a wisp with --pour\n - Verify spawned issues are in .beads/\n\n## Documentation\n\n- Update CLAUDE.md with new commands\n- Add examples to --help output (already done)\n- Consider adding to docs/CLI_REFERENCE.md\n\n## Code Review\n\n- Check for edge cases\n- Verify error messages are helpful\n- Ensure --json output is consistent","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-22T02:22:10.906646-08:00","updated_at":"2025-12-22T02:55:37.983703-08:00","closed_at":"2025-12-22T02:55:37.983703-08:00"} {"id":"bd-hj0s","title":"Add 'convoy' issue type with reactive completion","description":"Add convoy as a new issue type with reactive completion semantics.\n\nBehavior:\n- Convoy has list of tracked issues (via 'tracks' relation)\n- When all tracked issues close (including wontfix), convoy auto-closes\n- Supports cross-prefix tracking (convoy in hq-* tracks gt-*, bd-*)\n\nImplementation:\n- New type: convoy\n- Reactive completion trigger on tracked issue closure\n- Query support: 'bd list --type=convoy'\n\nRelated: hq-7h8jx (Convoy System epic in town beads)","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-29T18:47:02.011011-08:00","created_by":"mayor","updated_at":"2025-12-30T15:44:43.361813-08:00","closed_at":"2025-12-30T00:05:13.515078-08:00","close_reason":"Implemented convoy type with reactive completion","dependencies":[{"issue_id":"bd-hj0s","depends_on_id":"bd-3roq","type":"blocks","created_at":"2025-12-29T18:47:10.59211-08:00","created_by":"daemon"}]} {"id":"bd-hkr6","title":"GH#518: Document bd setup command","description":"bd setup is undiscoverable. Add to README/docs. Currently only findable by grepping source. See GitHub issue #518.","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-16T01:03:54.664668-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} @@ -1120,6 +1184,7 @@ {"id":"bd-hlyr","title":"Merge: bd-m8ro","description":"branch: polecat/max\ntarget: main\nsource_issue: bd-m8ro\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-23T20:45:40.218445-08:00","updated_at":"2025-12-23T21:21:57.69886-08:00","closed_at":"2025-12-23T21:21:57.69886-08:00"} {"id":"bd-hmeb","title":"bd slot set doesn't support cross-beads prefix routing","description":"## Problem\n\n`bd slot set` fails when setting a slot to a bead that lives in a different beads database (cross-db routing).\n\n## Evidence\n\nWhen spawning a polecat:\n```\nWarning: could not set role slot: bd slot set gt-gastown-polecat-chumbucket role hq-polecat-role: \nError: failed to resolve bead hq-polecat-role: no issue found matching \"hq-polecat-role\"\n```\n\nThe agent bead `gt-gastown-polecat-chumbucket` is in rig beads (`gastown/mayor/rig/.beads/`).\nThe role bead `hq-polecat-role` is in town beads (`~/gt/.beads/`).\n\n`bd show hq-polecat-role` works fine (uses prefix routing via routes.jsonl).\n`bd slot set ... hq-polecat-role` fails (does not use routing).\n\n## Root Cause\n\n`bd slot set` resolves the target bead in the current database only, ignoring the `hq-` prefix that should route to town beads.\n\n## Expected Behavior\n\n`bd slot set \u003cagent\u003e \u003cslot\u003e \u003cbead\u003e` should:\n1. Check if `\u003cbead\u003e` has a routable prefix (e.g., `hq-`, `gt-`, `bd-`)\n2. If so, resolve it via routes.jsonl like `bd show` does\n3. Store the bead reference (cross-db references are valid for slots)\n\n## Workaround\n\nCurrently the warning is non-fatal - the role slot just is not set. But this breaks role-based queries.\n\n## Files\n\n- `cmd/slot.go` - slot set command implementation\n- Need to add routing logic similar to `cmd/show.go`","status":"closed","priority":1,"issue_type":"bug","assignee":"beads/polecats/garnet","created_at":"2026-01-04T15:12:40.230597-08:00","created_by":"mayor","updated_at":"2026-01-04T15:16:19.493134-08:00","closed_at":"2026-01-04T15:16:19.493134-08:00","close_reason":"Added prefix routing to bd slot set command. Now uses needsRouting() and resolveAndGetIssueWithRouting() to handle cross-beads references like hq-* from rig beads."} {"id":"bd-hnkg","title":"GH#540: Add silent quick-capture mode (bd q)","description":"Add bd q alias for quick capture that outputs only issue ID. Useful for piping/scripting. See GitHub issue #540.","status":"tombstone","priority":2,"issue_type":"feature","created_at":"2025-12-16T01:03:38.260135-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature"} +{"id":"bd-hnnig","title":"Session ended: gt-beads-crew-wolf","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T13:53:21.121124-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-09T13:53:21.169378-08:00","closed_at":"2026-01-09T13:53:21.169378-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-hnw8j","title":"gt prime: add tests for --dry-run, --state, --explain flags","description":"The new observability flags have no test coverage:\n\n1. --dry-run: Test that side effects are skipped (marker not removed, bd prime not called)\n2. --state: Test state detection for each state (normal, post-handoff, crash-recovery, autonomous)\n3. --explain: Test that [EXPLAIN] tags are added when flag is set\n\nKey functions to test:\n- detectSessionState()\n- outputState()\n- checkHandoffMarkerDryRun()\n- explain()\n\nLocation: gastown/mayor/rig/internal/cmd/prime.go, needs prime_test.go additions","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-10T00:46:27.973422-08:00","created_by":"mayor","updated_at":"2026-01-10T17:19:11.081255-08:00"} {"id":"bd-ho5","title":"Add 'town report' command for aggregated swarm status","description":"## Problem\nGetting a full swarm status requires running 6+ commands:\n- `town list \u003crig\u003e` for each rig\n- `town mail inbox` as Boss\n- `bd list --status=open/in_progress` per rig\n\nThis is slow and error-prone for both humans and agents.\n\n## Proposed Solution\nAdd `town report [RIG]` command that aggregates:\n- All rigs with polecat states (running/stopped, awake/asleep)\n- Boss inbox summary (unread count, recent senders)\n- Aggregate issue counts per rig (open/in_progress/blocked)\n\nExample output:\n```\n=== beads ===\nPolecats: 5 (5 running, 0 stopped)\nIssues: 20 open, 0 in_progress, 0 blocked\n\n=== gastown ===\nPolecats: 6 (4 running, 2 stopped)\nIssues: 0 open, 0 in_progress, 0 blocked\n\n=== Boss Mail ===\nUnread: 10 | Total: 22\nRecent: rictus (21:19), scrotus (21:14), immortanjoe (21:14)\n```\n\n## Acceptance Criteria\n- [ ] `town report` shows all rigs\n- [ ] `town report \u003crig\u003e` shows single rig detail\n- [ ] Output is concise and scannable\n- [ ] Completes in \u003c2 seconds","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-27T22:55:36.8919-08:00","updated_at":"2025-11-27T22:56:08.071838-08:00","closed_at":"2025-11-27T22:56:08.071838-08:00"} {"id":"bd-hobo","title":"Distinct prefixes for protos, molecules, wisps","description":"Template/workflow entities should have visually distinct prefixes from regular issues.\n\n**Problem:**\n- Protos (bd-7bs4) look like regular issues - invites squashing\n- Molecules (poured instances) also use bd- prefix\n- Wisps are in separate DB but still use bd- when referenced\n\n**Proposed Prefixes:**\n- `proto-` for templates (e.g., proto-release, proto-review)\n- `mol-` for active molecules (poured from protos)\n- `wisp-` for ephemeral wisps (vapor phase)\n\n**Benefits:**\n- Instant visual recognition of entity type\n- Prevents accidental modification of templates\n- Clear lifecycle: proto → mol → wisp → digest\n\n**Implementation options:**\n1. Separate databases with different prefixes\n2. Issue type determines prefix generation\n3. Naming convention enforced by bd pour/wisp commands","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-24T16:45:24.940809-08:00","updated_at":"2025-12-25T02:04:52.459233-08:00","closed_at":"2025-12-25T02:04:52.459233-08:00","labels":["workflow"]} @@ -1147,8 +1212,10 @@ {"id":"bd-i3ed","title":"Refactor bd setup to recipe-based architecture (GH#898)","description":"## Summary\n\nReplace tool-specific setup commands (cursor, claude, etc.) with a generic recipe-based system. New tools become config entries, not code changes.\n\n## Motivation\n\nGH#898 requests Kilo Code integration. Current approach requires new Go code for each tool:\n- `cmd/bd/setup/cursor.go`\n- `cmd/bd/setup/kilocode.go` (proposed)\n- `cmd/bd/setup/windsurf.go` (future?)\n- ...\n\nThis does not scale. All these integrations do the same thing:\n1. Generate markdown content (beads workflow instructions)\n2. Write to tool-specific path\n\nThe **content** is identical. Only the **destination path** varies.\n\n## Design\n\n### Core Insight\n\nBeads does not need to know anything about Kilo Code, Cursor, or Claude Code beyond where they read their rules files. That is a path mapping—data, not code.\n\n### Recipe Format\n\n```toml\n# .beads/recipes.toml (user additions/overrides)\n[cursor]\npath = \".cursor/rules/bd.md\"\n\n[claude]\npath = \"CLAUDE.md\"\n\n[kilocode]\npath = \".kilocode/rules/bd.md\"\n\n[my-custom-editor]\npath = \".myeditor/config/bd.md\"\n```\n\n### Built-in Defaults\n\nShip sensible defaults compiled into binary:\n- cursor → `.cursor/rules/bd.md`\n- claude → `CLAUDE.md`\n- windsurf → `.windsurf/rules/bd.md`\n- cody → `.cody/rules/bd.md` (verify path)\n\nUser file overrides/extends built-in defaults.\n\n### Commands\n\n| Command | Description |\n|---------|-------------|\n| `bd setup \u003crecipe\u003e` | Write template to recipe path |\n| `bd setup --list` | Show available recipes (built-in + user) |\n| `bd setup --print` | Dump template to stdout |\n| `bd setup -o \u003cpath\u003e` | Write to arbitrary path (escape hatch) |\n| `bd setup \u003crecipe\u003e --check` | Verify if installed |\n| `bd setup \u003crecipe\u003e --remove` | Delete the file |\n| `bd setup --add \u003cname\u003e \u003cpath\u003e` | Save custom recipe |\n\n### Template\n\nSingle markdown template embedded in binary. Contains:\n- What beads is\n- Key commands (`bd ready`, `bd create`, `bd close`, etc.)\n- Workflow guidance\n- JSON flags for programmatic use\n\n### Implementation Plan\n\n1. Add `--print` and `-o` flags to existing setup command\n2. Create `internal/recipes/` package\n - Built-in recipes (Go map or embed)\n - Load/merge user `.beads/recipes.toml`\n3. Refactor `cmd/bd/setup/setup.go` to use recipes\n4. Remove tool-specific files (`cursor.go`, etc.)\n5. Add `--add` command to save custom recipes\n6. Update documentation\n\n### Migration\n\nExisting `bd setup cursor` continues to work—just backed by recipe lookup instead of dedicated code.\n\n## Out of Scope (for now)\n\n- `--global` flag (user-level config paths) — use `-o` escape hatch\n- `mode: append` (add to existing file) — wait until requested\n- GitHub recipe registry — overkill for path mappings\n- TOML migration for config.yaml — separate initiative\n\n## Response to GH#898\n\nOnce implemented, respond to PR:\n\n\u003e Thanks for the contribution! We are refactoring `bd setup` to a recipe-based approach where new tools are config entries, not code changes.\n\u003e\n\u003e Instead of new Go files, please submit a PR adding Kilo Code to the built-in recipes in `internal/recipes/builtin.go` (or equivalent). Happy to help if you have questions!\n\n## References\n\n- GH#898: Kilo Code integration request\n- Current setup code: `cmd/bd/setup/`\n","status":"closed","priority":1,"issue_type":"feature","created_at":"2026-01-04T20:05:44.32166-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-04T21:57:21.225792-08:00","closed_at":"2026-01-04T21:57:21.225792-08:00","close_reason":"Implemented recipe-based architecture for bd setup"} {"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-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-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"} {"id":"bd-i8zab","title":"Batch wisp deletion in deleteSessionCostWisps","description":"## Problem\n\n`deleteSessionCostWisps()` (internal/cmd/costs.go:1188) burns wisps one at a time in a loop. This creates O(n) subprocess calls for deletion.\n\n## Location\n\ninternal/cmd/costs.go:1143-1191\n\n## Solution\n\nCheck if `bd mol burn` supports multiple IDs. If so, collect IDs and burn in one call.\nIf not, consider adding batch support to bd.","status":"closed","priority":3,"issue_type":"task","assignee":"beads/polecats/quartz","created_at":"2026-01-08T22:55:15.514066-08:00","created_by":"mayor","updated_at":"2026-01-09T00:25:53.94924-08:00","closed_at":"2026-01-09T00:25:53.94924-08:00","close_reason":"Implemented batch wisp deletion in bd mol burn and updated deleteSessionCostWisps to use it"} +{"id":"bd-i9oqv","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T00:47:28.905293-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-10T00:47:28.946953-08:00","closed_at":"2026-01-10T00:47:28.946953-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-ia3g","title":"BondRef.ProtoID field name is misleading for mol+mol bonds","description":"In bondMolMol, the BondRef.ProtoID field is used to store molecule IDs:\n\n```go\nBondedFrom: append(molA.BondedFrom, types.BondRef{\n ProtoID: molB.ID, // This is a molecule, not a proto\n ...\n})\n```\n\nThis is semantically confusing since ProtoID suggests it should only hold proto references.\n\n**Options:**\n1. Rename ProtoID to SourceID (breaking change, needs migration)\n2. Add documentation clarifying ProtoID can hold molecule IDs in bond context\n3. Leave as-is, accept the naming is imprecise\n\nLow priority since it's just naming, not functionality.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T10:23:00.755067-08:00","updated_at":"2025-12-30T15:44:43.355533-08:00","closed_at":"2025-12-30T00:40:56.399444-08:00","close_reason":"Merged via refinery"} {"id":"bd-ibl9","title":"Merge: bd-4qfb","description":"branch: polecat/Polish\ntarget: main\nsource_issue: bd-4qfb\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-23T13:37:57.255125-08:00","updated_at":"2025-12-23T19:12:08.352249-08:00","closed_at":"2025-12-23T19:12:08.352249-08:00"} {"id":"bd-ic1m","title":"Benchmark git traffic reduction","description":"Automated benchmark comparing git operations with/without Agent Mail.\n\nAcceptance Criteria:\n- Script that processes 50 issues\n- Counts git operations (pull, commit, push)\n- Generates comparison report\n- Verifies ≥70% reduction\n- Fails if regression detected\n\nFile: tests/benchmarks/git_traffic.py\n\nOutput: Without Agent Mail: 450 git operations, With Agent Mail: 135 git operations, Reduction: 70%","notes":"Implemented automated benchmark script with following features:\n- Processes configurable number of issues (default 50)\n- Compares git operations in two modes: git-only vs Agent Mail\n- Generates detailed comparison report with statistics\n- Exit code reflects pass/fail based on 70% reduction target\n- Results: 98.5% reduction (200 ops → 3 ops) for 50 issues\n\nFiles created:\n- tests/benchmarks/git_traffic.py (main benchmark script)\n- tests/benchmarks/README.md (documentation)\n- tests/benchmarks/git_traffic_50_issues.md (sample results)\n\nThe benchmark vastly exceeds the 70% target, showing 98.5% reduction.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-07T22:43:21.486095-08:00","updated_at":"2025-11-08T02:08:19.648473-08:00","closed_at":"2025-11-08T02:08:19.648473-08:00","dependencies":[{"issue_id":"bd-ic1m","depends_on_id":"bd-fzbg","type":"blocks","created_at":"2025-11-07T22:43:21.486966-08:00","created_by":"daemon"},{"issue_id":"bd-ic1m","depends_on_id":"bd-nemp","type":"blocks","created_at":"2025-11-07T22:43:21.487388-08:00","created_by":"daemon"}]} @@ -1210,6 +1277,7 @@ {"id":"bd-jple","title":"Fix cross-worktree sync losing status changes (GH#865)","description":"Left snapshot protection during sync ignores timestamps, causing newer remote changes to be skipped. Need to make protection timestamp-aware: only protect if local is newer than incoming. See issue for detailed analysis and fix options.","status":"closed","priority":1,"issue_type":"bug","assignee":"beads/crew/emma","created_at":"2026-01-03T13:12:54.354717-08:00","created_by":"beads/crew/grip","updated_at":"2026-01-03T13:27:47.682508-08:00","closed_at":"2026-01-03T13:27:47.682508-08:00","close_reason":"Fixed with timestamp-aware snapshot protection"} {"id":"bd-jposm","title":"Session ended: gt-beads-crew-dave","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T21:38:28.342577-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-09T21:15:40.691248-08:00","closed_at":"2026-01-09T21:15:40.691248-08:00","close_reason":"Stale session ended events"} {"id":"bd-jpu9","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T00:28:55.97548-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-07T00:28:56.00767-08:00","closed_at":"2026-01-07T00:28:56.00767-08:00","close_reason":"auto-closed session event"} +{"id":"bd-jrb0u","title":"Session ended: gt-beads-crew-fang","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T13:50:35.133209-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-09T13:50:35.172964-08:00","closed_at":"2026-01-09T13:50:35.172964-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-jsk7","title":"Agent beads: structured labels for filtering","description":"## Agent Beads Need Queryable Labels\n\nCurrently agent beads have role_type/rig in description text, not as labels. This breaks @group resolution in gt mail.\n\n## Current State\n```json\n{\n \"id\": \"gt-gastown-witness\",\n \"issue_type\": \"agent\",\n \"description\": \"...\\\\nrole_type: witness\\\\nrig: gastown\\\\n...\"\n}\n```\n\nCannot query: `bd list --type=agent --label=role_type:witness` returns nothing.\n\n## Required\nAgent bead creation should add labels:\n- `role_type:\u003ctype\u003e` (witness, refinery, crew, polecat, dog, mayor, deacon)\n- `rig:\u003crig\u003e` (gastown, beads, or \"town\" for town-level)\n\n## Where to Fix\ngt polecat/crew/agent creation commands should add labels.\n\n## Acceptance\n- New agent beads created with role_type/rig labels\n- @group patterns work in gt mail router","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-29T20:49:13.444793-08:00","created_by":"gastown/crew/joe","updated_at":"2025-12-29T20:58:04.67866-08:00","closed_at":"2025-12-29T20:58:04.67866-08:00","close_reason":"Duplicate of bd-g7eq"} {"id":"bd-jv4w","title":"Phase 1.2: Separate bdt executable - Initial structure","description":"Create minimal bdt command structure completely separate from bd. Must not share code, config, or database.\n\n## Subtasks\n1. Create cmd/bdt/ directory with main.go\n2. Implement bdt version, help, and status commands\n3. Configure separate database location: $HOME/.bdt/ (not $HOME/.beads/)\n4. Create separate issues file: issues.toon (not issues.jsonl)\n5. Update build system:\n - Makefile: Add bdt target\n - .goreleaser.yml: Add bdt binary config\n\n## Files to Create\n- cmd/bdt/main.go - Entry point\n- cmd/bdt/version.go - Version handling\n- cmd/bdt/help.go - Help text (separate from bd)\n\n## Success Criteria\n- `make build` produces both `bd` and `bdt` executables\n- `bdt version` shows distinct version output from bd\n- `bdt --help` shows distinct help text\n- bdt uses $HOME/.bdt/ directory (verify with `bdt info`)\n- bd and bdt completely isolated (no shared imports beyond stdlib)","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T11:48:34.866877282-07:00","updated_at":"2025-12-19T12:59:11.389296015-07:00","closed_at":"2025-12-19T12:59:11.389296015-07:00"} {"id":"bd-jvkt5","title":"Digest: mol-refinery-patrol","description":"Patrol cycle: queue empty, 0 branches merged, no issues","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T20:14:38.287395-08:00","updated_at":"2026-01-10T20:14:38.287395-08:00","closed_at":"2026-01-10T20:14:38.287363-08:00","close_reason":"Squashed from 11 wisps","dependencies":[{"issue_id":"bd-jvkt5","depends_on_id":"bd-wisp-d7b","type":"parent-child","created_at":"2026-01-10T20:14:38.288235-08:00","created_by":"beads/refinery"}]} @@ -1223,7 +1291,9 @@ {"id":"bd-k4b","title":"Enhance dep tree to show full dependency graph","description":"When running `bd dep tree \u003cissue-id\u003e`, the current output only shows the issue itself without its dependency relationships.\n\n## Current Behavior\n\n```\n$ bd dep tree gt-0iqq\n🌲 Dependency tree for gt-0iqq:\n\n→ gt-0iqq: Implement Boss (global overseer) [P2] (open)\n```\n\nThis doesn't show any of the dependency structure.\n\n## Desired Behavior\n\nShow the full dependency DAG rooted at the given issue. For example:\n\n```\n$ bd dep tree gt-0iqq\n🌲 Dependency tree for gt-0iqq:\n\ngt-0iqq: Implement Boss (global overseer) [P2] (open)\n├── gt-0xh4: Boss session management [P2] (open) [READY]\n│ ├── gt-le7c: Boss mail identity [P2] (open)\n│ │ ├── gt-r8fe: Boss human escalation queue [P2] (open)\n│ │ └── gt-vdak: Boss dispatch loop [P2] (open)\n│ │ └── gt-kgy6: Boss resource management [P2] (open)\n│ │ └── gt-93iv: Boss wake daemon [P2] (open)\n│ └── gt-vdak: (shown above)\n```\n\n## Suggested Options\n\n- `--direction=down|up|both` - Show dependents (what this blocks), dependencies (what blocks this), or both\n- `--status=open` - Filter to only show issues with a given status\n- `--depth=N` - Limit tree depth\n- Handle DAG cycles gracefully (show \"(shown above)\" or similar for already-displayed nodes)\n\n## Use Case\n\nWhen reorganizing a set of related issues (like I just did with the Boss implementation), being able to visualize the full dependency graph helps verify the structure is correct before syncing.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-25T19:18:18.750649-08:00","updated_at":"2025-11-25T19:50:46.863319-08:00","closed_at":"2025-11-25T19:31:55.312314-08:00"} {"id":"bd-k4ww","title":"Merge: pearl-mjtmd27a","description":"branch: polecat/pearl-mjtmd27a\ntarget: main\nsource_issue: pearl-mjtmd27a\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T22:16:38.232474-08:00","created_by":"beads/polecats/pearl","updated_at":"2026-01-01T10:43:18.623861-08:00","closed_at":"2026-01-01T10:43:18.623861-08:00","close_reason":"Stale MR - branch no longer exists on remote"} {"id":"bd-k58","title":"Proposal workflow (propose/withdraw/accept)","description":"Implement commands and state machine for moving issues between personal planning repos and canonical upstream repos, enabling contributors to propose work without polluting PRs.","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-04T11:21:41.113647-08:00","updated_at":"2025-11-05T00:08:42.814698-08:00","closed_at":"2025-11-05T00:08:42.814699-08:00","dependencies":[{"issue_id":"bd-k58","depends_on_id":"bd-4ms","type":"parent-child","created_at":"2025-11-04T11:22:21.811261-08:00","created_by":"daemon"}]} +{"id":"bd-k6by7","title":"Session ended: gt-beads-crew-fang","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T13:52:51.593185-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-09T13:52:51.631065-08:00","closed_at":"2026-01-09T13:52:51.631065-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-k92d","title":"Critical: Beads deletes issues during sync (GH#464)","description":"# Findings\n\n## Root Cause 1: git-history-backfill deletes issues during repo ID mismatch\n\n**Location:** internal/importer/importer.go, purgeDeletedIssues()\n\nThe git-history-backfill mechanism checks git history to find deleted issues. When there's a repo ID mismatch (e.g., database from a different clone or after remote URL change), this can incorrectly treat local issues as deleted because they don't exist in the remote's git history.\n\n**Fix Applied:** Added safety guard at lines 971-987 in importer.go that:\n- Checks issue status before deletion via git-history-backfill\n- Prevents deletion of open/in_progress issues\n- Provides clear warning with actionable steps\n- Suggests using --no-git-history flag or bd delete for explicit deletion\n\n## Root Cause 2: Daemon sync race condition overwrites local unpushed changes\n\n**Location:** cmd/bd/daemon_sync.go, performAutoImport()\n\nThe daemon sync's auto-import function pulls from remote without checking for uncommitted local changes. This can overwrite local work that hasn't been pushed yet.\n\n**Fix Applied:** Added warning at lines 565-575 in daemon_sync.go that:\n- Checks for uncommitted changes before pulling\n- Warns user about potential overwrite\n- Suggests running 'bd sync' to commit/push first\n- Continues with pull but user is informed\n\n## Additional Safety Improvements\n\n1. Enhanced repo ID mismatch error message (daemon_sync.go:362-371)\n - Added warning about deletion risk\n - Clarified that mismatch can cause incorrect deletions\n\n2. Safety guard in deletions manifest processing (importer.go:886-902)\n - Prevents deletion of open/in_progress issues in deletions.jsonl\n - Provides diagnostic information\n - Suggests recovery options\n\n3. Updated tests (purge_test.go)\n - Changed test to use closed issue (safe to delete)\n - Verifies safety guard works correctly\n\n## Testing\n\nAll tests pass:\n- go test ./internal/importer/... ✓\n- go build ./cmd/bd/ ✓\n\nThe safety guards now prevent both root causes from deleting active work.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-12-14T23:00:19.36203-08:00","updated_at":"2025-12-14T23:07:43.311616-08:00","closed_at":"2025-12-14T23:07:43.311616-08:00"} +{"id":"bd-k9f1t","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T14:27:04.672799-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T14:27:04.71014-08:00","closed_at":"2026-01-09T14:27:04.71014-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-ka761","title":"Gate-based async molecule resume","description":"## Summary\n\nRefactor molecule execution to use gates for async coordination, eliminating spin-wait\nanti-patterns. When a polecat hits a gate step, it exits cleanly. The Deacon patrol\ndiscovers molecules with resolved gates and dispatches new polecats to continue.\n\n## Motivation\n\nThe beads-release formula has a `wait-ci` step that tells agents to poll GitHub Actions\nfor 5-10 minutes. This is wasteful and unreliable. We have gate infrastructure in beads\nbut no integration with molecule execution flow.\n\nDave ran a version bump to 0.46.0 without the release molecule - exactly because agents\ndon't know all the steps when there's no enforced workflow with proper async handling.\n\n## Design\n\n### Gate Steps in Formula Schema\n\n```toml\n[[steps]]\nid = \"wait-ci\"\ngate = \"gh:run\"\ngate_hint = \"release.yml\"\ntimeout = \"30m\"\n```\n\n### Flow\n\n1. `bd mol cook` creates gate beads for gate steps\n2. Polecat reaches gate step → checks if gate closed\n3. If open → `gt done --phase-complete --gate \u003cid\u003e` and exit\n4. Deacon patrol runs `bd gate check` → closes resolved gates\n5. Deacon discovers molecules with closed gates → slings to polecats\n6. New polecat continues from gate step\n\n### Key Principle\n\nDiscovery-based resume, not waiter-based. The molecule state IS the waiter.\nPatrol discovers reality each cycle. Nondeterministic idempotence.\n\n## Components\n\n- **Beads**: Formula parser, mol cook, mol ready --gated\n- **Gas Town**: Deacon patrol step for molecule dispatch\n- **Release formula**: Refactor to use gate step\n\n## References\n\n- Gate infrastructure: cmd/bd/gate.go\n- Current release formula: formulas/beads-release.formula.toml\n- Deacon patrol: mol-deacon-patrol.formula.toml","status":"closed","priority":1,"issue_type":"epic","assignee":"beads/crew/dave","created_at":"2026-01-08T20:53:10.34329-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-08T23:04:08.671651-08:00","closed_at":"2026-01-08T23:04:08.671653-08:00","close_reason":"All 5 child tasks completed: formula parser recognizes gate fields, mol cook creates gate beads, mol ready --gated finds gate-ready molecules, Deacon patrol dispatches them, and beads-release formula refactored to use gate steps"} {"id":"bd-kazt","title":"Add tests for 3-way merge scenarios","description":"Comprehensive test coverage for merge logic.\n\n**Test cases**:\n- Simple field updates (left vs right)\n- Dependency merging (union + dedup)\n- Timestamp handling (max wins)\n- Deletion detection (deleted in one, modified in other)\n- Conflict generation (incompatible changes)\n- Issue resurrection prevention (bd-hv01 regression test)\n\n**Files**:\n- `internal/merge/merge_test.go`\n- `cmd/bd/merge_test.go`","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-05T18:42:20.472275-08:00","updated_at":"2025-11-06T15:52:41.863426-08:00","closed_at":"2025-11-06T15:52:41.863426-08:00","dependencies":[{"issue_id":"bd-kazt","depends_on_id":"bd-qqvw","type":"parent-child","created_at":"2025-11-05T18:42:28.740517-08:00","created_by":"daemon"},{"issue_id":"bd-kazt","depends_on_id":"bd-oif6","type":"blocks","created_at":"2025-11-05T18:42:35.469582-08:00","created_by":"daemon"}]} {"id":"bd-kb4g","title":"TestHooksCheckGitHooks failing - version mismatch (0.23.0 vs 0.23.1)","description":"The test is checking embedded hook versions and expecting 0.23.1, but got 0.23.0. This appears to be a version consistency issue that needs investigation.\n\nTest output:\n```\nHook pre-commit version mismatch: got 0.23.0, want 0.23.1\nHook post-merge version mismatch: got 0.23.0, want 0.23.1\nHook pre-push version mismatch: got 0.23.0, want 0.23.1\n```\n\nThis is blocking the landing of GH #274 fix.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-09T14:13:14.138537-08:00","updated_at":"2025-11-20T18:54:56.496852-05:00","closed_at":"2025-11-10T10:46:09.94181-08:00"} @@ -1237,6 +1307,8 @@ {"id":"bd-kff0","title":"Integrate detect-pollution into bd doctor","description":"## Task\nMove `bd detect-pollution` → `bd doctor --check=pollution`\n\n## Current state\n- detect-pollution already shows deprecation hint pointing to doctor\n- Doctor command exists with multiple checks\n\n## Implementation\n\n### 1. Update doctor.go\n- Add pollution check to the doctor checks\n- Add `--check=pollution` flag option\n- Integrate detect-pollution logic\n\n### 2. Update detect_pollution.go\n- Mark as hidden (deprecated)\n- Forward to doctor --check=pollution\n- Keep for one release cycle\n\n### 3. Update docs\n- Remove detect-pollution from any command lists\n- Update doctor docs to include pollution check\n\n## Files to modify\n- cmd/bd/doctor.go\n- cmd/bd/detect_pollution.go\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-27T15:11:10.46326-08:00","created_by":"mayor","updated_at":"2025-12-27T16:04:58.471341-08:00","closed_at":"2025-12-27T16:04:58.471341-08:00"} {"id":"bd-kgjzm","title":"Daemon should cleanup /tmp/beads-* directories on shutdown","description":"Code review follow-up from GH#1001 fix.\n\nWhen using short socket paths (/tmp/beads-{hash}/bd.sock), the daemon creates directories in /tmp but doesn't clean them up on shutdown. These empty directories accumulate over time.\n\nThe CleanupSocketDir() function exists but isn't called from Server.Stop().\n\nShould:\n1. Call CleanupSocketDir() from server shutdown path\n2. Add integration test verifying cleanup happens\n\nRelated: GH#1001, commit 3ecffa11, bd-1vc13","status":"open","priority":3,"issue_type":"task","created_at":"2026-01-10T13:36:40.91827-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-10T13:36:40.91827-08:00"} {"id":"bd-khnb","title":"bd migrate --update-repo-id triggers auto-import that resurrects deleted issues","description":"**Bug:** Running `bd migrate --update-repo-id` can resurrect previously deleted issues from git history.\n\n## What Happened\n\nUser deleted 490 closed issues:\n- Deletion committed successfully (06d655a) with JSONL at 48 lines\n- Database had 48 issues after deletion\n- User ran `bd migrate --update-repo-id` to fix legacy database\n- Migration triggered daemon auto-import\n- JSONL had been restored to 538 issues (from commit 6cd3a32 - before deletion)\n- Auto-import loaded the old JSONL over the cleaned database\n- Result: 490 deleted issues resurrected\n\n## Root Cause\n\nThe auto-import logic in `cmd/bd/sync.go:130-136`:\n```go\nif isJSONLNewer(jsonlPath) {\n fmt.Println(\"→ JSONL is newer than database, importing first...\")\n if err := importFromJSONL(ctx, jsonlPath, renameOnImport); err != nil {\n```\n\nThis checks if JSONL mtime is newer than database and auto-imports. The problem:\n1. Git operations (pull, merge, checkout) can restore old JSONL files\n2. Restored file has recent mtime (time of git operation)\n3. Auto-import sees \"newer\" JSONL and imports it\n4. Old data overwrites current database state\n\n## Timeline\n\n- 19:59: Commit 6cd3a32 restored JSONL to 538 issues from d99222d\n- 20:22: Commit 3520321 (bd sync)\n- 20:23: Commit 06d655a deleted 490 issues → JSONL now 48 lines\n- 20:23: User ran `bd migrate --update-repo-id`\n- Migration completed, daemon started\n- Daemon saw JSONL (restored earlier to 538) was \"newer\" than database\n- Auto-import resurrected 490 deleted issues\n\n## Impact\n\n- **Critical data loss bug** - user deletions can be undone silently\n- Affects any workflow that uses git branches, merges, or checkouts\n- Auto-import has no safety checks against importing older data\n- Users have no warning that old data will overwrite current state\n\n## Fix Options\n\n1. **Content-based staleness** (not mtime-based)\n - Compare JSONL content hash vs database content hash\n - Only import if content actually changed\n - Prevents re-importing old data with new mtime\n\n2. **Database timestamp check**\n - Store \"last export timestamp\" in database metadata\n - Only import JSONL if it's newer than last export\n - Prevents importing old JSONL after git operations\n\n3. **User confirmation**\n - Before auto-import, show diff of what will change\n - Require confirmation for large changes (\u003e10% issues affected)\n - Safety valve for destructive imports\n\n4. **Explicit sync mode**\n - Disable auto-import entirely\n - Require explicit `bd sync` or `bd import` commands\n - Trade convenience for safety\n\n## Recommended Solution\n\nCombination of #1 and #2:\n- Add `last_export_timestamp` to database metadata\n- Check JSONL mtime \u003e last_export_timestamp before importing\n- Add content hash check as additional safety\n- Show warning if importing would delete \u003e10 issues\n\nThis preserves auto-import convenience while preventing data loss.\n\n## Files Involved\n\n- `cmd/bd/sync.go:130-136` - Auto-import logic\n- `cmd/bd/daemon_sync.go` - Daemon export/import cycle\n- `internal/autoimport/autoimport.go` - Staleness detection\n\n## Reproduction Steps\n\n1. Create and delete some issues, commit to git\n2. Checkout an earlier commit (before deletion)\n3. Checkout back to current commit\n4. JSONL file now has recent mtime but old content\n5. Run any bd command that triggers auto-import\n6. Deleted issues are resurrected","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-20T20:44:35.235807-05:00","updated_at":"2025-11-20T21:51:31.806158-05:00","closed_at":"2025-11-20T21:51:31.806158-05:00"} +{"id":"bd-khuvw","title":"Session ended: gt-beads-crew-dave","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T21:17:45.693085-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-09T21:17:45.72978-08:00","closed_at":"2026-01-09T21:17:45.72978-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} +{"id":"bd-khysc","title":"Session ended: gt-beads-crew-wolf","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T13:35:09.623532-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-10T13:35:09.659526-08:00","closed_at":"2026-01-10T13:35:09.659526-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-kjons","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T00:50:13.727347-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T00:50:13.762208-08:00","closed_at":"2026-01-09T00:50:13.762208-08:00","close_reason":"auto-closed session event"} {"id":"bd-kkka","title":"Dead code: fetchAndRebaseInWorktree() marked DEPRECATED but still exists","description":"attached_args: Remove dead code fetchAndRebaseInWorktree\n\nThe function fetchAndRebaseInWorktree() in internal/syncbranch/worktree.go (lines 811-830) is marked as DEPRECATED with a comment:\n\n```go\n// fetchAndRebaseInWorktree is DEPRECATED - kept for reference only.\n// Use contentMergeRecovery instead to avoid tombstone resurrection.\n```\n\nSince contentMergeRecovery() is the replacement and is being used, this dead code should be removed to reduce maintenance burden.\n\nLocation: internal/syncbranch/worktree.go:811-830","status":"closed","priority":3,"issue_type":"chore","created_at":"2025-12-28T15:32:21.97865-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T16:41:36.721496-08:00","closed_at":"2025-12-28T16:41:36.721496-08:00","dependencies":[{"issue_id":"bd-kkka","depends_on_id":"bd-784c","type":"parent-child","created_at":"2025-12-28T15:38:04.241483-08:00","created_by":"daemon"}]} {"id":"bd-kla1","title":"Add bd init --contributor wizard","description":"Interactive wizard for OSS contributor setup. Guides user through: fork workflow setup, separate planning repo configuration, auto-detection of fork relationships, examples of common OSS workflows.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-05T18:04:29.958409-08:00","updated_at":"2025-11-05T19:27:33.07529-08:00","closed_at":"2025-11-05T18:53:51.267625-08:00","dependencies":[{"issue_id":"bd-kla1","depends_on_id":"bd-8rd","type":"parent-child","created_at":"2025-11-05T18:04:39.120064-08:00","created_by":"daemon"}]} @@ -1247,6 +1319,7 @@ {"id":"bd-kpy","title":"Sync race: rebase-based divergence recovery resurrects tombstones","description":"## Problem\nWhen two repos sync simultaneously, tombstones can be resurrected:\n\n1. Repo A deletes issue (creates tombstone), pushes to sync branch\n2. Repo B (with 'closed' status) exports and tries to push\n3. Push fails (non-fast-forward)\n4. fetchAndRebaseInWorktree does git rebase\n5. Git rebase applies B's 'closed' patch on top of A's 'tombstone'\n6. TEXT-level rebase doesn't invoke beads merge driver\n7. 'closed' overwrites 'tombstone' = resurrection\n\n## Root Cause\nCommitToSyncBranch uses git rebase for divergence recovery, but rebase is text-level, not content-level. The proper content-level merge in PullFromSyncBranch handles tombstones correctly, but it runs AFTER the problematic push.\n\n## Proposed Fix\nOption 1: Don't push in CommitToSyncBranch - let PullFromSyncBranch handle merge+push\nOption 2: Replace git rebase with content-level merge in fetchAndRebaseInWorktree\nOption 3: Reorder sync steps: Export → Pull/Merge → Commit → Push\n\n## Workaround Applied\nExcluded tombstones from orphan detection warnings (commit 1e97d9cc).\n\nSee also: bd-3852 (Add orphan detection migration)","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-17T23:29:33.049272-08:00","updated_at":"2025-12-24T22:41:09.184574-08:00","closed_at":"2025-12-24T22:41:09.184574-08:00"} {"id":"bd-kqo1","title":"Show pin indicator in bd list output","description":"Add a visual indicator (e.g., pin emoji or [P] marker) for pinned issues in bd list output so users can easily identify them.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-18T23:33:47.402549-08:00","updated_at":"2025-12-21T11:30:27.272768-08:00","closed_at":"2025-12-21T11:30:27.272768-08:00","dependencies":[{"issue_id":"bd-kqo1","depends_on_id":"bd-0vg","type":"blocks","created_at":"2025-12-18T23:33:56.771791-08:00","created_by":"daemon"},{"issue_id":"bd-kqo1","depends_on_id":"bd-7h5","type":"blocks","created_at":"2025-12-18T23:34:07.985271-08:00","created_by":"daemon"}]} {"id":"bd-kqw0","title":"Update local installation","description":"Run install script or brew upgrade to get new version locally: curl -fsSL .../install.sh | bash","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T13:52:33.066452-08:00","updated_at":"2025-12-21T13:53:49.656073-08:00","deleted_at":"2025-12-21T13:53:49.656073-08:00","deleted_by":"stevey","delete_reason":"manual delete","original_type":"task"} +{"id":"bd-krk92","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T22:47:08.718362-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T22:47:08.760395-08:00","closed_at":"2026-01-09T22:47:08.760395-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-krmjw","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T13:45:44.924192-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T13:45:44.961706-08:00","closed_at":"2026-01-09T13:45:44.961706-08:00","close_reason":"auto-closed session event"} {"id":"bd-ktng","title":"Optimize CLI test suite - eliminate redundant git init calls","description":"Current: Each of 13 CLI tests calls git init (31s total). Solution: Use single test binary built once in init(), skip git operations where possible, or use mock filesystem.","status":"open","priority":2,"issue_type":"task","created_at":"2025-11-04T11:23:13.660276-08:00","updated_at":"2025-11-04T11:23:13.660276-08:00","dependencies":[{"issue_id":"bd-ktng","depends_on_id":"bd-l5gq","type":"discovered-from","created_at":"2025-11-04T11:23:13.662102-08:00","created_by":"daemon"}]} {"id":"bd-kvus","title":"bd sync fails when .beads/redirect points to different repo","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-31T11:36:35.614607-08:00","created_by":"gastown/crew/max","updated_at":"2025-12-31T13:31:39.491734-08:00","closed_at":"2025-12-31T13:31:39.491734-08:00","close_reason":"Duplicate of bd-e2q9 (fixed in same commit)","comments":[{"id":8,"issue_id":"bd-kvus","author":"gastown/crew/max","text":"## Problem\n\nWhen `.beads/redirect` points to a different repository (e.g., `../../mayor/rig/.beads`), `bd sync` fails with:\n\n```\nError: committing to sync branch: failed to check for changes in worktree: git status failed in worktree: exit status 128\n```\n\n## Root Cause\n\n`bd sync` uses `getBeadsWorktreePath()` which calculates the worktree path based on the **source** repo's `.git` directory, not the **target** repo after following the redirect.\n\nFor example:\n- Running from: `/gastown/crew/max` \n- Redirect points to: `../../mayor/rig/.beads`\n- bd looks for worktree at: `/gastown/crew/max/.git/beads-worktrees/beads-sync` (wrong)\n- Should look at: `/gastown/mayor/rig/.git/beads-worktrees/beads-sync` (correct)\n\n## Reproduction\n\n```bash\n# From a clone with redirect\ncd /Users/stevey/gt/gastown/crew/max\ncat .beads/redirect # Shows ../../mayor/rig/.beads\nbd sync # Fails with exit status 128\n\n# Workaround: run from redirect target\ncd /Users/stevey/gt/gastown/mayor/rig\nbd sync # Works\n```\n\n## Fix\n\nIn `internal/syncbranch/worktree.go`, `getBeadsWorktreePath()` should resolve the redirect first and use the target repo's git directory for worktree operations.","created_at":"2025-12-31T19:36:51Z"}]} @@ -1277,11 +1350,14 @@ {"id":"bd-kyo","title":"Run tests and linting","description":"Run the full test suite and linter:\n\n```bash\nTMPDIR=/tmp go test -short ./...\ngolangci-lint run ./...\n```\n\nFix any failures. Linting warnings acceptable (see LINTING.md).","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-18T22:42:59.290588-08:00","updated_at":"2025-12-24T16:25:30.300951-08:00","dependencies":[{"issue_id":"bd-kyo","depends_on_id":"bd-qqc","type":"parent-child","created_at":"2025-12-18T22:43:16.370234-08:00","created_by":"daemon"},{"issue_id":"bd-kyo","depends_on_id":"bd-8hy","type":"blocks","created_at":"2025-12-18T22:43:20.570742-08:00","created_by":"daemon"}],"deleted_at":"2025-12-24T16:25:30.300951-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} {"id":"bd-kzda","title":"Implement conditional bond type for mol bond","description":"The mol bond command accepts 'conditional' as a bond type but doesn't implement any conditional-specific behavior. It currently behaves identically to 'parallel'.\n\n**Expected behavior:**\nConditional bonds should mean 'B runs only if A fails' per the help text (mol.go:318).\n\n**Implementation needed:**\n- Add failure-condition dependency handling\n- Possibly new dependency type or status-based blocking\n- Update bondProtoProto, bondProtoMol, bondMolMol to handle conditional\n\n**Alternative:**\nRemove 'conditional' from valid bond types until implemented.\n\nThis is new functionality, not a regression.","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-12-21T10:23:01.966367-08:00","updated_at":"2025-12-23T01:33:25.734264-08:00","closed_at":"2025-12-23T01:33:25.734264-08:00"} {"id":"bd-kzxd","title":"Sync protection mechanism resurrects deleted issues","description":"During bd sync, the 'Protecting N issue(s) from left snapshot' logic resurrects issues that are in the deletions manifest, causing UNIQUE constraint failures on subsequent syncs.\n\n## Reproduction\n1. Delete an issue with bd delete (creates tombstone + deletions.jsonl entry)\n2. Run bd sync - succeeds\n3. Run bd sync again - fails with 'UNIQUE constraint failed: issues.id'\n\n## Root Cause\nThe protection mechanism (designed to prevent data loss during 3-way merge) keeps a snapshot of issues before sync. When importing after pull, it restores issues from this snapshot even if they're in the deletions manifest.\n\n## Observed Behavior\n- bd-3pd was deleted and added to deletions.jsonl\n- First sync exports tombstone, commits, pulls, imports - succeeds\n- Second sync: protection restores bd-3pd from left snapshot\n- Import tries to create bd-3pd which already exists → UNIQUE constraint error\n\n## Expected Behavior\nIssues in deletions manifest should NOT be restored by protection mechanism.\n\n## Workaround\nManually delete from DB: sqlite3 .beads/beads.db 'DELETE FROM issues WHERE id = \"bd-xxx\"'\n\n## Files to Investigate\n- cmd/bd/sync.go - protection logic\n- cmd/bd/snapshot_manager.go - left snapshot handling\n- internal/importer/importer.go - import with protection","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-13T10:11:02.550663-08:00","updated_at":"2025-12-13T10:20:51.651662-08:00","closed_at":"2025-12-13T10:20:51.651662-08:00"} +{"id":"bd-l0fnh","title":"Session ended: gt-beads-witness","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T21:03:46.427973-08:00","created_by":"beads/witness","updated_at":"2026-01-10T21:03:46.476341-08:00","closed_at":"2026-01-10T21:03:46.476341-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-l0pg","title":"GH#483: Pre-commit hook should not fail when .beads exists but bd sync fails","description":"Pre-commit hook exit 1 on bd sync --flush-only failure blocks commits even when user removed beads but .beads dir reappears. Should warn not fail. See: https://github.com/steveyegge/beads/issues/483","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-14T16:32:22.759225-08:00","updated_at":"2025-12-16T01:18:02.80947-08:00","closed_at":"2025-12-16T01:09:46.931395-08:00"} {"id":"bd-l13p","title":"Add GetWorkerStatus RPC endpoint","description":"New RPC endpoint to get all workers and their current molecule/step in one call. Returns: assignee, moleculeID, moleculeTitle, currentStep, totalSteps, stepTitle, lastActivity, status. Enables activity feed TUI to show worker state without multiple round trips.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-23T16:26:36.248654-08:00","updated_at":"2025-12-23T16:40:59.772138-08:00","closed_at":"2025-12-23T16:40:59.772138-08:00"} {"id":"bd-l1s0v","title":"Session ended: gt-beads-crew-dave","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T19:20:04.553542-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-07T19:20:04.592896-08:00","closed_at":"2026-01-07T19:20:04.592896-08:00","close_reason":"auto-closed session event"} {"id":"bd-l4b6","title":"Add tests for bd init --team wizard","description":"Write integration tests for the team wizard:\n- Test branch detection\n- Test sync branch creation\n- Test protected branch workflow\n- Test auto-sync configuration","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-05T18:58:18.192425-08:00","updated_at":"2025-11-06T20:06:49.22056-08:00","closed_at":"2025-11-06T19:55:39.687439-08:00"} {"id":"bd-l5gq","title":"Optimize test suite performance - cut runtime by 50%+","description":"## Problem\nTest suite takes ~20.8 seconds, with 95% of time spent in just 2 tests:\n- TestHashIDs_MultiCloneConverge: 11.08s (53%)\n- TestHashIDs_IdenticalContentDedup: 8.78s (42%)\n\nBoth tests in beads_hash_multiclone_test.go perform extensive Git operations (bare repos, multiple clones, sync rounds).\n\n## Goal\nCut total test time by at least 50% (to ~10 seconds or less).\n\n## Analysis\nTests already have some optimizations:\n- --shared --depth=1 --no-tags for fast cloning\n- Disabled hooks, gc, fsync\n- Support -short flag\n\n## Impact\n- Faster development feedback loop\n- Reduced CI costs and time\n- Better developer experience","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-11-04T01:23:14.410648-08:00","updated_at":"2025-11-04T11:23:13.683213-08:00","closed_at":"2025-11-04T11:23:13.683213-08:00"} +{"id":"bd-l5jpu","title":"Session ended: gt-beads-crew-wolf","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T00:38:11.508998-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-10T00:38:11.545391-08:00","closed_at":"2026-01-10T00:38:11.545391-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} +{"id":"bd-l6veq","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T13:37:03.899972-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-10T13:37:03.942079-08:00","closed_at":"2026-01-10T13:37:03.942079-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-l6yk","title":"bd mol burn should work on mols, not just wisps","description":"Currently `bd mol burn` only works on wisps (Ephemeral=true):\n\n```\n$ bd mol burn bd-mol-p7i\nError: molecule bd-mol-p7i is not a wisp (Ephemeral=false)\nHint: mol burn only works with wisp molecules\n Use 'bd delete' to remove non-wisp issues\n```\n\nThe name 'burn' implies destruction - it should work on any molecule, not just wisps. When called on a regular mol, it should convert to `bd delete --cascade`.\n\n**Proposed behavior:**\n- If wisp: current behavior (delete without tombstones)\n- If mol: `bd delete \u003cid\u003e --cascade` (delete with tombstones)\n\nThis makes the metaphor consistent: burn = destroy a molecule, regardless of phase.","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-12-29T17:05:08.115592-08:00","created_by":"beads/crew/emma","updated_at":"2025-12-29T17:10:19.034979-08:00","closed_at":"2025-12-29T17:10:19.034979-08:00","close_reason":"Implemented: mol burn now works on both wisps and mols"} {"id":"bd-l7u","title":"Duplicate DefaultRetentionDays constants","description":"## Problem\n\nThere are now two constants for the same value:\n\n1. `deletions.DefaultRetentionDays = 7` in `internal/deletions/deletions.go:184`\n2. `configfile.DefaultDeletionsRetentionDays = 7` in `internal/configfile/configfile.go:102`\n\n## Impact\n- DRY violation\n- Risk of values getting out of sync\n- Confusing which one to use\n\n## Fix\nRemove the constant from `deletions` package and have it import from `configfile`, or create a shared constants package.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-25T12:49:38.356211-08:00","updated_at":"2025-11-25T15:15:21.964842-08:00","closed_at":"2025-11-25T15:15:21.964842-08:00"} {"id":"bd-l7y3","title":"bd mol bond --pour should set Wisp=false","description":"In mol_bond.go bondProtoMol(), opts.Wisp is hardcoded to true (line 392). This ignores the --pour flag. When user specifies --pour to make an issue persistent, the Wisp field should be false so the issue is not marked for bulk deletion.\n\nCurrent behavior:\n- --pour flag correctly selects regular storage (not wisp storage)\n- But opts.Wisp=true means spawned issues are still marked for cleanup when closed\n\nExpected behavior:\n- --pour should set Wisp=false so persistent issues are not auto-cleaned\n\nComparison with mol_spawn.go (line 204):\n wisp := !pour // Correctly respects --pour flag\n result, err := spawnMolecule(ctx, store, subgraph, vars, assignee, actor, wisp)\n\nFix: Pass pour flag to bondProtoMol and set opts.Wisp = !pour","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-23T15:15:00.562346-08:00","updated_at":"2025-12-23T15:25:22.53144-08:00","closed_at":"2025-12-23T15:25:22.53144-08:00"} @@ -1308,6 +1384,7 @@ {"id":"bd-lm2q","title":"Fix `bd sync` failure due to daemon auto-export timestamp skew","description":"`bd sync` fails with false-positive \"JSONL is newer than database\" after daemon auto-export.\nRoot Cause: Daemon exports local changes to JSONL, updating its timestamp. `bd sync` sees JSONL.mtime \u003e DB.mtime and assumes external changes, blocking export.\nProposed Fixes:\n1. `bd sync` auto-imports if timestamp matches but content differs (or just auto-imports).\n2. Content-based comparison instead of timestamp only.\n","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-20T18:56:16.876685-05:00","updated_at":"2025-11-20T22:02:51.641709-05:00","closed_at":"2025-11-20T20:54:39.512574-05:00"} {"id":"bd-lmbzt","title":"Refinery Patrol","description":"Merge queue processor patrol loop with verification gates.","status":"closed","priority":2,"issue_type":"molecule","created_at":"2026-01-07T21:42:19.764814-08:00","created_by":"gastown/crew/george","updated_at":"2026-01-09T21:15:43.004822-08:00","closed_at":"2026-01-09T21:15:43.004822-08:00","close_reason":"Orphaned patrol molecules"} {"id":"bd-lmqhe","title":"restoreBeadsDirFromBranch fails when beads directory is redirected","description":"When a repo has a .beads/redirect file pointing to a shared beads directory (e.g., crew repos redirecting to ../../mayor/rig/.beads), the restoreBeadsDirFromBranch function in sync.go fails because it runs git checkout from the local repo but with a path outside that repo. Non-fatal (sync completes), but should skip restore when redirected since the beads dir is in a different repo anyway. Fix: check GetRedirectInfo().IsRedirected and return early.","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-01-09T14:16:11.168549-08:00","created_by":"gastown/crew/george","updated_at":"2026-01-10T22:12:20.463489-08:00","closed_at":"2026-01-10T22:12:20.463489-08:00","close_reason":"fixed"} +{"id":"bd-ln9mm","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T16:31:46.699091-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-10T16:31:46.739719-08:00","closed_at":"2026-01-10T16:31:46.739719-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-lo4","title":"Test pinned issue","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-18T21:44:49.031385-08:00","updated_at":"2025-12-18T21:47:25.055109-08:00","deleted_at":"2025-12-18T21:47:25.055109-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} {"id":"bd-lrj8","title":"Technical debt: Scattered TODOs should be tracked as issues","description":"Multiple TODO comments exist in the codebase that should be tracked as proper issues:\n\n1. cmd/bd/migrate_hash_ids.go:24 - 'Consider integrating into bd doctor migration detection'\n2. cmd/bd/migrate_tombstones.go:72 - Same\n3. cmd/bd/migrate_sync.go:16 - Same\n4. cmd/bd/migrate_issues.go:15 - Same\n5. cmd/bd/create.go:164 - 'Switch to target repo for multi-repo support'\n6. cmd/bd/create.go:208 - 'Add RPC method to get config in daemon mode'\n7. cmd/bd/daemon_logger.go:131 - 'Remove this once all callers are updated'\n8. cmd/bd/mol_stale.go:67 - 'Add RPC endpoint for stale check'\n9. cmd/bd/sync_test.go:444 - 'Refactor to use direct import logic'\n10. cmd/bd/jira.go:633 - 'In a full implementation, fetch Jira issue and compare timestamps'\n11. internal/formula/types.go:170,174,179,186,210 - Multiple 'Not yet implemented' TODOs\n12. internal/importer/importer_test.go:1010 - 'Test hangs due to database deadlock'\n\nConsider:\n1. Running 'grep -r TODO' periodically to find new ones\n2. Adding a lint rule to discourage inline TODOs\n3. Converting each to a bd issue with proper tracking\n\nLocation: Various files across codebase","status":"closed","priority":4,"issue_type":"chore","created_at":"2025-12-28T15:32:57.125279-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T16:34:10.911155-08:00","closed_at":"2025-12-28T16:34:10.911155-08:00","dependencies":[{"issue_id":"bd-lrj8","depends_on_id":"bd-784c","type":"parent-child","created_at":"2025-12-28T15:38:04.33312-08:00","created_by":"daemon"}]} {"id":"bd-lsv4","title":"GH#444: Fix inconsistent status naming in_progress vs in-progress","description":"Documentation uses in-progress (hyphen) but code expects in_progress (underscore). Update all docs to use canonical in_progress. See GitHub issue #444.","status":"tombstone","priority":2,"issue_type":"bug","created_at":"2025-12-16T01:03:14.349425-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} @@ -1317,6 +1394,8 @@ {"id":"bd-lw0x","title":"Fix bd sync race condition with daemon causing dirty working directory","description":"After bd sync completes with sync.branch mode, subsequent bd commands or daemon file watcher would see a hash mismatch and trigger auto-import, which then schedules re-export, dirtying the working directory.\n\n**Root cause:**\n1. bd sync exports JSONL with NEW content (hash H1)\n2. bd sync updates jsonl_content_hash = H1 in DB\n3. bd sync restores JSONL from HEAD (OLD content, hash H0)\n4. Now: file hash = H0, DB hash = H1 (MISMATCH)\n5. Daemon or next CLI command sees mismatch, imports from OLD JSONL\n6. Import triggers re-export → file is dirty\n\n**Fix:**\nAfter restoreBeadsDirFromBranch(), update jsonl_content_hash to match the restored file's hash. This ensures daemon and CLI see file hash = DB hash → no spurious import/export cycle.\n\nRelated: bd-c83r (multiple daemon prevention)","status":"tombstone","priority":2,"issue_type":"bug","created_at":"2025-12-13T06:42:17.130839-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-lwnt","title":"Test P1 priority","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-05T12:58:38.074112-08:00","updated_at":"2025-11-05T12:58:44.711763-08:00","closed_at":"2025-11-05T12:58:44.711763-08:00"} {"id":"bd-lxzx","title":"Add close_reason to JSONL export format documentation","description":"PR #551 now persists close_reason to the database, but there's a question about whether this field should be exported to JSONL format.\n\n## Current State\n- close_reason is stored in issues.close_reason column\n- close_reason is also stored in events table (audit trail)\n- The JSONL export format may or may not include close_reason\n\n## Questions\n1. Should close_reason be exported to JSONL format?\n2. If yes, where should it go (root level or nested in events)?\n3. Should there be any special handling to avoid duplication?\n4. How should close_reason be handled during JSONL import?\n\n## Why This Matters\n- JSONL is the git-friendly sync format\n- Other beads instances import from JSONL\n- close_reason is meaningful data that should be preserved across clones\n\n## Suggested Action\n- Check if close_reason is currently exported in JSONL\n- If not, add it to the export schema\n- Document the field in JSONL format spec\n- Add tests for round-trip (export -\u003e import -\u003e verify close_reason)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-14T14:25:17.414916-08:00","updated_at":"2025-12-30T18:12:30.972954-08:00","closed_at":"2025-12-30T17:03:27.56903-08:00","close_reason":"Documented close_reason in JSONL schema and added round-trip test","dependencies":[{"issue_id":"bd-lxzx","depends_on_id":"bd-z86n","type":"discovered-from","created_at":"2025-12-14T14:25:17.416131-08:00","created_by":"stevey"}]} +{"id":"bd-lyspz","title":"Session ended: gt-beads-crew-grip","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T23:08:07.124471-08:00","created_by":"beads/crew/grip","updated_at":"2026-01-09T23:08:07.159638-08:00","closed_at":"2026-01-09T23:08:07.159638-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} +{"id":"bd-lytza","title":"Session ended: gt-beads-witness","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T21:23:48.041263-08:00","created_by":"beads/witness","updated_at":"2026-01-10T21:23:48.110205-08:00","closed_at":"2026-01-10T21:23:48.110205-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-lz49","title":"Add gate fields: await_type, await_id, timeout, waiters","description":"Add gate-specific fields to the Issue type.\n\n## New Fields\n- await_type: string - Type of condition (gh:run, gh:pr, timer, human, mail)\n- await_id: string - Identifier for the condition\n- timeout: duration - Max time to wait before escalation\n- waiters: []string - Mail addresses to notify when gate clears\n\n## Implementation\n- Add fields to Issue struct in internal/types/types.go\n- Update SQLite schema for new columns\n- Add JSONL serialization/deserialization\n- Update import/export logic","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T11:44:32.720196-08:00","updated_at":"2025-12-23T12:00:03.837691-08:00","closed_at":"2025-12-23T12:00:03.837691-08:00","dependencies":[{"issue_id":"bd-lz49","depends_on_id":"bd-udsi","type":"parent-child","created_at":"2025-12-23T11:44:52.738823-08:00","created_by":"daemon"},{"issue_id":"bd-lz49","depends_on_id":"bd-2v0f","type":"blocks","created_at":"2025-12-23T11:44:56.269351-08:00","created_by":"daemon"}]} {"id":"bd-m03p","title":"Merge: quartz-mjw4bkpv","description":"branch: polecat/quartz-mjw4bkpv\ntarget: main\nsource_issue: quartz-mjw4bkpv\nrig: beads\nagent_bead: gt-beads-polecat-quartz","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2026-01-01T16:16:18.601679-08:00","created_by":"beads/polecats/quartz","updated_at":"2026-01-01T19:27:21.729371-08:00","closed_at":"2026-01-01T19:27:21.729371-08:00","close_reason":"Stale MR - no branch pushed after 3+ hours"} {"id":"bd-m0tl","title":"bd create -f crashes with nil pointer dereference","description":"GitHub issue #674. The markdown import feature crashes at markdown.go:338 because global variables (store, ctx, actor) aren't initialized when createIssuesFromMarkdown is called. The function uses globals set by cobra command framework but is being called before they're ready. Need to either initialize globals at start of function or pass them as parameters.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-21T14:35:14.813012-08:00","updated_at":"2025-12-21T15:41:14.600953-08:00","closed_at":"2025-12-21T15:41:14.600953-08:00"} @@ -1331,8 +1410,10 @@ {"id":"bd-m8ro","title":"Improve test coverage for internal/rpc (47.5% → 60%)","description":"The RPC package has only 47.5% test coverage. RPC is the communication layer for daemon operations.\n\nCurrent coverage: 47.5%\nTarget coverage: 60%","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-13T20:43:09.515299-08:00","updated_at":"2025-12-23T22:42:11.921388-08:00","closed_at":"2025-12-23T22:42:11.921388-08:00"} {"id":"bd-m8t","title":"Extract computeJSONLHash helper to eliminate code duplication","description":"SHA256 hash computation is duplicated in 3 places:\n- cmd/bd/integrity.go:50-52\n- cmd/bd/sync.go:611-613\n- cmd/bd/import.go:318-319\n\nExtract to shared helper function computeJSONLHash(jsonlPath string) (string, error) that includes proper #nosec comment and error handling.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-20T21:31:05.836496-05:00","updated_at":"2025-11-20T21:35:36.04171-05:00","closed_at":"2025-11-20T21:35:36.04171-05:00","dependencies":[{"issue_id":"bd-m8t","depends_on_id":"bd-khnb","type":"blocks","created_at":"2025-11-20T21:31:05.837915-05:00","created_by":"daemon"}]} {"id":"bd-m964","title":"Consider FTS5 for text search at scale","description":"SearchIssues uses LIKE patterns for text search which can't use indexes.\n\n**Current query (queries.go:1475-1477):**\n```sql\n(title LIKE ? OR description LIKE ? OR id LIKE ?)\n```\n\n**Problem:** Full table scan on every text search. At 100K+ issues, this becomes slow.\n\n**SQLite FTS5 solution:**\n```sql\nCREATE VIRTUAL TABLE issues_fts USING fts5(\n id, title, description, design, notes,\n content='issues',\n content_rowid='rowid'\n);\n\n-- Triggers to keep FTS in sync\nCREATE TRIGGER issues_ai AFTER INSERT ON issues BEGIN\n INSERT INTO issues_fts(rowid, id, title, description, design, notes)\n VALUES (new.rowid, new.id, new.title, new.description, new.design, new.notes);\nEND;\n-- (similar for UPDATE, DELETE)\n```\n\n**Trade-offs:**\n- Database size increase (~30-50% for text content)\n- Additional write overhead (trigger execution)\n- Better search capabilities (ranking, phrase search)\n\n**Decision needed:** Is full-text search a priority feature? Current LIKE search may be acceptable for most use cases.\n\n**Benchmark first:** Measure SearchIssues at 100K scale before implementing.","status":"open","priority":4,"issue_type":"feature","created_at":"2025-12-22T22:58:56.466121-08:00","updated_at":"2026-01-02T00:17:14.332908-08:00","dependencies":[{"issue_id":"bd-m964","depends_on_id":"bd-h0we","type":"discovered-from","created_at":"2025-12-22T22:58:56.466764-08:00","created_by":"daemon"}]} +{"id":"bd-m9doq","title":"Session ended: gt-beads-crew-dave","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T23:03:29.936001-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-09T23:03:29.973094-08:00","closed_at":"2026-01-09T23:03:29.973094-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-m9fzm","title":"Session ended: gt-beads-crew-dave","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T00:43:22.158817-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-09T00:43:22.191784-08:00","closed_at":"2026-01-09T00:43:22.191784-08:00","close_reason":"auto-closed session event"} {"id":"bd-m9th","title":"Create Python adapter library","description":"Create beads_mail_adapter.py library that wraps Agent Mail HTTP calls with health checks and graceful degradation.\n\nAcceptance Criteria:\n- AgentMailAdapter class with health check on init\n- enabled flag auto-disables if server unreachable\n- All methods wrapped in try/catch (non-blocking failures)\n- Methods: reserve_issue(), release_issue(), notify(), check_inbox()\n- Environment-based configuration (AGENT_MAIL_URL, AGENT_MAIL_TOKEN)\n- Unit tests for enabled/disabled modes\n\nFile: lib/beads_mail_adapter.py","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-11-07T22:42:28.60152-08:00","updated_at":"2025-11-08T00:11:02.746747-08:00","closed_at":"2025-11-08T00:11:02.746747-08:00","dependencies":[{"issue_id":"bd-m9th","depends_on_id":"bd-4cyb","type":"blocks","created_at":"2025-11-07T22:42:28.602698-08:00","created_by":"daemon"}]} +{"id":"bd-mcn81","title":"Session ended: gt-beads-crew-dave","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T22:49:39.99761-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-09T22:49:40.035312-08:00","closed_at":"2026-01-09T22:49:40.035312-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-mcva","title":"Gate Evaluation: Phases 2-4 (Timer, GitHub, Cross-Rig)","description":"Complete gate evaluation implementation started in bd-7zka.2 (Phase 1: Human Gates).\n\n## Background\nPhase 1 implemented gate issues as beads that block dependent steps. Phases 2-4 add automatic gate resolution.\n\n## Gate Types and Watchers\n\n| Gate Type | Watcher | Trigger |\n|-----------|---------|---------|\n| timer | Witness | Patrol cycle |\n| gh:run | Refinery | Patrol poll |\n| gh:pr | Refinery | Patrol poll |\n| bead (cross-rig) | Existing dep resolution | Sync |\n\n## Commands\n```bash\nbd gate list # Show open gates\nbd gate check # Evaluate all gates\nbd gate check --type=timer # Check only timer gates\nbd gate check --type=gh # Check only GitHub gates\nbd gate resolve \u003cid\u003e [--reason] # Force-close a gate\n```\n\n## Related\n- bd-7zka.2: Phase 1 implementation (closed)\n- gt-dh65: Deacon patrol gate checking integration","status":"closed","priority":2,"issue_type":"epic","created_at":"2026-01-02T01:55:17.373041-08:00","created_by":"mayor","updated_at":"2026-01-02T17:04:10.4889-08:00","closed_at":"2026-01-02T17:04:10.4889-08:00","close_reason":"All phases complete: Timer gates (bd-kbfn), GitHub gates (bd-oos3), Cross-rig bead gates (bd-w3rh). bd gate check command fully implemented."} {"id":"bd-mczr","title":"bd init inherits from parent hub instead of starting empty (GH#896)","description":"When running bd init in a subdirectory of a hub, the new database gets populated with parent hub's issues and repo UUID, causing DATABASE MISMATCH errors. Root cause: FindBeadsDir() walks up to parent directories and finds parent hub's .beads. Need to ensure bd init only looks at LOCAL git repo's history, not parent hub.","status":"closed","priority":1,"issue_type":"bug","created_at":"2026-01-04T15:22:44.025097-08:00","created_by":"beads/crew/grip","updated_at":"2026-01-04T15:43:38.801825-08:00","closed_at":"2026-01-04T15:43:38.801825-08:00","close_reason":"Fixed in 243263dd - added guard to reject beadsDir outside gitRoot"} {"id":"bd-mdw","title":"Add integration test for cross-clone deletion propagation","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-25T14:56:38.997009-08:00","updated_at":"2025-11-25T16:35:59.052914-08:00","closed_at":"2025-11-25T16:35:59.052914-08:00"} @@ -1341,6 +1422,8 @@ {"id":"bd-mgt2","title":"Update UI styles for removed types","description":"Update or remove type-specific styling for agent/role/rig types.\n\n## Work\n- Remove ColorTypeAgent, ColorTypeRole, ColorTypeRig constants\n- Remove TypeAgentStyle, TypeRoleStyle, TypeRigStyle\n- Update RenderIssueType() switch to remove these cases\n- Consider: add label-based styling for gt:* labels\n\n## Files\n- internal/ui/styles.go","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-06T20:40:47.950601-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-06T22:11:58.42622-08:00","closed_at":"2026-01-06T22:11:58.42622-08:00","close_reason":"Removed Gas Town type colors and styles from UI","dependencies":[{"issue_id":"bd-mgt2","depends_on_id":"bd-i54l","type":"parent-child","created_at":"2026-01-06T20:41:11.677237-08:00","created_by":"beads/crew/dave"}]} {"id":"bd-mh4w","title":"Rename 'bond' to 'spawn' for instantiation","description":"Rename the bd mol bond command to bd mol spawn for instantiating protos.\n \n- Rename molBondCmd to molSpawnCmd\n- Update command Use/Short/Long descriptions \n- Keep 'bond' available for the new bonding feature\n- Update all documentation references\n- Add 'protomolecule' as easter egg alias for 'proto'","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-21T00:58:44.529026-08:00","updated_at":"2025-12-21T01:19:42.942819-08:00","closed_at":"2025-12-21T01:19:42.942819-08:00","dependencies":[{"issue_id":"bd-mh4w","depends_on_id":"bd-o5xe","type":"parent-child","created_at":"2025-12-21T00:59:51.167902-08:00","created_by":"daemon"}]} {"id":"bd-mhhb","title":"Read operations should not modify database file","description":"Read-only operations (bd list, bd ready, bd show) modify the database file. Every open sets WAL pragma, runs schema/migrations, and checkpoints on close. Need sqlite.NewReadOnly() that opens with mode=ro, skips WAL/schema/migrations, and skips checkpoint. See GH#804.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-30T16:27:13.416643-08:00","created_by":"beads/crew/emma","updated_at":"2025-12-30T16:46:49.921614-08:00","closed_at":"2025-12-30T16:46:49.921614-08:00","close_reason":"Implemented read-only mode for SQLite. Read commands now use NewReadOnly() which opens with mode=ro, skips WAL pragma/schema/migrations, and skips checkpoint on close."} +{"id":"bd-mjn78","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T16:13:48.459613-08:00","created_by":"beads/refinery","updated_at":"2026-01-10T16:13:48.531509-08:00","closed_at":"2026-01-10T16:13:48.531509-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} +{"id":"bd-mjzs3","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T14:37:01.471314-08:00","created_by":"beads/refinery","updated_at":"2026-01-10T14:37:01.50657-08:00","closed_at":"2026-01-10T14:37:01.50657-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-mlcz","title":"Implement bd migrate command","description":"Add bd migrate command to move issues between repos with filtering. Should support: filtering by status/priority/labels, dry-run mode, preserving dependencies, handling source_repo field updates.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-05T18:04:29.902151-08:00","updated_at":"2025-11-05T18:42:52.536951-08:00","closed_at":"2025-11-05T18:42:52.536951-08:00","dependencies":[{"issue_id":"bd-mlcz","depends_on_id":"bd-8rd","type":"parent-child","created_at":"2025-11-05T18:04:39.072312-08:00","created_by":"daemon"}]} {"id":"bd-mn9p","title":"bd-hv01: Brittle string comparison breaks with JSON field reordering","description":"## Problem\ndeletion_tracking.go:125 uses string comparison to detect unchanged issues:\n\n```go\nif leftLine, existsInLeft := leftIndex[id]; existsInLeft \u0026\u0026 leftLine == baseLine {\n deletions = append(deletions, id)\n}\n```\n\nThis breaks if:\n- JSON field order changes (legal in JSON)\n- Timestamps updated by import/export\n- Whitespace/formatting changes\n- Floating point precision varies\n\n## Example Failure\n```json\n// baseLine\n{\"id\":\"bd-1\",\"priority\":1,\"status\":\"open\"}\n// leftLine (same data, different order)\n{\"id\":\"bd-1\",\"status\":\"open\",\"priority\":1}\n```\nThese are semantically identical but string comparison fails.\n\n## Fix\nParse and compare JSON semantically:\n```go\nfunc jsonEquals(a, b string) bool {\n var objA, objB map[string]interface{}\n json.Unmarshal([]byte(a), \u0026objA)\n json.Unmarshal([]byte(b), \u0026objB)\n return reflect.DeepEqual(objA, objB)\n}\n```\n\n## Files Affected\n- cmd/bd/deletion_tracking.go:125\n- cmd/bd/deletion_tracking.go:134-170 (buildIDToLineMap)","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-06T18:15:35.090716-08:00","updated_at":"2025-11-06T18:46:55.889888-08:00","closed_at":"2025-11-06T18:46:55.889888-08:00","dependencies":[{"issue_id":"bd-mn9p","depends_on_id":"bd-rbxi","type":"parent-child","created_at":"2025-11-06T18:19:14.790898-08:00","created_by":"daemon"}]} {"id":"bd-mnap","title":"Investigate performance issues in VS Code Copilot (Windows)","description":"Beads unusable in Windows 11 VS Code Copilot chat with Sonnet 4.5.\nSummary event happens every 3-4 turns, taking 3 minutes.\nCopilot summarizes after ~125k tokens despite model supporting 1M.\nLarge context size of beads might be triggering aggressive summarization.\nNeed workaround or optimization for context size.\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-20T18:56:30.124918-05:00","updated_at":"2025-12-09T18:38:37.700698972-05:00","closed_at":"2025-11-28T23:37:52.199294-08:00"} @@ -1435,9 +1518,11 @@ {"id":"bd-mol-yxv","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.39.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.","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-27T19:34:09.557636-08:00","updated_at":"2026-01-04T23:49:29.777567-08:00","dependencies":[{"issue_id":"bd-mol-yxv","depends_on_id":"bd-mol-937","type":"blocks","created_at":"2025-12-27T19:34:09.594033-08:00","created_by":"beads/crew/dave"}],"deleted_at":"2026-01-04T23:49:29.777567-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"bd-mol-z5v","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.41.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.","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-29T16:29:32.299762-08:00","updated_at":"2026-01-04T23:49:29.777567-08:00","close_reason":"Added v0.41.0 to versionChanges","deleted_at":"2026-01-04T23:49:29.777567-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"bd-mql4","title":"getLocalSyncBranch silently ignores YAML parse errors","description":"In autoimport.go:170-172, YAML parsing errors are silently ignored. If a user has malformed YAML in config.yaml, sync-branch will just silently be empty with no feedback.\n\nRecommendation: Add debug logging since this function is only called during auto-import, and debugging silent failures is painful.\n\nAdd: debug.Logf(\"Warning: failed to parse config.yaml: %v\", err)","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-07T02:03:44.217728-08:00","updated_at":"2025-12-30T18:12:30.967491-08:00","closed_at":"2025-12-30T16:50:13.838626-08:00","close_reason":"Added debug.Logf calls in getLocalSyncBranch and isNoDbModeConfigured to log YAML parse errors instead of silently ignoring them"} +{"id":"bd-muhs7","title":"Session ended: gt-beads-crew-wolf","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T23:02:17.295904-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-09T23:02:17.333687-08:00","closed_at":"2026-01-09T23:02:17.333687-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-muls","title":"Install and test MCP Agent Mail locally","description":"Install MCP Agent Mail on a single development machine and verify basic functionality.\n\nAcceptance Criteria:\n- Server installed via one-line installer\n- Server running on port 8765\n- Can register a project via HTTP\n- Can register an agent identity\n- Web UI accessible at /mail","notes":"Tested local installation. Server runs on port 8765, web UI works. MCP API tool execution has errors - needs debugging. See /tmp/bd-muls-report.md for details.","status":"closed","priority":0,"issue_type":"task","created_at":"2025-11-07T22:41:59.896735-08:00","updated_at":"2025-11-07T23:14:59.1182-08:00","closed_at":"2025-11-07T23:14:59.1182-08:00"} {"id":"bd-muw","title":"Add empty tasks validation in workflow create","description":"workflow.go:321 will panic if wf.Tasks is empty. Add validation that len(wf.Tasks) \u003e 0 before accessing wf.Tasks[0].","status":"tombstone","priority":3,"issue_type":"bug","created_at":"2025-12-17T22:23:00.75707-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-mv6h","title":"Add test coverage for external dep edge cases","description":"During code review of bd-zmmy, identified missing test coverage:\n\n1. RemoveDependency with external ref target (will fail - see bd-a3sj)\n2. GetBlockedIssues with mix of local and external blockers\n3. GetDependencyTree with external deps\n4. AddDependency cycle detection with external refs (should be skipped?)\n5. External dep resolution with WAL mode database\n6. External dep resolution when target project has no .beads directory\n7. External dep resolution with invalid external: format variations\n\nPriority 2 because bd-a3sj is a real bug that tests would catch.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T23:45:37.50093-08:00","updated_at":"2025-12-22T22:32:09.515096-08:00","closed_at":"2025-12-22T22:32:09.515096-08:00","dependencies":[{"issue_id":"bd-mv6h","depends_on_id":"bd-zmmy","type":"discovered-from","created_at":"2025-12-21T23:45:37.501495-08:00","created_by":"daemon"}]} +{"id":"bd-mvenv","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T14:45:17.414908-08:00","created_by":"beads/refinery","updated_at":"2026-01-10T14:45:17.450388-08:00","closed_at":"2026-01-10T14:45:17.450388-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-mwl7","title":"Mol Mall: Formula marketplace using GitHub as backend","description":"Create a marketplace for sharing molecule formulas using GitHub repos as the hosting backend.\n\n## Why GitHub?\n\nGitHub solves multiple problems at once:\n- **Hosting**: Raw file URLs for formula.json\n- **Versioning**: Git tags (v1.0.0, v1.2.0)\n- **Auth**: GitHub tokens for private formulas\n- **Discovery**: GitHub search, topics, stars\n- **Collaboration**: PRs for contributions, issues for bugs\n- **Organizations**: Natural scoping (@anthropic/, @gastown/)\n\n## URL Scheme\n\n```bash\n# Direct GitHub URL\nbd mol install github.com/anthropics/mol-code-review\n\n# With version tag\nbd mol install github.com/anthropics/mol-code-review@v1.2.0\n\n# Shorthand (via registry lookup)\nbd mol install @anthropic/mol-code-review\n```\n\n## Architecture\n\n### Distributed Model (like Go modules)\nEach formula lives in its own repo:\n```\ngithub.com/anthropics/mol-code-review/\n├── formula.json # The formula\n├── README.md # Documentation\n└── CHANGELOG.md # Version history\n```\n\n### Optional Registry (for discovery)\n```\ngithub.com/anthropics/mol-mall/\n└── registry.json # Index pointing to formula repos\n```\n\n## Child Issues\n\n1. `bd mol export` - Proto → Formula file\n2. `bd mol promote` - Distilled proto → Catalog proto (one step)\n3. `bd mol install` - GitHub → Local proto\n4. `bd mol update` - Check for newer versions\n5. `bd mol search` - Find formulas (GitHub API)\n6. `bd mol publish` - Push formula to GitHub repo\n7. Formula versioning - Version field + git tag integration\n8. Installation tracking - .beads/installed.json\n\n## ID Namespace Design\n\n| Entity | ID Format | Example |\n|--------|-----------|---------|\n| Formula (GitHub) | `github.com/org/repo` | `github.com/anthropics/mol-code-review` |\n| Catalog proto (local) | `mol-name` | `mol-code-review` |\n| Distilled proto | `\u003cdb\u003e-proto-xxx` | `bd-proto-a7f` |\n| Poured instance | `\u003cdb\u003e-mol-xxx` | `gt-mol-b8c` |\n| Wisp instance | `\u003cdb\u003e-wisp-xxx` | `hq-wisp-d9e` |\n","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-12-25T12:05:05.848017-08:00","updated_at":"2025-12-25T12:09:39.767832-08:00","closed_at":"2025-12-25T12:09:39.767832-08:00"} {"id":"bd-mxmlg","title":"Digest: mol-refinery-patrol","description":"Patrol: queue empty, no merges needed","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T17:59:22.372428-08:00","updated_at":"2026-01-10T17:59:22.372428-08:00","closed_at":"2026-01-10T17:59:22.372379-08:00","close_reason":"Squashed from 11 wisps","dependencies":[{"issue_id":"bd-mxmlg","depends_on_id":"bd-wisp-uvd","type":"parent-child","created_at":"2026-01-10T17:59:22.373333-08:00","created_by":"beads/refinery"}]} {"id":"bd-my64","title":"Pre-push hook and daemon export produce different JSONL","description":"After committing and pushing, git status shows .beads/beads.jsonl as dirty. Investigation shows:\n\n1. Pre-push hook ran successfully and exported DB → JSONL\n2. Push completed\n3. Shortly after, daemon exported DB → JSONL again with different content\n4. Diff shows comments added to old issues (bd-23a8, bd-6049, bd-87a0)\n\nTimeline:\n- Commit c731c45 \"Update beads JSONL\"\n- Pre-push hook exported JSONL\n- Push succeeded\n- Daemon PID 33314 exported again with different content\n\nQuestions:\n1. Did someone run a command between commit and daemon export?\n2. Is there a timing issue where pre-push hook doesn't capture all DB changes?\n3. Should pre-commit hook flush daemon changes before committing?\n\nThe comments appear to be from Nov 5 (created_at: 2025-11-05T08:38:46Z) but are only appearing in JSONL now. This suggests the DB had these comments but they weren't exported during pre-push.\n\nPossible causes:\n- Pre-push hook uses BEADS_NO_DAEMON=1 which might skip pending writes\n- Daemon has unflushed changes in memory\n- Race condition between pre-push export and daemon's periodic export","notes":"Improved fix based on oracle code review:\n1. Pre-push now flushes pending changes first (prevents debounce race)\n2. Uses git status --porcelain to catch all change types\n3. Handles both beads.jsonl and issues.jsonl\n4. Works even if bd not installed (git-only check)","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-06T18:49:54.570993-08:00","updated_at":"2025-11-06T19:01:14.549032-08:00","closed_at":"2025-11-06T18:57:42.710282-08:00"} @@ -1446,6 +1531,7 @@ {"id":"bd-n0l8j","title":"Session ended: gt-beads-crew-fang","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T21:42:10.708451-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-07T21:42:15.897669-08:00","closed_at":"2026-01-07T21:42:15.897669-08:00","close_reason":"auto-closed session event"} {"id":"bd-n0md6","title":"Review and merge PR #975: fix sync --import-only store nil","description":"dispatched_by: beads/crew/emma\n\n## Task\nReview and merge PR #975 from juanre.\n\n**PR**: https://github.com/steveyegge/beads/pull/975\n\n## What it does\n- Adds ensureStoreActive() call after daemon disconnect in sync.go\n- Fixes 'no database store available for inline import' error\n- Includes comprehensive test documenting the bug and fix\n\n## Easy-win criteria met\n- Bug fix with clear reproduction and solution\n- Has comprehensive test\n- Small diff (143 additions, 0 deletions)\n- Low risk\n\n## Instructions\n1. Clone/fetch the PR: gh pr checkout 975 --repo steveyegge/beads\n2. Run tests: go test ./cmd/bd/...\n3. Review the diff: gh pr diff 975 --repo steveyegge/beads\n4. If tests pass and code looks good, approve and merge\n5. Close this bead when done","status":"closed","priority":2,"issue_type":"task","assignee":"beads/crew/fang","created_at":"2026-01-09T10:59:58.832796-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T13:44:59.1482-08:00","closed_at":"2026-01-09T13:44:59.1482-08:00","close_reason":"PR #975 reviewed, approved, and merged. Fix adds ensureStoreActive() call after daemon disconnect in sync.go to fix 'no database store available for inline import' error."} {"id":"bd-n25","title":"Speed up main_test.go - tests hang indefinitely due to nil rootCtx","description":"## Problem\n\nmain_test.go tests are hanging indefinitely, making them unusable and blocking development.\n\n## Root Cause\n\nTests that call flushToJSONL() or autoImportIfNewer() hang forever because:\n- rootCtx is nil in test environment (defined in cmd/bd/main.go:67)\n- flushToJSONL() uses rootCtx for DB operations (autoflush.go:503)\n- When rootCtx is nil, DB calls timeout/hang indefinitely\n\n## Affected Tests (10+)\n\n- TestAutoFlushOnExit\n- TestAutoFlushJSONLContent \n- TestAutoFlushErrorHandling\n- TestAutoImportIfNewer\n- TestAutoImportDisabled\n- TestAutoImportWithUpdate\n- TestAutoImportNoUpdate\n- TestAutoImportMergeConflict\n- TestAutoImportConflictMarkerFalsePositive\n- TestAutoImportClosedAtInvariant\n\n## Proof\n\n```bash\n# Before fix: TestAutoFlushJSONLContent HANGS (killed after 2+ min)\n# After adding rootCtx init: Completes in 0.04s\n# Speedup: ∞ → 0.04s\n```\n\n## Solution\n\nSee MAIN_TEST_OPTIMIZATION_PLAN.md for complete fix plan.\n\n**Quick Fix (5 min)**: Add to each hanging test:\n```go\nctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)\ndefer cancel()\noldRootCtx := rootCtx\nrootCtx = ctx\ndefer func() { rootCtx = oldRootCtx }()\n```\n\n**Full Optimization (40 min total)**:\n1. Fix rootCtx (5 min) - unblocks tests\n2. Reduce sleep durations 10x (2 min) - saves ~280ms\n3. Use in-memory DBs (10 min) - saves ~1s\n4. Share test fixtures (15 min) - saves ~1.2s\n5. Fix skipped debounce test (5 min)\n\n## Expected Results\n\n- Tests go from hanging → \u003c5s total runtime\n- Keep critical integration test coverage\n- Tests caught real bugs: bd-270, bd-206, bd-160\n\n## Files\n\n- Analysis: MAIN_TEST_REFACTOR_NOTES.md\n- Solution: MAIN_TEST_OPTIMIZATION_PLAN.md\n- Tests: cmd/bd/main_test.go (18 tests, 1322 LOC)\n\n## Priority\n\nP1 - Blocking development, tests unusable in current state","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-21T18:27:48.942814-05:00","updated_at":"2025-11-21T18:44:21.944901-05:00","closed_at":"2025-11-21T18:44:21.944901-05:00"} +{"id":"bd-n2xsj","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T16:13:41.779573-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-10T16:13:41.820512-08:00","closed_at":"2026-01-10T16:13:41.820512-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-n386","title":"Improve test coverage for internal/daemon (27.3% → 60%)","description":"The daemon package has only 27.3% test coverage. The daemon is critical for background operations and reliability.\n\nKey areas needing tests:\n- Daemon autostart logic\n- Socket handling\n- PID file management\n- Health checks\n\nCurrent coverage: 27.3%\nTarget coverage: 60%","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-13T20:43:00.895238-08:00","updated_at":"2025-12-23T22:36:08.583672-08:00","closed_at":"2025-12-23T22:36:08.583672-08:00"} {"id":"bd-n3v","title":"Error committing to sync branch: failed to create worktree","description":"\u003e bd sync --no-daemon\n→ Exporting pending changes to JSONL...\n→ Committing changes to sync branch 'beads-sync'...\nError committing to sync branch: failed to create worktree: failed to create worktree parent directory: mkdir /var/home/matt/dev/beads/fix-ci/.git: not a directory","notes":"**Problem Diagnosed**: The `bd sync` command was failing with \"mkdir /var/home/matt/dev/beads/fix-ci/.git: not a directory\" because it was being executed from the wrong directory.\n\n**Root Cause**: The command was run from `/var/home/matt/dev/beads` (where the `fix-ci` worktree exists) instead of the main repository directory `/var/home/matt/dev/beads/main`. Since `fix-ci` is a git worktree with a `.git` file (not directory), the worktree creation logic failed when trying to create `\u003ccurrent_dir\u003e/.git/beads-worktrees/\u003cbranch\u003e`.\n\n**Solution Verified**: Execute `bd sync` from the main repository directory:\n```bash\ncd main \u0026\u0026 bd sync --dry-run\n```\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-05T15:25:24.514998248-07:00","updated_at":"2025-12-24T00:25:13.040406-08:00","closed_at":"2025-12-24T00:25:13.040406-08:00"} {"id":"bd-n4td","title":"Add warning when staleness check errors","description":"## Problem\n\nWhen ensureDatabaseFresh() calls CheckStaleness() and it errors (corrupted metadata, permission issues, etc.), we silently proceed with potentially stale data.\n\n**Location:** cmd/bd/staleness.go:27-32\n\n**Scenarios:**\n- Corrupted metadata table\n- Database locked by another process \n- Permission issues reading JSONL file\n- Invalid last_import_time format in DB\n\n## Current Code\n\n```go\nisStale, err := autoimport.CheckStaleness(ctx, store, dbPath)\nif err \\!= nil {\n // If we can't determine staleness, allow operation to proceed\n // (better to show potentially stale data than block user)\n return nil\n}\n```\n\n## Fix\n\n```go\nisStale, err := autoimport.CheckStaleness(ctx, store, dbPath)\nif err \\!= nil {\n fmt.Fprintf(os.Stderr, \"Warning: Could not verify database freshness: %v\\n\", err)\n fmt.Fprintf(os.Stderr, \"Proceeding anyway. Data may be stale.\\n\\n\")\n return nil\n}\n```\n\n## Impact\nMedium - users should know when staleness check fails\n\n## Effort\nEasy - 5 minutes","status":"tombstone","priority":2,"issue_type":"bug","created_at":"2025-11-20T20:16:34.889997-05:00","updated_at":"2025-12-25T01:21:01.952723-08:00","dependencies":[{"issue_id":"bd-n4td","depends_on_id":"bd-2q6d","type":"blocks","created_at":"2025-11-20T20:18:20.154723-05:00","created_by":"stevey"}],"deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} @@ -1535,11 +1621,13 @@ {"id":"bd-p0zr","title":"bd message: Improve type safety with typed parameter structs","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-08T12:54:29.675678-08:00","updated_at":"2025-11-08T12:58:59.559643-08:00","closed_at":"2025-11-08T12:58:59.559643-08:00","dependencies":[{"issue_id":"bd-p0zr","depends_on_id":"bd-6uix","type":"parent-child","created_at":"2025-11-08T12:55:55.058354-08:00","created_by":"daemon"}]} {"id":"bd-p5za","title":"mol-christmas-launch: 3-day execution plan","description":"Christmas Launch Molecule - execute phases in order, survive restarts.\n\nPIN THIS BEAD. Check progress each session start.\n\n## Step: phase0-beads-foundation\nFix blocking issues before swarming:\n1. Verify gastown beads schema works: bd list --status=open\n2. Ensure bd mol bond exists (check bd-usro)\n3. Verify bd-2vh3 (squash) is filed\n\n## Step: phase1-polecat-loop\nSerial work on polecat execution:\n1. gt-9nf: Fresh polecats only\n2. gt-975: Molecule execution support\n3. gt-8v8: Refuse uncommitted work\nThen swarm: gt-e1y, gt-f8v, gt-eu9\nNeeds: phase0-beads-foundation\n\n## Step: phase2-refinery\nSerial work on refinery autonomy:\n1. gt-5gkd: Refinery CLAUDE.md\n2. gt-bj6f: Refinery context in gt prime\n3. gt-0qki: Refinery-Witness protocol\nNeeds: phase1-polecat-loop\n\n## Step: phase3-deacon\nHealth monitoring infrastructure:\n1. gt-5af.4: Simplify daemon\n2. gt-5af.7: Crew session patterns\n3. gt-976: Crew lifecycle\nNeeds: phase2-refinery\n\n## Step: phase4-code-review\nSelf-improvement flywheel:\n1. Define mol-code-review (gt-fjvo)\n2. Test on open MRs\n3. Integrate with Refinery\nNeeds: phase3-deacon\n\n## Step: phase5-polish\nDemo readiness:\n1. gt-b2hj: Find orphaned work\n2. Doctor checks\n3. Clean up open MRs\nNeeds: phase4-code-review\n\n## Step: verify-flywheel\nSuccess criteria:\n- gt spawn works with molecules\n- Refinery processes MRs autonomously\n- mol-code-review runs on a PR\n- bd cleanup --ephemeral works\nNeeds: phase5-polish","status":"closed","priority":0,"issue_type":"epic","created_at":"2025-12-20T21:20:02.462889-08:00","updated_at":"2025-12-21T17:23:25.471749-08:00","closed_at":"2025-12-21T17:23:25.471749-08:00"} {"id":"bd-p65x","title":"Latency test 1","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-08T00:04:38.815725-08:00","updated_at":"2025-11-08T00:06:46.198388-08:00","closed_at":"2025-11-08T00:06:46.198388-08:00"} +{"id":"bd-p68qt","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T14:01:23.65416-08:00","created_by":"beads/refinery","updated_at":"2026-01-10T14:01:23.687195-08:00","closed_at":"2026-01-10T14:01:23.687195-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-p68x","title":"Create examples for common workflows","description":"Add examples/ subdirectories: OSS contributor workflow, team branch workflow, multi-phase development, multiple personas (architect/implementer). Each with README and sample configs.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-05T18:04:30.128257-08:00","updated_at":"2025-11-05T19:27:33.07555-08:00","closed_at":"2025-11-05T19:08:39.035904-08:00","dependencies":[{"issue_id":"bd-p68x","depends_on_id":"bd-8rd","type":"parent-child","created_at":"2025-11-05T18:04:39.247515-08:00","created_by":"daemon"}]} {"id":"bd-p6vp","title":"Clarify .beads/.gitattributes handling in Protected Branches docs","description":"Protected Branches docs quick start leaves untracked `.beads` directory and `.gitattributes`.\nQuestion: Are these changes meant to be checked into the protected branch?\nNeed to clarify if these should be ignored or committed, or if the instructions are missing a step.\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-20T18:56:25.79407-05:00","updated_at":"2025-12-09T18:38:37.703285472-05:00","closed_at":"2025-11-26T22:25:47.574326-08:00"} -{"id":"bd-p76kv","title":"bd list can hang indefinitely due to missing timeouts","description":"dispatched_by: gastown/crew/max\n\n## Problem\n\nWhen `bd list` hangs, it can block forever due to missing timeouts at multiple layers:\n\n### 1. No timeout in gastown's `runBdCommand` \n**File:** `internal/mail/bd.go:42-54`\n```go\ncmd := exec.Command(\"bd\", args...)\nif err := cmd.Run(); err != nil { // Waits forever!\n```\nIf `bd` hangs for any reason, gt commands hang forever.\n\n### 2. No timeout in RPC request processing (beads daemon)\n**File:** `internal/rpc/server_routing_validation_diagnostics.go:262-264`\n```go\nfunc (s *Server) reqCtx(_ *Request) context.Context {\n return context.Background() // No deadline!\n}\n```\nIf a database query hangs, the RPC handler hangs forever.\n\n### 3. Mutex starvation potential\n`SearchIssues` takes a read lock on `reconnectMu`, while `reconnect()` takes a write lock. With Go's RWMutex, if there's a steady stream of readers, the writer can starve indefinitely.\n\n## Evidence\n\nObserved stuck processes running for 13+ hours:\n```\nbd list --type message --label cc:mayor/ --status open --json\nbd list --type message --label cc:mayor --status open --json\n```\n\nThe SQLite `busy_timeout` (30s) should have caused failures, not hangs. The processes were likely stuck on the Go `reconnectMu` mutex or a blocked daemon.\n\n## Proposed Fixes\n\n1. **Add timeout to daemon request processing** - Use `context.WithTimeout` in `reqCtx()` (e.g., 60 seconds)\n2. **Consider request timeout propagation** from client to server\n3. **Review reconnectMu usage** for potential starvation scenarios\n\nNote: The gastown side (`runBdCommand`) also needs a fix, but that's a separate repo.","status":"hooked","priority":2,"issue_type":"bug","assignee":"beads/crew/dave","created_at":"2026-01-10T11:56:34.750531-08:00","created_by":"gastown/crew/max","updated_at":"2026-01-10T11:56:42.413961-08:00"} +{"id":"bd-p76kv","title":"bd list can hang indefinitely due to missing timeouts","description":"dispatched_by: gastown/crew/max\n\n## Problem\n\nWhen `bd list` hangs, it can block forever due to missing timeouts at multiple layers:\n\n### 1. No timeout in gastown's `runBdCommand` \n**File:** `internal/mail/bd.go:42-54`\n```go\ncmd := exec.Command(\"bd\", args...)\nif err := cmd.Run(); err != nil { // Waits forever!\n```\nIf `bd` hangs for any reason, gt commands hang forever.\n\n### 2. No timeout in RPC request processing (beads daemon)\n**File:** `internal/rpc/server_routing_validation_diagnostics.go:262-264`\n```go\nfunc (s *Server) reqCtx(_ *Request) context.Context {\n return context.Background() // No deadline!\n}\n```\nIf a database query hangs, the RPC handler hangs forever.\n\n### 3. Mutex starvation potential\n`SearchIssues` takes a read lock on `reconnectMu`, while `reconnect()` takes a write lock. With Go's RWMutex, if there's a steady stream of readers, the writer can starve indefinitely.\n\n## Evidence\n\nObserved stuck processes running for 13+ hours:\n```\nbd list --type message --label cc:mayor/ --status open --json\nbd list --type message --label cc:mayor --status open --json\n```\n\nThe SQLite `busy_timeout` (30s) should have caused failures, not hangs. The processes were likely stuck on the Go `reconnectMu` mutex or a blocked daemon.\n\n## Proposed Fixes\n\n1. **Add timeout to daemon request processing** - Use `context.WithTimeout` in `reqCtx()` (e.g., 60 seconds)\n2. **Consider request timeout propagation** from client to server\n3. **Review reconnectMu usage** for potential starvation scenarios\n\nNote: The gastown side (`runBdCommand`) also needs a fix, but that's a separate repo.","status":"closed","priority":2,"issue_type":"bug","assignee":"beads/crew/dave","created_at":"2026-01-10T11:56:34.750531-08:00","created_by":"gastown/crew/max","updated_at":"2026-01-10T23:44:36.578483-08:00","closed_at":"2026-01-10T23:44:36.578483-08:00","close_reason":"Fixed in commit 69dae103. reqCtx() now applies requestTimeout (30s default) to context, preventing indefinite hangs."} {"id":"bd-p7i2","title":"Add unit test for gitHasUncommittedBeadsChanges()","description":"The new helper function from bd-vd8e needs unit tests in sync_git_test.go to verify:\n- Returns false when no changes\n- Returns true for M (modified)\n- Returns true for A (added)\n- Returns false for ?? (untracked)\n- Returns false for D (deleted)\n\nPart of GH#885 follow-up.","status":"closed","priority":2,"issue_type":"task","assignee":"beads/polecats/ruby","created_at":"2026-01-04T16:15:53.96425-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-04T16:20:40.004117-08:00","closed_at":"2026-01-04T16:20:40.004117-08:00","close_reason":"Added parseGitStatusForBeadsChanges helper function and 14 unit tests covering: empty status, modified (staged/unstaged/both), added, untracked, deleted, renamed, copied, and edge cases"} {"id":"bd-par1","title":"doctor: improve messaging for detection-only hook managers","description":"When bd doctor detects hook managers we can't fully check (pre-commit, overcommit, yorkie, simple-git-hooks), the current warning suggests they're broken. Change to informational: 'pre-commit detected, cannot verify bd integration' rather than implying misconfiguration.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-05T19:19:08.98544-08:00","created_by":"beads/crew/giles","updated_at":"2026-01-05T21:06:05.953116-08:00","closed_at":"2026-01-05T21:06:05.953116-08:00","close_reason":"Implemented - detection-only managers now show informational message"} +{"id":"bd-pbfib","title":"Session ended: gt-beads-crew-fang","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T22:57:42.09645-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-09T22:57:42.133588-08:00","closed_at":"2026-01-09T22:57:42.133588-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-pbh","title":"Release v0.30.4","description":"## Version Bump Workflow\n\nCoordinating release from 0.30.3 to 0.30.4.\n\n### Components Updated\n- Go CLI (cmd/bd/version.go)\n- Claude Plugin (.claude-plugin/*.json)\n- MCP Server (integrations/beads-mcp/)\n- npm Package (npm-package/package.json)\n- Git hooks (cmd/bd/templates/hooks/)\n\n### Release Channels\n- GitHub Releases (GoReleaser)\n- PyPI (beads-mcp)\n- npm (@beads/cli)\n- Homebrew (homebrew-beads tap)\n","status":"tombstone","priority":1,"issue_type":"epic","created_at":"2025-12-17T21:19:10.926133-08:00","updated_at":"2025-12-25T01:21:01.952723-08:00","labels":["release","v0.30.4","workflow"],"deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"epic"} {"id":"bd-pbh.1","title":"Update cmd/bd/version.go to 0.30.4","description":"Update the Version constant in cmd/bd/version.go:\n```go\nVersion = \"0.30.4\"\n```\n\n\n```verify\ngrep -q 'Version = \"0.30.4\"' cmd/bd/version.go\n```","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-17T21:19:10.9462-08:00","updated_at":"2025-12-25T01:21:01.952723-08:00","labels":["workflow"],"dependencies":[{"issue_id":"bd-pbh.1","depends_on_id":"bd-pbh","type":"parent-child","created_at":"2025-12-17T21:19:10.946633-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":"task"} {"id":"bd-pbh.10","title":"Run check-versions.sh - all must pass","description":"Run the version consistency check:\n```bash\n./scripts/check-versions.sh\n```\n\nAll versions must match 0.30.4.\n\n\n```verify\n./scripts/check-versions.sh\n```","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-17T21:19:11.047311-08:00","updated_at":"2025-12-25T01:21:01.952723-08:00","labels":["workflow"],"dependencies":[{"issue_id":"bd-pbh.10","depends_on_id":"bd-pbh","type":"parent-child","created_at":"2025-12-17T21:19:11.047888-08:00","created_by":"daemon"},{"issue_id":"bd-pbh.10","depends_on_id":"bd-pbh.1","type":"blocks","created_at":"2025-12-17T21:19:11.159084-08:00","created_by":"daemon"},{"issue_id":"bd-pbh.10","depends_on_id":"bd-pbh.4","type":"blocks","created_at":"2025-12-17T21:19:11.168248-08:00","created_by":"daemon"},{"issue_id":"bd-pbh.10","depends_on_id":"bd-pbh.5","type":"blocks","created_at":"2025-12-17T21:19:11.177869-08:00","created_by":"daemon"},{"issue_id":"bd-pbh.10","depends_on_id":"bd-pbh.6","type":"blocks","created_at":"2025-12-17T21:19:11.187629-08:00","created_by":"daemon"},{"issue_id":"bd-pbh.10","depends_on_id":"bd-pbh.7","type":"blocks","created_at":"2025-12-17T21:19:11.199955-08:00","created_by":"daemon"},{"issue_id":"bd-pbh.10","depends_on_id":"bd-pbh.8","type":"blocks","created_at":"2025-12-17T21:19:11.211479-08:00","created_by":"daemon"},{"issue_id":"bd-pbh.10","depends_on_id":"bd-pbh.9","type":"blocks","created_at":"2025-12-17T21:19:11.224059-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":"task"} @@ -1572,6 +1660,8 @@ {"id":"bd-phin","title":"bd wisp create doesn't set Wisp flag on spawned issues","description":"When running 'bd wisp create \u003cproto\u003e', the spawned issues don't have Wisp: true set. They show up in 'bd ready' and get synced to JSONL.\n\nExample: gt-lqc6m and gt-wisp-ry9 are mol-deacon-patrol issues that should be wisps but have wisp: null.\n\nThis causes patrol cycles to pollute the issue database and show up as ready work.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-27T00:34:06.684776-08:00","created_by":"mayor","updated_at":"2025-12-27T14:48:01.774826-08:00","closed_at":"2025-12-27T14:48:01.774826-08:00"} {"id":"bd-phtv","title":"bd pin: pinned field overwritten by subsequent bd commands","description":"## Summary\n\nThe `bd pin` command correctly sets `pinned=1` in SQLite, but any subsequent `bd` command (including read-only commands like `bd show`) resets `pinned` to 0.\n\n## Reproduction Steps\n\n```bash\nbd --no-daemon pin \u003cissue-id\u003e --for=max\nsqlite3 .beads/beads.db \"SELECT id, pinned FROM issues WHERE id=\\\"\u003cissue-id\u003e\\\"\"\n# Shows pinned=1 ✓\n\nbd --no-daemon show \u003cissue-id\u003e --json\nsqlite3 .beads/beads.db \"SELECT id, pinned FROM issues WHERE id=\\\"\u003cissue-id\u003e\\\"\"\n# Shows pinned=0 ✗ WRONG\n```\n\n## Root Cause Investigation\n\n### Prime Suspects\n\n1. **JSONL import overwrites DB** - The `pinned` field has `omitempty` so false values arent in JSONL. When JSONL is imported, it overwrites the DB pinned=1 with default pinned=0.\n\n2. **Files to check:**\n - `internal/importer/importer.go` - ImportIssue() may unconditionally set all fields\n - `internal/storage/sqlite/issues.go` - UpsertIssue() may not preserve pinned\n - `cmd/bd/main.go` - ensureStoreActive() may trigger import\n\n### Debug Steps\n\n```bash\n# Add debug logging to track what is writing pinned=0\ngrep -rn \"pinned\" internal/storage/sqlite/*.go\ngrep -rn \"Pinned\" internal/importer/*.go\n```\n\n## Likely Fix\n\nIn `internal/importer/importer.go` or `internal/storage/sqlite/issues.go`:\n\n```go\n// When upserting from JSONL, preserve pinned field if already set\nfunc (s *SQLiteStorage) UpsertIssue(ctx context.Context, issue *types.Issue) error {\n // Check if issue exists and is pinned\n existing, _ := s.GetIssue(ctx, issue.ID)\n if existing != nil \u0026\u0026 existing.Pinned \u0026\u0026 !issue.Pinned {\n // Preserve existing pinned status\n issue.Pinned = existing.Pinned\n }\n // ... rest of upsert\n}\n```\n\nOR the import should skip fields that are omitempty and not present in JSONL:\n\n```go\n// In importer, only update fields that are explicitly set in JSONL\n// Pinned with omitempty means absent = dont change, not absent = false\n```\n\n## Testing\n\n```bash\n# After fix:\nbd --no-daemon pin \u003cissue-id\u003e --for=max\nbd --no-daemon show \u003cissue-id\u003e --json # Should not reset pinned\nbd list --pinned # Should show the pinned issue\nbd hook --agent max # Should show pinned work\n```\n\n## Files to Modify\n\n1. **internal/importer/importer.go** - Preserve pinned on import\n2. **internal/storage/sqlite/issues.go** - UpsertIssue preserve pinned\n3. **Add test** in internal/importer/importer_test.go\n\n## Success Criteria\n- `bd pin` survives subsequent bd commands\n- `bd list --pinned` shows pinned issues\n- `bd hook --agent X` shows pinned work\n- Existing tests still pass","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-23T12:32:20.046988-08:00","updated_at":"2025-12-23T13:47:49.936021-08:00","closed_at":"2025-12-23T13:47:49.936021-08:00","labels":["export:pinned-field-fix"],"dependencies":[{"issue_id":"bd-phtv","depends_on_id":"bd-iz5t","type":"parent-child","created_at":"2025-12-23T12:44:07.140151-08:00","created_by":"daemon"}]} {"id":"bd-phwd","title":"Add timeout message for long-running git push operations","description":"When git push hangs waiting for credential/browser auth, show a periodic message to the user instead of appearing frozen. Add timeout messaging after N seconds of inactivity during git operations.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T11:44:57.318984535-07:00","updated_at":"2025-12-21T11:46:05.218023559-07:00","closed_at":"2025-12-21T11:46:05.218023559-07:00"} +{"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-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"}]} @@ -1600,6 +1690,7 @@ {"id":"bd-qioh","title":"Standardize error handling: replace direct fmt.Fprintf+os.Exit with FatalError","description":"Standardize error handling in cmd/bd/ using FatalError pattern.\n\n## Current State\n~200+ instances of direct `fmt.Fprintf(os.Stderr, ...) + os.Exit(1)` pattern scattered across cmd/bd/*.go files.\n\n## Target Pattern\n\nUse existing FatalError helper (or create if missing):\n\n```go\n// In cmd/bd/helpers.go or similar\nfunc FatalError(format string, args ...interface{}) {\n fmt.Fprintf(os.Stderr, \"Error: \"+format+\"\\n\", args...)\n os.Exit(1)\n}\n\nfunc FatalErrorf(err error, context string) {\n fmt.Fprintf(os.Stderr, \"Error: %s: %v\\n\", context, err)\n os.Exit(1)\n}\n```\n\n## Transformation\n\n```go\n// Before\nfmt.Fprintf(os.Stderr, \"Error: %v\\n\", err)\nos.Exit(1)\n\n// After\nFatalError(\"%v\", err)\n\n// Before\nfmt.Fprintf(os.Stderr, \"Error: invalid --since duration: %v\\n\", err)\nos.Exit(1)\n\n// After\nFatalError(\"invalid --since duration: %v\", err)\n```\n\n## Files to Update (by occurrence count)\nRun: `grep -c \"os.Exit(1)\" cmd/bd/*.go | sort -t: -k2 -rn | head -20`\n\nPriority files (highest occurrence):\n- close.go\n- show.go\n- sync.go\n- init.go\n- list.go\n- create.go\n- update.go\n\n## Implementation Steps\n\n1. **Check if FatalError exists** in cmd/bd/helpers.go or create it\n2. **Create migration script** or use sed:\n ```bash\n # Find patterns to replace\n grep -rn \"fmt.Fprintf(os.Stderr.*Error.*\\n.*os.Exit(1)\" cmd/bd/\n ```\n3. **Replace systematically** file by file\n4. **Run tests** after each file to verify behavior unchanged\n5. **Run linter** to catch any missed patterns\n\n## Verification\n```bash\n# Count remaining direct exits (should be near zero)\ngrep -c \"os.Exit(1)\" cmd/bd/*.go | awk -F: \"{sum+=\\$2} END {print sum}\"\n\n# Run tests\ngo test -short ./cmd/bd/...\n```\n\n## Success Criteria\n- All error exits use FatalError/FatalErrorf\n- Consistent \"Error: \" prefix on all error messages\n- Tests pass\n- No behavior changes (exit codes remain 1)","notes":"## Progress (Dec 2025)\n\nStandardized error handling in 3 major files:\n- compact.go: All 48 os.Exit(1) calls converted to FatalError\n- sync.go: All error patterns converted (kept 1 valid summary exit)\n- migrate.go: 4 patterns converted\n\n## Remaining Work\n~326 fmt.Fprintf(os.Stderr, \"Error:\") patterns remain across ~30 files.\nHigh-count files remaining: show.go (16), dep.go (14), gate.go (28), init.go (11).\n\n## Verification\n- Build compiles successfully\n- Tests pass","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-16T18:17:19.309394-08:00","updated_at":"2025-12-23T14:14:37.939802-08:00","closed_at":"2025-12-23T14:14:37.939802-08:00","dependencies":[{"issue_id":"bd-qioh","depends_on_id":"bd-iz5t","type":"parent-child","created_at":"2025-12-23T12:44:07.43514-08:00","created_by":"daemon"}]} {"id":"bd-qket","title":"Add computed .parent field to JSON output for convenience","description":"Currently parent is only in dependencies[]. Add a top-level .parent field to JSON/JSONL output that extracts the parent-child dependency for easier querying.\n\nExample:\n```bash\n# Current (works but verbose):\nbd show \u003cid\u003e --json | jq '.[0].dependencies[] | select(.dependency_type == \"parent-child\") | .id'\n\n# Desired:\nbd show \u003cid\u003e --json | jq '.[0].parent'\n```\n\nLow priority enhancement.","status":"closed","priority":4,"issue_type":"feature","created_at":"2025-12-27T23:32:44.24217-08:00","created_by":"beads/crew/emma","updated_at":"2025-12-28T02:24:31.453442-08:00","closed_at":"2025-12-28T02:24:31.453442-08:00"} {"id":"bd-qkw9","title":"Run bump-version.sh {{version}}","description":"Run ./scripts/bump-version.sh {{version}} to update version in all files","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T22:55:58.841424-08:00","updated_at":"2025-12-20T17:59:26.262877-08:00","closed_at":"2025-12-20T01:18:48.99813-08:00","dependencies":[{"issue_id":"bd-qkw9","depends_on_id":"bd-6s61","type":"parent-child","created_at":"2025-12-19T22:56:14.786027-08:00","created_by":"daemon"}]} +{"id":"bd-qna0y","title":"Session ended: gt-beads-witness","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T21:18:44.895555-08:00","created_by":"beads/witness","updated_at":"2026-01-10T21:18:44.941152-08:00","closed_at":"2026-01-10T21:18:44.941152-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-qno8m","title":"Merge: obsidian-mk99aezw","description":"branch: polecat/obsidian-mk99aezw\ntarget: main\nsource_issue: obsidian-mk99aezw\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-10T20:53:49.204101-08:00","created_by":"beads/polecats/obsidian","updated_at":"2026-01-10T20:54:57.846605-08:00","closed_at":"2026-01-10T20:54:57.846605-08:00","close_reason":"Branch never pushed - false completion from obsidian","labels":["gt:merge-request"]} {"id":"bd-qobn","title":"Code smell: 20+ global variables in main.go","description":"main.go lines 63-103 have over 20 global variables managing command-line state, daemon connection, auto-flush, auto-import, and error handling.\n\n**Globals include:**\ndbPath, actor, store, jsonOutput, daemonStatus, daemonClient, noDaemon, rootCtx, rootCancel, autoFlushEnabled, flushMutex, storeMutex, storeActive, flushFailureCount, lastFlushError, flushManager, hookRunner, skipFinalFlush, autoImportEnabled, versionUpgradeDetected, previousVersion, upgradeAcknowledged\n\n**Problem:**\n- Global state makes testing difficult\n- Race conditions possible between goroutines\n- Hard to track which functions modify which globals\n\n**Acceptance Criteria:**\n- [ ] Create CommandContext struct to hold runtime state\n- [ ] Pass context through command execution\n- [ ] Reduce global count to essential minimum\n- [ ] Tests pass","status":"closed","priority":3,"issue_type":"chore","created_at":"2025-12-28T18:59:27.551044-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-30T18:12:30.978805-08:00","closed_at":"2025-12-30T16:17:18.258941-08:00","close_reason":"Implemented CommandContext struct to consolidate 20+ globals into 1. Added accessor functions for backward-compatible migration. Updated direct_mode.go as example.","dependencies":[{"issue_id":"bd-qobn","depends_on_id":"bd-ox1o","type":"blocks","created_at":"2025-12-28T19:00:23.651276-08:00","created_by":"daemon"}]} {"id":"bd-qpf3","title":"Bug: bd swarm create allows duplicate swarm molecules","description":"Running `bd swarm create \u003cepic\u003e` twice creates two swarm molecules for the same epic.\n\nShould check for existing swarm molecule linked to the epic and either:\n1. Error with 'swarm already exists: \u003cid\u003e'\n2. Warn and return existing swarm ID\n3. Add --force flag to allow creating another\n\nCheck by querying for molecules with mol_type=swarm that have a relates-to dependency to the epic.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-28T21:38:04.252522-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T21:59:59.35812-08:00","closed_at":"2025-12-28T21:59:59.35812-08:00","dependencies":[{"issue_id":"bd-qpf3","depends_on_id":"bd-2ubv","type":"parent-child","created_at":"2025-12-28T21:38:44.740671-08:00","created_by":"daemon"}]} @@ -1620,10 +1711,12 @@ {"id":"bd-qqc.8","title":"Create and push git tag v{{version}}","description":"Create the release tag and push it:\n\n```bash\ngit tag v{{version}}\ngit push origin v{{version}}\n```\n\nThis triggers the GoReleaser GitHub Action to build release binaries.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-18T22:42:34.659927-08:00","updated_at":"2025-12-24T16:25:30.608841-08:00","dependencies":[{"issue_id":"bd-qqc.8","depends_on_id":"bd-qqc","type":"parent-child","created_at":"2025-12-18T22:42:34.660248-08:00","created_by":"daemon"},{"issue_id":"bd-qqc.8","depends_on_id":"bd-vgi5","type":"blocks","created_at":"2025-12-18T22:43:21.209529-08:00","created_by":"daemon"}],"deleted_at":"2025-12-24T16:25:30.608841-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} {"id":"bd-qqc.9","title":"Update Homebrew formula","description":"Update the Homebrew tap with new version:\n\n```bash\n./scripts/update-homebrew.sh {{version}}\n```\n\nThis script waits for GitHub Actions to complete (~5 min), then updates the formula with new SHA256 hashes.\n\nAfter running, verify the formula with:\n\n```bash\nbrew info steveyegge/beads/bd\n```","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-18T22:42:35.815096-08:00","updated_at":"2025-12-24T16:25:30.525596-08:00","dependencies":[{"issue_id":"bd-qqc.9","depends_on_id":"bd-qqc","type":"parent-child","created_at":"2025-12-18T22:42:35.816752-08:00","created_by":"daemon"},{"issue_id":"bd-qqc.9","depends_on_id":"bd-qqc.8","type":"blocks","created_at":"2025-12-18T22:43:21.332955-08:00","created_by":"daemon"}],"deleted_at":"2025-12-24T16:25:30.525596-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} {"id":"bd-qqvw","title":"Vendor and integrate beads-merge tool","description":"Incorporate @neongreen's beads-merge 3-way merge tool into bd to solve:\n- Multi-workspace deletion sync (bd-hv01)\n- Git merge conflicts in JSONL\n- Field-level intelligent merging\n\n**Repository**: https://github.com/neongreen/mono/tree/main/beads-merge\n\n**Integration approach**: Vendor the Go code with attribution, pending @neongreen's approval (GitHub issue #240)\n\n**Benefits**:\n- Prevents deletion resurrection bug\n- Smart dependency merging (union + dedup)\n- Timestamp handling (max wins)\n- Detects deleted-vs-modified conflicts\n- Works as git merge driver\n\n**Acceptance criteria**:\n- beads-merge code vendored into bd codebase\n- Available as `bd merge` command\n- Git merge driver setup during `bd init`\n- Tests verify 3-way merge logic\n- Documentation updated\n- @neongreen credited","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-05T18:41:59.500359-08:00","updated_at":"2025-11-06T18:19:16.234208-08:00","closed_at":"2025-11-06T15:40:24.796921-08:00"} +{"id":"bd-qrkma","title":"Session ended: gt-beads-crew-grip","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T13:52:50.287304-08:00","created_by":"beads/crew/grip","updated_at":"2026-01-09T13:52:50.326271-08:00","closed_at":"2026-01-09T13:52:50.326271-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-qs4p","title":"bd import fails on duplicate external_ref with no resolution options","description":"When JSONL contains duplicate external_ref values (e.g., two issues both have external_ref='BS-170'), bd import fails entirely with no resolution options.\n\nUser must manually edit JSONL to remove duplicates, which is error-prone.\n\nExample error:\n```\nbatch import contains duplicate external_ref values:\nexternal_ref 'BS-170' appears in issues: [opal-39 opal-43]\n```\n\nShould handle this similar to duplicate issue detection - offer to merge, pick one, or clear duplicates.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-06T10:53:41.906165-08:00","updated_at":"2025-11-06T11:03:16.975041-08:00","closed_at":"2025-11-06T11:03:16.975041-08:00"} {"id":"bd-qsbn","title":"swarm status: Handle external dependencies and error cases","description":"Three issues: (1) Silent error swallowing - GetDependencyRecords errors are silently continued, but analyzeEpicForSwarm returns errors. Inconsistent. (2) External dependencies ignored - if issue depends on something outside epic thats still open, we mark it Ready incorrectly. (3) Command usage string says [epic-id] (optional) but requires exactly 1 arg. File: cmd/bd/swarm.go","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-28T21:31:08.574846-08:00","created_by":"beads/crew/emma","updated_at":"2025-12-30T15:44:43.363959-08:00","closed_at":"2025-12-30T00:36:28.565331-08:00","close_reason":"Fixed all three issues: (1) Made error handling consistent - analyzeEpicForSwarm now adds warnings for GetDependencyRecords failures instead of returning errors. (2) External dependencies now checked in getSwarmStatus - open external deps block issues. (3) Usage strings fixed to use \u003cepic-id\u003e instead of [epic-id] for required arguments."} {"id":"bd-qsm","title":"Auto-compact deletions during bd sync","description":"Parent: bd-imj\n\n## Task\nOptionally prune deletions manifest during sync when threshold exceeded.\n\n**Note: Opt-in feature** - disabled by default to avoid sync latency.\n\n## Implementation\n\nIn `bd sync`:\n```go\nfunc (s *Syncer) Sync() error {\n // ... existing sync logic ...\n \n // Auto-compact only if enabled\n if s.config.GetBool(\"deletions.auto_compact\", false) {\n deletionCount := deletions.Count(\".beads/deletions.jsonl\")\n threshold := s.config.GetInt(\"deletions.auto_compact_threshold\", 1000)\n \n if deletionCount \u003e threshold {\n retentionDays := s.config.GetInt(\"deletions.retention_days\", 7)\n if err := s.compactor.PruneDeletions(retentionDays); err != nil {\n log.Warnf(\"Failed to auto-compact deletions: %v\", err)\n // Non-fatal, continue sync\n }\n }\n }\n \n // ... rest of sync ...\n}\n```\n\n## Configuration\n```yaml\ndeletions:\n retention_days: 7\n auto_compact: false # Opt-in, disabled by default\n auto_compact_threshold: 1000 # Trigger when \u003e N entries (if enabled)\n```\n\n## Acceptance Criteria\n- [ ] Auto-compact disabled by default\n- [ ] Enabled via config `deletions.auto_compact: true`\n- [ ] Sync checks deletion count only when enabled\n- [ ] Auto-prunes when threshold exceeded\n- [ ] Failure is non-fatal (logged warning)\n- [ ] Test: no compaction when disabled\n- [ ] Test: compaction triggers when enabled and threshold exceeded","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-25T09:57:04.522795-08:00","updated_at":"2025-11-25T15:03:01.469629-08:00","closed_at":"2025-11-25T15:03:01.469629-08:00"} -{"id":"bd-qtcgm","title":"External ref test","status":"open","priority":1,"issue_type":"task","created_at":"2026-01-10T20:36:04.333898-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-10T20:36:04.333898-08:00","external_ref":"https://example.com/spec.md"} +{"id":"bd-qspi5","title":"Session ended: gt-beads-witness","status":"open","priority":2,"issue_type":"event","created_at":"2026-01-10T11:57:03.211335-08:00","created_by":"beads/witness","updated_at":"2026-01-10T11:57:03.211335-08:00","ephemeral":true} +{"id":"bd-qtcgm","title":"External ref test","status":"open","priority":1,"issue_type":"task","owner":"steve.yegge@gmail.com","created_at":"2026-01-10T20:36:04.333898-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-10T20:36:04.333898-08:00","external_ref":"https://example.com/spec.md"} {"id":"bd-quw1","title":"Polecat phase handoff: gt done --phase-complete","description":"Add phase handoff protocol for polecats hitting gate steps.\n\n## Current Behavior\nPolecat runs all steps, blocks on external waits, times out.\n\n## New Behavior\n1. Polecat completes work up to gate step\n2. Polecat runs: gt done --phase-complete\n3. This signals: 'phase done, molecule awaiting gate'\n4. Witness recycles polecat (context freed)\n5. When gate closes, Witness dispatches new polecat\n6. New polecat continues from step after gate\n\n## Implementation\n- Add --phase-complete flag to gt done\n- Witness tracks molecules in 'awaiting-gate' state\n- When gate closes (via bd gate resolve), molecule unblocks\n- Dispatch logic resumes molecule with new polecat\n\n## Acceptance Criteria\n- [ ] gt done --phase-complete implemented\n- [ ] Witness tracks awaiting-gate molecules\n- [ ] Gate closure triggers molecule resume\n- [ ] New polecat picks up from correct step","notes":"Beads changes committed (9269325e):\n- bd gate add-waiter \u003cgate-id\u003e \u003cwaiter\u003e\n- bd gate show \u003cgate-id\u003e --json\n- Waiters field in RPC protocol\n\nGastown changes written but need separate commit (bd-gxb4):\n- gt done --phase-complete --gate flag\n- Witness PHASE_COMPLETE handler\n- AddGateWaiter in beads wrapper\n\nBlocked on bd-gxb4 for gastown commit.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-02T13:27:42.298423-08:00","created_by":"mayor","updated_at":"2026-01-04T15:22:07.769837-08:00","closed_at":"2026-01-02T16:46:55.671506-08:00","close_reason":"Complete: beads part (jasper) + gastown part (bd-gxb4/furiosa) both merged","dependencies":[{"issue_id":"bd-quw1","depends_on_id":"bd-d1n1","type":"parent-child","created_at":"2026-01-02T13:28:18.599801-08:00","created_by":"mayor"},{"issue_id":"bd-quw1","depends_on_id":"bd-4k3c","type":"blocks","created_at":"2026-01-02T13:28:18.665709-08:00","created_by":"mayor"},{"issue_id":"bd-quw1","depends_on_id":"bd-gxb4","type":"blocks","created_at":"2026-01-02T16:36:55.38367-08:00","created_by":"beads/polecats/jasper"}]} {"id":"bd-qv8f9","title":"Add logging for silent failures in cost tracking","description":"dispatched_by: mayor\n\n## Problem\n\nSeveral error paths in cost tracking silently continue without logging:\n- Line 1014: bd show failure\n- Line 1019: JSON unmarshal failure \n- Line 1037: Payload unmarshal failure\n- Line 1147: bd show failure in deletion\n\nThis makes debugging difficult when costs are not being tracked correctly.\n\n## Location\n\ninternal/cmd/costs.go - multiple locations\n\n## Solution\n\nAdd debug logging (respecting --verbose flag) for these silent failures.","status":"closed","priority":3,"issue_type":"task","assignee":"gastown/polecats/furiosa","created_at":"2026-01-08T22:55:25.275755-08:00","created_by":"mayor","updated_at":"2026-01-09T00:40:59.509492-08:00","closed_at":"2026-01-09T00:40:59.509492-08:00","close_reason":"Merged via f19ddc54","comments":[{"id":12,"issue_id":"bd-qv8f9","author":"beads/polecats/jasper","text":"The file path in the description (internal/cmd/costs.go) doesn't exist in beads/polecats/jasper. The costs.go file is located in the gastown project at /Users/stevey/gt/gastown/crew/*/internal/cmd/costs.go. This task appears to be assigned to the wrong repo - should likely be assigned to gastown instead.","created_at":"2026-01-09T08:24:45Z"}]} {"id":"bd-qvpn","title":"Merge: jasper-1767138512869","description":"branch: polecat/jasper-1767138512869\ntarget: main\nsource_issue: jasper-1767138512869\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T15:51:49.011389-08:00","created_by":"beads/polecats/jasper","updated_at":"2025-12-30T18:12:30.968698-08:00","closed_at":"2025-12-30T18:11:08.036693-08:00"} @@ -1658,12 +1751,15 @@ {"id":"bd-rig-beads","title":"beads","description":"Rig identity bead for beads.\n\nrepo: https://github.com/steveyegge/beads\nprefix: bd\nstate: active","status":"open","priority":2,"issue_type":"rig","assignee":"beads/crew/wolf","created_at":"2026-01-08T12:19:32.120798-08:00","created_by":"gastown/polecats/furiosa","updated_at":"2026-01-09T23:02:02.733868-08:00"} {"id":"bd-rinx","title":"Witness should auto-nuke idle polecats, not escalate","description":"When witness detects an idle polecat with no work, it escalates to Mayor asking what to do.\n\nExpected: Witness should nuke idle polecats automatically if:\n1. No work hooked\n2. No uncommitted/unpushed changes (cleanup_status=clean)\n3. Idle for \u003ethreshold (e.g., 5 minutes)\n\nOnly escalate if polecat has unsaved work that needs recovery.\n\nCurrent behavior creates unnecessary mail noise for the Mayor.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-30T21:21:57.918823-08:00","created_by":"mayor","updated_at":"2025-12-31T00:21:22.701781-08:00","closed_at":"2025-12-31T00:21:22.701781-08:00","close_reason":"Added Step 3a to witness patrol formula for auto-nuke of idle polecats with clean git state"} {"id":"bd-rivt3","title":"Review PR #964: FK error regression tests","description":"dispatched_by: beads/crew/emma\n\nReview and verify PR #964 (steveyegge/beads)\n\nPR: https://github.com/steveyegge/beads/pull/964\nAuthor: peterkc\n\nAdds regression tests for dependency command FK error handling.\n- gh pr view 964 --repo steveyegge/beads\n- gh pr diff 964 --repo steveyegge/beads\n- If good: gh pr merge 964 --repo steveyegge/beads --squash","status":"closed","priority":2,"issue_type":"task","assignee":"beads/crew/dave","created_at":"2026-01-08T14:30:21.366079-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-08T14:32:39.106378-08:00","closed_at":"2026-01-08T14:32:39.106378-08:00","close_reason":"Reviewed and merged PR #964. All FK error regression tests pass locally. Well-documented with tracer bullet findings."} +{"id":"bd-rjuu6","title":"gt mail mark-read: desire path for marking messages read without archiving","description":"dispatched_by: beads/crew/emma\n\n## Context\n\nAgents naturally try `gt mail mark-read \u003cid\u003e` after reading a message. Currently this fails:\n\n```\nError: unknown command \"mark-read\" for \"gt mail\"\n```\n\n## Desire Paths Pattern\n\nWhen agents consistently try a command that doesn't exist, that's a signal the API should support it. This is the 'desire paths' approach to agent UX - let natural agent behavior inform the interface.\n\n## Use Case\n\n- Agent reads a message with `gt mail read \u003cid\u003e`\n- Message content is acknowledged but agent wants to keep it in inbox (not archive)\n- Agent tries `gt mail mark-read \u003cid\u003e` - fails\n- Currently no way to mark as read without archiving\n\n## Proposed Solution\n\nAdd `gt mail mark-read \u003cid\u003e` that:\n1. Marks message as read (removes unread indicator)\n2. Keeps message in inbox (doesn't archive)\n\nAlternative: `gt mail read \u003cid\u003e` could auto-mark as read (may already do this but the inbox display doesn't reflect it).","status":"closed","priority":2,"issue_type":"feature","assignee":"beads/crew/fang","created_at":"2026-01-10T23:56:27.146061-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-11T00:03:49.725388-08:00","closed_at":"2026-01-11T00:03:49.725388-08:00","close_reason":"Implemented gt mail mark-read and mark-unread commands. Uses labels to track read status without archiving."} {"id":"bd-rk5ok","title":"Session ended: gt-beads-crew-fang","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T17:42:17.028324-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-07T17:42:17.066797-08:00","closed_at":"2026-01-07T17:42:17.066797-08:00","close_reason":"auto-closed session event"} {"id":"bd-rl5t","title":"Integration test: agent waits for CI via gate","description":"End-to-end test of the gate workflow.\n\n## Test Scenario\n1. Agent creates gate: bd gate create --await gh:run:123 --timeout 5m --notify beads/dave\n2. Agent writes handoff and exits\n3. Deacon patrol checks gate condition\n4. (Mock) GitHub run completes\n5. Deacon notifies waiter and closes gate\n6. New agent session reads mail and resumes\n\n## Test Requirements\n- Mock GitHub API responses\n- Test timeout path\n- Test multiple waiters\n- Verify mail notifications sent","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T11:44:41.725752-08:00","updated_at":"2025-12-23T12:24:08.346347-08:00","closed_at":"2025-12-23T12:24:08.346347-08:00","dependencies":[{"issue_id":"bd-rl5t","depends_on_id":"bd-udsi","type":"parent-child","created_at":"2025-12-23T11:44:53.157037-08:00","created_by":"daemon"},{"issue_id":"bd-rl5t","depends_on_id":"bd-2l03","type":"blocks","created_at":"2025-12-23T11:44:56.674866-08:00","created_by":"daemon"},{"issue_id":"bd-rl5t","depends_on_id":"bd-ykqu","type":"blocks","created_at":"2025-12-23T11:44:56.753264-08:00","created_by":"daemon"}]} +{"id":"bd-rli1y","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T12:48:06.966469-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-10T12:48:07.026979-08:00","closed_at":"2026-01-10T12:48:07.026979-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-rm8m","title":"Refinery Patrol","description":"Merge queue processor patrol loop with verification gates.","status":"closed","priority":2,"issue_type":"molecule","created_at":"2025-12-30T19:23:45.503188-08:00","created_by":"deacon","updated_at":"2026-01-09T21:15:43.010385-08:00","closed_at":"2026-01-09T21:15:43.010385-08:00","close_reason":"Orphaned patrol molecules"} {"id":"bd-rnle","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T00:17:08.220689-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-07T00:17:08.258596-08:00","closed_at":"2026-01-07T00:17:08.258596-08:00","close_reason":"auto-closed session event"} {"id":"bd-rnnr","title":"BondRef data model for compound lineage","description":"Add data model support for tracking compound molecule lineage.\n\nNEW FIELDS on Issue:\n bonded_from: []BondRef // For compounds: constituent protos\n\nNEW TYPE:\n type BondRef struct {\n ProtoID string // Source proto ID\n BondType string // sequential, parallel, conditional\n BondPoint string // Attachment site (issue ID or empty for root)\n }\n\nJSONL SERIALIZATION:\n {\n \"id\": \"proto-feature-tested\",\n \"title\": \"Feature with tests\",\n \"bonded_from\": [\n {\"proto_id\": \"proto-feature\", \"bond_type\": \"root\"},\n {\"proto_id\": \"proto-testing\", \"bond_type\": \"sequential\"}\n ],\n ...\n }\n\nQUERIES:\n- GetCompoundConstituents(id) → []BondRef\n- IsCompound(id) → bool\n- GetCompoundsUsing(protoID) → []Issue // Reverse lookup","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-21T00:59:38.582509-08:00","updated_at":"2025-12-21T01:19:43.922416-08:00","closed_at":"2025-12-21T01:19:43.922416-08:00","dependencies":[{"issue_id":"bd-rnnr","depends_on_id":"bd-o5xe","type":"parent-child","created_at":"2025-12-21T00:59:51.234246-08:00","created_by":"daemon"}]} {"id":"bd-rp4o","title":"Deleted issues resurrect during bd sync (tombstones not propagating)","description":"## Problem\n\nWhen issues are deleted with bd delete --force, they get deleted from the local DB but resurrect during the next bd sync.\n\n## Reproduction\n\n1. Observe orphan warnings (bd-cb64c226.*, bd-cbed9619.*)\n2. Delete them: bd delete bd-cb64c226.1 ... --force\n3. Run bd sync\n4. Orphan warnings reappear - issues were resurrected!\n\n## Root Cause Hypothesis\n\nThe sync branch workflow (beads-sync) has the old state before deletions. When bd sync pulls from beads-sync and copies JSONL to main, the deleted issues are re-imported.\n\nTombstones may not be properly:\n1. Written to beads-sync during export\n2. Propagated during pull/merge\n3. Honored during import\n\n## Related\n\n- bd-7b7h: chicken-and-egg sync.branch bug (same workflow)\n- bd-ncwo: ID-based fallback matching to prevent ghost resurrection\n\n## Files to Investigate\n\n- cmd/bd/sync.go (export/import flow)\n- internal/syncbranch/worktree.go (PullFromSyncBranch, copyJSONLToMainRepo)\n- internal/importer/ (tombstone handling)","status":"tombstone","priority":1,"issue_type":"bug","created_at":"2025-12-16T23:09:43.072696-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} +{"id":"bd-rplt1","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-11T00:25:45.144963-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T00:25:45.185133-08:00","closed_at":"2026-01-11T00:25:45.185133-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-rpn","title":"Implement `bd prime` command for AI context loading","description":"Create a `bd prime` command that outputs AI-optimized markdown containing essential Beads workflow context. This provides an alternative to the MCP server for token-conscious users and enables context recovery after compaction/clearing.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-11T23:28:42.74124-08:00","updated_at":"2025-11-12T08:30:15.711595-08:00","closed_at":"2025-11-12T08:30:15.711595-08:00","dependencies":[{"issue_id":"bd-rpn","depends_on_id":"bd-90v","type":"parent-child","created_at":"2025-11-11T23:31:20.357861-08:00","created_by":"daemon"}]} {"id":"bd-rq21y","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-08T21:03:14.315522-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-08T21:03:14.35088-08:00","closed_at":"2026-01-08T21:03:14.35088-08:00","close_reason":"auto-closed session event"} {"id":"bd-rrjo","title":"Swarm: Test coordinator display","description":"Swarm molecule orchestrating epic bd-2rkr.\n\nEpic: bd-2rkr\nCoordinator: ","status":"closed","priority":2,"issue_type":"molecule","created_at":"2025-12-28T22:00:50.527754-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-29T13:40:29.71176-08:00","closed_at":"2025-12-29T13:40:29.71176-08:00","close_reason":"Stale/spurious - test artifacts, merged PRs, or auto-close candidates","dependencies":[{"issue_id":"bd-rrjo","depends_on_id":"bd-2rkr","type":"relates-to","created_at":"2025-12-28T22:00:50.528518-08:00","created_by":"beads/crew/dave"}]} @@ -1675,6 +1771,7 @@ {"id":"bd-rx6o","title":"Test Child Task","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-27T22:15:23.27506-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-27T22:16:35.925357-08:00","deleted_at":"2025-12-27T22:16:35.925357-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"bd-ry1u","title":"Publish official devcontainer configuration","notes":"Devcontainer configuration implemented. Manual testing required in actual devcontainer environment (Codespaces or VSCode Remote Containers). All code changes complete, tests pass, linting clean.","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-11-05T15:02:21.783666-08:00","updated_at":"2025-11-05T17:46:42.70998-08:00","closed_at":"2025-11-05T17:46:42.70998-08:00"} {"id":"bd-rze6","title":"Digest: Release v0.34.0 @ 2025-12-22 12:16","description":"Released v0.34.0: wisp commands, chemistry UX, cross-project deps","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-22T12:16:53.033119-08:00","updated_at":"2025-12-22T12:16:53.033119-08:00","closed_at":"2025-12-22T12:16:53.033025-08:00"} +{"id":"bd-rzquq","title":"Test rig bead","description":"Testing rig type","status":"tombstone","priority":2,"issue_type":"rig","created_at":"2026-01-10T23:24:56.847561-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-10T23:25:08.099965-08:00","deleted_at":"2026-01-10T23:25:08.099965-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"rig"} {"id":"bd-s00m","title":"Add 'hooked' status for GUPP work assignment","description":"## Summary\n\nSeparate the semantics of `pinned` (identity records) from work-on-hook (GUPP assignment).\n\n**Current problem:** `pinned` is overloaded to mean both:\n1. Agent identity beads (gt-mayor, gt-crew-gastown-max) - should never block\n2. Work attached to an agent's hook - should block until closed\n\nThe blocking logic excludes `pinned` from blocking, which means work on hooks doesn't block its dependents.\n\n## Semantic Split\n\n| Status | Meaning | Blocks dependents? |\n|--------|---------|-------------------|\n| `pinned` | Domain table / identity record (agents, roles) | No |\n| `hooked` | Work on an agent's hook (GUPP invoked) | Yes |\n\n**Terminology:**\n- **Pin** (verb): Establish a permanent identity record\n- **Hook** (verb): Attach work to an agent's hook\n- **Sling** (verb): The act of hooking work to an agent\n\n## Lifecycles\n\n**Molecule** (the work):\n open -\u003e hooked -\u003e closed\n\n**Persistent agent** (Mayor, Witness, Crew):\n idle \u003c-\u003e working (cycles)\nAgent bead stays pinned. Operational state derived from hook slot occupancy.\n\n**Polecat** (ephemeral worker):\n spawned-with-work -\u003e working -\u003e despawning\nPolecats never idle - spawned for one molecule, nuked after.\n\nThe `hooked` status belongs to the **molecule**, not the agent. Agent identity beads remain `pinned` throughout their existence.\n\n## in_progress vs hooked\n\nBoth remain valid statuses with different semantics:\n- `in_progress` = Soft claim, cooperative (humans juggling multiple issues)\n- `hooked` = Hard claim, GUPP-driven (molecule on agent's hook)\n\nGas Town molecules use `hooked`. Humans/non-Gas Town workflows may use `in_progress`.\n\n## Success Criteria\n\n1. `hooked` is a valid status in beads schema\n2. Blocking logic treats `hooked` as blocking (like `in_progress`)\n3. gt sling sets status=hooked on the molecule (not pinned)\n4. Existing pinned work items migrated to hooked where appropriate\n5. Agent/role beads remain pinned and non-blocking","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-28T22:16:37.66048-08:00","created_by":"stevey","updated_at":"2025-12-28T22:36:19.769137-08:00","closed_at":"2025-12-28T22:36:19.769137-08:00"} {"id":"bd-s00m.1","title":"Schema: Add 'hooked' as valid status","description":"Add 'hooked' to the valid status enum in the beads schema.\n\n## Files to Update\n\n1. `internal/types/types.go` - Add StatusHooked constant\n2. `internal/storage/sqlite/schema.go` - Add 'hooked' to CHECK constraint\n3. `internal/storage/sqlite/migrations/` - New migration to alter constraint\n\n## Status Values After Change\n\n- open\n- in_progress\n- blocked\n- deferred\n- hooked (NEW)\n- closed\n- pinned\n- tombstone\n\n## Validation\n\n- bd update \u003cid\u003e --status=hooked should work\n- bd list --status=hooked should filter correctly","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-28T22:16:56.596014-08:00","created_by":"stevey","updated_at":"2025-12-28T22:30:39.09597-08:00","closed_at":"2025-12-28T22:30:39.09597-08:00","dependencies":[{"issue_id":"bd-s00m.1","depends_on_id":"bd-s00m","type":"parent-child","created_at":"2025-12-28T22:16:56.596584-08:00","created_by":"daemon"}]} {"id":"bd-s00m.2","title":"Blocking logic: Include 'hooked' in blocking statuses","description":"Update the blocked_cache.go SQL to treat 'hooked' as a blocking status.\n\n## Current Logic (line ~163)\n\n```sql\nblocker.status IN ('open', 'in_progress', 'blocked', 'deferred')\n```\n\n## Updated Logic\n\n```sql\nblocker.status IN ('open', 'in_progress', 'blocked', 'deferred', 'hooked')\n```\n\n## Files to Update\n\n- internal/storage/sqlite/blocked_cache.go\n\n## Test Cases\n\n1. Issue A (hooked) blocks Issue B → B should NOT appear in bd ready\n2. Issue A (pinned, type=agent) → B should appear in bd ready\n3. Issue A (hooked) closed → B should appear in bd ready","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-28T22:16:56.809269-08:00","created_by":"stevey","updated_at":"2025-12-28T22:32:27.742984-08:00","closed_at":"2025-12-28T22:32:27.742984-08:00","dependencies":[{"issue_id":"bd-s00m.2","depends_on_id":"bd-s00m","type":"parent-child","created_at":"2025-12-28T22:16:56.809716-08:00","created_by":"daemon"},{"issue_id":"bd-s00m.2","depends_on_id":"bd-s00m.1","type":"blocks","created_at":"2025-12-28T22:17:22.129513-08:00","created_by":"daemon"}]} @@ -1684,6 +1781,7 @@ {"id":"bd-s0qf","title":"GH#405: Fix prefix parsing with hyphens - multi-hyphen prefixes parsed incorrectly","description":"Fixed: ExtractIssuePrefix was falling back to first-hyphen for word-like suffixes, breaking multi-hyphen prefixes like 'hacker-news' and 'me-py-toolkit'.","status":"tombstone","priority":2,"issue_type":"bug","created_at":"2025-12-16T01:13:56.951359-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} {"id":"bd-s0z","title":"Consider extracting error handling helpers","description":"Evaluate creating FatalError() and WarnError() helpers as suggested in ERROR_HANDLING.md to reduce boilerplate and enforce consistency. Prototype in a few files first to validate the approach.","status":"closed","priority":4,"issue_type":"task","created_at":"2025-11-24T00:28:57.248959-08:00","updated_at":"2025-12-02T17:11:19.748387872-05:00","closed_at":"2025-11-28T23:28:00.886536-08:00"} {"id":"bd-s1pz","title":"Merge: bd-u2sc.4","description":"branch: polecat/Logger\ntarget: main\nsource_issue: bd-u2sc.4\nrig: beads","status":"closed","priority":3,"issue_type":"merge-request","created_at":"2025-12-23T13:45:52.412757-08:00","updated_at":"2025-12-23T19:12:08.356689-08:00","closed_at":"2025-12-23T19:12:08.356689-08:00"} +{"id":"bd-s1ve9","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T14:12:55.401136-08:00","created_by":"beads/refinery","updated_at":"2026-01-10T14:12:55.436726-08:00","closed_at":"2026-01-10T14:12:55.436726-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-s1xn","title":"bd message: Refactor duplicated error messages","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-08T12:54:27.624981-08:00","updated_at":"2025-11-08T12:58:59.542795-08:00","closed_at":"2025-11-08T12:58:59.542795-08:00","dependencies":[{"issue_id":"bd-s1xn","depends_on_id":"bd-6uix","type":"parent-child","created_at":"2025-11-08T12:55:54.96063-08:00","created_by":"daemon"}]} {"id":"bd-s2t","title":"wish: a 'continue' or similar cmd/flag which means alter last issue","description":"so many time I create an issue and then have another thought: 'oh, before I did X and it crashed there was ZZZ happening' or 'actually that is P4 not P2'. It would be nice if when `bd {cmd}` is used without a {title} or {id} it just adds or updates the most recently touched issue.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-08T06:46:37.529160416-07:00","updated_at":"2025-12-30T18:12:30.971727-08:00","closed_at":"2025-12-30T16:57:07.001784-08:00","close_reason":"Implemented last-touched tracking for update/close without ID"} {"id":"bd-s2xpf","title":"gt prime --state should support --json output","description":"The SessionState struct has JSON tags but outputState() only outputs plain text key:value format. For consistency with other gt commands and machine parsing, --state should support --json.\n\nCurrent:\n state: normal\n role: mayor\n\nWith --json:\n {\"state\": \"normal\", \"role\": \"mayor\"}\n\nLocation: gastown/mayor/rig/internal/cmd/prime.go:1805-1826","status":"open","priority":3,"issue_type":"task","created_at":"2026-01-10T00:45:49.422246-08:00","created_by":"mayor","updated_at":"2026-01-10T17:19:12.221075-08:00"} @@ -1699,23 +1797,29 @@ {"id":"bd-siz1","title":"GH#532: bd sync circular error (suggests running bd sync)","description":"bd sync error message recommends running bd sync to fix the bd sync error. Fix error handling to provide useful guidance. See GitHub issue #532.","status":"tombstone","priority":2,"issue_type":"bug","created_at":"2025-12-16T01:04:00.543573-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} {"id":"bd-sj5y","title":"Daemon should be singleton and aggressively kill stale instances","description":"Found 2 bd daemons running (PIDs 76868, 77515) during shutdown. The daemon should:\n\n1. Be a singleton - only one instance per rig allowed\n2. On startup, check for existing daemon and kill it before starting\n3. Use a PID file or lock file to enforce this\n\nCurrently stale daemons can accumulate, causing confusion and resource waste.","notes":"**Investigation 2025-12-21:**\n\nThe singleton mechanism is already implemented and working correctly:\n\n1. **daemon.lock** uses flock (exclusive non-blocking) to prevent duplicate daemons\n2. **bd.sock.startlock** coordinates concurrent auto-starts via O_CREATE|O_EXCL\n3. **Registry** tracks all daemons globally in ~/.beads/registry.json\n\nTesting shows:\n- Trying to start a second daemon gives: 'Error: daemon already running (PID X)'\n- Multiple daemons for *different* rigs is expected/correct behavior\n\nThe original report ('Found 2 bd daemons running PIDs 76868, 77515') was likely:\n1. Two daemons for different rigs (expected), OR\n2. An edge case that's since been fixed\n\nConsider closing as RESOLVED or clarifying the original scenario.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-21T01:29:14.778949-08:00","updated_at":"2025-12-21T11:27:34.302585-08:00","closed_at":"2025-12-21T11:27:34.302585-08:00"} {"id":"bd-sjmr","title":"Fix inconsistent error handling in multi-repo deletion tracking","description":"From bd-xo6b code review: Multi-repo deletion tracking has mixed failure modes that can leave system in inconsistent state.\n\n**Current behavior (daemon_sync.go):**\n- Snapshot capture (L505-514): Hard fail → aborts sync\n- Merge/prune (L575-584): Hard fail → aborts sync \n- Base snapshot update (L613-619): Soft fail → logs warning, continues\n\n**Critical problem:**\nIf merge fails on repo 3 of 5:\n- Repos 1-2 have already merged and deleted issues (irreversible)\n- Repos 3-5 are untouched\n- Database is in partially-updated state\n- No rollback mechanism\n\n**Real-world scenario:**\n```\nSync with repos [A, B, C]:\n1. Capture snapshots A ✓, B ✓, C ✗ → ABORT (good)\n2. Merge A ✓, B ✗ → ABORT but A already deleted issues (BAD - no rollback)\n3. Update base A ⚠, B ⚠ → Warnings only (inconsistent with 1 \u0026 2)\n```\n\n**Solution options:**\n1. **Two-phase commit:**\n - Phase 1: Validate all repos (check files exist, readable, parseable)\n - Phase 2: Apply changes atomically (or fail entirely before any mutations)\n\n2. **Fail-fast validation:**\n - Before any snapshot/merge operations, validate all repos upfront\n - Abort entire sync if any repo fails validation\n\n3. **Make base snapshot update consistent:**\n - Either make it hard-fail like the others, or make all soft-fail\n\n**Files:**\n- cmd/bd/daemon_sync.go:505-514 (snapshot capture)\n- cmd/bd/daemon_sync.go:575-584 (merge/prune)\n- cmd/bd/daemon_sync.go:613-619 (base snapshot update)\n\n**Recommendation:** Use option 1 (two-phase) or option 2 (fail-fast validation) + fix base snapshot inconsistency.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-06T19:31:29.538092-08:00","updated_at":"2025-11-06T19:35:41.268584-08:00","closed_at":"2025-11-06T19:35:41.268584-08:00","dependencies":[{"issue_id":"bd-sjmr","depends_on_id":"bd-xo6b","type":"discovered-from","created_at":"2025-11-06T19:32:12.310033-08:00","created_by":"daemon"}]} +{"id":"bd-slz28","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T15:14:50.852321-08:00","created_by":"beads/refinery","updated_at":"2026-01-10T15:14:50.887542-08:00","closed_at":"2026-01-10T15:14:50.887542-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-soig","title":"Sling reports 'already pinned' but mol status shows empty hook","description":"During swarm operations, gt sling reported beads were 'already pinned' but gt mol status showed nothing on the hook.\n\n**Observed:**\n```\n$ gt sling bd-9btu beads/Nux\nError: bead bd-9btu is already pinned to gt-beads-nux\n\n$ gt mol status beads/Nux\nNothing on hook - no work slung\n```\n\n**Expected:**\nIf a bead is pinned, mol status should show it. If mol status shows empty, sling should work.\n\n**Workaround:**\nUsed --force flag to re-sling, which worked.\n\n**Root cause hypothesis:**\nAgent bead state may be stored in town beads but polecat's local view doesn't see it, or the pin record exists but session state is stale.","status":"closed","priority":3,"issue_type":"bug","created_at":"2025-12-28T16:17:50.561021-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T22:14:22.838484-08:00","closed_at":"2025-12-28T22:14:22.838484-08:00"} +{"id":"bd-sojqc","title":"Session ended: gt-beads-crew-grip","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T23:08:24.273721-08:00","created_by":"beads/crew/grip","updated_at":"2026-01-09T23:08:24.308524-08:00","closed_at":"2026-01-09T23:08:24.308524-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-spmx","title":"Investigation \u0026 Proof of Concept","description":"Validate that MCP Agent Mail works as expected and delivers promised benefits before committing to full integration.","notes":"POC completed successfully:\n✅ bd-muls: Server installed and tested\n✅ bd-27xm: MCP tool execution issues resolved\n✅ [deleted:bd-6hji]: File reservation collision prevention validated\n✅ bd-htfk: Latency benchmarking shows 20-50x improvement\n✅ bd-pmuu: ADR 002 created documenting integration decision\n\nResults validate Agent Mail benefits:\n- Collision prevention works (exclusive file reservations)\n- Latency: \u003c100ms (vs 2000-5000ms git sync)\n- Lightweight deployment (\u003c50MB memory)\n- Optional/non-intrusive integration approach validated\n\nNext: bd-wfmw (Integration Layer Implementation)","status":"closed","priority":0,"issue_type":"epic","created_at":"2025-11-07T22:41:37.13757-08:00","updated_at":"2025-11-08T03:12:04.154114-08:00","closed_at":"2025-11-08T00:06:20.731732-08:00"} {"id":"bd-srhu","title":"Merge: jasper-mk04cv5s","description":"branch: polecat/jasper-mk04cv5s\ntarget: main\nsource_issue: jasper-mk04cv5s\nrig: beads\nagent_bead: bd-beads-polecat-jasper\nretry_count: 0\nlast_conflict_sha: null\nconflict_task_id: null","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2026-01-04T11:27:04.224933-08:00","created_by":"beads/polecats/jasper","updated_at":"2026-01-05T19:45:43.989296-08:00","closed_at":"2026-01-05T19:45:43.989296-08:00","close_reason":"Branch deleted, already merged"} {"id":"bd-srsk","title":"Gate eval: Add error visibility for gh CLI failures","description":"Currently evalGHRunGate and evalGHPRGate silently swallow errors when the gh CLI fails (lines 738-741, 780-783 in gate.go).\n\nThis makes debugging difficult - if gh isn't installed, auth fails, or network issues occur, gates silently stall forever with no indication of why.\n\nOptions:\n1. Add debug logging when gh fails\n2. Return error info in the skipped list for aggregate reporting\n3. Add a --verbose flag to gate eval that shows failures\n\nLow priority since the fail-safe behavior (don't close gate on error) is correct.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-25T23:13:11.718635-08:00","updated_at":"2026-01-02T18:35:49.165014-08:00","closed_at":"2026-01-02T18:35:49.165014-08:00","close_reason":"Fixed in commit 3c5b7414 (bd-oos3). Error visibility now implemented in bd gate check - errors are printed to stderr with fail icon."} {"id":"bd-srwk","title":"bd export should detect and prevent stale database exports","description":"## Problem\n\nWhen `bd export` is run with a stale database (older than issues.jsonl), it silently overwrites the JSONL file with stale data, causing data loss.\n\n## What Happened (vc project)\n\n1. Agent A created 4 new issues and exported to issues.jsonl (commit 99a9d58)\n2. Agent A closed an issue and exported again (commit 58b4613) - JSONL now has 4 epics\n3. Agent B had stale database (from before step 1)\n4. Agent B worked on unrelated issue and exported (commit 0609233)\n5. Agent B's export **overwrote issues.jsonl**, removing the 4 epics created by Agent A\n6. Required manual recovery by re-exporting from Agent A's correct database\n\n## Expected Behavior\n\n`bd export` should detect that the database is stale and either:\n- **Refuse to export** with error message explaining the issue\n- **Warn prominently** and require explicit --force flag to override\n- **Auto-import first** to sync database before exporting\n\n## How to Detect Staleness\n\nCompare modification times (similar to VC's ValidateDatabaseFreshness):\n1. Check .db, .db-wal, .db-shm timestamps (use newest for WAL mode)\n2. Check issues.jsonl timestamp\n3. If JSONL is newer by \u003e1 second: database is stale\n\n## Suggested Fix\n\nAdd staleness check in `bd export`:\n\n```go\nfunc Export(dbPath, jsonlPath string, force bool) error {\n // Check if database is stale\n if !force {\n if err := checkDatabaseFreshness(dbPath, jsonlPath); err != nil {\n return fmt.Errorf(\"database is stale: %w\\n\" +\n \"Run 'bd import %s' first to sync, or use --force to override\",\n err, jsonlPath)\n }\n }\n \n // Proceed with export...\n}\n```\n\n## Impact\n\n- **Severity**: High (silent data loss)\n- **Frequency**: Happens in multi-agent workflows when agents don't sync\n- **Workaround**: Manual recovery (re-export from correct database)\n\n## References\n\n- VC issue tracker: commits 58b4613 -\u003e 0609233 -\u003e c41c638\n- VC has similar check: `storage.ValidateDatabaseFreshness()`\n- Tolerance: 1 second (handles filesystem timestamp precision)","notes":"Fixed with ID-based comparison instead of just count. Now detects:\n1. DB has fewer issues than JSONL (count check)\n2. DB has different issues than JSONL (ID comparison)\n\nBoth scenarios now properly refuse export unless --force is used.\n\nImplementation uses getIssueIDsFromJSONL() to build a set of IDs from JSONL, then checks if any JSONL IDs are missing from DB. Shows specific missing issue IDs in error message.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-07T19:39:24.172154-08:00","updated_at":"2025-11-07T20:05:13.649736-08:00","closed_at":"2025-11-07T19:58:43.300177-08:00"} +{"id":"bd-ssrid","title":"Session ended: gt-beads-crew-wolf","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T22:47:15.788852-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-09T22:47:15.828912-08:00","closed_at":"2026-01-09T22:47:15.828912-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-su45","title":"Protect pinned issues from bd cleanup/compact","description":"Update bd cleanup and bd compact to never delete pinned issues, even if they are closed. Pinned issues should persist indefinitely as reference material.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-18T23:33:46.204783-08:00","updated_at":"2025-12-19T17:43:35.712617-08:00","closed_at":"2025-12-19T00:43:04.06406-08:00","dependencies":[{"issue_id":"bd-su45","depends_on_id":"bd-0vg","type":"blocks","created_at":"2025-12-18T23:33:56.64582-08:00","created_by":"daemon"},{"issue_id":"bd-su45","depends_on_id":"bd-7h5","type":"blocks","created_at":"2025-12-18T23:34:07.857586-08:00","created_by":"daemon"}]} {"id":"bd-sumr","title":"Merge: bd-t4sb","description":"branch: polecat/capable\ntarget: main\nsource_issue: bd-t4sb\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-19T23:22:21.343724-08:00","updated_at":"2025-12-20T23:17:26.997992-08:00","closed_at":"2025-12-20T23:17:26.997992-08:00"} {"id":"bd-svb5","title":"GH#505: Add bd reset/wipe command","description":"Add command to cleanly reset/wipe beads database. User reports painful manual process to start fresh. See GitHub issue #505.","status":"tombstone","priority":2,"issue_type":"feature","created_at":"2025-12-16T01:03:42.160966-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature"} {"id":"bd-swsc","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T00:47:07.01162-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-07T00:47:07.045436-08:00","closed_at":"2026-01-07T00:47:07.045436-08:00","close_reason":"auto-closed session event"} {"id":"bd-sxlt","title":"GHI #885: Sync failure leaves local JSONL stale, causing inconsistent state","description":"GitHub Issue #885: Sync failure leaves local JSONL stale, causing inconsistent state across worktrees\n\nhttps://github.com/steveyegge/beads/issues/885","status":"closed","priority":1,"issue_type":"bug","created_at":"2026-01-04T11:22:16.730476-08:00","created_by":"mayor","updated_at":"2026-01-04T15:22:07.771064-08:00","closed_at":"2026-01-04T11:30:32.561965-08:00","close_reason":"Added status mismatch detection to bd doctor. When counts match but statuses differ, the check now reports detailed mismatches and suggests 'bd export' to fix."} +{"id":"bd-syp0w","title":"Digest: mol-refinery-patrol","description":"Patrol cycle complete: MQ empty, 0 branches processed, no issues","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T23:43:02.570883-08:00","updated_at":"2026-01-10T23:43:02.570883-08:00","closed_at":"2026-01-10T23:43:02.570847-08:00","close_reason":"Squashed from 11 wisps","dependencies":[{"issue_id":"bd-syp0w","depends_on_id":"bd-wisp-1so","type":"parent-child","created_at":"2026-01-10T23:43:02.571776-08:00","created_by":"beads/refinery"}]} {"id":"bd-t10fs","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T01:09:18.602816-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T01:09:18.636511-08:00","closed_at":"2026-01-09T01:09:18.636511-08:00","close_reason":"auto-closed session event"} {"id":"bd-t17wa","title":"Fix: v0.46.0 breaks Gas Town type extraction (GH#941)","description":"dispatched_by: beads/crew/dave\n\nGitHub issue #941. Type extraction removes agent/role/convoy types that Gas Town still uses.","status":"closed","priority":1,"issue_type":"bug","assignee":"beads/crew/giles","created_at":"2026-01-09T22:20:16.468385-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-09T22:29:18.336019-08:00","closed_at":"2026-01-09T22:29:18.336019-08:00","close_reason":"Fixed: restored Gas Town types (agent, role, rig, convoy, slot) as built-in types"} +{"id":"bd-t2720","title":"Session ended: gt-beads-witness","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T16:44:17.146675-08:00","created_by":"beads/witness","updated_at":"2026-01-10T16:44:17.222263-08:00","closed_at":"2026-01-10T16:44:17.222263-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-t3b","title":"Add test coverage for internal/config package","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-20T21:21:22.91657-05:00","updated_at":"2025-12-09T18:38:37.704575272-05:00","closed_at":"2025-11-28T21:54:15.009889-08:00","dependencies":[{"issue_id":"bd-t3b","depends_on_id":"bd-ge7","type":"blocks","created_at":"2025-11-20T21:21:31.201036-05:00","created_by":"daemon"}]} {"id":"bd-t3cf","title":"Update CHANGELOG.md for 0.33.2","description":"In CHANGELOG.md:\n\n1. Change `## [Unreleased]` section header to `## [0.33.2] - 2025-12-21`\n2. Add new empty `## [Unreleased]` section above it\n3. Review and clean up the changes list\n\nFormat:\n```markdown\n## [Unreleased]\n\n## [0.33.2] - 2025-12-21\n\n### Added\n- ...\n\n### Changed\n- ...\n\n### Fixed\n- ...\n```","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T16:10:13.7614-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"} {"id":"bd-t3en","title":"Merge: bd-d28c","description":"branch: polecat/capable\ntarget: main\nsource_issue: bd-d28c\nrig: beads","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-23T20:43:16.997802-08:00","updated_at":"2025-12-23T21:21:57.694201-08:00","closed_at":"2025-12-23T21:21:57.694201-08:00"} {"id":"bd-t4sb","title":"Work on beads-d8h: Fix prefix mismatch false positive wit...","description":"Work on beads-d8h: Fix prefix mismatch false positive with multi-hyphen prefixes like 'asianops-audit-' (GH#422). When done, submit MR (not PR) to integration branch for Refinery.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-19T22:56:19.545069-08:00","updated_at":"2025-12-19T23:28:32.429127-08:00","closed_at":"2025-12-19T23:21:45.471711-08:00"} {"id":"bd-t4u1","title":"False positive detection by Kaspersky Antivirus (Trojan)","description":"Kaspersky Antivirus falsely detects beads (bd.exe v0.23.1) as a Trojan (PDM:Trojan.Win32.Generic) and removes it.\nEvent: Malicious object detected\nComponent: System Watcher\nObject name: bd.exe\n","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-20T18:56:12.498187-05:00","updated_at":"2025-12-23T23:47:23.182018-08:00","closed_at":"2025-12-23T23:47:23.182018-08:00"} +{"id":"bd-t5epk","title":"Session ended: gt-beads-crew-grip","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T22:46:15.758933-08:00","created_by":"beads/crew/grip","updated_at":"2026-01-09T22:46:15.795569-08:00","closed_at":"2026-01-09T22:46:15.795569-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-t5lpi","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T20:41:33.861855-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-07T20:41:33.897403-08:00","closed_at":"2026-01-07T20:41:33.897403-08:00","close_reason":"auto-closed session event"} {"id":"bd-t5m","title":"CRITICAL: git-history-backfill purges entire database when JSONL reset","description":"When a clone gets reset (git reset --hard origin/main), the git-history-backfill logic incorrectly adds ALL issues to the deletions manifest, then sync purges the entire database.\\n\\nFix adds safety guard: never delete more than 50% of issues via git-history-backfill. If threshold exceeded, abort with warning message.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-30T21:24:47.397394-08:00","updated_at":"2025-11-30T21:24:52.710971-08:00","closed_at":"2025-11-30T21:24:52.710971-08:00"} {"id":"bd-t5o","title":"Document error handling strategy for metadata update failures","description":"Multiple places silently ignore metadata update failures (sync.go:614-617, import.go:320-322) with non-fatal warnings. This is intentional (degrades gracefully to mtime-based approach) but not well documented.\n\nAdd comments explaining:\n- Why these failures are non-fatal\n- How system degrades gracefully\n- What the fallback behavior is (mtime-based detection)","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-20T21:31:12.366861-05:00","updated_at":"2025-11-20T21:36:16.972395-05:00","closed_at":"2025-11-20T21:36:16.972395-05:00","dependencies":[{"issue_id":"bd-t5o","depends_on_id":"bd-khnb","type":"blocks","created_at":"2025-11-20T21:31:12.367744-05:00","created_by":"daemon"}]} @@ -1764,11 +1868,13 @@ {"id":"bd-u3t","title":"Phase 2: Implement sandbox auto-detection for GH #353","description":"Implement automatic sandbox detection to improve UX for users in sandboxed environments (e.g., Codex).\n\n**Tasks:**\n1. Implement sandbox detection heuristic using syscall.Kill permission checks\n2. Auto-enable --sandbox mode when sandbox is detected\n3. Display informative message when sandbox is detected\n\n**Implementation:**\n- Add isSandboxed() function in cmd/bd/main.go\n- Auto-set sandboxMode = true in PersistentPreRun when detected\n- Show: 'ℹ️ Sandbox detected, using direct mode'\n\n**References:**\n- docs/GH353_INVESTIGATION.md (Solution 3, lines 120-160)\n- Depends on: Phase 1 (bd-???)\n\n**Acceptance Criteria:**\n- Codex users don't need to manually specify --sandbox\n- No false positives in normal environments\n- Clear messaging when auto-detection triggers","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-21T18:51:57.254358-05:00","updated_at":"2025-11-22T14:57:44.561831578-05:00","closed_at":"2025-11-21T19:28:24.467713-05:00"} {"id":"bd-u4f5","title":"bd import silently succeeds when database matches working tree but not git HEAD","description":"**Critical**: bd import reports '0 created, 0 updated' when database matches working tree JSONL, even when working tree is ahead of git HEAD. This gives false confidence that everything is synced with the source of truth.\n\n## Reproduction\n\n1. Start with database synced to working tree .beads/issues.jsonl (376 issues)\n2. Git HEAD has older version of .beads/issues.jsonl (354 issues)\n3. Run: bd import .beads/issues.jsonl\n4. Output: 'Import complete: 0 created, 0 updated'\n\n## Problem\n\nUser expects 'bd import' after 'git pull' to sync database with committed state, but:\n- Command silently succeeds because DB already matches working tree\n- No warning that working tree has uncommitted changes\n- User falsely believes everything is synced with git\n- Violates 'JSONL in git is source of truth' principle\n\n## Expected Behavior\n\nWhen .beads/issues.jsonl differs from git HEAD, bd import should:\n1. Detect uncommitted changes: git diff --quiet HEAD .beads/issues.jsonl\n2. Warn user: 'Warning: .beads/issues.jsonl has uncommitted changes (376 lines vs 354 in HEAD)'\n3. Clarify status: 'Import complete: 0 created, 0 updated (already synced with working tree)'\n4. Recommend: 'Run git diff .beads/issues.jsonl to review uncommitted work'\n\n## Impact\n\n- Users can't trust 'bd import' status messages\n- Silent data loss risk if user assumes synced and runs git checkout\n- Breaks mental model of 'JSONL in git = source of truth'\n- Critical for VC's landing-the-plane workflow","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-07T23:51:28.536822-08:00","updated_at":"2025-11-07T23:58:34.482313-08:00","closed_at":"2025-11-07T23:58:34.482313-08:00"} {"id":"bd-u66e","title":"Implement bd gate create/show/list/close/wait commands","description":"Implement the gate CLI commands.\n\n## Commands\n```bash\n# Create gate (returns gate ID)\nbd gate create --await \u003ctype\u003e:\u003cid\u003e --timeout \u003cduration\u003e --notify \u003caddr\u003e\n\n# Check gate status\nbd gate show \u003cid\u003e\n\n# List open gates\nbd gate list\n\n# Close gate (usually done by Deacon)\nbd gate close \u003cid\u003e --reason \"completed\"\n\n# Add waiter to existing gate\nbd gate wait \u003cid\u003e --notify \u003caddr\u003e\n```\n\n## Implementation\n- Add cmd/bd/gate.go with subcommands\n- Gate create creates wisp issue of type gate\n- Gate list filters for open gates\n- Gate wait adds to waiters[] array\n- All support --json output","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T11:44:34.022464-08:00","updated_at":"2025-12-23T12:06:18.550673-08:00","closed_at":"2025-12-23T12:06:18.550673-08:00","dependencies":[{"issue_id":"bd-u66e","depends_on_id":"bd-udsi","type":"parent-child","created_at":"2025-12-23T11:44:52.823353-08:00","created_by":"daemon"},{"issue_id":"bd-u66e","depends_on_id":"bd-lz49","type":"blocks","created_at":"2025-12-23T11:44:56.349662-08:00","created_by":"daemon"}]} +{"id":"bd-u6d1a","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T00:37:42.68082-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-10T00:37:42.721216-08:00","closed_at":"2026-01-10T00:37:42.721216-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-u8g4","title":"Merge: bd-dxtc","description":"branch: polecat/cheedo\ntarget: main\nsource_issue: bd-dxtc\nrig: beads","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-23T20:42:17.222567-08:00","updated_at":"2025-12-23T21:21:57.696047-08:00","closed_at":"2025-12-23T21:21:57.696047-08:00"} {"id":"bd-u8j","title":"Clarify exclusive lock protocol compatibility with multi-repo","description":"The contributor-workflow-analysis.md proposes per-repo file locking (Decision #7) using flock on JSONL files. However, VC (a downstream library consumer) uses an exclusive lock protocol (vc-195, requires Beads v0.17.3+) that allows bd daemon and VC executor to coexist.\n\nNeed to clarify:\n- Does the proposed per-repo file locking work with VC's existing exclusive lock protocol?\n- Do library consumers like VC need to adapt their locking logic?\n- Can multiple repos be locked atomically for cross-repo operations?\n\nContext: contributor-workflow-analysis.md lines 662-681","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-03T20:24:08.257493-08:00","updated_at":"2025-11-05T14:15:01.506885-08:00","closed_at":"2025-11-05T14:15:01.506885-08:00"} {"id":"bd-u8z7","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T01:33:17.984735-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-07T01:33:18.018079-08:00","closed_at":"2026-01-07T01:33:18.018079-08:00","close_reason":"auto-closed session event"} {"id":"bd-u9a3n","title":"Witness Patrol","description":"Per-rig worker monitor patrol loop with progressive nudging.","status":"closed","priority":2,"issue_type":"molecule","created_at":"2026-01-07T21:42:14.261027-08:00","created_by":"gastown/crew/george","updated_at":"2026-01-09T21:15:43.007118-08:00","closed_at":"2026-01-09T21:15:43.007118-08:00","close_reason":"Orphaned patrol molecules"} {"id":"bd-ua1jv","title":"Witness Patrol","description":"Per-rig worker monitor patrol loop with progressive nudging.","status":"open","priority":2,"issue_type":"molecule","created_at":"2026-01-07T23:28:41.036097-08:00","created_by":"deacon","updated_at":"2026-01-07T23:28:41.036097-08:00"} +{"id":"bd-uadj2","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T15:47:42.706519-08:00","created_by":"beads/refinery","updated_at":"2026-01-10T15:47:42.742489-08:00","closed_at":"2026-01-10T15:47:42.742489-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-ucgz","title":"Migration invariants should exclude external dependencies from orphan check","description":"## Summary\n\nThe `checkForeignKeys` function in `migration_invariants.go` flags external dependencies as orphaned because they dont exist in the local issues table.\n\n## Location\n\n`internal/storage/sqlite/migration_invariants.go` around line 150-162\n\n## Current Code (buggy)\n\n```go\n// Check for orphaned dependencies\nvar orphanCount int\nerr = db.QueryRowContext(ctx, \\`\n SELECT COUNT(*)\n FROM dependencies d\n WHERE NOT EXISTS (SELECT 1 FROM issues WHERE id = d.depends_on_id)\n\\`).Scan(\u0026orphanCount)\n```\n\n## Fix\n\nExclude external references (format: `external:\u003cproject\u003e:\u003ccapability\u003e`):\n\n```go\n// Check for orphaned dependencies (excluding external refs)\nvar orphanCount int\nerr = db.QueryRowContext(ctx, \\`\n SELECT COUNT(*)\n FROM dependencies d\n WHERE NOT EXISTS (SELECT 1 FROM issues WHERE id = d.depends_on_id)\n AND d.depends_on_id NOT LIKE 'external:%'\n\\`).Scan(\u0026orphanCount)\n```\n\n## Reproduction\n\n```bash\n# Add external dependency\nbd dep add bd-xxx external:other-project:some-capability\n\n# Try to sync - fails\nbd sync\n# Error: found 1 orphaned dependencies\n```\n\n## Files to Modify\n\n1. **internal/storage/sqlite/migration_invariants.go** - Add WHERE clause\n\n## Testing\n\n```bash\n# Create issue with external dep\nbd create \"Test external deps\" -t task\nbd dep add bd-xxx external:beads:release-workflow\n\n# Sync should succeed\nbd sync\n\n# Verify dep exists\nbd show bd-xxx --json | jq .dependencies\n```\n\n## Success Criteria\n- External dependencies dont trigger orphan check\n- `bd sync` succeeds with external deps\n- Regular orphan detection still works for internal deps","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-23T12:37:08.99387-08:00","updated_at":"2025-12-23T12:42:03.722691-08:00","closed_at":"2025-12-23T12:42:03.722691-08:00"} {"id":"bd-ucj8","title":"Rename wisp prefix from 'eph' to 'wisp'","description":"The wisp system uses 'eph' as the ID prefix segment (e.g., gt-eph-xxx) but should use 'wisp' (e.g., gt-wisp-xxx) for consistency with terminology.\n\n**Location:** cmd/bd/wisp.go:260-261\n```go\n// Use \"eph\" prefix for distinct visual recognition\nresult, err := spawnMolecule(ctx, store, subgraph, vars, \"\", actor, true, \"eph\")\n```\n\n**Fix:** Change \"eph\" to \"wisp\"\n\n**Also update:**\n- main_errors.go:100,107 - detection patterns for ephemeral IDs\n- Any tests expecting '-eph-' pattern\n- Documentation if it references the prefix\n\n**Migration:** Existing gt-eph-* wisps in databases will continue to work (they have ephemeral=true flag). New wisps will use gt-wisp-* prefix.","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-01-01T20:10:54.323196-08:00","created_by":"gastown/crew/gus","updated_at":"2026-01-01T23:55:44.286924-08:00","closed_at":"2026-01-01T23:55:44.286924-08:00","close_reason":"Renamed wisp prefix from 'eph' to 'wisp'. Legacy eph-* pattern still supported for backwards compatibility."} {"id":"bd-udsi","title":"Async Gates for Agent Coordination","description":"Agents need an async primitive for waiting on external events (CI completion, API responses, human approval). Gates are wisp issues that block until external conditions are met, managed by the Deacon.\n\n## Core Concepts\n\n**Gate** = wisp issue that blocks until external condition is met\n- Type: gate\n- Phase: wisp (never synced, ephemeral)\n- Assignee: deacon/ (Deacon monitors it)\n- Fields: await_type, await_id, timeout, waiters[]\n\n**Await Types:**\n- gh:run:\u003cid\u003e - GitHub Actions run completion\n- gh:pr:\u003cid\u003e - PR merged/closed\n- timer:\u003cduration\u003e - Simple delay\n- human:\u003cprompt\u003e - Human approval required\n- mail:\u003cpattern\u003e - Wait for mail matching pattern\n\n## Open Questions\n- Should gates live in wisp storage or main storage with wisp flag?\n- Do we need a gate catalog (like molecule catalog)?\n- Should waits-for dep type work with gates?","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-23T11:44:02.711062-08:00","updated_at":"2025-12-23T12:24:43.537615-08:00","closed_at":"2025-12-23T12:24:43.537615-08:00"} @@ -1783,10 +1889,12 @@ {"id":"bd-urob","title":"bd-hv01: Refactor snapshot management into dedicated module","description":"Problem: Snapshot logic is scattered across deletion_tracking.go. Would benefit from abstraction with SnapshotManager type.\n\nBenefits: cleaner separation of concerns, easier to test in isolation, better encapsulation, could add observability/metrics.\n\nSuggested improvements: add magic constants, track merge statistics, better error messages.\n\nFiles: cmd/bd/deletion_tracking.go (refactor into new snapshot_manager.go)","status":"closed","priority":3,"issue_type":"chore","created_at":"2025-11-06T18:16:27.943666-08:00","updated_at":"2025-11-08T02:24:24.686744-08:00","closed_at":"2025-11-08T02:19:14.152412-08:00","dependencies":[{"issue_id":"bd-urob","depends_on_id":"bd-rbxi","type":"parent-child","created_at":"2025-11-06T18:19:15.192447-08:00","created_by":"daemon"}]} {"id":"bd-urz80","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-08T21:33:37.069626-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-08T21:33:37.10267-08:00","closed_at":"2026-01-08T21:33:37.10267-08:00","close_reason":"auto-closed session event"} {"id":"bd-usro","title":"Rename 'template instantiate' to 'mol bond'","description":"Rename the template instantiation command to match molecule metaphor.\n\nCurrent: bd template instantiate \u003cid\u003e --var key=value\nTarget: bd mol bond \u003cid\u003e --var key=value\n\nChanges needed:\n- Add 'mol' command group (or extend existing)\n- Add 'bond' subcommand that wraps template instantiate logic\n- Keep 'template instantiate' as deprecated alias for backward compat\n- Update help text and docs to use molecule terminology\n\nThe 'bond' verb captures:\n1. Chemistry metaphor (molecules bond to form structures)\n2. Dependency linking (child issues bonded in a DAG)\n3. Short and active\n\nSee also: molecule execution model in Gas Town","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-20T16:56:37.582795-08:00","updated_at":"2025-12-20T23:22:43.567337-08:00","closed_at":"2025-12-20T23:22:43.567337-08:00"} +{"id":"bd-ustlq","title":"Session ended: gt-beads-crew-dave","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T22:15:37.425415-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-09T22:15:37.465321-08:00","closed_at":"2026-01-09T22:15:37.465321-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-usvv","title":"Defer SQLite metadata updates until after git commit succeeds","description":"Part of GH#885 fix: bulletproof sync atomicity.\n\nCurrently exportToJSONL() immediately:\n- Clears dirty flags in SQLite\n- Updates last_import_time metadata\n\nThis happens BEFORE git commit, so if commit fails, SQLite \"lies\" about sync state.\n\nFix: Move metadata updates to AFTER git commit succeeds:\n1. Export JSONL to disk (atomic file write)\n2. Stage and commit to git\n3. ONLY THEN clear dirty flags and update last_import_time\n\nKey files:\n- cmd/bd/sync_export.go:147-170 (premature updates)\n- cmd/bd/sync.go:555 (commit point)\n\nThis is the core fix for the atomicity gap.","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-04T13:53:23.619319-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-04T15:22:08.704907-08:00","closed_at":"2026-01-04T15:16:21.245756-08:00","close_reason":"Implemented deferred metadata updates - finalizeExport() now runs after git commit succeeds","dependencies":[{"issue_id":"bd-usvv","depends_on_id":"bd-pnx2","type":"parent-child","created_at":"2026-01-04T13:53:55.798447-08:00","created_by":"beads/crew/emma"}]} {"id":"bd-ut5","title":"Test label update feature","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-21T22:07:25.488849-05:00","updated_at":"2025-12-14T00:32:11.0488-08:00","closed_at":"2025-12-13T23:29:56.878215-08:00"} {"id":"bd-uti26","title":"Test defer issue","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-07T21:30:33.858115-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T21:15:41.7331-08:00","closed_at":"2026-01-09T21:15:41.7331-08:00","close_reason":"Test beads - cleanup"} {"id":"bd-uu8p","title":"Routing bypassed in daemon mode","description":"## Bug\n\nPrefix-based routing (routes.jsonl) only works in direct mode. When the daemon is running, it bypasses routing logic because:\n\n1. Daemon mode resolves IDs via RPC (`daemonClient.ResolveID`)\n2. Daemon uses its own store, which only knows about local beads\n3. The routing logic in `resolveAndGetIssueWithRouting` is only called in direct mode\n\n## Reproduction\n\n```bash\n# With daemon running:\ncd ~/gt\nbd show gt-1py3y # Fails - daemon can't find it\n\n# With daemon bypassed:\nbd --no-daemon show gt-1py3y # Works - uses routing\n```\n\n## Fix Options\n\n### Option A: Client-side routing detection (Recommended)\nBefore calling daemon RPC, check if the ID prefix matches a route to a different beads dir. If so, use direct mode with routing for that ID.\n\n```go\n// In show.go, before daemon mode:\nif daemonClient != nil \u0026\u0026 needsRouting(id) {\n // Fall back to direct mode for this ID\n result, err := resolveAndGetIssueWithRouting(ctx, store, id)\n ...\n}\n```\n\n### Option B: Daemon-side routing\nAdd routing support to the daemon RPC server. More complex - daemon would need to:\n- Load routes.jsonl on startup\n- Open connections to multiple databases\n- Route requests based on ID prefix\n\n### Option C: Hybrid\nDaemon returns \"not found + prefix hint\", client retries with routing.\n\n## Recommendation\n\nOption A is simplest. The client already has routing logic; just use it when we detect a routed prefix.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-26T14:52:00.452285-08:00","updated_at":"2025-12-26T14:54:51.572289-08:00","closed_at":"2025-12-26T14:54:51.572289-08:00"} +{"id":"bd-uunhh","title":"Session ended: gt-beads-crew-wolf","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T23:02:11.859121-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-09T23:02:11.898113-08:00","closed_at":"2026-01-09T23:02:11.898113-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-uuo9","title":"Avoid double export when uncommitted JSONL detected","description":"In sync.go, when gitHasUncommittedBeadsChanges() detects uncommitted changes, we export at line 175. But the normal flow exports again at line 296.\n\nAdd a skip flag to avoid redundant work:\n- Set alreadyExported=true after pre-flight export\n- Skip later export if flag is set\n\nMinor optimization, not urgent.\n\nPart of GH#885 follow-up (bd-vd8e).","status":"closed","priority":3,"issue_type":"task","assignee":"beads/polecats/amber","created_at":"2026-01-04T16:15:55.491155-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-04T16:20:46.91292-08:00","closed_at":"2026-01-04T16:20:46.91292-08:00","close_reason":"Added alreadyExported flag to skip redundant export when pre-flight check already exported"} {"id":"bd-uutv","title":"Work on beads-rs0: Namepool configuration for themed pole...","description":"Work on beads-rs0: Namepool configuration for themed polecat names. See bd show beads-rs0 for full details.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-19T21:49:48.129778-08:00","updated_at":"2025-12-19T21:59:25.565894-08:00","closed_at":"2025-12-19T21:59:25.565894-08:00"} {"id":"bd-uwkp","title":"Phase 2.4: Git merge driver optimization for TOON format","description":"Optimize git 3-way merge for TOON line-oriented format.\n\n## Overview\nTOON is line-oriented (unlike binary formats), enabling smarter git merge strategies. Implement custom merge driver to handle TOON-specific merge patterns.\n\n## Required Work\n\n### 2.4.1 TOON Merge Driver\n- [ ] Create .git/info/attributes entry for *.toon files\n- [ ] Implement custom merge driver script/command\n- [ ] Handle tabular format row merges (line-based 3-way)\n- [ ] Handle YAML-style format merges\n- [ ] Conflict markers for unsolvable conflicts\n\n### 2.4.2 Merge Patterns\n- [ ] Row addition: both branches add different rows → union\n- [ ] Row deletion: one branch deletes, other modifies → conflict (manual review)\n- [ ] Row modification: concurrent field changes → intelligent merge or conflict\n- [ ] Field ordering changes: ignore (TOON format resilient to order)\n\n### 2.4.3 Testing \u0026 Documentation\n- [ ] Unit tests for merge scenarios (3-way merge logic)\n- [ ] Integration tests with actual git merges\n- [ ] Conflict scenario testing\n- [ ] Documentation of merge strategy\n\n## Success Criteria\n- Git merge handles TOON conflicts intelligently\n- Fewer manual merge conflicts than JSONL\n- Round-trip preserved through merges\n- All 70+ tests still passing\n- Git history stays clean (minimal conflict markers)","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T14:43:14.339238776-07:00","updated_at":"2025-12-21T14:42:26.434306-08:00","closed_at":"2025-12-21T14:42:26.434306-08:00","dependencies":[{"issue_id":"bd-uwkp","depends_on_id":"bd-iic1","type":"discovered-from","created_at":"2025-12-19T14:43:14.34427988-07:00","created_by":"daemon"}]} @@ -1802,6 +1910,7 @@ {"id":"bd-v55y","title":"bd repair: Limit verbose output for large orphan counts","description":"When there are thousands of orphaned references, bd repair prints them all, flooding the terminal.\n\nFix: Add --verbose flag; default to summary only (e.g., 'Found 1,234 orphaned dependencies'). Only print individual items with --verbose or when count is small (\u003c20).","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-12-29T12:48:10.496115-08:00","created_by":"stevey","updated_at":"2025-12-29T12:59:05.123618-08:00","closed_at":"2025-12-29T12:59:05.123618-08:00","close_reason":"Fixed in commit d7a67ad6"} {"id":"bd-v5fn","title":"Add default limit to bd list (50 issues)","description":"Add a sensible default limit of 50 issues to bd list output, matching patterns from gh cli (30) and jira-cli (50).\n\n- Default to 50 when no --limit specified\n- --limit 0 means unlimited (explicit override)\n- Protects both agents and humans from overwhelming output\n\nThis is independent of the filter change but complementary.","notes":"## Implementation Plan\n\n### Code Changes (cmd/bd/list.go)\n\n1. **Change default limit** (init function, ~line 887):\n```go\n// Currently: listCmd.Flags().IntP(\"limit\", \"n\", 0, \"Limit results\")\n// Change to:\nlistCmd.Flags().IntP(\"limit\", \"n\", 50, \"Limit results (0 for unlimited)\")\n```\n\n2. **Update help text**:\n```go\n\"Limit results (default: 50, use 0 for unlimited)\"\n```\n\n3. **Handle explicit 0** in Run function:\n```go\n// --limit 0 means unlimited\nif cmd.Flags().Changed(\"limit\") \u0026\u0026 limit == 0 {\n filter.Limit = 0 // No limit applied\n} else if limit \u003e 0 {\n filter.Limit = limit\n} else {\n filter.Limit = 50 // Default\n}\n```\n\n### Testing\n- `bd list` shows max 50 issues\n- `bd list --limit 10` shows max 10\n- `bd list --limit 0` shows unlimited\n- Verify output indicates truncation: \"Showing 50 of 499 issues (use --limit 0 for all)\"\n\n### Documentation\n- Note in help: default changed from unlimited to 50","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-29T15:25:08.299726-08:00","created_by":"stevey","updated_at":"2025-12-29T17:53:30.23005-08:00","closed_at":"2025-12-29T17:53:30.23005-08:00","close_reason":"Implemented in single commit","labels":["gh:788"]} {"id":"bd-v711j","title":"Session ended: gt-beads-crew-dave","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-08T14:35:04.602967-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-08T14:35:04.639119-08:00","closed_at":"2026-01-08T14:35:04.639119-08:00","close_reason":"auto-closed session event"} +{"id":"bd-v7s5y","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T16:08:36.210345-08:00","created_by":"beads/refinery","updated_at":"2026-01-10T16:08:36.247128-08:00","closed_at":"2026-01-10T16:08:36.247128-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-v8ku","title":"bd: Add town-level activity signal in PersistentPreRun","description":"Add activity signaling to beads so Gas Town daemon can detect bd usage.\n\nIn cmd/bd/main.go PersistentPreRun, add a call to write activity to\nthe Gas Town daemon directory if running inside a Gas Town workspace.\n\nThe signal file is ~/gt/daemon/activity.json (or detected town root).\n\nFormat:\n{\n \"last_command\": \"bd create ...\",\n \"actor\": \"gastown/crew/max\",\n \"timestamp\": \"2025-12-26T19:30:00Z\"\n}\n\nShould be best-effort (silent failure) to avoid breaking bd outside Gas Town.\n\nCross-rig ref: gastown gt-ws8ol (Deacon exponential backoff epic)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-26T19:25:13.537055-08:00","updated_at":"2025-12-26T19:28:44.919491-08:00","closed_at":"2025-12-26T19:28:44.919491-08:00"} {"id":"bd-v9kd2","title":"Session ended: gt-beads-witness","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-08T18:22:02.116594-08:00","created_by":"beads/witness","updated_at":"2026-01-08T18:22:02.153947-08:00","closed_at":"2026-01-08T18:22:02.153947-08:00","close_reason":"auto-closed session event"} {"id":"bd-vavh","title":"Fix row iterator resource leak in recursive dependency queries","description":"Critical resource leak in findAllDependentsRecursive() where rows.Close() is called AFTER early return on error, never executing.\n\nLocation: internal/storage/sqlite/sqlite.go:1131-1136\n\nProblem: \n- rows.Close() placed after return statement\n- On scan error, iterator never closed\n- Can exhaust SQLite connections under moderate load\n\nFix: Move defer rows.Close() to execute on all code paths\n\nImpact: Connection exhaustion during dependency traversal","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-16T14:50:55.881698-08:00","updated_at":"2025-11-16T15:03:55.009607-08:00","closed_at":"2025-11-16T15:03:55.009607-08:00"} @@ -1820,6 +1929,7 @@ {"id":"bd-vjdt","title":"Add bd doctor check for JSONL/SQLite/git divergence","description":"Part of GH#885 fix: recovery mechanism. Add new doctor check that detects: 1) JSONL on disk differs from git HEAD version, 2) SQLite last_import_time does not match JSONL mtime, 3) Uncommitted .beads/ changes exist. Auto-fix options: re-export from SQLite, re-import from JSONL, or commit pending changes. Key file: cmd/bd/doctor/fix/sync.go","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-04T13:53:43.848369-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-04T15:22:08.704257-08:00","closed_at":"2026-01-04T15:14:01.129418-08:00","close_reason":"Implemented CheckSyncDivergence doctor check","dependencies":[{"issue_id":"bd-vjdt","depends_on_id":"bd-pnx2","type":"parent-child","created_at":"2026-01-04T13:53:55.84741-08:00","created_by":"beads/crew/emma"}]} {"id":"bd-vks2","title":"bd dep tree doesn't display external dependencies","description":"GetDependencyTree (dependencies.go:464-624) uses a recursive CTE that JOINs with the issues table, which means external refs (external:project:capability) are invisible in the tree output.\n\nWhen an issue has an external blocking dependency, running 'bd dep tree \u003cid\u003e' won't show it.\n\nOptions:\n1. Query dependencies table separately for external refs and display them as leaf nodes\n2. Add a synthetic 'external' node type that shows the ref and resolution status\n3. Document that external deps aren't shown in tree view (use bd show for full deps)\n\nLower priority since bd show \u003cid\u003e displays all dependencies including external refs.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-21T23:45:27.121934-08:00","updated_at":"2025-12-22T22:30:19.083652-08:00","closed_at":"2025-12-22T22:30:19.083652-08:00","dependencies":[{"issue_id":"bd-vks2","depends_on_id":"bd-zmmy","type":"discovered-from","created_at":"2025-12-21T23:45:27.122511-08:00","created_by":"daemon"}]} {"id":"bd-vln0","title":"Add display guards for large molecules in bd mol current","description":"When molecule has \u003e100 steps, show summary instead of list.\n\nChanges:\n1. Count children first\n2. If count \u003e 100: show summary + pointer to bd mol progress\n3. Add --range flag for viewing specific step ranges\n4. Add --limit flag for capping output","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-31T00:52:52.823925-08:00","created_by":"gastown/crew/max","updated_at":"2025-12-31T13:08:19.539445-08:00","closed_at":"2025-12-31T13:08:19.539445-08:00","close_reason":"Added display guards: threshold check, --limit and --range flags","dependencies":[{"issue_id":"bd-vln0","depends_on_id":"bd-5nu1","type":"parent-child","created_at":"2025-12-31T00:54:00.833563-08:00","created_by":"gastown/crew/max"}]} +{"id":"bd-vnwnz","title":"Session ended: gt-beads-crew-fang","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T13:48:33.025101-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-09T13:48:33.060533-08:00","closed_at":"2026-01-09T13:48:33.060533-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-vpan","title":"Re: Thread Test 2","description":"Got your message. Testing reply feature.","status":"tombstone","priority":2,"issue_type":"message","created_at":"2025-12-16T18:21:29.144352-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","dependencies":[{"issue_id":"bd-vpan","depends_on_id":"bd-x36g","type":"replies-to","created_at":"2025-12-18T13:45:31.137191-08:00","created_by":"migration"}],"deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"message"} {"id":"bd-vpx7","title":"Add tests for bd update prefix routing","description":"Commit e2126831 added prefix routing to bd update but there are no update tests at all.\n\nbd update now uses resolveAndGetIssueWithRouting in direct mode, enabling\ncross-rig issue updates via prefix-based routing (like bd show).\n\nTest cases needed:\n- Update issue in current rig works\n- Update issue in different rig via prefix routing\n- Multiple ID updates with mixed routing\n- Error handling for non-existent IDs\n- Status update propagates correctly\n- Multiple field updates in single call\n\nLocation: cmd/bd/update.go\nSuggested test file: cmd/bd/update_test.go (new file needed)","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-07T01:18:13.499616-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-07T01:18:13.499616-08:00"} {"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"}]} @@ -1838,6 +1948,7 @@ {"id":"bd-w43xt","title":"Review PR #16228: Node 20 to 24 in devcontainer","description":"dispatched_by: beads/crew/emma\n\nReview and verify PR #16228 (anthropics/claude-code)\n\nPR: https://github.com/anthropics/claude-code/pull/16228\nAuthor: tomoki10\n\nUpdates Node.js from v20 (maintenance phase) to v24.\n- gh pr view 16228 --repo anthropics/claude-code\n- gh pr diff 16228 --repo anthropics/claude-code\n- If good: gh pr merge 16228 --repo anthropics/claude-code --squash","status":"closed","priority":2,"issue_type":"task","assignee":"beads/crew/giles","created_at":"2026-01-08T14:20:28.195989-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-08T14:29:35.604879-08:00","closed_at":"2026-01-08T14:29:35.604879-08:00","close_reason":"Wrong repo - these were for anthropics/claude-code, not steveyegge/beads"} {"id":"bd-w5ke7","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T21:37:16.866979-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T21:15:40.692804-08:00","closed_at":"2026-01-09T21:15:40.692804-08:00","close_reason":"Stale session ended events"} {"id":"bd-w654","title":"Merge: quartz-1767082908528","description":"branch: polecat/quartz-1767082908528\ntarget: main\nsource_issue: quartz-1767082908528\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T00:24:52.846909-08:00","created_by":"beads/polecats/quartz","updated_at":"2025-12-30T00:54:59.720022-08:00","closed_at":"2025-12-30T00:54:59.720022-08:00","close_reason":"Branch polecat/quartz-1767082908528 no longer exists on remote"} +{"id":"bd-w662z","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T16:21:00.574006-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-10T16:21:00.642384-08:00","closed_at":"2026-01-10T16:21:00.642384-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-w7wex","title":"bd mol cook: create gate beads for gate steps","description":"When cooking a molecule, if a step has a gate field:\n\n1. Create a gate bead with ID: \u003cmol-id\u003e.gate-\u003cstep-id\u003e\n2. Set await_type from step gate field\n3. Set await_id from step gate_hint (or empty for auto-discovery)\n4. Set timeout from step timeout field\n5. Gate bead starts with status=open\n\nThe gate bead implicitly blocks the step. Step cannot proceed until gate closes.\n\nParent: bd-ka761","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-08T20:53:57.201927-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-08T21:09:25.120036-08:00","closed_at":"2026-01-08T21:09:25.120036-08:00","close_reason":"Already implemented: createGateIssue() in cook.go creates gate beads with ID format \u003cmol-id\u003e.gate-\u003cstep-id\u003e, sets await_type/await_id/timeout. collectSteps() adds gate as blocking dependency. Tests in cook_test.go verify all functionality.","dependencies":[{"issue_id":"bd-w7wex","depends_on_id":"bd-ka761","type":"parent-child","created_at":"2026-01-08T20:54:04.024526-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-w7wex","depends_on_id":"bd-7m0d2","type":"blocks","created_at":"2026-01-08T20:54:11.62344-08:00","created_by":"beads/crew/emma"}]} {"id":"bd-w8g0","title":"test pin issue","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-20T22:44:27.963361-08:00","updated_at":"2025-12-20T22:44:57.977229-08:00","deleted_at":"2025-12-20T22:44:57.977229-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} {"id":"bd-w8v5","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T01:08:44.900466-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-07T01:08:44.93215-08:00","closed_at":"2026-01-07T01:08:44.93215-08:00","close_reason":"auto-closed session event"} @@ -1847,6 +1958,7 @@ {"id":"bd-wc2","title":"Test body-file","description":"This is a test description from a file.\n\nIt has multiple lines.\n","status":"tombstone","priority":4,"issue_type":"task","created_at":"2025-12-17T17:27:20.508724-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":"task"} {"id":"bd-wcfeu","title":"Review and test PR #975: sync --import-only fix","description":"dispatched_by: beads/crew/emma\n\nReview PR #975 from juanre that fixes sync --import-only failing with 'no database store available' when daemon was connected.\n\n## PR Details\n- URL: https://github.com/steveyegge/beads/pull/975\n- Author: juanre\n- Additions: 143 (mostly test code), Deletions: 0\n\n## Fix Summary\nWhen running bd sync --import-only while daemon is connected:\n1. PersistentPreRun connects to daemon, returns early without initializing store\n2. sync command closes daemon connection\n3. sync --import-only calls importFromJSONLInline which requires store != nil\n4. Fix: call ensureStoreActive() after closing daemon in sync.go\n\n## Your Task\n1. Fetch and checkout the PR branch locally\n2. Run tests: go test ./...\n3. Verify the specific test passes: go test -run TestImportFromJSONLInlineAfterDaemonDisconnect ./cmd/bd/\n4. Review the code change in cmd/bd/sync.go (6 lines)\n5. If everything looks good, approve and merge the PR\n\n## Commands\ngit fetch origin pull/975/head:pr-975\ngit checkout pr-975\ngo test ./...\ngh pr review 975 --repo steveyegge/beads --approve\ngh pr merge 975 --repo steveyegge/beads --squash","status":"closed","priority":2,"issue_type":"task","assignee":"beads/crew/dave","created_at":"2026-01-09T13:44:11.403407-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T13:45:43.994469-08:00","closed_at":"2026-01-09T13:45:43.994469-08:00","close_reason":"PR #975 already merged by steveyegge. Verified fix adds ensureStoreActive() after daemon disconnect in sync.go, with comprehensive test."} {"id":"bd-wcl","title":"Document CLI + hooks as recommended approach over MCP","description":"Update documentation to position CLI + bd prime hooks as the primary recommended approach over MCP server, explaining why minimizing context matters even with large context windows (compute cost, energy, environment, latency).","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-12T00:15:25.923025-08:00","updated_at":"2025-12-09T18:38:37.707666172-05:00","closed_at":"2025-11-26T18:06:51.020351-08:00"} +{"id":"bd-wdn03","title":"Session ended: gt-beads-witness","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T21:32:30.54266-08:00","created_by":"beads/witness","updated_at":"2026-01-10T21:32:30.585178-08:00","closed_at":"2026-01-10T21:32:30.585178-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-wdp83","title":"Add 'quality_score' field for aggregate quality metric","description":"dispatched_by: beads/crew/emma\n\nAdd float32 field (0.0-1.0) for aggregate quality score on issues. Validators (Refineries) can populate on merge. Foundation for proof-of-stake reputation. Distinct from per-Validation.Score.","status":"closed","priority":2,"issue_type":"task","assignee":"beads/crew/wolf","created_at":"2026-01-10T16:34:07.238429-08:00","created_by":"gastown/crew/max","updated_at":"2026-01-10T19:34:18.170174-08:00","closed_at":"2026-01-10T19:34:18.170174-08:00","close_reason":"Implementation complete","dependencies":[{"issue_id":"bd-wdp83","depends_on_id":"bd-imi7w","type":"parent-child","created_at":"2026-01-10T16:34:21.616554-08:00","created_by":"gastown/crew/max"}]} {"id":"bd-we4p","title":"Cache getMultiRepoJSONLPaths() result during sync to avoid redundant calls","description":"From bd-xo6b code review: getMultiRepoJSONLPaths() is called 3x per sync cycle.\n\n**Current behavior:**\ndaemon_sync.go calls getMultiRepoJSONLPaths() three times per sync:\n- Line 505: Snapshot capture before pull\n- Line 575: Merge/prune after pull\n- Line 613: Base snapshot update after import\n\n**Cost per call:**\n- Config lookup (likely cached, but still overhead)\n- Path construction: O(N) where N = number of repos\n- String allocations: (N + 1) × filepath.Join() calls\n\n**Total per sync:** 3N path constructions + 3 config lookups + 3 slice allocations\n\n**Impact:**\n- For N=3 repos: Negligible (\u003c 1ms)\n- For N=10 repos: Still minimal\n- For N=100+ repos: Wasteful\n\n**Solution:**\nCall once at sync start, reuse result:\n\n```go\nfunc createSyncFunc(...) func() {\n return func() {\n // ... existing setup ...\n \n // Call once at start\n multiRepoPaths := getMultiRepoJSONLPaths()\n \n // Snapshot capture\n if multiRepoPaths != nil {\n for _, path := range multiRepoPaths {\n if err := captureLeftSnapshot(path); err != nil { ... }\n }\n }\n \n // ... later ...\n \n // Merge/prune - reuse same paths\n if multiRepoPaths != nil {\n for _, path := range multiRepoPaths { ... }\n }\n \n // ... later ...\n \n // Base snapshot update - reuse same paths\n if multiRepoPaths != nil {\n for _, path := range multiRepoPaths { ... }\n }\n }\n}\n```\n\n**Files:**\n- cmd/bd/daemon_sync.go:449-636 (createSyncFunc)\n\n**Note:** This is a performance optimization, not a correctness fix. Low priority unless multi-repo usage scales significantly.","status":"closed","priority":2,"issue_type":"chore","created_at":"2025-11-06T19:31:32.128674-08:00","updated_at":"2025-11-06T19:40:50.871176-08:00","closed_at":"2025-11-06T19:40:50.871176-08:00","dependencies":[{"issue_id":"bd-we4p","depends_on_id":"bd-xo6b","type":"discovered-from","created_at":"2025-11-06T19:32:12.39754-08:00","created_by":"daemon"}]} {"id":"bd-weu8","title":"Formula parser: YAML schema for .formula.yaml files","description":"Implement formula parsing from YAML:\n- Define YAML schema for .formula.yaml files\n- Parse steps, compose rules, vars\n- Support extends for formula inheritance\n- Validate formula structure\n\nSchema should support:\n- formula: name\n- description: text\n- version: number\n- type: workflow|expansion|aspect\n- vars: variable definitions\n- steps: step definitions\n- compose: composition rules\n\nGas Town tracking: gt-8tmz.12","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-24T13:19:41.30319-08:00","updated_at":"2025-12-24T13:44:20.018577-08:00","closed_at":"2025-12-24T13:44:20.018577-08:00"} @@ -1855,29 +1967,50 @@ {"id":"bd-whgv","title":"Merge: bd-401h","description":"branch: polecat/rictus\ntarget: main\nsource_issue: bd-401h\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-19T23:20:37.854953-08:00","updated_at":"2025-12-20T23:17:26.999477-08:00","closed_at":"2025-12-20T23:17:26.999477-08:00"} {"id":"bd-whlsz","title":"Implement hop:// URI scheme for federation","description":"dispatched_by: beads/crew/emma\n\nImplement the Highway Operations Protocol (HOP) URI scheme for cross-repo and cross-town entity references.\n\nCurrent EntityRef.URI() returns entity://hop/platform/org/id - this is a draft format.\n\nRecommended scheme:\n hop://\u003centity\u003e/\u003cchain\u003e/\u003crig\u003e/\u003cid\u003e\n\nExamples:\n hop://steve@example.com/main-town/gastown/gt-xyz (full work unit)\n hop://steve@example.com/main-town (chain/workspace)\n hop://acme.com/engineering/backend/ac-123 (org work unit)\n\nImplementation:\n1. Update EntityRef to include Entity (email/domain) and Chain (workspace) fields\n2. Update EntityRef.URI() to return hop:// format\n3. Add ParseHopURI() for parsing\n4. Deprecate entity:// format\n\nThe hop:// scheme is the Highway Operations Protocol standard for Gas Town federation.","status":"closed","priority":1,"issue_type":"task","assignee":"beads/crew/grip","created_at":"2026-01-10T16:34:06.986905-08:00","created_by":"gastown/crew/max","updated_at":"2026-01-10T19:26:53.671408-08:00","closed_at":"2026-01-10T19:26:53.671408-08:00","close_reason":"Implemented hop:// URI scheme for federation:\n\n1. Updated EntityRef struct with new fields:\n - Entity (email/domain owner identifier)\n - Chain (workspace/town identifier)\n - Rig (rig name within chain)\n - Kept Platform/Org as deprecated for backwards compatibility\n\n2. Updated EntityRef.URI() to return hop:// format:\n - Full ref: hop://\u003centity\u003e/\u003cchain\u003e/\u003crig\u003e/\u003cid\u003e\n - Chain-level ref: hop://\u003centity\u003e/\u003cchain\u003e\n - Fallback to legacy entity://hop/\u003cplatform\u003e/\u003corg\u003e/\u003cid\u003e\n\n3. Added new functions:\n - ParseHopURI() for parsing hop:// URIs\n - ParseURI() for parsing both hop:// and entity:// formats\n - LegacyURI() for generating legacy entity:// URIs\n\n4. Updated hash writer to include new EntityRef fields\n\n5. Added comprehensive tests for all new functionality\n\nAll types package tests pass.","dependencies":[{"issue_id":"bd-whlsz","depends_on_id":"bd-imi7w","type":"parent-child","created_at":"2026-01-10T16:34:21.577742-08:00","created_by":"gastown/crew/max"}]} {"id":"bd-wisp-04d","title":"Verify PyPI package","description":"Confirm PyPI package published.\n\n```bash\npip index versions beads-mcp 2\u003e/dev/null | head -3\n```\n\nOr check: https://pypi.org/project/beads-mcp/\n\nShould show 0.45.0.\n\nNote: PyPI may have a small propagation delay (1-2 min).\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.259077-08:00","updated_at":"2026-01-06T20:17:52.239968-08:00","closed_at":"2026-01-06T20:17:52.239968-08:00","close_reason":"All release artifacts verified: GitHub (9 assets), npm 0.45.0, PyPI 0.45.0","dependencies":[{"issue_id":"bd-wisp-04d","depends_on_id":"bd-wisp-u9o","type":"blocks","created_at":"2026-01-06T20:07:32.285231-08:00","created_by":"beads/crew/dave"}]} +{"id":"bd-wisp-0i7","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-10T19:56:49.421558-08:00","updated_at":"2026-01-10T19:56:49.421558-08:00","ephemeral":true} +{"id":"bd-wisp-19q","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:58:23.389597-08:00","updated_at":"2026-01-10T23:58:23.389597-08:00","ephemeral":true} +{"id":"bd-wisp-1k6","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-11T00:20:20.808374-08:00","updated_at":"2026-01-11T00:20:20.808374-08:00","ephemeral":true} +{"id":"bd-wisp-1so","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:41:41.981364-08:00","updated_at":"2026-01-10T23:41:41.981364-08:00","ephemeral":true} +{"id":"bd-wisp-2j5","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:30:34.741075-08:00","updated_at":"2026-01-10T23:30:34.741075-08:00","ephemeral":true} +{"id":"bd-wisp-3mg","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:19:51.793921-08:00","updated_at":"2026-01-10T22:19:51.793921-08:00","ephemeral":true} +{"id":"bd-wisp-3uv","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:14:07.606645-08:00","updated_at":"2026-01-10T22:14:07.606646-08:00","ephemeral":true} +{"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-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-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-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"}]} {"id":"bd-wisp-9sq","title":"Release complete","description":"Release v0.45.0 is complete!\n\nSummary:\n- All version files updated\n- Git tag pushed\n- CI artifacts built (via gate)\n- npm and PyPI packages verified\n- Local installation updated\n- Daemons restarted\n\nOptional next steps:\n- Announce on social media\n- Update documentation site\n- Close related milestone\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.259643-08:00","updated_at":"2026-01-06T20:18:20.109063-08:00","closed_at":"2026-01-06T20:18:20.109063-08:00","close_reason":"Release v0.45.0 complete","dependencies":[{"issue_id":"bd-wisp-9sq","depends_on_id":"bd-wisp-bkf","type":"blocks","created_at":"2026-01-06T20:07:32.292316-08:00","created_by":"beads/crew/dave"}]} {"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-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"}]} +{"id":"bd-wisp-d7b","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-10T20:13:17.442141-08:00","updated_at":"2026-01-10T20:24:29.145383-08:00","closed_at":"2026-01-10T20:24:29.145383-08:00","close_reason":"Patrol: queue empty, no branches to merge","ephemeral":true} +{"id":"bd-wisp-da9","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","assignee":"beads/refinery","created_at":"2026-01-10T23:02:52.077365-08:00","updated_at":"2026-01-10T23:04:32.545374-08:00","ephemeral":true} +{"id":"bd-wisp-ddw","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:02:17.906528-08:00","updated_at":"2026-01-10T20:02:17.906528-08:00","ephemeral":true} {"id":"bd-wisp-dj0","title":"beads-release","description":"Beads release workflow v2 - gate-aware async release.\n\nThis formula orchestrates a complete release cycle with async gates:\n\nPhase 1 (Polecat Work):\n 1. Preflight checks (clean git, up to date)\n 2. Documentation updates (CHANGELOG, info.go)\n 3. Version bump (all components)\n 4. Git operations (commit, tag, push)\n\nGate (Async Wait):\n 5. await-ci: Gate on GitHub Actions release.yml completion\n\nPhase 2 (Parallel Verification):\n 6. Verify GitHub release, npm package, PyPI package (concurrent)\n\nPhase 3 (Installation):\n 7. Local installation update\n 8. Daemon restart\n\n## Usage\n\n```bash\nbd mol wisp create beads-release --var version=0.44.0\n```\n\nOr assign to a polecat:\n```bash\ngt sling beads/polecats/p1 --formula beads-release --var version=0.44.0\n```\n\nThe polecat will complete Phase 1, then signal phase-complete. The gate blocks\nuntil release.yml finishes. A new polecat (or the same one) resumes for Phases 2-3.\n","status":"closed","priority":2,"issue_type":"epic","created_at":"2026-01-07T00:02:11.335159-08:00","updated_at":"2026-01-07T00:11:26.667806-08:00","closed_at":"2026-01-07T00:11:26.667806-08:00","close_reason":"Release v0.46.0 published: GitHub, npm, PyPI all verified"} +{"id":"bd-wisp-dz5","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-10T19:40:21.849288-08:00","updated_at":"2026-01-10T19:45:58.671508-08:00","closed_at":"2026-01-10T19:45:58.671508-08:00","close_reason":"Patrol complete: queue empty","ephemeral":true} {"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-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-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-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-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-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-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} +{"id":"bd-wp2q5","title":"Review PR #1010: Add FreeBSD documentation","description":"dispatched_by: beads/crew/emma\n\nReview and approve PR #1010 from jordanhubbard that adds FreeBSD support documentation.\n\nPR URL: https://github.com/steveyegge/beads/pull/1010\n\n## Summary\nThis PR clarifies installation docs to include FreeBSD alongside Linux, adding FreeBSD-specific install notes.\n\n## Changes (57 additions, 5 deletions)\n- .goreleaser.yml: Add FreeBSD to quick install text\n- README.md: Add FreeBSD to requirements\n- docs/INSTALLING.md: Add FreeBSD section\n- website/docs/getting-started/installation.md: Add FreeBSD section\n- website/docs/intro.md: Add FreeBSD to quick install\n- website/static/llms-full.txt: Corresponding updates\n\n## Review Tasks\n1. Verify the install.sh script actually works on FreeBSD (or at least doesn't break)\n2. Check that documentation is consistent across all files\n3. Validate with: make test\n4. If all good, approve the PR with: gh pr review 1010 --repo steveyegge/beads --approve\n5. After approval, merge with: gh pr merge 1010 --repo steveyegge/beads --squash\n\n## Why Easy-Win\n- Documentation-only change\n- No code changes\n- Author is jordanhubbard (BSD expert)\n- Follows existing patterns for Linux docs","status":"closed","priority":2,"issue_type":"task","assignee":"beads/crew/dave","created_at":"2026-01-11T00:01:28.525277-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-11T00:03:26.309302-08:00","closed_at":"2026-01-11T00:03:26.309302-08:00","close_reason":"PR #1010 reviewed, approved, and merged. FreeBSD documentation added consistently across all install docs."} {"id":"bd-wp5j","title":"Merge: bd-indn","description":"branch: polecat/rictus\ntarget: main\nsource_issue: bd-indn\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-23T20:45:51.286598-08:00","updated_at":"2025-12-23T21:21:57.697826-08:00","closed_at":"2025-12-23T21:21:57.697826-08:00"} {"id":"bd-wqom","title":"Session ended: gt-beads-crew-dave","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T17:31:48.966642-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-07T17:31:48.999529-08:00","closed_at":"2026-01-07T17:31:48.999529-08:00","close_reason":"auto-closed session event"} +{"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-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"} @@ -1896,12 +2029,14 @@ {"id":"bd-x3hi","title":"Support redirect files in .beads/ directory","description":"Gas Town creates polecat worktrees with .beads/redirect files that point to a shared beads database. The bd CLI should:\n\n1. When finding a .beads/ directory, check if it contains a 'redirect' file\n2. If redirect exists, read the relative path and use that as the beads directory\n3. This allows multiple git worktrees to share a single beads database\n\nExample:\n- polecats/alpha/.beads/redirect contains '../../mayor/rig/.beads'\n- bd commands from alpha should use mayor/rig/.beads\n\nCurrently bd ignores redirect files and either uses the local .beads/ or walks up to find a parent .beads/.\n\nRelated: gt-nriy (test message that can't be retrieved due to missing redirect support)","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-20T21:46:23.415172-08:00","updated_at":"2025-12-20T21:59:25.759664-08:00","closed_at":"2025-12-20T21:59:25.759664-08:00"} {"id":"bd-x3j8","title":"Update info.go versionChanges","description":"Add 0.32.1 entry to versionChanges map in cmd/bd/info.go","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T21:53:17.344841-08:00","updated_at":"2025-12-20T21:54:31.906761-08:00","closed_at":"2025-12-20T21:54:31.906761-08:00","dependencies":[{"issue_id":"bd-x3j8","depends_on_id":"bd-an4s","type":"parent-child","created_at":"2025-12-20T21:53:17.346736-08:00","created_by":"daemon"},{"issue_id":"bd-x3j8","depends_on_id":"bd-rgd7","type":"blocks","created_at":"2025-12-20T21:53:29.62309-08:00","created_by":"daemon"}]} {"id":"bd-x47","title":"Add guidance for self-hosting projects","description":"The contributor-workflow-analysis.md is optimized for OSS contributors making PRs to upstream projects. However, it doesn't address projects like VC that use beads for their own development (self-hosting).\n\nSelf-hosting projects differ from OSS contributors:\n- No upstream/downstream distinction (they ARE the project)\n- May run automated executors (not just humans)\n- In bootstrap/early phase (stability matters)\n- Single team/owner (not multiple contributors with permissions)\n\nGuidance needed on:\n- When self-hosting projects should stay single-repo (default, recommended)\n- When they should adopt multi-repo (team planning, multi-phase dev)\n- How automated executors should handle multi-repo (if at all)\n- Special considerations for projects in bootstrap phase\n\nExamples of self-hosting projects: VC (building itself with beads), internal tools, pet projects","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-03T20:24:27.805341-08:00","updated_at":"2025-11-05T14:16:34.69662-08:00","closed_at":"2025-11-05T14:16:34.69662-08:00"} +{"id":"bd-x4zsn","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T14:28:30.461929-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T14:28:30.499363-08:00","closed_at":"2026-01-09T14:28:30.499363-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-x5j9l","title":"Digest: mol-refinery-patrol","description":"Patrol complete: queue empty, 0 branches merged, 0 messages, main green","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T16:51:44.445264-08:00","updated_at":"2026-01-10T16:51:44.445264-08:00","closed_at":"2026-01-10T16:51:44.445228-08:00","close_reason":"Squashed from 11 wisps"} {"id":"bd-x5wg","title":"Create and push git tag v0.33.2","description":"Create the release tag and push it:\n\n```bash\ngit tag v0.33.2\ngit push origin v0.33.2\n```\n\nThis triggers the GoReleaser GitHub Action to build release binaries.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T16:10:13.76223-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"} {"id":"bd-x6kv","title":"Merge: jade-mjtlsejo","description":"branch: polecat/jade-mjtlsejo\ntarget: main\nsource_issue: jade-mjtlsejo\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T22:06:59.327455-08:00","created_by":"beads/polecats/jade","updated_at":"2026-01-01T10:43:18.62673-08:00","closed_at":"2026-01-01T10:43:18.62673-08:00","close_reason":"Stale MR - branch no longer exists on remote"} {"id":"bd-x7i7c","title":"Pre-existing: SQLite scan column count mismatch (31 vs 32)","description":"Multiple tests failing on main with: 'sql: expected 31 destination arguments in Scan, not 32'\n\nAffected tests:\n- TestGetIssuesByLabel (internal/storage/sqlite)\n- TestMigrateContentHashColumn (internal/storage/sqlite)\n- TestResolveProtoIDOrTitle (cmd/bd)\n\nRoot cause appears to be a column added to the issues table without updating all Scan calls.\n\nDiscovered during refinery patrol while processing polecat/quartz-lmqhe.","status":"open","priority":1,"issue_type":"bug","created_at":"2026-01-10T22:11:22.005398-08:00","created_by":"beads/refinery","updated_at":"2026-01-10T22:11:22.005398-08:00"} {"id":"bd-xabtq","title":"Session ended: gt-beads-crew-dave","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-08T14:23:46.099872-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-08T14:23:46.132871-08:00","closed_at":"2026-01-08T14:23:46.132871-08:00","close_reason":"auto-closed session event"} {"id":"bd-xai7h","title":"Review and merge PR #999: bsv terminal viewer","description":"Review and merge PR #999 from bglenden that adds bsv (Rust TUI viewer) to COMMUNITY_TOOLS.md.\n\nEasy-win criteria:\n- Documentation-only change (2 lines added)\n- Adds link to external community tool\n- No code changes, just adding to community tools list\n\nSteps:\n1. gh pr checkout 999 --repo steveyegge/beads\n2. Verify the addition follows existing format in COMMUNITY_TOOLS.md\n3. Check the linked repo exists and is legitimate\n4. gh pr merge 999 --repo steveyegge/beads --squash\n\nPR: https://github.com/steveyegge/beads/pull/999","status":"closed","priority":2,"issue_type":"task","assignee":"beads/crew/fang","created_at":"2026-01-10T11:58:12.421204-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-10T12:06:20.483258-08:00","closed_at":"2026-01-10T12:06:20.483258-08:00","close_reason":"Reviewed and merged PR #999: bsv terminal viewer added to COMMUNITY_TOOLS.md"} +{"id":"bd-xbe2e","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T12:59:16.12296-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-10T12:59:16.180965-08:00","closed_at":"2026-01-10T12:59:16.180965-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-xbl46","title":"Digest: mol-refinery-patrol","description":"Patrol: queue empty, no branches to merge","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T23:20:56.191693-08:00","updated_at":"2026-01-10T23:20:56.191693-08:00","closed_at":"2026-01-10T23:20:56.191652-08:00","close_reason":"Squashed from 11 wisps","dependencies":[{"issue_id":"bd-xbl46","depends_on_id":"bd-wisp-4qx","type":"parent-child","created_at":"2026-01-10T23:20:56.19258-08:00","created_by":"beads/refinery"}]} {"id":"bd-xctp","title":"GH#519: bd sync fails when sync.branch is currently checked-out branch","status":"tombstone","priority":2,"issue_type":"bug","created_at":"2025-12-16T01:06:05.319281-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} {"id":"bd-xfi2b","title":"Broken beads redirect: mayor/rig/.beads doesn't exist","description":"The beads redirect in polecats worktrees and rig-level .beads points to mayor/rig/.beads, but this directory doesn't exist.\n\nPath: /Users/stevey/gt/mayor/rig/.beads\nRedirect source: .beads/redirect contains 'mayor/rig/.beads'\n\nThis blocks gt done and gt handoff operations for polecats.","status":"closed","priority":1,"issue_type":"bug","created_at":"2026-01-10T21:12:30.823055-08:00","created_by":"beads/polecats/obsidian","updated_at":"2026-01-10T21:25:56.132031-08:00","closed_at":"2026-01-10T21:25:56.132031-08:00","close_reason":"Fixed: Redirect path was ../../../../mayor/rig/.beads (resolving to nonexistent /Users/stevey/gt/mayor/rig/.beads). Changed to ../../../mayor/rig/.beads (resolving correctly to /Users/stevey/gt/beads/mayor/rig/.beads). Fixed all 6 polecat worktrees."} @@ -1935,6 +2070,7 @@ {"id":"bd-y0e4","title":"Code smell: Storage interface has 50+ methods - consider interface segregation","description":"The Storage interface in internal/storage/storage.go has 50+ methods covering:\n\n- Issue CRUD (CreateIssue, GetIssue, UpdateIssue, DeleteIssue, SearchIssues)\n- Dependencies (AddDependency, RemoveDependency, GetDependencies, GetDependents, etc.)\n- Labels (AddLabel, RemoveLabel, GetLabels, etc.)\n- Ready work (GetReadyWork, GetBlockedIssues, etc.)\n- Events/Comments\n- Statistics\n- Dirty tracking\n- Export hash tracking\n- ID generation\n- Config/Metadata\n- Transactions\n- Lifecycle\n\nWhile this is a valid design for a storage abstraction, consider the Interface Segregation Principle:\n\n1. Split into smaller interfaces: IssueStorage, DependencyStorage, LabelStorage, etc.\n2. Compose them: `type Storage interface { IssueStorage; DependencyStorage; ... }`\n3. This allows more focused testing and clearer API contracts\n\nLocation: internal/storage/storage.go:79-197","status":"closed","priority":4,"issue_type":"chore","created_at":"2025-12-28T15:32:54.005169-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T17:21:44.466226-08:00","closed_at":"2025-12-28T17:21:44.466226-08:00","dependencies":[{"issue_id":"bd-y0e4","depends_on_id":"bd-784c","type":"parent-child","created_at":"2025-12-28T15:38:04.296641-08:00","created_by":"daemon"}]} {"id":"bd-y0fj","title":"Issue lifecycle hooks (on-close, on-complete)","description":"Add hooks that fire on issue state transitions, enabling automation like closing linked GitHub issues.\n\n## Problem\n\nWe have `external_ref` to link beads issues to external systems (GitHub, Linear, Jira), but no mechanism to trigger actions when issues close. Currently:\n\n```\nbd-u2sc (external_ref: gh-692) closes → nothing happens\n```\n\n## Proposed Solution\n\n### Phase 1: Shell Hooks\n\nAdd `.beads-hooks/on-close.sh` (and similar lifecycle hooks):\n\n```bash\n# .beads-hooks/on-close.sh\n# Called by bd close with issue JSON on stdin\n#\\!/bin/bash\nissue=$(cat)\nexternal_ref=$(echo \"$issue\" | jq -r '.external_ref // empty')\nif [[ \"$external_ref\" == gh-* ]]; then\n number=\"${external_ref#gh-}\"\n gh issue close \"$number\" --repo steveyegge/beads \\\n --comment \"Completed via beads epic $(echo $issue | jq -r .id)\"\nfi\n```\n\n### Lifecycle Events\n\n| Event | Trigger | Use Cases |\n|-------|---------|-----------|\n| `on-close` | Issue closed | Close external refs, notify, archive |\n| `on-complete` | Epic children all done | Roll-up completion, close parent refs |\n| `on-status-change` | Any status transition | Sync to external systems |\n\n### Phase 2: Molecule Completion Handlers\n\nMolecules could define completion actions:\n\n```yaml\nname: github-issue-tracker\non_complete:\n - action: shell\n command: gh issue close {{external_ref}} --repo {{repo}}\n - action: mail\n to: mayor/\n subject: \"Epic {{id}} completed\"\n```\n\n### Phase 3: Gas Town Integration\n\nFor full Gas Town deployments:\n- Witness observes closures via beads events\n- Routes to integration agents via mail\n- Agents handle external system interactions\n\n## Implementation Notes\n\n- Hooks should be async (don't block bd close)\n- Pass full issue JSON to hook via stdin\n- Support hook timeout and failure handling\n- Consider `--no-hooks` flag for bulk operations\n\n## Related\n\n- `external_ref` field already exists (GH#142)\n- Cross-project deps: bd-h807, bd-d9mu\n- Git hooks: .beads-hooks/ pattern established\n\n## Use Cases\n\n1. **GitHub integration**: Close GH issues when beads epic completes\n2. **Linear sync**: Update Linear status when beads status changes \n3. **Notifications**: Send mail/Slack when high-priority issues close\n4. **Audit**: Log all closures to external system","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-22T14:46:04.846657-08:00","updated_at":"2025-12-22T14:50:40.35447-08:00","closed_at":"2025-12-22T14:50:40.35447-08:00"} {"id":"bd-y2v","title":"Refactor duplicate JSONL-from-git parsing code","description":"Both readFirstIssueFromGit() in init.go and importFromGit() in autoimport.go have similar code patterns for:\n1. Running git show \u003cref\u003e:\u003cpath\u003e\n2. Scanning the output with bufio.Scanner\n3. Parsing JSON lines\n\nCould be refactored to share a helper like:\n- readJSONLFromGit(gitRef, path string) ([]byte, error)\n- Or a streaming version: streamJSONLFromGit(gitRef, path string) (io.Reader, error)\n\nFiles:\n- cmd/bd/autoimport.go:225-256 (importFromGit)\n- cmd/bd/init.go:1212-1243 (readFirstIssueFromGit)\n\nPriority is low since code duplication is minimal and both functions work correctly.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-05T14:51:18.41124-08:00","updated_at":"2025-12-23T22:37:15.770825-08:00","closed_at":"2025-12-23T22:37:15.770825-08:00"} +{"id":"bd-y4804","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T21:27:08.729768-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T21:27:08.76478-08:00","closed_at":"2026-01-09T21:27:08.76478-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-y4vz","title":"Work on beads-eub: Consolidated context tool for MCP serv...","description":"Work on beads-eub: Consolidated context tool for MCP server (GH#636). Merge set_context, where_am_i, init into single 'context' tool. When done, submit MR (not PR) to integration branch for Refinery.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-19T22:56:58.527144-08:00","updated_at":"2025-12-20T00:49:51.929597-08:00","closed_at":"2025-12-19T23:31:11.906952-08:00"} {"id":"bd-y6d","title":"Refactor create_test.go to use shared DB setup","description":"Convert TestCreate_* functions to use test suites with shared database setup.\n\nExample transformation:\n- Before: 10 separate tests, each with newTestStore() \n- After: 1 TestCreate() with 10 t.Run() subtests sharing one DB\n\nEstimated speedup: 10x faster (1 DB setup instead of 10)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-21T11:48:56.858213-05:00","updated_at":"2025-11-21T16:07:50.846505-05:00","closed_at":"2025-11-21T15:15:31.315407-05:00","dependencies":[{"issue_id":"bd-y6d","depends_on_id":"bd-1rh","type":"blocks","created_at":"2025-11-21T11:49:09.660182-05:00","created_by":"daemon"},{"issue_id":"bd-y6d","depends_on_id":"bd-c49","type":"blocks","created_at":"2025-11-21T11:49:26.410452-05:00","created_by":"daemon"}]} {"id":"bd-y6t6","title":"GH#524: Package for Windows (winget)","description":"Request to publish beads on winget for easy Windows installation. See: https://github.com/steveyegge/beads/issues/524","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-12-14T16:31:28.596258-08:00","updated_at":"2025-12-16T01:27:29.065187-08:00","closed_at":"2025-12-16T01:27:29.065187-08:00"} @@ -1947,7 +2083,10 @@ {"id":"bd-ycrq","title":"Consolidate daemon/daemons commands","description":"Merge daemons functionality into daemon command with subcommands. Currently have both 'daemon' and 'daemons' at top level.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-28T12:59:11.393637-08:00","created_by":"stevey","updated_at":"2025-12-28T13:05:28.776344-08:00","closed_at":"2025-12-28T13:05:28.776344-08:00"} {"id":"bd-ye0d","title":"troubleshoot GH#278 daemon exits every few secs","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-13T06:27:23.39509215-07:00","updated_at":"2025-11-25T17:48:43.62418-08:00","closed_at":"2025-11-25T17:48:43.62418-08:00"} {"id":"bd-yek6","title":"CLI tests (cli_fast_test.go) are slow and should be integration tests","description":"The TestCLI_* tests in cmd/bd/cli_fast_test.go are taking 4-5 seconds each (40+ seconds total), making them the slowest part of the fast test suite.\n\nCurrent timings:\n- TestCLI_Import: 4.73s\n- TestCLI_Blocked: 4.33s \n- TestCLI_DepTree: 4.15s\n- TestCLI_Close: 3.59s\n- TestCLI_DepAdd: 3.50s\n- etc.\n\nThese tests compile the bd binary once in init(), but then execute it multiple times per test with filesystem operations. Despite being named \"fast\", they're actually end-to-end CLI integration tests.\n\nOptions:\n1. Tag with //go:build integration (move to integration suite)\n2. Optimize: Use in-memory databases, reduce exec calls, better parallelization\n3. Keep as-is but understand they're the baseline for \"fast\" tests\n\nTotal test suite currently: 13.8s (cmd/bd alone is 12.8s, and most of that is these CLI tests)","notes":"Fixed by reusing existing bd binary from repo root instead of rebuilding.\n\nBefore: 15+ minutes (rebuilding binary for every test package)\nAfter: ~12 seconds (reuses pre-built binary)\n\nThe init() function now checks for ../../bd first before falling back to building. This means `go build \u0026\u0026 go test` is now fast.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-05T20:19:12.822543-08:00","updated_at":"2025-11-05T20:31:19.321787-08:00","closed_at":"2025-11-05T20:31:19.321787-08:00"} +{"id":"bd-yhs4x","title":"Session ended: gt-beads-crew-wolf","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T13:52:49.868877-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-09T13:52:49.906983-08:00","closed_at":"2026-01-09T13:52:49.906983-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-yi824","title":"Digest: mol-refinery-patrol","description":"Patrol: Queue empty, no branches merged, inbox clear","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T22:21:14.477633-08:00","updated_at":"2026-01-10T22:21:14.477633-08:00","closed_at":"2026-01-10T22:21:14.477598-08:00","close_reason":"Squashed from 11 wisps","dependencies":[{"issue_id":"bd-yi824","depends_on_id":"bd-wisp-3mg","type":"parent-child","created_at":"2026-01-10T22:21:14.47851-08:00","created_by":"beads/refinery"}]} +{"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-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-ym05l","title":"Session ended: gt-beads-crew-wolf","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T20:42:58.763079-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-07T20:42:58.7968-08:00","closed_at":"2026-01-07T20:42:58.7968-08:00","close_reason":"auto-closed session event"} @@ -1960,6 +2099,7 @@ {"id":"bd-ysal","title":"bd sync --import-only silently fails when run from redirected .beads directory","description":"## Problem\n\nWhen running `bd sync --import-only` from a directory that has a `.beads/redirect` file pointing elsewhere, the command reports success but doesn't actually fix the staleness check.\n\n## Reproduction\n\n1. Have a clone with `.beads/redirect` pointing to another location (e.g., `../../mayor/rig/.beads`)\n2. Run `bd sync --import-only` from the clone directory\n3. Command reports: `Import complete: 0 created, 0 updated, N unchanged, M skipped`\n4. But subsequent `bd list` still fails with: `Error: Database out of sync with JSONL`\n\n## Expected Behavior\n\nEither:\n- The sync should follow the redirect and actually sync the target database\n- Or the command should error/warn that it can't sync a redirected beads location\n\n## Workaround\n\nRun `bd sync --import-only` from the actual beads directory (the redirect target), not the redirected clone.","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-01-06T18:38:46.308049-08:00","created_by":"gastown/crew/george","updated_at":"2026-01-06T18:50:40.939761-08:00","closed_at":"2026-01-06T18:50:40.939761-08:00","close_reason":"Fixed by using inline import instead of subprocess for --import-only mode. This ensures path resolution is consistent when running from directories with .beads/redirect."} {"id":"bd-yuf7","title":"bd config set succeeds but doesn't persist to config.toml","description":"Commands like `bd config set daemon.auto_push true` return \"Set daemon.auto_push = true\" but the config file is never created and `bd info --json | jq '.config'` returns null.\n\n**Steps to reproduce:**\n1. Run `bd config set daemon.auto_push true`\n2. See success message: \"Set daemon.auto_push = true\"\n3. Check `cat .beads/config.toml` → file doesn't exist\n4. Check `bd info --json | jq '.config'` → returns null\n\n**Expected:**\n- .beads/config.toml should be created with the setting\n- bd info should show the config value\n\n**Impact:**\nUsers can't enable auto-push/auto-commit via CLI as documented in AGENTS.md","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-08T01:14:58.726198-08:00","updated_at":"2025-11-08T01:17:41.377912-08:00","closed_at":"2025-11-08T01:17:41.377912-08:00"} {"id":"bd-yuxq","title":"Code smell: 262 uses of interface{} reduce type safety","description":"Heavy use of interface{} across 92 files (262 occurrences) in:\n- RPC update arguments: updatesFromArgs() returns map[string]interface{}\n- JSON unmarshaling and formatting\n- Storage query helpers\n\n**Example in internal/rpc/server_issues_epics.go:45:**\n```go\nfunc updatesFromArgs(a UpdateArgs) map[string]interface{} {\n // Returns map with interface{} values - types must be asserted at use sites\n}\n```\n\n**Problem:**\n- Loss of type safety\n- Runtime type assertions required\n- Harder to catch errors at compile time\n\n**Acceptance Criteria:**\n- [ ] Define typed update structs for specific field groups\n- [ ] Use generics where possible (Go 1.18+)\n- [ ] Reduce interface{} count by at least 50%\n- [ ] Document expected types where interface{} remains necessary\n- [ ] Tests pass","status":"closed","priority":3,"issue_type":"chore","created_at":"2025-12-28T19:00:01.896147-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-30T15:44:43.347739-08:00","closed_at":"2025-12-30T07:04:41.376731-08:00","close_reason":"Implemented type safety improvements:\n\n1. Created IssueUpdate struct with typed fields and ToMap() for backward compatibility\n2. Created 15+ typed response structs (StatusMessage, DeleteResult, CompactResult, etc.)\n3. Refactored updatesFromArgs to use typed IssueUpdate internally\n4. Updated RPC delete handler to use typed DeleteResult\n5. Updated migrate.go to use StatusMessage for errors\n\nThe typed structs provide compile-time checking and reduce runtime type assertions. This foundation enables further cleanup of interface{} usage over time.\n\nNote: Many remaining interface{} usages are inherent to Go's JSON handling and external APIs (GraphQL, SQL). The acceptance criteria of 50% reduction applies to the refactorable patterns, not the total count.","dependencies":[{"issue_id":"bd-yuxq","depends_on_id":"bd-ox1o","type":"blocks","created_at":"2025-12-28T19:00:23.812412-08:00","created_by":"daemon"}]} +{"id":"bd-yvhxr","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T00:36:57.748089-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-10T00:36:57.786518-08:00","closed_at":"2026-01-10T00:36:57.786518-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-yvlc","title":"URGENT: main branch has failing tests (syncbranch migration error)","description":"The main branch has failing tests that are blocking CI for all PRs.\n\n## Problem\nAll syncbranch_test.go tests failing with:\n\"migration external_ref_column failed: failed to create index on external_ref: sqlite3: SQL logic error: no such table: main.issues\"\n\n## Evidence\n- Last 5 CI runs on main: ALL FAILED\n- Tests fail locally on current main (bd6dca5)\n- Affects: TestGet, TestSet, TestUnset in internal/syncbranch\n\n## Impact\n- Blocking all PR merges\n- CI shows red for all branches\n- Can't trust test results\n\n## Root Cause\nMigration order issue - trying to create index on external_ref column before the issues table exists, or before the external_ref column is added to the issues table.\n\n## Quick Fix Needed\nNeed to investigate migration order in internal/storage/sqlite/migrations.go and ensure:\n1. issues table is created first\n2. external_ref column is added to issues table\n3. THEN index on external_ref is created\n\nThis is CRITICAL - main should never have breaking tests.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-15T12:25:31.51688-08:00","updated_at":"2025-11-15T12:43:11.489612-08:00","closed_at":"2025-11-15T12:43:11.489612-08:00"} {"id":"bd-yvmni","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-08T20:16:09.821155-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-08T20:16:09.856754-08:00","closed_at":"2026-01-08T20:16:09.856754-08:00","close_reason":"auto-closed session event"} {"id":"bd-yx22","title":"Merge: bd-d28c","description":"branch: polecat/testcat\ntarget: main\nsource_issue: bd-d28c\nrig: beads","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-23T21:33:15.490412-08:00","updated_at":"2025-12-23T21:36:38.584933-08:00","closed_at":"2025-12-23T21:36:38.584933-08:00"} @@ -1978,15 +2118,18 @@ {"id":"bd-z830","title":"Test child task","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-27T23:26:58.246573-08:00","created_by":"beads/crew/emma","updated_at":"2025-12-27T23:27:40.451603-08:00","closed_at":"2025-12-27T23:27:40.451603-08:00","dependencies":[{"issue_id":"bd-z830","depends_on_id":"bd-fbl9","type":"parent-child","created_at":"2025-12-27T23:27:02.984294-08:00","created_by":"daemon"}]} {"id":"bd-z86n","title":"Code Review: PR #551 - Persist close_reason to issues table","description":"Code review of PR #551 which fixes close_reason persistence bug.\n\n## Summary\nThe PR correctly fixes a bug where close_reason was only stored in the events table, not in the issues.close_reason column. This caused `bd show --json` to return empty close_reason.\n\n## What Was Fixed\n- ✅ CloseIssue now updates both close_reason and closed_at\n- ✅ ReOpenIssue clears both close_reason and closed_at\n- ✅ Comprehensive tests added for both storage and CLI layers\n- ✅ Clear documentation in queries.go about dual storage strategy\n\n## Quality Assessment\n✅ Tests cover both storage layer and CLI JSON output\n✅ Handles reopen case (clearing close_reason)\n✅ Good comments explaining dual-storage design\n✅ No known issues\n\n## Potential Followups\nSee linked issues for suggestions.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-14T14:25:06.887069-08:00","updated_at":"2025-12-29T13:40:29.724656-08:00","closed_at":"2025-12-29T13:40:29.724656-08:00","close_reason":"Stale/spurious - test artifacts, merged PRs, or auto-close candidates"} {"id":"bd-z8a6","title":"bd delete --from-file should add deleted issues to deletions manifest","description":"When using bd delete --from-file to bulk delete issues, the deleted issue IDs are not being added to the deletions.jsonl manifest.\n\nThis causes those issues to be resurrected during bd sync when git history scanning finds them in old commits.\n\nExpected: All deleted issues should be added to deletions.jsonl so they wont be reimported from git history.\n\nWorkaround: Manually add deletion records to deletions.jsonl.","status":"tombstone","priority":1,"issue_type":"bug","created_at":"2025-12-16T01:48:14.099855-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} -{"id":"bd-z8xq2","title":"No ref test","status":"open","priority":1,"issue_type":"task","created_at":"2026-01-10T20:38:11.113534-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-10T20:38:11.113534-08:00"} +{"id":"bd-z8xq2","title":"No ref test","status":"open","priority":1,"issue_type":"task","owner":"steve.yegge@gmail.com","created_at":"2026-01-10T20:38:11.113534-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-10T20:38:11.113534-08:00"} {"id":"bd-z8xz","title":"beads-release formula: fix local-install dev path and clarify bump-version.sh","description":"## Overview\n\nThe beads-release formula delegates to a monolithic `bump-version.sh` script, which defeats the purpose of having fine-grained molecule steps:\n\n- **Durability**: If interrupted mid-script, you lose progress and must restart\n- **Visibility**: Activity feed only shows one step, not progress through sub-operations \n- **Atomicity**: Cant resume from a specific sub-operation\n\nThe formula's fine-grained steps ARE the feature. The script is legacy.\n\n## Current State\n\nThe `run-bump-script` step calls `./scripts/bump-version.sh {{version}}` which does:\n\n### Version Updates (should be individual steps)\n1. `cmd/bd/version.go` - Go version constant\n2. `.claude-plugin/plugin.json` - Plugin manifest\n3. `.claude-plugin/marketplace.json` - Marketplace entry\n4. `integrations/beads-mcp/pyproject.toml` - Python package version\n5. `integrations/beads-mcp/src/beads_mcp/__init__.py` - Python __version__\n6. `npm-package/package.json` - npm package version\n7. `cmd/bd/templates/hooks/*` - Hook template versions (4 files)\n8. `README.md` - Alpha version badge\n9. `CHANGELOG.md` - Stamp [Unreleased] with date\n\n### Local Install (needs dev path added)\n- Build binary: `go build -o bd ./cmd/bd`\n- Copy to `~/.local/bin/bd`\n- **macOS codesigning** (critical - without this binary gets SIGKILL)\n- MCP local install via uv/pip\n- Daemon restart\n\n## Target State\n\n### Phase 1: Break version updates into individual steps\n\nReplace `run-bump-script` with explicit steps:\n- `bump-version-go` - sed on cmd/bd/version.go\n- `bump-plugin-json` - jq on .claude-plugin/*.json\n- `bump-mcp-python` - sed on pyproject.toml and __init__.py\n- `bump-npm-package` - jq on npm-package/package.json \n- `bump-hook-templates` - sed on cmd/bd/templates/hooks/*\n- `bump-readme` - sed on README.md\n- `stamp-changelog` - sed to add date to [Unreleased]\n\nEach step has explicit commands that can be copy-pasted.\n\n### Phase 2: Fix local-install step\n\nAdd Option 3 for devs building from source:\n```bash\ngo build -o bd ./cmd/bd\ncp bd ~/.local/bin/bd\n# macOS ONLY - prevents SIGKILL (Killed: 9)\n[[ $(uname) == \"Darwin\" ]] \u0026\u0026 codesign --force --sign - ~/.local/bin/bd\n```\n\n### Phase 3: Deprecate bump-version.sh\n\nEither:\n- Add deprecation notice pointing to formula\n- Remove entirely (formula is the authority)\n- Keep as convenience wrapper that just runs `bd mol execute beads-release`\n\n## Acceptance Criteria\n\n- [ ] Formula has explicit steps for each version file update\n- [ ] Each step shows clear commands (no script delegation)\n- [ ] local-install includes build-from-source with codesigning\n- [ ] bump-version.sh is deprecated or removed\n- [ ] Release can complete even if interrupted mid-execution (resume from step)\n","status":"closed","priority":1,"issue_type":"epic","assignee":"beads/crew/emma","created_at":"2026-01-07T00:20:38.312564-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-07T00:49:36.216406-08:00","closed_at":"2026-01-07T00:49:36.216406-08:00","close_reason":"Installed bd 0.46.0 locally. Epic scope (formula refactor) deferred - filed child issues bd-a854, bd-5cnq, bd-vizy for future work.","dependencies":[{"issue_id":"bd-z8xz","depends_on_id":"bd-fbkd","type":"related","created_at":"2026-01-07T00:20:49.331713-08:00","created_by":"beads/crew/emma"}]} {"id":"bd-zai","title":"bd init resets metadata.json jsonl_export to beads.jsonl, ignoring existing issues.jsonl","description":"When running 'bd init --prefix bd' in a repo that already has .beads/issues.jsonl, the init command overwrites metadata.json and sets jsonl_export back to 'beads.jsonl' instead of detecting and respecting the existing issues.jsonl file.\n\nSteps to reproduce:\n1. Have a repo with .beads/issues.jsonl (canonical) and metadata.json pointing to issues.jsonl\n2. Delete beads.db and run 'bd init --prefix bd'\n3. Check metadata.json - it now says jsonl_export: beads.jsonl\n\nExpected: Init should detect existing issues.jsonl and use it.\n\nWorkaround: Manually edit metadata.json after init.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-26T22:27:41.653287-08:00","updated_at":"2025-12-02T17:11:19.752292588-05:00","closed_at":"2025-11-28T21:54:32.52461-08:00"} +{"id":"bd-zajuh","title":"Session ended: gt-beads-witness","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T21:28:46.234212-08:00","created_by":"beads/witness","updated_at":"2026-01-10T21:28:46.276675-08:00","closed_at":"2026-01-10T21:28:46.276675-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-zbq2","title":"bd export should verify JSONL line count matches database count","description":"After export completes, bd should verify that the JSONL file line count matches the number of issues exported. This would catch silent failures where the export appears to succeed but doesn't actually write all issues.\n\nReal-world scenario from VC project:\n- Ran direct SQL DELETE to remove 240 issues \n- Ran 'bd export -o .beads/issues.jsonl'\n- No error shown, appeared to succeed\n- But JSONL file was not updated (still had old line count)\n- Later session found all 240 issues still in JSONL\n- Had to repeat the cleanup\n\nIf export had verified line count, it would have immediately shown:\n Error: Export verification failed\n Expected: 276 issues\n JSONL file: 516 lines\n Mismatch indicates export failed to write all issues\n\nThis is especially important because:\n1. JSONL is source of truth in git\n2. Silent export failures cause data inconsistency\n3. Users assume export succeeded if no error shown\n4. The verification is cheap (just count lines)\n\nImplementation:\n- After writing JSONL, count lines in file\n- Compare to len(exportedIDs)\n- If mismatch, remove temp file and return error\n- Show clear error message with both counts","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-05T14:24:56.278249-08:00","updated_at":"2025-11-05T15:09:41.636141-08:00","closed_at":"2025-11-05T14:31:24.494885-08:00"} {"id":"bd-zbyb","title":"GH#522: Add --type flag to bd update command","description":"Allow changing issue type (task/epic/bug/feature) via bd update --type. Storage layer already supports it. Needed for TUI tools like Abacus. See: https://github.com/steveyegge/beads/issues/522","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-14T16:31:31.71456-08:00","updated_at":"2025-12-16T01:27:29.050397-08:00","closed_at":"2025-12-16T01:27:29.050397-08:00"} {"id":"bd-zc3","title":"Add --pinned and --no-pinned flags to bd list","description":"Add filtering flags to bd list: --pinned shows only pinned issues, --no-pinned excludes pinned issues. Default behavior shows all issues with a pin indicator.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-18T23:33:29.518028-08:00","updated_at":"2025-12-21T11:30:01.484978-08:00","closed_at":"2025-12-21T11:30:01.484978-08:00","dependencies":[{"issue_id":"bd-zc3","depends_on_id":"bd-0vg","type":"blocks","created_at":"2025-12-18T23:33:56.256764-08:00","created_by":"daemon"},{"issue_id":"bd-zc3","depends_on_id":"bd-7h5","type":"blocks","created_at":"2025-12-18T23:34:07.486361-08:00","created_by":"daemon"}]} -{"id":"bd-zdoku","title":"test","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T19:26:58.520985-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-10T19:27:06.618056-08:00","closed_at":"2026-01-10T19:27:06.618056-08:00","close_reason":"Closed"} +{"id":"bd-zdoku","title":"test","status":"closed","priority":2,"issue_type":"task","owner":"steve.yegge@gmail.com","created_at":"2026-01-10T19:26:58.520985-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-10T19:27:06.618056-08:00","closed_at":"2026-01-10T19:27:06.618056-08:00","close_reason":"Closed"} {"id":"bd-zf5w","title":"bd mail uses git user.name for sender instead of BEADS_AGENT_NAME","description":"When sending mail via `bd mail send`, the sender field in the stored issue uses git config user.name instead of the BEADS_AGENT_NAME environment variable.\n\nReproduction:\n1. Set BEADS_AGENT_NAME=gastown-alpha\n2. Run: bd mail send mayor/ -s 'Test' -m 'Body'\n3. Check the issue.jsonl: sender is 'Steve Yegge' (git user.name) not 'gastown-alpha'\n\nExpected: The sender field should use BEADS_AGENT_NAME when set.\n\nThis breaks the mail system for multi-agent workflows where agents need to identify themselves by their role (polecat, refinery, etc.) rather than the human user's git identity.\n\nRelated: gt mail routing integration with Gas Town","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-20T21:46:33.646746-08:00","updated_at":"2025-12-20T21:59:25.771325-08:00","closed_at":"2025-12-20T21:59:25.771325-08:00"} {"id":"bd-zgb9","title":"gt polecat done should auto-stop running session","description":"Currently 'gt polecat done' fails if session is running, requiring a separate 'gt session stop' first. This is unnecessary friction - done should just stop the session automatically since that's always what you want.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-23T04:11:23.899653-08:00","updated_at":"2025-12-23T04:12:13.029479-08:00","closed_at":"2025-12-23T04:12:13.029479-08:00"} +{"id":"bd-zh83v","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T15:54:11.925087-08:00","created_by":"beads/refinery","updated_at":"2026-01-10T15:54:11.959293-08:00","closed_at":"2026-01-10T15:54:11.959293-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} +{"id":"bd-zheqz","title":"Session ended: gt-beads-crew-fang","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T13:53:20.620943-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-09T13:53:20.657121-08:00","closed_at":"2026-01-09T13:53:20.657121-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-zhs3b","title":"Session ended: gt-beads-crew-giles","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-08T21:11:39.539597-08:00","created_by":"beads/crew/giles","updated_at":"2026-01-08T21:11:39.578548-08:00","closed_at":"2026-01-08T21:11:39.578548-08:00","close_reason":"auto-closed session event"} {"id":"bd-zi1v","title":"Test Agent Mail server failure scenarios","description":"Verify graceful degradation across various failure modes.\n\nTest Cases:\n- Server never started\n- Server crashes during operation\n- Network partition (timeout)\n- Server returns 500 error\n- Invalid bearer token\n- SQLite corruption\n\nAcceptance Criteria:\n- Agents continue working in all scenarios\n- Clear log messages about degradation\n- No crashes or data loss\n- Beads JSONL remains consistent\n\nFile: tests/integration/test_mail_failures.py","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-07T22:43:21.41983-08:00","updated_at":"2025-11-08T01:49:13.742653-08:00","closed_at":"2025-11-08T01:49:13.742653-08:00","dependencies":[{"issue_id":"bd-zi1v","depends_on_id":"bd-fzbg","type":"blocks","created_at":"2025-11-07T22:43:21.420725-08:00","created_by":"daemon"}]} {"id":"bd-ziy5","title":"GH#409: bd init uses issues.jsonl but docs say beads.jsonl","description":"bd init creates config referencing issues.jsonl but README/docs reference beads.jsonl as canonical. Standardize naming. See GitHub issue #409.","status":"tombstone","priority":2,"issue_type":"bug","created_at":"2025-12-16T01:03:58.109954-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} @@ -2007,3 +2150,4 @@ {"id":"bd-zwpw","title":"Test dependency child","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-05T11:23:05.998311-08:00","updated_at":"2025-11-05T11:23:30.389454-08:00","closed_at":"2025-11-05T11:23:30.389454-08:00","dependencies":[{"issue_id":"bd-zwpw","depends_on_id":"bd-k0j9","type":"blocks","created_at":"2025-11-05T11:23:05.998981-08:00","created_by":"daemon"}]} {"id":"bd-zwtq","title":"Run bd doctor at end of bd init to verify setup","description":"Run bd doctor diagnostics at end of bd init (after line 398 in init.go). If issues found, warn user immediately: '⚠ Setup incomplete. Run bd doctor --fix to complete setup.' Catches configuration problems before user encounters them in normal workflow.","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-11-21T23:16:09.596778-08:00","updated_at":"2025-12-23T04:20:51.887338-08:00","closed_at":"2025-12-23T04:20:51.887338-08:00","dependencies":[{"issue_id":"bd-zwtq","depends_on_id":"bd-tbz3","type":"parent-child","created_at":"2025-11-21T23:16:09.597617-08:00","created_by":"daemon"}]} {"id":"bd-zy3z","title":"Support wisps in nodb mode for lightweight Gas Town rigs","description":"Enable proper wisp support in --no-db mode to allow lightweight Gas Town rigs (including HQ/Mayor) to run without SQLite overhead.\n\n## Motivation\nGas Town HQ and simple rigs could benefit from nodb mode's simplicity. Currently wisps don't work properly in nodb mode.\n\n## Proposed Design\n\n### Phase 1: Session-scoped wisps\n- Memory storage already has Wisp field on Issue\n- Wisps exist only for the session lifetime\n- Acceptable for patrol cycles that complete within a session\n- Depends on: bd-9avq (fix the leak)\n\n### Phase 2: Optional wisp persistence\n- Add `.beads/wisps.jsonl` for wisp storage (gitignored)\n- Load wisps from this file on nodb startup\n- Save wisps to this file on nodb exit\n- Wisps persist across restarts but don't sync via git\n\n### Phase 3: Verify mol commands\n- Test mol squash, burn, bond work with memory storage\n- These currently check for SQLite storage type\n- May need interface-based approach instead of type assertions\n\n## Files affected\n- cmd/bd/nodb.go - wisp filtering and optional persistence\n- internal/storage/memory/ - verify wisp field handling\n- cmd/bd/mol_*.go - verify memory storage compatibility\n- .beads/.gitignore - add wisps.jsonl","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-12-24T21:15:59.658799-08:00","updated_at":"2025-12-24T21:17:11.570958-08:00","closed_at":"2025-12-24T21:17:11.570958-08:00","dependencies":[{"issue_id":"bd-zy3z","depends_on_id":"bd-9avq","type":"blocks","created_at":"2025-12-24T21:16:04.649866-08:00","created_by":"daemon"}]} +{"id":"bd-zykm0","title":"Session ended: gt-beads-crew-fang","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T18:37:54.930136-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-09T18:37:54.968386-08:00","closed_at":"2026-01-09T18:37:54.968386-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true}