Een proof-of-concept voor het uitvoeren van machine-leesbare specificaties van Nederlandse wetgeving.
Veel Nederlandse wetten zijn in essentie mechanische processen. Dit wordt duidelijk uit deze drie voorbeelden:
→ Algemene Ouderdomswet, Artikel 13, lid 1-3
1. De oppbouw van het ouderdomspensioen vindt plaats over een tijdvak van 50 jaren.
2. Voor elk jaar wordt 2 percent van het ouderdomspensioen opgebouwd.
3. Bij een korter tijdvak dan 50 jaren wordt het ouderdomspensioen evenredig verlaagd.
Wat maakt dit mechanisch?
Dit is een pure rekenkundige formule: uitkering = basispensioen × (opbouwjaren ÷ 50) × 0.02
. Elke variabele is exact
gedefinieerd en de berekening is deterministisch.
→ Wet op de Huurtoeslag, Artikel 19, lid 2-3
Voor elk rekeninkomen boven het minimum-inkomenspunt geldt de formule:
(a x Y²) + (b x Y)
waarbij:
Y = het rekeninkomen
a, b = factoren per type huishouden, vast te stellen bij ministeriële regeling
De uitkomst wordt naar boven afgerond op hele eurocenten.
Wat maakt dit mechanisch? Dit is een pure wiskundige formule met kwadratische en lineaire termen. De wetgever heeft hier expliciet gekozen voor een algebraïsche notatie - inclusief variabelen, machten en constanten. Dit is één-op-één om te zetten naar code.
→ Participatiewet, Artikel 22a, lid 2-3
De kostendelersnorm wordt berekend volgens de formule:
(40% + A × 30%) × N
waarbij:
A = aantal kostendelende medebewoners
N = gehuwdennorm genoemd in artikel 21, onderdeel b
Wat maakt dit mechanisch? Dit is letterlijk een wiskundige formule met variabelen, constanten en een exacte berekeningswijze. Het is een algoritme dat direct om te zetten is naar code.
Deze wetten zijn algoritmes vermomd als tekst. Dit leidt tot drie problemen:
- 👩💻 Interpretatie door programmeurs zonder juridische achtergrond.
- MERK OP: wetten in deze PoC zijn nu grotendeels door een programmeur (met behulp van een LLM) omgezet naar
machine law
. Uiteindelijk zouden dit soort gegenereerdemachine law
interpretaties het startpunt kunnen zijn voor juristen.
- MERK OP: wetten in deze PoC zijn nu grotendeels door een programmeur (met behulp van een LLM) omgezet naar
- 🤷 Gebrek aan transparantie voor burgers en ambtenaren ("computer says no")
⚠️ Moeilijke kwaliteitscontrole van implementaties
Dit project bouwt voort op regels.overheid.nl. Waar regels.overheid.nl zich vooral richt op het documenteren en publiceren van wetten, gaan wij een stap verder:
- Executeerbare Code: regel specificaties zijn niet alleen documentatie, maar daadwerkelijk uitvoerbare code die direct door computersystemen verwerkt kan worden
- Ingebouwde Engine: De specificaties komen met een engine die ze kan uitvoeren, valideren en testen
- Formele Verificatie: Door de exacte specificatie kunnen we bewijzen dat implementaties correct zijn en resolven.
- Directe Implementatie: Overheidsorganisaties kunnen (uiteindelijk) de specificaties direct in hun systemen gebruiken.
Dit maakt het mogelijk om wetten niet alleen te beschrijven, maar ook te testen en valideren voordat ze in productie gaan.
Vooralsnog zijn deze wetten geïmplementeerd in machine law
(met behulp van een LLM).
- Hoofdwet - Berekening zorgtoeslag
- Verzekeringsstatus - Bepaling verzekeringsstatus
- Hoofdwet - Berekening AOW-uitkering
- Leeftijdsbepaling - Bepaling AOW-leeftijd
- Hoofdwet - Berekening huurtoeslag
- Landelijke regels - Beoordeling bijstandsrecht (SZW)
- Gemeente Amsterdam - Lokale bijstandsregels
- Bezwaarprocedure - Regels voor bezwaar
- Beroepsprocedure - Regels voor beroep
- Hoofdwet - Bepaling kiesrecht
- Handelsregisterwet - KVK-registratie
- Vreemdelingenwet - Verblijfsvergunningen
- Penitentiaire Beginselenwet - Detentieregels
- Wet Forensische Zorg - Forensische zorg
- Wet Studiefinanciering - Studiefinanciering
- Wetboek van Strafrecht - Strafbepalingen
- Wet BRP - Persoonsgegevens
- Wet Inkomstenbelasting - Toetsingsinkomen
- SUWI - Verzekerde jaren
- CBS - Levensverwachting
Clone deze repository:
git clone git@github.com:MinBZK/poc-machine-law.git
cd poc-machine-law
Installeer uv
volgens de documentatie of maak gebruik van asdf (zodat de juiste versie van uv
wordt gebruikt):
asdf install
Installeer alle dependencies:
uv sync
Run behavior tests:
script/test-behaviour
Run UI tests
# Install Playwright
playwright install
# Run tests
script/test-ui
Run simulaties:
uv run simulate.py
Run de burger interface:
uv run web/main.py
Dit zou een interface hier http://0.0.0.0:8000 en hier http://0.0.0.0:8000/admin op moeten leveren.
De web interface is geconfigureerd om standaard de Go engine te gebruiken (zie web/config/config.yaml
). Om de Go server te starten:
cd machinev2/backend
APP_BACKEND_LISTEN_ADDRESS=:8081 APP_INPUT_FILE=./cmd/serve_input.yaml APP_DEBUG=false go run . serve
De Go server is vervolgens beschikbaar op port 8081. Als je de Python engine wilt gebruiken in plaats van de Go engine, pas dan web/config/config.yaml
aan door de default: true
regel te verplaatsen naar de Python engine.
Er is ook een control panel beschikbaar op http://0.0.0.0:8000/admin/control waarmee je de engine kunt configureren en monitoren.
De applicatie ondersteunt meerdere LLM providers voor het genereren van uitleg en het beantwoorden van vragen:
-
Claude (Anthropic) - Standaard provider
# Stel Claude in als provider export ANTHROPIC_API_KEY=jouw_anthropic_api_key export LLM_PROVIDER=claude
-
VLAM.ai - Nederlandse overheids-LLM
# Stel VLAM.ai in als provider export VLAM_API_KEY=jouw_vlam_api_key export VLAM_BASE_URL=https://api.demo.vlam.ai/v2.1/projects/poc/openai-compatible/v1 export VLAM_MODEL_ID=ubiops-deployment/bzk-dig-chat//chat-model export LLM_PROVIDER=vlam
Je kunt ook de provider selecteren in de web-interface, op voorwaarde dat de benodigde API-sleutels zijn ingesteld.
De applicatie ondersteunt feature flags om bepaalde functionaliteiten aan of uit te zetten. Feature flags kunnen worden beheerd via het admin control panel op /admin/control
.
Momenteel ondersteunde feature flags:
WALLET
- Bestuurt de NL Wallet integratieCHAT
- Bestuurt de chat interface
Feature flags worden opgeslagen als environment variables met het prefix FEATURE_
. Bijvoorbeeld, de wallet feature flag wordt opgeslagen als FEATURE_WALLET
.
Je kunt features in- en uitschakelen via de admin control panel UI of door de environment variables handmatig in te stellen:
# Wallet feature uitschakelen
export FEATURE_WALLET=0
# Chat feature inschakelen
export FEATURE_CHAT=1
In willekeurige volgorde:
📅 Implementatie van referentiedatums📚 Toevoegen van meer wetten naast de zorgtoeslagwet⚖️ Onderzoeken hoe algemene wetten (zoals bezwaarrecht) hierin passen👥 Verbeteren van uitlegbaarheid naar burgers- 🙋 Hardheid-by-design
- 🔧 Ontwikkelen van tools om wetten om te zetten
- 🔍 Detectie van deadlocks/loops in wetgeving
Bijdragen zijn welkom! Zie de issues voor openstaande punten.