uchar · universal characteristic

Eén tussentaal voor uitvoerbare wetgeving.

Wetgeving die als regels moet draaien, wordt geschreven in een regeltaal zoals RegelSpraak, RuleSpeak, Catala of RegelRecht. uchar vertaalt zulke regels naar één tussentaal waarvan de betekenis in een specificatie is vastgelegd, en voert ze van daaruit uit op Drools, op Clingo en op een referentie-interpreter; nu voor RegelSpraak, Catala en F-logic. Elke taal en elke engine hoeft maar één vertaling te kennen, dus een taal toevoegen, ook de taal die bij een organisatie past, is één vertaler schrijven.

uchar · universal characteristic

One intermediate language for executable law.

Legislation that has to run as rules is written in a rule language such as RegelSpraak, RuleSpeak, Catala or RegelRecht. uchar translates such rules into one intermediate language whose meaning is fixed in a specification, and from there executes them on Drools, on Clingo and on a reference interpreter; today for RegelSpraak, Catala and F-logic. Each language and each engine only has to know one translation, so adding a language, including the one that fits a given organisation, means writing one translator.

Zandloper-architectuur van uchar brontalen · characteristica source languages · characteristica RegelSpraak Catala F-logic uchar IR spec · schema · verifier · corpus Drools Clingo (ASP) referentie-interpreterreference interpreter executors · calculus ratiocinator executors · calculus ratiocinator

Waarom

Meerdere talen en engines dwingen een schone tussentaal af. Elke brontaal brengt constructen mee die de IR moet kunnen uitdrukken en maakt haar zo rijker. Elke extra engine bewijst dat die constructen niet aan één backend hangen. Wat een uitdrukking in een brontaal betekent, staat daardoor volledig in de IR-specificatie, niet stilzwijgend in de code van één rule engine.

Why

Several languages and engines force a clean intermediate language. Every source language brings constructs the IR has to express, and so makes it richer. Every additional engine proves that those constructs do not depend on one backend. What an expression in a source language means therefore sits entirely in the IR specification, not tacitly in the code of one rule engine.

Hoe

Eerst welgevormd, dan drie keer uitgevoerd. Zoals bij LLVMLLVM is de compiler-infrastructuur achter onder meer Clang, Rust en Swift: één tussentaal (LLVM IR) tussen tientallen programmeertalen en processorarchitecturen, met een specificatie (LangRef) en een verifier die welgevormdheid afdwingt. staat elke welgevormdheidsregel van de IR in de specificatie, met een WF-nummer, en dwingt een aparte verifier haar af vóór er iets draait. Daarna moeten de referentie-interpreter, Clingo en Drools, die elk zelfstandig rekenen, elke corpuscase hetzelfde vastgelegde antwoord geven, en een handgeschreven ankerset legt de absolute waarden vast; wat een uitvoerder niet ondersteunt, weigert hij met naam en reden.

How

Well-formed first, then executed three times. As in LLVMLLVM is the compiler infrastructure behind Clang, Rust and Swift among others: one intermediate language (LLVM IR) between dozens of programming languages and processor architectures, with a specification (LangRef) and a verifier that enforces well-formedness., every well-formedness rule of the IR is written in the specification, with a WF number, and a separate verifier enforces it before anything runs. After that the reference interpreter, Clingo and Drools, each evaluating on its own, must give every corpus case the same pinned answer, and a hand-written anchor set fixes the absolute values; whatever an executor cannot carry, it refuses by name and with a reason.

Verder

Regels in de taal van het vak, uitgevoerd op een engine naar keuze. Een nieuwe brontaal kost één vertaler naar de IR, een nieuwe engine één vertaler eruit; de betekenis hoeft niet opnieuw te worden vastgelegd. Als mogelijke richtingen zijn vastgelegd: een normatieve laag met verplichtingen en bevoegdheden, en een solver die eigenschappen van een hele regelset bewijst in plaats van alleen cases door te rekenen.

Beyond

Rules in the language of the domain, executed on an engine of choice. A new source language costs one translator into the IR, a new engine one translator out of it; the meaning does not have to be fixed again. Directions on record as options: a normative layer with obligations and powers, and a solver that proves properties of a whole rule set instead of only computing cases.

§ 1watwhat

Een tussentaal met vastgelegde betekenis

