Follow-ups the jurisdiction-packs build (PR #79) surfaced. Recorded honestly rather than quietly closed.
1. REQ-JP-006 placeholder-provenance rests on a false premise (task 17 left UNTICKED)
The spec says the NL pack "resolves the employer Whk leaf". It does not, and did not at HEAD either — Whk is an employer-level input that PayrollRunService reads from settings, not a table leaf the pack resolves. So NL flagged-provenance set is empty and nothing is stamped onto PayrollRun. The mechanism itself exists and is tested with a pack that does resolve a placeholder leaf. Fix: correct the REQ prose, then decide whether employer-level inputs should carry provenance at all.
2. piecewiseAccrue is on probation until country two
It was designed by staring at NL arkChain(); its round-each-term-to-5-decimals → cap-at-segment-ceiling → accumulate ordering is Rekenvoorschriften arcana. Phase-in/phase-out credit schedules are common enough that the shape is plausibly general, but that is unproven. Country two either validates it or exposes it as the escape hatch wearing a DSL costume. Do not treat its generality as established.
3. expr must stay closed and total — do not widen
NL uses expr 3x. Its function list is pinned by test to exactly min max abs round floor ceil. If expr ever becomes a general language, the whole "config not code" claim is hollow. Widening it must require an explicit argument with ADR-101. The pressure will come from VCR.
4. The escape hatch first customer will be NL itself (VCR)
voortschrijdend cumulatief rekenen needs cross-period state; the DSL is per-period pure by construction and cannot express it. Same for the 30%-ruling netto-operation (an inverse solve). This is exactly why the hatch exists despite zero current uses.
5. bijtelling belongs in the pack (scope cut, not a principled boundary)
The MVP keeps all five PayrollRunService folds app-level because the interpreter is pure and object-blind. But bijtelling is a pure function of (cataloguswaarde, rates already in nl-2026.json) — only the object lookup is app-level. It is NL tax law living outside the "jurisdiction" pack. Country two will feel this. Same tension for the loonbeslag beslagvrije voet (Dutch law operating on fully-folded net the pack does not own).
6. Smaller
bracket is affine-only; NL ships precomputed a/c. Any progressive schedule is affine-expressible, but making pack authors precompute cumulative constants is an ergonomic burden + error source. mode: progressive is a named follow-up.
awfTariff is low|high in CalculationInput but laag|hoog in the tables (bridged by a PHP ternary at the facade). A real seam.
design.md step count is internally inconsistent (proposal says 13, D5 lists 15; actual 16 steps + 21 bindings). Never load-bearing, but wrong.
- The corpus has no unit marker (
Lv: 54 euro vs 6.1 percent, both bare numbers). Resolved by making the pack declare units (:cents) rather than teaching the interpreter which NL leaves are money. Consider a unit marker in tables/SCHEMA.md.
7. Country two is unproven
This change proves the mechanism against NL and ships the upload surface. Any claim it "just works" for the next country is precisely the claim item 2 is on probation for. The honest test is onboarding a real second jurisdiction.
Gemigreerd van Codeberg — oorspronkelijk Conduction/hrmq#81, geopend door rubenvdlinde op 2026-07-16.
Follow-ups the
jurisdiction-packsbuild (PR #79) surfaced. Recorded honestly rather than quietly closed.1. REQ-JP-006 placeholder-provenance rests on a false premise (task 17 left UNTICKED)
The spec says the NL pack "resolves the employer Whk leaf". It does not, and did not at HEAD either — Whk is an employer-level input that
PayrollRunServicereads from settings, not a table leaf the pack resolves. So NL flagged-provenance set is empty and nothing is stamped ontoPayrollRun. The mechanism itself exists and is tested with a pack that does resolve a placeholder leaf. Fix: correct the REQ prose, then decide whether employer-level inputs should carry provenance at all.2.
piecewiseAccrueis on probation until country twoIt was designed by staring at NL
arkChain(); its round-each-term-to-5-decimals → cap-at-segment-ceiling → accumulate ordering is Rekenvoorschriften arcana. Phase-in/phase-out credit schedules are common enough that the shape is plausibly general, but that is unproven. Country two either validates it or exposes it as the escape hatch wearing a DSL costume. Do not treat its generality as established.3.
exprmust stay closed and total — do not widenNL uses
expr3x. Its function list is pinned by test to exactlymin max abs round floor ceil. Ifexprever becomes a general language, the whole "config not code" claim is hollow. Widening it must require an explicit argument with ADR-101. The pressure will come from VCR.4. The escape hatch first customer will be NL itself (VCR)
voortschrijdend cumulatief rekenenneeds cross-period state; the DSL is per-period pure by construction and cannot express it. Same for the 30%-ruling netto-operation (an inverse solve). This is exactly why the hatch exists despite zero current uses.5. bijtelling belongs in the pack (scope cut, not a principled boundary)
The MVP keeps all five
PayrollRunServicefolds app-level because the interpreter is pure and object-blind. But bijtelling is a pure function of (cataloguswaarde, rates already innl-2026.json) — only the object lookup is app-level. It is NL tax law living outside the "jurisdiction" pack. Country two will feel this. Same tension for the loonbeslag beslagvrije voet (Dutch law operating on fully-folded net the pack does not own).6. Smaller
bracketis affine-only; NL ships precomputed a/c. Any progressive schedule is affine-expressible, but making pack authors precompute cumulative constants is an ergonomic burden + error source.mode: progressiveis a named follow-up.awfTariffislow|highinCalculationInputbutlaag|hoogin the tables (bridged by a PHP ternary at the facade). A real seam.design.mdstep count is internally inconsistent (proposal says 13, D5 lists 15; actual 16 steps + 21 bindings). Never load-bearing, but wrong.Lv: 54euro vs6.1percent, both bare numbers). Resolved by making the pack declare units (:cents) rather than teaching the interpreter which NL leaves are money. Consider a unit marker intables/SCHEMA.md.7. Country two is unproven
This change proves the mechanism against NL and ships the upload surface. Any claim it "just works" for the next country is precisely the claim item 2 is on probation for. The honest test is onboarding a real second jurisdiction.
Gemigreerd van Codeberg — oorspronkelijk Conduction/hrmq#81, geopend door
rubenvdlindeop 2026-07-16.