Skip to content

jurisdiction-packs follow-ups: REQ-JP-006 false premise, piecewiseAccrue probation, bijtelling belongs in the pack #129

Description

@rubenvdlinde

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions