The timestamp-only deduplication feature causes data loss when
export_hashes table gets out of sync with JSONL file (after git
operations, imports, etc). This leads to exports skipping issues
that aren't actually in the file.
Symptoms we saw:
- Export reports 'Skipped 128 issues with timestamp-only changes'
- JSONL only has 38 lines but DB has 149 issues
- Two repos on same commit show different issue counts
- Auto-import doesn't trigger (hash matches despite missing data)
Fix: Disable the feature entirely until we can implement proper
JSONL integrity validation (see bd-160 for proposed solutions).
- Remove unreachable function DroppedEventsCount from RPC server
- Add TestMutationToExportLatency for event-driven daemon validation
- Test currently skipped pending full bd-85 implementation
- Create test coverage improvement issues (bd-114 through bd-118)
- All validation checks pass: tests, build, linting baseline
Completed: bd-74, bd-77
Amp-Thread-ID: https://ampcode.com/threads/T-24404401-6c5b-466d-9045-0da3a70cff9a
Co-authored-by: Amp <amp@ampcode.com>
- Scans all issues for dependencies pointing to non-existent issues
- Reports orphaned dependencies with issue ID, depends_on ID, and type
- --fix flag automatically removes all orphaned dependencies
- --interactive mode prompts for each orphan before removal
- Uses direct SQL deletion to avoid foreign key errors on missing issues
- JSON output support with --json flag
- 4 comprehensive tests covering scan, fix, and multiple dependency types
Amp-Thread-ID: https://ampcode.com/threads/T-942a3e75-f90b-45b4-9f88-c7f1b8298cef
Co-authored-by: Amp <amp@ampcode.com>
- Test batching of multiple triggers into single action
- Test timer reset on subsequent triggers
- Test cancellation during wait and immediately after trigger
- Test thread safety with deterministic concurrent trigger batching
- All tests use t.Cleanup to prevent goroutine leaks
- Tests pass with -race detector
- Test JSONL change detection with fsnotify
- Test multiple changes debounced into single action
- Test git ref change detection (platform-aware, skips if unsupported)
- Test file removal/recreation handling (platform-aware)
- Test polling fallback mode
- Test polling detects file disappearance
- Test proper cleanup with Close()
All 7 tests pass. Two tests skip gracefully on platforms where
fsnotify doesn't support git ref watching or file removal/recreation
events. No linter warnings for new test file.
Closes bd-78
Amp-Thread-ID: https://ampcode.com/threads/T-76e7b2ba-150c-461f-83e2-4a6d509d6b53
Co-authored-by: Amp <amp@ampcode.com>
- Add mutation events for label/dep/comment operations
- Create separate export-only and import-only functions
- Add dropped events counter with safety net export
- Complete bd-80 mutation channel implementation
Event-driven mode now:
- Emits mutation events for ALL write operations (not just create/update/close)
- Uses createExportFunc() for mutations (export+commit/push only, no pull)
- Uses createAutoImportFunc() for file changes (pull+import only, no export)
- Tracks dropped events and triggers safety export every 60s if any dropped
- Achieves <500ms latency target by avoiding full sync on each trigger
Behind BEADS_DAEMON_MODE=events flag (poll is still default)
- Add AllocateNextID() public method to SQLiteStorage for cross-package ID allocation
- Enhance handleRename() to handle collision during rename with retry logic
- Fix stale ID map issue by removing deleted IDs from dbByID after rename
- Update edge case tests to use convergence rounds consistently
- All N-way collision tests now pass (TestFiveCloneCollision, TestEdgeCases)
- Added ExecInTransaction helper for atomic database operations
- Added IsUniqueConstraintError to detect UNIQUE constraint violations
- Wrapped RemapCollisions with retry logic (3 attempts with counter sync)
- Enhanced handleRename to detect race conditions where target ID exists
- Added defensive checks for when old ID has been deleted by another clone
Progress: Improves N-way collision handling, though full solution requires
more work (tracked in bd-108). Tests now reach later convergence rounds
before hitting complex collision scenarios.
Amp-Thread-ID: https://ampcode.com/threads/T-2b850a80-f8bd-4e38-b661-e33d1cfa7281
Co-authored-by: Amp <amp@ampcode.com>
Created four issues to address N-way collision limitations:
- bd-109: Add transaction + retry logic (P1, immediate fix)
- bd-110: Implement clone-scoped ID allocation (P2, medium-term)
- bd-111: Investigate jujutsu VCS for better merging (P2, research)
- bd-112: CRDT-based architecture for v2.0 (P3, long-term)
These address the KNOWN LIMITATION documented in beads_nway_test.go
where 5+ clone collisions fail during convergence with UNIQUE constraint
violations.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Created beads_nway_test.go with generalized N-clone collision testing
- Implemented TestFiveCloneCollision with 3 sync order variations
- Added TestTenCloneCollision for scaling verification
- Added TestEdgeCases (identical content, one different, mixed collisions)
- Added TestConvergenceTime for bounded convergence verification
- Tests document known limitation: UNIQUE constraint failures during
convergence when multiple clones remap to same target ID
- Pattern matches TestThreeCloneCollision approach of documenting
current behavior for future improvement
Amp-Thread-ID: https://ampcode.com/threads/T-012146d5-1841-4187-8619-230063e7711d
Co-authored-by: Amp <amp@ampcode.com>