Open Questions in Chronolexography

The choices in the chronolexography implementation that are still open, and the parts that need investigation or a large change.

This page lists what is still open in chronolexography, one row per question. The RFCs link here instead of keeping their own lists. When a question is settled, its row goes.

A question is listed when:

  • a choice is still to be made;
  • it needs investigation first;
  • it needs a large refactor or a breaking change to the schema.

Missing functionality that only needs building is not listed. It gets built when a case needs it. A limitation of the proof of concept is not listed either, unless it affects how chronolexography works.

Open questions kept elsewhere:

The impact column says how far an answer reaches:

  • Foundational: the answer decides whether chronolexography works between real organizations and with real registers.
  • High: the question touches every new case, or it needs a breaking schema change or a large refactor.
  • Medium: it limits a case, or needs a small change to the engine or the schema.
  • Low: a local choice, or a matter of documentation.
QuestionWhy openImpactRFC
REDUCTIE, source.decisions, source.facts and combine: ONLY exist for the cell, not for the law. Should they leave the law format and move to a profile of their own? Today only cel.yaml says which answers a cell gives. A profile would also settle whether picking one record needs its own operations beside combine: ONLY, such as taking the latest record (LATEST) or the first that matches (FIND).Choice; breaking schema changeHigh048
A cell can receive a copy of another cell’s decision. It keeps the decision value as it came in. It cannot check that value against the other cell’s chronicle, so it trusts the copy, as a court trusts the documents a party submits. Should a receiving cell be able to check a copy at its source?Choice; investigationFoundational053
A chronolexogram (an entry in the chronicle) has one date, recorded_on. The cell uses it as the day of receipt (Awb 4:13, 6:9) and as the day a decision is made known (Awb 6:8). Another cell may record something late, or give it an earlier date. That changes what a replay of a decision sees. Does a chronolexogram need a second date for the moment that counts in law?Choice; breaking change to the chronicleFoundational046, 048
To explain a decision, the cell takes it again on its original day (a replay). That assumes every source can say what it knew on a given day. A source that keeps only its current state needs a facade that stores each value with its date. How that works for real registers needs investigation.InvestigationFoundational046
Who fixes the name of an answer? A binding asks a cell for an answer by name, and the cell’s catalogue has to give the answer under that name. Who sets the name, and how it is versioned, is open. The position paper names Consumer Driven Contracts as a research question here.Choice; investigationMedium048
A reduction is rulework that reads the cell’s chronicle and gives a named answer. Some reductions read no chronicle themselves and only ask for another answer of the same cell. Should such a reduction be policy of the authority whose cell keeps it instead?ChoiceLow048
The engine asks the cell that a term names wherever the policy that binds the term runs. RFC-052 asked it only when another law reached the term through source.regulation. Should the engine route by competence everywhere, or only where another law reads the term?ChoiceLow048
The engine builds the parameters of a binding before it asks a cell. If the binding cannot fill a parameter, the decision fails as soon as there is a cell to ask, even a cell that turns out not to give the answer. Should a missing parameter make the binding silent instead?ChoiceMedium048
Which instance does the law mean? The law names a category, and the engine asks the cell of that category in the call. The cell does not pass its own identity to the law. So the engine does not find a policy scoped by gemeente_code, and cannot check competence by place of residence. See also #1029.ChoiceHigh048
A term that reads a fact repeats the list of authorities competent for that fact, and the two lists can drift apart. To derive the term’s list from the fact, the engine would need to know which fact a term reads. Should it?ChoiceLow051
The cell takes the inputs of a decision only from the deciding article. A finding that the law places in another regulation must therefore sit on the deciding article and be passed on as a parameter. The rulework then departs from the law.Large refactorHigh046
When a policy fills an open term, the policy’s value counts. So the authority cannot depart from the policy in a single case, although Awb 4:84 allows that. A policy can let the authority judge certain cases itself, with an open term of its own, but only the cases the policy describes. How should the authority record a departure that the policy does not foresee?ChoiceHigh045, 048
The engine sees a cell as a black box. So Cell::explain_answer replays the decision and runs the reduction again, with tracing. If a cell could return a trace with its answer, the engine could nest that trace under the answer. The whole chain would then be one trace: the law, the policy binding, the reduction and the decisions it counted. explain_answer could then go.Choice; small engine API changeMedium048
The version history says what each version adds to the schema. It does not say what changed in the engine and the cell at the same time, although a rulework author notices those changes too. Nothing checks that the newest version has a row. Should each version get release notes, split into schema and behavior, with a CI check, filled in back to v0.8.0?ChoiceLownone
A reduction filters rows with a FOREACH, once per question. A filter on a source would let a reduction ask only for the rows it needs, for example a where on an input, or a lambda passed to a reduction it calls. The reduction of the Awb would then not have to return every row that holds. For a later change.ChoiceLow048
The Awb does not provide for an applicant to withdraw an application before the decision; only case law recognizes that. Nor does it provide for withdrawing a favorable decision at the holder’s request, except for subsidies (Awb 4:48–4:50). Article 6:21 is about withdrawing an objection or appeal, not an application. The reduction of the Awb therefore cannot leave out a decision that was withdrawn on request, such as granted leave that the holder wants moved to other days. We do not fill this in with a rule of our own.Not in the law; left open on purposeMedium048
One question to several cells of a category. The law names a category, such as the college of any municipality, and more than one cell of it may hold the answer. How that works in practice, and which cell is asked, is open. Until then the engine asks one cell and merges no answers. If the call holds more than one cell that the term names, the decision fails.Choice; investigationMedium048
A reduction is no regulation, yet the reduction of the Awb holds rules that come from the Awb. A decision that is revoked on objection (Awb 7:11) or annulled by the court (Awb 8:72) no longer holds. That content belongs in the law. The Awb never says in so many words that a decision no longer holds. It follows from revocation (7:11, second paragraph) and from annulment (8:72, first paragraph), so there is no article to ask it of directly. Three directions are open. First, the Awb could give the answer per decision, as a derived output of 7:11 and 8:72 without legal_basis. The reduction would then only collect decisions from the chronicle and ask the Awb for each one whether it still holds. The law then decides, and the reduction fetches. Second, a reduction could fill an open term “does this decision still hold?”. That leaves the Awb logic in the reduction. Third, the reduction stays as it is and the departure is recorded. No choice has been made. The first direction keeps law and reduction apart most cleanly.ChoiceHigh048, 053
Article 2, first paragraph, of the Regeling gehandicaptenparkeerkaart issues no card without a medical examination, and article 3, first paragraph, has the GGD or an expert the municipality appoints carry it out. As the law reads, the college asks the GGD for the examination and the GGD then carries it out; Awb 3:2, under which the authority gathers the knowledge it needs about the facts, supports that reading. The PoC does not model the request: the GGD records its advice without one from the municipality, and the advice also proves the examination. A possible next step records the request in the municipality’s chronicle, after which the GGD records its advice on that request and refers to it. No choice has been made.ChoiceLow051, 052
The engine no longer reads from decided_per_case_by who decides. RFC-031 describes the field as the name of the authority that judges the norm in each case. The proposal is that the field only marks that the norm is judged per case. The term’s competent_authority then says who judges. Without one, the authority that carries out the article judges (Competent Authority). This still has to be aligned with RFC-031.ChoiceLow031, 048
From the law and the policy, the engine derives which open terms a decision may need and who answers each one (decision_terms). The cell adds the parameters from the application and the date of the decision. The process decides when and how it asks the authority. Should the engine also say which of a policy’s own open terms a case needs, without running the decision?ChoiceMedium048
A reduction, or the policy it calls, can pick one record with combine: ONLY. It fails when two records qualify. A correction recorded on the same day then blocks the decision, and the chronicle cannot undo it, because entries are never removed. Should a later record replace an earlier one?ChoiceFoundational048
The fictitious parking ordinance of Wilgendaal lets the college revoke a business parking permit, at the holder’s request or when the company no longer works in the area (article 5, after article 6 of the Delft model). Revocation is a decision the authority takes without an application, and the cell takes decisions only on an application or an objection. The reduction of the Awb reads only a decision reversed on objection (7:11, herroeping) and one annulled by the court (8:72), and the Awb has no general article on revoking a decision, so a revoked permit would still count. The same holds for a company that moves out of an area: its permits count until they expire. Where does it belong that a revoked decision no longer holds: in the ordinance that grants the power, read by the municipality’s own reduction, or in a general rule beside the Awb?ChoiceHigh048, 050
The Kamer van Koophandel records its registrations as a fact of a fictitious policy of its own, not of the Handelsregisterwet 2007. That law is not in the regelrecht corpus: the NAPP source holds it with executable articles of that case, and a version under the same $id here would shadow the source’s. The number of people working in a company is not in the law either; an order in council may add it to the register (article 17, first paragraph, under a), and that order, the Handelsregisterbesluit 2008, is not in the corpus. Should the Handelsregisterwet move into the central corpus, with the facts the Chamber records as requires on its own articles?Choice; investigationMedium051
Only policy may bind an open term to a cell’s answer (source.reduction in UITVOERINGSBELEID). The implementing decision of Delft that the Wilgendaal case follows lays down further rules under the ordinance, so as a legal instrument it is not policy. The schema has no layer for further rules of the college, so the Wilgendaal version is a GEMEENTELIJKE_VERORDENING, and a separate fictitious policy of the college binds its terms to the answers of the cells. The implementing decision carries a gemeente_code, as the ordinance does; the policy carries none. A cell passes no code to the engine, so the engine lets a rulework of the same municipality fill the terms of the ordinance whatever the scope. Should further rules get a layer of their own, and should the scope come from the cell?Choice; schema changeMedium048
The Delft model also caps the number of permits per area across all companies, with a waiting list and priorities, and lots among equal applications (articles 5 and 6 of its implementing decision). The Wilgendaal case leaves that out and caps permits per company only. A cap across applicants makes one decision depend on the applications of others, and on their order, which a replay has to reproduce; drawing lots does not replay at all. How a cell decides on a cap shared by several applicants is open.Choice; investigationMedium048
A decision can rest on a finding of a person instead of a calculation. The fictitious parking ordinance of Wilgendaal has a hardship clause (article 6, after article 13 of the Parkeerverordening Deventer 2026). Under it, the college decides per case whether the maximum leads to unacceptable consequences. The engine asks for that finding only for a company at the maximum. The cell records the finding among the fields of the decision, as a given beside what the Kamer van Koophandel answered. The chronicle does not record why the college decided so. The grounds of the objection stay in the objection, and the weighing itself is recorded nowhere. Yet Awb 3:46, and on objection 7:12, requires the decision to rest on sound reasons. A replay of the decision takes the recorded finding. Without it the engine refuses, because the term is required and nothing fills it. Should the chronicle keep the reasons with the finding? And should a replay under a changed rule reuse the finding or ask for it again?Choice; investigationHigh046, 050
Could the college depart from the maximum without a hardship clause? Without one, the refusal on the maximum is a bound power in a regulation below formal law. ABRvS 2 February 2022, ECLI:NL:RVS:2022:285 (Harderwijk), gives the test of proportionality under Awb 3:4, second paragraph, for decisions with discretion. It leaves bound powers open (considerations 7.1 and 7.2), so the answer does not follow from it. If the college can, a cell needs a way to record a departure from a bound power that no open term foresees, as the row on Awb 4:84 asks for a policy.Choice; investigationMedium045, 050
Scenarios get the data a law reads from outside through the DataSourceRegistry. The caller registers rows, and the engine finds a value by the name of the input and the parameters of the article. The demo builds those rows from corpus/demo/bindings.yaml, which also says per input whether a missing row means unknown, null or zero (RFC-036). Should a scenario build a chronicle instead, with a fixture cell that gives the answers the test needs? The engine would then fetch outside data in one way only, by asking a cell, and the registry and the bindings could go. Today a plain law input cannot ask a cell at all: only policy binds a term to an answer. Which cell answers such an input, and under what name, is open; names of inputs clash between laws. A fixture cell can also answer what no real cell gives. Its answers would have to be checked against the catalogue in cel.yaml of the cell it stands in for, and each real cell still needs scenarios that run through its chronicle and its reduction.Choice; large refactorHigh048
A source on an input is an object of ten optional keys, and the key that is present says what kind of source it is. A series of dependencies rules in the schema forbids the combinations that make no sense; the Source struct of the law model holds only Options. Four kinds came with chronolexography: decisions, article, facts and reduction. Each had to fit beside the keys already there, which is where most of the exclusion rules come from. Two forms do not say what they are. source: {} is a value the caller supplies (see the row above), and {output: x} without regulation is an output of another article of the same law. Should source get a required kind, as in source: {kind: reduction, ref: aantal_geldige_bedrijfsparkeervergunningen, parameters: {kvk_nummer: $kvk_nummer}}? The kinds would be data, regulation (without ref for the law itself), article, reduction, decisions and facts. In the law model a tagged enum would then make an invalid combination impossible to write. Whether decisions and facts become one kind is open as well: both serve only a REDUCTIE and both read the chronicle. The change breaks every rulework, about 1,090 sources in some 170 files in this repository, and corpus repositories elsewhere have to migrate with it.Choice; breaking schema changeHigh048
Awb 4:2, first paragraph, under c, requires an application to indicate the decision it asks for. The requests on the article that establishes the application names that decision, yet the PoC still asks for it as a parameter of 4:2. The starting point is that the engine fills the parameter from requests itself. Where no article names requests, as for an application made directly under the Awb, the applicant fills it in. How the Awb rulework links the parameter to requests is open. First, a new element like produces.moment names the parameter; the cell then fills it, not the engine. Second, the parameter becomes an input whose source points to that requests. The engine resolves that source, and the input cannot fall back to what the applicant enters. Third, a context variable such as referencedate adds a name to the law format that no rulework declares.Choice; schema changeMedium045

