Skip to content

feat(versiebeheer): content-versiebeheer van vragenlijst-bronnen (epic)#406

Draft
robbertbos wants to merge 1 commit into
mainfrom
feat/sources-versiebeheer
Draft

feat(versiebeheer): content-versiebeheer van vragenlijst-bronnen (epic)#406
robbertbos wants to merge 1 commit into
mainfrom
feat/sources-versiebeheer

Conversation

@robbertbos

@robbertbos robbertbos commented Jun 21, 2026

Copy link
Copy Markdown
Member

Epic: content-versiebeheer van vragenlijst-bronnen

Integratie-branch voor het gefaseerd invoeren van content-versiebeheer (Pre-scan/DPIA/IAMA): expliciete versies, concept-kanaal, per-assessment pinning, "nieuwere versie"-detectie + migratie, en een transparante modeloverzichtspagina. main blijft schoon; elke fase als sub-PR.

Aanbevolen review-volgorde

Stack A — Fase 2 core (gestapeld):

  1. feat(versiebeheer): versie-bewuste schemaStore (Fase 2a) #408 — versie-bewuste schemaStore-registry (fundament)
  2. feat(versiebeheer): D1 — officieel coarse, concept precies in de urn #409 — D1 (officieel coarse / concept precies) + canonical-urn-consistentie
  3. feat(versiebeheer): per-assessment pin-kolom (Fase 2b) #410 — per-assessment pin-kolom + migratie 0004 + security-hardening (jouw review-punt)

Stack B — Fase 1 build (gestapeld):
4. #411build_sources.py (manifest-gedreven multi-versie build, additief)
5. #412 — buildsites omhangen naar build_sources.py + platte drop-in (byte-identiek geverifieerd; raakt deploy-workflows)

Op stack B:
6. #413 — Fase 4: /modellen transparantiepagina (publiek, RVO, 100% getest)

Los: #407 — afstemmingsplan (doc, voor het team)

Status per fase

Stand

De multi-versie build is nu actief (#412): elke build levert geneste per-versie output + manifest.json. /modellen (#413) consumeert dat al. resolve-by-pin / picker / detectie zijn de volgende stappen — gedrag-loos tot er een echte 2e versie (bv. een DPIA-concept) aan het manifest wordt toegevoegd; de infrastructuur staat klaar.

Fase 0 + manifest-fundament, additief en breaking-change-vrij:

- versioning/semver.ts: parseUrn/compareVersions/coarseVersion/isPrerelease met
  semver-prerelease-precedentie (3.1.0-concept.2 < ...-concept.10 < 3.1.0).
- definitie-schema accepteert -concept[.N]; output-schema blijft MAJOR.MINOR;
  getUrn() coarset de versie zodat metadata.urn geldig blijft.
- sources/manifest.yaml + schemas/source-manifest.v1.schema.json + script/manifest.py:
  registry + consistentie-lint (duplicate, begrippenkader, latestOfficial, bronbestand).
- versioning/manifest.ts: typen + findNewerVersion/versionsForType/latestOfficialVersion.

Tests: core 1209 @ 100% coverage, python 54. Bronbestanden behouden hun huidige
locatie; file-moves, loader-refactor, migratie-engine en de /modellen-pagina volgen
als aparte fasen.
@github-actions

Copy link
Copy Markdown
Contributor

🚀 Preview Deployment

Your changes have been deployed to a preview environment:

api: https://pr-406-asses-k2n.rig.prd1.gn2.quattro.rijksapps.nl

frontend: https://pr-406-asses-k2n.rig.prd1.gn2.quattro.rijksapps.nl

This deployment will be automatically cleaned up when the PR is closed.

@robbertbos

Copy link
Copy Markdown
Member Author

Review + security-audit pass (multi-agent, adversarieel geverifieerd)

5-dimensie review-workflow (security · correctness · db-migratie · NeRDS/standaarden · test-gaps) over de hele stack: 16 bevindingen -> 13 bevestigd na adversariele verificatie.

Opgelost in deze stack

  • canonical-urn-consistentie (feat(versiebeheer): D1 — officieel coarse, concept precies in de urn #409): de registry keyde op de volledige bronversie terwijl getUrn een officiele versie coarset -> getByUrn(getUrn(ns)) miste bij een 3-segment-officiele versie. Nu leiden beide af van een canonicalVersion (officieel coarse, concept volledig); round-trip + tests toegevoegd.
  • route-grammatica (feat(versiebeheer): per-assessment pin-kolom (Fase 2b) #410): definitionVersion accepteerde 3.1.0/bare-major die het output-schema metadata.urn afwijst; op het stateless create-pad (zonder validateState) kon zo'n out-of-grammar pin ongevalideerd de kolom in. Pattern nu gelijk aan de urn-grammatica + maxLength.
  • NULL-fallback-doc (feat(versiebeheer): per-assessment pin-kolom (Fase 2b) #410): de kolom-comment beloofde een read-pad-fallback die nog niet bestaat -> verduidelijkt als contract voor resolve-by-pin.
  • test-gaps: register-invariant (raakt de actieve view niet), last-write-wins, canonicalVersion, de round-trip, en de 3-segment-rejectie.

Bewust uitgesteld (geflagd)

  • Pin <-> metadata.urn-coercion wanneer de client beide aanlevert en ze verschillen: hoort bij de server-autoritatieve coercion (plan E) - vervolg-PR.

Alle suites groen: core 1227 + backend 432 @ 100% coverage.

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