Files
werkcrappit/docs/adr/0005-gradle-integration.md
miandmhoennig e796ca8d07
werkator build succeeded after 01:31
werkator/publish build succeeded after 00:14
Move to de.javagil.werkcrappit (0.4.0) (#11)
Maven group, Java packages and Gradle plugin id move to `de.javagil.werkcrappit`. No change of behaviour. Old versions 0.2.0–0.3.1 under `de.hoennig.werkcrappit` stay in the registry for pinned builds.

Consumers change two lines: plugin id `de.javagil.werkcrappit` and version 0.4.0 (or `de.javagil.werkcrappit:werkcrappit-pit:0.4.0`).

CI on werkator.javagil.de: green.

PR-doc: `docs/prs/2026-10-02-PR#11-rename-to-javagil.md`

🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: mhoennig <michael@hoennig.de>
Reviewed-on: #11
2026-10-02 10:08:42 +02:00

45 lines
2.9 KiB
Markdown

# ADR 0005: Gradle Integration and Gate
- Status: accepted
- Date: 2026-10-01
- PR: #7
## Context
The specification (6.4, 6.5) wants a thin Gradle integration on top of the existing `info.solidsoft.pitest` plugin and an opt-in gate that runs after PIT has finished, judging werkcrappit's own report.
## Decision
**Plugin `de.javagil.werkcrappit`.** Applied next to `info.solidsoft.pitest`, it:
- adds `de.javagil.werkcrappit:werkcrappit-pit` of its own version to PIT's `pitest` configuration;
- adds the output format `WERKCRAPPIT_MUTATION_CRAP` to the `pitest` task, keeping the configured formats, or PIT's default `HTML` if none are configured;
- passes the `werkcrappit { … }` options into PIT's `pluginConfiguration`, keeping the entries of other plugins; the analysis context defaults to `<project path>:pitest`;
- registers `mutationCrapCheck`, which depends on `pitest`.
The PIT plugin sets the task's formats and plugin configuration to its extension's values, which are missing unless a build configures them, and adding to a missing Gradle collection property leaves it missing.
So the plugin derives both from the PIT extension instead of adding to the task.
**Not attached to `check`.** PIT is expensive; a CI that wants the gate runs `mutationCrapCheck` explicitly.
**Gate.** `mutationCrapCheck` reads `mutation-crap.json` and calls `Gate`, which lives in `werkcrappit-pit` next to the report contract.
It compares the exact fraction of every score; it never recomputes the formula.
The rules are those of specification 6.4:
1. No `maxMutationCrap`: the gate is inactive and never fails because of a score.
2. A scored, not excluded method violates the limit exactly when its value is greater; equality passes.
3. A missing, unfinished or unreadable report, an unsupported schema version, an incomplete scope, an `INCONCLUSIVE` or `COMPLEXITY_UNAVAILABLE` method is an analysis error, reported as such and not as poor test quality.
4. `NO_MUTATION_RESULTS` and `NO_ELIGIBLE_MUTANTS` are noted, never judged.
5. No scored method at all fails as an empty evaluation, unless `allowEmpty` is set; it is reported only when no other analysis error explains it.
6. The gate depends on `pitest`; when PIT fails, Gradle never runs it, and a run that died inside PIT left a `RUNNING` report (ADR 0004).
**Up to date.** The gate declares no outputs and always runs; judging is cheap.
The limit is not an input of `pitest`, so changing it does not repeat PIT.
**Multi-project builds.** Each project has its own `pitest` task, report directory, context and gate; nothing is merged across projects.
## Consequences
- A build that configures the `pitest` task's `outputFormats` or `pluginConfiguration` directly, instead of the `pitest` extension, has those values replaced; the README says to use the extension.
- `maxMutationCrap` accepts any number; it is converted through its decimal text, so `10.92` stays `10.92`.