This commit is contained in:
Andras Schmelczer 2026-09-26 20:22:16 +01:00
commit b07aa589ff

View file

@ -18,11 +18,22 @@ UUID is rejected.
## Reconciliation
A new client reads a coherent vault snapshot, applies it, then replays
An absent event cursor marks a new client or a durable history reset. The client
reads a coherent vault snapshot, applies it, then replays
subsequent events over HTTP. Pages are folded in memory to their final document
heads and manifest before changing local files. Interrupted fetching restarts from
the last incorporated cursor without saved pagination state. This avoids applying
intermediate remote edits that were already reverted.
intermediate remote edits that were already reverted. Bootstrap snapshots are
refetched after interruption rather than persisted. One reconciliation pass
handles the folded events, local scans, and previously deferred downloads.
Each document stores a base version/hash and the last observed disk hash. A remote
head is retained only until it can be applied. The observed hash records local
presence as well as rename evidence; there are no separate bootstrap or
materialization flags. Scans rebuild physical exclusions. Original server paths
remain saved while excluded, so ignoring a file cannot publish a deletion or
forget a deferred rename. Rejected payloads and messages live on the retained
requests that event replay already needs for uncertain acknowledgements.
For text, the client compares the common base, current local bytes and current
remote bytes using `reconcile-text`. Configured extensions and valid UTF-8 without
@ -75,9 +86,11 @@ The client persists and echoes it; the server rejects a checkpoint from a discar
history before executing its request. Each new event gets a fresh token even if
its numeric ID or request UUID was used on the discarded branch.
After a mismatch, the client records reset intent, clears old history-dependent state and bootstraps against the restored
server. Clean files reconcile against the restored snapshot. Unsent edits with an
old base are preserved as separate local documents, with conflict names if needed.
After a mismatch, the client clears the event cursor and old history-dependent
state before releasing the transport checkpoint, then bootstraps against the
restored server. Clean files retain only their hash, with no old version ID or
content copy. Unsent edits, including changes made while recovery is interrupted,
are preserved as separate local documents, with conflict names if needed.
Interrupted recovery saves are replayable. Backups must be restored with the server
stopped.