An approval given before the result comment is asked for again, so a human approves only findings they could read.
See docs/prs/2026-10-10-PR#75-approval-after-the-result.md.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
hint 6 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:234, docs/prs/2026-10-10-PR#75-approval-after-the-result.md:38-41
Findings
GateDecision.held docstring is now incomplete at werkrevisor/cli.py:234, severity unknown, counted as medium, hint, as a line comment
Misleading Verified-by link at docs/prs/2026-10-10-PR#75-approval-after-the-result.md:38-41, severity unknown, counted as medium, hint, as a line comment
werkrevisor: YELLOW / HUMAN_REVIEW for f9e64377493301234423ea08f8a38afed66e6133.
The result comment of werkrevisor holds the details.
werkrevisor: YELLOW / HUMAN_REVIEW for `f9e64377493301234423ea08f8a38afed66e6133`.
The result comment of werkrevisor holds the details.
<!-- werkrevisor-review:f9e64377493301234423ea08f8a38afed66e6133 -->
Misleading Verified-by link, severity unknown, counted as medium (werkrevisor)
hint; Jev: real 0.86, severity 1.7 of 3
Scenario#75.01 is about the gate (requesting a new review), but its "Verified by" also lists test_carry_over.CarryOverTest.test_an_approval_before_the_result_of_its_head_is_not_carried_over, which exercises the carry-over path, not the gate. The carry-over behavior is described only in "The Solution" and has no scenario of its own, so a reader following the link expects a Scenario#75.01 test and instead finds an unrelated one, or has to infer that the carry-over is part of the same change. Either give the carry-over its own Scenario#75.03 with a "Verified by" link, or drop the carry-over test from Scenario#75.01's list.
**Misleading Verified-by link**, severity unknown, counted as medium (werkrevisor)
hint; Jev: real 0.86, severity 1.7 of 3
Scenario#75.01 is about the gate (requesting a new review), but its "Verified by" also lists `test_carry_over.CarryOverTest.test_an_approval_before_the_result_of_its_head_is_not_carried_over`, which exercises the carry-over path, not the gate. The carry-over behavior is described only in "The Solution" and has no scenario of its own, so a reader following the link expects a Scenario#75.01 test and instead finds an unrelated one, or has to infer that the carry-over is part of the same change. Either give the carry-over its own Scenario#75.03 with a "Verified by" link, or drop the carry-over test from Scenario#75.01's list.
GateDecision.held docstring is now incomplete, severity unknown, counted as medium (werkrevisor)
hint; Jev: real 0.38, severity 1.4 of 3
The held flag on GateDecision is reused for the new early-approvers case (YELLOW/ORANGE with held=True to note the held merge in the result comment), but the inline docstring still reads "GREEN approved, but open hints keep the merge from being scheduled." That sentence only describes the GREEN/open-hints case the field was introduced for; a reader looking at held=True in _approval_gate for the early-approvers branch will not learn why the flag is set. Add a second sentence (or a more general wording) that covers both uses.
**GateDecision.held docstring is now incomplete**, severity unknown, counted as medium (werkrevisor)
hint; Jev: real 0.38, severity 1.4 of 3
The `held` flag on `GateDecision` is reused for the new early-approvers case (YELLOW/ORANGE with held=True to note the held merge in the result comment), but the inline docstring still reads "GREEN approved, but open hints keep the merge from being scheduled." That sentence only describes the GREEN/open-hints case the field was introduced for; a reader looking at `held=True` in `_approval_gate` for the early-approvers branch will not learn why the flag is set. Add a second sentence (or a more general wording) that covers both uses.
ai-review/assessment AI findings; a developer approval after checking them unlocks the merge; a human review request is pending; merge already scheduled
werkrevisor: ORANGE / FINDINGS for 92a1994f4b60d7b0e5ae2144bfb5f7e70dcfea86.
The result comment of werkrevisor holds the details.
werkrevisor: ORANGE / FINDINGS for `92a1994f4b60d7b0e5ae2144bfb5f7e70dcfea86`.
The result comment of werkrevisor holds the details.
<!-- werkrevisor-review:92a1994f4b60d7b0e5ae2144bfb5f7e70dcfea86 -->
Inconsistent gate mode handling, severity unknown, counted as medium (werkrevisor)
ORANGE; Jev: real 0.83, severity 3.0 of 3
The PR's stated goal is that a human approval counts only after the result comment, and the README states this as a general rule for human approvals. The implementation only enforces this in approval mode (via _approval_gate). In pass_with_review_request mode (via _gate at line 641), human_approval is still called without the since parameter, so a pre-result approval would still unlock the gate through gate_decision. This contradicts the PR's intent and the README's general statement.
**Inconsistent gate mode handling**, severity unknown, counted as medium (werkrevisor)
ORANGE; Jev: real 0.83, severity 3.0 of 3
The PR's stated goal is that a human approval counts only after the result comment, and the README states this as a general rule for human approvals. The implementation only enforces this in `approval` mode (via `_approval_gate`). In `pass_with_review_request` mode (via `_gate` at line 641), `human_approval` is still called without the `since` parameter, so a pre-result approval would still unlock the gate through `gate_decision`. This contradicts the PR's intent and the README's general statement.
Fixed: _gate now passes the time of the result comment too; a first review writes it after the decision, so it counts no earlier approval. block requests a review from the early approver again, pass_with_review_request requested all reviewers already. Tests: OtherGateModesTest.
Fixed: `_gate` now passes the time of the result comment too; a first review writes it after the decision, so it counts no earlier approval. `block` requests a review from the early approver again, `pass_with_review_request` requested all reviewers already. Tests: OtherGateModesTest.
ai-review/assessment AI findings; a developer approval after checking them unlocks the merge; a human review request is pending; merge already scheduled
hint 6 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
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): werkrevisor/cli.py
hint 1 finding(s) of low severity or rated minor by Jev: docs/prs/2026-10-10-PR#75-approval-after-the-result.md:24-67
hint model recommends merge with caution
Findings
Silent failure in block mode at werkrevisor/cli.py:645-651, severity unknown, counted as medium, ORANGE, as a line comment
Scenarios miss gate modes at docs/prs/2026-10-10-PR#75-approval-after-the-result.md:24-67, severity unknown, counted as medium, hint, as a line comment
6 of 7 units passed all questions (1 PR document(s)).
2 answers ignored because of a confidence below [classifier] min_confidence.
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 31495, calls 1, tokens in 30526 / out 43555 (reasoning included in out), duration 305.3 s, cost 0.0614 USD (reported), classifier `jev-1.13.0` calls 7, tokens in 5556, cost 0.0002 USD, finding judge `jev-1.13.0` calls 2, tokens in 3533, cost 0.0001 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 22449 / out 311, cost 0.0030 USD (reported), change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 5171 / out 1649, cost 0.0035 USD (reported), PR document check `jev-1.13.0` calls 7, tokens in 11997, cost 0.0005 USD, build file judge `jev-1.13.0` calls 7, tokens in 7370, cost 0.0003 USD, phases: path_judge 0.5 s, classifier 0.4 s, change_summary 11.6 s, doc_check 0.5 s, context 4.8 s, model_review 286.5 s, finding_judge 0.4 s, config: defaults + host + repository (.werkrevisor.toml at main e521b1e).
Reviewed head `f0b44a7b6555fd55db664ac80f5bd08e90dd6dda` against base `e521b1e483a7b27a4bb99e9bb93d776d8dba540b`, werkrevisor 0.32.1.
<!-- werkrevisor:f0b44a7b6555fd55db664ac80f5bd08e90dd6dda -->
<!-- werkrevisor-verdict:ORANGE -->
<!-- werkrevisor-blocks:d324531143d424875c0d471a39eea551,6c74c7b15b7b6a137ad8ea482f19023a,18ce4553027db24a0d16e9b36fb47374,3359faa51f7dd47545d2dae7f80f71eb,6263c621d8a3a37dd9b42824a5d7472d,8eca7b71027befa62fcba8ec6a02b65e,2c21b4fc0c9d1a7c1fc9eca75981fc9d,42ac7ca13d4daf89bd8d778d739c41ce,dbe4db5ad4e5a7dc176d425b6349e2d3,195ffec348cafcf97f0dcf9a7da906f0,018b083a5dea22de642e3af4ced0b1d0,5d9fa5ccfba44c6701f5bfd7e21bf85a,e6335c19464447e312da32ad64d5a966,29e635d4efa27c9b4d8aecb53a2aaaa0,6555a63e37106457efb32101fc192f20,f435a31cf770c12aa67530267bda2930,7c6124dc600a2a8e3e7b7e0420b09a79,5de0655abd7ddfeaaef61bec05e3c344,c05e16aae2c3510bd0585dc2e6165d9f,8499743c2e1cf834f776af7010abd151,332f3d5a12ad072cba6907f86e1791fa,2b518720d71d0b2d3d1f86f098226f67,601572f95293fd11716ccddae30e0aac,5e812f0245aac24e104bcafc85608cc9,9aa002cef6be6dc161958af399041e8a,09a121a49f36927c56712239fa1d1fda -->
<!-- werkrevisor-folded -->
<details><summary>🟠 werkrevisor ORANGE for <code>f0b44a7</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/75#issuecomment-3213">the result for <code>e1272b0</code></a></summary>
## 🟠 werkrevisor: ORANGE / FINDINGS
Change kind: `mixed`.
### Reasons
- **ORANGE** 1 finding(s) that Jev rates as probably real and severe: werkrevisor/cli.py:645-651
- **YELLOW** spec: docs/prs/2026-10-10-PR#75-approval-after-the-result.md Scenario#75.01 given_when_then_misused (0.62 > yellow_above = 0.6)
- **hint** 6 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
- **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): werkrevisor/cli.py
- **hint** 1 finding(s) of low severity or rated minor by Jev: docs/prs/2026-10-10-PR#75-approval-after-the-result.md:24-67
- **hint** model recommends merge with caution
### Findings
1. **Silent failure in block mode** at `werkrevisor/cli.py:645-651`, severity unknown, counted as medium, ORANGE, as a line comment
2. **Scenarios miss gate modes** at `docs/prs/2026-10-10-PR#75-approval-after-the-result.md:24-67`, severity unknown, counted as medium, hint, as a line comment
### Classifier
| Unit | Question | Problem | Confidence | Verdict |
|---|---|---|---|---|
| docs/prs/2026-10-10-PR#75-approval-after-the-result.md Scenario#75.01 | given_when_then_misused | 0.62 | – | YELLOW |
6 of 7 units passed all questions (1 PR document(s)).
2 answers ignored because of a confidence below [classifier] min_confidence.
<sub>
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 31495, calls 1, tokens in 30526 / out 43555 (reasoning included in out), duration 305.3 s, cost 0.0614 USD (reported), classifier `jev-1.13.0` calls 7, tokens in 5556, cost 0.0002 USD, finding judge `jev-1.13.0` calls 2, tokens in 3533, cost 0.0001 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 22449 / out 311, cost 0.0030 USD (reported), change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 5171 / out 1649, cost 0.0035 USD (reported), PR document check `jev-1.13.0` calls 7, tokens in 11997, cost 0.0005 USD, build file judge `jev-1.13.0` calls 7, tokens in 7370, cost 0.0003 USD, phases: path_judge 0.5 s, classifier 0.4 s, change_summary 11.6 s, doc_check 0.5 s, context 4.8 s, model_review 286.5 s, finding_judge 0.4 s, config: defaults + host + repository (.werkrevisor.toml at main e521b1e).<br>
Reviewed head `f0b44a7b6555fd55db664ac80f5bd08e90dd6dda` against base `e521b1e483a7b27a4bb99e9bb93d776d8dba540b`, werkrevisor 0.32.1.
</sub>
</details>
werkrevisor: ORANGE / FINDINGS for f0b44a7b6555fd55db664ac80f5bd08e90dd6dda.
The result comment of werkrevisor holds the details.
werkrevisor: ORANGE / FINDINGS for `f0b44a7b6555fd55db664ac80f5bd08e90dd6dda`.
The result comment of werkrevisor holds the details.
<!-- werkrevisor-review:f0b44a7b6555fd55db664ac80f5bd08e90dd6dda -->
Scenarios miss gate modes, severity unknown, counted as medium (werkrevisor)
hint; Jev: real 0.83, severity 1.9 of 3
The "Solution" section claims the change applies "in all three gate modes", but the three scenarios (75.01, 75.02, 75.03) only describe the approval mode and the carry-over. The block and pass_with_review_request modes are verified by OtherGateModesTest but have no scenario descriptions, so the formal BDD-style documentation covers only one of the three modes that the change touches.
**Scenarios miss gate modes**, severity unknown, counted as medium (werkrevisor)
hint; Jev: real 0.83, severity 1.9 of 3
The "Solution" section claims the change applies "in all three gate modes", but the three scenarios (75.01, 75.02, 75.03) only describe the `approval` mode and the carry-over. The `block` and `pass_with_review_request` modes are verified by `OtherGateModesTest` but have no scenario descriptions, so the formal BDD-style documentation covers only one of the three modes that the change touches.
Silent failure in block mode, severity unknown, counted as medium (werkrevisor)
ORANGE; Jev: real 0.83, severity 2.9 of 3
In _gate, when the block mode re-request to early approvers fails, the exception is only printed to stderr (line 651) and is not surfaced in the gate note. _approval_gate returns a GateDecision whose note contains the failure text ("...but the new review request failed: {e}"). The block mode failure case is also untested, so a real Gitea error would leave the human reviewer seeing "please approve again after reading it" in the comment yet no pending review request in Gitea; only the bot's stderr log records the failure.
**Silent failure in block mode**, severity unknown, counted as medium (werkrevisor)
ORANGE; Jev: real 0.83, severity 2.9 of 3
In `_gate`, when the `block` mode re-request to early approvers fails, the exception is only printed to stderr (line 651) and is not surfaced in the gate note. `_approval_gate` returns a GateDecision whose note contains the failure text ("...but the new review request failed: {e}"). The `block` mode failure case is also untested, so a real Gitea error would leave the human reviewer seeing "please approve again after reading it" in the comment yet no pending review request in Gitea; only the bot's stderr log records the failure.
hint 6 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 8 section(s) of the PR document agree with the change summary of openrouter/minimax/minimax-m3 according to Jev
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): werkrevisor/cli.py
Classifier
8 of 8 units passed all questions (1 PR document(s)).
2 answers ignored because of a confidence below [classifier] min_confidence.
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 32232, calls 1, tokens in 31224 / out 32769 (reasoning included in out), duration 297.2 s, cost 0.0487 USD (reported), classifier `jev-1.13.0` calls 8, tokens in 6534, cost 0.0003 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 22451 / out 432, cost 0.0030 USD (reported), change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 5334 / out 1941, cost 0.0039 USD (reported), PR document check `jev-1.13.0` calls 8, tokens in 14866, cost 0.0006 USD, build file judge `jev-1.13.0` calls 7, tokens in 7549, cost 0.0003 USD, phases: path_judge 0.5 s, classifier 0.5 s, change_summary 15.5 s, doc_check 0.6 s, context 7.7 s, model_review 271.7 s, config: defaults + host + repository (.werkrevisor.toml at main e521b1e).
Reviewed head `e1272b0e5c4b363372b882da283139bb46edc383` against base `e521b1e483a7b27a4bb99e9bb93d776d8dba540b`, werkrevisor 0.32.1.
<!-- werkrevisor:e1272b0e5c4b363372b882da283139bb46edc383 -->
<!-- werkrevisor-verdict:GREEN -->
<!-- werkrevisor-blocks:d324531143d424875c0d471a39eea551,6c74c7b15b7b6a137ad8ea482f19023a,6719d47518a35ddeed760adc77bdc107,3359faa51f7dd47545d2dae7f80f71eb,6263c621d8a3a37dd9b42824a5d7472d,4664018dfc384d73bf90553935bca4a0,2c21b4fc0c9d1a7c1fc9eca75981fc9d,42ac7ca13d4daf89bd8d778d739c41ce,dbe4db5ad4e5a7dc176d425b6349e2d3,195ffec348cafcf97f0dcf9a7da906f0,018b083a5dea22de642e3af4ced0b1d0,5d9fa5ccfba44c6701f5bfd7e21bf85a,e6335c19464447e312da32ad64d5a966,29e635d4efa27c9b4d8aecb53a2aaaa0,dc170ecf17fcf71168b41b8310b39e9e,38f627a8be05e821351fe1abe226e584,7c6124dc600a2a8e3e7b7e0420b09a79,5de0655abd7ddfeaaef61bec05e3c344,c05e16aae2c3510bd0585dc2e6165d9f,8499743c2e1cf834f776af7010abd151,332f3d5a12ad072cba6907f86e1791fa,2b518720d71d0b2d3d1f86f098226f67,601572f95293fd11716ccddae30e0aac,5e812f0245aac24e104bcafc85608cc9,9aa002cef6be6dc161958af399041e8a,09a121a49f36927c56712239fa1d1fda -->
## 🟢 werkrevisor: GREEN / PASS
Change kind: `mixed`.
### Reasons
- **hint** 6 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** 8 section(s) of the PR document agree with the change summary of openrouter/minimax/minimax-m3 according to Jev
- **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): werkrevisor/cli.py
### Classifier
8 of 8 units passed all questions (1 PR document(s)).
2 answers ignored because of a confidence below [classifier] min_confidence.
<sub>
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 32232, calls 1, tokens in 31224 / out 32769 (reasoning included in out), duration 297.2 s, cost 0.0487 USD (reported), classifier `jev-1.13.0` calls 8, tokens in 6534, cost 0.0003 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 22451 / out 432, cost 0.0030 USD (reported), change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 5334 / out 1941, cost 0.0039 USD (reported), PR document check `jev-1.13.0` calls 8, tokens in 14866, cost 0.0006 USD, build file judge `jev-1.13.0` calls 7, tokens in 7549, cost 0.0003 USD, phases: path_judge 0.5 s, classifier 0.5 s, change_summary 15.5 s, doc_check 0.6 s, context 7.7 s, model_review 271.7 s, config: defaults + host + repository (.werkrevisor.toml at main e521b1e).<br>
Reviewed head `e1272b0e5c4b363372b882da283139bb46edc383` against base `e521b1e483a7b27a4bb99e9bb93d776d8dba540b`, werkrevisor 0.32.1.
</sub>
werkrevisor: GREEN / PASS for e1272b0e5c4b363372b882da283139bb46edc383.
The result comment of werkrevisor holds the details.
werkrevisor: GREEN / PASS for `e1272b0e5c4b363372b882da283139bb46edc383`.
The result comment of werkrevisor holds the details.
<!-- werkrevisor-review:e1272b0e5c4b363372b882da283139bb46edc383 -->
ai-reviewer
removed review request for mi 2026-10-10 15:55:46 +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.
An approval given before the result comment is asked for again, so a human approves only findings they could read.
See docs/prs/2026-10-10-PR#75-approval-after-the-result.md.
🤖 Generated with Claude Code
🟡 werkrevisor YELLOW for
f9e6437, superseded by the result for92a1994🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind:
mixed.Reasons
Findings
GateDecision.held docstring is now incomplete at
werkrevisor/cli.py:234, severity unknown, counted as medium, hint, as a line commentMisleading Verified-by link at
docs/prs/2026-10-10-PR#75-approval-after-the-result.md:38-41, severity unknown, counted as medium, hint, as a line commentClassifier
5 of 6 units passed all questions (1 PR document(s)).
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 45359, calls 1, tokens in 43962 / out 34849 (reasoning included in out), duration 332.6 s, cost 0.0550 USD (reported), classifier `jev-1.13.0` calls 6, tokens in 4598, cost 0.0002 USD, finding judge `jev-1.13.0` calls 2, tokens in 2835, cost 0.0001 USD, change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 3886 / out 1405, cost 0.0028 USD (reported), PR document check `jev-1.13.0` calls 6, tokens in 9842, cost 0.0004 USD, build file judge `jev-1.13.0` calls 7, tokens in 6022, cost 0.0003 USD, phases: path_judge 0.5 s, classifier 0.5 s, change_summary 12.3 s, doc_check 1.7 s, context 8.7 s, model_review 307.7 s, finding_judge 0.2 s, config: defaults + host + repository (.werkrevisor.toml at main1 answer ignored because of a confidence below [classifier] min_confidence.
e521b1e).Reviewed head `f9e64377493301234423ea08f8a38afed66e6133` against base `e521b1e483a7b27a4bb99e9bb93d776d8dba540b`, werkrevisor 0.32.1.
werkrevisor: YELLOW / HUMAN_REVIEW for
f9e64377493301234423ea08f8a38afed66e6133.The result comment of werkrevisor holds the details.
@@ -0,0 +35,4 @@- **And** the result comment asks them to approve again after reading it##### Verified byMisleading Verified-by link, severity unknown, counted as medium (werkrevisor)
hint; Jev: real 0.86, severity 1.7 of 3
Scenario#75.01 is about the gate (requesting a new review), but its "Verified by" also lists
test_carry_over.CarryOverTest.test_an_approval_before_the_result_of_its_head_is_not_carried_over, which exercises the carry-over path, not the gate. The carry-over behavior is described only in "The Solution" and has no scenario of its own, so a reader following the link expects a Scenario#75.01 test and instead finds an unrelated one, or has to infer that the carry-over is part of the same change. Either give the carry-over its own Scenario#75.03 with a "Verified by" link, or drop the carry-over test from Scenario#75.01's list.Fixed: the carry-over has its own Scenario#75.03 with that test; Scenario#75.01 lists only the gate test.
@@ -230,5 +230,5 @@if mode == "classifier":# Without an LLM only a PR of judged PR documents can pass; any other file got no semantic review.changed = {f.path for f in files if not f.deleted}result.classifier_sufficient = (rules.change_kind == "docs_only" and bool(changed)and changed <= set(run.judged_files))GateDecision.held docstring is now incomplete, severity unknown, counted as medium (werkrevisor)
hint; Jev: real 0.38, severity 1.4 of 3
The
heldflag onGateDecisionis reused for the new early-approvers case (YELLOW/ORANGE with held=True to note the held merge in the result comment), but the inline docstring still reads "GREEN approved, but open hints keep the merge from being scheduled." That sentence only describes the GREEN/open-hints case the field was introduced for; a reader looking atheld=Truein_approval_gatefor the early-approvers branch will not learn why the flag is set. Add a second sentence (or a more general wording) that covers both uses.Fixed: the comment now names both uses, open hints of a GREEN review and an approval before the result.
🟠 werkrevisor ORANGE for
92a1994, superseded by the result forf0b44a7🟠 werkrevisor: ORANGE / FINDINGS
Change kind:
mixed.Reasons
Findings
werkrevisor/cli.py:641, severity unknown, counted as medium, ORANGE, as a line commentClassifier
7 of 7 units passed all questions (1 PR document(s)).
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 45829, calls 1, tokens in 44416 / out 17496 (reasoning included in out), duration 135.8 s, cost 0.0343 USD (reported), classifier `jev-1.13.0` calls 7, tokens in 5518, cost 0.0002 USD, finding judge `jev-1.13.0` calls 1, tokens in 1587, cost 0.0001 USD, change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 3954 / out 1194, cost 0.0026 USD (reported), PR document check `jev-1.13.0` calls 7, tokens in 10027, cost 0.0004 USD, build file judge `jev-1.13.0` calls 7, tokens in 6094, cost 0.0003 USD, phases: path_judge 0.5 s, classifier 0.5 s, change_summary 8.6 s, doc_check 0.4 s, context 0.2 s, model_review 124.7 s, finding_judge 0.2 s, config: defaults + host + repository (.werkrevisor.toml at main3 answers ignored because of a confidence below [classifier] min_confidence.
e521b1e).Reviewed head `92a1994f4b60d7b0e5ae2144bfb5f7e70dcfea86` against base `e521b1e483a7b27a4bb99e9bb93d776d8dba540b`, werkrevisor 0.32.1.
werkrevisor: ORANGE / FINDINGS for
92a1994f4b60d7b0e5ae2144bfb5f7e70dcfea86.The result comment of werkrevisor holds the details.
Inconsistent gate mode handling, severity unknown, counted as medium (werkrevisor)
ORANGE; Jev: real 0.83, severity 3.0 of 3
The PR's stated goal is that a human approval counts only after the result comment, and the README states this as a general rule for human approvals. The implementation only enforces this in
approvalmode (via_approval_gate). Inpass_with_review_requestmode (via_gateat line 641),human_approvalis still called without thesinceparameter, so a pre-result approval would still unlock the gate throughgate_decision. This contradicts the PR's intent and the README's general statement.Fixed:
_gatenow passes the time of the result comment too; a first review writes it after the decision, so it counts no earlier approval.blockrequests a review from the early approver again,pass_with_review_requestrequested all reviewers already. Tests: OtherGateModesTest.🟠 werkrevisor ORANGE for
f0b44a7, superseded by the result fore1272b0🟠 werkrevisor: ORANGE / FINDINGS
Change kind:
mixed.Reasons
Findings
Silent failure in block mode at
werkrevisor/cli.py:645-651, severity unknown, counted as medium, ORANGE, as a line commentScenarios miss gate modes at
docs/prs/2026-10-10-PR#75-approval-after-the-result.md:24-67, severity unknown, counted as medium, hint, as a line commentClassifier
6 of 7 units passed all questions (1 PR document(s)).
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 31495, calls 1, tokens in 30526 / out 43555 (reasoning included in out), duration 305.3 s, cost 0.0614 USD (reported), classifier `jev-1.13.0` calls 7, tokens in 5556, cost 0.0002 USD, finding judge `jev-1.13.0` calls 2, tokens in 3533, cost 0.0001 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 22449 / out 311, cost 0.0030 USD (reported), change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 5171 / out 1649, cost 0.0035 USD (reported), PR document check `jev-1.13.0` calls 7, tokens in 11997, cost 0.0005 USD, build file judge `jev-1.13.0` calls 7, tokens in 7370, cost 0.0003 USD, phases: path_judge 0.5 s, classifier 0.4 s, change_summary 11.6 s, doc_check 0.5 s, context 4.8 s, model_review 286.5 s, finding_judge 0.4 s, config: defaults + host + repository (.werkrevisor.toml at main2 answers ignored because of a confidence below [classifier] min_confidence.
e521b1e).Reviewed head `f0b44a7b6555fd55db664ac80f5bd08e90dd6dda` against base `e521b1e483a7b27a4bb99e9bb93d776d8dba540b`, werkrevisor 0.32.1.
werkrevisor: ORANGE / FINDINGS for
f0b44a7b6555fd55db664ac80f5bd08e90dd6dda.The result comment of werkrevisor holds the details.
@@ -0,0 +21,4 @@- No change for GREEN, which needs no human approval, nor for RED, which blocks anyway.- No new trigger: Werkator still starts a review only for a new commit.## The ScenariosScenarios miss gate modes, severity unknown, counted as medium (werkrevisor)
hint; Jev: real 0.83, severity 1.9 of 3
The "Solution" section claims the change applies "in all three gate modes", but the three scenarios (75.01, 75.02, 75.03) only describe the
approvalmode and the carry-over. Theblockandpass_with_review_requestmodes are verified byOtherGateModesTestbut have no scenario descriptions, so the formal BDD-style documentation covers only one of the three modes that the change touches.Fixed: Scenario#75.04 covers
blockandpass_with_review_request, with OtherGateModesTest as its tests.@@ -635,0 +642,4 @@reviews = gitea.list_reviews(pr.number)approved_by = human_approval(reviews, pr.head_sha, config.gate.human_reviewers, since)early = [] if approved_by else early_approvers(reviews, pr.head_sha, config.gate.human_reviewers, since)if early and config.gate.yellow_gate == "block" and publish:Silent failure in block mode, severity unknown, counted as medium (werkrevisor)
ORANGE; Jev: real 0.83, severity 2.9 of 3
In
_gate, when theblockmode re-request to early approvers fails, the exception is only printed to stderr (line 651) and is not surfaced in the gate note._approval_gatereturns a GateDecision whose note contains the failure text ("...but the new review request failed: {e}"). Theblockmode failure case is also untested, so a real Gitea error would leave the human reviewer seeing "please approve again after reading it" in the comment yet no pending review request in Gitea; only the bot's stderr log records the failure.Fixed: the gate note of
blocknow says "..., but the new review request failed: ...", like the approval mode; test_block_names_a_failed_request.🟢 werkrevisor: GREEN / PASS
Change kind:
mixed.Reasons
Classifier
8 of 8 units passed all questions (1 PR document(s)).
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 32232, calls 1, tokens in 31224 / out 32769 (reasoning included in out), duration 297.2 s, cost 0.0487 USD (reported), classifier `jev-1.13.0` calls 8, tokens in 6534, cost 0.0003 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 22451 / out 432, cost 0.0030 USD (reported), change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 5334 / out 1941, cost 0.0039 USD (reported), PR document check `jev-1.13.0` calls 8, tokens in 14866, cost 0.0006 USD, build file judge `jev-1.13.0` calls 7, tokens in 7549, cost 0.0003 USD, phases: path_judge 0.5 s, classifier 0.5 s, change_summary 15.5 s, doc_check 0.6 s, context 7.7 s, model_review 271.7 s, config: defaults + host + repository (.werkrevisor.toml at main2 answers ignored because of a confidence below [classifier] min_confidence.
e521b1e).Reviewed head `e1272b0e5c4b363372b882da283139bb46edc383` against base `e521b1e483a7b27a4bb99e9bb93d776d8dba540b`, werkrevisor 0.32.1.
werkrevisor: GREEN / PASS for
e1272b0e5c4b363372b882da283139bb46edc383.The result comment of werkrevisor holds the details.