uchar is een intermediate representation voor wetgeving die als regels moet worden uitgevoerd. Een regelset wordt geschreven in een domeinspecifieke taal, nu RegelSpraak, Catala of F-logic, en vertaald naar één IR: een JSON-document waarvan de betekenis is vastgelegd in een bindende specificatie, een schema en een verifier. Vanuit die IR draaien dezelfde regels op drie uitvoerders: de productie-regelengine Drools, de ASP-solver Clingo en een kleine referentie-interpreter in OCaml.

De naam is een afkorting van universal characteristic, naar Leibniz' characteristica universalis, teruggebracht van "al het menselijk redeneren" tot een domein waarin het daadwerkelijk te bouwen is: wetgeving als uitvoerbare regels. Het project leest "universeel" als richting, niet als bewering dat versie 1 alles dekt.

De betekenis van de IR ligt vast in een geschreven specificatie; de software eromheen bestaat om die te toetsen en uit te voeren, en is vervangbaar. De repository bestaat uit zeven onderdelen:

spec/
De bindende IR-specificatie (elke MUST draagt een WF-nummer), de evaluatiesemantiek met uitgewerkte voorbeelden die letterlijk als test draaien, het register van afwijkingen tussen de gespiegelde v0 en de eigen v1, de JSON-schema's en een OCaml-verifier.
corpus/
Golden cases met verwachte waarden, negatieve documenten die de verifier moet afwijzen, en rode cases die in elke uitvoerder waarneembaar moeten falen.
ref/
De referentie-interpreter: de uitvoerbare definitie van de semantiek.
backends/
De vertaling naar ASP voor Clingo, en de Drools-backend: een IR-loader en één analyse met truth maintenance, weergegeven als executable model en als DRL-tekst.
frontends/
De frontends die RegelSpraak (parser en resolver in Java), Catala (een plugin op de Catala-compiler) en F-logic (in OCaml) naar de IR vertalen.
scripts/
De gates: controles die lokaal draaien voordat een wijziging landt.
toka/
Pariteitsmateriaal op de TOKA-casus van de Belastingdienst, materiaal van derden, waarmee gate 11 de RegelSpraak-frontend vergelijkt met de oorspronkelijke toolchain; het valt niet onder de licenties van de repository (§ 8).

An intermediate language with a defined meaning

uchar is an intermediate representation for legislation that has to run as rules. A rule set is written in a domain-specific language, today RegelSpraak, Catala or F-logic, and translated into one IR: a JSON document whose meaning is fixed by a normative specification, a schema and a verifier. From that IR the same rules run on three executors: the production rule engine Drools, the ASP solver Clingo and a small reference interpreter written in OCaml.

The name abbreviates universal characteristic, after Leibniz's characteristica universalis, scaled down from "all human reasoning" to a domain where it can actually be built: legislation as executable rules. The project reads "universal" as a direction, not as a claim that version 1 covers everything.

The meaning of the IR is fixed in a written specification; the software around it exists to test and execute it, and is replaceable. The repository consists of seven parts:

spec/
The normative IR specification (every MUST carries a WF number), the evaluation semantics with worked examples that run verbatim as tests, the register of deviations between the mirrored v0 and uchar's own v1, the JSON schemas and an OCaml verifier.
corpus/
Golden cases with expected values, negative documents the verifier must reject, and red cases that must fail observably in every executor.
ref/
The reference interpreter: the executable definition of the semantics.
backends/
The translation to ASP for Clingo, and the Drools backend: an IR loader and one analysis with truth maintenance, rendered as the executable model and as DRL text.
frontends/
The frontends that translate RegelSpraak (a Java parser and resolver), Catala (a plugin on the Catala compiler) and F-logic (in OCaml) into the IR.
scripts/
The gates: checks that run locally before a change lands.
toka/
Parity material on the TOKA casus of the Dutch Tax Administration, third-party material, with which gate 11 compares the RegelSpraak frontend with the original toolchain; it is not covered by the repository's licenses (§ 8).
§ 2waaromwhy

Waarom één tussentaal

Het doel, zoals het plan het formuleert: een omgeving waarin wetgeving in domeinspecifieke talen wordt geschreven, naar één gemeenschappelijke semantische kern wordt vertaald en op meerdere engines en solvers wordt uitgevoerd, waarbij elke afgeleide conclusie herleidbaar is naar haar wettelijke bron.

