Samenwerken: Fase 0.5 afmaken — snapshot + sessie-bedrading #996

Closed
opened 2026-07-30 16:33:45 +00:00 by brenno · 4 comments
Owner

Vervolg op #989 (de WebdavAsyncTransport landde als bouwblok; snapshot-herbaselijning §5.2 en de bedrading §5.7 bleven bewust vervolg, net als bij #988). Deze issue maakt Fase 0.5 af tot iets dat een gebruiker écht kan gebruiken: asynchroon co-auteuren van een deck over de WebDAV die hij al heeft.

Increment 1 — Snapshot / gedeelde baseline (§5.2, §5.5). Een Deck-JSON-(de)serialiser naast de bestaande op-codec (collab_codec.dart heeft al slideToJson/fromJson; deck-meta erbij). De eigenaar schrijft bij sessie-start een snapshot naar de sidecar; de deelnemer leest hem, zodat beide dezelfde slide-id's dragen (§5.5 — zonder dit hergenereert elk parseDeck andere id's en desynct elke op). JSON, geen Markdown-round-trip (P5). Volledig getest.

Increment 2 — Sessie-bedrading (§5.7). Een collab_session_provider (StateNotifier over een CollabSession die een transport bezit), een SessionRef-naad op TabInfo, en de per-tab override in app_shell (naast deckProvider e.d. — een deck-rakende provider die je vergeet te overschrijven leest stil deck==null). De sessie voedt het tab-deck; lokale bewerkingen stromen als intents naar buiten. Start (snapshot pushen + autoriteit worden), deelnemen (snapshot + inhaalslag), einde (alleen de eigenaar persisteert, §6.5/P2).

