RFC-031: Markeringen en open normen

ProposedImplemented
Depends onRequired by

Context

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.

Vervanging van een werkend mechanisme

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.

Uitwijkroute langs de bindingspoort

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.

Markeringen die artikelen leegmaken

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.

Besluit

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.

Markering als taalgat

markings heeft de velden about, reason, resolution, resolved_by, target, legal_text_excerpt en accepted. Alleen accepted is optioneel.

machine_readable: markings: - about: het kalenderjaar waarop de tegemoetkoming betrekking heeft reason: >- De motor rekent met een datum als geheel en leest er geen jaardeel uit, terwijl de bepaling op het jaar als zelfstandige waarde rust. resolution: operation resolved_by: een YEAR-bewerking die het jaardeel van een datum oplevert target: [] legal_text_excerpt: het berekeningsjaar waarop de tegemoetkoming betrekking heeft

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.

Diagnose naast wens

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 term als inhoud elders

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.

Markering als vlag op een uitgewerkt artikel

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.

Corpustoestand buiten het wetsbestand

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.

Wat niet verandert

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.

Waarom

Onderscheid zonder kennis van het corpus

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.

Achterstand van het schema op RFC-027

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.

Alternatieven

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.

Gevolgen voor andere RFC’s

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.

Wat dit niet oplost

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.

Referenties

  • Schema v0.7.0: schema/v0.7.0/schema.json, markings en open_terms in definitions.machineReadableSection
  • Model: Marking en MarkingResolution in packages/law-model/src/model.rs
  • Poort: marking_discipline in packages/pipeline/src/enrich_v2/checks.rs, die de drie prozavelden tegen elkaar houdt
  • RFC-003: Inversion of Control, waar open_terms en implements vandaan komen en waar enables werd afgewezen
  • RFC-012: Untranslatables, het kanaal onder zijn oude naam en het gedrag van de engine
  • RFC-026: De werkvoorraad van de enricher, de resolve-stap en de tweede werkvoorraad waar een gevonden gat naartoe gaat
  • RFC-027: Enrichment a Legal Expert Can Check, de eis van drie kanalen met drie eigenaren

RegelRecht

An exploration by Bureau Architectuur of the Dutch Ministry of Economic Affairs and Climate Policy into the possibilities of transparent, executable legislation.

Links

GitHub repository
How it works
Stay informed
Roadmap (Dutch)
Documentation
Research

Contact

regelrecht@minbzk.nl

Part of

Bureau Architectuur
Ministry of Economic Affairs and Climate Policy