feat(collab): de transportloze samenwerklaag (COLLABORATION.md Fase 0) #988
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!988
Loading…
Reference in a new issue
No description provided.
Delete branch "collab/deck-op"
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?
De basis van live samenwerken (COLLABORATION.md Fase 0, #975) — het niet-afgewezen spoor B (de vergaderadapters van spoor A blijven afgewezen per #985). Puur Dart, geen netwerk, geen Flutter-import; de hele laag draait door een loopback in de tests, zonder infrastructuur. Nog niet in de interface.
Wat erin zit
lib/collab/deck_op.dart— het getypte operatiemodel (§5.1). EenDeckOpis één gezaghebbende wijziging aan het in-memoryDeck, op volgorde vanversion:InsertSlide/RemoveSlide/ReorderSlideen de field-levelSetSlideField/SetDeckMetaover deSlideField/DeckMetaField-enums. Ops werken op het getypte model, nooit op herparste Markdown (P5).applyOpis puur en fail-closed: een ontbrekende slide, een index buiten bereik of een waarde van het verkeerde type gooit — een stille no-op zou de op-stroom laten desynchroniseren (P3). Enums i.p.v. de door het ontwerp genoemdeString fieldmaken de switch exhaustief: de compiler, niet een test, garandeert dat élk syncbaar veld wordt afgehandeld.lib/collab/collab_transport.dart— hetCollabTransport-contract (P6) +LoopbackHub/LoopbackTransport. Een domme pijp: vervoert gevormde events, ordent en versiet niet.LockEventdraagt eenforced-vlag voor de autoritaireForceUnlock(§5.4).lib/collab/collab_session.dart— de autoriteit-statemachine en lock-tabel (§5.3–5.4). Precies één sessie is autoriteit (P3) en kent de monotone versie toe aan élke op — eigen bewerkingen én ontvangen intenties — en herzendt de gezaghebbende op; iedereen past in versievolgorde toe en reproduceert zo hetzelfde deck.TabInfo.collabSession(§5.7) — de naad waar een genetwerkte fase de live sessie aan een tabblad hangt;nullop elk tabblad vandaag. Bewust nog géén provider en géén app_shell-override: die horen bij de fase waarin er een echte sessie ís.Onderweg meegenomen:
fix(test)— de sjabloontestno stray documentsgebruikte een dubbel-ontsnapte regex (\\.in een raw string), matchte nóóit en liet main rood sinds #986. Eén backslash i.p.v. twee.v1-grens (bewust, in de code gemarkeerd)
Een volger-bewerking gaat heen-en-weer (als intentie verzonden, toegepast bij de gezaghebbende echo) i.p.v. optimistisch onder een lock — de latentieverbergende helft van §5.4. Owner-drop-handover (§5.3), snapshot-herbasering voor laatkomers (§5.2) en de nullable/clear-flag-velden zijn vervolg. De enums en de
TabInfo-seam zijn de naden waar dat bijkomt.Waarborgen
make checkgroen (coverage-vloer 34%, 0 bestanden eronder),make check-secrets(0),make sast(0 findings).SlideField/DeckMetaFielduitoefent met een compleetheidsassertie..mdblijft de waarheid (P2). Netwerk (Matrix) en de ketenkeuring van de matrix-SDK komen apart (#976/#977).Sluit #975.
🤖 Generated with Claude Code