873 lines
690 KiB
JSON
873 lines
690 KiB
JSON
{"id":"bd-0088","title":"Create npm package structure for bd-wasm","description":"Set up npm package for distribution:\n- Create package.json with bd-wasm name\n- Bundle bd.wasm + wasm_exec.js\n- Create CLI wrapper (bin/bd) that invokes WASM\n- Add installation scripts if needed\n- Configure package for Claude Code Web sandbox compatibility","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-02T21:58:07.295058-08:00","updated_at":"2025-12-14T16:45:10.129876-08:00","closed_at":"2025-11-03T20:56:22.700641-08:00","dependencies":[{"issue_id":"bd-0088","depends_on_id":"bd-44d0","type":"parent-child","created_at":"2025-11-02T22:23:49.475356-08:00","created_by":"stevey"}]}
|
||
{"id":"bd-0134cc5a","title":"Fix auto-import creating duplicates instead of updating issues","description":"**Summary:** Auto-import was creating duplicate issues instead of updating existing ones due to incorrect collision resolution settings. The root cause was a misconfiguration in server_export_import_auto.go that forced unnecessary issue duplication during git pulls.\n\n**Key Decisions:** \n- Remove ResolveCollisions: true for auto-imports\n- Update existing issues by ID instead of creating duplicates\n- Restrict collision resolution to explicit import scenarios\n\n**Resolution:** Critical workflow-blocking issue resolved, preventing endless issue duplication and ensuring clean multi-agent synchronization.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-10-27T21:48:57.733846-07:00","updated_at":"2025-12-14T16:43:11.636975-08:00","closed_at":"2025-10-27T22:26:40.627239-07:00"}
|
||
{"id":"bd-02a4","title":"Modify CreateIssue to support parent resurrection","description":"Update internal/storage/sqlite/sqlite.go:182-196 to call TryResurrectParent before failing on missing parent. Coordinate with EnsureIDs changes for consistent behavior. Handle edge case where parent never existed in JSONL (fail gracefully).","status":"closed","priority":0,"issue_type":"task","created_at":"2025-11-04T12:31:59.701571-08:00","updated_at":"2025-12-14T16:45:24.671163-08:00","closed_at":"2025-11-05T00:08:42.81144-08:00"}
|
||
{"id":"bd-03r","title":"Document deletions manifest in AGENTS.md and README","description":"Parent: bd-imj\n\n## Task\nAdd documentation about the deletions manifest feature.\n\n## Locations to Update\n\n### AGENTS.md\n- Explain that deletions.jsonl is tracked in git\n- Document that `bd delete` records to the manifest\n- Explain cross-clone propagation mechanism\n\n### README.md \n- Brief mention in .beads directory structure section\n- Link to detailed docs if needed\n\n### docs/deletions.md (new file)\n- Full technical documentation\n- Format specification\n- Pruning policy\n- Git history fallback\n- Troubleshooting\n\n## Acceptance Criteria\n- AGENTS.md updated with deletion workflow\n- README.md mentions deletions.jsonl purpose\n- New docs/deletions.md with complete reference","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-25T14:56:49.13027-08:00","updated_at":"2025-11-25T15:17:23.145944-08:00","closed_at":"2025-11-25T15:17:23.145944-08:00"}
|
||
{"id":"bd-0447029c","title":"bd find-duplicates - AI-powered duplicate detection","description":"Find semantically duplicate issues.\n\nApproaches:\n1. Mechanical: Exact title/description matching\n2. Embeddings: Cosine similarity (cheap, scalable)\n3. AI: LLM-based semantic comparison (expensive, accurate)\n\nUses embeddings by default for \u003e100 issues.\n\nFiles: cmd/bd/find_duplicates.go (new)","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T16:43:28.182327-07:00","updated_at":"2025-12-14T16:43:58.725207-08:00","closed_at":"2025-10-29T16:15:10.64719-07:00"}
|
||
{"id":"bd-0458","title":"Consolidate export/import/commit/push into sync.go","description":"Create internal/daemonrunner/sync.go with Syncer type. Add ExportOnce, ImportOnce, CommitAndMaybePush methods. Replace createExportFunc/createAutoImportFunc with thin closures calling Syncer.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-01T11:41:14.874539-07:00","updated_at":"2025-12-14T16:44:45.345416-08:00","closed_at":"2025-11-02T12:32:00.157375-08:00"}
|
||
{"id":"bd-05a1","title":"Isolate RPC server startup into rpc_server.go","description":"Create internal/daemonrunner/rpc_server.go with StartRPC function. Move startRPCServer logic here and return typed handle.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-01T11:41:14.876839-07:00","updated_at":"2025-12-14T16:44:45.016135-08:00","closed_at":"2025-11-02T12:32:00.158057-08:00"}
|
||
{"id":"bd-0650a73b","title":"Create cmd/bd/daemon_debouncer.go (~60 LOC)","description":"Implement Debouncer to batch rapid events into single action. Default 500ms, configurable via BEADS_DEBOUNCE_MS. Thread-safe with mutex.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-28T16:20:02.431118-07:00","updated_at":"2025-12-14T16:43:49.9216-08:00","closed_at":"2025-10-28T12:03:35.614191-07:00"}
|
||
{"id":"bd-06aec0c3","title":"Integration Testing","description":"Verify cache removal doesn't break any workflows","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-28T10:50:15.126668-07:00","updated_at":"2025-12-14T16:43:45.707813-08:00","closed_at":"2025-10-28T10:49:20.471129-07:00"}
|
||
{"id":"bd-06y7","title":"Show dependency status in bd show output","description":"When bd show displays dependencies and dependents, include their status (open/closed/in_progress/blocked) for quick progress tracking. Improves context rebuilding and planning.","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-11-05T11:22:11.606837-08:00","updated_at":"2025-12-14T16:45:48.499495-08:00","closed_at":"2025-11-05T11:23:30.431049-08:00"}
|
||
{"id":"bd-0702","title":"Consolidate ID generation and validation into ids.go","description":"Extract ID logic into ids.go: ValidateIssueIDPrefix, GenerateIssueID, EnsureIDs. Move GetAdaptiveIDLength here. Unify single and bulk ID generation flows.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-01T11:41:14.877886-07:00","updated_at":"2025-12-14T16:44:50.749298-08:00","closed_at":"2025-11-02T15:28:11.996624-08:00"}
|
||
{"id":"bd-077e","title":"Add close_reason field to CLI schema and documentation","description":"PR #551 persists close_reason, but the CLI documentation may not mention this field as part of the issue schema.\n\n## Current State\n- close_reason is now persisted in database\n- `bd show --json` will return close_reason in JSON output\n- Documentation may not reflect this new field\n\n## What's Missing\n- CLI reference documentation for close_reason field\n- Schema documentation showing close_reason is a top-level issue field\n- Example output showing close_reason in bd show --json\n- bd close command documentation should mention close_reason parameter is optional\n\n## Suggested Action\n1. Update README.md or CLI reference docs to list close_reason as an issue field\n2. Add example to bd close documentation\n3. Update any type definitions or schema specs\n4. Consider adding close_reason to verbose list output (bd list --verbose)","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-14T14:25:28.448654-08:00","updated_at":"2025-12-14T14:25:28.448654-08:00","dependencies":[{"issue_id":"bd-077e","depends_on_id":"bd-z86n","type":"discovered-from","created_at":"2025-12-14T14:25:28.449968-08:00","created_by":"stevey"}]}
|
||
{"id":"bd-07af","title":"Need comprehensive daemon health check command (bd daemon doctor?)","description":"","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-10-31T21:08:09.092473-07:00","updated_at":"2025-12-14T16:44:30.68446-08:00","closed_at":"2025-11-01T20:10:41.957435-07:00","dependencies":[{"issue_id":"bd-07af","depends_on_id":"bd-2752a7a2","type":"discovered-from","created_at":"2025-10-31T21:08:09.093276-07:00","created_by":"stevey"}]}
|
||
{"id":"bd-08e556f2","title":"Remove Cache Configuration Docs","description":"Remove documentation of deprecated cache env vars","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-28T10:50:15.125488-07:00","updated_at":"2025-12-14T16:43:46.096292-08:00","closed_at":"2025-10-28T10:48:20.606979-07:00"}
|
||
{"id":"bd-08ea","title":"bd cleanup should also prune expired tombstones","description":"## Problem\n\nbd 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\nbd 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 should not 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).\n\n## Files to Modify\n\n- cmd/bd/cleanup.go - Add call to pruneExpiredTombstones after deleteBatch\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-14T00:27:34.718433-08:00","updated_at":"2025-12-14T00:41:54.583522-08:00","closed_at":"2025-12-14T00:36:44.488769-08:00"}
|
||
{"id":"bd-08fd","title":"Test child issue","description":"","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-02T11:50:40.640901-08:00","updated_at":"2025-12-14T16:44:43.090303-08:00","closed_at":"2025-11-02T11:50:47.309652-08:00"}
|
||
{"id":"bd-09b5f2f5","title":"Daemon fails to auto-import after git pull updates JSONL","description":"**Summary:** Fixed daemon's auto-import mechanism to detect JSONL file updates immediately after git pull, addressing data staleness in multi-repo workflows. Replaced timer-based sync with real-time file modification tracking.\n\n**Key Decisions:** \n- Use mtime-based staleness detection\n- Unify import logic across CLI and daemon\n- Trigger auto-import before serving requests\n\n**Resolution:** v0.21.2 establishes reliable, real-time JSONL sync maintaining git as the source of truth for issue tracking.","status":"closed","priority":0,"issue_type":"epic","created_at":"2025-10-25T23:13:12.270766-07:00","updated_at":"2025-12-14T16:44:25.647505-08:00","closed_at":"2025-11-01T16:52:50.931197-07:00"}
|
||
{"id":"bd-0a43","title":"Split monolithic sqlite.go into focused files","description":"internal/storage/sqlite/sqlite.go is 1050 lines containing initialization, 20+ CRUD methods, query building, and schema management.\n\nSplit into:\n- store.go: Store struct \u0026 initialization (150 lines)\n- bead_queries.go: Bead CRUD (300 lines)\n- work_queries.go: Work queries (200 lines) \n- stats_queries.go: Statistics (150 lines)\n- schema.go: Schema \u0026 migrations (150 lines)\n- helpers.go: Common utilities (100 lines)\n\nImpact: Impossible to understand at a glance; hard to find specific functionality; high cognitive load\n\nEffort: 6-8 hours","status":"open","priority":0,"issue_type":"task","created_at":"2025-11-16T14:51:16.520465-08:00","updated_at":"2025-11-16T14:51:16.520465-08:00"}
|
||
{"id":"bd-0a90","title":"bd show --json doesn't include dependency type field","description":"**Summary:** Enhanced bd command JSON output by adding dependency type field, improving tooling integration and metadata retrieval. Developed clean, modular approach to metadata extraction.\n\n**Key Decisions:**\n- Create single-source metadata methods\n- Use thin wrapper for compatibility\n- Implement shared scanning helper\n\n**Resolution:** Delivered backward-compatible solution with 139 lines of code reduction, maintaining full test coverage and improving system flexibility.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-02T09:42:08.712725096Z","updated_at":"2025-12-14T16:44:54.429799-08:00","closed_at":"2025-11-02T16:40:27.353076-08:00"}
|
||
{"id":"bd-0b2","title":"Need --no-git-history flag to disable git history backfill during import","description":"During JSONL migration (beads.jsonl → issues.jsonl), the git history backfill mechanism causes data loss by finding issues in the old beads.jsonl git history and incorrectly treating them as deleted.\n\nA --no-git-history flag for 'bd import' and 'bd sync' would allow users to disable the git history fallback when it's causing problems.\n\nUse cases:\n- JSONL filename migrations\n- Repos with complex git history\n- Debugging import issues\n- Performance (skip slow git scans)\n\nRelated: bd-0gh (migration causes spurious deletions)","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-26T22:28:22.5286-08:00","updated_at":"2025-11-26T23:10:49.354436-08:00","closed_at":"2025-11-26T23:10:49.354436-08:00"}
|
||
{"id":"bd-0d9c","title":"YABB: Spurious issue updates during normal operations","description":"**Summary:** Investigated spurious issue updates during configuration refactoring, identifying potential auto-import/export or database migration triggers causing unintended timestamp and content changes.\n\n**Key Decisions:**\n- Validate IssueDataChanged() logic\n- Remove unnecessary background updates\n- Confirm issue modifications only occur explicitly\n\n**Resolution:** Closed as non-reproducible, with guidance to reopen if specific reproducible steps emerge.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-02T14:36:31.023552-08:00","updated_at":"2025-12-14T16:44:54.540861-08:00","closed_at":"2025-11-02T16:40:27.353774-08:00"}
|
||
{"id":"bd-0dcea000","title":"Add tests for internal/importer package","description":"Currently 0.0% coverage. Need tests for JSONL import logic including collision detection and resolution.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-29T14:06:21.071024-07:00","updated_at":"2025-12-14T16:47:42.352345-08:00","closed_at":"2025-11-08T18:06:20.150657-08:00","dependencies":[{"issue_id":"bd-0dcea000","depends_on_id":"bd-cbed9619.5","type":"blocks","created_at":"2025-10-29T19:52:05.531279-07:00","created_by":"import-remap"},{"issue_id":"bd-0dcea000","depends_on_id":"bd-cbed9619.4","type":"blocks","created_at":"2025-10-29T19:52:05.53166-07:00","created_by":"import-remap"}]}
|
||
{"id":"bd-0do3","title":"Test issue 0","description":"","status":"closed","priority":0,"issue_type":"task","created_at":"2025-11-07T19:00:15.156832-08:00","updated_at":"2025-12-14T16:46:53.950842-08:00","closed_at":"2025-11-07T21:55:09.425092-08:00"}
|
||
{"id":"bd-0e1f2b1b","title":"Event-driven daemon architecture","description":"Replace 5-second polling sync loop with event-driven architecture that reacts instantly to changes. Eliminates stale data issues while reducing CPU ~60%. Key components: FileWatcher (fsnotify), Debouncer (500ms), RPC mutation events, optional git hooks. Target latency: \u003c500ms (vs 5000ms). See event_driven_daemon.md for full design.","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-10-28T16:20:02.430479-07:00","updated_at":"2025-12-14T16:43:55.453782-08:00","closed_at":"2025-10-28T16:30:26.631191-07:00"}
|
||
{"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-0e74","title":"Comprehensive testing for separate branch workflow","description":"**Summary:** Comprehensive testing validated the separate branch workflow, focusing on config management, network resilience, and performance optimization across multiple operational scenarios.\n\n**Key Decisions:**\n- Implement tests for worktree and config management\n- Cover setup, issue operations, and merge workflows\n- Target \u003c 150ms performance overhead\n\n**Resolution:** Added 4 integration tests confirming system robustness and performance compliance.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-02T15:22:35.580741-08:00","updated_at":"2025-12-14T16:45:00.766989-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-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":"open","priority":2,"issue_type":"feature","created_at":"2025-11-12T03:20:25.567748-08:00","updated_at":"2025-11-12T03:20:25.567748-08:00"}
|
||
{"id":"bd-0ih","title":"Update 3-way merge to handle tombstones","description":"Modify internal/merge/merge.go to detect tombstones, implement tombstone-wins-unless-expired logic, add TTL parameter to merge functions. Per design bd-zvg.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-05T15:14:41.367004-08:00","updated_at":"2025-12-05T16:33:16.722162-08:00","closed_at":"2025-12-05T16:33:16.722162-08:00","dependencies":[{"issue_id":"bd-0ih","depends_on_id":"bd-fbj","type":"blocks","created_at":"2025-12-05T15:14:58.784343-08:00","created_by":"daemon"},{"issue_id":"bd-0ih","depends_on_id":"bd-olt","type":"blocks","created_at":"2025-12-05T15:14:58.82323-08:00","created_by":"daemon"}]}
|
||
{"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-0is","title":"Fix bd init to bootstrap from sync-branch when configured","description":"When sync-branch is configured in config.yaml, bd init should import from that branch instead of HEAD. Currently it reads HEAD:.beads/issues.jsonl which may be empty or stale when issues are on the sync branch. Location: cmd/bd/autoimport.go:97 checkGitForIssues()","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-05T13:43:58.083186-08:00","updated_at":"2025-12-05T14:46:16.847836-08:00","closed_at":"2025-12-05T14:46:16.847836-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-12-14T16:47:46.882525-08:00","closed_at":"2025-11-09T11:23:28.780095-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-0rh","title":"getLocalSyncBranch YAML parsing is fragile","description":"The getLocalSyncBranch() function in autoimport.go uses a simple line-by-line YAML parser that could fail on:\n- Indented sync-branch: (nested in a section)\n- Comments containing sync-branch:\n- Multi-line values\n- Values with special characters\n\nCurrent implementation at autoimport.go:161-172 does:\n```go\nfor _, line := range strings.Split(string(data), \"\\n\") {\n line = strings.TrimSpace(line)\n if strings.HasPrefix(line, \"sync-branch:\") {\n value := strings.TrimPrefix(line, \"sync-branch:\")\n ...\n }\n}\n```\n\nThe reason we can't use viper's cached config is that it's initialized at process startup from the main repo's CWD, not from the current directory at runtime. This causes issues in tests where t.Chdir() changes the directory.\n\nOptions:\n1. Accept the limitation (sync-branch must be top-level, unquoted)\n2. Use a proper YAML library (gopkg.in/yaml.v3) to parse just this value\n3. Refactor config package to support re-initialization per directory","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-05T14:50:57.547203-08:00","updated_at":"2025-12-07T01:44:31.444166-08:00","closed_at":"2025-12-07T01:44:31.444166-08:00"}
|
||
{"id":"bd-0v4","title":"Short tests taking 13+ minutes (performance regression)","description":"","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-27T00:54:03.350344-08:00","updated_at":"2025-11-27T13:23:19.376658-08:00","closed_at":"2025-11-27T01:36:06.684059-08:00"}
|
||
{"id":"bd-0vfe","title":"Blocked issue","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-07T19:07:17.105974-08:00","updated_at":"2025-12-14T16:46:52.656367-08:00","closed_at":"2025-11-07T21:55:09.425545-08:00"}
|
||
{"id":"bd-0yt","title":"Plugin should provide hooks instead of requiring global install","description":"","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-04T22:38:58.173423-08:00","updated_at":"2025-12-04T22:44:13.35077-08:00","closed_at":"2025-12-04T22:44:13.35077-08:00"}
|
||
{"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":"open","priority":2,"issue_type":"bug","created_at":"2025-12-14T16:32:01.725196-08:00","updated_at":"2025-12-14T16:32:01.725196-08:00"}
|
||
{"id":"bd-1022","title":"Use external_ref as primary matching key for import updates","description":"**Summary:** Implemented external_ref as primary matching key for cross-system issue imports, enabling seamless synchronization between tracking systems while preventing duplicate entries.\n\n**Key Decisions:**\n- Use external_ref for issue matching\n- Add findByExternalRef() query\n- Implement timestamp-based conflict resolution\n\n**Resolution:** Created robust import mechanism supporting multi-system workflow synchronization with 95% confidence, preserving issue integrity.","status":"closed","priority":0,"issue_type":"feature","created_at":"2025-11-02T14:55:56.355813-08:00","updated_at":"2025-12-14T16:44:50.7672-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":"**Summary:** Silent daemon crashes during RPC commands were traced to nil pointer and JSON encoding problems triggered by database import conflicts. Code review identified specific handling vulnerabilities in show method.\n\n**Key Decisions:**\n- Add nil pointer validation\n- Correct JSON encoding logic\n- Provide daemon restart workaround\n\n**Resolution:** Targeted code modifications eliminated silent crashes, restoring daemon stability and command reliability.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-02T17:05:03.658333-08:00","updated_at":"2025-12-14T16:45:08.421604-08:00","closed_at":"2025-11-03T12:08:12.947676-08:00"}
|
||
{"id":"bd-11e0","title":"Database import silently fails when daemon version != CLI version","description":"","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-10-31T21:08:09.096749-07:00","updated_at":"2025-12-14T16:44:27.839295-08:00","closed_at":"2025-11-01T19:29:35.267817-07:00"}
|
||
{"id":"bd-1231","title":"CI failing on all 3/4 test jobs despite individual tests passing","description":"**Summary:** CI tests were failing inconsistently across platforms, suggesting potential race conditions and infrastructure problems. Investigation focused on test stability and platform-specific issues.\n\n**Key Decisions:**\n- Run tests with `-race` flag\n- Review test cleanup procedures\n- Audit recent test command changes\n\n**Resolution:** Partial fix implemented for daemon auto-import, but Windows and Nix test failures require ongoing platform-specific debugging.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-02T08:42:16.142128-08:00","updated_at":"2025-12-14T16:44:44.233106-08:00","closed_at":"2025-11-02T12:32:00.158346-08:00"}
|
||
{"id":"bd-12c2","title":"Add comprehensive tests for show.go commands (show, update, edit, close)","description":"**Summary:** Developed comprehensive test suite for show.go commands to improve code coverage and validate functionality across critical BEADS operations. Testing focused on addressing challenges with global store initialization and command interactions.\n\n**Key Decisions:** \n- Use existing project test patterns\n- Set BEADS_NO_DAEMON=1 during tests\n- Cover show, update, edit, close command scenarios\n\n**Resolution:** Successfully implemented robust test coverage, significantly enhancing code reliability and ensuring consistent behavior of show.go command implementations.","status":"closed","priority":0,"issue_type":"task","created_at":"2025-10-31T20:08:40.545173-07:00","updated_at":"2025-12-14T16:44:19.366385-08:00","closed_at":"2025-10-31T20:19:22.411066-07:00"}
|
||
{"id":"bd-1445","title":"Create shared insert/event/dirty helpers","description":"Create issues.go (insertIssue/insertIssues), events.go (recordCreatedEvent/recordCreatedEvents), dirty.go (markDirty/markDirtyBatch). Refactor single and bulk create paths to use these.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-01T11:41:14.882142-07:00","updated_at":"2025-12-14T16:44:51.837921-08:00","closed_at":"2025-11-02T15:28:11.997063-08:00"}
|
||
{"id":"bd-149","title":"Auth tokens expire too quickly","description":"## Summary\n\n[Brief description of the bug]\n\n## Steps to Reproduce\n\n1. Step 1\n2. Step 2\n3. Step 3\n\n## Expected Behavior\n\n[What should happen]\n\n## Actual Behavior\n\n[What actually happens]\n\n## Environment\n\n- OS: [e.g., macOS 15.7.1]\n- Version: [e.g., bd 0.20.1]\n- Additional context: [any relevant details]\n\n## Additional Context\n\n[Screenshots, logs, or other relevant information]\n","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-03T19:54:10.671488-08:00","updated_at":"2025-12-14T16:45:33.977887-08:00","closed_at":"2025-11-05T00:25:06.427601-08:00"}
|
||
{"id":"bd-164b","title":"Add template support for issue creation","description":"**Summary:** Implemented CLI issue template support to standardize issue creation workflows, enabling developers to quickly generate structured issues for different work item types.\n\n**Key Decisions:**\n- Templates stored in .beads/templates/\n- Support YAML/JSON formats\n- Include built-in and custom templates\n\n**Resolution:** New feature improves development team productivity by providing consistent, pre-structured issue creation templates.","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-11-03T18:10:18.985902-08:00","updated_at":"2025-12-14T16:45:08.798847-08:00","closed_at":"2025-11-03T19:56:41.287303-08:00"}
|
||
{"id":"bd-17d5","title":"bd sync false positive: conflict detection triggers on JSON-encoded angle brackets in issue content","description":"**Summary:** bd sync falsely detected git conflict markers when JSON-encoded angle brackets were present in issue descriptions. This occurred during import processing, causing unnecessary synchronization failures for valid issue content.\n\n**Key Decisions:**\n- Modify conflict detection to only scan raw file bytes\n- Avoid JSON decoding before conflict marker check\n- Potentially add a bypass flag for complex imports\n\n**Resolution:** Issue resolved by implementing more robust conflict marker parsing that distinguishes between actual git conflicts and encoded text representations.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-08T13:02:54.730745-08:00","updated_at":"2025-12-14T16:47:39.596005-08:00","closed_at":"2025-11-08T13:07:37.108225-08:00"}
|
||
{"id":"bd-17fa2d21","title":"Batch test 2","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-29T15:29:01.877052-07:00","updated_at":"2025-12-14T16:44:02.467148-08:00","closed_at":"2025-10-31T12:00:43.183657-07:00"}
|
||
{"id":"bd-1863608e","title":"Add TestNWayCollision for 5+ clones","description":"**Summary:** Added comprehensive N-way collision tests for distributed sync system, focusing on scaling test coverage from 3 to 5+ clones and validating convergence across different synchronization scenarios.\n\n**Key Decisions:**\n- Create generalized testNCloneCollision function for arbitrary clone count\n- Test multiple sync orders (sequential, reverse, random)\n- Implement performance benchmarks for 3-20 clones\n- Add convergence time and edge case validation\n\n**Resolution:** Successfully demonstrated collision resolution mechanism scales reliably to 5+ clones with predictable performance, ensuring robust synchronization across distributed systems.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-29T20:02:47.954306-07:00","updated_at":"2025-12-14T16:43:32.867546-08: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-14T16:45:41.336314-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"}]}
|
||
{"id":"bd-1b0a","title":"Add transaction helper to replace manual COMMIT/ROLLBACK","description":"Create tx.go with withTx helper that handles transaction lifecycle. Replace manual transaction blocks in create/insert/update paths.","notes":"Refactoring complete:\n- Created withTx() helper in util.go\n- Added ExecInTransaction() as deprecated wrapper for backward compatibility\n- Refactored all manual transaction blocks to use withTx():\n - events.go: AddComment\n - dirty.go: MarkIssuesDirty, ClearDirtyIssuesByID\n - labels.go: executeLabelOperation\n - dependencies.go: AddDependency, RemoveDependency\n - compact.go: ApplyCompaction\n- All tests pass successfully","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-01T11:41:14.823323-07:00","updated_at":"2025-12-14T16:44:49.354105-08:00","closed_at":"2025-11-02T13:11:26.623215-08:00"}
|
||
{"id":"bd-1bu","title":"Exclude tombstones from SearchIssues by default","description":"SearchIssues() returns tombstones if they match search criteria. Per design, users generally shouldn't see deleted issues in search results.\n\nLocation: internal/storage/sqlite/queries.go:1155-1311 and transaction.go:887-1044\n\nOptions:\n1. Add default tombstone exclusion unless explicitly filtering for them\n2. Add IncludeTombstones field to IssueFilter\n\nRecommendation: Add 'status != tombstone' to WHERE clause unless filter.Status == StatusTombstone","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-05T15:35:36.398377-08:00","updated_at":"2025-12-05T15:48:07.595326-08:00","closed_at":"2025-12-05T15:48:07.595326-08:00","dependencies":[{"issue_id":"bd-1bu","depends_on_id":"bd-vw8","type":"parent-child","created_at":"2025-12-05T15:35:47.259641-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-1c63eb84","title":"Investigate jujutsu integration for beads","description":"Research and document how beads could integrate with jujutsu (jj), the next-generation VCS. Key areas to explore:\n- How jj's operation model differs from git (immutable operations, working-copy-as-commit)\n- JSONL sync strategy with jj's conflict resolution model\n- Daemon compatibility with jj's more frequent rewrites\n- Whether auto-import/export needs changes for jj workflows\n- Example configurations and documentation updates needed","status":"closed","priority":3,"issue_type":"task","created_at":"2025-10-23T09:23:23.582009-07:00","updated_at":"2025-12-14T16:45:58.338318-08:00","closed_at":"2025-11-05T14:26:17.967073-08:00"}
|
||
{"id":"bd-1c77","title":"Implement filesystem shims for WASM","description":"WASM needs JS shims for filesystem access. Child of epic bd-44d0.\n\n## Tasks\n- [ ] Implement file read/write shims\n- [ ] Map WASM syscalls to Node.js fs API\n- [ ] Handle .beads/ directory discovery\n- [ ] Test with real JSONL files\n- [ ] Support both absolute and relative paths\n\n## Technical Notes\n- Use Node.js fs module via syscall/js\n- Consider MEMFS for in-memory option","status":"closed","priority":0,"issue_type":"task","created_at":"2025-11-02T18:33:31.280464-08:00","updated_at":"2025-12-14T16:45:42.447434-08:00","closed_at":"2025-11-05T00:55:48.756432-08:00","dependencies":[{"issue_id":"bd-1c77","depends_on_id":"bd-197b","type":"blocks","created_at":"2025-11-02T18:33:31.281134-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-1ece","title":"Remove obsolete renumber.go command (hash IDs eliminated need)","description":"","status":"closed","priority":2,"issue_type":"chore","created_at":"2025-10-31T21:27:05.559328-07:00","updated_at":"2025-12-14T16:44:20.805414-08:00","closed_at":"2025-10-31T21:27:11.426941-07:00"}
|
||
{"id":"bd-1ezg","title":"Investigate bd export/import sync issue - database and JSONL out of sync","description":"**Summary:** Investigated BD export/import synchronization failure caused by daemon SQLite lock contention. The core issue was database access blocking when the daemon was running, preventing successful issue tracking between database and JSONL.\n\n**Key Decisions:**\n- Modify import/export to detect and close daemon connection before database access\n- Add debug logging for diagnosing lock-related issues\n- Ensure direct SQLite access bypasses daemon lock\n\n**Resolution:** Implemented a fix that resolves indefinite hanging during export/import operations, improving system reliability and ensuring consistent issue tracking across database and JSONL formats.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-06T19:00:55.78797-08:00","updated_at":"2025-12-14T16:46:19.564735-08:00","closed_at":"2025-11-06T19:07:15.077983-08:00"}
|
||
{"id":"bd-1f28","title":"Extract migration functions to migrations.go","description":"Move migrateDirtyIssuesTable, migrateExternalRefColumn, migrateCompositeIndexes, migrateClosedAtConstraint, migrateCompactionColumns, migrateSnapshotsTable, migrateCompactionConfig, migrateCompactedAtCommitColumn, migrateExportHashesTable, migrateContentHashColumn to a separate migrations.go file","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-01T19:28:54.892045-07:00","updated_at":"2025-12-14T16:44:28.969993-08:00","closed_at":"2025-11-01T20:00:09.038178-07:00"}
|
||
{"id":"bd-1f4086c5","title":"Event-driven daemon architecture","description":"**Summary:** Replaced inefficient polling sync with event-driven daemon using FileWatcher and RPC to reduce latency and system overhead. Implemented a responsive architecture for near-instant change detection.\n\n**Key Decisions:**\n- Use fsnotify for immediate change tracking\n- 500ms debouncer for event management\n- 60s fallback sync mechanism\n\n**Resolution:** Achieved \u003c500ms response time with 60% CPU reduction, validated as production-ready.","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-10-29T23:05:13.969484-07:00","updated_at":"2025-12-14T16:44:20.465215-08:00","closed_at":"2025-10-31T20:21:25.464736-07:00"}
|
||
{"id":"bd-1f4086c5.1","title":"Integration test: mutation to export latency","description":"**Summary:** Integration test for mutation export latency was created to validate performance of data export under rapid changes. Test verifies batching and latency requirements for background daemon operations.\n\n**Key Decisions:** \n- Latency target set to \u003c500ms\n- Test designed with fast debounce configuration\n- Test currently skipped pending full event-driven daemon implementation\n\n**Resolution:** Test framework is prepared to validate daemon export performance once event-driven mode becomes default, ensuring efficient data mutation handling.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T20:49:49.103759-07:00","updated_at":"2025-12-14T16:43:32.719607-08:00","closed_at":"2025-10-29T14:19:19.808139-07:00","dependencies":[{"issue_id":"bd-1f4086c5.1","depends_on_id":"bd-1f4086c5","type":"parent-child","created_at":"2025-10-29T20:49:49.107244-07:00","created_by":"import-remap"}]}
|
||
{"id":"bd-1f64","title":"Add comprehensive tests for config.yaml issue-prefix migration","description":"**Summary:** Developed comprehensive test coverage for config.yaml issue-prefix migration to ensure data integrity during v0.22 software upgrade. Focused on validating configuration handling across multiple scenarios and potential edge cases.\n\n**Key Decisions:** \n- Test empty/malformed config scenarios\n- Validate atomic write and fallback mechanisms\n- Verify cross-configuration migration paths\n\n**Resolution:** Implemented full test suite that prevents potential data loss and ensures smooth configuration migration during software upgrades.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-03T22:33:43.08753-08:00","updated_at":"2025-12-14T16:45:12.779537-08:00","closed_at":"2025-11-03T22:46:16.306565-08:00"}
|
||
{"id":"bd-1fkr","title":"bd-hv01: Storage backend extensibility broken by type assertion","description":"Problem: deletion_tracking.go:69-82 uses type assertion for DeleteIssue which breaks if someone adds a new storage backend.\n\nFix: Check capability before starting merge or add DeleteIssue to Storage interface.\n\nFiles: cmd/bd/deletion_tracking.go:69-82, internal/storage/storage.go","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-06T18:16:20.770662-08:00","updated_at":"2025-12-14T16:46:16.888461-08:00","closed_at":"2025-11-06T18:55:08.666253-08:00","dependencies":[{"issue_id":"bd-1fkr","depends_on_id":"bd-rbxi","type":"parent-child","created_at":"2025-11-06T18:19:14.925961-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-1h8","title":"Fix compact --analyze/--apply error messages to clarify direct mode requirement","description":"**Problem:**\nWhen users run `bd compact --analyze` with daemon running, they get:\n```\nError: compact requires SQLite storage\n```\n\nThis is misleading because they ARE using SQLite (via daemon), but the command needs DIRECT SQLite access.\n\n**Current behavior:**\n- Error message suggests they don't have SQLite\n- No hint about using --no-daemon flag\n- Related to issue #349 item #1\n\n**Proposed fix:**\n1. Update error messages in cmd/bd/compact.go lines 106-114 (analyze) and 121-137 (apply)\n2. Add explicit hint: \"Use --no-daemon flag to bypass daemon\"\n3. Change SQLite check error from \"requires SQLite storage\" to \"failed to open database in direct mode\"\n\n**Files to modify:**\n- cmd/bd/compact.go (lines ~106-137)\n\n**Testing:**\n- Run with daemon: `bd compact --analyze` should show clear error + hint\n- Run with --no-daemon: `bd compact --analyze --no-daemon` should work\n- Verify error message is actionable","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-20T20:47:45.606924-05:00","updated_at":"2025-11-20T20:59:13.406952-05:00","closed_at":"2025-11-20T20:59:13.406952-05:00"}
|
||
{"id":"bd-1kf","title":"mergePriority: negative priorities not handled consistently","description":"","status":"closed","priority":4,"issue_type":"bug","created_at":"2025-12-02T21:56:17.99534-08:00","updated_at":"2025-12-02T22:12:28.396719-08:00","closed_at":"2025-12-02T22:12:28.396719-08:00"}
|
||
{"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-12-14T16:45:10.988664-08:00","closed_at":"2025-11-03T22:07:10.946574-08:00"}
|
||
{"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-12-14T16:46:52.415793-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-1pj6","title":"Proposal: Custom status states via config","description":"Proposal to add 'custom status states' via `bd config`.\nUsers could define an optional issue status enum (e.g., awaiting_review, review_in_progress) in the config.\nThis would enable multi-step pipelines to process issues where each step correlates to a specific status.\n\nExamples:\n- awaiting_verification\n- awaiting_docs\n- awaiting_testing\n","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-11-20T18:55:48.670499-05:00","updated_at":"2025-12-09T18:38:37.668809171-05:00","closed_at":"2025-11-28T23:18:45.862553-08:00"}
|
||
{"id":"bd-1r5","title":"Design tombstone TTL and expiration semantics","description":"Design the TTL and expiration behavior for tombstone records. Key decisions: default TTL (recommend 30 days), configuration via config.yaml, expiration semantics (remove vs keep expired), merge behavior when tombstone expires (live issue wins), clock skew handling.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-05T13:42:57.242067-08:00","updated_at":"2025-12-05T14:59:11.461169-08:00","closed_at":"2025-12-05T14:59:11.461169-08:00"}
|
||
{"id":"bd-1rh","title":"cmd/bd test suite is absurdly slow - 279 tests taking 8+ minutes","description":"# Problem\n\nThe cmd/bd test suite is painfully slow:\n- **279 tests** in cmd/bd alone\n- Full suite takes **8+ minutes** to run\n- Even with the 16 slowest integration tests now tagged with `integration` build tag, the remaining tests still take forever\n\nThis makes the development loop unusable. We can't wait 8+ minutes every time we want to run tests.\n\n# Root Cause Analysis\n\n## 1. Sheer Volume\n279 tests is too many for a single package. Even at 0.1s per test, that's 28 seconds minimum just for cmd/bd.\n\n## 2. Each Test Creates Full Database + Temp Directories\nEvery test does heavy setup:\n- Creates temp directory (`t.TempDir()` or `os.MkdirTemp`)\n- Initializes SQLite database\n- Sets up git repo in many cases\n- Creates full storage layer\n\nExample from the tests:\n```go\nfunc setupCLITestDB(t *testing.T) string {\n tmpDir := createTempDirWithCleanup(t)\n runBDInProcess(t, tmpDir, \"init\", \"--prefix\", \"test\", \"--quiet\")\n return tmpDir\n}\n```\n\nThis happens 279 times!\n\n## 3. Tests Are Not Properly Categorized\nWe have three types of tests mixed together:\n- **Unit tests** - should be fast, test single functions\n- **Integration tests** - test full workflows, need DB/git\n- **End-to-end tests** - test entire CLI commands\n\nThey're all lumped together in cmd/bd, all running every time.\n\n# What We've Already Fixed\n\nAdded `integration` build tags to 16 obviously-slow test files:\n- import_profile_test.go (performance benchmarking tests)\n- export_mtime_test.go (tests with time.Sleep calls)\n- cli_fast_test.go (full CLI integration tests)\n- delete_test.go, import_uncommitted_test.go, sync_local_only_test.go (git integration)\n- And 10 more in internal/ packages\n\nThese are now excluded from the default `go test ./...` run.\n\n# Proposed Solutions\n\n## Option 1: Shared Test Fixtures (Quick Win)\nCreate a shared test database that multiple tests can use:\n```go\nvar testDB *sqlite.SQLiteStorage\nvar testDBOnce sync.Once\n\nfunc getSharedTestDB(t *testing.T) storage.Storage {\n testDBOnce.Do(func() {\n // Create one DB for all tests\n })\n return testDB\n}\n```\n\n**Pros**: Easy to implement, immediate speedup\n**Cons**: Tests become less isolated, harder to debug failures\n\n## Option 2: Table-Driven Tests (Medium Win)\nCollapse similar tests into table-driven tests:\n```go\nfunc TestCreate(t *testing.T) {\n tests := []struct{\n name string\n args []string\n want string\n }{\n {\"basic issue\", []string{\"create\", \"Test\"}, \"created\"},\n {\"with description\", []string{\"create\", \"Test\", \"-d\", \"desc\"}, \"created\"},\n // ... 50 more cases\n }\n \n db := setupOnce(t) // Setup once, not 50 times\n for _, tt := range tests {\n t.Run(tt.name, func(t *testing.T) {\n // test using shared db\n })\n }\n}\n```\n\n**Pros**: Dramatically reduces setup overhead, tests run in parallel\n**Cons**: Requires refactoring, tests share more state\n\n## Option 3: Split cmd/bd Tests Into Packages (Big Win)\nMove tests into focused packages:\n- `cmd/bd/internal/clitests` - CLI integration tests (mark with integration tag)\n- `cmd/bd/internal/unittests` - Fast unit tests\n- Keep only essential tests in cmd/bd\n\n**Pros**: Clean separation, easy to run just fast tests\n**Cons**: Requires significant refactoring\n\n## Option 4: Parallel Execution (Quick Win)\nAdd `t.Parallel()` to independent tests:\n```go\nfunc TestSomething(t *testing.T) {\n t.Parallel() // Run this test concurrently with others\n // ...\n}\n```\n\n**Pros**: Easy to add, can cut time in half on multi-core machines\n**Cons**: Doesn't reduce actual test work, just parallelizes it\n\n## Option 5: In-Memory Databases (Medium Win)\nUse `:memory:` SQLite databases instead of file-based:\n```go\nstore, err := sqlite.New(ctx, \":memory:\")\n```\n\n**Pros**: Faster than disk I/O, easier cleanup\n**Cons**: Some tests need actual file-based DBs (export/import tests)\n\n# Recommended Approach\n\n**Short-term (this week)**:\n1. Add `t.Parallel()` to all independent tests in cmd/bd\n2. Use `:memory:` databases where possible\n3. Create table-driven tests for similar test cases\n\n**Medium-term (next sprint)**:\n4. Split cmd/bd tests into focused packages\n5. Mark more integration tests appropriately\n\n**Long-term (backlog)**:\n6. Consider shared test fixtures with proper isolation\n\n# Current Status\n\nWe've tagged 16 files with `integration` build tag, but the remaining 279 tests in cmd/bd still take 8+ minutes. This issue tracks fixing the cmd/bd test performance specifically.\n\n# Target\n\nGet `go test ./...` (without `-short` or `-tags=integration`) down to **under 30 seconds**.\n\n\n# THE REAL ROOT CAUSE (Updated Analysis)\n\nAfter examining the actual test code, the problem is clear:\n\n## Every Test Creates Its Own Database From Scratch\n\nLook at `create_test.go`:\n```go\nfunc TestCreate_BasicIssue(t *testing.T) {\n tmpDir := t.TempDir() // ← Creates temp dir\n testDB := filepath.Join(tmpDir, \".beads\", \"beads.db\")\n s := newTestStore(t, testDB) // ← Opens NEW SQLite connection\n // ← Runs migrations\n // ← Sets config\n // ... actual test (3 lines)\n}\n\nfunc TestCreate_WithDescription(t *testing.T) {\n tmpDir := t.TempDir() // ← Creates ANOTHER temp dir\n testDB := filepath.Join(tmpDir, \".beads\", \"beads.db\")\n s := newTestStore(t, testDB) // ← Opens ANOTHER SQLite connection\n // ... actual test (3 lines)\n}\n```\n\n**This happens 279 times!**\n\n## These Tests Don't Need Isolation!\n\nMost tests are just checking:\n- \"Can I create an issue with a title?\"\n- \"Can I create an issue with a description?\"\n- \"Can I add labels?\"\n\nThey don't conflict with each other. They could all share ONE database!\n\n## The Fix: Test Suites with Shared Setup\n\nInstead of:\n```go\nfunc TestCreate_BasicIssue(t *testing.T) {\n s := newTestStore(t, t.TempDir()+\"/db\") // ← Expensive!\n // test\n}\n\nfunc TestCreate_WithDesc(t *testing.T) {\n s := newTestStore(t, t.TempDir()+\"/db\") // ← Expensive!\n // test\n}\n```\n\nDo this:\n```go\nfunc TestCreate(t *testing.T) {\n // ONE setup for all subtests\n s := newTestStore(t, t.TempDir()+\"/db\")\n \n t.Run(\"basic_issue\", func(t *testing.T) {\n t.Parallel() // Can run concurrently - tests don't conflict\n // test using shared `s`\n })\n \n t.Run(\"with_description\", func(t *testing.T) {\n t.Parallel()\n // test using shared `s`\n })\n \n // ... 50 more subtests, all using same DB\n}\n```\n\n**Result**: 50 tests → 1 database setup instead of 50!\n\n## Why This Works\n\nSQLite is fine with concurrent reads and isolated transactions. These tests:\n- ✅ Create different issues (no ID conflicts)\n- ✅ Just read back what they created\n- ✅ Don't depend on database state from other tests\n\nThey SHOULD share a database!\n\n## Real Numbers\n\nCurrent:\n- 279 tests × (create dir + init SQLite + migrations) = **8 minutes**\n\nAfter fix:\n- 10 test suites × (create dir + init SQLite + migrations) = **30 seconds**\n- 279 subtests running in parallel using those 10 DBs = **5 seconds**\n\n**Total: ~35 seconds instead of 8 minutes!**\n\n## Implementation Plan\n\n1. **Group related tests** into suites (Create, List, Update, Delete, etc.)\n2. **One setup per suite** instead of per test\n3. **Use t.Run() for subtests** with t.Parallel()\n4. **Keep tests that actually need isolation** separate (export/import tests, git operations)\n\nThis is way better than shuffling tests into folders!","notes":"## Progress Update (2025-11-21)\n\n✅ **Completed**:\n- Audited all 280 tests, created TEST_SUITE_AUDIT.md ([deleted:bd-c49])\n- Refactored create_test.go to shared DB pattern ([deleted:bd-y6d])\n- Proven the pattern works: 11 tests now run in 0.04s with 1 DB instead of 11\n\n❌ **Current Reality**:\n- Overall test suite: Still 8+ minutes (no meaningful change)\n- Only 1 of 76 test files refactored\n- Saved ~10 DB initializations out of 280\n\n## Acceptance Criteria (REALISTIC)\n\nThis task is NOT complete until:\n- [ ] All P1 files refactored (create ✅, dep, stale, comments, list, ready)\n- [ ] Test suite runs in \u003c 2 minutes\n- [ ] Measured and verified actual speedup\n\n## Next Steps\n\n1. Refactor remaining 5 P1 files: dep_test.go, stale_test.go, comments_test.go, list_test.go, ready_test.go\n2. Measure actual time improvement after each file\n3. Continue with P2 files if needed to hit \u003c2min target","status":"open","priority":1,"issue_type":"bug","created_at":"2025-11-21T11:37:47.886207-05:00","updated_at":"2025-11-22T14:57:44.480203204-05:00","dependencies":[{"issue_id":"bd-1rh","depends_on_id":"bd-c49","type":"blocks","created_at":"2025-11-21T11:49:26.347518-05:00","created_by":"daemon"}]}
|
||
{"id":"bd-1sn","title":"Tombstone fields not merged in mergeIssue function","description":"The mergeIssue() function in merge.go does not handle tombstone fields (DeletedAt, DeletedBy, DeleteReason, OriginalType) when merging live issues. While tombstones are handled separately in merge3WayWithTTL(), if a tombstone ever reaches mergeIssue() via the mergeStatus safety fallback, the tombstone fields would be lost. The mergeIssue() function should either: 1) Copy tombstone fields when result.Status becomes tombstone, or 2) Assert that tombstones never reach mergeIssue() (defensive check). Files: internal/merge/merge.go:458-499","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-05T16:36:24.726818-08:00","updated_at":"2025-12-05T17:15:57.641091-08:00","closed_at":"2025-12-05T17:15:57.641091-08:00"}
|
||
{"id":"bd-1tw","title":"Fix G104 errors unhandled in internal/storage/sqlite/queries.go:1186","description":"Linting issue: G104: Errors unhandled (gosec) at internal/storage/sqlite/queries.go:1186:2. Error: rows.Close()","status":"open","priority":0,"issue_type":"bug","created_at":"2025-12-07T15:35:13.051671889-07:00","updated_at":"2025-12-07T15:35:13.051671889-07:00"}
|
||
{"id":"bd-1u4","title":"Fix gosec lint warnings in doctor.go, main.go, and fix subdirectory","description":"CI lint job failing with 4 gosec warnings:\n- cmd/bd/doctor.go:664 (G304: file inclusion via variable)\n- cmd/bd/doctor/fix/database_config.go:166 (G304: file inclusion via variable) \n- cmd/bd/doctor/fix/untracked.go:61 (G204: subprocess launched with variable)\n- cmd/bd/main.go:645 (G304: file inclusion via variable)\n\nEither suppress with `// #nosec` if false positives, or refactor to validate paths properly.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-29T00:43:07.393406783-07:00","updated_at":"2025-11-29T23:31:20.977129-08:00","closed_at":"2025-11-29T23:31:16.4478-08:00"}
|
||
{"id":"bd-1vup","title":"Test FK constraint via close","description":"","status":"closed","priority":4,"issue_type":"task","created_at":"2025-11-07T15:06:10.324045-08:00","updated_at":"2025-12-14T16:46:42.887167-08:00","closed_at":"2025-11-07T15:06:14.289835-08:00"}
|
||
{"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-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-12-14T16:45:13.578398-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-2009","title":"(deleted)","description":"","status":"tombstone","priority":0,"issue_type":"task","created_at":"2025-12-14T16:42:50.384931-08:00","updated_at":"2025-12-14T16:42:50.384931-08:00","deleted_at":"0001-01-01T00:00:00Z"}
|
||
{"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":"open","priority":2,"issue_type":"task","created_at":"2025-12-08T06:49:04.449094018-07:00","updated_at":"2025-12-08T06:49:04.449094018-07:00"}
|
||
{"id":"bd-22e0bde9","title":"Add TestNWayCollision for 5+ clones","description":"**Summary:** Extended collision resolution testing from 3 to 5+ clones to validate synchronization algorithm scalability. Developed generalized test framework to assess convergence across different clone configurations.\n\n**Key Decisions:** \n- Created flexible testNCloneCollision function\n- Added test scenarios with varied sync orders\n- Implemented performance benchmarks\n\n**Resolution:** Testing confirmed linear scalability and correct convergence for up to 10 clones, validating robust multi-way collision handling.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-29T23:05:13.974702-07:00","updated_at":"2025-12-14T16:44:05.459718-08:00","closed_at":"2025-10-31T12:00:43.197709-07:00"}
|
||
{"id":"bd-23a8","title":"Test simple issue","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-02T17:11:04.464726-08:00","updated_at":"2025-12-14T16:45:16.254762-08:00","closed_at":"2025-11-04T11:10:23.529731-08:00"}
|
||
{"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-14T16:46:32.497378-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-12-14T16:44:25.317824-08:00","closed_at":"2025-11-01T11:11:57.93151-07:00"}
|
||
{"id":"bd-2752a7a2","title":"Create cmd/bd/daemon_watcher.go (~150 LOC)","description":"Implement FileWatcher using fsnotify to watch JSONL file and git refs. Handle platform differences (inotify/FSEvents/ReadDirectoryChangesW). Include edge case handling for file rename, event storm, watcher failure.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T23:05:13.887269-07:00","updated_at":"2025-12-14T16:44:16.814728-08:00","closed_at":"2025-10-31T18:30:24.131535-07:00"}
|
||
{"id":"bd-27ea","title":"Improve cmd/bd test coverage from 21% to 40% (multi-session effort)","description":"**Summary:** Systematically enhanced test coverage for cmd/bd package, developing targeted test files to improve code reliability and robustness. Focused on comprehensive testing of command handlers and edge cases.\n\n**Key Decisions:**\n- Target 40% test coverage\n- Create dedicated test files for core functionality\n- Prioritize error handling and dry run scenarios\n\n**Resolution:** Successfully achieved 42.9% function coverage, exceeding initial target and significantly improving code quality.","status":"closed","priority":0,"issue_type":"task","created_at":"2025-10-31T19:35:57.558346-07:00","updated_at":"2025-12-14T16:44:25.420687-08:00","closed_at":"2025-11-01T12:23:39.158926-07:00"}
|
||
{"id":"bd-27xm","title":"Debug MCP Agent Mail tool execution errors","description":"**Summary:** Investigated persistent errors in the standalone MCP Agent Mail tool's ensure_project endpoint, focusing on debugging the independent server's execution layer while verifying core functionality.\n\n**Key Decisions:**\n- Isolated issue to tool wrapper layer, not core HTTP server\n- Conducted systematic log and configuration review\n- Verified Git and database initialization paths\n\n**Resolution:** Further investigation required to resolve API endpoint errors, with potential implications for future lightweight beads integration and file reservation testing.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-07T23:20:10.973891-08:00","updated_at":"2025-12-14T16:47:06.255658-08:00","closed_at":"2025-11-07T23:40:19.309202-08:00","dependencies":[{"issue_id":"bd-27xm","depends_on_id":"bd-muls","type":"discovered-from","created_at":"2025-11-07T23:20:21.895654-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-28db","title":"Add 'bd status' command for issue database overview","description":"Implement a bd status command that provides a quick snapshot of the issue database state, similar to how git status shows working tree state.\n\nExpected output: Show summary including counts by state (open, in-progress, blocked, closed), recent activity (last 7 days), and quick overview without needing multiple queries.\n\nExample output showing issue counts, recent activity stats, and pointer to bd list for details.\n\nProposed options: --all (show all issues), --assigned (show issues assigned to current user), --json (JSON format output)\n\nUse cases: Quick project health check, onboarding for new contributors, integration with shell prompts or CI/CD, daily standup reference","status":"open","priority":2,"issue_type":"feature","created_at":"2025-11-02T17:25:59.203549-08:00","updated_at":"2025-11-02T17:25:59.203549-08:00"}
|
||
{"id":"bd-2997","title":"bd-hv01: No snapshot versioning or timestamps causes stale data usage","description":"Problem: If sync is interrupted (crash, kill -9, power loss), stale snapshots persist indefinitely. Next sync uses stale data leading to incorrect deletions.\n\nFix: Add metadata to snapshots with timestamp, version, and commit SHA. Validate snapshots are recent (\u003c 1 hour old), from compatible version, and from expected git commit.\n\nFiles: cmd/bd/deletion_tracking.go (all snapshot functions)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-06T18:16:21.816748-08:00","updated_at":"2025-12-14T16:46:26.130469-08:00","closed_at":"2025-11-06T19:34:51.677442-08:00","dependencies":[{"issue_id":"bd-2997","depends_on_id":"bd-rbxi","type":"parent-child","created_at":"2025-11-06T18:19:14.968471-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-29c128e8","title":"Update AGENTS.md with event-driven mode","description":"Document BEADS_DAEMON_MODE env var. Explain opt-in during Phase 1. Add troubleshooting for watcher failures.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-28T16:20:02.433145-07:00","updated_at":"2025-12-14T16:43:57.317493-08:00","closed_at":"2025-10-29T15:53:24.019613-07:00"}
|
||
{"id":"bd-2au","title":"bd doctor: add SQLite integrity check (PRAGMA integrity_check)","description":"Add a database integrity check using SQLite's PRAGMA integrity_check to detect corruption. Currently bd doctor checks schema compatibility but not data integrity. This would help diagnose corrupted databases that pass schema checks but have internal inconsistencies.","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-12-02T12:52:17.5244-08:00","updated_at":"2025-12-07T01:24:31.628974-08:00","closed_at":"2025-12-07T01:24:31.628974-08:00"}
|
||
{"id":"bd-2b34","title":"Refactor cmd/bd/daemon.go for testability and maintainability","description":"","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-10-31T22:28:19.689943-07:00","updated_at":"2025-12-14T16:44:28.416915-08:00","closed_at":"2025-11-01T19:20:28.102847-07:00"}
|
||
{"id":"bd-2b34.1","title":"Extract daemon logger functions to daemon_logger.go","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-31T22:28:42.343617-07:00","updated_at":"2025-12-14T16:44:32.342161-08:00","closed_at":"2025-11-01T20:31:54.434039-07:00"}
|
||
{"id":"bd-2b34.2","title":"Extract daemon server functions to daemon_server.go","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-31T22:28:42.345639-07:00","updated_at":"2025-12-14T16:44:32.940407-08:00","closed_at":"2025-11-01T21:02:58.338168-07:00"}
|
||
{"id":"bd-2b34.3","title":"Extract daemon sync functions to daemon_sync.go","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-31T22:28:42.347332-07:00","updated_at":"2025-12-14T16:44:32.952886-08:00","closed_at":"2025-11-01T21:02:58.339737-07:00"}
|
||
{"id":"bd-2b34.4","title":"Extract daemon config functions to daemon_config.go","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-31T22:28:42.349237-07:00","updated_at":"2025-12-14T16:44:33.639445-08:00","closed_at":"2025-11-01T21:02:58.361676-07:00"}
|
||
{"id":"bd-2b34.5","title":"Add tests for daemon sync module","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-31T22:28:42.354701-07:00","updated_at":"2025-12-14T16:44:34.956326-08:00","closed_at":"2025-11-01T21:06:55.184844-07:00"}
|
||
{"id":"bd-2b34.6","title":"Add tests for daemon lifecycle module","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-31T22:28:42.359587-07:00","updated_at":"2025-12-14T16:44:35.586355-08:00","closed_at":"2025-11-01T21:22:39.009259-07:00"}
|
||
{"id":"bd-2b34.7","title":"Add tests for daemon config module","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-31T22:28:42.373684-07:00","updated_at":"2025-12-14T16:44:35.058142-08:00","closed_at":"2025-11-01T21:21:42.431252-07:00"}
|
||
{"id":"bd-2b34.8","title":"Extract daemon lifecycle functions to daemon_lifecycle.go","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-31T22:28:42.382892-07:00","updated_at":"2025-12-14T16:44:34.425043-08:00","closed_at":"2025-11-01T21:02:58.350055-07:00"}
|
||
{"id":"bd-2c5a","title":"Investigate why test issues persist in database","description":"**Summary:** Test suite accidentally created issues in production database due to incorrect database path handling during test runs. This led to database pollution and unnecessary test artifacts cluttering the main issue tracking system.\n\n**Key Decisions:**\n- Add `failIfProductionDatabase()` guard in test helpers\n- Implement `BEADS_TEST_MODE` environment flag\n- Create safety checks to prevent production database writes during testing\n\n**Resolution:** Implemented comprehensive test isolation mechanisms that prevent future accidental writes to production databases and automatically fail tests that attempt to do so.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-07T21:31:34.845887-08:00","updated_at":"2025-12-14T16:46:58.843071-08:00","closed_at":"2025-11-07T21:57:30.892086-08:00"}
|
||
{"id":"bd-2cvu","title":"Update AGENTS.md with Agent Mail workflow","description":"Update agent workflow section to include Agent Mail coordination as optional step.\n\nAcceptance Criteria:\n- Add Agent Mail to recommended workflow\n- Show both with/without examples\n- Update \"Multi-Agent Patterns\" section\n- Cross-reference to AGENT_MAIL.md\n\nFile: AGENTS.md (lines 468-475)","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-07T22:42:51.295729-08:00","updated_at":"2025-12-14T16:47:18.173544-08:00","closed_at":"2025-11-08T00:52:34.288915-08:00","dependencies":[{"issue_id":"bd-2cvu","depends_on_id":"bd-xzrv","type":"blocks","created_at":"2025-11-07T23:04:09.773656-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-2d5r","title":"Fix silent error handling in RPC response writing","description":"Marshal and write errors silently ignored in writeResponse, can send partial JSON and hang clients.\n\nLocation: internal/rpc/server_lifecycle_conn.go:228-232\n\nProblem:\n- json.Marshal error ignored - cyclic reference sends corrupt JSON\n- Write error ignored - connection closed, no indication to caller \n- WriteByte error ignored - client hangs waiting for newline\n- Flush error ignored - partial data buffered\n\nCurrent code:\nfunc (s *Server) writeResponse(writer *bufio.Writer, resp Response) {\n data, _ := json.Marshal(resp) // Ignored!\n _, _ = writer.Write(data) // Ignored!\n _ = writer.WriteByte('\\n') // Ignored!\n _ = writer.Flush() // Ignored!\n}\n\nSolution: Return errors, handle in caller, close connection on error\n\nImpact: Client hangs waiting for response; corrupt JSON sent\n\nEffort: 1 hour","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-16T14:51:47.002242-08:00","updated_at":"2025-11-16T15:04:00.481507-08:00","closed_at":"2025-11-16T15:04:00.481507-08:00"}
|
||
{"id":"bd-2e0","title":"Add TTL to deletions manifest entries","description":"Deletions manifest entries should have a TTL (time-to-live) to automatically expire after a certain period. Stale deletion entries can poison beads installations when an agent gets out of sync, causing issues to remain deleted even when they shouldn't be. Adding expiration would limit the blast radius of stale deletions.","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-12-03T17:40:59.994296-08:00","updated_at":"2025-12-13T08:15:21.910699+11:00","closed_at":"2025-12-03T22:16:32.419289-08:00"}
|
||
{"id":"bd-2e80","title":"Document shared memory test isolation pattern in test_helpers.go","description":"Tests were failing because :memory: creates a shared database across all tests. The fix is to use \"file::memory:?mode=memory\u0026cache=private\" for test isolation.\n\nShould document this pattern in test_helpers.go and potentially update newTestStore to use private memory by default.","status":"closed","priority":3,"issue_type":"chore","created_at":"2025-11-01T22:40:58.993496-07:00","updated_at":"2025-12-14T16:44:55.944669-08:00","closed_at":"2025-11-02T16:40:27.354654-08:00"}
|
||
{"id":"bd-2e94","title":"Support --parent flag in daemon mode","description":"Added support for hierarchical child issue creation using --parent flag in daemon mode. Previously only worked in direct mode.","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-11-05T13:55:47.415771-08:00","updated_at":"2025-12-14T16:45:54.223205-08:00","closed_at":"2025-11-05T13:55:53.252342-08:00"}
|
||
{"id":"bd-2em","title":"Expand checkHooksQuick to verify all hook versions","description":"Currently checkHooksQuick only checks post-merge hook version. Should also check pre-commit, pre-push, and post-checkout for completeness. Keep it lightweight but catch more outdated hooks.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-25T19:27:47.432243-08:00","updated_at":"2025-11-25T19:50:21.378464-08:00","closed_at":"2025-11-25T19:50:21.378464-08:00"}
|
||
{"id":"bd-2f388ca7","title":"Fix TestTwoCloneCollision timeout","description":"","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-10-28T14:11:25.219607-07:00","updated_at":"2025-12-14T16:43:55.494771-08:00","closed_at":"2025-10-28T16:12:26.286611-07:00"}
|
||
{"id":"bd-2ifg","title":"bd-hv01: Silent partial deletion failures cause DB inconsistency","description":"**Summary:** Silent deletion errors in deletion tracking were causing database inconsistencies. A comprehensive error handling approach was implemented to prevent partial or untracked deletions.\n\n**Key Decisions:** \n- Collect all deletion errors\n- Stop operation on any deletion failure\n- Add contextual error wrapping\n\n**Resolution:** Database deletion process now fails explicitly to prevent silent data corruption and ensure full transactional integrity.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-06T18:16:19.465137-08:00","updated_at":"2025-12-14T16:46:14.006454-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":"open","priority":3,"issue_type":"task","created_at":"2025-12-14T16:31:58.800071-08:00","updated_at":"2025-12-14T16:31:58.800071-08:00"}
|
||
{"id":"bd-2kf8","title":"Document CompactedResult response format in CONTEXT_ENGINEERING.md","description":"The CompactedResult is a new response format that MCP clients need to understand, but it's not documented in CONTEXT_ENGINEERING.md.\n\n## What's Missing\n- Example CompactedResult JSON response\n- How to detect if a result is compacted\n- How to request full results (disable compaction or increase limit)\n- Guidance on handling both list[IssueMinimal] and CompactedResult return types\n- Migration guide for clients expecting list[Issue] from ready() and list()\n\n## Documentation Gaps\nCurrently CONTEXT_ENGINEERING.md explains the optimization strategy but doesn't show:\n1. Sample CompactedResult response\n2. Client-side code examples for handling compaction\n3. When compaction is triggered (\u003e20 results)\n4. How to get all results if needed\n\n## Suggested Additions\nAdd new section \\\"Handling Large Result Sets\\\" with:\n- CompactedResult schema documentation\n- Python client example for handling both response types\n- Guidance on re-issuing queries with better filters","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-14T14:24:45.216616-08:00","updated_at":"2025-12-14T14:37:15.205803-08:00","closed_at":"2025-12-14T14:37:15.205803-08:00","dependencies":[{"issue_id":"bd-2kf8","depends_on_id":"bd-otf4","type":"discovered-from","created_at":"2025-12-14T14:24:45.217962-08:00","created_by":"stevey"}]}
|
||
{"id":"bd-2ku7","title":"Test integration issue","description":"This is a real integration test","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-07T19:07:11.528577-08:00","updated_at":"2025-12-14T16:46:55.036346-08:00","closed_at":"2025-11-07T21:55:09.426381-08:00"}
|
||
{"id":"bd-2m7","title":"Design tombstone storage format","description":"Define the JSON schema for tombstone records. Options: minimal (id, deleted_at, deleted_by, expires_at) vs full preservation (keep all original fields). Trade-offs: storage size vs audit trail. Consider: should tombstones be distinguishable from regular issues by status field or separate record type?","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-05T13:43:20.384642-08:00","updated_at":"2025-12-05T15:00:18.61323-08:00","closed_at":"2025-12-05T15:00:18.61323-08:00"}
|
||
{"id":"bd-2o2","title":"Add cancellation and timeout tests","description":"Add comprehensive tests for context cancellation and timeout behavior.\n\n## Context\nPart of context propagation work. Validates that bd-rtp and bd-yb8 work correctly.\n\n## Test Coverage Needed\n\n### 1. Cancellation Tests\n- [ ] Import operation cancelled mid-stream\n- [ ] Export operation cancelled mid-stream \n- [ ] Database query cancelled during long operation\n- [ ] No corruption after cancellation\n- [ ] Proper cleanup (defers execute, connections closed)\n\n### 2. Timeout Tests\n- [ ] Operations respect context deadlines\n- [ ] Appropriate error messages on timeout\n- [ ] State remains consistent after timeout\n\n### 3. Signal Handling Tests\n- [ ] SIGINT (Ctrl+C) triggers cancellation\n- [ ] SIGTERM triggers graceful shutdown\n- [ ] Multiple signals handled correctly\n\n## Implementation Approach\n```go\nfunc TestImportCancellation(t *testing.T) {\n ctx, cancel := context.WithCancel(context.Background())\n \n // Start import in goroutine\n go func() {\n err := runImport(ctx, largeFile)\n assert.Error(err, context.Canceled)\n }()\n \n // Cancel after short delay\n time.Sleep(100 * time.Millisecond)\n cancel()\n \n // Verify database integrity\n assertDatabaseConsistent(t, store)\n}\n```\n\n## Files to Create/Update\n- cmd/bd/import_test.go - cancellation tests\n- cmd/bd/export_test.go - cancellation tests\n- internal/storage/sqlite/*_test.go - context timeout tests\n\n## Acceptance Criteria\n- [ ] All critical operations have cancellation tests\n- [ ] Tests verify database integrity after cancellation\n- [ ] Signal handling tested (if feasible)\n- [ ] Test coverage \u003e80% for context paths","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-20T21:27:22.854636-05:00","updated_at":"2025-11-20T21:40:25.882758-05:00","closed_at":"2025-11-20T21:40:25.882758-05:00","dependencies":[{"issue_id":"bd-2o2","depends_on_id":"bd-yb8","type":"blocks","created_at":"2025-11-20T21:27:22.855574-05:00","created_by":"daemon"}]}
|
||
{"id":"bd-2q6d","title":"Beads commands operate on stale database without warning","description":"All beads read operations should validate database is in sync with JSONL before proceeding.\n\n**Current Behavior:**\n- Commands can query/read from stale database\n- Only mutation operations (like 'bd sync') check if JSONL is newer\n- User gets incorrect results without realizing database is out of sync\n\n**Expected Behavior:**\n- All beads commands should have pre-flight check for database freshness\n- If JSONL is newer than database, refuse to operate with error: \"Database out of sync. Run 'bd import' first.\"\n- Same safety check that exists for 'bd sync' should apply to ALL operations\n\n**Impact:**\n- Users make decisions based on incomplete/outdated data\n- Silent failures lead to confusion (e.g., thinking issues don't exist when they do)\n- Similar to running git commands on stale repo without being warned to pull\n\n**Example:**\n- Searched for bd-g9eu issue file: not found\n- Issue exists in .beads/issues.jsonl (in git)\n- Database was stale, but no warning was given\n- Led to incorrect conclusion that issue was already closed/deleted","notes":"## Implementation Complete\n\n**Phase 1: Created staleness check (cmd/bd/staleness.go)**\n- ensureDatabaseFresh() function checks JSONL mtime vs last_import_time\n- Returns error with helpful message when database is stale\n- Auto-skips in daemon mode (daemon has auto-import)\n\n**Phase 2: Added to all read commands**\n- list, show, ready, status, stale, info, duplicates, validate\n- Check runs before database queries in direct mode\n- Daemon mode already protected via checkAndAutoImportIfStale()\n\n**Phase 3: Code Review Findings**\nSee follow-up issues:\n- bd-XXXX: Add warning when staleness check errors\n- bd-YYYY: Improve CheckStaleness error handling\n- bd-ZZZZ: Refactor redundant daemon checks (low priority)\n\n**Testing:**\n- Build successful: go build ./cmd/bd\n- Binary works: ./bd --version\n- Ready for manual testing\n\n**Next Steps:**\n1. Test with stale database scenario\n2. Implement review improvements\n3. Close issue when tests pass","status":"open","priority":1,"issue_type":"bug","created_at":"2025-11-20T19:33:40.019297-05:00","updated_at":"2025-11-22T14:57:44.481917204-05:00"}
|
||
{"id":"bd-2r1b","title":"fix: bd onboard hangs on Windows","description":"","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-13T18:08:26.673076-08:00","updated_at":"2025-12-13T18:08:32.309879-08:00","closed_at":"2025-12-13T18:08:32.309879-08:00"}
|
||
{"id":"bd-2rfr","title":"GH#505: Add bd reset command to wipe database","description":"Users struggle to fully reset beads (local + remote). Need bd reset command with safety confirmation. Currently requires manual hook/dir removal. See: https://github.com/steveyegge/beads/issues/505","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-14T16:32:02.919494-08:00","updated_at":"2025-12-14T16:32:02.919494-08:00"}
|
||
{"id":"bd-3","title":"Investigate and upgrade to modernc.org/sqlite 1.39.1+","description":"**Summary:** SQLite upgrade (modernc.org/sqlite) blocked by FOREIGN KEY constraint regression in v1.39.1. Team temporarily pinned to v1.38.2 while investigating daemon-specific FK constraint failures.\n\n**Key Decisions:**\n- Rollback to SQLite 3.49.x (v1.38.2)\n- Defer upgrade pending further investigation\n- Monitor upstream releases for potential fixes\n\n**Resolution:** Issue remains open, with package version locked at v1.38.2 until root cause of FK constraint discrepancy between CLI and daemon modes can be definitively determined.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-07T09:43:47.856354-08:00","updated_at":"2025-12-14T16:46:43.643924-08:00","closed_at":"2025-11-07T15:06:26.240131-08:00"}
|
||
{"id":"bd-307","title":"Multi-repo hydration layer","description":"Build core infrastructure to hydrate database from N repos (N≥1), with smart caching via file mtime tracking and routing writes to correct JSONL based on source_repo metadata.","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-04T11:21:30.655765-08:00","updated_at":"2025-12-14T16:45:24.537201-08:00","closed_at":"2025-11-05T00:08:42.811879-08:00","dependencies":[{"issue_id":"bd-307","depends_on_id":"bd-4ms","type":"parent-child","created_at":"2025-11-04T11:22:21.823652-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-317ddbbf","title":"Add BEADS_DAEMON_MODE flag handling","description":"Add environment variable BEADS_DAEMON_MODE (values: poll, events). Default to 'poll' for Phase 1. Wire into daemon startup to select runEventLoop vs runEventDrivenLoop.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-28T16:20:02.433638-07:00","updated_at":"2025-12-14T16:43:49.663672-08:00","closed_at":"2025-10-28T12:31:47.819136-07:00"}
|
||
{"id":"bd-31aab707","title":"Unit tests for FileWatcher","description":"Test watcher detects JSONL changes. Test git ref changes trigger import. Test debounce integration. Test watcher recovery from file removal/rename.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T11:30:59.842317-07:00","updated_at":"2025-12-14T16:44:06.071421-08:00","closed_at":"2025-10-31T12:00:43.189591-07:00"}
|
||
{"id":"bd-325da116","title":"Fix N-way collision convergence","description":"**Summary:** Addressed N-way collision convergence in clone synchronization by reimagining resolution strategy from pairwise to global, deterministic approach. Identified core issues in existing collision detection mechanism that prevented reliable multi-clone content synchronization.\n\n**Key Decisions:**\n- Use content-addressable identity via hashing\n- Implement read-only detection phase\n- Prioritize global resolution over local modifications\n- Enable idempotent imports\n\n**Resolution:** Developed a robust collision resolution framework ensuring consistent content across multiple clones with no data loss, validated through comprehensive multi-clone testing.","status":"closed","priority":0,"issue_type":"epic","created_at":"2025-10-29T23:05:13.889079-07:00","updated_at":"2025-12-14T16:43:42.060156-08:00","closed_at":"2025-10-31T11:59:41.031668-07:00"}
|
||
{"id":"bd-32nm","title":"Auto-configure git merge driver during `bd init`","description":"Enhance `bd init` to optionally set up beads-merge as git merge driver.\n\n**Tasks**:\n- Prompt user to install git merge driver\n- Configure `.git/config`: `merge.beads.driver \"bd merge %A %O %L %R\"`\n- Create/update `.gitattributes`: `.beads/beads.jsonl merge=beads`\n- Add `--skip-merge-driver` flag for non-interactive use\n- Update AGENTS.md onboarding section\n\n**Files**:\n- `cmd/bd/init.go`\n- `.gitattributes` template","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-05T18:42:20.447682-08:00","updated_at":"2025-12-14T16:46:06.898964-08:00","closed_at":"2025-11-05T19:27:18.370494-08:00","dependencies":[{"issue_id":"bd-32nm","depends_on_id":"bd-qqvw","type":"parent-child","created_at":"2025-11-05T18:42:28.723517-08:00","created_by":"daemon"},{"issue_id":"bd-32nm","depends_on_id":"bd-omx1","type":"blocks","created_at":"2025-11-05T18:42:35.453823-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-3396","title":"Add merge helper commands (bd sync --merge)","description":"Add commands to merge beads branch back to main.\n\nTasks:\n- Implement bd sync --merge command\n- Implement bd sync --status command\n- Implement bd sync --auto-merge (optional, for automation)\n- Detect merge conflicts and provide guidance\n- Show commit diff between branches\n- Verify main branch is clean before merge\n- Push merged changes to remote\n\nEstimated effort: 2-3 days","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-02T15:22:35.580873-08:00","updated_at":"2025-12-14T16:44:59.790848-08:00","closed_at":"2025-11-02T17:12:34.620486-08:00","dependencies":[{"issue_id":"bd-3396","depends_on_id":"bd-a101","type":"parent-child","created_at":"2025-11-02T15:22:48.376916-08:00","created_by":"stevey"}]}
|
||
{"id":"bd-3433","title":"Implement topological sort for import ordering","description":"Refactor upsertIssues() to sort issues by hierarchy depth before batch creation. Ensures parents are created before children, fixing latent bug where parent-child pairs in same batch can fail if ordered wrong. Sort by dot count, create in depth-order batches (0→1→2→3).","status":"closed","priority":0,"issue_type":"task","created_at":"2025-11-04T12:31:42.22005-08:00","updated_at":"2025-12-14T16:45:25.123626-08:00","closed_at":"2025-11-05T00:08:42.812156-08:00"}
|
||
{"id":"bd-35c7","title":"Add label-based filtering to bd ready command","description":"Allow filtering ready work by labels to help organize work by sprint, week, or category.\n\nExample usage:\n bd ready --label week1-2\n bd ready --label frontend,high-priority\n\nThis helps teams organize work into batches and makes it easier for agents to focus on specific categories of work.\n\nImplementation notes:\n- Add --label flag to ready command\n- Support comma-separated labels (AND logic)\n- Should work with existing ready work logic (unblocked issues)","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-11-03T18:10:18.976536-08:00","updated_at":"2025-12-14T16:45:12.965953-08:00","closed_at":"2025-11-03T22:27:30.614911-08:00"}
|
||
{"id":"bd-35o","title":"Add --yes flag to bd doctor --fix","description":"bd doctor --fix prompts for confirmation, which blocks automation (CI/CD, scripts, hooks).\n\nRequirements:\n1. Add --yes or -y flag to bd doctor command\n2. When --yes is passed, skip confirmation prompts\n3. Still log what's being fixed (don't go completely silent)","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-30T21:14:08.696905-08:00","updated_at":"2025-11-30T21:14:49.867041-08:00","closed_at":"2025-11-30T21:14:49.867041-08:00"}
|
||
{"id":"bd-36320a04","title":"Add mutation channel to internal/rpc/server.go","description":"Add mutationChan chan MutationEvent to Server struct. Emit events on CreateIssue, UpdateIssue, DeleteIssue, AddComment. Non-blocking send with default case for full channel.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T19:42:29.860173-07:00","updated_at":"2025-12-14T16:44:18.047033-08:00","closed_at":"2025-10-31T18:31:27.928693-07:00"}
|
||
{"id":"bd-363f","title":"Document bd-wasm installation and usage","description":"Create documentation for bd-wasm:\n- Update README with npm installation instructions\n- Add troubleshooting section for WASM-specific issues\n- Document known limitations vs native bd\n- Add examples for Claude Code Web sandbox usage\n- Update INSTALLING.md with bd-wasm option","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-02T21:58:07.305711-08:00","updated_at":"2025-12-14T16:45:42.766149-08:00","closed_at":"2025-11-05T00:55:48.756687-08:00","dependencies":[{"issue_id":"bd-363f","depends_on_id":"bd-44d0","type":"parent-child","created_at":"2025-11-02T22:23:49.530675-08:00","created_by":"stevey"}]}
|
||
{"id":"bd-36870264","title":"Enforce daemon singleton per workspace with file locking","description":"**Summary:** Resolved daemon singleton vulnerability by implementing robust path canonicalization to prevent infinite directory recursion. Implemented safeguards to detect and block multiple daemon processes in the same workspace.\n\n**Key Decisions:**\n- Normalize paths using filepath.Abs() and filepath.EvalSymlinks()\n- Detect nested directory conflicts\n- Provide clear user error messaging\n\n**Resolution:** Daemon lock mechanism now securely prevents simultaneous daemon instances, eliminating path resolution vulnerabilities.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-10-25T23:13:12.269549-07:00","updated_at":"2025-12-14T16:44:27.892642-08:00","closed_at":"2025-11-01T19:46:06.230339-07:00"}
|
||
{"id":"bd-373c","title":"Daemon crashes silently when multiple .db files exist in .beads/","description":"**Summary:** Silent daemon crashes from multiple .db files were resolved by implementing an error detection and reporting mechanism. A new .beads/daemon-error file now captures diagnostic information for user visibility.\n\n**Key Decisions:**\n- Create error file on multiple database detection\n- Surface error in daemon list and auto-start processes\n- Enable clear diagnostic reporting\n\n**Resolution:** Daemon now provides explicit error messaging, preventing silent failures and improving user troubleshooting capabilities.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-10-31T21:08:03.389259-07:00","updated_at":"2025-12-14T16:44:24.809483-08:00","closed_at":"2025-11-01T11:13:48.029427-07:00","dependencies":[{"issue_id":"bd-373c","depends_on_id":"bd-2752a7a2","type":"discovered-from","created_at":"2025-10-31T21:08:03.390022-07:00","created_by":"stevey"}]}
|
||
{"id":"bd-374e","title":"WASM integration testing","description":"Comprehensive testing of WASM build. Child of epic bd-44d0.\n\n## Tasks\n- [ ] Unit tests for WASM module\n- [ ] Integration tests with real JSONL files\n- [ ] Test all bd commands for parity\n- [ ] Performance benchmarks\n- [ ] Test in actual Claude Code Web sandbox\n- [ ] Document any limitations\n\n## Test Coverage Target\n- \u003e90% of bd CLI commands work identically","status":"closed","priority":0,"issue_type":"task","created_at":"2025-11-02T18:33:31.342184-08:00","updated_at":"2025-12-14T16:45:43.189991-08:00","closed_at":"2025-11-05T00:55:48.756996-08:00","dependencies":[{"issue_id":"bd-374e","depends_on_id":"bd-197b","type":"blocks","created_at":"2025-11-02T18:33:31.342928-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-379","title":"Implement `bd setup cursor` for Cursor IDE integration","description":"Create a `bd setup cursor` command that integrates Beads workflow into Cursor IDE via .cursorrules file. Unlike Claude Code (which has hooks), Cursor uses a static rules file to provide context to its AI.","status":"open","priority":3,"issue_type":"feature","created_at":"2025-11-11T23:32:22.170083-08:00","updated_at":"2025-11-11T23:32:22.170083-08:00"}
|
||
{"id":"bd-37dd","title":"Add topological sort utility functions","description":"Create internal/importer/sort.go with utilities for depth-based sorting of issues. Functions: GetHierarchyDepth(id), SortByDepth(issues), GroupByDepth(issues). Include stable sorting for same-depth issues.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-04T12:31:42.309207-08:00","updated_at":"2025-12-14T16:45:26.487855-08:00","closed_at":"2025-11-05T00:08:42.81238-08:00"}
|
||
{"id":"bd-381d7f6c","title":"Audit Current Cache Usage","description":"Understand exactly what code depends on the storage cache","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-27T23:01:15.172045-07:00","updated_at":"2025-12-14T16:43:46.365756-08:00","closed_at":"2025-10-28T10:47:37.87529-07:00"}
|
||
{"id":"bd-3852","title":"Add orphan detection migration","description":"Create migration to detect orphaned children in existing databases. Query: SELECT id FROM issues WHERE id LIKE '%.%' AND substr(id, 1, instr(id || '.', '.') - 1) NOT IN (SELECT id FROM issues). Log results, let user decide action (delete orphans or convert to top-level).","status":"open","priority":2,"issue_type":"task","created_at":"2025-11-04T12:32:30.727044-08:00","updated_at":"2025-11-04T12:32:30.727044-08:00"}
|
||
{"id":"bd-39o","title":"Rename last_import_hash metadata key to jsonl_content_hash","description":"The metadata key 'last_import_hash' is misleading because it's updated on both import AND export (sync.go:614, import.go:320).\n\nBetter names:\n- jsonl_content_hash (more accurate)\n- last_sync_hash (clearer intent)\n\nThis is a breaking change requiring migration of existing metadata values.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-20T21:31:07.568739-05:00","updated_at":"2025-12-09T18:38:37.675303471-05:00","closed_at":"2025-11-28T23:13:46.885978-08:00","dependencies":[{"issue_id":"bd-39o","depends_on_id":"bd-khnb","type":"blocks","created_at":"2025-11-20T21:31:07.5698-05:00","created_by":"daemon"}]}
|
||
{"id":"bd-3b2fe268","title":"Add fsnotify dependency to go.mod","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-28T16:20:02.429763-07:00","updated_at":"2025-12-14T16:46:27.155887-08:00","closed_at":"2025-11-06T19:27:34.921866-08:00"}
|
||
{"id":"bd-3b4","title":"Update bd delete to create tombstones","description":"Modify delete command to create tombstone records instead of (or in addition to) deletions.jsonl entries. Phase 1: dual-write mode. Per design bd-dli.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-05T15:14:42.71246-08:00","updated_at":"2025-12-05T16:19:21.718607-08:00","closed_at":"2025-12-05T16:19:21.718607-08:00","dependencies":[{"issue_id":"bd-3b4","depends_on_id":"bd-fbj","type":"blocks","created_at":"2025-12-05T15:14:58.858679-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-3b7f","title":"Add tests for extracted modules","description":"Create tests for migrations.go, hash_ids.go, batch_ops.go, and validators.go","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-01T19:28:54.88933-07:00","updated_at":"2025-12-14T16:44:40.96203-08:00","closed_at":"2025-11-01T23:32:00.722613-07:00"}
|
||
{"id":"bd-3bg","title":"Add performance optimization to hasJSONLChanged with mtime fast-path","description":"hasJSONLChanged() reads entire JSONL file to compute SHA256 hash on every check. For large databases (50MB+), this is expensive and called frequently by daemon.\n\nOptimization: Check mtime first as fast-path. Only compute hash if mtime changed. This catches git operations (mtime changes but content doesn't) while avoiding expensive hash computation in common case (mtime unchanged = content unchanged).\n\nPerformance impact: 99% of checks will use fast path, only git operations need slow path.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-20T21:31:04.577264-05:00","updated_at":"2025-11-20T21:33:31.499918-05:00","closed_at":"2025-11-20T21:33:31.499918-05:00","dependencies":[{"issue_id":"bd-3bg","depends_on_id":"bd-khnb","type":"blocks","created_at":"2025-11-20T21:31:04.578768-05:00","created_by":"daemon"}]}
|
||
{"id":"bd-3d844c58","title":"Implement content-hash based collision resolution for deterministic convergence","description":"**Summary:** Resolved non-deterministic issue tracking collision by replacing timestamp-based resolution with content-hash comparison. This ensures consistent issue mapping across distributed clone scenarios.\n\n**Key Decisions:** \n- Use content hash (title + description + priority + type)\n- Select issue with lowest hash value\n- Implement in ScoreCollisions function\n\n**Resolution:** Implemented deterministic, platform-independent collision resolution that guarantees identical issue tracking across multiple synchronization events.","status":"closed","priority":0,"issue_type":"task","created_at":"2025-10-28T17:04:06.145646-07:00","updated_at":"2025-12-14T16:43:29.136284-08:00","closed_at":"2025-10-28T19:20:09.943023-07:00","dependencies":[{"issue_id":"bd-3d844c58","depends_on_id":"bd-71107098","type":"blocks","created_at":"2025-10-31T19:38:09.203365-07:00","created_by":"stevey"}]}
|
||
{"id":"bd-3e307cd4","title":"File change test issue","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-29T19:11:28.425601-07:00","updated_at":"2025-12-14T16:43:59.475552-08:00","closed_at":"2025-10-31T12:00:43.176605-07:00"}
|
||
{"id":"bd-3e3b","title":"Add circular dependency detection to bd doctor","description":"Added cycle detection as Check #10 in bd doctor command. Uses same recursive CTE query as DetectCycles() to find circular dependencies. Reports error status with count and fix suggestion if cycles found.","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-11-01T20:18:23.416056-07:00","updated_at":"2025-12-14T16:44:30.913838-08:00","closed_at":"2025-11-01T20:18:26.76113-07:00"}
|
||
{"id":"bd-3e9ddc31","title":"Replace getStorageForRequest with Direct Access","description":"Replace all getStorageForRequest(req) calls with s.storage","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-27T23:20:10.393759-07:00","updated_at":"2025-12-14T16:43:54.377884-08:00","closed_at":"2025-10-28T14:08:38.06721-07:00"}
|
||
{"id":"bd-3ee1","title":"Sync sanitize incorrectly removes newly created issues","description":"## Problem\n\nThe sync sanitize process incorrectly identifies newly created issues as 'deleted issues resurrected by git merge' and removes them from the local JSONL file.\n\n## Reproduction\n\n1. Create a new issue: bd create --title='Test issue'\n2. Run bd sync\n3. Observe: New issue appears in sanitize removal list\n4. Issue is removed from local JSONL but preserved on beads-sync branch\n\n## Observed Behavior\n\nDuring sync, the sanitize step outputs:\n```\n→ Sanitized JSONL: removed 738 deleted issue(s) that were resurrected by git merge\n - bd-08ea (newly created issue!)\n - bd-tnsq (newly created issue!)\n ...\n```\n\nThe newly created issues get removed locally but remain on beads-sync branch.\n\n## Expected Behavior\n\nNewly created issues should NOT be removed by sanitize. The sanitize should only remove issues that:\n1. Were previously deleted (have tombstones or are in deletions manifest)\n2. Are being resurrected from old git history\n\n## Root Cause Investigation\n\nThe sanitize logic likely compares the local DB snapshot against some reference and incorrectly classifies new issues as 'resurrected deleted issues'. Possible causes:\n- Snapshot protection logic not accounting for new issues\n- Deletion manifest containing stale entries\n- Race condition between export and sanitize\n\n## Impact\n\n- New issues disappear from local JSONL after sync\n- Issues remain on beads-sync but cause confusion\n- Multi-agent workflows affected when agents can't see new issues locally\n- Requires manual intervention to recover\n\n## Files to Investigate\n\n- cmd/bd/sync.go - sanitize logic\n- cmd/bd/snapshot_manager.go - snapshot comparison\n- Deletion manifest handling\n\n## Acceptance Criteria\n\n- [ ] Newly created issues survive sync without being sanitized\n- [ ] Only truly deleted/resurrected issues are removed\n- [ ] Add test case for this scenario","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-14T00:45:26.828547-08:00","updated_at":"2025-12-14T00:54:44.772671-08:00","closed_at":"2025-12-14T00:54:44.772671-08:00"}
|
||
{"id":"bd-3ee2c7e9","title":"Add \"bd daemons\" command for multi-daemon management","description":"Add a new \"bd daemons\" command with subcommands to manage daemon processes across all beads repositories/worktrees. Should show all running daemons with metadata (version, workspace, uptime, last sync), allow stopping/restarting individual daemons, auto-clean stale processes, view logs, and show exclusive lock status.","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-10-26T16:53:40.970042-07:00","updated_at":"2025-12-14T16:45:00.55611-08:00","closed_at":"2025-11-02T17:12:34.62102-08:00"}
|
||
{"id":"bd-3f6a","title":"Add concurrent import race condition tests","description":"Currently no tests verify behavior when multiple clones import simultaneously with external_ref matching.\n\nScenarios to test:\n1. Two clones import same external_ref update at same time\n2. Clone A imports while Clone B updates same issue\n3. Verify transaction isolation prevents corruption\n4. Document expected behavior (last-write-wins vs timestamp-based)\n\nRelated: bd-1022\nFiles: internal/importer/external_ref_test.go","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-02T15:32:11.286956-08:00","updated_at":"2025-12-14T16:44:57.397485-08:00","closed_at":"2025-11-02T17:08:52.04234-08:00"}
|
||
{"id":"bd-3f80d9e0","title":"Improve internal/daemon test coverage (currently 22.5%)","description":"Daemon functionality needs better coverage:\n- Auto-start behavior\n- Lock file management\n- Discovery mechanisms\n- Connection handling\n- Error recovery\n\nCurrent coverage: 58.3% (improved from 22.5% as of Nov 2025)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-29T14:06:30.832728-07:00","updated_at":"2025-12-13T18:00:31.06557-08:00","closed_at":"2025-11-15T14:13:47.303529-08:00"}
|
||
{"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-3s8","title":"Imperator clone on beads-sync branch causes bd sync failures","description":"","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-30T22:53:51.056763-08:00","updated_at":"2025-12-02T23:28:48.751447-08:00","closed_at":"2025-12-02T18:05:16.968092-08:00"}
|
||
{"id":"bd-3sz0","title":"Auto-repair stale merge driver configs with invalid placeholders","description":"Old bd versions (\u003c0.24.0) installed merge driver with invalid placeholders %L %R instead of %A %B. Add detection to bd doctor --fix: check if git config merge.beads.driver contains %L or %R, auto-repair to 'bd merge %A %O %A %B'. One-time migration for users who initialized with old versions.","status":"open","priority":2,"issue_type":"feature","created_at":"2025-11-21T23:16:10.762808-08:00","updated_at":"2025-11-21T23:16:28.892655-08:00","dependencies":[{"issue_id":"bd-3sz0","depends_on_id":"bd-tbz3","type":"parent-child","created_at":"2025-11-21T23:16:10.763612-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-3tfh","title":"Benchmark Helper Functions","description":"**Summary:** Extended benchmark helper functions in SQLite testing to create larger database fixtures for performance testing. Added setupLargeBenchDB() and setupXLargeBenchDB() to generate 10K and 20K issue databases consistently.\n\n**Key Decisions:** \n- Use build tag //go:build bench\n- Leverage existing fixture generator\n- Keep consistent with current setupBenchDB() pattern\n\n**Resolution:** New benchmark helpers reduce test code duplication and provide standardized large-scale database setup for performance testing.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-13T22:22:55.694834-08:00","updated_at":"2025-12-14T16:47:53.117461-08:00","closed_at":"2025-11-13T23:13:41.244758-08:00","dependencies":[{"issue_id":"bd-3tfh","depends_on_id":"bd-m62x","type":"blocks","created_at":"2025-11-13T22:24:02.632994-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-3xl","title":"bd doctor: per-fix confirmation mode","description":"Add an interactive mode where users can approve/reject each fix individually rather than all-or-nothing. Currently --fix prompts once for all fixes. This would give users more control over which repairs to apply, especially useful when some fixes may have side effects.","status":"closed","priority":4,"issue_type":"feature","created_at":"2025-12-02T12:52:38.137201-08:00","updated_at":"2025-12-13T08:15:21.911204+11:00","closed_at":"2025-12-03T22:17:11.405848-08:00"}
|
||
{"id":"bd-40a0","title":"bd doctor should check for multiple DBs, multiple JSONLs, daemon health","description":"","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-10-31T21:16:47.042913-07:00","updated_at":"2025-12-14T16:44:20.497048-08:00","closed_at":"2025-10-31T21:21:27.093525-07: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-12-14T16:45:03.746157-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":"**Summary:** Attempted WASM port of bd CLI for Claude Code Web sandboxes to simplify installation. Aimed to create a cross-platform npm package with full functionality.\n\n**Key Decisions:** \n- Use GOOS=js GOARCH=wasm\n- Use modernc.org/sqlite for WASM support\n\n**Resolution:** Project canceled after discovering Claude Code Web supports full VMs, making WASM approach unnecessary.","status":"closed","priority":0,"issue_type":"epic","created_at":"2025-11-02T18:32:27.660794-08:00","updated_at":"2025-12-14T16:45:05.171876-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-46381404","title":"Test database naming","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-27T18:27:28.309676-07:00","updated_at":"2025-12-14T16:44:03.479648-08:00","closed_at":"2025-10-31T12:00:43.185201-07: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":"open","priority":2,"issue_type":"feature","created_at":"2025-12-13T06:34:45.080633-08:00","updated_at":"2025-12-13T06:34:52.983085-08:00"}
|
||
{"id":"bd-49kw","title":"Workaround for FastMCP outputSchema bug in Claude Code","description":"The beads MCP server (v0.23.1) successfully connects to Claude Code, but all tools fail to load with a schema validation error due to a bug in FastMCP 2.13.1.\n\nError: \"Invalid literal value, expected \\\"object\\\"\" in outputSchema.\n\nRoot Cause: FastMCP generates outputSchema with $ref at root level without \"type\": \"object\" for self-referential models (Issue).\n\nWorkaround: Use slash commands (/beads:ready) or wait for FastMCP fix.\n","status":"open","priority":1,"issue_type":"bug","created_at":"2025-11-20T18:55:39.041831-05:00","updated_at":"2025-11-20T18:55:39.041831-05:00"}
|
||
{"id":"bd-4aao","title":"Fix failing integration tests in beads-mcp","description":"The `beads-mcp` test suite has failures in `tests/test_bd_client_integration.py` (assertion error in `test_init_creates_beads_directory`) and errors in `tests/test_worktree_separate_dbs.py` (setup failures finding database). These need to be investigated and fixed to ensure a reliable CI baseline.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-20T18:53:28.4803-05:00","updated_at":"2025-12-09T18:38:37.676638171-05:00","closed_at":"2025-11-25T21:39:20.967106-08:00"}
|
||
{"id":"bd-4aeed709","title":"bd resolve-conflicts - Git merge conflict resolver","description":"Automatically resolve JSONL merge conflicts.\n\nModes:\n- Mechanical: ID remapping (no AI)\n- AI-assisted: Smart merge/keep decisions\n- Interactive: Review each conflict\n\nHandles \u003c\u003c\u003c\u003c\u003c\u003c\u003c conflict markers in .beads/beads.jsonl\n\nFiles: cmd/bd/resolve_conflicts.go (new)","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-28T14:48:17.457619-07:00","updated_at":"2025-12-14T16:43:53.815099-08:00","closed_at":"2025-10-28T15:47:33.037021-07:00"}
|
||
{"id":"bd-4b6u","title":"Update docs with multi-repo patterns","description":"Update AGENTS.md, README.md, QUICKSTART.md with multi-repo patterns. Document: config options, routing behavior, backward compatibility, troubleshooting, best practices.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-05T18:04:30.18358-08:00","updated_at":"2025-12-14T16:46:33.170677-08:00","closed_at":"2025-11-06T19:53:04.721589-08:00","dependencies":[{"issue_id":"bd-4b6u","depends_on_id":"bd-8rd","type":"parent-child","created_at":"2025-11-05T18:04:39.297009-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-4ba5908b","title":"Implement content-hash based collision resolution for deterministic convergence","description":"**Summary:** Implemented content-hash based collision resolution to replace timestamp-dependent issue tracking, ensuring deterministic and consistent issue handling across distributed clones. This resolves non-deterministic renaming problems where simultaneous issue creation could lead to unpredictable mapping.\n\n**Key Decisions:**\n- Use content hash (title + description + priority + type) for collision resolution\n- Always keep issue with lower hash value\n- Modify ScoreCollisions method in storage layer\n- Make rename detection idempotent across platforms\n\n**Resolution:** Successfully achieved convergent issue tracking where multiple clones can now reliably synchronize and resolve naming conflicts without data corruption, with test cases demonstrating consistent cross-clone content mapping.","status":"closed","priority":0,"issue_type":"task","created_at":"2025-10-28T17:04:11.530026-07:00","updated_at":"2025-12-14T16:43:26.23138-08:00","closed_at":"2025-10-28T17:18:27.777019-07:00","dependencies":[{"issue_id":"bd-4ba5908b","depends_on_id":"bd-71107098","type":"blocks","created_at":"2025-10-28T17:04:18.149604-07:00","created_by":"daemon"}]}
|
||
{"id":"bd-4c18","title":"bd delete fails to find closed issues","description":"## Steps to Reproduce\n1. Close some issues with `bd close`\n2. Try to delete them with `bd delete \u003cids\u003e --force`\n3. Get error \"issues not found\"\n\n## Expected Behavior\nShould delete the closed issues\n\n## Actual Behavior\n```\nError: issues not found: bd-74ee, bd-9b13, bd-72w, bd-149, bd-5iv, bd-78w\n```\n\nBut `bd list --status closed --json` shows they exist.\n\n## Root Cause\nLikely the delete command is only looking for open issues, or there's a race condition with auto-import.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-03T20:57:31.763179-08:00","updated_at":"2025-12-14T16:45:10.832204-08:00","closed_at":"2025-11-03T21:31:18.677629-08:00"}
|
||
{"id":"bd-4cyb","title":"Test graceful degradation when server unavailable","description":"Verify that agents continue working normally when Agent Mail server is stopped or unreachable.\n\nAcceptance Criteria:\n- Agent detects server unavailable on startup\n- Logs \"falling back to Beads-only mode\"\n- All bd commands work normally\n- Agent can claim issues (no reservations, like today)\n- Git sync operates as normal\n- No errors or crashes\n\nSuccess Metric: Zero functional difference when Agent Mail unavailable","status":"closed","priority":0,"issue_type":"task","created_at":"2025-11-07T22:42:00.094481-08:00","updated_at":"2025-12-14T16:47:12.734949-08:00","closed_at":"2025-11-08T00:20:29.841174-08:00","dependencies":[{"issue_id":"bd-4cyb","depends_on_id":"bd-6hji","type":"blocks","created_at":"2025-11-07T23:03:53.054449-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-4d7fca8a","title":"Add tests for internal/utils package","description":"Currently 0.0% coverage. Need tests for utility functions including issue ID parsing and validation.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-29T14:06:24.066403-07:00","updated_at":"2025-12-14T16:47:41.077017-08:00","closed_at":"2025-11-08T17:57:28.956561-08:00","dependencies":[{"issue_id":"bd-4d7fca8a","depends_on_id":"bd-cbed9619.5","type":"blocks","created_at":"2025-10-29T19:52:05.52888-07:00","created_by":"import-remap"},{"issue_id":"bd-4d7fca8a","depends_on_id":"bd-cbed9619.4","type":"blocks","created_at":"2025-10-29T19:52:05.529565-07:00","created_by":"import-remap"},{"issue_id":"bd-4d7fca8a","depends_on_id":"bd-0dcea000","type":"blocks","created_at":"2025-10-29T19:52:05.529982-07:00","created_by":"import-remap"}]}
|
||
{"id":"bd-4d80b7b1","title":"Investigate and upgrade to modernc.org/sqlite 1.39.1+","description":"**Summary:** SQLite upgrade to v1.39.1 was blocked by a FOREIGN KEY constraint regression in daemon mode. The team identified a potential issue with FK enforcement and temporarily pinned to a stable version.\n\n**Key Decisions:**\n- Rollback to SQLite 3.49.x (v1.38.2)\n- Track upstream fixes and changelogs\n- Investigate daemon vs CLI behavioral difference\n\n**Resolution:** Version temporarily frozen at 1.38.2 pending further investigation and potential upstream patch.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-24T11:49:12.836292-07:00","updated_at":"2025-12-14T16:46:42.456733-08:00","closed_at":"2025-11-07T14:55:51.908404-08:00"}
|
||
{"id":"bd-4e21b5ad","title":"Add test case for symmetric collision (both clones create same ID simultaneously)","description":"TestTwoCloneCollision demonstrates the problem, but we need a simpler unit test for the collision resolver itself.\n\nTest should verify:\n- Two issues with same ID, different content\n- Content hash determines winner deterministically \n- Result is same regardless of which clone imports first\n- No title swapping occurs\n\nThis can be a simpler test than the full integration test.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T17:46:10.046999-07:00","updated_at":"2025-12-14T16:44:06.437375-08:00","closed_at":"2025-10-31T12:00:43.196705-07:00"}
|
||
{"id":"bd-4ec8","title":"Widespread double JSON encoding bug in daemon mode RPC calls","description":"Multiple CLI commands had the same double JSON encoding bug found in bd-1048. All commands that called ResolveID via RPC used string(resp.Data) instead of properly unmarshaling the JSON response. This caused IDs to retain JSON quotes (\"bd-1048\" instead of bd-1048), which then got double-encoded when passed to subsequent RPC calls.\n\nAffected commands:\n- bd show (3 instances)\n- bd dep add/remove/tree (5 instances)\n- bd label add/remove/list (3 instances)\n- bd reopen (1 instance)\n\nRoot cause: resp.Data is json.RawMessage (already JSON-encoded), so string() conversion preserves quotes.\n\nFix: Replace all string(resp.Data) with json.Unmarshal(resp.Data, \u0026id) for proper deserialization.\n\nAll commands now tested and working correctly with daemon mode.","status":"open","priority":0,"issue_type":"bug","created_at":"2025-11-02T22:33:01.632691-08:00","updated_at":"2025-11-02T22:33:01.632691-08:00"}
|
||
{"id":"bd-4ew","title":"bd doctor should detect fresh clone and recommend 'bd init'","description":"When running `bd doctor` on a fresh clone (JSONL exists, no .db file), it should:\n\n1. Detect this is a fresh clone situation\n2. Recommend `bd init --prefix \u003cdetected-prefix\u003e` as the fix\n3. Show the prefix detected from the JSONL file\n\nCurrently it shows various warnings (git hooks, merge driver, etc.) but doesn't address the fundamental issue: the database needs to be hydrated.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-27T20:21:15.691764-08:00","updated_at":"2025-12-02T17:11:19.731628399-05:00","closed_at":"2025-11-28T22:14:49.092112-08:00"}
|
||
{"id":"bd-4f582ec8","title":"Test auto-start in fred","description":"","status":"closed","priority":3,"issue_type":"task","created_at":"2025-10-30T17:46:16.668088-07:00","updated_at":"2025-12-14T16:44:04.68314-08:00","closed_at":"2025-10-31T12:00:43.185723-07:00"}
|
||
{"id":"bd-4ff2","title":"Fix CI failures before 0.21.3 release","description":"CI is failing on multiple jobs:\n1. Nix flake: Tests fail due to missing git in build environment\n2. Windows tests: Need to check what's failing\n3. Linux tests: Need to check what's failing\n4. Linter errors: Many unchecked errors need fixing\n\nNeed to fix before tagging v0.21.3 release.","notes":"Fixed linter errors (errcheck, misspell), Nix flake git dependency, and import database discovery bug. Tests still failing - need to investigate further.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-01T23:52:09.244763-07:00","updated_at":"2025-12-14T16:44:47.891788-08:00","closed_at":"2025-11-02T12:32:57.748329-08:00"}
|
||
{"id":"bd-4h3","title":"Add test coverage for internal/git package","description":"","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-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":"open","priority":3,"issue_type":"task","created_at":"2025-12-08T06:38:24.016316945-07:00","updated_at":"2025-12-08T06:39:04.065882225-07:00"}
|
||
{"id":"bd-4l5","title":"bd prime: Detect ephemeral branches and adjust workflow output","description":"When 'bd prime' runs on a branch with no upstream (ephemeral branch), it should output a different SESSION CLOSE PROTOCOL.\n\n**Current output (wrong for ephemeral branches):**\n```\n[ ] 1. git status\n[ ] 2. git add \u003cfiles\u003e\n[ ] 3. bd sync\n[ ] 4. git commit -m \"...\"\n[ ] 5. bd sync\n[ ] 6. git push\n```\n\n**Needed output for ephemeral branches:**\n```\n[ ] 1. git status\n[ ] 2. git add \u003cfiles\u003e\n[ ] 3. bd sync --from-main (pull updates from main)\n[ ] 4. git commit -m \"...\"\n[ ] 5. (no push - branch is ephemeral)\n```\n\n**Detection:** `git rev-parse --abbrev-ref --symbolic-full-name @{u}` returns error code 128 if no upstream.\n\nAlso update Sync \u0026 Collaboration section to mention `bd sync --from-main` for ephemeral branches.\n\n**Use case:** Gastown polecats work on ephemeral local branches that are never pushed. Their code gets merged to main via local merge, and beads changes stay local (communicated via gm mail to Overseer).","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-11-25T16:55:24.984104-08:00","updated_at":"2025-11-25T17:12:46.604978-08:00","closed_at":"2025-11-25T17:12:46.604978-08:00"}
|
||
{"id":"bd-4ms","title":"Multi-repo contributor workflow support","description":"Implement separate repository support for OSS contributors to prevent PR pollution while maintaining git ledger and multi-clone sync. Based on contributor-workflow-analysis.md Solution #4.","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-04T11:21:19.515776-08:00","updated_at":"2025-12-14T16:45:26.591034-08:00","closed_at":"2025-11-05T00:08:42.812662-08:00"}
|
||
{"id":"bd-4oob","title":"bd-hv01: Multi-repo mode not tested with deletion tracking","description":"Problem: Test suite has no coverage for multi-repo mode. ExportToMultiRepo creates multiple JSONL files but snapshot files are hardcoded to single JSONL location.\n\nImpact: Deletion tracking likely silently broken for multi-repo users, could cause data loss.\n\nFix: Add test and update snapshot logic to handle multiple JSONL files.\n\nFiles: cmd/bd/deletion_tracking_test.go, cmd/bd/deletion_tracking.go, cmd/bd/daemon_sync.go:24-34","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-06T18:16:22.965404-08:00","updated_at":"2025-12-14T16:46:19.176284-08:00","closed_at":"2025-11-06T19:20:50.382822-08:00","dependencies":[{"issue_id":"bd-4oob","depends_on_id":"bd-rbxi","type":"parent-child","created_at":"2025-11-06T18:19:15.014196-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-4oqu","title":"Test parent issue","description":"","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-05T13:00:39.737739-08:00","updated_at":"2025-12-14T16:45:51.489122-08:00","closed_at":"2025-11-05T13:01:11.635711-08:00"}
|
||
{"id":"bd-4oqu.1","title":"Test child direct","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-05T13:00:55.992712-08:00","updated_at":"2025-12-14T16:45:51.72448-08:00","closed_at":"2025-11-05T13:01:11.654435-08:00"}
|
||
{"id":"bd-4oqu.2","title":"Test child daemon mode","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-05T13:01:06.642305-08:00","updated_at":"2025-12-14T16:45:53.189149-08:00","closed_at":"2025-11-05T13:01:11.669369-08:00"}
|
||
{"id":"bd-4pd","title":"Imperator lacks mail hooks for automatic notification","description":"","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-30T22:53:52.007971-08:00","updated_at":"2025-12-02T23:28:48.751957-08:00","closed_at":"2025-12-01T22:01:27.835516-08:00"}
|
||
{"id":"bd-4pv","title":"bd export only outputs 1 issue after auto-import corrupts database","description":"When auto-import runs and purges issues (due to git history backfill bug), subsequent 'bd export' only exports 1 issue even though the database should have many.\n\nReproduction:\n1. Have issues.jsonl with 55 issues\n2. Auto-import triggers and purges all issues via git history backfill\n3. Run 'bd export' - only exports 1 issue (the last one created before corruption)\n\nThe database gets into an inconsistent state where most issues are purged but export doesn't realize this.\n\nWorkaround: Rebuild database from scratch with 'rm .beads/beads.db \u0026\u0026 bd init --prefix bd'","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-26T22:28:40.828866-08:00","updated_at":"2025-11-28T17:28:55.545056-08:00","closed_at":"2025-11-27T22:50:35.036227-08:00"}
|
||
{"id":"bd-4qfb","title":"Improve bd doctor output formatting for better readability","description":"The current bd doctor output is a wall of text that's hard to process. Consider improvements like:\n- Grouping related checks into collapsible sections\n- Using color/bold for section headers\n- Showing only failures/warnings by default with --verbose for full output\n- Better visual hierarchy between major sections\n- Summary line at top (e.g., '24 checks passed, 0 warnings, 0 errors')","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-13T09:29:27.557578+11:00","updated_at":"2025-12-13T09:29:27.557578+11:00"}
|
||
{"id":"bd-4ri","title":"Fix TestFallbackToDirectModeEnablesFlush deadlock causing 10min test timeout","description":"## Problem\n\nTestFallbackToDirectModeEnablesFlush in direct_mode_test.go deadlocks for 9m59s before timing out, causing the entire test suite to take 10+ minutes instead of \u003c10 seconds.\n\n## Root Cause\n\nDatabase lock contention between test cleanup and flushToJSONL():\n- Test cleanup (line 36) tries to close DB via defer\n- flushToJSONL() (line 132) is still accessing DB\n- Results in deadlock: database/sql.(*DB).Close() waits for mutex while GetJSONLFileHash() holds it\n\n## Stack Trace Evidence\n\n```\ngoroutine 512 [sync.Mutex.Lock, 9 minutes]:\ndatabase/sql.(*DB).Close(0x14000643790)\n .../database/sql/sql.go:927 +0x84\ngithub.com/steveyegge/beads/cmd/bd.TestFallbackToDirectModeEnablesFlush.func1()\n .../direct_mode_test.go:36 +0xf4\n\nWhile goroutine running flushToJSONL() holds DB connection via GetJSONLFileHash()\n```\n\n## Impact\n\n- Test suite: 10+ minutes → should be \u003c10 seconds\n- ALL other tests pass in ~4 seconds\n- This ONE test accounts for 99.9% of test runtime\n\n## Related\n\nThis is the EXACT same issue documented in MAIN_TEST_REFACTOR_NOTES.md for why main_test.go refactoring was deferred - global state manipulation + DB cleanup = deadlock.\n\n## Fix Approaches\n\n1. **Add proper cleanup sequencing** - stop flush goroutines BEFORE closing DB\n2. **Use test-specific DB lifecycle** - ensure flush completes before cleanup\n3. **Mock the flush mechanism** - avoid real DB for testing this code path \n4. **Add explicit timeout handling** - fail fast with clear error instead of hanging\n\n## Files\n\n- cmd/bd/direct_mode_test.go:36-132\n- cmd/bd/autoflush.go:353 (validateJSONLIntegrity)\n- cmd/bd/autoflush.go:508 (flushToJSONLWithState)\n\n## Acceptance\n\n- Test passes without timeout\n- Test suite completes in \u003c10 seconds\n- No deadlock between cleanup and flush operations","status":"open","priority":1,"issue_type":"bug","created_at":"2025-11-21T20:09:00.794372-05:00","updated_at":"2025-11-21T20:09:00.794372-05:00"}
|
||
{"id":"bd-4ry","title":"Clarify JSONL size bounds with multi-repo","description":"**Summary:** Investigated size constraints for beads.jsonl files during multi-repo hydration to establish clear guidelines for contributor workflow analysis. Focused on understanding the 25k file size limit's application.\n\n**Key Decisions:** \n- Verify 25k size limit scope\n- Maintain VC monitoring performance\n- Clarify multi-repo hydration rules\n\n**Resolution:** Confirmed 25k limit applies per repository, enabling flexible multi-repo hydration while preserving system performance and consistency.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-03T20:24:50.042748-08:00","updated_at":"2025-12-14T16:45:57.094546-08:00","closed_at":"2025-11-05T14:18:00.550341-08:00"}
|
||
{"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-4u8","title":"Config option sync.require_confirmation_on_mass_delete","description":"Add config option for paranoid users who want confirmation before pushing after mass deletion.\n\nOption: sync.require_confirmation_on_mass_delete\nDefault: false\n\nWhen enabled AND safety check triggers:\n- Prompt user for confirmation before pushing\n- Show them what would be pushed\n\nFor users who have been burned and want extra safety. Most users will not need this.\n\nLocation: internal/config/ and internal/syncbranch/worktree.go\nParent issue: bd-3s8","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-02T19:31:00.927907-08:00","updated_at":"2025-12-13T08:15:21.91151+11:00","closed_at":"2025-12-03T22:17:49.4224-08:00","dependencies":[{"issue_id":"bd-4u8","depends_on_id":"bd-7ch","type":"blocks","created_at":"2025-12-02T19:31:09.134795-08:00","created_by":"daemon"}]}
|
||
{"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":"open","priority":2,"issue_type":"task","created_at":"2025-12-14T14:25:59.214886-08:00","updated_at":"2025-12-14T14:25:59.214886-08:00","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-502e","title":"Add comprehensive tests for sync branch daemon logic","description":"**Summary:** Comprehensive testing was developed for the sync branch daemon to validate commit, pull, and branch synchronization behaviors across different git repository configurations. The effort focused on ensuring robust error handling and compatibility.\n\n**Key Decisions:**\n- Create config-scenario test coverage\n- Validate worktree creation mechanisms\n- Ensure backward compatibility\n\n**Resolution:** Implemented test suite successfully improved daemon sync branch reliability and validated expected operational behaviors.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-02T15:59:13.341491-08:00","updated_at":"2025-12-14T16:44:51.891033-08:00","closed_at":"2025-11-02T16:39:53.278313-08:00","dependencies":[{"issue_id":"bd-502e","depends_on_id":"bd-6545","type":"parent-child","created_at":"2025-11-02T15:59:13.342331-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-51jl","title":"Feature P1","description":"","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-11-07T19:04:24.852171-08:00","updated_at":"2025-12-14T16:46:55.511186-08:00","closed_at":"2025-11-07T21:55:09.426728-08:00"}
|
||
{"id":"bd-52q","title":"Fix SyncJSONLToWorktree to merge instead of overwrite","description":"SyncJSONLToWorktree blindly copies local JSONL to worktree, overwriting remote issues.\n\n## Root Cause (GitHub #464)\nWhen Computer B syncs with fewer issues than remote:\n1. preemptiveFetchAndFastForward updates worktree (10 issues)\n2. SyncJSONLToWorktree overwrites with local (1 issue)\n3. Commit records deletion of 9 issues\n4. 3-way merge sees \"deletion in left\" → deletion wins\n\n## Fix\nBefore copying, check if worktree has more issues. If so:\n- Option A: Merge local into worktree (preferred)\n- Option B: Fail with helpful error message\n- Option C: Warn and require --force flag\n\n## Location\ninternal/syncbranch/worktree.go:107 - SyncJSONLToWorktree call\n\n## Test Case\n1. Clone repo with sync-branch containing issues\n2. bd init (starts empty since JSONL on sync-branch)\n3. bd create \"test\"\n4. bd sync\n5. Verify all issues preserved, not just \"test\"","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-12-05T13:43:50.93096-08:00","updated_at":"2025-12-05T14:24:20.951645-08:00","closed_at":"2025-12-05T14:24:20.951645-08:00"}
|
||
{"id":"bd-5314bddf","title":"bd detect-pollution - Test pollution detector","description":"Detect test issues that leaked into production DB.\n\nPattern matching for:\n- Titles starting with 'test', 'benchmark', 'sample'\n- Sequential numbering (test-1, test-2)\n- Generic descriptions\n- Created in rapid succession\n\nOptional AI scoring for confidence.\n\nFiles: cmd/bd/detect_pollution.go (new)","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-28T14:48:17.466906-07:00","updated_at":"2025-12-14T16:46:21.888623-08:00","closed_at":"2025-11-06T19:27:11.75884-08:00"}
|
||
{"id":"bd-537e","title":"Add external_ref change tracking and auditing","description":"Currently we don't track when external_ref is added, removed, or changed. This would be useful for debugging and auditing.\n\nProposed features:\n- Log event when external_ref changes\n- Track in events table with old/new values\n- Add query to find issues where external_ref changed\n- Add metrics: issues with external_ref vs without\n\nUse cases:\n- Debugging import issues\n- Understanding which issues are externally managed\n- Auditing external system linkage\n\nRelated: bd-1022","status":"closed","priority":4,"issue_type":"feature","created_at":"2025-11-02T15:32:31.276883-08:00","updated_at":"2025-12-14T16:47:28.896636-08:00","closed_at":"2025-11-08T02:20:01.022406-08:00"}
|
||
{"id":"bd-53c","title":"bd sync corrupts issues.jsonl in multi-clone environments","description":"During parallel swarm operations on 2025-11-29, bd sync corrupted the issues database. Commit 93718056 purged all 80 issues from issues.jsonl.\n\nReproduction:\n1. Multiple clones of same repo (polecat swarm)\n2. Each clone runs bd sync in parallel\n3. One sync overwrites others, resulting in data loss\n\nEven in single-clone scenarios (~/src/beads), running bd sync after git pull seems to nuke the JSONL.\n\nWorkaround: Use bd import -i .beads/issues.jsonl --no-git-history instead of bd sync.\n\nRoot cause investigation needed. Options:\n1. Pessimistic locking (flock)\n2. Single point of merge (polecats on ephemeral branches)\n3. Beads-level locking (bd sync --lock)","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-29T16:30:30.592507-08:00","updated_at":"2025-11-29T23:19:57.254217-08:00","closed_at":"2025-11-29T23:15:02.435084-08:00"}
|
||
{"id":"bd-5599","title":"Fix TestListCommand duplicate dependency constraint violation","description":"","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-10-31T21:27:05.557548-07:00","updated_at":"2025-12-14T16:44:22.526521-08:00","closed_at":"2025-10-31T21:27:11.429018-07:00"}
|
||
{"id":"bd-55sb","title":"Stealth mode global gitignore should use absolute project path","description":"**GitHub Issue:** #538\n\n**Problem:**\n`bd init --stealth` adds `.beads/` to the global gitignore, which ignores ALL `.beads/` folders across all repositories. Users who want stealth mode in one project but open beads usage in others are blocked.\n\n**Solution:**\nChange stealth mode to use absolute paths instead of generic patterns:\n\n**Before (current):**\n```\n# Beads stealth mode configuration (added by bd init --stealth)\n.beads/\n.claude/settings.local.json\n```\n\n**After (proposed):**\n```\n# Beads stealth mode: /Users/foo/work-project (added by bd init --stealth)\n/Users/foo/work-project/.beads/\n/Users/foo/work-project/.claude/settings.local.json\n```\n\n**Implementation:**\n1. Modify `setupGlobalGitIgnore()` in `cmd/bd/init.go`\n2. Get current working directory (absolute path)\n3. Use absolute path patterns instead of generic ones\n4. Update comment to show which project the entry is for\n\n**Tradeoffs:**\n- If project directory moves, gitignore entry becomes stale (acceptable - user can re-run `bd init --stealth`)\n- Multiple stealth projects = multiple entries (works correctly)\n\n**Testing:**\n- Verify absolute path is added to global gitignore\n- Verify other projects' .beads/ folders are NOT ignored\n- Test with existing global gitignore file\n- Test creating new global gitignore file","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-13T10:55:22.594278-08:00","updated_at":"2025-12-13T10:57:38.0241-08:00","closed_at":"2025-12-13T10:57:38.0241-08:00"}
|
||
{"id":"bd-56p","title":"Add #nosec G304 comments to JSONL file reads in sync.go","description":"sync.go:610 uses os.ReadFile(jsonlPath) without #nosec comment, inconsistent with other JSONL reads that have '// #nosec G304 - controlled path'.\n\nAdd comment for consistency with integrity.go:43 and import.go:316.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-20T21:31:09.107493-05:00","updated_at":"2025-11-20T21:34:28.378089-05:00","closed_at":"2025-11-20T21:34:28.378089-05:00","dependencies":[{"issue_id":"bd-56p","depends_on_id":"bd-khnb","type":"blocks","created_at":"2025-11-20T21:31:09.108632-05:00","created_by":"daemon"}]}
|
||
{"id":"bd-56x","title":"Review PR #514: fix plugin install docs","description":"Review and merge PR #514 from aspiers. This PR fixes incorrect docs for installing Claude Code plugin from source in docs/PLUGIN.md. Clarifies shell vs Claude Code commands and fixes the . vs ./beads argument issue. URL: https://github.com/anthropics/beads/pull/514","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-13T08:15:16.865354+11:00","updated_at":"2025-12-13T07:07:19.729213-08:00","closed_at":"2025-12-13T07:07:19.729213-08:00"}
|
||
{"id":"bd-581b80b3","title":"bd find-duplicates - AI-powered duplicate detection","description":"Find semantically duplicate issues.\n\nApproaches:\n1. Mechanical: Exact title/description matching\n2. Embeddings: Cosine similarity (cheap, scalable)\n3. AI: LLM-based semantic comparison (expensive, accurate)\n\nUses embeddings by default for \u003e100 issues.\n\nFiles: cmd/bd/find_duplicates.go (new)","status":"open","priority":1,"issue_type":"task","created_at":"2025-10-29T20:49:49.126801-07:00","updated_at":"2025-10-30T17:12:58.218673-07:00"}
|
||
{"id":"bd-589c7c1e","title":"Fix revive style issues (78 issues)","description":"Style violations: unused parameters (many cmd/args in cobra commands), missing exported comments, stuttering names (SQLiteStorage), indent-error-flow issues.","notes":"Fixed 19 revive issues:\n- 14 unused-parameter (renamed to _)\n- 2 redefines-builtin-id (max→maxCount, min→minInt)\n- 3 indent-error-flow (gofmt fixed 2, skipped 1 complex nested one)\n\nRemaining issues are acceptable: 11 unused-params in deeper code, 2 empty-blocks with comments, 1 complex indent case, 1 superfluous-else in test.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-10-27T23:20:10.391821-07:00","updated_at":"2025-12-14T16:43:46.624629-08:00","closed_at":"2025-10-27T23:02:41.30653-07:00"}
|
||
{"id":"bd-58c0","title":"Fix transaction conflict in TryResurrectParent","description":"**Summary:** Transaction conflicts in TryResurrectParent caused database locking errors during issue resurrection. The problem was traced to unnecessary new database connections interfering with existing transactions.\n\n**Key Decisions:** \n- Add optional transaction parameter to TryResurrectParent\n- Prioritize reusing existing transactions\n\n**Resolution:** Updated method provides transactional flexibility, eliminating intermittent database locking problems in CreateIssue workflow.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-04T16:32:20.981027-08:00","updated_at":"2025-12-14T16:45:23.446976-08:00","closed_at":"2025-11-04T17:00:44.258881-08:00","dependencies":[{"issue_id":"bd-58c0","depends_on_id":"bd-d19a","type":"discovered-from","created_at":"2025-11-04T16:32:20.981969-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-59er","title":"Add --lock-timeout global flag","description":"Add new global flag to control SQLite busy_timeout.\n\n## Implementation\n1. Add to cmd/bd/main.go:\n - `lockTimeout time.Duration` global variable \n - Register flag: `--lock-timeout=\u003cduration\u003e` (default 30s)\n\n2. Add config support in internal/config/config.go:\n - `v.SetDefault(\"lock-timeout\", \"30s\")`\n - Read from config.yaml if not set via flag\n\n3. Pass timeout to sqlite.New() - see next task\n\n## Acceptance Criteria\n- `bd --lock-timeout=0 list` fails immediately if DB is locked\n- `bd --lock-timeout=100ms list` waits max 100ms\n- Config file setting works: `lock-timeout: 100ms`\n- Default remains 30s for backward compatibility\n\nPart of bd-olc1","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-13T17:54:36.277179-08:00","updated_at":"2025-12-13T18:05:19.367765-08:00","closed_at":"2025-12-13T18:05:19.367765-08:00"}
|
||
{"id":"bd-5a90","title":"Test parent issue","description":"","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-14T16:37:27.394786-08:00","updated_at":"2025-12-14T16:37:27.394786-08:00","closed_at":"2025-12-13T23:29:56.878674-08:00"}
|
||
{"id":"bd-5aad5a9c","title":"Add TestNWayCollision for 5+ clones","description":"**Summary:** Implemented comprehensive N-way collision resolution tests to validate the synchronization mechanism's scalability across multiple clone configurations. Developed a generalized testing approach to ensure robust content synchronization.\n\n**Key Decisions:**\n- Create generic testNCloneCollision function\n- Test multiple sync orders (sequential, reverse, random)\n- Add performance benchmarks\n\n**Resolution:** Confirmed system's ability to reliably synchronize content across multiple clones with predictable performance and bounded convergence time.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-29T19:52:05.462747-07:00","updated_at":"2025-12-14T16:44:05.829091-08:00","closed_at":"2025-10-31T12:00:43.198413-07:00"}
|
||
{"id":"bd-5arw","title":"Fix remaining FK constraint failures in AddComment and ApplyCompaction","description":"Follow-up to PR #348 (Fix FOREIGN KEY constraint failed).\n\nThe initial fix addressed CloseIssue, UpdateIssueID, and RemoveLabel.\nHowever, `AddComment` (in internal/storage/sqlite/events.go) and `ApplyCompaction` (in internal/storage/sqlite/compact.go) still suffer from the same pattern: inserting an event after an UPDATE without verifying the UPDATE affected any rows.\n\nThis causes \"FOREIGN KEY constraint failed\" errors when operating on non-existent issues, instead of clean \"issue not found\" errors.\n\nTask:\n1. Apply the same fix pattern to `AddComment` and `ApplyCompaction`: check RowsAffected() after UPDATE and before event INSERT.\n2. Ensure error messages are consistent (\"issue %s not found\").\n3. Verify with reproduction tests (create a test that calls these methods with a non-existent ID).","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-20T09:53:38.314776-08:00","updated_at":"2025-11-20T11:25:04.698765-08:00","closed_at":"2025-11-20T11:25:04.698765-08:00"}
|
||
{"id":"bd-5b40a0bf","title":"Batch test 5","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-29T15:29:02.136118-07:00","updated_at":"2025-12-14T16:44:00.654202-08:00","closed_at":"2025-10-31T12:00:43.181513-07:00"}
|
||
{"id":"bd-5b6e","title":"Add tests for helper functions (GetDirtyIssueHash, GetAllDependencyRecords, export hashes)","description":"Several utility functions have 0% coverage:\n- GetDirtyIssueHash (dirty.go)\n- GetAllDependencyRecords (dependencies.go)\n- GetExportHash, SetExportHash, ClearAllExportHashes (hash.go)\n\nThese are lower priority but should have basic coverage.","status":"open","priority":4,"issue_type":"task","created_at":"2025-11-01T22:40:58.989976-07:00","updated_at":"2025-11-01T22:40:58.989976-07:00"}
|
||
{"id":"bd-5bbf","title":"Test all core bd commands in WASM for feature parity","description":"Comprehensive testing of bd-wasm against native bd:\n- Test all CRUD operations (create, update, show, close)\n- Test dependency management (dep add, dep tree)\n- Test sync operations (sync, import, export)\n- Verify JSONL output matches native bd\n- Run existing Go test suite in WASM if possible\n- Benchmark performance (should be within 2x of native)","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-02T21:58:07.300923-08:00","updated_at":"2025-12-14T16:45:43.098061-08:00","closed_at":"2025-11-05T00:55:48.757249-08:00","dependencies":[{"issue_id":"bd-5bbf","depends_on_id":"bd-44d0","type":"parent-child","created_at":"2025-11-02T22:23:49.503229-08:00","created_by":"stevey"},{"issue_id":"bd-5bbf","depends_on_id":"bd-b4b0","type":"blocks","created_at":"2025-11-02T22:23:55.623601-08:00","created_by":"stevey"}]}
|
||
{"id":"bd-5bj","title":"Registry has cross-process race condition","description":"The global daemon registry (~/.beads/registry.json) can be corrupted when multiple daemons from different workspaces write simultaneously.\n\n**Root cause:**\n- Registry uses an in-process mutex but no file-level locking\n- Register() and Unregister() release the mutex between read and write\n- Multiple daemon processes can interleave their read-modify-write cycles\n\n**Evidence:**\nFound registry.json with double closing bracket: `]]` instead of `]`\n\n**Fix options:**\n1. Use file locking (flock/fcntl) around the entire read-modify-write cycle\n2. Use atomic write pattern (write to temp file, rename)\n3. Both (belt and suspenders)\n\n**Files:**\n- internal/daemon/registry.go:46-64 (readEntries)\n- internal/daemon/registry.go:67-87 (writeEntries)\n- internal/daemon/registry.go:90-108 (Register - the race window)","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-27T13:55:50.426188-08:00","updated_at":"2025-11-27T14:07:06.22622-08:00","closed_at":"2025-11-27T14:07:06.22622-08:00"}
|
||
{"id":"bd-5c4","title":"VCS-agnostic sync support","description":"Make bd sync work with multiple VCS types (git, jujutsu, mercurial, sapling) by detecting VCS per repo and using appropriate sync commands, supporting mixed-VCS multi-repo configs.","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-11-04T11:22:00.837527-08:00","updated_at":"2025-12-14T16:45:57.852855-08:00","closed_at":"2025-11-05T14:26:17.942832-08:00","dependencies":[{"issue_id":"bd-5c4","depends_on_id":"bd-4ms","type":"parent-child","created_at":"2025-11-04T11:22:21.817849-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-5ce8","title":"Document protected branch workflow","description":"**Summary:** Comprehensive documentation was developed to clarify protected branch workflow across multiple files. The documentation aims to provide clear guidance for users on implementing branch protection mechanisms.\n\n**Key Decisions:**\n- Created PROTECTED_BRANCHES.md guide\n- Updated documentation in README.md and AGENTS.md\n- Added implementation example\n\n**Resolution:** Successfully documented protected branch workflow, enhancing user understanding of branch protection implementation.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-02T15:22:35.59013-08:00","updated_at":"2025-12-14T16:45:15.668523-08:00","closed_at":"2025-11-04T11:10:23.530621-08:00","dependencies":[{"issue_id":"bd-5ce8","depends_on_id":"bd-a101","type":"parent-child","created_at":"2025-11-02T15:22:48.379767-08:00","created_by":"stevey"}]}
|
||
{"id":"bd-5dae5504","title":"Export deduplication breaks when JSONL and export_hashes table diverge","description":"**Summary:** Critical data synchronization bug discovered in export deduplication, causing silent issue loss during git operations and repository syncing. The problem stems from export_hashes table getting out of sync with actual JSONL file contents, leading to undetected data corruption.\n\n**Key Decisions:**\n- Disable current timestamp-only export deduplication\n- Implement JSONL file hash validation before export\n- Clear export_hashes on import and git operations\n- Add explicit validation checks between DB and JSONL\n\n**Resolution:** Feature was deemed unsafe and requires complete redesign to prevent silent data loss, with immediate recommendation to disable export deduplication until a robust fix can be implemented.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-10-29T23:05:13.959435-07:00","updated_at":"2025-12-14T16:43:40.169276-08:00","closed_at":"2025-10-29T21:57:03.06641-07:00"}
|
||
{"id":"bd-5e1f","title":"Issue with desc","description":"This is a description","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-10-31T21:41:11.128718-07:00","updated_at":"2025-12-14T16:45:16.709886-08:00","closed_at":"2025-11-04T11:10:23.531097-08:00"}
|
||
{"id":"bd-5f26","title":"Refactor daemon.go into internal/daemonrunner","description":"Extract daemon runtime from daemon.go (1,565 lines) into internal/daemonrunner with focused modules: config.go, daemon.go, process.go, rpc_server.go, sync.go, git.go. Keep cobra command thin.","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-01T11:41:14.821017-07:00","updated_at":"2025-12-14T16:44:38.890441-08:00","closed_at":"2025-11-01T22:34:00.944402-07:00"}
|
||
{"id":"bd-5f483051","title":"Implement bd resolve-conflicts (git merge conflicts in JSONL)","description":"Automatically detect and resolve git merge conflicts in .beads/issues.jsonl file.\n\nFeatures:\n- Detect conflict markers in JSONL\n- Parse conflicting issues from HEAD and BASE\n- Provide mechanical resolution (remap duplicate IDs)\n- Support AI-assisted resolution (requires internal/ai package)\n\nSee repair_commands.md lines 125-353 for design.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-28T19:37:55.722827-07:00","updated_at":"2025-12-14T16:46:20.470795-08:00","closed_at":"2025-11-06T19:26:45.397628-08:00"}
|
||
{"id":"bd-5ibn","title":"Latency test 1","description":"","notes":"Resetting stale in_progress status from old executor run (yesterday)","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-20T12:16:30.703754-05:00","updated_at":"2025-12-14T00:32:11.04809-08:00","closed_at":"2025-12-13T23:29:56.878439-08:00"}
|
||
{"id":"bd-5iv","title":"Test Epic","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.864229-08:00","updated_at":"2025-12-14T16:45:35.101835-08:00","closed_at":"2025-11-05T00:25:06.538749-08:00"}
|
||
{"id":"bd-5ki8","title":"Add integration tests for adapter library","description":"**Summary:** Comprehensive test suite developed for beads_mail_adapter.py, covering all critical mail adapter scenarios including server availability, error handling, and edge cases. Implemented 29 unit tests with complete mock-based approach to ensure robust library functionality.\n\n**Key Decisions:**\n- Use mock HTTP server for all tests\n- Cover server states (enabled/disabled)\n- Test all API operations\n- Handle various error scenarios\n- Ensure graceful degradation\n\n**Resolution:** Test suite achieved over 90% code coverage with extremely fast (10ms) execution, significantly improving adapter library reliability and testability.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-07T22:43:21.294596-08:00","updated_at":"2025-12-14T16:47:24.343711-08:00","closed_at":"2025-11-08T01:32:39.906342-08:00","dependencies":[{"issue_id":"bd-5ki8","depends_on_id":"bd-m9th","type":"blocks","created_at":"2025-11-07T22:43:21.296024-08:00","created_by":"daemon"}]}
|
||
{"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-12-14T16:46:06.508724-08:00","closed_at":"2025-11-05T19:22:11.668682-08:00"}
|
||
{"id":"bd-5qim","title":"Optimize GetReadyWork performance - 752ms on 10K database (target: \u003c50ms)","description":"","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":"open","priority":0,"issue_type":"bug","created_at":"2025-11-14T09:02:46.507526-08:00","updated_at":"2025-11-14T09:03:44.073236-08:00"}
|
||
{"id":"bd-5we","title":"Use RAM disk for Windows CI tests","description":"Windows CI tests time out due to slow filesystem I/O. Even with splitting into parallel jobs, each package set takes \u003e30 minutes.\n\nImplement a RAM disk solution using ImDisk or similar on Windows GitHub Actions runners to speed up tests.\n\nReferences:\n- https://github.com/actions/runner-images/issues/intlharry has examples\n- ImDisk can create RAM disks on Windows\n- Alternative: use D: drive which may be faster on some runners","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-04T20:30:23.877831-08:00","updated_at":"2025-12-13T12:54:00.045208828-05:00","closed_at":"2025-12-13T07:28:44.636222-08:00"}
|
||
{"id":"bd-5xt","title":"Log errors from timer-triggered flushes instead of discarding","description":"","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-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-12-14T16:45:00.110172-08:00","closed_at":"2025-11-02T18:41:01.376786-08:00"}
|
||
{"id":"bd-6214875c","title":"Split internal/rpc/server.go into focused modules","description":"**Summary:** The massive `server.go` file was refactored from a 2,273-line monolith into 8 focused, domain-specific modules to improve code maintainability and reduce merge conflict risk. The migration involved systematic method extraction while preserving existing functionality.\n\n**Key Decisions:** \n- Split file by operation domain (issues, dependencies, labels, etc.)\n- Maintain core server logic in primary `server.go`\n- Incrementally test during migration\n- Keep total module count to 8 files\n\n**Resolution:** Successfully decomposed complex RPC server implementation into modular, more manageable components without disrupting existing system behavior.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-28T14:21:37.51524-07:00","updated_at":"2025-12-14T16:43:22.761632-08: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":"**Summary:** CLI test suite was identified as critically slow, requiring performance optimization before expanding test coverage. Investigation focused on identifying bottlenecks and inefficient test design that were causing 30+ minute execution times.\n\n**Key Decisions:** \n- Profile test execution\n- Eliminate redundant git/database operations\n- Explore test parallelization\n- Consider in-memory database mocking\n\n**Resolution:** Performance target set to reduce full test suite runtime from 30+ minutes to under 2 minutes, enabling faster development iteration and preparing for increased test coverage.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T14:06:27.951656-07:00","updated_at":"2025-12-14T16:47:46.811073-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":"**Summary:** Developed an AI-supervised database migration framework to enhance schema evolution safety by proactively detecting potential data loss and integrity risks during database transformations.\n\n**Key Decisions:**\n- AI-powered migration validation\n- Automatic pre/post migration snapshots\n- Configurable rollback on anomaly detection\n\n**Resolution:** Created a robust migration inspection system that significantly improves database schema change reliability and prevents potential data integrity issues.","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-02T12:57:10.722048-08:00","updated_at":"2025-12-14T16:44:49.551854-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-12-14T16:45:03.213887-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-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-12-14T16:45:18.151037-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-64c05d00","title":"Multi-clone collision resolution testing and documentation","description":"Epic to track improvements to multi-clone collision resolution based on ultrathinking analysis of-3d844c58 and [deleted:bd-71107098].\n\nCurrent state:\n- 2-clone collision resolution is SOUND and working correctly\n- Hash-based deterministic collision resolution works\n- Test fails due to timestamp comparison, not actual logic issues\n\nWork needed:\n1. Fix TestTwoCloneCollision to compare content not timestamps\n2. Add TestThreeCloneCollision for regression protection\n3. Document 3-clone ID non-determinism as known behavior","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-10-28T17:58:38.316626-07:00","updated_at":"2025-12-14T16:45:18.912921-08:00","closed_at":"2025-11-04T11:10:23.531681-08:00"}
|
||
{"id":"bd-64c05d00.1","title":"Fix TestTwoCloneCollision to compare content not timestamps","description":"**Summary:** TestTwoCloneCollision failure was caused by timestamp comparison instead of content validation. The test needed modification to compare semantic content rather than exact JSON representation.\n\n**Key Decisions:**\n- Replace exact JSON comparison with content-aware matching\n- Ignore/normalize timestamp fields during assertion\n- Preserve core data integrity check\n\n**Resolution:** Test was fixed to correctly validate clone convergence without failing on timestamp variations, unblocking issue bd-71107098.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-28T17:58:52.057194-07:00","updated_at":"2025-12-14T16:43:25.667967-08:00","closed_at":"2025-10-28T18:01:38.751895-07:00","dependencies":[{"issue_id":"bd-64c05d00.1","depends_on_id":"bd-64c05d00","type":"parent-child","created_at":"2025-10-28T17:58:52.058202-07:00","created_by":"stevey"},{"issue_id":"bd-64c05d00.1","depends_on_id":"bd-71107098","type":"blocks","created_at":"2025-10-28T17:58:52.05873-07:00","created_by":"stevey"}]}
|
||
{"id":"bd-64c05d00.2","title":"Document 3-clone ID non-determinism in collision resolution","description":"Document the known behavior of 3+ way collision resolution where ID assignments may vary based on sync order, even though content always converges correctly.\n\nUpdates needed:\n- Update bd-71107098 notes to mark 2-clone case as solved\n- Document 3-clone ID non-determinism as known limitation\n- Add explanation to ADVANCED.md or collision resolution docs\n- Explain why this happens (pairwise hash comparison is deterministic, but multi-way ID allocation uses sync-order dependent counters)\n- Clarify trade-offs: content convergence ✅ vs ID stability ❌\n\nKey points to document:\n- Hash-based resolution is pairwise deterministic\n- Content always converges correctly (all issues present with correct data)\n- Numeric ID assignments in 3+ way collisions depend on sync order\n- This is acceptable for most use cases (content convergence is primary goal)\n- Full determinism would require complex multi-way comparison","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-28T17:59:21.93014-07:00","updated_at":"2025-12-13T18:05:36.738547-08:00","closed_at":"2025-11-15T14:13:47.304584-08:00","dependencies":[{"issue_id":"bd-64c05d00.2","depends_on_id":"bd-64c05d00","type":"parent-child","created_at":"2025-10-28T17:59:21.938709-07:00","created_by":"stevey"}]}
|
||
{"id":"bd-64c05d00.3","title":"Add TestThreeCloneCollision for regression protection","description":"**Summary:** Added regression test for 3-clone content collision to verify consistent content convergence across different synchronization sequences. Test documents expected non-deterministic ID assignment behavior.\n\n**Key Decisions:** \n- Test multiple sync order scenarios\n- Validate content matching, not specific ID values\n- Confirm content consistency is primary goal\n\n**Resolution:** Implemented test proving system maintains correct content integrity despite variable ID generation during multi-way synchronization.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-28T17:59:05.941735-07:00","updated_at":"2025-12-14T16:43:25.945035-08:00","closed_at":"2025-10-28T18:09:12.717604-07:00","dependencies":[{"issue_id":"bd-64c05d00.3","depends_on_id":"bd-64c05d00","type":"parent-child","created_at":"2025-10-28T17:59:05.942783-07:00","created_by":"stevey"}]}
|
||
{"id":"bd-64z4","title":"Assigned issue","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-07T19:04:24.201309-08:00","updated_at":"2025-12-14T16:46:54.364181-08:00","closed_at":"2025-11-07T21:55:09.427387-08:00"}
|
||
{"id":"bd-6545","title":"Update daemon commit logic for separate branch","description":"Modify daemon to use worktree for commits when sync.branch configured.\n\nTasks:\n- Update internal/daemon/server_export_import_auto.go\n- Detect sync.branch configuration\n- Ensure worktree exists before commit\n- Sync JSONL to worktree\n- Commit in worktree context\n- Push to configured branch\n- Fallback to current behavior if sync.branch not set\n- Handle git errors (network, permissions, conflicts)\n\nEstimated effort: 3-4 days","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-02T15:22:35.598861-08:00","updated_at":"2025-12-14T16:45:18.66649-08:00","closed_at":"2025-11-04T11:10:23.531966-08:00","dependencies":[{"issue_id":"bd-6545","depends_on_id":"bd-a101","type":"parent-child","created_at":"2025-11-02T15:22:48.375661-08:00","created_by":"stevey"}]}
|
||
{"id":"bd-69bce74a","title":"Platform tests: Linux, macOS, Windows","description":"Test event-driven mode on all platforms. Verify inotify (Linux), FSEvents (macOS), ReadDirectoryChangesW (Windows). Test fallback behavior on each.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T19:42:29.85636-07:00","updated_at":"2025-12-14T16:43:56.664907-08:00","closed_at":"2025-10-29T15:33:22.149551-07:00"}
|
||
{"id":"bd-69fbe98e","title":"Implement \"bd daemons logs\" subcommand","description":"Add command to view daemon logs for a specific workspace. Requires daemon logging to file (may need separate issue for log infrastructure).","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-26T19:41:11.099659-07:00","updated_at":"2025-12-14T16:46:33.750982-08:00","closed_at":"2025-11-06T19:53:45.855798-08:00"}
|
||
{"id":"bd-6ada971e","title":"Create cmd/bd/daemon_event_loop.go (~200 LOC)","description":"Implement runEventDrivenLoop to replace polling ticker. Coordinate FileWatcher, mutation events, debouncer. Include health check ticker (60s) for daemon validation.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-28T16:20:02.429383-07:00","updated_at":"2025-12-14T16:43:50.05759-08:00","closed_at":"2025-10-28T12:30:44.067036-07:00"}
|
||
{"id":"bd-6bebe013","title":"Rapid 1","description":"","status":"closed","priority":3,"issue_type":"task","created_at":"2025-10-29T19:11:57.404437-07:00","updated_at":"2025-12-14T16:47:03.749396-08:00","closed_at":"2025-11-07T23:18:52.368766-08:00"}
|
||
{"id":"bd-6c68","title":"bd info shows 'auto_start_disabled' even when daemon is crashed/missing","description":"","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-10-31T21:08:03.385681-07:00","updated_at":"2025-12-14T16:44:27.114841-08:00","closed_at":"2025-11-01T19:13:43.819004-07:00","dependencies":[{"issue_id":"bd-6c68","depends_on_id":"bd-2752a7a2","type":"discovered-from","created_at":"2025-10-31T21:08:03.387045-07:00","created_by":"stevey"}]}
|
||
{"id":"bd-6cxz","title":"Fix MCP tools failing to load in Claude Code (GH#346)","description":"Fix FastMCP schema generation bug by refactoring `Issue` model to avoid recursion.\n \n - Refactored `Issue` in `models.py` to use `LinkedIssue` for dependencies/dependents.\n - Restored missing `Mail*` models to `models.py`.\n - Fixed `tests/test_mail.py` mock assertion.\n \n Fixes GH#346.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-20T18:53:40.229801-05:00","updated_at":"2025-11-20T18:53:44.280296-05:00","closed_at":"2025-11-20T18:53:44.280296-05:00"}
|
||
{"id":"bd-6d7efe32","title":"CRDT-based architecture for guaranteed convergence (v2.0)","description":"**Summary:** Redesigned issue tracking system using Conflict-Free Replicated Data Types (CRDTs) to solve distributed synchronization challenges, enabling mathematically guaranteed convergence across multiple system instances.\n\n**Key Decisions:**\n- Replace sequential IDs with UUIDs\n- Implement Last-Write-Wins (LWW) registers\n- Use operation logs for synchronization\n\n**Resolution:** Successfully developed a CRDT architecture enabling deterministic, conflict-free tracking across distributed workers, establishing a scalable collaboration framework.","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-10-29T20:48:00.267237-07:00","updated_at":"2025-12-14T16:44:17.601121-08:00","closed_at":"2025-10-31T20:06:44.604643-07:00"}
|
||
{"id":"bd-6ed8","title":"Fixture Generator for Realistic Test Data","description":"**Summary:** Developed a comprehensive test data generator for creating realistic, large-scale software issue fixtures with complex hierarchical and dependency structures. The solution focuses on generating reproducible test datasets for SQLite storage across different scales.\n\n**Key Decisions:** \n- Use seeded random number generation for consistency\n- Support multiple dataset sizes (10K/20K issues)\n- Generate complex epic/task hierarchies with cross-dependencies\n- Implement in single, direct-function utility file\n\n**Resolution:** Created internal test utility that enables more robust and realistic performance testing and validation across different software testing scenarios.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-13T22:22:28.233977-08:00","updated_at":"2025-12-14T16:47:53.608235-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":"open","priority":2,"issue_type":"task","created_at":"2025-10-28T16:20:02.434573-07:00","updated_at":"2025-10-30T17:12:58.224957-07:00"}
|
||
{"id":"bd-6hji","title":"Test exclusive file reservations with two agents","description":"**Summary:** Tested exclusive file reservation mechanism to prevent concurrent access conflicts between agents. Verified system's ability to block secondary reservation attempts and manage time-limited claim windows.\n\n**Key Decisions:** \n- Implement reservation with TTL\n- Return clear error on conflict\n- Allow retry after reservation expiration\n\n**Resolution:** File reservation system successfully prevents race conditions and provides predictable, safe concurrent access control.","status":"closed","priority":0,"issue_type":"task","created_at":"2025-11-07T22:41:59.963468-08:00","updated_at":"2025-12-14T16:47:06.65274-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-6ic","title":"Second worktree test","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-30T00:40:28.768125-08:00","updated_at":"2025-11-30T00:40:58.06615-08:00","closed_at":"2025-11-30T00:40:58.06615-08:00"}
|
||
{"id":"bd-6ku3","title":"Fix TestMigrateHashIDs test failure","description":"Test failure in cmd/bd/migrate_hash_ids_test.go:100 - New ID bd-09970281 for bd-1 is not a hash ID. This test is validating the hash ID migration but the generated ID doesn't match the expected format.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-06T18:52:58.114046-08:00","updated_at":"2025-12-14T16:46:18.581452-08:00","closed_at":"2025-11-06T19:04:58.804373-08:00"}
|
||
{"id":"bd-6l8","title":"Auto-resolve all field conflicts in merge.go","description":"Eliminate manual conflict resolution by adding deterministic auto-resolve rules for all fields:\n\n- Priority: higher priority wins (lower number = more urgent)\n- IssueType: local wins\n- Notes: concatenate both sides with separator\n- Title: side with latest updated_at on the issue wins\n- Description: side with latest updated_at on the issue wins\n\nCurrently true conflicts (both sides changed same field to different values) fail sync. With this change, NO conflicts ever require manual resolution.\n\nLocation: internal/merge/merge.go\nParent issue: bd-3s8","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-02T19:30:59.244181-08:00","updated_at":"2025-12-02T19:49:51.570143-08:00","closed_at":"2025-12-02T19:49:51.570143-08:00"}
|
||
{"id":"bd-6mjj","title":"Split test suites: fast vs. integration","description":"Reorganize tests into separate packages/files for fast unit tests vs slow integration tests.\n\nBenefits:\n- Clear separation of concerns\n- Easier to run just fast tests during development\n- Can parallelize CI jobs better\n\nFiles to organize:\n- beads_hash_multiclone_test.go (slow integration tests)\n- beads_integration_test.go (medium-speed integration tests)\n- Other test files (fast unit tests)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-04T01:24:21.040347-08:00","updated_at":"2025-12-14T16:45:15.291477-08:00","closed_at":"2025-11-04T10:38:12.408674-08:00","dependencies":[{"issue_id":"bd-6mjj","depends_on_id":"bd-l5gq","type":"blocks","created_at":"2025-11-04T01:24:21.041228-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-6rf","title":"bd doctor: detect and fix stale beads-sync branch","description":"## Problem\n\nWhen beads-sync diverges significantly from main (on source code, not just .beads/), it needs to be reset. After a force-push reset, other clones/contributors will have orphaned local beads-sync branches.\n\n## Symptoms\n- Local beads-sync is many commits behind main on source files\n- Local beads-sync doesn't share recent history with remote beads-sync (after force-push)\n- bd sync may behave unexpectedly\n\n## Proposed bd doctor checks\n\n1. **Check beads-sync alignment with main**\n - If beads-sync exists and is \u003eN commits behind main on non-.beads/ files, warn\n - Suggests: reset beads-sync to main\n\n2. **Check beads-sync alignment with remote**\n - If local beads-sync has diverged from origin/beads-sync (no common recent ancestor)\n - This happens after someone force-pushed a reset\n - Suggests: reset local beads-sync to origin/beads-sync\n\n## Proposed fixes (--fix)\n\n- Reset local beads-sync branch to origin/beads-sync or main\n- Handle worktree if present (git worktree remove, then recreate on next sync)\n\n## Context\nDiscovered when beads-sync drifted 126 commits behind main. Required manual reset and force-push. Contributors will need to reset their local branches too.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-02T23:45:40.607538-08:00","updated_at":"2025-12-13T08:15:21.911768+11:00","closed_at":"2025-12-03T22:13:21.727319-08:00"}
|
||
{"id":"bd-6rl","title":"Merge3Way public API does not expose TTL parameter","description":"The public Merge3Way() function in merge.go does not allow callers to configure the tombstone TTL. It hard-codes the default via merge3WayWithTTL(). While merge3WayWithTTL() exists, it is unexported (lowercase). This means the CLI and tests cannot configure TTL at merge time. Use cases: testing with different TTL values, per-repository TTL configuration, debugging with short TTL, supporting --ttl flag in bd merge command (mentioned in design doc bd-zvg). Recommendation: Export Merge3WayWithTTL (rename to uppercase). Files: internal/merge/merge.go:77, 292-298","status":"open","priority":3,"issue_type":"feature","created_at":"2025-12-05T16:36:15.756814-08:00","updated_at":"2025-12-05T16:36:15.756814-08:00"}
|
||
{"id":"bd-6sd1","title":"Issue to close","description":"","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-07T19:00:16.547698-08:00","updated_at":"2025-12-14T16:46:48.168554-08:00","closed_at":"2025-11-07T19:00:16.570826-08:00"}
|
||
{"id":"bd-6sm6","title":"Improve test coverage for internal/export (37.1% → 60%)","description":"The export package has only 37.1% test coverage. Export functionality needs good coverage to ensure data integrity.\n\nCurrent coverage: 37.1%\nTarget coverage: 60%","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-13T20:43:06.802277-08:00","updated_at":"2025-12-13T21:01:19.08088-08:00"}
|
||
{"id":"bd-6uix","title":"Message System Improvements","description":"Consolidate improvements to the bd message command including core functionality (message reading), reliability (timeouts), validation, and code quality refactoring","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-08T12:55:47.907771-08:00","updated_at":"2025-12-14T16:47:38.156537-08:00","closed_at":"2025-11-08T12:59:05.802367-08:00"}
|
||
{"id":"bd-6x5","title":"mergeTombstones does not handle empty DeletedAt timestamps","description":"The mergeTombstones() function uses isTimeAfter() to compare deleted_at timestamps, but does not handle the edge case where one or both tombstones have empty DeletedAt fields. Current behavior with isTimeAfter() semantics: empty string returns false when compared, which means if left.DeletedAt is empty, right wins. If both are empty, behavior depends on isTimeAfter tie-breaker. This should be explicitly handled with a comment or validation. Recommendation: Add explicit handling or documentation for invalid tombstones. Files: internal/merge/merge.go:448-456","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-05T16:36:43.002612-08:00","updated_at":"2025-12-05T17:15:57.633147-08:00","closed_at":"2025-12-05T17:15:57.633147-08:00"}
|
||
{"id":"bd-6xfz","title":"GH#517: Fix Claude setting wrong priority syntax on new install","description":"Claude uses 'medium' instead of P2/2 for priority, causing infinite error loops. bd prime hook or docs not clear enough. See: https://github.com/steveyegge/beads/issues/517","status":"open","priority":1,"issue_type":"bug","created_at":"2025-12-14T16:31:55.740197-08:00","updated_at":"2025-12-14T16:31:55.740197-08:00"}
|
||
{"id":"bd-6y5","title":"Add unit tests for getLocalSyncBranch","description":"The new getLocalSyncBranch() function in autoimport.go (bd-0is fix) has no dedicated unit tests.\n\nShould test:\n- Returns empty string when no config.yaml exists\n- Returns empty string when config.yaml has no sync-branch key\n- Returns value when sync-branch is set with double quotes\n- Returns value when sync-branch is set with single quotes\n- Returns value when sync-branch is set without quotes\n- Returns BEADS_SYNC_BRANCH env var when set (takes precedence)\n- Handles edge cases: empty file, whitespace-only lines, comments\n\nLocation: cmd/bd/autoimport_test.go","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-05T14:51:07.129329-08:00","updated_at":"2025-12-07T01:57:11.69579-08:00","closed_at":"2025-12-07T01:57:11.69579-08:00"}
|
||
{"id":"bd-6z7l","title":"Auto-detect scenarios and prompt users","description":"Detect when user is in fork/contributor scenario and prompt with helpful suggestions. Check: git remote relationships, existing .beads config, repo ownership. Suggest appropriate wizard.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-05T18:04:30.070695-08:00","updated_at":"2025-12-14T16:46:03.702876-08:00","closed_at":"2025-11-05T18:57:03.315476-08:00","dependencies":[{"issue_id":"bd-6z7l","depends_on_id":"bd-8rd","type":"parent-child","created_at":"2025-11-05T18:04:39.205478-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-70419816","title":"Export deduplication breaks when JSONL and export_hashes table diverge","description":"**Summary:** An export deduplication bug was discovered causing potential data loss when JSONL and export_hashes table become desynchronized during Git operations or manual edits. The issue stems from incorrect assumptions in the shouldSkipExport() function about issue tracking integrity.\n\n**Key Decisions:**\n- Implement JSONL file hash validation\n- Clear export_hashes on import/Git operations\n- Add metadata tracking to detect synchronization issues\n\n**Resolution:** Proposed a multi-layer fix combining JSONL hash checking, defensive export_hashes clearing, and improved validation to prevent silent data loss and ensure consistent issue tracking across repositories.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-10-29T23:05:13.960352-07:00","updated_at":"2025-12-14T16:43:40.445-08:00","closed_at":"2025-10-29T22:22:20.406934-07:00"}
|
||
{"id":"bd-710a4916","title":"CRDT-based architecture for guaranteed convergence (v2.0)","description":"**Summary:** Redesigned issue tracking architecture using Conflict-Free Replicated Data Types (CRDTs) to solve data convergence problems across multiple clones and ensure mathematically guaranteed consistency at scale.\n\n**Key Decisions:** \n- Replace sequential IDs with UUIDs\n- Implement Last-Write-Wins (LWW) registers for conflict resolution\n- Use append-only operation log with deterministic merge strategy\n- Maintain backward compatibility with v1.x system\n\n**Resolution:** Successfully developed a CRDT-based architecture that enables 100+ concurrent workers to synchronize without manual conflict resolution, providing provable convergence and scalability for distributed issue tracking.","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-10-29T10:23:57.978339-07:00","updated_at":"2025-12-14T16:47:20.278632-08:00","closed_at":"2025-11-08T00:54:51.171319-08:00"}
|
||
{"id":"bd-71107098","title":"Make two-clone workflow actually work (no hacks)","description":"**Summary:** Fixed two-clone issue synchronization by implementing content-hash based rename detection, ensuring that simultaneous issue creation across independent git clones converges correctly without manual intervention.\n\n**Key Decisions:** \n- Use content hash for rename detection\n- Compare content, not timestamps\n- Automatic collision resolution strategy\n\n**Resolution:** TestTwoCloneCollision now passes, demonstrating a clean, automatic workflow for collaborative issue tracking across multiple clones.","status":"closed","priority":0,"issue_type":"epic","created_at":"2025-10-28T16:34:53.278793-07:00","updated_at":"2025-12-14T16:43:28.766425-08:00","closed_at":"2025-10-28T19:20:04.143242-07:00"}
|
||
{"id":"bd-71ky","title":"Fix bd --version and bd completion to work without database","description":"","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-08T02:06:00.78393-08:00","updated_at":"2025-12-14T16:47:24.096163-08:00","closed_at":"2025-11-08T02:06:11.452474-08:00"}
|
||
{"id":"bd-72w","title":"Q4 Platform Improvements","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-03T19:54:03.794244-08:00","updated_at":"2025-12-14T16:45:34.411984-08:00","closed_at":"2025-11-05T00:25:06.51152-08:00"}
|
||
{"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-12-14T16:44:53.654178-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-12-14T16:45:36.901076-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-73iz","title":"Test issue 1","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-07T19:04:17.430269-08:00","updated_at":"2025-12-14T16:46:53.581455-08:00","closed_at":"2025-11-07T21:55:09.427697-08:00"}
|
||
{"id":"bd-73u","title":"Refactor daemon local-only sync functions to reduce duplication","description":"PR #433 added three new local-only sync functions (createLocalSyncFunc, createLocalExportFunc, createLocalAutoImportFunc) that are largely copy-paste of existing ones with git operations removed. Refactor to use a single implementation with a skipGit bool parameter or extract shared logic into helper functions to reduce ~200 lines of duplication.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-01T17:38:02.632264-08:00","updated_at":"2025-12-02T23:28:48.752202-08:00","closed_at":"2025-12-01T21:08:11.952459-08:00"}
|
||
{"id":"bd-74ee","title":"Frontend task","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-03T19:11:59.358631-08:00","updated_at":"2025-12-14T16:45:32.351462-08:00","closed_at":"2025-11-05T00:25:06.457813-08:00"}
|
||
{"id":"bd-74q9","title":"Issue to reopen with reason","description":"","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-22T14:57:44.493560585-05:00","updated_at":"2025-12-14T16:47:49.70816-08:00","closed_at":"2025-11-09T16:13:23.938513-08:00"}
|
||
{"id":"bd-763c","title":"~/src/beads daemon has 'sql: database is closed' errors - zombie daemon","description":"","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-10-31T21:08:03.388007-07:00","updated_at":"2025-12-14T16:44:23.174289-08: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-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":"open","priority":2,"issue_type":"bug","created_at":"2025-11-09T16:20:13.191156-08:00","updated_at":"2025-11-09T16:20:13.191156-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-12-14T16:45:35.171765-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-7a00c94e","title":"Rapid 2","description":"","status":"closed","priority":3,"issue_type":"task","created_at":"2025-10-29T19:11:57.430725-07:00","updated_at":"2025-12-14T16:47:03.867711-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":"**Summary:** Implemented a clone-scoped ID allocation strategy to prevent identifier collisions across multiple database instances by adding a unique clone UUID suffix to ID generation.\n\n**Key Decisions:**\n- Add 4-char clone UUID suffix to IDs\n- Create clone_identity tracking table\n- Maintain backward compatibility\n\n**Resolution:** Developed a scalable, low-overhead ID allocation mechanism that ensures globally unique identifiers without central coordination.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-10-29T20:02:47.952447-07:00","updated_at":"2025-12-14T16:46:23.949127-08:00","closed_at":"2025-11-06T19:27:29.41629-08:00"}
|
||
{"id":"bd-7bbc4e6a","title":"Add MCP server functions for repair commands","description":"**Summary:** Implemented new MCP server repair functions for agent access, including dependency repair, pollution detection, and system validation. Updated server interfaces and added support for CLI and daemon execution modes.\n\n**Key Decisions:** \n- Added abstract methods to BdClientBase\n- Created wrapper functions in tools.py\n- Implemented function stubs with NotImplementedError\n- Registered commands using @mcp.tool decorators\n\n**Resolution:** Successfully added three core repair commands to MCP server infrastructure, enabling more robust system maintenance and health checking capabilities.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-28T19:37:55.72639-07:00","updated_at":"2025-12-14T16:46:49.472889-08:00","closed_at":"2025-11-07T19:38:12.152437-08:00"}
|
||
{"id":"bd-7bd2","title":"Complete remaining sync branch daemon tests","description":"**Summary:** Completed sync branch daemon tests by addressing test scenario gaps in daemon_sync_branch_test.go, focusing on branch initialization, worktree handling, and remote synchronization processes.\n\n**Key Decisions:**\n- Reorder test initialization sequence\n- Verify worktree auto-repair mechanisms\n- Validate remote branch synchronization workflows\n\n**Resolution:** All 7 tests now pass, significantly improving test suite reliability and daemon integration coverage.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-02T16:29:29.044162-08:00","updated_at":"2025-12-14T16:44:51.773943-08:00","closed_at":"2025-11-02T16:39:53.277529-08:00","dependencies":[{"issue_id":"bd-7bd2","depends_on_id":"bd-502e","type":"discovered-from","created_at":"2025-11-02T16:29:29.045104-08:00","created_by":"stevey"}]}
|
||
{"id":"bd-7c5915ae","title":"Run final validation and cleanup checks","description":"**Summary:** Comprehensive cleanup and validation pass performed on codebase to enhance code quality and system integrity. Systematic review targeted code complexity, test coverage, and potential optimization areas.\n\n**Key Decisions:**\n- Remove 5 unreachable functions\n- Improve test coverage in low-performing packages\n- Address critical linting issues\n\n**Resolution:** Reduced codebase complexity, maintained test pass rates, and generated a streamlined 24.5 MB binary with clear optimization roadmap.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T20:49:49.131575-07:00","updated_at":"2025-12-14T16:44:14.132582-08:00","closed_at":"2025-10-31T15:12:01.955668-07:00","dependencies":[{"issue_id":"bd-7c5915ae","depends_on_id":"bd-fb95094c","type":"parent-child","created_at":"2025-10-31T19:38:09.176473-07:00","created_by":"stevey"}]}
|
||
{"id":"bd-7c831c51","title":"Run final validation and cleanup checks","description":"**Summary:** Completed comprehensive validation pass on codebase, focusing on code quality, test coverage, and cleanup. Identified and removed dead code, ran full suite of checks including linting, builds, and integration tests.\n\n**Key Decisions:**\n- Remove unreachable `DroppedEventsCount` function\n- Address test coverage gaps across multiple modules\n- Track 73 linting issues for future cleanup\n\n**Resolution:** Successfully validated cleanup objectives, reducing technical debt and preparing for future improvements with targeted follow-up testing issues.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T20:02:47.956276-07:00","updated_at":"2025-12-14T16:43:35.799971-08:00","closed_at":"2025-10-29T14:19:35.095553-07:00"}
|
||
{"id":"bd-7ch","title":"Auto-push after merge with safety check","description":"Make bd sync a true one-command solution by auto-pushing after successful content merge.\n\nBehavior:\n- After successful content merge, auto-push by default\n- Safety check: detect when \u003e50% issues vanished AND \u003e5 existed before\n- On safety check trigger: warn but still push (do not block happy path)\n\nVanished means issues removed from issues.jsonl entirely, NOT status=closed (closed is legitimate swarm completion).\n\nLocation: internal/syncbranch/worktree.go\nParent issue: bd-3s8","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-02T19:30:59.540636-08:00","updated_at":"2025-12-13T08:15:21.912023+11:00","closed_at":"2025-12-03T22:12:25.328091-08:00"}
|
||
{"id":"bd-7da9437e","title":"Latency test","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-29T15:28:52.729923-07:00","updated_at":"2025-12-14T16:44:03.102983-08:00","closed_at":"2025-10-31T12:00:43.184758-07:00"}
|
||
{"id":"bd-7di","title":"worktree: any bd command is slow","description":"in a git worktree any bd command is slow, with a 2-3s pause before any results are shown. The identical command with `--no-daemon` is near instant.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-05T15:33:42.924618693-07:00","updated_at":"2025-12-05T15:33:42.924618693-07:00"}
|
||
{"id":"bd-7e0d6660","title":"Handle unchecked errors (errcheck - 683 issues)","description":"**Summary:** Resolved 683 unchecked error returns by enabling errcheck linter and systematically addressing error handling in production code. Focused on critical database, file, and client closure patterns using best practices.\n\n**Key Decisions:** \n- Enable errcheck linter with test exclusions\n- Use defer with blank error assignments for resource closures\n- Follow Oracle guidance for error handling patterns\n\n**Resolution:** 27 production code errors fixed, linter now clean with only 2 minor unrelated warnings remaining.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-10-27T23:20:10.392336-07:00","updated_at":"2025-12-14T16:43:11.871501-08:00","closed_at":"2025-10-27T23:05:31.945328-07:00"}
|
||
{"id":"bd-7e7ddffa","title":"Repair Commands \u0026 AI-Assisted Tooling","description":"Add specialized repair tools to reduce agent repair burden:\n1. Git merge conflicts in JSONL\n2. Duplicate issues from parallel work\n3. Semantic inconsistencies\n4. Orphaned references\n\nSee ~/src/fred/beads/repair_commands.md for full design doc.\n\nReduces agent repair time from 5-10 minutes to \u003c30 seconds per repair.","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-10-28T19:30:17.465812-07:00","updated_at":"2025-12-14T16:44:57.447725-08:00","closed_at":"2025-11-02T17:08:52.043117-08:00"}
|
||
{"id":"bd-7e7ddffa.1","title":"bd resolve-conflicts - Git merge conflict resolver","description":"Automatically resolve JSONL merge conflicts.\n\nModes:\n- Mechanical: ID remapping (no AI)\n- AI-assisted: Smart merge/keep decisions\n- Interactive: Review each conflict\n\nHandles \u003c\u003c\u003c\u003c\u003c\u003c\u003c conflict markers in .beads/beads.jsonl\n\nFiles: cmd/bd/resolve_conflicts.go (new)","status":"open","priority":1,"issue_type":"task","created_at":"2025-10-28T14:48:30.083642-07:00","updated_at":"2025-10-30T17:12:58.220145-07:00","dependencies":[{"issue_id":"bd-7e7ddffa.1","depends_on_id":"bd-7e7ddffa","type":"parent-child","created_at":"2025-10-29T19:58:28.847736-07:00","created_by":"stevey"}]}
|
||
{"id":"bd-7eed","title":"Remove obsolete stale.go command (executor tables never implemented)","description":"","status":"closed","priority":2,"issue_type":"chore","created_at":"2025-10-31T21:27:05.555369-07:00","updated_at":"2025-12-14T16:44:20.860705-08:00","closed_at":"2025-10-31T21:27:11.427631-07:00"}
|
||
{"id":"bd-7fe8","title":"Fix linting error in migrate.go","description":"Linter reports error:\n```\ncmd/bd/migrate.go:647:37: cleanupWALFiles - result 0 (error) is always nil (unparam)\n```\n\nThe `cleanupWALFiles` function always returns nil, so the error return type should be removed or the function should actually return errors when appropriate.","status":"closed","priority":2,"issue_type":"chore","created_at":"2025-11-02T09:29:37.279747-08:00","updated_at":"2025-12-14T16:44:43.568618-08:00","closed_at":"2025-11-02T09:46:52.18793-08:00","dependencies":[{"issue_id":"bd-7fe8","depends_on_id":"bd-1231","type":"blocks","created_at":"2025-11-02T09:29:37.280881-08:00","created_by":"stevey"}]}
|
||
{"id":"bd-7kua","title":"Reduce sync rounds in multiclone tests","description":"Analyze and reduce the number of sync rounds in hash multiclone tests.\n\nCurrent state:\n- TestHashIDs_MultiCloneConverge: 1 round of syncs across 3 clones\n- TestHashIDs_IdenticalContentDedup: 2 rounds across 2 clones\n\nInvestigation needed:\n- Profile to see how much time each sync takes\n- Determine minimum rounds needed for convergence\n- Consider making rounds configurable via env var\n\nFile: beads_hash_multiclone_test.go:70, :132","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-04T01:24:18.405038-08:00","updated_at":"2025-12-14T16:45:14.204803-08:00","closed_at":"2025-11-04T10:26:34.449434-08:00","dependencies":[{"issue_id":"bd-7kua","depends_on_id":"bd-l5gq","type":"blocks","created_at":"2025-11-04T01:24:18.405883-08:00","created_by":"daemon"}]}
|
||
{"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":"open","priority":2,"issue_type":"feature","created_at":"2025-12-14T16:32:19.944847-08:00","updated_at":"2025-12-14T16:32:19.944847-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-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":"open","priority":1,"issue_type":"bug","created_at":"2025-11-21T19:51:55.747608-05:00","updated_at":"2025-11-21T19:51:55.747608-05:00"}
|
||
{"id":"bd-8072","title":"Add import.orphan_handling config option","description":"Add configuration option to control orphan handling behavior: 'strict' (fail on missing parent, current behavior), 'resurrect' (auto-resurrect from JSONL, recommended default), 'skip' (skip orphaned issues with warning), 'allow' (import orphans without validation). Update CONFIG.md documentation.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-04T12:32:08.569239-08:00","updated_at":"2025-12-14T16:45:37.660825-08:00","closed_at":"2025-11-05T00:44:27.94816-08:00"}
|
||
{"id":"bd-812a","title":"Add unit tests for import ordering","description":"Test topological sort: import [child, parent] should succeed, import [parent.1.2, parent, parent.1] should sort correctly. Verify depth-based batching works. Test max depth limits.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-04T12:32:21.278448-08:00","updated_at":"2025-12-14T16:45:27.518111-08:00","closed_at":"2025-11-05T00:08:42.812952-08:00"}
|
||
{"id":"bd-81a","title":"Add programmatic tip injection API","description":"Allow tips to be programmatically injected at runtime based on detected conditions. This enables dynamic tips (not just pre-defined ones) to be shown with custom priority and frequency.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-11T23:29:46.645583-08:00","updated_at":"2025-12-09T18:38:37.680039471-05:00","closed_at":"2025-11-25T17:52:35.096882-08:00","dependencies":[{"issue_id":"bd-81a","depends_on_id":"bd-d4i","type":"blocks","created_at":"2025-11-11T23:29:46.646327-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-81abb639","title":"Investigate jujutsu VCS as potential solution for conflict-free merging","description":"**Summary:** Investigated jujutsu (jj) VCS as a potential solution for improving conflict resolution in multi-clone collaboration, specifically focusing on JSONL file merging and concurrent edit handling.\n\n**Key Decisions:**\n- Evaluate jj's CRDT and conflict resolution capabilities\n- Test compatibility with existing Git infrastructure\n- Compare merge performance against current Git-based approach\n\n**Resolution:** Investigation completed with comprehensive technical report, revealing jj's potential for advanced merge scenarios but not definitively recommending immediate adoption.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-29T20:02:47.953008-07:00","updated_at":"2025-12-14T16:43:39.083728-08:00","closed_at":"2025-10-29T20:47:52.910985-07:00"}
|
||
{"id":"bd-81x6","title":"Tombstone export includes tombstones even with --status filter","description":"In export.go, we set IncludeTombstones: true unconditionally. However, if a user runs:\n\n bd export --status=open\n\nThey might not expect tombstones in the output. The IncludeTombstones flag should probably only be set when no status filter is specified, or when --status=tombstone is explicitly requested.\n\nCurrent behavior: exports tombstones regardless of status filter\nExpected behavior: respect status filter, only include tombstones when explicitly requested or no filter","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-07T01:40:52.762758-08:00","updated_at":"2025-12-07T02:00:02.011512-08:00","closed_at":"2025-12-07T02:00:02.011512-08:00","dependencies":[{"issue_id":"bd-81x6","depends_on_id":"bd-dve","type":"blocks","created_at":"2025-12-07T01:41:28.320845-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-824","title":"Add migration guide for library consumers","description":"**Summary:** Added migration guidance for library consumers of beadsLib, focusing on clarifying changes in configuration and storage initialization for v0.18.0. The documentation now provides clear examples demonstrating backward compatibility and new multi-repository configuration options.\n\n**Key Decisions:**\n- Maintain backward compatibility for existing library initialization\n- Support transparent config.toml reading\n- Enable explicit multi-repo configuration\n- Provide clear code migration examples\n\n**Resolution:** Updated contributor-workflow-analysis.md with comprehensive Go/TypeScript migration examples, ensuring library users can smoothly transition to v0.18.0 with minimal code changes.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-03T20:24:17.748337-08:00","updated_at":"2025-12-14T16:45:55.29601-08:00","closed_at":"2025-11-05T14:15:44.154675-08:00"}
|
||
{"id":"bd-82dv","title":"cmd/bd tests fail without -short flag (parallel test deadlock)","description":"","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-08T22:58:38.72748-08:00","updated_at":"2025-12-14T16:47:46.581236-08:00","closed_at":"2025-11-09T12:54:44.557562-08:00"}
|
||
{"id":"bd-833559b3","title":"bd validate - Comprehensive health check","description":"Run all validation checks in one command.\n\nChecks:\n- Duplicates\n- Orphaned dependencies\n- Test pollution\n- Git conflicts\n\nSupports --fix-all for auto-repair.\n\nDepends on bd-cbed9619.1, bd-0dcea000, bd-2752a7a2, bd-9826b69a.\n\nFiles: cmd/bd/validate.go (new)","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T20:02:47.957692-07:00","updated_at":"2025-12-14T16:45:32.253476-08:00","closed_at":"2025-11-05T00:16:42.294117-08:00"}
|
||
{"id":"bd-83xx","title":"bd cleanup fails with CHECK constraint on status/closed_at mismatch","description":"## Problem\n\nRunning `bd cleanup --force` fails with:\n\n```\nError: failed to create tombstone for bd-okh: sqlite3: constraint failed: CHECK constraint failed: (status = 'closed') = (closed_at IS NOT NULL)\n```\n\n## Root Cause\n\nThe database has a CHECK constraint ensuring closed issues have `closed_at` set and non-closed issues don't. When `bd cleanup` tries to convert a closed issue to a tombstone, this constraint fails if:\n1. The issue has status='closed' but closed_at is NULL, OR\n2. The issue is being converted but the tombstone creation doesn't properly handle the closed_at field\n\n## Impact\n\n- `bd cleanup --force` cannot complete\n- 722 closed issues cannot be cleaned up\n- Blocks routine maintenance\n\n## Investigation Needed\n\n1. Check the bd-okh record in the database:\n ```sql\n SELECT id, status, closed_at, deleted_at FROM issues WHERE id = 'bd-okh';\n ```\n2. Determine if this is data corruption or a bug in tombstone creation\n\n## Proposed Solutions\n\n1. **If data corruption**: Add a `bd doctor --fix` check that repairs status/closed_at mismatches\n2. **If code bug**: Fix the tombstone creation to properly handle the constraint\n\n## Files to Investigate\n\n- `internal/storage/sqlite/sqlite.go` - DeleteIssue / tombstone creation\n- Schema CHECK constraint definition\n\n## Acceptance Criteria\n\n- [ ] Identify root cause (data vs code bug)\n- [ ] `bd cleanup --force` completes successfully\n- [ ] `bd doctor` detects status/closed_at mismatches","status":"open","priority":1,"issue_type":"bug","created_at":"2025-12-13T23:49:54.012806-08:00","updated_at":"2025-12-14T00:26:19.76258-08:00"}
|
||
{"id":"bd-8507","title":"Publish bd-wasm to npm","description":"Package and publish WASM build to npm. Child of epic bd-44d0.\n\n## Tasks\n- [ ] Optimize WASM bundle (compression)\n- [ ] Create README for npm package\n- [ ] Set up npm publishing workflow\n- [ ] Publish v0.1.0-alpha\n- [ ] Test installation in clean environment\n- [ ] Update beads AGENTS.md with installation instructions\n\n## Package Name\nbd-wasm (or @beads/wasm-cli)","status":"closed","priority":0,"issue_type":"task","created_at":"2025-11-02T18:33:31.371535-08:00","updated_at":"2025-12-14T16:45:44.546021-08:00","closed_at":"2025-11-05T00:55:48.757494-08:00","dependencies":[{"issue_id":"bd-8507","depends_on_id":"bd-197b","type":"blocks","created_at":"2025-11-02T18:33:31.372224-08:00","created_by":"daemon"},{"issue_id":"bd-8507","depends_on_id":"bd-374e","type":"blocks","created_at":"2025-11-02T22:27:56.025207-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-8534","title":"Switch from modernc.org/sqlite to ncruces/go-sqlite3 for WASM support","description":"modernc.org/sqlite depends on modernc.org/libc which has no js/wasm support (platform-specific syscalls). Need to switch to ncruces/go-sqlite3 which wraps a WASM build of SQLite using wazero runtime.\n\nKey differences:\n- ncruces/go-sqlite3: Uses WASM build of SQLite + wazero runtime\n- modernc.org/sqlite: Pure Go translation, requires libc for syscalls\n\nThis is a prerequisite for bd-62a0 (WASM build infrastructure).","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-02T22:14:27.627154-08:00","updated_at":"2025-12-14T16:45:03.124201-08:00","closed_at":"2025-11-02T22:23:49.377223-08:00","dependencies":[{"issue_id":"bd-8534","depends_on_id":"bd-44d0","type":"parent-child","created_at":"2025-11-02T22:23:49.555691-08:00","created_by":"stevey"}]}
|
||
{"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-14T16:47:43.716237-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-12-14T16:45:38.091752-08:00","closed_at":"2025-11-05T00:44:27.948467-08:00"}
|
||
{"id":"bd-879d","title":"Test issue 1","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-02T09:44:12.538697729Z","updated_at":"2025-12-14T16:44:42.007526-08:00","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":"**Summary:** Published @beads/bd npm package to public registry after comprehensive testing, ensuring quality and global accessibility for the bd CLI tool.\n\n**Key Decisions:**\n- Use @beads namespace\n- Perform local tarball verification\n- Confirm version alignment\n\n**Resolution:** Successfully distributed package on npm, enabling public use and installation of bd CLI tool.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-02T23:40:25.263569-08:00","updated_at":"2025-12-14T16:45:07.303593-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!","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-29T15:28:33.564871-07:00","updated_at":"2025-12-14T16:43:57.663753-08: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":"**Summary:** Daemon stability issue identified with auto-import blocking during git conflicts, causing RPC failures and potential data corruption. Implemented a robust synchronization strategy to prevent process interruptions.\n\n**Key Decisions:**\n- Non-blocking auto-import mechanism\n- Separate goroutine for import operations\n- Graceful git pull failure handling\n\n**Resolution:** Patched daemon to prevent state corruption, significantly improving reliability in collaborative development environments.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-02T17:15:25.181425-08:00","updated_at":"2025-12-14T16:45:07.8682-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-897a","title":"Add UNIQUE constraint on external_ref column","description":"**Summary:** Added a UNIQUE constraint to the external_ref column to prevent duplicate references and ensure data integrity when syncing from external issue tracking systems.\n\n**Key Decisions:**\n- Implement database-level UNIQUE constraint\n- Perform pre-migration duplicate resolution\n- Update query and test behaviors\n\n**Resolution:** UNIQUE constraint now enforces single external reference per issue, improving data consistency and predictability of issue retrieval.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-02T15:31:54.718005-08:00","updated_at":"2025-12-14T16:44:53.093679-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":"**Summary:** A daemon export process was overwriting recent database changes due to synchronization issues. The problem stemmed from failing to import the latest state before generating a new export.\n\n**Key Decisions:**\n- Implement auto-import before daemon export\n- Add version/timestamp validation\n- Prevent stale state overwriting\n\n**Resolution:** Safeguards were added to ensure daemons import the most recent state, preventing unintended data loss in collaborative environments.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-01T21:53:07.930819-07:00","updated_at":"2025-12-14T16:44:36.013018-08: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":"open","priority":2,"issue_type":"task","created_at":"2025-10-28T16:20:02.432202-07:00","updated_at":"2025-10-30T17:12:58.222655-07:00"}
|
||
{"id":"bd-8a39","title":"Fix Windows-specific test failures in CI","description":"**Summary:** Resolved Windows-specific test failures in CI by addressing cross-platform compatibility issues in path handling and command execution. Identified and fixed differences between Windows and Linux testing environments.\n\n**Key Decisions:**\n- Canonicalize filesystem paths\n- Use platform-specific executable commands\n- Normalize git path conversions\n\n**Resolution:** Improved cross-platform test reliability and consistency across operating systems.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-02T09:29:37.274103-08:00","updated_at":"2025-12-14T16:44:45.041977-08:00","closed_at":"2025-11-02T12:32:00.158716-08:00","dependencies":[{"issue_id":"bd-8a39","depends_on_id":"bd-1231","type":"blocks","created_at":"2025-11-02T09:29:37.276579-08:00","created_by":"stevey"}]}
|
||
{"id":"bd-8a5","title":"Refactor: deduplicate FindJSONLInDir and FindJSONLPath","description":"## Background\n\nAfter fixing bd-tqo, we now have two nearly identical functions for finding the JSONL file:\n- `autoimport.FindJSONLInDir(dbDir string)` in internal/autoimport/autoimport.go\n- `beads.FindJSONLPath(dbPath string)` in internal/beads/beads.go\n\nBoth implement the same logic:\n1. Prefer issues.jsonl\n2. Fall back to beads.jsonl for legacy support\n3. Skip deletions.jsonl and merge artifacts\n4. Default to issues.jsonl if nothing found\n\n## Problem\n\nCode duplication means bug fixes need to be applied in multiple places (as we just experienced with bd-tqo).\n\n## Proposed Solution\n\nExtract shared logic to a utility package that both can import. Options:\n1. Create `internal/jsonlpath` package with the core logic\n2. Have `autoimport` import `beads` and call `FindJSONLPath` (but APIs differ slightly)\n3. Move to `internal/utils` if appropriate\n\nNeed to verify no import cycles would be created.\n\n## Affected Files\n- internal/autoimport/autoimport.go\n- internal/beads/beads.go","status":"closed","priority":4,"issue_type":"task","created_at":"2025-11-26T23:45:18.974339-08:00","updated_at":"2025-12-02T17:11:19.733265251-05:00","closed_at":"2025-11-28T23:07:08.912247-08:00"}
|
||
{"id":"bd-8an","title":"bd import auto-detects wrong prefix from directory name instead of issue IDs","description":"When importing issues.jsonl into a fresh database, 'bd import' prints:\n\n ✓ Initialized database with prefix 'beads' (detected from issues)\n\nBut the issues all have prefix 'bd-' (e.g., bd-03r). It appears to be detecting the prefix from the directory name (.beads/) rather than from the actual issue IDs in the JSONL.\n\nThis causes import to fail with:\n validate ID prefix for bd-03r: issue ID 'bd-03r' does not match configured prefix 'beads'\n\nWorkaround: Run 'bd config set issue_prefix bd' before import, or use 'bd init --prefix bd'.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-26T22:28:01.582564-08:00","updated_at":"2025-12-02T17:11:19.734136748-05:00","closed_at":"2025-11-27T22:38:48.971617-08:00"}
|
||
{"id":"bd-8ayj","title":"bd-hv01: Race condition with concurrent snapshot operations","description":"**Summary:** A race condition in snapshot file generation was discovered where concurrent processes could overwrite and corrupt snapshot data. The issue stemmed from lack of atomic file operations during multi-process snapshot captures.\n\n**Key Decisions:**\n- Implement process-specific temporary files\n- Use atomic OS rename for file replacement\n- Add PID-based file naming to ensure unique temp files\n\n**Resolution:** Atomic file operations were introduced in the snapshot capture function, preventing data corruption and ensuring safe concurrent snapshot generation across multiple processes.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-06T18:15:38.177367-08:00","updated_at":"2025-12-14T16:46:15.526764-08:00","closed_at":"2025-11-06T18:46:55.91344-08:00","dependencies":[{"issue_id":"bd-8ayj","depends_on_id":"bd-rbxi","type":"parent-child","created_at":"2025-11-06T18:19:14.875543-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-8b65","title":"Add depth-based batch creation in upsertIssues","description":"Replace single batch creation with depth-level batching (max depth 3). Create issues at depth 0, then 1, then 2, then 3. Prevents parent validation errors when importing hierarchical issues in same batch. File: internal/importer/importer.go:534-546","status":"closed","priority":0,"issue_type":"task","created_at":"2025-11-04T12:31:42.267746-08:00","updated_at":"2025-12-14T16:45:28.045562-08:00","closed_at":"2025-11-05T00:08:42.813246-08:00"}
|
||
{"id":"bd-8f8b","title":"Test update","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-05T12:59:13.608216-08:00","updated_at":"2025-12-14T16:45:50.98958-08:00","closed_at":"2025-11-05T12:59:20.120052-08:00"}
|
||
{"id":"bd-8f9","title":"Add bd migrate-tombstones command","description":"Create migration command to convert existing deletions.jsonl entries to tombstones. Support --dry-run and --verbose flags. Archive old file with .migrated suffix. Per design bd-dli.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-05T15:14:45.098831-08:00","updated_at":"2025-12-13T09:42:56.870081+11:00","closed_at":"2025-12-07T02:30:19.4741-08:00","dependencies":[{"issue_id":"bd-8f9","depends_on_id":"bd-dve","type":"blocks","created_at":"2025-12-05T15:14:58.968329-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-8g8","title":"Fix G304 potential file inclusion in cmd/bd/tips.go:259","description":"Linting issue: G304: Potential file inclusion via variable (gosec) at cmd/bd/tips.go:259:18. Error: if data, err := os.ReadFile(settingsPath); err == nil {","status":"open","priority":0,"issue_type":"bug","created_at":"2025-12-07T15:34:57.189730843-07:00","updated_at":"2025-12-07T15:34:57.189730843-07:00"}
|
||
{"id":"bd-8hf","title":"Auto-routing and maintainer detection","description":"Implement intelligent routing to automatically send new issues to correct repo based on user's maintainer vs contributor status, with discovered issues inheriting parent's source_repo.","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-04T11:21:50.961196-08:00","updated_at":"2025-12-14T16:45:28.287608-08:00","closed_at":"2025-11-05T00:08:42.813484-08:00","dependencies":[{"issue_id":"bd-8hf","depends_on_id":"bd-4ms","type":"parent-child","created_at":"2025-11-04T11:22:24.262815-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-8ib","title":"Update git hooks to be sync.branch aware","description":"## Problem\n\nThe pre-push hook blocks pushes when .beads/issues.jsonl has uncommitted changes. But with sync.branch configured, those changes are intentionally NOT committed to main - they go to the sync branch via worktree.\n\n## Current Behavior\n\n1. User configures sync.branch=beads-sync\n2. bd sync commits changes to beads-sync via worktree \n3. Local .beads/issues.jsonl is updated (needed for import)\n4. git push to main triggers pre-push hook\n5. Hook sees uncommitted .beads changes and blocks push\n6. User must use --no-verify to push\n\n## Expected Behavior\n\nWhen sync.branch is configured, the pre-push hook should:\n1. Check if sync.branch is set (bd config get sync.branch)\n2. If set, skip the .beads uncommitted check OR\n3. Verify changes are committed to the sync branch instead\n\n## Affected Files\n\n- examples/git-hooks/pre-push\n- examples/git-hooks/pre-commit (may also need update)\n\n## Workaround\n\nUse git push --no-verify","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-30T00:43:40.991951-08:00","updated_at":"2025-11-30T11:12:09.91242-08:00","closed_at":"2025-11-30T11:12:09.91242-08:00"}
|
||
{"id":"bd-8ift","title":"Debug test","description":"","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-08T00:04:35.254385-08:00","updated_at":"2025-12-14T16:47:09.593176-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":"**Summary:** Auto-import was causing deleted issues to be resurrected during bulk deletion operations due to premature import runs. The team resolved this by modifying the import workflow to skip during delete operations.\n\n**Key Decisions:**\n- Add delete to skip list in PersistentPreRun\n- Implement atomic delete without auto-import interference\n- Create comprehensive regression test\n\n**Resolution:** Bulk delete operations now work reliably, preventing unintended issue resurrection and improving database management consistency.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-08T03:01:09.796852-08:00","updated_at":"2025-12-14T16:47:32.919171-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-12-14T16:47:35.65933-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-8nz","title":"Merge timestamp tie-breaker should prefer local (left)","description":"In mergeFieldByUpdatedAt, when timestamps are exactly equal, right wins. For consistency with IssueType (where local/left wins), equal timestamps should prefer left. Minor inconsistency.","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-02T20:14:59.898345-08:00","updated_at":"2025-12-13T08:15:21.91226+11:00","closed_at":"2025-12-03T22:18:17.242011-08:00"}
|
||
{"id":"bd-8ph6","title":"Support Ubuntu 20.04 LTS (glibc compatibility issue)","description":"**Summary:** Discovered glibc compatibility issue preventing precompiled binaries from running on Ubuntu 20.04 LTS due to Go runtime requirements. Instead of pinning Go version, chose to document minimum system requirements.\n\n**Key Decisions:**\n- Require glibc 2.32+ for precompiled binaries\n- Recommend upgrading OS or building from source\n- Avoid version pinning to maintain future Go compatibility\n\n**Resolution:** Added clear system requirements to README, maintaining project flexibility while guiding users on compatibility constraints.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-07T14:25:47.055357-08:00","updated_at":"2025-12-14T16:46:41.946485-08:00","closed_at":"2025-11-07T14:30:15.755733-08:00"}
|
||
{"id":"bd-8q0","title":"Add Claude Code web installation docs to README","description":"GH #439 reported installation issues in Claude Code web environment. The go install fallback works, but users need guidance. Add a section to README documenting the workaround: go install + PATH export.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-01T21:02:24.511955-08:00","updated_at":"2025-12-01T21:10:10.587639-08:00","closed_at":"2025-12-01T21:10:10.587639-08:00"}
|
||
{"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-12-14T16:46:47.337194-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-8uk","title":"Missing test for PullResult.SafetyWarnings population","description":"","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-02T21:56:08.413387-08:00","updated_at":"2025-12-02T22:11:17.630494-08:00","closed_at":"2025-12-02T22:11:17.630494-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"}
|
||
{"id":"bd-8zf2","title":"MCP server loses workspace context after Amp restart - causes silent failures","description":"**Summary:** A critical bug was discovered where the MCP server loses workspace context after Amp restarts, causing silent failures and potential data corruption. The issue impacts multi-session workflows and required a systematic approach to context management.\n\n**Key Decisions:** \n- Implement auto-workspace detection by searching for `.beads/` directory\n- Support fallback mechanisms for context restoration\n- Maintain compatibility with existing CLI behaviors\n\n**Resolution:** Option 1 was selected, implementing automatic workspace detection that matches CLI behavior, eliminating manual context setting and preventing silent failures across Amp sessions.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-07T23:50:52.083111-08:00","updated_at":"2025-12-14T16:47:07.193514-08:00","closed_at":"2025-11-07T23:58:44.397502-08:00"}
|
||
{"id":"bd-8zpg","title":"Add tests for bd init --contributor wizard","description":"Write integration tests for the contributor wizard:\n- Test fork detection logic\n- Test planning repo creation\n- Test config setup\n- Test with/without upstream remote\n- Test with SSH vs HTTPS origins","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-05T18:58:18.171851-08:00","updated_at":"2025-12-14T16:46:11.757936-08:00","closed_at":"2025-11-06T16:14:06.341689-08:00"}
|
||
{"id":"bd-9063acda","title":"Clean up linter errors (914 total issues)","description":"**Summary:** Systematically reduced project linter errors from 914 to 0 by addressing code quality problems. Discovered potential configuration compatibility between local and CI environments.\n\n**Key Decisions:** \n- Methodically resolve individual linter errors\n- Configure exclusion rules\n- Compare local/CI lint configurations\n\n**Resolution:** Local linting successful, but requires additional CI pipeline investigation to ensure complete resolution.","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-10-24T01:01:12.997982-07:00","updated_at":"2025-12-14T16:45:18.737884-08:00","closed_at":"2025-11-04T11:10:23.532433-08:00"}
|
||
{"id":"bd-908z","title":"Add bd hooks install command to embed git hooks in binary","description":"**Summary:** Implemented a native `bd hooks install` command to embed and manage git hooks directly within the bd binary, solving distribution challenges for users installing via different methods.\n\n**Key Decisions:**\n- Use go:embed to package hook scripts\n- Support install/uninstall/list hook commands\n- Backup existing hooks during installation\n\n**Resolution:** New command enables consistent git hook management across all bd installation methods, improving user experience and hook deployment flexibility.","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-11-08T01:23:24.362827-08:00","updated_at":"2025-12-14T16:47:23.175939-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-12-14T16:44:46.110031-08:00","closed_at":"2025-11-02T12:32:00.159058-08:00"}
|
||
{"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":"open","priority":2,"issue_type":"epic","created_at":"2025-11-11T23:31:12.119012-08:00","updated_at":"2025-11-12T00:11:07.743189-08:00"}
|
||
{"id":"bd-91x","title":"Fix dependency naming inconsistencies (GH #440)","description":"Parent-child dependency documentation is backwards and UI labels are confusing.\\n\\nProblems:\\n1. DEPENDENCIES.md says 'bd dep add PARENT CHILD' but this is rejected\\n2. bd show displays epic children under 'Blocks' instead of 'Children'\\n3. bd dep tree EPIC shows nothing (need --direction=up)\\n4. Inconsistent with 'bd epic status' which uses 'children'\\n\\nSee: https://github.com/steveyegge/beads/issues/440","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-01T21:01:41.63295-08:00","updated_at":"2025-12-01T21:06:17.866688-08:00","closed_at":"2025-12-01T21:06:17.866688-08:00"}
|
||
{"id":"bd-93d","title":"Jira export script (jsonl2jira.py)","description":"Create a Python script to push beads issues to Jira.\n\n**Requires**: Jira import script to be complete first (need external_ref matching logic working)\n\n**Features needed**:\n- Create new Jira issues from beads issues without external_ref\n- Update existing Jira issues matched by external_ref\n- Map beads fields back to Jira fields\n- Handle Jira workflow transitions (status changes may need transitions)\n- Support custom field mapping for design/acceptance_criteria/notes\n\n**Challenges**:\n- Jira status changes often require workflow transitions, not direct updates\n- Need to discover valid transitions via API\n- Custom fields vary by Jira instance\n\n**Usage**:\n```bash\nbd export | python jsonl2jira.py --create-only # Only create, don't update\nbd export | python jsonl2jira.py # Create and update\n```\n\n**After creation**: Sets external_ref on beads issue to link back","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-30T12:56:14.266357-08:00","updated_at":"2025-11-30T15:19:40.264737-08:00","closed_at":"2025-11-30T15:19:40.264737-08:00","dependencies":[{"issue_id":"bd-93d","depends_on_id":"bd-qvj","type":"parent-child","created_at":"2025-11-30T12:56:44.652391-08:00","created_by":"stevey"},{"issue_id":"bd-93d","depends_on_id":"bd-tjn","type":"blocks","created_at":"2025-11-30T12:56:54.941116-08:00","created_by":"stevey"}]}
|
||
{"id":"bd-942469b8","title":"Rapid 5","description":"","status":"closed","priority":3,"issue_type":"task","created_at":"2025-10-29T19:11:57.508166-07:00","updated_at":"2025-12-14T16:47:02.712182-08:00","closed_at":"2025-11-07T23:18:52.298739-08:00"}
|
||
{"id":"bd-96142dec","title":"Add fallback to polling on watcher failure","description":"Detect fsnotify.NewWatcher() errors and log warning. Auto-switch to polling mode with 5s ticker. Add BEADS_WATCHER_FALLBACK env var to control behavior.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-28T16:20:02.428439-07:00","updated_at":"2025-12-14T16:43:55.782873-08:00","closed_at":"2025-10-28T19:23:43.595916-07:00"}
|
||
{"id":"bd-968f","title":"Add unit tests for config modes","description":"Test all four orphan_handling modes: strict (fails), resurrect (creates tombstone), skip (logs warning), allow (imports orphan). Verify error messages and logging output for each mode.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-04T12:32:21.367129-08:00","updated_at":"2025-12-14T16:45:38.073136-08:00","closed_at":"2025-11-05T00:44:27.948777-08:00"}
|
||
{"id":"bd-9826b69a","title":"CRDT-based architecture for guaranteed convergence (v2.0)","description":"**Summary:** Redesigned issue tracking architecture using CRDTs to solve multi-clone synchronization convergence problems, focusing on mathematically guaranteed conflict resolution at scale.\n\n**Key Decisions:**\n- Replace sequential IDs with UUIDs\n- Implement Last-Write-Wins registers\n- Create append-only operation log\n- Use Lamport timestamps for merge\n\n**Resolution:** Successfully developed CRDT system guaranteeing zero manual conflict resolution with acceptable performance and backward compatibility.","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-10-29T20:48:00.267736-07:00","updated_at":"2025-12-14T16:44:18.918819-08:00","closed_at":"2025-10-31T20:06:44.60536-07:00"}
|
||
{"id":"bd-98c4e1fa","title":"Event-driven daemon architecture","description":"**Summary:** Replaced 5-second polling sync with event-driven architecture using FileWatcher and Debouncer, achieving instant change detection and reducing CPU overhead by ~60%. Implemented mutation events infrastructure with safety mechanisms to prevent data loss.\n\n**Key Decisions:**\n- Use fsnotify for file change detection\n- 500ms debounce to prevent event storms\n- Separate export/import functions\n- Atomic dropped event counter for data integrity\n\n**Resolution:** Developed a low-latency, efficient event-driven daemon that responds to file changes in \u003c500ms, with robust error handling and platform-agnostic design pending final test coverage.","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-10-29T21:19:36.203436-07:00","updated_at":"2025-12-14T16:43:36.561993-08:00","closed_at":"2025-10-29T15:53:34.022335-07:00"}
|
||
{"id":"bd-98c4e1fa.1","title":"Update AGENTS.md with event-driven mode","description":"Document BEADS_DAEMON_MODE env var. Explain opt-in during Phase 1. Add troubleshooting for watcher failures.","status":"open","priority":2,"issue_type":"task","created_at":"2025-10-29T23:05:13.986452-07:00","updated_at":"2025-10-31T20:36:49.381832-07:00","dependencies":[{"issue_id":"bd-98c4e1fa.1","depends_on_id":"bd-98c4e1fa","type":"parent-child","created_at":"2025-10-29T21:19:36.206187-07:00","created_by":"import-remap"},{"issue_id":"bd-98c4e1fa.1","depends_on_id":"bd-0e1f2b1b","type":"parent-child","created_at":"2025-10-31T19:38:09.131439-07:00","created_by":"stevey"}]}
|
||
{"id":"bd-9ae788be","title":"Implement clone-scoped ID allocation to prevent N-way collisions","description":"**Summary:** Implemented a clone-specific ID allocation strategy to prevent ID collisions across multiple system clones by adding a unique clone UUID suffix to ID generation. This resolves the problem of independent clones creating duplicate identifiers when operating in distributed environments.\n\n**Key Decisions:**\n- Add 4-char clone UUID suffix to ID generation\n- Create `clone_identity` table to track clone instances\n- Modify `getNextIDForPrefix()` to include clone-specific identifier\n- Ensure backward compatibility with existing IDs\n\n**Resolution:** Successfully implemented a scalable ID allocation mechanism that eliminates N-way collision risks, enabling reliable identifier generation across 100+ distributed clones with minimal system overhead.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-10-29T10:22:52.260524-07:00","updated_at":"2025-12-14T16:47:16.864763-08:00","closed_at":"2025-11-08T00:36:58.134558-08:00"}
|
||
{"id":"bd-9auw","title":"convertDeletionToTombstone uses hardcoded default values","description":"The convertDeletionToTombstone helper (importer.go:1114-1130) uses hardcoded defaults:\n- Priority: 2\n- IssueType: types.TypeTask\n- Title: \"(deleted)\"\n\nThese defaults work but could be improved:\n1. Consider using Priority: 0 (unset) to distinguish from user-set priority\n2. OriginalType is empty string - consider setting IssueType to empty to be consistent\n3. Title could include the original ID for debugging: \"(deleted: bd-xyz)\"\n\nLow priority cleanup for consistency.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-07T01:41:02.390816-08:00","updated_at":"2025-12-07T02:19:52.824918-08:00","closed_at":"2025-12-07T02:19:52.824918-08:00","dependencies":[{"issue_id":"bd-9auw","depends_on_id":"bd-dve","type":"blocks","created_at":"2025-12-07T01:41:28.35551-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-9b13","title":"Backend task","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-03T19:11:59.359262-08:00","updated_at":"2025-12-14T16:45:33.978045-08:00","closed_at":"2025-11-05T00:25:06.484312-08:00"}
|
||
{"id":"bd-9bsx","title":"Recurring dirty state after merge conflicts - bd sync keeps failing","description":"**Summary:** The `bd sync` process was creating recurring dirty states after merge conflicts due to unconditional re-exporting of the database. A new `dbNeedsExport()` function was implemented to validate whether a re-export is actually necessary before performing the operation.\n\n**Key Decisions:**\n- Add integrity check before database export\n- Compare modification times and issue counts\n- Only re-export when actual divergence exists\n\n**Resolution:** The fix prevents infinite sync loops and eliminates data loss during merge conflicts, resolving weeks of recurring synchronization issues.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-05T17:52:14.776063-08:00","updated_at":"2025-12-14T16:46:01.320985-08:00","closed_at":"2025-11-05T17:58:35.611942-08:00"}
|
||
{"id":"bd-9cc","title":"bd doctor: export diagnostics history for debugging","description":"Add ability to save doctor diagnostics to a file (e.g., diagnostics.json) for historical analysis and bug reporting. This would help track intermittent issues and provide context when filing bug reports. Could integrate with --perf output for comprehensive system snapshots.","status":"closed","priority":4,"issue_type":"feature","created_at":"2025-12-02T12:52:23.711572-08:00","updated_at":"2025-12-07T01:24:31.630049-08:00","closed_at":"2025-12-07T01:24:31.630049-08:00"}
|
||
{"id":"bd-9cdc","title":"Update docs for import bug fix","description":"Update AGENTS.md, README.md, TROUBLESHOOTING.md with import.orphan_handling config documentation. Document resurrection behavior, tombstones, config modes. Add troubleshooting section for import failures with deleted parents.","status":"open","priority":2,"issue_type":"task","created_at":"2025-11-04T12:32:30.770415-08:00","updated_at":"2025-11-04T12:32:30.770415-08:00"}
|
||
{"id":"bd-9e23","title":"Optimize Memory backend GetIssueByExternalRef with index","description":"Currently GetIssueByExternalRef in Memory storage uses O(n) linear search through all issues.\n\nCurrent code (memory.go:282-308):\nfor _, issue := range m.issues {\n if issue.ExternalRef != nil \u0026\u0026 *issue.ExternalRef == externalRef {\n return \u0026issueCopy, nil\n }\n}\n\nProposed optimization:\n- Add externalRefToID map[string]string to MemoryStorage\n- Maintain it in CreateIssue, UpdateIssue, DeleteIssue\n- Achieve O(1) lookup like SQLite's index\n\nImpact: Low (--no-db mode typically has smaller datasets)\nRelated: bd-1022","status":"closed","priority":4,"issue_type":"chore","created_at":"2025-11-02T15:32:30.242357-08:00","updated_at":"2025-12-09T18:38:37.681315672-05:00","closed_at":"2025-11-26T11:14:49.172418-08:00"}
|
||
{"id":"bd-9e8d","title":"Test Issue","description":"","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-10-31T21:41:11.107393-07:00","updated_at":"2025-12-14T16:44:29.731412-08:00","closed_at":"2025-11-01T20:02:28.292279-07:00"}
|
||
{"id":"bd-9f1fce5d","title":"Add internal/ai package for LLM integration","description":"Shared AI client for repair commands.\n\nProviders:\n- Anthropic (Claude)\n- OpenAI (GPT)\n- Ollama (local)\n\nEnv vars:\n- BEADS_AI_PROVIDER\n- BEADS_AI_API_KEY\n- BEADS_AI_MODEL\n\nFiles: internal/ai/client.go (new)","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-28T14:48:29.072473-07:00","updated_at":"2025-12-14T16:46:22.218902-08:00","closed_at":"2025-11-06T19:27:19.128093-08:00"}
|
||
{"id":"bd-9f20","title":"DetectCycles SQL query has bug preventing cycle detection","description":"**Summary:** The DetectCycles SQL query was corrected to allow proper node revisit logic, specifically enabling detection of complex graph cycles that were previously blocked by overly restrictive filtering.\n\n**Key Decisions:** \n- Modify LIKE filter condition\n- Create start node exception\n- Maintain core cycle prevention rules\n\n**Resolution:** Query update resolves dependency detection limitations, enabling more accurate cycle identification in database dependency tracking.","status":"closed","priority":3,"issue_type":"bug","created_at":"2025-11-01T22:50:32.552763-07:00","updated_at":"2025-12-14T16:44:38.421003-08:00","closed_at":"2025-11-01T22:52:02.247443-07:00"}
|
||
{"id":"bd-9f4a","title":"Document external_ref in content hash behavior","description":"**Summary:** Investigated content hash behavior with external_ref inclusion, identifying potential unintended consequences in content identification and matching scenarios.\n\n**Key Decisions:** \n- Keep external_ref in content hash calculation\n- Document behavior in code comments and architecture docs\n- Add test to validate current implementation\n\n**Resolution:** Documented subtle hash generation behavior to prevent future misunderstandings about content identification across different contexts.","status":"closed","priority":4,"issue_type":"task","created_at":"2025-11-02T15:32:47.715458-08:00","updated_at":"2025-12-14T16:47:27.017706-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-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-9rw1","title":"Support P-prefix priority format (P0-P4) in create and update commands","description":"","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-11-05T13:56:04.796826-08:00","updated_at":"2025-12-14T16:45:54.494724-08:00","closed_at":"2025-11-05T13:56:08.157061-08:00"}
|
||
{"id":"bd-9v7l","title":"bd status \"Recent Activity\" is misleading - should use git history","description":"**Summary:** The `bd status` \"Recent Activity\" section was providing inaccurate issue tracking by only using database timestamps instead of actual git history. This led to misleading reporting of issue lifecycle and activity.\n\n**Key Decisions:** \n- Explore querying `.beads/beads.jsonl` for precise git history\n- Consider shortening activity window from 7 to 24-48 hours\n- Potential option to remove section if not providing value\n\n**Resolution:** Engineering team identified discrepancy in activity tracking and recommended implementing more accurate git-based activity reporting to improve system transparency.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-05T01:03:00.234813-08:00","updated_at":"2025-12-14T16:46:16.713521-08:00","closed_at":"2025-11-06T18:47:42.682987-08:00"}
|
||
{"id":"bd-9w3s","title":"Improve test coverage for internal/lockfile (42.0% → 60%)","description":"The lockfile package has only 42.0% test coverage. Lock file handling is critical for preventing data corruption in concurrent scenarios.\n\nCurrent coverage: 42.0%\nTarget coverage: 60%","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-13T20:43:08.47488-08:00","updated_at":"2025-12-14T15:23:48.500768-08:00","closed_at":"2025-12-14T15:20:51.463282-08:00"}
|
||
{"id":"bd-a03d5e36","title":"Improve integration test coverage for stateful features","description":"","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-10-29T21:53:15.397137-07:00","updated_at":"2025-12-14T16:47:15.543964-08:00","closed_at":"2025-11-08T00:36:59.02371-08:00"}
|
||
{"id":"bd-a0cp","title":"Consider using types.Status in merge package for type safety","description":"The merge package uses string for status comparison (e.g., result.Status == closed, issue.Status == StatusTombstone). The types package defines Status as a type alias with validation. While the merge package needs its own Issue struct for JSONL flexibility, it could import and use types.Status for constants to get compile-time type checking. Current code: if left == closed || right == closed. Could be: if left == string(types.StatusClosed). This is low priority since string comparison works correctly. Files: internal/merge/merge.go:44, 488, 501-521","status":"open","priority":4,"issue_type":"task","created_at":"2025-12-05T16:37:10.690424-08:00","updated_at":"2025-12-05T16:37:10.690424-08:00"}
|
||
{"id":"bd-a101","title":"Support separate branch for beads commits","description":"Allow beads to commit to a separate branch (e.g., beads-metadata) using git worktrees to support protected main branch workflows.\n\nSolves GitHub Issue #205 - Users need to protect main branch while maintaining beads workflow.\n\nKey advantages:\n- Works on any git platform\n- Main branch stays protected \n- No disruption to user's working directory\n- Backward compatible (opt-in via config)\n- Minimal disk overhead (sparse checkout)\n\nTotal estimate: 17-24 days (4-6 weeks with parallel work)","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-02T15:21:20.098247-08:00","updated_at":"2025-12-14T16:45:22.092081-08:00","closed_at":"2025-11-04T12:36:53.772727-08:00"}
|
||
{"id":"bd-a15d","title":"Add test files for internal/storage","description":"The internal/storage package has no test files at all. This package provides the storage interface abstraction.\n\nCurrent coverage: N/A (no test files)\nTarget: Add basic interface tests","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-13T20:43:11.363017-08:00","updated_at":"2025-12-13T21:01:20.925779-08:00"}
|
||
{"id":"bd-a1691807","title":"Integration test: mutation to export latency","description":"Measure time from bd create to JSONL update. Verify \u003c500ms latency. Test with multiple rapid mutations to verify batching.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T20:49:49.105247-07:00","updated_at":"2025-12-14T16:44:07.331026-08:00","closed_at":"2025-10-31T12:00:43.198883-07:00"}
|
||
{"id":"bd-a40f374f","title":"bd validate - Comprehensive health check","description":"Run all validation checks in one command.\n\nChecks:\n- Duplicates\n- Orphaned dependencies\n- Test pollution\n- Git conflicts\n\nSupports --fix-all for auto-repair.\n\nDepends on bd-cbed9619.1, bd-0dcea000, bd-31aab707, bd-9826b69a.\n\nFiles: cmd/bd/validate.go (new)","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T20:02:47.956664-07:00","updated_at":"2025-12-14T16:43:59.027911-08:00","closed_at":"2025-10-29T20:02:15.318966-07:00"}
|
||
{"id":"bd-a4b5","title":"Implement git worktree management","description":"Create git worktree lifecycle management for separate beads branch.\n\nTasks:\n- Create internal/git/worktree.go\n- Implement CreateBeadsWorktree(branch, path)\n- Implement RemoveBeadsWorktree(path)\n- Implement CheckWorktreeHealth(path)\n- Configure sparse checkout (only .beads/)\n- Implement SyncJSONLToWorktree()\n- Handle worktree errors gracefully\n- Auto-cleanup on config change\n\nEstimated effort: 3-4 days","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-02T15:22:35.56423-08:00","updated_at":"2025-12-14T16:45:19.171234-08:00","closed_at":"2025-11-04T11:10:23.533055-08:00","dependencies":[{"issue_id":"bd-a4b5","depends_on_id":"bd-a101","type":"parent-child","created_at":"2025-11-02T15:22:48.359843-08:00","created_by":"stevey"}]}
|
||
{"id":"bd-a5251b1a","title":"Test RPC mutation event","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-29T19:08:03.315443-07:00","updated_at":"2025-12-14T16:44:01.050888-08:00","closed_at":"2025-10-31T12:00:43.177494-07:00"}
|
||
{"id":"bd-a557","title":"Issue 1 to reopen","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-22T14:57:44.500801209-05:00","updated_at":"2025-12-14T16:46:58.202976-08:00","closed_at":"2025-11-07T21:57:59.910467-08:00"}
|
||
{"id":"bd-a5z","title":"bd doctor: add --dry-run flag to preview fixes without applying","description":"Currently bd doctor --fix applies all fixes. Add a --dry-run flag to preview what would be fixed without making changes. This helps users understand the impact before committing to repairs.","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-12-02T12:52:10.106929-08:00","updated_at":"2025-12-07T01:24:31.62847-08:00","closed_at":"2025-12-07T01:24:31.62847-08:00"}
|
||
{"id":"bd-a6m","title":"isLikelyHash rejects 3-char all-letter base36 hashes","description":"ExtractIssuePrefix fails for multi-hyphen prefixes when the 3-char hash suffix has no digits.\n\nExample: `xa-adt-bat` returns prefix `xa` instead of `xa-adt`.\n\nRoot cause: `isLikelyHash()` requires at least one digit to distinguish hashes from English words, but base36 hashes can be all-letters by chance.\n\nAffected: 20 issues in xa-adapt with suffixes like bat, dev, fbi, oil, etc.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-02T17:11:19.783336327-05:00","updated_at":"2025-12-02T17:12:37.634260315-05:00","closed_at":"2025-12-02T17:12:37.634260315-05:00"}
|
||
{"id":"bd-a9699011","title":"GH#146: No color showing in terminal for some users","description":"User reports color not working in macOS (Taho 26.0.1) with iTerm 3.6.4 and Terminal.app, despite color working elsewhere in terminal. Python rich and printf escape codes work.\n\nNeed to investigate:\n- Is NO_COLOR env var set?\n- Terminal type detection?\n- fatih/color library configuration\n- Does bd list show colors? bd ready? bd init?\n- What's the output of: echo $TERM, echo $NO_COLOR","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-10-24T22:26:36.22163-07:00","updated_at":"2025-12-14T16:47:19.036082-08:00","closed_at":"2025-11-08T00:54:40.47956-08:00"}
|
||
{"id":"bd-abjw","title":"Consider consolidating config.yaml parsing into shared utility","description":"Multiple places parse config.yaml with custom structs:\n\n1. **autoimport.go:148** - `localConfig{SyncBranch}`\n2. **main.go:310** - strings.Contains for no-db (fragile, see bd-r6k2)\n3. **doctor.go:863** - strings.Contains for no-db (fragile, see bd-r6k2)\n4. **internal/config/config.go** - Uses viper (but caches at startup, problematic for tests)\n\nConsider creating a shared utility in `internal/configfile/` or extending the viper config:\n\n```go\n// internal/configfile/yaml.go\ntype YAMLConfig struct {\n SyncBranch string `yaml:\"sync-branch\"`\n NoDb bool `yaml:\"no-db\"`\n IssuePrefix string `yaml:\"issue-prefix\"`\n Author string `yaml:\"author\"`\n}\n\nfunc LoadYAML(beadsDir string) (*YAMLConfig, error) {\n // Parse config.yaml with proper YAML library\n}\n```\n\nBenefits:\n- Single source of truth for config.yaml structure\n- Proper YAML parsing everywhere\n- Easier to add new config fields\n\nTrade-off: May add complexity for simple one-off reads.","status":"open","priority":4,"issue_type":"task","created_at":"2025-12-07T02:03:26.067311-08:00","updated_at":"2025-12-07T02:03:26.067311-08:00"}
|
||
{"id":"bd-ad5e","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-12-14T16:44:58.605321-08:00","closed_at":"2025-11-02T17:12:05.599633-08:00"}
|
||
{"id":"bd-aec5439f","title":"Update LINTING.md with current baseline","description":"After cleanup, document the remaining acceptable baseline in LINTING.md so we can track regression.","status":"open","priority":2,"issue_type":"task","created_at":"2025-10-27T18:53:10.38679-07:00","updated_at":"2025-10-30T17:12:58.194901-07:00"}
|
||
{"id":"bd-aewm","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-12-14T16:46:16.031845-08:00","closed_at":"2025-11-06T18:46:55.924379-08:00","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-alz","title":"bd doctor: add configuration value validation","description":"Currently bd doctor checks for missing config files but doesn't validate config values. Add validation for: invalid priority values, malformed sync intervals, invalid branch names, unsupported storage backends, etc. This would catch misconfigurations before they cause runtime errors.","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-12-02T12:52:31.852532-08:00","updated_at":"2025-12-07T01:24:31.62945-08:00","closed_at":"2025-12-07T01:24:31.62945-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"}]}
|
||
{"id":"bd-ar2.10","title":"Fix hasJSONLChanged to support per-repo metadata keys","description":"## Problem\nAfter bd-ar2.2, we store metadata with per-repo keys like `last_import_hash:\u003cpath\u003e`, but `hasJSONLChanged` and `validatePreExport` still only check global keys.\n\n## Impact\n- Multi-repo mode won't benefit from bd-ymj fix\n- validatePreExport will fail incorrectly or pass incorrectly\n- Metadata updates are written but never read\n\n## Location\n- cmd/bd/integrity.go:97 (hasJSONLChanged)\n- cmd/bd/integrity.go:138 (validatePreExport)\n\n## Solution\nUpdate hasJSONLChanged to accept optional keySuffix parameter:\n```go\nfunc hasJSONLChanged(ctx context.Context, store storage.Storage, jsonlPath string, keySuffix string) bool {\n // Build metadata keys with optional suffix\n hashKey := \"last_import_hash\"\n mtimeKey := \"last_import_mtime\"\n if keySuffix != \"\" {\n hashKey += \":\" + keySuffix\n mtimeKey += \":\" + keySuffix\n }\n // ... rest of function\n}\n```\n\nUpdate all callers to pass correct keySuffix.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-21T10:58:20.969689-05:00","updated_at":"2025-11-21T11:25:23.421383-05:00","closed_at":"2025-11-21T11:25:23.421383-05:00","dependencies":[{"issue_id":"bd-ar2.10","depends_on_id":"bd-ar2","type":"parent-child","created_at":"2025-11-21T10:58:20.970624-05:00","created_by":"daemon"}]}
|
||
{"id":"bd-ar2.11","title":"Use stable repo identifiers instead of full paths in metadata keys","description":"## Problem\nbd-ar2.2 uses full absolute paths as metadata key suffixes:\n```go\nupdateExportMetadata(exportCtx, store, path, log, path)\n// Creates: last_import_hash:/Users/stevey/src/cino/beads/repo1/.beads/issues.jsonl\n```\n\n## Issues\n1. Absolute paths differ across machines/clones\n2. Keys are very long\n3. If user moves repo or clones to different path, metadata becomes orphaned\n4. Metadata won't be portable across team members\n\n## Better Approach\nUse source_repo identifiers from multi-repo config (e.g., \".\", \"../frontend\"):\n```go\n// Get mapping of jsonl_path -\u003e source_repo identifier\nfor _, path := range multiRepoPaths {\n repoKey := getRepoKeyForPath(path) // e.g., \".\", \"../frontend\"\n updateExportMetadata(exportCtx, store, path, log, repoKey)\n}\n```\n\nThis creates stable keys like:\n- `last_import_hash:.`\n- `last_import_hash:../frontend`\n\n## Related\nDepends on bd-ar2.10 (hasJSONLChanged update)","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-21T10:58:34.368544-05:00","updated_at":"2025-11-21T11:25:23.434129-05:00","closed_at":"2025-11-21T11:25:23.434129-05:00","dependencies":[{"issue_id":"bd-ar2.11","depends_on_id":"bd-ar2","type":"parent-child","created_at":"2025-11-21T10:58:34.370273-05:00","created_by":"daemon"}]}
|
||
{"id":"bd-ar2.12","title":"Add validation and documentation for metadata key format","description":"## Issues\n\n### 1. No validation that keySuffix doesn't contain separator\n```go\nif keySuffix != \"\" {\n hashKey += \":\" + keySuffix // ❌ What if keySuffix contains \":\"?\n}\n```\n\nAdd validation:\n```go\nif strings.Contains(keySuffix, \":\") {\n return fmt.Errorf(\"keySuffix cannot contain ':' separator\")\n}\n```\n\n### 2. Inconsistent keySuffix semantics\nEmpty string means \"global\", non-empty means \"scoped\". Better to always pass explicit key:\n```go\nconst (\n SingleRepoKey = \".\"\n // Multi-repo uses source_repo identifier\n)\n```\n\n### 3. Metadata key format not documented\nNeed to document:\n- `last_import_hash` - single-repo mode\n- `last_import_hash:\u003crepo_key\u003e` - multi-repo mode\n- `last_import_time` - when last import occurred\n- `last_import_mtime` - fast-path optimization\n\nAdd to internal/storage/sqlite/schema.go or docs/","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-21T10:59:13.54833-05:00","updated_at":"2025-11-21T11:40:47.687331-05:00","closed_at":"2025-11-21T11:40:47.687331-05:00","dependencies":[{"issue_id":"bd-ar2.12","depends_on_id":"bd-ar2","type":"parent-child","created_at":"2025-11-21T10:59:13.550475-05:00","created_by":"daemon"}]}
|
||
{"id":"bd-ar2.2","title":"Add multi-repo support to export metadata updates","description":"## Problem\nThe bd-ymj fix only updates metadata for the main jsonlPath, but the codebase supports multi-repo mode where exports write to multiple JSONL files.\n\nOther daemon_sync operations handle multi-repo correctly:\n- Lines 509-518: Snapshots captured for all multi-repo paths\n- Lines 578-587: Deletions applied for all multi-repo paths\n\nBut metadata updates are missing!\n\n## Investigation Needed\nMetadata is stored globally in database (`last_import_hash`, `last_import_mtime`), but multi-repo has per-repo JSONL files. Current schema may not support tracking multiple JSONL files.\n\nOptions:\n1. Store metadata per-repo (new schema)\n2. Store combined hash of all repos\n3. Document that multi-repo doesn't need this metadata (why?)\n\n## Solution (if needed)\n```go\n// After export\nif multiRepoPaths := getMultiRepoJSONLPaths(); multiRepoPaths != nil {\n // Multi-repo mode: update metadata for each JSONL\n for _, path := range multiRepoPaths {\n updateExportMetadata(exportCtx, store, path, log)\n }\n} else {\n // Single-repo mode: update metadata for main JSONL\n updateExportMetadata(exportCtx, store, jsonlPath, log)\n}\n```\n\n## Files\n- cmd/bd/daemon_sync.go (createExportFunc, createSyncFunc)\n- Possibly: internal/storage/sqlite/metadata.go (schema changes)\n\n## Related\nDepends on bd-ar2.1 (extract helper function first)","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-21T10:24:32.482102-05:00","updated_at":"2025-11-22T14:57:44.503065141-05:00","closed_at":"2025-11-21T11:07:17.124957-05:00","dependencies":[{"issue_id":"bd-ar2.2","depends_on_id":"bd-ar2","type":"parent-child","created_at":"2025-11-21T10:24:32.482559-05:00","created_by":"daemon"}]}
|
||
{"id":"bd-ar2.3","title":"Fix TestExportUpdatesMetadata to test actual daemon functions","description":"## Problem\nTestExportUpdatesMetadata (daemon_sync_test.go:296) manually replicates the metadata update logic rather than calling the fixed functions (createExportFunc/createSyncFunc).\n\nThis means:\n- Test verifies the CONCEPT works\n- But doesn't verify the IMPLEMENTATION in the actual daemon functions\n- If daemon code is wrong, test still passes\n\n## Current Test Flow\n```go\n// Test does:\nexportToJSONLWithStore() // ← Direct call\n// ... manual metadata update ...\nexportToJSONLWithStore() // ← Direct call again\n```\n\n## Should Be\n```go\n// Test should:\ncreateExportFunc(...)() // ← Call actual daemon function\n// ... verify metadata was updated by the function ...\ncreateExportFunc(...)() // ← Call again, should not fail\n```\n\n## Challenge\ncreateExportFunc returns a closure that's run by the daemon. Testing this requires:\n- Mock logger\n- Proper context setup\n- Git operations might need mocking\n\n## Files\n- cmd/bd/daemon_sync_test.go\n\n## Acceptance Criteria\n- Test calls actual createExportFunc and createSyncFunc\n- Test verifies metadata updated by daemon code, not test code\n- Both functions tested (export and sync)","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-21T10:24:46.756315-05:00","updated_at":"2025-11-22T14:57:44.504497625-05:00","closed_at":"2025-11-21T11:07:25.321289-05:00","dependencies":[{"issue_id":"bd-ar2.3","depends_on_id":"bd-ar2","type":"parent-child","created_at":"2025-11-21T10:24:46.757622-05:00","created_by":"daemon"}]}
|
||
{"id":"bd-ar2.4","title":"Use TryResurrectParentChain instead of TryResurrectParent in GetNextChildID","description":"## Context\nCurrent bd-dvd fix uses TryResurrectParent, which only resurrects the immediate parent. For deeply nested hierarchies, this might not be sufficient.\n\n## Example Scenario\nCreating child with parent \"bd-abc.1.2\" where:\n- bd-abc exists in DB\n- bd-abc.1 was deleted (missing from DB, exists in JSONL)\n- bd-abc.1.2 was deleted (missing from DB, exists in JSONL)\n\nCurrent fix: Only tries to resurrect \"bd-abc.1.2\", fails because its parent \"bd-abc.1\" is missing.\n\n## Solution\nReplace TryResurrectParent with TryResurrectParentChain:\n\n```go\nif count == 0 {\n // Try to resurrect entire parent chain from JSONL history (bd-dvd fix)\n // This handles deeply nested hierarchies where intermediate parents are also missing\n resurrected, err := s.TryResurrectParentChain(ctx, parentID)\n if err != nil {\n return \"\", fmt.Errorf(\"failed to resurrect parent chain for %s: %w\", parentID, err)\n }\n if !resurrected {\n return \"\", fmt.Errorf(\"parent issue %s does not exist and could not be resurrected from JSONL history\", parentID)\n }\n}\n```\n\n## Investigation\n- Check if this scenario actually happens in practice\n- TryResurrectParentChain already exists (resurrection.go:174-209)\n- May be overkill if users always create parents before children\n\n## Files\n- internal/storage/sqlite/hash_ids.go\n\n## Testing\nAdd test case for deeply nested resurrection","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-21T10:25:01.376071-05:00","updated_at":"2025-11-22T14:57:44.505856404-05:00","closed_at":"2025-11-21T11:40:47.682699-05:00","dependencies":[{"issue_id":"bd-ar2.4","depends_on_id":"bd-ar2","type":"parent-child","created_at":"2025-11-21T10:25:01.376561-05:00","created_by":"daemon"}]}
|
||
{"id":"bd-ar2.5","title":"Add error handling guidance for export metadata update failures","description":"## Problem\nThe bd-ymj fix treats all metadata update failures as warnings:\n\n```go\nif 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\nBut if metadata updates fail, the NEXT export will fail with \"JSONL content has changed since last import\".\n\n## Questions\n1. Should metadata failures be critical (return error)?\n2. Should we implement retry logic?\n3. Is warning acceptable (safe, just requires import before next export)?\n\n## Current Behavior\n- Metadata failure is silent (only logged)\n- User won't know until next export fails\n- Next export requires import first (safe but annoying)\n\n## Recommendation\nAdd clear comment explaining the trade-off:\n\n```go\n// Note: Metadata update failures are treated as warnings, not errors.\n// This is acceptable because the worst case is the next export will\n// require an import first, which is safe and prevents data loss.\n// Alternative: Make this critical and fail the export if metadata\n// updates fail (but this makes exports more fragile).\nif err := store.SetMetadata(ctx, \"last_import_hash\", currentHash); err != nil {\n log.log(\"Warning: failed to update last_import_hash: %v\", err)\n log.log(\"Next export may require running 'bd import' first\")\n}\n```\n\n## Files\n- cmd/bd/daemon_sync.go\n\n## Decision Needed\nChoose approach based on failure mode preferences","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-21T10:25:16.52788-05:00","updated_at":"2025-11-22T14:57:44.507130479-05:00","closed_at":"2025-11-21T11:40:47.684741-05:00","dependencies":[{"issue_id":"bd-ar2.5","depends_on_id":"bd-ar2","type":"parent-child","created_at":"2025-11-21T10:25:16.528351-05:00","created_by":"daemon"}]}
|
||
{"id":"bd-ar2.6","title":"Add transaction boundaries for export metadata updates","description":"## Problem\nMetadata updates happen after export, but there's no transaction ensuring atomicity between:\n1. JSONL file write (exportToJSONLWithStore)\n2. Metadata update (updateExportMetadata)\n3. Database mtime update (TouchDatabaseFile)\n\nIf process crashes between these steps, metadata will be inconsistent.\n\n## Example Failure Scenario\n```\n1. Export to JSONL succeeds\n2. [CRASH] Process killed before metadata update\n3. Next export: \"JSONL content has changed\" error\n4. User must run import to fix metadata\n```\n\n## Options\n\n### Option 1: Tolerate Inconsistency (Current)\n- Simple, no code changes\n- Safe (worst case: need import before next export)\n- Annoying for users if crashes are frequent\n\n### Option 2: Add Write-Ahead Log\n- Write metadata intent to temp file\n- Complete operations\n- Clean up temp file\n- More complex, better guarantees\n\n### Option 3: Store Metadata in JSONL Comments\n- Add metadata as JSON comment in JSONL file\n- Single atomic write\n- Requires JSONL format change\n\n### Option 4: Defensive Checks\n- On startup, verify metadata matches JSONL\n- Auto-fix if mismatch detected\n- Simplest improvement\n\n## Recommendation\nStart with Option 4 (defensive checks), consider others if needed.\n\n## Files\n- cmd/bd/daemon_sync.go\n- Possibly: cmd/bd/main.go (startup checks)\n\n## Related\nThis is lower priority - current behavior is safe, just not ideal","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-21T10:25:32.469469-05:00","updated_at":"2025-11-22T14:57:44.508508959-05:00","closed_at":"2025-11-21T11:40:47.685571-05:00","dependencies":[{"issue_id":"bd-ar2.6","depends_on_id":"bd-ar2","type":"parent-child","created_at":"2025-11-21T10:25:32.470004-05:00","created_by":"daemon"}]}
|
||
{"id":"bd-ar2.7","title":"Add edge case tests for GetNextChildID parent resurrection","description":"## Current Coverage\nTestGetNextChildID_ResurrectParent tests happy path only:\n- Parent exists in JSONL\n- Resurrection succeeds\n\n## Missing Test Cases\n\n### 1. Parent Not in JSONL\n- Parent doesn't exist in DB\n- Parent doesn't exist in JSONL either\n- Should return: \"could not be resurrected from JSONL history\"\n\n### 2. JSONL File Missing\n- Parent doesn't exist in DB\n- No issues.jsonl file exists\n- Should handle gracefully\n\n### 3. Malformed JSONL\n- Parent doesn't exist in DB\n- JSONL file exists but has invalid JSON\n- Should skip bad lines, continue searching\n\n### 4. Concurrent Resurrections\n- Multiple goroutines call GetNextChildID with same parent\n- Only one should resurrect, others should succeed\n- Test for race conditions\n\n### 5. Deeply Nested Missing Parents\n- Creating bd-abc.1.2.1 where:\n - bd-abc exists\n - bd-abc.1 missing (should fail with current fix)\n- Related to bd-ar2.4\n\n### 6. Content Hash Mismatch\n- Parent in JSONL has different content_hash than expected\n- Should still resurrect (content_hash is for integrity, not identity)\n\n## Files\n- internal/storage/sqlite/child_id_test.go\n\n## Implementation\n```go\nfunc TestGetNextChildID_ResurrectParent_NotInJSONL(t *testing.T) { ... }\nfunc TestGetNextChildID_ResurrectParent_NoJSONL(t *testing.T) { ... }\nfunc TestGetNextChildID_ResurrectParent_MalformedJSONL(t *testing.T) { ... }\nfunc TestGetNextChildID_ResurrectParent_Concurrent(t *testing.T) { ... }\n```","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-21T10:25:46.661849-05:00","updated_at":"2025-11-22T14:57:44.511464732-05:00","closed_at":"2025-11-21T11:40:47.686231-05:00","dependencies":[{"issue_id":"bd-ar2.7","depends_on_id":"bd-ar2","type":"parent-child","created_at":"2025-11-21T10:25:46.66235-05:00","created_by":"daemon"}]}
|
||
{"id":"bd-ar2.8","title":"Add edge case tests for export metadata updates","description":"## Current Coverage\nTestExportUpdatesMetadata tests basic happy path only.\n\n## Missing Test Cases\n\n### 1. Multi-Repo Mode\n- Export with multi-repo configuration\n- Verify metadata updated for ALL JSONL files\n- Critical gap (related to bd-ar2.2)\n\n### 2. computeJSONLHash Failure\n- JSONL file deleted/inaccessible after export\n- Should log warning, not crash\n- Verify behavior on next export\n\n### 3. SetMetadata Failures\n- Database write-protected\n- Disk full\n- Should log warnings, continue\n\n### 4. os.Stat Failure\n- JSONL file deleted after export, before stat\n- Should handle gracefully (mtime just not updated)\n\n### 5. Concurrent Exports\n- Two daemon instances export simultaneously\n- Verify metadata doesn't get corrupted\n- Race condition test\n\n### 6. Clock Skew\n- System time goes backward between exports\n- Verify mtime handling still works\n\n### 7. Partial Export Failure\n- Multi-repo mode: some exports succeed, some fail\n- What metadata should be updated?\n\n### 8. Large JSONL Files\n- Performance test with large files (10k+ issues)\n- Verify hash computation doesn't timeout\n\n## Files\n- cmd/bd/daemon_sync_test.go\n\n## Implementation Priority\n1. Multi-repo test (P1 - related to critical issue)\n2. Failure handling tests (P2)\n3. Performance/edge cases (P3)","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-21T10:25:59.526543-05:00","updated_at":"2025-11-22T14:57:44.51553077-05:00","closed_at":"2025-11-21T14:39:53.143561-05:00","dependencies":[{"issue_id":"bd-ar2.8","depends_on_id":"bd-ar2","type":"parent-child","created_at":"2025-11-21T10:25:59.527032-05:00","created_by":"daemon"}]}
|
||
{"id":"bd-ar2.9","title":"Fix variable shadowing in GetNextChildID resurrection code","description":"## Problem\nMinor variable shadowing in hash_ids.go:\n\n```go\n// Line 33: err declared here\nerr := s.db.QueryRowContext(ctx, `SELECT COUNT(*) FROM issues WHERE id = ?`, parentID).Scan(\u0026count)\n\n// Line 38: err reused/shadowed here\nresurrected, err := s.TryResurrectParent(ctx, parentID)\n```\n\nWhile Go allows this, it can be confusing and some linters flag it.\n\n## Solution\nUse different variable name:\n\n```go\nresurrected, resurrectErr := s.TryResurrectParent(ctx, parentID)\nif resurrectErr != nil {\n return \"\", fmt.Errorf(\"failed to resurrect parent %s: %w\", parentID, resurrectErr)\n}\n```\n\n## Files\n- internal/storage/sqlite/hash_ids.go:38\n\n## Priority\nLow - code works correctly, just a style improvement","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-21T10:26:09.734162-05:00","updated_at":"2025-11-22T14:57:44.517727699-05:00","closed_at":"2025-11-21T11:25:23.408878-05:00","dependencies":[{"issue_id":"bd-ar2.9","depends_on_id":"bd-ar2","type":"parent-child","created_at":"2025-11-21T10:26:09.734618-05:00","created_by":"daemon"}]}
|
||
{"id":"bd-au0","title":"Command Set Standardization \u0026 Flag Consistency","description":"Comprehensive improvements to bd command set based on 2025 audit findings.\n\n## Background\nSee docs/command-audit-2025.md for detailed analysis.\n\n## Goals\n1. Standardize flag naming and behavior across all commands\n2. Add missing flags for feature parity\n3. Fix naming confusion\n4. Improve consistency in JSON output\n\n## Success Criteria\n- All mutating commands support --dry-run (no --preview variants)\n- bd update supports label operations\n- bd search has filter parity with bd list\n- Priority flags accept both int and P0-P4 format everywhere\n- JSON output is consistent across all commands","status":"open","priority":2,"issue_type":"epic","created_at":"2025-11-21T21:05:55.672749-05:00","updated_at":"2025-11-21T21:05:55.672749-05:00"}
|
||
{"id":"bd-au0.10","title":"Add global verbosity flags (--verbose, --quiet)","description":"Add consistent verbosity controls across all commands.\n\n**Current state:**\n- bd init has --quiet flag\n- No other commands have verbosity controls\n- Debug output controlled by BD_VERBOSE env var\n\n**Proposal:**\nAdd persistent flags:\n- --verbose / -v: Enable debug output\n- --quiet / -q: Suppress non-essential output\n\n**Implementation:**\n- Add to rootCmd.PersistentFlags()\n- Replace BD_VERBOSE checks with flag checks\n- Standardize output levels:\n * Quiet: Errors only\n * Normal: Errors + success messages\n * Verbose: Errors + success + debug info\n\n**Files to modify:**\n- cmd/bd/main.go (add flags)\n- internal/debug/debug.go (respect flags)\n- Update all commands to respect quiet mode\n\n**Testing:**\n- Verify --verbose shows debug output\n- Verify --quiet suppresses normal output\n- Ensure errors always show regardless of mode","status":"open","priority":3,"issue_type":"task","created_at":"2025-11-21T21:08:21.600209-05:00","updated_at":"2025-11-21T21:08:21.600209-05:00","dependencies":[{"issue_id":"bd-au0.10","depends_on_id":"bd-au0","type":"parent-child","created_at":"2025-11-21T21:08:21.602557-05:00","created_by":"daemon"}]}
|
||
{"id":"bd-au0.5","title":"Add date and priority filters to bd search","description":"Add filter parity with bd list for consistent querying.\n\n**Missing filters to add:**\n- --priority, --priority-min, --priority-max\n- --created-after, --created-before\n- --updated-after, --updated-before\n- --closed-after, --closed-before\n- --empty-description, --no-assignee, --no-labels\n- --desc-contains, --notes-contains\n\n**Files to modify:**\n- cmd/bd/search.go\n- internal/rpc/protocol.go (SearchArgs)\n- internal/storage/storage.go (Search method)\n\n**Testing:**\n- All filter combinations\n- Date format parsing\n- Daemon and direct mode","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-21T21:07:05.496726-05:00","updated_at":"2025-11-21T21:07:05.496726-05:00","dependencies":[{"issue_id":"bd-au0.5","depends_on_id":"bd-au0","type":"parent-child","created_at":"2025-11-21T21:07:05.497762-05:00","created_by":"daemon"}]}
|
||
{"id":"bd-au0.6","title":"Add comprehensive filters to bd export","description":"Enhance bd export with filtering options for selective exports.\n\n**Currently only has:**\n- --status\n\n**Add filters:**\n- --label, --label-any\n- --assignee\n- --type\n- --priority, --priority-min, --priority-max\n- --created-after, --created-before\n- --updated-after, --updated-before\n\n**Use case:**\n- Export only open issues: bd export --status open\n- Export high-priority bugs: bd export --type bug --priority-max 1\n- Export recent issues: bd export --created-after 2025-01-01\n\n**Files to modify:**\n- cmd/bd/export.go\n- Reuse filter logic from list.go","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-21T21:07:19.431307-05:00","updated_at":"2025-11-21T21:07:19.431307-05:00","dependencies":[{"issue_id":"bd-au0.6","depends_on_id":"bd-au0","type":"parent-child","created_at":"2025-11-21T21:07:19.432983-05:00","created_by":"daemon"}]}
|
||
{"id":"bd-au0.7","title":"Audit and standardize JSON output across all commands","description":"Ensure consistent JSON format and error handling when --json flag is used.\n\n**Scope:**\n1. Verify all commands respect --json flag\n2. Standardize success response format\n3. Standardize error response format\n4. Document JSON schemas\n\n**Commands to audit:**\n- Core CRUD: create, update, delete, show, list, search ✓\n- Queries: ready, blocked, stale, count, stats, status\n- Deps: dep add/remove/tree/cycles\n- Labels: label commands\n- Comments: comments add/list/delete\n- Epics: epic status/close-eligible\n- Export/import: already support --json ✓\n\n**Testing:**\n- Success cases return valid JSON\n- Error cases return valid JSON (not plain text)\n- Consistent field naming (snake_case vs camelCase)\n- Array vs object wrapping consistency","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-21T21:07:35.304424-05:00","updated_at":"2025-11-21T21:07:35.304424-05:00","dependencies":[{"issue_id":"bd-au0.7","depends_on_id":"bd-au0","type":"parent-child","created_at":"2025-11-21T21:07:35.305663-05:00","created_by":"daemon"}]}
|
||
{"id":"bd-au0.8","title":"Improve clean vs cleanup command naming/documentation","description":"Clarify the difference between bd clean and bd cleanup to reduce user confusion.\n\n**Current state:**\n- bd clean: Remove temporary artifacts (.beads/bd.sock, logs, etc.)\n- bd cleanup: Delete old closed issues from database\n\n**Options:**\n1. Rename for clarity:\n - bd clean → bd clean-temp\n - bd cleanup → bd cleanup-issues\n \n2. Keep names but improve help text and documentation\n\n3. Add prominent warnings in help output\n\n**Preferred approach:** Option 2 (improve documentation)\n- Update short/long descriptions in commands\n- Add examples to help text\n- Update README.md\n- Add cross-references in help output\n\n**Files to modify:**\n- cmd/bd/clean.go\n- cmd/bd/cleanup.go\n- README.md or ADVANCED.md","status":"open","priority":2,"issue_type":"task","created_at":"2025-11-21T21:07:49.960534-05:00","updated_at":"2025-11-21T21:07:49.960534-05:00","dependencies":[{"issue_id":"bd-au0.8","depends_on_id":"bd-au0","type":"parent-child","created_at":"2025-11-21T21:07:49.962743-05:00","created_by":"daemon"}]}
|
||
{"id":"bd-au0.9","title":"Review and document rarely-used commands","description":"Document use cases or consider deprecation for infrequently-used commands.\n\n**Commands to review:**\n1. bd rename-prefix - How often is this used? Document use cases\n2. bd detect-pollution - Consider integrating into bd validate\n3. bd migrate-hash-ids - One-time migration, keep but document as legacy\n\n**For each command:**\n- Document typical use cases\n- Add examples to help text\n- Consider if it should be a subcommand instead\n- Add deprecation warning if appropriate\n\n**Not changing:**\n- duplicates ✓ (useful for data quality)\n- repair-deps ✓ (useful for fixing broken refs)\n- restore ✓ (critical for compacted issues)\n- compact ✓ (performance feature)\n\n**Deliverable:**\n- Updated help text\n- Documentation in ADVANCED.md\n- Deprecation plan if needed","status":"open","priority":3,"issue_type":"task","created_at":"2025-11-21T21:08:05.588275-05:00","updated_at":"2025-11-21T21:08:05.588275-05:00","dependencies":[{"issue_id":"bd-au0.9","depends_on_id":"bd-au0","type":"parent-child","created_at":"2025-11-21T21:08:05.59003-05:00","created_by":"daemon"}]}
|
||
{"id":"bd-auf1","title":"Clean up snapshot files after successful merge","description":"**Summary:** During 'bd sync' merge operations, snapshot files were not being cleaned up after successful import, leading to accumulation of stale files in the .beads/ directory. This issue was identified through manual discovery of lingering snapshot files from previous merges.\n\n**Key Decisions:** \n- Modify sync.go to trigger snapshot cleanup after successful import\n- Utilize existing SnapshotManager.Cleanup() method\n- Remove beads.base.jsonl and beads.left.jsonl after merge completion\n\n**Resolution:** The proposed fix will automatically remove temporary snapshot files after successful merge, preventing unnecessary file accumulation and improving storage management.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-08T22:39:56.460778-08:00","updated_at":"2025-12-14T16:47:47.083872-08:00","closed_at":"2025-11-08T22:45:40.5809-08:00"}
|
||
{"id":"bd-aydr","title":"Add bd reset command for clean slate restart","description":"Implement a `bd reset` command to reset beads to a clean starting state.\n\n## Context\nGitHub issue #479 - users sometimes get beads into an invalid state after updates, and there's no clean way to start fresh. The git backup/restore mechanism that protects against accidental deletion also makes it hard to intentionally reset.\n\n## Design\n\n### Command Interface\n```\nbd reset [--hard] [--force] [--backup] [--dry-run] [--no-init]\n```\n\n| Flag | Effect |\n|------|--------|\n| `--hard` | Also remove from git index and commit |\n| `--force` | Skip confirmation prompt |\n| `--backup` | Create `.beads-backup-{timestamp}/` first |\n| `--dry-run` | Preview what would happen |\n| `--no-init` | Don't re-initialize after clearing |\n\n### Reset Levels\n1. **Soft Reset (default)** - Kill daemons, clear .beads/, re-init. Git history unchanged.\n2. **Hard Reset (`--hard`)** - Also git rm and commit the removal, then commit fresh state.\n\n### Implementation Flow\n1. Validate .beads/ exists\n2. If not --force: show impact summary, prompt confirmation\n3. If --backup: copy .beads/ to .beads-backup-{timestamp}/\n4. Kill daemons\n5. If --hard: git rm + commit\n6. rm -rf .beads/*\n7. If not --no-init: bd init (and git add+commit if --hard)\n8. Print summary\n\n### Safety Mechanisms\n- Confirmation prompt (skip with --force)\n- Impact summary (issue/tombstone counts)\n- Backup option\n- Dry-run preview\n- Git dirty check warning\n\n### Code Structure\n- `cmd/bd/reset.go` - CLI command\n- `internal/reset/` - Core logic package","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-12-13T08:44:01.38379+11:00","updated_at":"2025-12-13T07:29:07.540997-08:00","closed_at":"2025-12-13T10:18:19.965287+11:00"}
|
||
{"id":"bd-aydr.1","title":"Implement core reset package (internal/reset)","description":"Create the core reset logic in internal/reset/ package.\n\n## Responsibilities\n- ResetOptions struct with all flag options\n- CountImpact() - count issues/tombstones that will be deleted\n- ValidateState() - check .beads/ exists, check git dirty state\n- ExecuteReset() - main reset logic (without CLI concerns)\n- Integrate with daemon killall\n\n## Interface Design\n```go\ntype ResetOptions struct {\n Hard bool // Include git operations (git rm, commit)\n Backup bool // Create backup before reset\n DryRun bool // Preview only, don't execute\n SkipInit bool // Don't re-initialize after reset\n}\n\ntype ResetResult struct {\n IssuesDeleted int\n TombstonesDeleted int\n BackupPath string // if backup was created\n DaemonsKilled int\n}\n\ntype ImpactSummary struct {\n IssueCount int\n OpenCount int\n ClosedCount int\n TombstoneCount int\n HasUncommitted bool // git dirty state\n}\n\nfunc Reset(opts ResetOptions) (*ResetResult, error)\nfunc CountImpact() (*ImpactSummary, error)\nfunc ValidateState() error\n```\n\n## IMPORTANT: CLI vs Core Separation\n- `Force` (skip confirmation) is NOT in ResetOptions - that's a CLI concern\n- Core always executes when called; CLI decides whether to prompt first\n- Keep CLI-agnostic: no prompts, no colored output, no user interaction\n- Return errors for CLI to handle with user-friendly messages\n- Unit testable in isolation\n\n## Dependencies\n- Uses daemon.KillAllDaemons() from internal/daemon/\n- Calls bd init logic after reset (unless SkipInit)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-13T08:44:50.145364+11:00","updated_at":"2025-12-13T10:13:32.610253+11:00","closed_at":"2025-12-13T09:20:06.184893+11:00","dependencies":[{"issue_id":"bd-aydr.1","depends_on_id":"bd-aydr","type":"parent-child","created_at":"2025-12-13T08:44:50.145775+11:00","created_by":"daemon"}]}
|
||
{"id":"bd-aydr.2","title":"Implement backup functionality for reset","description":"Add backup capability that can be used by reset command.\n\n## Functionality\n- Copy .beads/ to .beads-backup-{timestamp}/\n- Timestamp format: YYYYMMDD-HHMMSS\n- Preserve file permissions\n- Return backup path for user feedback\n\n## Location\n`internal/reset/backup.go` - keep with reset package for now (YAGNI)\n\n## Interface\n```go\nfunc CreateBackup(beadsDir string) (backupPath string, err error)\n```\n\n## Notes\n- Simple recursive file copy, no compression needed\n- Error if backup dir already exists (unlikely with timestamp)\n- Backup directories SHOULD be gitignored\n- Add `.beads-backup-*/` pattern to .beads/.gitignore template in doctor package\n- Consider: ListBackups() for future `bd backup list` command (not for this PR)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-13T08:44:51.306103+11:00","updated_at":"2025-12-13T10:13:32.610819+11:00","closed_at":"2025-12-13T09:20:20.590488+11:00","dependencies":[{"issue_id":"bd-aydr.2","depends_on_id":"bd-aydr","type":"parent-child","created_at":"2025-12-13T08:44:51.306474+11:00","created_by":"daemon"}]}
|
||
{"id":"bd-aydr.3","title":"Add git operations for --hard reset","description":"Implement git integration for hard reset mode.\n\n## Operations Needed\n1. `git rm -rf .beads/*.jsonl` - remove data files from index\n2. `git commit -m 'beads: reset to clean state'` - commit removal\n3. After re-init: `git add .beads/` and commit fresh state\n\n## Edge Cases to Handle\n- Uncommitted changes in .beads/ - warn or error\n- Detached HEAD state - warn, maybe block\n- Git not initialized - skip git ops, warn\n- Git operations fail mid-way - clear error messaging\n\n## Interface\n```go\ntype GitState struct {\n IsRepo bool\n IsDirty bool // uncommitted changes in .beads/\n IsDetached bool // detached HEAD\n Branch string // current branch name\n}\n\nfunc CheckGitState(beadsDir string) (*GitState, error)\nfunc GitRemoveBeads(beadsDir string) error\nfunc GitCommitReset(message string) error\nfunc GitAddAndCommit(beadsDir, message string) error\n```\n\n## Location\n`internal/reset/git.go` - keep with reset package for now\n\nNote: Codebase has no central git package. internal/compact/git.go is compact-specific.\nFuture refactoring could extract shared git utilities, but YAGNI for now.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-13T08:44:52.798312+11:00","updated_at":"2025-12-13T10:13:32.611131+11:00","closed_at":"2025-12-13T09:17:40.785927+11:00","dependencies":[{"issue_id":"bd-aydr.3","depends_on_id":"bd-aydr","type":"parent-child","created_at":"2025-12-13T08:44:52.798715+11:00","created_by":"daemon"}]}
|
||
{"id":"bd-aydr.4","title":"Implement CLI command (cmd/bd/reset.go)","description":"Wire up the reset command with Cobra CLI.\n\n## Responsibilities\n- Define command and all flags\n- User confirmation prompt (unless --force)\n- Display impact summary before confirmation\n- Colored output and progress indicators\n- Call core reset package\n- Handle errors with user-friendly messages\n- Register command with rootCmd in init()\n\n## Flags\n```go\n--hard bool \"Also remove from git and commit\"\n--force bool \"Skip confirmation prompt\"\n--backup bool \"Create backup before reset\"\n--dry-run bool \"Preview what would happen\"\n--skip-init bool \"Do not re-initialize after reset\"\n--verbose bool \"Show detailed progress output\"\n```\n\n## Output Format\n```\n⚠️ This will reset beads to a clean state.\n\nWill be deleted:\n • 47 issues (23 open, 24 closed)\n • 12 tombstones\n\nContinue? [y/N] y\n\n→ Stopping daemons... ✓\n→ Removing .beads/... ✓\n→ Initializing fresh... ✓\n\n✓ Reset complete. Run 'bd onboard' to set up hooks.\n```\n\n## Implementation Notes\n- Confirmation logic lives HERE, not in core package\n- Use color package (github.com/fatih/color) for output\n- Follow patterns from other commands (init.go, doctor.go)\n- Add to rootCmd in init() function\n\n## File Location\n`cmd/bd/reset.go`","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-13T08:44:54.318854+11:00","updated_at":"2025-12-13T10:13:32.611434+11:00","closed_at":"2025-12-13T09:59:41.72638+11:00","dependencies":[{"issue_id":"bd-aydr.4","depends_on_id":"bd-aydr","type":"parent-child","created_at":"2025-12-13T08:44:54.319237+11:00","created_by":"daemon"},{"issue_id":"bd-aydr.4","depends_on_id":"bd-aydr.1","type":"blocks","created_at":"2025-12-13T08:45:09.762138+11:00","created_by":"daemon"},{"issue_id":"bd-aydr.4","depends_on_id":"bd-aydr.2","type":"blocks","created_at":"2025-12-13T08:45:09.817854+11:00","created_by":"daemon"},{"issue_id":"bd-aydr.4","depends_on_id":"bd-aydr.3","type":"blocks","created_at":"2025-12-13T08:45:09.883658+11:00","created_by":"daemon"}]}
|
||
{"id":"bd-aydr.5","title":"Enhance bd doctor to suggest reset for broken states","description":"Update bd doctor to detect severely broken states and suggest reset.\n\n## Detection Criteria\nSuggest reset when:\n- Multiple unfixable errors detected\n- Corrupted JSONL that can't be repaired\n- Schema version mismatch that can't be migrated\n- Daemon state inconsistent and unkillable\n\n## Implementation\nAdd to doctor's check/fix flow:\n```go\nif unfixableErrors \u003e threshold {\n suggest('State may be too broken to fix. Consider: bd reset')\n}\n```\n\n## Output Example\n```\n✗ Found 5 unfixable errors\n \n Your beads state may be too corrupted to repair.\n Consider running 'bd reset' to start fresh.\n (Use 'bd reset --backup' to save current state first)\n```\n\n## Notes\n- Don't auto-run reset, just suggest\n- This is lower priority, can be done in parallel with main work","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-13T08:44:55.591986+11:00","updated_at":"2025-12-13T06:38:02.4729-08:00","closed_at":"2025-12-13T10:17:23.4522+11:00","dependencies":[{"issue_id":"bd-aydr.5","depends_on_id":"bd-aydr","type":"parent-child","created_at":"2025-12-13T08:44:55.59239+11:00","created_by":"daemon"}]}
|
||
{"id":"bd-aydr.6","title":"Add unit tests for reset package","description":"Comprehensive unit tests for internal/reset package.\n\n## Test Cases\n\n### ValidateState tests\n- .beads/ exists → success\n- .beads/ missing → appropriate error\n- git dirty state detection\n\n### CountImpact tests \n- Empty .beads/ → zero counts\n- With issues → correct count (open vs closed)\n- With tombstones → correct count\n- Returns HasUncommitted correctly\n\n### Backup tests\n- Creates backup with correct timestamp format\n- Preserves all files and permissions\n- Returns correct path\n- Handles missing .beads/ gracefully\n- Errors on pre-existing backup dir\n\n### Git operation tests\n- CheckGitState detects dirty, detached, not-a-repo\n- GitRemoveBeads removes correct files\n- GitCommitReset creates commit with message\n- Operations skip gracefully when not in git repo\n\n### Reset tests (with mocks/temp dirs)\n- Soft reset removes files, calls init\n- Hard reset includes git operations\n- Dry run doesn't modify anything\n- SkipInit flag prevents re-initialization\n- Daemon killall is called\n- Backup is created when requested\n\n## Approach\n- Can start with interface definitions (TDD style)\n- Use testify for assertions\n- Create temp directories for isolation\n- Mock git operations where needed\n- Test completion depends on implementation tasks\n\n## File Location\n`internal/reset/reset_test.go`\n`internal/reset/backup_test.go`\n`internal/reset/git_test.go`","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-13T08:44:57.01739+11:00","updated_at":"2025-12-13T10:13:32.611698+11:00","closed_at":"2025-12-13T09:59:20.820314+11:00","dependencies":[{"issue_id":"bd-aydr.6","depends_on_id":"bd-aydr","type":"parent-child","created_at":"2025-12-13T08:44:57.017813+11:00","created_by":"daemon"}]}
|
||
{"id":"bd-aydr.7","title":"Add integration tests for bd reset command","description":"End-to-end integration tests for the reset command.\n\n## Test Scenarios\n\n### Basic reset\n1. Init beads, create some issues\n2. Run bd reset --force\n3. Verify .beads/ is fresh, issues gone\n\n### Hard reset\n1. Init beads, create issues, commit\n2. Run bd reset --hard --force \n3. Verify git history has reset commits\n\n### Backup functionality\n1. Init beads, create issues\n2. Run bd reset --backup --force\n3. Verify backup exists with correct contents\n4. Verify main .beads/ is reset\n\n### Dry run\n1. Init beads, create issues\n2. Run bd reset --dry-run\n3. Verify nothing changed\n\n### Confirmation prompt\n1. Init beads\n2. Run bd reset (no --force)\n3. Verify prompts for confirmation\n4. Test both y and n responses\n\n## Location\ntests/integration/reset_test.go or similar","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-13T08:44:58.479282+11:00","updated_at":"2025-12-13T06:38:02.473244-08:00","closed_at":"2025-12-13T10:15:59.221637+11:00","dependencies":[{"issue_id":"bd-aydr.7","depends_on_id":"bd-aydr","type":"parent-child","created_at":"2025-12-13T08:44:58.479686+11:00","created_by":"daemon"},{"issue_id":"bd-aydr.7","depends_on_id":"bd-aydr.4","type":"blocks","created_at":"2025-12-13T08:45:11.15972+11:00","created_by":"daemon"}]}
|
||
{"id":"bd-aydr.8","title":"Respond to GitHub issue #479 with solution","description":"Once bd reset is implemented and released, respond to GitHub issue #479.\n\n## Response should include\n- Announce the new bd reset command\n- Show basic usage examples\n- Link to any documentation\n- Thank the user for the feedback\n\n## Example response\n```\nThanks for raising this! We've added a `bd reset` command to handle this case.\n\nUsage:\n- `bd reset` - Reset to clean state (prompts for confirmation)\n- `bd reset --backup` - Create backup first\n- `bd reset --hard` - Also clean up git history\n\nThis is available in version X.Y.Z.\n```\n\n## Notes\n- Wait until feature is merged and released\n- Consider if issue should be closed or left for user confirmation","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-13T08:45:00.112351+11:00","updated_at":"2025-12-13T06:38:02.473538-08:00","closed_at":"2025-12-13T10:18:06.646796+11:00","dependencies":[{"issue_id":"bd-aydr.8","depends_on_id":"bd-aydr","type":"parent-child","created_at":"2025-12-13T08:45:00.112732+11:00","created_by":"daemon"},{"issue_id":"bd-aydr.8","depends_on_id":"bd-aydr.7","type":"blocks","created_at":"2025-12-13T08:45:12.640243+11:00","created_by":"daemon"}]}
|
||
{"id":"bd-aydr.9","title":"Add .beads-backup-* pattern to gitignore template","description":"Update the gitignore template in doctor package to include backup directories.\n\n## Change\nAdd `.beads-backup-*/` to the GitignoreTemplate in `cmd/bd/doctor/gitignore.go`\n\n## Why\nBackup directories created by `bd reset --backup` should not be committed to git.\nThey are local-only recovery tools.\n\n## File\n`cmd/bd/doctor/gitignore.go` - look for GitignoreTemplate constant","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-13T08:49:42.453483+11:00","updated_at":"2025-12-13T09:16:44.201889+11:00","closed_at":"2025-12-13T09:16:44.201889+11:00","dependencies":[{"issue_id":"bd-aydr.9","depends_on_id":"bd-aydr","type":"parent-child","created_at":"2025-12-13T08:49:42.453886+11:00","created_by":"daemon"}]}
|
||
{"id":"bd-aysr","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-12-14T16:45:51.901546-08:00","closed_at":"2025-11-05T12:58:44.73082-08:00"}
|
||
{"id":"bd-ayw","title":"Add 'When to use daemon mode' decision tree to daemon.md","description":"**Problem:**\nUsers (especially local-only developers) see daemon-related messages but don't understand:\n- What daemon mode does (git sync automation)\n- Whether they need it\n- Why they see \"daemon_unsupported\" messages\n\nRelated to issue #349 item #3.\n\n**Current state:**\ncommands/daemon.md explains WHAT daemon does but not WHEN to use it.\n\n**Proposed addition:**\nAdd a \"When to Use Daemon Mode\" section after line 20 in commands/daemon.md with clear decision criteria:\n\n**✅ You SHOULD use daemon mode if:**\n- Working in a team with git remote sync\n- Want automatic commit/push of issue changes\n- Need background auto-sync (5-second debounce)\n- Making frequent bd commands (performance benefit)\n\n**❌ You DON'T need daemon mode if:**\n- Solo developer with local-only tracking\n- Working in git worktrees (use --no-daemon)\n- Running one-off commands/scripts\n- Debugging database issues\n\n**Local-only users:** Direct mode is perfectly fine. Daemon mainly helps with git sync automation. You can use `bd sync` manually when needed.\n\n**Files to modify:**\n- commands/daemon.md (add section after line 20)","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-20T20:48:23.111621-05:00","updated_at":"2025-11-20T20:59:13.429263-05:00","closed_at":"2025-11-20T20:59:13.429263-05:00"}
|
||
{"id":"bd-az0m","title":"Issue 1","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-22T14:57:44.52134201-05:00","updated_at":"2025-12-14T16:46:55.077161-08:00","closed_at":"2025-11-07T21:55:09.42865-08:00","dependencies":[{"issue_id":"bd-az0m","depends_on_id":"bd-bvo2","type":"related","created_at":"2025-11-07T19:07:21.069031-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-azh","title":"Fix bd doctor --fix recursive message for deletions manifest","description":"When running bd doctor --fix, if the deletions manifest check fails but there are no deleted issues in git history, the fix succeeds but doesn't create the file. The check then runs again and tells user to run bd doctor --fix - the same command they just ran.\n\nFix: Create empty deletions.jsonl when hydration finds no deletions, and recognize empty file as valid in the check.\n\nFixes: https://github.com/steveyegge/beads/issues/403","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-27T12:41:09.426143-08:00","updated_at":"2025-11-27T12:41:23.521981-08:00","closed_at":"2025-11-27T12:41:23.521981-08:00"}
|
||
{"id":"bd-azqv","title":"Ready issue","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-07T19:04:22.247039-08:00","updated_at":"2025-12-14T16:46:54.589147-08:00","closed_at":"2025-11-07T21:55:09.429024-08:00"}
|
||
{"id":"bd-b121","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.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-04T00:52:56.318619-08:00","updated_at":"2025-12-14T16:45:40.133155-08:00","closed_at":"2025-11-05T00:50:00.558124-08:00"}
|
||
{"id":"bd-b134","title":"Add tests for Integration Layer Implementation","description":"While implementing bd-wfmw, noticed missing tests","notes":"Reviewed existing coverage:\n- Basic test coverage exists in lib/test_beads_mail_adapter.py\n- Integration tests cover failure scenarios in tests/integration/test_mail_failures.py\n- Good coverage of: enabled/disabled modes, graceful degradation, 409 conflicts, HTTP errors, config\n- Missing: authorization headers detail, request body structure validation, concurrent reservation timing, TTL edge cases","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-08T00:20:30.804172-08:00","updated_at":"2025-12-14T16:47:25.962936-08:00","closed_at":"2025-11-08T02:17:04.046571-08:00","dependencies":[{"issue_id":"bd-b134","depends_on_id":"bd-wfmw","type":"discovered-from","created_at":"2025-11-08T00:20:30.850776-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-b245","title":"Add migration registry and simplify New()","description":"Create migrations.go with Migration type and registry. Change New() to: openDB -\u003e initSchema -\u003e RunMigrations(db). This removes 8+ separate migrate functions from New().","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-01T11:41:14.862623-07:00","updated_at":"2025-12-14T16:44:48.605417-08:00","closed_at":"2025-11-02T12:55:59.954854-08:00"}
|
||
{"id":"bd-b318","title":"Add integration tests for CompactedResult in MCP server","description":"The CompactedResult model is used for list operations when results exceed COMPACTION_THRESHOLD (20 items), but there are no integration tests verifying the actual MCP server behavior with large result sets.\n\n## What's Missing\n- Integration test that mocks a large result set (\u003e20 issues) and verifies CompactedResult is returned\n- Verification that preview_count matches PREVIEW_COUNT (5)\n- Verification that total_count reflects actual result size\n- Test that compaction threshold is configurable (currently hardcoded COMPACTION_THRESHOLD=20)\n\n## Why This Matters\nThe compaction logic is critical for preventing context overflow with large lists. Without integration tests, we can't verify it works correctly with the actual MCP protocol.\n\n## Suggested Implementation\nCreate test_mcp_compaction.py with:\n1. test_list_with_large_result_set_returns_compacted_result()\n2. test_ready_work_respects_compaction_threshold()\n3. test_compacted_result_structure_is_valid()","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-14T14:24:23.824353-08:00","updated_at":"2025-12-14T14:39:50.151444-08:00","closed_at":"2025-12-14T14:39:50.151444-08:00","dependencies":[{"issue_id":"bd-b318","depends_on_id":"bd-otf4","type":"discovered-from","created_at":"2025-12-14T14:24:23.825923-08:00","created_by":"stevey"}]}
|
||
{"id":"bd-b47c034e","title":"Address gosec security warnings (102 issues)","description":"Security linter warnings: file permissions (0755 should be 0750), G304 file inclusion via variable, G204 subprocess launches. Many are false positives but should be reviewed.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-25T13:47:10.719134-07:00","updated_at":"2025-12-14T16:45:21.025214-08:00","closed_at":"2025-11-04T11:10:23.533338-08:00"}
|
||
{"id":"bd-b4b0","title":"Implement fs bridge layer for WASM (Go syscall/js to Node.js fs)","description":"**Summary:** Developed a filesystem bridge layer for Go WASM to enable file system operations by wrapping Node.js fs module functions. This solution provides cross-runtime compatibility for file system interactions in WebAssembly environments.\n\n**Key Decisions:**\n- Use syscall/js for JavaScript interop\n- Conditional WASM compilation\n- Wrap core file operation methods\n\n**Resolution:** Successfully created a transparent file system abstraction that enables Go file operations across JavaScript runtime environments.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-02T22:22:42.796412-08:00","updated_at":"2025-12-14T16:45:02.990388-08:00","closed_at":"2025-11-02T22:47:49.586218-08:00","dependencies":[{"issue_id":"bd-b4b0","depends_on_id":"bd-44d0","type":"parent-child","created_at":"2025-11-02T22:23:49.585675-08:00","created_by":"stevey"}]}
|
||
{"id":"bd-b501fcc1","title":"Unit tests for Debouncer","description":"Test debouncer batches multiple triggers into single action. Test timer reset on subsequent triggers. Test cancel during wait. Test thread safety.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T19:42:29.86146-07:00","updated_at":"2025-12-14T16:44:14.928714-08:00","closed_at":"2025-10-31T17:54:06.880513-07:00"}
|
||
{"id":"bd-b54c","title":"Document Claude Code for Web SessionStart hook","description":"**Summary:** Documented Claude Code integration for web environments, focusing on SessionStart hook configuration and npm-based bd tool installation. Created comprehensive documentation to standardize web integration process.\n\n**Key Decisions:**\n- Use .claude/settings.json for configuration\n- Implement npm global install strategy\n- Document in README and dedicated web integration guide\n\n**Resolution:** Established clear, consistent documentation enabling developers to reliably initialize Claude Code in web environments with minimal friction.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-02T23:40:15.362379-08:00","updated_at":"2025-12-14T16:45:06.409195-08:00","closed_at":"2025-11-03T10:31:45.382915-08:00","dependencies":[{"issue_id":"bd-b54c","depends_on_id":"bd-febc","type":"parent-child","created_at":"2025-11-02T23:40:32.991889-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-b55e2ac2","title":"Fix autoimport tests for content-hash collision scoring","description":"**Summary:** Autoimport tests were updated to reflect a change from reference-counting to content-hash based collision resolution in the import system. The modifications ensure tests now validate the new deterministic approach for handling issue collisions.\n\n**Key Decisions:**\n- Switch from reference count to content-hash comparison for collision scoring\n- Prioritize lexicographically lower content hash when resolving collisions\n- Modify tests to verify new deterministic resolution mechanism\n\n**Resolution:** All three autoimport collision tests now pass, confirming the new content-hash scoring approach works correctly and predictably across different import scenarios.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-28T19:17:28.358028-07:00","updated_at":"2025-12-14T16:47:41.652611-08:00","closed_at":"2025-11-08T15:58:44.909873-08:00"}
|
||
{"id":"bd-b5a3","title":"Extract Daemon struct and config into internal/daemonrunner","description":"**Summary:** Refactored daemon runtime logic into a new internal/daemonrunner package, extracting core management structs from existing code. This modularization improves code organization and separates daemon-specific concerns.\n\n**Key Decisions:**\n- Create dedicated package for daemon runtime\n- Separate Config and Daemon structs\n- Implement lifecycle methods\n\n**Resolution:** Successfully created modular daemon runner package that preserves functionality and improves code structure.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-01T11:41:14.843103-07:00","updated_at":"2025-12-14T16:44:30.782894-08:00","closed_at":"2025-11-01T20:23:46.475888-07:00"}
|
||
{"id":"bd-b6b2","title":"Feature with design","description":"This is a description","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-10-31T21:40:34.612465-07:00","updated_at":"2025-12-14T16:45:21.515716-08:00","closed_at":"2025-11-04T11:10:23.533638-08:00"}
|
||
{"id":"bd-b7d2","title":"Add sync.branch configuration","description":"Add configuration layer to support sync.branch setting via config file, environment variable, or CLI flag.\n\nTasks:\n- Add sync.branch field to config schema\n- Add BEADS_SYNC_BRANCH environment variable\n- Add --branch flag to bd init\n- Add bd config get/set sync.branch commands\n- Validation (branch name format, conflicts)\n- Config migration for existing users\n\nEstimated effort: 1-2 days","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-02T15:22:35.560141-08:00","updated_at":"2025-12-14T16:45:21.629633-08:00","closed_at":"2025-11-04T11:10:23.533913-08:00","dependencies":[{"issue_id":"bd-b7d2","depends_on_id":"bd-a101","type":"parent-child","created_at":"2025-11-02T15:22:48.356847-08:00","created_by":"stevey"}]}
|
||
{"id":"bd-b8h","title":"Refactor check-health DB access to avoid repeated path resolution","description":"The runCheckHealth lightweight checks (hintsDisabled, checkVersionMismatch, checkSyncBranchQuick) each have duplicated database path resolution logic. Extract a helper function to DRY this up.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-25T19:27:35.075929-08:00","updated_at":"2025-11-25T19:50:21.272961-08:00","closed_at":"2025-11-25T19:50:21.272961-08:00"}
|
||
{"id":"bd-b92a","title":"Wire config to import pipeline","description":"Connect import.orphan_handling config to importer.go and sqlite validation functions. Pass mode flag through call chain. Implement all four modes (strict/resurrect/skip/allow) with proper error messages and logging.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-04T12:32:08.612142-08:00","updated_at":"2025-12-14T16:45:39.735711-08:00","closed_at":"2025-11-05T00:44:27.949024-08:00"}
|
||
{"id":"bd-bb08","title":"Add ON DELETE CASCADE to child_counters schema","description":"Update schema.go child_counters table foreign key with ON DELETE CASCADE. When parent deleted, child counter should also be deleted. If parent is resurrected, counter gets recreated from scratch. Add migration for existing databases.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-04T12:32:30.681452-08:00","updated_at":"2025-12-14T16:45:40.076634-08:00","closed_at":"2025-11-05T00:55:12.427194-08:00"}
|
||
{"id":"bd-bc2c6191","title":"Audit Current Cache Usage","description":"Understand exactly what code depends on the storage cache","notes":"Audit complete. See CACHE_AUDIT.md for full findings.\n\nSummary:\n- Cache was already removed in commit 322ab63 (2025-10-28)\n- server_cache_storage.go deleted (~286 lines)\n- All getStorageForRequest calls replaced with s.storage\n- All environment variables removed\n- MCP multi-repo works via per-project daemon architecture\n- All tests updated and passing\n- Only stale comment in server.go needed fixing","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-27T23:02:43.506373-07:00","updated_at":"2025-12-14T16:46:31.215303-08:00","closed_at":"2025-11-06T19:48:30.520616-08:00"}
|
||
{"id":"bd-bc7l","title":"Issue 2 to reopen","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-22T14:57:44.523769552-05:00","updated_at":"2025-12-14T16:46:58.66126-08:00","closed_at":"2025-11-07T21:57:59.91095-08:00"}
|
||
{"id":"bd-bdaf24d5","title":"Final validation test","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-27T18:27:28.310533-07:00","updated_at":"2025-12-14T16:44:03.448329-08:00","closed_at":"2025-10-31T12:00:43.184995-07:00"}
|
||
{"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-12-14T16:47:35.640724-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-be7a","title":"Create npm package structure with package.json","description":"**Summary:** Developed npm package structure for @beads/bd CLI tool to enable cross-platform binary distribution through Node.js. Established configuration that supports seamless installation and execution across different environments.\n\n**Key Decisions:**\n- Use scoped package name @beads/bd\n- Implement postinstall binary download\n- Create binary wrapper script\n\n**Resolution:** Created modular npm package skeleton enabling flexible and portable CLI tool distribution.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-02T23:39:47.416779-08:00","updated_at":"2025-12-14T16:45:05.25539-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-bgca","title":"Latency test manual","description":"","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-08T00:04:25.028223-08:00","updated_at":"2025-12-14T16:47:09.724217-08:00","closed_at":"2025-11-08T00:06:46.169654-08:00"}
|
||
{"id":"bd-bgm","title":"Fix unparam unused parameter in cmd/bd/doctor.go:1879","description":"Linting issue: checkGitHooks - path is unused (unparam) at cmd/bd/doctor.go:1879:20. Error: func checkGitHooks(path string) doctorCheck {","status":"open","priority":0,"issue_type":"bug","created_at":"2025-12-07T15:35:25.270293252-07:00","updated_at":"2025-12-07T15:35:25.270293252-07:00"}
|
||
{"id":"bd-bgs","title":"Git history fallback doesn't escape regex special chars in IDs","description":"## Problem\n\nIn `batchCheckGitHistory`, IDs are directly interpolated into a regex pattern:\n\n```go\npatterns = append(patterns, fmt.Sprintf(\\`\"id\":\"%s\"\\`, id))\nsearchPattern := strings.Join(patterns, \"|\")\ncmd := exec.Command(\"git\", \"log\", \"--all\", \"-G\", searchPattern, ...)\n```\n\nIf an ID contains regex special characters (e.g., `bd-foo.bar` or `bd-test+1`), the pattern will be malformed or match unintended strings.\n\n## Location\n`internal/importer/importer.go:923-926`\n\n## Impact\n- False positives: IDs with `.` could match any character\n- Regex errors: IDs with `[` or `(` could cause git to fail\n- Security: potential for regex injection (low risk since IDs are validated)\n\n## Fix\nEscape regex special characters:\n\n```go\nimport \"regexp\"\n\nescapedID := regexp.QuoteMeta(id)\npatterns = append(patterns, fmt.Sprintf(\\`\"id\":\"%s\"\\`, escapedID))\n```","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-25T12:50:30.132232-08:00","updated_at":"2025-11-25T15:04:06.217695-08:00","closed_at":"2025-11-25T15:04:06.217695-08:00"}
|
||
{"id":"bd-bhd","title":"Git history fallback assumes .beads is direct child of repo root","description":"## Problem\n\n`checkGitHistoryForDeletions` assumes the repo structure:\n\n```go\nrepoRoot := filepath.Dir(beadsDir) // Assumes .beads is in repo root\njsonlPath := filepath.Join(\".beads\", \"beads.jsonl\")\n```\n\nBut `.beads` could be in a subdirectory (monorepo, nested project), and the actual JSONL filename could be different (configured via `metadata.json`).\n\n## Location\n`internal/importer/importer.go:865-869`\n\n## Impact\n- Git search will fail silently for repos with non-standard structure\n- Monorepo users won't get deletion propagation\n\n## Fix\n1. Use `git rev-parse --show-toplevel` to find actual repo root\n2. Compute relative path from repo root to JSONL\n3. Or use `git -C \u003cdir\u003e` to run from beadsDir directly","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-25T12:51:03.46856-08:00","updated_at":"2025-11-25T15:05:40.754716-08:00","closed_at":"2025-11-25T15:05:40.754716-08:00"}
|
||
{"id":"bd-biwp","title":"Support local-only git repos without remote origin","description":"Daemon crashes when working with local git repos that don't have origin remote configured. Should gracefully degrade to local-only mode: skip git pull/push operations but maintain daemon features (RPC server, auto-flush, JSONL export).","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-09T16:09:50.677769-08:00","updated_at":"2025-12-14T16:47:50.072371-08:00","closed_at":"2025-11-09T16:16:56.588548-08:00"}
|
||
{"id":"bd-bmev","title":"Replace Windows CI full test suite with smoke tests","description":"## Problem\n\nWindows CI tests consistently timeout at 30 minutes despite multiple optimization attempts:\n- Split into parallel jobs (cmd vs internal) - still times out\n- RAM disk for temp/cache - marginal improvement (~50%)\n- RAM disk for workspace - breaks due to t.Chdir() incompatibility with ImDisk\n\nRoot cause: Windows I/O is fundamentally 20x slower than Linux:\n- NTFS slow for small file operations\n- Windows Defender scans every file access\n- Git on Windows is 5-10x slower\n- Process spawning is expensive\n\nLinux tests complete in ~1.5 min with race detector. Windows takes 30+ min without.\n\n## Current State\n\n- Windows jobs have continue-on-error: true (don't block PRs)\n- Tests timeout before completing, providing zero signal\n- RAM disk experiments added complexity without solving the problem\n\n## Solution: Smoke Tests Only\n\nReplace full test suite with minimal smoke tests that verify Windows compatibility in \u003c 2 minutes.\n\n### What to Test\n1. Binary builds - go build succeeds (already separate step)\n2. Binary executes - bd version works\n3. Init works - bd init creates valid database\n4. Basic CRUD - create, list, show, update, close\n5. Path handling - Windows backslash paths work\n\n### Proposed CI Change\n\nReplace test-windows-cmd and test-windows-internal with single smoke test job:\n- Build bd.exe\n- Run: bd version\n- Run: bd init --quiet --prefix smoke\n- Run: bd create --title \"Windows smoke test\" --type task\n- Run: bd list\n- Run: bd show smoke-001\n- Run: bd update smoke-001 --status in_progress\n- Run: bd close smoke-001\n\n### Benefits\n- Completes in \u003c 2 minutes vs 30+ minute timeouts\n- Provides actual pass/fail signal\n- Verifies Windows binary works\n- Removes RAM disk complexity\n- Single job instead of two parallel jobs\n\n### Files to Change\n- .github/workflows/ci.yml - Replace test-windows-cmd and test-windows-internal jobs\n\n### Migration Steps\n1. Remove test-windows-cmd job\n2. Remove test-windows-internal job\n3. Add single test-windows job with smoke tests\n4. Remove continue-on-error (tests should now pass reliably)\n5. Clean up RAM disk remnants from previous attempts\n\n### Context\n- Parent issue: bd-5we (Use RAM disk for Windows CI tests)\n- RAM disk approach proved insufficient\n- This is the pragmatic solution after extensive experimentation","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-13T07:28:32.445588-08:00","updated_at":"2025-12-14T00:22:21.513492-08:00","closed_at":"2025-12-13T10:53:34.683101-08:00"}
|
||
{"id":"bd-bob","title":"Missing test: base is tombstone, both left and right are live","description":"The tombstone merge tests do not cover the case where the base version is a tombstone but both left and right have resurrected/live versions. This scenario could occur if: 1) Clone A deletes an issue, 2) Clone B and Clone C both sync from A (getting tombstone), 3) Both B and C independently recreate an issue with same ID. The current code would likely fall through to standard mergeIssue() which may not be correct. Need to add test and verify behavior. Files: internal/merge/merge_test.go, internal/merge/merge.go:347-387","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-05T16:36:34.895944-08:00","updated_at":"2025-12-13T09:42:56.871071+11:00","closed_at":"2025-12-07T02:27:40.788701-08:00"}
|
||
{"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-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-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":"open","priority":2,"issue_type":"task","created_at":"2025-12-14T16:31:35.881408-08:00","updated_at":"2025-12-14T16:31:35.881408-08:00"}
|
||
{"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-12-14T16:47:01.614309-08:00","closed_at":"2025-11-07T23:08:51.67473-08:00"}
|
||
{"id":"bd-bvec","title":"Test coverage improvement initiative (47.8% → 65%)","description":"Umbrella epic for improving overall test coverage from 47.8% to 65%+.\n\n## Summary\n\n| Package | Current | Target | Issue |\n|---------|---------|--------|-------|\n| internal/compact | 18.2% | 70% | bd-thgk |\n| cmd/bd/doctor/fix | 23.9% | 50% | bd-fx7v |\n| cmd/bd | 26.2% | 50% | bd-llfl |\n| internal/daemon | 27.3% | 60% | bd-n386 |\n| cmd/bd/setup | 28.4% | 50% | bd-sh4c |\n| internal/syncbranch | 33.0% | 70% | bd-io8c |\n| internal/export | 37.1% | 60% | bd-6sm6 |\n| internal/lockfile | 42.0% | 60% | bd-9w3s |\n| internal/rpc | 47.5% | 60% | bd-m8ro |\n| internal/beads | 48.1% | 70% | bd-tvu3 |\n| internal/storage | N/A | basic | bd-a15d |\n\n## Packages with good coverage (no action needed)\n- internal/types: 91.0%\n- internal/utils: 88.9%\n- internal/deletions: 84.3%\n- internal/config: 84.2%\n- internal/autoimport: 83.5%\n- internal/validation: 80.8%\n- internal/merge: 78.9%\n- internal/routing: 74.3%\n- internal/storage/sqlite: 73.1%\n- internal/importer: 70.2%\n\nOverall target: 65%+ (from current 47.8%)","status":"open","priority":2,"issue_type":"epic","created_at":"2025-12-13T20:43:22.901825-08:00","updated_at":"2025-12-13T20:43:22.901825-08:00","dependencies":[{"issue_id":"bd-bvec","depends_on_id":"bd-thgk","type":"blocks","created_at":"2025-12-13T20:43:29.536041-08:00","created_by":"daemon"},{"issue_id":"bd-bvec","depends_on_id":"bd-tvu3","type":"blocks","created_at":"2025-12-13T20:43:29.588057-08:00","created_by":"daemon"},{"issue_id":"bd-bvec","depends_on_id":"bd-n386","type":"blocks","created_at":"2025-12-13T20:43:29.637931-08:00","created_by":"daemon"},{"issue_id":"bd-bvec","depends_on_id":"bd-io8c","type":"blocks","created_at":"2025-12-13T20:43:29.689467-08:00","created_by":"daemon"},{"issue_id":"bd-bvec","depends_on_id":"bd-llfl","type":"blocks","created_at":"2025-12-13T20:43:29.738487-08:00","created_by":"daemon"},{"issue_id":"bd-bvec","depends_on_id":"bd-sh4c","type":"blocks","created_at":"2025-12-13T20:43:29.789217-08:00","created_by":"daemon"},{"issue_id":"bd-bvec","depends_on_id":"bd-fx7v","type":"blocks","created_at":"2025-12-13T20:43:29.839732-08:00","created_by":"daemon"},{"issue_id":"bd-bvec","depends_on_id":"bd-6sm6","type":"blocks","created_at":"2025-12-13T20:43:29.887425-08:00","created_by":"daemon"},{"issue_id":"bd-bvec","depends_on_id":"bd-9w3s","type":"blocks","created_at":"2025-12-13T20:43:29.936762-08:00","created_by":"daemon"},{"issue_id":"bd-bvec","depends_on_id":"bd-m8ro","type":"blocks","created_at":"2025-12-13T20:43:29.98703-08:00","created_by":"daemon"},{"issue_id":"bd-bvec","depends_on_id":"bd-a15d","type":"blocks","created_at":"2025-12-13T20:43:30.049603-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-bvo2","title":"Issue 2","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-22T14:57:44.526064586-05:00","updated_at":"2025-12-14T16:46:55.30956-08:00","closed_at":"2025-11-07T21:55:09.429328-08:00"}
|
||
{"id":"bd-bw6","title":"Fix G104 errors unhandled in internal/storage/sqlite/queries.go:1181","description":"Linting issue: G104: Errors unhandled (gosec) at internal/storage/sqlite/queries.go:1181:4. Error: rows.Close()","status":"open","priority":0,"issue_type":"bug","created_at":"2025-12-07T15:35:09.008444133-07:00","updated_at":"2025-12-07T15:35:09.008444133-07:00"}
|
||
{"id":"bd-bwdd","title":"GH#497: bd onboard copilot-instructions.md is beads-specific, not generic","description":"bd onboard outputs beads repo specific content (Go/SQLite/Cobra) for copilot-instructions.md instead of a generic template. AGENTS.md output is correct. See: https://github.com/steveyegge/beads/issues/497","status":"open","priority":2,"issue_type":"bug","created_at":"2025-12-14T16:32:18.599655-08:00","updated_at":"2025-12-14T16:32:18.599655-08:00"}
|
||
{"id":"bd-bwk2","title":"Centralize error handling patterns in storage layer","description":"80+ instances of inconsistent error handling across sqlite.go with mix of %w, %v, and no wrapping.\n\nLocation: internal/storage/sqlite/sqlite.go (throughout)\n\nProblem:\n- Some use fmt.Errorf(\"op failed: %w\", err) - correct wrapping\n- Some use fmt.Errorf(\"op failed: %v\", err) - loses error chain\n- Some return err directly - no context\n- Hard to debug production issues\n- Can't distinguish error types\n\nSolution: Create internal/storage/sqlite/errors.go:\n- Define sentinel errors (ErrNotFound, ErrInvalidID, etc.)\n- Create wrapDBError(op string, err error) helper\n- Convert sql.ErrNoRows to ErrNotFound\n- Always wrap with operation context\n\nImpact: Lost error context; inconsistent messages; hard to debug\n\nEffort: 5-7 hours","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-16T14:51:54.974909-08:00","updated_at":"2025-11-16T14:51:54.974909-08:00"}
|
||
{"id":"bd-bx9","title":"bd init --contributor should configure sync.remote=upstream for fork workflows","description":"When running `bd init --contributor` in a fork workflow (where `upstream` remote points to the original repo), the wizard should configure beads to sync from `upstream/main` rather than `origin/main`.\n\n**Current behavior:**\n- Contributor mode detects the fork setup (upstream remote exists)\n- Sets up planning repo and auto-routing\n- Does NOT configure sync remote\n- `bd sync` on feature branches shows \"No upstream configured, using --from-main mode\" and syncs from `origin/main`\n\n**Expected behavior:**\n- Contributor mode should also set `sync.remote = upstream` (or similar config)\n- `bd sync` should pull beads from `upstream/main` (source of truth)\n\n**Why this matters:**\n- The fork's `origin/main` may be behind `upstream/main`\n- Contributors want the latest issues from the source repo\n- Code PRs go: local -\u003e origin -\u003e upstream, but beads should come FROM upstream\n\n**Suggested fix:**\nAdd to `runContributorWizard()` after detecting fork:\n```go\nif isFork {\n store.SetConfig(ctx, \"sync.remote\", \"upstream\")\n}\n```","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-29T00:39:05.137488727-05:00","updated_at":"2025-11-29T23:23:01.219117-08:00","closed_at":"2025-11-29T23:22:57.631519-08:00"}
|
||
{"id":"bd-bxha","title":"Default to YES for git hooks and merge driver installation","description":"Currently bd init prompts user to install git hooks and merge driver, but setup is incomplete if user declines. Change to install by default unless --skip-hooks or --skip-merge-driver flags are passed. Better safe defaults. If installation fails, warn user and suggest bd doctor --fix.","status":"open","priority":1,"issue_type":"feature","created_at":"2025-11-21T23:16:10.172238-08:00","updated_at":"2025-11-21T23:16:28.369137-08:00","dependencies":[{"issue_id":"bd-bxha","depends_on_id":"bd-tbz3","type":"parent-child","created_at":"2025-11-21T23:16:10.173034-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-by3x","title":"Windows binaries lack SQLite support (GH #253)","description":"Windows users installing via install.ps1 get \"sql: unknown driver sqlite\" error. Root cause: GoReleaser was building with CGO_ENABLED=0, which excludes SQLite driver.\n\nFixed by:\n1. Enabling CGO in .goreleaser.yml\n2. Installing MinGW cross-compiler in release workflow\n3. Splitting builds per platform to set correct CC for Windows\n\nNeeds new release to fix for users.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-07T15:54:13.134815-08:00","updated_at":"2025-12-14T16:46:45.561757-08:00","closed_at":"2025-11-07T15:55:07.024156-08:00"}
|
||
{"id":"bd-bzfy","title":"Integrate beads-merge tool by @neongreen","description":"**Summary:** @neongreen developed an advanced 3-way merge tool for JSONL files with superior conflict prevention capabilities. The team evaluated integration strategies to incorporate this tool into their workflow.\n\n**Key Decisions:**\n- Document and bundle binary\n- Support 3-way merge with field-level resolution\n- Maintain standard conflict handling\n\n**Resolution:** Vendor beads-merge directly into project repository with attribution, streamlining JSONL file conflict management.","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-11-05T11:31:44.906652-08:00","updated_at":"2025-12-14T16:46:09.102129-08:00","closed_at":"2025-11-06T15:38:37.052274-08:00"}
|
||
{"id":"bd-c01f","title":"Implement bd stale command to find abandoned/forgotten issues","description":"**Summary:** Developed a 'bd stale' CLI command to automatically detect abandoned issues by tracking inactivity duration. The feature helps teams proactively manage issue tracking workflows.\n\n**Key Decisions:**\n- Default staleness threshold: 30-90 days\n- JSON output for automation\n- Status-based filtering\n\n**Resolution:** New CLI command successfully implemented, enhancing project management efficiency through automated stale issue identification.","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-10-31T22:48:46.85435-07:00","updated_at":"2025-12-14T16:44:23.076352-08:00","closed_at":"2025-10-31T22:54:33.704492-07:00"}
|
||
{"id":"bd-c13f","title":"Add unit tests for parent resurrection","description":"Test resurrection with deleted parent (should succeed), resurrection with never-existed parent (should fail gracefully), multi-level resurrection (bd-abc.1.2 with both parents missing). Verify tombstone creation and is_tombstone flag.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-04T12:32:21.325335-08:00","updated_at":"2025-12-14T16:45:29.291544-08:00","closed_at":"2025-11-05T00:08:42.813731-08:00"}
|
||
{"id":"bd-c362","title":"Extract database search logic into helper function","description":"The logic for finding a database in a beads directory is duplicated:\n- FindDatabasePath() BEADS_DIR section (beads.go:141-169)\n- findDatabaseInTree() (beads.go:248-280)\n\nBoth implement the same search order:\n1. Check config.json first (single source of truth)\n2. Fall back to canonical beads.db\n3. Search for *.db files, filtering backups and vc.db\n\nRefactoring suggestion:\nExtract to a helper function like:\n func findDatabaseInBeadsDir(beadsDir string) string\n\nBenefits:\n- Single source of truth for database search logic\n- Easier to maintain and update search order\n- Reduces code duplication\n\nRelated to [deleted:bd-e16b] implementation.","status":"closed","priority":3,"issue_type":"chore","created_at":"2025-11-02T18:34:02.831543-08:00","updated_at":"2025-12-09T18:38:37.685269872-05:00","closed_at":"2025-11-25T22:27:33.794656-08:00","dependencies":[{"issue_id":"bd-c362","depends_on_id":"bd-e16b","type":"blocks","created_at":"2025-11-02T18:34:02.832607-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-c3ei","title":"Migration guide documentation","description":"Write comprehensive migration guide covering: OSS contributor workflow, team workflow, multi-phase development, multiple personas. Include step-by-step instructions, troubleshooting, and backward compatibility notes.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-05T18:04:29.84662-08:00","updated_at":"2025-12-14T16:46:01.513052-08:00","closed_at":"2025-11-05T18:12:30.907835-08:00","dependencies":[{"issue_id":"bd-c3ei","depends_on_id":"bd-8rd","type":"parent-child","created_at":"2025-11-05T18:04:39.028291-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-c3u","title":"Review PR #512: clarify bd ready docs","description":"Review and merge PR #512 from aspiers. This PR clarifies what bd ready does after git pull in README.md. Simple 1-line change. URL: https://github.com/anthropics/beads/pull/512","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-13T08:15:13.405161+11:00","updated_at":"2025-12-13T07:07:29.641265-08:00","closed_at":"2025-12-13T07:07:29.641265-08:00"}
|
||
{"id":"bd-c49","title":"Audit all cmd/bd tests and group into suites","description":"Analyze all 279 tests in cmd/bd and identify:\n1. Which tests can share DB setup (most of them\\!)\n2. Which tests actually need isolation (export/import, git ops)\n3. Optimal grouping into test suites\n\nCreate a mapping document showing:\n- Current: 279 individual test functions\n- Proposed: ~10-15 test suites with subtests\n- Expected speedup per suite\n\nBlocks all refactoring work.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-21T11:49:19.438242-05:00","updated_at":"2025-11-21T16:07:50.846006-05:00","closed_at":"2025-11-21T15:15:29.50544-05:00"}
|
||
{"id":"bd-c4rq","title":"Refactor: Move staleness check inside daemon branch","description":"## Problem\n\nCurrently ensureDatabaseFresh() is called before the daemon mode check, but it checks daemonClient != nil internally and returns early. This is redundant.\n\n**Location:** All read commands (list.go:196, show.go:27, ready.go:102, status.go:80, etc.)\n\n## Current Pattern\n\nCall happens before daemon check, function checks daemonClient internally.\n\n## Better Pattern\n\nMove staleness check to direct mode branch only, after daemon check.\n\n## Impact\nLow - minor performance improvement (avoids one function call per command in daemon mode)\n\n## Effort\nMedium - requires refactoring 8 command files\n\n## Priority\nLow - can defer to future cleanup PR","status":"closed","priority":3,"issue_type":"chore","created_at":"2025-11-20T20:17:45.119583-05:00","updated_at":"2025-12-09T18:38:37.686612072-05:00","closed_at":"2025-11-28T23:37:52.276192-08:00"}
|
||
{"id":"bd-c5m","title":"Safety check tests use string(rune()) which only works for single digits","description":"","status":"closed","priority":4,"issue_type":"bug","created_at":"2025-12-02T21:55:41.688857-08:00","updated_at":"2025-12-02T22:10:15.616882-08:00","closed_at":"2025-12-02T22:10:15.616882-08:00"}
|
||
{"id":"bd-c6w","title":"bd info whats-new missing releases","description":"Current release is v0.25.1 but `bd info --whats-new` stops at v0.23.0, indicating something is missing in the create new release workflow.","notes":"github issue #386","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-26T05:50:37.252394374-07:00","updated_at":"2025-11-26T06:28:21.974264087-07:00","closed_at":"2025-11-26T06:28:21.974264087-07:00"}
|
||
{"id":"bd-c77d","title":"Test SQLite WASM compatibility","description":"Verify modernc.org/sqlite works in WASM target. Child of epic bd-44d0.\n\n## Tasks\n- [ ] Compile minimal SQLite test to WASM\n- [ ] Test database create/open operations\n- [ ] Test query execution\n- [ ] Test JSONL import/export\n- [ ] Benchmark performance vs native\n\n## Decision Point\nIf modernc.org/sqlite issues, evaluate ncruces/go-sqlite3 alternative.","status":"closed","priority":0,"issue_type":"task","created_at":"2025-11-02T18:33:31.247537-08:00","updated_at":"2025-12-14T16:45:46.106591-08:00","closed_at":"2025-11-05T00:55:48.75777-08:00","dependencies":[{"issue_id":"bd-c77d","depends_on_id":"bd-197b","type":"blocks","created_at":"2025-11-02T18:33:31.248112-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-c796","title":"Extract batch operations to batch_ops.go","description":"Move validateBatchIssues, generateBatchIDs, bulkInsertIssues, bulkRecordEvents, bulkMarkDirty, CreateIssues to batch_ops.go","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-01T19:28:54.887487-07:00","updated_at":"2025-12-14T16:44:41.893199-08:00","closed_at":"2025-11-02T08:09:51.579978-08:00"}
|
||
{"id":"bd-c7eb","title":"Research Go WASM compilation and modernc.org/sqlite WASM support","description":"Investigate technical requirements for compiling bd to WASM:\n- Verify modernc.org/sqlite has working js/wasm support\n- Identify Go stdlib limitations in WASM (syscalls, file I/O, etc.)\n- Research wasm_exec.js runtime and Node.js integration\n- Document any API differences between native and WASM builds","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-02T21:58:07.284264-08:00","updated_at":"2025-12-14T16:45:02.995009-08:00","closed_at":"2025-11-02T22:23:49.375941-08:00","dependencies":[{"issue_id":"bd-c7eb","depends_on_id":"bd-44d0","type":"parent-child","created_at":"2025-11-02T22:23:49.378673-08:00","created_by":"stevey"}]}
|
||
{"id":"bd-c825f867","title":"Add docs/architecture/event_driven.md","description":"Copy event_driven_daemon.md into docs/ folder. Add to documentation index.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-28T16:20:02.431399-07:00","updated_at":"2025-12-14T16:47:18.173543-08:00","closed_at":"2025-11-08T00:51:06.826771-08:00"}
|
||
{"id":"bd-c83r","title":"Prevent multiple daemons from running on the same repo","description":"Multiple bd daemons running on the same repo clone causes race conditions and data corruption risks.\n\n**Problem:**\n- Nothing prevents spawning multiple daemons for the same repository\n- Multiple daemons watching the same files can conflict during sync operations\n- Observed: 4 daemons running simultaneously caused sync race condition\n\n**Solution:**\nImplement daemon singleton enforcement per repo:\n1. Use a lock file (e.g., .beads/.daemon.lock) with PID\n2. On daemon start, check if lock exists and process is alive\n3. If stale lock (dead PID), clean up and acquire lock\n4. If active daemon exists, either:\n - Exit with message 'daemon already running (PID xxx)'\n - Or offer --replace flag to kill existing and take over\n5. Release lock on graceful shutdown\n\n**Edge cases to handle:**\n- Daemon crashes without releasing lock (stale PID detection)\n- Multiple repos in same directory tree (each repo gets own lock)\n- Race between two daemons starting simultaneously (atomic lock acquisition)","status":"open","priority":2,"issue_type":"bug","created_at":"2025-12-13T06:37:23.377131-08:00","updated_at":"2025-12-13T06:37:23.377131-08:00"}
|
||
{"id":"bd-c8x","title":"Don't search parent directories for .beads databases","description":"bd currently walks up the directory tree looking for .beads directories, which can find unrelated databases (e.g., ~/.beads). This causes confusing warnings and potential data pollution.\n\nShould either:\n1. Stop at git root (don't search above it)\n2. Only use explicit BEADS_DB env var or local .beads\n3. At minimum, don't search in home directory","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-27T22:10:41.992686-08:00","updated_at":"2025-12-02T17:11:19.737425041-05:00","closed_at":"2025-11-28T22:15:55.878353-08:00"}
|
||
{"id":"bd-c947dd1b","title":"Remove Daemon Storage Cache","description":"The daemon's multi-repo storage cache is the root cause of stale data bugs. Since global daemon is deprecated, we only ever serve one repository, making the cache unnecessary complexity. This epic removes the cache entirely for simpler, more reliable direct storage access.","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-10-28T10:50:15.126939-07:00","updated_at":"2025-12-14T16:43:48.668785-08:00","closed_at":"2025-10-28T10:49:53.612049-07:00"}
|
||
{"id":"bd-c9a482db","title":"Add internal/ai package for AI-assisted repairs","description":"Add AI integration package to support AI-powered repair commands.\n\nProviders:\n- Anthropic (Claude)\n- OpenAI\n- Ollama (local)\n\nFeatures:\n- Conflict resolution analysis\n- Duplicate detection via embeddings\n- Configuration via env vars (BEADS_AI_PROVIDER, BEADS_AI_API_KEY, etc.)\n\nSee repair_commands.md lines 357-425 for design.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-28T19:37:55.722841-07:00","updated_at":"2025-12-14T16:46:22.573734-08:00","closed_at":"2025-11-06T19:27:19.150657-08:00"}
|
||
{"id":"bd-caa9","title":"Migration tool for existing users","description":"Ensure smooth migration for existing users to separate branch workflow.\n\nTasks:\n- Add bd migrate --separate-branch command\n- Detect existing repos, migrate cleanly\n- Preserve git history\n- Add rollback mechanism\n- Test migration on beads' own repo (dogfooding)\n- Communication plan (GitHub discussion, docs)\n- Version compatibility checks\n\nEstimated effort: 2-3 days","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-02T15:22:35.627388-08:00","updated_at":"2025-12-14T16:45:23.745653-08:00","closed_at":"2025-11-04T12:36:53.789201-08:00","dependencies":[{"issue_id":"bd-caa9","depends_on_id":"bd-a101","type":"parent-child","created_at":"2025-11-02T15:22:48.382619-08:00","created_by":"stevey"}]}
|
||
{"id":"bd-cb2f","title":"Week 1 task","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-03T19:11:59.358093-08:00","updated_at":"2025-12-14T00:32:11.048433-08:00","closed_at":"2025-12-13T23:29:56.877967-08:00"}
|
||
{"id":"bd-cb64c226.1","title":"Performance Validation","description":"Confirm no performance regression from cache removal","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-28T10:50:15.126019-07:00","updated_at":"2025-12-14T16:43:48.555378-08:00","closed_at":"2025-10-28T10:49:45.021037-07:00"}
|
||
{"id":"bd-cb64c226.10","title":"Delete server_cache_storage.go","description":"Remove the entire cache implementation file (~286 lines)","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-27T22:55:38.729299-07:00","updated_at":"2025-12-14T16:43:52.460508-08:00","closed_at":"2025-10-28T14:08:38.064592-07:00"}
|
||
{"id":"bd-cb64c226.12","title":"Remove Storage Cache from Server Struct","description":"Eliminate cache fields and use s.storage directly","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-27T22:55:25.474412-07:00","updated_at":"2025-12-14T16:43:51.108603-08:00","closed_at":"2025-10-28T14:08:38.061444-07:00"}
|
||
{"id":"bd-cb64c226.13","title":"Audit Current Cache Usage","description":"**Summary:** Conducted a comprehensive audit of storage cache usage across server components, revealing minimal dependencies and potential for cache removal. Identified specific code locations, environment variables, and test files to be modified or deleted.\n\n**Key Decisions:**\n- Remove cache-related environment variables\n- Delete server_eviction_test.go file\n- Simplify storage retrieval to direct storage access\n- Validate local daemon single-repo routing model\n\n**Resolution:** Cache removal is safe and will streamline server architecture by eliminating unnecessary complexity in the local daemon's storage management.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-27T22:55:19.3723-07:00","updated_at":"2025-12-14T16:43:18.003253-08:00","closed_at":"2025-10-28T14:08:38.060291-07:00"}
|
||
{"id":"bd-cb64c226.6","title":"Verify MCP Server Compatibility","description":"Ensure MCP server works with cache-free daemon","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-27T22:56:03.241615-07:00","updated_at":"2025-12-14T16:43:51.013024-08:00","closed_at":"2025-10-28T14:08:38.059615-07:00"}
|
||
{"id":"bd-cb64c226.8","title":"Update Metrics and Health Endpoints","description":"Remove cache-related metrics from health/metrics endpoints","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-27T22:55:49.212047-07:00","updated_at":"2025-12-14T16:43:52.614825-08:00","closed_at":"2025-10-28T14:08:38.06569-07:00"}
|
||
{"id":"bd-cb64c226.9","title":"Remove Cache-Related Tests","description":"Delete or update tests that assume multi-repo caching","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-27T22:55:44.511897-07:00","updated_at":"2025-12-14T16:43:52.890451-08:00","closed_at":"2025-10-28T14:08:38.065118-07:00"}
|
||
{"id":"bd-cbed9619.1","title":"Fix multi-round convergence for N-way collisions","description":"**Summary:** Multi-round sync convergence problem identified where N-way clone collisions were not fully resolving across all instances. The core issue was that final pull mechanisms did not guarantee complete issue propagation between clones.\n\n**Key Decisions:**\n- Evaluate multi-round sync strategies\n- Consider iterative pull-import-push workflow\n- Prioritize idempotent import mechanism\n\n**Resolution:** Option 3 (making auto-import truly idempotent) was selected, ensuring complete issue synchronization across clones without data loss, thus unblocking the bd-cbed9619 epic.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-28T21:22:21.486109-07:00","updated_at":"2025-12-14T16:43:32.751485-08:00","closed_at":"2025-10-29T11:02:40.756891-07:00"}
|
||
{"id":"bd-cbed9619.2","title":"Implement content-first idempotent import","description":"**Summary:** Refactored import process to prioritize content-first matching and idempotency, replacing the previous ID-first approach. This change ensures consistent import behavior across multiple synchronization attempts and improves handling of renamed or conflicting issues.\n\n**Key Decisions:** \n- Use content hash as primary matching mechanism\n- Implement global collision resolution algorithm\n- Detect and handle renames automatically\n- Ensure multiple imports of same data result in no-op\n\n**Resolution:** The new import strategy successfully resolves complex synchronization scenarios, allowing multiple repositories to converge consistently and eliminating potential data inconsistencies during issue tracking.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-28T18:38:25.671302-07:00","updated_at":"2025-12-14T16:43:32.618453-08:00","closed_at":"2025-10-28T20:21:39.529971-07:00","dependencies":[{"issue_id":"bd-cbed9619.2","depends_on_id":"bd-325da116","type":"parent-child","created_at":"2025-10-28T18:39:20.616846-07:00","created_by":"daemon"},{"issue_id":"bd-cbed9619.2","depends_on_id":"bd-cbed9619.5","type":"blocks","created_at":"2025-10-28T18:39:28.360026-07:00","created_by":"daemon"},{"issue_id":"bd-cbed9619.2","depends_on_id":"bd-cbed9619.4","type":"blocks","created_at":"2025-10-28T18:39:28.383624-07:00","created_by":"daemon"},{"issue_id":"bd-cbed9619.2","depends_on_id":"bd-cbed9619.3","type":"blocks","created_at":"2025-10-28T18:39:28.407157-07:00","created_by":"daemon"}]}
|
||
{"id":"bd-cbed9619.3","title":"Implement global N-way collision resolution algorithm","description":"**Summary:** Replaced pairwise collision resolution with a global N-way algorithm that deterministically resolves issue ID conflicts across multiple clones by sorting content hashes and assigning sequential IDs. The new approach ensures consistent ID assignment regardless of synchronization order.\n\n**Key Decisions:**\n- Group collisions by base ID\n- Deduplicate versions by content hash\n- Sort versions deterministically using content hash\n- Assign sequential IDs based on sorted order\n\n**Resolution:** Implemented `ResolveNWayCollisions` function that provides a robust, order-independent mechanism for handling multiple simultaneous issue collisions, enabling reliable data synchronization across distributed systems.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-28T18:37:42.85616-07:00","updated_at":"2025-12-14T16:43:32.356216-08:00","closed_at":"2025-10-28T20:03:26.675257-07:00","dependencies":[{"issue_id":"bd-cbed9619.3","depends_on_id":"bd-325da116","type":"parent-child","created_at":"2025-10-28T18:39:20.593102-07:00","created_by":"daemon"},{"issue_id":"bd-cbed9619.3","depends_on_id":"bd-cbed9619.5","type":"blocks","created_at":"2025-10-28T18:39:28.30886-07:00","created_by":"daemon"},{"issue_id":"bd-cbed9619.3","depends_on_id":"bd-cbed9619.4","type":"blocks","created_at":"2025-10-28T18:39:28.336312-07:00","created_by":"daemon"}]}
|
||
{"id":"bd-cbed9619.4","title":"Make DetectCollisions read-only (separate detection from modification)","description":"**Summary:** Refactored collision detection in the database to separate read-only detection from state modification, eliminating race conditions and improving system reliability by introducing a two-phase collision resolution approach.\n\n**Key Decisions:**\n- Create read-only DetectCollisions method\n- Add RenameDetail struct to track potential issue renames\n- Implement separate ApplyCollisionResolution function for atomic modifications\n\n**Resolution:** The changes ensure safer, more composable collision handling by preventing direct database modifications during detection and introducing a controlled, multi-phase approach to resolving content conflicts.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-28T18:37:09.652326-07:00","updated_at":"2025-12-14T16:43:28.271277-08:00","closed_at":"2025-10-28T19:08:17.715416-07:00","dependencies":[{"issue_id":"bd-cbed9619.4","depends_on_id":"bd-325da116","type":"parent-child","created_at":"2025-10-28T18:39:20.570276-07:00","created_by":"daemon"},{"issue_id":"bd-cbed9619.4","depends_on_id":"bd-cbed9619.5","type":"blocks","created_at":"2025-10-28T18:39:28.285653-07:00","created_by":"daemon"}]}
|
||
{"id":"bd-cbed9619.5","title":"Add content-addressable identity to Issue type","description":"**Summary:** Added content-addressable identity to Issue type by implementing a ContentHash field that generates a unique fingerprint based on semantic issue content, solving the problem of identifying semantically distinct issues across system clones.\n\n**Key Decisions:** \n- Use SHA256 for content hashing\n- Hash only semantic content (exclude IDs, timestamps)\n- Compute hash automatically at creation and import time\n- Add database column to support content-based lookups\n\n**Resolution:** Successfully implemented a deterministic content hash mechanism that provides reliable issue identification across the system, improving data integrity and deduplication capabilities.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-28T18:36:44.914967-07:00","updated_at":"2025-12-14T16:43:26.671838-08:00","closed_at":"2025-10-28T18:57:10.985198-07:00","dependencies":[{"issue_id":"bd-cbed9619.5","depends_on_id":"bd-325da116","type":"parent-child","created_at":"2025-10-28T18:39:20.547325-07:00","created_by":"daemon"}]}
|
||
{"id":"bd-cc03","title":"Build Node.js CLI wrapper for WASM","description":"Create npm package that wraps bd.wasm. Child of epic bd-44d0.\n\n## Tasks\n- [ ] Set up npm package structure (package.json)\n- [ ] Implement CLI argument parsing\n- [ ] Load and execute WASM module\n- [ ] Handle stdout/stderr correctly\n- [ ] Support --json flag for all commands\n- [ ] Add bd-wasm bin script\n\n## Success Criteria\n- bd-wasm ready --json works identically to bd\n- All core commands supported","status":"closed","priority":0,"issue_type":"task","created_at":"2025-11-02T18:33:31.310268-08:00","updated_at":"2025-12-14T16:45:46.784742-08:00","closed_at":"2025-11-05T00:55:48.758198-08:00","dependencies":[{"issue_id":"bd-cc03","depends_on_id":"bd-197b","type":"blocks","created_at":"2025-11-02T18:33:31.311017-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-cc4f","title":"Implement TryResurrectParent function","description":"Create internal/storage/sqlite/resurrection.go with TryResurrectParent(ctx, parentID) function. Parse JSONL history to find deleted parent, create tombstone with status=deleted and is_tombstone=true flag. Handle recursive resurrection for multi-level missing parents (bd-abc.1.2 with missing bd-abc and bd-abc.1).","status":"closed","priority":0,"issue_type":"task","created_at":"2025-11-04T12:31:59.61107-08:00","updated_at":"2025-12-14T16:45:29.825617-08:00","closed_at":"2025-11-05T00:08:42.814-08:00"}
|
||
{"id":"bd-cddj","title":"GH#520: Daemon sync-branch commit fails with pre-commit hooks (needs --no-verify)","description":"gitCommitInWorktree in daemon_sync_branch.go missing --no-verify flag, causing commit failures when pre-commit hooks installed. Library function in worktree.go:684 has correct impl. See: https://github.com/steveyegge/beads/issues/520","status":"open","priority":1,"issue_type":"bug","created_at":"2025-12-14T16:31:33.151247-08:00","updated_at":"2025-12-14T16:31:33.151247-08:00"}
|
||
{"id":"bd-cdf7","title":"Add tests for DetectCycles to improve coverage from 29.6%","description":"DetectCycles currently has 29.6% coverage. Need comprehensive tests for:\n- Simple cycles (A-\u003eB-\u003eA)\n- Complex multi-node cycles\n- Acyclic graphs (should not detect cycles)\n- Self-loops\n- Multiple independent cycles\n- Edge cases (empty graph, single node)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-01T22:40:58.977156-07:00","updated_at":"2025-12-14T16:44:38.105535-08:00","closed_at":"2025-11-01T22:52:02.243223-07:00"}
|
||
{"id":"bd-ce37850f","title":"Add embedding generation for duplicate detection","description":"Use embeddings for scalable duplicate detection.\n\nModel: text-embedding-3-small (OpenAI) or all-MiniLM-L6-v2 (local)\nStorage: SQLite vector extension or in-memory\nCost: ~/bin/bash.0002 per 100 issues\n\nMuch cheaper than LLM comparisons for large databases.\n\nFiles: internal/embeddings/ (new package)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-28T14:48:29.072913-07:00","updated_at":"2025-12-14T16:46:23.329972-08:00","closed_at":"2025-11-06T19:27:25.234801-08:00"}
|
||
{"id":"bd-cf349eb3","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-27T23:20:10.39272-07:00","updated_at":"2025-12-14T16:43:46.182191-08:00","closed_at":"2025-10-27T23:05:31.945614-07:00"}
|
||
{"id":"bd-chsc","title":"Test lowercase p0","description":"","status":"closed","priority":0,"issue_type":"task","created_at":"2025-11-05T12:58:41.457875-08:00","updated_at":"2025-12-14T16:45:48.785021-08:00","closed_at":"2025-11-05T12:58:44.721486-08:00"}
|
||
{"id":"bd-ciu","title":"formatVanishedIssues output order is non-deterministic","description":"","status":"closed","priority":3,"issue_type":"bug","created_at":"2025-12-02T21:55:32.897206-08:00","updated_at":"2025-12-02T22:07:23.677332-08:00","closed_at":"2025-12-02T22:07:23.677332-08:00"}
|
||
{"id":"bd-cjxp","title":"Bug P0","description":"","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-07T19:00:22.536449-08:00","updated_at":"2025-12-14T16:46:56.213114-08:00","closed_at":"2025-11-07T21:55:09.429643-08:00"}
|
||
{"id":"bd-ckvw","title":"Add schema compatibility probe to prevent silent migration failures","description":"**Summary:** Critical database migration vulnerability discovered where schema changes could fail silently, causing potential data integrity issues during software upgrades. Implemented comprehensive schema verification mechanism to prevent unexpected migration failures and ensure database consistency.\n\n**Key Decisions:** \n- Add schema probe after migrations\n- Validate column existence before import operations\n- Block version updates unless migration fully successful\n- Generate clear error messages for migration failures\n\n**Resolution:** Enhanced database migration process now prevents silent failures and provides explicit guidance for resolving schema compatibility issues, improving overall system reliability.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-08T13:23:26.934246-08:00","updated_at":"2025-12-14T16:47:40.500188-08:00","closed_at":"2025-11-08T13:53:29.219542-08:00"}
|
||
{"id":"bd-clg","title":"bd jira sync command","description":"Add a built-in bd command for Jira synchronization.\n\n**Requires**: Both import and export scripts working\n\n**Features**:\n- `bd jira sync --pull` - Import from Jira to beads\n- `bd jira sync --push` - Export from beads to Jira\n- `bd jira sync` - Bidirectional (pull then push, with conflict resolution)\n- `bd jira status` - Show sync status and last sync time\n\n**Conflict resolution**:\n- Timestamp-based: newer update wins\n- Option for --prefer-local or --prefer-jira to override\n- Interactive mode for manual conflict resolution (optional)\n\n**Integration**:\n- Uses jira.* config settings from bd config\n- Stores last sync timestamp in config\n- Logs sync activity for audit\n\n**Stretch goals**:\n- Webhook integration for real-time sync\n- Selective sync by JQL filter","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-11-30T12:56:27.716537-08:00","updated_at":"2025-11-30T15:25:37.896045-08:00","closed_at":"2025-11-30T15:25:37.896045-08:00","dependencies":[{"issue_id":"bd-clg","depends_on_id":"bd-qvj","type":"parent-child","created_at":"2025-11-30T12:56:49.796568-08:00","created_by":"stevey"},{"issue_id":"bd-clg","depends_on_id":"bd-tjn","type":"blocks","created_at":"2025-11-30T12:57:00.075288-08:00","created_by":"stevey"},{"issue_id":"bd-clg","depends_on_id":"bd-93d","type":"blocks","created_at":"2025-11-30T12:57:05.206431-08:00","created_by":"stevey"}]}
|
||
{"id":"bd-co0","title":"Imperator does not know its own mail identity","description":"","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-30T22:53:49.963803-08:00","updated_at":"2025-12-02T23:28:48.752455-08:00","closed_at":"2025-12-01T22:01:26.953199-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-12-14T16:46:12.056866-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-d0t","title":"Priority 0 in merge may incorrectly win over set priorities","description":"In mergePriority(), priority 0 (which may mean 'unset' due to Go's zero value) beats any explicitly set priority like P1, P2, etc. Should probably treat 0 as 'no priority set' and not let it win conflicts.","status":"closed","priority":3,"issue_type":"bug","created_at":"2025-12-02T20:14:58.906543-08:00","updated_at":"2025-12-13T08:15:21.912485+11:00","closed_at":"2025-12-03T22:16:02.66552-08:00"}
|
||
{"id":"bd-d19a","title":"Fix import failure on missing parent issues","description":"Import process fails atomically when JSONL references deleted parent issues. Implement hybrid solution: topological sorting + parent resurrection to handle deleted parents gracefully while maintaining referential integrity. See docs/import-bug-analysis-bd-3xq.md for full analysis.","status":"closed","priority":0,"issue_type":"epic","created_at":"2025-11-04T12:31:30.994759-08:00","updated_at":"2025-12-14T16:45:30.39531-08:00","closed_at":"2025-11-05T00:08:42.814243-08:00"}
|
||
{"id":"bd-d33c","title":"Separate process/lock/PID concerns into process.go","description":"Create internal/daemonrunner/process.go with: acquireDaemonLock, PID file read/write, stopDaemon, isDaemonRunning, getPIDFilePath, socket path helpers, version check.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-01T11:41:14.871122-07:00","updated_at":"2025-12-14T16:44:41.822366-08:00","closed_at":"2025-11-01T23:43:55.66159-07:00"}
|
||
{"id":"bd-d355a07d","title":"Import validation falsely reports data loss on collision resolution","description":"**Summary:** Import validation falsely triggered data loss alerts when issue count naturally decreased due to collision resolution. The system misinterpreted legitimate remapping of duplicate issues as unintended data loss.\n\n**Key Decisions:**\n- Track remapped issue count separately\n- Adjust validation logic to recognize expected count reductions\n- Distinguish between actual data loss and intentional merges\n\n**Resolution:** Validation system updated to prevent false alarms, improving user confidence and reducing unnecessary investigation overhead.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-10-29T23:15:00.815227-07:00","updated_at":"2025-12-14T16:47:15.70724-08:00","closed_at":"2025-11-08T00:33:04.659308-08:00"}
|
||
{"id":"bd-d3e5","title":"Test issue 2","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-02T09:44:17.116768539Z","updated_at":"2025-12-14T00:32:13.890265-08:00","closed_at":"2025-12-14T00:32:13.890274-08:00"}
|
||
{"id":"bd-d3f0","title":"Add 'bd comment' as alias for 'bd comments add'","description":"**Summary:** Added 'bd comment' as a more intuitive alias for 'bd comments add' to streamline user command experience. The new alias provides a simpler syntax while maintaining full functionality.\n\n**Key Decisions:**\n- Preserve backwards compatibility\n- Maintain existing comment features\n\n**Resolution:** Implemented command alias with full feature parity, improving overall command usability.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-02T17:13:18.82563-08:00","updated_at":"2025-12-14T16:45:10.967126-08:00","closed_at":"2025-11-03T22:20:30.223939-08:00"}
|
||
{"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-14T16:46:23.138663-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-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-12-14T16:44:38.795851-08:00","closed_at":"2025-11-01T22:53:42.124391-07:00"}
|
||
{"id":"bd-d6aq","title":"Test reservation expiration and renewal","description":"**Summary:** Implemented comprehensive test suite for reservation TTL management, verifying expiration, blocking, auto-release, and renewal mechanisms in a distributed reservation system.\n\n**Key Decisions:** \n- 30s TTL for short-lived reservation tests\n- Mock server with auto-cleanup of expired reservations\n- Conflict handling (409) for cross-agent reservation attempts\n\n**Resolution:** All 4 TTL-related tests passed, confirming robust reservation lifecycle management with proper expiration and renewal logic.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-07T22:43:21.547821-08:00","updated_at":"2025-12-14T16:47:29.850799-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-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-12-14T16:45:31.093564-08:00","closed_at":"2025-11-05T00:08:42.814466-08:00"}
|
||
{"id":"bd-d7e88238","title":"Rapid 3","description":"","status":"closed","priority":3,"issue_type":"task","created_at":"2025-10-29T19:11:57.459655-07:00","updated_at":"2025-12-14T16:47:03.898665-08:00","closed_at":"2025-11-07T23:18:52.333825-08:00"}
|
||
{"id":"bd-d84j","title":"Fix PR #319: Performance Improvements - CI failures and lint errors","description":"PR #319 (Performance Improvements) has excellent performance optimizations but is blocked by CI failures.\n\n## The PR\n- URL: https://github.com/steveyegge/beads/pull/319\n- Author: @rsnodgrass (Ryan)\n- Claimed improvements: bd ready 20.5x faster (752ms → 36.6ms), startup 10.5x faster\n\n## CI Failures\n\n### Lint Errors (8 total)\n1. cmd/bd/deletion_tracking.go:57 - unchecked os.Remove\n2. cmd/bd/import.go:548 - unchecked os.RemoveAll\n3. cmd/bd/message.go:205 - unchecked resp.Body.Close\n4. cmd/bd/migrate_issues.go:633 - unchecked fmt.Scanln\n5. cmd/bd/migrate_issues.go:701 - unchecked MarkFlagRequired\n6. cmd/bd/migrate_issues.go:702 - unchecked MarkFlagRequired\n7. cmd/bd/show.go:610 - gosec G104 unhandled error\n8. cmd/bd/show.go:614 - gosec G104 unhandled error\n\n### Test Failures\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\nThis suggests the PR branch needs rebasing on current main.\n\n## Required Work\n\n### 1. Fix Lint Errors\nAdd proper error handling for all 8 flagged locations. Most can use _ = or log warnings.\n\n### 2. Rebase on Current Main\nThe migration test failures indicate the branch is out of sync. Need to:\n- git fetch upstream\n- git rebase upstream/main\n- Resolve any conflicts\n- Verify tests pass locally\n\n### 3. Verify CI Passes\n- All lint checks green\n- All tests pass (Linux, Windows, Nix)\n\n## Optional Improvements\n- Consider splitting into smaller PRs (core index, WASM cache, testing infra)\n- Add documentation for benchmark usage\n- Extract helper functions in doctor/perf.go for better testability\n\n## Value\nThis PR delivers real performance improvements. The index optimization alone is worth merging quickly once CI is fixed.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-15T12:24:34.50322-08:00","updated_at":"2025-11-15T12:43:11.49933-08:00","closed_at":"2025-11-15T12:43:11.49933-08:00"}
|
||
{"id":"bd-d9e0","title":"Extract validation functions to validators.go","description":"Move validatePriority, validateStatus, validateIssueType, validateTitle, validateEstimatedMinutes, validateFieldUpdate to validators.go","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-01T19:28:54.915909-07:00","updated_at":"2025-12-14T16:44:46.93217-08:00","closed_at":"2025-11-02T12:32:00.1593-08:00"}
|
||
{"id":"bd-da96-baseline-lint","title":"Baseline quality gate failure: lint","description":"The lint quality gate is failing on the baseline (main branch).\n\nThis blocks the executor from claiming work until fixed.\n\nError: golangci-lint failed: exit status 1\n\nOutput:\n```\ncmd/bd/search.go:39:12: Error return value of `cmd.Help` is not checked (errcheck)\n\t\t\tcmd.Help()\n\t\t\t ^\ncmd/bd/clean.go:118:15: G304: Potential file inclusion via variable (gosec)\n\tfile, err := os.Open(gitignorePath)\n\t ^\ncmd/bd/doctor/gitignore.go:98:12: G306: Expect WriteFile permissions to be 0600 or less (gosec)\n\tif err := os.WriteFile(gitignorePath, []byte(GitignoreTemplate), 0644); err != nil {\n\t ^\ncmd/bd/merge.go:121:16: G204: Subprocess launched with variable (gosec)\n\t\t\tgitRmCmd := exec.Command(\"git\", \"rm\", \"-f\", \"--quiet\", fullPath)\n\t\t\t ^\ncmd/bd/doctor.go:167:20: `cancelled` is a misspelling of `canceled` (misspell)\n\t\tfmt.Println(\"Fix cancelled.\")\n\t\t ^\ncmd/bd/flush_manager.go:139:42: `cancelling` is a misspelling of `canceling` (misspell)\n\t\t// Send shutdown request FIRST (before cancelling context)\n\t\t ^\ncmd/bd/flush_manager.go:261:15: `cancelled` is a misspelling of `canceled` (misspell)\n\t\t\t// Context cancelled (shouldn't normally happen)\n\t\t\t ^\ncmd/bd/flush_manager.go:269:55: (*FlushManager).performFlush - result 0 (error) is always nil (unparam)\nfunc (fm *FlushManager) performFlush(fullExport bool) error {\n ^\n8 issues:\n* errcheck: 1\n* gosec: 3\n* misspell: 3\n* unparam: 1\n\n```","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-21T10:17:25.963791-05:00","updated_at":"2025-11-21T10:25:33.537845-05:00","closed_at":"2025-11-21T10:25:33.53596-05:00"}
|
||
{"id":"bd-dcd6f14b","title":"Batch test 4","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-29T15:29:02.053523-07:00","updated_at":"2025-12-14T16:44:01.352999-08:00","closed_at":"2025-10-31T12:00:43.182861-07:00"}
|
||
{"id":"bd-dd6f6d26","title":"Fix autoimport tests for content-hash collision scoring","description":"**Summary:** Autoimport tests were failing due to a change from reference-counting to content-hash scoring for collision resolution. This required updating test cases to match the new deterministic collision handling methodology.\n\n**Key Decisions:** \n- Switch from reference count to content-hash for collision resolution\n- Ensure tests validate new deterministic scoring approach\n- Verify dependency preservation during issue remapping\n\n**Resolution:** Updated test suite in `autoimport_collision_test.go` now passes, confirming the new content-hash collision scoring works as expected across multiple scenarios.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-28T19:12:56.344193-07:00","updated_at":"2025-12-14T16:43:28.631025-08:00","closed_at":"2025-10-28T19:18:35.106895-07:00","dependencies":[{"issue_id":"bd-dd6f6d26","depends_on_id":"bd-cbed9619.4","type":"discovered-from","created_at":"2025-10-28T19:12:56.345276-07:00","created_by":"daemon"}]}
|
||
{"id":"bd-de0h","title":"bd message: Add HTTP client timeout to prevent hangs","description":"HTTP client in `sendAgentMailRequest` uses default http.Post with no timeout.\n\n**Location:** cmd/bd/message.go:181\n\n**Problem:**\n- Can hang indefinitely if server is unresponsive\n- No way to cancel stuck requests\n- Poor UX in flaky networks\n\n**Fix:**\n```go\nclient := \u0026http.Client{Timeout: 30 * time.Second}\nresp, err := client.Post(url, \"application/json\", bytes.NewReader(reqBody))\n```\n\n**Impact:** Production reliability and security issue","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-08T12:54:24.942645-08:00","updated_at":"2025-12-14T16:47:35.064816-08:00","closed_at":"2025-11-08T12:56:59.948929-08:00","dependencies":[{"issue_id":"bd-de0h","depends_on_id":"bd-6uix","type":"parent-child","created_at":"2025-11-08T12:55:54.860847-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-de6","title":"Fix FindBeadsDir to prioritize main repo .beads for worktrees","description":"The FindBeadsDir function should prioritize finding .beads in the main repository root when accessed from a worktree, rather than finding worktree-local .beads directories. This ensures proper sharing of the database across all worktrees.","status":"open","priority":2,"issue_type":"bug","created_at":"2025-12-07T16:48:36.883117467-07:00","updated_at":"2025-12-07T16:48:36.883117467-07:00"}
|
||
{"id":"bd-df11","title":"Add import metrics for external_ref matching statistics","description":"**Summary:** Added observability metrics for external reference matching during import operations to improve debugging and performance optimization. Tracked matching statistics and performance indicators to provide insights into import processes.\n\n**Key Decisions:** \n- Track matching metrics (external_ref, ID, content hash)\n- Modify ImportResult struct\n- Include metrics in import command output\n\n**Resolution:** Enhanced import visibility through structured metrics, enabling more effective troubleshooting and performance analysis of import operations.","status":"closed","priority":4,"issue_type":"chore","created_at":"2025-11-02T15:32:46.157899-08:00","updated_at":"2025-12-14T16:47:27.746454-08:00","closed_at":"2025-11-08T02:20:01.01371-08:00"}
|
||
{"id":"bd-df190564","title":"bd repair-deps - Orphaned dependency cleaner","description":"Find and fix orphaned dependency references.\n\nImplementation:\n- Scan all issues for dependencies pointing to non-existent issues\n- Report orphaned refs\n- Auto-fix with --fix flag\n- Interactive mode with --interactive\n\nFiles: cmd/bd/repair_deps.go (new)","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T19:42:29.852745-07:00","updated_at":"2025-12-14T16:44:16.681608-08:00","closed_at":"2025-10-31T18:24:19.418221-07:00"}
|
||
{"id":"bd-dh8a","title":"Optimize --sandbox mode: skip FlushManager","description":"When `--sandbox` mode is enabled, skip FlushManager creation entirely.\n\n## Current Behavior\n`main.go:561` always creates FlushManager:\n```go\nflushManager = NewFlushManager(autoFlushEnabled, getDebounceDuration())\n```\n\nEven with `--sandbox` (which sets `noAutoFlush=true`), the FlushManager goroutine is still running.\n\n## Proposed Change\n```go\n// Only create FlushManager if we might actually need it\nif !sandboxMode \u0026\u0026 autoFlushEnabled {\n flushManager = NewFlushManager(true, getDebounceDuration())\n}\n```\n\n## Handle nil FlushManager\nUpdate PersistentPostRun to handle nil:\n```go\nif flushManager != nil \u0026\u0026 !skipFinalFlush {\n if err := flushManager.Shutdown(); err != nil {\n // ...\n }\n}\n```\n\n## Synchronous Export Fallback\nWhen sandbox mode + write operation occurs, do synchronous export:\n```go\nif sandboxMode \u0026\u0026 isDirty {\n performSynchronousExport()\n}\n```\n\n## Also: Default lock-timeout to 100ms in sandbox mode\nIn PersistentPreRun, when sandboxMode is detected:\n```go\nif sandboxMode {\n noDaemon = true\n noAutoFlush = true\n noAutoImport = true\n if lockTimeout == 30*time.Second { // Not explicitly set\n lockTimeout = 100 * time.Millisecond\n }\n}\n```\n\nPart of bd-olc1","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-13T17:54:58.594335-08:00","updated_at":"2025-12-13T18:06:10.370218-08:00","closed_at":"2025-12-13T18:06:10.370218-08:00","dependencies":[{"issue_id":"bd-dh8a","depends_on_id":"bd-59er","type":"blocks","created_at":"2025-12-13T17:55:26.590151-08:00","created_by":"daemon"},{"issue_id":"bd-dh8a","depends_on_id":"bd-r4od","type":"blocks","created_at":"2025-12-13T17:55:26.626988-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-dli","title":"Design migration path from deletions.jsonl to tombstones","description":"Plan the migration from current deletions manifest to inline tombstones. Steps: 1) Read existing deletions.jsonl and convert to tombstones during import, 2) Continue reading deletions.jsonl for backward compat, 3) Stop writing to deletions.jsonl, 4) Eventually remove deletions.jsonl support. Consider version flags and deprecation warnings.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-05T13:43:26.856406-08:00","updated_at":"2025-12-05T15:02:58.521601-08:00","closed_at":"2025-12-05T15:02:58.521601-08:00"}
|
||
{"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-dmd","title":"Duplicate safety check message when confirmation required","description":"","status":"closed","priority":3,"issue_type":"bug","created_at":"2025-12-02T21:55:50.204007-08:00","updated_at":"2025-12-02T22:08:09.569984-08:00","closed_at":"2025-12-02T22:08:09.569984-08:00"}
|
||
{"id":"bd-dow9","title":"Improve CheckStaleness error handling","description":"## Problem\n\nCheckStaleness returns 'false' (not stale) for multiple error conditions instead of returning errors. This masks problems.\n\n**Location:** internal/autoimport/autoimport.go:253-285\n\n## Edge Cases That Return False\n\n1. **Invalid last_import_time format** (line 259-262)\n - Corrupted metadata returns 'not stale'\n - Could show stale data\n\n2. **No JSONL file found** (line 267-277)\n - If glob fails, falls back to 'issues.jsonl'\n - If that's empty, returns 'not stale'\n\n3. **JSONL stat fails** (line 279-282)\n - Permission denied, file missing\n - Returns 'not stale' even though can't verify\n\n## Current Code\n\n```go\nlastImportTime, err := time.Parse(time.RFC3339, lastImportStr)\nif err \\!= nil {\n return false, nil // ← Should return error\n}\n\n// ...\n\nif jsonlPath == \"\" {\n return false, nil // ← Should return error\n}\n\nstat, err := os.Stat(jsonlPath)\nif err \\!= nil {\n return false, nil // ← Should return error\n}\n```\n\n## Fix\n\n```go\nlastImportTime, err := time.Parse(time.RFC3339, lastImportStr)\nif err \\!= nil {\n return false, fmt.Errorf(\"corrupted last_import_time: %w\", err)\n}\n\n// ...\n\nif jsonlPath == \"\" {\n return false, fmt.Errorf(\"no JSONL file found\")\n}\n\nstat, err := os.Stat(jsonlPath)\nif err \\!= nil {\n return false, fmt.Errorf(\"cannot stat JSONL: %w\", err)\n}\n```\n\n## Impact\nMedium - edge cases are rare but should be handled\n\n## Effort \n30 minutes - requires updating callers in RPC server\n\n## Dependencies\nRequires: bd-n4td (warning on errors)","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-20T20:16:45.658965-05:00","updated_at":"2025-12-14T00:32:11.049429-08:00","closed_at":"2025-12-13T23:32:56.573608-08:00"}
|
||
{"id":"bd-dtm","title":"Inconsistent stderr printing: bd-feh warning still prints directly","description":"","status":"closed","priority":3,"issue_type":"bug","created_at":"2025-12-02T21:55:25.212867-08:00","updated_at":"2025-12-02T22:05:53.14012-08:00","closed_at":"2025-12-02T22:05:53.14012-08:00"}
|
||
{"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-dve","title":"Update import/export to handle tombstones","description":"Modify importer to read tombstones from issues.jsonl and legacy deletions.jsonl. Modify exporter to write tombstones. Filter tombstoned issues during import. Per design bd-dli.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-05T15:14:43.797468-08:00","updated_at":"2025-12-07T01:32:27.980549-08:00","closed_at":"2025-12-07T01:32:27.980549-08:00","dependencies":[{"issue_id":"bd-dve","depends_on_id":"bd-fbj","type":"blocks","created_at":"2025-12-05T15:14:58.895531-08:00","created_by":"daemon"},{"issue_id":"bd-dve","depends_on_id":"bd-0ih","type":"blocks","created_at":"2025-12-05T15:14:58.931808-08:00","created_by":"daemon"}]}
|
||
{"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":"open","priority":1,"issue_type":"bug","created_at":"2025-12-14T16:31:30.421555-08:00","updated_at":"2025-12-14T16:31:30.421555-08:00"}
|
||
{"id":"bd-dxdn","title":"bd ready taking 5 seconds with 132 issues (89 closed)","description":"**Summary:** Performance regression on M2 Mac caused slow 'bd ready' with 5s delays due to stale daemon locks. Systematic investigation identified timeout and lock management issues across multiple components.\n\n**Key Decisions:** \n- Implement 200ms socket timeout\n- Add lock probing before RPC attempts\n- Enable self-healing for stale artifacts\n- Add panic recovery mechanism\n\n**Resolution:** Five targeted sub-issues resolved performance bottleneck, preparing for v0.22.2 release with improved daemon stability.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-07T00:26:30.359512-08:00","updated_at":"2025-12-14T16:47:32.351075-08:00","closed_at":"2025-11-08T02:35:47.956638-08:00"}
|
||
{"id":"bd-dyy","title":"Review PR #513: fix hooks install docs","description":"Review and merge PR #513 from aspiers. This PR fixes incorrect docs for how to install git hooks - updates README to use bd hooks install instead of removed install.sh. Simple 1-line change. URL: https://github.com/anthropics/beads/pull/513","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-13T08:15:14.838772+11:00","updated_at":"2025-12-13T07:07:19.718544-08:00","closed_at":"2025-12-13T07:07:19.718544-08:00"}
|
||
{"id":"bd-e044","title":"Add mermaid output format for bd dep tree","description":"Add visual dependency graph output using Mermaid format for better visualization of issue relationships.\n\nExample usage:\n bd dep tree --format mermaid \u003cissue-id\u003e\n bd dep tree --format mermaid bd-42 \u003e graph.md\n\nThis would output Mermaid syntax that can be rendered in GitHub, documentation sites, or Mermaid live editor.\n\nImplementation notes:\n- Add --format flag to dep tree command\n- Support 'text' (default) and 'mermaid' formats\n- Mermaid graph should show issue IDs, titles, and dependency types\n- Consider using flowchart LR or graph TD syntax","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-11-03T18:10:18.978383-08:00","updated_at":"2025-12-14T16:45:10.263533-08:00","closed_at":"2025-11-03T20:55:06.69637-08:00"}
|
||
{"id":"bd-e05d","title":"Investigate and optimize test suite performance","description":"Test suite is taking very long to run (\u003e45s for cmd/bd tests, full suite timing unknown but was cancelled).\n\nThis impacts development velocity and CI/CD performance.\n\nInvestigation needed:\n- Profile which tests are slowest\n- Identify bottlenecks (disk I/O, network, excessive setup/teardown?)\n- Consider parallelization opportunities\n- Look for redundant test cases\n- Check if integration tests can be optimized","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-02T15:37:44.529955-08:00","updated_at":"2025-12-14T16:44:56.742041-08:00","closed_at":"2025-11-02T16:40:27.358945-08:00"}
|
||
{"id":"bd-e0o","title":"Phase 3: Enhance daemon robustness for GH #353","description":"Improve daemon health checks and metadata refresh to prevent staleness issues.\n\n**Tasks:**\n1. Enhance daemon health checks to detect unreachable daemons\n2. Add daemon metadata refresh (check disk every 5s)\n3. Comprehensive testing in sandbox environments\n\n**Implementation:**\n- cmd/bd/main.go: Better health check error handling (lines 300-367)\n- cmd/bd/daemon_event_loop.go: Periodic metadata refresh\n- cmd/bd/daemon_unix.go: Permission-aware process checks\n\n**References:**\n- docs/GH353_INVESTIGATION.md (Solutions 4 \u0026 5, lines 161-209)\n- Depends on: Phase 2 (bd-u3t)\n\n**Acceptance Criteria:**\n- Daemon detects when it's unreachable and auto-switches to direct mode\n- Daemon picks up external import operations without restart\n- All edge cases handled gracefully","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-21T18:52:13.376092-05:00","updated_at":"2025-11-22T14:57:44.536828616-05:00","closed_at":"2025-11-21T19:31:42.718395-05:00"}
|
||
{"id":"bd-e0o7","title":"Refactor: extract common helpers in sync-branch hook checks","description":"Code review of #532 fix identified duplication between checkSyncBranchHookCompatibility and checkSyncBranchHookQuick.\n\nSuggested refactoring:\n1. Extract getPrePushHookPath(path string) helper for git dir + hook path resolution\n2. Extract extractHookVersion(hookContent string) helper for version parsing\n3. Consider whether Warning for custom hooks is appropriate (vs OK with info message)\n4. Document the intentional behavior difference between full check (Warning for custom) and quick check (OK for custom)","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-13T18:04:04.220868-08:00","updated_at":"2025-12-13T18:04:04.220868-08:00"}
|
||
{"id":"bd-e1085716","title":"bd validate - Comprehensive health check","description":"Run all validation checks in one command.\n\nChecks:\n- Duplicates\n- Orphaned dependencies\n- Test pollution\n- Git conflicts\n\nSupports --fix-all for auto-repair.\n\nDepends on bd-cbed9619.1, bd-0dcea000, bd-31aab707, bd-9826b69a.\n\nFiles: cmd/bd/validate.go (new)","status":"open","priority":1,"issue_type":"task","created_at":"2025-10-29T23:05:13.980679-07:00","updated_at":"2025-10-30T17:12:58.19736-07:00"}
|
||
{"id":"bd-e166","title":"Improve timestamp comparison readability in import","description":"The timestamp comparison logic uses double-negative which can be confusing:\n\nCurrent code:\nif !incoming.UpdatedAt.After(existing.UpdatedAt) {\n // skip update\n}\n\nMore readable:\nif incoming.UpdatedAt.After(existing.UpdatedAt) {\n // perform update\n} else {\n // skip (local is newer)\n}\n\nThis is a minor refactor for code clarity.\n\nRelated: bd-1022\nFiles: internal/importer/importer.go:411, 488","status":"closed","priority":4,"issue_type":"chore","created_at":"2025-11-02T15:32:12.27108-08:00","updated_at":"2025-12-09T18:38:37.688877572-05:00","closed_at":"2025-11-26T22:25:27.124071-08:00"}
|
||
{"id":"bd-e16b","title":"Replace BEADS_DB with BEADS_DIR environment variable","description":"**Summary:** Replaced BEADS_DB with BEADS_DIR environment variable to provide more flexible .beads directory location configuration. The new approach supports both database and no-database modes with improved path resolution.\n\n**Key Decisions:**\n- Prioritize BEADS_DIR over BEADS_DB\n- Enable auto-discovery fallback\n- Preserve backward compatibility\n\n**Resolution:** Enhanced deployment flexibility by introducing a more intuitive directory configuration method for Beads system.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-02T18:19:26.131948-08:00","updated_at":"2025-12-14T16:44:59.907889-08:00","closed_at":"2025-11-02T18:27:14.545162-08:00"}
|
||
{"id":"bd-e1d645e8","title":"Rapid 4","description":"","status":"closed","priority":3,"issue_type":"task","created_at":"2025-10-29T19:11:57.484329-07:00","updated_at":"2025-12-14T16:47:02.531123-08:00","closed_at":"2025-11-07T23:18:52.316948-08:00"}
|
||
{"id":"bd-e2e6","title":"Implement postinstall script for binary download","description":"**Summary:** Developed a cross-platform npm postinstall script to automatically download platform-specific binaries from GitHub releases, enabling seamless package distribution across different system architectures.\n\n**Key Decisions:**\n- Dynamic platform/arch mapping\n- Support for multiple OS and CPU architectures\n- Implement robust error handling\n\n**Resolution:** Created a flexible binary download mechanism that simplifies package installation with minimal user configuration.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-02T23:39:56.652829-08:00","updated_at":"2025-12-14T16:45:05.285368-08:00","closed_at":"2025-11-03T10:31:45.382215-08:00","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-e3w","title":"bd sync: use worktree for sync.branch commits (non-daemon mode)","description":"## Summary\n\nWhen `sync.branch` is configured (e.g., `beads-sync`), `bd sync` should commit beads changes to that branch via git worktree, even when the user's working directory is on a different branch (e.g., `main`).\n\nCurrently:\n- `bd sync` always commits to the current branch\n- Daemon with `--auto-commit` uses worktrees to commit to sync branch\n- Gap: `bd sync` ignores sync.branch config\n\n## Goal\n\nWorkers stay on `main` (or feature branches) while beads metadata automatically flows to `beads-sync` branch. No daemon required.\n\n## Design Considerations\n\n1. **Worktree lifecycle**: Create on first use, reuse thereafter\n2. **Daemon interaction**: Ensure daemon and bd sync don't conflict\n3. **MCP server**: Uses daemon or direct mode - needs same behavior\n4. **Pull semantics**: Pull from sync branch, not current branch\n5. **Push semantics**: Push to sync branch remote\n6. **Error handling**: Worktree corruption, missing branch, etc.\n\n## Affected Components\n\n- `cmd/bd/sync.go` - Main changes\n- `cmd/bd/daemon_sync_branch.go` - Reuse existing functions\n- `internal/git/worktree.go` - Already implemented\n- MCP server (if it bypasses daemon)\n\n## Edge Cases\n\n- Fresh clone (no sync branch exists yet)\n- Worktree exists but is corrupted\n- Concurrent bd sync from multiple processes\n- sync.branch configured but remote doesn't have that branch\n- User switches sync.branch config mid-session","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-11-30T00:31:20.026356-08:00","updated_at":"2025-12-07T21:25:07.141293+11:00","closed_at":"2025-11-30T00:41:35.335791-08:00"}
|
||
{"id":"bd-e55c","title":"Import overwrites newer local issues with older remote versions","description":"**Summary:** A synchronization bug was found where local git issues could be incorrectly overwritten by older remote versions, compromising issue tracking data integrity. The problem stemmed from insufficient timestamp validation during issue import.\n\n**Key Decisions:** \n- Add timestamp comparison in collision detection\n- Prioritize local issue version if newer\n\n**Resolution:** Implemented a timestamp-aware import mechanism that preserves the most recent issue state across local and remote repositories.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-10-31T17:56:43.919306-07:00","updated_at":"2025-12-14T16:44:15.311025-08:00","closed_at":"2025-10-31T18:05:55.521427-07:00"}
|
||
{"id":"bd-e652","title":"bd doctor doesn't detect version mismatches or stale daemons","description":"","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-10-31T21:07:56.957214-07:00","updated_at":"2025-12-14T16:44:26.061869-08:00","closed_at":"2025-11-01T17:05:36.615761-07:00","dependencies":[{"issue_id":"bd-e652","depends_on_id":"bd-2752a7a2","type":"discovered-from","created_at":"2025-10-31T21:07:56.958708-07:00","created_by":"stevey"}]}
|
||
{"id":"bd-e6d71828","title":"Add transaction + retry logic for N-way collision resolution","description":"**Summary:** Enhanced SQLite transaction handling to mitigate N-way collision resolution issues by implementing atomic transactions and strategic retry mechanisms. Focused on improving database operation reliability under concurrent access scenarios.\n\n**Key Decisions:**\n- Wrap operations in atomic transactions\n- Implement 3-attempt retry strategy\n- Add defensive error handling\n\n**Resolution:** Established foundational improvements for collision management, but identified need for broader architectural refinement in multi-way synchronization.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T10:22:32.716678-07:00","updated_at":"2025-12-14T16:44:57.389723-08:00","closed_at":"2025-11-02T17:08:52.043477-08:00","dependencies":[{"issue_id":"bd-e6d71828","depends_on_id":"bd-cbed9619.1","type":"related","created_at":"2025-10-29T10:44:44.14653-07:00","created_by":"daemon"}]}
|
||
{"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-e8be4224","title":"Batch test 3","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-29T15:29:01.964091-07:00","updated_at":"2025-12-14T16:44:01.52066-08:00","closed_at":"2025-10-31T12:00:43.183212-07:00"}
|
||
{"id":"bd-e92","title":"Add test coverage for internal/autoimport package","description":"","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"}]}
|
||
{"id":"bd-e98221b3","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-12-14T16:46:32.839458-08:00","closed_at":"2025-11-06T19:51:57.75321-08:00"}
|
||
{"id":"bd-eb3c","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-12-14T16:44:31.263843-08:00","closed_at":"2025-11-01T20:27:42.79962-07:00"}
|
||
{"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-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-12-14T16:44:18.087606-08: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":"open","priority":2,"issue_type":"bug","created_at":"2025-12-14T16:32:21.544338-08:00","updated_at":"2025-12-14T16:32:21.544338-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-12-14T16:44:00.091206-08:00","closed_at":"2025-10-29T23:14:44.187562-07:00"}
|
||
{"id":"bd-ef85","title":"Add --json flags to all bd commands for agent-friendly output","description":"","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-10-31T22:39:45.312496-07:00","updated_at":"2025-12-14T16:44:24.00991-08:00","closed_at":"2025-10-31T22:39:50.157022-07:00"}
|
||
{"id":"bd-efm","title":"sync tries to create worktree in .git file","description":"example: bd sync --no-daemon\n→ Exporting pending changes to JSONL...\n→ Committing changes to sync branch 'worktree-db-fail'...\nError committing to 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","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-07T15:43:38.086614222-07:00","updated_at":"2025-12-14T16:28:23.401844-08:00","closed_at":"2025-12-13T23:32:36.995519-08:00"}
|
||
{"id":"bd-eimz","title":"Add Agent Mail to QUICKSTART.md","description":"Mention Agent Mail as optional advanced feature in quickstart guide.\n\nFile: docs/QUICKSTART.md","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-07T22:42:51.357009-08:00","updated_at":"2025-12-14T16:47:20.826408-08:00","closed_at":"2025-11-08T01:07:11.598558-08:00","dependencies":[{"issue_id":"bd-eimz","depends_on_id":"bd-xzrv","type":"blocks","created_at":"2025-11-07T23:04:09.841956-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-eiz9","title":"Help agents understand version changes with bd info --whats-new","description":"**Summary:** Agents struggle to efficiently understand version changes in software releases. A new command `bd info --whats-new` was proposed to provide targeted, actionable update information for workflow adaptation.\n\n**Key Decisions:** \n• Create CLI command showing agent-relevant changes\n• Highlight workflow impacts in short, clear format\n• Potentially add version-aware onboarding mechanism\n\n**Resolution:** Proposed solution aims to simplify version communication, reducing manual update explanation and helping agents quickly understand critical changes.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-06T21:03:30.057576-08:00","updated_at":"2025-12-14T16:47:30.458987-08:00","closed_at":"2025-11-08T02:25:55.509249-08:00"}
|
||
{"id":"bd-emg","title":"bd init should refuse when JSONL already has issues (safety guard)","description":"When running `bd init` in a directory with an existing JSONL containing issues, bd should refuse and suggest the correct action instead of proceeding.\n\n## The Problem\n\nCurrent behavior when database is missing but JSONL exists:\n```\n$ bd create \"test\"\nError: no beads database found\nHint: run 'bd init' to create a database...\n```\n\nThis leads users (and AI agents) to reflexively run `bd init`, which can cause:\n- Prefix mismatch if wrong prefix specified\n- Data corruption if JSONL is damaged\n- Confusion about what actually happened\n\n## Proposed Behavior\n\n```\n$ bd init --prefix bd\n\n⚠ Found existing .beads/issues.jsonl with 76 issues.\n\nThis appears to be a fresh clone, not a new project.\n\nTo hydrate the database from existing JSONL:\n bd doctor --fix\n\nTo force re-initialization (may cause data loss):\n bd init --prefix bd --force\n\nAborting.\n```\n\n## Trigger Conditions\n\n- `.beads/issues.jsonl` or `.beads/beads.jsonl` exists\n- File contains \u003e 0 valid issue lines\n- No `--force` flag provided\n\n## Edge Cases\n\n- Empty JSONL (0 issues) → allow init (new project)\n- Corrupted JSONL → warn but allow with confirmation\n- Existing `.db` file → definitely refuse (weird state)\n\n## Related\n\n- bd-dmb: Fresh clone should suggest hydration (better error messages)\n- bd-4ew: bd doctor should detect fresh clone\n\nThis issue is about the safety guard on `bd init` itself, not the error messages from other commands.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-28T18:21:41.149304-08:00","updated_at":"2025-12-02T17:11:19.739937029-05:00","closed_at":"2025-11-28T22:17:18.849507-08:00"}
|
||
{"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-12-14T16:47:40.801278-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-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-12-14T16:46:38.71931-08:00","closed_at":"2025-11-06T22:22:41.04958-08:00"}
|
||
{"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":"open","priority":2,"issue_type":"bug","created_at":"2025-12-14T16:32:00.082813-08:00","updated_at":"2025-12-14T16:32:00.082813-08:00"}
|
||
{"id":"bd-es19","title":"BG's issue to reopen","description":"","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-22T14:57:44.542501548-05:00","updated_at":"2025-12-14T16:46:57.96885-08:00","closed_at":"2025-11-07T21:57:59.90981-08:00"}
|
||
{"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-12-14T16:46:51.655993-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-eyto","title":"Time-dependent tests may be flaky near TTL boundary","description":"Several tombstone merge tests use time.Now() to create test data: time.Now().Add(-24 * time.Hour), time.Now().Add(-60 * 24 * time.Hour), etc. While these work reliably in practice (24h vs 30d TTL has large margin), they could theoretically be flaky if: 1) Tests run slowly, 2) System clock changes during test, 3) TTL constants change. Recommendation: Consider using a fixed reference time or time injection for deterministic tests. Lower priority since current margin is large. Files: internal/merge/merge_test.go:1337-1338, 1352-1353, 1548-1549, 1590-1591","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-05T16:37:02.348143-08:00","updated_at":"2025-12-05T16:37:02.348143-08:00"}
|
||
{"id":"bd-f0d9bcf2","title":"Batch test 1","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-29T15:29:01.795728-07:00","updated_at":"2025-12-14T16:44:03.021546-08:00","closed_at":"2025-10-31T12:00:43.184078-07:00"}
|
||
{"id":"bd-f0n","title":"Git history fallback missing timeout - could hang on large repos","description":"## Problem\n\nThe git commands in `checkGitHistoryForDeletions` have no timeout. On large repos with extensive history, `git log --all -S` or `git log --all -G` can take a very long time (minutes).\n\n## Location\n`internal/importer/importer.go:899` and `:930`\n\n## Impact\n- Import could hang indefinitely\n- User has no feedback that git search is running\n- No way to cancel except killing the process\n\n## Fix\nAdd context with timeout to git commands:\n\n```go\nctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)\ndefer cancel()\ncmd := exec.CommandContext(ctx, \"git\", ...)\n```\n\nAlso consider adding a `--since` flag to bound the git history search.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-25T12:48:24.388639-08:00","updated_at":"2025-11-25T15:04:53.669714-08:00","closed_at":"2025-11-25T15:04:53.669714-08:00"}
|
||
{"id":"bd-f282","title":"Test npm package installation locally","description":"**Summary:** Conducted comprehensive local testing of npm package installation across multiple operating systems to validate compatibility and functionality before potential publication.\n\n**Key Decisions:**\n- Test platforms: macOS, Linux, Windows\n- Verify global installation commands\n- Validate binary download process\n\n**Resolution:** Package successfully verified, demonstrating consistent performance and readiness for distribution.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-02T23:40:05.71835-08:00","updated_at":"2025-12-14T16:45:05.208216-08:00","closed_at":"2025-11-03T10:31:45.382577-08:00","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"}]}
|
||
{"id":"bd-f2f","title":"CRITICAL: bd sync exports before pull, allowing stale DB to corrupt JSONL statuses","description":"## Root Cause\n\nThe fix in bd-53c (reverse ZFC check) only checks COUNTS, not content. The real corruption happens when:\n\n1. Polecat A has stale DB with old status values (e.g., status=closed for issues that are now open on remote)\n2. Polecat A runs bd sync:\n - **Export FIRST**: DB (status=closed) → JSONL (overwrites correct status=open)\n - Commit: Stale JSONL committed\n - Pull: 3-way merge with remote\n - Merge uses 'closed wins' rule → status stays closed\n3. Polecat A pushes → Remote now corrupted with status=closed\n\n## Why bd-53c didn't fix it\n\nThe reverse ZFC check compares COUNTS:\n```go\nif jsonlCount \u003e dbCount // Only catches count mismatch\n```\n\nBut in the corruption scenario:\n- JSONL count = 5, DB count = 5 (same count!)\n- Only the STATUS field differs\n\n## The Real Fix\n\n**PULL BEFORE EXPORT**. The sync order must be:\n1. Pull from remote (get latest state)\n2. Import merged JSONL to DB\n3. THEN export DB changes (if any)\n\nCurrent order is: Export → Commit → Pull → Import → Push\n\nThis is a fundamental architecture change to the sync flow.\n\n## Workaround\n\nUse --no-auto-flush and manually control the sync order, or disable daemon auto-export.\n\n## Evidence\n\nFrom user investigation:\n- At 595b7943 (13:20:30): 5 open issues\n- At 10239812 (13:28:39): 0 open issues\n- All 5 issues had their status changed from open to closed\n- Count stayed at 5 (not a deletion issue)","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-29T17:33:26.744766-08:00","updated_at":"2025-11-29T19:24:31.010075-08:00","closed_at":"2025-11-29T19:24:31.010075-08:00"}
|
||
{"id":"bd-f8b764c9","title":"Hash-based IDs with aliasing system","description":"**Summary:** Replaced sequential IDs with content-hash identifiers to solve distributed collaboration collision issues. Introduced a hybrid ID system using hash prefixes and workspace aliases to support offline-first workflows.\n\n**Key Decisions:**\n- Use 8-char SHA256 prefix for IDs\n- Create auto-incrementing workspace aliases\n- Resolve conflicts via content-hash ordering\n\n**Resolution:** New ID system eliminated 2,100 LOC of collision handling code and enabled seamless distributed work.","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-10-29T21:23:49.592315-07:00","updated_at":"2025-12-14T16:44:07.551719-08:00","closed_at":"2025-10-31T12:32:32.6038-07:00"}
|
||
{"id":"bd-f8b764c9.1","title":"Dogfood: Migrate beads repo to hash IDs","description":"**Summary:** Migrated beads project repository to hash-based issue IDs to improve tracking and eliminate numbering constraints. Focused on maintaining data integrity during transition.\n\n**Key Decisions:**\n- Use 8-character hash IDs\n- Preserve legacy human-friendly aliases\n- Implement comprehensive validation checks\n\n**Resolution:** Successfully migrated 150 issues to hash-based system, reducing codebase complexity and enabling more flexible workflows.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T21:29:28.591526-07:00","updated_at":"2025-12-14T16:44:08.073522-08:00","closed_at":"2025-10-31T12:32:32.607092-07:00","dependencies":[{"issue_id":"bd-f8b764c9.1","depends_on_id":"bd-f8b764c9","type":"parent-child","created_at":"2025-10-29T21:29:28.59248-07:00","created_by":"stevey"},{"issue_id":"bd-f8b764c9.1","depends_on_id":"bd-f8b764c9.4","type":"blocks","created_at":"2025-10-29T21:29:28.593033-07:00","created_by":"stevey"},{"issue_id":"bd-f8b764c9.1","depends_on_id":"bd-f8b764c9.3","type":"blocks","created_at":"2025-10-29T21:29:28.593437-07:00","created_by":"stevey"},{"issue_id":"bd-f8b764c9.1","depends_on_id":"bd-f8b764c9.12","type":"blocks","created_at":"2025-10-29T21:29:28.593876-07:00","created_by":"stevey"},{"issue_id":"bd-f8b764c9.1","depends_on_id":"bd-f8b764c9.2","type":"blocks","created_at":"2025-10-29T21:29:28.594521-07:00","created_by":"stevey"}]}
|
||
{"id":"bd-f8b764c9.10","title":"Add alias field to database schema","description":"**Summary:** Extended database schema to support human-readable issue aliases, creating more intuitive identification alongside existing hash IDs. Implemented a flexible system for generating and tracking unique identifiers across workspaces.\n\n**Key Decisions:**\n- Add unique `alias` column to issues table\n- Create alias tracking and conflict resolution mechanisms\n- Design migration strategy for existing data\n\n**Resolution:** Successfully implemented a robust aliasing system that improves issue tracking usability while maintaining backend data integrity.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T21:24:13.968241-07:00","updated_at":"2025-12-14T16:44:12.526033-08:00","closed_at":"2025-10-31T12:32:32.610663-07:00","dependencies":[{"issue_id":"bd-f8b764c9.10","depends_on_id":"bd-f8b764c9","type":"parent-child","created_at":"2025-10-29T21:24:13.96959-07:00","created_by":"stevey"},{"issue_id":"bd-f8b764c9.10","depends_on_id":"bd-f8b764c9.11","type":"blocks","created_at":"2025-10-29T21:29:45.952824-07:00","created_by":"stevey"}]}
|
||
{"id":"bd-f8b764c9.11","title":"Design hash ID generation algorithm","description":"**Summary:** Created a deterministic hash-based ID generation algorithm for unique identifiers across distributed systems, prioritizing performance and collision resistance.\n\n**Key Decisions:**\n- SHA-256 hash of core metadata\n- 8-character hex prefix\n- \"bd-\" namespace prefix\n- Consistent ID generation\n\n**Resolution:** Implemented a lightweight, collision-resistant ID generation strategy providing reliable unique identifiers with minimal computational complexity.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T21:24:01.843634-07:00","updated_at":"2025-12-14T16:44:12.788323-08:00","closed_at":"2025-10-31T12:32:32.610902-07:00","dependencies":[{"issue_id":"bd-f8b764c9.11","depends_on_id":"bd-f8b764c9","type":"parent-child","created_at":"2025-10-29T21:24:01.844994-07:00","created_by":"stevey"}]}
|
||
{"id":"bd-f8b764c9.12","title":"Update documentation for hash IDs and aliases","description":"**Summary:** Updated documentation for a new hash-based ID system in issue tracking, introducing collision-free identifiers with local aliases. The changes address scalability and collaboration challenges in distributed project management.\n\n**Key Decisions:**\n- 8-char SHA256 hash prefixes\n- Workspace-local alias support\n- Deterministic conflict resolution\n\n**Resolution:** Beads v2.0 enables robust, zero-collision issue tracking across diverse workspaces.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-29T21:28:10.979971-07:00","updated_at":"2025-12-14T16:44:13.237705-08:00","closed_at":"2025-10-31T12:32:32.611114-07:00","dependencies":[{"issue_id":"bd-f8b764c9.12","depends_on_id":"bd-f8b764c9","type":"parent-child","created_at":"2025-10-29T21:28:10.981344-07:00","created_by":"stevey"},{"issue_id":"bd-f8b764c9.12","depends_on_id":"bd-f8b764c9.4","type":"blocks","created_at":"2025-10-29T21:28:10.981767-07:00","created_by":"stevey"},{"issue_id":"bd-f8b764c9.12","depends_on_id":"bd-f8b764c9.13","type":"blocks","created_at":"2025-10-29T21:28:10.982167-07:00","created_by":"stevey"}]}
|
||
{"id":"bd-f8b764c9.13","title":"Add bd alias command for manual alias control","description":"**Summary:** Developed a `bd alias` command suite to provide manual control over issue aliases, allowing users to manage numbering and tracking flexibility across different project contexts.\n\n**Key Decisions:**\n- Support manual alias assignment\n- Enable alias compaction\n- Provide reset options with sorting\n\n**Resolution:** Created a flexible alias management system that enhances issue tracking and organizational consistency with granular user control.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-29T21:26:53.751795-07:00","updated_at":"2025-12-14T16:44:13.962295-08:00","closed_at":"2025-10-31T12:32:32.611358-07:00","dependencies":[{"issue_id":"bd-f8b764c9.13","depends_on_id":"bd-f8b764c9","type":"parent-child","created_at":"2025-10-29T21:26:53.753259-07:00","created_by":"stevey"},{"issue_id":"bd-f8b764c9.13","depends_on_id":"bd-f8b764c9.7","type":"blocks","created_at":"2025-10-29T21:26:53.753733-07:00","created_by":"stevey"},{"issue_id":"bd-f8b764c9.13","depends_on_id":"bd-f8b764c9.6","type":"blocks","created_at":"2025-10-29T21:26:53.754112-07:00","created_by":"stevey"}]}
|
||
{"id":"bd-f8b764c9.2","title":"Update MCP server for hash IDs","description":"**Summary:** Enhanced MCP server ID handling to support both hash and numeric identifiers, enabling more flexible issue tracking while preserving existing system compatibility.\n\n**Key Decisions:**\n- Create universal ID resolution function\n- Support multiple ID format styles\n- Maintain backward compatibility\n\n**Resolution:** Deployed v2.0.0 with flexible ID management, improving system interoperability without disrupting existing workflows.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T21:28:45.256074-07:00","updated_at":"2025-12-14T16:44:08.350585-08:00","closed_at":"2025-10-31T12:32:32.60786-07:00","dependencies":[{"issue_id":"bd-f8b764c9.2","depends_on_id":"bd-f8b764c9","type":"parent-child","created_at":"2025-10-29T21:28:45.257315-07:00","created_by":"stevey"},{"issue_id":"bd-f8b764c9.2","depends_on_id":"bd-f8b764c9.7","type":"blocks","created_at":"2025-10-29T21:28:45.258057-07:00","created_by":"stevey"}]}
|
||
{"id":"bd-f8b764c9.3","title":"Test: N-clone scenario with hash IDs (no collisions)","description":"**Summary:** Tested a novel hash-based ID generation method for distributed issue tracking, focusing on collision prevention and offline synchronization capabilities. Comprehensive test suite evaluated system performance and edge case handling across multiple independent clones.\n\n**Key Decisions:**\n- Hash-based unique ID generation\n- Support for offline clone creation\n- Deterministic conflict resolution\n\n**Resolution:** Successfully validated a robust distributed ID generation approach that simplifies synchronization and eliminates collision risks in decentralized issue tracking systems.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T21:27:26.954107-07:00","updated_at":"2025-12-14T16:44:09.438013-08:00","closed_at":"2025-10-31T12:32:32.608225-07:00","dependencies":[{"issue_id":"bd-f8b764c9.3","depends_on_id":"bd-f8b764c9","type":"parent-child","created_at":"2025-10-29T21:27:26.955522-07:00","created_by":"stevey"},{"issue_id":"bd-f8b764c9.3","depends_on_id":"bd-f8b764c9.5","type":"blocks","created_at":"2025-10-29T21:27:26.956175-07:00","created_by":"stevey"}]}
|
||
{"id":"bd-f8b764c9.4","title":"Migration tool: sequential → hash IDs","description":"**Summary:** Developed a migration tool to convert sequential database IDs to hash-based IDs for improved issue identification across distributed systems. The approach ensures robust, unique identifiers while preserving existing data relationships.\n\n**Key Decisions:**\n- Use cryptographic hash generation with issue metadata\n- Maintain backwards compatibility\n- Support safe dry-run migration mode\n\n**Resolution:** Successfully implemented a migration mechanism that enables more resilient issue tracking with collision-resistant identifiers while maintaining data integrity.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T21:26:24.563993-07:00","updated_at":"2025-12-14T16:44:09.788358-08:00","closed_at":"2025-10-31T12:32:32.608574-07:00","dependencies":[{"issue_id":"bd-f8b764c9.4","depends_on_id":"bd-f8b764c9","type":"parent-child","created_at":"2025-10-29T21:26:24.565325-07:00","created_by":"stevey"},{"issue_id":"bd-f8b764c9.4","depends_on_id":"bd-f8b764c9.9","type":"blocks","created_at":"2025-10-29T21:26:24.565945-07:00","created_by":"stevey"}]}
|
||
{"id":"bd-f8b764c9.5","title":"Delete collision resolution code","description":"**Summary:** Removed 2,100 lines of complex ID collision detection code, replacing manual conflict resolution with hash-based ID generation. Simplified import and storage mechanisms by eliminating unnecessary detection logic.\n\n**Key Decisions:** \n- Delete collision.go and related files\n- Remove collision resolution functions\n- Drop --resolve-collisions flag\n\n**Resolution:** Reduced system complexity and potential import-related bugs by leveraging unique hash identifiers for more reliable ID management.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T21:25:50.976383-07:00","updated_at":"2025-12-14T16:44:09.975175-08:00","closed_at":"2025-10-31T12:32:32.608942-07:00","dependencies":[{"issue_id":"bd-f8b764c9.5","depends_on_id":"bd-f8b764c9","type":"parent-child","created_at":"2025-10-29T21:25:50.977857-07:00","created_by":"stevey"},{"issue_id":"bd-f8b764c9.5","depends_on_id":"bd-f8b764c9.9","type":"blocks","created_at":"2025-10-29T21:25:50.978395-07:00","created_by":"stevey"},{"issue_id":"bd-f8b764c9.5","depends_on_id":"bd-f8b764c9.8","type":"blocks","created_at":"2025-10-29T21:25:50.978842-07:00","created_by":"stevey"}]}
|
||
{"id":"bd-f8b764c9.6","title":"Implement alias conflict resolution","description":"**Summary:** Implemented a content-hash based strategy to resolve alias conflicts during issue synchronization across distributed systems. The solution ensures deterministic and consistent alias assignment when multiple issues claim the same identifier.\n\n**Key Decisions:**\n- Use lexicographic sorting of issue IDs\n- Automatically reassign conflicting aliases\n- Detect conflicts during import process\n\n**Resolution:** Created a robust, automated conflict resolution mechanism that prevents alias collisions while maintaining system-wide consistency.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T21:25:27.389191-07:00","updated_at":"2025-12-14T16:44:10.667414-08:00","closed_at":"2025-10-31T12:32:32.609245-07:00","dependencies":[{"issue_id":"bd-f8b764c9.6","depends_on_id":"bd-f8b764c9","type":"parent-child","created_at":"2025-10-29T21:25:27.390611-07:00","created_by":"stevey"},{"issue_id":"bd-f8b764c9.6","depends_on_id":"bd-f8b764c9.10","type":"blocks","created_at":"2025-10-29T21:25:27.391127-07:00","created_by":"stevey"},{"issue_id":"bd-f8b764c9.6","depends_on_id":"bd-f8b764c9.8","type":"blocks","created_at":"2025-10-29T21:25:27.39154-07:00","created_by":"stevey"}]}
|
||
{"id":"bd-f8b764c9.7","title":"CLI accepts both hash IDs and aliases","description":"**Summary:** Implemented a flexible ID parsing system for the CLI to support both hash and numeric issue identifiers, enhancing user interaction and command usability across different reference formats.\n\n**Key Decisions:**\n- Create centralized `ParseIssueID()` utility\n- Support multiple ID formats (`bd-*` and `#*`)\n- Add output formatting control\n\n**Resolution:** CLI now provides more intuitive and consistent issue referencing, improving overall user experience with intelligent ID parsing.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T21:25:06.256317-07:00","updated_at":"2025-12-14T16:44:10.888326-08:00","closed_at":"2025-10-31T12:32:32.609634-07:00","dependencies":[{"issue_id":"bd-f8b764c9.7","depends_on_id":"bd-f8b764c9","type":"parent-child","created_at":"2025-10-29T21:25:06.257796-07:00","created_by":"stevey"},{"issue_id":"bd-f8b764c9.7","depends_on_id":"bd-f8b764c9.10","type":"blocks","created_at":"2025-10-29T21:25:06.258307-07:00","created_by":"stevey"},{"issue_id":"bd-f8b764c9.7","depends_on_id":"bd-f8b764c9.8","type":"blocks","created_at":"2025-10-29T21:29:45.993274-07:00","created_by":"stevey"}]}
|
||
{"id":"bd-f8b764c9.8","title":"Update JSONL format to use hash IDs","description":"**Summary:** Refactored JSONL ID management to use hash-based unique identifiers, separating workspace-specific aliases into a separate configuration file. This approach improves data portability and reduces potential merge conflicts during collaboration.\n\n**Key Decisions:**\n- Use hash IDs as primary identifier\n- Store aliases in separate .beads/aliases.jsonl\n- Support dynamic alias assignment\n\n**Resolution:** Implemented a flexible ID management system that maintains global data uniqueness while enabling local, context-specific naming.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T21:24:47.408106-07:00","updated_at":"2025-12-14T16:44:11.915758-08:00","closed_at":"2025-10-31T12:32:32.609925-07:00","dependencies":[{"issue_id":"bd-f8b764c9.8","depends_on_id":"bd-f8b764c9","type":"parent-child","created_at":"2025-10-29T21:24:47.409489-07:00","created_by":"stevey"},{"issue_id":"bd-f8b764c9.8","depends_on_id":"bd-f8b764c9.9","type":"blocks","created_at":"2025-10-29T21:24:47.409977-07:00","created_by":"stevey"},{"issue_id":"bd-f8b764c9.8","depends_on_id":"bd-f8b764c9.10","type":"blocks","created_at":"2025-10-29T21:29:45.975499-07:00","created_by":"stevey"}]}
|
||
{"id":"bd-f8b764c9.9","title":"Implement hash ID generation in CreateIssue","description":"**Summary:** Replaced sequential issue ID generation with deterministic hash-based identifiers to prevent collisions across system clones. Implemented workspace-specific ID generation using git remote URL as a stable reference point.\n\n**Key Decisions:**\n- Use content + timestamp + workspace hash for ID generation\n- Generate unique workspace ID from git remote URL\n\n**Resolution:** Successfully created reproducible issue identifiers that ensure system consistency in distributed environments.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T21:24:29.412237-07:00","updated_at":"2025-12-14T16:44:11.789663-08:00","closed_at":"2025-10-31T12:32:32.610403-07:00","dependencies":[{"issue_id":"bd-f8b764c9.9","depends_on_id":"bd-f8b764c9","type":"parent-child","created_at":"2025-10-29T21:24:29.413417-07:00","created_by":"stevey"},{"issue_id":"bd-f8b764c9.9","depends_on_id":"bd-f8b764c9.11","type":"blocks","created_at":"2025-10-29T21:24:29.413823-07:00","created_by":"stevey"}]}
|
||
{"id":"bd-f9a1","title":"Add index usage verification test for external_ref lookups","description":"Currently we test that idx_issues_external_ref index exists, but we don't verify that it's actually being used by the query planner.\n\nProposed solution:\n- Add test using EXPLAIN QUERY PLAN\n- Verify that 'SEARCH TABLE issues USING INDEX idx_issues_external_ref' appears in plan\n- Ensures O(1) lookup performance is maintained\n\nRelated: bd-1022\nFiles: internal/storage/sqlite/external_ref_test.go:260","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-02T15:32:09.85419-08:00","updated_at":"2025-12-14T16:44:54.389325-08:00","closed_at":"2025-11-02T16:40:01.033779-08:00"}
|
||
{"id":"bd-fasa","title":"Prefix detection treats embedded hyphens as prefix delimiters","description":"**Summary:** Prefix detection logic in bd import incorrectly parsed multi-part hyphenated identifiers, causing false prefix mismatch errors. The core issue was overly complex prefix matching that did not respect a standard prefix pattern.\n\n**Key Decisions:** \n- Define prefix as everything up to and including the first hyphen\n- Allow suffixes to contain additional hyphens without breaking prefix rules\n- Simplify prefix matching algorithm\n\n**Resolution:** Modified prefix detection now correctly handles descriptive multi-part identifiers, restoring import functionality for complex naming conventions.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-09T14:27:19.046489-08:00","updated_at":"2025-12-14T16:47:48.564889-08:00","closed_at":"2025-11-09T14:53:53.22312-08:00"}
|
||
{"id":"bd-fb05","title":"Refactor sqlite.go into focused modules","description":"Split sqlite.go (2,298 lines) into focused modules: migrations.go, ids.go, issues.go, events.go, dirty.go, db.go. This will improve maintainability and reduce cognitive load.","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-01T11:41:14.805895-07:00","updated_at":"2025-12-14T16:44:41.34507-08:00","closed_at":"2025-11-01T22:56:21.90217-07:00"}
|
||
{"id":"bd-fb95094c","title":"Code Health \u0026 Technical Debt Cleanup","description":"**Summary:** Performed comprehensive code health cleanup targeting technical debt, focusing on removing dead code, refactoring large monolithic files, and improving overall system maintainability based on detailed code analysis.\n\n**Key Decisions:** \n- Split oversized files (server.go, sqlite.go) into modular components\n- Eliminate ~1,500 lines of unreachable code\n- Consolidate scattered utility functions\n- Optimize test coverage strategies\n\n**Resolution:** Reduced codebase by 6-8%, streamlined development workflow, and significantly improved long-term code quality and CI/CD performance.","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-10-27T20:39:22.22227-07:00","updated_at":"2025-12-14T16:47:44.654646-08:00","closed_at":"2025-11-08T18:15:59.971899-08:00"}
|
||
{"id":"bd-fb95094c.1","title":"Run final validation and cleanup checks","description":"**Summary:** Conducted comprehensive validation of codebase cleanup efforts, verifying code quality, test coverage, and build integrity across multiple dimensions of the project.\n\n**Key Decisions:**\n- Removed 4 unreachable functions in import_shared.go\n- Addressed dead code and potential linting warnings\n- Identified and tracked test timeout issues\n\n**Resolution:** Successfully completed cleanup validation, reducing total lines of code and improving overall project health with ~20-82% test coverage and build stability.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-27T20:32:00.14166-07:00","updated_at":"2025-12-14T16:43:22.53161-08:00","closed_at":"2025-10-28T14:11:25.218801-07:00","dependencies":[{"issue_id":"bd-fb95094c.1","depends_on_id":"bd-fb95094c","type":"parent-child","created_at":"2025-10-27T20:32:00.144113-07:00","created_by":"daemon"}]}
|
||
{"id":"bd-fb95094c.10","title":"Consider central serialization package for JSON handling","description":"**Summary:** Identified inconsistent JSON serialization across multiple codebase locations. Proposed creating a centralized serialization package to improve consistency and maintainability of JSON handling.\n\n**Key Decisions:** \n- Evaluate potential benefits vs. refactoring effort\n- Consider creating single source of truth for JSON format\n- Optional improvement due to minimal current issues\n\n**Resolution:** Issue remains open for future investigation, with no immediate action required due to low immediate impact.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-10-27T20:31:19.090608-07:00","updated_at":"2025-12-14T16:47:43.66709-08:00","closed_at":"2025-11-08T18:15:54.319047-08:00","dependencies":[{"issue_id":"bd-fb95094c.10","depends_on_id":"bd-fb95094c","type":"parent-child","created_at":"2025-10-27T20:31:19.092328-07:00","created_by":"daemon"}]}
|
||
{"id":"bd-fb95094c.2","title":"Delete skipped tests for \"old buggy behavior\"","description":"**Summary:** Deleted three permanently skipped test functions across different project files that were no longer relevant after a bug fix in GitHub issue #120. These tests were marked to be removed due to testing outdated, previously buggy behavior.\n\n**Key Decisions:**\n- Remove tests in `import_collision_test.go` and `collision_test.go`\n- Eliminate ~150 lines of redundant test code\n\n**Resolution:** Successfully cleaned up test suite by removing obsolete skipped tests, improving overall code maintainability.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-27T20:30:19.961185-07:00","updated_at":"2025-12-14T16:43:21.635492-08:00","closed_at":"2025-10-28T14:09:21.642632-07:00","dependencies":[{"issue_id":"bd-fb95094c.2","depends_on_id":"bd-fb95094c","type":"parent-child","created_at":"2025-10-27T20:30:19.962815-07:00","created_by":"daemon"}]}
|
||
{"id":"bd-fb95094c.3","title":"Update documentation after code health cleanup","description":"**Summary:** Documentation was comprehensively updated to reflect recent code structure cleanup, ensuring alignment between codebase and documentation across multiple files and internal packages.\n\n**Key Decisions:** \n- Update existing docs (AGENTS.md, CONTRIBUTING.md)\n- Create new README files for internal utility packages\n- Synchronize code comments and package documentation\n\n**Resolution:** Documentation now accurately represents current code organization, improving developer understanding and maintainability of the project.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-27T20:32:00.141028-07:00","updated_at":"2025-12-14T16:47:43.703402-08:00","closed_at":"2025-11-08T18:15:48.644285-08:00","dependencies":[{"issue_id":"bd-fb95094c.3","depends_on_id":"bd-fb95094c","type":"parent-child","created_at":"2025-10-27T20:32:00.1423-07:00","created_by":"daemon"}]}
|
||
{"id":"bd-fb95094c.4","title":"Audit and consolidate collision test coverage","description":"**Summary:** Comprehensive audit of collision detection test suite revealed significant redundancy across three test files, totaling 2,019 lines of code. Systematic coverage analysis was performed to identify and eliminate overlapping test scenarios.\n\n**Key Decisions:** \n- Retain regression tests for critical bugs\n- Merge redundant table-driven tests\n- Remove duplicate edge case tests\n\n**Resolution:** Successfully consolidated test suite from 2,019 to approximately 1,200 lines, improving test maintainability and execution speed without compromising test coverage.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-27T20:32:00.130855-07:00","updated_at":"2025-12-14T16:47:05.309489-08:00","closed_at":"2025-11-07T23:27:41.970013-08:00","dependencies":[{"issue_id":"bd-fb95094c.4","depends_on_id":"bd-fb95094c","type":"parent-child","created_at":"2025-10-27T20:32:00.132251-07:00","created_by":"daemon"}]}
|
||
{"id":"bd-fb95094c.5","title":"Centralize BD_DEBUG logging into debug package","description":"**Summary:** Consolidated 43 scattered `BD_DEBUG` environment variable checks across 6 different files into a centralized debug logging package. This refactoring aimed to improve code organization and create a more maintainable approach to debug logging.\n\n**Key Decisions:** \n- Create new `internal/debug/debug.go` package\n- Remove redundant inline debug checks\n- Enable future structured logging capabilities\n\n**Resolution:** 43 debug checks were eliminated, resulting in cleaner, more modular code with a single point of control for debug logging.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-27T20:31:19.089078-07:00","updated_at":"2025-12-14T16:46:36.946924-08:00","closed_at":"2025-11-06T20:13:09.412212-08:00","dependencies":[{"issue_id":"bd-fb95094c.5","depends_on_id":"bd-fb95094c","type":"parent-child","created_at":"2025-10-27T21:48:41.542395-07:00","created_by":"stevey"}]}
|
||
{"id":"bd-fb95094c.6","title":"Extract normalizeLabels to shared utility package","description":"**Summary:** Extracted the `normalizeLabels` function from multiple locations into a shared utility package to eliminate code duplication and improve maintainability. Centralized the label normalization logic in `internal/util/strings.go`.\n\n**Key Decisions:** \n- Create new utility function `NormalizeLabels()`\n- Preserve existing functionality: trim, remove empty, deduplicate\n- Ensure consistent usage across project\n\n**Resolution:** Implemented a single, reusable label normalization utility that follows DRY principles and provides a consistent approach to label processing.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-27T20:31:19.078622-07:00","updated_at":"2025-12-14T16:46:36.601674-08:00","closed_at":"2025-11-06T19:58:59.467567-08:00","dependencies":[{"issue_id":"bd-fb95094c.6","depends_on_id":"bd-fb95094c","type":"parent-child","created_at":"2025-10-27T20:31:19.08015-07:00","created_by":"daemon"}]}
|
||
{"id":"bd-fb95094c.7","title":"Extract SQLite migrations into separate files","description":"**Summary:** Refactored SQLite migrations in a large storage module by extracting 11 sequential migration functions from a monolithic file into a versioned, modular migration system with clear file structure and separation of concerns.\n\n**Key Decisions:** \n- Create separate migration files numbered sequentially\n- Split core storage logic from migration logic\n- Use dedicated migration orchestration file\n\n**Resolution:** Improved code maintainability, simplified migration tracking, and established a scalable pattern for future database schema evolution.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-27T20:30:47.870671-07:00","updated_at":"2025-12-14T16:46:37.028844-08:00","closed_at":"2025-11-06T20:05:05.01308-08:00","dependencies":[{"issue_id":"bd-fb95094c.7","depends_on_id":"bd-fb95094c","type":"parent-child","created_at":"2025-10-27T20:30:47.875564-07:00","created_by":"daemon"}]}
|
||
{"id":"bd-fb95094c.8","title":"Remove unreachable utility functions","description":"**Summary:** Identified and proposed removal of multiple unreachable utility functions across different project files, focusing on eliminating dead code and reducing unnecessary complexity.\n\n**Key Decisions:**\n- Delete `computeIssueContentHash` in `hash.go` if no other dependencies\n- Remove `FileUsed` config helper\n- Remove `verifyIssueOpen` test helper\n- Decide on implementing or deleting `HaikuClient.SummarizeTier2`\n\n**Resolution:** Cleaned 50-100 lines of unreachable code, improving project maintainability and reducing potential source of confusion.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-27T20:30:19.963392-07:00","updated_at":"2025-12-14T16:46:40.081886-08:00","closed_at":"2025-11-07T10:55:55.982696-08:00","dependencies":[{"issue_id":"bd-fb95094c.8","depends_on_id":"bd-fb95094c","type":"parent-child","created_at":"2025-10-27T20:30:19.968126-07:00","created_by":"daemon"}]}
|
||
{"id":"bd-fb95094c.9","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":"closed","priority":2,"issue_type":"task","created_at":"2025-10-27T20:30:19.962209-07:00","updated_at":"2025-12-14T16:46:40.60243-08:00","closed_at":"2025-11-07T10:55:55.984293-08:00","dependencies":[{"issue_id":"bd-fb95094c.9","depends_on_id":"bd-fb95094c","type":"parent-child","created_at":"2025-10-27T20:30:19.965239-07:00","created_by":"daemon"}]}
|
||
{"id":"bd-fbj","title":"Implement tombstone types and schema migration","description":"Add tombstone fields to Issue struct (deleted_at, deleted_by, delete_reason, original_type), add StatusTombstone constant, create SQLite migration for new columns. Per design bd-2m7.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-05T15:14:38.250106-08:00","updated_at":"2025-12-05T15:28:50.361654-08:00","closed_at":"2025-12-05T15:28:50.361654-08:00"}
|
||
{"id":"bd-fc2d","title":"Refactor sqlite.go (2298 lines)","description":"Break down internal/storage/sqlite/sqlite.go into smaller, more focused modules. The file is currently 2298 lines and should be split into logical components.","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-01T19:28:40.899111-07:00","updated_at":"2025-12-14T16:44:37.53663-08:00","closed_at":"2025-11-01T22:21:01.729379-07: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-12-14T16:44:47.763745-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-14T16:46:29.908824-08:00","closed_at":"2025-11-06T19:41:08.675575-08:00"}
|
||
{"id":"bd-febc","title":"npm package for bd with native binaries","description":"**Summary:** Created an npm package to distribute cross-platform native bd binaries, solving installation challenges in restricted web environments by enabling automated, platform-specific executable downloads.\n\n**Key Decisions:**\n- Publish platform-specific binaries via npm\n- Prioritize native performance\n- Support automatic binary retrieval\n\n**Resolution:** Developed a streamlined package that reduced bd implementation complexity from days to hours, enabling flexible binary deployment across environments.","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-02T23:39:37.684109-08:00","updated_at":"2025-12-14T16:45:07.333902-08:00","closed_at":"2025-11-03T10:39:44.932565-08:00"}
|
||
{"id":"bd-fi05","title":"bd sync fails with orphaned issues and duplicate ID conflict","description":"After fixing the deleted_at TEXT column scanning bug (commit 18b1eb2), bd sync still fails with two issues:\n\n1. Orphan Detection Warning: 12 orphaned child issues whose parents no longer exist (bd-cb64c226.* and bd-cbed9619.*)\n\n2. Import Failure: UNIQUE constraint failed for bd-360 - this tombstone exists in both DB and JSONL\n\nError: \"Import failed: error creating depth-0 issues: bulk insert issues: failed to insert issue bd-360: sqlite3: constraint failed: UNIQUE constraint failed: issues.id\"\n\nFix options:\n- Delete orphaned child issues with bd delete\n- Resolve bd-360 duplicate (in deletions.jsonl vs tombstone in DB)\n- Reset sync branch: git branch -f beads-sync main \u0026\u0026 git push --force-with-lease origin beads-sync","notes":"Fixed tombstone constraint violation bug. When deleting closed issues, the CHECK constraint (status = 'closed') = (closed_at IS NOT NULL) was violated because CreateTombstone didn't clear closed_at. Fix: set closed_at = NULL in tombstone creation SQL.\n\nThe sync data corruption (orphaned issues in beads-sync branch) requires manual cleanup: reset sync branch with 'git branch -f beads-sync main \u0026\u0026 git push --force-with-lease origin beads-sync'","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-13T07:14:33.831346-08:00","updated_at":"2025-12-13T10:50:48.545465-08:00","closed_at":"2025-12-13T07:30:33.843986-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-12-14T16:47:21.181975-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-fl4","title":"Test sync branch setup","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-30T00:26:47.520507-08:00","updated_at":"2025-11-30T00:33:23.105998-08:00","closed_at":"2025-11-30T00:33:23.105998-08:00"}
|
||
{"id":"bd-fmc","title":"string(rune()) pattern in other test files still only works for single digits","description":"The bd-c5m fix only addressed worktree_divergence_test.go, but several other test files have the same issue:\n\n- cmd/bd/stale_test.go:218, 234\n- cmd/bd/export_integrity_integration_test.go:45-47, 279-280\n- internal/storage/sqlite/comments_test.go:146, 165\n- internal/storage/sqlite/blocked_cache_test.go:292\n- internal/storage/sqlite/compact_bench_test.go:117\n- internal/storage/sqlite/cycle_detection_test.go:418\n\nThese use string(rune('0'+i)) which produces wrong characters when i \u003e= 10.\nShould use strconv.Itoa(i) instead.","status":"closed","priority":4,"issue_type":"bug","created_at":"2025-12-02T22:29:12.355705-08:00","updated_at":"2025-12-02T22:39:51.844638-08:00","closed_at":"2025-12-02T22:39:51.844638-08:00"}
|
||
{"id":"bd-fmo","title":"Missing test for IsExpiredTombstone edge cases","description":"## Problem\n\nThe `IsExpiredTombstone()` function has several edge cases that aren't directly tested:\n\n1. **Invalid DeletedAt timestamp** - Returns false (safety), but not tested\n2. **ttl=0 fallback to DefaultTombstoneTTL** - Not tested directly\n3. **Tombstone with empty DeletedAt** - Returns false, tested implicitly but not explicitly\n4. **Clock skew grace period effect** - Not tested (would need time mocking)\n\n## Current Test Coverage\n\nThe existing tests use `time.Now()` which makes them non-deterministic:\n```go\nDeletedAt: time.Now().Add(-24 * time.Hour).Format(time.RFC3339)\n```\n\nThis works but doesn't test the expiration boundary precisely.\n\n## Recommendation\n\nAdd explicit unit tests for `IsExpiredTombstone()`:\n\n```go\nfunc TestIsExpiredTombstone(t *testing.T) {\n tests := []struct {\n name string\n status string\n deletedAt string\n ttl time.Duration\n expected bool\n }{\n {\"non-tombstone returns false\", \"open\", \"2024-01-01T00:00:00Z\", 0, false},\n {\"empty deleted_at returns false\", \"tombstone\", \"\", 0, false},\n {\"invalid timestamp returns false\", \"tombstone\", \"not-a-date\", 0, false},\n {\"within TTL returns false\", \"tombstone\", time.Now().Add(-1*time.Hour).Format(time.RFC3339), 24*time.Hour, false},\n {\"beyond TTL returns true\", \"tombstone\", time.Now().Add(-48*time.Hour).Format(time.RFC3339), 24*time.Hour, true},\n }\n // ...\n}\n```\n\n## Files\n- internal/merge/merge.go:255-290\n- internal/merge/merge_test.go (add TestIsExpiredTombstone)","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-05T16:36:09.106135-08:00","updated_at":"2025-12-07T02:16:16.881654-08:00","closed_at":"2025-12-07T02:16:16.881654-08:00"}
|
||
{"id":"bd-fsb1","title":"Test issue","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-05T11:21:51.383077-08:00","updated_at":"2025-12-14T16:45:46.632561-08:00","closed_at":"2025-11-05T11:21:56.888913-08:00"}
|
||
{"id":"bd-fx7v","title":"Improve test coverage for cmd/bd/doctor/fix (23.9% → 50%)","description":"The doctor/fix package has only 23.9% test coverage. The doctor fix functionality is important for troubleshooting.\n\nCurrent coverage: 23.9%\nTarget coverage: 50%","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-13T20:43:05.67127-08:00","updated_at":"2025-12-13T21:01:20.839298-08:00"}
|
||
{"id":"bd-fzbg","title":"Update python-agent example with Agent Mail integration","description":"Modify examples/python-agent/agent.py to use Agent Mail adapter at 4 integration points.\n\nAcceptance Criteria:\n- Import and initialize adapter\n- Check inbox before find_ready_work()\n- Reserve issue before claim_task()\n- Notify on status changes\n- Release reservation on complete_task()\n- Works identically when Agent Mail disabled\n- No changes required to core Beads CLI\n\nFile: examples/python-agent/agent.py","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-11-07T22:42:28.661337-08:00","updated_at":"2025-12-14T16:47:15.134235-08:00","closed_at":"2025-11-08T00:20:35.213902-08:00","dependencies":[{"issue_id":"bd-fzbg","depends_on_id":"bd-m9th","type":"blocks","created_at":"2025-11-07T23:04:01.315332-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-g3ey","title":"bd sync --import-only doesn't update DB mtime causing bd doctor false warning","description":"","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-08T15:18:16.761052+01:00","updated_at":"2025-12-14T16:47:38.363829-08:00","closed_at":"2025-11-08T13:12:01.718252-08:00"}
|
||
{"id":"bd-g5p7","title":"Extract duplicated validation logic from CLI commands","description":"~150 lines of identical validation logic duplicated between cmd_create.go and cmd_update.go\n\nDuplication found:\n- validateBeadFields(): 2 identical copies (50+ lines each) \n- parseTimeWithDefault(): 2 identical copies (30 lines each)\n- Flag definitions: 15+ duplicate registrations\n\nSolution: Extract to shared packages:\n- internal/validation/bead.go - Centralized validation\n- internal/utils/time.go - Consolidate time parsing (already exists)\n- cmd/bd/flags.go - Shared flag registration\n\nImpact: Changes require touching 2+ files; high risk of inconsistency; steep learning curve\n\nEffort: 4-6 hours","status":"closed","priority":0,"issue_type":"task","created_at":"2025-11-16T14:51:10.159953-08:00","updated_at":"2025-11-21T10:01:44.281231-05:00","closed_at":"2025-11-20T20:39:34.426726-05:00"}
|
||
{"id":"bd-g9eu","title":"Investigate TestRoutingIntegration failure","description":"TestRoutingIntegration/maintainer_with_SSH_remote failed during pre-commit check with \"expected role maintainer, got contributor\".\nThis occurred while running `go test -short ./...` on darwin/arm64.\nThe failure appears unrelated to storage/sqlite changes.\nNeed to investigate if this is a flaky test or environmental issue.","status":"open","priority":2,"issue_type":"task","created_at":"2025-11-20T15:55:19.337094-08:00","updated_at":"2025-11-20T15:55:19.337094-08:00"}
|
||
{"id":"bd-gart","title":"Debug test 2","description":"","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-08T00:04:35.317835-08:00","updated_at":"2025-12-14T16:47:10.377994-08:00","closed_at":"2025-11-08T00:06:46.18875-08:00"}
|
||
{"id":"bd-gdn","title":"Add functional tests for FlushManager correctness verification","description":"","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":"**Summary:** The importer was modified to handle scenarios where same-content records have different IDs by treating them as updates rather than rename collisions. This resolves an edge case preventing import of certain test and legacy data with potential ID mismatches.\n\n**Key Decisions:**\n- Replace rename collision error with update logic\n- Prioritize record with most recent timestamp\n- Copy relevant fields from incoming record to existing record\n\n**Resolution:** Import process now gracefully handles content hash discrepancies, preventing sync failures and improving system resilience to data inconsistencies.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-05T00:27:51.150233-08:00","updated_at":"2025-12-14T16:45:46.292398-08:00","closed_at":"2025-11-05T01:02:54.469979-08:00"}
|
||
{"id":"bd-ge7","title":"Improve Beads test coverage from 46% to 80%","description":"","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-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-12-14T16:46:07.095676-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-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-gm7p","title":"Use in-memory filesystem for test git operations","description":"Use tmpfs/ramdisk for git operations in tests to reduce I/O overhead.\n\nOptions:\n1. Mount /tmp as tmpfs in CI (GitHub Actions supports this)\n2. Use Go's testing.TB.TempDir() which may already use tmpfs on some systems\n3. Explicitly create ramdisk for tests on macOS\n\nExpected savings: 20-30% reduction in git operation time","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-04T01:24:19.803224-08:00","updated_at":"2025-12-14T16:45:15.551336-08:00","closed_at":"2025-11-04T10:52:42.722474-08:00","dependencies":[{"issue_id":"bd-gm7p","depends_on_id":"bd-l5gq","type":"blocks","created_at":"2025-11-04T01:24:19.80414-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-gmf","title":"Update flake.nix vendorHash after dependency bumps","description":"The Nix flake CI is failing due to stale vendorHash.\n\nError from CI:\n```\nerror: hash mismatch in fixed-output derivation beads-0.24.4-go-modules.drv\n```\n\nRoot cause: go.mod/go.sum was updated by dependabot (wazero, anthropic-sdk-go, etc.) but flake.nix vendorHash wasn't updated.\n\n## Immediate Fix\nRun `nix build` locally, get the correct hash from the error message, update flake.nix.\n\n## Long-term Fix\nAdd a GitHub Action that auto-updates vendorHash when go.mod/go.sum changes:\n1. Trigger on push to main when go.mod/go.sum changes\n2. Run `nix build` to get the new hash from the error\n3. Update flake.nix with the correct hash\n4. Commit and push","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-02T23:16:06.851696-08:00","updated_at":"2025-12-02T23:21:39.917239-08:00","closed_at":"2025-12-02T23:21:39.917239-08:00"}
|
||
{"id":"bd-gpe7","title":"Tests take too long - unacceptable for project size","description":"**Summary:** Extensive test suite performance optimization was performed on the project, targeting slow test execution times through parallelization, sleep reduction, and strategic wait time minimization across multiple packages.\n\n**Key Decisions:** \n- Add t.Parallel() to CLI tests\n- Remove unnecessary sleep delays\n- Reduce filesystem and debouncer test wait times\n- Split unit and integration test execution\n\n**Resolution:** Test suite performance improved dramatically from 5+ minutes to approximately 20 seconds, significantly enhancing developer productivity and test iteration speed.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-05T00:54:47.784504-08:00","updated_at":"2025-12-14T16:45:46.427349-08:00","closed_at":"2025-11-05T01:41:57.544395-08:00"}
|
||
{"id":"bd-gqo","title":"Implement health checks in daemon event loop","description":"Add health checks to checkDaemonHealth() function in daemon_event_loop.go:170:\n- Database integrity check\n- Disk space check\n- Memory usage check\n\nCurrently it's just a no-op placeholder.","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-11-21T18:55:07.534304-05:00","updated_at":"2025-12-09T18:38:37.692820972-05:00","closed_at":"2025-11-28T23:10:19.946063-08:00"}
|
||
{"id":"bd-gra","title":"Add error handling test for cmd.Help() in search command","description":"Test coverage gap identified by automated analysis (vc-217).\n\n**Original Issue:** [deleted:bd-da96-baseline-lint]\n\nIn cmd/bd/search.go:39, the return value of cmd.Help() is not checked, flagged by errcheck linter.\n\nAdd test to verify:\n- Error handling when cmd.Help() fails (e.g., output redirection fails)\n- Proper error propagation to caller\n- Command still exits gracefully on help error\n\nThis ensures the search command handles help errors properly and doesn't silently ignore failures.\n\n_This issue was automatically created by AI test coverage analysis._","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-21T10:25:33.52308-05:00","updated_at":"2025-11-21T21:29:36.982333456-05:00","closed_at":"2025-11-21T19:31:21.889039-05:00","dependencies":[{"issue_id":"bd-gra","depends_on_id":"bd-da96-baseline-lint","type":"discovered-from","created_at":"2025-11-21T10:25:33.526016-05:00","created_by":"ai-supervisor"}]}
|
||
{"id":"bd-guc","title":"bd sync should not stage gitignored snapshot files","description":"## Problem\n\n`gitCommitBeadsDir` in `cmd/bd/sync.go` runs `git add .beads/` which stages all files in the directory, including snapshot files that are listed in `.beads/.gitignore`.\n\nIf a snapshot file (e.g., `beads.left.meta.json`) was ever committed before being added to `.gitignore`, git continues to track it. This causes merge conflicts when multiple polecats run `bd sync` concurrently, since each one modifies and commits these temporary files.\n\n## Root Cause\n\nLine ~568 in sync.go:\n```go\naddCmd := exec.CommandContext(ctx, \"git\", \"add\", beadsDir)\n```\n\nThis stages everything in `.beads/`, but `.gitignore` only prevents *untracked* files from being added - it doesn't affect already-tracked files.\n\n## Suggested Fix\n\nOption A: After `git add .beads/`, run `git reset` on snapshot files:\n```go\nexec.Command(\"git\", \"reset\", \"HEAD\", \".beads/beads.*.jsonl\", \".beads/*.meta.json\")\n```\n\nOption B: Stage only specific files instead of the whole directory:\n```go\nexec.Command(\"git\", \"add\", \".beads/issues.jsonl\", \".beads/deletions.jsonl\", \".beads/metadata.json\")\n```\n\nOption C: Detect and untrack snapshot files if they're tracked:\n```go\n// Check if file is tracked: git ls-files --error-unmatch \u003cfile\u003e\n// If tracked, run: git rm --cached \u003cfile\u003e\n```\n\nOption B is probably cleanest - explicitly add only the files that should be committed.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-27T20:47:14.603799-08:00","updated_at":"2025-11-28T17:28:55.54563-08:00","closed_at":"2025-11-27T22:34:23.336713-08:00"}
|
||
{"id":"bd-gz0x","title":"Fix daemon exiting after 5s on macOS due to PID 1 parent monitoring","description":"GitHub issue #278 reports that the daemon exits after \u003c=5 seconds on macOS because it incorrectly treats PID 1 (launchd) as a dead parent.\n\nWhen the daemon detaches on macOS, it gets reparented to PID 1 (launchd), which is the init process. The checkParentProcessAlive function was incorrectly treating PID 1 as a sign that the parent died.\n\nFixed by changing the logic to treat PID 1 as a valid parent for detached daemons.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-09T16:15:34.606508-08:00","updated_at":"2025-12-14T16:47:49.583574-08:00","closed_at":"2025-11-09T16:15:37.46914-08:00"}
|
||
{"id":"bd-h4hc","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-12-14T16:45:51.787291-08:00","closed_at":"2025-11-05T13:01:11.64526-08:00"}
|
||
{"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":"open","priority":1,"issue_type":"bug","created_at":"2025-12-13T23:49:35.963356-08:00","updated_at":"2025-12-14T00:26:19.763556-08:00"}
|
||
{"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-hlsw","title":"Add sync resilience guardrails for forced pushes and prefix mismatches","description":"Beads can get into unrecoverable sync states when remote forces pushes occur (e.g., rebases) combined with prefix mismatches from multi-worker scenarios. Add detection, prevention, and auto-recovery features to handle this gracefully.","status":"open","priority":2,"issue_type":"epic","created_at":"2025-12-14T10:40:14.872875259-07:00","updated_at":"2025-12-14T10:40:14.872875259-07:00"}
|
||
{"id":"bd-hlsw.1","title":"Pre-sync integrity check (bd sync --check)","description":"Add bd sync --check flag that detects problematic states before attempting sync: forced pushes on sync branch (via git reflog), prefix mismatches in JSONL, orphaned children with missing parents. Output combined diagnostic without modifying state.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-14T10:40:20.493608412-07:00","updated_at":"2025-12-14T10:40:20.493608412-07:00","dependencies":[{"issue_id":"bd-hlsw.1","depends_on_id":"bd-hlsw","type":"parent-child","created_at":"2025-12-14T10:40:20.494249154-07:00","created_by":"daemon"}]}
|
||
{"id":"bd-hlsw.2","title":"Improve sync error messages","description":"When bd sync fails, immediately surface the actual root cause (prefix mismatch, orphaned children, forced push detected, etc.) instead of requiring multiple retries to discover it. Make errors actionable with specific recovery steps.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-14T10:40:20.545731796-07:00","updated_at":"2025-12-14T10:40:20.545731796-07:00","dependencies":[{"issue_id":"bd-hlsw.2","depends_on_id":"bd-hlsw","type":"parent-child","created_at":"2025-12-14T10:40:20.546686125-07:00","created_by":"daemon"}]}
|
||
{"id":"bd-hlsw.3","title":"Auto-recovery mode (bd sync --auto-recover)","description":"Add bd sync --auto-recover flag that: detects problematic sync state, backs up .beads/issues.db with timestamp, rebuilds DB from JSONL atomically, verifies consistency, reports what was fixed. Provides safety valve when sync integrity fails.","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-14T10:40:20.599836875-07:00","updated_at":"2025-12-14T10:40:20.599836875-07:00","dependencies":[{"issue_id":"bd-hlsw.3","depends_on_id":"bd-hlsw","type":"parent-child","created_at":"2025-12-14T10:40:20.600435888-07:00","created_by":"daemon"}]}
|
||
{"id":"bd-hlsw.4","title":"Sync branch integrity guards","description":"Track sync branch parent commit. If sync branch was force-pushed, warn user and require confirmation before proceeding. Add option to reset to remote if user accepts rebase. Prevents silent corruption from forced pushes.","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-14T10:40:20.645402352-07:00","updated_at":"2025-12-14T10:40:20.645402352-07:00","dependencies":[{"issue_id":"bd-hlsw.4","depends_on_id":"bd-hlsw","type":"parent-child","created_at":"2025-12-14T10:40:20.646425761-07:00","created_by":"daemon"}]}
|
||
{"id":"bd-hm8","title":"Add uninstall documentation (GH #445)","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-01T21:04:30.313637-08:00","updated_at":"2025-12-01T21:04:57.943192-08:00","closed_at":"2025-12-01T21:04:57.943192-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-hp0m","title":"Add test for legacy deletions.jsonl to tombstone conversion","description":"The importer now converts legacy deletions.jsonl entries to tombstones (bd-dve), but there's no dedicated test that:\n1. Creates a deletions.jsonl with entries\n2. Imports issues (some in deletions, some not)\n3. Verifies the converted tombstones have correct fields from the deletion record\n\nThe existing TestImportIssues_TombstoneNotFilteredByDeletionsManifest tests that tombstones bypass the filter, but doesn't verify the conversion of legacy deletions to tombstones.\n\nAdd a test: TestImportIssues_LegacyDeletionsConvertedToTombstones","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-07T01:41:12.976726-08:00","updated_at":"2025-12-07T02:16:16.882286-08:00","closed_at":"2025-12-07T02:16:16.882286-08:00","dependencies":[{"issue_id":"bd-hp0m","depends_on_id":"bd-dve","type":"blocks","created_at":"2025-12-07T01:41:28.391366-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-hpt5","title":"show commit hash in 'bd version' when built from source'\n","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-13T13:26:14.662089379-07:00","updated_at":"2025-12-14T16:47:55.255862-08:00","closed_at":"2025-11-14T09:18:09.721428859-07:00"}
|
||
{"id":"bd-hsl3","title":"Updated title","description":"","status":"closed","priority":0,"issue_type":"feature","created_at":"2025-11-07T19:07:12.92354-08:00","updated_at":"2025-12-14T16:47:00.611548-08:00","closed_at":"2025-11-07T21:57:59.911411-08:00"}
|
||
{"id":"bd-htfk","title":"Measure notification latency vs git sync","description":"**Summary:** Conducted end-to-end latency benchmarking for notification propagation methods, comparing git sync and Agent Mail communication strategies to validate performance claims.\n\n**Key Decisions:**\n- Measure full cycle latency for both git sync and Agent Mail\n- Document performance distribution (p50, p95, p99)\n- Verify latency thresholds (\u003c100ms for Agent Mail)\n\n**Resolution:** Confirmed Agent Mail achieves ~100ms latency, 20-50x faster than git sync, validating proposed communication optimization approach.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-07T22:42:00.031959-08:00","updated_at":"2025-12-14T16:47:08.284819-08:00","closed_at":"2025-11-08T00:05:02.04159-08:00","dependencies":[{"issue_id":"bd-htfk","depends_on_id":"bd-muls","type":"blocks","created_at":"2025-11-07T23:03:52.969505-08:00","created_by":"daemon"},{"issue_id":"bd-htfk","depends_on_id":"bd-spmx","type":"parent-child","created_at":"2025-11-08T00:02:47.918425-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-hv01","title":"Deletions not propagated across multi-workspace sync","description":"**Summary:** Multi-workspace sync issue discovered where deleted issues were unintentionally resurrected due to lack of deletion tracking. The problem stemmed from the system's inability to distinguish between intentional deletions and stale data exports.\n\n**Key Decisions:** \n- Evaluated multiple tracking mechanisms for deleted items\n- Considered tombstone records, deletion logs, and merge strategies\n- Prioritized preventing unintended issue resurrection\n\n**Resolution:** Developed a mechanism to explicitly track and propagate deletions across workspaces, preventing accidental issue restoration during synchronization.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-05T18:34:24.094474-08:00","updated_at":"2025-12-14T16:46:12.688756-08:00","closed_at":"2025-11-06T17:52:24.860716-08:00","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","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-12-14T16:45:59.379016-08:00","closed_at":"2025-11-05T14:36:08.103964-08:00"}
|
||
{"id":"bd-hxou","title":"Daemon performAutoImport should update jsonl_content_hash after import","description":"The daemon's performAutoImport function was not updating jsonl_content_hash after successful import, unlike the CLI import path. This could cause repeated imports if the file hash and DB hash diverge.\n\nFix: Added hash update after validatePostImport succeeds, using repoKey for multi-repo support.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-13T06:44:04.442976-08:00","updated_at":"2025-12-13T06:44:09.546976-08:00","closed_at":"2025-12-13T06:44:09.546976-08:00"}
|
||
{"id":"bd-hy9p","title":"Add --body-file flag to bd create for reading descriptions from files","description":"## Problem\n\nCreating issues with long/complex descriptions via CLI requires shell escaping gymnastics:\n\n```bash\n# Current workaround - awkward heredoc quoting\nbd create --title=\"...\" --description=\"$(cat \u003c\u003c'EOF'\n...markdown...\nEOF\n)\"\n\n# Often fails with quote escaping errors in eval context\n# Agents resort to writing temp files then reading them\n```\n\n## Proposed Solution\n\nAdd `--body-file` and `--description-file` flags to read description from a file, matching `gh` CLI pattern.\n\n```bash\n# Natural pattern that aligns with training data\ncat \u003e /tmp/desc.md \u003c\u003c 'EOF'\n...markdown content...\nEOF\n\nbd create --title=\"...\" --body-file=/tmp/desc.md\n```\n\n## Implementation\n\n### 1. Add new flags to `bd create`\n\n```go\ncreateCmd.Flags().String(\"body-file\", \"\", \"Read description from file (use - for stdin)\")\ncreateCmd.Flags().String(\"description-file\", \"\", \"Alias for --body-file\")\n```\n\n### 2. Flag precedence\n\n- If `--body-file` or `--description-file` is provided, read from file\n- If value is `-`, read from stdin\n- Otherwise fall back to `--body` or `--description` flag\n- If neither provided, description is empty (current behavior)\n\n### 3. Error handling\n\n- File doesn't exist → clear error message\n- File not readable → clear error message\n- stdin specified but not available → clear error message\n\n## Benefits\n\n✅ **Matches training data**: `gh issue create --body-file file.txt` is a common pattern\n✅ **No shell escaping issues**: File content is read directly\n✅ **Works with any content**: Markdown, special characters, quotes, etc.\n✅ **Agent-friendly**: Agents already write complex content to temp files\n✅ **User-friendly**: Easier for humans too when pasting long descriptions\n\n## Related Commands\n\nConsider adding similar support to:\n- `bd update --body-file` (for updating descriptions)\n- `bd comment --body-file` (if/when we add comments)\n\n## Examples\n\n```bash\n# From file\nbd create --title=\"Add new feature\" --body-file=feature.md\n\n# From stdin\necho \"Quick description\" | bd create --title=\"Bug fix\" --body-file=-\n\n# With other flags\nbd create \\\n --title=\"Security issue\" \\\n --type=bug \\\n --priority=0 \\\n --body-file=security-report.md \\\n --label=security\n```\n\n## Testing\n\n- Test with normal files\n- Test with stdin (`-`)\n- Test with non-existent files (error handling)\n- Test with binary files (should handle gracefully)\n- Test with empty files (valid - empty description)\n- Test that `--description-file` and `--body-file` are equivalent aliases","status":"open","priority":1,"issue_type":"feature","created_at":"2025-11-22T00:02:08.762684-08:00","updated_at":"2025-11-22T00:02:08.762684-08:00"}
|
||
{"id":"bd-i00","title":"Convert magic numbers to named constants in FlushManager","description":"","status":"closed","priority":4,"issue_type":"task","created_at":"2025-11-20T21:22:17.845269-05:00","updated_at":"2025-11-20T21:35:53.11654-05:00","closed_at":"2025-11-20T21:35:53.11654-05:00"}
|
||
{"id":"bd-ic1m","title":"Benchmark git traffic reduction","description":"**Summary:** Developed an automated benchmark script to measure git traffic reduction using Agent Mail across 50 issues. The script compares git operations between standard and optimized workflows to validate performance improvements.\n\n**Key Decisions:** \n- Configurable benchmark with 50-issue default test set\n- Measure pull, commit, push operations\n- Pass/fail threshold of 70% traffic reduction\n\n**Resolution:** Benchmark exceeded expectations, achieving 98.5% git operation reduction, confirming significant performance optimization for Agent Mail.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-07T22:43:21.486095-08:00","updated_at":"2025-12-14T16:47:24.885976-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"}]}
|
||
{"id":"bd-ig5","title":"Duplicate tombstone constants in merge and types packages","description":"## Problem\n\nThe tombstone constants are duplicated between two packages:\n\n**internal/types/types.go:**\n```go\nconst DefaultTombstoneTTL = 30 * 24 * time.Hour\nconst ClockSkewGrace = 1 * time.Hour\nconst StatusTombstone Status = \"tombstone\"\n```\n\n**internal/merge/merge.go:**\n```go\nconst StatusTombstone = \"tombstone\"\nconst DefaultTombstoneTTL = 30 * 24 * time.Hour\nconst ClockSkewGrace = 1 * time.Hour\n```\n\nThis violates DRY and creates risk of divergence if one is updated but not the other.\n\n## Root Cause\n\nThe merge package has its own `Issue` struct (for JSONL parsing) and cannot import types.Issue directly due to the different struct design. However, the constants could be shared.\n\n## Recommendation\n\nExport the constants from types package and import them in merge:\n\n```go\n// merge/merge.go\nimport \"github.com/steveyegge/beads/internal/types\"\n\n// Use types.StatusTombstone, types.DefaultTombstoneTTL, types.ClockSkewGrace\n```\n\nOr create a shared constants package if import cycles are a concern.\n\n## Files\n- internal/merge/merge.go:241-248\n- internal/types/types.go:77-84, 170","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-05T16:36:06.159443-08:00","updated_at":"2025-12-05T17:15:57.624376-08:00","closed_at":"2025-12-05T17:15:57.624376-08:00"}
|
||
{"id":"bd-ihp9","title":"Fix FOREIGN KEY constraint failures in AddComment and ApplyCompaction","description":"The 'CloseIssue', 'UpdateIssueID', and 'RemoveLabel' methods were fixed in PR #348 to prevent foreign key constraint failures when operating on non-existent issues.\n\nHowever, the Oracle identified two other methods that follow the same problematic pattern:\n1. `AddComment` (in `internal/storage/sqlite/events.go`)\n2. `ApplyCompaction` (in `internal/storage/sqlite/compact.go`)\n\nThese methods attempt to insert an event record after updating the issue, without verifying that the issue update actually affected any rows. This leads to a foreign key constraint failure if the issue does not exist.\n\nWe need to:\n1. Create reproduction tests for these failure cases\n2. Apply the same fix pattern: check `RowsAffected()` after the update, and return a proper \"issue not found\" error if it is 0, before attempting to insert the event.\n3. Standardize the error message format to \"issue %s not found\" or \"issue not found: %s\" for consistency.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-20T09:49:55.090644-08:00","updated_at":"2025-11-20T09:53:54.466769-08:00","closed_at":"2025-11-20T09:53:54.466769-08:00"}
|
||
{"id":"bd-iip5","title":"TestImportIssues_LegacyDeletionsConvertedToTombstones is failing","description":"The test TestImportIssues_LegacyDeletionsConvertedToTombstones in internal/importer/importer_test.go is failing:\n\nExpected 3 created (1 regular + 2 tombstones from deletions.jsonl), got 2\nExpected tombstone for test-deleted2 not found\n\nThe test expects legacy deletions.jsonl entries to be converted to tombstones during import, but test-deleted2 is not being converted.\n\nLocation: internal/importer/importer_test.go:1344","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-07T02:09:19.17774-08:00","updated_at":"2025-12-07T02:16:55.422522-08:00","closed_at":"2025-12-07T02:16:55.422522-08:00"}
|
||
{"id":"bd-imj","title":"Deletion propagation via deletions manifest","description":"## Problem\n\nWhen `bd cleanup -f` or `bd delete` removes issues in one clone, those deletions don't propagate to other clones. The import logic only creates/updates, never deletes. This causes \"resurrection\" where deleted issues reappear.\n\n## Root Cause\n\nImport sees DB issues not in JSONL and assumes they're \"local unpushed work\" rather than \"intentionally deleted upstream.\"\n\n## Solution: Deletions Manifest\n\nAdd `.beads/deletions.jsonl` - an append-only log of deleted issue IDs with metadata.\n\n### Format\n```jsonl\n{\"id\":\"bd-xxx\",\"ts\":\"2025-11-25T10:00:00Z\",\"by\":\"stevey\"}\n{\"id\":\"bd-yyy\",\"ts\":\"2025-11-25T10:05:00Z\",\"by\":\"claude\",\"reason\":\"duplicate of bd-zzz\"}\n```\n\n### Fields\n- `id`: Issue ID (required)\n- `ts`: ISO 8601 UTC timestamp (required)\n- `by`: Actor who deleted (required)\n- `reason`: Optional context (\"cleanup\", \"duplicate of X\", etc.)\n\n### Import Logic\n```\nFor each DB issue not in JSONL:\n 1. Check deletions manifest → if found, delete from DB\n 2. Fallback: check git history → if found, delete + backfill manifest\n 3. Neither → keep (local unpushed work)\n```\n\n### Conflict Resolution\nSimultaneous deletions from multiple clones are handled naturally:\n- Append-only design means both clones append their deletion records\n- On merge, file contains duplicate entries (same ID, different timestamps)\n- `LoadDeletions` deduplicates by ID (keeps any/first entry)\n- Result: deletion propagates correctly, duplicates are harmless\n\n### Pruning Policy\n- Default retention: 7 days (configurable via `deletions.retention_days`)\n- Auto-compact during `bd sync` is **opt-in** (disabled by default)\n- Hard cap: `deletions.max_entries` (default 50000)\n- Git fallback handles pruned entries (self-healing)\n\n### Self-Healing\nWhen git fallback catches a resurrection (pruned entry), it backfills the manifest. One-time git scan cost, then fast again.\n\n### Size Estimates\n- ~80 bytes/entry\n- 7-day retention with 100 deletions/day = ~56KB\n- Git compressed: ~10KB\n\n## Benefits\n- ✅ Deletions propagate across clones\n- ✅ O(1) lookup (no git scan in normal case)\n- ✅ Works in shallow clones\n- ✅ Survives history rewrite\n- ✅ Audit trail (who deleted what when)\n- ✅ Self-healing via git fallback\n- ✅ Bounded size via time-based pruning\n\n## References\n- Investigation session: 2025-11-25\n- Related: bd-2q6d (stale database warnings)","status":"closed","priority":0,"issue_type":"epic","created_at":"2025-11-25T09:56:01.98027-08:00","updated_at":"2025-11-25T16:36:27.965168-08:00","closed_at":"2025-11-25T16:36:27.965168-08:00","dependencies":[{"issue_id":"bd-imj","depends_on_id":"bd-qsm","type":"blocks","created_at":"2025-11-25T09:57:42.821911-08:00","created_by":"daemon"},{"issue_id":"bd-imj","depends_on_id":"bd-x2i","type":"blocks","created_at":"2025-11-25T09:57:42.851712-08:00","created_by":"daemon"},{"issue_id":"bd-imj","depends_on_id":"bd-44e","type":"blocks","created_at":"2025-11-25T09:57:42.88154-08:00","created_by":"daemon"},{"issue_id":"bd-imj","depends_on_id":"bd-bhd","type":"blocks","created_at":"2025-11-25T14:56:23.675787-08:00","created_by":"daemon"},{"issue_id":"bd-imj","depends_on_id":"bd-bgs","type":"blocks","created_at":"2025-11-25T14:56:23.744648-08:00","created_by":"daemon"},{"issue_id":"bd-imj","depends_on_id":"bd-f0n","type":"blocks","created_at":"2025-11-25T14:56:23.80649-08:00","created_by":"daemon"},{"issue_id":"bd-imj","depends_on_id":"bd-v29","type":"blocks","created_at":"2025-11-25T14:56:23.864569-08:00","created_by":"daemon"},{"issue_id":"bd-imj","depends_on_id":"bd-mdw","type":"blocks","created_at":"2025-11-25T14:56:48.592492-08:00","created_by":"daemon"},{"issue_id":"bd-imj","depends_on_id":"bd-03r","type":"blocks","created_at":"2025-11-25T14:56:54.295851-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-in6","title":"CONFIG.md docs for sync.require_confirmation_on_mass_delete missing threshold detail","description":"The docs say 'if \u003e50% of issues vanish' but the actual code (worktree.go:380) also requires '\u003e5 issues existed before'. The docs should mention both conditions for completeness.","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-02T22:29:56.753032-08:00","updated_at":"2025-12-02T22:40:37.385126-08:00","closed_at":"2025-12-02T22:40:37.385126-08:00"}
|
||
{"id":"bd-in7q","title":"Fix: bd migrate-tombstones corrupts deletions manifest","description":"When running 'bd migrate-tombstones' followed by 'bd sync', the operation adds thousands of issues to deletions.jsonl with author 'bd-doctor-hydrate' that should never have been deleted. This causes:\n1. Issues are marked as deleted that were never intended for deletion\n2. Subsequent 'bd sync' fails with 3-way merge errors\n3. The migration operation corrupts database state\n\n## Root Cause\nThe tombstone migration logic incorrectly identifies issues that should be migrated as 'deleted issues' and adds them to the deletions manifest instead of converting them to inline tombstones.\n\n## Reproduction\n1. bd sync --import-only\n2. bd migrate-tombstones\n3. bd sync\nResult: See thousands of 'Skipping bd-xxxx (in deletions manifest: deleted 2025-12-14 by bd-doctor-hydrate)' lines and 3-way merge failures\n\n## Impact\n- Database becomes inconsistent\n- Issues permanently lost from local database\n- Requires full reset to recover\n\n## Files to Investigate\n- cmd/bd/migrate_tombstones.go - migration logic\n- deletions manifest handling during migration","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-12-14T11:22:23.464098142-07:00","updated_at":"2025-12-14T11:35:25.916924256-07:00","closed_at":"2025-12-14T11:35:25.916924256-07:00"}
|
||
{"id":"bd-io0","title":"sync.branch config lost on clone - should be in config.yaml","description":"## Problem\n\nThe sync.branch configuration is stored in the SQLite database, which is gitignored. When contributors clone a repo that uses beads:\n\n1. They get .beads/issues.jsonl (tracked)\n2. They don't get .beads/beads.db (gitignored)\n3. They lose the sync.branch config\n\nWhen they run 'bd init' or 'bd doctor --fix', sync.branch gets auto-set to the current branch (usually 'main'), but if the project uses a dedicated sync branch like 'beads-sync', they'll be committing to the wrong branch.\n\n## Root Cause\n\nsyncbranch.Get() only checks:\n1. BEADS_SYNC_BRANCH env var\n2. Database config (store.GetConfig)\n\nIt never reads from config.yaml, which IS tracked in git and persists across clones.\n\n## Proposed Solution\n\nAdd sync-branch support to config.yaml with this precedence:\n1. BEADS_SYNC_BRANCH env var (highest)\n2. config.yaml sync-branch setting\n3. Database config (legacy/local override)\n4. Auto-detect from current branch (lowest)\n\nChanges needed:\n1. Update syncbranch.Get() to check config.GetString('sync-branch') between env and database\n2. Update config.yaml template in init.go to include sync-branch\n3. Update docs to recommend setting sync-branch in config.yaml for team projects\n4. Consider: bd init --branch should also write to config.yaml, not just database","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-30T10:51:29.594627-08:00","updated_at":"2025-11-30T10:54:14.198025-08:00","closed_at":"2025-11-30T10:54:14.198025-08:00"}
|
||
{"id":"bd-io8c","title":"Improve test coverage for internal/syncbranch (33.0% → 70%)","description":"The syncbranch package has only 33.0% test coverage. This package handles git sync operations and is critical for data integrity.\n\nCurrent coverage: 33.0%\nTarget coverage: 70%","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-13T20:43:02.079145-08:00","updated_at":"2025-12-13T21:01:14.972533-08:00"}
|
||
{"id":"bd-iou5","title":"Detect and warn about outdated git hooks","description":"Users may have outdated git hooks installed that reference removed flags (e.g., --resolve-collisions). bd should detect this and warn users to reinstall.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-06T13:59:45.778781-08:00","updated_at":"2025-12-14T16:46:09.369788-08:00","closed_at":"2025-11-06T15:02:16.928192-08:00"}
|
||
{"id":"bd-iov0","title":"Document -short flag in testing guide","description":"Add documentation about the -short flag and how it's used to skip slow tests. Should explain that developers can run 'go test -short ./...' for fast iteration and 'go test ./...' for full coverage.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-06T17:30:49.618187-08:00","updated_at":"2025-12-14T16:46:30.212472-08:00","closed_at":"2025-11-06T19:41:08.643188-08:00"}
|
||
{"id":"bd-iq7n","title":"Audit and fix JSONL filename mismatches across all repo clones","description":"## Problem\n\nMultiple clones of repos are configured with different JSONL filenames (issues.jsonl vs beads.jsonl), causing:\n1. JSONL files to be resurrected after deletion (one clone pushes issues.jsonl, another pushes beads.jsonl)\n2. Agents unable to see issues filed by other agents after sync\n3. Merge conflicts and data inconsistencies\n\n## Root Cause\n\nWhen repos were \"bd doctored\" or initialized at different times, some got issues.jsonl (old default) and others got beads.jsonl (Beads repo specific). These clones push their respective files, creating duplicates.\n\n## Task\n\nScan all repo clones under ~/src/ (1-2 levels deep) and standardize their JSONL configuration.\n\n### Step 1: Find all beads-enabled repos\n\n```bash\n# Find all directories named 'beads' at levels 1-2 under ~/src/\nfind ~/src -maxdepth 2 -type d -name beads\n```\n\n### Step 2: For each repo found, check configuration\n\nFor each directory from Step 1, check:\n- Does `.beads/metadata.json` exist?\n- What is the `jsonl_export` value?\n- What JSONL files actually exist in `.beads/`?\n- Are there multiple JSONL files (problem!)?\n\n### Step 3: Create audit report\n\nGenerate a report showing:\n```\nRepo Path | Config | Actual Files | Status\n----------------------------------- | ------------- | ---------------------- | --------\n~/src/beads | beads.jsonl | beads.jsonl | OK\n~/src/dave/beads | issues.jsonl | issues.jsonl | MISMATCH\n~/src/emma/beads | issues.jsonl | issues.jsonl, beads.jsonl | DUPLICATE!\n```\n\n### Step 4: Determine canonical name for each repo\n\nFor repos that are the SAME git repository (check `git remote -v`):\n- Group them together\n- Determine which JSONL filename should be canonical (majority wins, or beads.jsonl for the beads repo itself)\n- List which clones need to be updated\n\n### Step 5: Generate fix script\n\nCreate a script that for each mismatched clone:\n1. Updates `.beads/metadata.json` to use the canonical name\n2. If JSONL file needs renaming: `git mv .beads/old.jsonl .beads/new.jsonl`\n3. Removes any duplicate JSONL files: `git rm .beads/duplicate.jsonl`\n4. Commits the change\n5. Syncs: `bd sync`\n\n### Expected Output\n\n1. Audit report showing all repos and their config status\n2. List of repos grouped by git remote (same repository)\n3. Fix script or manual instructions for standardizing each repo\n4. Verification that after fixes, all clones of the same repo use the same JSONL filename\n\n### Edge Cases\n\n- Handle repos without metadata.json (use default discovery)\n- Handle repos with no git remote (standalone/local)\n- Handle repos that are not git repositories\n- Don't modify repos with uncommitted changes (warn instead)\n\n### Success Criteria\n\n- All clones of the same git repository use the same JSONL filename\n- No duplicate JSONL files in any repo\n- All configurations documented in metadata.json\n- bd doctor passes on all repos","status":"open","priority":0,"issue_type":"task","created_at":"2025-11-21T23:58:35.044762-08:00","updated_at":"2025-11-21T23:58:35.044762-08:00"}
|
||
{"id":"bd-irq6","title":"Remove unused global daemon infrastructure (internal/daemonrunner/)","description":"**Summary:** Removed the unused internal/daemonrunner/ package containing legacy global daemon infrastructure, which was superseded by per-workspace daemon architecture. Comprehensive deadcode analysis confirmed all functions in the package were unreachable and could be safely deleted.\n\n**Key Decisions:** \n- Deprecate global daemon implementation\n- Switch to per-workspace daemon model\n- Complete removal of unused code (9 files, ~1,500 LOC)\n\n**Resolution:** Codebase streamlined by eliminating obsolete daemon and git management infrastructure, reducing technical debt and improving system maintainability.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-06T19:30:50.936943-08:00","updated_at":"2025-12-14T16:46:26.547401-08:00","closed_at":"2025-11-06T19:35:10.646498-08:00"}
|
||
{"id":"bd-it3x","title":"Issue with labels","description":"","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-11-07T19:07:18.388873-08:00","updated_at":"2025-12-14T16:46:56.726157-08:00","closed_at":"2025-11-07T21:55:09.429989-08:00"}
|
||
{"id":"bd-iye7","title":"Add path normalization to getMultiRepoJSONLPaths()","description":"**Summary:** Improved path handling in getMultiRepoJSONLPaths() to robustly process repository paths across different configurations. The changes address path normalization, expansion, and deduplication to prevent potential failures in path resolution.\n\n**Key Decisions:**\n- Use filepath.Abs() for full path resolution\n- Implement tilde expansion via os.UserHomeDir()\n- Deduplicate paths using map tracking\n- Add empty path and readability filtering\n\n**Resolution:** Updated path processing ensures reliable JSONL path generation across varied repository configurations, preventing potential runtime errors.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-06T19:31:51.882743-08:00","updated_at":"2025-12-14T16:46:27.131012-08:00","closed_at":"2025-11-06T19:35:41.246311-08:00","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-j3il","title":"Add bd reset command for clean slate restart","description":"Implement a command to reset beads to a clean starting state.\n\n**Context:** GitHub issue #479 - users sometimes get beads into an invalid state after updates, and there's no clean way to start fresh. The git backup/restore mechanism that protects against accidental deletion also makes it hard to intentionally reset.\n\n**Current workaround** (from maphew):\n```bash\nbd daemons killall\ngit rm .beads/*.jsonl\ngit commit -m 'remove old issues'\nrm .beads/*\nbd init\nbd onboard\n```\n\n**Desired:** A proper `bd reset` command that handles this cleanly and safely.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-13T08:41:34.956552+11:00","updated_at":"2025-12-13T08:43:49.970591+11:00","closed_at":"2025-12-13T08:43:49.970591+11:00"}
|
||
{"id":"bd-j3zt","title":"Fix mypy errors in beads-mcp","description":"Running `mypy .` in `integrations/beads-mcp` reports 287 errors. These should be addressed to improve type safety and code quality.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-20T18:53:28.557708-05:00","updated_at":"2025-12-09T18:38:37.694947872-05:00","closed_at":"2025-11-27T00:37:17.188443-08:00"}
|
||
{"id":"bd-j7e2","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":"closed","priority":3,"issue_type":"task","created_at":"2025-11-07T16:42:12.772364-08:00","updated_at":"2025-12-14T16:46:53.087724-08:00","closed_at":"2025-11-07T21:29:32.243458-08:00","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-jgxi","title":"Auto-migrate database on CLI version bump","description":"When CLI is upgraded (e.g., 0.24.0 → 0.24.1), database version becomes stale. Add auto-migration in PersistentPreRun or daemon startup. Check dbVersion != CLIVersion and run bd migrate automatically. Fixes recurring UX issue where bd doctor shows version mismatch after every CLI upgrade.","status":"open","priority":0,"issue_type":"feature","created_at":"2025-11-21T23:16:09.004619-08:00","updated_at":"2025-11-21T23:16:27.229388-08:00","dependencies":[{"issue_id":"bd-jgxi","depends_on_id":"bd-tbz3","type":"parent-child","created_at":"2025-11-21T23:16:09.005513-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-jijf","title":"Fix: --parent flag doesn't create parent-child dependency","description":"When using `bd create --parent \u003cid\u003e`, the code generates a hierarchical child ID (e.g., bd-123.1) but never creates a parent-child dependency. This causes `bd epic status` to show zero children even though child issues exist.\n\nRoot cause: create.go generates child ID using store.GetNextChildID() but never calls store.AddDependency() with type parent-child.\n\nFix: After creating the issue when parentID is set, automatically add a parent-child dependency linking child -\u003e parent.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-15T13:15:22.138854-08:00","updated_at":"2025-11-15T13:18:29.301788-08:00","closed_at":"2025-11-15T13:18:29.301788-08:00"}
|
||
{"id":"bd-jjua","title":"Auto-invoke 3-way merge for JSONL conflicts","description":"**Summary:** The issue addressed automatic resolution of JSONL merge conflicts during git pull instead of requiring manual intervention. This aimed to improve user experience by leveraging the existing beads-merge tool for seamless conflict handling.\n\n**Key Decisions:**\n- Auto-invoke 3-way merge for .beads/issues.jsonl conflicts\n- Only fail if automatic merge cannot resolve conflicts\n- Use beads-merge tool for advanced merging logic\n\n**Resolution:** Post-merge hook now automatically attempts conflict resolution, reducing user friction and simplifying the synchronization process for collaborative issue tracking.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-08T03:09:18.258708-08:00","updated_at":"2025-12-14T16:47:33.552581-08:00","closed_at":"2025-11-08T03:15:55.529652-08:00"}
|
||
{"id":"bd-jo38","title":"Add WaitGroup tracking to FileWatcher goroutines","description":"FileWatcher spawns goroutines without WaitGroup tracking, causing race condition on shutdown.\n\nLocation: cmd/bd/daemon_watcher.go:123-182, 215-291\n\nProblem:\n- Goroutines spawned without sync.WaitGroup\n- Close() cancels context but doesn't wait for goroutines to exit\n- Race condition: goroutine may access fw.debouncer during Close() cleanup\n- No guarantee goroutine stopped before fw.watcher.Close() is called\n\nSolution:\n- Add sync.WaitGroup field to FileWatcher\n- Track goroutines with wg.Add(1) and defer wg.Done()\n- Call wg.Wait() in Close() before cleanup\n\nImpact: Race condition on daemon shutdown; potential panic\n\nEffort: 2 hours","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-16T14:51:38.591371-08:00","updated_at":"2025-11-16T15:04:00.466334-08:00","closed_at":"2025-11-16T15:04:00.466334-08:00"}
|
||
{"id":"bd-jx90","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":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-07T00:26:30.372137-08:00","updated_at":"2025-12-14T16:47:00.445749-08:00","closed_at":"2025-11-07T22:05:16.325863-08:00"}
|
||
{"id":"bd-k0j9","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-12-14T16:45:48.640949-08:00","closed_at":"2025-11-05T11:23:20.91305-08:00"}
|
||
{"id":"bd-k2n","title":"PushSyncBranch may fail if worktree was cleaned up","description":"","status":"closed","priority":3,"issue_type":"bug","created_at":"2025-12-02T21:56:00.209253-08:00","updated_at":"2025-12-02T22:09:09.552051-08:00","closed_at":"2025-12-02T22:09:09.552051-08:00"}
|
||
{"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-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-12-14T16:45:31.061643-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-k5kz","title":"Tombstone import creates duplicate entries when deletions.jsonl has entries already in JSONL","description":"In the tombstone import logic (bd-dve), when a non-tombstone issue is in both JSONL and deletions.jsonl, we:\n1. Skip the issue (line 149-155)\n2. Create a tombstone from deletions.jsonl (lines 161-171)\n\nThis means if the JSONL contains issue 'bd-abc' (non-tombstone) and deletions.jsonl also has 'bd-abc', we skip the JSONL version but then add a tombstone version from deletions.jsonl. This is intentional but the skipped issue count may be confusing.\n\nConsider: should we track converted-to-tombstone separately from skipped-deleted in the Result struct?","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-07T01:40:25.411613-08:00","updated_at":"2025-12-13T09:42:56.871484+11:00","closed_at":"2025-12-07T02:25:56.191188-08:00","dependencies":[{"issue_id":"bd-k5kz","depends_on_id":"bd-dve","type":"blocks","created_at":"2025-12-07T01:41:28.205715-08:00","created_by":"daemon"}]}
|
||
{"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-12-14T16:46:11.854095-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-12-14T16:47:49.979848-08:00","closed_at":"2025-11-10T10:46:09.94181-08:00"}
|
||
{"id":"bd-kdoh","title":"Add tests for getMultiRepoJSONLPaths() edge cases","description":"**Summary:** Identified comprehensive test coverage gaps in getMultiRepoJSONLPaths() function across various path handling scenarios. Added tests to validate edge cases including empty paths, duplicates, path normalization, and potential partial failure modes.\n\n**Key Decisions:**\n- Test empty/duplicate path scenarios\n- Validate path expansion and canonicalization\n- Ensure graceful handling of partial repository snapshot failures\n\n**Resolution:** Updated deletion_tracking_test.go with robust test cases, improving system reliability and preventing potential path-related errors in multi-repository operations.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-06T19:31:52.921241-08:00","updated_at":"2025-12-14T16:46:33.869779-08:00","closed_at":"2025-11-06T19:53:34.515411-08:00","dependencies":[{"issue_id":"bd-kdoh","depends_on_id":"bd-xo6b","type":"discovered-from","created_at":"2025-11-06T19:32:12.353459-08:00","created_by":"daemon"},{"issue_id":"bd-kdoh","depends_on_id":"bd-iye7","type":"blocks","created_at":"2025-11-06T19:32:13.688686-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-keb","title":"Add database maintenance commands section to QUICKSTART.md","description":"**Problem:**\nUsers don't discover `bd compact` or `bd cleanup` commands until their database grows large. These maintenance commands aren't mentioned in quickstart documentation.\n\nRelated to issue #349 item #4.\n\n**Current state:**\ndocs/QUICKSTART.md ends at line 217 with \"See README.md for full documentation\" but has no mention of maintenance operations.\n\n**Proposed addition:**\nAdd a \"Database Maintenance\" section after line 140 (before \"Advanced: Agent Mail\" section) covering:\n- When database grows (many closed issues)\n- How to view compaction statistics\n- How to compact old issues\n- How to delete closed issues\n- Warning about permanence\n\n**Example content:**\n```markdown\n## Database Maintenance\n\nAs your project accumulates closed issues, the database grows. Use these commands to manage size:\n\n```bash\n# View compaction statistics\nbd compact --stats\n\n# Preview compaction candidates (30+ days closed)\nbd compact --analyze --json\n\n# Apply agent-generated summary\nbd compact --apply --id bd-42 --summary summary.txt\n\n# Immediately delete closed issues (use with caution!)\nbd cleanup --force\n```\n\n**When to compact:**\n- Database file \u003e 10MB with many old closed issues\n- After major project milestones\n- Before archiving a project phase\n```\n\n**Files to modify:**\n- docs/QUICKSTART.md (add section after line 140)","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-20T20:48:40.488512-05:00","updated_at":"2025-11-20T20:59:13.439462-05:00","closed_at":"2025-11-20T20:59:13.439462-05: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-ki14","title":"Implicit deletion cases do not check for tombstones in remaining side","description":"In merge3WayWithTTL(), the implicit deletion cases (lines 426-435) handle when an issue exists in base and one side but not the other. The current logic does not check if the remaining side is a tombstone:\n\nCase: inBase \u0026\u0026 inLeft \u0026\u0026 !inRight (deleted implicitly in right)\n- If leftIssue is a tombstone, we should keep it (tombstone propagation)\n- Currently: continue (drops the tombstone)\n\nCase: inBase \u0026\u0026 !inLeft \u0026\u0026 inRight (deleted implicitly in left)\n- If rightIssue is a tombstone, we should keep it\n- Currently: continue (drops the tombstone)\n\nThis could cause tombstones to be lost during merge if one side has a tombstone and the other side implicitly deleted. The tombstone should win since its an explicit deletion record.\n\nFiles: internal/merge/merge.go:426-435","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-05T16:37:22.584044-08:00","updated_at":"2025-12-05T17:15:57.61608-08:00","closed_at":"2025-12-05T17:15:57.61608-08:00"}
|
||
{"id":"bd-kig","title":"Test worktree sync branch commit","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-30T00:38:13.906936-08:00","updated_at":"2025-11-30T00:40:23.609537-08:00","closed_at":"2025-11-30T00:40:23.609537-08:00"}
|
||
{"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-12-14T16:46:03.44767-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"}]}
|
||
{"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-ky74","title":"Optimize cmd/bd long-mode tests by switching to in-process testing","description":"**Summary:** Optimized cmd/bd long-mode CLI tests by switching from process spawning to in-process testing, dramatically reducing test execution time by directly calling bd functions instead of using exec.Command().\n\n**Key Decisions:** \n- Convert tests to call rootCmd.Execute() directly\n- Implement runBDInProcess() helper with state management\n- Retain one end-to-end exec.Command test for full binary validation\n\n**Resolution:** Test suite performance improved from ~40s to ~5s, with individual tests accelerating from 3.7s to 0.6s, representing approximately a 10x speed enhancement.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-08T18:40:27.358821-08:00","updated_at":"2025-12-14T16:47:45.68705-08:00","closed_at":"2025-11-08T18:47:11.107998-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-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":"open","priority":2,"issue_type":"bug","created_at":"2025-12-14T16:32:22.759225-08:00","updated_at":"2025-12-14T16:32:22.759225-08:00"}
|
||
{"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-12-14T16:46:35.176267-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":"**Summary:** Targeted performance bottlenecks in test suite by optimizing Git-heavy operations in beads_hash_multiclone_test.go, which were consuming 95% of runtime.\n\n**Key Decisions:**\n- Use clone optimizations (--shared, --depth=1)\n- Disable unnecessary Git operations\n- Leverage -short flag\n\n**Resolution:** Reduced test suite runtime from 20.8 to under 10 seconds, significantly improving developer productivity and CI performance.","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-11-04T01:23:14.410648-08:00","updated_at":"2025-12-14T16:45:21.352355-08:00","closed_at":"2025-11-04T11:23:13.683213-08:00"}
|
||
{"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-l954","title":"Performance Testing Framework","description":"Add comprehensive performance testing for beads focusing on optimization guidance and validating 10K+ database scale. Uses standard Go tooling, follows existing patterns, minimal complexity.\n\nComponents:\n- Benchmark suite for critical operations at 10K-20K scale\n- Fixture generator for realistic test data (epic hierarchies, cross-links)\n- User diagnostics via bd doctor --perf\n- Always-on profiling integration\n\nGoals:\n- Identify bottlenecks for optimization work\n- Validate performance at 10K+ issue scale\n- Enable users to collect diagnostics for bug reports\n- Support both SQLite and JSONL import paths","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-11-13T22:22:11.203467-08:00","updated_at":"2025-12-09T18:38:37.696367072-05:00","closed_at":"2025-11-28T23:07:57.285628-08:00"}
|
||
{"id":"bd-la9d","title":"Blocking issue","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-22T14:57:44.560338491-05:00","updated_at":"2025-12-14T16:46:57.337022-08:00","closed_at":"2025-11-07T21:55:09.43148-08:00"}
|
||
{"id":"bd-lfak","title":"bd preflight: PR readiness checks for contributors","description":"## Vision\n\nEncode project-specific institutional knowledge into executable checks. CONTRIBUTING.md is documentation that's read once and forgotten; `bd preflight` is documentation that runs at exactly the right moment.\n\n## Problem Statement\n\nContributors face a \"last mile\" problem - they do the work but stumble on project-specific gotchas at PR time:\n- Nix vendorHash gets stale when go.sum changes\n- Beads artifacts leak into PRs (see bd-umbf for namespace solution)\n- Version mismatches between version.go and default.nix\n- Tests/lint not run locally before pushing\n- Other project-specific checks that only surface when CI fails\n\nThese are too obscure to remember, exist in docs nobody reads end-to-end, and waste CI round-trips.\n\n## Why beads?\n\nBeads already has a foothold in the contributor workflow. It knows:\n- Git state (staged files, branch, dirty status)\n- Project structure\n- The specific issue being worked on\n- Project-specific configuration\n\n## Proposed Interface\n\n### Tier 1: Checklist Mode (v1)\n\n $ bd preflight\n PR Readiness Checklist:\n\n [ ] Tests pass: go test -short ./...\n [ ] Lint passes: golangci-lint run ./...\n [ ] No beads pollution: check .beads/issues.jsonl diff\n [ ] Nix hash current: go.sum unchanged or vendorHash updated\n [ ] Version sync: version.go matches default.nix\n\n Run 'bd preflight --check' to validate automatically.\n\n### Tier 2: Check Mode (v2)\n\n $ bd preflight --check\n ✓ Tests pass\n ✓ Lint passes\n ⚠ Beads pollution: 3 issues in diff - are these project issues or personal?\n ✗ Nix hash stale: go.sum changed, vendorHash needs update\n Fix: sha256-KRR6dXzsSw8OmEHGBEVDBOoIgfoZ2p0541T9ayjGHlI=\n ✓ Version sync\n\n 1 error, 1 warning. Run 'bd preflight --fix' to auto-fix where possible.\n\n### Tier 3: Fix Mode (v3)\n\n $ bd preflight --fix\n ✓ Updated vendorHash in default.nix\n ⚠ Cannot auto-fix beads pollution - manual review needed\n\n## Checks to Implement\n\n| Check | Description | Auto-fixable |\n|-------|-------------|--------------|\n| tests | Run go test -short ./... | No |\n| lint | Run golangci-lint | Partial (gofmt) |\n| beads-pollution | Detect personal issues in diff | No (see bd-umbf) |\n| nix-hash | Detect stale vendorHash | Yes (if nix available) |\n| version-sync | version.go matches default.nix | Yes |\n| no-debug | No TODO/FIXME/console.log | Warn only |\n| clean-stage | No unintended files staged | Warn only |\n\n## Future: Configuration\n\nMake checks configurable per-project via .beads/preflight.yaml:\n\n preflight:\n checks:\n - name: tests\n run: go test -short ./...\n required: true\n - name: no-secrets\n pattern: \"**/*.env\"\n staged: deny\n - name: custom-check\n run: ./scripts/validate.sh\n\nThis lets any project using beads define their own preflight checks.\n\n## Implementation Phases\n\n### Phase 1: Static Checklist\n- Implement bd preflight with hardcoded checklist for beads\n- No execution, just prints what to check\n- Update CONTRIBUTING.md to reference it\n\n### Phase 2: Automated Checks\n- Implement bd preflight --check\n- Run tests, lint, detect stale hashes\n- Clear pass/fail/warn output\n\n### Phase 3: Auto-fix\n- Implement bd preflight --fix\n- Fix vendorHash, version sync\n- Integrate with bd-umbf solution for pollution\n\n### Phase 4: Configuration\n- .beads/preflight.yaml support\n- Make it useful for other projects using beads\n- Plugin/hook system for custom checks\n\n## Dependencies\n\n- bd-umbf: Namespace isolation for beads pollution (blocking for full solution)\n\n## Success Metrics\n\n- Fewer CI failures on first PR push\n- Reduced \"fix nix hash\" commits\n- Contributors report preflight caught issues before CI","status":"open","priority":2,"issue_type":"epic","created_at":"2025-12-13T18:01:39.587078-08:00","updated_at":"2025-12-13T18:01:39.587078-08:00","dependencies":[{"issue_id":"bd-lfak","depends_on_id":"bd-umbf","type":"blocks","created_at":"2025-12-13T18:01:46.059901-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-llfl","title":"Improve test coverage for cmd/bd CLI (26.2% → 50%)","description":"The main CLI package (cmd/bd) has only 26.2% test coverage. CLI commands should have at least 50% coverage to ensure reliability.\n\nKey areas with low/no coverage:\n- daemon_autostart.go (multiple 0% functions)\n- compact.go (several 0% functions)\n- Various command handlers\n\nCurrent coverage: 26.2%\nTarget coverage: 50%","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-13T20:43:03.123341-08:00","updated_at":"2025-12-13T21:01:18.901944-08:00"}
|
||
{"id":"bd-lln","title":"Add tests for performFlush error handling in FlushManager","description":"Test coverage gap identified by automated analysis (vc-217).\n\n**Original Issue:** [deleted:bd-da96-baseline-lint]\n\nIn cmd/bd/flush_manager.go:269, the performFlush method is flagged by unparam as always returning nil, indicating the error return value is never used.\n\nAdd tests to determine:\n- Whether performFlush can actually return errors in failure scenarios\n- If error return is needed, add tests for error cases (disk full, permission denied, etc.)\n- If error return is not needed, refactor to remove unused return value\n- Test full export vs incremental export error handling\n\nThis ensures proper error handling in the flush mechanism and removes dead code if the return value is unnecessary.\n\n_This issue was automatically created by AI test coverage analysis._","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-21T10:25:33.533653-05:00","updated_at":"2025-11-21T21:29:36.985464294-05:00","closed_at":"2025-11-21T19:31:21.876949-05:00","dependencies":[{"issue_id":"bd-lln","depends_on_id":"bd-da96-baseline-lint","type":"discovered-from","created_at":"2025-11-21T10:25:33.534913-05:00","created_by":"ai-supervisor"}]}
|
||
{"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-lsa","title":"Mass deletion logging for forensics","description":"Log detailed information when the safety check triggers during auto-push.\n\nWhen \u003e50% issues vanish AND \u003e5 existed:\n- Log which issues vanished\n- Log the before/after counts\n- Log timestamp for forensic analysis\n\nThis gives users visibility into what happened if something goes wrong, without blocking the sync.\n\nLocation: internal/syncbranch/worktree.go\nParent issue: bd-3s8","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-02T19:30:59.835398-08:00","updated_at":"2025-12-13T08:15:21.912709+11:00","closed_at":"2025-12-03T22:17:33.866065-08:00","dependencies":[{"issue_id":"bd-lsa","depends_on_id":"bd-7ch","type":"blocks","created_at":"2025-12-02T19:31:08.254087-08:00","created_by":"daemon"}]}
|
||
{"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":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-13T06:42:17.130839-08:00","updated_at":"2025-12-13T06:43:33.329042-08:00","closed_at":"2025-12-13T06:43:33.329042-08:00"}
|
||
{"id":"bd-lwnt","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-12-14T16:45:48.474714-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":"open","priority":2,"issue_type":"task","created_at":"2025-12-14T14:25:17.414916-08:00","updated_at":"2025-12-14T14:25:17.414916-08:00","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-m0w","title":"Add test coverage for internal/validation package","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-20T21:21:24.129559-05:00","updated_at":"2025-12-09T18:38:37.697625272-05:00","closed_at":"2025-11-28T21:52:34.198974-08:00","dependencies":[{"issue_id":"bd-m0w","depends_on_id":"bd-ge7","type":"blocks","created_at":"2025-11-20T21:21:31.350477-05:00","created_by":"daemon"}]}
|
||
{"id":"bd-m62x","title":"Benchmark Suite for Critical Operations","description":"**Summary:** Extended benchmark suite for critical database operations, focusing on performance testing at 10K-20K issue scales. Created comprehensive benchmarks to validate system performance across complex query scenarios in SQLite storage.\n\n**Key Decisions:**\n- Add benchmarks for GetReadyWork, SearchIssues, and other critical operations\n- Test at Large (10K) and XLarge (20K) issue scales\n- Generate CPU/memory profiles for detailed performance analysis\n\n**Resolution:** New sqlite_bench_test.go provides systematic performance evaluation framework for storage operations, enabling more robust system performance understanding.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-13T22:22:43.770787-08:00","updated_at":"2025-12-14T16:47:53.749158-08:00","closed_at":"2025-11-13T23:15:33.781023-08:00","dependencies":[{"issue_id":"bd-m62x","depends_on_id":"bd-q13h","type":"blocks","created_at":"2025-11-13T22:24:02.668091-08:00","created_by":"daemon"},{"issue_id":"bd-m62x","depends_on_id":"bd-zj8e","type":"blocks","created_at":"2025-11-13T22:24:06.30131-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-m7ge","title":"Add .beads/README.md during 'bd init' for project documentation and promotion","description":"When 'bd init' is run, automatically generate a .beads/README.md file that:\n\n1. Briefly explains what Beads is (AI-native issue tracking that lives in your repo)\n2. Links to the main repository: https://github.com/steveyegge/beads\n3. Provides a quick reference of essential commands:\n - bd create: Create new issues\n - bd list: View all issues\n - bd update: Modify issue status/details\n - bd show: View issue details\n - bd sync: Sync with git remote\n4. Highlights key benefits for AI coding agents and developers\n5. Encourages developers to try it out\n\nThe README should be enthusiastic and compelling to get open source contributors excited about using Beads for their AI-assisted development workflows.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-16T22:32:50.478681-08:00","updated_at":"2025-12-09T18:38:37.699008372-05:00","closed_at":"2025-11-25T17:49:42.558381-08:00"}
|
||
{"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":"open","priority":2,"issue_type":"task","created_at":"2025-12-13T20:43:09.515299-08:00","updated_at":"2025-12-13T21:01:17.17404-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-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-12-14T16:47:13.034569-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-md2","title":"Add tombstone validation: require deleted_at for tombstone status","description":"ValidateWithCustomStatuses() doesn't enforce that tombstones must have deleted_at set. Per bd-2m7 design: 'If status == tombstone, then deleted_at MUST be set'. Also should validate that non-tombstones cannot have deleted_at set.\n\nLocation: internal/types/types.go:109-114\n\nAdd validation:\n- if i.Status == StatusTombstone \u0026\u0026 i.DeletedAt == nil: error\n- if i.Status != StatusTombstone \u0026\u0026 i.DeletedAt != nil: error","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-05T15:35:29.458545-08:00","updated_at":"2025-12-05T15:41:14.804544-08:00","closed_at":"2025-12-05T15:41:14.804544-08:00","dependencies":[{"issue_id":"bd-md2","depends_on_id":"bd-vw8","type":"parent-child","created_at":"2025-12-05T15:35:47.141085-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-mdw","title":"Add integration test for cross-clone deletion propagation","description":"","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"}
|
||
{"id":"bd-mf0o","title":"Add 'new' as alias for 'create' command","description":"","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-08T03:11:46.791657-08:00","updated_at":"2025-12-14T16:47:32.303162-08:00","closed_at":"2025-11-08T03:11:51.035418-08:00"}
|
||
{"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-12-14T16:46:01.324641-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":"**Summary:** Existing deletion tracking used brittle string comparison for JSON, causing tracking errors when field order changed. A more robust semantic JSON comparison method was implemented to resolve inconsistencies.\n\n**Key Decisions:** \n- Use `json.Unmarshal()` for parsing\n- Leverage `reflect.DeepEqual()` for comparison\n\n**Resolution:** Updated logic now correctly handles JSON variations, ensuring accurate deletion tracking across different import/export scenarios.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-06T18:15:35.090716-08:00","updated_at":"2025-12-14T16:46:14.089591-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"}
|
||
{"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":"open","priority":4,"issue_type":"task","created_at":"2025-12-07T02:03:44.217728-08:00","updated_at":"2025-12-07T02:03:44.217728-08:00"}
|
||
{"id":"bd-muls","title":"Install and test MCP Agent Mail locally","description":"**Summary:** Locally installed MCP Agent Mail on development machine to validate core functionality and server performance. Initial setup completed with basic HTTP and web UI endpoints established.\n\n**Key Decisions:** \n- Use one-line installer\n- Default port 8765\n- Web UI accessible at /mail route\n\n**Resolution:** Installation successful, but MCP API tool requires further debugging before full deployment.","status":"closed","priority":0,"issue_type":"task","created_at":"2025-11-07T22:41:59.896735-08:00","updated_at":"2025-12-14T16:47:01.566088-08:00","closed_at":"2025-11-07T23:14:59.1182-08:00"}
|
||
{"id":"bd-my64","title":"Pre-push hook and daemon export produce different JSONL","description":"**Summary:** Pre-push JSONL export discovered inconsistent database content between hook and daemon exports, revealing potential synchronization issues with comment tracking and change propagation.\n\n**Key Decisions:**\n- Modify pre-push hook to flush pending daemon changes\n- Use git status --porcelain for comprehensive change detection\n- Support multiple JSONL export scenarios\n- Ensure compatibility with partial tool installations\n\n**Resolution:** Implemented export synchronization mechanism that prevents race conditions and ensures consistent JSONL representation across different export paths.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-06T18:49:54.570993-08:00","updated_at":"2025-12-14T16:46:17.313054-08:00","closed_at":"2025-11-06T18:57:42.710282-08:00"}
|
||
{"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-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":"open","priority":2,"issue_type":"task","created_at":"2025-12-13T20:43:00.895238-08:00","updated_at":"2025-12-13T21:01:17.274438-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":"open","priority":2,"issue_type":"task","created_at":"2025-12-05T15:25:24.514998248-07:00","updated_at":"2025-12-05T15:42:32.910166956-07: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":"open","priority":2,"issue_type":"bug","created_at":"2025-11-20T20:16:34.889997-05:00","updated_at":"2025-11-20T20:16:34.889997-05: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"}]}
|
||
{"id":"bd-nbc","title":"Add security tests for file path validation in clean command","description":"Test coverage gap identified by automated analysis (vc-217).\n\n**Original Issue:** [deleted:bd-da96-baseline-lint]\n\nIn cmd/bd/clean.go:118, os.Open(gitignorePath) is flagged by gosec G304 for potential file inclusion via variable without validation.\n\nAdd tests covering:\n- Path traversal attempts (../../etc/passwd)\n- Absolute paths outside project directory\n- Symlink following behavior\n- Non-existent file handling\n- Validation that only .gitignore files in valid locations are opened\n\nThis is a security-sensitive code path that needs validation to prevent unauthorized file access.\n\n_This issue was automatically created by AI test coverage analysis._","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-21T10:25:33.526884-05:00","updated_at":"2025-11-21T21:29:36.988132396-05:00","closed_at":"2025-11-21T19:31:21.864673-05:00","dependencies":[{"issue_id":"bd-nbc","depends_on_id":"bd-da96-baseline-lint","type":"discovered-from","created_at":"2025-11-21T10:25:33.528582-05:00","created_by":"ai-supervisor"}]}
|
||
{"id":"bd-ndyz","title":"GH#243: Recurring stale daemon.lock causes 5s delays","description":"**Summary:** Investigated recurring daemon.lock stale state causing 5s startup delays in beads AI workflows. Root cause identified as unclean daemon exits leaving orphaned lock files on macOS M2 systems.\n\n**Key Decisions:**\n- Implement automatic lock file detection/cleanup\n- Add crash logging for daemon exit diagnostics\n- Create RPC fast-fail mechanism with short timeouts\n\n**Resolution:** Converted to multi-stage epic addressing daemon resilience, with priority on reducing startup overhead and preventing stale lock scenarios across different agent interaction patterns.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-07T16:32:23.576171-08:00","updated_at":"2025-12-14T16:46:54.554373-08:00","closed_at":"2025-11-07T21:29:56.009737-08:00"}
|
||
{"id":"bd-nemp","title":"Measure git operation reduction","description":"Quantify the reduction in git operations (pulls, commits, pushes) when using Agent Mail for coordination.\n\nAcceptance Criteria:\n- Baseline: count git ops for 10 issues without Agent Mail\n- With Agent Mail: count git ops for 10 issues\n- Document reduction percentage\n- Verify 70-80% reduction claim\n- Measure impact on .git directory size growth\n\nSuccess Metric: ≥70% reduction in git operations","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-07T22:42:00.157334-08:00","updated_at":"2025-12-14T16:47:12.990954-08:00","closed_at":"2025-11-08T00:20:30.691721-08:00","dependencies":[{"issue_id":"bd-nemp","depends_on_id":"bd-6hji","type":"blocks","created_at":"2025-11-07T23:03:53.131532-08:00","created_by":"daemon"},{"issue_id":"bd-nemp","depends_on_id":"bd-htfk","type":"blocks","created_at":"2025-11-07T23:03:53.200321-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-ng56","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-12-14T16:46:29.638268-08:00","closed_at":"2025-11-06T19:41:04.67733-08:00","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-nl2","title":"No logging/debugging for tombstone resurrection events","description":"Per the design document bd-zvg Open Question 1: Should resurrection log a warning? Recommendation was Yes. Currently, when an expired tombstone loses to a live issue (resurrection), there is no logging or debugging output. This makes it hard to understand why an issue reappeared. Recommendation: Add optional debug logging when resurrection occurs, e.g., Issue bd-abc resurrected (tombstone expired). Files: internal/merge/merge.go:359-366, 371-378, 400-405, 410-415","status":"open","priority":4,"issue_type":"feature","created_at":"2025-12-05T16:36:52.27525-08:00","updated_at":"2025-12-05T16:36:52.27525-08:00"}
|
||
{"id":"bd-nl8z","title":"Documentation","description":"Complete documentation for Agent Mail integration to enable adoption.","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-07T22:42:37.969636-08:00","updated_at":"2025-12-14T16:47:30.094963-08:00","closed_at":"2025-11-08T02:34:57.887891-08:00","dependencies":[{"issue_id":"bd-nl8z","depends_on_id":"bd-wfmw","type":"blocks","created_at":"2025-11-07T22:42:37.970621-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-nq41","title":"Fix Homebrew warning about Ruby file location","description":"Homebrew warning: Found Ruby file outside steveyegge/beads tap formula directory.\nWarning points to: /opt/homebrew/Library/Taps/steveyegge/homebrew-beads/bd.rb\nIt should likely be inside a Formula/ directory or similar structure expected by Homebrew taps.\n","status":"closed","priority":2,"issue_type":"chore","created_at":"2025-11-20T18:56:21.226579-05:00","updated_at":"2025-12-09T18:38:37.701783372-05:00","closed_at":"2025-11-26T22:25:37.362928-08:00"}
|
||
{"id":"bd-nqes","title":"bd-hv01: Non-atomic snapshot operations can cause data loss","description":"**Summary:** A data integrity vulnerability was discovered in snapshot synchronization where failed snapshot captures could lead to incorrect issue deletions. The fix involved making snapshot capture a mandatory, blocking operation instead of a logged warning.\n\n**Key Decisions:** \n- Change snapshot capture from warning to required operation\n- Return error if snapshot cannot be captured\n- Block sync process if snapshot generation fails\n\n**Resolution:** Critical data loss potential was eliminated by enforcing atomic snapshot operations during multi-workspace synchronization.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-06T18:15:33.574158-08:00","updated_at":"2025-12-14T16:46:13.270793-08:00","closed_at":"2025-11-06T18:46:55.874814-08:00","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-nsb","title":"Doctor should exclude merge artifacts from 'multiple JSONL' warning","description":"Doctor command warns about 'multiple JSONL files' when .base.jsonl and .left.jsonl merge artifacts exist. These are expected during/after merge operations and should be excluded from the warning.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-28T17:27:36.988178-08:00","updated_at":"2025-11-28T18:36:52.087768-08:00","closed_at":"2025-11-28T17:41:50.700658-08:00"}
|
||
{"id":"bd-nszi","title":"Post-merge hook silently fails on JSONL conflicts, poor UX","description":"When git pull results in merge conflicts in .beads/issues.jsonl, the post-merge hook runs 'bd sync --import-only' which fails, but stderr was redirected to /dev/null. User only saw generic warning.\n\nFixed by capturing and displaying the actual error output, so users see 'Git conflict markers detected' message immediately.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-08T02:31:04.909925-08:00","updated_at":"2025-12-14T16:47:30.197443-08:00","closed_at":"2025-11-08T02:31:45.237286-08:00"}
|
||
{"id":"bd-nyt","title":"Update GetStatistics to report tombstone count separately","description":"Per bd-2m7 design: 'Should tombstones appear in bd stats? Recommendation: Yes, as separate counter: 5 deleted (tombstones)'\n\nCurrently GetStatistics counts tombstones in TotalIssues without distinguishing them.\n\nLocation: internal/storage/sqlite/events.go:114-121\n\nAdd to Statistics struct and query:\n- DeletedIssues (tombstone count)\n- Exclude tombstones from TotalIssues or document that it includes them","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-05T15:35:38.007301-08:00","updated_at":"2025-12-05T15:48:07.605518-08:00","closed_at":"2025-12-05T15:48:07.605518-08:00","dependencies":[{"issue_id":"bd-nyt","depends_on_id":"bd-vw8","type":"parent-child","created_at":"2025-12-05T15:35:47.297871-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-o2e","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\n- Only commits when explicitly requested or on session end\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-28T17:59:37.918686-08:00","updated_at":"2025-12-02T17:11:19.745620099-05:00","closed_at":"2025-11-28T23:09:06.171564-08:00"}
|
||
{"id":"bd-o43","title":"Add richer query capabilities to bd list","description":"**Summary:** Enhanced bd CLI issue list querying with advanced filtering capabilities across multiple data dimensions, eliminating dependency on external parsing tools. This provides native, flexible issue search functionality directly within the CLI.\n\n**Key Decisions:**\n- Implement query builder pattern\n- Support domain-specific language (DSL)\n- Preserve backward compatibility\n- Add JSON output for programmatic integration\n\n**Resolution:** Successfully extended IssueFilter with comprehensive querying features, significantly improving issue management efficiency through native advanced search support.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-05T00:17:48.677493-08:00","updated_at":"2025-12-14T16:45:36.453404-08:00","closed_at":"2025-11-05T00:33:38.998433-08:00"}
|
||
{"id":"bd-o4qy","title":"Improve CheckStaleness error handling","description":"## Problem\n\nCheckStaleness returns 'false' (not stale) for multiple error conditions instead of returning errors. This masks problems.\n\n**Location:** internal/autoimport/autoimport.go:253-285\n\n## Edge Cases That Return False\n\n1. **Invalid last_import_time format** (line 259-262)\n2. **No JSONL file found** (line 267-277) \n3. **JSONL stat fails** (line 279-282)\n\n## Fix\n\nReturn errors for abnormal conditions:\n\n```go\nlastImportTime, err := time.Parse(time.RFC3339, lastImportStr)\nif err != nil {\n return false, fmt.Errorf(\"corrupted last_import_time: %w\", err)\n}\n\nif jsonlPath == \"\" {\n return false, fmt.Errorf(\"no JSONL file found\")\n}\n\nstat, err := os.Stat(jsonlPath)\nif err != nil {\n return false, fmt.Errorf(\"cannot stat JSONL: %w\", err)\n}\n```\n\n## Impact\nMedium - edge cases are rare but should be handled\n\n## Effort \n30 minutes - requires updating callers in RPC server","status":"open","priority":2,"issue_type":"bug","created_at":"2025-11-20T20:17:27.606219-05:00","updated_at":"2025-11-20T20:17:27.606219-05:00","dependencies":[{"issue_id":"bd-o4qy","depends_on_id":"bd-2q6d","type":"blocks","created_at":"2025-11-20T20:18:26.81065-05:00","created_by":"stevey"}]}
|
||
{"id":"bd-o78","title":"Enhance `bd doctor` to verify Claude Code integration","description":"Add checks to `bd doctor` that verify Claude Code integration is properly set up when .claude/ directory or Claude environment is detected.","status":"open","priority":2,"issue_type":"task","created_at":"2025-11-11T23:30:05.782406-08:00","updated_at":"2025-11-12T00:12:07.717579-08:00","dependencies":[{"issue_id":"bd-o78","depends_on_id":"bd-rpn","type":"blocks","created_at":"2025-11-11T23:30:05.783234-08:00","created_by":"daemon"},{"issue_id":"bd-o78","depends_on_id":"bd-br8","type":"blocks","created_at":"2025-11-11T23:30:05.783647-08:00","created_by":"daemon"},{"issue_id":"bd-o78","depends_on_id":"bd-90v","type":"parent-child","created_at":"2025-11-11T23:31:27.886095-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-obxt","title":"Fix bd doctor to recommend issues.jsonl as canonical (not beads.jsonl)","description":"","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-21T23:27:02.008716-08:00","updated_at":"2025-11-21T23:44:06.081448-08:00","closed_at":"2025-11-21T23:44:06.081448-08:00"}
|
||
{"id":"bd-oif6","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-12-14T16:46:02.646321-08:00","closed_at":"2025-11-05T18:52:53.71713-08:00","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"}]}
|
||
{"id":"bd-okh","title":"Update bd compact to prune expired tombstones","description":"Modify compaction to identify and remove expired tombstones from issues.jsonl. Report count of removed tombstones. Per design bd-1r5.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-05T15:14:48.133062-08:00","updated_at":"2025-12-13T09:42:56.870704+11:00","closed_at":"2025-12-07T02:33:32.02985-08:00","dependencies":[{"issue_id":"bd-okh","depends_on_id":"bd-olt","type":"blocks","created_at":"2025-12-05T15:14:59.042761-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-ola6","title":"Implement transaction retry logic for SQLITE_BUSY","description":"BEGIN IMMEDIATE fails immediately on SQLITE_BUSY instead of retrying with exponential backoff.\n\nLocation: internal/storage/sqlite/sqlite.go:223-225\n\nProblem:\n- Under concurrent write load, BEGIN IMMEDIATE can fail with SQLITE_BUSY\n- Current implementation fails immediately instead of retrying\n- Results in spurious failures under normal concurrent usage\n\nSolution: Implement exponential backoff retry:\n- Retry up to N times (e.g., 5)\n- Backoff: 10ms, 20ms, 40ms, 80ms, 160ms\n- Check for context cancellation between retries\n- Only retry on SQLITE_BUSY/database locked errors\n\nImpact: Spurious failures under concurrent write load\n\nEffort: 3 hours","status":"open","priority":1,"issue_type":"feature","created_at":"2025-11-16T14:51:31.247147-08:00","updated_at":"2025-11-16T14:51:31.247147-08:00"}
|
||
{"id":"bd-olt","title":"Implement tombstone TTL and expiration logic","description":"Add IsExpired() method to tombstones, implement TTL config reading from config.yaml, add clock skew grace period. Per design bd-1r5.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-05T15:14:40.074707-08:00","updated_at":"2025-12-05T16:19:21.727851-08:00","closed_at":"2025-12-05T16:19:21.727851-08:00","dependencies":[{"issue_id":"bd-olt","depends_on_id":"bd-fbj","type":"blocks","created_at":"2025-12-05T15:14:58.744319-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-omx1","title":"Add `bd merge` command wrapping 3-way merge logic","description":"Implement CLI command to invoke beads-merge functionality.\n\n**Interface**:\n```bash\nbd merge \u003coutput\u003e \u003cbase\u003e \u003cleft\u003e \u003cright\u003e\nbd merge --debug \u003coutput\u003e \u003cbase\u003e \u003cleft\u003e \u003cright\u003e\n```\n\n**Behavior**:\n- Exit code 0 on clean merge\n- Exit code 1 if conflicts (write conflict markers)\n- Support --debug flag for verbose output\n- Match beads-merge's existing behavior\n\n**File**: `cmd/bd/merge.go`","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-05T18:42:20.427429-08:00","updated_at":"2025-12-14T16:46:04.683874-08:00","closed_at":"2025-11-05T19:01:29.071365-08:00","dependencies":[{"issue_id":"bd-omx1","depends_on_id":"bd-qqvw","type":"parent-child","created_at":"2025-11-05T18:42:28.709123-08:00","created_by":"daemon"},{"issue_id":"bd-omx1","depends_on_id":"bd-oif6","type":"blocks","created_at":"2025-11-05T18:42:35.436444-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-otf4","title":"Code Review: PR #481 - Context Engineering Optimizations","description":"Comprehensive code review of the merged context engineering PR (PR #481) that reduces MCP context usage by 80-90%.\n\n## Summary\nThe PR successfully implements lazy tool schema loading and minimal issue models to reduce context window usage. Overall implementation is solid and well-tested.\n\n## Positive Findings\n✅ Well-designed models (IssueMinimal, CompactedResult)\n✅ Comprehensive test coverage (28 tests, all passing)\n✅ Clear documentation and comments\n✅ Backward compatibility preserved (show() still returns full Issue)\n✅ Sensible defaults (COMPACTION_THRESHOLD=20, PREVIEW_COUNT=5)\n✅ Tool catalog complete with all 15 tools documented\n\n## Issues Identified\nSee linked issues for specific followup tasks.\n\n## Context Engineering Architecture\n- discover_tools(): List tool names only (~500 bytes vs ~15KB)\n- get_tool_info(name): Get specific tool details on-demand\n- IssueMinimal: Lightweight model for list views (~80 bytes vs ~400 bytes)\n- CompactedResult: Auto-compacts results with \u003e20 issues\n- _to_minimal(): Conversion function (efficient, no N+1 issues)","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-14T14:24:13.523532-08:00","updated_at":"2025-12-14T14:24:13.523532-08:00"}
|
||
{"id":"bd-ov1","title":"Doctor: exclude merge artifacts from 'multiple JSONL' warning","description":"## Problem\n`bd doctor` warns about 'Multiple JSONL files found' when merge artifact files exist:\n```\nJSONL Files: Multiple JSONL files found: beads.base.jsonl, beads.left.jsonl, issues.jsonl ⚠\n```\n\nThis is confusing because these aren't real issue JSONL files - they're temporary snapshots for deletion tracking.\n\n## Fix\nExclude known merge artifact patterns from the multiple-JSONL warning:\n\n```go\n// In doctor JSONL check\nskipPatterns := map[string]bool{\n \"beads.base.jsonl\": true,\n \"beads.left.jsonl\": true, \n \"beads.right.jsonl\": true,\n}\n```\n\n## Files\n- cmd/bd/doctor/ (JSONL check logic)","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-28T17:06:26.266097-08:00","updated_at":"2025-12-02T17:11:19.747094858-05:00","closed_at":"2025-11-28T21:52:13.632029-08:00"}
|
||
{"id":"bd-p0zr","title":"bd message: Improve type safety with typed parameter structs","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-08T12:54:29.675678-08:00","updated_at":"2025-12-14T16:47:37.660573-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-p65x","title":"Latency test 1","description":"","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-08T00:04:38.815725-08:00","updated_at":"2025-12-14T16:47:11.824248-08:00","closed_at":"2025-11-08T00:06:46.198388-08:00"}
|
||
{"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-12-14T16:46:05.482377-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-pdjb","title":"Testing \u0026 Validation","description":"**Summary:** Completed comprehensive testing for Agent Mail system, focusing on multi-agent coordination, reliability, and edge case handling across 66 tests spanning unit and integration scenarios.\n\n**Key Decisions:**\n- Prioritized collision prevention and graceful degradation\n- Tested critical coordination scenarios (fairness, notifications, handoffs)\n- Deliberately scoped testing to most critical path\n\n**Resolution:** All tests passed, validating Agent Mail's robustness in multi-agent environments with high confidence in system reliability and interaction patterns.","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-07T22:43:00.457985-08:00","updated_at":"2025-12-14T16:47:32.975253-08:00","closed_at":"2025-11-08T02:47:34.153586-08:00","dependencies":[{"issue_id":"bd-pdjb","depends_on_id":"bd-wfmw","type":"blocks","created_at":"2025-11-07T22:43:00.459403-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-pdr2","title":"Consider backwards compatibility for ready() and list() return type change","description":"PR #481 changed the return types of `ready()` and `list()` from `list[Issue]` to `list[IssueMinimal] | CompactedResult`. This is a breaking change for MCP clients.\n\n## Impact Assessment\nBreaking change affects:\n- Any MCP client expecting `list[Issue]` from ready()\n- Any MCP client expecting `list[Issue]` from list()\n- Client code that accesses full Issue fields (description, design, acceptance_criteria, timestamps, dependencies, dependents)\n\n## Current Behavior\n- ready() returns `list[IssueMinimal] | CompactedResult`\n- list() returns `list[IssueMinimal] | CompactedResult`\n- show() still returns full `Issue` (good)\n\n## Considerations\n**Pros of current approach:**\n- Forces clients to use show() for full details (good for context efficiency)\n- Simple mental model (always use show for full data)\n- Documentation warns about this\n\n**Cons:**\n- Clients expecting list[Issue] will break\n- No graceful degradation option\n- No migration period\n\n## Potential Solutions\n1. Add optional parameter `full_details=false` to ready/list (would increase payload)\n2. Create separate tools: ready_minimal/list_minimal + ready_full/list_full\n3. Accept breaking change and document upgrade path (current approach)\n4. Version the MCP server and document migration guide\n\n## Recommendation\nCurrent approach (solution 3) is reasonable if:\n- Changelog clearly documents the breaking change\n- Migration guide provided to clients\n- Error handling is graceful for clients expecting specific fields","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-14T14:24:56.460465-08:00","updated_at":"2025-12-14T14:24:56.460465-08:00","dependencies":[{"issue_id":"bd-pdr2","depends_on_id":"bd-otf4","type":"discovered-from","created_at":"2025-12-14T14:24:56.461959-08:00","created_by":"stevey"}]}
|
||
{"id":"bd-pdwz","title":"Add t.Parallel() to slow hash multiclone tests","description":"Add t.Parallel() to TestHashIDs_MultiCloneConverge and TestHashIDs_IdenticalContentDedup so they run concurrently.\n\nExpected savings: ~10 seconds (from 20s to ~11s)\n\nImplementation:\n- Add t.Parallel() call at start of each test function\n- Verify tests don't share resources that would cause conflicts\n- Run tests to confirm they work in parallel\n\nFile: beads_hash_multiclone_test.go:34, :101","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-04T01:24:15.705228-08:00","updated_at":"2025-12-14T16:45:13.385486-08:00","closed_at":"2025-11-04T09:52:31.945545-08:00","dependencies":[{"issue_id":"bd-pdwz","depends_on_id":"bd-l5gq","type":"blocks","created_at":"2025-11-04T01:24:15.706149-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-pg1","title":"[CRITICAL] Sync validation false positive - legitimate deletions trigger 'data loss detected'","description":"Sync preflight validation incorrectly detects 'data loss' when legitimate deletions occur. This blocks all syncs and is the highest priority fix.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-28T17:27:42.179281-08:00","updated_at":"2025-11-28T18:36:52.088427-08:00","closed_at":"2025-11-28T17:42:49.92251-08:00"}
|
||
{"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-12-14T16:47:09.127857-08:00","closed_at":"2025-11-08T00:06:01.816892-08:00","dependencies":[{"issue_id":"bd-pmuu","depends_on_id":"bd-spmx","type":"parent-child","created_at":"2025-11-08T00:02:47.93119-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-poh9","title":"Complete and commit beads-mcp type safety improvements","description":"Uncommitted type safety work in beads-mcp needs review and completion","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-20T19:23:32.8516-05:00","updated_at":"2025-11-20T19:27:00.88849-05:00","closed_at":"2025-11-20T19:27:00.88849-05:00"}
|
||
{"id":"bd-q13h","title":"Makefile Integration for Benchmarks","description":"**Summary:** Implemented a 'bench' Makefile target to streamline performance benchmarking for SQLite storage module, enabling quick and consistent performance profiling with minimal configuration overhead.\n\n**Key Decisions:**\n- Use go test with -bench flag\n- Generate CPU and memory profiles\n- Set 3-second benchmark runtime\n- Include specialized bench build tag\n\n**Resolution:** Created a standardized, one-command benchmark process that simplifies performance measurement and facilitates easy profile visualization for the storage subsystem.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-13T22:23:25.922916-08:00","updated_at":"2025-12-14T16:47:55.185105-08:00","closed_at":"2025-11-14T08:55:17.620824-08:00","dependencies":[{"issue_id":"bd-q13h","depends_on_id":"bd-zj8e","type":"blocks","created_at":"2025-11-13T22:24:06.371947-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-q2ri","title":"bd-hv01: Add comprehensive edge case tests for deletion tracking","description":"Need to add tests for: corrupted snapshot file, stale snapshot (\u003e 1 hour), concurrent sync operations (daemon + manual), partial deletion failure, empty remote JSONL, multi-repo mode with deletions, git worktree scenario.\n\nAlso refine TestDeletionWithLocalModification to check for specific conflict error instead of accepting any error.\n\nFiles: cmd/bd/deletion_tracking_test.go","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-06T18:16:26.849881-08:00","updated_at":"2025-12-14T16:46:36.16474-08:00","closed_at":"2025-11-06T19:55:39.700695-08:00","dependencies":[{"issue_id":"bd-q2ri","depends_on_id":"bd-rbxi","type":"parent-child","created_at":"2025-11-06T18:19:15.104113-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-q59i","title":"User Diagnostics (bd doctor --perf)","description":"**Summary:** Added performance diagnostics flag (--perf) to bd doctor command to help users understand system and database performance. The new feature collects system information, times key operations, and generates a CPU profile automatically.\n\n**Key Decisions:** \n- Use runtime/pprof for CPU profiling\n- Collect system metadata (OS, arch, versions)\n- Measure performance of core BD operations\n- Generate timestamped profile without modifying user data\n\n**Resolution:** Successfully implemented lightweight performance diagnostic tool that provides users with quick insights into their Beads CLI performance and system characteristics.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-13T22:23:11.988562-08:00","updated_at":"2025-12-14T16:47:53.440425-08:00","closed_at":"2025-11-13T22:45:57.26294-08:00","dependencies":[{"issue_id":"bd-q59i","depends_on_id":"bd-zj8e","type":"blocks","created_at":"2025-11-13T22:24:06.336236-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-q652","title":"Database pollution in ~/src/dave/vc: 895 issues vs canonical 310","description":"**Summary:** Investigated discrepancy between two Beads databases with conflicting issue counts, revealing potential cross-repository pollution and data inconsistency in version control tracking.\n\n**Key Decisions:**\n- Use detect-pollution script to identify mismatched issues\n- Compare issue IDs across databases\n- Verify source_repo and issue metadata\n\n**Resolution:** Ongoing investigation with initial findings suggesting partial database cleanup, but root cause of pollution remains unresolved and requires further forensic analysis.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-07T00:07:37.999168-08:00","updated_at":"2025-12-14T16:46:39.854192-08:00","closed_at":"2025-11-07T00:13:32.179396-08:00"}
|
||
{"id":"bd-qhws","title":"Configure database connection pool limits for daemon mode","description":"Database connection pool not configured for file-based databases when running in daemon mode.\n\nLocation: internal/storage/sqlite/sqlite.go:108-116\n\nProblem:\n- Daemon is a long-running server handling concurrent RPC requests\n- Multiple CLI commands hit same daemon simultaneously \n- Go default: unlimited connections (MaxOpenConns=0)\n- SQLite IMMEDIATE transactions serialize on write lock\n- Can have 100+ goroutines blocked waiting, each holding connection\n- Results in connection exhaustion and 'database is locked' errors\n\nCurrent code only limits in-memory DBs:\nif isInMemory {\n db.SetMaxOpenConns(1)\n db.SetMaxIdleConns(1)\n}\n// File DBs: UNLIMITED connections!\n\nFix:\nif !isInMemory {\n maxConns := runtime.NumCPU() + 1 // 1 writer + N readers\n db.SetMaxOpenConns(maxConns)\n db.SetMaxIdleConns(2)\n db.SetConnMaxLifetime(0)\n}\n\nImpact: 'database is locked' errors under concurrent load in daemon mode\n\nNote: NOT an issue for direct CLI usage (each process isolated). Only affects daemon mode where multiple CLI commands share one database pool.\n\nEffort: 1 hour","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-16T14:51:24.579345-08:00","updated_at":"2025-11-16T15:04:00.450911-08:00","closed_at":"2025-11-16T15:04:00.450911-08:00"}
|
||
{"id":"bd-qn5","title":"bd doctor: handle missing daemon registry gracefully","description":"When no daemon has ever been started, bd doctor shows an error parsing the registry: 'failed to parse registry: invalid character 0 after top-level value'. The doctor should handle the case where ~/.bd/daemon/registry.json doesn't exist, treating it as 'no daemon running' rather than an error.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-02T12:51:56.300983-08:00","updated_at":"2025-12-07T01:24:31.627469-08:00","closed_at":"2025-12-07T01:24:31.627469-08:00"}
|
||
{"id":"bd-qq2i","title":"Add 'bd message send' command for Agent Mail messaging","description":"**Summary:** Added messaging capabilities to bd CLI for inter-agent communication through Agent Mail server, enabling direct messaging, inbox management, and conversation tracking across development workspaces.\n\n**Key Decisions:**\n- Implement 4 core commands: send, inbox, read, acknowledge\n- Use JSON-RPC over HTTP for communication\n- Support configuration via environment variables\n- Provide JSON output for programmatic use\n\n**Resolution:** New messaging feature integrates seamlessly with existing bd CLI, improving collaboration and communication workflows for development teams across multiple channels and projects.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-08T12:44:03.547806-08:00","updated_at":"2025-12-14T16:47:35.568445-08:00","closed_at":"2025-11-08T12:49:02.436927-08:00"}
|
||
{"id":"bd-qqvw","title":"Vendor and integrate beads-merge tool","description":"**Summary:** Integrated beads-merge tool into bd to solve complex workspace synchronization challenges, specifically addressing Git merge difficulties with JSONL files across multiple workspaces.\n\n**Key Decisions:** \n- Vendor Go code with attribution\n- Implement 3-way intelligent merge resolution\n- Create custom merge command and driver\n\n**Resolution:** Enhanced workspace synchronization with robust merge capabilities that prevent unintended file deletions and improve dependency management.","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-05T18:41:59.500359-08:00","updated_at":"2025-12-14T16:46:09.260373-08:00","closed_at":"2025-11-06T15:40:24.796921-08:00"}
|
||
{"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-12-14T16:46:08.706441-08:00","closed_at":"2025-11-06T11:03:16.975041-08:00"}
|
||
{"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-qvj","title":"Jira import/export integration","description":"Add ability to import issues from Jira and export beads issues to Jira. See GitHub discussion #430 for user request.\n\n**Background**: User @kaihendry configured jira.* settings but found bd sync doesn't sync with Jira - only with git. The config namespace exists but the integration doesn't.\n\n**Existing infrastructure**:\n- external_ref field for linking to external systems\n- Import logic matches by external_ref first (priority over ID matching)\n- Config namespace jira.* documented in CONFIG.md\n- GitHub import example (examples/github-import/gh2jsonl.py) provides pattern\n\n**Schema mapping challenges**:\n- Jira workflows are highly customizable (status mapping)\n- Jira has more field types (components, versions, custom fields)\n- Two-way sync needs conflict resolution\n- Jira Cloud vs Server/Data Center have different APIs\n\n**Approach**: Phased implementation starting with import, then export, then bidirectional sync.","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-11-30T12:55:44.835009-08:00","updated_at":"2025-12-01T21:00:20.193271-08:00","closed_at":"2025-12-01T10:44:53.454483-08:00"}
|
||
{"id":"bd-r1pf","title":"Test label","description":"","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-06T20:16:20.609492-08:00","updated_at":"2025-12-14T16:46:37.580251-08:00","closed_at":"2025-11-06T20:16:34.973855-08:00"}
|
||
{"id":"bd-r46","title":"Support --reason flag in daemon mode for reopen command","description":"The reopen.go command has a TODO at line 61 to add reason as a comment once RPC supports AddComment. Currently --reason flag is ignored in daemon mode with a warning.","status":"open","priority":2,"issue_type":"feature","created_at":"2025-11-21T18:55:10.773626-05:00","updated_at":"2025-11-21T18:55:10.773626-05:00"}
|
||
{"id":"bd-r4od","title":"Parameterize SQLite busy_timeout in store.go","description":"Modify sqlite.New() to accept configurable busy_timeout.\n\n## Current State\n`internal/storage/sqlite/store.go` hardcodes:\n```go\nconnStr = \"file:\" + path + \"?_pragma=foreign_keys(ON)\u0026_pragma=busy_timeout(30000)\u0026...\"\n```\n\n## Implementation Options\n\n### Option A: Add timeout parameter to New()\n```go\nfunc New(ctx context.Context, path string, busyTimeout time.Duration) (*SQLiteStorage, error)\n```\nPro: Simple, explicit\nCon: Changes function signature (breaking change for callers)\n\n### Option B: Options struct pattern\n```go\ntype Options struct {\n BusyTimeout time.Duration // default 30s\n}\nfunc New(ctx context.Context, path string, opts *Options) (*SQLiteStorage, error)\n```\nPro: Extensible, nil means defaults\nCon: More boilerplate\n\n### Recommendation: Option A with default\n```go\nfunc New(ctx context.Context, path string) (*SQLiteStorage, error) {\n return NewWithOptions(ctx, path, 30*time.Second)\n}\n\nfunc NewWithOptions(ctx context.Context, path string, busyTimeout time.Duration) (*SQLiteStorage, error)\n```\n\n## Acceptance Criteria\n- busy_timeout is parameterized in connection string\n- 0 timeout means no waiting (immediate SQLITE_BUSY)\n- All existing callers continue to work (via default wrapper)\n\nPart of bd-olc1","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-13T17:54:46.896222-08:00","updated_at":"2025-12-13T18:05:19.443831-08:00","closed_at":"2025-12-13T18:05:19.443831-08:00","dependencies":[{"issue_id":"bd-r4od","depends_on_id":"bd-59er","type":"blocks","created_at":"2025-12-13T17:55:26.550018-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-r6k2","title":"Fragile no-db detection uses strings.Contains instead of YAML parsing","description":"Two locations use `strings.Contains(string(configData), \"no-db: true\")` to detect JSONL-only mode:\n\n1. **cmd/bd/main.go:310** - Auto-enabling no-db mode\n2. **cmd/bd/doctor.go:863** - Database status check\n\nThis is fragile because it could match:\n- Comments: `# no-db: true for testing`\n- Nested keys: `settings:\\n no-db: true`\n- String values: `note: \"set no-db: true to disable\"`\n\nShould use proper YAML parsing like we did for sync-branch in bd-0rh:\n\n```go\ntype noDbConfig struct {\n NoDb bool `yaml:\"no-db\"`\n}\n\nvar cfg noDbConfig\nif err := yaml.Unmarshal(configData, \u0026cfg); err == nil {\n isNoDbMode = cfg.NoDb\n}\n```\n\nRelated: bd-0rh (fixed similar issue for sync-branch)","status":"closed","priority":3,"issue_type":"bug","created_at":"2025-12-07T02:03:12.120296-08:00","updated_at":"2025-12-07T02:09:30.628372-08:00","closed_at":"2025-12-07T02:09:30.628372-08:00","dependencies":[{"issue_id":"bd-r6k2","depends_on_id":"bd-0rh","type":"discovered-from","created_at":"2025-12-07T02:03:50.599423-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-r79z","title":"GH#245: Windows MCP subprocess timeout for git rev-parse","description":"**Summary:** Git repository detection was failing intermittently on Windows MCP server with subprocess timeout, despite CLI functionality working correctly. Investigation revealed potential runtime environment or subprocess execution method issues.\n\n**Key Decisions:**\n- Test subprocess with shell=True on Windows\n- Implement configurable timeout handling\n- Add enhanced error logging for subprocess execution\n\n**Resolution:** Resolved by adding more robust git detection mechanism with Windows-specific subprocess handling, improving cross-platform git repository resolution reliability.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-07T16:31:37.531223-08:00","updated_at":"2025-12-14T16:46:49.161891-08:00","closed_at":"2025-11-07T19:00:44.358543-08:00"}
|
||
{"id":"bd-r9iq","title":"purgeDeletedIssues still writes to deletions.jsonl during git-history-backfill","description":"In purgeDeletedIssues (lines 929-939), when a deletion is recovered from git history, we:\n1. Append to deletions.jsonl (backfill)\n2. Create a tombstone in DB\n\nWith the tombstone approach, writing to deletions.jsonl is redundant since the tombstone will be exported to JSONL. Consider removing the deletions.jsonl backfill once we're confident in the tombstone approach.\n\nThis is related to the Phase 2 migration (bd-vw8) - we should stop writing to deletions.jsonl entirely.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-07T01:40:42.581876-08:00","updated_at":"2025-12-07T01:40:42.581876-08:00","dependencies":[{"issue_id":"bd-r9iq","depends_on_id":"bd-dve","type":"blocks","created_at":"2025-12-07T01:41:28.285457-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-rb75","title":"Clean up merge conflict artifacts in .beads directory","description":"**Summary:** Merge conflict artifacts in .beads directory were creating untracked files after resolution. Multiple cleanup strategies were evaluated to prevent file clutter and improve version control management.\n\n**Key Decisions:** \n- Auto-add *.base.jsonl and *.left.jsonl to .beads/.gitignore\n- Implement optional automatic cleanup during import process\n\n**Resolution:** Merge artifact management will be handled automatically during 'bd init' to prevent unnecessary file tracking and improve system cleanliness.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-06T19:09:16.114274-08:00","updated_at":"2025-12-14T16:46:19.892969-08:00","closed_at":"2025-11-06T19:13:44.630402-08:00"}
|
||
{"id":"bd-rbxi","title":"bd-hv01: Deletion tracking production readiness","description":"**Summary:** Resolved critical production readiness issues for deletion tracking implementation, focusing on improving core merge algorithm's reliability and handling of complex edge cases in snapshot operations.\n\n**Key Decisions:**\n- Fix non-atomic snapshot operations\n- Improve error handling and detection of partial failures\n- Address race conditions in concurrent scenarios\n\n**Resolution:** Successfully stabilized deletion tracking mechanism, preparing it for safe production deployment with enhanced robustness and error management.","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-06T18:18:24.315646-08:00","updated_at":"2025-12-14T16:47:27.06008-08:00","closed_at":"2025-11-08T02:19:19.780741-08:00"}
|
||
{"id":"bd-rfj","title":"Add unit tests for hasJSONLChanged() function","description":"The hasJSONLChanged() function has no unit tests. Should test:\n- Normal case: hash matches\n- Normal case: hash differs\n- Edge case: empty file\n- Edge case: missing metadata (first run)\n- Edge case: corrupted metadata\n- Edge case: file read errors\n- Edge case: invalid hash format in metadata\n\nAlso add performance benchmarks for large JSONL files.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-20T21:31:10.389481-05:00","updated_at":"2025-11-20T21:40:02.664516-05:00","closed_at":"2025-11-20T21:40:02.664516-05:00","dependencies":[{"issue_id":"bd-rfj","depends_on_id":"bd-khnb","type":"blocks","created_at":"2025-11-20T21:31:10.39058-05:00","created_by":"daemon"}]}
|
||
{"id":"bd-ri6d","title":"bd message: Fix inefficient client-side filtering for --unread-only","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-08T12:54:28.614867-08:00","updated_at":"2025-12-14T16:47:37.122135-08:00","closed_at":"2025-11-08T12:58:59.551512-08:00","dependencies":[{"issue_id":"bd-ri6d","depends_on_id":"bd-6uix","type":"parent-child","created_at":"2025-11-08T12:55:55.012455-08:00","created_by":"daemon"}]}
|
||
{"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-rtp","title":"Implement signal-aware context in CLI commands","description":"Replace context.Background() with signal.NotifyContext() to enable graceful cancellation.\n\n## Context\nPart of context propagation work (bd-350). Phase 1 infrastructure is complete - sqlite.New() now accepts context parameter.\n\n## Implementation\nSet up signal-aware context at the CLI entry points:\n\n```go\nctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)\ndefer cancel()\n```\n\n## Key Locations\n- cmd/bd/main.go:438 (marked with TODO(bd-350))\n- cmd/bd/daemon.go:317 (marked with TODO(bd-350))\n- Other command entry points\n\n## Benefits\n- Ctrl+C cancels ongoing database operations\n- Graceful shutdown on SIGTERM\n- Better user experience during long operations\n\n## Acceptance Criteria\n- [ ] Ctrl+C during import cancels operation cleanly\n- [ ] Ctrl+C during export cancels operation cleanly\n- [ ] No database corruption on cancellation\n- [ ] Proper cleanup on signal (defers execute)","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-11-20T21:26:34.621983-05:00","updated_at":"2025-11-20T21:32:26.288303-05:00","closed_at":"2025-11-20T21:32:26.288303-05:00"}
|
||
{"id":"bd-ry1u","title":"Publish official devcontainer configuration","description":"","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-12-14T16:46:00.291275-08:00","closed_at":"2025-11-05T17:46:42.70998-08:00"}
|
||
{"id":"bd-s02","title":"Manual task","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-03T20:15:10.022202-08:00","updated_at":"2025-12-14T00:32:11.047349-08:00","closed_at":"2025-12-13T23:29:56.877597-08:00"}
|
||
{"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-s1xn","title":"bd message: Refactor duplicated error messages","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-08T12:54:27.624981-08:00","updated_at":"2025-12-14T16:47:36.27179-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":"open","priority":3,"issue_type":"task","created_at":"2025-12-08T06:46:37.529160416-07:00","updated_at":"2025-12-08T06:46:37.529160416-07:00"}
|
||
{"id":"bd-s3v","title":"Add tombstone doctor checks","description":"Add bd doctor checks for: unmigrated deletions.jsonl, stale deletions.jsonl in Phase 3, tombstones expiring soon. Per design bd-dli.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-05T15:14:46.733558-08:00","updated_at":"2025-12-13T20:50:30.081721-08:00","closed_at":"2025-12-13T10:15:38.981577-08:00","dependencies":[{"issue_id":"bd-s3v","depends_on_id":"bd-8f9","type":"blocks","created_at":"2025-12-05T15:14:59.006029-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-saa","title":"Add index on deleted_at for TTL queries","description":"Per bd-2m7 design: 'Index for efficient tombstone filtering' was recommended. The current implementation does NOT add an index on deleted_at.\n\nFor TTL cleanup queries like 'SELECT * FROM issues WHERE deleted_at \u003c datetime(now, -30 days)', this will require a full table scan.\n\nAdd to migration or new migration:\nCREATE INDEX IF NOT EXISTS idx_issues_deleted_at ON issues(deleted_at) WHERE deleted_at IS NOT NULL","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-05T15:35:33.842664-08:00","updated_at":"2025-12-05T15:48:07.584268-08:00","closed_at":"2025-12-05T15:48:07.584268-08:00","dependencies":[{"issue_id":"bd-saa","depends_on_id":"bd-vw8","type":"parent-child","created_at":"2025-12-05T15:35:47.222711-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-sc57","title":"Production Readiness (Optional)","description":"Enable multi-machine deployments with containerization and monitoring.","status":"closed","priority":3,"issue_type":"epic","created_at":"2025-11-07T22:43:31.527617-08:00","updated_at":"2025-12-14T16:47:20.775723-08:00","closed_at":"2025-11-08T01:06:12.904671-08:00","dependencies":[{"issue_id":"bd-sc57","depends_on_id":"bd-wfmw","type":"blocks","created_at":"2025-11-07T22:43:31.528743-08:00","created_by":"daemon"},{"issue_id":"bd-sc57","depends_on_id":"bd-pdjb","type":"blocks","created_at":"2025-11-07T22:43:31.529193-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-sh4c","title":"Improve test coverage for cmd/bd/setup (28.4% → 50%)","description":"The setup package has only 28.4% test coverage. Setup commands are critical for first-time user experience.\n\nCurrent coverage: 28.4%\nTarget coverage: 50%","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-13T20:43:04.409346-08:00","updated_at":"2025-12-13T21:01:18.98833-08:00"}
|
||
{"id":"bd-sjmr","title":"Fix inconsistent error handling in multi-repo deletion tracking","description":"**Summary:** Identified critical error handling vulnerabilities in multi-repo deletion tracking that could cause partial, irreversible system state changes during synchronization processes.\n\n**Key Decisions:**\n- Two-phase commit approach\n- Pre-mutation repository validation\n- Standardized error handling across operations\n\n**Resolution:** Implemented fail-safe validation mechanism to prevent unintended partial repository modifications and ensure transactional integrity.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-06T19:31:29.538092-08:00","updated_at":"2025-12-14T16:46:28.281404-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-spmx","title":"Investigation \u0026 Proof of Concept","description":"**Summary:** Completed Proof of Concept (POC) for MCP Agent Mail to validate technical feasibility and performance benefits across multiple test environments, verifying core system capabilities.\n\n**Key Decisions:** \n- Implement exclusive file reservation mechanism\n- Benchmark latency improvements\n- Create architectural decision record (ADR 002)\n\n**Resolution:** POC successfully demonstrated Agent Mail's potential with significant latency reduction and lightweight deployment, clearing path for integration layer implementation.","status":"closed","priority":0,"issue_type":"epic","created_at":"2025-11-07T22:41:37.13757-08:00","updated_at":"2025-12-14T16:47:10.090675-08:00","closed_at":"2025-11-08T00:06:20.731732-08:00"}
|
||
{"id":"bd-srwk","title":"bd export should detect and prevent stale database exports","description":"**Summary:** The bd export command was vulnerable to silent data loss when exporting from a stale database, potentially overwriting existing issue tracking data. A new staleness detection mechanism was implemented to prevent unintended data corruption during exports.\n\n**Key Decisions:** \n- Compare database and JSONL timestamps\n- Add mandatory freshness check before export\n- Require explicit --force flag to override\n- Detect staleness by comparing issue IDs\n\n**Resolution:** The export process now prevents accidental data loss by validating database freshness and requiring user confirmation when working with potentially outdated information, improving data integrity in multi-agent workflows.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-07T19:39:24.172154-08:00","updated_at":"2025-12-14T16:46:50.716859-08:00","closed_at":"2025-11-07T19:58:43.300177-08:00"}
|
||
{"id":"bd-t3b","title":"Add test coverage for internal/config package","description":"","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-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":"open","priority":1,"issue_type":"task","created_at":"2025-11-20T18:56:12.498187-05:00","updated_at":"2025-11-20T18:56:12.498187-05:00"}
|
||
{"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"}]}
|
||
{"id":"bd-tbz3","title":"bd init UX Improvements","description":"bd init leaves users with incomplete setup, requiring manual bd doctor --fix. Issues found: (1) git hooks not installed if user declines prompt, (2) no auto-migration when CLI is upgraded, (3) stale merge driver configs from old versions. Fix by making bd init more robust with better defaults and auto-migration.","status":"open","priority":1,"issue_type":"epic","created_at":"2025-11-21T23:16:00.333543-08:00","updated_at":"2025-11-21T23:16:37.811233-08:00"}
|
||
{"id":"bd-thgk","title":"Improve test coverage for internal/compact (18.2% → 70%)","description":"The compact package has only 18.2% test coverage. This is a core package handling issue compaction and should have at least 70% coverage.\n\nKey functions needing tests:\n- runCompactSingle (0%)\n- runCompactAll (0%)\n- runCompactRPC (0%)\n- runCompactStatsRPC (0%)\n- runCompactAnalyze (0%)\n- runCompactApply (0%)\n- pruneDeletionsManifest (0%)\n\nCurrent coverage: 18.2%\nTarget coverage: 70%","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-13T20:42:58.455767-08:00","updated_at":"2025-12-13T21:01:15.070551-08:00"}
|
||
{"id":"bd-tjn","title":"Jira import script (jira2jsonl.py)","description":"Create a Python script to import Jira issues into beads JSONL format.\n\n**Pattern**: Follow examples/github-import/gh2jsonl.py\n\n**Features needed**:\n- Fetch issues via Jira REST API with JQL queries\n- Pagination handling (100 issues per request)\n- Map Jira fields to beads fields (see schema mapping in epic)\n- Set external_ref to Jira issue URL for re-sync\n- Support both Jira Cloud and Server/Data Center APIs\n- Read config from bd config (jira.url, jira.project, jira.api_token)\n\n**Config-driven mapping**:\n- jira.status_map.* for status conversion\n- jira.type_map.* for issue type conversion\n- jira.priority_map.* for priority conversion\n\n**Usage**:\n```bash\npython jira2jsonl.py --project PROJ | bd import\n# or\npython jira2jsonl.py --jql 'project=PROJ AND status\\!=Done' | bd import\n```\n\n**Output**: JSONL with external_ref set to Jira issue URL","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-30T12:55:59.517985-08:00","updated_at":"2025-11-30T15:11:56.692594-08:00","closed_at":"2025-11-30T15:11:56.692594-08:00","dependencies":[{"issue_id":"bd-tjn","depends_on_id":"bd-qvj","type":"parent-child","created_at":"2025-11-30T12:56:39.507643-08:00","created_by":"stevey"}]}
|
||
{"id":"bd-tmdx","title":"Investigate database pollution - unexpected issue count increases","description":"**Summary:** Investigated unexpected issue count discrepancies in two repositories, suspecting database pollution across different project locations.\n\n**Key Decisions:** \n- Use bd detect-pollution diagnostic tool\n- Trace potential contamination sources\n- Develop strategy for database cleanup and prevention\n\n**Resolution:** Successfully identified and mitigated cross-repository issue pollution, establishing safeguards to prevent future database contamination.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-06T22:50:16.957689-08:00","updated_at":"2025-12-14T16:46:39.479575-08:00","closed_at":"2025-11-07T00:05:38.994405-08:00"}
|
||
{"id":"bd-tne","title":"Add Claude setup tip with dynamic priority","description":"Add a predefined tip that suggests running `bd setup claude` when Claude Code is detected but not configured. This tip should have higher priority (shown more frequently) until the setup is complete.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-11T23:29:29.871324-08:00","updated_at":"2025-12-09T18:38:37.705574372-05:00","closed_at":"2025-11-25T17:52:35.044989-08:00","dependencies":[{"issue_id":"bd-tne","depends_on_id":"bd-d4i","type":"blocks","created_at":"2025-11-11T23:29:29.872081-08:00","created_by":"daemon"},{"issue_id":"bd-tne","depends_on_id":"bd-br8","type":"blocks","created_at":"2025-11-11T23:29:29.87252-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-tnsq","title":"bd cleanup fails with CHECK constraint on status/closed_at mismatch","description":"## Problem\n\nRunning bd cleanup --force fails with:\n\nError: failed to create tombstone for bd-okh: sqlite3: constraint failed: CHECK constraint failed: (status = 'closed') = (closed_at IS NOT NULL)\n\n## Root Cause\n\nThe database has a CHECK constraint ensuring closed issues have closed_at set and non-closed issues do not. When bd cleanup tries to convert a closed issue to a tombstone, this constraint fails.\n\n## Impact\n\n- bd cleanup --force cannot complete\n- 722 closed issues cannot be cleaned up\n- Blocks routine maintenance\n\n## Investigation Needed\n\n1. Check the bd-okh record in the database\n2. Determine if this is data corruption or a bug in tombstone creation\n\n## Proposed Solutions\n\n1. If data corruption: Add a bd doctor --fix check that repairs status/closed_at mismatches\n2. If code bug: Fix the tombstone creation to properly handle the constraint\n\n## Files to Investigate\n\n- internal/storage/sqlite/sqlite.go - DeleteIssue / tombstone creation\n- Schema CHECK constraint definition\n\n## Acceptance Criteria\n\n- Identify root cause (data vs code bug)\n- bd cleanup --force completes successfully\n- bd doctor detects status/closed_at mismatches","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-14T00:27:46.359724-08:00","updated_at":"2025-12-14T00:41:54.584366-08:00","closed_at":"2025-12-14T00:34:59.658781-08:00"}
|
||
{"id":"bd-tok","title":"Upgrade notification persists after running suggested commands","description":"The upgrade notification kept showing even after running 'bd upgrade review' and 'bd doctor' as suggested.\n\nExpected: Notification should be dismissed after running either/both commands\nActual: Notification persisted on every bd command\n\nInvestigation findings:\n- metadata.json correctly shows last_bd_version=0.28.0\n- The notification stopped appearing after a few more invocations\n- May be related to daemon caching or a race condition\n- The 'upgradeAcknowledged' flag in version_tracking.go:115 only persists per-session (in-memory)\n\nPossible causes:\n1. Daemon vs direct mode inconsistency - daemon may have stale version info\n2. The version is checked/updated before daemon connection, but daemon has cached state\n3. Race between trackBdVersion() and daemon startup\n\nStatus: May have resolved itself, but root cause unclear. Close if no longer reproducible.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-02T23:23:04.652453-08:00","updated_at":"2025-12-02T23:38:09.310731-08:00","closed_at":"2025-12-02T23:38:09.310731-08:00"}
|
||
{"id":"bd-tqo","title":"deletions.jsonl gets corrupted with full issue objects instead of deletion records","description":"## Bug Description\n\nThe deletions.jsonl file was found to contain full issue objects (like issues.jsonl) instead of deletion records.\n\n### Expected Format (DeletionRecord)\n```json\n{\"id\":\"bd-xxx\",\"timestamp\":\"2025-...\",\"actor\":\"user\",\"reason\":\"deleted\"}\n```\n\n### Actual Content Found\n```json\n{\"id\":\"bd-03r\",\"title\":\"Document deletions manifest...\",\"description\":\"...\",\"status\":\"closed\",...}\n```\n\n## Impact\n- bd sync sanitization step reads deletions.jsonl and removes any matching IDs from issues.jsonl\n- With 60 full issue objects in deletions.jsonl, ALL 60 issues were incorrectly removed during sync\n- This caused complete data loss of the issue database\n\n## Root Cause (suspected)\nSomething wrote issues.jsonl content to deletions.jsonl. Possible causes:\n- Export writing to wrong file\n- File path confusion during sync\n- Race condition between export and deletion tracking\n\n## Related Issues\n- bd-0b2: --no-git-history flag (just fixed)\n- bd-4pv: export outputs only 1 issue after corruption \n- bd-4t7: auto-import runs during --no-auto-import\n\n## Reproduction\nUnknown - discovered during bd sync session on 2025-11-26\n\n## Fix\nNeed to investigate what code path could write issue objects to deletions.jsonl","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-26T23:17:01.938931-08:00","updated_at":"2025-11-26T23:25:21.445143-08:00","closed_at":"2025-11-26T23:25:02.209911-08:00"}
|
||
{"id":"bd-tru","title":"Update documentation for bd prime and Claude integration","description":"Update AGENTS.md, README.md, and QUICKSTART.md to document the new `bd prime` command, `bd setup claude` command, and tip system.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-11T23:30:22.77349-08:00","updated_at":"2025-12-09T18:38:37.706700072-05:00","closed_at":"2025-11-25T17:47:30.807069-08:00","dependencies":[{"issue_id":"bd-tru","depends_on_id":"bd-rpn","type":"blocks","created_at":"2025-11-11T23:30:22.774216-08:00","created_by":"daemon"},{"issue_id":"bd-tru","depends_on_id":"bd-br8","type":"blocks","created_at":"2025-11-11T23:30:22.774622-08:00","created_by":"daemon"},{"issue_id":"bd-tru","depends_on_id":"bd-90v","type":"parent-child","created_at":"2025-11-11T23:31:35.277819-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-ts0c","title":"Merge PR #300: gitignore upgrade feature","description":"**Summary:** PR #300 upgraded gitignore mechanisms for the beads project with multiple new strategies for configuration management. The pull request resolved merge conflicts and implemented three upgrade pathways for .gitignore handling.\n\n**Key Decisions:**\n- Implement 3 gitignore upgrade mechanisms:\n - bd doctor --fix\n - daemon auto-upgrade\n - bd init idempotent\n- Minimal scope: 6 files changed (+194/-42)\n\n**Resolution:** PR merged successfully after conflict resolution, enhancing project configuration flexibility and standardizing gitignore management strategies.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-12T11:56:22.778982-08:00","updated_at":"2025-12-14T16:47:51.846918-08:00","closed_at":"2025-11-12T12:46:36.550488-08:00"}
|
||
{"id":"bd-tt0","title":"Sync validation false positive: legitimate deletions trigger 'data loss detected'","description":"## Problem\n`bd sync` fails with false positive data loss detection when legitimate deletions occur:\n```\nPost-import validation failed: import reduced issue count: 26 → 25 (data loss detected!)\n```\n\n## Root Cause\nThe validation in `sync.go:329-340` counts DB issues BEFORE import, but `purgeDeletedIssues()` in `importer.go:159` legitimately removes issues DURING import. The validation doesn't account for expected deletions.\n\n**The Flow:**\n```\nsync.go:293 → beforeCount = countDBIssues() = 26\nsync.go:310-319 → sanitizeJSONL removes deleted issues from JSONL (RemovedCount=N)\nsync.go:323 → importFromJSONL() runs subprocess\n └→ importer.go:159 purgeDeletedIssues() removes issues from DB\nsync.go:331 → afterCount = countDBIssues() = 25\nsync.go:335 → validatePostImport(26, 25) → ERROR\n```\n\n## Fix\nPass `sanitizeResult.RemovedCount` to validation and account for expected deletions:\n\n```go\n// sync.go around line 335\nexpectedDecrease := 0\nif sanitizeResult != nil {\n expectedDecrease = sanitizeResult.RemovedCount\n}\nif err := validatePostImportWithDeletions(beforeCount, afterCount, expectedDecrease); err != nil {\n // ...\n}\n```\n\n```go\n// integrity.go - new or modified function\nfunc validatePostImportWithDeletions(before, after, expectedDeletions int) error {\n if after \u003c before - expectedDeletions {\n return fmt.Errorf(\"unexpected data loss: %d → %d (expected max decrease: %d)\", \n before, after, expectedDeletions)\n }\n // ...\n}\n```\n\n## Files\n- cmd/bd/sync.go:329-340\n- cmd/bd/integrity.go:289-301","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-28T17:06:15.515768-08:00","updated_at":"2025-11-28T19:50:01.116426-08:00","closed_at":"2025-11-28T18:46:19.722924-08:00"}
|
||
{"id":"bd-tuqd","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-12-14T16:46:43.67367-08:00","closed_at":"2025-11-07T15:55:01.330531-08:00"}
|
||
{"id":"bd-tvu3","title":"Improve test coverage for internal/beads (48.1% → 70%)","description":"The beads package is a core package with 48.1% coverage. As the primary package for issue management, it should have at least 70% coverage.\n\nCurrent coverage: 48.1%\nTarget coverage: 70%","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-13T20:42:59.739142-08:00","updated_at":"2025-12-13T21:01:14.874359-08:00"}
|
||
{"id":"bd-twlr","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-12-14T16:46:04.033787-08:00","closed_at":"2025-11-05T18:56:03.004161-08:00","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-tys","title":"Git history fallback has incorrect logic for detecting deletions","description":"## Problem\n\nThe `wasInGitHistory` function in `internal/importer/importer.go:891` returns true if the ID is found **anywhere** in git history. But finding an ID in history doesn't necessarily mean it was deleted - it could mean:\n\n1. The issue was added (appears in a commit adding it)\n2. The issue was modified (appears in commits updating it)\n3. The issue was deleted (appears in a commit removing it)\n\nThe current logic incorrectly treats all three cases as 'deleted'.\n\n## Correct Logic\n\n`git log -S` with `--oneline` shows commits where the string was added OR removed. To detect deletion specifically:\n\n1. ID appears in git history (was once in JSONL)\n2. ID is NOT currently in JSONL\n\nThe second condition is already checked by the caller (`purgeDeletedIssues`), so technically the logic is correct in context. But the function name and doc comment are misleading.\n\n## Fix Options\n\n1. **Rename function** to `wasEverInJSONL` and update doc comment to clarify\n2. **Add explicit check** for current JSONL state in the function itself\n\nOption 1 is simpler and correct since caller already filters.","status":"closed","priority":3,"issue_type":"bug","created_at":"2025-11-25T12:46:16.073661-08:00","updated_at":"2025-11-25T15:11:54.426093-08:00","closed_at":"2025-11-25T15:11:54.426093-08:00"}
|
||
{"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":"**Summary:** BD import silently succeeded when database matched working tree, even though working tree was ahead of git HEAD. This created a critical risk of users believing their data was fully synced when uncommitted changes existed.\n\n**Key Decisions:**\n- Detect uncommitted changes via git diff\n- Warn user about working tree differences\n- Clarify import status with explicit messaging\n\n**Resolution:** Enhanced bd import to prevent silent synchronization and provide clear warnings about potential data discrepancies between working tree and git HEAD, protecting users from accidental data loss.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-07T23:51:28.536822-08:00","updated_at":"2025-12-14T16:47:07.22961-08:00","closed_at":"2025-11-07T23:58:34.482313-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-12-14T16:45:54.806873-08:00","closed_at":"2025-11-05T14:15:01.506885-08:00"}
|
||
{"id":"bd-uiae","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-12-14T16:46:10.349668-08:00","closed_at":"2025-11-06T15:40:27.830475-08:00","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-umbf","title":"Design contributor namespace isolation for beads pollution prevention","description":"## Problem\n\nWhen contributors work on beads-the-project using beads-the-tool, their personal work-tracking issues leak into PRs. The .beads/issues.jsonl is intentionally tracked (it's the project's issue database), but contributors' local issues pollute the diff.\n\nThis is a recursion problem unique to self-hosting projects.\n\n## Possible Solutions to Explore\n\n1. **Contributor namespaces** - Each contributor gets a private prefix (e.g., `bd-steve-xxxx`) that's gitignored or filtered\n2. **Separate database** - Contributors use BEADS_DIR pointing elsewhere for personal tracking\n3. **Issue ownership/visibility flags** - Mark issues as \"local-only\" vs \"project\"\n4. **Prefix-based filtering** - Configure which prefixes are committed vs ignored\n\n## Design Considerations\n\n- Should be zero-friction for contributors (no manual setup)\n- Must not break existing workflows\n- Needs to work with sync/collaboration features\n- Consider: what if a \"personal\" issue graduates to \"project\" issue?\n\n## Expansion Needed\n\nThis is a placeholder. Needs detailed design exploration before implementation.","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-13T18:00:29.638743-08:00","updated_at":"2025-12-13T18:00:41.345673-08:00"}
|
||
{"id":"bd-upd","title":"Sync should cleanup snapshot files after completion","description":"After sync completion, orphan .base.jsonl and .left.jsonl snapshot files remain in .beads/ directory. These should be cleaned up on successful sync.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-28T17:27:36.727246-08:00","updated_at":"2025-11-28T18:36:52.088915-08:00","closed_at":"2025-11-28T17:42:14.57165-08:00"}
|
||
{"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-12-14T16:47:26.77165-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-ut5","title":"Test label update feature","description":"","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-v0x","title":"Auto-detect issue prefix from existing JSONL in 'bd init'","description":"When running `bd init` in a fresh clone with existing JSONL, it should auto-detect the issue prefix from the JSONL file instead of requiring `--prefix`.\n\nCurrently you must specify `--prefix ef` manually. But the JSONL file already contains issues like `ef-1it`, `ef-1jp` etc., so the prefix is known.\n\n**Ideal UX**:\n```\n$ bd init\nDetected issue prefix 'ef' from existing JSONL (38 issues).\n✓ Database initialized...\n```\n\nThis would make fresh clone hydration a single command: `bd init` with no flags.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-27T20:21:21.049215-08:00","updated_at":"2025-12-02T17:11:19.751009583-05:00","closed_at":"2025-11-28T21:57:11.164293-08:00"}
|
||
{"id":"bd-v29","title":"Deletions pruning doesn't include results in JSON output","description":"## Problem\n\nWhen `bd compact --json` runs with deletions pruning, the prune results are silently discarded:\n\n```go\n// Only report if there were deletions to prune\nif result.PrunedCount \u003e 0 {\n if jsonOutput {\n // JSON output will be included in the main response\n return // \u003c-- BUG: results are NOT included anywhere\n }\n ...\n}\n```\n\n## Location\n`cmd/bd/compact.go:925-929`\n\n## Impact\n- JSON consumers don't know deletions were pruned\n- No way to audit pruning via automation\n\n## Fix\nReturn prune results and include in JSON output structure:\n\n```json\n{\n \"success\": true,\n \"compacted\": {...},\n \"deletions_pruned\": {\n \"count\": 5,\n \"retention_days\": 7\n }\n}\n```","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-25T12:48:59.730979-08:00","updated_at":"2025-11-25T15:11:54.363653-08:00","closed_at":"2025-11-25T15:11:54.363653-08:00"}
|
||
{"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"}
|
||
{"id":"bd-vcg5","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":"closed","priority":2,"issue_type":"task","created_at":"2025-11-07T16:42:12.733219-08:00","updated_at":"2025-12-14T16:46:52.491887-08:00","closed_at":"2025-11-07T21:17:15.94117-08:00","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-vs9","title":"Fix unparam unused parameter in cmd/bd/doctor.go:541","description":"Linting issue: checkHooksQuick - path is unused (unparam) at cmd/bd/doctor.go:541:22. Error: func checkHooksQuick(path string) string {","status":"open","priority":0,"issue_type":"bug","created_at":"2025-12-07T15:35:17.02177046-07:00","updated_at":"2025-12-07T15:35:17.02177046-07:00"}
|
||
{"id":"bd-vw8","title":"Switch from deletions manifest to inline tombstones","description":"Replace the current deletions.jsonl manifest with inline tombstone records in issues.jsonl.\n\n## Problem Statement\n\nThe current deletions manifest approach has several issues:\n\n1. **Wild poisoning** - A stale clone's deletions manifest can poison fresh databases when synced\n2. **Two-level merge inconsistency** - Git content merge and beads snapshot merge use different bases\n3. **SyncJSONLToWorktree overwrites** - Blindly copies local JSONL to worktree, losing remote issues\n4. **3-day TTL too aggressive** - Deletions expire before dormant branches get merged\n\n## Proposed Solution: Inline Tombstones\n\nInstead of a separate deletions.jsonl file, embed deletion records directly in issues.jsonl:\n\n```json\n{\"id\":\"beads-abc\",\"status\":\"tombstone\",\"title\":\"Original title\",\"deleted_at\":\"2025-12-01T...\",\"deleted_by\":\"user\",\"expires_at\":\"2025-12-31T...\"}\n```\n\n### Benefits\n\n1. **Single source of truth** - No separate manifest to sync/merge\n2. **Participates in normal 3-way merge** - Deletion conflicts resolved same as other fields\n3. **Atomic with issue data** - Can't have orphaned deletions or missing tombstones\n4. **Preserves metadata** - Can optionally keep title/type for audit trail\n\n### Design Decisions Needed\n\n1. **TTL duration** - 30 days default? Configurable via config.yaml?\n2. **Tombstone content** - Minimal (just ID + timestamps) vs. full issue preservation?\n3. **Migration path** - How to handle existing deletions.jsonl files?\n4. **Status value** - Use \"tombstone\" or \"deleted\"? (tombstone clearer, deleted more intuitive)\n5. **Merge semantics** - Does tombstone always win, or use updated_at like other fields?\n\n### Migration Strategy\n\n1. On import, convert deletions.jsonl entries to tombstones in JSONL\n2. Deprecate but still read deletions.jsonl for backward compatibility\n3. Stop writing to deletions.jsonl after N versions\n\n## Related Issues\n\n- GitHub #464: Beads deletes issues (fresh clone sync problem)\n- bd-2e0: Add TTL to deletions manifest entries (current 3-day TTL)\n- bd-53c: bd sync corrupts issues.jsonl in multi-clone environments","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-05T13:42:24.384792-08:00","updated_at":"2025-12-13T20:50:30.080908-08:00","closed_at":"2025-12-13T07:25:56.968329-08:00","dependencies":[{"issue_id":"bd-vw8","depends_on_id":"bd-1r5","type":"blocks","created_at":"2025-12-05T14:57:31.111259-08:00","created_by":"daemon"},{"issue_id":"bd-vw8","depends_on_id":"bd-2m7","type":"blocks","created_at":"2025-12-05T14:57:33.57722-08:00","created_by":"daemon"},{"issue_id":"bd-vw8","depends_on_id":"bd-dli","type":"blocks","created_at":"2025-12-05T14:57:34.902784-08:00","created_by":"daemon"},{"issue_id":"bd-vw8","depends_on_id":"bd-zvg","type":"blocks","created_at":"2025-12-05T14:57:36.665817-08:00","created_by":"daemon"},{"issue_id":"bd-vw8","depends_on_id":"bd-fbj","type":"blocks","created_at":"2025-12-05T15:14:59.081452-08:00","created_by":"daemon"},{"issue_id":"bd-vw8","depends_on_id":"bd-olt","type":"blocks","created_at":"2025-12-05T15:14:59.118268-08:00","created_by":"daemon"},{"issue_id":"bd-vw8","depends_on_id":"bd-0ih","type":"blocks","created_at":"2025-12-05T15:14:59.155689-08:00","created_by":"daemon"},{"issue_id":"bd-vw8","depends_on_id":"bd-3b4","type":"blocks","created_at":"2025-12-05T15:14:59.192575-08:00","created_by":"daemon"},{"issue_id":"bd-vw8","depends_on_id":"bd-dve","type":"blocks","created_at":"2025-12-05T15:14:59.227233-08:00","created_by":"daemon"},{"issue_id":"bd-vw8","depends_on_id":"bd-8f9","type":"blocks","created_at":"2025-12-05T15:14:59.262816-08:00","created_by":"daemon"},{"issue_id":"bd-vw8","depends_on_id":"bd-s3v","type":"blocks","created_at":"2025-12-05T15:14:59.299481-08:00","created_by":"daemon"},{"issue_id":"bd-vw8","depends_on_id":"bd-okh","type":"blocks","created_at":"2025-12-05T15:14:59.337656-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-vxdr","title":"Investigate database pollution - issue count anomalies","description":"**Summary:** Database issue count anomalies traced to manual test issue creation during feature development, not cross-repo contamination. Cleanup script successfully removed 21 test-prefixed issues from the repository.\n\n**Key Decisions:** \n- Confirmed automated tests were properly isolated\n- Created cleanup script to remove test-pollution issues\n- No code changes required for test isolation\n\n**Resolution:** Reduced issue count by 7.2% (from 291 to 270), with follow-up issue filed to implement long-term prevention mechanisms.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-06T22:34:40.137483-08:00","updated_at":"2025-12-14T16:46:46.082716-08:00","closed_at":"2025-11-07T16:04:02.199807-08:00"}
|
||
{"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-we4p","title":"Cache getMultiRepoJSONLPaths() result during sync to avoid redundant calls","description":"**Summary:** Performance optimization to reduce redundant calls to getMultiRepoJSONLPaths() during sync cycles by caching the result at the start of the sync process. The optimization targets potential inefficiencies in multi-repository path retrieval.\n\n**Key Decisions:**\n- Call path retrieval function only once per sync\n- Reuse cached paths across multiple sync stages\n- Minimal performance impact for small repo sets\n\n**Resolution:** Implemented a single-call path caching approach in daemon_sync.go, reducing computational overhead with negligible code complexity increase.","status":"closed","priority":2,"issue_type":"chore","created_at":"2025-11-06T19:31:32.128674-08:00","updated_at":"2025-12-14T16:46:29.755524-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-wfmw","title":"Integration Layer Implementation","description":"Build the adapter layer that makes Agent Mail optional and non-intrusive.","notes":"Progress: bd-m9th (Python adapter library) completed with full test coverage. Next: bd-fzbg (update python-agent example with Agent Mail integration).","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-07T22:42:09.356429-08:00","updated_at":"2025-12-14T16:47:13.222712-08:00","closed_at":"2025-11-08T00:20:30.888756-08:00","dependencies":[{"issue_id":"bd-wfmw","depends_on_id":"bd-spmx","type":"blocks","created_at":"2025-11-07T22:42:09.357488-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-wgu4","title":"Standardize daemon detection: use tryDaemonLock probe before RPC","description":"Before attempting RPC connection, call tryDaemonLock() to check if lock is held:\n- If lock NOT held: skip RPC attempt (no daemon running)\n- If lock IS held: proceed with RPC + short timeout\n\nThis is extremely cheap and eliminates unnecessary connection attempts.\n\nApply across all client entry points that probe for daemon.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-07T16:42:12.709802-08:00","updated_at":"2025-12-14T16:46:50.028001-08:00","closed_at":"2025-11-07T20:15:23.282181-08:00","dependencies":[{"issue_id":"bd-wgu4","depends_on_id":"bd-ndyz","type":"discovered-from","created_at":"2025-11-07T16:42:12.710564-08:00","created_by":"daemon"}]}
|
||
{"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-wta","title":"Add performance benchmarks for multi-repo hydration","description":"**Summary:** Performance benchmarks were developed to validate multi-repo hydration efficiency for a workflow library, focusing on query speed and caching performance across scaling scenarios.\n\n**Key Decisions:**\n- Set performance targets for file stat and hydration times\n- Test repository scaling from 1-10 repos\n- Target \u003c100ms total execution time\n\n**Resolution:** Benchmarks established quantifiable performance metrics, enabling confident library implementation with predictable resource consumption.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-03T20:24:39.331528-08:00","updated_at":"2025-12-14T16:45:56.536322-08:00","closed_at":"2025-11-05T14:17:15.079226-08:00"}
|
||
{"id":"bd-wucl","title":"Add Result.ConvertedToTombstone counter for import statistics","description":"The import Result struct has SkippedDeleted but doesn't distinguish between:\n1. Issues skipped because they're in deletions manifest (old behavior)\n2. Issues converted from deletions.jsonl to tombstones (new bd-dve behavior)\n\nAdd a new ConvertedToTombstone counter to track legacy deletions converted to tombstones during import. This provides better visibility into the migration process.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-07T01:40:34.097611-08:00","updated_at":"2025-12-07T02:18:09.466608-08:00","closed_at":"2025-12-07T02:18:09.466608-08:00","dependencies":[{"issue_id":"bd-wucl","depends_on_id":"bd-dve","type":"blocks","created_at":"2025-12-07T01:41:28.242971-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-wv9l","title":"Code Review Sweep: thorough","description":"Perform thorough code review sweep based on accumulated activity.\n\n**AI Reasoning:**\nSignificant code activity with 7608 lines added and 120 files changed indicates substantial modifications. Multiple high-churn areas (cmd/bd, internal/rpc) suggest potential for subtle issues and emerging patterns that warrant review.\n\n**Scope:** thorough\n**Target Areas:** cmd/bd, internal/rpc, .beads\n**Estimated Files:** 12\n**Estimated Cost:** $5\n\n**Task:**\nReview files for non-obvious issues that agents miss during focused work:\n- Inefficiencies (algorithmic, resource usage)\n- Subtle bugs (race conditions, off-by-one, copy-paste)\n- Poor patterns (coupling, complexity, duplication)\n- Missing best practices (error handling, docs, tests)\n- Unnamed anti-patterns\n\nFile discovered issues with detailed reasoning and suggestions.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-21T23:23:16.056392-08:00","updated_at":"2025-12-14T00:32:11.049104-08:00","closed_at":"2025-12-13T23:33:16.519977-08:00"}
|
||
{"id":"bd-ww0g","title":"MCP server: \"No workspace set\" and \"chunk longer than limit\" errors","description":"**Summary:** Two critical MCP server issues were resolved involving workspace context persistence and output buffer limitations. The fixes addressed environment variable scoping and protocol output size constraints in the beads-mcp CLI tool.\n\n**Key Decisions:**\n- Create module-level persistent context dictionary\n- Modify set_context() to store in both dict and os.environ\n- Reduce default/max list output limits\n- Strip large dependency details from standard responses\n\n**Resolution:** The changes enable reliable workspace context across tool calls and prevent buffer overflow errors for large issue databases, improving CLI stability and performance.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-07T14:32:18.315155-08:00","updated_at":"2025-12-14T16:46:46.995039-08:00","closed_at":"2025-11-07T16:53:46.929942-08:00"}
|
||
{"id":"bd-x2i","title":"Add bd deleted command for audit trail","description":"Parent: bd-imj\n\nAdd command to view deletion history.\n\nUsage:\n bd deleted # Show recent deletions (last 7 days)\n bd deleted --since=30d # Show deletions in last 30 days\n bd deleted --all # Show all tracked deletions\n bd deleted bd-xxx # Show deletion details for specific issue\n\nOutput format:\n bd-xxx 2025-11-25 10:00 stevey duplicate of bd-yyy\n bd-yyy 2025-11-25 10:05 claude cleanup\n\nAcceptance criteria:\n- List deletions with timestamp, actor, reason\n- Filter by time range\n- Lookup specific issue ID\n- JSON output option for scripting","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-25T09:57:21.113861-08:00","updated_at":"2025-11-25T15:13:53.781519-08:00","closed_at":"2025-11-25T15:13:53.781519-08:00"}
|
||
{"id":"bd-x47","title":"Add guidance for self-hosting projects","description":"**Summary:** Identified documentation gaps for self-hosting project contributor workflows, recognizing unique development challenges beyond traditional open-source models.\n\n**Key Decisions:** \n- Prefer single repository approach\n- Multi-repo only for complex team planning\n- Prioritize bootstrap phase stability\n\n**Resolution:** Documentation updated with targeted guidance to support self-hosting project development requirements.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-03T20:24:27.805341-08:00","updated_at":"2025-12-14T16:45:55.227202-08:00","closed_at":"2025-11-05T14:16:34.69662-08:00"}
|
||
{"id":"bd-xo6b","title":"Review multi-repo deletion tracking implementation","description":"**Summary:** Reviewed multi-repo deletion tracking implementation, identifying critical issues in error handling and path management that prevent production readiness. Focused on ensuring robust, consistent behavior across different repository scenarios.\n\n**Key Decisions:**\n- Implement consistent error handling across snapshot/merge operations\n- Add path normalization for JSONL tracking files\n- Enhance test coverage for edge cases\n- Maintain atomic file operations and race condition protection\n\n**Resolution:** Implementation requires fixes to error management and path handling before multi-repo deletion tracking can be considered production-ready, with specific improvements needed in bd-iye7 and bd-sjmr issue areas.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-06T19:23:52.402949-08:00","updated_at":"2025-12-14T16:46:26.337783-08:00","closed_at":"2025-11-06T19:32:34.160341-08:00","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-xo9","title":"Document sync.require_confirmation_on_mass_delete config option","description":"","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-02T21:56:25.580287-08:00","updated_at":"2025-12-02T22:13:43.992387-08:00","closed_at":"2025-12-02T22:13:43.992387-08:00"}
|
||
{"id":"bd-xoyh","title":"GH#519: bd sync fails when sync.branch equals current branch","description":"bd sync tries to create worktree when sync.branch matches current checkout, fails with 'already used by worktree'. Should detect and commit directly. See: https://github.com/steveyegge/beads/issues/519","status":"open","priority":2,"issue_type":"bug","created_at":"2025-12-14T16:31:34.574414-08:00","updated_at":"2025-12-14T16:31:34.574414-08:00"}
|
||
{"id":"bd-xwo","title":"Fix validatePreExport to use content hash instead of mtime","description":"validatePreExport() in integrity.go:70 still uses isJSONLNewer() (mtime-based), creating inconsistent behavior. Auto-import correctly uses hasJSONLChanged() (hash-based) but export validation still uses the old mtime approach. This can cause false positive blocks after git operations.\n\nFix: Replace isJSONLNewer() call with hasJSONLChanged() in validatePreExport().\n\nImpact: Without this fix, the bd-khnb solution is incomplete - we prevent resurrection but still have export blocking issues.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-20T21:31:03.183164-05:00","updated_at":"2025-11-20T21:34:00.200803-05:00","closed_at":"2025-11-20T21:34:00.200803-05:00","dependencies":[{"issue_id":"bd-xwo","depends_on_id":"bd-khnb","type":"blocks","created_at":"2025-11-20T21:31:03.184049-05:00","created_by":"daemon"}]}
|
||
{"id":"bd-xyc","title":"Consolidate check-health DB opens into single connection","description":"The --check-health flag opens the database 3 separate times (once per quick check). Consolidate into a single DB open for better performance, especially on slower filesystems.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-25T19:27:42.034178-08:00","updated_at":"2025-11-25T19:50:21.32375-08:00","closed_at":"2025-11-25T19:50:21.32375-08:00"}
|
||
{"id":"bd-xzrv","title":"Write Agent Mail integration guide","description":"Comprehensive guide for setting up and using Agent Mail with Beads.\n\nAcceptance Criteria:\n- Installation instructions\n- Configuration (environment variables)\n- Architecture diagram\n- Benefits and tradeoffs\n- When to use vs not use\n- Troubleshooting section\n- Migration from git-only mode\n\nFile: docs/AGENT_MAIL.md\n\nSections:\n- Quick start\n- How it works\n- Integration points\n- Graceful degradation\n- Multi-machine deployment\n- FAQ","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-07T22:42:51.231066-08:00","updated_at":"2025-12-14T16:47:18.382073-08:00","closed_at":"2025-11-08T00:40:38.798162-08:00","dependencies":[{"issue_id":"bd-xzrv","depends_on_id":"bd-fzbg","type":"blocks","created_at":"2025-11-07T22:42:51.232246-08:00","created_by":"daemon"}]}
|
||
{"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":"open","priority":2,"issue_type":"task","created_at":"2025-12-05T14:51:18.41124-08:00","updated_at":"2025-12-05T14:51:18.41124-08:00"}
|
||
{"id":"bd-y68","title":"Block direct status update to tombstone in UpdateIssue","description":"Per bd-2m7 design: 'Should we support tombstone as valid input to bd update --status? Recommendation: No, tombstones only created via bd delete'\n\nCurrently nothing prevents 'bd update \u003cid\u003e --status=tombstone', which would create an invalid tombstone (missing deleted_at, deleted_by, etc.).\n\nLocation: internal/storage/sqlite/queries.go:500-664 UpdateIssue\n\nAdd validation to reject status=tombstone in updates.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-05T15:35:31.5176-08:00","updated_at":"2025-12-05T15:41:14.813862-08:00","closed_at":"2025-12-05T15:41:14.813862-08:00","dependencies":[{"issue_id":"bd-y68","depends_on_id":"bd-vw8","type":"parent-child","created_at":"2025-12-05T15:35:47.181896-08:00","created_by":"daemon"}]}
|
||
{"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":"open","priority":3,"issue_type":"feature","created_at":"2025-12-14T16:31:28.596258-08:00","updated_at":"2025-12-14T16:31:28.596258-08:00"}
|
||
{"id":"bd-yb8","title":"Propagate context through command handlers","description":"Thread context from signal-aware parent through all command handlers.\n\n## Context\nPart of context propagation work. Builds on bd-rtp (signal-aware contexts).\n\n## Current State\nMany command handlers create their own context.Background() locally instead of receiving context from parent.\n\n## Implementation\n1. Add context parameter to command handler functions\n2. Pass context from cobra command Run/RunE closures\n3. Update all storage operations to use propagated context\n\n## Example Pattern\n```go\n// Before\nRun: func(cmd *cobra.Command, args []string) {\n ctx := context.Background()\n store.GetIssues(ctx, ...)\n}\n\n// After \nRun: func(cmd *cobra.Command, args []string) {\n // ctx comes from parent signal-aware context\n store.GetIssues(ctx, ...)\n}\n```\n\n## Files to Update\n- All cmd/bd/*.go command handlers\n- Ensure context flows from main -\u003e cobra -\u003e handlers -\u003e storage\n\n## Benefits\n- Commands respect cancellation signals\n- Consistent context handling\n- Enables timeouts and deadlines\n\n## Acceptance Criteria\n- [ ] All command handlers use propagated context\n- [ ] No new context.Background() calls in command handlers\n- [ ] Context flows from signal handler to storage layer","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-20T21:27:02.854242-05:00","updated_at":"2025-11-20T21:37:32.44525-05:00","closed_at":"2025-11-20T21:37:32.44525-05:00","dependencies":[{"issue_id":"bd-yb8","depends_on_id":"bd-rtp","type":"blocks","created_at":"2025-11-20T21:27:02.854904-05:00","created_by":"daemon"}]}
|
||
{"id":"bd-ybv5","title":"Refactor AGENTS.md to use external references","description":"Suggestion to use external references (e.g., \"ALWAYS REFER TO ./beads/prompt.md\") instead of including all instructions directly within AGENTS.md.\nReasons:\n1. Agents can follow external references.\n2. Prevents context pollution/stuffing in AGENTS.md as more tools append instructions.\n","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-20T18:55:53.259144-05:00","updated_at":"2025-12-09T18:38:37.708896372-05:00","closed_at":"2025-11-26T22:25:57.772875-08:00"}
|
||
{"id":"bd-yck","title":"Fix checkExistingBeadsData to be worktree-aware","description":"The checkExistingBeadsData function in cmd/bd/init.go checks for .beads in the current working directory, but for worktrees it should check the main repository root instead. This prevents proper worktree compatibility.","status":"open","priority":2,"issue_type":"bug","created_at":"2025-12-07T16:48:32.082776345-07:00","updated_at":"2025-12-07T16:48:32.082776345-07:00"}
|
||
{"id":"bd-ye0d","title":"troubleshoot GH#278 daemon exits every few secs","description":"","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":"**Summary:** Slow CLI tests in the bd project were optimized by refactoring the testing approach to reduce unnecessary filesystem operations and binary recompilations.\n\n**Key Decisions:**\n- Reuse existing binary during test execution\n- Reclassify tests as integration tests\n- Minimize binary rebuilds\n\n**Resolution:** Test suite performance dramatically improved from 15+ minutes to ~12 seconds through strategic testing optimizations.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-05T20:19:12.822543-08:00","updated_at":"2025-12-14T16:46:06.961456-08:00","closed_at":"2025-11-05T20:31:19.321787-08:00"}
|
||
{"id":"bd-yk8w","title":"Add export test verifying tombstones are included in JSONL output","description":"The export now includes tombstones (bd-dve) but there's no test that:\n1. Creates issues in DB including a tombstone\n2. Runs export\n3. Verifies the JSONL contains the tombstone with all fields\n\nAdd a test: TestExportIncludesTombstones","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-07T01:41:19.987907-08:00","updated_at":"2025-12-07T02:16:16.882688-08:00","closed_at":"2025-12-07T02:16:16.882688-08:00","dependencies":[{"issue_id":"bd-yk8w","depends_on_id":"bd-dve","type":"blocks","created_at":"2025-12-07T01:41:28.426945-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-ykd9","title":"Add bd doctor --fix flag to automatically repair issues","description":"Implement a --fix flag for bd doctor that can automatically repair detected issues.\n\nRequirements:\n- Add --fix flag to bd doctor command\n- Show all fixable issues and prompt for confirmation before applying fixes\n- Organize fix implementations under doctor/fix/\u003ctype_of_fix\u003e.go\n- Each fix type should have its own file (e.g., doctor/fix/hooks.go, doctor/fix/sync.go)\n- Display what will be fixed and ask user to confirm (Y/n) before proceeding\n- Support fixing issues like:\n - Missing or broken git hooks\n - Sync problems with remote\n - File permission issues\n - Any other auto-repairable issues doctor detects\n\nImplementation notes:\n- Maintain separation between detection (existing doctor code) and repair (new fix code)\n- Each fix should be idempotent and safe to run multiple times\n- Provide clear output about what was fixed\n- Log any fixes that fail with actionable error messages","status":"open","priority":2,"issue_type":"feature","created_at":"2025-11-14T18:17:48.411264-08:00","updated_at":"2025-11-14T18:17:58.88609-08:00"}
|
||
{"id":"bd-ymj","title":"Export doesn't update last_import_hash metadata causing perpetual 'JSONL content has changed' errors","description":"After a successful export, the daemon doesn't update last_import_hash or last_import_mtime metadata. This causes hasJSONLChanged to return true on the next export attempt, blocking with 'refusing to export: JSONL content has changed since last import'.\n\nRelated to GH #334.\n\nScenario:\n1. Daemon exports successfully → JSONL updated, hash changes\n2. Metadata NOT updated (last_import_hash still points to old hash)\n3. Next mutation triggers export\n4. validatePreExport calls hasJSONLChanged\n5. hasJSONLChanged sees current JSONL hash != last_import_hash\n6. Export blocked with 'JSONL content has changed since last import'\n7. Issue stuck: can't export, can't make progress\n\nThis creates a catch-22 where the system thinks JSONL changed externally when it was the daemon itself that changed it.\n\nCurrent behavior:\n- Import updates metadata (import.go:310-336)\n- Export does NOT update metadata (daemon_sync.go:307)\n- Result: metadata becomes stale after every export","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-21T10:05:34.871333-05:00","updated_at":"2025-11-22T14:57:44.56458844-05:00","closed_at":"2025-11-21T15:09:04.016651-05:00","dependencies":[{"issue_id":"bd-ymj","depends_on_id":"bd-dvd","type":"related","created_at":"2025-11-21T10:06:11.462508-05:00","created_by":"daemon"}]}
|
||
{"id":"bd-yuf7","title":"bd config set succeeds but doesn't persist to config.toml","description":"**Summary:** Config set command appeared to work but failed to actually persist configuration settings, preventing users from modifying system behavior via CLI. The issue prevented proper configuration storage and retrieval.\n\n**Key Decisions:** \n- Investigate config write mechanism\n- Verify file creation process\n- Check JSON output validation\n\n**Resolution:** Bug was fixed, enabling proper config.toml creation and CLI-based configuration management for the bd tool.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-08T01:14:58.726198-08:00","updated_at":"2025-12-14T16:47:22.150518-08:00","closed_at":"2025-11-08T01:17:41.377912-08:00"}
|
||
{"id":"bd-yuv","title":"Add tests for tombstone edge cases","description":"Missing test coverage for tombstone implementation:\n\n1. Test tombstone validation (deleted_at requirement)\n2. Test GetReadyWork excludes tombstones\n3. Test SearchIssues behavior with tombstones\n4. Integration test for creating/retrieving a tombstone via the delete command\n5. Test that status=tombstone update is rejected","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-05T15:35:39.101881-08:00","updated_at":"2025-12-05T15:35:39.101881-08:00","dependencies":[{"issue_id":"bd-yuv","depends_on_id":"bd-vw8","type":"parent-child","created_at":"2025-12-05T15:35:47.335167-08:00","created_by":"daemon"}]}
|
||
{"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-yxy","title":"Add command injection prevention tests for git rm in merge command","description":"Test coverage gap identified by automated analysis (vc-217).\n\n**Original Issue:** [deleted:bd-da96-baseline-lint]\n\nIn cmd/bd/merge.go:121, exec.Command is called with variable fullPath, flagged by gosec G204 for potential command injection.\n\nAdd tests covering:\n- File paths with shell metacharacters (;, |, \u0026, $, etc.)\n- Paths with spaces and special characters\n- Paths attempting command injection (e.g., 'file; rm -rf /')\n- Validation that fullPath is properly sanitized\n- Only valid git-tracked files can be removed\n\nThis is a critical security path preventing arbitrary command execution.\n\n_This issue was automatically created by AI test coverage analysis._","status":"closed","priority":0,"issue_type":"task","created_at":"2025-11-21T10:25:33.531631-05:00","updated_at":"2025-11-21T21:29:36.991055218-05:00","closed_at":"2025-11-21T19:31:21.853136-05:00","dependencies":[{"issue_id":"bd-yxy","depends_on_id":"bd-da96-baseline-lint","type":"discovered-from","created_at":"2025-11-21T10:25:33.533126-05:00","created_by":"ai-supervisor"}]}
|
||
{"id":"bd-z0yn","title":"Channel isolation test - beads","description":"","notes":"Resetting stale in_progress status from old executor run (13 days old)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-08T04:21:17.327983-08:00","updated_at":"2025-12-14T00:32:11.046547-08:00","closed_at":"2025-12-13T23:29:56.876192-08:00"}
|
||
{"id":"bd-z3s3","title":"Create deployment scripts for GCP","description":"Automated provisioning scripts for GCP Compute Engine deployment.\n\nAcceptance Criteria:\n- Terraform/gcloud scripts\n- Static IP allocation\n- Firewall rules\n- NGINX reverse proxy config\n- TLS setup (Let's Encrypt)\n- Systemd service file\n\nFile: deployment/agent-mail/gcp/","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-07T22:43:43.294839-08:00","updated_at":"2025-12-14T00:32:11.049764-08:00","closed_at":"2025-12-13T23:30:58.727475-08:00","dependencies":[{"issue_id":"bd-z3s3","depends_on_id":"bd-9li4","type":"blocks","created_at":"2025-11-07T23:04:27.982336-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-z528","title":"Prevent test pollution in production database","description":"**Summary:** Addressed test pollution in production database by implementing a warning system for test issues and documenting proper testing workflows. Focused on using environment variables for test isolation instead of creating a new command.\n\n**Key Decisions:**\n- Use BEADS_DB for isolated testing\n- Add warning for \"Test\" prefix issues\n- Reject additional `bd test-mode` command\n\n**Resolution:** Improved development practices by preventing accidental production database contamination through clear documentation and runtime warnings.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-07T16:07:28.255289-08:00","updated_at":"2025-12-14T16:47:01.424148-08:00","closed_at":"2025-11-07T22:43:28.669908-08:00"}
|
||
{"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":"open","priority":2,"issue_type":"task","created_at":"2025-12-14T14:25:06.887069-08:00","updated_at":"2025-12-14T14:25:06.887069-08:00"}
|
||
{"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-zbq2","title":"bd export should verify JSONL line count matches database count","description":"**Summary:** Proposed adding line count verification to bd export to prevent silent export failures that could leave data inconsistent. The feature would compare exported database issue count against generated JSONL file lines to catch potential write errors.\n\n**Key Decisions:** \n- Verify JSONL line count matches exported database records\n- Immediately error and remove temp file if mismatch detected\n- Provide clear error message showing expected vs actual counts\n\n**Resolution:** Enhancement ensures JSONL export reliability by implementing a simple, lightweight verification step that prevents undetected data loss during export operations.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-05T14:24:56.278249-08:00","updated_at":"2025-12-14T16:45:58.634875-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":"open","priority":2,"issue_type":"feature","created_at":"2025-12-14T16:31:31.71456-08:00","updated_at":"2025-12-14T16:31:31.71456-08:00"}
|
||
{"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-12-14T16:47:23.97451-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-zj8e","title":"Performance Testing Documentation","description":"Create docs/performance-testing.md documenting the performance testing framework.\n\nSections:\n1. Overview - What the framework does, goals\n2. Running Benchmarks\n - make bench command\n - Running specific benchmarks\n - Interpreting output (ns/op, allocs/op)\n3. Profiling and Analysis\n - Viewing CPU profiles with pprof\n - Reading flamegraphs\n - Memory profiling\n - Finding hotspots\n4. User Diagnostics\n - bd doctor --perf usage\n - Sharing profiles with bug reports\n - Understanding the report output\n5. Comparing Performance\n - Using benchstat for before/after comparisons\n - Detecting regressions\n6. Tips for Optimization\n - Common patterns\n - When to profile vs benchmark\n\nStyle:\n- Concise, practical examples\n- Screenshots/examples of pprof output\n- Clear command-line examples\n- Focus on workflow, not theory","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-13T22:23:38.99897-08:00","updated_at":"2025-12-09T18:38:37.709875872-05:00","closed_at":"2025-11-28T23:37:52.227831-08:00"}
|
||
{"id":"bd-zkl","title":"Add tests for daemon vs non-daemon parity in list filters","description":"**Summary:** Added comprehensive test coverage to validate consistent filtering behavior between daemon and non-daemon modes during RPC integration. Focused on ensuring reliable issue list handling across different operational contexts.\n\n**Key Decisions:** \n- Support multiple date parsing formats\n- Add NoLabels field to RPC protocol\n- Treat 'status all' as unset\n\n**Resolution:** Created robust test suite in server_issues_epics_test.go that validates filter consistency and provides clear error messaging across modes.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-05T00:43:53.369457-08:00","updated_at":"2025-12-14T16:45:40.312152-08:00","closed_at":"2025-11-05T00:55:31.318526-08:00","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"}]}
|
||
{"id":"bd-znyw","title":"Change default JSONL filename from beads.jsonl back to issues.jsonl throughout codebase","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-21T23:27:07.137649-08:00","updated_at":"2025-11-21T23:34:05.029974-08:00","closed_at":"2025-11-21T23:34:05.029974-08:00"}
|
||
{"id":"bd-zo7o","title":"Create multi-agent race condition test","description":"Automated test that runs 2+ agents simultaneously to verify collision prevention.\n\nAcceptance Criteria:\n- Script spawns 2 agents in parallel\n- Both try to claim same issue\n- Only one succeeds (via reservation)\n- Other agent skips to different work\n- Verify in JSONL that no duplicate claims\n- Test with Agent Mail enabled/disabled\n\nFile: tests/integration/test_agent_race.py\n\nSuccess Metric: Zero duplicate claims with Agent Mail, collisions without it","status":"closed","priority":0,"issue_type":"task","created_at":"2025-11-07T22:43:21.360663-08:00","updated_at":"2025-12-14T16:47:15.704717-08:00","closed_at":"2025-11-08T00:34:14.40119-08:00","dependencies":[{"issue_id":"bd-zo7o","depends_on_id":"bd-fzbg","type":"blocks","created_at":"2025-11-07T22:43:21.361571-08:00","created_by":"daemon"}]}
|
||
{"id":"bd-zpnq","title":"Daemons don't exit when parent process dies, causing accumulation and race conditions","description":"**Summary:** Daemon processes were accumulating when parent processes died, causing race conditions and resource waste. A solution was implemented to track parent PID and automatically exit orphaned daemons.\n\n**Key Decisions:**\n- Add ParentPID tracking to daemon lock info\n- Check parent process status every 10 seconds\n- Gracefully exit if parent process dies\n\n**Resolution:** Daemons now self-terminate within 10 seconds of parent process death, preventing daemon accumulation and potential system conflicts.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-07T18:48:41.65456-08:00","updated_at":"2025-12-14T16:46:46.379241-08:00","closed_at":"2025-11-07T18:53:26.382573-08:00"}
|
||
{"id":"bd-zqmb","title":"Fix goroutine leak in daemon restart","description":"Fire-and-forget goroutine in daemon restart leaks on every restart.\n\nLocation: cmd/bd/daemons.go:251\n\nProblem:\ngo func() { _ = daemonCmd.Wait() }()\n\n- Spawns goroutine without timeout or cancellation\n- If daemon command never completes, goroutine leaks forever\n- Each daemon restart leaks one more goroutine\n\nSolution: Add timeout and cleanup:\ngo func() {\n done := make(chan struct{})\n go func() {\n _ = daemonCmd.Wait()\n close(done)\n }()\n \n select {\n case \u003c-done:\n // Exited normally\n case \u003c-time.After(10 * time.Second):\n // Timeout - daemon should have forked by now\n _ = daemonCmd.Process.Kill()\n }\n}()\n\nImpact: Goroutine leak on every daemon restart\n\nEffort: 2 hours","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-16T14:52:01.897215-08:00","updated_at":"2025-11-16T15:04:00.497517-08:00","closed_at":"2025-11-16T15:04:00.497517-08:00"}
|
||
{"id":"bd-zsle","title":"GH#516: Automate 'landing the plane' setup in AGENTS.md","description":"bd init or /beads:init should auto-add landing-the-plane instructions to AGENTS.md (and @AGENTS.md for web Claude). Reduces manual setup. See: https://github.com/steveyegge/beads/issues/516","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-14T16:31:57.541154-08:00","updated_at":"2025-12-14T16:31:57.541154-08:00"}
|
||
{"id":"bd-zsz","title":"Add --parent flag to bd onboard output","description":"bd onboard didn't document --parent flag for epic subtasks, causing AI agents to guess wrong syntax. Added --parent example and CLI help section pointing to bd \u003ccmd\u003e --help.\n\nFixes: https://github.com/steveyegge/beads/issues/402","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-27T13:01:51.366625-08:00","updated_at":"2025-11-27T13:02:02.018003-08:00","closed_at":"2025-11-27T13:02:02.018003-08:00"}
|
||
{"id":"bd-zvg","title":"Design tombstone merge semantics","description":"Define how tombstones participate in 3-way merge. Key question: does tombstone always win over live issue (like current deletion-wins rule), or should we use updated_at comparison? Consider: tombstone with older timestamp vs live issue with newer edits. Recommendation: tombstone wins unless expired, matching current behavior but with longer TTL window.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-05T13:43:13.522002-08:00","updated_at":"2025-12-05T15:01:30.998256-08:00","closed_at":"2025-12-05T15:01:30.998256-08:00"}
|
||
{"id":"bd-zwpw","title":"Test dependency child","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-05T11:23:05.998311-08:00","updated_at":"2025-12-14T16:45:48.623592-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":"open","priority":1,"issue_type":"feature","created_at":"2025-11-21T23:16:09.596778-08:00","updated_at":"2025-11-21T23:16:27.781976-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"}]}
|