fix(sync): prevent daemon race condition from dirtying working directory

After bd sync completes with sync.branch mode, the daemon or next CLI
command could see a hash mismatch between the restored JSONL file and
the DB metadata, triggering auto-import which then schedules re-export,
dirtying the working directory.

Two fixes:
1. sync.go: Update jsonl_content_hash after restoreBeadsDirFromBranch
   to match the restored file hash
2. daemon_sync.go: Update jsonl_content_hash after performAutoImport
   succeeds (was missing, unlike CLI import path)

Fixes: bd-lw0x, bd-hxou

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Steve Yegge
2025-12-13 06:45:13 -08:00
parent 7d35f9b196
commit 97500a8de0
2 changed files with 21 additions and 0 deletions

View File

@@ -666,6 +666,15 @@ Use --merge to merge the sync branch back to main branch.`,
if err := restoreBeadsDirFromBranch(ctx); err != nil {
// Non-fatal - just means git status will show modified files
debug.Logf("sync: failed to restore .beads/ from branch: %v", err)
} else {
// Update jsonl_content_hash to match the restored file
// This prevents daemon/CLI from seeing a hash mismatch and re-importing
// which would trigger re-export and dirty the working directory (bd-c83r race fix)
if restoredHash, err := computeJSONLHash(jsonlPath); err == nil {
if err := store.SetMetadata(ctx, "jsonl_content_hash", restoredHash); err != nil {
debug.Logf("sync: failed to update hash after restore: %v", err)
}
}
}
// Skip final flush in PersistentPostRun - we've already exported to sync branch
// and restored the working directory to match the current branch