Laat lokale bestandsconflicten vergelijken en veilig samenvoegen #2323

Closed
opened 2026-10-06 12:16:51 +00:00 by brenno · 0 comments
Owner

Probleem

OciDeck voorkomt al dat een extern gewijzigd lokaal presentatie- of documentbestand stil wordt overschreven. De waarschuwing vraagt de gebruiker echter nog om een blinde keuze.

  • Presentaties bieden Overschrijven, Herladen of Opslaan als.
  • Documenten bieden Annuleren, Herladen of Overschrijven.

Geen van beide paden toont wat er is veranderd. Daardoor kan de gebruiker niet beoordelen welk werk moet blijven of of beide versies veilig gecombineerd kunnen worden.

Dit is een vervolg op #1699, #1683 en #1951, niet dezelfde melding: die issues voegden detectie en waarschuwingen toe; de daarin ontbrekende vergelijking en verzoening staan nog open.

Bevestigd huidig gedrag en herbruikbare bouwstenen

  • Lokale presentaties detecteren de wijziging via DeckNotifier.fileChangedExternally() en saveDeckWithDestination.
  • Lokale documenten vergelijken de actuele bestandshash met DocumentState.savedFileHash in saveDocumentWithDestination.
  • Werkbalk, Ctrl/Cmd+S en opslaan bij sluiten komen al samen in die twee opslagroutes.
  • Voor presentaties bestaan diffDeckVersions, de bestaande slidevergelijking en mergeDeckVersions(base, ours, theirs) al voor git.
  • WebDAV en S3 hebben bewust geen merge zonder betrouwbare gemeenschappelijke basis; git heeft zijn eigen conflictpad.

Product- en formaatbesluit

Voeg aan de bestaande lokale conflictwaarschuwing een optionele, primaire actie Verschillen bekijken… toe voor presentaties en documenten.

Dit blijft volledig lokaal en op verzoek. Er komt geen watcher, netwerkverkeer, account, telemetrie, dependency, Markdown-token, sidecar of bestandsformaatwijziging bij.

Minimale veilige scope

Gedeelde gebruikersreis

  1. Toon de bestaande waarschuwing pas bij opslaan; analyseer niet op de achtergrond.
  2. Maak Verschillen bekijken… de veilige primaire actie. Bied Mijn versie als kopie bewaren direct aan.
  3. Benoem de drie versies begrijpelijk:
    • Laatst geopend/opgeslagen — de gemeenschappelijke basis;
    • Mijn versie — het niet-opgeslagen werk in OciDeck;
    • Versie op schijf — het bestand zoals het nu bestaat.
  4. Lees de schijfversie via de bestaande grootte-, UTF-8-, Markdown-veiligheids- en parsepoorten. Bij onveilig, te groot, verdwenen of onleesbaar materiaal: geen analyse of merge; behoud het tabblad en bied Annuleren of Opslaan als kopie.
  5. Schrijf niets zolang de analyse open is.
  6. Controleer de schijfvingerafdruk opnieuw vóór toepassen of schrijven. Is het bestand nogmaals veranderd, stop dan en laat de analyse vernieuwen.

Presentaties

  • Bewaar de exacte basispresentatie van de laatste geslaagde open-/opslagactie; alleen een hash is onvoldoende voor driewegs-merge.
  • Hergebruik diffDeckVersions voor toegevoegd, verwijderd, verplaatst en bewerkt.
  • Open bewerkte dia's in de bestaande zij-aan-zijvergelijking.
  • Hergebruik mergeDeckVersions uitsluitend voor bewezen gedrag:
    • wijzigingen aan verschillende dia's automatisch combineren;
    • twee concurrerende bewerkingen binnen één dia nooit tekstueel mengen;
    • bij wijziging-tegen-wijziging of verwijderen-tegen-wijziging expliciet per hele dia kiezen;
    • de strengste TLP-classificatie behouden;
    • een integriteitszegel nooit stil herstellen of goedkeuren.
  • Samengevoegde versie toepassen wijzigt het open tabblad als één ongedaan te maken bewerking, laat het vuil en slaat niet automatisch op.

