werkrevisor 0.30.2: a dry run writes the model prompt to a file #65

Merged
ai-reviewer merged 5 commits from claude-code/prompt-out into main 2026-10-09 17:50:21 +02:00
Collaborator

See the PR document.

🤖 Generated with Claude Code

See [the PR document](docs/prs/2026-10-09-PR%2365-prompt-out.md). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
claude-code added 1 commit 2026-10-09 17:30:08 +02:00
PR document: a dry run writes the model prompt to a file
werkator build succeeded after 00:31
werkator/werkrevisor-statistics build succeeded after 00:40
c0a6880f42
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
mi added 1 commit 2026-10-09 17:32:07 +02:00
Dry run writes the admitted model prompt to a file instead of calling the model (0.30.2)
werkator build succeeded after 00:09
werkator/werkrevisor-statistics build succeeded after 00:35
ai-review/assessment human review required; a human approval unlocks the merge; review requested from mi; merge scheduled for when the checks succeed
ai-review/gate build succeeded after 01:22
dbb5256187
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude-code marked the pull request as ready for review 2026-10-09 17:32:51 +02:00
Collaborator
🟡 werkrevisor YELLOW for dbb5256, superseded by the result for bcdf1b6

🟡 werkrevisor: YELLOW / HUMAN_REVIEW

Change kind: mixed.

Reasons

  • YELLOW spec: docs/prs/2026-10-09-PR#65-prompt-out.md Scenario#65.01 given_when_then_misused (0.62 > yellow_above = 0.6)
  • hint 4 changed file(s) that neither weaken the checks nor touch security according to Jev
  • hint 1 build change(s) of low risk according to Jev: statistics/build.gradle.kts (weakens checks 0.02, risk 0.00, security 0.01)
  • hint 6 section(s) of the PR document agree with the change summary of openrouter/minimax/minimax-m3 according to Jev
  • hint 2 finding(s) of low severity or rated minor by Jev: werkrevisor/cli.py:1122-1123, docs/prs/2026-10-09-PR#65-prompt-out.md:52-58

Findings

  1. Incomplete help text at werkrevisor/cli.py:1122-1123, severity unknown, counted as medium, hint, as a line comment

  2. Scenario misses the --no-llm case at docs/prs/2026-10-09-PR#65-prompt-out.md:52-58, severity unknown, counted as medium, hint, as a line comment

Classifier

Unit Question Problem Confidence Verdict
docs/prs/2026-10-09-PR#65-prompt-out.md Scenario#65.01 given_when_then_misused 0.62 – YELLOW

