Documentation is work in progress and not completeEditor
FlashCC/Infrastructure/Section 23 of 29

Sync

Last write wins on the record’s own updatedAt, deletion competes on the same terms as an edit, and the pull is deliberately full rather than incremental.

Last write wins on the record’s own updatedAt. Not CRDTs, not field-level merging. One person on a laptop and a phone rarely touches the same carousel in the same minute, and when they do, "the newer edit survives" is a result they can predict. A clever merge produces a slide neither device ever had, and nobody can explain it afterwards.

Deletion is not a special case. A deleted record becomes an entry whose value is null and whose timestamp is when it went, so it competes on the same terms as an edit. Without that, deleting a project on your laptop and syncing your phone resurrects it — and keeps resurrecting it every time the two meet.

Ties resolve to doing nothing, which is what makes a repeated sync free.

The pull is deliberately full, not incremental. An incremental pull keyed on the server clock can only be correct once every device is known to have seen every tombstone, and getting that wrong resurrects deleted records. server_updated_at and the sync indexes exist for that future; the cursor is currently written and read only for the UI label.

Docs push before posts, because posts reference docs. Tombstones are cleared only after the upsert succeeds.

Triggers: session adoption, window focus (throttled to 30s), 3s after local edits settle, manual, and sign-out. Sign-out pushes before it clears — the other order throws away anything edited since the last sync.