Files
james.maes adef7fc1b6 fix(store): harden placement queries, paging, and write locking
Five defects found in review:

- existing_placements never pinned that a never-saved key is absent, and
  its negative case was vacuous (no Archive row existed to over-report).
  Over-reporting makes genuinely new mail look already-seen and be
  skipped by the sync classifier. Both are now real assertions, backed
  by a count so a dropped IN filter fails.
- save_email_at and delete_placements both read then write in one
  deferred transaction. In WAL mode that aborts with SQLITE_BUSY, which
  busy_timeout does not retry; twenty racing saves reproducibly failed.
  Both now use BEGIN IMMEDIATE, matching the WORM and ledger appenders,
  with a concurrency regression test.
- list_messages_page claimed the folder join was one-to-one. It is not:
  the placements key permits one message in one folder twice, and the
  message-only cursor made the second row unreachable across a page
  boundary. The keyset now carries the full placement address.
- list_messages_for_export matched a folder id without its account,
  reintroducing the cross-account collision this model removes.
2026-08-11 15:31:06 -05:00
..