Skip to content

feat(versiebeheer): standalone version-pin op hervatten (P0 #2)#416

Draft
robbertbos wants to merge 1 commit into
feat/sources-versiebeheer-loader-resolvefrom
feat/sources-versiebeheer-standalone-pin
Draft

feat(versiebeheer): standalone version-pin op hervatten (P0 #2)#416
robbertbos wants to merge 1 commit into
feat/sources-versiebeheer-loader-resolvefrom
feat/sources-versiebeheer-standalone-pin

Conversation

@robbertbos

Copy link
Copy Markdown
Member

Wat

De standalone-tegenhanger van resolve-by-pin (#415): de offline single-file respecteert nu bij het hervatten de modelversie waarop een assessment is ingevuld, in plaats van die stil tegen de gebundelde latest toe te passen.

Waarom (P0 #2)

saveAppState stempelt de versie al in metadata.urn (bv. urn:nl:dpia:3.0), maar loadAppState negeerde die. Scenario: je vult offline een DPIA in met single-file vX (DPIA 3.0), download later single-file vY (DPIA 3.1), en opent je oude localStorage-sessie → die werd stil tegen 3.1 toegepast én bij de eerstvolgende autosave op 3.1 herstempeld. Voor een juridisch artefact een correctheidsprobleem.

Hoe

  • LocalPersistence.savedVersion(namespace) — leest de opgeslagen metadata.urn en geeft via parseUrn de versie terug (null als er geen state is of de urn onparseerbaar is).
  • App.vue resume-handlers roepen vóór navigatie resolvePin(ns) aan: savedVersionschemaStore.activatePin(ns, version).
    • Versie gebundeld → slot wisselt, formulier/autosave/export blijven op de gepinde versie.
    • Versie niet gebundeld → latest blijft, niet-blokkerende rvo-alert--warning. Nooit stil herstempelen.
  • De waarschuwing wordt gewist bij terug naar de landingspagina.

Hergebruikt activatePin uit #415 — online editor en standalone delen exact dezelfde resolutie-logica.

Aandachtspunten voor review

  1. Architectuurverschil met de online editor. De standalone geeft het schema als prop door aan Form (:validData="schemaStore.getSchema(ns)"), en Form bouwt de taakstructuur al op stap 3 — vóór applyAppState. Daarom moet de pin op App.vue-niveau vóór navigatie resolven (niet in applyAppState, dat is te laat). De online editor kon het in zijn eigen load-volgorde doen.
  2. Dormant met één gebundelde versie. savedVersion == bundel-versie → activatePin no-op → geen waarschuwing. De fallback-tak is unit-getest met een geïnjecteerde mismatch en vuurt in productie pas bij een cross-single-file-download.
  3. Geen migratie (nog). Bij een mismatch tonen we een waarschuwing maar migreren niet — de forward-migratie-engine is Fase 7. Dit is bewust "waarschuw, blokkeer niet".
  4. Waarschuwingstekst (NL, je-vorm): "De opgeslagen versie (X) zit niet in deze versie van het formulier. Je werkt nu met de nieuwste versie; controleer je antwoorden voordat je verdergaat."

Stack

Bovenop #415 (resolve-by-pin / activatePin) → #410#409#408 → fundament.

Tests

  • LocalPersistence.cov.test.ts: 5 nieuwe tests voor savedVersion (coarse versie, concept-versie, geen-state, onparseerbare urn, kapotte JSON). 100% op LocalPersistence.ts.
  • App.cov.test.ts: 3 nieuwe tests (activatePin-aanroep op resume, fellBack-waarschuwing, waarschuwing gewist bij terug naar landing). 100% op App.vue.
  • Volledige standalone-suite groen: 100% coverage. Type-check (vue-tsc --build) groen.

…en (P0 #2)

De standalone slaat de modelversie al op in metadata.urn, maar negeerde
die bij het hervatten — een offline-formulier ingevuld in een oudere
single-file werd stil tegen de nieuwste gebundelde definitie toegepast en
herstempeld. Nu leest App.vue de opgeslagen versie (LocalPersistence.
savedVersion) en roept schemaStore.activatePin() aan vóór het openen van
het formulier, zodat formulier, autosave en export op de gepinde versie
blijven. Zit die versie niet in de bundel, dan blijft de latest geladen
en toont de app een niet-blokkerende waarschuwing — nooit stil herstempelen.

Hergebruikt activatePin uit Fase 2c (de online editor doet hetzelfde).
Met één gebundelde versie is dit een no-op (correct-by-construction); de
fallback vuurt pas wanneer een nieuwere single-file een oudere
localStorage-sessie opent.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant