RFC-051: What a Cell Records Without a Submission

DraftImplemented
Depends on

Context

Until now a cell recorded two things: a submission, and the decision on one (RFC-046, RFC-047). Art. 11, onder f, of the Leerplichtwet 1969 needs more. The leave asked under art. 13a must fall “buiten de schoolvakanties”. Up to this RFC the head judged that per application (decided_per_case_by). Which days are school holidays is no judgement, though. It follows from three things:

  • the Regeling vaststelling schoolvakanties 2025–2030 (BWBR0049811), made under art. 15, second lid, of the Wet op het primair onderwijs. It fixes the Christmas and May holidays for every school (art. 5), and the summer holiday per region (art. 6). The region follows from the school’s place of establishment (art. 2 and 3);
  • where the school is established, which is a fact about the school;
  • the autumn and spring holidays, which the school fixes itself.

None of these is a submission. Nobody applies for the place where a school is established, and the school sets its own holidays as a rule, the way a school guide does. This RFC adds the recording that was missing, the executogram, and lets a reduction read it next to the law and the school’s policy.

Decision

  1. An executogram. Cell::record_executogram(service, stream, supplied, on) records a fact of a stream the cell keeps. No regulation runs for it. The chronolexogram has kind: EXECUTOGRAM, the stream’s $id under stream, and the stream’s ground as grondslag.
  2. A stream is declared with the cell. corpus/cells/<cell>/executogrammen/<id>.yaml names the stream ($id), the article on whose ground the fact is recorded (grondslag) and the fields, with their types. The cell reads its streams when it opens.
  3. A reduction reads a stream. source: {executograms: <stream>} (schema v0.8.6) gives one row per executogram of the stream.
  4. The school’s own holidays are policy. The school’s fictitious policy holds its autumn and spring holidays as outputs, with one version per school year from 1 August (valid_from). The holiday reduction reads them through source.regulation, as it reads the regeling.
  5. combine: ONLY (schema v0.8.6) gives the one result a FOREACH filter leaves: null when it leaves none, an error when it leaves more than one. A reduction picks the record in force on a day with it.
  6. The cell answers inside its own reductions. When a reduction calls rulework that reads an open term the cell answers, the cell answers it there too. A reduction asked there takes a parameter it declares from the article that asks it, or else from the nearest question around it, such as the leave days of art. 13a.
  7. The region is that of the leave days. The school’s vestiging, and so its region, is the one in force on the first and the last leave day. When the school moves within the leave, the decision fails.

Recording an executogram names no Awb article, and records nothing when a value is malformed.

1. An executogram and its stream

# corpus/cells/obs_de_klimop/executogrammen/vestiging.yaml $id: vestiging grondslag: regeling_vaststelling_schoolvakanties_20252030#2 fields: - {name: gemeente, type: string} - {name: provincie, type: string, nullable: true} - {name: deel_van_gemeente, type: string, nullable: true} - {name: sinds, type: date}

A field is a string, a number, a boolean or a date, and none is named id: the row gives the executogram’s id under that name. The cell refuses an unknown key, a file not named after the $id, and any other entry in executogrammen/ that is not hidden. When it opens, it refuses a reduction that reads a stream it does not keep, and an executogram in its chronicle of such a stream. When it records, it refuses a ground that has no version in force that day, a name the stream does not declare, a value of the wrong type, and a field that cannot be absent and is left out. No law speaks of an incomplete executogram (Awb 4:5 speaks of an application), so the cell records one whole or not at all.

