109 lines
5.7 KiB
Markdown
109 lines
5.7 KiB
Markdown
# Final Report of the Java MVP
|
|
|
|
The report that section 8.5 of the specification asks for, as of 2026-10-11, version 0.26.8, commit `0819bd4` of `main`;
|
|
PR#65 added the example reports of section 8.4 afterwards.
|
|
It names only what ran; nothing here is claimed without a run.
|
|
|
|
## What Is Implemented
|
|
|
|
| Step of section 8.3 | State | PRs |
|
|
| --- | --- | --- |
|
|
| 1. Repository, Gradle wrapper, pinned versions, walking skeleton, ADR 0001 | done | #1, #2 |
|
|
| 2. Metric core and status policy `strict-v1` | done; default `timeouts-killed-v1` (ADR 0006) | #3, #9 |
|
|
| 3. Original bytecode, method inventory, JaCoCo complexity | done | #4 |
|
|
| 4. Complete aggregation of PIT results, identity and error cases | done | #5 |
|
|
| 5. JSON schema, JSON and Markdown reports, console summary | done | #6 |
|
|
| 6. Opt-in Gradle gate, multi-project fixture | done | #7 |
|
|
| 7. Kotlin/JVM basis support, limits documented | done, optional goal (ADR 0009) | #61 |
|
|
| 8. Packaging from an isolated repository, documentation, report | done | #8, #62, #63, #64, #65 |
|
|
|
|
Beside the steps: the CodeCharta code city (RFC 0001, ADR 0007), cohesion and coupling (RFC 0002),
|
|
the change risk (ADR 0008), and the structure page and matrix (RFC 0003).
|
|
The plan with every node and its PRs is [werkcrappit.werkbaum](werkcrappit.werkbaum).
|
|
|
|
## Tested Versions
|
|
|
|
[compatibility.md](compatibility.md) lists the combination the functional tests run:
|
|
Gradle 9.8.0, the Gradle PIT plugin 1.19.0, PIT 1.30.0, the PIT JUnit 5 plugin 1.2.3, JUnit Jupiter 5.14.4 in the fixtures,
|
|
JaCoCo Core 0.8.15, ASM 9.10.1, Java 21 bytecode, Kotlin 2.4.21 for the Kotlin fixture,
|
|
build scripts in the Kotlin DSL and in the Groovy DSL.
|
|
Nothing else is claimed to work.
|
|
|
|
## Commands That Ran
|
|
|
|
On 2026-10-11, on a fresh clone of `main` at `0819bd4`, with Temurin 25.0.4 as Gradle's JVM:
|
|
|
|
```bash
|
|
git clone https://git.javagil.de/mi/werkcrappit.git
|
|
./gradlew build
|
|
```
|
|
|
|
`BUILD SUCCESSFUL` in 4 minutes 21 seconds, 369 tests, none failed or skipped:
|
|
|
|
| Test set | Tests |
|
|
| --- | ---: |
|
|
| `werkcrappit-pit`, unit tests | 297 |
|
|
| `werkcrappit-pit`, functional tests: real PIT runs on Java and Kotlin fixtures | 18 |
|
|
| `werkcrappit-pit`, browser tests of the structure page and matrix in a headless Chromium | 22 |
|
|
| `werkcrappit-gradle-plugin`, unit tests | 6 |
|
|
| `werkcrappit-gradle-plugin`, functional tests: the gate and the export in real builds | 26 |
|
|
|
|
The functional tests consume both plugins as published into `build/functional-test-repo`, never the classes of the build.
|
|
Werkator on werkator.javagil.de runs the same `./gradlew build` for every push.
|
|
|
|
Also ran on 2026-10-11:
|
|
|
|
- werkcrappit's own mutation build, `pitest mutationCrapCodeCharta mutationCrapCheck` on `werkcrappit-pit`, locally:
|
|
gate passed at its ratchet 9, highest Mutation-CRAP 9 (PR#56).
|
|
- werkprobe's shop demo, `pitest mutationCrapCodeCharta` in the Groovy DSL, locally (werkprobe PR#14).
|
|
|
|
## Acceptance Tests
|
|
|
|
[acceptance-test-map.md](acceptance-test-map.md) maps 124 IDs to JUnit tests, which the build above ran; all are passing.
|
|
`FeatureFilesTest` parses every feature file and checks that the map names exactly their IDs.
|
|
JUnit tests check the scenarios; there is no Gherkin runner.
|
|
|
|
- The five `@MC-KT-…` scenarios are `@optional-kotlin` and not part of the binding MVP.
|
|
- Four IDs pass with a remark in the map:
|
|
`MC-002` and `MC-003` on the level of the core, `MC-007` under `strict-v1`, `MC-009` on the adapter level.
|
|
- The specification's Kotlin IDs `MC-032` and `MC-033` were taken by the progress scenarios; Kotlin uses `MC-KT-…`.
|
|
|
|
## Definition of Done
|
|
|
|
| Section 8.5 asks | Shown by |
|
|
| --- | --- |
|
|
| A clean checkout builds reproducibly with documented prerequisites | the fresh clone above; a JDK 17 or newer suffices |
|
|
| The packaged plugin works in a real Gradle/PIT run | the functional tests; hsadmin-ng, Werkator and werkprobe |
|
|
| Every binding scenario is shown automatically | the acceptance map, all passing |
|
|
| Reports carry real per-method values from PIT and JaCoCo | the functional tests read the report of real PIT runs |
|
|
|
|
A JDK 17 or newer starts Gradle; Gradle loads the Temurin 25 toolchain where it is missing (PR#60).
|
|
hsadmin-ng, Werkator and werkprobe apply the published plugins in their own builds.
|
|
|
|
The artifacts of section 8.4:
|
|
|
|
| Artifact | Where |
|
|
| --- | --- |
|
|
| README: purpose, experimental status, installation, configuration, reports, gate, quickstart | [README.md](../README.md) |
|
|
| The metric: formula, `strict-v1`, states without a score, limits, what it does not say | [metric.md](metric.md) |
|
|
| Compatibility and the integration ADR | [compatibility.md](compatibility.md), [ADR 0001](adr/0001-pit-integration.md) |
|
|
| Features and acceptance map | [features/](features/), [acceptance-test-map.md](acceptance-test-map.md) |
|
|
| Versioned JSON schema | `werkcrappit-pit/src/main/resources/de/javagil/werkcrappit/pit/report/mutation-crap.schema.json` |
|
|
| Small expected example reports | [examples/](examples/), kept current by `ExampleReportsTest` (PR#65) |
|
|
| Runtime dependencies and their licenses | README, "Runtime Dependencies" |
|
|
|
|
## Remaining Limits
|
|
|
|
- The metric is an experiment: neither its superiority nor any threshold is proven.
|
|
- Only Gradle is supported, and only the versions above are tested.
|
|
- Kotlin: an inline function's own body never runs, and PIT mutates the state machine of a suspend function (ADR 0009).
|
|
- Whether CodeCharta renders the city is a manual probe; where the viewer comes from is open until hsadmin-ng moves (RFC 0003).
|
|
|
|
## Deviations From the Specification
|
|
|
|
Each is documented where it was decided:
|
|
|
|
- The default status policy is `timeouts-killed-v1`; `strict-v1` is unchanged and selectable (ADR 0006).
|
|
- The Kotlin scenarios use `@MC-KT-…`, as `MC-032` and `MC-033` were taken (ADR 0009).
|
|
- werkcrappit builds with Temurin 25 and writes Java 21 bytecode (PR#60).
|