Documenten

  • Gebruik savedSource als basis en vergelijk die met de bron die werkelijk zou worden opgeslagen en met de nieuwe schijfbron.
  • Toon een leesbare zij-aan-zijvergelijking per sectie/alinea met woordmarkering; geen kale unified diff als enige weergave.
  • Bied in deze eerste versie alleen hele-versiekeuzes: mijn versie behouden, schijfversie laden of mijn versie als kopie bewaren.
  • Bouw hier geen automatische of per-hunk Markdown-merge. Frontmatter, HTML, tabellen, codeblokken, referenties, BOM en gemengde regeleinden vragen eerst een apart bewezen ontwerp.
  • Na bewerken in Visueel moet de bytegetrouw gepatchte opslagbron worden vergeleken, niet de genormaliseerde Quill-roundtrip.

Conflictgedrag

  • Annuleren verandert niets.
  • Schijfversie laden vraagt expliciet bevestiging dat niet-opgeslagen werk wordt vervangen.
  • Overschrijven benoemt het gevolg en is visueel ondergeschikt aan Vergelijken/Opslaan als kopie.
  • Een geannuleerde of mislukte analyse houdt het tabblad vuil en behoudt undo- en hersteldata.
  • Een tweede externe wijziging maakt de analyse ongeldig; een verouderde merge of overwrite mag nooit doorgaan.
  • Gelinkte grafiekdata, assets en sidecars houden hun bestaande conflictgedrag. De interface mag niet beweren een heel project te mergen wanneer alleen Markdown/deckstaat wordt verzoend.

Acceptatiecriteria

  • Beide lokale conflictdialogen bieden Verschillen bekijken… en Mijn versie als kopie bewaren.
  • Basis, mijn versie en schijfversie zijn duidelijk van elkaar te onderscheiden.
  • Onveilig, ongeldig, te groot, verdwenen of onleesbaar schijfmateriaal kan tabblad noch bestand wijzigen.
  • Presentaties tonen een slide-overzicht en kunnen de bestaande vergelijking per bewerkte dia openen.
  • Niet-overlappende presentatiewijzigingen worden via mergeDeckVersions gecombineerd; concurrerende dia's vragen altijd een expliciete keuze.
  • Een toegepaste presentatiemerge is één undo-stap, blijft vuil en wordt niet automatisch opgeslagen.
  • Documenten tonen de bytegetrouwe te bewaren bron en bieden alleen veilige hele-versiekeuzes plus Opslaan als kopie.
  • De schijfvingerafdruk wordt vlak vóór toepassen/schrijven opnieuw gecontroleerd.
  • Annuleren en fouten behouden inhoud, dirty state, undo en herstelmomentopname.
  • De flow werkt met toetsenbord en schermlezer, bij 200% tekstschaal en via de bestaande vertaalworkflow.
  • Er verandert niets aan formaat, sidecars, netwerkgedrag of dependencies.

Tests

  • Pure tests voor basis/mijn/schijf-orkestratie, niet-overlappende deckmerge, dia-conflict, verwijderen-tegen-bewerken, verplaatsen/toevoegen en strengste TLP.
  • Regressietest dat toepassen één undo-stap maakt en het tabblad vuil laat.
  • Documenttests voor Bron en Visueel, inclusief geen valse verschillen door Quill-normalisatie, BOM, CRLF, frontmatter, tabellen en codeblokken.
  • Widgettests voor Vergelijken, Opslaan als kopie, Schijfversie laden, Mijn versie houden, Annuleren en dia-conflicten.
  • Fouttests voor onveilig/onparseerbaar/te groot en voor een tweede wijziging terwijl de analyse open is.
  • Bestaande tests voor #1683, #1699 en #1951 blijven groen.

Kosten en risico's

Middelgrote wijziging. De presentatielogica bestaat grotendeels; nieuw zijn het bewaren van de exacte basis, aansluiting op de lokale conflictflow, de documentvergelijking, 31 vertalingen, documentatie en tests.

Het grootste risico is een foute slidekoppeling. Hanteer dezelfde zichtbare-faalregel als nu: bij twijfel één extra keuze vragen, nooit stil werk verwijderen of dupliceren.

Buiten scope

  • Achtergrondbewaking of lockfiles.
  • Een nieuwe generieke tekst-/Markdown-merge-engine.
  • WebDAV/S3-merge zonder verifieerbare gemeenschappelijke basis.
  • Vervanging van het bestaande git-conflictpad.
  • Automatisch mergen van grafiekdata, assets of willekeurige sidecars.
