See [docs/prs/2026-10-06-PR#30-no-stale-change-request.md](docs/prs/2026-10-06-PR%2330-no-stale-change-request.md).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
RED gets a bot review COMMENT instead of REQUEST_CHANGES: the bot cannot dismiss a change request,
and the failed required status check already blocks a RED head.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
hint 1 build change(s) of low risk according to Jev: server/build.gradle.kts (weakens checks 0.02, risk 0.00)
hint 3 finding(s) of low severity or rated minor by Jev: werkrevisor/cli.py:430, tests/test_line_comments.py:72-73, werkrevisor/cli.py:399-405
hint model recommends merge with caution
Findings
[medium] Stale docstring still says RED requests changes at werkrevisor/cli.py:430, hint, as a line comment
[low] Duplicated assertion in new test at tests/test_line_comments.py:72-73, hint, as a line comment
[low] Redundant branches in _review_event at werkrevisor/cli.py:399-405, hint, as a line comment
Classifier
5 of 5 units passed all questions (1 PR document(s)).
1 answer ignored because of a confidence below [classifier] min_confidence.
Usage: model `openrouter/anthropic/claude-sonnet-5.5`, LLM done, tokens counted before the call 39950, calls 1, tokens in 39823 / out 637 (reasoning included in out), duration 15.8 s, cost 0.0860 USD (reported), classifier `jev-1.13.0` calls 5, tokens in 3810, cost 0.0002 USD, finding judge `jev-1.13.0` calls 1, tokens in 1561, cost 0.0001 USD, build file judge `jev-1.13.0` calls 1, tokens in 560, cost 0.0000 USD, config: defaults + host + repository (.werkrevisor.toml at base 1924a35).
Reviewed head `376f6f582ef727175a516e9d37ea0ad2e613b084` against base `1924a3570032a58fa8623da3f28d34df48f2edca`, werkrevisor 0.19.2.
<!-- werkrevisor:376f6f582ef727175a516e9d37ea0ad2e613b084 -->
<!-- werkrevisor-verdict:GREEN -->
## 🟢 werkrevisor: GREEN / PASS
Change kind: `mixed`.
### Reasons
- **hint** 1 build change(s) of low risk according to Jev: server/build.gradle.kts (weakens checks 0.02, risk 0.00)
- **hint** 3 finding(s) of low severity or rated minor by Jev: werkrevisor/cli.py:430, tests/test_line_comments.py:72-73, werkrevisor/cli.py:399-405
- **hint** model recommends merge with caution
### Findings
1. **[medium] Stale docstring still says RED requests changes** at `werkrevisor/cli.py:430`, hint, as a line comment
2. **[low] Duplicated assertion in new test** at `tests/test_line_comments.py:72-73`, hint, as a line comment
3. **[low] Redundant branches in `_review_event`** at `werkrevisor/cli.py:399-405`, hint, as a line comment
### Classifier
5 of 5 units passed all questions (1 PR document(s)).
1 answer ignored because of a confidence below [classifier] min_confidence.
<sub>
Usage: model `openrouter/anthropic/claude-sonnet-5.5`, LLM done, tokens counted before the call 39950, calls 1, tokens in 39823 / out 637 (reasoning included in out), duration 15.8 s, cost 0.0860 USD (reported), classifier `jev-1.13.0` calls 5, tokens in 3810, cost 0.0002 USD, finding judge `jev-1.13.0` calls 1, tokens in 1561, cost 0.0001 USD, build file judge `jev-1.13.0` calls 1, tokens in 560, cost 0.0000 USD, config: defaults + host + repository (.werkrevisor.toml at base 1924a35).<br>
Reviewed head `376f6f582ef727175a516e9d37ea0ad2e613b084` against base `1924a3570032a58fa8623da3f28d34df48f2edca`, werkrevisor 0.19.2.
</sub>
werkrevisor: GREEN / PASS for 376f6f582ef727175a516e9d37ea0ad2e613b084.
The result comment of werkrevisor holds the details.
werkrevisor: GREEN / PASS for `376f6f582ef727175a516e9d37ea0ad2e613b084`.
The result comment of werkrevisor holds the details.
<!-- werkrevisor-review:376f6f582ef727175a516e9d37ea0ad2e613b084 -->
[low] Duplicated assertion in new test (werkrevisor)
hint
test_red_gives_a_comment_review_and_a_failed_gate asserts assertNotIn("REQUEST_CHANGES", ...) and then asserts the list equals ["COMMENT"]. The second assertion already implies the first. The same RED scenario is also repeated at the end of test_review_kind_follows_the_verdict, so the new test adds no new coverage there.
**[low] Duplicated assertion in new test** (werkrevisor)
hint
`test_red_gives_a_comment_review_and_a_failed_gate` asserts `assertNotIn("REQUEST_CHANGES", ...)` and then asserts the list equals `["COMMENT"]`. The second assertion already implies the first. The same RED scenario is also repeated at the end of `test_review_kind_follows_the_verdict`, so the new test adds no new coverage there.
[low] Redundant branches in _review_event (werkrevisor)
hint
The RED branch returns "COMMENT" under approval, but the fallthrough already returns "COMMENT" when line comments exist. The RED branch is only needed for the case without line comments, so it is not clear from the code why the two cases are separate. The comment explains the reason, which is fine, but the structure could be simpler.
**[low] Redundant branches in `_review_event`** (werkrevisor)
hint
The RED branch returns "COMMENT" under `approval`, but the fallthrough already returns "COMMENT" when line comments exist. The RED branch is only needed for the case without line comments, so it is not clear from the code why the two cases are separate. The comment explains the reason, which is fine, but the structure could be simpler.
[medium] Stale docstring still says RED requests changes (werkrevisor)
hint; Jev: real 0.83, severity 1.1 of 3
The docstring of _approval_gate still says "RED requests changes". After this PR RED submits a COMMENT review, so the docstring contradicts the code. The _publish comment "still submits a missing approval or change request" is stale for the same reason.
**[medium] Stale docstring still says RED requests changes** (werkrevisor)
hint; Jev: real 0.83, severity 1.1 of 3
The docstring of `_approval_gate` still says "RED requests changes". After this PR RED submits a `COMMENT` review, so the docstring contradicts the code. The `_publish` comment "still submits a missing approval or change request" is stale for the same reason.
ai-reviewer
scheduled this pull request to auto merge when all checks succeed 2026-10-06 14:10:21 +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.
See docs/prs/2026-10-06-PR#30-no-stale-change-request.md.
🤖 Generated with Claude Code
🟢 werkrevisor: GREEN / PASS
Change kind:
mixed.Reasons
Findings
[medium] Stale docstring still says RED requests changes at
werkrevisor/cli.py:430, hint, as a line comment[low] Duplicated assertion in new test at
tests/test_line_comments.py:72-73, hint, as a line comment[low] Redundant branches in
_review_eventatwerkrevisor/cli.py:399-405, hint, as a line commentClassifier
5 of 5 units passed all questions (1 PR document(s)).
Usage: model `openrouter/anthropic/claude-sonnet-5.5`, LLM done, tokens counted before the call 39950, calls 1, tokens in 39823 / out 637 (reasoning included in out), duration 15.8 s, cost 0.0860 USD (reported), classifier `jev-1.13.0` calls 5, tokens in 3810, cost 0.0002 USD, finding judge `jev-1.13.0` calls 1, tokens in 1561, cost 0.0001 USD, build file judge `jev-1.13.0` calls 1, tokens in 560, cost 0.0000 USD, config: defaults + host + repository (.werkrevisor.toml at base1 answer ignored because of a confidence below [classifier] min_confidence.
1924a35).Reviewed head `376f6f582ef727175a516e9d37ea0ad2e613b084` against base `1924a3570032a58fa8623da3f28d34df48f2edca`, werkrevisor 0.19.2.
werkrevisor: GREEN / PASS for
376f6f582ef727175a516e9d37ea0ad2e613b084.The result comment of werkrevisor holds the details.
@@ -65,0 +69,4 @@gitea.files.append(gitea_file("doc/PR/1.md"))outcome, gitea = finding_run([APP], gitea=gitea)self.assertEqual((outcome.result.verdict, outcome.result.exit_code), (Verdict.RED, 20))self.assertNotIn("REQUEST_CHANGES", [r[0] for r in gitea.created_reviews])[low] Duplicated assertion in new test (werkrevisor)
hint
test_red_gives_a_comment_review_and_a_failed_gateassertsassertNotIn("REQUEST_CHANGES", ...)and then asserts the list equals["COMMENT"]. The second assertion already implies the first. The same RED scenario is also repeated at the end oftest_review_kind_follows_the_verdict, so the new test adds no new coverage there.@@ -400,3 +399,1 @@event = {Verdict.GREEN: "APPROVED", Verdict.RED: "REQUEST_CHANGES"}.get(result.verdict)if event:return eventif config.gate.yellow_gate == "approval" and result.verdict is Verdict.GREEN:[low] Redundant branches in
_review_event(werkrevisor)hint
The RED branch returns "COMMENT" under
approval, but the fallthrough already returns "COMMENT" when line comments exist. The RED branch is only needed for the case without line comments, so it is not clear from the code why the two cases are separate. The comment explains the reason, which is fine, but the structure could be simpler.@@ -426,5 +426,5 @@raise ConfigError("OPENROUTER_API_KEY is not set")if not args.no_llm and config.engine.mode != "llm" and not typesafe_key:raise ConfigError("TYPESAFE_API_KEY is not set")except ConfigError as e:print(f"werkrevisor: configuration error: {redactor(str(e))}", file=sys.stderr)[medium] Stale docstring still says RED requests changes (werkrevisor)
hint; Jev: real 0.83, severity 1.1 of 3
The docstring of
_approval_gatestill says "RED requests changes". After this PR RED submits aCOMMENTreview, so the docstring contradicts the code. The_publishcomment "still submits a missing approval or change request" is stale for the same reason.