feat(collab): eigenaarsoverdracht bij wegvallen van de eigenaar (§5.3, #1004) #1006
No reviewers
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck!1006
Loading…
Reference in a new issue
No description provided.
Delete branch "collab/owner-handover"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #1004.
Vervolg binnen Fase 0.5 (na #996/#999–#1003). Valt de eigenaar van een
samenwerksessie weg — verbinding kwijt of app dicht — dan stopte de sessie:
niemand kende nog versies toe en intents bleven onverwerkt in de async
WebDAV-log liggen. Dit laat een opvolger de sessie levend houden en draagt terug
over als de eigenaar terugkomt, zonder de single-authority-invariant (P3) in
steady state te breken. Het
.md-bestandsformaat (P2) blijft ongemoeid: allehandover-metadata leeft in de sidecar.
Ontwerp (COLLABORATION.md §5.3)
beacon.json, last-write-wins naast de log):{authority, authorityIsOwner, tick}. De autoriteit bumpttickelke poll — een heartbeat;een bevroren tick is het drop-signaal. Advisory: WebDAV-schrijfrecht is de
enige poort.
isOwneris een lanceerfeit (host=true, guest=false), niet uit de beaconafgeleid. Alleen de eigenaar persisteert. Terugkerende eigenaar her-host't
(resume-aware: baseline overgenomen, niet gereset) en herwint autoriteit via de
electie-route.
WebDAV list-lag-gat (geen cross-client read-your-writes). Versie hervat vanaf de
hoogst bekende versie.
faalt → nooit autoriteit. Claim pas ná een geslaagde beacon-write; een
incumbent die zijn heartbeat niet meer kan schrijven stapt terug.
bestaande deck-diff — alleen wanneer caught-up, zodat een achterlopend deck geen
structurele op dupliceert.
Gedocumenteerde residuals (Fase 0.5, bewust)
replica dropt de duplicaat en convergeert, maar de verliezende autoriteit
behoudt haar eigen op tot ze herlaadt. De gewone enkel-opvolger-route raakt dit
niet. Volledige fix (mid-sessie re-baseline) rijdt mee met §5.2.
SECURITY_DESIGN.md.
server-afdwinging — eerlijk gesteld in de dreigingsmodel-rij (na bewaker-review).
Een gast zit niet vast: verlaten of een
.ocideck-pakket exporteren blijft vrij.Reikwijdte
CollabSession(muteerbare autoriteit),WebdavAsyncTransport(
isCaughtUp/knownMaxSeq),CollabLogStore(beacon), nieuweHandoverCoordinator, launch (CollabLaunch, resume-aware host), provider + UI(save-poort in
saveDeckWithDestination, tijdelijke-autoriteit-melding), l10n(31 talen), docs.
Toetsing
Ontworpen na een drievoudige ontwerp-review (architectuur, beveiliging, test),
daarna een implementatie-correctheid-review en een bewaker-review vóór de PR —
elke blokkerende bevinding verwerkt (o.a. de list-lag-poort mutatie-vast getoetst,
de re-drive caught-up-gated, en de eerlijke ACL-formulering). ~40 nieuwe tests
incl. de list-lag-poort (store-double), fail-closed-paden, hand-back, terugkerende
eigenaar via electie, versie-hervatting, convergentie en de residual.
Poorten (deze machine — geen CI-runner op Forgejo):
make checkgroen (87,4%dekking),
make l10n-checkgroen,make check-secretsenmake sastschoon.Goldens niet gedraaid: deze wijziging raakt geen rendering (backend + een
transient snackbar).
🤖 Generated with Claude Code
hostCollabSession/joinCollabSession return a CollabLaunch {session, coordinator} and the coordinator owns the poll loop; hostCollabSession is resume-aware for a returning owner. The provider re-drives lost edits on an authority change (only when caught up, so a lagging deck cannot duplicate a structural op) and surfaces a temporary-authority indicator. Only the owner persists: saveDeckWithDestination — the single save chokepoint — refuses a guest's save. +1 file-size baseline for the one build() listen hook (behaviour extracted; the class stays under ceiling). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>