The stream is no rulework and has no $schema. just validate therefore checks only the reductions of a cell (corpus/cells/*/reducties), and the cell checks its streams itself.

Who records stays apart from what is recorded. The school is the cell (recording_actor). Its place is a fact on a time axis: “vestiging op Utrecht sinds 1 augustus 2020”. A move is a new executogram, and the earlier one stays.

2. The school holidays of vakantieverlof

PartWhat it does
Regeling art. 2Declares the place of establishment as three open terms (gemeente_van_vestiging, provincie_van_vestiging, deel_van_gemeente_van_vestiging) and gives regio_van_school.
Regeling art. 3Gives the region of a municipality: all provinces, and every municipality, former municipality and kern the article names.
Regeling art. 5 and 6Give the Christmas and May holidays of a school year, and the summer holiday of a year and a region.
School policy (fictitious)fictief_beleid_vakantierooster_obs_de_klimop: the school’s autumn and spring holidays per school year. The version of 1 August 2026 holds those of 2026–2027 and nothing for another year.
Stream vestigingWhere the school is established, since a day.
reductie_plaats_van_vestigingFills the three terms of art. 2 from the executogram in force on the first and the last leave day: the one with the latest sinds on or before that day. Two executograms, because the school moves within the leave, are refused (combine: ONLY).
reductie_verlof_valt_buiten_schoolvakantiesFills verlof_valt_buiten_schoolvakanties of art. 13a. It asks the regeling for the region and its periods, and the school’s policy for the autumn and spring holidays of the school year of the first leave day. It then says whether a leave day falls in one of the six holidays.

The term of art. 13a is unchanged: required, decided_per_case_by the head, no default. In the school’s cell the reduction answers it, so leave asked during a school holiday is refused without anyone judging it. When the cell does not know a holiday (the regeling fixes none for the region or the year, or the school’s policy in force does not hold the school year), its answer is null. The head decides the term per case, so the engine takes a null answer as silence (RFC-048), and the head judges then. Without a finding the decision fails.

Where each choice comes from

ChoiceSource
The Christmas, May and summer holidays, and the region from the place of establishmentThe law: the regeling, art. 2, 3, 5 and 6, under WPO art. 15 lid 2
The autumn and spring holidays are the school’s own policyOwn choice. No article grants the bevoegd gezag this power in so many words. WMS art. 11 lid 1 onder l presumes it: the MR may advise on “elk door het bevoegd gezag te nemen besluit” on the “regeling van de vakantie”. That is advice, not consent, and it is not modeled
The holidays are policy, not a decision in the chronicleOwner’s decision (19 October 2026). They are a rule of the school, as in a school guide, not an event in a process
One version of the policy per school yearOwn choice, after that decision: a school year gets its version from 1 August (valid_from)
The place of establishment is an executogramOwner’s decision (18 October 2026). The paper defines an executogram as “de vastlegging van daadwerkelijke levering of afhandeling” of a zaak or dienst. A place of establishment fits that loosely; the paper calls its three types a first enumeration
Streams live in the cell’s directoryOwn choice. RFC-022 §1.3 put them in a top-level chronicles/. Reductions already live with the cell (RFC-048), and a stream is read only by them
The region on the leave days, not on the day of the decisionOwner’s decision (18 October 2026): what counts is whether the leave falls in the school’s holidays
A move within the leave fails the decision, rather than judging each dayOwn choice. The regeling gives a school one region (art. 2), so a leave in two regions has no answer in it. Judging each day would need the regeling per leave day, which a reduction cannot call per element
The leave days reach the reduction for the vestiging from the question around itOwn choice. Art. 2 of the regeling names no day; the cell passes on what art. 13a asked
The school year of the leave is that of the first leave dayOwn choice, as in RFC-048 §2
Leave that has one day in a holiday does not fall outside the school holidaysOwn choice: art. 11, onder f, says “slechts buiten de schoolvakanties” and does not split a request
Gemeente, provincie and deel as three open terms of art. 2Own choice. Art. 3 divides by province and municipality, and for four municipalities by a former municipality or a kern
The open bodies of Caribisch Nederland in the term for the municipalityOwn choice
A municipality that art. 3 does not name is in no regionThe law. West Betuwe (formed in 2019) is not named; art. 4 covers mergers after publication only
Art. 6 keyed by calendar yearThe law: “voor de jaren 2026, 2027, 2028, 2029 en 2030”
A null answer leaves the term to the headRFC-048 and the engine: a null answer is silent where the term has a default or is decided per case

Why

Benefits

  • Leave in a school holiday is refused from what the school recorded and from the law. The trace of the decision shows one node, “answered by obs_de_klimop”, and Cell::explain_answer gives the reasoning, down to the place of establishment.
  • The recording path is generic. A municipality that records where a person lives uses the same call.
  • A move changes the region from its day, and the chronicle keeps both places.
  • The engine stays unaware of cells. It gained one source key and one way to combine.

Tradeoffs

  • The reduction for the vestiging needs the leave days. Asked outside a question that has them, it gives no vestiging, so art. 2 gives no region.
  • Leave during which the school moves cannot be decided in the cell. The head cannot decide it either, because the cell’s error ends the decision.
  • A reduction whose rulework asks its own answer again is refused (CircularReference), so a cycle fails the decision instead of running without end. The guard refuses any nested ask of the same term, also for another day or other parameters.
  • A stream is a second kind of file in a cell, with no JSON schema of its own. The cell’s own parser is its only check, when it records and when it opens the chronicle.
  • The engine picks the version of the school’s policy by the day of the decision, not by the leave days. Leave in the next school year, decided before 1 August, meets the current version, which does not hold that year, so the head judges.
  • The regeling is modeled for one establishment per school. A school with establishments in several regions (art. 2, third sentence) is not.
  • Art. 7 of the regeling is not modeled: the extension of the summer holiday by up to two days by the bevoegd gezag (lid 1), the other deviations (lid 2 to 5), and the five weeks of the Wadden islands (lid 6). Neither are the exemption by the minister (art. 8) or free days that are no holiday.
  • The question to the cell runs in its own execution. A failure inside it, such as two establishments since the same day, surfaces as an error of the cell, not of art. 13a.

Alternatives Considered

  • The vestiging as a field of the cell’s identity. Rejected: identity and place are different facts, and a place changes over time.
  • The holidays as a decision taken ex officio. An earlier draft of this RFC added Cell::decide_ex_officio, which recorded the school’s fixing of its holidays as a decretogram without a submission. The owner dropped it (19 October 2026). The rooster existed only as fictitious policy, so recording it ex officio proved nothing the executogram does not already show.
  • Streams in a top-level chronicles/, as RFC-022 §1.3 has it. Not taken here, see the table above.
  • Indexing an array ($rij.0) instead of combine: ONLY. The engine supports the index, the schema does not. An index takes the first of two records silently, while ONLY refuses two.

Implementation

  • Schema v0.8.6: source.executograms, only in a REDUCTIE and alone in its source; combine: ONLY.
  • Engine: Source::executograms and CombineOp::Only in law-model; load_check::chronicle_read for both chronicle sources; combine_only in operations.rs; the type checker and the unit inference take the body’s type and unit.
  • packages/cel: stream.rs (Stream, loading executogrammen/), Gram::stream, Cell::record_executogram, Cell::streams, reading::executogram_rows, reading::refuse_unknown_streams; the Reader answers inside its own reductions.
  • Corpus: the regeling with art. 2, 3, 5 and 6 executable and BDD scenarios; the school’s fictitious holiday policy, with the holidays of 2026–2027; two outputs added to the school-year policy (eerste_jaar_schooljaar, laatste_jaar_schooljaar); the stream and the two reductions of OBS De Klimop.
  • Corpus: a selection from the Wet op het primair onderwijs, text only, as harvested. It holds art. 15, the regeling’s legal_basis, and art. 1, 8, 9 and 10, which the Leerplichtwet 1969 and the regeling cite in their text.
  • Tests: packages/cel/tests/schoolvakanties.rs (Christmas, region, the school’s own autumn holiday, a move) and packages/cel/tests/executograms.rs (recording and reading back an executogram, and a reduction that asks its own answer).
  • The PoC app (packages/poc-chronolexografie, see the PoC portal) records the school’s vestiging whenever the cell of the vakantieverlof case starts, from begin in its case file, through Cell::record_executogram, dated 1 August 2026. Its form no longer asks the head whether the leave falls outside the school holidays. A seventh scenario plays leave in the Christmas holiday, refused without a judgement of the head; kern.rs plays it through the app’s functions.

Open questions

  • Another cell answers where the school is. DUO keeps the register of institutions (RIO). A DUO cell could answer the place of establishment instead of the school’s own executogram. That needs more than one answerer in an execution, and a choice of which one answers a term. Not built.
  • Does the vocabulary of reductions belong in the law format? Since RFC-048 the schema has gained REDUCTIE and source.decisions, then implements on a reduction (v0.8.5), and now source.executograms and combine: ONLY on a FOREACH (v0.8.6). These are constructs for a cell, not for law. They could move to an extension instead: a schema or profile of its own for reductions, or an extension namespace, so that the law format stays about law. Not decided (Tim, 19 October 2026).
  • A stream of more than one cell. RFC-022 §1.3 has a stream name the chronicle it joins. Here a stream belongs to one cell.

References

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