How RegelRecht records legal facts as dated entries in the chronicle of the organization that establishes them, and answers later questions from that chronicle.
A cell is an organization that records each legal fact it establishes as a dated entry, a chronolexogram, in its own chronicle (kroniek). The cell answers later questions from that chronicle. The vocabulary comes from the Chronolexografie position paper and RFC-022.
This page shows how RegelRecht implements it. The design is in RFC-046 and RFC-048; what is still open is in Open Points in Chronolexography.
Recording is an optional layer (RFC-046). The procedure a cell plays is modeled in the law itself (Applications, Decisions and Objections).
| Part | Role | Where |
|---|---|---|
| Cell | Keeps its chronicle; records and decides through the engine | corpus/cells/<cell>/, packages/cel |
| Reduction | Gives a named answer from the chronicle | corpus/regulation/nl/reducties/ |
| Policy | Binds an open term of the law to a cell’s answer | corpus/regulation/nl/uitvoeringsbeleid/ |
| Engine | Executes the law, asks the cells, combines their answers. Stores nothing | packages/engine |
A cell is a directory with cel.yaml. Cell::open opens it with its chronicle on file, Cell::in_memory with an empty chronicle.
The law names a role (Competent Authority). The engine matches an INSTANCE to name and a CATEGORY to category. answers is the cell’s catalogue: which answers it gives, and from which reduction. It holds no logic, and nothing else about a cell is configured.
| Kind | Recorded by | Fields come from |
|---|---|---|
Submission (AANVRAAG, BEZWAAR) | Cell::record_submission | The article’s submission item and the hooks on it |
Decision (BESCHIKKING) | Cell::decide | The deciding article’s inputs, findings included |
Executogram (EXECUTOGRAM) | Cell::record_executogram | A fact an article requires (RFC-051) |
A chronolexogram repeats nothing the law says. The law in force on recorded_on gives each field’s sources and basis; a replay shows which fields held a finding. The chronicle is append-only, in date order.
Cell::record_submission runs the establishing article at the stage named after the submission’s kind, so the hooks on it run. A missing required field goes under missing: an incomplete application is still one (Awb 4:5). The moment the law counts from is the day of recording. A submission may refer to a decision (refers_to), as an objection does.Cell::decide takes the id of a submission in the chronicle that requests this decision, and runs the later stages. Findings travel apart from the parameters. Each non-null output of type decision, such as a new decision on objection, becomes its own chronolexogram in the same append.Cell::record_executogram records a fact whole or not at all. The fact refers to nothing. A change is a new executogram; the old one stays.The cell’s code names no article of any law; everything it checks comes from the law. It refuses:
moment supplied by the submitter;id (rows use id for the executogram itself);competent_authority does not name the cell.The engine refuses a finding that no article in the decision asks for, or one of the wrong type.
A reduction gives a named answer from what the cell recorded earlier, such as “was this permit granted before?”. It is the only rulework that reads a chronicle.
The law does not ask the cell. The policy of the authority that decides binds the open term to the answer:
packages/cel uses what the engine offers: rulework of its own kind (REDUCTIE) in the corpus, under the holder it names. It reads decisions (source.decisions) or facts (source.facts), and may call policy for a norm.decided_per_case_by is silence, and the term falls back; on any other term null is the value.source.decisions and source.facts outside a REDUCTIE, and source.reduction outside such a binding.A decision may take other cells along: its sphere. When a binding fills an open term with competent_authority, the engine asks every competent cell of the call, the deciding cell and its sphere, for the answer and merges their answers with the term’s combine, or else the binding’s (Competent Authority). A cell without that answer in its catalogue is silent. Without competence on the term, the engine asks the cell of the policy’s holder. This is the paper’s synthesis. It happens in the asking process, and each cell reduces only its own chronicle.
The cell stores no reasons. It replays.
Cell::explain retakes the decision on its own day, with the law and chronicle of that moment. It fails if the outcome differs.Cell::findings reads from the replay which findings counted.Cell::explain_answer reruns a reduction to show its reasoning. In the decision’s trace the answer is one step.cargo test --manifest-path packages/cel/Cargo.toml runs the cases in corpus/cells/.An exploration into transparent, executable legislation, and one of the three projects in the starting selection of the Nederlandse Digitale Dienst.
GitHub repository
How it works
Stay informed
Roadmap (Dutch)
Documentation
Research
Nederlandse Digitale Dienst
Ministry of Economic Affairs and Climate Policy