Zonder gedeelde tussentaal heeft elke combinatie van regeltaal en engine een eigen vertaler nodig: n talen en m engines vragen n×m vertalers. Met een tussentaal zijn het er n+m. Dat is de zandloper die LLVM gebruikt tussen tientallen programmeertalen en processorarchitecturen, en Pandoc tussen dertig documentformaten. De universaliteit zit in de taille.

De directe aanleiding was een review van de bestaande RegelSpraak-naar-Drools-toolchain, regelspraak-java (begonnen op 17 juni 2026), in augustus 2026. Het oordeel: een goede RegelSpraak-naar-Drools-IR, maar nog geen taille. Drie bevindingen lagen daaraan ten grondslag. Ten eerste bestond de IR alleen in het geheugen van de Java-toolchain, zonder serialisatie en zonder bindende specificatie, dus zonder iets waarop een tweede taal of een niet-JVM-engine kon aansluiten. Ten tweede leefde de semantiek die er het meest toe doet, zoals de omgang met lege waarden, de rekenregels, de tijdlijnalgebra en de verdeling, uitsluitend als Java-code in de productieruntime. Ten derde waren aannames van Drools tot in de IR-definities zelf doorgedrongen.

Het tweede punt weegt het zwaarst. Als de enige uitvoerder de productie-engine is, dan is het gedrag van die engine de specificatie. Daarom verhuist de betekenis in drie stappen uit de code: van de Java-runtime naar een geschreven specificatie met een referentie-interpreter, en van daar naar een vertaling in een logica met een modeltheoretische semantiek. Elke stap wordt door een eigen gate bewaakt.

Daaruit volgen de twee eisen die de band hierboven noemt. De kennis van wat een construct betekent staat in de specificatie en in de referentie-interpreter, en elke backend moet zich daarnaar richten; wat alleen in de Drools-vertaler zou staan, geldt als lek. En elke extra brontaal maakt de IR rijker: Catala bracht de geprioriteerde defaults in, F-logic dwong de overervingskern los te maken van RegelSpraak. Een tussentaal die maar één taal en één engine kent, is in feite een weergave van die taal voor die engine.

Van LLVM leent uchar de discipline, niet de IR: één voorschrijvend document per construct, een verifier als aparte stap, een tekstvorm die byte-identiek terugleest. LLVM-IR zelf is imperatieve SSA op instructieniveau, de verkeerde abstractiehoogte voor declaratieve rechtsregels. De semantische inhoud komt van Catala, met de default-calculus voor regels met uitzonderingen, en van Datalog en ASP, waar stratificatie van negatie een welgevormdheidseis van de IR is in plaats van een instelling van de engine.

Why one intermediate language

The goal, as the plan states it: an environment in which legislation is written in domain-specific languages, translated into one shared semantic core and executed on multiple engines and solvers, with every derived conclusion traceable to its legal source.

Without a shared intermediate language, every combination of rule language and engine needs its own translator: n languages and m engines require n×m translators. With one, it is n+m. That is the hourglass LLVM uses between dozens of programming languages and processor architectures, and Pandoc between thirty document formats. The universality sits in the waist.

The immediate cause was a review of the existing RegelSpraak-to-Drools toolchain, regelspraak-java (started on 17 June 2026), in August 2026. Its verdict: a good RegelSpraak-to-Drools IR, but not yet a waist. Three findings underpinned that. First, the IR existed only in memory inside the Java toolchain, with no serialization and no normative specification, so nothing a second language or a non-JVM engine could attach to. Second, the semantics that matter most, such as the treatment of empty values, the arithmetic rules, the timeline algebra and allocation, lived exclusively as Java code in the production runtime. Third, Drools assumptions had reached the IR definitions themselves.

The second finding weighs heaviest. If the only executor is the production engine, the behaviour of that engine is the specification. So meaning moves out of the code in three steps: from the Java runtime to a written specification with a reference interpreter, and from there to a translation into a logic with model-theoretic semantics. Each step has a gatekeeper in the gate set.

From this follow the two requirements the band above states. The knowledge of what a construct means lives in the specification and in the reference interpreter, and every backend has to conform to them; whatever would exist only in the Drools translator counts as a leak. And every additional source language makes the IR richer: Catala brought in the prioritized defaults, F-logic forced the inheritance kernel loose from RegelSpraak. An intermediate language that knows only one language and one engine is in effect a rendering of that language for that engine.

