feat(collab): deck-diff naar ops — de editor→op-brug (increment 3a van #996) #1000

Merged
brenno merged 1 commit from collab/inc3-editor-op-bridge into main 2026-07-30 17:33:02 +00:00
Owner

Increment 3a van #996: de editor→op-brug (COLLABORATION.md §5.1) — de onderspecificeerde kern die increment 2 aankondigde.

De editor vervangt bij elke bewerking het hele Deck, maar de laag synct veld-ops (P5). deckDiffToOps(before, after) rekent een deck-brede bewerking terug naar precies de ops die after reproduceren: veld-edits (op slide-id), dan verwijderingen, invoegingen (die de hele nieuwe slide meedragen) en herordeningen die het resultaat in de doelvolgorde sorteren. Correct voor élke before→after, niet alleen een enkele actie; exact voor het syncbare SlideField/DeckMetaField-oppervlak en laat al het overige (tabelrijen, annotaties, het zegel) met opzet ongemoeid, net als het op-model. Levert ook de lees-tegenhangers slideFieldValue/deckMetaValue van de setters in applyOp.

Getest met de sterkste toets — na het toepassen van de diff is een nieuwe diff leeg, dus after is op het hele syncbare oppervlak gereproduceerd — over enkele edits, lijstvelden, invoegen/verwijderen/herordenen, een gecombineerde bewerking en een volledige vervanging.

make check groen (dekking 87,4%, 742 bestanden). Volgende stap: de provider die dit bij een lokale bewerking aanroept en de sessie voedt (met de merge applyOps(local, diff(local, session)) die niet-syncbare velden behoudt), en de echo-lus-guard (increment 3b).

Increment 3a van #996: de editor→op-brug (COLLABORATION.md §5.1) — de onderspecificeerde kern die increment 2 aankondigde. De editor vervangt bij elke bewerking het hele `Deck`, maar de laag synct veld-ops (P5). `deckDiffToOps(before, after)` rekent een deck-brede bewerking terug naar precies de ops die `after` reproduceren: veld-edits (op slide-id), dan verwijderingen, invoegingen (die de hele nieuwe slide meedragen) en herordeningen die het resultaat in de doelvolgorde sorteren. Correct voor élke before→after, niet alleen een enkele actie; exact voor het syncbare `SlideField`/`DeckMetaField`-oppervlak en laat al het overige (tabelrijen, annotaties, het zegel) met opzet ongemoeid, net als het op-model. Levert ook de lees-tegenhangers `slideFieldValue`/`deckMetaValue` van de setters in `applyOp`. Getest met de sterkste toets — na het toepassen van de diff is een nieuwe diff leeg, dus `after` is op het hele syncbare oppervlak gereproduceerd — over enkele edits, lijstvelden, invoegen/verwijderen/herordenen, een gecombineerde bewerking en een volledige vervanging. `make check` groen (dekking 87,4%, 742 bestanden). Volgende stap: de provider die dit bij een lokale bewerking aanroept en de sessie voedt (met de merge `applyOps(local, diff(local, session))` die niet-syncbare velden behoudt), en de echo-lus-guard (increment 3b).
feat(collab): deck-diff to ops, the editor->op seam (#996)
All checks were successful
scans / scans (pull_request) Successful in 3m32s
620ed71350
The editor replaces the whole Deck on every edit, but the collaboration
layer syncs field-level ops (P5). deckDiffToOps(before, after) bridges
the two: it returns the ops that, applied in order to `before`, reproduce
`after` exactly — field edits keyed by slide id, then removes, inserts
(each carrying the whole new slide), then reorders that sort the result
into the target order. Correct for any before->after, not just a single
action; exact for the syncable SlideField/DeckMetaField surface and, by
construction, leaving everything outside it (table rows, annotations, the
seal) alone as the op model does. Ships the read counterparts
slideFieldValue/deckMetaValue of applyOp's setters.

Tested with the strongest check — after applying the diff a fresh diff is
empty, so `after` was reproduced on the whole syncable surface — across
single edits, list fields, insert/remove/reorder, a combined edit and a
full replace. Increment 3a of #996; the provider that calls this on a
local edit and feeds the session (§5.7) follows.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
brenno merged commit de63e4e7cd into main 2026-07-30 17:33:02 +00:00
Sign in to join this conversation.
No description provided.