Vier velden in het schema beschreven hetzelfde moment: het moment waarop een
artikel niet in zijn geheel in logica opgaat. untranslatables uit RFC-012,
norm_gaps uit de eerste versie van v0.7.0, enables uit v0.3.1, en
open_terms uit RFC-003. Vier vocabulaires voor één situatie, en de keuze
tussen die vier lag bij een agent die per artikel besliste.
De meting die deze RFC uitlokte komt uit ronde 4 van de enricher. Dat corpus
bevat 101 norm_gaps, 39 untranslatables en 11 enables, en nul
open_terms, implements of declares. Het handgeschreven corpus doet het
omgekeerd: vier bestanden hebben open_terms met de bijbehorende implements,
en er staat geen enkele norm gap in. Twee corpora met disjuncte mechanismen voor
overlappende situaties. Dezelfde zin uit dezelfde wet krijgt in het ene corpus
een gedelegeerde open norm en in het andere een gat.
norm_gaps staat niet in packages/law-model/src/model.rs. De engine leest het
veld dus niet, en heeft het ook nooit gelezen. De 101 markeringen uit ronde 4
bestaan voor de uitvoering niet: ze zitten in het bestand, ze halen de
schemavalidatie, en er is geen pad waarlangs ze ooit een uitkomst raken.
open_terms staat wel in het model, wordt bij het laden geïndexeerd, wordt op
datum en op regelgevingslaag gefilterd en levert bij een gevonden invulling een
waarde op. Dat mechanisme werkt sinds RFC-003 en de enricher heeft het nul keer
gebruikt.
Een mechanisme dat draait is daarmee honderd keer overgeslagen voor een mechanisme dat stilstaat, en geen enkele poort in de keten merkte het verschil. Dat is het eigenlijke defect; de naamgeving is de aanleiding om het aan te pakken.
Van de 101 norm gaps zijn er 43 een kruisverwijzing naar een wet die al in het
corpus staat. Dat zijn invoeren met een source, opgeschreven als gat.
Ze zijn niet toevallig ontstaan. De poort cross_law_references accepteerde een
substring in de markeringen als bewijs dat een verwijzing behandeld was. Een
norm gap met het BWB-nummer in de tekst was daarmee de goedkoopste manier om die
poort te passeren, goedkoper dan het leggen van de binding die de poort wilde
afdwingen. De poort mat zo de uitwijkroute.
Dit is dezelfde faalvorm als de generatieskill die opdracht gaf procedurele bepalingen over te slaan en daarmee precies de bepalingen weghaalde die het bestuur begrenzen (RFC-027, Omission that runs one way). In beide gevallen zit de oorzaak in de instructie of in de meetlat, en zoekt wie de uitvoer inspecteert op de verkeerde plaats. Een controle die alleen telt of er iets staat, krijgt iets.
De aanhef van artikel 1 van de Wet op de zorgtoeslag kreeg in ronde 4 één markering en verder niets, terwijl de begripsbepalingen eronder gewoon te modelleren waren. Dat patroon herhaalt zich door het corpus heen: de markering staat op de plaats waar de logica had moeten staan.
De teller ernaast zegt hetzelfde. blocks, de voorganger van target, is leeg
in 39 van de 39 untranslatables. Van de 72 outputs die via een norm gap als
geblokkeerd stonden gemarkeerd, ontbreekt er geen enkele: ze worden allemaal
door een actie in hetzelfde artikel uitgerekend. Het veld dat moest zeggen wat
er verloren gaat, heeft dat nog geen enkele keer gezegd.
Vier begrippen worden er twee. Schema v0.7.0 verwijdert untranslatables,
norm_gaps en enables, en ook structural_choices, dat alleen in checks.rs
werd gelezen en nergens werd geschreven. Oudere schemaversies houden hun velden;
de wijziging geldt alleen voor v0.7.0 en verder.
markings heeft de velden about, reason, resolution, resolved_by,
target, legal_text_excerpt en accepted. Alleen accepted is optioneel.
resolution heeft twee waarden en zegt wat er moet veranderen voordat het
artikel wel volledig te vertalen is. operation betekent dat de bewerking niet
bestaat en gebouwd moet worden, zoals wettelijk afronden of het jaardeel van een
datum. Zo’n bewerking toevoegen raakt het schema, het model, de evaluatie in de
motor, de BDD-grammatica en de frontend, dus de waarde noemt wat erbij moet en
niet waar het toevallig draait. model betekent dat de bewerkingenverzameling
niet het probleem is en het formaat geen vorm heeft voor deze constructie, zoals
kwantificeren over personen, een regel over een verzameling in plaats van over
een waarde, of een juridische fictie.
Verder past er niets in dit veld. Een norm waarvan een andere regeling de inhoud
invult is een open term. Een waarde die een andere wet produceert is een invoer
met een source.
about, reason en resolved_by zeggen achtereenvolgens wat er niet past,
waarom het niet past, en wat het gat zou dichten. reason staat er in de eerste
versie van deze samentrekking niet bij: resolved_by leek hem te dekken, want
wie kan opschrijven wat het gat sluit heeft de constructie gelezen. Het corpus
van ronde 4 laat zien dat de afhankelijkheid één kant op loopt. Bij de markering
over “voor zover” stond in reason dat die woorden de toepassing per bepaling
van de wet beperken en niet de wet als geheel, zodat een oude regeling deze wet
voor het ene onderwerp wel en voor het andere niet van toepassing kan verklaren,
en dat het model alleen toepasselijkheid van een hele wet kent. In resolved_by
stond dat er een vorm nodig is waarin toepasselijkheid per bepaling kan worden
uitgedrukt. Het tweede volgt uit het eerste; uit het tweede is het eerste niet
terug te lezen.
Wat wegviel was daarmee de juridische analyse, en wat overbleef de wens. Voor een
lezer die moet beoordelen of een model-markering eerlijk is, is dat de
verkeerde helft: zonder diagnose leest een onderzocht gat hetzelfde als een gat
waar niemand naar heeft gekeken. reason is daarom terug, als verplicht veld.
De les reikt verder dan dit ene veld. Twee velden waarvan het ene uit het andere volgt zijn geen herhaling, en bij samentrekken mag alleen de kant weg die af te leiden is. Dat is nooit de kant met het denkwerk erin.
Een diagnose noemt de vorm die het formaat heeft en de afstand daartoe. “Het model kent alleen toepasselijkheid van een hele wet” is er een; “dit past niet in het model” is de bewering van de markering zelf, een tweede keer opgeschreven.
open_terms neemt over wat norm_gaps over de wet zelf zei. Dit is de enige
plaats voor een open norm, ongeacht of de wet een invuller aanwijst.
Wijst de wet er een aan, dan noemen delegated_to en delegation_type wie de
term mag invullen en met welke soort regeling, en weigert de engine een
invulling van een andere laag. Noemt de wet geen regeling, zoals bij
“redelijkerwijs” of “in bijzondere gevallen”, dan blijven die twee velden leeg
en noemt decided_per_case_by het gezag dat per geval oordeelt. De engine leest
een ontbrekende delegation_type al als “geen eis aan de laag”, dus deze
uitbreiding kost de resolver niets.
Alle drie de velden leeg laten mag niet, en dat is de hele reden dat het derde
veld bestaat. Een open term zonder invuller zegt alleen dat er iets ontbreekt,
en dat is geen open norm maar een omissie; het verschil tussen de twee is waar
dit begrip voor is. “Redelijkerwijs” is geen leegte maar een
discretionaire bevoegdheid die iemand heeft en moet motiveren, en juist die
iemand is de informatie die de lezer nodig heeft. De poort
open_terms_name_a_filler in de verrijkingsketen weigert de vorm waarin alle
drie leeg zijn.
Het begrip verandert niet met de vraag of de wet een invuller aanwijst. De oude
kind-waarden delegated, policy en open beschreven drie manieren waarop
dezelfde open norm ingevuld raakt, en die informatie staat nu in
delegated_to, waar de resolver hem ook gebruikt.
Een markering noemt het ene ding dat niet past en laat alles staan wat wel past. Een markering die een artikel leeg achterlaat verliest alle logica die wel af te leiden was, en meet het gat te groot. De vertaling van artikel 1 van de zorgtoeslag is daarmee een defect. Voorzichtig vertalen is iets anders.
target is de aanwijzer. Het noemt de waarden in dit artikel die door deze
markering niet geproduceerd kunnen worden, met hun naam, en elke naam die erin
staat moet ontbreken in de acties van het artikel. Een waarde uitrekenen die je
geblokkeerd noemt is een tegenspraak, en die is machinaal te vinden.
Een lege lijst betekent niet dat het veld vergeten is. Zij zegt dat het artikel uitvoerbaar blijft en dat alleen de verantwoording onvolledig is. Dat maakt het onderscheid tussen de twee soorten markeringen zichtbaar zonder dat iemand het artikel leest.
Of de invullende regeling vandaag in het corpus staat, is een eigenschap van het
corpus. Dat hoort niet in het wetsbestand, want het is morgen niet meer waar en
niemand ruimt het op. Daarmee vervallen expected_source, searched en
resolved_by uit de oude norm_gaps. Het adres van de invulling volgt uit
delegated_to en delegation_type, en de vraag of zij gevonden is hoort bij de
resolve-stap en de werkvoorraad van RFC-026.
markings kent ook een resolved_by, met een andere betekenis: de verandering
die de markering zou opheffen, concreet genoeg om werk te worden. Markeringen
groeperen op dat veld levert de achterstand aan ontbrekende bewerkingen af,
gelezen uit het corpus in plaats van uit een wensenlijst.
overrides blijft zoals het is. Een verdringing verandert een uitkomst en
rapporteert er niet over, en voids en legal_text_excerpt zeggen wat er
gebeurt en waarom. declares blijft ook, want dat beschrijft iets dat het
artikel doet.
Wat de engine met een markering doet, is besloten: hetzelfde als met een
untranslatables-entry. De vier modi van RFC-012 lezen beide kanalen, en een
gemarkeerd artikel gedraagt zich exact als een artikel met een
untranslatables-entry — niet-geaccepteerd stopt de uitvoering, geaccepteerd
draait de deellogica.
Dat besluit volgt uit de migratie zelf en niet uit een aparte afweging. De wetten die naar v0.7.0 gaan dragen een markering waar zij een untranslatable droegen. Zou de engine alleen het oude kanaal lezen, dan verliest elk gemigreerd artikel zijn modus op het moment van migreren en draait het alsof er niets gevlagd is. Een vlag die bij het overzetten zijn werking verliest is erger dan geen vlag, want de wet ziet er in het bestand nog steeds gevlagd uit.
Wat wél openstaat is de fijnere vraag: of een markering ooit een eigen modus
verdient naast de vier die er zijn, bijvoorbeeld wachten op invoer in plaats
van stoppen. Die vraag hangt aan resolution en target, die per markering
zeggen welke laag moet bewegen en welke waarden wegvallen, en zij is niet te
beantwoorden voordat er markeringen in het corpus staan om aan te meten.
Een markering en een open term zijn uit elkaar te houden met het artikel en het schema in de hand. Kan de taal dit uitdrukken, ja of nee. Dat is een vraag over het formaat, en het antwoord verandert alleen wanneer het formaat verandert.
De oude grens liep ergens anders. norm_gaps vroeg of de invullende regeling
geoogst was, en dat antwoord hangt af van wat er die dag in het corpus staat.
Wie de grens daar legt, schrijft de toestand van de werkvoorraad in het contract
dat de engine leest.
RFC-027 stelt onder Doubt must leave a trace dat een gat in het corpus, een gat in de taal van de engine en een gat in de tekst drie dingen zijn met drie eigenaren, en dat zij drie kanalen nodig hebben. De poort op het verslag noemt de faalvorm erbij: een norm die door een ongeoogste regeling wordt ingevuld, opgeschreven als iets dat de engine niet kan uitdrukken, gaat naar een wachtrij waar niemand hem oppakt, want het antwoord erop is een oogst en geen bewerking.
Het schema deelde op een andere as in. untranslatables.kind kende
engine_operation en model_form, norm_gaps.kind kende delegated, policy
en open, en welke van de twee velden je koos bepaalde welke vraag je kreeg.
resolution maakt van de eigenaar de as, op het ene kanaal, met het corpus als
derde eigenaar in open_terms plus de werkvoorraad. RFC-027 schreef dat voor
voordat het schema het kon uitdrukken.
De vier velden houden en de skill beter uitleggen. Verworpen. Ronde 4 draaide op een skill die het onderscheid uitlegde, en het corpus laat zien wat dat opleverde: 101 gaten in het inerte veld en nul in het werkende. Een onderscheid dat alleen in proza bestaat, overleeft de eerste agent niet.
Alles op één veld. Verworpen. De twee soorten hebben verschillende eigenaren en verschillende oplossingen. Op één lijst werkt niemand, en dat is de faalvorm die RFC-027 benoemt.
enables alsnog bouwen. Verworpen. RFC-003 wees het veld in maart af omdat
het bevoegdheid en uitvoering mengt, en die afwijzing blijkt terecht: alle elf
enables in ronde 4 staan op een artikel dat daarnaast al een norm gap heeft
over dezelfde delegatie. Het veld bestond sinds v0.3.1 zonder lezer in de engine
en zonder eigen inhoud.
De corpustoestand in het wetsbestand houden. Verworpen. searched en
resolved_by verouderen zodra er geoogst wordt, en een veld dat veroudert
zonder dat iemand het aanraakt geeft op termijn onjuiste informatie.
RFC-003 krijgt de regel dat open_terms de enige plaats is voor een open norm,
en de vaststelling dat de afwijzing van enables in v0.7.0 wordt uitgevoerd.
RFC-012 wordt door deze RFC vervangen en gaat op Superseded. Zijn tekst blijft
woordelijk staan: hij beschrijft untranslatables zoals dat veld was toen hij
werd vastgesteld, en een wet op schema v0.5.x draagt het nog. Wat een bestand
op v0.7.0 en later draagt, staat hier.
RFC-026 tot en met RFC-029 spreken op meerdere plaatsen over norm_gaps en
untranslatables. Zij noemen nu markeringen en open termen, en RFC-029 laat de
claim vallen dat de sprong naar v0.7.0 additief is.
Het corpus in de repository staat op v0.5.x en migreert niet mee. Zolang dat zo is, kent de repository twee vocabulaires, met de schemaversie als enige scheidslijn.
De resolutiesoort is een voorspelling over wat het gat sluit. about, target
en legal_text_excerpt zijn tegen de wettekst te controleren, en de eerste helft
van reason ook, want die leest de bepaling. De tweede helft van reason, de
resolutiesoort en resolved_by gaan alle drie over het formaat, en daarvoor is
de wettekst geen maatstaf. Een poort houdt ze tegen het formaat aan: de
bewerkingenlijst voor engine, de vormen die het formaat heeft voor model, en
voor de twee prozavelden of zij niet elkaars herhaling zijn. Een verkeerde
resolutiesoort die daar doorheen komt levert werk in de verkeerde wachtrij op, en
dat merk je pas bij het werken.
De poort die 43 kruisverwijzingen in de vorm van een gat accepteerde, is met een schemawijziging niet gerepareerd. Zolang die poort een substring telt, blijft er een goedkope uitweg, alleen onder een andere veldnaam.
Een verkeerd geadresseerde open term wijst de zoeker naar het verkeerde document. De poort kan controleren dát er een adres is, niet of het klopt. Dat staat zo al in RFC-026 en verandert hier niet.
schema/v0.7.0/schema.json, markings en open_terms in
definitions.machineReadableSectionMarking en MarkingResolution in packages/law-model/src/model.rsmarking_discipline in packages/pipeline/src/enrich_v2/checks.rs,
die de drie prozavelden tegen elkaar houdtopen_terms en
implements vandaan komen en waar enables werd afgewezenAn exploration by Bureau Architectuur of the Dutch Ministry of Economic Affairs and Climate Policy into the possibilities of transparent, executable legislation.
GitHub repository
How it works
Stay informed
Roadmap (Dutch)
Documentation
Research
Bureau Architectuur
Ministry of Economic Affairs and Climate Policy