A build deploy follows the green build of main; it hands the runtime bundle over one ssh connection to a receiver on mih09, which swaps, restarts, checks the version and rolls back.
A build `deploy` follows the green build of `main`; it hands the runtime bundle over one ssh connection to a receiver on mih09, which swaps, restarts, checks the version and rolls back.
See the PR document in `doc/prs/`.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
hint 1 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: dashboard/build.gradle.kts (weakens checks 0.02, risk 0.00, security 0.01)
hint 1 finding(s) of low severity or rated minor by Jev: doc/prs/2026-10-14-PR#69-werkator-deploy.md:97
hint model recommends merge with caution
Findings
[medium] PR Document Contradiction at doc/prs/2026-10-14-PR#69-werkator-deploy.md:97
hint; Jev: real 0.88, severity 1.9 of 3
The last bullet of "Solution" (line 97) says: "the deploy of this PR is the first one, and it also brings 0.41.1 and 0.42.0 of PR#66 and PR#68 to mih09". But the deploy script (dashboard/packaging/werkregie-deploy) only sends the runtime bundle of the commit under test (0.43.0), and the receiver (dashboard/packaging/werkregie-deploy-receive) only swaps that bundle into werkregie-dashboard. The "Problem" section (line 17) explicitly states 0.41.1 and 0.42.0 were "merged but not deployed" — the code in this PR does not perform that backfill. As written, the document implies the automatic deploy installs those older versions onto mih09, which it does not. If a manual deploy of those versions is meant to be part of the merge work, the text does not say so.
Classifier
9 of 9 units passed all questions (1 PR document(s)).
1 answer ignored because of a confidence below [classifier] min_confidence.
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 20610, calls 1, tokens in 19887 / out 29865 (reasoning included in out), duration 204.6 s, cost 0.0418 USD (reported), classifier `jev-1.13.0` calls 9, tokens in 7462, cost 0.0003 USD, finding judge `jev-1.13.0` calls 1, tokens in 2041, cost 0.0001 USD, build file judge `jev-1.13.0` calls 5, tokens in 5427, cost 0.0002 USD, phases: path_judge 0.4 s, classifier 0.7 s, context 0.3 s, model_review 202.5 s, finding_judge 0.3 s, config: defaults + host + repository (.werkrevisor.toml at main 35d86e5).
Reviewed head `d628bf4db40398f00ff7c0619d502b9c95a6b096` against base `35d86e53ed89f7c14b02d849ead9f5b3fc0f8355`, werkrevisor 0.41.2.
<!-- werkrevisor:d628bf4db40398f00ff7c0619d502b9c95a6b096 -->
<!-- werkrevisor-verdict:YELLOW -->
<!-- werkrevisor-blocks:54a571607cee9591ba2eb07777480e88,34e2f7939f88c5c2d7081dfc3c25f469,09918d614ee5bf4e45b04bb7e46cbbe3,3847eeada1d549886aeda675d5a243a3,9c9e580ed55ddf38d3f891eac0c1c7fc,a94a2560ce4b35fcbddd6da093df31d4,8b70147e78c7db8442a59cac8d219db8,5aeb135e54ef99191ee8e4b90e1a0c62,2aebffbaa01c939d80315e0f3e626e23,e128f99540afe8c70bfe76ee6436cfee,669773292233fc9e49416b194267e730 -->
<!-- werkrevisor-folded -->
<details><summary>🟡 werkrevisor YELLOW for <code>d628bf4</code>, superseded by <a href="http://git.javagil.de/mi/werkregie/pulls/69#issuecomment-5480">the result for <code>63b5ae5</code></a></summary>
## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind: `mixed`.
### Reasons
- **YELLOW** risky build changes according to Jev: .werkator.yml (weakens checks 0.06, risk 1.99, security 0.26), dashboard/packaging/werkregie-deploy (weakens checks 0.04, risk 2.00, security 0.65), dashboard/packaging/werkregie-deploy-receive (weakens checks 0.04, risk 2.07, security 0.32)
- **hint** 1 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: dashboard/build.gradle.kts (weakens checks 0.02, risk 0.00, security 0.01)
- **hint** 1 finding(s) of low severity or rated minor by Jev: doc/prs/2026-10-14-PR#69-werkator-deploy.md:97
- **hint** model recommends merge with caution
### Findings
1. **[medium] PR Document Contradiction** at `doc/prs/2026-10-14-PR#69-werkator-deploy.md:97`
hint; Jev: real 0.88, severity 1.9 of 3
The last bullet of "Solution" (line 97) says: "the deploy of this PR is the first one, and it also brings 0.41.1 and 0.42.0 of PR#66 and PR#68 to mih09". But the deploy script (`dashboard/packaging/werkregie-deploy`) only sends the runtime bundle of the commit under test (0.43.0), and the receiver (`dashboard/packaging/werkregie-deploy-receive`) only swaps that bundle into `werkregie-dashboard`. The "Problem" section (line 17) explicitly states 0.41.1 and 0.42.0 were "merged but not deployed" — the code in this PR does not perform that backfill. As written, the document implies the automatic deploy installs those older versions onto mih09, which it does not. If a manual deploy of those versions is meant to be part of the merge work, the text does not say so.
### Classifier
9 of 9 units passed all questions (1 PR document(s)).
1 answer ignored because of a confidence below [classifier] min_confidence.
<sub>
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 20610, calls 1, tokens in 19887 / out 29865 (reasoning included in out), duration 204.6 s, cost 0.0418 USD (reported), classifier `jev-1.13.0` calls 9, tokens in 7462, cost 0.0003 USD, finding judge `jev-1.13.0` calls 1, tokens in 2041, cost 0.0001 USD, build file judge `jev-1.13.0` calls 5, tokens in 5427, cost 0.0002 USD, phases: path_judge 0.4 s, classifier 0.7 s, context 0.3 s, model_review 202.5 s, finding_judge 0.3 s, config: defaults + host + repository (.werkrevisor.toml at main 35d86e5).<br>
Reviewed head `d628bf4db40398f00ff7c0619d502b9c95a6b096` against base `35d86e53ed89f7c14b02d849ead9f5b3fc0f8355`, werkrevisor 0.41.2.
</sub>
</details>
ai-review/assessment AI findings; a developer approval after checking them unlocks the merge; the approval of mi came before this result; review requested again, please approve again after reading it; merge already scheduled
hint 1 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: dashboard/build.gradle.kts (weakens checks 0.02, risk 0.00, security 0.01)
hint 2 finding(s) of low severity or rated minor by Jev: dashboard/README.md:142-146, doc/prs/2026-10-14-PR#69-werkator-deploy.md:55
hint model recommends merge with caution
Findings
Launcher version handling untested at dashboard/packaging/werkregie-deploy-receive:30-35, severity unknown, counted as medium, ORANGE, as a line comment
Ambiguous "both cases" at dashboard/README.md:142-146, severity unknown, counted as medium
hint; Jev: real 0.77, severity 1.5 of 3
The README says "The build fails in both cases, and the service keeps running." without defining "both cases"; the preceding paragraph only describes one failure path (the service does not answer). A reader can parse the sentence as "in both cases the build fails", which contradicts the success scenario the section is built around. The intended meaning appears to be the two failure scenarios (no answer, launcher failure), but the wording is unclear.
Awkward scenario title at doc/prs/2026-10-14-PR#69-werkator-deploy.md:55, severity unknown, counted as medium
hint; Jev: real 0.38, severity 1.0 of 3
Scenario#69.03 is titled "a bundle whose launcher fails does not stop the service". The double negative ("does not stop") makes the title harder to parse than the alternative phrasings the document itself uses elsewhere (e.g. "leaves the service untouched" in the matching test name).
Classifier
9 of 9 units passed all questions (1 PR document(s)).
1 answer ignored because of a confidence below [classifier] min_confidence.
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 20756, calls 1, tokens in 20026 / out 39590 (reasoning included in out), duration 276.4 s, cost 0.0523 USD (reported), classifier `jev-1.13.0` calls 9, tokens in 7536, cost 0.0003 USD, finding judge `jev-1.13.0` calls 3, tokens in 6781, cost 0.0003 USD, build file judge `jev-1.13.0` calls 5, tokens in 5427, cost 0.0002 USD, phases: path_judge 0.4 s, classifier 0.7 s, context 0.3 s, model_review 274.1 s, finding_judge 0.3 s, config: defaults + host + repository (.werkrevisor.toml at main 35d86e5).
Reviewed head `63b5ae57bffc7e964bd427a7282ecd5cc9d38c06` against base `35d86e53ed89f7c14b02d849ead9f5b3fc0f8355`, werkrevisor 0.41.2.
<!-- werkrevisor:63b5ae57bffc7e964bd427a7282ecd5cc9d38c06 -->
<!-- werkrevisor-verdict:ORANGE -->
<!-- werkrevisor-blocks:54a571607cee9591ba2eb07777480e88,34e2f7939f88c5c2d7081dfc3c25f469,3a3f8e1de44074c85f37649391d0c03c,3847eeada1d549886aeda675d5a243a3,9c9e580ed55ddf38d3f891eac0c1c7fc,a94a2560ce4b35fcbddd6da093df31d4,8b70147e78c7db8442a59cac8d219db8,f2c9af05cedaac9b3de3d7874049b9e7,2aebffbaa01c939d80315e0f3e626e23,e128f99540afe8c70bfe76ee6436cfee,669773292233fc9e49416b194267e730 -->
## 🟠 werkrevisor: ORANGE / FINDINGS
Gate: the approval of mi came before this result; review requested again, please approve again after reading it; merge already scheduled.
Change kind: `mixed`.
### Reasons
- **ORANGE** 1 finding(s) that Jev rates as probably real and severe: dashboard/packaging/werkregie-deploy-receive:30-35
- **YELLOW** risky build changes according to Jev: .werkator.yml (weakens checks 0.06, risk 1.98, security 0.25), dashboard/packaging/werkregie-deploy (weakens checks 0.04, risk 2.00, security 0.64), dashboard/packaging/werkregie-deploy-receive (weakens checks 0.03, risk 2.04, security 0.30)
- **hint** 1 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: dashboard/build.gradle.kts (weakens checks 0.02, risk 0.00, security 0.01)
- **hint** 2 finding(s) of low severity or rated minor by Jev: dashboard/README.md:142-146, doc/prs/2026-10-14-PR#69-werkator-deploy.md:55
- **hint** model recommends merge with caution
### Findings
1. **Launcher version handling untested** at `dashboard/packaging/werkregie-deploy-receive:30-35`, severity unknown, counted as medium, ORANGE, as a line comment
2. **Ambiguous "both cases"** at `dashboard/README.md:142-146`, severity unknown, counted as medium
hint; Jev: real 0.77, severity 1.5 of 3
The README says "The build fails in both cases, and the service keeps running." without defining "both cases"; the preceding paragraph only describes one failure path (the service does not answer). A reader can parse the sentence as "in both cases the build fails", which contradicts the success scenario the section is built around. The intended meaning appears to be the two failure scenarios (no answer, launcher failure), but the wording is unclear.
3. **Awkward scenario title** at `doc/prs/2026-10-14-PR#69-werkator-deploy.md:55`, severity unknown, counted as medium
hint; Jev: real 0.38, severity 1.0 of 3
Scenario#69.03 is titled "a bundle whose launcher fails does not stop the service". The double negative ("does not stop") makes the title harder to parse than the alternative phrasings the document itself uses elsewhere (e.g. "leaves the service untouched" in the matching test name).
### Classifier
9 of 9 units passed all questions (1 PR document(s)).
1 answer ignored because of a confidence below [classifier] min_confidence.
<sub>
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 20756, calls 1, tokens in 20026 / out 39590 (reasoning included in out), duration 276.4 s, cost 0.0523 USD (reported), classifier `jev-1.13.0` calls 9, tokens in 7536, cost 0.0003 USD, finding judge `jev-1.13.0` calls 3, tokens in 6781, cost 0.0003 USD, build file judge `jev-1.13.0` calls 5, tokens in 5427, cost 0.0002 USD, phases: path_judge 0.4 s, classifier 0.7 s, context 0.3 s, model_review 274.1 s, finding_judge 0.3 s, config: defaults + host + repository (.werkrevisor.toml at main 35d86e5).<br>
Reviewed head `63b5ae57bffc7e964bd427a7282ecd5cc9d38c06` against base `35d86e53ed89f7c14b02d849ead9f5b3fc0f8355`, werkrevisor 0.41.2.
</sub>
werkrevisor: ORANGE / FINDINGS for 63b5ae57bffc7e964bd427a7282ecd5cc9d38c06.
The result comment of werkrevisor holds the details.
werkrevisor: ORANGE / FINDINGS for `63b5ae57bffc7e964bd427a7282ecd5cc9d38c06`.
The result comment of werkrevisor holds the details.
<!-- werkrevisor-review:63b5ae57bffc7e964bd427a7282ecd5cc9d38c06 -->
Launcher version handling untested, severity unknown, counted as medium (werkrevisor)
ORANGE; Jev: real 0.72, severity 2.8 of 3
The receiver calls "$new/bin/werkregie-dashboard" version and parses the stdout as the version; the DeployReceiveTest only uses stub launchers (echo 9.9.9, exit 1), so the real launcher from src/bundle/bin is never exercised. If that launcher does not handle the bare version argument (the standard Gradle application launcher does not — --version is the only version flag it handles itself), every deploy would fail with "the launcher of the new runtime fails" before the service is touched, and the swap/rollback path would never be reached on a green main. The PR should either add a test that runs the real launcher, or document the version argument as a requirement of the bundle's launcher.
**Launcher version handling untested**, severity unknown, counted as medium (werkrevisor)
ORANGE; Jev: real 0.72, severity 2.8 of 3
The receiver calls `"$new/bin/werkregie-dashboard" version` and parses the stdout as the version; the DeployReceiveTest only uses stub launchers (`echo 9.9.9`, `exit 1`), so the real launcher from `src/bundle/bin` is never exercised. If that launcher does not handle the bare `version` argument (the standard Gradle application launcher does not — `--version` is the only version flag it handles itself), every deploy would fail with "the launcher of the new runtime fails" before the service is touched, and the swap/rollback path would never be reached on a green main. The PR should either add a test that runs the real launcher, or document the `version` argument as a requirement of the bundle's launcher.
ai-reviewer
requested review from mi 2026-10-14 14:06:14 +02:00
Not fixed here: the PR merged before the fix. Fixed in follow-up PR#70.
The launcher is the repository's own src/bundle/bin/werkregie-dashboard, not Gradle's start script; it passes "$@" to MainKt, and Main.kt:68 handles version. PR#70 adds the proof: the test runs this launcher with the real Main, and fails without "$@".
Not fixed here: the PR merged before the fix. Fixed in follow-up [PR#70](https://git.javagil.de/mi/werkregie/pulls/70).
The launcher is the repository's own `src/bundle/bin/werkregie-dashboard`, not Gradle's start script; it passes `"$@"` to `MainKt`, and `Main.kt:68` handles `version`. PR#70 adds the proof: the test runs this launcher with the real `Main`, and fails without `"$@"`.
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.
A build
deployfollows the green build ofmain; it hands the runtime bundle over one ssh connection to a receiver on mih09, which swaps, restarts, checks the version and rolls back.See the PR document in
doc/prs/.🤖 Generated with Claude Code
🟡 werkrevisor YELLOW for
f167b52, superseded by the result ford628bf4🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind:
mixed.Reasons
Classifier
8 of 9 units passed all questions (1 PR document(s)).
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 20670, calls 1, tokens in 19943 / out 27737 (reasoning included in out), duration 197.5 s, cost 0.0392 USD (reported), classifier `jev-1.13.0` calls 9, tokens in 7488, cost 0.0003 USD, build file judge `jev-1.13.0` calls 5, tokens in 5427, cost 0.0002 USD, phases: path_judge 0.5 s, classifier 0.7 s, context 0.2 s, model_review 195.8 s, config: defaults + host + repository (.werkrevisor.toml at main1 answer ignored because of a confidence below [classifier] min_confidence.
35d86e5).Reviewed head `f167b522246e1d432e3a17bc3eb678518f36cfb7` against base `35d86e53ed89f7c14b02d849ead9f5b3fc0f8355`, werkrevisor 0.41.2.
🟡 werkrevisor YELLOW for
d628bf4, superseded by the result for63b5ae5🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind:
mixed.Reasons
Findings
[medium] PR Document Contradiction at
doc/prs/2026-10-14-PR#69-werkator-deploy.md:97hint; Jev: real 0.88, severity 1.9 of 3
The last bullet of "Solution" (line 97) says: "the deploy of this PR is the first one, and it also brings 0.41.1 and 0.42.0 of PR#66 and PR#68 to mih09". But the deploy script (
dashboard/packaging/werkregie-deploy) only sends the runtime bundle of the commit under test (0.43.0), and the receiver (dashboard/packaging/werkregie-deploy-receive) only swaps that bundle intowerkregie-dashboard. The "Problem" section (line 17) explicitly states 0.41.1 and 0.42.0 were "merged but not deployed" — the code in this PR does not perform that backfill. As written, the document implies the automatic deploy installs those older versions onto mih09, which it does not. If a manual deploy of those versions is meant to be part of the merge work, the text does not say so.Classifier
9 of 9 units passed all questions (1 PR document(s)).
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 20610, calls 1, tokens in 19887 / out 29865 (reasoning included in out), duration 204.6 s, cost 0.0418 USD (reported), classifier `jev-1.13.0` calls 9, tokens in 7462, cost 0.0003 USD, finding judge `jev-1.13.0` calls 1, tokens in 2041, cost 0.0001 USD, build file judge `jev-1.13.0` calls 5, tokens in 5427, cost 0.0002 USD, phases: path_judge 0.4 s, classifier 0.7 s, context 0.3 s, model_review 202.5 s, finding_judge 0.3 s, config: defaults + host + repository (.werkrevisor.toml at main1 answer ignored because of a confidence below [classifier] min_confidence.
35d86e5).Reviewed head `d628bf4db40398f00ff7c0619d502b9c95a6b096` against base `35d86e53ed89f7c14b02d849ead9f5b3fc0f8355`, werkrevisor 0.41.2.
🟠 werkrevisor: ORANGE / FINDINGS
Gate: the approval of mi came before this result; review requested again, please approve again after reading it; merge already scheduled.
Change kind:
mixed.Reasons
Findings
Launcher version handling untested at
dashboard/packaging/werkregie-deploy-receive:30-35, severity unknown, counted as medium, ORANGE, as a line commentAmbiguous "both cases" at
dashboard/README.md:142-146, severity unknown, counted as mediumhint; Jev: real 0.77, severity 1.5 of 3
The README says "The build fails in both cases, and the service keeps running." without defining "both cases"; the preceding paragraph only describes one failure path (the service does not answer). A reader can parse the sentence as "in both cases the build fails", which contradicts the success scenario the section is built around. The intended meaning appears to be the two failure scenarios (no answer, launcher failure), but the wording is unclear.
Awkward scenario title at
doc/prs/2026-10-14-PR#69-werkator-deploy.md:55, severity unknown, counted as mediumhint; Jev: real 0.38, severity 1.0 of 3
Scenario#69.03 is titled "a bundle whose launcher fails does not stop the service". The double negative ("does not stop") makes the title harder to parse than the alternative phrasings the document itself uses elsewhere (e.g. "leaves the service untouched" in the matching test name).
Classifier
9 of 9 units passed all questions (1 PR document(s)).
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 20756, calls 1, tokens in 20026 / out 39590 (reasoning included in out), duration 276.4 s, cost 0.0523 USD (reported), classifier `jev-1.13.0` calls 9, tokens in 7536, cost 0.0003 USD, finding judge `jev-1.13.0` calls 3, tokens in 6781, cost 0.0003 USD, build file judge `jev-1.13.0` calls 5, tokens in 5427, cost 0.0002 USD, phases: path_judge 0.4 s, classifier 0.7 s, context 0.3 s, model_review 274.1 s, finding_judge 0.3 s, config: defaults + host + repository (.werkrevisor.toml at main1 answer ignored because of a confidence below [classifier] min_confidence.
35d86e5).Reviewed head `63b5ae57bffc7e964bd427a7282ecd5cc9d38c06` against base `35d86e53ed89f7c14b02d849ead9f5b3fc0f8355`, werkrevisor 0.41.2.
werkrevisor: ORANGE / FINDINGS for
63b5ae57bffc7e964bd427a7282ecd5cc9d38c06.The result comment of werkrevisor holds the details.
@@ -0,0 +27,4 @@rm -rf "$new"mkdir -p "$new"tar -xzf - -C "$new" --strip-components=1if ! version=$("$new/bin/werkregie-dashboard" version); thenLauncher version handling untested, severity unknown, counted as medium (werkrevisor)
ORANGE; Jev: real 0.72, severity 2.8 of 3
The receiver calls
"$new/bin/werkregie-dashboard" versionand parses the stdout as the version; the DeployReceiveTest only uses stub launchers (echo 9.9.9,exit 1), so the real launcher fromsrc/bundle/binis never exercised. If that launcher does not handle the bareversionargument (the standard Gradle application launcher does not —--versionis the only version flag it handles itself), every deploy would fail with "the launcher of the new runtime fails" before the service is touched, and the swap/rollback path would never be reached on a green main. The PR should either add a test that runs the real launcher, or document theversionargument as a requirement of the bundle's launcher.Not fixed here: the PR merged before the fix. Fixed in follow-up PR#70.
The launcher is the repository's own
src/bundle/bin/werkregie-dashboard, not Gradle's start script; it passes"$@"toMainKt, andMain.kt:68handlesversion. PR#70 adds the proof: the test runs this launcher with the realMain, and fails without"$@".