UiControllerRestTest (52 tests) is split into one spec per page or page family on a shared abstract base, so PIT runs only the page specs a mutated line reaches. See docs/prs/2026-10-10-PR#142-ui-page-specs-per-page.md.
UiControllerRestTest (52 tests) is split into one spec per page or page family on a shared abstract base, so PIT runs only the page specs a mutated line reaches. See docs/prs/2026-10-10-PR#142-ui-page-specs-per-page.md.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
claude-code
changed title from WIP: UI page specs per page (v1.38.9) to WIP: UI page specs per page (v1.38.10)2026-10-10 11:54:29 +02:00
YELLOW tests lost or disabled: src/test/kotlin/de/hoennig/werkator/server/UiControllerRestTest.kt deleted
YELLOW PR too large for an AI-only approval: 2578 changed lines (docs and mechanical files not counted) exceed [size] max_changed_lines = 800; please review it yourself
YELLOW changed files not judged by Jev: src/test/kotlin/de/hoennig/werkator/server/UiControllerRestTest.kt (larger than [classifier] max_state_chars)
hint 7 changed file(s) that neither weaken the checks, touch security nor show a risk category of jvm-spring-backend according to Jev
hint 1 build change(s) of low risk according to Jev: build.gradle.kts (weakens checks 0.03, risk 0.00, security 0.01)
hint 1 changed file was given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (each larger than [review] max_full_file_chars = 80000): src/main/resources/templates/releases.html
hint 2 finding(s) of low severity or rated minor by Jev: src/test/kotlin/de/hoennig/werkator/server/UiPageRestTest.kt:25-32, src/test/kotlin/de/hoennig/werkator/server/UiSystemPageRestTest.kt:29-30
Findings
Unused imports at src/test/kotlin/de/hoennig/werkator/server/UiPageRestTest.kt:25-32, severity unknown, counted as medium, hint, as a line comment
Duplicate stub setup at src/test/kotlin/de/hoennig/werkator/server/UiSystemPageRestTest.kt:29-30, severity unknown, counted as medium, hint, as a line comment
Classifier
4 of 4 units passed all questions (1 PR document(s)).
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 51030, calls 1, tokens in 49153 / out 19971 (reasoning included in out), duration 202.3 s, cost 0.0387 USD (reported), classifier `jev-1.13.0` calls 4, tokens in 3114, cost 0.0001 USD, finding judge `jev-1.13.0` calls 2, tokens in 4800, cost 0.0002 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 29685 / out 139, cost 0.0038 USD (reported), build file judge `jev-1.13.0` calls 8, tokens in 21620, cost 0.0009 USD, phases: path_judge 0.8 s, classifier 0.2 s, context 5.7 s, model_review 194.5 s, finding_judge 0.3 s, config: defaults + host + repository (.werkrevisor.toml at main 6f86b96).
Reviewed head `add658d8621e0e68cccddf507bac280a40b1d990` against base `6f86b96850a6cf12202b5aa05108848ddbf9301d`, werkrevisor 0.31.3.
<!-- werkrevisor:add658d8621e0e68cccddf507bac280a40b1d990 -->
<!-- werkrevisor-verdict:YELLOW -->
<!-- werkrevisor-folded -->
<details><summary>🟡 werkrevisor YELLOW for <code>add658d</code>, superseded by <a href="http://git.javagil.de/mi/werkator/pulls/142#issuecomment-3058">the result for <code>f6441c0</code></a></summary>
## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind: `mixed`.
### Reasons
- **YELLOW** tests lost or disabled: src/test/kotlin/de/hoennig/werkator/server/UiControllerRestTest.kt deleted
- **YELLOW** PR too large for an AI-only approval: 2578 changed lines (docs and mechanical files not counted) exceed [size] max_changed_lines = 800; please review it yourself
- **YELLOW** changed files not judged by Jev: src/test/kotlin/de/hoennig/werkator/server/UiControllerRestTest.kt (larger than [classifier] max_state_chars)
- **hint** 7 changed file(s) that neither weaken the checks, touch security nor show a risk category of jvm-spring-backend according to Jev
- **hint** 1 build change(s) of low risk according to Jev: build.gradle.kts (weakens checks 0.03, risk 0.00, security 0.01)
- **hint** 1 changed file was given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (each larger than [review] max_full_file_chars = 80000): src/main/resources/templates/releases.html
- **hint** 2 finding(s) of low severity or rated minor by Jev: src/test/kotlin/de/hoennig/werkator/server/UiPageRestTest.kt:25-32, src/test/kotlin/de/hoennig/werkator/server/UiSystemPageRestTest.kt:29-30
### Findings
1. **Unused imports** at `src/test/kotlin/de/hoennig/werkator/server/UiPageRestTest.kt:25-32`, severity unknown, counted as medium, hint, as a line comment
2. **Duplicate stub setup** at `src/test/kotlin/de/hoennig/werkator/server/UiSystemPageRestTest.kt:29-30`, severity unknown, counted as medium, hint, as a line comment
### Classifier
4 of 4 units passed all questions (1 PR document(s)).
<sub>
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 51030, calls 1, tokens in 49153 / out 19971 (reasoning included in out), duration 202.3 s, cost 0.0387 USD (reported), classifier `jev-1.13.0` calls 4, tokens in 3114, cost 0.0001 USD, finding judge `jev-1.13.0` calls 2, tokens in 4800, cost 0.0002 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 29685 / out 139, cost 0.0038 USD (reported), build file judge `jev-1.13.0` calls 8, tokens in 21620, cost 0.0009 USD, phases: path_judge 0.8 s, classifier 0.2 s, context 5.7 s, model_review 194.5 s, finding_judge 0.3 s, config: defaults + host + repository (.werkrevisor.toml at main 6f86b96).<br>
Reviewed head `add658d8621e0e68cccddf507bac280a40b1d990` against base `6f86b96850a6cf12202b5aa05108848ddbf9301d`, werkrevisor 0.31.3.
</sub>
</details>
werkrevisor: YELLOW / HUMAN_REVIEW for add658d8621e0e68cccddf507bac280a40b1d990.
The result comment of werkrevisor holds the details.
werkrevisor: YELLOW / HUMAN_REVIEW for `add658d8621e0e68cccddf507bac280a40b1d990`.
The result comment of werkrevisor holds the details.
<!-- werkrevisor-review:add658d8621e0e68cccddf507bac280a40b1d990 -->
Unused imports, severity unknown, counted as medium (werkrevisor)
hint; Jev: real 0.85, severity 0.9 of 3
UiPageRestTest.kt imports org.hamcrest.Matchers.not, org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get and org.springframework.test.web.servlet.result.MockMvcResultMatchers.status but never uses them in the body (the file only references mockMvc and helpers, never not(, MockMvcRequestBuilders.get(, or MockMvcResultMatchers.status(…). Same kind of leftover: org.hamcrest.Matchers.not is imported but unused in UiHomeRestTest.kt and in UiSystemPageRestTest.kt. Ktlint's unused-import rule will normally fail the build, so these would block the PR.
**Unused imports**, severity unknown, counted as medium (werkrevisor)
hint; Jev: real 0.85, severity 0.9 of 3
`UiPageRestTest.kt` imports `org.hamcrest.Matchers.not`, `org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get` and `org.springframework.test.web.servlet.result.MockMvcResultMatchers.status` but never uses them in the body (the file only references `mockMvc` and helpers, never `not(`, `MockMvcRequestBuilders.get(`, or `MockMvcResultMatchers.status(…`). Same kind of leftover: `org.hamcrest.Matchers.not` is imported but unused in `UiHomeRestTest.kt` and in `UiSystemPageRestTest.kt`. Ktlint's unused-import rule will normally fail the build, so these would block the PR.
Duplicate stub setup, severity unknown, counted as medium (werkrevisor)
hint; Jev: real 0.46, severity 0.8 of 3
Two system-page tests register every { metricsCollector.history() } returns MetricsHistory() twice on consecutive lines (and once in UiLayoutRestTest.kt's system test). Setting the same every { ... } returns ... twice for the same matcher is a copy-paste artifact from the original spec; MockK is forgiving here, but it is noise the formatter/lint may flag and it should be cleaned up to one line.
**Duplicate stub setup**, severity unknown, counted as medium (werkrevisor)
hint; Jev: real 0.46, severity 0.8 of 3
Two system-page tests register `every { metricsCollector.history() } returns MetricsHistory()` twice on consecutive lines (and once in `UiLayoutRestTest.kt`'s system test). Setting the same `every { ... } returns ...` twice for the same matcher is a copy-paste artifact from the original spec; MockK is forgiving here, but it is noise the formatter/lint may flag and it should be cleaned up to one line.
YELLOW tests lost or disabled: src/test/kotlin/de/hoennig/werkator/server/UiControllerRestTest.kt deleted
YELLOW PR too large for an AI-only approval: 2572 changed lines (docs and mechanical files not counted) exceed [size] max_changed_lines = 800; please review it yourself
YELLOW changed files not judged by Jev: src/test/kotlin/de/hoennig/werkator/server/UiControllerRestTest.kt (larger than [classifier] max_state_chars)
hint 7 changed file(s) that neither weaken the checks, touch security nor show a risk category of jvm-spring-backend according to Jev
hint 1 build change(s) of low risk according to Jev: build.gradle.kts (weakens checks 0.03, risk 0.00, security 0.01)
hint 1 changed file was given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (each larger than [review] max_full_file_chars = 80000): src/main/resources/templates/releases.html
hint 1 finding(s) of low severity or rated minor by Jev: src/test/kotlin/de/hoennig/werkator/server/UiLayoutRestTest.kt:166-167
Findings
Duplicate stub setup at src/test/kotlin/de/hoennig/werkator/server/UiLayoutRestTest.kt:166-167, severity unknown, counted as medium, hint, as a line comment
Classifier
4 of 4 units passed all questions (1 PR document(s)).
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 50868, calls 1, tokens in 48998 / out 19040 (reasoning included in out), duration 184.6 s, cost 0.0375 USD (reported), classifier `jev-1.13.0` calls 4, tokens in 3114, cost 0.0001 USD, finding judge `jev-1.13.0` calls 1, tokens in 2258, cost 0.0001 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 29685 / out 131, cost 0.0004 USD (reported), build file judge `jev-1.13.0` calls 8, tokens in 21529, cost 0.0009 USD, phases: path_judge 0.5 s, classifier 0.2 s, context 4.0 s, model_review 178.9 s, finding_judge 0.2 s, config: defaults + host + repository (.werkrevisor.toml at main 6f86b96).
Reviewed head `f6441c036c305a2e26e087e10704dff89d78ceec` against base `6f86b96850a6cf12202b5aa05108848ddbf9301d`, werkrevisor 0.31.3.
<!-- werkrevisor:f6441c036c305a2e26e087e10704dff89d78ceec -->
<!-- werkrevisor-verdict:YELLOW -->
<!-- werkrevisor-folded -->
<details><summary>🟡 werkrevisor YELLOW for <code>f6441c0</code>, superseded by <a href="http://git.javagil.de/mi/werkator/pulls/142#issuecomment-3069">the result for <code>f3f5904</code></a></summary>
## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind: `mixed`.
### Reasons
- **YELLOW** tests lost or disabled: src/test/kotlin/de/hoennig/werkator/server/UiControllerRestTest.kt deleted
- **YELLOW** PR too large for an AI-only approval: 2572 changed lines (docs and mechanical files not counted) exceed [size] max_changed_lines = 800; please review it yourself
- **YELLOW** changed files not judged by Jev: src/test/kotlin/de/hoennig/werkator/server/UiControllerRestTest.kt (larger than [classifier] max_state_chars)
- **hint** 7 changed file(s) that neither weaken the checks, touch security nor show a risk category of jvm-spring-backend according to Jev
- **hint** 1 build change(s) of low risk according to Jev: build.gradle.kts (weakens checks 0.03, risk 0.00, security 0.01)
- **hint** 1 changed file was given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (each larger than [review] max_full_file_chars = 80000): src/main/resources/templates/releases.html
- **hint** 1 finding(s) of low severity or rated minor by Jev: src/test/kotlin/de/hoennig/werkator/server/UiLayoutRestTest.kt:166-167
### Findings
1. **Duplicate stub setup** at `src/test/kotlin/de/hoennig/werkator/server/UiLayoutRestTest.kt:166-167`, severity unknown, counted as medium, hint, as a line comment
### Classifier
4 of 4 units passed all questions (1 PR document(s)).
<sub>
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 50868, calls 1, tokens in 48998 / out 19040 (reasoning included in out), duration 184.6 s, cost 0.0375 USD (reported), classifier `jev-1.13.0` calls 4, tokens in 3114, cost 0.0001 USD, finding judge `jev-1.13.0` calls 1, tokens in 2258, cost 0.0001 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 29685 / out 131, cost 0.0004 USD (reported), build file judge `jev-1.13.0` calls 8, tokens in 21529, cost 0.0009 USD, phases: path_judge 0.5 s, classifier 0.2 s, context 4.0 s, model_review 178.9 s, finding_judge 0.2 s, config: defaults + host + repository (.werkrevisor.toml at main 6f86b96).<br>
Reviewed head `f6441c036c305a2e26e087e10704dff89d78ceec` against base `6f86b96850a6cf12202b5aa05108848ddbf9301d`, werkrevisor 0.31.3.
</sub>
</details>
werkrevisor: YELLOW / HUMAN_REVIEW for f6441c036c305a2e26e087e10704dff89d78ceec.
The result comment of werkrevisor holds the details.
werkrevisor: YELLOW / HUMAN_REVIEW for `f6441c036c305a2e26e087e10704dff89d78ceec`.
The result comment of werkrevisor holds the details.
<!-- werkrevisor-review:f6441c036c305a2e26e087e10704dff89d78ceec -->
Duplicate stub setup, severity unknown, counted as medium (werkrevisor)
hint; Jev: real 0.65, severity 0.8 of 3
In the test "the system page is an instance page: its own title, no repository crumb (Scenario#35.01)", the line every { metricsCollector.history() } returns MetricsHistory() is set on two consecutive lines (lines 166-167). One is redundant; the test still passes because both stubs are identical. Likely a copy-paste leftover from splitting the former spec.
**Duplicate stub setup**, severity unknown, counted as medium (werkrevisor)
hint; Jev: real 0.65, severity 0.8 of 3
In the test "the system page is an instance page: its own title, no repository crumb (Scenario#35.01)", the line `every { metricsCollector.history() } returns MetricsHistory()` is set on two consecutive lines (lines 166-167). One is redundant; the test still passes because both stubs are identical. Likely a copy-paste leftover from splitting the former spec.
Fixed in f3f5904: the doubled metricsCollector.history() stub, moved over from UiControllerRestTest, stands once. No other spec of this PR stubs a line twice in a row.
Fixed in f3f5904: the doubled `metricsCollector.history()` stub, moved over from `UiControllerRestTest`, stands once. No other spec of this PR stubs a line twice in a row.
YELLOW tests lost or disabled: src/test/kotlin/de/hoennig/werkator/server/UiControllerRestTest.kt deleted
YELLOW PR too large for an AI-only approval: 2571 changed lines (docs and mechanical files not counted) exceed [size] max_changed_lines = 800; please review it yourself
YELLOW changed files not judged by Jev: src/test/kotlin/de/hoennig/werkator/server/UiControllerRestTest.kt (larger than [classifier] max_state_chars)
hint 7 changed file(s) that neither weaken the checks, touch security nor show a risk category of jvm-spring-backend according to Jev
hint 1 build change(s) of low risk according to Jev: build.gradle.kts (weakens checks 0.03, risk 0.00, security 0.01)
hint 1 changed file was given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (each larger than [review] max_full_file_chars = 80000): src/main/resources/templates/releases.html
hint 1 finding(s) of low severity or rated minor by Jev: src/test/kotlin/de/hoennig/werkator/server/UiPageRestTest.kt:42
hint model recommends merge with caution
Findings
Naming convention at src/test/kotlin/de/hoennig/werkator/server/UiPageRestTest.kt:42, severity unknown, counted as medium, hint, as a line comment
Classifier
4 of 4 units passed all questions (1 PR document(s)).
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 51162, calls 1, tokens in 49277 / out 10996 (reasoning included in out), duration 117.5 s, cost 0.0279 USD (reported), classifier `jev-1.13.0` calls 4, tokens in 3114, cost 0.0001 USD, finding judge `jev-1.13.0` calls 1, tokens in 2188, cost 0.0001 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 29685 / out 151, cost 0.0004 USD (reported), build file judge `jev-1.13.0` calls 8, tokens in 21511, cost 0.0009 USD, phases: path_judge 0.5 s, classifier 0.3 s, context 4.3 s, model_review 111.5 s, finding_judge 0.2 s, config: defaults + host + repository (.werkrevisor.toml at main 6f86b96).
Reviewed head `f3f5904808518051dfb5f940fc88ec20d685932d` against base `6f86b96850a6cf12202b5aa05108848ddbf9301d`, werkrevisor 0.31.3.
<!-- werkrevisor:f3f5904808518051dfb5f940fc88ec20d685932d -->
<!-- werkrevisor-verdict:YELLOW -->
<!-- werkrevisor-folded -->
<details><summary>🟡 werkrevisor YELLOW for <code>f3f5904</code>, superseded by <a href="http://git.javagil.de/mi/werkator/pulls/142#issuecomment-3120">the result for <code>d75702a</code></a></summary>
## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind: `mixed`.
### Reasons
- **YELLOW** tests lost or disabled: src/test/kotlin/de/hoennig/werkator/server/UiControllerRestTest.kt deleted
- **YELLOW** PR too large for an AI-only approval: 2571 changed lines (docs and mechanical files not counted) exceed [size] max_changed_lines = 800; please review it yourself
- **YELLOW** changed files not judged by Jev: src/test/kotlin/de/hoennig/werkator/server/UiControllerRestTest.kt (larger than [classifier] max_state_chars)
- **hint** 7 changed file(s) that neither weaken the checks, touch security nor show a risk category of jvm-spring-backend according to Jev
- **hint** 1 build change(s) of low risk according to Jev: build.gradle.kts (weakens checks 0.03, risk 0.00, security 0.01)
- **hint** 1 changed file was given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (each larger than [review] max_full_file_chars = 80000): src/main/resources/templates/releases.html
- **hint** 1 finding(s) of low severity or rated minor by Jev: src/test/kotlin/de/hoennig/werkator/server/UiPageRestTest.kt:42
- **hint** model recommends merge with caution
### Findings
1. **Naming convention** at `src/test/kotlin/de/hoennig/werkator/server/UiPageRestTest.kt:42`, severity unknown, counted as medium, hint, as a line comment
### Classifier
4 of 4 units passed all questions (1 PR document(s)).
<sub>
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 51162, calls 1, tokens in 49277 / out 10996 (reasoning included in out), duration 117.5 s, cost 0.0279 USD (reported), classifier `jev-1.13.0` calls 4, tokens in 3114, cost 0.0001 USD, finding judge `jev-1.13.0` calls 1, tokens in 2188, cost 0.0001 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 29685 / out 151, cost 0.0004 USD (reported), build file judge `jev-1.13.0` calls 8, tokens in 21511, cost 0.0009 USD, phases: path_judge 0.5 s, classifier 0.3 s, context 4.3 s, model_review 111.5 s, finding_judge 0.2 s, config: defaults + host + repository (.werkrevisor.toml at main 6f86b96).<br>
Reviewed head `f3f5904808518051dfb5f940fc88ec20d685932d` against base `6f86b96850a6cf12202b5aa05108848ddbf9301d`, werkrevisor 0.31.3.
</sub>
</details>
werkrevisor: YELLOW / HUMAN_REVIEW for f3f5904808518051dfb5f940fc88ec20d685932d.
The result comment of werkrevisor holds the details.
werkrevisor: YELLOW / HUMAN_REVIEW for `f3f5904808518051dfb5f940fc88ec20d685932d`.
The result comment of werkrevisor holds the details.
<!-- werkrevisor-review:f3f5904808518051dfb5f940fc88ec20d685932d -->
Naming convention, severity unknown, counted as medium (werkrevisor)
hint; Jev: real 0.58, severity 1.6 of 3
The abstract base class is named UiPageRestTest, ending in Test rather than RestTest. AGENTS.md states every spec name ends in what it needs (*RestTest for a @WebMvcTest slice), and TestNamingConventionUnitTest enforces it. The base itself carries the @WebMvcTest annotation and is the shared context for all five subclasses. If the convention test inspects every FunSpec subclass regardless of abstract, this PR will fail the build. The author should rename to either match the *RestTest suffix the convention demands, or to something that makes the base explicitly a fixture (e.g., an AbstractUiPageRestTest or UiPageRestFixture) that the convention test is known to skip.
**Naming convention**, severity unknown, counted as medium (werkrevisor)
hint; Jev: real 0.58, severity 1.6 of 3
The abstract base class is named `UiPageRestTest`, ending in `Test` rather than `RestTest`. AGENTS.md states every spec name ends in what it needs (`*RestTest` for a `@WebMvcTest` slice), and `TestNamingConventionUnitTest` enforces it. The base itself carries the `@WebMvcTest` annotation and is the shared context for all five subclasses. If the convention test inspects every `FunSpec` subclass regardless of `abstract`, this PR will fail the build. The author should rename to either match the `*RestTest` suffix the convention demands, or to something that makes the base explicitly a fixture (e.g., an `AbstractUiPageRestTest` or `UiPageRestFixture`) that the convention test is known to skip.
No change needed: UiPageRestTest ends in RestTest (Ui·Page·RestTest), the suffix TestNamingConventionUnitTest asks for, and that test passed in this branch's build. Being abstract, Kotest and JUnit do not run the base itself; the five page specs that extend it end in RestTest as well.
No change needed: `UiPageRestTest` ends in `RestTest` (Ui·Page·RestTest), the suffix `TestNamingConventionUnitTest` asks for, and that test passed in this branch's build. Being abstract, Kotest and JUnit do not run the base itself; the five page specs that extend it end in `RestTest` as well.
YELLOW tests lost or disabled: src/test/kotlin/de/hoennig/werkator/server/UiControllerRestTest.kt deleted
YELLOW PR too large for an AI-only approval: 2571 changed lines (docs and mechanical files not counted) exceed [size] max_changed_lines = 800; please review it yourself
YELLOW changed files not judged by Jev: src/test/kotlin/de/hoennig/werkator/server/UiControllerRestTest.kt (larger than [classifier] max_state_chars)
hint 7 changed file(s) that neither weaken the checks, touch security nor show a risk category of jvm-spring-backend according to Jev
hint 1 build change(s) of low risk according to Jev: build.gradle.kts (weakens checks 0.03, risk 0.00, security 0.01)
hint 1 changed file was given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (each larger than [review] max_full_file_chars = 80000): src/main/resources/templates/releases.html
Classifier
4 of 4 units passed all questions (1 PR document(s)).
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 51747, calls 1, tokens in 49831 / out 15039 (reasoning included in out), duration 99.5 s, cost 0.0330 USD (reported), classifier `jev-1.13.0` calls 4, tokens in 3114, cost 0.0001 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 29870 / out 199, cost 0.0038 USD (reported), build file judge `jev-1.13.0` calls 8, tokens in 21513, cost 0.0009 USD, phases: path_judge 0.5 s, classifier 0.3 s, context 4.1 s, model_review 94.5 s, config: defaults + host + repository (.werkrevisor.toml at main da0e828).
Reviewed head `d75702a914c3eb15477db12ce3e4e520260d9685` against base `da0e82889e784a772fda358c78363b2e63f81ec1`, werkrevisor 0.31.6.
<!-- werkrevisor:d75702a914c3eb15477db12ce3e4e520260d9685 -->
<!-- werkrevisor-verdict:YELLOW -->
## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind: `mixed`.
### Reasons
- **YELLOW** tests lost or disabled: src/test/kotlin/de/hoennig/werkator/server/UiControllerRestTest.kt deleted
- **YELLOW** PR too large for an AI-only approval: 2571 changed lines (docs and mechanical files not counted) exceed [size] max_changed_lines = 800; please review it yourself
- **YELLOW** changed files not judged by Jev: src/test/kotlin/de/hoennig/werkator/server/UiControllerRestTest.kt (larger than [classifier] max_state_chars)
- **hint** 7 changed file(s) that neither weaken the checks, touch security nor show a risk category of jvm-spring-backend according to Jev
- **hint** 1 build change(s) of low risk according to Jev: build.gradle.kts (weakens checks 0.03, risk 0.00, security 0.01)
- **hint** 1 changed file was given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (each larger than [review] max_full_file_chars = 80000): src/main/resources/templates/releases.html
### Classifier
4 of 4 units passed all questions (1 PR document(s)).
<sub>
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 51747, calls 1, tokens in 49831 / out 15039 (reasoning included in out), duration 99.5 s, cost 0.0330 USD (reported), classifier `jev-1.13.0` calls 4, tokens in 3114, cost 0.0001 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 29870 / out 199, cost 0.0038 USD (reported), build file judge `jev-1.13.0` calls 8, tokens in 21513, cost 0.0009 USD, phases: path_judge 0.5 s, classifier 0.3 s, context 4.1 s, model_review 94.5 s, config: defaults + host + repository (.werkrevisor.toml at main da0e828).<br>
Reviewed head `d75702a914c3eb15477db12ce3e4e520260d9685` against base `da0e82889e784a772fda358c78363b2e63f81ec1`, werkrevisor 0.31.6.
</sub>
ai-reviewer
requested review from mi 2026-10-10 13:34:04 +02:00
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.
UiControllerRestTest (52 tests) is split into one spec per page or page family on a shared abstract base, so PIT runs only the page specs a mutated line reaches. See docs/prs/2026-10-10-PR#142-ui-page-specs-per-page.md.
🤖 Generated with Claude Code
WIP: UI page specs per page (v1.38.9)to WIP: UI page specs per page (v1.38.10)f1a4f2197etoadd658d862🟡 werkrevisor YELLOW for
add658d, superseded by the result forf6441c0🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind:
mixed.Reasons
Findings
Unused imports at
src/test/kotlin/de/hoennig/werkator/server/UiPageRestTest.kt:25-32, severity unknown, counted as medium, hint, as a line commentDuplicate stub setup at
src/test/kotlin/de/hoennig/werkator/server/UiSystemPageRestTest.kt:29-30, severity unknown, counted as medium, hint, as a line commentClassifier
4 of 4 units passed all questions (1 PR document(s)).
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 51030, calls 1, tokens in 49153 / out 19971 (reasoning included in out), duration 202.3 s, cost 0.0387 USD (reported), classifier `jev-1.13.0` calls 4, tokens in 3114, cost 0.0001 USD, finding judge `jev-1.13.0` calls 2, tokens in 4800, cost 0.0002 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 29685 / out 139, cost 0.0038 USD (reported), build file judge `jev-1.13.0` calls 8, tokens in 21620, cost 0.0009 USD, phases: path_judge 0.8 s, classifier 0.2 s, context 5.7 s, model_review 194.5 s, finding_judge 0.3 s, config: defaults + host + repository (.werkrevisor.toml at main6f86b96).Reviewed head `add658d8621e0e68cccddf507bac280a40b1d990` against base `6f86b96850a6cf12202b5aa05108848ddbf9301d`, werkrevisor 0.31.3.
werkrevisor: YELLOW / HUMAN_REVIEW for
add658d8621e0e68cccddf507bac280a40b1d990.The result comment of werkrevisor holds the details.
@@ -0,0 +22,4 @@import io.mockk.clearMocksimport io.mockk.everyimport jakarta.servlet.http.HttpServletRequestimport org.hamcrest.Matchers.notUnused imports, severity unknown, counted as medium (werkrevisor)
hint; Jev: real 0.85, severity 0.9 of 3
UiPageRestTest.ktimportsorg.hamcrest.Matchers.not,org.springframework.test.web.servlet.request.MockMvcRequestBuilders.getandorg.springframework.test.web.servlet.result.MockMvcResultMatchers.statusbut never uses them in the body (the file only referencesmockMvcand helpers, nevernot(,MockMvcRequestBuilders.get(, orMockMvcResultMatchers.status(…). Same kind of leftover:org.hamcrest.Matchers.notis imported but unused inUiHomeRestTest.ktand inUiSystemPageRestTest.kt. Ktlint's unused-import rule will normally fail the build, so these would block the PR.Fixed in
f6441c0: the base no longer importsnot,getorstatus, andUiSystemPageRestTestno longer importsnot.@@ -0,0 +26,4 @@load15 = 0.3,)every { buildExecutor.currentBuilds() } returns emptyList()every { metricsCollector.history() } returns MetricsHistory()Duplicate stub setup, severity unknown, counted as medium (werkrevisor)
hint; Jev: real 0.46, severity 0.8 of 3
Two system-page tests register
every { metricsCollector.history() } returns MetricsHistory()twice on consecutive lines (and once inUiLayoutRestTest.kt's system test). Setting the sameevery { ... } returns ...twice for the same matcher is a copy-paste artifact from the original spec; MockK is forgiving here, but it is noise the formatter/lint may flag and it should be cleaned up to one line.Fixed in
f6441c0: the doubledmetricsCollector.history()stub, moved over fromUiControllerRestTest, stands once in both system-page tests.🟡 werkrevisor YELLOW for
f6441c0, superseded by the result forf3f5904🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind:
mixed.Reasons
Findings
src/test/kotlin/de/hoennig/werkator/server/UiLayoutRestTest.kt:166-167, severity unknown, counted as medium, hint, as a line commentClassifier
4 of 4 units passed all questions (1 PR document(s)).
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 50868, calls 1, tokens in 48998 / out 19040 (reasoning included in out), duration 184.6 s, cost 0.0375 USD (reported), classifier `jev-1.13.0` calls 4, tokens in 3114, cost 0.0001 USD, finding judge `jev-1.13.0` calls 1, tokens in 2258, cost 0.0001 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 29685 / out 131, cost 0.0004 USD (reported), build file judge `jev-1.13.0` calls 8, tokens in 21529, cost 0.0009 USD, phases: path_judge 0.5 s, classifier 0.2 s, context 4.0 s, model_review 178.9 s, finding_judge 0.2 s, config: defaults + host + repository (.werkrevisor.toml at main6f86b96).Reviewed head `f6441c036c305a2e26e087e10704dff89d78ceec` against base `6f86b96850a6cf12202b5aa05108848ddbf9301d`, werkrevisor 0.31.3.
werkrevisor: YELLOW / HUMAN_REVIEW for
f6441c036c305a2e26e087e10704dff89d78ceec.The result comment of werkrevisor holds the details.
@@ -0,0 +163,4 @@test("the system page is an instance page: its own title, no repository crumb (Scenario#35.01)") {every { metricsCollector.snapshot() } returns emptySystemMetricsevery { buildExecutor.currentBuilds() } returns emptyList()every { metricsCollector.history() } returns MetricsHistory()Duplicate stub setup, severity unknown, counted as medium (werkrevisor)
hint; Jev: real 0.65, severity 0.8 of 3
In the test "the system page is an instance page: its own title, no repository crumb (Scenario#35.01)", the line
every { metricsCollector.history() } returns MetricsHistory()is set on two consecutive lines (lines 166-167). One is redundant; the test still passes because both stubs are identical. Likely a copy-paste leftover from splitting the former spec.Fixed in
f3f5904: the doubledmetricsCollector.history()stub, moved over fromUiControllerRestTest, stands once. No other spec of this PR stubs a line twice in a row.🟡 werkrevisor YELLOW for
f3f5904, superseded by the result ford75702a🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind:
mixed.Reasons
Findings
src/test/kotlin/de/hoennig/werkator/server/UiPageRestTest.kt:42, severity unknown, counted as medium, hint, as a line commentClassifier
4 of 4 units passed all questions (1 PR document(s)).
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 51162, calls 1, tokens in 49277 / out 10996 (reasoning included in out), duration 117.5 s, cost 0.0279 USD (reported), classifier `jev-1.13.0` calls 4, tokens in 3114, cost 0.0001 USD, finding judge `jev-1.13.0` calls 1, tokens in 2188, cost 0.0001 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 29685 / out 151, cost 0.0004 USD (reported), build file judge `jev-1.13.0` calls 8, tokens in 21511, cost 0.0009 USD, phases: path_judge 0.5 s, classifier 0.3 s, context 4.3 s, model_review 111.5 s, finding_judge 0.2 s, config: defaults + host + repository (.werkrevisor.toml at main6f86b96).Reviewed head `f3f5904808518051dfb5f940fc88ec20d685932d` against base `6f86b96850a6cf12202b5aa05108848ddbf9301d`, werkrevisor 0.31.3.
werkrevisor: YELLOW / HUMAN_REVIEW for
f3f5904808518051dfb5f940fc88ec20d685932d.The result comment of werkrevisor holds the details.
@@ -0,0 +39,4 @@*/@WebMvcTest(UiController::class, properties = ["spring.main.web-application-type=servlet"])@Import(RepoLinks::class, RepoRouting::class)abstract class UiPageRestTest : FunSpec() {Naming convention, severity unknown, counted as medium (werkrevisor)
hint; Jev: real 0.58, severity 1.6 of 3
The abstract base class is named
UiPageRestTest, ending inTestrather thanRestTest. AGENTS.md states every spec name ends in what it needs (*RestTestfor a@WebMvcTestslice), andTestNamingConventionUnitTestenforces it. The base itself carries the@WebMvcTestannotation and is the shared context for all five subclasses. If the convention test inspects everyFunSpecsubclass regardless ofabstract, this PR will fail the build. The author should rename to either match the*RestTestsuffix the convention demands, or to something that makes the base explicitly a fixture (e.g., anAbstractUiPageRestTestorUiPageRestFixture) that the convention test is known to skip.No change needed:
UiPageRestTestends inRestTest(Ui·Page·RestTest), the suffixTestNamingConventionUnitTestasks for, and that test passed in this branch's build. Being abstract, Kotest and JUnit do not run the base itself; the five page specs that extend it end inRestTestas well.UI page specs per page (v1.38.10)to UI page specs per page (v1.38.14)f3f5904808tod75702a914New commits pushed, approval review dismissed automatically according to repository settings
🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind:
mixed.Reasons
Classifier
4 of 4 units passed all questions (1 PR document(s)).
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 51747, calls 1, tokens in 49831 / out 15039 (reasoning included in out), duration 99.5 s, cost 0.0330 USD (reported), classifier `jev-1.13.0` calls 4, tokens in 3114, cost 0.0001 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 29870 / out 199, cost 0.0038 USD (reported), build file judge `jev-1.13.0` calls 8, tokens in 21513, cost 0.0009 USD, phases: path_judge 0.5 s, classifier 0.3 s, context 4.1 s, model_review 94.5 s, config: defaults + host + repository (.werkrevisor.toml at mainda0e828).Reviewed head `d75702a914c3eb15477db12ce3e4e520260d9685` against base `da0e82889e784a772fda358c78363b2e63f81ec1`, werkrevisor 0.31.6.