mirror of
https://github.com/storytold/photocraft.git
synced 2026-11-02 14:27:35 -06:00
On Windows the recovery sidecar was written through store::write_atomic, which replaces the old file with ReplaceFileW: it moves the old sidecar to a backup name first and only then moves the new one in. A recovery listing in between saw the bundle without its sidecar and listed the entry twice, or not at all (so a recovery prompt could miss a document). The flaky autosave::recovered_entries_survive_a_second_crash_until_saved_or_closed on Windows CI was this. The sidecar now goes through one AtomicFs on every platform whose replace is a plain rename (one step); Unix keeps its 0600 temp file, Windows still refuses a read-only sidecar up front. Recovery data is private to the app, so ReplaceFileW's ACL/stream preservation isn't needed. Test: a_listing_during_an_autosave_sees_the_entry_exactly_once lists the recovery folder while an autosaver rewrites the entry 200 times. With the old code it failed 3 of 3 runs on Windows (two entries, once none); with the fix it passes 3 of 3. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>