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:
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:
| Question | Why open | Impact | RFC |
|---|---|---|---|
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 change | High | 048 |
| 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; investigation | Foundational | 053 |
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 chronicle | Foundational | 046, 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. | Investigation | Foundational | 046 |
| 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; investigation | Medium | 048 |
| 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? | Choice | Low | 048 |
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? | Choice | Low | 048 |
| 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? | Choice | Medium | 048 |
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. | Choice | High | 048 |
| 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? | Choice | Low | 051 |
| 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 refactor | High | 046 |
| 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? | Choice | High | 045, 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 change | Medium | 048 |
| 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? | Choice | Low | none |
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. | Choice | Low | 048 |
| 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 purpose | Medium | 048 |
| 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; investigation | Medium | 048 |
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. | Choice | High | 048, 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. | Choice | Low | 051, 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. | Choice | Low | 031, 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? | Choice | Medium | 048 |
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? | Choice | Foundational | 048 |
| 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? | Choice | High | 048, 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; investigation | Medium | 051 |
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 change | Medium | 048 |
| 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; investigation | Medium | 048 |
| 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; investigation | High | 046, 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; investigation | Medium | 045, 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 refactor | High | 048 |
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 change | High | 048 |
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 change | Medium | 045 |
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.
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.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.
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