pitestPartial leaves out a Kotlin file that the branch only moved, with nothing but new package and import lines; it prepares the move to de.javagil.werkregie.
pitestPartial leaves out a Kotlin file that the branch only moved, with nothing but new package and import lines; it prepares the move to de.javagil.werkregie.
See doc/prs/2026-10-15-PR#90-moved-only.md.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
werkrevisor: YELLOW / HUMAN_REVIEW for 108d7442b2c471be1c97011cef20031839e304d9.
The result comment of werkrevisor holds the details.
werkrevisor: YELLOW / HUMAN_REVIEW for `108d7442b2c471be1c97011cef20031839e304d9`.
The result comment of werkrevisor holds the details.
<!-- werkrevisor-review:108d7442b2c471be1c97011cef20031839e304d9 -->
Doc contradicts implementation, severity unknown, counted as medium (werkrevisor)
hint; Jev: real 0.70, severity 1.8 of 3
The Solution section states that movedOnly ignores package and import lines and blank lines and that "any other difference counts as a change." The implementation in dashboard/build.gradle.kts also calls .map { it.trim() } on every line before filtering, so a whitespace-only difference in a code line (e.g., a re-indentation of val x = 1 vs. unchanged code) is silently treated as no change rather than as a change. While this is unlikely to mask a real code change during a package move, the document's claim is technically inaccurate.
**Doc contradicts implementation**, severity unknown, counted as medium (werkrevisor)
hint; Jev: real 0.70, severity 1.8 of 3
The Solution section states that `movedOnly` ignores `package` and `import` lines and blank lines and that "any other difference counts as a change." The implementation in `dashboard/build.gradle.kts` also calls `.map { it.trim() }` on every line before filtering, so a whitespace-only difference in a code line (e.g., a re-indentation of `val x = 1` vs. unchanged code) is silently treated as no change rather than as a change. While this is unlikely to mask a real code change during a package move, the document's claim is technically inaccurate.
claude-code marked this conversation as resolved
ai-reviewer
scheduled this pull request to auto merge when all checks succeed 2026-10-15 08:51:59 +02:00
ai-reviewer
requested review from mi 2026-10-15 08:51:59 +02:00
Fixed in 5ef41a8: the Solution and the comment of movedOnly name the indentation too; a move does not re-indent a line, and a different indentation changes no code.
Fixed in `5ef41a8`: the Solution and the comment of `movedOnly` name the indentation too; a move does not re-indent a line, and a different indentation changes no code.
ai-review/assessment AI findings; a developer approval after checking them unlocks the merge; a human review request is pending; merge already scheduled
werkrevisor: ORANGE / FINDINGS for 5ef41a825b425322c6a3630cf7dafec0f449df98.
The result comment of werkrevisor holds the details.
werkrevisor: ORANGE / FINDINGS for `5ef41a825b425322c6a3630cf7dafec0f449df98`.
The result comment of werkrevisor holds the details.
<!-- werkrevisor-review:5ef41a825b425322c6a3630cf7dafec0f449df98 -->
Wrong path for git show, severity unknown, counted as medium (werkrevisor)
ORANGE; Jev: real 0.90, severity 2.9 of 3
The git show "$base:./${it[1]}" call uses a path from git diff --name-status -M --relative, which git diff --relative makes relative to the current directory (here dashboard/, as the build is run from dashboard/ per AGENTS.md). But git show <rev>:<path> always resolves the path against the repository root, so for a rename the lookup misses and the call returns null. Then movedOnly("", file(it[2]).readText()) compares an empty before against the new content and returns false, so the rename is never filtered out and the file stays in changedClasses. The whole point of this PR — letting pitest skip a file that only moved — therefore does not work in the build as it is run today. The checkMovedOnly task cannot catch this because it only exercises movedOnly with hard-coded strings and never invokes git show or git diff.
**Wrong path for git show**, severity unknown, counted as medium (werkrevisor)
ORANGE; Jev: real 0.90, severity 2.9 of 3
The `git show "$base:./${it[1]}"` call uses a path from `git diff --name-status -M --relative`, which `git diff --relative` makes relative to the current directory (here `dashboard/`, as the build is run from `dashboard/` per AGENTS.md). But `git show <rev>:<path>` always resolves the path against the repository root, so for a rename the lookup misses and the call returns null. Then `movedOnly("", file(it[2]).readText())` compares an empty before against the new content and returns false, so the rename is never filtered out and the file stays in `changedClasses`. The whole point of this PR — letting `pitest` skip a file that only moved — therefore does not work in the build as it is run today. The `checkMovedOnly` task cannot catch this because it only exercises `movedOnly` with hard-coded strings and never invokes `git show` or `git diff`.
Not a real case: in <rev>:<path>, a path that starts with ./ is relative to the current directory (gitrevisions, <rev>:<path>); only a path without ./ is relative to the root.
In dashboard/, git show HEAD:./build.gradle.kts prints the first line of dashboard/build.gradle.kts.
Evidence end to end: on a trial branch on top of this one, I moved all 68 Kotlin files to de.javagil.werkregie; ./gradlew pitestPartial then reported Task :pitest SKIPPED, so each rename was found as moved only.
Not a real case: in `<rev>:<path>`, a path that starts with `./` is relative to the current directory (gitrevisions, `<rev>:<path>`); only a path without `./` is relative to the root.
In `dashboard/`, `git show HEAD:./build.gradle.kts` prints the first line of `dashboard/build.gradle.kts`.
Evidence end to end: on a trial branch on top of this one, I moved all 68 Kotlin files to `de.javagil.werkregie`; `./gradlew pitestPartial` then reported `Task :pitest SKIPPED`, so each rename was found as moved only.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
pitestPartial leaves out a Kotlin file that the branch only moved, with nothing but new package and import lines; it prepares the move to de.javagil.werkregie.
See doc/prs/2026-10-15-PR#90-moved-only.md.
🤖 Generated with Claude Code
🟡 werkrevisor YELLOW for
108d744, superseded by the result for5ef41a8🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind:
mixed.Reasons
Findings
doc/prs/2026-10-15-PR#90-moved-only.md:56, severity unknown, counted as medium, hint, as a line commentClassifier
5 of 7 units passed all questions (1 PR document(s)).
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 15374, calls 1, tokens in 14869 / out 17740 (reasoning included in out), duration 224.8 s, cost 0.0257 USD (reported), classifier `jev-1.13.0` calls 7, tokens in 5247, cost 0.0002 USD, finding judge `jev-1.13.0` calls 1, tokens in 1791, cost 0.0001 USD, build file judge `jev-1.13.0` calls 1, tokens in 1402, cost 0.0001 USD, phases: path_judge 0.2 s, classifier 0.5 s, context 0.2 s, model_review 223.4 s, finding_judge 0.2 s, config: defaults + host + repository (.werkrevisor.toml at main1 answer ignored because of a confidence below [classifier] min_confidence.
815e766).Reviewed head `108d7442b2c471be1c97011cef20031839e304d9` against base `815e766d633fbede5b504ca182e9eda73fa51d4c`, werkrevisor 0.43.0.
werkrevisor: YELLOW / HUMAN_REVIEW for
108d7442b2c471be1c97011cef20031839e304d9.The result comment of werkrevisor holds the details.
@@ -0,0 +53,4 @@## Solution- `changedClasses` asks `git diff --name-status -M` for the renames and compares each moved file with its old version.- `movedOnly` ignores `package` and `import` lines and blank lines; any other difference counts as a change.Doc contradicts implementation, severity unknown, counted as medium (werkrevisor)
hint; Jev: real 0.70, severity 1.8 of 3
The Solution section states that
movedOnlyignorespackageandimportlines and blank lines and that "any other difference counts as a change." The implementation indashboard/build.gradle.ktsalso calls.map { it.trim() }on every line before filtering, so a whitespace-only difference in a code line (e.g., a re-indentation ofval x = 1vs. unchanged code) is silently treated as no change rather than as a change. While this is unlikely to mask a real code change during a package move, the document's claim is technically inaccurate.@@ -0,0 +53,4 @@## Solution- `changedClasses` asks `git diff --name-status -M` for the renames and compares each moved file with its old version.- `movedOnly` ignores `package` and `import` lines, blank lines and the indentation of a line;Fixed in
5ef41a8: the Solution and the comment ofmovedOnlyname the indentation too; a move does not re-indent a line, and a different indentation changes no code.🟠 werkrevisor: ORANGE / FINDINGS
Change kind:
mixed.Reasons
Findings
dashboard/build.gradle.kts:501, severity unknown, counted as medium, ORANGE, as a line commentClassifier
7 of 7 units passed all questions (1 PR document(s)).
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 15234, calls 1, tokens in 14740 / out 17656 (reasoning included in out), duration 187.6 s, cost 0.0256 USD (reported), classifier `jev-1.13.0` calls 7, tokens in 5205, cost 0.0002 USD, finding judge `jev-1.13.0` calls 1, tokens in 2646, cost 0.0001 USD, build file judge `jev-1.13.0` calls 1, tokens in 1404, cost 0.0001 USD, phases: path_judge 0.2 s, classifier 0.5 s, context 0.2 s, model_review 186.0 s, finding_judge 0.2 s, config: defaults + host + repository (.werkrevisor.toml at main1 answer ignored because of a confidence below [classifier] min_confidence.
815e766).Reviewed head `5ef41a825b425322c6a3630cf7dafec0f449df98` against base `815e766d633fbede5b504ca182e9eda73fa51d4c`, werkrevisor 0.43.0.
werkrevisor: ORANGE / FINDINGS for
5ef41a825b425322c6a3630cf7dafec0f449df98.The result comment of werkrevisor holds the details.
@@ -478,0 +498,4 @@// a rename line reads "R<score>\t<old>\t<new>"; a file that only moved keeps its code (werkregie PR#90)val changed = git("diff", "--name-status", "-M", "--diff-filter=d", "--relative", base, "--", "src/main/kotlin").orEmpty().lines().map { it.split('\t') }.filterNot { it.size == 3 && it[0].startsWith("R") && movedOnly(git("show", "$base:./${it[1]}").orEmpty(), file(it[2]).readText()) }Wrong path for git show, severity unknown, counted as medium (werkrevisor)
ORANGE; Jev: real 0.90, severity 2.9 of 3
The
git show "$base:./${it[1]}"call uses a path fromgit diff --name-status -M --relative, whichgit diff --relativemakes relative to the current directory (heredashboard/, as the build is run fromdashboard/per AGENTS.md). Butgit show <rev>:<path>always resolves the path against the repository root, so for a rename the lookup misses and the call returns null. ThenmovedOnly("", file(it[2]).readText())compares an empty before against the new content and returns false, so the rename is never filtered out and the file stays inchangedClasses. The whole point of this PR — lettingpitestskip a file that only moved — therefore does not work in the build as it is run today. ThecheckMovedOnlytask cannot catch this because it only exercisesmovedOnlywith hard-coded strings and never invokesgit showorgit diff.@@ -478,0 +498,4 @@// a rename line reads "R<score>\t<old>\t<new>"; a file that only moved keeps its code (werkregie PR#90)val changed = git("diff", "--name-status", "-M", "--diff-filter=d", "--relative", base, "--", "src/main/kotlin").orEmpty().lines().map { it.split('\t') }.filterNot { it.size == 3 && it[0].startsWith("R") && movedOnly(git("show", "$base:./${it[1]}").orEmpty(), file(it[2]).readText()) }Not a real case: in
<rev>:<path>, a path that starts with./is relative to the current directory (gitrevisions,<rev>:<path>); only a path without./is relative to the root.In
dashboard/,git show HEAD:./build.gradle.ktsprints the first line ofdashboard/build.gradle.kts.Evidence end to end: on a trial branch on top of this one, I moved all 68 Kotlin files to
de.javagil.werkregie;./gradlew pitestPartialthen reportedTask :pitest SKIPPED, so each rename was found as moved only.