From LLVM uchar borrows the discipline, not the IR: one normative document per construct, a verifier as a separate pass, a textual form that reads back byte-identically. LLVM IR itself is imperative SSA at instruction level, the wrong abstraction height for declarative legal rules. The semantic content comes from Catala, with its default calculus for rules with exceptions, and from Datalog and ASP, where stratification of negation is a well-formedness condition of the IR rather than an engine setting.

§ 3talenlanguages

Drie brontalen

Elke brontaal vertaalt naar dezelfde IR. Ze hebben niet dezelfde rol: de eerste is het startpunt en het huidige hoofddoel, de andere twee zijn gekozen om de IR tijdens zijn eigen ontwikkeling te testen.

RegelSpraak, met GegevensSpraak

De gecontroleerde natuurlijke taal, in het Nederlands, waarin de Belastingdienst uitvoerbare wetgeving schrijft; versie 2.3.0. Bij de Belastingdienst leeft de taal in ALEF (Agile Law Execution Factory), een op JetBrains MPS gebouwde ontwikkelomgeving die als open source is gepubliceerd. Daarin is het gegevensmodel een eigen taal, GegevensSpraak, naast de regeltaal RegelSpraak en de testtaal TestSpraak. De grammatica van uchar volgt die tweedeling: het declaratiedeel met objecttypen, attributen, kenmerken, feittypen, parameters, domeinen en dagsoorten is GegevensSpraak, het regeldeel is RegelSpraak. Een nieuwe regeltaal bedenken zou een rijke, gespecificeerde en in productie bewezen taal hebben weggegooid. Het hele pad van RegelSpraak naar Drools ligt in uchar zelf: de frontend schrijft het IR-document, de Drools-backend laadt het en vertaalt het naar Drools. De distributie regelspraak-toolchain, opvolger van regelspraak-java, maakt dat pad bruikbaar met een CLI, een beslisservice, een container-image en een Helm-chart; zij neemt uchar op als git-submodule, waarvan de commit de pin is, en heeft geen eigen semantiek.

Catala

De onderzoekstaal van Inria voor belastingwetgeving. Het kernconstruct is een algemene regel met geprioriteerde uitzonderingen, de vorm waarin wetgeving daadwerkelijk is opgebouwd. Catala werd gekozen als volledige, volwassen juridische taal; dat zijn kern een default-calculus is, maakte het later de natuurlijke tweede bron voor de node voor geprioriteerde defaults in de IR.

F-logic

Frames met klassehiërarchieën en overerfbare klasse-defaults. F-logic is gekozen voor precies dat ene construct: als de overervingskern van de IR ook vanuit F-logic bereikt wordt, is hij aantoonbaar geen weergave van RegelSpraak.

Zo leest een regel in RegelSpraak. Een strandvondst heeft een vondstwaarde in euro; het bergloon is een kwart daarvan, maar alleen als de vondst is aangemeld.

Three source languages

Every source language translates into the same IR. Their roles differ: the first is the starting point and the current main goal, the other two were chosen to test the IR during its own development.

RegelSpraak, with GegevensSpraak

The controlled natural language, in Dutch, in which the Dutch Tax Administration writes executable law; version 2.3.0. At the Tax Administration the language lives in ALEF (Agile Law Execution Factory), a development environment built on JetBrains MPS and published as open source. There the data model is a language of its own, GegevensSpraak, next to the rule language RegelSpraak and the test language TestSpraak. uchar's grammar follows that division: the declaration part with object types, attributes, characteristics, fact types, parameters, domains and day types is GegevensSpraak, the rule part is RegelSpraak. Inventing a new rule language would have thrown away a rich, specified language proven in production. The whole path from RegelSpraak to Drools lies within uchar itself: the frontend writes the IR document, and the Drools backend loads it and translates it to Drools. The distribution regelspraak-toolchain, successor of regelspraak-java, makes that path usable with a CLI, an HTTP decision service, a container image and a Helm chart; it includes uchar as a git submodule whose commit is the pin, and has no semantics of its own.

Catala

