Skip to content

Pointer-method — article-level cross-document modelling

De pointer-method is de architecturale beslissing dat article-level structuur niet wordt geünificeerd over de verschillende document-bronnen heen. Alleen FRBR Work / Expression / Manifestation wordt geünificeerd; alles daaronder blijft bron-specifiek. Beslist in de architecture audit 2026-05-05 als antwoord op de vraag "hoe modelleren we Omgevingsplan article-level naast BWBR, IMRO, Rechtspraak en de rest?"

Het probleem

Databank moet vijf verschillende article-level structuren tegelijk huisvesten:

BronArticle-level structuur
BWBR (nationale wetgeving)Plat artikel-body, toestand_date-bucketed (public.law_articles)
IMRO (pre-Ow bestemmingsplan)Article-level via geo_raw.imro_artikelen, HTML met parent-anchor tree
DSO Omgevingsplan (post-Ow)LICHAAM > HOOFDSTUK > ARTIKEL > LID > SUBLID met wId-identifiers, STOP-XML inhoud, IMOW kernklassen voor activity / location / norm binding
RechtspraakGeen interne article-structuur — één blok tekst
CVDR (decentrale consolidatie)Mostly auto-rendered, geen eigen IMOW-structuur

Er is geen realistisch universeel article-level schema dat zinvol is voor alle vijf. Pogingen om er één te bouwen leiden tot:

  • Mush — alles plat-tekst maken en de Omgevingsplan-structuur verliezen
  • Accidental complexity — elke article-rij krijgt een IMOW-kernklassen-relatie die hij niet nodig heeft (BWBR-artikel hoeft geen activity_location-relatie)

De keuze

Unifieer alleen op Work / Expression / Manifestation. Article-level structuur blijft per bron in eigen satellite-tabellen:

canonical.instruments (Work)              ← uniform
  └── canonical.instrument_versions (Expression) ← uniform, MET content_refs JSONB
       └── canonical.instrument_renderings (Manifestation) ← uniform

            content_refs zegt waar de article-level content woont:

  { "store": "dso_regeling",   "regeling_identificatie": "...", "voorkomen_versie": 3 }   ← DSO
  { "store": "law_articles",   "bwb_id": "BWBR0..." }                                      ← BWBR
  { "store": "imro_artikelen", "plan_identifier": "..." }                                  ← IMRO
  { "store": "uitspraak.uitspraken", "ecli": "..." }                                       ← Rechtspraak (Expression.full_text dient)

De FRBR-laag abstraheert identity, version-chain en publication. Hij weigert om interne document-structuur te abstraheren.

Wat dit waarborgt

  • Geoportaal's Omgevingsplan-pijplijn is herbruikbaar zoals hij is. Geen verlies van structuur, geen accidental-complexity-tax bij overdracht.
  • BWBR-artikelen blijven in public.law_articles met toestand_date — geen mishandeling als "DSO-achtig" of "IMRO-achtig".
  • Rechtspraak-uitspraken blijven één tekstblok — geen valse article-tree.
  • Cross-document operaties (zoek / KG / citatie-graaf) moeten of (a) op Expression-niveau werken met source-specifieke resolver, of (b) op een genormaliseerde projectie die expliciet erkent dat ze structuur verliest (chunked plain text).

Wat dit verbiedt

  • Code die "an article" als uniform-concept across DSO + BWBR + IMRO + Rechtspraak behandelt. Dat is een wrong turn die RuleEvaluator.ts momenteel maakt (geen dispatch op key_kind). Als source-specific evaluatie nodig wordt — STOP-IMOP IntRef-volgen, BWBR toestand-aware lezen — moet de dispatch-hook erbij komen, niet ge-stille-genormaliseerd-worden.

De pre-condities

ADR-0027 (bitemporal dso_artikel) moet landen vóór instrument_versions naar DSO-content gaat wijzen. Zie bitemporal model. Zonder de bitemporal-base wordt article-tekst overschreven door OzonSyncService.ts ON CONFLICT DO UPDATE SET inhoud, en de version-pointer-invariant breekt.

Onderliggende ADRs en docs

  • ADR-0026 — DSO document content_refs (de JSONB-pointer-shape)
  • ADR-0027 — DSO artikel bitemporal (pre-conditie voor de pointer)
  • ADR-0031 — Two-stack FRBR (algemene pijler-keuze)
  • docs/handoffs/2026-05-05-architecture-audit.md §5 — volledige redenering met DSO-cijfers

Intern handboek — niet voor externe publicatie