Next steps

In order of impact, as of 27 October 2026. Step 6 is a cleanup and comes earlier than its impact suggests, because it stops more cases from copying a pattern. A question that waits for a case to need it comes last.

  1. Time and corrections in the chronicle: a second date for the moment that counts in law, and whether a later record replaces an earlier one. One design covers both, since both decide what a replay sees. It needs investigation first and then an RFC.
  2. A source that keeps only its current state. Try a facade on one real register before more cases assume one.
  3. Checking a received copy at its source.
  4. A policy that fills an open term is final. policy_first and the fallback to a finding are removed; a departure in a single case is the Awb 4:84 question. Working out what is asked of whom moves out of the cell. In progress; it changes RFC-048 §2.
  5. Decisions without an application, such as a revocation, and inputs that belong in a regulation other than the deciding article. Both widen what a cell can decide, and every case after the PoC needs them.
  6. Move the Awb rules out of the reduction and into the Awb.

After that: one trace for a decision and the cell’s answer, release notes for the schema, and building out the NAPP case. The Awb questions on 4:1 with 4:5 and on the motivation requirements belong there too (open questions of the Awb procedure). Later: one question to several cells of a category, and a profile of its own for what serves a cell.

RegelRecht

An exploration into transparent, executable legislation, and one of the three projects in the starting selection of the Nederlandse Digitale Dienst.

Links

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

Contact

regelrecht@minbzk.nl

Part of

Nederlandse Digitale Dienst
Ministry of Economic Affairs and Climate Policy