Inria's research language for tax law. Its core construct is a general rule with prioritized exceptions, the form legislation actually takes. Catala was chosen as a complete, mature legal language; that its core is a default calculus later made it the natural second source for the IR's prioritized-defaults node.

F-logic

Frames with class hierarchies and inheritable class-level defaults. F-logic was chosen for exactly that one construct: if the IR's inheritance kernel is also reached from F-logic, it is demonstrably not a rendering of RegelSpraak.

This is what a rule reads like in RegelSpraak. A beach find has a find value in euros; the salvage fee is a quarter of it, but only if the find has been reported.

RegelSpraakregelspraak-toolchain · service/src/test/resources/chain/jutterswet-strandvondsten.rgs
Objecttype de Strandvondst (mv: Strandvondsten)
	de vondstwaarde Numeriek (niet-negatief geheel getal) met eenheid eur;
	het bergloon Numeriek (niet-negatief getal met 2 decimalen) met eenheid eur;
…
Regel bergloon van een strandvondst
	geldig altijd
»		Het bergloon van een Strandvondst moet berekend worden als zijn vondstwaarde maal 0,25
»		indien de Strandvondst aangemeld is.

Wat de talen kunnen uitdrukken, met voorbeelden uit het corpus, staat op de pagina De talen; daar staat ook één regel in vier gedaanten: RegelSpraak, IR, ASP en DRL, met de uitkomst van de referentie-interpreter ernaast.

What the languages can express, with examples from the corpus, is on the page The languages; it also shows one rule in four forms: RegelSpraak, IR, ASP and DRL, with the reference interpreter's outcome alongside.

§ 4uitvoerdersexecutors

Drie uitvoerders, één antwoord

Onder de taille zitten drie onafhankelijke implementaties van dezelfde specificatie. Drools stond als vertrekpunt al vast; de referentie-interpreter en Clingo zijn elk gekozen als test van één manier waarop de IR ongemerkt zijn neutraliteit kan verliezen.

De referentie-interpreter

Een kleine interpreter in OCaml die geen code deelt met de productieruntime. Daardoor is de geschreven semantiek de arbiter, niet de engine. Hij kwam als eerste omdat hij de goedkoopste van deze tests is. Gate 1 controleert mechanisch dat de interpreter en de verifier geen enkel token uit de productieruntime bevatten.

Clingo

Clingo voert Answer Set Programming uit: logisch programmeren met stable-model-semantiek, dat de modellen van een hele regelverzameling berekent in plaats van regels één voor één op feiten te vuren. Het is de semantisch vreemde uitvoerder. Elke Drools-vormige aanname in de IR, zoals agendavolgorde of Java-bean-semantiek, faalt luid in de vertaling naar ASP; de vertaling is daarmee een permanente test. Een vorm die de ASP-codering niet kan uitdrukken, weigert de backend met naam en een code CLINGO-###; gate 6 legt die weigeringen per golden vast. Daarnaast is ASP de moderne vorm van de traditie waaruit het corpus stamt: het British Nationality Act-experiment van 1986, het grondleggende werk over wetgeving als logisch programma.

Drools

De volwassen productie-regelengine op de JVM, overgenomen uit regelspraak-java. De productieruntime bestaat alleen hier: de distributie regelspraak-toolchain bouwt haar beslisservice op deze backend. De backend leest de IR van de draad via een eigen loader en analyseert elke regel één keer. Die analyse leidt af met truth maintenance en heeft twee weergaven: het executable model, waarop de beslisservice draait, en DRL-tekst voor ontwikkeling en vergelijking; gate 12 eist van beide per golden dezelfde uitkomst. Drools speelt het merendeel van de golden cases na; wat de backend niet ondersteunt, weigert de gate bij naam en met opgaaf van reden. Een vorm die niet wordt ondersteund, verdwijnt nooit stilzwijgend; de actuele dekking staat op de pagina Onder de motorkap.

Three executors, one answer

Below the waist sit three independent implementations of the same specification. Drools was the given starting point; the reference interpreter and Clingo were each chosen as a test of one way the IR could silently lose its neutrality.

The reference interpreter

A small interpreter in OCaml that shares no code with the production runtime. That makes the written semantics the arbiter, not the engine. It came first because it is the cheapest of these tests. Gate 1 mechanically checks that the interpreter and the verifier contain no token from the production runtime.

Clingo

