bd sync: 2025-10-31 00:19:27

This commit is contained in:
Steve Yegge
2025-10-31 00:19:27 -07:00
parent 613f0dfff4
commit 4e9f6e131c

View File

@@ -36,7 +36,7 @@
{"id":"bd-37f7","content_hash":"72cb1f58d7ad6a91d3a02233bf4e78d0992834c15fbd8c6d9dc56df7095dc0a3","title":"Remove or archive collision resolution documentation","description":"Clean up documentation that's specific to sequential ID collision resolution:\n- docs/collision-resolution-failure-analysis.md (can archive or remove)\n- Remove collision resolution sections from AGENTS.md, FAQ.md, TROUBLESHOOTING.md\n- Update HASH_ID_DESIGN.md to reflect that collision resolution is fully removed\n- Update CHANGELOG.md to note the removal\n- Keep only minimal docs about hash ID accidental collisions","status":"open","priority":2,"issue_type":"chore","created_at":"2025-10-30T22:16:48.499529-07:00","updated_at":"2025-10-30T22:16:48.499529-07:00","labels":["cleanup","documentation","hash-ids"]}
{"id":"bd-381d7f6c","content_hash":"24b00d276bd245aec3e6dfb6378457e785ac6a01538eba05450dd65dba993178","title":"Audit Current Cache Usage","description":"Understand exactly what code depends on the storage cache","acceptance_criteria":"- Document showing all cache dependencies\n- Confirmation that removing cache won't break MCP\n- List of tests that need updating\n\nFiles to examine:\n- internal/rpc/server_cache_storage.go (cache implementation)\n- internal/rpc/client.go (how req.Cwd is set)\n- internal/rpc/server_*.go (all getStorageForRequest calls)\n- integrations/beads-mcp/ (MCP multi-repo logic)\n\nTasks:\n- Document all callers of getStorageForRequest()\n- Verify req.Cwd is only set by RPC client for database discovery\n- Confirm MCP server doesn't rely on multi-repo cache behavior\n- Check if any tests assume multi-repo routing\n- Review environment variables: BEADS_DAEMON_MAX_CACHE_SIZE, BEADS_DAEMON_CACHE_TTL, BEADS_DAEMON_MEMORY_THRESHOLD_MB","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-27T23:01:15.172045-07:00","updated_at":"2025-10-30T17:05:26.02648-07:00","closed_at":"2025-10-28T10:47:37.87529-07:00"}
{"id":"bd-3b2fe268","content_hash":"37e71aade254736849f32c41515f554bac4b8b014ac50b58e4be7cf67973d4b0","title":"Add fsnotify dependency to go.mod","description":"","status":"in_progress","priority":1,"issue_type":"task","created_at":"2025-10-28T16:20:02.429763-07:00","updated_at":"2025-10-30T17:05:26.037946-07:00"}
{"id":"bd-3d65","content_hash":"2102965ea1ba961404d7fe1074161cd4534a30e5d3f821c6bac4aecc71ab3523","title":"Remove collision-related test files","description":"Clean up test files that are specific to sequential ID collision testing:\n- cmd/bd/autoimport_collision_test.go\n- cmd/bd/import_collision_regression_test.go\n- cmd/bd/import_collision_test.go\n- internal/storage/sqlite/collision_dedup_test.go\n- internal/storage/sqlite/collision_test.go\n- internal/storage/sqlite/collision_hash_test.go\n- beads_twoclone_test.go (contains deprecated TestThreeCloneCollision)\n- beads_nway_test.go (N-way collision resolution tests)\n- Keep only tests relevant to hash ID collision handling (adding another character)","status":"open","priority":2,"issue_type":"chore","created_at":"2025-10-30T22:16:48.499531-07:00","updated_at":"2025-10-30T22:16:48.499531-07:00","labels":["cleanup","hash-ids","tests"]}
{"id":"bd-3d65","content_hash":"2102965ea1ba961404d7fe1074161cd4534a30e5d3f821c6bac4aecc71ab3523","title":"Remove collision-related test files","description":"Clean up test files that are specific to sequential ID collision testing:\n- cmd/bd/autoimport_collision_test.go\n- cmd/bd/import_collision_regression_test.go\n- cmd/bd/import_collision_test.go\n- internal/storage/sqlite/collision_dedup_test.go\n- internal/storage/sqlite/collision_test.go\n- internal/storage/sqlite/collision_hash_test.go\n- beads_twoclone_test.go (contains deprecated TestThreeCloneCollision)\n- beads_nway_test.go (N-way collision resolution tests)\n- Keep only tests relevant to hash ID collision handling (adding another character)","status":"closed","priority":2,"issue_type":"chore","created_at":"2025-10-30T22:16:48.499531-07:00","updated_at":"2025-10-31T00:19:23.871537-07:00","closed_at":"2025-10-31T00:19:23.871537-07:00","labels":["cleanup","hash-ids","tests"]}
{"id":"bd-3d844c58","content_hash":"92be620ba7d89a256decb33cefd8ba8a12f40413a27e4d92dca9b6189b48665b","title":"Implement content-hash based collision resolution for deterministic convergence","description":"The current collision resolution uses creation timestamps to decide which issue to keep vs. remap. This is non-deterministic when two clones create issues at nearly the same time.\n\nRoot cause of bd-71107098:\n- Clone A creates test-1=\"Issue from clone A\" at T0\n- Clone B creates test-1=\"Issue from clone B\" at T0+30ms\n- Clone B syncs first, remaps Clone A's to test-2\n- Clone A syncs second, sees collision, remaps Clone B's to test-2\n- Result: titles are swapped between clones\n\nSolution:\n- Use content-based hashing (title + description + priority + type)\n- Deterministic winner: always keep issue with lower hash\n- Same collision on different clones produces same result (idempotent)\n\nImplementation:\n- Modify ScoreCollisions in internal/storage/sqlite/collision.go\n- Replace timestamp-based scoring with content hash comparison\n- Ensure hash function is stable across platforms","status":"closed","priority":0,"issue_type":"task","created_at":"2025-10-28T17:04:06.145646-07:00","updated_at":"2025-10-30T17:05:26.042177-07:00","closed_at":"2025-10-28T19:20:09.943023-07:00"}
{"id":"bd-3e307cd4","content_hash":"2d95ea3b6835139e1fd266bbdcd0f683b5b4d26a1041516c4883beeb37b11ede","title":"File change test issue","description":"","status":"open","priority":2,"issue_type":"task","created_at":"2025-10-29T19:11:28.425601-07:00","updated_at":"2025-10-30T17:05:25.998926-07:00"}
{"id":"bd-3e9ddc31","content_hash":"4e03660281dbe2c069617fc8d723d546d6e5eb386142c0359b862747867a1b90","title":"Replace getStorageForRequest with Direct Access","description":"Replace all getStorageForRequest(req) calls with s.storage","acceptance_criteria":"- No references to getStorageForRequest() in codebase (except in deleted file)\n- All handlers use s.storage directly\n- Code compiles without errors\n\nFiles to update:\n- internal/rpc/server_issues_epics.go (~8 calls)\n- internal/rpc/server_labels_deps_comments.go (~4 calls)\n- internal/rpc/server_compact.go (~2 calls)\n- internal/rpc/server_export_import_auto.go (~2 calls)\n- internal/rpc/server_routing_validation_diagnostics.go (~1 call)\n\nPattern: store, err := s.getStorageForRequest(req) → store := s.storage","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-27T23:20:10.393759-07:00","updated_at":"2025-10-30T17:05:26.028551-07:00","closed_at":"2025-10-28T14:08:38.06721-07:00"}
@@ -91,7 +91,7 @@
{"id":"bd-7e0d6660","content_hash":"84f212d47832be4670333dc0148e3de158ca3a2dc7cb68b992f8536409272cfb","title":"Handle unchecked errors (errcheck - 683 issues)","description":"683 unchecked error returns, mostly in tests (Close, Rollback, RemoveAll). Many already excluded in config but still showing up.","design":"Review .golangci.yml exclude-rules. Most defer Close/Rollback errors in tests can be ignored. Add systematic exclusions or explicit _ = assignments where appropriate.","notes":"Fixed all errcheck warnings in production code:\n- Enabled errcheck linter (was disabled)\n- Set tests: false in .golangci.yml to focus on production code\n- Fixed 27 total errors in production code using Oracle guidance:\n * Database patterns: defer func() { _ = rows.Close() }() and defer func() { _ = tx.Rollback() }()\n * Best-effort closers: _ = store.Close(), _ = client.Close()\n * Proper error handling for file writes, fmt.Scanln(), os.Remove()\n- All tests pass\n- Only 2 \"unused\" linter warnings remain (not errcheck)","status":"closed","priority":3,"issue_type":"task","created_at":"2025-10-27T23:20:10.392336-07:00","updated_at":"2025-10-30T17:05:26.027462-07: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":"open","priority":1,"issue_type":"epic","created_at":"2025-10-28T19:30:17.465812-07:00","updated_at":"2025-10-30T17:05:25.988985-07:00"}
{"id":"bd-7e7ddffa.1","content_hash":"df6de1f6a58a995d979a7be59c2fb38800e81b96e8fa0bd39980f8bf9f1a4f37","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:05:26.037277-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-807b","content_hash":"020962d762064551d5aaaf46162eb1a36fd91cc6020349ba1fe707ef6d1d372b","title":"Remove issue_counters table from schema","description":"The issue_counters table was used for sequential ID generation and is no longer needed with hash-based IDs.\n\nFiles affected:\n- internal/storage/sqlite/schema.go (table definition around line ~160-170)\n- internal/storage/sqlite/sqlite.go:\n - getNextIDForPrefix() uses it (lines 559-574)\n - RenameCounterPrefix() uses it (around line 1605)\n - Other counter sync methods\n\nNeed to:\n1. Remove table from schema\n2. Remove all functions that interact with issue_counters\n3. Add migration to drop table from existing databases\n4. Update tests\n\nThis should be done AFTER removing AllocateNextID and collision resolution code.","status":"open","priority":1,"issue_type":"chore","created_at":"2025-10-30T22:17:21.906553-07:00","updated_at":"2025-10-30T22:17:21.906553-07:00","labels":["cleanup","hash-ids","schema"]}
{"id":"bd-807b","content_hash":"020962d762064551d5aaaf46162eb1a36fd91cc6020349ba1fe707ef6d1d372b","title":"Remove issue_counters table from schema","description":"The issue_counters table was used for sequential ID generation and is no longer needed with hash-based IDs.\n\nFiles affected:\n- internal/storage/sqlite/schema.go (table definition around line ~160-170)\n- internal/storage/sqlite/sqlite.go:\n - getNextIDForPrefix() uses it (lines 559-574)\n - RenameCounterPrefix() uses it (around line 1605)\n - Other counter sync methods\n\nNeed to:\n1. Remove table from schema\n2. Remove all functions that interact with issue_counters\n3. Add migration to drop table from existing databases\n4. Update tests\n\nThis should be done AFTER removing AllocateNextID and collision resolution code.","status":"closed","priority":1,"issue_type":"chore","created_at":"2025-10-30T22:17:21.906553-07:00","updated_at":"2025-10-31T00:19:23.871795-07:00","closed_at":"2025-10-31T00:19:23.871795-07:00","labels":["cleanup","hash-ids","schema"]}
{"id":"bd-81abb639","content_hash":"5af6696b1bbfc76056771aa71ac6f72aaadb72e3fb139c09eb7680b86c9053c8","title":"Investigate jujutsu VCS as potential solution for conflict-free merging","description":"## Context\nCurrent N-way collision resolution struggles with Git line-based merge model. When 5+ clones create issues with same ID, Git merge conflicts require manual resolution, and our collision resolver can fail during convergence rounds.\n\n## Research Question\nCould jujutsu (jj) provide better conflict handling for JSONL files?\n\n## Jujutsu Overview\n- Next-gen VCS built on libgit2\n- Designed to handle conflicts as first-class citizens\n- Supports conflict-free replicated data types (CRDTs) in some scenarios\n- Better handling of concurrent edits\n- Can work with Git repos (compatible with existing infrastructure)\n\n## Investigation Tasks\n1. JSONL Merge Behavior - How does jj handle line-by-line JSONL conflicts?\n2. Integration Feasibility - Can beads use jj as backend while maintaining Git compatibility?\n3. Conflict Resolution Model - Does jj conflict model map to our collision resolution?\n4. Operational Transform Support - Does jj implement operational transforms?\n\n## Deliverables\n1. Technical report on jj merge algorithm for JSONL\n2. Proof-of-concept: 5-clone collision test using jj instead of Git\n3. Performance comparison: Git vs jj for beads workload\n4. Recommendation: Adopt, experiment further, or abandon\n\n## References\n- https://github.com/martinvonz/jj\n- Related to bd-e6d71828, bd-7a2b58fc","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-29T20:02:47.953008-07:00","updated_at":"2025-10-30T17:05:26.002786-07:00","closed_at":"2025-10-29T20:47:52.910985-07:00"}
{"id":"bd-833559b3","content_hash":"9082c986207b9df7a7a4dc87a53007849e2b9f6e92f3bea41e22d6a14f1f6f42","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":"open","priority":1,"issue_type":"task","created_at":"2025-10-29T20:02:47.957692-07:00","updated_at":"2025-10-30T17:05:26.035926-07:00"}
{"id":"bd-83f0bb64","content_hash":"c7be091ee7e713dd9c8ec0f9a498a9ae12adb09f8b7510a5ec10a815a05322e1","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":"open","priority":1,"issue_type":"task","created_at":"2025-10-29T19:42:29.857419-07:00","updated_at":"2025-10-30T17:05:26.039924-07:00"}
@@ -114,7 +114,7 @@
{"id":"bd-a1691807","content_hash":"23f0119ee9df98f1bf6d648dba06065c156963064ef1c7308dfb02c8bdd5bc58","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":"open","priority":1,"issue_type":"task","created_at":"2025-10-29T20:49:49.105247-07:00","updated_at":"2025-10-30T17:05:26.040312-07:00"}
{"id":"bd-a40f374f","content_hash":"599448515198700decd2494cf0cea3335b013c573bdcbda90a151564585cf845","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-10-30T17:05:26.003643-07:00","closed_at":"2025-10-29T20:02:15.318966-07:00"}
{"id":"bd-a5251b1a","content_hash":"1a158c823c7152ddd5dbd11e11df32a85b699a4f05bfd2effbf4c4a3655cca6b","title":"Test RPC mutation event","description":"","status":"open","priority":2,"issue_type":"task","created_at":"2025-10-29T19:08:03.315443-07:00","updated_at":"2025-10-30T17:05:25.998693-07:00"}
{"id":"bd-a58f","content_hash":"1ad5a25551a831608ba67a8ab2a1c2cf9e5326f3a5731e83c2b51123e67befa1","title":"Fix or remove TestRemapCollisions test","description":"TestRemapCollisions in internal/storage/sqlite/collision_test.go is failing because we removed the collision remapping implementation (bd-8e05).\n\nOptions:\n1. Remove the test entirely (collision remapping no longer supported)\n2. Update test to verify the new behavior (error when collisions detected)\n\nThe test expects RemapCollisions to work, but now it returns an error because hash IDs don't need collision remapping.\n\nFile: internal/storage/sqlite/collision_test.go:730","status":"open","priority":1,"issue_type":"chore","created_at":"2025-10-30T22:30:33.13258-07:00","updated_at":"2025-10-30T22:30:33.13258-07:00","labels":["cleanup","hash-ids","tests"],"dependencies":[{"issue_id":"bd-a58f","depends_on_id":"bd-8e05","type":"blocks","created_at":"2025-10-30T22:30:33.135067-07:00","created_by":"stevey"}]}
{"id":"bd-a58f","content_hash":"1ad5a25551a831608ba67a8ab2a1c2cf9e5326f3a5731e83c2b51123e67befa1","title":"Fix or remove TestRemapCollisions test","description":"TestRemapCollisions in internal/storage/sqlite/collision_test.go is failing because we removed the collision remapping implementation (bd-8e05).\n\nOptions:\n1. Remove the test entirely (collision remapping no longer supported)\n2. Update test to verify the new behavior (error when collisions detected)\n\nThe test expects RemapCollisions to work, but now it returns an error because hash IDs don't need collision remapping.\n\nFile: internal/storage/sqlite/collision_test.go:730","status":"closed","priority":1,"issue_type":"chore","created_at":"2025-10-30T22:30:33.13258-07:00","updated_at":"2025-10-31T00:19:23.870428-07:00","closed_at":"2025-10-31T00:19:23.870428-07:00","labels":["cleanup","hash-ids","tests"],"dependencies":[{"issue_id":"bd-a58f","depends_on_id":"bd-8e05","type":"blocks","created_at":"2025-10-30T22:30:33.135067-07:00","created_by":"stevey"}]}
{"id":"bd-a599b676","content_hash":"919b081fad12885acfc2ff1defd8beb20b737db1372eff62306740371ab3b05e","title":"Test hash ID v2","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-30T14:24:38.507863-07:00","updated_at":"2025-10-30T17:05:26.038418-07:00","closed_at":"2025-10-30T14:24:47.272891-07:00"}
{"id":"bd-a5a8bec0","content_hash":"fb509cc456ea9de6000129ad7780e417d2f06361e577738709a9ccf1c3b1f3b1","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-29T19:42:29.853269-07:00","updated_at":"2025-10-30T17:05:26.001063-07:00","closed_at":"2025-10-29T16:43:30.367455-07:00"}
{"id":"bd-a5e2bd80","content_hash":"d429410e478f428289b91d4fd258797d1140adf105b54a05fb6b7fa62c91f67f","title":"Hash-based IDs with hierarchical children","description":"Replace sequential auto-increment IDs (bd-1c63eb84, bd-9063acda) with content-hash based IDs (bd-af78e9a2) and hierarchical sequential children (bd-af78e9a2.1, .2, .3).\n\n## Motivation\nCurrent sequential IDs cause collision problems when multiple clones work offline:\n- Non-deterministic convergence in N-way scenarios (bd-cbed9619.1, bd-e6d71828)\n- Complex collision resolution logic (~2,100 LOC)\n- UNIQUE constraint violations during import\n- Requires coordination between workers\n\nHash-based IDs eliminate collisions entirely at the top level, while hierarchical sequential children provide human-friendly IDs within naturally-coordinated contexts (epic ownership).\n\n## Benefits\n- ✅ Collision-free distributed ID generation (top-level)\n- ✅ Human-friendly IDs for related work (epic children)\n- ✅ Eliminates ~2,100 LOC of collision handling code\n- ✅ Better git merge behavior (different IDs = different JSONL lines)\n- ✅ True offline-first workflows\n- ✅ Simpler than dual-system (no alias counter to coordinate)\n- ✅ Natural work breakdown structure encoding in IDs\n- ✅ Enables parallel CI/CD workers without coordination\n\n## Design\n\n### ID Structure\n- **Storage:** bd-af78e9a2 (prefix + 8-char SHA256)\n- **CLI input:** Both bd-af78e9a2 AND a3f8e9 accepted (prefix optional)\n- **CLI output:** bd-af78e9a2 (always show prefix for copy-paste clarity)\n- **External refs:** bd-af78e9a2 (in commits, docs, unambiguous)\n\n**Why keep prefix in storage:**\n- Clear in external contexts (git commits, docs, Slack)\n- Grep-able across files\n- Distinguishable from git commit SHAs\n- Supports multiple databases (bd-, ticket-, bug- prefixes)\n\n**Why make optional in CLI:**\n- Less typing: bd show a3f8e9 works\n- Git-style convenience\n- Prefix inferred from context (bd command)\n\n### Hierarchical Children\n- **Epic children:** bd-af78e9a2.1, bd-af78e9a2.2, bd-af78e9a2.3 (sequential per parent)\n- **Nested epics:** bd-af78e9a2.1.1, bd-af78e9a2.1.2 (up to 3 levels deep)\n- **Leaf tasks:** Any issue without children\n\n### Example Hierarchy\n```\nbd-a3f8e9 [epic] \"Auth System\"\n ├─ bd-a3f8e9.1 [epic] \"Login Flow\"\n │ ├─ bd-a3f8e9.1.1 [task] \"Design login UI\"\n │ ├─ bd-a3f8e9.1.2 [task] \"Backend validation\"\n │ └─ bd-a3f8e9.1.3 [task] \"Integration tests\"\n ├─ bd-a3f8e9.2 [epic] \"Password Reset\"\n │ └─ bd-a3f8e9.2.1 [task] \"Email templates\"\n └─ bd-a3f8e9.3 [task] \"Update documentation\"\n```\n\n### CLI Usage\n```bash\n# All of these work (prefix optional in input):\nbd show a3f8e9\nbd show bd-a3f8e9\nbd show a3f8e9.1\nbd show bd-a3f8e9.1.2\n\n# Output always shows prefix:\nbd-a3f8e9 [epic] Auth System\n Status: open\n ...\n\n# External references use full ID:\ngit commit -m \"Implement login (bd-a3f8e9.1)\"\n```\n\n### Collision Characteristics\n- **Top-level:** NONE (content-based hash)\n- **Epic children:** RARE (epics have natural ownership, sequential creation)\n- **When they occur:** Easy to resolve (small scope, clear context)\n\n### Storage\n- JSONL stores full hierarchical IDs with prefix: bd-a3f8e9.1.2\n- Child counters table: child_counters(parent_id, last_child)\n- Counter per parent at any depth\n\n### Limits\n- Max depth: 3 levels (prevents over-decomposition)\n- Max breadth: Unlimited (tested up to 347 children)\n- Max ID length: ~20 chars at depth 3 (bd-a3f8e9.12.34.56)\n\n## Breaking Change\nThis is a v2.0 feature requiring migration. Provide bd migrate --hash-ids tool.\n\n## Timeline\n~8 weeks (Phase 1: Hash IDs 3w, Phase 2: Hierarchical children 3w, Phase 3: Testing 2w)\nSimplified from original 9-week estimate due to removal of alias system.\n\n## Dependencies\nShould complete after bd-7c5915ae (cleanup validation).","status":"open","priority":1,"issue_type":"epic","created_at":"2025-10-29T21:23:49.592315-07:00","updated_at":"2025-10-30T17:05:26.008001-07:00"}
@@ -172,7 +172,7 @@
{"id":"bd-ce37850f","content_hash":"3ef2872c3fcb1e5acc90d33fd5a76291742cbcecfbf697b611aa5b4d8ce80078","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":"open","priority":2,"issue_type":"task","created_at":"2025-10-28T14:48:29.072913-07:00","updated_at":"2025-10-30T17:05:26.036978-07:00"}
{"id":"bd-cf349eb3","content_hash":"1b42289a0cb1da0626a69c6f004bf62fc9ba6e3a0f8eb70159c5f1446497020b","title":"Update LINTING.md with current baseline","description":"After cleanup, document the remaining acceptable baseline in LINTING.md so we can track regression.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-27T23:20:10.39272-07:00","updated_at":"2025-10-30T17:05:26.027672-07:00","closed_at":"2025-10-27T23:05:31.945614-07:00"}
{"id":"bd-d355a07d","content_hash":"cd92b47a0f379c6f12d046658ec147e07fe8bc3ab1992f68f5570b7388014024","title":"Import validation falsely reports data loss on collision resolution","description":"## Problem\n\nPost-import validation reports 'data loss detected!' when import count reduces due to legitimate collision resolution.\n\n## Example\n\n```\nImport complete: 1 created, 8 updated, 142 unchanged, 19 skipped, 1 issues remapped\nPost-import validation failed: import reduced issue count: 165 → 164 (data loss detected!)\n```\n\nThis was actually successful collision resolution (bd-70419816 duplicated → remapped to bd-5dae5504), not data loss.\n\n## Impact\n\n- False alarms waste investigation time\n- Undermines confidence in import validation\n- Confuses users/agents about sync health\n\n## Solution\n\nImprove validation to distinguish:\n- Collision-resolution merges (expected count reduction)\n- Actual data loss (unexpected disappearance)\n\nTrack remapped issue count and adjust expected post-import count accordingly.","status":"open","priority":2,"issue_type":"bug","created_at":"2025-10-29T23:15:00.815227-07:00","updated_at":"2025-10-30T17:05:26.017684-07:00"}
{"id":"bd-d48f","content_hash":"0a646de50eb39bc5c49e8087b00b859feaf6a341a20115004a14d0612c23e769","title":"Fix dep_add.txt scripttest failure","description":"The dep_add.txt scripttest is failing because it references test-2 which doesn't exist:\n\nError: no issue found matching \"test-2\"\n\nThis appears to be a test data issue where the test expects sequential IDs (test-1, test-2) but we're now using hash IDs (test-d8a8, etc.).\n\nFile: cmd/bd testdata/dep_add.txt:5\n\nNeed to either:\n1. Update test to use actual created issue IDs\n2. Update test to create issues with explicit IDs\n3. Fix test to capture the generated IDs and use them","status":"open","priority":1,"issue_type":"bug","created_at":"2025-10-30T22:30:33.137581-07:00","updated_at":"2025-10-30T22:30:33.137581-07:00","labels":["hash-ids","tests"]}
{"id":"bd-d48f","content_hash":"069beb7377407c82ed5ce87502050db76b1666c5d5677eb03ca139bdf19cd6d7","title":"Fix dep_add.txt scripttest failure","description":"The dep_add.txt scripttest is failing because it references test-2 which doesn't exist:\n\nError: no issue found matching \"test-2\"\n\nThis appears to be a test data issue where the test expects sequential IDs (test-1, test-2) but we're now using hash IDs (test-d8a8, etc.).\n\nFile: cmd/bd testdata/dep_add.txt:5\n\nNeed to either:\n1. Update test to use actual created issue IDs\n2. Update test to create issues with explicit IDs\n3. Fix test to capture the generated IDs and use them","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-10-30T22:30:33.137581-07:00","updated_at":"2025-10-30T22:52:10.82693-07:00","closed_at":"2025-10-30T22:52:10.82693-07:00","labels":["hash-ids","tests"]}
{"id":"bd-d4ec5a82","content_hash":"872448809bfa26d39d68ba6cac5071379756c30bcd3b08dc75de6da56c133956","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":"open","priority":2,"issue_type":"task","created_at":"2025-10-28T14:48:29.071495-07:00","updated_at":"2025-10-30T17:05:26.036309-07:00"}
{"id":"bd-d7266f21","content_hash":"a44dbe61a808cd010cca529064732476742a1d39bfad4187b3e7fe43a8c5e6ea","title":"Port N-way test to verify hash IDs prevent collisions","description":"Create TestHashIDsNClones that:\n- Sets up 5 clones like TestFiveCloneCollision\n- Each clone creates 10 issues offline (different titles)\n- Sync in random order\n- Verify all clones converge to 50 issues with ZERO collisions\n- Verify all IDs are hash-based (bd-a3f8e9a2 format)\n- Prove we need zero collision resolution rounds\n\nThis replaces bd-a5e2bd80.10 which was too abstract. We can port the existing beads_nway_test.go structure but expect zero collisions.","status":"open","priority":1,"issue_type":"task","created_at":"2025-10-30T16:14:59.126766-07:00","updated_at":"2025-10-30T17:05:26.038644-07:00","dependencies":[{"issue_id":"bd-d7266f21","depends_on_id":"bd-a5e2bd80.8","type":"blocks","created_at":"2025-10-30T16:14:59.128072-07:00","created_by":"stevey"},{"issue_id":"bd-d7266f21","depends_on_id":"bd-a5e2bd80.11","type":"blocks","created_at":"2025-10-30T16:15:01.963945-07:00","created_by":"stevey"}]}
{"id":"bd-d7e88238","content_hash":"b69ec861618b03129fad7807b085ee6365860cfd2e9901b49eb846e192b95a0d","title":"Rapid 3","description":"","status":"open","priority":3,"issue_type":"task","created_at":"2025-10-29T19:11:57.459655-07:00","updated_at":"2025-10-30T17:05:25.999957-07:00"}