Skip to content

v2.1.1 — sync-engine correctness hardening

Choose a tag to compare

@KeilerHirsch KeilerHirsch released this 14 Jul 01:11
· 34 commits to main since this release

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 harvest and 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 own updated_at against the server's and re-fetches on any mismatch.
  • One-shot harvest no longer reports success on a partial export. A mid-pagination listing failure used to break and then report "DONE … 0 errors" over an incomplete list. Listing failures are now fatal with a clear INCOMPLETE message.
  • Data race on os.Stdout in the tray daemon. Project-doc/memory diagnostics wrote straight to the os.Stdout package variable from the background sync goroutine while the tray "Beenden" handler reassigned it on another goroutine. They now route through the same logf sink.

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.