Clingo runs Answer Set Programming: logic programming with stable-model semantics, which computes the models of a whole rule set rather than firing rules on facts one by one. It is the semantically alien executor. Any Drools-shaped assumption in the IR, such as agenda ordering or Java bean semantics, fails loudly in the translation to ASP, so the translation is a standing test. A form the ASP encoding cannot express, the backend refuses by name and with a CLINGO-### code; gate 6 records those refusals per golden. ASP is also the modern form of the tradition the corpus descends from: the British Nationality Act experiment of 1986, the founding work on legislation as a logic program.

Drools

The mature production rule engine on the JVM, ported from regelspraak-java. The production runtime exists only here: the distribution regelspraak-toolchain builds its decision service on this backend. The backend reads the IR off the wire through its own loader and analyses every rule once. That analysis derives with truth maintenance and has two renderings: the executable model, on which the decision service runs, and DRL text for development and comparison; gate 12 requires the same outcome of both for every golden. Drools replays most of the golden cases; whatever the backend does not carry, the gate refuses by name and with a reason. A form that is not carried never disappears silently; the current coverage is on the page Under the hood.

uchar IR + case refOCaml ClingoASP-Core-2 DroolsJVM · exec-model ≡ ≡ handgerekend anker hand-computed anchor corpus/golden/anchor
Het differentiaalvierkant: drie onafhankelijke implementaties van dezelfde specificatie moeten elke corpuscase gelijk beantwoorden of de vorm met naam en code weigeren; overeenstemming alleen geldt niet als waarheid, het anker legt absolute waarden vast.
The differential square: three independent implementations of the same specification must answer every corpus case identically or refuse the form by name and code; agreement alone is not accepted as truth, the anchor pins absolute values.

De volgorde was bewust: eerst diversiteit aan backends, dan aan frontends. Een tweede, vreemde backend test de onderkant van de zandloper, de uitvoeringssemantiek; een tweede frontend test alleen de bovenkant, de vertaling naar de IR. Dus: eerst de referentie-interpreter, dan Clingo, daarna pas de extra brontalen.

The order was deliberate: backend diversity before frontend diversity. A second, alien backend tests the bottom of the hourglass, the execution semantics; a second frontend only tests the top, the translation into the IR. So: the reference interpreter first, then Clingo, and only then the additional source languages.

§ 5dekkingcoverage

Wat de IR dekt en hoe dat wordt bewaakt

De IR dekt de kern van RegelSpraak: een objectmodel met enkelvoudige overerving, getypeerde attributen en kenmerken met samengestelde eenheden, dimensies en tijdlijnen, afwezigheidsmarkers (onbekend, niet van toepassing), feittypen en rollen, regels met voorwaarden waaronder kwantoren over gekoppelde instanties (ALLE, GEEN, TEN MINSTE, TEN HOOGSTE, PRECIES n), aggregaties, geprioriteerde defaults, verdeelregels en tijdrekening. Een berekening of voorwaarde zonder eigen tijdsbetekenis geldt op een tijdlijn per dag; waar de RegelSpraak-specificatie over tijd zwijgt, volgt uchar het gedrag van ALEF. Alle fasen van het plan tot en met Catala als frontend zijn afgerond; de laatste, Catala als backend, staat als opportunistisch en mogelijk nooit te boek.

Voordat een wijziging landt, gaat ze lokaal door een vaste set gates die alleen groeit. Een groene deelverzameling is niet groen; een lege invoerset is een fout; tellingen dragen expliciete ondergrenzen, zodat krimp niet ongemerkt passeert. Elke bewering over overeenstemming tussen uitvoerders geldt over het corpus en niet daarbuiten.

De actuele omvang van corpus en specificatie en de lijst gates staan op de pagina Onder de motorkap.

What the IR covers and how that is guarded

The IR covers the RegelSpraak core: an object model with single-supertype inheritance, typed attributes and characteristics with compound units, dimensions and timelines, absence markers (onbekend, niet van toepassing), fact types and roles, rules with conditions including quantifiers over linked instance sets (ALL, NONE, AT LEAST, AT MOST, EXACTLY n), aggregations, prioritized defaults, distribution rules and temporal arithmetic. A computation or condition without a time semantics of its own holds per day on a timeline; where the RegelSpraak specification is silent about time, uchar follows the behaviour of ALEF. All phases of the plan up to and including Catala as a frontend are complete; the last, Catala as a backend, is on record as opportunistic and possibly never.

