todo-app/test
Krzysztof kuhy Rudnicki 313368530a Restore notes at their own edit time, not "now"
Backup recovery and file import both wrote restored notes through `upsert`,
which stamps a fresh clock. Under crdt_sync's per-field last-writer-wins that
makes a *restore* outrank every other device: the restoring device claims it
edited every field just now, so it silently overwrites newer edits made
elsewhere on the next sync.

This is not hypothetical. The new desktop app seeded itself from BACKLOG.md and
rewrote 245 of 330 field clocks to today under a fresh node id, then synced --
taking authority over the phone for ~74% of all fields. Content happened to
survive (the copy came from the same data; only a trailing newline on 5 notes
differed via the Markdown round-trip), but nothing about the mechanism
guaranteed that.

The legacy sqlite migration already did the right thing for exactly this
reason, so the fix is to use that same helper everywhere a note is *restored*
rather than newly written. Renamed legacyRecordFor -> recordAtNoteTime, since
it is no longer migration-specific.

The freshness check in importNotes is unchanged: it decides whether the import
wins *locally*. The clock decides whether it wins on *other* devices, and an
import must not win there merely by being recent.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-20 14:24:13 +02:00
..
capture_screen_test.dart Surface sync outcomes so devices can't silently diverge 2026-07-16 17:58:41 +02:00
fake_note_repository.dart Make the app compile and run for web, behind platform seams 2026-07-20 13:14:03 +02:00
fake_secure_storage.dart Store the GitHub sync token in the OS keystore, migrating off plaintext 2026-06-15 22:57:05 +02:00
github_device_auth_test.dart Reach 100% test coverage (capture-screen sync DI + plugin/clipboard fakes) 2026-06-15 17:11:01 +02:00
local_backup_test.dart Cut per-keystroke O(N) work to keep capture smooth at scale 2026-07-11 21:51:46 +02:00
markdown_view_test.dart Add full note view/editor with templates and Markdown render 2026-06-15 21:59:31 +02:00
note_detail_screen_test.dart Add priority/template wizard and raw-as-default for guided mode 2026-06-27 12:10:21 +02:00
note_editor_test.dart Rework guided mode from Stepper to full-screen per-step view 2026-06-27 12:15:19 +02:00
note_repository_test.dart Restore notes at their own edit time, not "now" 2026-07-20 14:24:13 +02:00
note_template_test.dart Add full note view/editor with templates and Markdown render 2026-06-15 21:59:31 +02:00
note_test.dart Add list filters/sort, status, priority rework, export/import, structured template 2026-06-15 16:52:59 +02:00
notes_list_screen_test.dart Add full note view/editor with templates and Markdown render 2026-06-15 21:59:31 +02:00
notes_markdown_test.dart Add list filters/sort, status, priority rework, export/import, structured template 2026-06-15 16:52:59 +02:00
settings_screen_test.dart Add the desktop wrapper, and stop the test suite eating BACKLOG.md 2026-07-20 13:33:25 +02:00
sync_service_test.dart Surface sync outcomes so devices can't silently diverge 2026-07-16 17:58:41 +02:00
sync_settings_test.dart Point notes sync at the consolidated syncs monorepo 2026-07-10 14:04:05 +02:00
wrapper_server_test.dart Add the desktop wrapper, and stop the test suite eating BACKLOG.md 2026-07-20 13:33:25 +02:00