StikstofNu · Onderzoek · Dit onderzoeksrapport is in het Engels.

Work in progress. This paper is a working draft under review. It may change, and its findings are not final.

Werk in uitvoering. Dit paper is een werkversie die nog wordt beoordeeld. Het kan nog veranderen en de bevindingen zijn niet definitief. Nederlandse versie volgt.

Paper C. A partly hash-registered analysis plan for tests on small housing projects and nitrogen: hypotheses, test methods, decision rules and falsification criteria

Version 10 (working draft), published . By StikstofNu.

SHA-256 checksum of the source paper of this edition: cc0bbe3bf8dcc692ecc4271589601230a5944c7f5e0f98927810f35ae064a8e8

Work in progress (web edition of 30 October 2026). This is a working draft under review, published here so that it can be read and checked. It may change, and its findings are not final. It is version 10 of StikstofNu research paper C. The English text is the only edition; a Dutch edition follows (Nederlandse versie volgt). Where the draft says it is not published, that describes it before this web edition.

What differs from the draft. References to files of the research materials are shortened to the file or folder name; those materials are not published. Nothing else is changed except what the change list of this edition names. Corrections and questions: info@alexandermooij.com.

Working draft, 26 October 2026 (Europe/Amsterdam). English edition. Source document: hypotheses-v10.md (hypotheses v10, internal review grade A- 9,2 on 23 October 2026, sha256 fbc5025fdf77042ab1653cf3e85c719a685f17bb74d8377e07ad15a8f4ae7c46). Not published. The Dutch edition follows once this text is stable.

Conflict-of-interest line. StikstofNu sells AERIUS reports. The research was done with an AI research agent and reviewed internally only; no external reviewer has read it. The reviews are internal and are kept in reviews/.

Not a policy position. This paper states questions, how each will be tested, and what result would count against each. It takes no side on nitrogen policy, and no result of it is a legal or permit advice.

Abstract

Small housing projects in the Netherlands are assessed for nitrogen deposition with the AERIUS Calculator, and the result printed for the construction phase often decides whether a permit procedure is needed. This paper sets out eleven open research questions and one answered inventory about that practice, as they stood when they were frozen in hypotheses v10 on 23 October 2026. For each it gives the data frame, the test method, the decision rule, what would falsify the claim, and what would leave it inconclusive or not evaluated. Six sit in evidence tier B or D (Table 1). Four have a hashed frame: whether the number of small housing projects with a provincial nature procedure changes by more than a factor 2 between 20 October 2025 and 19 October 2027 (H-VERGUNNING, the only tier B item); what share of published small-project calculations in Gemeenteblad publications reaches 0,5 mol/ha/j (H-RKO, at most 10% claimed); how widely crane and machine hours per dwelling vary (H-UREN, ratio of the 90th to the 10th percentile of at least 5 claimed); and how much of construction-phase NOx comes from demolition (H-SLOOP, median share of at least a third claimed). The other two, H-MACHINES and H-GEMEENTE, are tier D with a frame that is not hashed. The remaining questions wait for a hashed definition, a final legal corpus or new AERIUS Connect runs. No test of tier B or D has produced a result: the H-VERGUNNING fresh data do not exist before 19 November 2027, and the route 1 collection for H-RKO has not been run. What exists is a seven-project calibration set, a frozen parser with checks, a corrected-figure rule and a verdict-order gate.

Freeze status, stated exactly. Three questions (H-VERGUNNING, H-RKO route 1, H-UREN) have protocols, scripts and verdict files listed in append-only hash files in block order, which the chain of block hashes fixes; the three v9 blocks carry one timestamp, so for v9 the order rests on the chain and not on time (section 3.1); H-SLOOP shares the hashed route 1 frame. The text of hypotheses v10 and the thresholds of the other eight questions are not hashed, and no hash carries an external timestamp. The registration is therefore partial and self-hosted, not a pre-registration in the usual sense (section 3.1). Status of the figures. Each figure is recomputed by the self-check script, traced to a file in this repository, or taken from the private research archive or from a named source and frozen but not verified (section 10.4 lists the main ones). One hash question, with a corrective block. One hash in the v10 hash file (corrected_figures_v10.json) does not match the file on disk; a corrective block was appended in a new hash file on 2026-10-26T14:33:29+01:00 and the old entry stays as written, and no figure in this paper rests on that file alone (sections 3.1, 10.3 and 10.5). Seen after the freeze. The author has since seen results of Connect validation and replica work of 24 October 2026 that bear on three questions; they are not used here (section 4.3).

1. Background and purpose

A small construction project, for example a few new dwellings, adds nitrogen oxides (NOx) from mobile machinery for a limited time. For a project near a nitrogen-sensitive Natura 2000 area, a deposition calculation with the AERIUS Calculator is the usual instrument for the screening ("voortoets") step. AERIUS prints a result per receptor. A result under the calculation limit (rekengrens) of 0,005 mol/ha/j is printed as 0,00 or "-" (AERIUS proposal v9, abstract; hypotheses v10, section 1). How that printed value relates to the legal test is a separate matter, treated in section 2.

Three developments make a measured description of the practice useful.

  1. Procedure counts. Provinces publish notices about Natura 2000 permit procedures in their official gazette. How many of those concern one to four dwellings, and whether that number changes, is unknown, and the rules around it moved during 2024 to 2026 (Omgevingswet, provincial policy, case law).
  2. A possible calculation floor. The cabinet foresees introducing a "rekenkundige ondergrens" (RKO) "uiterlijk eind 2027" (Aanhangsel Handelingen II 2025-2026, nr. 2720, answer 2 [verified in v2]). It is aimed at 1 mol/ha/j; in the cabinet's words, projects "met een bijdrage van (voor afronding) 0,49… mol/ha/jaar of minder" fall under it (answer 3). How many small-project calculations would fall below such a floor depends on the printed contribution, which is what H-RKO measures. The floor is a plan; its legal robustness is open (same document, answer 10).
  3. Inputs. What a calculation contains for a construction phase, in particular the hours of cranes and other mobile machinery per dwelling, drives the result. How much these inputs vary across published files is a measurable thing (H-UREN, H-SLOOP).

The Dutch research justification for counting even very small contributions is quoted from the 2020 measurement-and-calculation report "Meer meten, robuuster rekenen" (15 June 2020, p. 14), which says the very low threshold is needed for policy use "om te voorkomen dat veel kleine extra emissies bij elkaar opgeteld tot een grote stijging van de depositie leiden", and in the same paragraph calls the threshold "schijnnauwkeurigheid", far below the model uncertainty [verified, zoek.officielebekendmakingen.nl/blg-936485.pdf]. Both statements belong together and neither is used alone here.

Purpose. The purpose of this paper is to make the tests open before the data are read: what is asked, with which data, by which rule a claim is supported, refuted or left open, and how anyone can verify that the rules were fixed (hashed) before the outcome was seen.

2. Scope and guardrails

These rules apply to every question below and are carried over from hypotheses v10, section 1.

  1. Legal test. The legal question is whether significant effects can be excluded on the basis of objective information (Waddenzee, C-127/02, 7 September 2004, para. 44: "such a risk exists if it cannot be excluded on the basis of objective information that the plan or project will have significant effects on the site concerned", and para. 45) [verified against secondary copies of the EUR-Lex text; the primary fetch was blocked]. A printed 0,00 or "-" is never presented as a legal bar.
  2. No mitigation trap. Measures meant to avoid or reduce harm are not weighed at screening (People Over Wind, C-323/17, para. 40 [verified against a secondary copy]; Eco Advocacy, C-721/21, para. 49 permits features required for all projects of the type [verified against secondary copies]). The first-instance ruling RBOBR:2025:1108 (r.o. 5.5 and 5.6) is the Dutch reference used for this rule in v4 [verified]; a built-in project feature is not a mitigation measure (Logtsebaan, ECLI:NL:RVS:2021:71, r.o. 9.10 [verified]). Nothing in this paper suggests choosing inputs to reach a value.
  3. No general threshold. The Afdeling has held that there is no general threshold (Porthos, ECLI:NL:RVS:2023:3129, r.o. 17.1 [verified]).
  4. Ecological analysis since Porthos. Unchanged from v4: after Porthos, a voortoets needs an ecological analysis, also for a temporary and limited increase (r.o. 17.1).
  5. Conflict of interest. See the line at the top of this paper.
  6. No re-identification. Distances are given to 0,1 km and bearings to octants; no file fingerprints, no addresses, no names; consultants are unnamed. Procedure codes (for example VG-POST-012) and document numbers are the only identifiers in derived tables.
  7. Harvest rule. Only freely downloadable documents are used. A document that is available "op verzoek" (on request) counts as not published. No contact with any municipality, province, consultant or applicant, no Woo request, no paid data. A 404 or an empty terinzagelegging page is recorded as "not (or no longer) online on 21 October 2026".
  8. Labels. [free] a free public source; [est] an estimate or judgement; [unverified] not read in a primary source; OCR a value read by tesseract at 300 dpi; OCR 600 a value from a single cell re-read at 600 dpi; post hoc a sensitivity defined after the data were seen; visual read a value read by eye from a saved crop (sensitivity only); single coder a count coded by one coder alone (on the visual checks: "single coder; checker also tuned the parser"); parser calibration set the seven route 2 projects (section 7).
  9. Address minimisation. The anonymised ("geanonimiseerd") printouts are not fully anonymised: their text can hold a street name, coordinates and, in one text layer, a company name. The raw files, the OCR text and the page crops therefore stay in the private archive, and no OCR line is quoted in this paper.
  10. Live pages first. The live StikstofNu pages /kennisbank/wat-betekent-0-00-mol and /kennisbank/rekenkundige-ondergrens-stikstof must be fixed before any page that follows from this programme is placed next to them. That fix needs the owner's approval. This is rule 7 of section 1 of hypotheses v10; it is rule 10 here because this paper lists its rules in its own order.

3. Method of the programme

3.1 Registration by hash chain, and what it does and does not freeze

The protocols, scripts, verdict files and outputs of H-VERGUNNING, H-RKO route 1 and H-UREN that carry a decision are hashed (sha256) and listed in a hash file before the step that depends on them is taken. The hash files are append-only. A block header records the sha256 of the file up to and including the previous block line, so a later edit of an earlier line breaks the chain. The v10 hash file has two blocks: BLOCK 1 (2026-10-23T15:11:50+02:00) lists the H-UREN protocol v1.7, the corrected-figures script v10, the offline fixtures and the situation verdicts; BLOCK 2 (2026-10-23T15:12:12+02:00) lists the regenerated corrected figures and the refusal note (one entry of that block does not verify against the file on disk; section 10.5). The file also records the sha256 of the hash files v3 to v9 and of the v9 changelog. A correction is a new block or a new file, never an edit. For the one open question in BLOCK 2 the owner approved a corrective block, appended as block 1 of PROTOCOL_HASHES_hypotheses_v10_addenda.txt at 2026-10-26T14:33:29+01:00; the v10 hash file is not edited, so the rule is met for that entry by a new file and a new block.

Timestamps of the blocks. Blocks 1, 2 and 3 of the v9 hash file carry the same time, 2026-10-23T15:04:04+02:00, although block 3 holds clean runs and corrected figures and block 1 holds protocols and verdicts. A timestamp shared to the second cannot show which came first; the order of the v9 blocks rests on the hash chain, in which each block header records the hash of the file up to the previous block line. The v8 blocks are spread from 2026-10-21T23:52:34 to 2026-10-22T00:30:04, and the two v10 blocks are 22 seconds apart. No block carries an external timestamp, and the hash files first enter git on 24 October 2026.

The gate in step 2 below states the consequence: a frame and an outcome definition count as registered (the source says "pre-registered") only if they were hashed before the outcome was seen. An item whose outcome is already known is "answered" and leaves the evidence tiers.

What is hashed and what is not (freeze status at 23 October 2026).

ItemIn an append-only hash fileNote
H-VERGUNNING protocol v1 to v1.4 (frame, windows, decision rule, power rule, reporting)yesTable 7
H-RKO route 1 protocol v1 to v1.2 and collection script v2yesTable 7
H-UREN protocol v1 to v1.7, frozen parser, corrected-figures script v10, situation verdict fileyesTables 6 and 7; the corrected-figures JSON entry of BLOCK 2 does not verify (10.5)
Text of hypotheses v10 (fbc5025f...) and its changelognoThe hash is recorded in this paper only; the file first appears in git on 24 October 2026 at 08:17 (+02:00)
Thresholds of H-SLOOP, H-GEMEENTE, H-MACHINES, H-UITSTOOT, H-ELEKTRISCH, H-001, H-AFSTAND and H-AERIUS2026noThey stand in the text of hypotheses v10 (and earlier hypotheses files), none of which is hashed
Legal-corpus protocol (H-ELEKTRISCH, H-001)noNo hash file v3 to v10 lists one
External timestamp for any of the abovenoneBlock timestamps are written by the author's own machine; no registry (for example OSF) has been used