Before a change lands, it passes locally through a fixed set of gates that only grows. A green subset is not green; an empty input set is a failure; counts carry explicit floors, so shrinkage cannot pass unnoticed. Every claim of agreement between executors holds over the corpus and not beyond it.

The current size of corpus and specification and the list of gates are on the page Under the hood.

§ 7herkomstprovenance

Herkomst en verantwoording

De Jutterswet

Het corpus is gebouwd op de Jutterswet, de Wet op de jutterspenning van het verzonnen eiland Scholde. Eiland, inwoners en wet zijn eigen werk van de maintainer en daarmee rechtenvrij; een testcase die niet gepubliceerd kan worden, is geen testcase voor een publieke specificatie. De wet spiegelt artikel voor artikel het British Nationality Act-experiment van Sergot, Sadri, Kowalski, Kriwaczek, Hammond en Cory (1986), het grondleggende werk over wetgeving als logisch programma. Daardoor kan het corpus worden vergeleken met vier decennia literatuur over logisch programmeren en ASP; dezelfde afstamming bepaalde de keuze voor Clingo. Als toets op realisme bevat het anker één echte regeling: het herlevingspad uit de Werkloosheidswet, handgeschreven met absolute verwachte waarden. Wetstekst is auteursrechtvrij onder artikel 11 van de Auteurswet.

Leibniz, in één alinea

Leibniz' programma had twee delen die vaak door elkaar lopen: de characteristica, de notatie waarin begrippen worden uitgedrukt, en de calculus ratiocinator, het apparaat dat erover rekent. In uchar zijn de brontalen characteristica en de uitvoerders de calculus; de universaliteit zit niet in een oppervlaktetaal maar in de gedeelde kern waarnaar alle talen vertalen. Meer ontleent het project niet aan Leibniz.

Wie en hoe

uchar wordt onderhouden door Yeb Havinga en is sinds 15 augustus 2026 gebouwd in een groot aantal stateloze agent-sessies (Claude Code en verwanten), met één maintainer die de werkkaarten uitzet en de resultaten merget. Sessies laten geen geheugen achter; wat zich ophoopt zijn artefacten: specificatie, verifier, corpus, gates en plan. Dat maakt de repository zelf de toestand van het project.

Literatuur waarop het plan steunt

  • Merigoux, Chataing & Protzenko, "Catala: A Programming Language for the Law", ICFP 2021. Volgens het plan het enige bekende ontwerp dat defeasibiliteit, herleidbaarheid naar wetstekst en meerdere backends uit één formele kern in hetzelfde domein heeft opgelost.
  • Sergot, Sadri, Kowalski, Kriwaczek, Hammond & Cory, "The British Nationality Act as a Logic Program", CACM 29(5), 1986.
  • Kifer, Lausen & Wu, "Logical Foundations of Object-Oriented and Frame-Based Languages", JACM 42(4), 1995 (F-logic).
  • Corsius, Hoppenbrouwers, Lokin, Baars, Sangers-van Cappellen & Wilmont, "RegelSpraak: a CNL for Executable Tax Rules Specification", Seventh International Workshop on Controlled Natural Language (CNL 2020/21). Over RegelSpraak zelf; de taal is gedocumenteerd op regels.overheid.nl.
  • LLVM LangRef en MLIR: het spec-regime en progressieve verlaging via dialecten.
  • Datalog met gestratificeerde negatie en ASP-Core-2: het semantische anker.
  • LegalRuleML (OASIS) en eFLINT: eisenlijsten voor defeasibiliteit, tijdassen en de normatieve laag.
  • DMN/FEEL (OMG), OpenFisca, GHC Core en de WebAssembly-specificatie: leenpunten voor beslistabellen, parameter-vintages, een kleine kern en "spec eerst" met referentie-interpreter.

Provenance and accountability

The Jutterswet

