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:
| Bron | Article-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 |
| Rechtspraak | Geen 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_articlesmettoestand_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.tsmomenteel maakt (geen dispatch opkey_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
artikelbitemporal (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