Table 1a. Freeze status. "Registered" in this paper means "hashed in this chain", not an external registration.

3.2 Gate and evidence tiers

Candidates first pass a gate on three points: G1 legal or YMYL risk that can be carried, G2 a manageable conflict of interest, G3 a title consistent with the guardrails. Candidates that pass are then ordered by three criteria and two labelled judgements.

  • C1 the frame and the outcome definition were hashed before the outcome was seen;
  • C2 the available n reaches the stated minimum;
  • C3 the claim can be breached by the data (it can fail);
  • Evidence (design strength) and Usefulness, both [est].

Table 1 shows the state at the v10 freeze. "Owner decision" replaces the internal label for steps that need the project owner's approval.

TierIDWorking Dutch titleC1C2C3EvidenceUsefulness [est]Blocked by
BH-VERGUNNINGVerandert het aantal kleine woningbouwprojecten met een provinciale natuurprocedure met meer dan een factor 2?Met for the fresh test (protocol v1.1, widened in v1.2, baseline sheet v1.3, reporting addendum v1.4)Met by design (Y-next is a census); power rule in 5.1Met, as an equivalence test with a factor-2 marginHighMediumReading the eight added provinces' Y-post baseline (single coder); Y-next after 19 November 2027
CH-ELEKTRISCHHoe oordelen rechters over elektrisch bouwmaterieel in de voortoets?Met (legal corpus protocol)Not metMetMediumHighFinal legal corpus; live pages (owner decision)
CH-001Heeft de Afdeling sinds Porthos een kleine, tijdelijke toename aanvaard zonder ecologische analyse?Met (legal corpus)Not metMetMediumHighFinal legal corpus
DH-MACHINESHoeveel stikstofdepositie komt van mobiele werktuigen, per Natura 2000-gebied?Not met: the sector, year and denominator definition is not hashedMet (130 areas)MetMediumLowHash the definition before any value is read
DH-GEMEENTEWelke stikstofstukken vragen gemeenten op hun eigen websites?Not met: the 20-site list and coding sheet are not hashedMet (n = 20)MetMediumLowHash the list and the sheet before any site is opened; contacting gemeenten (owner decision)
DH-SLOOPHoeveel van de bouwuitstoot komt uit de sloopfase?Met (shared frame)Not metMetMedium (design; no route 1 datum yet)MediumShared frame; situation filter
DH-RKOWelk deel van de stikstofberekeningen van kleine woningbouwprojecten die bij Gemeenteblad-publicaties zijn gevoegd komt op of boven 0,5 mol/ha/j, afhankelijk van het aandeel via de provincie?Met: route 1 frame, narrowed claim, coverage log, project-unit rule and analysis hashed; collection script v2 hashed before any request; v1 supersededNot met (route 1 n unknown; minimum 36)MetMedium (design; no route 1 datum yet)Medium (conditional on w; narrowed frame)The owner's confirmation of the bulk pull from the public search service; route 1 coding
DH-URENHoeveel kraanuren per woning staan in gepubliceerde stikstofberekeningen?Met for route 1: parser frozen, collapses, corrected figures, situation correction and earlier-block gate hashed; no route 1 file yetNot met (3 crane values against a minimum of 20); structurally unlikely to be metMetMedium (design; no route 1 datum yet)MediumRoute 1 collection; second coder for an A grade (owner decision)
EH-UITSTOOTHoeveel stikstof stoot de bouw van één woning uit?Not metNot metMetLowMediumNew AERIUS Connect runs (owner decision)
EH-AFSTANDHoe snel neemt de berekende stikstofbijdrage van een bouwplaats af met de afstand?Low (core needs Connect)HighNew Connect runs (owner decision)
EH-AERIUS2026Wat verandert AERIUS Calculator 2026 voor kleine bouwprojecten?Low (core needs Connect)HighConnect re-runs (owner decision)
answeredH-ZELFWelke regels zeggen iets over wie een AERIUS-berekening maakt?Outcome known before any hashLeaves the tiersDated descriptive inventory

Table 1. Gate and ranking at the freeze of hypotheses v10. Empty cells are empty in the source. "Met" in C1 is the source's wording: for H-ELEKTRISCH and H-001 it means that a legal-corpus procedure was written down, and Table 1a records that no hash file lists one.

Reading the tiers. The tiers are reproduced from v10, not reassigned. Under this paper's own gate, C1 means hashed before the outcome was seen, so H-ELEKTRISCH and H-001 do not meet C1 (Table 1a), and H-GEMEENTE and H-MACHINES are in D by v10's convention ("tier D until its definition is hashed"), not by a hashed frame. The Evidence cell "High" for H-VERGUNNING is a design judgement [est]: the power rule of 5.1 runs the test as specified only from 32 Y-post notices, and Table A1 shows that under no change "supported" occurs only 18,7% of the time at a k_post of 17. Re-tiering is an owner decision.

Two readings are binding. First, only H-VERGUNNING is tier B. H-RKO and H-UREN stay in D, because a hashed frame alone justifies D (C1 met, C2 not met). Second, "Medium (design; no route 1 datum yet)" describes the design of a test that has not run. No page may cite the tier as evidence strength. C1 for H-RKO lapses back to E if the collection script does not implement the protocol text exactly; the script asserts this before any request (section 5.2).

4. Data

4.1 Public sources and windows

  • KOOP SRU, the public search service of the official publications repository (repository.overheid.nl/sru), for notices; and zoek.officielebekendmakingen.nl for notice text and attachments. Everything is freely downloadable.
  • AERIUS Calculator printouts published as attachments to a notice, coded by a written rule for the highest printed construction-phase contribution (coding rule, sha256 0f0443adcd1a680a98307c8047cd99b2d8c678645b2cc3bb90723ae094b989fd, frozen in protocol v1.1).
  • RIVM M2025 data file for deposition per area and sector (H-MACHINES); the 2023 mean on Natura 2000 habitat and its sector split are used in the physical-layer paper v8.2 (data file sha256 cc33c1eee91dfd9c7f0d7e0e9f5d18ef59d7b73561450a9b6b019f0de4692510).
  • Court rulings from the public case-law database for H-ELEKTRISCH and H-001.

Windows by publication date of the notice in the provincial gazette:

WindowDatesUse
Y-pre2023-10-20 to 2024-10-19 (366 days)existing data, comparability check only
Y-mid2024-10-20 to 2025-10-19descriptive, no verdict
Y-post2025-10-20 to 2026-10-19 (365 days)baseline of the fresh test
Y-next2026-10-20 to 2027-10-19 (365 days)fresh data; collected once, after 2027-11-19 (30 days of publication lag)

Table 2. Windows of H-VERGUNNING (protocol v1, v1.1).

The four provinces first read were Gelderland, Overijssel, Drenthe and Fryslân. The fresh test is widened to all twelve provinces (protocol v1.2): the eight added provinces are Groningen, Flevoland, Utrecht, Noord-Holland, Zuid-Holland, Zeeland, Noord-Brabant and Limburg. No notice of any of them, and no Y-next notice of any province, has been queried or read.

4.2 Two routes to a published calculation

  • Route 2 (provincial route): calculations attached to a provincial Natura 2000 procedure, harvested under the H-VERGUNNING protocol. In the harvest, 64 CSV rows are 60 unique procedure files plus 4 duplicates; 60 downloads; 70 files on disk, of which 68 PDFs; 61 documents (7 variants). Attachments are online for 7 of 29 procedures; 21 Gelderland procedures are not (or no longer) online on 21 October 2026; 1 Overijssel procedure was not checked. Route 2 is a parser calibration set of seven projects and has no evidential value for any claim (section 7).
  • Route 1 (municipal route): calculations published with a Gemeenteblad decision or plan, outside the provincial procedure. Collection is specified in 5.2 and has not been run.
  • Existing convenience frame: 38 benchmark identifiers (37 unique reports, 36 with a positive crane value under the primary coding), collected before any search rule existed. It is a convenience frame with no documented search rule and is never pooled with route 1 or route 2.

4.3 What was seen before the rules were written

Disclosure is part of the design. The H-VERGUNNING rules are not blind to Y-post: the 1.170 provincial notices of that window (872 with readable text) and 63 matched dwelling notices were known when protocol v1 was written, and the Y-pre and Y-mid counts were read before the amendments v1.1 to v1.4 (counts 0, 7 and 16 for Y-pre, Y-mid and Y-post; 17 for Y-post when re-read). That is why the amendments can only downgrade a result on existing data (5.1). For H-RKO, earlier searches of the same public service used other queries (the H-VERGUNNING provincial frames; a permit-demand search of Gemeenteblad omgevingsvergunning notices in the same window, of which 0 of 2.876 exact-fit notices mention stikstof; two harvest scripts with municipal and title-token queries). None used the three route 1 terms, they were found on disk and not run for this programme, and the 0 of 2.876 figure is orientation only, never a threshold. For H-UREN, the values in two route 2 projects are treated as seen before coding.

Three further disclosures.

  1. Legal corpus. For H-ELEKTRISCH and H-001, the corpus work started before the claim sentences were frozen: on 21 October 2026 the list of Raad van State decisions in the public case-law service was paged through (99.507 ECLI identifiers from 1994 to 21 October 2026), and decisions were fetched and screened for terms from that day. The frozen claims of 23 October were therefore written with that exposure to the corpus, and no hashed legal-corpus protocol exists (Table 1a).
  2. H-MACHINES. The deposition share used as orientation (12,4 of 1.427,4 mol N/ha/yr on the Natura 2000 habitat mean, 0,87%) is known to lie near the 1% threshold, so the test is not blind to the order of magnitude of its outcome.
  3. Work after the freeze. After hypotheses v10 was frozen on 23 October 2026, new AERIUS Connect validation jobs and an offline replica of the calculation chain were run on 24 October 2026. This paper was written on 25 October 2026 by the same agent that saw those results, so for H-AFSTAND, H-UITSTOOT and H-AERIUS2026 the text here is not blind to them. They are not part of v10 and none is used or quoted here; no claim, threshold or rule was changed because of them. A later version should state how they bear on those three questions.

5. Hypotheses: claims, test methods, decision criteria, falsification

Each subsection gives the question (working Dutch title), the claim in the form it was frozen, the data, the test method, the decision rule, what would falsify the claim, and what leaves it open. Wording of claims and every threshold is taken from hypotheses v10 and the hashed protocols without change.

5.1 H-VERGUNNING (tier B), merged with H-STAL

Question. Descriptive (Y-post): "Hoeveel kleine woningbouwprojecten doorlopen een provinciale natuurprocedure?" Fresh test: "Verandert het aantal kleine woningbouwprojecten met een provinciale natuurprocedure met meer dan een factor 2?" The earlier title "Blijft ... gelijk?" contradicted the hashed rule that forbids "unchanged"; nothing in the titles or the results says "gelijk", "unchanged" or "stable".

Claim. The number of procedures of 1 to 4 dwellings (headline; 1 to 10 as secondary, protocol v1.2) with a provincial Natura 2000 procedure, twelve provinces pooled, in Y-next (2026-10-20 to 2027-10-19) does not differ from Y-post (2025-10-20 to 2026-10-19) by more than a factor of 2.

Data and classification (protocol v1, section 4). A notice is a dwelling notice if its text describes a provincial Natura 2000 procedure (Omgevingswet) or a Wnb gebiedsvergunning (art. 2.7 Wnb) whose activity adds dwellings: new build, replacement, conversion or split. Excluded: holiday homes, campsites and visitor accommodation as the dwelling element, temporary units, mantelzorg, tiny houses, student, labour-migrant, asylum and care housing, and notices that mention housing only as policy. The dwelling count is parsed from the text; no number ("nieuwbouwwoningen", "woningbouw") means count unknown, which is never in the headline. Notices merge into one procedure when they share a case number, or the same address in the same province within 400 days, and the procedure belongs to the window of its first notice. Query: c.product-area==officielepublicaties AND dt.creator=="<province>" AND dt.date>=<start> AND dt.date<=<end> AND cql.textAndIndexes="natura", identical in every window, with a stop rule of all hits and no other terms. Text is read in this order: repository XML, the notice page, the PDF through pdftotext; a notice with no readable text after all three is "unreadable" and counted, never estimated.