5 of 6 units passed all questions (1 PR document(s)).
3 answers ignored because of a confidence below [classifier] min_confidence.

Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 33667, calls 1, tokens in 32573 / out 13908 (reasoning included in out), duration 79.4 s, cost 0.0264 USD (reported), classifier `jev-1.13.0` calls 6, tokens in 4904, cost 0.0002 USD, finding judge `jev-1.13.0` calls 2, tokens in 2860, cost 0.0001 USD, change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 3498 / out 1212, cost 0.0025 USD (reported), PR document check `jev-1.13.0` calls 6, tokens in 9263, cost 0.0004 USD, build file judge `jev-1.13.0` calls 5, tokens in 4706, cost 0.0002 USD, phases: path_judge 0.6 s, classifier 0.4 s, change_summary 7.5 s, doc_check 0.6 s, context 0.2 s, model_review 69.4 s, finding_judge 0.3 s, config: defaults + host + repository (.werkrevisor.toml at main e65eea0).
Reviewed head `dbb5256187b0e8a336dd7c4e59c5af9e509839c1` against base `e65eea0026c4b499de6c8868310fc4baf18e2c9d`, werkrevisor 0.30.1.
<!-- werkrevisor:dbb5256187b0e8a336dd7c4e59c5af9e509839c1 --> <!-- werkrevisor-verdict:YELLOW --> <!-- werkrevisor-folded --> <details><summary>🟡 werkrevisor YELLOW for <code>dbb5256</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/65#issuecomment-2519">the result for <code>bcdf1b6</code></a></summary> ## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW Change kind: `mixed`. ### Reasons - **YELLOW** spec: docs/prs/2026-10-09-PR#65-prompt-out.md Scenario#65.01 given_when_then_misused (0.62 > yellow_above = 0.6) - **hint** 4 changed file(s) that neither weaken the checks nor touch security according to Jev - **hint** 1 build change(s) of low risk according to Jev: statistics/build.gradle.kts (weakens checks 0.02, risk 0.00, security 0.01) - **hint** 6 section(s) of the PR document agree with the change summary of openrouter/minimax/minimax-m3 according to Jev - **hint** 2 finding(s) of low severity or rated minor by Jev: werkrevisor/cli.py:1122-1123, docs/prs/2026-10-09-PR#65-prompt-out.md:52-58 ### Findings 1. **Incomplete help text** at `werkrevisor/cli.py:1122-1123`, severity unknown, counted as medium, hint, as a line comment 2. **Scenario misses the --no-llm case** at `docs/prs/2026-10-09-PR#65-prompt-out.md:52-58`, severity unknown, counted as medium, hint, as a line comment ### Classifier | Unit | Question | Problem | Confidence | Verdict | |---|---|---|---|---| | docs/prs/2026-10-09-PR#65-prompt-out.md Scenario#65.01 | given_when_then_misused | 0.62 | – | YELLOW | 5 of 6 units passed all questions (1 PR document(s)). 3 answers ignored because of a confidence below [classifier] min_confidence. <sub> Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 33667, calls 1, tokens in 32573 / out 13908 (reasoning included in out), duration 79.4 s, cost 0.0264 USD (reported), classifier `jev-1.13.0` calls 6, tokens in 4904, cost 0.0002 USD, finding judge `jev-1.13.0` calls 2, tokens in 2860, cost 0.0001 USD, change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 3498 / out 1212, cost 0.0025 USD (reported), PR document check `jev-1.13.0` calls 6, tokens in 9263, cost 0.0004 USD, build file judge `jev-1.13.0` calls 5, tokens in 4706, cost 0.0002 USD, phases: path_judge 0.6 s, classifier 0.4 s, change_summary 7.5 s, doc_check 0.6 s, context 0.2 s, model_review 69.4 s, finding_judge 0.3 s, config: defaults + host + repository (.werkrevisor.toml at main e65eea0).<br> Reviewed head `dbb5256187b0e8a336dd7c4e59c5af9e509839c1` against base `e65eea0026c4b499de6c8868310fc4baf18e2c9d`, werkrevisor 0.30.1. </sub> </details>
ai-reviewer left a comment
Collaborator

werkrevisor: YELLOW / HUMAN_REVIEW for dbb5256187b0e8a336dd7c4e59c5af9e509839c1.
The result comment of werkrevisor holds the details.

werkrevisor: YELLOW / HUMAN_REVIEW for `dbb5256187b0e8a336dd7c4e59c5af9e509839c1`. The result comment of werkrevisor holds the details. <!-- werkrevisor-review:dbb5256187b0e8a336dd7c4e59c5af9e509839c1 -->
@@ -0,0 +49,4 @@
- [test_prompt_out.PromptOutTest.test_the_file_holds_the_prompt_after_the_size_checks](../../tests/test_prompt_out.py)
#### Scenario#65.03: only a dry run writes the prompt
Collaborator

Scenario misses the --no-llm case, severity unknown, counted as medium (werkrevisor)

hint; Jev: real 0.82, severity 1.8 of 3

The title of Scenario#65.03 says "only a dry run writes the prompt" and the Given/When/Then only describes --prompt-out without --no-publish, but the test (and the implementation in main()) also reject --prompt-out together with --no-llm. A reader of the PR document who only looks at the scenario will not know that --prompt-out --no-llm is also forbidden; the scenario should add an "And" line covering the --no-llm case so the scenario matches the verification.

