Samenwerken: eigenaarsoverdracht bij wegvallen van de eigenaar (Fase 0.5, §5.3) #1004

Closed
opened 2026-07-30 20:54:28 +00:00 by brenno · 2 comments
Owner

Vervolg binnen Fase 0.5, bewust uitgesteld bij #996. COLLABORATION.md §5.3.

Waarom. De samenwerklaag heeft precies één autoriteit (P3): die kent versies toe, past intents toe en herzendt. In v1 blijft de host de héle sessie de autoriteit. Valt de eigenaar weg (verbinding kwijt, app dicht), dan stopt de sessie feitelijk: niemand kent nog versies toe, en de intents (versie 0) die deelnemers in de log schrijven blijven onverwerkt liggen. Voor een async sessie waarbij mensen op verschillende momenten werken is dat een reëel gat.

Wat het ontwerp vraagt (§5.3). Bij sessie-start wordt een deterministische opvolgvolgorde afgesproken. Valt de eigenaar weg, dan neemt de opvolger met de hoogst geobserveerde versie over (versie wint; de vaste volgorde breekt gelijkspel). De tijdelijke autoriteit houdt de sessie levend maar persisteert niet — alleen de eigenaar mag saveDeck/de sessie beëindigen. Komt de originele eigenaar terug, dan draagt de tijdelijke autoriteit terug over.

Wat er nu is. lib/collab/collab_session.dart (de autoriteit-statemachine) noemt owner-drop-handover in de bestandskop expliciet als vervolg; isAuthority is een vaste bool bij constructie. collab_session_provider.dart bewaart de sessie op TabInfo.collabSession. participantId identificeert een deelnemer.

Wat er moet.

  1. Een afgesproken opvolgvolgorde vastleggen (bv. in de snapshot of een sessie-metadata-record in de sidecar).
  2. Detectie dat de autoriteit is weggevallen. Kernbeslispunt: in een async poll-transport is er géén presence (dat is pas Fase 1/Matrix). Hoe stel je 'weggevallen' vast? Optie: een periodieke 'authority-alive'-marker met tijdstempel in de log; een opvolger neemt over als die te lang stilstaat. Dit raakt het transport en de tijdsbron (let op: geen wandkloktrucs in tests).
  3. De overname: isAuthority moet muteerbaar/herbepaalbaar worden, en de nieuwe autoriteit hervat het toekennen van versies vanaf de hoogst bekende versie.
  4. De terug-overdracht als de eigenaar terugkeert, en de regel 'alleen de eigenaar persisteert'.

Reikwijdte. Vooral collab_session.dart (muteerbare autoriteit + versie-hervatting), het launch/controller-niveau (opvolgvolgorde, detectie), en mogelijk een kleine provider-/UI-melding ('jij bent nu tijdelijk de eigenaar'). Hangt deels samen met herbaselijning (het aparte vervolg-issue): beide draaien om 'hoogst geobserveerde versie' en de sidecar-metadata.

Grijpt niet in op het bestandsformaat (P2): sessie-metadata leeft in de sidecar, niet in het .md.

Vervolg binnen Fase 0.5, bewust uitgesteld bij #996. COLLABORATION.md §5.3. **Waarom.** De samenwerklaag heeft precies één autoriteit (P3): die kent versies toe, past intents toe en herzendt. In v1 blijft de host de héle sessie de autoriteit. Valt de eigenaar weg (verbinding kwijt, app dicht), dan stopt de sessie feitelijk: niemand kent nog versies toe, en de intents (versie 0) die deelnemers in de log schrijven blijven onverwerkt liggen. Voor een async sessie waarbij mensen op verschillende momenten werken is dat een reëel gat. **Wat het ontwerp vraagt (§5.3).** Bij sessie-start wordt een deterministische opvolgvolgorde afgesproken. Valt de eigenaar weg, dan neemt de opvolger met de **hoogst geobserveerde versie** over (versie wint; de vaste volgorde breekt gelijkspel). De tijdelijke autoriteit houdt de sessie levend maar **persisteert niet** — alleen de eigenaar mag saveDeck/de sessie beëindigen. Komt de originele eigenaar terug, dan draagt de tijdelijke autoriteit terug over. **Wat er nu is.** `lib/collab/collab_session.dart` (de autoriteit-statemachine) noemt owner-drop-handover in de bestandskop expliciet als vervolg; `isAuthority` is een vaste bool bij constructie. `collab_session_provider.dart` bewaart de sessie op `TabInfo.collabSession`. `participantId` identificeert een deelnemer. **Wat er moet.** 1. Een afgesproken opvolgvolgorde vastleggen (bv. in de snapshot of een sessie-metadata-record in de sidecar). 2. Detectie dat de autoriteit is weggevallen. **Kernbeslispunt:** in een async poll-transport is er géén presence (dat is pas Fase 1/Matrix). Hoe stel je 'weggevallen' vast? Optie: een periodieke 'authority-alive'-marker met tijdstempel in de log; een opvolger neemt over als die te lang stilstaat. Dit raakt het transport en de tijdsbron (let op: geen wandkloktrucs in tests). 3. De overname: `isAuthority` moet muteerbaar/herbepaalbaar worden, en de nieuwe autoriteit hervat het toekennen van versies vanaf de hoogst bekende versie. 4. De terug-overdracht als de eigenaar terugkeert, en de regel 'alleen de eigenaar persisteert'. **Reikwijdte.** Vooral `collab_session.dart` (muteerbare autoriteit + versie-hervatting), het launch/controller-niveau (opvolgvolgorde, detectie), en mogelijk een kleine provider-/UI-melding ('jij bent nu tijdelijk de eigenaar'). Hangt deels samen met herbaselijning (het aparte vervolg-issue): beide draaien om 'hoogst geobserveerde versie' en de sidecar-metadata. Grijpt niet in op het bestandsformaat (P2): sessie-metadata leeft in de sidecar, niet in het .md.
Author
Owner