Test (fresh data only, step 1 and step 2).

  1. Comparability check. A notice is an "area-permit notice" (the denominator class, all project types) if its title plus the first 400 characters match a written pattern list for Natura 2000 permit notices and the title does not match an exclusion list; the dwelling outcome plays no part. A province is "assessed" if it has at least 20 area-permit notices in Y-post or Y-next. Comparable only if (a) for every assessed province at least one area-permit notice falls within the first 62 days of each window, and (b) for every assessed province and for the twelve-province total, the ratio Y-next to Y-post of area-permit notices lies within 0,5 to 2 (inclusive; a zero in the earlier window fails). Otherwise the result is "not interpretable: frame not comparable between windows" and no test is run.
  2. Primary test. Exact conditional binomial on k_next / (k_next + k_post), equal exposure, RR = k_next / k_post.
    • Refuted ("changed"): the two-sided 95% interval of RR excludes 1.
    • Supported ("no change larger than a factor 2 detected"): not refuted, and the two-sided 90% interval lies within 0,5 to 2.
    • Inconclusive: otherwise.

Unreadable share and count-unknown rules (protocol v1.1, sections 5 and 6). Per window, low = k (confirmed procedures of 1 to 4 dwellings); high = k + ceiling(u x U95(k, r)), with r the readable and u the unreadable area-permit notices and U95 the one-sided 95% Clopper-Pearson upper bound of k / r. The test runs on (later low, earlier high) and (later high, earlier low); if they disagree the result is "no verdict (unreadable share)". Count-unknown procedures are added as their own bound (as if every one had 1 to 4 dwellings), and if the worst cases for each direction give different verdicts the result is "no verdict (count-unknown)".

Power rule (decided from the baseline alone, before any Y-next notice is read; protocol v1.2). With k_post(12) the twelve-province baseline count:

  • at least 32 (no-change "supported" at least 80%): the test runs as specified;
  • 22 to 31 (50% to under 80%): the test runs, labelled "low power", with the operating characteristics at the realised k_post printed next to the verdict;
  • under 22: if the 1 to 10 dwelling count reaches 22, that count becomes primary (fixed before Y-next is read); otherwise the fresh test is reclassified as "cheap re-count only, no verdict".

The thresholds 22 and 32 are the smallest k_post at which "supported" under no change reaches 50% and 80% (recomputed in section 10.4).

