v2.1.1 — sync-engine correctness hardening
A focused correctness pass on the live-sync engine after a full multi-agent ECC review (Go + security reviewer; gosec, staticcheck, govulncheck all clean). The security surface came through clean — every fix here is in the sync/robustness path.
Fixed
- Silent data loss on the first daemon cycle. The daemon seeded its sync state from any existing on-disk file without checking that the file reflected the conversation's current server version — a conversation edited between the one-shot
harvestand the first daemon cycle was recorded as up to date while the file still held old content, and never re-fetched. It now compares the file's ownupdated_atagainst the server's and re-fetches on any mismatch. - One-shot
harvestno longer reports success on a partial export. A mid-pagination listing failure used tobreakand then report "DONE … 0 errors" over an incomplete list. Listing failures are now fatal with a clear INCOMPLETE message. - Data race on
os.Stdoutin the tray daemon. Project-doc/memory diagnostics wrote straight to theos.Stdoutpackage variable from the background sync goroutine while the tray "Beenden" handler reassigned it on another goroutine. They now route through the samelogfsink.
Internal
- Shared conversation-listing and filename helpers (DRY; root cause of the partial-export drift), injectable retry/backoff delays, and sync-engine regression tests. Coverage 20.9% → 27.2%.
Full details in CHANGELOG.md.