ADR: Adopt Stryker.NET for .NET mutation testing #51

Closed
opened 2026-06-25 12:44:16 +00:00 by not · 0 comments
Contributor

Decision to be made: Adopt a .NET mutation-testing tool to establish and enforce the repo-wide mutation-score baseline required by CLAUDE.md §5 (the ratchet) and §3 (Definition of Done).

Context / forces: CLAUDE.md §5 mandates Stryker.NET on every PR with a ratchet, and §3 lists "mutation (ratchet)" as a DoD gate for every slice. No baseline exists yet, so no slice can satisfy that DoD line. S-04b (#47) establishes it on the ACL — the first service with real branching logic (OpenZaakGateway, ZgwToken JWT minting, AclService default-fill). Constraints: net10.0; xUnit; .slnx solution format used repo-wide; reproducible/pinned tooling; runs under make ci and a Gitea Actions job.

Options considered:

  1. Stryker.NET — the de-facto .NET mutation tester; already named in CLAUDE.md §5.
  2. Hand-rolled mutation harness — rejected: large effort, no ecosystem, reinvents Stryker.
  3. No mutation testing / coverage-only gate — rejected: violates §5; coverage ≠ test strength.

Proposed option + why: Stryker.NET, pinned as a local dotnet tool (.config/dotnet-tools.json) for reproducibility. It is the tool §5 already prescribes, integrates with the existing xUnit/dotnet test setup, and emits a break-threshold the ratchet uses.

Consequences: New dependency (dotnet-stryker) + its tool graph. Establishes the first repo-wide baseline (captured as a break threshold); later slices ratchet it upward (§5). Adds a mutation make target + parallel CI job. Mutation runs are slower than unit tests but the ACL is small.

Coupling rules touched (CLAUDE.md §8): none — tooling/CI only; no service boundary or ZGW/Flowable coupling affected.

Refs #47.

**Decision to be made:** Adopt a .NET mutation-testing tool to establish and enforce the repo-wide mutation-score baseline required by CLAUDE.md §5 (the ratchet) and §3 (Definition of Done). **Context / forces:** CLAUDE.md §5 mandates Stryker.NET on every PR with a ratchet, and §3 lists "mutation (ratchet)" as a DoD gate for every slice. No baseline exists yet, so no slice can satisfy that DoD line. S-04b (#47) establishes it on the ACL — the first service with real branching logic (`OpenZaakGateway`, `ZgwToken` JWT minting, `AclService` default-fill). Constraints: net10.0; xUnit; `.slnx` solution format used repo-wide; reproducible/pinned tooling; runs under `make ci` and a Gitea Actions job. **Options considered:** 1. **Stryker.NET** — the de-facto .NET mutation tester; already named in CLAUDE.md §5. 2. Hand-rolled mutation harness — rejected: large effort, no ecosystem, reinvents Stryker. 3. No mutation testing / coverage-only gate — rejected: violates §5; coverage ≠ test strength. **Proposed option + why:** Stryker.NET, pinned as a local dotnet tool (`.config/dotnet-tools.json`) for reproducibility. It is the tool §5 already prescribes, integrates with the existing xUnit/`dotnet test` setup, and emits a break-threshold the ratchet uses. **Consequences:** New dependency (`dotnet-stryker`) + its tool graph. Establishes the first repo-wide baseline (captured as a `break` threshold); later slices ratchet it upward (§5). Adds a `mutation` make target + parallel CI job. Mutation runs are slower than unit tests but the ACL is small. **Coupling rules touched (CLAUDE.md §8):** none — tooling/CI only; no service boundary or ZGW/Flowable coupling affected. Refs #47.
not added this to the Iteration 1 — Walking Skeleton milestone 2026-06-25 12:44:16 +00:00
not added the area:acltype:adr-proposal labels 2026-06-25 12:44:16 +00:00
not closed this issue 2026-06-29 09:00:31 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: eho/register-referentie#51