Baseline for the eight added provinces (protocol v1.3). Coder: single coder, and every baseline count carries that label. All eight provinces are classified before any Y-next notice is queried, on the hashed classification sheet. A random 20% of the candidate notices (rounded up, fixed seed 20261021) is re-coded at least 48 hours later with the first codes closed, and agreement is reported (raw and Cohen's kappa) on the procedure class. A second coder is needed only for an A grade.

Reporting (protocol v1.4). Every verdict prints three labelled figures at the realised k_post: P(supported | true halving), P(supported | true doubling) and P(not refuted | true halving). The last is printed in the power line as "power against a halving = P(refuted | true halving) = 1 minus P(not refuted | true halving)", so that "not refuted" is never read as "supported". Appendix A (Table A1) gives them for eleven values of k_post. At k_post 40, a true halving yields "supported" with probability 1,35%, a true doubling with 0,20%, and a halving is not refuted with probability 21,25%, mostly as "inconclusive" (19,90%). From k_post 72 the inconclusive band is empty (checked to 120), so "not refuted" and "supported" coincide; at k_post 68 to 71 a single k_next is still inconclusive (47, 47, 48 and 49), and at 60 three (40 to 42).

What the rule labels "changed" (refuted), and what it does not. The rule labels "changed" (refuted) when the number of procedures moved by an amount the data distinguish from chance, at the 95% two-sided level. That is a label of the rule, not a finding that the claim is false (see "Refuted" is a rule label, below). "No change larger than a factor 2 detected" is the strongest favourable outcome the design allows. It is not "unchanged" and not "stable", and by the operating characteristics it is rare when the true count halved or doubled: scanned over every k_post from 1 to 100, the probability of "supported" under a true halving is at most 1,70% (at k_post 69; it is above 1,5% at nine values, 34, 42, 47, 52, 57, 62, 67, 69 and 72) and under a true doubling at most 0,25% (at k_post 20). Hypotheses v10 says that this probability "stays under 1,5% at every k_post"; that holds at the eleven tabulated values and not over the whole range, and v10 is not altered (section 12.2). Inconclusive and the "no verdict" and "not interpretable" labels are results of the design, not failures of the claim.

What the claim says and what the rule refutes. The claim is about a change larger than a factor 2. The favourable outcome ("supported") does test against that margin: the 90% interval of RR must lie within 0,5 to 2. The refutation does not: it fires when the 95% interval excludes 1, that is, for any change the data distinguish from chance. How small that change is depends on k_post (exact rule, computed in section 10.4):

k_post"Changed" (refuted) when k_next is at most... or at leastRate ratio at which the rule fires
208360,40 or 1,80
4023610,57 or 1,52
6039850,65 or 1,42
100731310,73 or 1,31

Table 1b. Smallest observed change that the H-VERGUNNING rule labels "changed".

So at k_post 100 a rise of 31% is already labelled "changed", although the claim speaks of a factor 2. The label "changed" must therefore be read as "distinguishable from chance", never as "changed by more than a factor 2"; the title question asks about a factor 2, and only the "supported" outcome answers it. The rule is frozen and is not altered here.

"Refuted" is a rule label, not a finding. The refutation test and the support test use different intervals, so one outcome can satisfy both: the 95% interval excludes 1 and the 90% interval lies within 0,5 to 2. This happens at k_post 60 for k_next 85 to 89, at k_post 100 for k_next 66 to 73 and 131 to 160, and at k_post 200 for k_next 122 to 161 and 243 to 343 (computed in section 10.4). The frozen order labels such an outcome "refuted". That is a label of the rule, meaning "distinguishable from chance". It is not a finding that the claim of no change beyond a factor 2 is false: at those points the data also lie within the factor-2 margin. Such outcomes exist from k_post 51: the smallest k_post that has one is 51 (k_next 74); there is none for k_post 1 to 50 or at 52, and every k_post from 53 to 200 has one (computed in section 10.4).

Independence and overdispersion. The exact conditional binomial treats every notice as an independent event with equal exposure in both windows. Notices cluster: one project can produce several notices, a province can change its publishing practice, and twelve provinces differ in volume. Counts that vary more than a Poisson count would make the intervals too narrow, and the rule would then call "changed" more often than its stated error rate. The hashed protocols contain no correction for overdispersion, the comparability check (62 days, ratio 0,5 to 2 per province) only partly guards against changes in practice, and none is added here. The stated levels (95% and 90%) are conditional on independence; a reader should treat a "changed" near the boundary in Table 1b with caution.

Existing data (Y-pre, Y-mid, Y-post): a veto, never a verdict. Protocol v1 stated a before-and-after test of Y-post against Y-pre. After the internal review's ruling, protocol v1.1 fixed that the comparability rule can only turn the v1 result into "not interpretable: frame not comparable between windows (deviation D1)" and can never produce "supported", "refuted" or "inconclusive" on those windows. The v1 statistic is always reported next to it, labelled "v1 test: supported (statistic only)", with one-sided rate-ratio lower bounds of 4,87 (16 against 0), 6,87 (22 against 0, the unreadable-share ceiling) and 5,20 (17 against 0, re-read). The bounds are one-sided exact limits on the rate ratio of Y-post against Y-pre, scaled by 366/365 because Y-pre has 366 days and Y-post 365 (Table 2); without that factor they would be 4,86, 6,86 and 5,19. The question "did the December 2024 ruling raise demand" is not asked, because the frame cannot answer it. Only "the published notices rose" may be said, and no causal language follows from any count.

H-STAL as a descriptive stratum. Barn, stable and farm conversions (the STAL flag) are reported as half-year counts per province and in total, with the same exact rate-ratio interval for the period after 18 December 2024 against before (the date of the Afdeling ruling ECLI:NL:RVS:2024:4923, on intern salderen with an existing permit), as description, with no verdict. The earlier "any rise" test is withdrawn. Named confounders: the Omgevingswet start (1 January 2024), Overijssel's suspension of permitting for salderen-dependent applications to 1 February 2027, and Gelderland's 65% cap on intern salderen (Beleidsregels salderen Gelderland 2026, art. 5 lid 8). Overijssel's transition period to 1 January 2030 for businesses that started activities of a "positieve weigering" between 1 January 2020 and 1 January 2025 is listed as "considered and set aside on the province's summary; legal basis not read". On the province's statement of scope it is not a plausible confounder for the count of dwelling notices; if H-STAL ever carries a verdict, the legal basis is read first.

5.2 H-RKO (tier D): route 1 claim narrowed to its frame

Question. "Welk deel van de stikstofberekeningen van kleine woningbouwprojecten die bij Gemeenteblad-publicaties zijn gevoegd komt op of boven 0,5 mol/ha/j, afhankelijk van het aandeel via de provincie?" The frame is the Gemeenteblad and plan-amendment route; the permit stratum is separate.

Claim (narrowed, addendum v1.1). "Among AERIUS calculations of 1 to 10 dwelling projects that are attached to, or linked as files from, Gemeenteblad publications dated 2025-10-20 to 2026-10-19 whose indexed text names "AERIUS", "stikstofdepositie" or "voortoets stikstof", at most 10% have a highest printed construction-phase contribution at or above 0,5 mol/ha/j." A printed 0,50 counts as at or above 0,5, and the number printed exactly 0,50 is reported separately (a printed 0,50 may hide 0,495 to 0,4999).

Why 0,5 and not 1,0. The cabinet aims the planned calculation floor at 1 mol/ha/j and states that projects with a contribution of "(voor afronding) 0,49… mol/ha/jaar of minder" fall under it (Kamervragen nr. 2720, answer 3, section 1 item 2). "Under 0,5 before rounding" is therefore the operational reading of "under the floor", and "at or above 0,5" counts the calculations that would not fall under it. That reading is this paper's own; hypotheses v10 section 6 lists the cabinet answers as verified (Kamervragen nr. 2720, answers 2, 3, 9 and 10). The threshold is a counting rule. It is not the legal test, which remains whether significant effects can be excluded (section 2, rule 1), and the floor itself is a plan whose legal robustness is open.

Collection (route 1). KOOP SRU query, written in full: c.product-area==officielepublicaties AND dt.date>=2025-10-20 AND dt.date<=2026-10-19 AND cql.textAndIndexes="<term>" for each of the three terms, keeping only identifiers that start with "gmb-". Candidate notice: its text names a dwelling term and a plan or permit term; policy documents are out. For route 1 the policy filter of H-VERGUNNING applies without the words "omgevingsplan", "projectbesluit" and "inpassingsplan", which would have removed the plan amendments the claim asks for (found at the desk before any request). Files: every "/bijlage/" link (zip bundles excepted) on the notice page and its terinzagelegging page, and every link in the notice text whose response is a PDF, each URL tried once by a plain GET. A non-PDF response (plan viewer, DSO, a municipal web page) is logged "behind a viewer or web page" and not followed. Inclusion: 1 to 10 dwellings and at least one AERIUS printout with a construction situation or a "no results" statement for construction. Projects that are also in the H-VERGUNNING procedure list are route 2, not route 1.

Collection script. collect_route1_v2.py with its query specification is hashed in its own block before it runs (hash block v9 BLOCK 2). Version 1 is superseded and must not be run, because it would corrupt the coverage log. Before it sends anything, version 2 refuses unless (1) approval is set, (2) the output directory is new, (3) its endpoint, template, terms and prefix equal the strings parsed from the hashed protocol text, and (4) its own sha256 and that of the spec module are listed in the hash file. Offline fixture tests with sockets disabled cover shared-file counting, the whole-text helper (5 of 52 route 2 AERIUS documents missed by a pages 1 to 3 search are found) and a non-PDF link not counted as a file; refusal tests cover the missing approval, a changed term list and an unhashed copy. No request was sent in any test.

Coverage log (one line per candidate notice): identifier, date, municipality; procedure type by a stated mechanical rule (omgevingsvergunning, omgevingsplan, other), checked by hand with every override logged and counted; reachability ("calculation reachable", "files attached, no calculation", "behind a viewer or on request", "not attached"); file and link counts, on-request flag, inclusion decision and reason. Reachability uses AERIUS in the file name or the whole text layer. The query log records the server's numberOfRecords for every term exactly as returned.

Project unit. n1 counts projects, not files: group by municipality plus plan identifier (or municipality plus site location to 100 m); re-exports are judged with the H-UREN same-calculation rule, and the highest construction-phase contribution across separate calculations is taken. Printed as "n1 = x projects from m municipalities (f files before project dedupe)". The file-level figure is a named sensitivity only.

Analysis (final form). One-sided Clopper-Pearson bounds at 97,5% per route (Bonferroni over two routes). U1 and L1 come from route 1, U2 and L2 from route 2 as frozen in the calibration run: 5 readable values, of which 1 at or above 0,5, and 2 unreadable; unreadable files count as at or above 0,5 for U and as below for L; files with no construction result line are excluded from n and counted. For a provincial-route share w from 0 to 1:

U(w) = (1 - w) U1 + w U2 and L(w) = (1 - w) L1 + w L2.

The curve is printed, with w* (the largest w with U(w) at or below 10%) and the smallest w with L(w) above 10%, if any. Verdict wording: "supported for a provincial-route share up to w*", "refuted from a share of ...", or "inconclusive for every w". The conditional form is final; no upper bound on w is adopted. A bound that anyone proposes later is printed only as post hoc, below the curve. Minimum: n1 of at least 36 projects with a construction result (hypotheses v10 gives the minimum as 36 without a unit, and n1 counts projects); below that the result is "not evaluated" and the curve is description only.

Why the form is conditional. With 97,5% one-sided Clopper-Pearson bounds, route 2 alone has U2 at or below 10% only with at least 36 values and none at or above 0,5, or at least 54 values with one. Route 2 already has one. Only 7 of 29 Y-post procedures have freely downloadable attachments, so this cannot be reached from free sources. The notice ratio (0,6% to 1,1%) is volume-driven and printed only as context.

What the H-RKO design can show. At the minimum of 36 projects, U1 is at or below 10% only with none of the 36 at or above 0,5. The probability of that is 48% if the true share of calculations at or above 0,5 is 2%, and 16% if it is 5% (that is (1 - p) to the power 36). Even then the provincial-route share up to which "supported" holds is small: w* is between 0,29% (route 2 empty) and 0,54% for the readings of the orientation paragraph, and 0,61% without route 2 projects 009 and 012. With one or more at or above 0,5 among 36, U1 exceeds 10% and no "supported" is possible for any share. "Supported" is therefore reachable only if the provincial share is negligible or n1 is well above 36. No operating characteristics are computed here for H-UREN (the P90/P10 verdict at n of 20).

Reporting. n1 and m with the largest single-municipality share; the reachable share by procedure type (candidate notices with a reachable calculation over all candidate notices, with counts, for omgevingsplan, omgevingsvergunning and other); U1 and L1 also with one project per municipality as a named clustering sensitivity; the parser's error rates and the corrected figures with every route 1 number; route 1 and route 2 each with k, n and bounds; the 38-file convenience frame as its own stratum, never pooled; AERIUS version bands 2019 to 2021, 2022 to 2023 and 2024 to 2026.

Permit stratum (framing from the review). The permit stratum (omgevingsvergunning, including buitenplanse omgevingsplanactiviteit) is printed separately with no generalisation from the plan-amendment majority of the frame. It gets its own one-sided 97,5% Clopper-Pearson bound only if its own n reaches 36. A share of n1 does not make a mixed-frame bound valid for that stratum. There is no generalisation to notices naming none of the three terms, to calculations behind a viewer or on request, or to municipalities with no project in n1.

What would falsify the claim. Refuted from a share of w: L(w) exceeds 10% at that w, so even the lower bound on the share at or above 0,5 is above 10%. Supported up to w*: U(w) stays at or below 10%. Inconclusive for every w: neither. "Not evaluated" below n1 of 36.

Orientation, not a result. Using the 38-file convenience frame (0 of 38 construction-phase values at or above 0,5) as a stand-in for route 1 gives U1 = 9,25%. The 38 identifiers are 37 unique reports (section 4.2); with 37 the same orientation gives U1 = 9,49%, and the hashed w* file uses 38. Depending on how route 2 is counted (empty; 1 of 5 readable; 3 of 7 with the two unreadable files as at or above; 1 of 7 with them as below), w* lies between 0,83% and 1,54%; without route 2 projects 009 and 012 (0 of 5) it is 1,74%. These values were seen before the protocol was written, which is why no bound on w is adopted. The values are recomputed in section 10.4.

Limitations specific to H-RKO. The term filter is a selection that may run on a variable related to the outcome (a notice whose indexed text names a nitrogen term may be one where nitrogen mattered), direction unknown; it stays a stated limitation of the narrowed claim. The curve describes the narrowed Gemeenteblad frame mixed with the provincial route, not all small housing calculations. The construction phase is not the whole project: the use phase also contributes, and how a floor would treat phases (per phase, per project or cumulatively) is not defined in any source read [unverified in a primary source]. Route 1 values do not exist yet.

5.3 H-UREN (tier D)

Question. "Hoeveel kraanuren per woning staan in gepubliceerde stikstofberekeningen?"

Quantities. (1) Crane hours per dwelling, by the rules R1 to R7 of the recheck protocol, primary class L + U, sensitivity L only. (2) Machine hours per dwelling: the sum of hours over every mobile machine in the AERIUS input (all classes, cranes included) divided by the number of new dwellings, counting identical rows (same name, hours and fuel) once, because the printout repeats a source per situation. Also recorded per row: machine name, fuel in l/j where printed, and l/h.

Existing frame (descriptive; convenience frame; frozen). 36 positive crane values, two series side by side and neither called the headline:

  • as entered: P10 8,8, P90 82,55, P90/P10 9,38;
  • with one implausible entry corrected to 47 h (501 l/j over 470 h is 1,1 l/h): P90 64,55, P90/P10 7,34.

Protocol H-UREN v1, section 3, states these two series (extract in the data folder). Hypotheses v10 does not print them: its section 9.2 says only "Unchanged from v6 section 9.2 (not rerun)". Four, six and eight series. The prediction below uses four series, defined in protocol v1.1, section 3: (1) as entered, (2) corrected by the v1 rule, (3) corrected by the v1.1 rule, (4) flagged rows excluded; the agreement condition compares (1) with (3). Protocol v1.2, section 4, lists eight: those four, re-run with the v1.2 parser, plus four labelled sensitivities, (5) v1.1 unit patterns, (6) situation filter, (7) row name only and (8) no farm machinery, of which (6) to (8) are post hoc on route 2; none of the extra four enters a verdict. Table 3a prints six existing-frame series: the four of v1.1 and the two series of the clean-run outputs that come from the literal v1.2 code (a parser artefact, not one of the v1.2 series (5) to (8)). All six are given so that the spread is visible.

SeriesnP10P90P90/P10
As entered368,882,559,38
One implausible entry corrected (above)368,864,557,34
Both flagged entries corrected, rules v1 and v1.1367,664,558,49
Flagged entries excluded348,4864,777,64
Sensitivity: literal v1.2 code, not adopted367,682,5510,86
Same, flagged entry excluded358,6486,049,96

Table 3a. Existing-frame crane hours per dwelling, six series. Sources: existing_frame_crane_hours_extract.json (anonymous values and summary figures; source file hashes in the file), recomputed in the self-check. The 10,86 and 9,96 rows are a sensitivity of the literal v1.2 code, in which the plausibility rule was checked on 13 of the 36 values; they are a parser artefact, not a competing reading, and the v6 erratum moved the figure from 10,862 back to 8,49. Spread 7,34 to 10,86; every series is above 5 and above 3, so the reading against the thresholds of 5 and 3 does not depend on the series chosen. The existing frame is a convenience frame and carries no verdict.

Prediction (new files only; pre-stated). On the new files, pooled P90/P10 of crane hours per dwelling (primary L + U):

  • at least 5: supported;
  • under 3: refuted;
  • 3 to 5: "narrower than the existing frame", no verdict.

The verdict requires the as-entered and the corrected series to agree; otherwise "inconclusive (typo-sensitive)", both reported. Minimum n: at least 20 new files with a positive crane value in both series; below that "not evaluated", and only n and the percentiles are reported. Percentiles use linear interpolation. Bootstrap 95% intervals use 10.000 resamples with seed 20261021. Strata (new build, sloop-nieuwbouw, conversion; 1 dwelling versus 2 or more) are shown only where a stratum has at least 10 files. Every new-frame number is given with and without the two route 2 projects whose values are treated as seen.

Narrowed by protocol v1.1. The agreement condition above compares series (1), as entered, with series (3), corrected by the v1.1 rule, where the four series are (1) as entered, (2) corrected by the v1 rule, (3) corrected by the v1.1 rule and (4) flagged rows excluded; if (2) and (3) disagree on the verdict, both are reported (v1.1, section 3). Protocol v1.1 also counts projects: where the block says files, read projects, so the minimum is 20 new projects with a positive crane value in both series (v1.1, section 5).

Source of this block: protocol H-UREN v1, section 4, as amended by v1.1, sections 3 and 5 (hashes in Table 7; extracts of both in the data folder). The with-and-without sentence is v1.1, section 5, and follows the disclosure of what was seen (v1.1, section 0; section 4.3 here). Hypotheses v10, section 4.3, states the prediction as "Unchanged".

Plausibility and correction rules (protocol v1 and v1.1). A diesel row is flagged when its printed fuel per hour is outside a class limit read from the printed AERIUS label (never from the machine name): lower limit 0,5 l/h for the class "<= 56 kW" and lower classes [est], 3 l/h for all higher classes and for rows with no class printed, upper limit 100 l/h for all classes. The rule assumes the hours are wrong, never the fuel: a flagged row is corrected by multiplying the hours by 0,1 or 10 only if that brings it inside its limits, otherwise it is excluded from the corrected series. For a crane row, where the report's own machine table gives an hours value, that value is the corrected value and the x0,1 or x10 value is the sensitivity. A pre-stated sensitivity drops every flagged row instead of correcting it. Four series are reported side by side: as entered; corrected by the v1 rule; corrected by the v1.1 rule; flagged rows excluded (existing frame: Table 3a). The 0,5 l/h limit is a judgement, not sourced from TNO, AERIUS or manufacturer data. These rules were written after two existing-frame entries were flagged, so they are not blind to the existing frame; they are blind to every new file.

New-frame unit and text source. One project is one unit; its rows are the union of rows in its deduplicated construction-phase documents. A document is construction phase if its file name or page 1 says bouwfase, aanlegfase, sloopfase, realisatiefase or "bouw" or "aanleg" for the calculated situation; use-phase documents are excluded; a document with machinery rows and no phase label is included and flagged. Text comes from the PDF text layer where the rows carry digits, otherwise tesseract 5 OCR (language nld, 300 dpi, page segmentation mode 6); a row is accepted only if name, hours with "u/j" and fuel with "l/j" parse on one line, and other lines are counted as unreadable rows, never estimated.

What would falsify the claim. Refuted if the pooled P90/P10 on new files is under 3 in both series. Supported if it is at least 5 in both. Between 3 and 5, or when the series disagree, no verdict. C2 is structurally unlikely to be met: the calibration set has 3 positive crane values against a minimum of 20, and route 1 is a narrowed frame. A D tier is not a forecast of success.

Guardrails. Percentiles only. Never "fewer hours gets you under a value", and never a suggestion to choose hours to reach a value (the mitigation trap in section 2).

5.4 H-SLOOP (tier D)

Question. "Hoeveel van de bouwuitstoot komt uit de sloopfase?" The shared frame is the protocol samples (H-VERGUNNING harvest, H-RKO route 1), not the convenience frame. Demolition rows sit under their own sources and situations, so the phase split uses the H-UREN protocol v1.2 situation rule (sections 2.5 and 2.6), primary for route 1.

Claim. In published sloop-nieuwbouw calculations for 1 to 4 dwellings where the printout splits phases, demolition supplies at least a third of construction-phase NOx (median).

Three-way rule, with the gap labelled. Supported if the median is 33% or more; refuted if the median is under 20%; 20% to under 33% is labelled "inconclusive: demolition supplies between a fifth and a third". Minimum n: 15 files with a phase split; below that, not evaluated. The sloopmelding sub-question is dropped. No statement implies that a StikstofNu report covers demolition unless it does.

5.5 H-GEMEENTE (tier D until its site list is hashed)

Question. "Welke stikstofstukken vragen gemeenten op hun eigen websites?"

Claim. Among the top 20 gemeenten by small rural house projects, fewer than half publish any stikstof submission requirement. Refuted if 10 or more do. Where requirements are published, the report states what they ask for (AERIUS PDF, GML input, other).

Before any site is opened: hash the list of 20 gemeenten with the ranking source and date, the coding sheet (what counts as "a stikstof submission requirement", where on a site to look, a per-row last-checked date) and the stop rule. Until then C1 is not met and the tier is D. Contacting gemeenten needs the owner's approval. Any bureau requirement is reported as "none of the N gemeenten that publish requirements states one", never as acceptance of any product.

5.6 H-MACHINES (tier D until its definition is hashed)

Question. "Hoeveel stikstofdepositie komt van mobiele werktuigen, per Natura 2000-gebied?"

Description (not a test). In the RIVM M2025 data file, the sector "Mobiele werktuigen Bouw en Industrie" gave 12,4 mol N/ha/yr on the Natura 2000 habitat mean in 2023, against a calculated total of 1.427,4 mol N/ha/yr, which is 0,87%, or 0,91% of the measurement-corrected mean of 1.365,0 mol N/ha/yr. Machinery used in construction is counted under Mobiliteit, not under Bouw, so the sentence "construction is only 1%" is not supported by it.

Why the share is not yet defined. The file splits mobile machinery into four sectors and five years, with two possible denominators and a choice between M2025 and M2026, which makes more than 40 variants of "the share". A one-page definition is hashed first. Proposals, not decisions: all four mobile-machinery sectors, with "Bouw en Industrie" alone as a sensitivity; 2023 (the latest measured year in M2025), with 2025 as a sensitivity; share of total deposition, matching the national figure; and whether M2026 replaces M2025.

Pre-stated distributional test. Supported if the median area share is under 1% and at most 10 areas have a share of 2% or more. Refuted if the median is 1% or more, or if more than 10 areas reach 2%. Tier D only after the definition is hashed and before any per-area value is read.

5.7 H-UITSTOOT (tier E)

Question. "Hoeveel stikstof stoot de bouw van één woning uit?" A test that compared two of StikstofNu's own scenarios (all inputs high at least 4 times the realistic ones) was dropped, because it would measure the scenario design, not the world.

Description. The StikstofNu AERIUS 2026 runs give 2,92 to 3,89 kg NOx for the realistic construction phase of one dwelling and 18,96 to 20,84 kg with all inputs high (AERIUS proposal v9, table of runs). Emission is never to be read as deposition.

External test. Against published small-project calculations (the shared frame, not StikstofNu's own runs): StikstofNu's realistic range per dwelling (2,92 to 3,89 kg NOx) lies within the interquartile range of the printed construction-phase NOx total per dwelling in published files. Refuted if the realistic range lies wholly below P25 or wholly above P75 of the published distribution. Minimum n: 20 published files with a printed NOx total and a dwelling count; below that, not evaluated. A realistic range that straddles P25 or P75 (partly inside, partly outside) is neither supported nor refuted by this rule, and v10 gives that case no label; this paper adds none, and a label would have to be hashed before any published value is read (section 11). The test can fail in both directions and does not depend on scenario labels. It needs new Connect runs only for any new standard-dwelling scenario; the test itself uses the two existing realistic runs and published files. Any everyday comparison factor must be sourced (Emissieregistratie, TNO, CBS); none is assumed.

5.8 H-ELEKTRISCH (tier C)

Question. "Hoe oordelen rechters over elektrisch bouwmaterieel in de voortoets?" Claim: among rulings from 2023 to 2026 that decide whether electric or emission-free equipment may count in a voortoets, more treat it as mitigation than as a secured project feature. Refuted if acceptances at the voortoets stage without a securing requirement equal or outnumber the rest. Rulings that do not decide the point are counted separately. Count and quote only; the claim waits for the final corpus, and the live pages that discuss the topic are fixed first (owner decision).

Related verified rulings used for orientation, not as results: a built-in project feature is not a mitigation measure (Logtsebaan, ECLI:NL:RVS:2021:71 r.o. 9.10, concerning air scrubbers in a pig house, not building equipment); and, in provisional relief at first instance, equipment that is demonstrably owned and used can count as a standard feature once its use was secured by a permit condition (RBOBR:2026:6238, r.o. 5.4 and 5.5, 28 August 2026).

5.9 H-001 (tier C), reframed

Question. "Heeft de Afdeling sinds Porthos een kleine, tijdelijke toename aanvaard zonder ecologische analyse?"

Why it was reframed. The earlier claim ("acceptance occurs only where a project-specific ecological substantiation was given") is refuted by its own cited evidence. In Barneveld (26 October 2022), the report rested on an AERIUS result and concluded that "een beperkte toename van maximaal 0,01 mol/ha/jr voor een tijdelijke periode" had no significant effects (r.o. 17.2), and the Afdeling held that the council could rely on the report, which concluded that significant effects were excluded "gelet op de beperkte en tijdelijke toename", with no project-specific ecological study in its reasoning (r.o. 17.3). Porthos (16 August 2023) r.o. 17.1 then requires an ecological analysis for a voortoets, also for a temporary and limited increase.

Claim, pre-stated. In Afdeling rulings published after 16 August 2023 that decide on a small, temporary construction-phase increase without a passende beoordeling, the answer to "accepted without a project-specific ecological analysis?" is no. Refuted by any post-Porthos ruling that accepts such an increase without an ecological analysis, where the absence of an analysis was raised in the appeal.

Coding. Per ruling: date (before or after 16 August 2023), value and duration, whether an ecological analysis was present, whether its absence was raised, and the outcome. Rulings where the point was not raised are counted separately and never refute. Barneveld is listed as the documented pre-Porthos counterexample, coded "point not raised" as far as r.o. 17.3 shows. The result is never summarised as "0,01 is fine". StikstofNu does not deliver an ecological analysis, and the page says when one is needed. Blocked: it waits for the final corpus.

5.10 H-AFSTAND (tier E)

Question. "Hoe snel neemt de berekende stikstofbijdrage van een bouwplaats af met de afstand?" Carried unchanged from hypotheses v2 into v10.

Claim. Per kg NOx, the highest calculated contribution of a construction site falls by roughly an order of magnitude between about 0,3 km and about 2 km from the nearest mapped habitat, with a wide band from emission size, bearing and habitat setting. There is no single distance below or above which a calculation is or is not needed.

Refuted if controlled runs show the per-kg contribution falling by less than a factor of 3 between 0,3 and 2 km on most bearings.

Method. A desk fit of the published decay curves is a model extrapolation from four files [free]. The real test is controlled AERIUS Connect runs of one standard dwelling at about 0,3, 0,6, 1,2 and 2,1 km, on at least two bearings and in at least two habitat settings (owner decision). A curve with a band is the output, never a threshold; distances are measured to the nearest mapped habitat, not to the Natura 2000 boundary, to 0,1 km, with bearings in octants.

5.11 H-AERIUS2026 (tier E)

Question. "Wat verandert AERIUS Calculator 2026 voor kleine bouwprojecten?" The claim is carried unchanged from hypotheses v2 (section 7.6); v10 lists the item in its ranking table without restating it.

Claim. Re-entering 2024 or 2025 small-project inputs in AERIUS Calculator 2026 changes the highest printed value by less than a factor of 2 in most files. Refuted if the median paired ratio is outside 0,5 to 2, or if in at least 1 in 5 files the printed result changes category ("-" to a printed value or the reverse). The free part is the release notes and the update report; the quantitative part needs Connect re-runs (owner decision). The wording is "may need a new calculation", not "usually" (quoted from hypotheses v2, which is in the private research archive and not in this repository).

5.12 Answered, merged and removed

  • H-ZELF (answered). The instrument list was chosen and read before anything was hashed, and the outcome is known: in the listed instruments (Omgevingsregeling art. 4.15, 6.15, 7.197h and Bijlage II; Bkl 8.74b and 10.24; Ow 16.53c) no provision names a required certified, registered or named expert. It is therefore a dated descriptive inventory, not a test. Completeness is a judgement: the list omits, for example, the provincial omgevingsverordeningen, the Bal and the AERIUS conditions of use. If it is ever published, the page says "the listed rules name no required expert, as read on [date]", lists the instruments read and the ones not read, keeps the conflict-of-interest line on top and a not-advice line, and never says "anyone may do it".
  • H-STAL is merged into H-VERGUNNING as a descriptive stratum (5.1).
  • Removed from the list (reasons as in hypotheses v2): H-PRIJS (fails the conflict-of-interest and title gates), H-AUTO (fails the title gate, a comparison slogan; folded into H-UITSTOOT), H-FOUT (fails the legal and re-identification gate; internal quality control only).

6. Shared measurement procedures

These procedures serve H-RKO, H-UREN and H-SLOOP, which read the same files.

6.1 Parser freeze

Row reading uses two scripts, code_harvest_v6.py (d393396f...b0e7) and ocr_harvest_v5.py (23837130...ba1d), frozen at their hashes and re-listed in the v8 hash block. A hashed driver (route1_driver_v8.py, 95a3e418...3e79) checks both hashes before importing them and refuses on a mismatch. The driver changes no row-reading function. It does change the frozen module at run time, in the open and in the log: it replaces the merge guard by the cross-document guard, sets ROUTE, F and PROCS from the environment, and swaps the footer stop for the footer and reference pattern only inside the named sensitivity, restoring it afterwards. The freeze is therefore self-enforced by a hashed and logged driver. Any parser change after the first route 1 file is a deviation (D5) reported with both error rates.

6.2 Every collapse is listed and judged

Identical rows within one document are counted once (the printout repeats a source per situation). Within a document, every collapse is listed in route_collapses.csv and judged "repeat" or "two machines". Across documents, every deduplicated row whose copies come from more than one document is listed in route_collapses_cross_document.csv, one line per document pair, with each copy's page, situation label and type and whether the other copy passes the situation filter. The visual check judges each pair "same calculation repeated" or "separate calculation" on the page images of both documents.

6.3 A corrected figure beside every primary

The frozen primary is never changed. Every route 1 statistic is printed with a corrected figure beside it, not in a footnote, and with the number of corrections. The corrected figure adds each extra occurrence judged "two machines" and each copy judged "separate calculation"; added hours enter a situation-filtered series only when the added occurrence passes the filter, and the crane series only for crane class L or U. Wording: "<primary> (frozen parser; known parser error: <reason>) | corrected <value>". The correction and rate scripts refuse to print while any verdict or cell is blank. Cross-document "separate calculation" verdicts are reported as a dedupe error count and rate, apart from the row error rate. Label: "single coder; checker also tuned the parser".

6.4 Situation misattribution

The frozen situation function can assign realisation-phase rows to the saldering situation (shown on one route 2 project, 012). Without the second export of that project, its situation-filtered value would be 0,0 instead of 264,0, and one further row (52 h per dwelling) fails the filter in every copy; with the correction rule applied to it the value is 316,0 (section 7). H-RKO is unaffected. Every filtered statistic with a row whose situation was misattributed is printed as "<primary> (frozen parser; known parser error: situation misattributed, checked on the page image) | corrected <value>", plus the situation-error count and rate. In the hashed route 2 files the count is 11; the rate cannot be computed, because the verdict file lists only the rows judged wrong (section 7).

6.5 Verdict order and the earlier-block gate

Pair and situation verdicts are entered from page images first; image hashes or crops are stored; the verdict file is hashed in an earlier block than the corrected outputs. The v9 script only checked that a verdict hash was listed somewhere in the hash file, and accepted a loose substring match. The v10 script (corrected_figures_v10.py, ea62a0af...00ab, protocol H-UREN v1.7) refuses to run with --require-hashed-verdicts unless the verdict file's sha256 appears as an exact sha256 path line in an earlier block than the corrected outputs (or in the open next block). Offline fixtures refuse a same-block listing, a later-block listing and a substring-only listing, and accept an earlier-block listing; they were re-run for this paper on 25 October 2026 and all passed. The real hash file was accepted after BLOCK 1 and printed 11 situation errors and 11 situation verdicts.

6.6 Second coder

For an A grade, a second coder, blind to the first coder's verdicts, judges a random sample of route 1 pairs (all pairs if at most 10, otherwise 20% with at least 10, seed fixed in the hash block), with agreement reported. This needs the owner's approval. For an A- the corrected-figure rule plus the all-separate bound is enough (the internal review's ruling on v8).

6.7 Engines and harness

The driver and the harness log the tesseract version (5.5.0) and the pdftotext version (25.03.0) in the run log and the driver report. The harness writes its temporary checksum file inside the run directory and excludes it from the output checksum list, so that no temporary file is left in the parent directory.

7. What exists today (as frozen on 23 October 2026)

No result of a tier B or D test exists. The H-VERGUNNING fresh data cannot exist before 19 November 2027, the route 1 collection for H-RKO has not been run, and no request of any kind has gone to the public search service for route 1 (count-only included). Route 1 coding, the eight-province baseline and a second coder have not been started.

What exists is the following.

Route 2: the parser calibration set. Seven projects (003, 009, 012, 015, 016, 018, 019) run through the frozen parser. They were used to calibrate the parser and carry no evidential value for any claim. Table 3 gives machine hours per dwelling.

Series003009012015016018019
Dwellings2114256
All mobile machinery, frozen parser (primary), as entered6,520,0316,0500,51107,026,830,0
Same, corrected6,520,0316,0575,51107,026,830,0
Corrections counted0001000
Situation filter (post hoc), as entered6,520,0264,0250,5132,026,830,0
Situation filter with the v1.6 situation correction applied (arithmetic in this paper, not in the hashed script)6,520,0316,0250,5132,026,830,0

Table 3. Machine hours per dwelling on route 2 (description only; no row is a result). Source: corrected_figures_v10.csv (3f894517...43c4). For project 015 the frozen parser collapsed two machines into one, confirmed on the page image (two different stage classes and build-year bands, and two different NOx emissions, 42,3 and 62,7 kg/j); the corrected figure is 575,5. The crane values are 40,0, 48,0 and 10,0 (projects 015, 016 and 019). Further sensitivity series (earlier unit rules, flagged rows excluded, a literal reading of the later rule, and a bound that counts every cross-document pair as a separate calculation) are in the hashed run outputs; the bound only shows how much a wrong dedupe could have moved route 2.

Cross-document judgements. 32 rows have copies in more than one document, in 38 pair lines over 8 document pairs, with 1.514 h in the extra copies. The pages holding the rows and the page with the situation header were rendered, compared side by side and then deleted; the verdicts are 8 of 8 pairs "same calculation repeated" and 0 "separate calculation", cross-document dedupe errors 0 of 38 pair lines. Single coder; the checker also tuned the parser and had seen the text-layer judgement, so the check is not blind. It is auditable because the page-image hashes (28 pages) are stored.

Pair groupLinesSame situation headerRows identicalWhat the second document is
009 D04 / D063yesyeslater re-export of the same planned situation
012 D01 / D031yesyessecond export, same date
012 D02 / D0410yesyessecond export of the realisation phase, same date
015 D06 / D081yesyessame planned situation with a reference situation added
016 D03 / D053yesyessame planned situation with a permitted reference situation added
018 D03 / D058yesyessame construction phase with a saldering reference added
018 D03 / D066yesyesD06 embeds the D05 printout as its pages 33 to 42
019 D02 / D046yesyessame construction phase with a saldering reference added

Table 4. Cross-document pairs on route 2.

OCR sheet. The 72-row OCR visual-check sheet is filled: 72 of 72 cells; field error rates all 0; row error rate 0; within-document "two machines" 1; cross-document "separate calculation" 0 of 38. It is not blind and is auditable on the private archive.

Situation errors. The situation function misattributed rows in project 012: all 11 rows of the situation verdict file have situation_ok = n (10 rows in document D02, 1 row in document D01). The 10 D02 rows pass the situation filter only through their copy in D04; without that copy the filtered value of 012 would be 0,0. The D01 row (a private mower, 52 h per dwelling, copied in D03) fails the filter in both of its documents. Protocol H-UREN v1.6 section 1 says that the corrected figure adds such a row's hours under the page-image situation, so the corrected situation-filtered value of project 012 is 264,0 + 52,0 = 316,0 as entered, which equals its unfiltered primary. The hashed script and its CSV print 264,0 with "corrected identical", because the script adds hours only for rows marked apply_sit_hours = y, a column that the hashed verdict file does not have; its situation-correction total is therefore always 0. This paper does not alter the hashed script, verdict file or CSV; it states the corrected figure as the arithmetic result of the rule, computed in the self-check from the hashed harvest rows and verdict file, and the 264,0 of the CSV stays visible beside it (Table 3). Only project 012 has rows with situation_ok = n, so the other six projects are unchanged, and no H-RKO figure is affected. The rate that v1.6 asks for (rows with situation_ok = n over rows checked) cannot be computed from the verdict file, because it holds no row judged correct; the count is 11, from one project of seven, and a route 1 verdict sheet should record every row checked. The v9 JSON had reported 12 errors where the CSV has 11; the v10 JSON reports 11.

Driver and harness checks. Clean check runs A and B (v8 and v9) with ROUTE=2 and the same harness produced 359 outputs each plus the sums file, byte-identical except the run log (timestamps); the output checksum file of 360 lines (no self entry, no temporary file left) is 6193a89c09f71e91a12856c625eef263ad6bef067f22fe8851b4cf9a384ad672 for the v9 check run A. Results: guard merges 0; within-document collapses 1; cross-document rows 32, pair lines 38, 1.514 h; footer and reference stop only: 58 rows against 58, no number differs, 9 names differ (three projects). Route 2 says nothing about the parser's accuracy.

Disclosures. The category stop words were chosen after seeing three project names and are numerically inert on route 2. Route 2 has no evidential value for the parser. Any citation of the earlier development figures cites the v6 erratum. The v8 route 2 check was neither blind nor auditable (disclosed); from v9 the page-image hashes are stored. The v8 driver and the route 2 development run (23:36:59 to 23:40:37) predate the H-RKO addendum v1.1 (23:50:18) and H-UREN v1.5 (23:51:30); the v8 section 9.1 omitted the protocols from its order list. This is harmless on route 2, which has no evidential value, and it is stated here.

8. Falsification at a glance

IDClaim in one lineSupported whenRefuted whenOtherwise
H-VERGUNNINGCount of 1 to 4 dwelling procedures changes by no more than a factor 2 (Y-next vs Y-post)not refuted and two-sided 90% interval of RR within 0,5 to 2two-sided 95% interval of RR excludes 1inconclusive; "not interpretable" if comparability fails; "no verdict" on unreadable share or count-unknown; "cheap re-count only" if k_post(12) is too low
H-RKOAt most 10% of narrowed-frame calculations reach 0,5 mol/ha/jU(w) at most 10%, "for a provincial-route share up to w*"L(w) above 10%, "from a share of ...""inconclusive for every w"; "not evaluated" below n1 of 36
H-URENPooled P90/P10 of crane hours per dwelling on new files is at least 5P90/P10 at least 5 in both seriesunder 33 to 5 "narrower", no verdict; "inconclusive (typo-sensitive)" if series disagree; "not evaluated" below 20 files
H-SLOOPMedian demolition share of construction NOx is at least a thirdmedian 33% or moremedian under 20%20% to under 33% "inconclusive"; "not evaluated" below 15 files
H-GEMEENTEFewer than half of the top 20 gemeenten publish a stikstof submission requirementfewer than 10 publish one10 or more publish onenone; tier D until the list is hashed
H-MACHINESMedian area share under 1% and at most 10 areas at 2% or moreboth holdmedian 1% or more, or more than 10 areas at 2% or moretier D until the definition is hashed
H-UITSTOOTThe realistic range per dwelling lies within the interquartile range of published filesrange within P25 to P75range wholly below P25 or wholly above P75"not evaluated" below 20 files
H-ELEKTRISCHMore rulings treat electric equipment as mitigation than as a secured project featuremore as mitigationacceptances without a securing requirement equal or outnumber the restrulings that do not decide the point are counted apart
H-001After Porthos, no acceptance of a small temporary increase without an ecological analysisnone foundany post-Porthos acceptance without analysis, where its absence was raisedrulings where the point was not raised never refute
H-AFSTANDPer-kg contribution falls by roughly an order of magnitude between 0,3 and 2 km(a curve with a band is the output)less than a factor 3 between 0,3 and 2 km on most bearingsneeds Connect runs
H-AERIUS20262026 changes the highest printed value by less than a factor 2 in most filesmedian paired ratio within 0,5 to 2 and fewer than 1 in 5 files change categorymedian paired ratio outside 0,5 to 2, or at least 1 in 5 files change categoryneeds Connect re-runs

Table 5. Decision criteria. For H-GEMEENTE, H-MACHINES, H-ELEKTRISCH and H-001 the "supported" column restates the complement of the refutation rule; the source states only the refutation rule. For H-AFSTAND the source has no "supported" rule, only a curve with a band as output. For H-UITSTOOT, "supported" and "refuted" are not complements: a realistic range that straddles P25 or P75 is neither, and v10 gives it no label (section 5.7).

9. Limitations

  1. No test has produced a result. Everything in section 7 is calibration or infrastructure.
  2. Single coder. All counts are single-coder. The self re-code is self-agreement only, and a blind second coder has not been used. The visual checks are not blind.
  3. Seen before the rules. The H-VERGUNNING rules are not blind to the existing windows; the H-RKO frame is not blind to route 2; the H-UREN rules are not blind to the existing frame. The design handles this by downgrade-only rules on existing data and by testing only on fresh data (section 4.3).
  4. Frames are narrow. H-RKO speaks only for the narrowed Gemeenteblad frame mixed with the provincial route; the term filter may select on a variable related to the outcome. H-VERGUNNING counts notices of four provinces first and twelve for the fresh test; "natura" is the primary query for every window.
  5. Power and independence. The H-VERGUNNING test has low power at small k_post, and "supported" under a true halving or doubling is rare (Table A1). It can detect a change of the count, not confirm its absence, and its wording says so. The intervals assume independent notices; overdispersion would make "changed" too frequent (section 5.1), and the rule fires at changes well below a factor 2 (Table 1b).
  6. C2 is structurally unlikely for H-UREN and H-RKO. The available n is small, and many calculations are not published (attachments are online for 7 of 29 provincial procedures).
  7. OCR and parsing. Values read by OCR are labelled; unreadable values are counted and never estimated. The parser's accuracy is unknown until a route 1 sample is checked.
  8. The legal reading is secondary for three EU rulings. Waddenzee, People Over Wind and Eco Advocacy are verified against secondary copies; the primary fetch of the official text was blocked (Appendix B).
  9. Phases. The construction phase is not the whole project. The use phase also contributes, and no source read defines how a floor would treat phases.
  10. No causal claim. No count in this programme supports a statement about why numbers moved. Several changes overlap in time (Omgevingswet, provincial policy, case law).
  11. Estimates are labelled. The 0,5 l/h plausibility limit, the usefulness column and the evidence column are judgements.
  12. Dated, and not blind to later work. This paper reflects hypotheses v10 as frozen on 23 October 2026. Later work (new AERIUS Connect validation jobs and an offline replica of the calculation chain, run on 24 October 2026) is not part of v10 and is not described here, but its results are now known to the author (section 4.3). A later version should state how it bears on H-AFSTAND, H-UITSTOOT and H-AERIUS2026.
  13. Self-hosted registration. Hypotheses v10 and the thresholds of eight of the questions are not hashed, and no hash has an external timestamp (Table 1a). Point estimates for H-UREN and H-SLOOP are decided without sampling uncertainty at n of 15 to 20 or more; the interval is reported with the verdict but does not enter it.

10. Reproducibility and hash information

10.1 Source and hash chain

Itemsha256Where
hypotheses-v10.md (source of this paper)fbc5025fdf77042ab1653cf3e85c719a685f17bb74d8377e07ad15a8f4ae7c46proposals/
hypotheses v10 changelog (append-only)278ee60d47cecbad0ecd0ae2ada7843a4c956da5ccf9fb72b325d42f8a0dc53bchangelogs/
PROTOCOL_HASHES_hypotheses_v10.txt (two blocks)0daa5201b00c5f34637432a6c05399879422d80c8c8a331c189288d2653d25fcprotocols/
chain through BLOCK 1 (recorded in BLOCK 2)6556d3f092dd74c06f5a2fa8588aa7594eff33d66172d202439f23c20e30bf74inside the file above
PROTOCOL_HASHES_hypotheses_v9.txt (unchanged)fabc89a01e5a40599615be46076a1099d262093b0dc706f4e24d67aaecc6a882protocols/
PROTOCOL_HASHES_hypotheses_v8.txt (unchanged)af122f4898829e296c06c3cbab8bbe0901b3f1a015ad6e47e6872021d6264014protocols/
corrected_figures_v10.pyea62a0af2f47a1842e8b94977249fb23982347501eb06e79e9df195aa3c800abhypotheses_v10/
corrected_figures_v10.csv3f8945179ebfb7d4adc135787950f6a70fc39d2702ed4421e270d6d275e743c4.../visual_check_route2/
situation_verdicts_textlayer_v10.csv (11 rows)80f240c7d44913b42bcb49df2b165dc6b509dfd07009f60717862c728d6bad04.../visual_check_route2/
oc_reporting_v1_4.json2a557a62b1ad4fd9cde7fafa86bfe7d94e68fd613ef272d883b48c09b66361dfpaper-c-data/
oc_band_check_v8.json5b6510ce36d2f7ed72fc94fbc5f700e69c4c64b9b3111a2fef3a2332c18de800paper-c-data/
oc_vergunning_v1_2.json9c96576f8a2c754bc48059d5f1ba17d8caece6bcc068d83f1a5807d8fbad01b4paper-c-data/

Table 6. Files in the repository. oc_vergunning_v1_2.json is listed with its hash in EXTERNAL_DATA.tsv and, since 2026-10-26T14:35:02+01:00, in block 2 of PROTOCOL_HASHES_hypotheses_v10_addenda.txt; that is a registration after the fact, not a record that predates the results. Its generating script oc_vergunning_v1_2.py is hashed (Table 7).

Protocols and scripts that are held in the private research archive and listed with their sha256 in EXTERNAL_DATA.tsv:

Protocol or scriptsha256
H-VERGUNNING protocol v113c4a2fa5a163f15bc5dc7e66701424f868fc32d71ec002d3a5df555780105f9
H-VERGUNNING v1.1 (D1)3d8f47fb8747622d3e38a7ce71bf2337f384dd403359bac3db8f68f65a35ff39
H-VERGUNNING v1.2 (D3)ab41febfc6768941a8e423718a8963631ed83782fbaff3235485aa2d9bd57777
H-VERGUNNING v1.3 (D4)cd821d3e5f97d1d727dcf706f9a51ffdfca423eb23c49613f2491684cc97883f
H-VERGUNNING v1.4 (reporting)e1fbcbfadea210d4610bf4e8187be67cdd4b7cb884dcf06bd8bf8ce49fbbe5a2
H-VERGUNNING baseline sheet v1.38d330989718566a5bb6d4d5e2f819e75ccdde67b34af3fe8a6920cae07012d65
H-RKO framing v10cf4191edefdcc653af399ef778dfb2befd870d14b46f3b3fc9e92402a6decbe
H-RKO route 1 protocol v14aac91a2e87de8f327428d4021f1d9057b1b7180357d87f943f8df052c19a762
H-RKO addendum v1.1e9c87affec962c46ad74bc5f58bb4238fbd837977e98fa3d472da97e267444d2
H-RKO addendum v1.297b1708104e49b85f0b987d6d571fd9f54ee31464758f0d326f14a4b3f57bdc3
H-UREN v1561fabfd88ed422a3f714c7cd5dddfd114b299ed030f9323f944b2dcf5edd462
H-UREN v1.15f75d5c6a543c0ac4aaf91494e3f2ead4da22358fccf17799a7f74888d41deda
H-UREN v1.24e44a24b16511ab62f099571ba7519bf19513f3d86caefb2db1769640240177c
H-UREN v1.3fa8048066622b4e9b512ad233d7101cf50cdad7b9921126233fa78493666e557
H-UREN v1.45c7403b4cb420bd302b7f70010df2933b32f5e376b95603d6b273250e20a299f
H-UREN v1.52261b2e3eb9bdec3aaf1ed07d490d35a8f7f9a84ecc0f711008b985ef224b1bb
H-UREN v1.69abd69260e6aec094c5413b6aed0c0bf18d96b3581a1427420c5a5faa13abb09
H-UREN v1.703d6c15ee23a67545ca7a4f0a2256cb131aa559595e45b2820df35ffee1bb8b4
collect_route1_v2.py755e1929650699b27b8804442572897890029eb5b9ee5132d0a1749f3dc9b301
code_harvest_v6.pyd393396f7a5b4ccd0ca65548ba664a6f705c347c4c20ced75687fe701735b0e7
ocr_harvest_v5.py23837130e8c65118445a1bc10de0ca93c0f38b98227ad334586c9630b6cbba1d
route1_driver_v8.py95a3e418ebe2fb91be74333a131e511c146b99e9eb90e2c7ab17ac0607823e79
corrected_figures_v8.py1766f228fedcd329b58a4aea208317d36fbec1af10fe55dad9fc89894ced5453
corrected_figures_v9.py (superseded by v10)e79d51f102b1631d1b2b8746db90049f4d0dca86e01b78a2349a832208f72fb4
visual_check_rates_v8.py810535c2c4d623dfacdeb95144e5415f9d8d09a52d1174cd6004db56d7c623d9
run_harness_v8.sh971b9f6c80218e583c8e485e533e5acee87c8919554a11516acb2f0fd7206305
oc_vergunning_v1_2.pye69c7f8d9f6fa61c526c25aff0473d0c67f91ab41884f7a8a7de084acb334229
oc_reporting_v1_4.py5cb75da681ab3def1cc708b531610be2e56c4e4749bd0eefc90a59ccf3c4dce9
oc_band_check_v8.pya396d866eac400f0b3c16e3d913d3be59dd8c7ff5bc9e41c7e1e4b1bc03e9571

Table 7. Protocols and scripts in the private research archive.

10.2 Block order

Protocols H-UREN v1.2 and v1.6 and the corrected-figures script v9 came before v9 BLOCK 1 (2026-10-23T15:04:04+02:00), which also holds addendum v1.2 and the filled route 2 sheet; the collection script v2 and its query specification are in v9 BLOCK 2, and BLOCK 3 holds the clean runs, rates, corrected figures and refusal tests. All three v9 blocks carry the same timestamp, so their order rests on the hash chain (section 3.1). The v10 blocks are described in section 3.1. Times are machine times in the Europe/Amsterdam zone, and the hash-block timestamps are the only authoritative times.

10.3 What was not re-run

The clean check runs A and B were run for v8 and v9, not again for v10. This paper cites the v9 check-run checksum (section 7), as the v10 source does. The source holds that a re-run is not owed because no input of the clean runs changed in v10. That statement is limited by the one hash question in section 10.5 (the corrective block appended there does not change this): one hashed output (corrected_figures_v10.json) does not match its recorded hash, so "no hashed file changed" cannot be shown for that file.

10.4 Self-check of the figures

paper_c_selfcheck.py (standard library only) checks this paper in six ways and lists what it does not verify.

Recomputation. The H-VERGUNNING decision rule is implemented twice (exact binomial coefficients with a Clopper-Pearson bisection, and a second formulation by tail probabilities that agrees with the first at every tested point). The script reproduces every cell of Table A1, the supported bands, the statements on k_post 60 and 68 to 72, the thresholds 22 and 32, the scan over k_post 1 to 100 (maximum 1,70% at k_post 69 and 0,25% at k_post 20), the boundaries of Table 1b and the overlap ranges of 5.1. It also recomputes the share arithmetic, the existing-window rate-ratio bounds, the minimum route 2 sizes, U1 and w*, the six series of Table 3a from an anonymous value extract, the route 2 rows of Table 3 from the corrected-figures CSV, the situation correction of project 012 (264,0 + 52,0 = 316,0) from the hashed harvest rows and verdict file, and the pair groups of Table 4 from the hashed cross-document CSV.

Locking. The numbers that this paper prints from those computations are rendered by the script and must occur in the paper verbatim, with the expected count: Table A1 and the sentences on it, Table 1b, the sentences on the scan and on the overlap ranges (including where the overlap starts), Table 3, Table 3a and its spread, and the threshold phrases of the hypotheses. Four key numbers (listed in the script as KEY_TOKENS) may occur in the paper only inside a locked string.

Pre-stated prediction. The phrases of the H-UREN prediction in 5.3 (both thresholds, the agreement condition and its narrowing, minimum n, interpolation, bootstrap and seed, strata, the with-and-without rule) must occur in the paper, and each phrase that has a counterpart must also occur in the extracts of protocols H-UREN v1 (section 4) and v1.1 (sections 0, 3 and 5), kept in the data folder with the hashes of the protocols. The 18 threshold phrases are counted against a committed counts file (paper_c_threshold_counts.json, taken from an earlier text of the paper, with the three changes since listed in it), and each must occur in the paper at least as often as in hypotheses v10. Hypotheses v10 states several of these thresholds only by reference ("Unchanged"), so the extracts and the earlier counts, not v10 alone, carry that check.

Freeze of the text. The quoted figures (the notice counts, the test windows, the hash-block times, "7 of 29", "62 days", "1,1 l/h" and the like) have no source file in this repository, so the script cannot show that they are right. It freezes them, and with them the whole text of the body: it records a hash of every sentence in order and the number of non-empty lines of every section (paper_c_freeze.json). Any later change of a word, a number, a unit or a sentence, and any deleted, added or moved sentence, fails the check until the freeze is deliberately re-recorded (--record-freeze), which shows in the diff. The freeze records what the paper says; it detects change and does not detect error. It cannot show that a passage that was already missing is missing; the previous paragraph covers that for the H-UREN prediction.

Re-recordings. Each time the freeze was re-recorded, and the changes behind it, are listed in paper_c_freeze_log.md in the data folder.

Mutation and coverage tests. --mutation-test, also run with the self-check, changes the printed and quoted numbers on a list, one occurrence at a time and then all together, and requires that the check then fails. --coverage changes every digit run of the body once, alters every word once, deletes every sentence once and every non-empty line once, and requires that the check fails each time. Not covered: the front matter; an edit followed by a re-recording of the freeze (it is visible in the diff); the files of the data folder other than through the hash checks below; and any error that was in the text when the freeze was recorded. The H-RKO threshold of at most 10% is among the mutated numbers.

How it is run, and the ways around it. The full self-check takes about ten minutes and is run by hand; it is not part of check_all or of continuous integration. check_all runs its fast layers (locked strings, text freeze, prediction phrases, threshold counts; a few seconds) through check_paper_c.py, which always reads the committed paper. These remain ways around it: an author who edits the paper can re-record the freeze (--record-freeze) and regenerate the manifest (build_manifest.py), and both then pass; the by-hand run accepts an override of the paper path (PAPER_C_PATH) and so can be pointed at another file; and the front matter is not frozen. The protection is that such changes show in the diff of the pull request, not that they are impossible.

Identity and presence. The sha256 of the repository files of Table 6 is checked, and so is the presence in the paper of the hash strings it cites. A threshold-token check tests only that listed threshold strings of the source also occur in the paper; it does not test meaning. The fidelity of each section to hypotheses v10 and the hashed protocols was checked by reading.

Not verified. The notice counts (1.170, 872 and 63; 0 of 2.876; the 0,6% to 1,1% notice ratio), the habitat-mean deposition figures 12,4 and 1.427,4 mol N/ha/yr (quoted from the physical-layer paper v8.2 and the RIVM data file; the RIVM source rounds 918,1 + 509,4 to 1.427,5), the kg NOx ranges (checked only as strings in the unhashed proposal table), the legal citations of Appendix B and the 99.507 identifiers are frozen, not verified, as described above. So are the counts taken from the private research archive that have no file in this repository, for example the harvest counts of 4.2 (64 CSV rows, 60 unique files, 70 files on disk, 68 PDFs, 61 documents), the attachment counts (7 of 29 procedures, 21 Gelderland procedures), the route 2 check counts (5 of 52 documents, 359 outputs, 58 rows with 9 differing names), the engine versions of 6.7 and the wording quoted from hypotheses v2. The corrected-figures script holds the counterfactual constants 0,0 and 264,0 as typed literals; they were checked by hand and by the harvest-row recomputation.

10.5 One hash question (corrective block appended)

BLOCK 2 of the v10 hash file (2026-10-23T15:12:12+02:00) records the sha256 145359687e65... for corrected_figures_v10.json; the file on disk hashes to b9c9fe7e93bd.... The file is dated 23 October 2026, 15:14:03, after BLOCK 2. Re-running the hashed script with the label "route2" reproduces the on-disk file byte for byte under one condition: the run directory must not hold a file named situation_verdicts.csv (or situation_verdicts_textlayer_v10.csv), which the script looks for first and which would be a copy of the situation verdict file. If it does, the script writes the path of that copy into the field situation_verdicts_path and the hash changes (both cases were run in a scratch copy for this revision). The recorded hash is not reproduced by any label, path or count variant tried, so the cause is not established; a re-run is a likely cause, because the script writes its outputs into the hashed output directory. The CSV and the script of the same block verify. The internal review confirmed the content figures. This paper cites the CSV, whose hash verifies, and uses the JSON only for counts that the CSV or a hashed protocol also holds (11 situation rows, 264,0 and 0,0), so no figure in this paper rests on the unverified entry alone. This is a provenance question, not a figure error. It contradicts a plain reading of "append-only" and of "no hashed file changed", and the same facts are stated in the abstract, 3.1, 10.3 and here. The v10 hash file and the JSON are not altered. With the owner's approval a corrective block was appended on 2026-10-26T14:33:29+01:00 as block 1 of PROTOCOL_HASHES_hypotheses_v10_addenda.txt, a new append-only file that lists the v10 hash file unchanged. The block records the sha256 of the JSON as it is on disk (b9c9fe7e93bd...) and states the facts above. It does not show that the BLOCK 2 value was ever the hash of a matching file, and the cause stays not established; the BLOCK 2 entry stays as written and the mismatch against it stays listed as known.

10.6 Files in the private archive

Raw harvest files, OCR text, page crops and run directories are not in the repository: they carry street names and coordinates (section 2, rule 9). EXTERNAL_DATA.tsv lists them by path, size and sha256.

11. Open items

Items that the hypotheses leave to a decision outside the desk, as listed in v10 and in the review.

  1. Confirm the bulk pull from the public search service for route 1; then run the collection script v2 once (version 1 is superseded), and code under the frozen parser. Needs the owner.
  2. Route 1 visual sheet with error rates.
  3. The eight-province Y-post baseline under the hashed sheet (single coder).
  4. A second coder; a reading of the three EU rulings in their official texts; the live pages on the 0,00 value and on the RKO. Needs the owner.
  5. Hash the H-MACHINES definition and the H-GEMEENTE list and sheet before any value is read or site opened.
  6. New Connect runs for H-AFSTAND, H-AERIUS2026 and new H-UITSTOOT scenarios need the owner. Validation jobs and an offline replica were run on 24 October 2026 after v10 was frozen; this paper does not use them (section 4.3). A later version states how they bear on the three questions.
  7. The Y-next collection for twelve provinces after 19 November 2027, and the fresh test with the three labelled figures.
  8. A corrective block for the corrected_figures_v10.json entry was appended (section 10.5). Still to decide: whether to hash hypotheses v10 and the thresholds of the other eight questions in a new block before anything is published. Owner decision.
  9. A label, hashed before any value is read, for a H-UITSTOOT range that straddles P25 or P75.
  10. Release gate for this paper: it is not for publication, and the open items above need the owner. The grade A- 9,2 belongs to the source, hypotheses v10, not to this paper.

12. Review items applied, and changes from the source

12.1 From the internal review of hypotheses v10 (review-hypotheses-v10.md)

Review itemApplied here
Section 3, optional polish: the v10 paper notes that clean A/B sums were not re-run and still cites v9's 6193a89c...d672; acceptable, a re-run is not owedStated in 7 and 10.3 with the full hash and its origin (v9 check run A)
Section 5, better framing: H-RKO as a Gemeenteblad or plan-amendment frame; permit stratum separate with its own n of at least 36Used as the frame statement of 5.2 and the permit-stratum paragraph
Sections 1 and 2, M4 and N7 closed: earlier-block gate, exact sha256 path line, substring refused; situation-error count 11Described in 6.5 and 7; re-run of the offline fixtures recorded
Section 5, steps to A (KOOP bulk pull; route 1 visual sheet; eight-province baseline; second coder, EU texts, live-page fixes)Section 11
Section 4, answers 2 and 3 (second-coder rule unchanged; KOOP waiting on the owner)6.6 and section 11

The review asks for no wording fix beyond these. Earlier wording rulings that the v10 source already carries are applied as stated: the retitled fresh-test question, the wording "no change larger than a factor 2 detected", the three labelled figures, the conditional verdict form of H-RKO, the "inconclusive: demolition supplies between a fifth and a third" label, and the "considered and set aside on the province's summary; legal basis not read" label.

12.2 Statements in hypotheses v10 that this paper does not repeat as written

Hypotheses v10 and its hash are unchanged. Line 80 of v10 reads that P(supported | halving) "stays under 1,5% at every k_post". That is true at the eleven values of Table A1 and false over k_post 1 to 100 (1,70% at k_post 69). Hypotheses v10 does not print the two existing-frame crane series (section 9.2 says "Unchanged from v6 section 9.2 (not rerun)"); protocol H-UREN v1, section 3, states two series, where the hashed rules of v1.1, section 3, require four (Table 3a). Section 5.9 reports the Barneveld passage (r.o. 17.3) as the report's conclusion that the Afdeling let the council rely on, where v10 says the Afdeling accepted it. The price of the StikstofNu report that v10 names in its H-SLOOP guardrail is left out here.

12.3 Changes from the source text (presentation only)

  • Claims, thresholds, minimum n, seeds, decision rules and hashed content are unchanged from hypotheses v10 and the hashed protocols. The H-UREN prediction of 5.3 (the 5 and 3 rules, minimum n 20, the typo-sensitive label, interpolation, the bootstrap with seed 20261021, the strata and the with-and-without rule) is restated from protocol v1 as amended by v1.1, and the self-check requires its phrases (section 10.4). Nothing in the hash chain or the append-only blocks was edited, and no hashed file was touched.
  • Internal labels are rewritten for a reader outside the project: decisions that belong to the owner are written "owner decision"; internal folder paths, file names of hashed outputs and the schedule in workdays are left out or moved to the hash tables; the questions to the reviewer (v10 section 10) are left out.
  • Material that v10 states as "unchanged from v2 to v9" is restated from the protocols that carry it (the H-VERGUNNING decision rule, the H-RKO route 1 protocol, the H-UREN prediction). Where the statement is carried from v2 and not restated in v10 (H-AFSTAND and H-AERIUS2026), the text says so.
  • Section 5.1 is headed "What the rule labels ..." where the other hypotheses of this paper use "What would falsify the claim" (a heading of this paper's template, not of v10), because the frozen order can label "refuted" an outcome that also satisfies the support rule. The live-pages rule is rule 7 of v10 section 1 and rule 10 in section 2 here.
  • Unit added where v10 gives a bare number: the national mobile-machinery figure is in mol N/ha/yr (physical-layer paper v8.2).
  • Internal disclosures are kept (section 4.3 and 7), and statements that the source marks as internal (no OCR line quoted, consultants unnamed) are kept as the rules of section 2.

Appendix A. Operating characteristics of the H-VERGUNNING fresh test

Poisson Y-next, equal exposure; Y-post count k_post as stated. "No change" means the true Y-next rate equals k_post; "halving" k_post / 2; "doubling" 2 k_post. The last column is the range of k_next that returns "supported". Sources: oc_vergunning_v1_2.json (no-change column and band) and oc_reporting_v1_4.json (the three labelled figures and power). The rows are generated by the self-check script and independently recomputed.

k_postNo change: supported / inconclusive / refutedP(supported | halving)P(supported | doubling)P(not refuted | halving)Power against a halvingk_next giving "supported"
1718,7% / 81,0% / 0,3%0,53%0,15%74,38%25,62%17 to 18
2040,6% / 59,1% / 0,3%0,71%0,25%66,72%33,28%19 to 23
2561,6% / 38,0% / 0,4%0,94%0,16%48,10%51,90%22 to 30
3077,8% / 21,9% / 0,3%1,12%0,16%43,19%56,81%25 to 38
3588,0% / 11,7% / 0,3%1,25%0,23%30,55%69,45%28 to 47
4092,9% / 6,8% / 0,4%1,35%0,20%21,25%78,75%31 to 55
4595,7% / 3,9% / 0,4%1,41%0,17%14,63%85,37%34 to 63
5097,5% / 2,1% / 0,4%1,46%0,20%10,01%89,99%37 to 72
6099,0% / 0,7% / 0,4%1,48%0,03%4,63%95,37%43 to 84
8099,5% / 0,0% / 0,5%0,66%0,00%0,66%99,34%57 to 107
10099,5% / 0,0% / 0,5%0,09%0,00%0,09%99,91%74 to 130

Table A1. Doubling at k_post 17: refuted 65,73%, supported 0,15%. At k_post 17 (four provinces) a true halving is refuted with probability 25,62%.

Appendix B. Citations and verification status

ItemUsed forStatusSource read
Barneveld, ECLI:NL:RVS:2022:3093pre-Porthos acceptance, H-001Verified in v2ruling text (hypotheses v2)
Porthos, ECLI:NL:RVS:2023:3129, r.o. 7 to 8, 17.1, 19no general threshold; analysis requiredVerified in v2ruling text (hypotheses v2)
Overduin, ECLI:NL:RVS:2025:2404, r.o. 1, 19.6backgroundVerified in v2ruling text (hypotheses v2)
ECLI:NL:RVS:2024:4923the 18 December 2024 ruling used as a dateVerified in v2ruling text (hypotheses v2)
Logtsebaan, ECLI:NL:RVS:2021:71, r.o. 9.10a built-in project feature is not a mitigation measure (air scrubbers in a pig house)Verifiedruling PDF
RBOBR:2025:1108, r.o. 5.5 and 5.6mitigation at the voortoets (first instance)Verified in v4ruling text (hypotheses v4)
RBOBR:2026:6238, r.o. 5.4 and 5.5demonstrably owned and used equipment as standard feature (provisional relief, first instance)Verifiedruling PDF
Omgevingsregeling art. 4.15, 6.15, 7.197h and Bijlage II; Bkl 8.74b and 10.24; Ow 16.53cH-ZELF inventoryVerified in v2 and v4statute text (hypotheses v2, v4)
Kamervragen (Aanhangsel Handelingen II 2025-2026, nr. 2720), answers 2, 3, 9 and 10the planned rekenkundige ondergrensVerified in v2zoek.officielebekendmakingen.nl (ah-tk-20252026-2720)
Overijssel suspension to 1 February 2027H-STAL confounderVerified in v6overijssel.nl
Gelderland 65% cap (Beleidsregels salderen Gelderland 2026, art. 5 lid 8; CVDR756662/1)H-STAL confounderVerifiedlokaleregelgeving.overheid.nl
Overijssel transition rule to 1 January 2030H-STAL confounder listVerified as stated by the province; legal basis not readoverijssel.nl
"Meer meten, robuuster rekenen" (15 June 2020), p. 14why small contributions are counted; "schijnnauwkeurigheid"Verifiedzoek.officielebekendmakingen.nl/blg-936485.pdf
People Over Wind, C-323/17, para. 40mitigation may not be weighed at screening[verified against a secondary copy; primary fetch blocked]a full copy of the judgment on a council consultation site; restated in Eco Advocacy para. 46
Eco Advocacy, C-721/21, para. 49features required for all projects of the type may be weighed at screening[verified against secondary copies; primary fetch blocked]EUR-Lex Czech text (index extract); English paras. 44 to 47 (index rendering); operative part 3 in English (OJ summary copy)
Waddenzee, C-127/02, paras. 44 and 45the legal test[verified against secondary copies of the EUR-Lex text; primary fetch blocked]secondary copies

Table B1. No item is left fully unverified. Three remain secondary-copy verified until someone reads the official text directly.

Appendix C. Abbreviations

AERIUS: the Dutch deposition calculator. KOOP SRU: the search interface of the official publications repository. RKO: rekenkundige ondergrens (planned calculation floor). RR: rate ratio. CP: Clopper-Pearson. Y-pre, Y-mid, Y-post, Y-next: the notice windows of Table 2. U(w), L(w): upper and lower bound of the share at or above 0,5 for a provincial-route share w. n1: number of route 1 projects with a construction result. COI: conflict of interest. OCR: optical character recognition.