## Probleem OciDeck voorkomt al dat een extern gewijzigd lokaal presentatie- of documentbestand stil wordt overschreven. De waarschuwing vraagt de gebruiker echter nog om een blinde keuze. - Presentaties bieden **Overschrijven**, **Herladen** of **Opslaan als**. - Documenten bieden **Annuleren**, **Herladen** of **Overschrijven**. Geen van beide paden toont wat er is veranderd. Daardoor kan de gebruiker niet beoordelen welk werk moet blijven of of beide versies veilig gecombineerd kunnen worden. Dit is een vervolg op #1699, #1683 en #1951, niet dezelfde melding: die issues voegden detectie en waarschuwingen toe; de daarin ontbrekende vergelijking en verzoening staan nog open. ## Bevestigd huidig gedrag en herbruikbare bouwstenen - Lokale presentaties detecteren de wijziging via `DeckNotifier.fileChangedExternally()` en `saveDeckWithDestination`. - Lokale documenten vergelijken de actuele bestandshash met `DocumentState.savedFileHash` in `saveDocumentWithDestination`. - Werkbalk, Ctrl/Cmd+S en opslaan bij sluiten komen al samen in die twee opslagroutes. - Voor presentaties bestaan `diffDeckVersions`, de bestaande slidevergelijking en `mergeDeckVersions(base, ours, theirs)` al voor git. - WebDAV en S3 hebben bewust geen merge zonder betrouwbare gemeenschappelijke basis; git heeft zijn eigen conflictpad. ## Product- en formaatbesluit Voeg aan de bestaande lokale conflictwaarschuwing een optionele, primaire actie **Verschillen bekijken…** toe voor presentaties en documenten. Dit blijft volledig lokaal en op verzoek. Er komt geen watcher, netwerkverkeer, account, telemetrie, dependency, Markdown-token, sidecar of bestandsformaatwijziging bij. ## Minimale veilige scope ### Gedeelde gebruikersreis 1. Toon de bestaande waarschuwing pas bij opslaan; analyseer niet op de achtergrond. 2. Maak **Verschillen bekijken…** de veilige primaire actie. Bied **Mijn versie als kopie bewaren** direct aan. 3. Benoem de drie versies begrijpelijk: - **Laatst geopend/opgeslagen** — de gemeenschappelijke basis; - **Mijn versie** — het niet-opgeslagen werk in OciDeck; - **Versie op schijf** — het bestand zoals het nu bestaat. 4. Lees de schijfversie via de bestaande grootte-, UTF-8-, Markdown-veiligheids- en parsepoorten. Bij onveilig, te groot, verdwenen of onleesbaar materiaal: geen analyse of merge; behoud het tabblad en bied Annuleren of Opslaan als kopie. 5. Schrijf niets zolang de analyse open is. 6. Controleer de schijfvingerafdruk opnieuw vóór toepassen of schrijven. Is het bestand nogmaals veranderd, stop dan en laat de analyse vernieuwen. ### Presentaties - Bewaar de exacte basispresentatie van de laatste geslaagde open-/opslagactie; alleen een hash is onvoldoende voor driewegs-merge. - Hergebruik `diffDeckVersions` voor toegevoegd, verwijderd, verplaatst en bewerkt. - Open bewerkte dia's in de bestaande zij-aan-zijvergelijking. - Hergebruik `mergeDeckVersions` uitsluitend voor bewezen gedrag: - wijzigingen aan verschillende dia's automatisch combineren; - twee concurrerende bewerkingen binnen één dia nooit tekstueel mengen; - bij wijziging-tegen-wijziging of verwijderen-tegen-wijziging expliciet per hele dia kiezen; - de strengste TLP-classificatie behouden; - een integriteitszegel nooit stil herstellen of goedkeuren. - **Samengevoegde versie toepassen** wijzigt het open tabblad als één ongedaan te maken bewerking, laat het vuil en slaat niet automatisch op. ### Documenten - Gebruik `savedSource` als basis en vergelijk die met de bron die werkelijk zou worden opgeslagen en met de nieuwe schijfbron. - Toon een leesbare zij-aan-zijvergelijking per sectie/alinea met woordmarkering; geen kale unified diff als enige weergave. - Bied in deze eerste versie alleen hele-versiekeuzes: mijn versie behouden, schijfversie laden of mijn versie als kopie bewaren. - Bouw hier geen automatische of per-hunk Markdown-merge. Frontmatter, HTML, tabellen, codeblokken, referenties, BOM en gemengde regeleinden vragen eerst een apart bewezen ontwerp. - Na bewerken in Visueel moet de bytegetrouw gepatchte opslagbron worden vergeleken, niet de genormaliseerde Quill-roundtrip. ## Conflictgedrag - Annuleren verandert niets. - Schijfversie laden vraagt expliciet bevestiging dat niet-opgeslagen werk wordt vervangen. - Overschrijven benoemt het gevolg en is visueel ondergeschikt aan Vergelijken/Opslaan als kopie. - Een geannuleerde of mislukte analyse houdt het tabblad vuil en behoudt undo- en hersteldata. - Een tweede externe wijziging maakt de analyse ongeldig; een verouderde merge of overwrite mag nooit doorgaan. - Gelinkte grafiekdata, assets en sidecars houden hun bestaande conflictgedrag. De interface mag niet beweren een heel project te mergen wanneer alleen Markdown/deckstaat wordt verzoend. ## Acceptatiecriteria - [ ] Beide lokale conflictdialogen bieden **Verschillen bekijken…** en **Mijn versie als kopie bewaren**. - [ ] Basis, mijn versie en schijfversie zijn duidelijk van elkaar te onderscheiden. - [ ] Onveilig, ongeldig, te groot, verdwenen of onleesbaar schijfmateriaal kan tabblad noch bestand wijzigen. - [ ] Presentaties tonen een slide-overzicht en kunnen de bestaande vergelijking per bewerkte dia openen. - [ ] Niet-overlappende presentatiewijzigingen worden via `mergeDeckVersions` gecombineerd; concurrerende dia's vragen altijd een expliciete keuze. - [ ] Een toegepaste presentatiemerge is één undo-stap, blijft vuil en wordt niet automatisch opgeslagen. - [ ] Documenten tonen de bytegetrouwe te bewaren bron en bieden alleen veilige hele-versiekeuzes plus Opslaan als kopie. - [ ] De schijfvingerafdruk wordt vlak vóór toepassen/schrijven opnieuw gecontroleerd. - [ ] Annuleren en fouten behouden inhoud, dirty state, undo en herstelmomentopname. - [ ] De flow werkt met toetsenbord en schermlezer, bij 200% tekstschaal en via de bestaande vertaalworkflow. - [ ] Er verandert niets aan formaat, sidecars, netwerkgedrag of dependencies. ## Tests - Pure tests voor basis/mijn/schijf-orkestratie, niet-overlappende deckmerge, dia-conflict, verwijderen-tegen-bewerken, verplaatsen/toevoegen en strengste TLP. - Regressietest dat toepassen één undo-stap maakt en het tabblad vuil laat. - Documenttests voor Bron en Visueel, inclusief geen valse verschillen door Quill-normalisatie, BOM, CRLF, frontmatter, tabellen en codeblokken. - Widgettests voor Vergelijken, Opslaan als kopie, Schijfversie laden, Mijn versie houden, Annuleren en dia-conflicten. - Fouttests voor onveilig/onparseerbaar/te groot en voor een tweede wijziging terwijl de analyse open is. - Bestaande tests voor #1683, #1699 en #1951 blijven groen. ## Kosten en risico's Middelgrote wijziging. De presentatielogica bestaat grotendeels; nieuw zijn het bewaren van de exacte basis, aansluiting op de lokale conflictflow, de documentvergelijking, 31 vertalingen, documentatie en tests. Het grootste risico is een foute slidekoppeling. Hanteer dezelfde zichtbare-faalregel als nu: bij twijfel één extra keuze vragen, nooit stil werk verwijderen of dupliceren. ## Buiten scope - Achtergrondbewaking of lockfiles. - Een nieuwe generieke tekst-/Markdown-merge-engine. - WebDAV/S3-merge zonder verifieerbare gemeenschappelijke basis. - Vervanging van het bestaande git-conflictpad. - Automatisch mergen van grafiekdata, assets of willekeurige sidecars.
brenno 2026-10-07 15:26:14 +00:00
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#2323
No description provided.