From 9eab271010508acfe7f3e63edbfedc3e1204559f Mon Sep 17 00:00:00 2001 From: Steve Yegge Date: Fri, 7 Nov 2025 19:05:05 -0800 Subject: [PATCH] bd sync: 2025-11-07 19:05:05 --- .beads/beads.jsonl | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/.beads/beads.jsonl b/.beads/beads.jsonl index 818f4703..b94cf6e0 100644 --- a/.beads/beads.jsonl +++ b/.beads/beads.jsonl @@ -175,7 +175,6 @@ {"id":"bd-ad5e","content_hash":"67fdba1ba5b838384b16b82ff45e200cb5fd4960795bb5ae29d6fdec549170ca","title":"Add AI planning docs management guidance to bd onboard (GH-196)","description":"Enhanced bd onboard command to provide guidance for managing AI-generated planning documents (Claude slop).\n\nAddresses GitHub issue #196: https://github.com/steveyegge/beads/issues/196\n\nChanges:\n- Added Managing AI-Generated Planning Documents section to bd onboard\n- Recommends using history/ directory for ephemeral planning files\n- Updated AGENTS.md to demonstrate the pattern\n- Added comprehensive tests\n\nCommit: d46177d","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-11-02T17:11:33.183636-08:00","updated_at":"2025-11-02T17:12:05.599633-08:00","closed_at":"2025-11-02T17:12:05.599633-08:00","source_repo":"."} {"id":"bd-aec5439f","content_hash":"1b42289a0cb1da0626a69c6f004bf62fc9ba6e3a0f8eb70159c5f1446497020b","title":"Update LINTING.md with current baseline","description":"After cleanup, document the remaining acceptable baseline in LINTING.md so we can track regression.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-27T18:53:10.38679-07:00","updated_at":"2025-11-06T19:42:32.975901-08:00","closed_at":"2025-11-06T19:41:08.661851-08:00","source_repo":"."} {"id":"bd-aewm","content_hash":"89c5780ca4de35064e57e41185cf8b721306ec1891b7b4196ef103027554fff5","title":"bd-hv01: Missing cleanup of .merged temp file on failure","description":"Problem: deletion_tracking.go:49 creates tmpMerged file but does not clean up on failure, causing disk space leak and potential interference with subsequent syncs.\n\nFix: Add defer os.Remove(tmpMerged) after creating temp file path.\n\nFiles: cmd/bd/deletion_tracking.go:38-89","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-06T18:16:24.326719-08:00","updated_at":"2025-11-06T18:46:55.924379-08:00","closed_at":"2025-11-06T18:46:55.924379-08:00","source_repo":".","dependencies":[{"issue_id":"bd-aewm","depends_on_id":"bd-rbxi","type":"parent-child","created_at":"2025-11-06T18:19:15.061462-08:00","created_by":"daemon"}]} -{"id":"bd-akzw","content_hash":"0273ac8ff18573f04346daeafa659063a91220c798c7363b0a00685b5a1bcc55","title":"Test issue 1","description":"","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-07T19:00:15.189546-08:00","updated_at":"2025-11-07T19:00:15.189546-08:00","source_repo":"."} {"id":"bd-aysr","content_hash":"f8ff127568f471cc42391b1287cce69b376fb1b49bbef20a24d3394f57fba066","title":"Test numeric 1","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-05T12:58:41.498034-08:00","updated_at":"2025-11-05T12:58:44.73082-08:00","closed_at":"2025-11-05T12:58:44.73082-08:00","source_repo":"."} {"id":"bd-azqv","content_hash":"a9d63140e09a3aba769436c54c204e9369912a7d8d51d2aae9e68c8148357d3b","title":"Ready issue","description":"","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-07T19:04:22.247039-08:00","updated_at":"2025-11-07T19:04:22.247039-08:00","source_repo":"."} {"id":"bd-b121","content_hash":"5d71e793a6de110be977bf87cfd25c3b461f452a1e8e44633452de1f8343a098","title":"Fix :memory: database connection pool issue causing \"no such table\" errors","description":"Critical bug in v0.21.6 where :memory: databases with cache=shared create multiple connections in the pool, causing intermittent \"no such table\" errors. SQLite's shared cache for in-memory databases only works reliably with a single connection.\n\nRoot cause: Missing db.SetMaxOpenConns(1) after sql.Open() for :memory: databases.\n\nImpact: 37 test failures in VC project, affects all consumers using :memory: for testing.","acceptance_criteria":"- Add db.SetMaxOpenConns(1) for :memory: databases only\n- Verify VC test suite passes (37 previously failing tests)\n- Add a test in Beads that reproduces the issue\n- Document the pool limitation in code comments\n- Release as Beads v0.21.7","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-04T00:52:56.318619-08:00","updated_at":"2025-11-05T11:23:34.289297-08:00","closed_at":"2025-11-05T00:50:00.558124-08:00","source_repo":"."} @@ -220,7 +219,7 @@ {"id":"bd-d3e5","content_hash":"2eaf57cb617922924aadb6b04366a3ef058d386752c65e8471f2704b512ea30a","title":"Test issue 2","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-02T09:44:17.116768539Z","updated_at":"2025-11-02T09:45:20.780838695Z","closed_at":"2025-11-02T09:45:20.780838695Z","source_repo":"."} {"id":"bd-d3f0","content_hash":"d759327f1a1e4817d3e8ec212fd6af2607d0bb5e654201a6fc3640ad0a3b18fd","title":"Add 'bd comment' as alias for 'bd comments add'","description":"The command 'bd comments add' is verbose and unintuitive. Add 'bd comment' as a shorter alias that works the same way.\n\n## Rationale\n- More natural: 'bd comment \u003cissue-id\u003e \u003ctext\u003e' reads better than 'bd comments add \u003cissue-id\u003e \u003ctext\u003e'\n- Matches user expectations: users naturally try 'bd comment' first\n- Follows convention: other commands like 'bd create', 'bd show', 'bd close' are verbs\n\n## Implementation\nCould be implemented as:\n1. A new command that wraps bd comments add\n2. An alias registered in cobra\n3. Keep 'bd comments add' for backwards compatibility\n\n## Examples\n```bash\nbd comment bd-1234 'This is a comment'\nbd comment bd-1234 'Multi-line comment' --body 'Additional details here'\n```","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-02T17:13:18.82563-08:00","updated_at":"2025-11-03T22:20:30.223939-08:00","closed_at":"2025-11-03T22:20:30.223939-08:00","source_repo":"."} {"id":"bd-d4ec5a82","content_hash":"e0f9aa493571fdb0b5fd578993165042ad224bb2c00186564337732e6221d529","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-11-06T19:37:39.601957-08:00","closed_at":"2025-11-06T19:27:19.170894-08:00","source_repo":"."} -{"id":"bd-d4rn","content_hash":"942bdfde12b32d268a7643fb64e4f92fa466cb6564434283a38378f1ce44973e","title":"Issue 1","description":"","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-07T19:00:23.8969-08:00","updated_at":"2025-11-07T19:00:23.8969-08:00","source_repo":".","dependencies":[{"issue_id":"bd-d4rn","depends_on_id":"bd-rm2s","type":"related","created_at":"2025-11-07T19:00:23.953823-08:00","created_by":"daemon"}]} +{"id":"bd-d4rn","content_hash":"942bdfde12b32d268a7643fb64e4f92fa466cb6564434283a38378f1ce44973e","title":"Issue 1","description":"","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-07T19:00:23.8969-08:00","updated_at":"2025-11-07T19:00:23.8969-08:00","source_repo":"."} {"id":"bd-d68f","content_hash":"1c806ae9c39bb28faaa8730350ce6b20bc25821e33583f537db1567b183bce6d","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","source_repo":"."} {"id":"bd-d76d","content_hash":"b65da5fe9f89a98f1e6fad6ee32d463126ef72785fec4d6dfa5a4774c6a8a393","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-04T17:10:48.9102-08:00","closed_at":"2025-11-04T17:10:48.9102-08:00","source_repo":"."} {"id":"bd-d7e88238","content_hash":"b69ec861618b03129fad7807b085ee6365860cfd2e9901b49eb846e192b95a0d","title":"Rapid 3","description":"","status":"open","priority":3,"issue_type":"task","created_at":"2025-10-29T19:11:57.459655-07:00","updated_at":"2025-10-30T17:12:58.189494-07:00","source_repo":"."} @@ -236,7 +235,6 @@ {"id":"bd-e2e6","content_hash":"2f1cf4362e6a12a0e599efd7f13267a7a81a499f56e89a5e0bfe5efc67f213c0","title":"Implement postinstall script for binary download","description":"Create npm/scripts/postinstall.js that downloads platform-specific binaries:\n\n## Platform detection\n- Detect os.platform() and os.arch()\n- Map to GitHub release asset names:\n - linux-amd64 → bd-linux-amd64\n - linux-arm64 → bd-linux-arm64\n - darwin-amd64 → bd-darwin-amd64\n - darwin-arm64 → bd-darwin-arm64\n - win32-x64 → bd-windows-amd64.exe\n\n## Download logic\n- Fetch from GitHub releases: https://github.com/steveyegge/beads/releases/latest/download/${asset}\n- Save to npm/bin/bd (or bd.exe on Windows)\n- Set executable permissions (chmod +x)\n- Handle errors gracefully with helpful messages\n\n## Error handling\n- Check for unsupported platforms\n- Retry on network failures\n- Provide manual download instructions if automated fails\n- Skip download if binary already exists (for local development)","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-02T23:39:56.652829-08:00","updated_at":"2025-11-03T10:31:45.382215-08:00","closed_at":"2025-11-03T10:31:45.382215-08:00","source_repo":".","dependencies":[{"issue_id":"bd-e2e6","depends_on_id":"bd-febc","type":"parent-child","created_at":"2025-11-02T23:40:32.94671-08:00","created_by":"daemon"}]} {"id":"bd-e98221b3","content_hash":"4a4f6912d8de8bf0f9ae867be1a25d83c5a6991383e3aa192537747500bebc6a","title":"Update AGENTS.md and README.md with \"bd daemons\" documentation","description":"Document the new \"bd daemons\" command and all subcommands in AGENTS.md and README.md. Include examples and troubleshooting guidance.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-26T19:41:11.099254-07:00","updated_at":"2025-11-06T20:16:47.976948-08:00","closed_at":"2025-11-06T19:51:57.75321-08:00","source_repo":"."} {"id":"bd-eb3c","content_hash":"6c7a46d58e565a27e3a7a5375bb1ad8345094bdef422dce52239ee4b7e559143","title":"UX nightmare: multiple ways daemon can fail with misleading messages","description":"","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","source_repo":"."} -{"id":"bd-eq95","content_hash":"9b3ca05bf503906514baace406ea211b309e8870a716711cc6db9609ecba01e2","title":"Assigned issue","description":"","status":"open","priority":1,"issue_type":"task","assignee":"testuser","created_at":"2025-11-07T19:00:21.923587-08:00","updated_at":"2025-11-07T19:00:21.923587-08:00","source_repo":"."} {"id":"bd-eqjc","content_hash":"ce62bef71029a692680c7428ae7b11d31bb8cc11c85c30d18e2d43e7d3f1072f","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","source_repo":"."} {"id":"bd-expt","content_hash":"12ebbb5a4daebe076c6bcbc613e2da3f2c9e70826d892f2475e7236c97dc3377","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":"in_progress","priority":0,"issue_type":"task","created_at":"2025-11-07T16:42:12.688526-08:00","updated_at":"2025-11-07T16:47:49.108295-08:00","source_repo":".","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-f282","content_hash":"90043e5e39cbb062ce0ff6a323ce2d0a16465783742d06ac9da1df66d837e025","title":"Test npm package installation locally","description":"Verify npm package works before publishing:\n\n## Local testing\n- Run npm pack in npm/ directory\n- Install tarball globally: npm install -g beads-bd-0.21.5.tgz\n- Test basic commands:\n - bd --version\n - bd init --quiet --prefix test\n - bd create \"Test issue\" -p 1 --json\n - bd list --json\n - bd sync\n\n## Test environments\n- macOS (darwin-arm64 and darwin-amd64)\n- Linux (ubuntu docker container for linux-amd64)\n- Windows (optional, if available)\n\n## Validation\n- Binary downloads during postinstall\n- All bd commands work identically to native\n- No permission issues\n- Proper error messages on failure","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-02T23:40:05.71835-08:00","updated_at":"2025-11-03T10:31:45.382577-08:00","closed_at":"2025-11-03T10:31:45.382577-08:00","source_repo":".","dependencies":[{"issue_id":"bd-f282","depends_on_id":"bd-febc","type":"parent-child","created_at":"2025-11-02T23:40:32.968748-08:00","created_by":"daemon"}]} @@ -260,7 +258,6 @@ {"id":"bd-gpe7","content_hash":"abafcc321674aa66d99dc353641fe183e510f4b89624adcaf8ffe0cea5ffb1ef","title":"Tests take too long - unacceptable for project size","description":"## Problem\n\nRunning `go test ./internal/importer/... -v` takes an unacceptably long time (minutes). For a project this size, tests should complete in seconds.\n\n## Impact\n\n- Slows down development iteration\n- AI agents waste time waiting for tests\n- Blocks rapid bug fixes and validation\n- Poor developer experience\n\n## Investigation Needed\n\n- Profile which tests are slow\n- Check for unnecessary sleeps, timeouts, or integration tests\n- Look for tests that could be parallelized\n- Consider splitting unit vs integration tests\n\n## Goal\n\nTest suite for a single package should complete in \u003c5 seconds, ideally \u003c2 seconds.","notes":"## Optimizations Applied\n\n1. **Added t.Parallel() to CLI tests** (13 tests) - allows concurrent execution\n2. **Removed unnecessary 200ms sleep** in daemon_autoimport_test.go - Execute() forces auto-import synchronously\n3. **Reduced filesystem settle wait** from 100ms → 50ms on non-Windows platforms\n4. **Optimized debouncer test sleeps** (9 reductions):\n - Before debounce waits: 30ms → 20ms, 20ms → 10ms\n - After debounce waits: 40ms → 35ms, 30ms → 35ms, etc.\n - Thread safety test: 100ms → 70ms\n - Sequential cycles: 50ms → 40ms (3x)\n - Cancel tests: 70-80ms → 60ms\n\n## Results\n\n### cmd/bd package (main improvement target):\n- **Before**: 5+ minutes (timeout)\n- **After**: ~18-20 seconds\n- **Speedup**: ~15-18x faster\n\n### internal/importer package:\n- **After**: \u003c1 second (0.9s)\n\n### Full test suite (with `-short` flag):\n- Most packages complete in \u003c2s\n- Total runtime constrained by sequential integration tests\n\n## Known Issues\n\n- TestConcurrentExternalRefImports hangs due to :memory: connection pool issue (bd-b121)\n- Some sync_branch tests may need sequential execution (git worktree conflicts)","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-05T00:54:47.784504-08:00","updated_at":"2025-11-05T10:55:27.261404-08:00","closed_at":"2025-11-05T01:41:57.544395-08:00","source_repo":"."} {"id":"bd-h4hc","content_hash":"43c11155d74ce32355129c3aac019c07279a4d31c0d58334e9fd5cb100108373","title":"Test child issue","description":"","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","source_repo":"."} {"id":"bd-h8um","content_hash":"942bdfde12b32d268a7643fb64e4f92fa466cb6564434283a38378f1ce44973e","title":"Issue 1","description":"","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-07T19:04:21.529003-08:00","updated_at":"2025-11-07T19:04:21.529003-08:00","source_repo":".","dependencies":[{"issue_id":"bd-h8um","depends_on_id":"bd-76cu","type":"blocks","created_at":"2025-11-07T19:04:21.586928-08:00","created_by":"daemon"}]} -{"id":"bd-hpht","content_hash":"74aa57ab28e70fb995a1e154379a17a211bc10ffae8e5901213661b154941981","title":"BG's issue to reopen","description":"","status":"open","priority":1,"issue_type":"bug","created_at":"2025-11-07T19:00:17.192952-08:00","updated_at":"2025-11-07T19:00:17.237756-08:00","source_repo":"."} {"id":"bd-hv01","content_hash":"cfa89d4d4e1c183c1d602c61fe46d5fc1222db5362ac2d332735a36ee152d38a","title":"Deletions not propagated across multi-workspace sync","description":"## Problem\n\nWhen working with multiple beads workspaces (clones) sharing the same git remote, deleted issues keep coming back.\n\n## Reproduction\n\n1. Clone A deletes issue `bd-xyz` via `bd delete bd-xyz --force`\n2. Clone A daemon syncs and pushes to GitHub\n3. Clone B still has `bd-xyz` in its database\n4. Clone B daemon exports and pushes its JSONL\n5. Clone A pulls and imports → `bd-xyz` comes back!\n\n## Root Cause\n\n**No deletion tracking mechanism.** The system has no way to distinguish between:\n- \"Issue doesn't exist in JSONL because it was deleted\" \n- \"Issue doesn't exist in JSONL because the export is stale\"\n\nImport treats missing issues as \"not in this export\" rather than \"explicitly deleted.\"\n\n## Solution Options\n\n1. **Tombstone records** - Keep deleted issues in JSONL with `\"status\":\"deleted\"` or `\"deleted_at\"` field\n2. **Deletion log** - Separate `.beads/deletions.jsonl` file tracking all deleted IDs\n3. **Three-way merge** - Import compares: DB state, old JSONL, new JSONL\n4. **Manual conflict resolution** - Detect resurrection and prompt user\n\n## Related\n\n- Similar to resurrection logic for orphaned children (bd-cc4f)\n- beads-merge tool handles this better with 3-way merge","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-05T18:34:24.094474-08:00","updated_at":"2025-11-06T17:52:24.860716-08:00","closed_at":"2025-11-06T17:52:24.860716-08:00","source_repo":".","dependencies":[{"issue_id":"bd-hv01","depends_on_id":"bd-qqvw","type":"blocks","created_at":"2025-11-05T18:42:35.485002-08:00","created_by":"daemon"}]} {"id":"bd-hw3c","content_hash":"83359ec96e2b8fc9ce2ece25d56bfbc1c1f948b27dfa56cc7b3715dc86c6d024","title":"Fix GH #227: bd edit broken pipe errors","description":"bd edit command gets \"broken pipe\" errors when using daemon mode because editing can take minutes and the daemon connection times out.\n\nSolution: Force bd edit to always use direct mode (--no-daemon) since it's human-only and interactive.\n\nFixed by checking cmd.Name() == \"edit\" in main.go PersistentPreRun and setting noDaemon = true.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-05T14:36:04.289431-08:00","updated_at":"2025-11-05T14:36:08.103964-08:00","closed_at":"2025-11-05T14:36:08.103964-08:00","source_repo":"."} {"id":"bd-i7ir","content_hash":"23f97088bca298f24d56312ee9aa5a14c4dd061a05eedae7e3f4d251786be4e1","title":"Blocked issue","description":"","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-07T19:04:22.310313-08:00","updated_at":"2025-11-07T19:04:22.310313-08:00","source_repo":"."} @@ -269,10 +266,7 @@ {"id":"bd-irq6","content_hash":"67746afe139a143851078f4240fa40379c7b7d8559c906bca56acb2cdab537cc","title":"Remove unused global daemon infrastructure (internal/daemonrunner/)","description":"The internal/daemonrunner/ package (1,468 LOC) contains the old global daemon implementation that is no longer used. We now use per-workspace daemons.\n\nDeadcode analysis shows all these functions are unreachable:\n- Daemon.Start, runGlobalDaemon, setupLock\n- validateSingleDatabase, validateSchemaVersion\n- registerDaemon, unregisterDaemon\n- validateDatabaseFingerprint\n- Full git client implementation (NewGitClient, HasUpstream, HasChanges, Commit, Push, Pull)\n- Helper functions: isGitRepo, gitHasUpstream, gitHasChanges, gitCommit\n\nThe entire package appears unused since switching to per-workspace daemon architecture.\n\nFiles to remove:\n- daemon.go (9,436 bytes)\n- git.go (3,510 bytes) \n- sync.go (6,401 bytes)\n- fingerprint.go (2,076 bytes)\n- process.go (3,332 bytes)\n- rpc.go (994 bytes)\n- config.go (486 bytes)\n- logger.go (1,579 bytes)\n- flock_*.go (platform-specific file locking)\n- signals_*.go (platform-specific signal handling)\n- All test files\n\nTotal cleanup: ~1,500 LOC","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-06T19:30:50.936943-08:00","updated_at":"2025-11-06T19:35:10.646498-08:00","closed_at":"2025-11-06T19:35:10.646498-08:00","source_repo":"."} {"id":"bd-iua5","content_hash":"34be64d334d86b421cb60e743f9d259a1e14f6d5fdc435a7094dc39dd8e4bb0f","title":"Test integration issue","description":"This is a real integration test","status":"open","priority":1,"issue_type":"bug","created_at":"2025-11-07T19:04:16.738615-08:00","updated_at":"2025-11-07T19:04:16.738615-08:00","source_repo":"."} {"id":"bd-iye7","content_hash":"5b39d4322d23d2a38968d81f5100cb438de4cc935f1d6d6be73e8db4be57f1bd","title":"Add path normalization to getMultiRepoJSONLPaths()","description":"From bd-xo6b code review: getMultiRepoJSONLPaths() does not handle non-standard paths correctly.\n\nProblems:\n- No tilde expansion: ~/repos/foo treated as literal path\n- No absolute path conversion: ../other-repo breaks if working directory changes\n- No duplicate detection: If Primary=. and Additional=[.], same JSONL processed twice\n- No empty string handling: Empty paths create invalid /.beads/issues.jsonl\n\nImpact:\nConfig with tilde or relative paths will fail\n\nFix needed:\n1. Use filepath.Abs() for all paths\n2. Add tilde expansion via os.UserHomeDir()\n3. Deduplicate paths (use map to track seen paths)\n4. Filter out empty strings\n5. Validate paths exist and are readable\n\nFiles:\n- cmd/bd/deletion_tracking.go:333-358 (getMultiRepoJSONLPaths function)","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-06T19:31:51.882743-08:00","updated_at":"2025-11-06T19:35:41.246311-08:00","closed_at":"2025-11-06T19:35:41.246311-08:00","source_repo":".","dependencies":[{"issue_id":"bd-iye7","depends_on_id":"bd-xo6b","type":"discovered-from","created_at":"2025-11-06T19:32:12.267906-08:00","created_by":"daemon"}]} -{"id":"bd-iyfo","content_hash":"8aebd77c19946d60143f7b7f699d1bcf6e8792c347f6d7c41a2ffbba744bfa8e","title":"Issue 2 to reopen","description":"","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-07T19:00:17.894211-08:00","updated_at":"2025-11-07T19:00:17.961764-08:00","source_repo":"."} -{"id":"bd-j50k","content_hash":"23f97088bca298f24d56312ee9aa5a14c4dd061a05eedae7e3f4d251786be4e1","title":"Blocked issue","description":"","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-07T19:00:20.03713-08:00","updated_at":"2025-11-07T19:00:20.03713-08:00","source_repo":"."} {"id":"bd-j7e2","content_hash":"e5cee574c055f80bb884f99f6a5a918f5e7dafa84392f4d4ea6b4b67c406e415","title":"RPC diagnostics: BD_RPC_DEBUG timing logs","description":"Add lightweight diagnostic logging for RPC connection attempts:\n- BD_RPC_DEBUG=1 prints to stderr:\n - Socket path being dialed\n - Socket exists check result \n - Dial start/stop time\n - Connection outcome\n- Improve bd daemon --status messaging when lock not held\n\nThis helps field triage of connection issues without verbose daemon logs.","status":"open","priority":3,"issue_type":"task","created_at":"2025-11-07T16:42:12.772364-08:00","updated_at":"2025-11-07T16:42:12.772364-08:00","source_repo":".","dependencies":[{"issue_id":"bd-j7e2","depends_on_id":"bd-ndyz","type":"discovered-from","created_at":"2025-11-07T16:42:12.773714-08:00","created_by":"daemon"}]} -{"id":"bd-jdpa","content_hash":"16f978c58b9988457aeb1eaff37fb17f12e91325549b38be10362a08923e9a2d","title":"Test issue 2","description":"","status":"open","priority":2,"issue_type":"task","created_at":"2025-11-07T19:00:15.220957-08:00","updated_at":"2025-11-07T19:00:15.220957-08:00","source_repo":"."} {"id":"bd-jx90","content_hash":"5e08ff79669eaf606022b1ab13a167c0689e9d9a1b2f3bb4fb880ca792546411","title":"Add simple cleanup command to delete closed issues","description":"Users want a simple command to delete all closed issues without requiring Anthropic API key (unlike compact). Requested in GH #243.","status":"open","priority":2,"issue_type":"feature","created_at":"2025-11-07T00:26:30.372137-08:00","updated_at":"2025-11-07T00:26:30.372137-08:00","source_repo":"."} {"id":"bd-k0j9","content_hash":"52d1e6f87bd7655018bd89dbbbaf8da66bdcba45de6138fd237810365a04606a","title":"Test dependency parent","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-05T11:23:02.505901-08:00","updated_at":"2025-11-05T11:23:20.91305-08:00","closed_at":"2025-11-05T11:23:20.91305-08:00","source_repo":"."} {"id":"bd-k58","content_hash":"cc90fb20e7bd178b52133d4d0f8781dce2debb46519674ae6356291d597fc13d","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.","design":"Commands:\n- bd propose \u003cid\u003e [--target \u003crepo\u003e] - Move issue to target repo\n- bd withdraw \u003cid\u003e - Un-propose (move back)\n- bd accept \u003cid\u003e - Maintainer accepts proposal\n\nVisibility states:\n- local: Personal planning only\n- proposed: Staged for upstream PR\n- canonical: Accepted by upstream (default for existing)\n\nOptional visibility field (backward compatible, defaults to canonical)","acceptance_criteria":"1. bd propose moves issue from planning to primary repo\n2. bd withdraw reverses proposal\n3. bd accept (maintainer) finalizes acceptance\n4. Visibility field tracks state (local/proposed/canonical)\n5. Backward compatible - existing issues default to canonical\n6. State transitions are atomic and git-tracked","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-04T11:21:41.113647-08:00","updated_at":"2025-11-05T00:08:38.19821-08:00","closed_at":"2025-11-05T00:08:38.198213-08:00","source_repo":".","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"}]} @@ -284,13 +278,11 @@ {"id":"bd-l5gq","content_hash":"9c6f895c8e0066874073474fded02d3b1b10a008c3448f1e650e2ff39b5e8e02","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-04T12:27:51.43013-08:00","closed_at":"2025-11-04T12:27:51.430134-08:00","source_repo":"."} {"id":"bd-lwnt","content_hash":"ddfa247870eb3734ffa7a4d0da6fcd4a359d2b48e02d70aad8560ec4bc13afdc","title":"Test P1 priority","description":"","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","source_repo":"."} {"id":"bd-m5r5","content_hash":"d8808071441c4faaa429c2100b421348df1750118ac618c6d68437064eb060c5","title":"Blocking issue","description":"","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-07T19:04:22.279412-08:00","updated_at":"2025-11-07T19:04:22.279412-08:00","source_repo":"."} -{"id":"bd-mi6j","content_hash":"a9d63140e09a3aba769436c54c204e9369912a7d8d51d2aae9e68c8148357d3b","title":"Ready issue","description":"","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-07T19:00:19.971882-08:00","updated_at":"2025-11-07T19:00:19.971882-08:00","source_repo":"."} {"id":"bd-mlcz","content_hash":"35434fed7e20e8b67f7b598c46ce5dc65c111de237ea38b36a88a671b023b58b","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","source_repo":".","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","content_hash":"89752e08d5a278ed301c655753e07bc2b564e710ce6d9e7e535bbd9ec48af182","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","source_repo":".","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-my64","content_hash":"8f4eb8056f81096e7090813f319b3aa996ada6dc5809d81305271d0584c2f364","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","source_repo":"."} {"id":"bd-ndyz","content_hash":"f3bee1df504d7d508b424b9a01cde89ad8aeedcd036ed1b66d71c4962c4a80cf","title":"GH#243: Recurring stale daemon.lock causes 5s delays","description":"User reports daemon.lock keeps becoming stale after running Claude with beads.\n\nSymptom:\n- bd ready takes 5 seconds (exact)\n- daemon.lock exists but socket is missing\n- bd daemons killall temporarily fixes it\n- Problem recurs after using beads with AI agents\n\nUser on v0.22.0, Macbook M2, 132 issues (89 closed)\n\nHypothesis: Daemon is crashing or exiting uncleanly during agent sessions, leaving stale lock file.\n\nNeed to:\n1. Add crash logging to daemon to understand why it's exiting\n2. Improve cleanup on daemon exit (ensure lock is always removed)\n3. Add automatic stale lock detection/cleanup\n4. Consider making daemon more resilient to crashes","design":"Root cause: 5s delay from slow RPC connect attempts when socket missing but clients retry with long timeouts. Lock file mechanism is fine (OS releases on crash), but missing socket + stale pid cause unnecessary connection attempts.\n\nKey insight: The lock itself isn't stale (OS-managed), but socket cleanup on crash is incomplete, leading clients to wait through full dial timeout.","notes":"Oracle analysis complete. Converting to epic with 5 focused sub-issues:\n1. RPC fast-fail with socket stat + short timeouts (P0)\n2. Standardize daemon detection with lock probe (P1) \n3. Crash recovery improvements (P2)\n4. Self-heal stale artifacts (P2)\n5. Diagnostics and debugging (P3)","status":"in_progress","priority":0,"issue_type":"bug","created_at":"2025-11-07T16:32:23.576171-08:00","updated_at":"2025-11-07T16:41:51.955399-08:00","source_repo":"."} {"id":"bd-ng56","content_hash":"adb5cea12f59ff7a9934ddd6f4e1cf09632e162bd4baad9f83ffea96f43d3e88","title":"bd-hv01: Three full JSONL reads on every sync (performance)","description":"Problem: computeAcceptedDeletions reads three JSONL files completely into memory (base, left, merged). For 1000 issues at 1KB each, this is 3MB read and 3000 JSON parse operations.\n\nImpact: Acceptable now (~20-35ms overhead) but will be slow for large repos (10k+ issues).\n\nPossible optimizations: single-pass streaming, memory-mapped files, binary format, incremental snapshots.\n\nFiles: cmd/bd/deletion_tracking.go:101-208","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-06T18:16:25.653076-08:00","updated_at":"2025-11-06T19:41:04.67733-08:00","closed_at":"2025-11-06T19:41:04.67733-08:00","source_repo":".","dependencies":[{"issue_id":"bd-ng56","depends_on_id":"bd-rbxi","type":"parent-child","created_at":"2025-11-06T18:19:15.148149-08:00","created_by":"daemon"}]} -{"id":"bd-nhtv","content_hash":"65e5dcb12407f83aad0c37c06127fcf76cf00bf581adab726b221da75c6c7f74","title":"Issue 1 to reopen","description":"","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-07T19:00:17.86302-08:00","updated_at":"2025-11-07T19:00:17.961035-08:00","source_repo":"."} {"id":"bd-nqes","content_hash":"d7ca10b54b92c464a0c4c1c932f2918a6e0e952a5fd7337acb9160cd524dc59a","title":"bd-hv01: Non-atomic snapshot operations can cause data loss","description":"## Problem\nIn sync.go:146-155 and daemon_sync.go:502-505, snapshot capture failures are logged as warnings but sync continues:\n\n```go\nif err := exportToJSONL(ctx, jsonlPath); err != nil { ... }\nif err := captureLeftSnapshot(jsonlPath); err != nil {\n fmt.Fprintf(os.Stderr, \"Warning: failed to capture snapshot...\")\n}\n```\n\nIf export succeeds but snapshot capture fails, the merge uses stale snapshot data, potentially deleting wrong issues.\n\n## Impact\n- Critical data integrity issue\n- Could delete issues incorrectly during multi-workspace sync\n\n## Fix\nMake snapshot capture mandatory:\n```go\nif err := captureLeftSnapshot(jsonlPath); err != nil {\n return fmt.Errorf(\"failed to capture snapshot (required for deletion tracking): %w\", err)\n}\n```\n\n## Files Affected\n- cmd/bd/sync.go:146-155\n- cmd/bd/daemon_sync.go:502-505","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-06T18:15:33.574158-08:00","updated_at":"2025-11-06T18:46:55.874814-08:00","closed_at":"2025-11-06T18:46:55.874814-08:00","source_repo":".","dependencies":[{"issue_id":"bd-nqes","depends_on_id":"bd-rbxi","type":"parent-child","created_at":"2025-11-06T18:19:14.749153-08:00","created_by":"daemon"}]} {"id":"bd-o43","content_hash":"4caa0f14a58127378a533362ec0292833b6d59195e503fab7505180c9c5c0438","title":"Add richer query capabilities to bd list","description":"Current bd list filters are limited to basic field matching (status, priority, type, assignee, label). This forces users to resort to piping through jq for common queries.\n\nMissing query capabilities:\n- Pattern matching: --title-contains, --desc-contains\n- Date ranges: --created-after, --updated-before, --closed-after\n- Empty/null checks: --empty-description, --no-assignee, --no-labels\n- Numeric ranges: --priority-min, --priority-max\n- Complex boolean logic: --and, --or operators\n- Full-text search: --search across all text fields\n- Negation: --not-status, --exclude-label\n\nExample use cases:\n- Find issues with empty descriptions\n- Find stale issues not updated in 30 days\n- Find high-priority bugs with no assignee\n- Search for keyword across title/description/notes\n\nImplementation approach:\n- Add query builder pattern to storage layer\n- Support --query DSL for complex queries\n- Keep simple flags for common cases\n- Add --json output for programmatic use","notes":"## Progress Update\n\n**Completed:**\n- ✅ Extended IssueFilter struct with new fields (pattern matching, date ranges, empty/null checks, priority ranges)\n- ✅ Updated SQLite SearchIssues implementation \n- ✅ Added CLI flags to list.go\n- ✅ Added parseTimeFlag helper\n- ✅ Comprehensive tests added - all passing\n\n**Remaining:**\n- ⚠️ RPC layer needs updating (internal/rpc/protocol.go ListArgs)\n- ⚠️ Daemon handler needs to forward new filters\n- ⚠️ End-to-end testing with daemon mode\n- 📝 Documentation updates\n\n**Files Modified:**\n- internal/types/types.go\n- internal/storage/sqlite/sqlite.go \n- cmd/bd/list.go\n- cmd/bd/list_test.go\n\n**Next Steps:**\n1. Update RPC protocol\n2. Update daemon handler \n3. Test with daemon mode\n4. Update docs","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-05T00:17:48.677493-08:00","updated_at":"2025-11-05T00:33:38.998433-08:00","closed_at":"2025-11-05T00:33:38.998433-08:00","source_repo":"."} {"id":"bd-oif6","content_hash":"5732dcbfd354e39ae9249cbae70f08ec1ccf026a812129519dfda5a8588e5ad1","title":"Vendor beads-merge Go code into internal/merge/","description":"Copy beads-merge source code from @neongreen's repo into bd codebase.\n\n**Tasks**:\n- Create `internal/merge/` package\n- Copy merge algorithm code\n- Add attribution header to all files\n- Update imports to use bd's internal types\n- Add LICENSE/ATTRIBUTION file crediting @neongreen\n- Keep original algorithm intact\n\n**Source**: https://github.com/neongreen/mono/tree/main/beads-merge","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-05T18:42:20.405283-08:00","updated_at":"2025-11-05T18:52:53.71713-08:00","closed_at":"2025-11-05T18:52:53.71713-08:00","source_repo":".","dependencies":[{"issue_id":"bd-oif6","depends_on_id":"bd-qqvw","type":"parent-child","created_at":"2025-11-05T18:42:28.69196-08:00","created_by":"daemon"}]} @@ -309,20 +301,16 @@ {"id":"bd-r79z","content_hash":"464b862f0df806ee2c7686c58abdcff21cddec69f451e48ceaa338f19e80cc0d","title":"GH#245: Windows MCP subprocess timeout for git rev-parse","description":"User reports git detection timing out on Windows in MCP server, but CLI works fine.\n\nPath: C:\\Users\\chris\\Documents\\DEV_R\\quarto-cli\nError: Git repository detection timed out after 5s\nWorks fine in CLI: `git rev-parse --show-toplevel` succeeds\n\nHypothesis: subprocess.run() with asyncio.to_thread() may have Windows-specific issues or the MCP runtime environment may not have proper PATH/git access.\n\nPotential fixes:\n1. Add subprocess shell=True on Windows\n2. Increase timeout further for Windows\n3. Add better error logging to capture subprocess stderr\n4. Skip git resolution entirely on timeout and just use provided path","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-07T16:31:37.531223-08:00","updated_at":"2025-11-07T19:00:44.358543-08:00","closed_at":"2025-11-07T19:00:44.358543-08:00","source_repo":"."} {"id":"bd-rb75","content_hash":"e91418eb7abda986ddb57feaee1b91867043de8c0883d71c21dc1bf4047f5824","title":"Clean up merge conflict artifacts in .beads directory","description":"After resolving merge conflicts in .beads/beads.jsonl, leftover artifacts remain as untracked files:\n- .beads/beads.base.jsonl\n- .beads/beads.left.jsonl\n\nThese appear to be temporary files created during merge conflict resolution.\n\nOptions to fix:\n1. Add these patterns to .beads/.gitignore automatically\n2. Clean up these files after successful merge resolution\n3. Document that users should delete them manually\n4. Add a check in 'bd sync' or 'bd doctor' to detect and remove stale merge artifacts\n\nPreferred solution: Add *.base.jsonl and *.left.jsonl patterns to .beads/.gitignore during 'bd init', and optionally clean them up automatically after successful import.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-06T19:09:16.114274-08:00","updated_at":"2025-11-06T19:13:44.630402-08:00","closed_at":"2025-11-06T19:13:44.630402-08:00","source_repo":"."} {"id":"bd-rbxi","content_hash":"a84e265e04e332ead9ba8a65e90316fa1b44fe024001bafad4b3de47e22a73bc","title":"bd-hv01: Deletion tracking production readiness","description":"Epic to track all improvements and fixes needed to make the deletion tracking implementation (bd-hv01) production-ready.\n\nThe core 3-way merge algorithm is sound, but there are critical issues around atomicity, error handling, and edge cases that need to be addressed before this can be safely used in production.\n\nCritical path (P1):\n- Non-atomic snapshot operations\n- Brittle JSON string comparison\n- Silent partial deletion failures\n- Race conditions in concurrent scenarios\n\nFollow-up work (P2-P3):\n- Test coverage for edge cases and multi-repo mode\n- Performance optimizations\n- Code refactoring and observability\n\nRelated commit: 708a81c","status":"in_progress","priority":1,"issue_type":"epic","created_at":"2025-11-06T18:18:24.315646-08:00","updated_at":"2025-11-06T18:39:15.739497-08:00","source_repo":"."} -{"id":"bd-rm2s","content_hash":"2236f911e6f321a74aa61bdf702d24949e44a68ed511d12dd011aa4103c89230","title":"Issue 2","description":"","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-07T19:00:23.930164-08:00","updated_at":"2025-11-07T19:00:23.930164-08:00","source_repo":"."} {"id":"bd-ry1u","content_hash":"013464efc3cf53d47c2a170040c66099ce77b13d3d1b34c3729e6a5208122799","title":"Publish official devcontainer configuration","description":"","design":"Problem: GH issue #229 shows git hooks aren't available in devcontainers because bd CLI isn't installed. Solution: Provide official .devcontainer/devcontainer.json that installs Go, builds bd from source, runs bd init --quiet, and installs hooks automatically. Benefits: New contributors start immediately, AI assistants work out-of-box, no manual setup. Implementation: Create .devcontainer/devcontainer.json with Go feature, postCreateCommand to build bd and install hooks, environment variables. Acceptance: Container builds with bd installed, hooks functional, documentation updated, tested with Codespaces and VSCode.","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:52:53.019917-08:00","closed_at":"2025-11-05T17:46:42.70998-08:00","source_repo":"."} {"id":"bd-s02","content_hash":"911d456e4dabae028dd615b643c99058ef12e55ea523cb81cc933783c7b13546","title":"Manual task","description":"","status":"open","priority":2,"issue_type":"task","created_at":"2025-11-03T20:15:10.022202-08:00","updated_at":"2025-11-03T20:15:10.022202-08:00","source_repo":"."} {"id":"bd-sjmr","content_hash":"31947009877c3246620f5ca4af142234e4e8f43d5a350e80a8b3e37898e81f6a","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","source_repo":".","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-swbe","content_hash":"61bad97589df3a5d34daec58faf129a7bd86c233e87e128b40e56caba68edc28","title":"Feature P1","description":"","status":"open","priority":1,"issue_type":"feature","assignee":"bob","created_at":"2025-11-07T19:00:22.567886-08:00","updated_at":"2025-11-07T19:00:22.567886-08:00","source_repo":"."} {"id":"bd-tmdx","content_hash":"3ecb07e74eaa468c9fc7a1c6e1c4547182267785b9dbc7998f031d71552842cf","title":"Investigate database pollution - unexpected issue count increases","description":"Two repositories showing unexpected issue counts:\n- ~/src/beads: 280 issues (expected ~209-220)\n- ~/src/dave/beads: 895 issues (675 open, 149 closed)\n\nThis suggests database pollution - issues from one repository leaking into another. Need to investigate:\n1. Run bd detect-pollution on both repos\n2. Check for cross-repo contamination\n3. Identify source of pollution (daemon? multi-repo config? import issues?)\n4. Clean up polluted databases\n5. Prevent future pollution","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-06T22:50:16.957689-08:00","updated_at":"2025-11-07T00:05:38.994405-08:00","closed_at":"2025-11-07T00:05:38.994405-08:00","source_repo":"."} {"id":"bd-tuqd","content_hash":"06ac95944f03d871a6f58d2cd63796828873e92ef7c9b897eb639d28860a458e","title":"bd init overwrites existing git hooks without detection or chaining","description":"GH #254: bd init silently overwrites existing git hooks (like pre-commit framework) without detecting them, backing them up, or offering to chain. This breaks workflows and can result in committed code with failing tests.\n\nFix: Detect existing hooks, prompt user with options to chain/overwrite/skip.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-07T15:51:17.582882-08:00","updated_at":"2025-11-07T15:55:01.330531-08:00","closed_at":"2025-11-07T15:55:01.330531-08:00","source_repo":"."} {"id":"bd-twlr","content_hash":"85bb87aa0a7988bf3399b1ebfe3115302aa9e487097415cb8573cd8aad7392c2","title":"Add bd init --team wizard","description":"Interactive wizard for team workflow setup. Guides user through: branch workflow configuration, shared repo setup, team member onboarding, examples of team collaboration patterns.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-05T18:04:30.013645-08:00","updated_at":"2025-11-05T18:56:03.004161-08:00","closed_at":"2025-11-05T18:56:03.004161-08:00","source_repo":".","dependencies":[{"issue_id":"bd-twlr","depends_on_id":"bd-8rd","type":"parent-child","created_at":"2025-11-05T18:04:39.164445-08:00","created_by":"daemon"}]} -{"id":"bd-u5og","content_hash":"34be64d334d86b421cb60e743f9d259a1e14f6d5fdc435a7094dc39dd8e4bb0f","title":"Test integration issue","description":"This is a real integration test","status":"open","priority":1,"issue_type":"bug","created_at":"2025-11-07T19:00:14.512903-08:00","updated_at":"2025-11-07T19:00:14.512903-08:00","source_repo":"."} {"id":"bd-u8j","content_hash":"91f39bbd4f2394592407c77917682b2c7c3a0b6415a3572eb75a49b0486a17fe","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","acceptance_criteria":"- Documentation explicitly states compatibility or incompatibility with existing lock protocols\n- If incompatible, migration path is documented for library consumers\n- If compatible, example showing coexistence is provided","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-03T20:24:08.257493-08:00","updated_at":"2025-11-05T14:19:11.205328-08:00","closed_at":"2025-11-05T14:15:01.506885-08:00","source_repo":"."} {"id":"bd-uiae","content_hash":"8627a2c5b57679bf49965553f9ec879045ce9a87023455f1d46fcc683f193f3c","title":"Update documentation for beads-merge integration","description":"Document the integrated merge functionality.\n\n**Updates needed**:\n- AGENTS.md: Replace \"use external beads-merge\" with \"bd merge\"\n- README.md: Add git merge driver section\n- TROUBLESHOOTING.md: Update merge conflict resolution\n- ADVANCED.md: Document 3-way merge algorithm\n- Create CREDITS.md or ATTRIBUTION.md for @neongreen\n\n**Highlight**: Deletion sync fix (bd-hv01)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-05T18:42:20.488998-08:00","updated_at":"2025-11-06T15:40:27.830475-08:00","closed_at":"2025-11-06T15:40:27.830475-08:00","source_repo":".","dependencies":[{"issue_id":"bd-uiae","depends_on_id":"bd-qqvw","type":"parent-child","created_at":"2025-11-05T18:42:28.752447-08:00","created_by":"daemon"}]} {"id":"bd-urob","content_hash":"7046a4e101c3ff6030c236c13a7b6bb5d64c54170e8d792768a9f7a8fd5781bf","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":"open","priority":3,"issue_type":"chore","created_at":"2025-11-06T18:16:27.943666-08:00","updated_at":"2025-11-06T18:16:27.943666-08:00","source_repo":".","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-vcg5","content_hash":"aabdbd88598a3104a685a0aa6de9576b82113b6f50d2d8000de7e7166a83ff54","title":"Daemon crash recovery: panic handler + socket cleanup","description":"Improve daemon cleanup on unexpected exit:\n1. Add top-level recover() in runDaemonLoop to capture panics\n2. Write daemon-error file with stack trace on panic\n3. Prefer return over os.Exit where possible (so defers run)\n4. In stopDaemon forced-kill path, also remove stale socket if present\n\nThis ensures better diagnostics and cleaner state after crashes.","status":"open","priority":2,"issue_type":"task","created_at":"2025-11-07T16:42:12.733219-08:00","updated_at":"2025-11-07T16:42:12.733219-08:00","source_repo":".","dependencies":[{"issue_id":"bd-vcg5","depends_on_id":"bd-ndyz","type":"discovered-from","created_at":"2025-11-07T16:42:12.733889-08:00","created_by":"daemon"}]} -{"id":"bd-vdro","content_hash":"10f9e86152715c67df6e6e4910c610574e7d83a41574d32956d755d1cf5e19aa","title":"Updated title","description":"","status":"in_progress","priority":0,"issue_type":"feature","created_at":"2025-11-07T19:00:15.892347-08:00","updated_at":"2025-11-07T19:00:15.915535-08:00","source_repo":"."} {"id":"bd-vs5j","content_hash":"942bdfde12b32d268a7643fb64e4f92fa466cb6564434283a38378f1ce44973e","title":"Issue 1","description":"","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-07T19:04:26.150292-08:00","updated_at":"2025-11-07T19:04:26.150292-08:00","source_repo":".","dependencies":[{"issue_id":"bd-vs5j","depends_on_id":"bd-bpb4","type":"related","created_at":"2025-11-07T19:04:26.204717-08:00","created_by":"daemon"}]} {"id":"bd-vxdr","content_hash":"d188358987c7a7d444f9144a4a6cc5164eccd35b16325edba51dad104ab2a7f2","title":"Investigate database pollution - issue count anomalies","description":"Multiple repos showing inflated issue counts suggesting cross-repo pollution:\n- ~/src/dave/beads: 895 issues (675 open) - clearly polluted\n- ~/src/stevey/src/beads: 280 issues (expected ~209-220) - possibly polluted\n\nNeed to investigate:\n1. Source of pollution (multi-repo sync issues?)\n2. How many duplicate/foreign issues exist\n3. Whether recent sync operations caused cross-contamination\n4. How to clean up and prevent future pollution","notes":"Investigation findings:\n\n**Root cause identified:**\n- NOT cross-repo contamination\n- NOT automated test leakage (tests properly use t.TempDir())\n- Manual testing during template feature development (Nov 2-4)\n- Commit ba325a2: \"test issues were accidentally committed during template feature development\"\n\n**Database growth timeline:**\n- Nov 3: 19 issues (baseline)\n- Nov 2-5: +244 issues (massive development spike)\n- Nov 6-7: +40 issues (continued growth)\n- Current: 291 issues → 270 after cleanup\n\n**Test pollution breakdown:**\n- 21 issues matching \"Test \" prefix pattern\n- Most created Nov 2-5 during feature development\n- Pollution from manual `./bd create \"Test issue\"` commands in production workspace\n- All automated tests properly isolated with t.TempDir()\n\n**Cleanup completed:**\n- Ran scripts/cleanup-test-pollution.sh successfully\n- Removed 21 test issues\n- Database reduced from 291 → 270 issues (7.2% cleanup)\n- JSONL synced to git\n\n**Prevention strategy:**\n- Filed follow-up issue for prevention mechanisms\n- Script can be deleted once prevention is in place\n- Tests are already properly isolated - no code changes needed there","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-06T22:34:40.137483-08:00","updated_at":"2025-11-07T16:16:30.432586-08:00","closed_at":"2025-11-07T16:04:02.199807-08:00","source_repo":"."} {"id":"bd-we4p","content_hash":"0e3248d31a6524c7a665960682cf2b159449fa31f5427771796dce8639059faf","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:41:31.882168-08:00","closed_at":"2025-11-06T19:40:50.871176-08:00","source_repo":".","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"}]} @@ -332,10 +320,8 @@ {"id":"bd-x47","content_hash":"e363d887fa6693c1c748d78ea9cdaaa97606889d910f318fbd29584576da57e9","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","acceptance_criteria":"- Section added: 'For Projects Using Beads for Self-Hosting'\n- Clear guidance on when to stay single-repo vs adopt multi-repo\n- Recommendations for automated executor behavior with multi-repo\n- Bootstrap phase considerations documented","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-03T20:24:27.805341-08:00","updated_at":"2025-11-05T14:19:11.205917-08:00","closed_at":"2025-11-05T14:16:34.69662-08:00","source_repo":"."} {"id":"bd-xo6b","content_hash":"edf43a7439dbccd5f280111a1e277b758f5c2d4c57bd01c5086cfdd6118511e7","title":"Review multi-repo deletion tracking implementation","description":"Thoroughly review the multi-repo deletion tracking fix (bd-4oob):\n\nFiles changed:\n- cmd/bd/deletion_tracking.go: Added getMultiRepoJSONLPaths() helper\n- cmd/bd/daemon_sync.go: Updated snapshot capture/update logic for multi-repo\n- cmd/bd/deletion_tracking_test.go: Added 2 new tests (287 lines)\n\nReview focus areas:\n1. Correctness: Does getMultiRepoJSONLPaths() handle all edge cases?\n2. Performance: Calling getMultiRepoJSONLPaths() 3x per sync (snapshot capture, merge, base update) - should we cache?\n3. Error handling: What if some repos fail snapshot operations but others succeed?\n4. Race conditions: Multiple daemons in different repos?\n5. Test coverage: Are TestMultiRepoDeletionTracking and TestMultiRepoSnapshotIsolation sufficient?\n6. Path handling: Absolute vs relative paths, tilde expansion\n\nThis is fresh code - needs careful review before considering deletion tracking production-ready.","notes":"Code review completed. Overall assessment: Core deletion tracking logic is sound, but error handling and path handling issues make this not yet production-ready for multi-repo scenarios.\n\nKey findings:\n\nCRITICAL ISSUES (Priority 1):\n1. Inconsistent error handling in daemon_sync.go - snapshot/merge fail hard but base update warns. Can leave DB in inconsistent state with no rollback. See bd-sjmr.\n2. No path normalization in getMultiRepoJSONLPaths() - tilde expansion, relative paths, duplicates not handled. See bd-iye7.\n\nSHOULD FIX (Priority 2):\n3. Missing test coverage for edge cases - empty paths, duplicates, partial failures. See bd-kdoh.\n4. Performance - getMultiRepoJSONLPaths() called 3x per sync (minor issue). See bd-we4p.\n\nWHAT WORKS WELL:\n- Atomic file operations with PID-based temp files\n- Good snapshot isolation between repos\n- Race condition protection via exclusive locks\n- Solid test coverage for happy path scenarios\n\nVERDICT: Address bd-iye7 and bd-sjmr before considering deletion tracking production-ready for multi-repo mode.\n\nDetailed review notes available in conversation history.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-06T19:23:52.402949-08:00","updated_at":"2025-11-06T19:32:34.160341-08:00","closed_at":"2025-11-06T19:32:34.160341-08:00","source_repo":".","dependencies":[{"issue_id":"bd-xo6b","depends_on_id":"bd-rbxi","type":"parent-child","created_at":"2025-11-06T19:23:52.403723-08:00","created_by":"daemon"}]} {"id":"bd-yek6","content_hash":"f155913af8c58c0a7ea3da6a7d9e232e8cb29c3825f2d6f272a5417a449692a9","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","source_repo":"."} -{"id":"bd-yfy8","content_hash":"942bdfde12b32d268a7643fb64e4f92fa466cb6564434283a38378f1ce44973e","title":"Issue 1","description":"","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-07T19:00:19.248907-08:00","updated_at":"2025-11-07T19:00:19.248907-08:00","source_repo":".","dependencies":[{"issue_id":"bd-yfy8","depends_on_id":"bd-z3xj","type":"blocks","created_at":"2025-11-07T19:00:19.303402-08:00","created_by":"daemon"}]} {"id":"bd-yp9g","content_hash":"f0566e8e346569a0d4a90fdf77e8528f3524699ed7c1d6e3f98d5cc31bc7361d","title":"Issue with labels","description":"","status":"open","priority":1,"issue_type":"feature","created_at":"2025-11-07T19:04:23.578661-08:00","updated_at":"2025-11-07T19:04:23.578661-08:00","source_repo":".","labels":["backend","urgent"]} {"id":"bd-yyhd","content_hash":"cdd43e0460cfe2e1c0f49728248d4bb441f5c6b17943dd9d13efe32de3e42147","title":"Issue to close","description":"","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-07T19:04:18.800395-08:00","updated_at":"2025-11-07T19:04:18.823022-08:00","closed_at":"2025-11-07T19:04:18.823022-08:00","source_repo":"."} -{"id":"bd-z3xj","content_hash":"2236f911e6f321a74aa61bdf702d24949e44a68ed511d12dd011aa4103c89230","title":"Issue 2","description":"","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-07T19:00:19.280904-08:00","updated_at":"2025-11-07T19:00:19.280904-08:00","source_repo":"."} {"id":"bd-z528","content_hash":"807c7f1f9d3d15e510c14de34ca1536a971f00d324b7c8684c07cb32ac74ddba","title":"Prevent test pollution in production database","description":"The bd-vxdr cleanup revealed test issues were created during manual testing in the production workspace (Nov 2-4, template feature development).\n\n**Root cause:** Manual testing with `./bd create \"Test issue\"` pollutes the production .beads database.\n\n**Prevention strategies:**\n1. Use TEST_DB environment variable for manual testing\n2. Add warning when creating issues with \"Test\" prefix\n3. Improve developer docs about testing workflow\n4. Consider adding `bd test-mode` command for isolated testing","status":"open","priority":2,"issue_type":"task","created_at":"2025-11-07T16:07:28.255289-08:00","updated_at":"2025-11-07T16:07:28.255289-08:00","source_repo":"."} {"id":"bd-zbq2","content_hash":"3fec118fa6f489216810cbd5ba95a80799acc6d8dbeb12a3188695d649cb12c9","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","design":"In cmd/bd/export.go, after atomic rename (line ~301):\n\n1. Count lines in final JSONL file:\n - Read file and count newlines\n - Or reuse countIssuesInJSONL() helper (already exists)\n\n2. Compare to len(exportedIDs)\n\n3. If mismatch:\n - Log error with both counts\n - Optionally: remove the bad JSONL file (or leave for debugging?)\n - Return error (exit 1)\n\n4. Consider adding --skip-verify flag for edge cases\n\nEdge cases:\n- Partial line writes (corrupted file)\n- File system issues\n- Race conditions (another process modifying JSONL during export)\n\nThe countIssuesInJSONL() function already exists at line 20, can reuse it.","acceptance_criteria":"1. bd export verifies JSONL line count after write\n2. Clear error shown if mismatch detected\n3. Test case that simulates partial write failure\n4. Does not affect export performance significantly (line counting is fast)","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-05T14:24:56.278249-08:00","updated_at":"2025-11-05T14:31:24.494885-08:00","closed_at":"2025-11-05T14:31:24.494885-08:00","source_repo":"."} {"id":"bd-zkl","content_hash":"27227f7f9b8b03d312d483686711551bcf227c263f935d94d1a8f2c377969d2e","title":"Add tests for daemon vs non-daemon parity in list filters","description":"After bd-o43 RPC integration, we need tests to verify daemon mode behaves identically to direct mode for all new filter flags.\n\nTest coverage needed:\n- Pattern matching: --title-contains, --desc-contains, --notes-contains\n- Date ranges: all 6 date filter flags (created/updated/closed after/before)\n- Empty/null checks: --empty-description, --no-assignee, --no-labels\n- Priority ranges: --priority-min, --priority-max\n- Status normalization: --status all vs no status flag\n- Date parsing: YYYY-MM-DD, RFC3339, and error cases\n- Backward compat: deprecated --label flag still works\n\nOracle review findings (bd-o43):\n- Date parsing should support multiple formats\n- Status 'all' should be treated as unset\n- NoLabels field was missing from RPC protocol\n- Error messages should be clear and actionable\n\nTest approach:\n- Create RPC integration tests in internal/rpc/server_issues_epics_test.go\n- Compare daemon client.List() vs direct store.SearchIssues() for same filters\n- Verify error messages match between modes\n- Test with real daemon instance, not just unit tests","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-05T00:43:53.369457-08:00","updated_at":"2025-11-05T00:55:31.318526-08:00","closed_at":"2025-11-05T00:55:31.318526-08:00","source_repo":".","dependencies":[{"issue_id":"bd-zkl","depends_on_id":"bd-o43","type":"discovered-from","created_at":"2025-11-05T00:43:53.371274-08:00","created_by":"daemon"}]}