diff --git a/.beads/beads.jsonl b/.beads/beads.jsonl index 1ace9dd5..45bf6baf 100644 --- a/.beads/beads.jsonl +++ b/.beads/beads.jsonl @@ -139,7 +139,7 @@ {"id":"bd-58c0","content_hash":"112d4123250ac875619a1f239cbf73c859b58d87f2b45a2d649da320dd72ecc5","title":"Fix transaction conflict in TryResurrectParent","description":"Integration test TestImportWithDeletedParent fails with 'database is locked' error when resurrection happens inside CreateIssue.\n\nRoot cause: TryResurrectParent calls conn.Get() and insertIssue() which conflicts with existing transaction in CreateIssue.\n\nError: failed to create tombstone for parent bd-parent: failed to insert issue: sqlite3: database is locked\n\nSolution: Refactor resurrection to accept optional transaction parameter, use existing transaction when available instead of creating new connection.\n\nImpact: Blocks resurrection from working in CreateIssue flow, only works in EnsureIDs (which may not have active transaction).","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-04T16:32:20.981027-08:00","updated_at":"2025-11-04T17:00:44.258881-08:00","closed_at":"2025-11-04T17:00:44.258881-08:00","source_repo":".","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-5a90","content_hash":"819c14b3bb55fcd113b4e848e4bfcb0c3475756658575dba8d34922ca8e14077","title":"Test parent issue","description":"","status":"open","priority":3,"issue_type":"task","created_at":"2025-11-02T11:50:35.85367-08:00","updated_at":"2025-11-02T11:50:35.85367-08:00","source_repo":"."} {"id":"bd-5aad5a9c","content_hash":"b51a8fcbb4e418f1c2e0eafebaa22fd90476d51f184f0b0727e624fea57abd88","title":"Add TestNWayCollision for 5+ clones","description":"## Overview\nAdd comprehensive tests for N-way (5+) collision resolution to verify the solution scales beyond 3 clones.\n\n## Purpose\nWhile TestThreeCloneCollision validates the basic N-way case, we need to verify:\n1. Solution scales to arbitrary N\n2. Performance is acceptable with more clones\n3. Convergence time is bounded\n4. No edge cases in larger collision groups\n\n## Implementation Tasks\n\n### 1. Create TestFiveCloneCollision\nFile: beads_twoclone_test.go (or new beads_nway_test.go)\n\n```go\nfunc TestFiveCloneCollision(t *testing.T) {\n // Test with 5 clones creating same ID with different content\n // Verify all 5 clones converge after sync rounds\n \n t.Run(\"SequentialSync\", func(t *testing.T) {\n testNCloneCollision(t, 5, \"A\", \"B\", \"C\", \"D\", \"E\")\n })\n \n t.Run(\"ReverseSync\", func(t *testing.T) {\n testNCloneCollision(t, 5, \"E\", \"D\", \"C\", \"B\", \"A\")\n })\n \n t.Run(\"RandomSync\", func(t *testing.T) {\n testNCloneCollision(t, 5, \"C\", \"A\", \"E\", \"B\", \"D\")\n })\n}\n```\n\n### 2. Implement generalized testNCloneCollision\nGeneralize the 3-clone test to handle arbitrary N:\n\n```go\nfunc testNCloneCollision(t *testing.T, numClones int, syncOrder ...string) {\n t.Helper()\n \n if len(syncOrder) != numClones {\n t.Fatalf(\"syncOrder length (%d) must match numClones (%d)\", \n len(syncOrder), numClones)\n }\n \n tmpDir := t.TempDir()\n \n // Setup remote and N clones\n remoteDir := setupBareRepo(t, tmpDir)\n cloneDirs := make(map[string]string)\n \n for i := 0; i \u003c numClones; i++ {\n name := string(rune('A' + i))\n cloneDirs[name] = setupClone(t, tmpDir, remoteDir, name)\n }\n \n // Each clone creates issue with same ID but different content\n for name, dir := range cloneDirs {\n createIssue(t, dir, fmt.Sprintf(\"Issue from clone %s\", name))\n }\n \n // Sync in specified order\n for _, name := range syncOrder {\n syncClone(t, cloneDirs[name], name)\n }\n \n // Final pull for convergence\n for name, dir := range cloneDirs {\n finalPull(t, dir, name)\n }\n \n // Verify all clones have all N issues\n expectedTitles := make(map[string]bool)\n for i := 0; i \u003c numClones; i++ {\n name := string(rune('A' + i))\n expectedTitles[fmt.Sprintf(\"Issue from clone %s\", name)] = true\n }\n \n for name, dir := range cloneDirs {\n titles := getTitles(t, dir)\n if !compareTitleSets(titles, expectedTitles) {\n t.Errorf(\"Clone %s missing issues: expected %v, got %v\", \n name, expectedTitles, titles)\n }\n }\n \n t.Log(\"✓ All\", numClones, \"clones converged successfully\")\n}\n```\n\n### 3. Add performance benchmarks\nTest convergence time and memory usage:\n\n```go\nfunc BenchmarkNWayCollision(b *testing.B) {\n for _, n := range []int{3, 5, 10, 20} {\n b.Run(fmt.Sprintf(\"N=%d\", n), func(b *testing.B) {\n for i := 0; i \u003c b.N; i++ {\n // Run N-way collision and measure time\n testNCloneCollisionBench(b, n)\n }\n })\n }\n}\n```\n\n### 4. Add convergence time tests\nVerify bounded convergence:\n\n```go\nfunc TestConvergenceTime(t *testing.T) {\n // Test that convergence happens within expected rounds\n // For N clones, should converge in at most N-1 sync rounds\n \n for n := 3; n \u003c= 10; n++ {\n t.Run(fmt.Sprintf(\"N=%d\", n), func(t *testing.T) {\n rounds := measureConvergenceRounds(t, n)\n maxExpected := n - 1\n if rounds \u003e maxExpected {\n t.Errorf(\"Convergence took %d rounds, expected ≤ %d\", \n rounds, maxExpected)\n }\n })\n }\n}\n```\n\n### 5. Add edge case tests\nTest boundary conditions:\n- All N clones have identical content (dedup works)\n- N-1 clones have same content, 1 differs\n- All N clones have unique content\n- Mix of collisions and non-collisions\n\n## Acceptance Criteria\n- TestFiveCloneCollision passes with all sync orders\n- All 5 clones converge to identical content\n- Performance is acceptable (\u003c 5 seconds for 5 clones)\n- Convergence time is bounded (≤ N-1 rounds)\n- Edge cases handled correctly\n- Benchmarks show scalability to 10+ clones\n\n## Files to Create/Modify\n- beads_twoclone_test.go or beads_nway_test.go\n- Add helper functions for N-clone setup\n\n## Testing Strategy\n\n### Test Matrix\n| N Clones | Sync Orders | Expected Result |\n|----------|-------------|-----------------|\n| 3 | A→B→C | Pass |\n| 3 | C→B→A | Pass |\n| 5 | A→B→C→D→E | Pass |\n| 5 | E→D→C→B→A | Pass |\n| 5 | Random | Pass |\n| 10 | Sequential | Pass |\n\n### Performance Targets\n- 3 clones: \u003c 2 seconds\n- 5 clones: \u003c 5 seconds\n- 10 clones: \u003c 15 seconds\n\n## Dependencies\n- Requires bd-cbed9619.5, bd-cbed9619.4, bd-cbed9619.3, bd-dcd6f14b to be completed\n- TestThreeCloneCollision must pass first\n\n## Success Metrics\n- All tests pass for N ∈ {3, 5, 10}\n- Convergence time scales linearly (O(N))\n- Memory usage reasonable (\u003c 100MB for 10 clones)\n- No data corruption or loss in any scenario","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-29T19:52:05.462747-07:00","updated_at":"2025-10-31T12:00:43.198413-07:00","closed_at":"2025-10-31T12:00:43.198413-07:00","source_repo":"."} -{"id":"bd-5arw","content_hash":"6dffc83cc55a07fdecec9a1ecf0a03b840f9ecaef0d8ee2be903ce3be893a648","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":"open","priority":1,"issue_type":"task","created_at":"2025-11-20T09:53:38.314776-08:00","updated_at":"2025-11-20T11:17:16.933581-08:00","source_repo":"."} +{"id":"bd-5arw","content_hash":"92d1c63f51beb16ddf351781eb4f9cb681555382ab297254736b982880c159c8","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","source_repo":"."} {"id":"bd-5b40a0bf","content_hash":"12e4543067c29e5c85e092493d5f5f8898b9bf52b92b168d17b30c7d98fc6eda","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-10-31T12:00:43.181513-07:00","closed_at":"2025-10-31T12:00:43.181513-07:00","source_repo":"."} {"id":"bd-5b6e","content_hash":"f82a86b4aae21311f23c8511a242f16e96d03836300995fadd43b8bea945cefa","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","source_repo":"."} {"id":"bd-5bbf","content_hash":"a7c234437e23726f7a6d9733b20e6a344d1e352a1820b6cce6cd79a3fe1c8713","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-11-05T00:55:48.757247-08:00","closed_at":"2025-11-05T00:55:48.757249-08:00","source_repo":".","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"}]}