**Scenario misses the --no-llm case**, severity unknown, counted as medium (werkrevisor) hint; Jev: real 0.82, severity 1.8 of 3 The title of Scenario#65.03 says "only a dry run writes the prompt" and the Given/When/Then only describes `--prompt-out` without `--no-publish`, but the test (and the implementation in `main()`) also reject `--prompt-out` together with `--no-llm`. A reader of the PR document who only looks at the scenario will not know that `--prompt-out --no-llm` is also forbidden; the scenario should add an "And" line covering the `--no-llm` case so the scenario matches the verification.
Author
Collaborator

Fixed in bcdf1b6: Scenario#65.03 covers --no-llm too, as the test does.

Fixed in `bcdf1b6`: Scenario#65.03 covers `--no-llm` too, as the test does.
claude-code marked this conversation as resolved
@@ -1103,6 +1119,8 @@ def parse_args(argv):
parser.add_argument("--no-llm", action="store_true", help="apply the deterministic rules only")
parser.add_argument("--allow-closed", action="store_true",
help="with --no-publish: also review a merged or closed PR (for offline measurement)")
parser.add_argument("--prompt-out", metavar="FILE",
Collaborator

Incomplete help text, severity unknown, counted as medium (werkrevisor)

hint; Jev: real 0.69, severity 2.1 of 3

The CLI help for --prompt-out states it is "with --no-publish", but the validation in main() also rejects --prompt-out combined with --no-llm. A user invoking --prompt-out FILE --no-llm will get a configuration error that the help text did not warn about, since the help implies that omitting the model call (--no-llm) is allowed. Either drop --no-llm from the check (and still pass --prompt-out without it) or document the second constraint in the help string.

**Incomplete help text**, severity unknown, counted as medium (werkrevisor) hint; Jev: real 0.69, severity 2.1 of 3 The CLI help for `--prompt-out` states it is "with --no-publish", but the validation in `main()` also rejects `--prompt-out` combined with `--no-llm`. A user invoking `--prompt-out FILE --no-llm` will get a configuration error that the help text did not warn about, since the help implies that omitting the model call (`--no-llm`) is allowed. Either drop `--no-llm` from the check (and still pass `--prompt-out` without it) or document the second constraint in the help string.
Author
Collaborator

Fixed in bcdf1b6: the help names both conditions, with --no-publish and without --no-llm.

Fixed in `bcdf1b6`: the help names both conditions, with `--no-publish` and without `--no-llm`.
claude-code marked this conversation as resolved
ai-reviewer scheduled this pull request to auto merge when all checks succeed 2026-10-09 17:34:21 +02:00
ai-reviewer requested review from mi 2026-10-09 17:34:21 +02:00
Author
Collaborator

Review round of dbb52561: Scenario#65.01 has a plain Given/When/Then now, and both hints are fixed in bcdf1b6.

Review round of `dbb52561`: Scenario#65.01 has a plain Given/When/Then now, and both hints are fixed in `bcdf1b6`.
mi added 1 commit 2026-10-09 17:43:06 +02:00
Scenario#65.01 with clear Given/When/Then; --no-llm in Scenario#65.03 and in the help text
werkator build succeeded after 00:12
werkator/werkrevisor-statistics build succeeded after 01:01
ai-review/assessment human review required; a human approval unlocks the merge; a human review request is pending; merge already scheduled
ai-review/gate build succeeded after 01:48
bcdf1b6e06
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Collaborator
🟡 werkrevisor YELLOW for bcdf1b6, superseded by the result for 9289382

🟡 werkrevisor: YELLOW / HUMAN_REVIEW

Change kind: mixed.

Reasons

  • YELLOW spec: docs/prs/2026-10-09-PR#65-prompt-out.md Scenario#65.03 hard_to_read (0.52 > yellow_above = 0.5)
  • hint 4 changed file(s) that neither weaken the checks nor touch security according to Jev
  • hint 1 build change(s) of low risk according to Jev: statistics/build.gradle.kts (weakens checks 0.02, risk 0.00, security 0.01)
  • hint 6 section(s) of the PR document agree with the change summary of openrouter/minimax/minimax-m3 according to Jev
  • hint 2 finding(s) of low severity or rated minor by Jev: tools/dry-run:39, docs/prs/2026-10-09-PR#65-prompt-out.md:54-55

Findings

  1. Misleading Error at tools/dry-run:39, severity unknown, counted as medium, hint, as a line comment

  2. Unclear Rationale at docs/prs/2026-10-09-PR#65-prompt-out.md:54-55, severity unknown, counted as medium, hint, as a line comment

Classifier

Unit Question Problem Confidence Verdict
docs/prs/2026-10-09-PR#65-prompt-out.md Scenario#65.03 hard_to_read 0.52 0.46 YELLOW

5 of 6 units passed all questions (1 PR document(s)).

Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 33565, calls 1, tokens in 32482 / out 22159 (reasoning included in out), duration 105.7 s, cost 0.0363 USD (reported), classifier `jev-1.13.0` calls 6, tokens in 4937, cost 0.0002 USD, finding judge `jev-1.13.0` calls 2, tokens in 2577, cost 0.0001 USD, change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 3509 / out 2168, cost 0.0036 USD (reported), PR document check `jev-1.13.0` calls 6, tokens in 8252, cost 0.0003 USD, build file judge `jev-1.13.0` calls 5, tokens in 4717, cost 0.0002 USD, phases: path_judge 0.4 s, classifier 0.7 s, change_summary 8.7 s, doc_check 0.5 s, context 1.6 s, model_review 93.3 s, finding_judge 0.3 s, config: defaults + host + repository (.werkrevisor.toml at main e65eea0).
Reviewed head `bcdf1b6e0648bbbdeef78ce60f90fbc9e06e1daa` against base `e65eea0026c4b499de6c8868310fc4baf18e2c9d`, werkrevisor 0.30.1.
<!-- werkrevisor:bcdf1b6e0648bbbdeef78ce60f90fbc9e06e1daa --> <!-- werkrevisor-verdict:YELLOW --> <!-- werkrevisor-folded --> <details><summary>🟡 werkrevisor YELLOW for <code>bcdf1b6</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/65#issuecomment-2529">the result for <code>9289382</code></a></summary> ## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW Change kind: `mixed`. ### Reasons - **YELLOW** spec: docs/prs/2026-10-09-PR#65-prompt-out.md Scenario#65.03 hard_to_read (0.52 > yellow_above = 0.5) - **hint** 4 changed file(s) that neither weaken the checks nor touch security according to Jev - **hint** 1 build change(s) of low risk according to Jev: statistics/build.gradle.kts (weakens checks 0.02, risk 0.00, security 0.01) - **hint** 6 section(s) of the PR document agree with the change summary of openrouter/minimax/minimax-m3 according to Jev - **hint** 2 finding(s) of low severity or rated minor by Jev: tools/dry-run:39, docs/prs/2026-10-09-PR#65-prompt-out.md:54-55 ### Findings 1. **Misleading Error** at `tools/dry-run:39`, severity unknown, counted as medium, hint, as a line comment 2. **Unclear Rationale** at `docs/prs/2026-10-09-PR#65-prompt-out.md:54-55`, severity unknown, counted as medium, hint, as a line comment ### Classifier | Unit | Question | Problem | Confidence | Verdict | |---|---|---|---|---| | docs/prs/2026-10-09-PR#65-prompt-out.md Scenario#65.03 | hard_to_read | 0.52 | 0.46 | YELLOW | 5 of 6 units passed all questions (1 PR document(s)). <sub> Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 33565, calls 1, tokens in 32482 / out 22159 (reasoning included in out), duration 105.7 s, cost 0.0363 USD (reported), classifier `jev-1.13.0` calls 6, tokens in 4937, cost 0.0002 USD, finding judge `jev-1.13.0` calls 2, tokens in 2577, cost 0.0001 USD, change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 3509 / out 2168, cost 0.0036 USD (reported), PR document check `jev-1.13.0` calls 6, tokens in 8252, cost 0.0003 USD, build file judge `jev-1.13.0` calls 5, tokens in 4717, cost 0.0002 USD, phases: path_judge 0.4 s, classifier 0.7 s, change_summary 8.7 s, doc_check 0.5 s, context 1.6 s, model_review 93.3 s, finding_judge 0.3 s, config: defaults + host + repository (.werkrevisor.toml at main e65eea0).<br> Reviewed head `bcdf1b6e0648bbbdeef78ce60f90fbc9e06e1daa` against base `e65eea0026c4b499de6c8868310fc4baf18e2c9d`, werkrevisor 0.30.1. </sub> </details>
ai-reviewer left a comment
Collaborator

werkrevisor: YELLOW / HUMAN_REVIEW for bcdf1b6e0648bbbdeef78ce60f90fbc9e06e1daa.
The result comment of werkrevisor holds the details.

werkrevisor: YELLOW / HUMAN_REVIEW for `bcdf1b6e0648bbbdeef78ce60f90fbc9e06e1daa`. The result comment of werkrevisor holds the details. <!-- werkrevisor-review:bcdf1b6e0648bbbdeef78ce60f90fbc9e06e1daa -->
@@ -0,0 +51,4 @@
#### Scenario#65.03: only a dry run writes the prompt
So that a review on the review machine never ends without a model review because of this option,
Collaborator

Unclear Rationale, severity unknown, counted as medium (werkrevisor)

hint; Jev: real 0.75, severity 1.3 of 3

The "So that" paragraph of Scenario#65.03 does not make clear why --prompt-out combined with --no-llm must fail; the second sentence about a dry run with --no-llm not ending before the prompt exists is hard to parse.

**Unclear Rationale**, severity unknown, counted as medium (werkrevisor) hint; Jev: real 0.75, severity 1.3 of 3 The "So that" paragraph of Scenario#65.03 does not make clear why --prompt-out combined with --no-llm must fail; the second sentence about a dry run with --no-llm not ending before the prompt exists is hard to parse.
Author
Collaborator

Fixed in 9289382: the --no-llm case is Scenario#65.04 with its own reason: with --no-llm, werkrevisor never builds a prompt.

Fixed in `9289382`: the `--no-llm` case is Scenario#65.04 with its own reason: with `--no-llm`, werkrevisor never builds a prompt.
claude-code marked this conversation as resolved
tools/dry-run Outdated
@@ -33,1 +36,4 @@
mkdir -p "$(dirname "$4")"
fi
if [[ "${3:-}" == "--llm" || "${3:-}" == "--prompt-out" ]]; then
: "${OPENROUTER_API_KEY:?OPENROUTER_API_KEY must be set for --llm}"
Collaborator

Misleading Error, severity unknown, counted as medium (werkrevisor)

hint; Jev: real 0.91, severity 1.6 of 3

The OPENROUTER_API_KEY guard triggers for both --llm and --prompt-out, but the message only mentions --llm, so a user invoking --prompt-out without the key gets a confusing error.

**Misleading Error**, severity unknown, counted as medium (werkrevisor) hint; Jev: real 0.91, severity 1.6 of 3 The OPENROUTER_API_KEY guard triggers for both --llm and --prompt-out, but the message only mentions --llm, so a user invoking --prompt-out without the key gets a confusing error.
Author
Collaborator

Fixed in 9289382: the message names --llm and --prompt-out.

Fixed in `9289382`: the message names `--llm` and `--prompt-out`.
claude-code marked this conversation as resolved
Author
Collaborator

Review round of bcdf1b6e: Scenario#65.03 is split into two plain scenarios, and both hints are fixed in 9289382.

Review round of `bcdf1b6e`: Scenario#65.03 is split into two plain scenarios, and both hints are fixed in `9289382`.
mi added 1 commit 2026-10-09 17:45:38 +02:00
Scenario#65.04 for --no-llm with its own reason; dry-run names --prompt-out in the key error
werkator build succeeded after 00:30
werkator/werkrevisor-statistics build succeeded after 00:50
ai-review/assessment AI findings; a developer approval after checking them unlocks the merge; a human review request is pending; merge already scheduled
ai-review/gate build succeeded after 02:14
9289382cef
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Collaborator
🟠 werkrevisor ORANGE for 9289382, superseded by the result for e0e74ff

🟠 werkrevisor: ORANGE / FINDINGS

Change kind: mixed.

Reasons

  • ORANGE 1 finding(s) that Jev rates as probably real and severe: tools/dry-run:34-37
  • hint 4 changed file(s) that neither weaken the checks nor touch security according to Jev
  • hint 1 build change(s) of low risk according to Jev: statistics/build.gradle.kts (weakens checks 0.02, risk 0.00, security 0.01)
  • hint 7 section(s) of the PR document agree with the change summary of openrouter/minimax/minimax-m3 according to Jev

Findings

  1. Loose path check at tools/dry-run:34-37, severity unknown, counted as medium, ORANGE, as a line comment

Classifier

7 of 7 units passed all questions (1 PR document(s)).
4 answers ignored because of a confidence below [classifier] min_confidence.

Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 33844, calls 1, tokens in 32740 / out 20737 (reasoning included in out), duration 129.1 s, cost 0.0347 USD (reported), classifier `jev-1.13.0` calls 7, tokens in 5786, cost 0.0002 USD, finding judge `jev-1.13.0` calls 1, tokens in 1617, cost 0.0001 USD, change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 3543 / out 1236, cost 0.0025 USD (reported), PR document check `jev-1.13.0` calls 7, tokens in 9453, cost 0.0004 USD, build file judge `jev-1.13.0` calls 5, tokens in 4757, cost 0.0002 USD, phases: path_judge 0.7 s, classifier 0.5 s, change_summary 12.7 s, doc_check 0.5 s, context 0.3 s, model_review 113.5 s, finding_judge 0.3 s, config: defaults + host + repository (.werkrevisor.toml at main e65eea0).
Reviewed head `9289382cef0f9af963956679c3ad0b717c56a6b5` against base `e65eea0026c4b499de6c8868310fc4baf18e2c9d`, werkrevisor 0.30.1.
<!-- werkrevisor:9289382cef0f9af963956679c3ad0b717c56a6b5 --> <!-- werkrevisor-verdict:ORANGE --> <!-- werkrevisor-folded --> <details><summary>🟠 werkrevisor ORANGE for <code>9289382</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/65#issuecomment-2535">the result for <code>e0e74ff</code></a></summary> ## 🟠 werkrevisor: ORANGE / FINDINGS Change kind: `mixed`. ### Reasons - **ORANGE** 1 finding(s) that Jev rates as probably real and severe: tools/dry-run:34-37 - **hint** 4 changed file(s) that neither weaken the checks nor touch security according to Jev - **hint** 1 build change(s) of low risk according to Jev: statistics/build.gradle.kts (weakens checks 0.02, risk 0.00, security 0.01) - **hint** 7 section(s) of the PR document agree with the change summary of openrouter/minimax/minimax-m3 according to Jev ### Findings 1. **Loose path check** at `tools/dry-run:34-37`, severity unknown, counted as medium, ORANGE, as a line comment ### Classifier 7 of 7 units passed all questions (1 PR document(s)). 4 answers ignored because of a confidence below [classifier] min_confidence. <sub> Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 33844, calls 1, tokens in 32740 / out 20737 (reasoning included in out), duration 129.1 s, cost 0.0347 USD (reported), classifier `jev-1.13.0` calls 7, tokens in 5786, cost 0.0002 USD, finding judge `jev-1.13.0` calls 1, tokens in 1617, cost 0.0001 USD, change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 3543 / out 1236, cost 0.0025 USD (reported), PR document check `jev-1.13.0` calls 7, tokens in 9453, cost 0.0004 USD, build file judge `jev-1.13.0` calls 5, tokens in 4757, cost 0.0002 USD, phases: path_judge 0.7 s, classifier 0.5 s, change_summary 12.7 s, doc_check 0.5 s, context 0.3 s, model_review 113.5 s, finding_judge 0.3 s, config: defaults + host + repository (.werkrevisor.toml at main e65eea0).<br> Reviewed head `9289382cef0f9af963956679c3ad0b717c56a6b5` against base `e65eea0026c4b499de6c8868310fc4baf18e2c9d`, werkrevisor 0.30.1. </sub> </details>
ai-reviewer left a comment
Collaborator

werkrevisor: ORANGE / FINDINGS for 9289382cef0f9af963956679c3ad0b717c56a6b5.
The result comment of werkrevisor holds the details.

werkrevisor: ORANGE / FINDINGS for `9289382cef0f9af963956679c3ad0b717c56a6b5`. The result comment of werkrevisor holds the details. <!-- werkrevisor-review:9289382cef0f9af963956679c3ad0b717c56a6b5 -->
@@ -31,3 +33,2 @@
werkrevisor_args=(--no-llm)
if [[ "${3:-}" == "--llm" ]]; then
: "${OPENROUTER_API_KEY:?OPENROUTER_API_KEY must be set for --llm}"
if [[ "${3:-}" == "--prompt-out" ]]; then
Collaborator

Loose path check, severity unknown, counted as medium (werkrevisor)

ORANGE; Jev: real 0.81, severity 2.9 of 3

The bash pattern [[ "${4:-}" == build/* ]] matches any string starting with build/, including build/../foo. The Docker mount -v "$PWD/build":/work/build contains the impact (writes outside the bind mount go to the container's ephemeral filesystem and are discarded by --rm), so this is not a security vulnerability. However, the check does not fulfill its stated purpose of ensuring the file is under build/: a typo like build/../prompt.json is accepted and the file is silently lost. A stricter check (rejecting .. segments or canonicalizing with realpath --relative-to=build) would catch such typos.

**Loose path check**, severity unknown, counted as medium (werkrevisor) ORANGE; Jev: real 0.81, severity 2.9 of 3 The bash pattern `[[ "${4:-}" == build/* ]]` matches any string starting with `build/`, including `build/../foo`. The Docker mount `-v "$PWD/build":/work/build` contains the impact (writes outside the bind mount go to the container's ephemeral filesystem and are discarded by `--rm`), so this is not a security vulnerability. However, the check does not fulfill its stated purpose of ensuring the file is under `build/`: a typo like `build/../prompt.json` is accepted and the file is silently lost. A stricter check (rejecting `..` segments or canonicalizing with `realpath --relative-to=build`) would catch such typos.
Author
Collaborator

Fixed in e0e74ff: the check refuses a path with a .. segment and a bare build/.

Fixed in `e0e74ff`: the check refuses a path with a `..` segment and a bare `build/`.
claude-code marked this conversation as resolved
Author
Collaborator

Review round of 9289382c: the ORANGE finding is fixed in e0e74ff.

Review round of `9289382c`: the ORANGE finding is fixed in `e0e74ff`.
mi added 1 commit 2026-10-09 17:48:33 +02:00
dry-run refuses a --prompt-out path with .. segments
werkator build succeeded after 00:19
werkator/werkrevisor-statistics build succeeded after 00:32
ai-review/assessment AI review passed; approved by werkrevisor; merge already scheduled; review request of mi withdrawn
ai-review/gate build succeeded after 01:48
e0e74ff2ec
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Collaborator

🟢 werkrevisor: GREEN / PASS

Change kind: mixed.

Reasons

  • hint 4 changed file(s) that neither weaken the checks nor touch security according to Jev
  • hint 1 build change(s) of low risk according to Jev: statistics/build.gradle.kts (weakens checks 0.02, risk 0.00, security 0.01)
  • hint 7 section(s) of the PR document agree with the change summary of openrouter/minimax/minimax-m3 according to Jev

Classifier

7 of 7 units passed all questions (1 PR document(s)).
4 answers ignored because of a confidence below [classifier] min_confidence.

Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 33881, calls 1, tokens in 32776 / out 16894 (reasoning included in out), duration 105.2 s, cost 0.0301 USD (reported), classifier `jev-1.13.0` calls 7, tokens in 5786, cost 0.0002 USD, change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 3559 / out 2859, cost 0.0039 USD (reported), PR document check `jev-1.13.0` calls 7, tokens in 10272, cost 0.0004 USD, build file judge `jev-1.13.0` calls 5, tokens in 4773, cost 0.0002 USD, phases: path_judge 0.5 s, classifier 0.6 s, change_summary 21.1 s, doc_check 0.5 s, context 0.2 s, model_review 81.8 s, config: defaults + host + repository (.werkrevisor.toml at main e65eea0).
Reviewed head `e0e74ff2ec04bfd2c23d5450548e93eb0653aa22` against base `e65eea0026c4b499de6c8868310fc4baf18e2c9d`, werkrevisor 0.30.1.
<!-- werkrevisor:e0e74ff2ec04bfd2c23d5450548e93eb0653aa22 --> <!-- werkrevisor-verdict:GREEN --> ## 🟢 werkrevisor: GREEN / PASS Change kind: `mixed`. ### Reasons - **hint** 4 changed file(s) that neither weaken the checks nor touch security according to Jev - **hint** 1 build change(s) of low risk according to Jev: statistics/build.gradle.kts (weakens checks 0.02, risk 0.00, security 0.01) - **hint** 7 section(s) of the PR document agree with the change summary of openrouter/minimax/minimax-m3 according to Jev ### Classifier 7 of 7 units passed all questions (1 PR document(s)). 4 answers ignored because of a confidence below [classifier] min_confidence. <sub> Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 33881, calls 1, tokens in 32776 / out 16894 (reasoning included in out), duration 105.2 s, cost 0.0301 USD (reported), classifier `jev-1.13.0` calls 7, tokens in 5786, cost 0.0002 USD, change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 3559 / out 2859, cost 0.0039 USD (reported), PR document check `jev-1.13.0` calls 7, tokens in 10272, cost 0.0004 USD, build file judge `jev-1.13.0` calls 5, tokens in 4773, cost 0.0002 USD, phases: path_judge 0.5 s, classifier 0.6 s, change_summary 21.1 s, doc_check 0.5 s, context 0.2 s, model_review 81.8 s, config: defaults + host + repository (.werkrevisor.toml at main e65eea0).<br> Reviewed head `e0e74ff2ec04bfd2c23d5450548e93eb0653aa22` against base `e65eea0026c4b499de6c8868310fc4baf18e2c9d`, werkrevisor 0.30.1. </sub>
ai-reviewer left a comment
Collaborator

werkrevisor: GREEN / PASS for e0e74ff2ec04bfd2c23d5450548e93eb0653aa22.
The result comment of werkrevisor holds the details.

werkrevisor: GREEN / PASS for `e0e74ff2ec04bfd2c23d5450548e93eb0653aa22`. The result comment of werkrevisor holds the details. <!-- werkrevisor-review:e0e74ff2ec04bfd2c23d5450548e93eb0653aa22 -->
ai-reviewer removed review request for mi 2026-10-09 17:50:19 +02:00
ai-reviewer merged commit 5e67065587 into main 2026-10-09 17:50:21 +02:00
ai-reviewer deleted branch claude-code/prompt-out 2026-10-09 17:50:21 +02:00
Sign in to join this conversation.
No Reviewers
No labels
3 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: mi/werkrevisor#65