Increment 3 — Interface. Sessie starten/delen/deelnemen vanuit de shell voor een deck met een WebDAV-origin. Geen chat/presence/realtime — dat is Fase 1 (Matrix, #977, op pauze).

Raakt het .md niet (P2): de snapshot + de op-log leven in een sidecar naast het deck. Geen nieuwe deps. Referentie: COLLABORATION.md §5.2, §5.5, §5.7, §6.5; assurance/ketenkeuring-matrix-*.md (waarom dit de weg is zolang Matrix geparkeerd staat).

Vervolg op #989 (de WebdavAsyncTransport landde als bouwblok; snapshot-herbaselijning §5.2 en de bedrading §5.7 bleven bewust vervolg, net als bij #988). Deze issue maakt Fase 0.5 af tot iets dat een gebruiker écht kan gebruiken: asynchroon co-auteuren van een deck over de WebDAV die hij al heeft. **Increment 1 — Snapshot / gedeelde baseline (§5.2, §5.5).** Een Deck-JSON-(de)serialiser naast de bestaande op-codec (collab_codec.dart heeft al slideToJson/fromJson; deck-meta erbij). De eigenaar schrijft bij sessie-start een snapshot naar de sidecar; de deelnemer leest hem, zodat beide dezelfde slide-id's dragen (§5.5 — zonder dit hergenereert elk parseDeck andere id's en desynct elke op). JSON, geen Markdown-round-trip (P5). Volledig getest. **Increment 2 — Sessie-bedrading (§5.7).** Een collab_session_provider (StateNotifier over een CollabSession die een transport bezit), een SessionRef-naad op TabInfo, en de per-tab override in app_shell (naast deckProvider e.d. — een deck-rakende provider die je vergeet te overschrijven leest stil deck==null). De sessie voedt het tab-deck; lokale bewerkingen stromen als intents naar buiten. Start (snapshot pushen + autoriteit worden), deelnemen (snapshot + inhaalslag), einde (alleen de eigenaar persisteert, §6.5/P2). **Increment 3 — Interface.** Sessie starten/delen/deelnemen vanuit de shell voor een deck met een WebDAV-origin. Geen chat/presence/realtime — dat is Fase 1 (Matrix, #977, op pauze). Raakt het .md niet (P2): de snapshot + de op-log leven in een sidecar naast het deck. Geen nieuwe deps. Referentie: COLLABORATION.md §5.2, §5.5, §5.7, §6.5; assurance/ketenkeuring-matrix-*.md (waarom dit de weg is zolang Matrix geparkeerd staat).
Author
Owner

Opgepakt. Tak: collab/webdav-session-wiring. Increment 1 (snapshot-codec) eerst, apart gepoort en geland; daarna de provider-/sessie-bedrading.

Opgepakt. Tak: collab/webdav-session-wiring. Increment 1 (snapshot-codec) eerst, apart gepoort en geland; daarna de provider-/sessie-bedrading.
Author
Owner

Increments 1 en 2 geland op main:

  • Increment 1 (PR #997, merge 4defcbec-basis): CollabSnapshot — de gedeelde slide-id-baseline (§5.2/§5.5) + een snapshot-slot op de store.
  • Increment 2 (PR #999, merge 5349d2ab): collab_session_launch.dart — hostCollabSession/joinCollabSession knopen snapshot + transport + autoriteit tot start/join (§6.5). Store-generiek, end-to-end getest (id-overname, inhaalslag, gast-round-trip). make check groen.

De collab-laag kan nu programmatisch een async WebDAV-sessie hosten en bijkomen. Resteert increment 3 (§5.7): de provider-/UI-bedrading (collab_session_provider + per-tab override in app_shell + start/delen/deelnemen-acties) én de editor→op-adapter die een deck-brede bewerking naar de veld-ops vertaalt die de sessie indient. Dat laatste is de onderspecificeerde kern en verdient een eigen ontwerpronde; het is UI-zwaar en botst met de meerdere concurrente sessies in deze repo. Daarom hier gestopt met increment 3 open — laat maar weten of ik het oppak.

Increments 1 en 2 geland op main: - Increment 1 (PR #997, merge 4defcbec-basis): CollabSnapshot — de gedeelde slide-id-baseline (§5.2/§5.5) + een snapshot-slot op de store. - Increment 2 (PR #999, merge 5349d2ab): collab_session_launch.dart — hostCollabSession/joinCollabSession knopen snapshot + transport + autoriteit tot start/join (§6.5). Store-generiek, end-to-end getest (id-overname, inhaalslag, gast-round-trip). make check groen. De collab-laag kan nu programmatisch een async WebDAV-sessie hosten en bijkomen. Resteert increment 3 (§5.7): de provider-/UI-bedrading (collab_session_provider + per-tab override in app_shell + start/delen/deelnemen-acties) én de editor→op-adapter die een deck-brede bewerking naar de veld-ops vertaalt die de sessie indient. Dat laatste is de onderspecificeerde kern en verdient een eigen ontwerpronde; het is UI-zwaar en botst met de meerdere concurrente sessies in deze repo. Daarom hier gestopt met increment 3 open — laat maar weten of ik het oppak.
Author
Owner

Increment 3 grotendeels geland — de collab-laag is nu compleet en getest.

  • 3a (PR #1000): collab_deck_diff.dart — deckDiffToOps rekent een deck-brede bewerking terug naar de veld-ops die 'after' exact reproduceren (veld-edits, removes, inserts, reorders). De onderspecificeerde kern, met de sterkste toets: na toepassen is een nieuwe diff leeg.
  • 3b (PR #1001): collab_session_controller.dart — de bidirectionele brug tab-deck ↔ sessie. Lokale bewerking → diff → submit; wijziging op afstand → gemerged terug (applyOps(local, diff(local, sessie))), zodat niet-syncbare velden (tabelrijen, annotaties) behouden blijven. Echo-lus met twee waarborgen gestopt. Riverpod-/Flutter-vrij, headless getest.

Daarmee kan een async WebDAV-sessie programmatisch gehost/bijgekomen/co-geauteurd worden met correcte convergentie, echo-veiligheid en behoud van niet-syncbare velden — alles in lib/collab/, volledig getest.

Resteert 3c: de app-lijm die dit gebruiker-zichtbaar maakt — een collabSessionProvider (Riverpod) die per tab een CollabSessionController bezit en aan deckProvider hangt, de per-tab override in app_shell (een deck-rakende provider die je daar vergeet leest stil deck==null), de TabInfo SessionRef-naad, en de start/delen/deelnemen-UI. Dat is een aparte inspanning: het raakt app_shell en dialogen, en het vraagt verificatie met de draaiende app (beeldkeuring/gebruikerstest) i.p.v. alleen headless tests. #996 blijft daarvoor open.

Increment 3 grotendeels geland — de collab-laag is nu compleet en getest. - 3a (PR #1000): collab_deck_diff.dart — deckDiffToOps rekent een deck-brede bewerking terug naar de veld-ops die 'after' exact reproduceren (veld-edits, removes, inserts, reorders). De onderspecificeerde kern, met de sterkste toets: na toepassen is een nieuwe diff leeg. - 3b (PR #1001): collab_session_controller.dart — de bidirectionele brug tab-deck ↔ sessie. Lokale bewerking → diff → submit; wijziging op afstand → gemerged terug (applyOps(local, diff(local, sessie))), zodat niet-syncbare velden (tabelrijen, annotaties) behouden blijven. Echo-lus met twee waarborgen gestopt. Riverpod-/Flutter-vrij, headless getest. Daarmee kan een async WebDAV-sessie programmatisch gehost/bijgekomen/co-geauteurd worden met correcte convergentie, echo-veiligheid en behoud van niet-syncbare velden — alles in lib/collab/, volledig getest. Resteert 3c: de app-lijm die dit gebruiker-zichtbaar maakt — een collabSessionProvider (Riverpod) die per tab een CollabSessionController bezit en aan deckProvider hangt, de per-tab override in app_shell (een deck-rakende provider die je daar vergeet leest stil deck==null), de TabInfo SessionRef-naad, en de start/delen/deelnemen-UI. Dat is een aparte inspanning: het raakt app_shell en dialogen, en het vraagt verificatie met de draaiende app (beeldkeuring/gebruikerstest) i.p.v. alleen headless tests. #996 blijft daarvoor open.
Author
Owner

Increment 3c geland (PR #1003, merge 321bcb99) — daarmee is #996 volledig af en is Fase 0.5 end-to-end gebruiker-bereikbaar.

  • 3c-provider: collab_session_provider.dart bezit per tab een sessie (host/join/leave), bouwt de WebDAV-log-store uit de bron van het tabblad, en koppelt een CollabSessionController tussen sessie en deckProvider — lokale bewerkingen als ops naar buiten (3a-diff), wijzigingen op afstand gemerged terug via DeckNotifier.applyCollabDeck. Per tab overschreven in app_shell; provider_scope_test bevestigt de registratie.
  • 3c-UI: command palette biedt Samenwerking starten/Deelnemen/Verlaten op een WebDAV-deck, met snackbar-feedback. 8 nieuwe strings in alle 31 talen.
  • Geverifieerd: make check groen (7500+ tests, dekking 87,3%); provider-logica headless getest; een echte macOS-run bevestigde dat de per-tab-provider-override de opstart niet breekt.

Volledige keten van #996: increment 1 (snapshot/baseline, #997) → 2 (host/join-levenscyclus, #999) → 3a (deck-diff→ops, #1000) → 3b (tab↔sessie-controller, #1001) → 3c (provider + UI, #1003). Een async WebDAV-samenwerksessie is nu vanuit de interface te starten en bij te komen, met correcte convergentie, echo-veiligheid en behoud van niet-syncbare velden. Bewust vervolg binnen Fase 0.5: eigenaarsoverdracht (§5.3) en herbaselijning op een niet-nul versie (§5.2). Afgehandeld — sluiten.

Increment 3c geland (PR #1003, merge 321bcb99) — daarmee is #996 volledig af en is Fase 0.5 end-to-end gebruiker-bereikbaar. - 3c-provider: collab_session_provider.dart bezit per tab een sessie (host/join/leave), bouwt de WebDAV-log-store uit de bron van het tabblad, en koppelt een CollabSessionController tussen sessie en deckProvider — lokale bewerkingen als ops naar buiten (3a-diff), wijzigingen op afstand gemerged terug via DeckNotifier.applyCollabDeck. Per tab overschreven in app_shell; provider_scope_test bevestigt de registratie. - 3c-UI: command palette biedt Samenwerking starten/Deelnemen/Verlaten op een WebDAV-deck, met snackbar-feedback. 8 nieuwe strings in alle 31 talen. - Geverifieerd: make check groen (7500+ tests, dekking 87,3%); provider-logica headless getest; een echte macOS-run bevestigde dat de per-tab-provider-override de opstart niet breekt. Volledige keten van #996: increment 1 (snapshot/baseline, #997) → 2 (host/join-levenscyclus, #999) → 3a (deck-diff→ops, #1000) → 3b (tab↔sessie-controller, #1001) → 3c (provider + UI, #1003). Een async WebDAV-samenwerksessie is nu vanuit de interface te starten en bij te komen, met correcte convergentie, echo-veiligheid en behoud van niet-syncbare velden. Bewust vervolg binnen Fase 0.5: eigenaarsoverdracht (§5.3) en herbaselijning op een niet-nul versie (§5.2). Afgehandeld — sluiten.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
LibreKAT/Ocideck#996
No description provided.