Opgepakt. Tak: collab/owner-handover. Verwachte reikwijdte: lib/collab/collab_session.dart (muteerbare autoriteit + versie-hervatting), lib/collab/collab_log_store.dart (beacon-record), lib/collab/webdav_async_transport.dart (heartbeat), een nieuwe liveness/electie-laag, lib/collab/collab_session_launch.dart + collab_session_controller.dart (wiring + her-inzenden), lib/state/collab_session_provider.dart (melding 'tijdelijk eigenaar'), docs/design/COLLABORATION.md, tests.

Opgepakt. Tak: collab/owner-handover. Verwachte reikwijdte: lib/collab/collab_session.dart (muteerbare autoriteit + versie-hervatting), lib/collab/collab_log_store.dart (beacon-record), lib/collab/webdav_async_transport.dart (heartbeat), een nieuwe liveness/electie-laag, lib/collab/collab_session_launch.dart + collab_session_controller.dart (wiring + her-inzenden), lib/state/collab_session_provider.dart (melding 'tijdelijk eigenaar'), docs/design/COLLABORATION.md, tests.
Author
Owner

Gebouwd en gemergd in #1006 (main c1334665). De volledige §5.3-keten zit erin: muteerbare autoriteit met versie-hervatting, een advisory beacon met poll-getelde heartbeat-detectie (geen wandklok), caught-up + sequence-steady overname-poorten (die tweede sluit het WebDAV list-lag-gat), deterministische roster-vrije opvolging, hand-back voor de terugkerende eigenaar (via de electie-route), en 'alleen de eigenaar bewaart' als client-side poort in saveDeckWithDestination. Bestandsformaat (P2) ongemoeid — alles in de sidecar.

Ontworpen na een drievoudige ontwerp-review (architectuur/beveiliging/test), daarna een implementatie- en een bewaker-review; elke blokkerende bevinding verwerkt.

Bewust niet in deze increment (gedocumenteerd in COLLABORATION.md §5.3 + de dreigingsmodel-rij in SECURITY_DESIGN.md):

  • Tijdens een failover-venster kunnen twee tegelijke autoriteiten dezelfde versie toekennen; de verliezende deelnemer divergeert stil tot herladen. De echte fix (mid-sessie re-baseline) hoort bij het aparte §5.2-herbaselijning-vervolg.
  • De heartbeat is een liveness-zijkanaal (inherent aan een poll-heartbeat).
  • De Klingon/Papiaments/Zwitserduits/Fries-vertalingen van de drie nieuwe interfaceteksten zijn idiomatisch gedaan maar verdienen een moedertaalcontrole.
Gebouwd en gemergd in #1006 (main c1334665). De volledige §5.3-keten zit erin: muteerbare autoriteit met versie-hervatting, een advisory beacon met poll-getelde heartbeat-detectie (geen wandklok), caught-up + sequence-steady overname-poorten (die tweede sluit het WebDAV list-lag-gat), deterministische roster-vrije opvolging, hand-back voor de terugkerende eigenaar (via de electie-route), en 'alleen de eigenaar bewaart' als client-side poort in saveDeckWithDestination. Bestandsformaat (P2) ongemoeid — alles in de sidecar. Ontworpen na een drievoudige ontwerp-review (architectuur/beveiliging/test), daarna een implementatie- en een bewaker-review; elke blokkerende bevinding verwerkt. Bewust niet in deze increment (gedocumenteerd in COLLABORATION.md §5.3 + de dreigingsmodel-rij in SECURITY_DESIGN.md): - Tijdens een failover-venster kunnen twee tegelijke autoriteiten dezelfde versie toekennen; de verliezende deelnemer divergeert stil tot herladen. De echte fix (mid-sessie re-baseline) hoort bij het aparte §5.2-herbaselijning-vervolg. - De heartbeat is een liveness-zijkanaal (inherent aan een poll-heartbeat). - De Klingon/Papiaments/Zwitserduits/Fries-vertalingen van de drie nieuwe interfaceteksten zijn idiomatisch gedaan maar verdienen een moedertaalcontrole.
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#1004
No description provided.