The corpus is built on the Jutterswet, the Beachcombers' Token Act of the fictional island of Scholde. Island, inhabitants and act are the maintainer's own work and therefore free of rights; a test case that cannot be published is not a test case for a public specification. The act mirrors, article by article, the British Nationality Act experiment by Sergot, Sadri, Kowalski, Kriwaczek, Hammond and Cory (1986), the founding work on legislation as a logic program. That gives the corpus four decades of logic-programming and ASP literature to compare against; the same lineage decided the choice of Clingo. As a realism check the anchor contains one real statute: the revival path from the Dutch Unemployment Act, hand-written with absolute expected values. Statute text is free of copyright under article 11 of the Dutch Copyright Act.

Leibniz, in one paragraph

Leibniz's programme had two parts that are often conflated: the characteristica, the notation in which concepts are expressed, and the calculus ratiocinator, the apparatus that computes over them. In uchar the source languages are characteristica and the executors are the calculus; the universality lives not in any surface language but in the shared core they all translate into. The project takes nothing more from Leibniz than that.

Who and how

uchar is maintained by Yeb Havinga and has been built since 15 August 2026 in a large number of stateless agent sessions (Claude Code and kin), with one maintainer who issues the work cards and merges the results. Sessions leave no memory behind; what accumulates is artifacts: specification, verifier, corpus, gates and plan. That makes the repository itself the state of the project.

Literature the plan draws on

  • Merigoux, Chataing & Protzenko, "Catala: A Programming Language for the Law", ICFP 2021. According to the plan the only known design that has solved defeasibility, traceability to statute text and multiple backends from one formal core in the same domain.
  • Sergot, Sadri, Kowalski, Kriwaczek, Hammond & Cory, "The British Nationality Act as a Logic Program", CACM 29(5), 1986.
  • Kifer, Lausen & Wu, "Logical Foundations of Object-Oriented and Frame-Based Languages", JACM 42(4), 1995 (F-logic).
  • Corsius, Hoppenbrouwers, Lokin, Baars, Sangers-van Cappellen & Wilmont, "RegelSpraak: a CNL for Executable Tax Rules Specification", Seventh International Workshop on Controlled Natural Language (CNL 2020/21). On RegelSpraak itself; the language is documented at regels.overheid.nl.
  • LLVM LangRef and MLIR: the spec regime and progressive lowering through dialects.
  • Datalog with stratified negation and ASP-Core-2: the semantic anchor.
  • LegalRuleML (OASIS) and eFLINT: requirement lists for defeasibility, time axes and the normative layer.
  • DMN/FEEL (OMG), OpenFisca, GHC Core and the WebAssembly specification: sources for decision tables, parameter vintages, a small kernel and "spec first" with a reference interpreter.
§ 8licentielicense

Licentie

De code, dat wil zeggen de verifier, de JSON-schema's, de referentie-interpreter, de backends, de frontends en de gate-scripts, valt onder de Apache License 2.0. De specificatietekst en het corpus, met de Jutterswet, de RegelSpraak-bronnen en hun IR en casusdata, vallen onder Creative Commons Attribution 4.0.

De map toka/, de pariteitszone, valt onder geen van beide licenties. Zij bevat de TOKA-casus ("Treinen Op Korte Afstand", een verzonnen wet uit de ALEF-cursus van de Belastingdienst), Bijlage 1 van de RegelSpraak-specificatie v2.3.0, met als rechtenvermelding van de bron "© 2025 Belastingdienst / Alle rechten voorbehouden". De Belastingdienst liet de maintainer op 13 oktober 2026 weten dat TOKA bedoeld is om vrij te geven, waarschijnlijk onder EUPL-1.2, zoals ALEF; een schriftelijke bevestiging is nog niet ontvangen. Herkomst en status staan in toka/README.md.

License

The code, that is the verifier, the JSON schemas, the reference interpreter, the backends, the frontends and the gate scripts, is licensed under the Apache License 2.0. The specification text and the corpus, including the Jutterswet, the RegelSpraak sources and their IR and case data, are licensed under Creative Commons Attribution 4.0.

The directory toka/, the parity zone, falls under neither license. It holds the TOKA casus ("Treinen Op Korte Afstand", a fictitious act from the Dutch Tax Administration's ALEF course), Appendix 1 of the RegelSpraak specification v2.3.0, whose source carries the rights notice "© 2025 Belastingdienst / Alle rechten voorbehouden". The Tax Administration told the maintainer on 13 October 2026 that TOKA is meant to be releasable, probably under EUPL-1.2, like ALEF; written confirmation has not yet been received. Provenance and status are in toka/README.md.