feat(nl): add Netherlands public sector overlay - #739
Conversation
bbb5bf1 to
a934867
Compare
Code ReviewVerdict: Strong contribution — the registry work is more complete than most overlay PRs (it clears B5, the class that shipped broken in #432), and the two deliberate omissions are the right calls. Four things block merge: the Document Control marker is never resolved, the Dutch classification ladder has nowhere to render, and the overlay is absent from the four user-facing registration points Verified on BLOCKERS (must fix before merge)1. No command resolves All four templates carry the marker ( Nothing else resolves it at runtime — Fix — add to each command's write step, per - `${CLAUDE_PLUGIN_ROOT}/templates/_partials/RENDERING.md`
...
Resolve the `<!-- DOC-CONTROL-HEADER -->` marker per `RENDERING.md`.
2. The Dutch classification ladder has nowhere to render —
Minimum fix (this PR) — a per-command override line, CA precedent at
Proper fix (fine as a follow-up PR) — ship 3. The overlay is absent from all four user-facing registration points.
Net effect: IMPORTANT (should fix)4. All four commands verify per-type checks that do not exist. Each command ends with "verify all Common Checks plus the RBCLOUD / TBB / BIO2 / NLEXIT per-type checks pass" ( The PR body says the file is "the FR file plus four appended per-type sections" — it is byte-identical to FR, with zero appended. Instead it ships 14 French and Austrian per-type sections irrelevant to a Dutch assessment. To be fair, this is a pre-existing systemic gap, not one you introduced: the canonical file covers the FR/AT/EU codes but none of CA's
5. No citation traceability, despite Step 0b reading external documents. Every NL command reads 6. No
7. The governing instrument has no citable URL anywhere in the overlay. Every Key References row for the Rijksbreed cloudbeleid 2026, Cbw/Wwke, BIO2, the OBDO begrippenlijst, the Digitaliseringsstrategie and the Visie Digitale Autonomie reads "(not linked — verify current text …)". Only VIRBI 2025 has a real link ( 8. Please double-check the ministry attribution. "Herziening rijksbreed cloudbeleid 2026 (Ministerie van Economische Zaken en Klimaat, 3 July 2026)" appears in the CHANGELOG and in 9. No overlay guide in
MINOR (nits)10. PR body says "the converter now emits 30 NL files across the eight target formats". Actual is 64 ( 11. No build recipe — correct, and worth stating explicitly: only POSITIVE (worth calling out)
Recommended pre-merge sequence
Items 5–7 are fine to defer to a follow-up if you would rather land the overlay now — 1 through 4 are the ones that produce broken artefacts or an invisible plugin. |
…l silently (#741) A new plugins/arckit-<name>/ directory is not discovered automatically, and two of the hardcoded plugin lists report success while producing nothing: converter.py's PLUGIN_SOURCES (which cost arckit-uk-finance four releases of missing extension output) and the two marketplace manifests. Raised by @umag on #739, who found both by running the tooling rather than by reading this file. Claude-Session: https://claude.ai/code/session_01VKbHCujejpxkgvh47BndDE Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…742) The card credited "fixed stakeholder analysis generation" and "improved template formatting consistency". Neither matches their merged PRs. What they actually did, per #3 (2025-10-23) and #5 (2025-10-27): fixed markdown packaging into the built wheel, added Gemini CLI support across 21 commands, and created converter.py (33d3363, 48 lines) — the ancestor of the engine that now generates all seven non-Claude distribution formats. "First external code contributor" was the one accurate claim and is kept: the next external merged PR is #333, six months later. Open PRs #739 and #740 are deliberately not credited yet. Claude-Session: https://claude.ai/code/session_01VKbHCujejpxkgvh47BndDE Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Correction to my review above — blocker 3 was unfairReviewing #740 I checked what Blocker 3 above cited
Revised standing of blocker 3:
That leaves two real blockers on this PR, both of which produce broken artefacts rather than missing documentation:
The IMPORTANT items are unchanged, and item 4 in particular (the The contributing guide has been fixed so the next person is not caught the same way: #741 documents the overlay registration points that fail silently — including the two you found by running the tooling — and #743 names all four documentation files, drops the "if major feature" hedge, and adds the five places a command count goes stale. Apologies for the noise. The two remaining blockers stand. |
Blockers 1-3 and important 4-9 from the review on tractorjuice#739. BLOCKER 1 — resolve the Document Control marker. All four commands now read ${CLAUDE_PLUGIN_ROOT}/templates/_partials/RENDERING.md and resolve the <!-- DOC-CONTROL-HEADER --> marker in their write step, per the ca-pia.md precedent. Without this every NL artefact shipped a raw HTML comment where Document Control belongs. BLOCKER 2 — the Dutch classification ladder had nowhere to render. Applied the minimum per-command override: all four commands instruct the writer to use the VIRBI 2025 rubricering ladder (Ongerubriceerd / Departementaal VERTROUWELIJK / Stg. CONFIDENTIEEL / Stg. GEHEIM / Stg. ZEER GEHEIM) in the Classification row, replacing the UK line. The proper fix — document-control-nl.md plus RENDERING.md routing and userConfig values — is left for a follow-up as suggested. BLOCKER 3 — user-facing registration. Added to README.md (heading, overlay list, a Dutch command block, and the closing integration sentence), docs/DEPENDENCY-MATRIX.md (command list, inter-dependencies, typical compliance path), docs/index.html (jurisdiction card, keywords meta, structured-data feature list) and .github/CODEOWNERS (@umag @tractorjuice, mirroring the FR and AT pairs). IMPORTANT 4 — per-type quality checks. Added RBCLOUD, TBB, BIO2 and NLEXIT sections to the CANONICAL plugins/arckit-claude/references/quality-checklist.md, then re-ran sync-shared-assets.py. The PR body's claim that the NL copy already carried them was wrong: the sections were written into the synced copy and a later sync reverted them, which is exactly the trap you describe. PR body corrected. IMPORTANT 5 — citation traceability. All four commands now reference references/citation-instructions.md and name the instruments that must appear in the Document Register. IMPORTANT 6 — all four commands now call node scripts/generate-document-id.mjs <PROJECT_ID> <CODE> --filename instead of hand-rolling version detection, picking up the unregistered-code validation from tractorjuice#723 for free. IMPORTANT 7 and 8 — the governing instrument now has citable URLs, and the ministry attribution is confirmed rather than asserted. Both the policy PDF letterhead and the Kamerbrief metadata name Ministerie van Economische Zaken en Klimaat, Staatssecretaris W.J.M. Aerdts, 3 juli 2026: https://www.tweedekamer.nl/kamerstukken/brieven_regering/detail?id=2026Z15738&did=2026D35294 https://www.tweedekamer.nl/downloads/document?id=2026D35295 Kamerstuk 26643, nr. 1541 Good catch prompting the check — the missing URL was the reason it could not be verified from the PR. IMPORTANT 9 — added docs/guides/nl-overlay.md and a guides.html site link, then ran check-guide-parity.py --sync. Also adds the "Adding a new jurisdiction overlay" section to CONTRIBUTING.md, as requested, covering all nine registration points and flagging the two that fail silently (converter.py and sync-claude-plugin-layout.py), the shared-asset rule for references/ and _partials/, and the gitignored-extensions branch-switch trap. Full Python suite: 1249 passed, 225 skipped. All seven check scripts pass, sync-shared-assets --check and sync-claude-plugin-layout --check clean, markdownlint-cli2 clean repo-wide. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Thank you — that's a genuinely useful review, and two of the findings are corrections to claims I made rather than gaps I left. Pushed as Blockers1 — Document Control marker. All four commands now read 2 — the classification ladder. Applied the minimum per-command override: all four instruct the writer to use the VIRBI 2025 ladder in the Classification row, replacing the UK line. This was the sharpest catch in the review — 3 — user-facing registration. Added to Two corrections to my own PR bodyThe quality-checklist claim was false. The body said the NL copy was "the FR file plus four appended per-type sections". The sections were written — into the synced copy — and a later The file count was wrong. I said 30 generated NL files; it's 64. I'd counted a glob covering only two of the four command names and reported it as the total. Important 5–9Citation instructions referenced in all four commands with the instruments named for the Document Register; On the ministry attribution (8)Good question to ask — and the missing URL (7) is precisely why it couldn't be settled from the PR. It is EZK, confirmed twice:
Now cited in the commands:
Your instinct about the 2024 reorganisation was reasonable; it just happens that this one did come from EZ/EZK rather than BZK, notwithstanding that the 2022 policy it replaces was BZK's. CONTRIBUTING.mdAdded the section you asked for — "Adding a new jurisdiction overlay" — covering all nine registration points, and flagging the two that fail silently: without a VerificationFollow-ups I'd suggest, not in this PR
Also worth flagging: Happy to split any of this differently, or to rename |
Blockers 1-3 and important 4-9 from the review on tractorjuice#739. BLOCKER 1 — resolve the Document Control marker. All four commands now read ${CLAUDE_PLUGIN_ROOT}/templates/_partials/RENDERING.md and resolve the <!-- DOC-CONTROL-HEADER --> marker in their write step, per the ca-pia.md precedent. Without this every NL artefact shipped a raw HTML comment where Document Control belongs. BLOCKER 2 — the Dutch classification ladder had nowhere to render. Applied the minimum per-command override: all four commands instruct the writer to use the VIRBI 2025 rubricering ladder (Ongerubriceerd / Departementaal VERTROUWELIJK / Stg. CONFIDENTIEEL / Stg. GEHEIM / Stg. ZEER GEHEIM) in the Classification row, replacing the UK line. The proper fix — document-control-nl.md plus RENDERING.md routing and userConfig values — is left for a follow-up as suggested. BLOCKER 3 — user-facing registration. Added to README.md (heading, overlay list, a Dutch command block, and the closing integration sentence), docs/DEPENDENCY-MATRIX.md (command list, inter-dependencies, typical compliance path), docs/index.html (jurisdiction card, keywords meta, structured-data feature list) and .github/CODEOWNERS (@umag @tractorjuice, mirroring the FR and AT pairs). IMPORTANT 4 — per-type quality checks. Added RBCLOUD, TBB, BIO2 and NLEXIT sections to the CANONICAL plugins/arckit-claude/references/quality-checklist.md, then re-ran sync-shared-assets.py. The PR body's claim that the NL copy already carried them was wrong: the sections were written into the synced copy and a later sync reverted them, which is exactly the trap you describe. PR body corrected. IMPORTANT 5 — citation traceability. All four commands now reference references/citation-instructions.md and name the instruments that must appear in the Document Register. IMPORTANT 6 — all four commands now call node scripts/generate-document-id.mjs <PROJECT_ID> <CODE> --filename instead of hand-rolling version detection, picking up the unregistered-code validation from tractorjuice#723 for free. IMPORTANT 7 and 8 — the governing instrument now has citable URLs, and the ministry attribution is confirmed rather than asserted. Both the policy PDF letterhead and the Kamerbrief metadata name Ministerie van Economische Zaken en Klimaat, Staatssecretaris W.J.M. Aerdts, 3 juli 2026: https://www.tweedekamer.nl/kamerstukken/brieven_regering/detail?id=2026Z15738&did=2026D35294 https://www.tweedekamer.nl/downloads/document?id=2026D35295 Kamerstuk 26643, nr. 1541 Good catch prompting the check — the missing URL was the reason it could not be verified from the PR. IMPORTANT 9 — added docs/guides/nl-overlay.md and a guides.html site link, then ran check-guide-parity.py --sync. Also adds the "Adding a new jurisdiction overlay" section to CONTRIBUTING.md, as requested, covering all nine registration points and flagging the two that fail silently (converter.py and sync-claude-plugin-layout.py), the shared-asset rule for references/ and _partials/, and the gitignored-extensions branch-switch trap. Full Python suite: 1249 passed, 225 skipped. All seven check scripts pass, sync-shared-assets --check and sync-claude-plugin-layout --check clean, markdownlint-cli2 clean repo-wide. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
55a47b4 to
3f8c653
Compare
…#743) Step 5 said "update CHANGELOG.md" and "add to README.md if major feature". docs/index.html and docs/DEPENDENCY-MATRIX.md appeared only in CLAUDE.md, which contributors do not read, so PRs kept arriving without them — #739 and #740 both did. Reviewing against a requirement we never wrote down is our omission, so the guide now carries the same list as CLAUDE.md step 7. Adds a step 6 for the count claims, which go stale in five places on a new overlay command and are checked by nothing. Claude-Session: https://claude.ai/code/session_01VKbHCujejpxkgvh47BndDE Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…r config (#744) * feat(doc-control): add REGIME_PARTIALS map and guard it in CI * fix(doc-control): guard REGIME_PARTIALS for orphan keys not in REGIMES * feat(doc-control): route CA artefacts to the Canadian classification ladder * feat(doc-control): route AU artefacts to the PSPF classification ladder * feat(doc-control): add VIRBI 2025 partial ahead of the NL regime (#739) * docs(doc-control): document regime-first resolution in RENDERING.md * fix(templates): mirror _partials to the CLI copy and guard it (AT had drifted) Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VKbHCujejpxkgvh47BndDE * test(templates): assert plugin _partials source dir is non-empty before comparing Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VKbHCujejpxkgvh47BndDE * chore(doc-control): propagate new partials to community plugins and mirror Runs sync-shared-assets.py and sync-claude-plugin-layout.py to push the Task 1-6 REGIME_PARTIALS routing changes (updated RENDERING.md plus the new document-control-{au,ca,nl}.md partials) out to all 14 community plugins and the mirrored plugins/arckit-claude/plugins/ tree. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VKbHCujejpxkgvh47BndDE * fix(doc-control): assert which partial each regime maps to, and stop hard-routing the UK fallback The regime guard only asserted that a non-UK partial *differed* from the UK one, never which partial a regime named. Pointing CA at document-control-au.md and AU at document-control-uk.md exited 0: Canadian artefacts got the Australian ladder, Australian artefacts silently fell back to UK — precisely the bug class regime routing exists to prevent. REGIME_PARTIALS now has a companion UK_FALLBACK_BY_DESIGN set naming the regimes that legitimately resolve to the UK partial, and the guard enforces both halves: a regime in the set must map to document-control-uk.md, and a regime outside it must map to document-control-<its own code>.md. The US/FR deferral becomes a registered decision rather than an unguarded hole. The same set fixes a behaviour change nobody asked for. Hard-routing UK, MOD, EU, FR and US moved 52 doc-types off the user-config chain, so a UAE- or Austrian-configured entity running /arckit:dpia lost its own ladder — against the design's own success criterion that no artefact type changes ladder except CA, AU and NL. Those regimes now fall through to step 2 exactly as before; regimes outside the set hard-route as designed. RENDERING.md is also self-contained now. Step 1 told the model to read config/doc-types.mjs, which only the core plugin ships — no overlay has a config/ directory, and every AT, AU, CA and UAE doc-type is overlay-owned, so the lookup was unresolvable exactly where it mattered. It carries the regime index and routing table inline instead, and the guard holds both tables to the registry so the runtime authority cannot drift from the data. Also: mirror RENDERING.md into .arckit/templates/_partials/, which had sat on the pre-branch config-only chain and did not know about Austria, and compare partials by content rather than basename in test_template_consistency.py so the same staleness cannot recur silently. * docs(doc-control): record regime routing in the changelog and correct two overlay guides Both guides now contradicted shipped behaviour. uae-classification.md said the Document Control header "will not render the UAE ladder" without userConfig, which stopped being true for the uae-* commands the moment UAE doc-types began hard-routing; the setting now governs the jurisdiction-agnostic artefacts produced alongside them. au-federal-overlay.md still described the AU partial and the routing as a future enhancement, and it shipped two commits ago — but the part of that note about userConfig driving non-AU artefacts inside an AU project remains unimplemented, because step 2 recognises the UAE and Austrian schemes only, so the guide now separates the two. The changelog entry covers the routing, the three new partials, and the deliberate US/FR deferral, which is a deferral rather than a decision: neither has authoritative ladder wording in this repository, and a wrong ladder inside a Document Control header reads more authoritative than a fallback does. * fix(at,uae): route classification header via RENDERING.md, not user config Three overlay command bodies still instructed models to resolve the Document Control classification ladder from the user's plugin userConfig (governance_framework / classification_scheme), overriding the hard-routing this branch introduces for AT/UAE/CA/AU regimes in RENDERING.md. Fixed uae-classification.md, at-dsgvo.md and at-bvergg.md to defer to RENDERING.md / state the InfoSiG value unconditionally, so an Austrian or Emirati artefact can no longer be given a UK classification ladder. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VKbHCujejpxkgvh47BndDE --------- Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Re-review — all blockers cleared, one mechanical rebase leftI've re-reviewed against your three commits. Every blocker and every Important item from my original review is fixed, and you went further than I asked on two of them. Fixed
On the quality-checklist: I'd told you that gap was pre-existing and affected six overlays, i.e. not yours to fix. You fixed the canonical copy and propagated it to all of them. That closes a defect that had been shipping unreported since the CA overlay landed — thank you. What changed underneath you#744 merged an hour ago and rebuilt the mechanism your blocker 2 was working around. The classification ladder now routes from the doc-type's Your per-command ladder override is now belt-and-braces rather than the primary mechanism — exactly like the CA and AU commands. Keep it; it's harmless and consistent. The remaining work — mechanicalI test-merged After resolving it, #744's new CI guard fails with exactly three lines telling you what to add: That's the guard doing its job — I flagged in #744 that your PR would hit it. To clear:
No further review findings from me. Once the guard is green this is good to merge as far as I'm concerned. |
Blockers 1-3 and important 4-9 from the review on tractorjuice#739. BLOCKER 1 — resolve the Document Control marker. All four commands now read ${CLAUDE_PLUGIN_ROOT}/templates/_partials/RENDERING.md and resolve the <!-- DOC-CONTROL-HEADER --> marker in their write step, per the ca-pia.md precedent. Without this every NL artefact shipped a raw HTML comment where Document Control belongs. BLOCKER 2 — the Dutch classification ladder had nowhere to render. Applied the minimum per-command override: all four commands instruct the writer to use the VIRBI 2025 rubricering ladder (Ongerubriceerd / Departementaal VERTROUWELIJK / Stg. CONFIDENTIEEL / Stg. GEHEIM / Stg. ZEER GEHEIM) in the Classification row, replacing the UK line. The proper fix — document-control-nl.md plus RENDERING.md routing and userConfig values — is left for a follow-up as suggested. BLOCKER 3 — user-facing registration. Added to README.md (heading, overlay list, a Dutch command block, and the closing integration sentence), docs/DEPENDENCY-MATRIX.md (command list, inter-dependencies, typical compliance path), docs/index.html (jurisdiction card, keywords meta, structured-data feature list) and .github/CODEOWNERS (@umag @tractorjuice, mirroring the FR and AT pairs). IMPORTANT 4 — per-type quality checks. Added RBCLOUD, TBB, BIO2 and NLEXIT sections to the CANONICAL plugins/arckit-claude/references/quality-checklist.md, then re-ran sync-shared-assets.py. The PR body's claim that the NL copy already carried them was wrong: the sections were written into the synced copy and a later sync reverted them, which is exactly the trap you describe. PR body corrected. IMPORTANT 5 — citation traceability. All four commands now reference references/citation-instructions.md and name the instruments that must appear in the Document Register. IMPORTANT 6 — all four commands now call node scripts/generate-document-id.mjs <PROJECT_ID> <CODE> --filename instead of hand-rolling version detection, picking up the unregistered-code validation from tractorjuice#723 for free. IMPORTANT 7 and 8 — the governing instrument now has citable URLs, and the ministry attribution is confirmed rather than asserted. Both the policy PDF letterhead and the Kamerbrief metadata name Ministerie van Economische Zaken en Klimaat, Staatssecretaris W.J.M. Aerdts, 3 juli 2026: https://www.tweedekamer.nl/kamerstukken/brieven_regering/detail?id=2026Z15738&did=2026D35294 https://www.tweedekamer.nl/downloads/document?id=2026D35295 Kamerstuk 26643, nr. 1541 Good catch prompting the check — the missing URL was the reason it could not be verified from the PR. IMPORTANT 9 — added docs/guides/nl-overlay.md and a guides.html site link, then ran check-guide-parity.py --sync. Also adds the "Adding a new jurisdiction overlay" section to CONTRIBUTING.md, as requested, covering all nine registration points and flagging the two that fail silently (converter.py and sync-claude-plugin-layout.py), the shared-asset rule for references/ and _partials/, and the gitignored-extensions branch-switch trap. Full Python suite: 1249 passed, 225 skipped. All seven check scripts pass, sync-shared-assets --check and sync-claude-plugin-layout --check clean, markdownlint-cli2 clean repo-wide. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
5786858 to
3d78e35
Compare
The Netherlands had no overlay, and its central-government cloud rules changed substantially in 2025-2026 in ways that make generic EU guidance insufficient: - Herziening rijksbreed cloudbeleid 2026 (EZK, 3 July 2026) replaced the 2022 policy - VIRBI 2025 (BWBR0051482) came into force 9 September 2025 and repealed VIRBI 2013 the same day - Cyberbeveiligingswet and Wet weerbaarheid kritieke entiteiten, the Dutch NIS2 and CER transpositions, came into force 15 August 2026 - BIO2 was established by the OBDO on 23 September 2025 Four commands: - /arckit:nl-cloud (RBCLOUD) Rijksbreed cloudbeleid compliance assessment - /arckit:nl-tbb (TBB) Te Beschermen Belangen / VIRBI 2025 rubricering - /arckit:nl-bio (BIO2) BIO2 conformance assessment - /arckit:nl-exit (NLEXIT) cloud exit plan (clause 3.2) Two deliberate omissions. Unlike France's SecNumCloud there is no published Dutch qualification list, so no commercial provider is named as compliant and the overlay says so where a reader would expect one. Where the source text was not to hand — the remaining aspects of the clause 3.1 risk analysis, and the individual BIO2 overheidsmaatregelen — the commands instruct the assessor to consult the current text rather than shipping a plausible-looking list. Registers the first NL regime: four codes in config/doc-types.mjs plus NL in REGIMES and REGIME_LABELS, a row per code in the /arckit:pages known-artifact-types table, and entries in .claude-plugin/marketplace.json and the converter.py plugin list so the overlay reaches the non-Claude targets. Registration points beyond those CONTRIBUTING.md lists, each found by running the repository's own tooling rather than from the docs: - a row per code in the /arckit:pages known-artifact-types table (scripts/check-doc-type-registry.py) - .claude-plugin/marketplace.json and plugins/arckit-claude/.claude-plugin/ marketplace.json, which tests/plugin/test_release_process.py asserts are equal (note the standalone one uses ./plugins/<short>, not the full dir name) - the hardcoded plugin lists in scripts/converter.py, scripts/sync-claude-plugin-layout.py and scripts/push-extensions.sh - the mirrored standalone layout at plugins/arckit-claude/plugins/nl, produced by sync-claude-plugin-layout.py - overlay templates duplicated into .arckit/templates for the CLI - the plugin command-dir lists in tests/extension_helpers.py, tests/paperclip/test_commands_json.py, tests/codex/test_codex_extension.py, tests/plugin/test_template_consistency.py and EXPECTED_CLAUDE_MARKETPLACE_SOURCES in tests/plugin/test_release_process.py Without the converter and sync entries a new overlay silently produces zero generated files for the non-Claude targets, with the converter still reporting success. Full Python suite: 1249 passed, 225 skipped. All seven check scripts pass. markdownlint-cli2 clean repo-wide. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Blockers 1-3 and important 4-9 from the review on tractorjuice#739. BLOCKER 1 — resolve the Document Control marker. All four commands now read ${CLAUDE_PLUGIN_ROOT}/templates/_partials/RENDERING.md and resolve the <!-- DOC-CONTROL-HEADER --> marker in their write step, per the ca-pia.md precedent. Without this every NL artefact shipped a raw HTML comment where Document Control belongs. BLOCKER 2 — the Dutch classification ladder had nowhere to render. Applied the minimum per-command override: all four commands instruct the writer to use the VIRBI 2025 rubricering ladder (Ongerubriceerd / Departementaal VERTROUWELIJK / Stg. CONFIDENTIEEL / Stg. GEHEIM / Stg. ZEER GEHEIM) in the Classification row, replacing the UK line. The proper fix — document-control-nl.md plus RENDERING.md routing and userConfig values — is left for a follow-up as suggested. BLOCKER 3 — user-facing registration. Added to README.md (heading, overlay list, a Dutch command block, and the closing integration sentence), docs/DEPENDENCY-MATRIX.md (command list, inter-dependencies, typical compliance path), docs/index.html (jurisdiction card, keywords meta, structured-data feature list) and .github/CODEOWNERS (@umag @tractorjuice, mirroring the FR and AT pairs). IMPORTANT 4 — per-type quality checks. Added RBCLOUD, TBB, BIO2 and NLEXIT sections to the CANONICAL plugins/arckit-claude/references/quality-checklist.md, then re-ran sync-shared-assets.py. The PR body's claim that the NL copy already carried them was wrong: the sections were written into the synced copy and a later sync reverted them, which is exactly the trap you describe. PR body corrected. IMPORTANT 5 — citation traceability. All four commands now reference references/citation-instructions.md and name the instruments that must appear in the Document Register. IMPORTANT 6 — all four commands now call node scripts/generate-document-id.mjs <PROJECT_ID> <CODE> --filename instead of hand-rolling version detection, picking up the unregistered-code validation from tractorjuice#723 for free. IMPORTANT 7 and 8 — the governing instrument now has citable URLs, and the ministry attribution is confirmed rather than asserted. Both the policy PDF letterhead and the Kamerbrief metadata name Ministerie van Economische Zaken en Klimaat, Staatssecretaris W.J.M. Aerdts, 3 juli 2026: https://www.tweedekamer.nl/kamerstukken/brieven_regering/detail?id=2026Z15738&did=2026D35294 https://www.tweedekamer.nl/downloads/document?id=2026D35295 Kamerstuk 26643, nr. 1541 Good catch prompting the check — the missing URL was the reason it could not be verified from the PR. IMPORTANT 9 — added docs/guides/nl-overlay.md and a guides.html site link, then ran check-guide-parity.py --sync. Also adds the "Adding a new jurisdiction overlay" section to CONTRIBUTING.md, as requested, covering all nine registration points and flagging the two that fail silently (converter.py and sync-claude-plugin-layout.py), the shared-asset rule for references/ and _partials/, and the gitignored-extensions branch-switch trap. Full Python suite: 1249 passed, 225 skipped. All seven check scripts pass, sync-shared-assets --check and sync-claude-plugin-layout --check clean, markdownlint-cli2 clean repo-wide. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
CONTRIBUTING.md: superseded by tractorjuice#741, which documents the overlay registration points including the two silent failures found here. CODEOWNERS: per review, assigning a reviewer for NL changes is a maintainer decision rather than part of this contribution. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
check-guide-parity flagged nl-overlay.md as root-only. Every sibling overlay guide exists in both trees, so this one should too — the note is non-fatal, which is why the earlier run looked clean. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
docs/guides/eu-cloud-sovereignty.md and its plugin-tree copy belong to tractorjuice#740, not here. They were untracked on the EU branch when I switched branches — git stash does not stash untracked files and checkout carries them across — so a git add -A on this branch swept them in. Also re-adds the Netherlands block to docs/guides.html, which was lost when guides.html was reverted while removing the leak. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…of per-command overrides Rebased onto main and adopted the mechanism tractorjuice#744 introduced, which arrived after this branch was cut. The CHANGELOG conflict is resolved keeping both entries, tractorjuice#744's first. NL: 'document-control-nl.md', in REGIME_PARTIALS NL is deliberately NOT added to UK_FALLBACK_BY_DESIGN — the Netherlands has a real ladder in VIRBI 2025, so it hard-routes, and an artefact assessed under Dutch rules should carry the Dutch ladder whoever runs the command. Adds the NL row to both RENDERING.md tables (Regime routing: hard-routes; Regime index: RBCLOUD, TBB, BIO2, NLEXIT) and names NL in the step-1 hard-routing list, then re-runs sync-shared-assets.py, sync-claude-plugin-layout.py and converter.py — this branch carried the pre-tractorjuice#744 RENDERING.md in its _partials copies, so without the re-sync the NL plugin would have shipped the stale config-only chain. document-control-nl.md now reaches arckit-nl through the sync rather than being authored here; thank you for landing it ahead of this PR. The per-command VIRBI override stays, as you suggested — belt-and-braces, consistent with the ca-* and au-* commands, and it now agrees with the routing rather than substituting for it. .arckit/templates/_partials/RENDERING.md is copied by hand: sync-shared-assets covers the 14 community plugins but not the CLI mirror, and test_plugin_and_cli_partials_are_in_sync compares it by content. One more registration point, not in CONTRIBUTING.md and not caught by any check script — plugins/arckit-claude/config/guide-groups.mjs carries an explicit per-guide list. Without an entry, docs/guides/nl-overlay.md landed in "Other / Uncategorised" and test_codex_hook_runs_pages_preprocessor failed on other_guides == []. Added as a "Community overlays - Netherlands" pack, with the category slotted into GUIDE_CATEGORY_ORDER between France and UAE. Worth a line in the CONTRIBUTING.md section, if you agree — I hit the identical failure on tractorjuice#740. Full Python suite: 1275 passed, 225 skipped. All seven check scripts pass, both sync --check runs clean, test-regime-registration.mjs reports 10 regimes all registered and labelled, markdownlint-cli2 clean repo-wide. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
3d78e35 to
3cad7bb
Compare
|
All four steps done, plus one more the guard didn't catch. Pushed as The #744 adoption
Keeping the per-command VIRBI override, as you suggested.
A tenth registration point
Added as a The rebaseTwo rounds — #744 first, then #750/#751 while I was verifying. #751's guard is green and counts the NL sections: VerificationOne note on merge order: #740 is also rebased onto |
Adds a Netherlands public sector overlay —
plugins/arckit-nl/, four commands, community-contributed.Why
There is no NL overlay, and Dutch central-government cloud rules changed substantially in 2025–2026 in ways that make generic EU guidance insufficient:
The repeal date matters in particular: material still citing VIRBI 2013 is stale, and the commands say so.
Commands
/arckit:nl-cloudRBCLOUD/arckit:nl-tbbTBB/arckit:nl-bioBIO2/arckit:nl-exitNLEXIT/arckit:nl-cloudwalks the policy clause by clause: the determination of materieel publiek cloudgebruik (4.1), the mandatory risk analysis (3.1), notification to CISO Rijk (3.3), and the eligibility rules that prohibit public cloud for staatsgeheim-classified information and Te Beschermen Belangen levels 1–3 (5.2), and permit email and workplace services only where three cumulative conditions are met (4.5)./arckit:nl-tbbscores Beschikbaarheid, Integriteit and Vertrouwelijkheid against the five kernbelangen, with the highest of the three setting the TBB category. It carries a prominent warning that the inference runs one way only — information at Stg. GEHEIM implies TBB 2, but a TBB 2 process does not imply it holds Stg. GEHEIM data. Getting that backwards silently over-classifies.Two deliberate omissions
Both are places where inventing content would have been worse than leaving a gap, so I would rather flag them than have a reviewer discover them:
/arckit:nl-cloudand the README both say so explicitly, because a reader coming fromfr-secnumcloudwill expect one.[PENDING — cite from current text]placeholder, rather than shipping a plausible-looking list.No vendor-analyst market reports are cited anywhere.
Registry changes (the two-part PR from CONTRIBUTING.md)
NLis the first of its regime, so beyond the four codes inplugins/arckit-claude/config/doc-types.mjsthis also registersNLinREGIMESandREGIME_LABELS(placed afterFR, keeping community regimes alphabetical).Two further integration points that
CONTRIBUTING.mddoes not currently mention, both found by running your own tooling rather than by reading the docs — worth a line in the contributing guide if you agree:scripts/check-doc-type-registry.pyrequires a row per code in the/arckit:pagesknown-artifact-types table. Added, in new NL groups under Compliance and Governance.scripts/converter.pycarries a hardcoded plugin-source list, and.claude-plugin/marketplace.jsona plugin list. Without entries in both, a new overlay silently produces zero generated files for the non-Claude targets — the converter reports success and nothing is wrong-looking. Both updated; the converter now emits 30 NL files across the eight target formats.Verification
plugin.jsonparses; every command's frontmatter carries the same key set asfr-secnumcloud.md; UK English throughout. Generatedextensions/output is gitignored and therefore not committed, matching how the existing overlays sit in the tree.Notes for review
Structure mirrors
arckit-frclosely — it was the model for this,fr-secnumcloudin particular, as the nearest analogue in subject matter.references/citation-instructions.mdand the_partialsare byte-identical copies of the FR ones.quality-checklist.mdis a synced shared asset — the RBCLOUD / TBB / BIO2 / NLEXIT per-type sections were added to the canonicalplugins/arckit-claude/references/quality-checklist.mdand propagated bysync-shared-assets.py, so they reach every overlay rather than only this one. (An earlier revision of this body said the NL copy was "the FR file plus four appended sections". That was wrong: the sections had been written into the synced copy and a later sync reverted them.)Happy to split this, rename codes, or move anything if you would rather the Dutch cloud command live somewhere else. The separate PR adding the EU Cloud Sovereignty Framework to
arckit-euis #740 — it is an EU Commission instrument that applies across member states, so it seemed wrong to bury it in a national overlay, though the Dutch government has adopted it as its own sovereignty yardstick.🤖 Generated with Claude Code