ORANGE 1 finding(s) that Jev rates as probably real and severe: werkrevisor/cli.py:1066-1073
YELLOW Weakened merge gate according to Jev: werkrevisor/codexrunner.py (0.83); a human checks it, unless you revert the change because the task does not need it
hint writing rules violated in the changed docs: README.md:144: paragraph with 6 sentences, more than 5
hint 5 changed file(s) that neither weaken the checks, touch security nor show a risk category of the repository config 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.02)
hint 9 changed file(s) agree with the PR document 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 model recommends changes before merge
Findings
[medium] Failed Withdrawal at werkrevisor/cli.py:1066-1073, ORANGE, as a line comment
Classifier
8 of 8 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 42855, calls 1, tokens in 41327 / out 36951 (reasoning included in out), duration 571.6 s, cost 0.0567 USD (reported), classifier `jev-1.14.0` calls 8, tokens in 6855, cost 0.0003 USD, finding judge `jev-1.14.0` calls 1, tokens in 1841, cost 0.0001 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 26272 / out 454, cost 0.0035 USD (reported), PR document check `jev-1.14.0` calls 9, tokens in 26238, cost 0.0011 USD, build file judge `jev-1.14.0` calls 7, tokens in 8114, cost 0.0003 USD, phases: path_judge 0.3 s, classifier 0.4 s, doc_check 0.5 s, context 6.6 s, model_review 563.1 s, finding_judge 0.2 s, config: defaults + host + repository (.werkrevisor.toml at main 4ed2f1d).
Reviewed head `b38232a000d616ac130040b12356ae4770b75ae8` against base `4ed2f1d19761bbc81b86dedd0e55b56ce8d27908`, werkrevisor 0.62.0.
Diagrams
Drawn by a model from the diff with PR Lens: a view of what the PR touches, not a statement of what it does.
<!-- werkrevisor:b38232a000d616ac130040b12356ae4770b75ae8 -->
<!-- werkrevisor-verdict:ORANGE -->
<!-- werkrevisor-blocks:358f26d3a3c7d9049d05e3411c10a041,5001c5df089e13ba81af72e4991e48a3,4039a10206b62e0b63fd5dddcba86adc,225a409d8334b4c7e36b217c859ac591,14e1dd94cca1e90b18922e1ed1a2e7e2,811ad2a6aef7a49cfd9d660d564bc99e,ed1704ee08cd030c2dc50a078f914d52,cd61011744ba493426eab8c37fb9b2f9,b1f8e786d55bd5408802fab166eec4da,db00768e944387d3e2ea888509f78f00,d3997809d5f049918f9423a880736b9b,1372147d6d0f8298e0c005e0e8d7c9a0,759cfb3a67a321212eede9ceb72b070c,f8334b383537a2bbded49319dc0dddd0,c213a6fdf7c131193829f314f6834d00,c555122f423bb5f363b4c84bbbc0a726,84a1c69982068892d808fbf663d5f1e2,e7a5f9556ba00e8b606c87483d02b23f,32fedac106d070481a1453c75993f66e,a273fed29bdca7b99f3f69a4d9f8fa54,5c0a0e06a784c137f4c3570c9fdd1587,44ab8f374f524af45b28e61b9b537b64,3eef8ff96af7c17958f71366fa7b001c,3e50d0fc7850a1aed49fd6aabea01e4b,10b280d050c1583a2670ff39b0799f59,52b609f726cd81e1a1d0e89e331dae4e,358227ae4b483397be05b004422ac740,81f2b914e72b750f59ddf8a7cd6a984b,3dab73f91231d103f045ba36ab3dcf4a -->
<!-- werkrevisor:diagrams -->
<!-- werkrevisor-folded -->
<details><summary>🟠 werkrevisor ORANGE for <code>b38232a</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/135#issuecomment-7237">the result for <code>1e18155</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:1066-1073
- **YELLOW** Weakened merge gate according to Jev: werkrevisor/codexrunner.py (0.83); a human checks it, unless you revert the change because the task does not need it
- **hint** writing rules violated in the changed docs: README.md:144: paragraph with 6 sentences, more than 5
- **hint** 5 changed file(s) that neither weaken the checks, touch security nor show a risk category of the repository config 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.02)
- **hint** 9 changed file(s) agree with the PR document 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** model recommends changes before merge
### Findings
1. **[medium] Failed Withdrawal** at `werkrevisor/cli.py:1066-1073`, ORANGE, as a line comment
### Classifier
8 of 8 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 42855, calls 1, tokens in 41327 / out 36951 (reasoning included in out), duration 571.6 s, cost 0.0567 USD (reported), classifier `jev-1.14.0` calls 8, tokens in 6855, cost 0.0003 USD, finding judge `jev-1.14.0` calls 1, tokens in 1841, cost 0.0001 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 26272 / out 454, cost 0.0035 USD (reported), PR document check `jev-1.14.0` calls 9, tokens in 26238, cost 0.0011 USD, build file judge `jev-1.14.0` calls 7, tokens in 8114, cost 0.0003 USD, phases: path_judge 0.3 s, classifier 0.4 s, doc_check 0.5 s, context 6.6 s, model_review 563.1 s, finding_judge 0.2 s, config: defaults + host + repository (.werkrevisor.toml at main 4ed2f1d).<br>
Reviewed head `b38232a000d616ac130040b12356ae4770b75ae8` against base `4ed2f1d19761bbc81b86dedd0e55b56ce8d27908`, werkrevisor 0.62.0.
</sub>
### Diagrams
Drawn by a model from the diff with [PR Lens](https://github.com/coldteadotai/pr-lens): a view of what the PR touches, not a statement of what it does.


</details>
werkrevisor: ORANGE / FINDINGS for b38232a000d616ac130040b12356ae4770b75ae8.
The result comment of werkrevisor holds the details.
werkrevisor: ORANGE / FINDINGS for `b38232a000d616ac130040b12356ae4770b75ae8`.
The result comment of werkrevisor holds the details.
<!-- werkrevisor-review:b38232a000d616ac130040b12356ae4770b75ae8 -->
_withdraw_review_request catches API errors and returns a not withdrawn note, but this branch still creates the once-per-head release marker. Every later run therefore exits at the marker check, leaving Gitea's pending official review request to block the scheduled merge indefinitely. Create the marker only after withdrawal succeeds so that the next run can retry after receiving MERGE_ALREADY_SCHEDULED.
**[medium] Failed Withdrawal** (werkrevisor)
ORANGE; Jev: real 0.73, severity 3.0 of 3
`_withdraw_review_request` catches API errors and returns a `not withdrawn` note, but this branch still creates the once-per-head release marker. Every later run therefore exits at the marker check, leaving Gitea's pending official review request to block the scheduled merge indefinitely. Create the marker only after withdrawal succeeds so that the next run can retry after receiving `MERGE_ALREADY_SCHEDULED`.
Fixed in 1e18155: a failed withdrawal returns without the release comment, so the next run tries again; red/green with test_a_failed_withdrawal_is_tried_again_by_the_next_run.
Fixed in `1e18155`: a failed withdrawal returns without the release comment, so the next run tries again; red/green with `test_a_failed_withdrawal_is_tried_again_by_the_next_run`.
claude-code marked this conversation as resolved
ai-reviewer
scheduled this pull request to auto merge when all checks succeed 2026-10-23 12:57:07 +02:00
ai-reviewer
requested review from mi 2026-10-23 12:57:07 +02:00
If scheduling succeeds but withdrawing the human review request fails, _withdraw_review_request returns an error note and execution still writes the release marker. Every later run returns immediately at line 1049, even after the API recovers. The outstanding review request continues blocking the merge, so resolving all comments still requires manual intervention. Record completion only after withdrawal succeeds, or retry incomplete withdrawals despite the marker.
Fix it, or reply why it does not hold, and resolve this comment.
**[medium] Failed review-request withdrawal permanently prevents retries** (Codex review)
If scheduling succeeds but withdrawing the human review request fails, _withdraw_review_request returns an error note and execution still writes the release marker. Every later run returns immediately at line 1049, even after the API recovers. The outstanding review request continues blocking the merge, so resolving all comments still requires manual intervention. Record completion only after withdrawal succeeds, or retry incomplete withdrawals despite the marker.
Fix it, or reply why it does not hold, and resolve this comment.
<!-- werkrevisor-codex -->
This change automatically releases merge holds and withdraws human review requests. A mistake could bypass the intended review gate and merge changes without required human oversight.
Findings
[medium] Failed review-request withdrawal permanently prevents retries at werkrevisor/cli.py:1071, as a line comment
The merge waits for the status ai-review/codex: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here.
Model `gpt-6-astra`, effort high, tokens in 453920 (cached 386944) / out 2178, 89.1 s, 16 commands; reviewed head `b38232a000d616ac130040b12356ae4770b75ae8`.
<!-- werkrevisor-codex:b38232a000d616ac130040b12356ae4770b75ae8 -->
<!-- werkrevisor-codex-critical:true -->
<!-- werkrevisor-codex-unattached:0 -->
<!-- werkrevisor-codex -->
## Codex review: critical
This change automatically releases merge holds and withdraws human review requests. A mistake could bypass the intended review gate and merge changes without required human oversight.
### Findings
1. **[medium] Failed review-request withdrawal permanently prevents retries** at `werkrevisor/cli.py:1071`, as a line comment
The merge waits for the status `ai-review/codex`: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here.
<sub>
Model `gpt-6-astra`, effort high, tokens in 453920 (cached 386944) / out 2178, 89.1 s, 16 commands; reviewed head `b38232a000d616ac130040b12356ae4770b75ae8`.
</sub>
ORANGE 1 finding(s) that Jev rates as probably real and severe: werkrevisor/cli.py:1065-1077
YELLOW Weakened merge gate according to Jev: werkrevisor/codexrunner.py (0.80); a human checks it, unless you revert the change because the task does not need it
hint 5 changed file(s) that neither weaken the checks, touch security nor show a risk category of the repository config 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.02)
hint 9 changed file(s) agree with the PR document 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-23-PR#135-release-held-merge.md:82
hint model recommends changes before merge
hint model rates the risk as high (advisory: Jev judged every changed file)
Findings
[high] Merge Status Stuck at werkrevisor/cli.py:1065-1077, ORANGE, as a line comment
[medium] Stale Process Diagram at docs/prs/2026-10-23-PR#135-release-held-merge.md:82
hint; Jev: real 0.80, severity 1.8 of 3
The PR adds a new gate-release step and decision, but this line declares the required diagrams unchanged. Repository guidance requires diagrams in docs/ to be updated whenever review steps or decisions change; leaving them unchanged makes the required process documentation incomplete.
7 of 8 units passed all questions (1 PR document(s)).
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 43525, calls 1, tokens in 41962 / out 25461 (reasoning included in out), duration 455.3 s, cost 0.0431 USD (reported), classifier `jev-1.14.0` calls 8, tokens in 6877, cost 0.0003 USD, finding judge `jev-1.14.0` calls 2, tokens in 3583, cost 0.0002 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 26376 / out 635, cost 0.0036 USD (reported), PR document check `jev-1.14.0` calls 9, tokens in 26660, cost 0.0011 USD, build file judge `jev-1.14.0` calls 7, tokens in 8337, cost 0.0004 USD, phases: path_judge 0.4 s, classifier 0.4 s, doc_check 0.5 s, context 10.4 s, model_review 442.4 s, finding_judge 0.2 s, config: defaults + host + repository (.werkrevisor.toml at main 4ed2f1d).
Reviewed head `1e18155d224a0087a32de1b15b4ca172693d7533` against base `4ed2f1d19761bbc81b86dedd0e55b56ce8d27908`, werkrevisor 0.62.0.
Diagrams
Drawn by a model from the diff with PR Lens: a view of what the PR touches, not a statement of what it does.
<!-- werkrevisor:1e18155d224a0087a32de1b15b4ca172693d7533 -->
<!-- werkrevisor-verdict:ORANGE -->
<!-- werkrevisor-blocks:a7d92679ee4a167a941c6e72d53ce79d,5001c5df089e13ba81af72e4991e48a3,d3ee54037042bc4f664f8b056bed87dd,225a409d8334b4c7e36b217c859ac591,14e1dd94cca1e90b18922e1ed1a2e7e2,811ad2a6aef7a49cfd9d660d564bc99e,ed9d367dcfad387e92a1603989f44d3e,cd61011744ba493426eab8c37fb9b2f9,b1f8e786d55bd5408802fab166eec4da,db00768e944387d3e2ea888509f78f00,d3997809d5f049918f9423a880736b9b,1372147d6d0f8298e0c005e0e8d7c9a0,759cfb3a67a321212eede9ceb72b070c,f8334b383537a2bbded49319dc0dddd0,c213a6fdf7c131193829f314f6834d00,c555122f423bb5f363b4c84bbbc0a726,84a1c69982068892d808fbf663d5f1e2,5680cb9cabb2295612affea10ac0ad0b,32fedac106d070481a1453c75993f66e,a273fed29bdca7b99f3f69a4d9f8fa54,5c0a0e06a784c137f4c3570c9fdd1587,44ab8f374f524af45b28e61b9b537b64,3eef8ff96af7c17958f71366fa7b001c,3e50d0fc7850a1aed49fd6aabea01e4b,10b280d050c1583a2670ff39b0799f59,52b609f726cd81e1a1d0e89e331dae4e,358227ae4b483397be05b004422ac740,81f2b914e72b750f59ddf8a7cd6a984b,3dab73f91231d103f045ba36ab3dcf4a -->
<!-- werkrevisor:diagrams -->
<!-- werkrevisor-folded -->
<details><summary>🟠 werkrevisor ORANGE for <code>1e18155</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/135#issuecomment-7265">the result for <code>2d6234f</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:1065-1077
- **YELLOW** Weakened merge gate according to Jev: werkrevisor/codexrunner.py (0.80); a human checks it, unless you revert the change because the task does not need it
- **YELLOW** spec: docs/prs/2026-10-23-PR#135-release-held-merge.md Scenario#135.01 given_when_then_misused (0.71 > yellow_above = 0.6)
- **hint** 5 changed file(s) that neither weaken the checks, touch security nor show a risk category of the repository config 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.02)
- **hint** 9 changed file(s) agree with the PR document 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-23-PR#135-release-held-merge.md:82
- **hint** model recommends changes before merge
- **hint** model rates the risk as high (advisory: Jev judged every changed file)
### Findings
1. **[high] Merge Status Stuck** at `werkrevisor/cli.py:1065-1077`, ORANGE, as a line comment
2. **[medium] Stale Process Diagram** at `docs/prs/2026-10-23-PR#135-release-held-merge.md:82`
hint; Jev: real 0.80, severity 1.8 of 3
The PR adds a new gate-release step and decision, but this line declares the required diagrams unchanged. Repository guidance requires diagrams in `docs/` to be updated whenever review steps or decisions change; leaving them unchanged makes the required process documentation incomplete.
### Classifier
| Unit | Question | Problem | Confidence | Verdict |
|---|---|---|---|---|
| docs/prs/2026-10-23-PR#135-release-held-merge.md Scenario#135.01 | given_when_then_misused | 0.71 | – | YELLOW |
7 of 8 units passed all questions (1 PR document(s)).
<sub>
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 43525, calls 1, tokens in 41962 / out 25461 (reasoning included in out), duration 455.3 s, cost 0.0431 USD (reported), classifier `jev-1.14.0` calls 8, tokens in 6877, cost 0.0003 USD, finding judge `jev-1.14.0` calls 2, tokens in 3583, cost 0.0002 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 26376 / out 635, cost 0.0036 USD (reported), PR document check `jev-1.14.0` calls 9, tokens in 26660, cost 0.0011 USD, build file judge `jev-1.14.0` calls 7, tokens in 8337, cost 0.0004 USD, phases: path_judge 0.4 s, classifier 0.4 s, doc_check 0.5 s, context 10.4 s, model_review 442.4 s, finding_judge 0.2 s, config: defaults + host + repository (.werkrevisor.toml at main 4ed2f1d).<br>
Reviewed head `1e18155d224a0087a32de1b15b4ca172693d7533` against base `4ed2f1d19761bbc81b86dedd0e55b56ce8d27908`, werkrevisor 0.62.0.
</sub>
### Diagrams
Drawn by a model from the diff with [PR Lens](https://github.com/coldteadotai/pr-lens): a view of what the PR touches, not a statement of what it does.


</details>
werkrevisor: ORANGE / FINDINGS for 1e18155d224a0087a32de1b15b4ca172693d7533.
The result comment of werkrevisor holds the details.
werkrevisor: ORANGE / FINDINGS for `1e18155d224a0087a32de1b15b4ca172693d7533`.
The result comment of werkrevisor holds the details.
<!-- werkrevisor-review:1e18155d224a0087a32de1b15b4ca172693d7533 -->
If _hold_merge previously failed to cancel an existing scheduled merge, _approval_gate leaves the werkrevisor status non-success while still adding HELD_MARKER. After the threads are resolved, this path can schedule the merge or accept MERGE_ALREADY_SCHEDULED, write the once-per-head release marker, and never restore that status. The protected branch therefore keeps the merge blocked and subsequent runner passes skip the PR. Restore the successful gate status before marking the release complete, or leave it retryable.
**[high] Merge Status Stuck** (werkrevisor)
ORANGE; Jev: real 0.60, severity 3.0 of 3
If `_hold_merge` previously failed to cancel an existing scheduled merge, `_approval_gate` leaves the werkrevisor status non-success while still adding `HELD_MARKER`. After the threads are resolved, this path can schedule the merge or accept `MERGE_ALREADY_SCHEDULED`, write the once-per-head release marker, and never restore that status. The protected branch therefore keeps the merge blocked and subsequent runner passes skip the PR. Restore the successful gate status before marking the release complete, or leave it retryable.
Fixed in 1dc29de: a hold whose cancel failed gets no HELD_MARKER, so the runner leaves it to a new review, which can turn the gate check green; red/green with test_a_failed_cancel_leaves_the_release_to_a_new_review.
Fixed in `1dc29de`: a hold whose cancel failed gets no `HELD_MARKER`, so the runner leaves it to a new review, which can turn the gate check green; red/green with `test_a_failed_cancel_leaves_the_release_to_a_new_review`.
[medium] An earlier release prevents releasing a later hold on the same head (Codex review)
After a successful release, reopening a line-comment thread and restarting werkrevisor cancels the scheduled merge. Resolving that thread again cannot release it: the earlier release marker causes this unconditional return, even though a newer restart comment records another hold. Reproduced: the second release returns an empty string and no merge remains scheduled.
Fix it, or reply why it does not hold, and resolve this comment.
**[medium] An earlier release prevents releasing a later hold on the same head** (Codex review)
After a successful release, reopening a line-comment thread and restarting werkrevisor cancels the scheduled merge. Resolving that thread again cannot release it: the earlier release marker causes this unconditional return, even though a newer restart comment records another hold. Reproduced: the second release returns an empty string and no merge remains scheduled.
Fix it, or reply why it does not hold, and resolve this comment.
<!-- werkrevisor-codex -->
Fixed in 2d6234f: the newest of release comment and held comment counts, so a later restart that holds the head again is released again; red/green with test_a_hold_after_a_release_of_the_same_head_is_released_again.
Fixed in `2d6234f`: the newest of release comment and held comment counts, so a later restart that holds the head again is released again; red/green with `test_a_hold_after_a_release_of_the_same_head_is_released_again`.
[high] Previously held PRs bypass a subsequently disabled automerge setting (Codex review)
The runner hardcodes automerge=True. If an operator disables automerge after a head was held, even restarting werkrevisor with automerge=False leaves the historical hold marker intact. Once the threads are resolved, the runner schedules the merge despite that setting. Reproduced with the existing fakes.
Fix it, or reply why it does not hold, and resolve this comment.
**[high] Previously held PRs bypass a subsequently disabled automerge setting** (Codex review)
The runner hardcodes automerge=True. If an operator disables automerge after a head was held, even restarting werkrevisor with automerge=False leaves the historical hold marker intact. Once the threads are resolved, the runner schedules the merge despite that setting. Reproduced with the existing fakes.
Fix it, or reply why it does not hold, and resolve this comment.
<!-- werkrevisor-codex -->
Holds in part; documented in 2d6234f instead of a check. The runner cannot read the host config of werkrevisor on mih09. A hold proves that automerge was on when werkrevisor decided; after automerge is switched off, a merge that werkrevisor scheduled before also stays scheduled in Gitea, so the release behaves like that. The README and the PR document now say this, and that removing the repository from config/codex-runner.toml stops releases. The PR waits for the approval of the human anyway.
Holds in part; documented in `2d6234f` instead of a check. The runner cannot read the host config of werkrevisor on mih09. A hold proves that automerge was on when werkrevisor decided; after automerge is switched off, a merge that werkrevisor scheduled before also stays scheduled in Gitea, so the release behaves like that. The README and the PR document now say this, and that removing the repository from `config/codex-runner.toml` stops releases. The PR waits for the approval of the human anyway.
This changes the merge gate by automatically scheduling merges and withdrawing human review requests. A mistake could merge a PR without the intended safeguards.
Findings
[high] Previously held PRs bypass a subsequently disabled automerge setting at werkrevisor/codexrunner.py:282, as a line comment
[medium] An earlier release prevents releasing a later hold on the same head at werkrevisor/cli.py:1049, as a line comment
The merge waits for the status ai-review/codex: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here.
Model `gpt-6-astra`, effort high, tokens in 512712 (cached 462848) / out 3208, 117.7 s, 12 commands; reviewed head `1e18155d224a0087a32de1b15b4ca172693d7533`.
<!-- werkrevisor-codex:1e18155d224a0087a32de1b15b4ca172693d7533 -->
<!-- werkrevisor-codex-critical:true -->
<!-- werkrevisor-codex-unattached:0 -->
<!-- werkrevisor-codex -->
## Codex review: critical
This changes the merge gate by automatically scheduling merges and withdrawing human review requests. A mistake could merge a PR without the intended safeguards.
### Findings
1. **[high] Previously held PRs bypass a subsequently disabled automerge setting** at `werkrevisor/codexrunner.py:282`, as a line comment
2. **[medium] An earlier release prevents releasing a later hold on the same head** at `werkrevisor/cli.py:1049`, as a line comment
The merge waits for the status `ai-review/codex`: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here.
<sub>
Model `gpt-6-astra`, effort high, tokens in 512712 (cached 462848) / out 3208, 117.7 s, 12 commands; reviewed head `1e18155d224a0087a32de1b15b4ca172693d7533`.
</sub>
Answer to the review of 1e18155 (round 2), fixed in 1dc29de:
ORANGE "Merge Status Stuck": fixed, see the line comment.
YELLOW spec, Scenario#135.01 given_when_then_misused: the scenarios now have one state in Given, the author's action in When, one observable result in Then, and each has "Verified by".
YELLOW weakened merge gate (codexrunner.py): intended; the runner now schedules a merge without a restart. It acts only on a head that werkrevisor approved as GREEN and marked as held for line comments, with each of them resolved, so it never releases more than a restart would. This needs the approval of the human.
Hint "Stale Process Diagram" (PR document line 82): does not hold. The review has no new step or decision; werkrevisor-pr-workflow.svg says that GREEN merges after the author answered the hints, which stays true; it does not show who schedules the merge. The line in the PR document now says so.
Answer to the review of `1e18155` (round 2), fixed in `1dc29de`:
- ORANGE "Merge Status Stuck": fixed, see the line comment.
- YELLOW spec, Scenario#135.01 `given_when_then_misused`: the scenarios now have one state in Given, the author's action in When, one observable result in Then, and each has "Verified by".
- YELLOW weakened merge gate (codexrunner.py): intended; the runner now schedules a merge without a restart. It acts only on a head that werkrevisor approved as GREEN and marked as held for line comments, with each of them resolved, so it never releases more than a restart would. This needs the approval of the human.
- Hint "Stale Process Diagram" (PR document line 82): does not hold. The review has no new step or decision; `werkrevisor-pr-workflow.svg` says that GREEN merges after the author answered the hints, which stays true; it does not show who schedules the merge. The line in the PR document now says so.
werkrevisor marks a result or restart comment whose merge waits only for line comments.
The runner then schedules the merge and withdraws the review request,
for a head that werkrevisor approved, with each of its line comments resolved.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review findings of round 2: a failed cancel fails the gate check, which only a new review turns green.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ai-review/assessment AI findings; a developer approval after checking them unlocks the merge; a human review request is pending; merge already scheduled
ORANGE 1 finding(s) that Jev rates as probably real and severe: werkrevisor/codexrunner.py:259-264
YELLOW Weakened merge gate according to Jev: werkrevisor/codexrunner.py (0.79); a human checks it, unless you revert the change because the task does not need it
hint 5 changed file(s) that neither weaken the checks, touch security nor show a risk category of the repository config according to Jev
hint 1 build change(s) of low risk according to Jev: statistics/build.gradle.kts (weakens checks 0.03, risk 0.00, security 0.02)
hint 9 changed file(s) agree with the PR document 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: werkrevisor/__init__.py:1
hint model recommends changes before merge
Findings
[medium] Delayed release at werkrevisor/codexrunner.py:259-264, ORANGE, as a line comment
[low] Version mismatch at werkrevisor/__init__.py:1, hint, as a line comment
Classifier
8 of 8 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 45132, calls 1, tokens in 43488 / out 38340 (reasoning included in out), duration 571.4 s, cost 0.0590 USD (reported), classifier `jev-1.14.0` calls 8, tokens in 7037, cost 0.0003 USD, finding judge `jev-1.14.0` calls 1, tokens in 1768, cost 0.0001 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 26490 / out 444, cost 0.0035 USD (reported), PR document check `jev-1.14.0` calls 9, tokens in 32193, cost 0.0014 USD, build file judge `jev-1.14.0` calls 7, tokens in 8724, cost 0.0004 USD, phases: path_judge 0.5 s, classifier 0.4 s, doc_check 0.6 s, context 7.0 s, model_review 562.1 s, finding_judge 0.2 s, config: defaults + host + repository (.werkrevisor.toml at main 2bb445f).
Reviewed head `2d6234ffbdc7551893943266d8111cb5617ab02c` against base `2bb445fd25bb11a8d8f697dd698c60b89614bb22`, werkrevisor 0.64.0.
Diagrams
Drawn by a model from the diff with PR Lens: a view of what the PR touches, not a statement of what it does.
<!-- werkrevisor:2d6234ffbdc7551893943266d8111cb5617ab02c -->
<!-- werkrevisor-verdict:ORANGE -->
<!-- werkrevisor-blocks:a7d92679ee4a167a941c6e72d53ce79d,326214c81b023d7e2176df99b913fabb,60876c477156098d098db16fb5595aa0,225a409d8334b4c7e36b217c859ac591,18c12ed57ee75c890747413e8c79bc2b,811ad2a6aef7a49cfd9d660d564bc99e,f725c8bb64f74017e6dca8fed6b1236d,3eb6213fc7b5b5cf90bcc536cba094f9,b1f8e786d55bd5408802fab166eec4da,2eb46fcc50c2da27e14bfef57f71ee0e,d3997809d5f049918f9423a880736b9b,1372147d6d0f8298e0c005e0e8d7c9a0,759cfb3a67a321212eede9ceb72b070c,f8334b383537a2bbded49319dc0dddd0,c213a6fdf7c131193829f314f6834d00,c555122f423bb5f363b4c84bbbc0a726,84a1c69982068892d808fbf663d5f1e2,f1f57f31f42651873220d756c0d09580,32fedac106d070481a1453c75993f66e,a273fed29bdca7b99f3f69a4d9f8fa54,5c0a0e06a784c137f4c3570c9fdd1587,44ab8f374f524af45b28e61b9b537b64,3eef8ff96af7c17958f71366fa7b001c,3e50d0fc7850a1aed49fd6aabea01e4b,10b280d050c1583a2670ff39b0799f59,52b609f726cd81e1a1d0e89e331dae4e,358227ae4b483397be05b004422ac740,81f2b914e72b750f59ddf8a7cd6a984b,3dab73f91231d103f045ba36ab3dcf4a -->
<!-- werkrevisor:diagrams -->
<!-- werkrevisor-folded -->
<details><summary>🟠 werkrevisor ORANGE for <code>2d6234f</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/135#issuecomment-7276">the result for <code>6e023c0</code></a></summary>
## 🟠 werkrevisor: ORANGE / FINDINGS
Change kind: `mixed`.
### Reasons
- **ORANGE** 1 finding(s) that Jev rates as probably real and severe: werkrevisor/codexrunner.py:259-264
- **YELLOW** Weakened merge gate according to Jev: werkrevisor/codexrunner.py (0.79); a human checks it, unless you revert the change because the task does not need it
- **hint** 5 changed file(s) that neither weaken the checks, touch security nor show a risk category of the repository config according to Jev
- **hint** 1 build change(s) of low risk according to Jev: statistics/build.gradle.kts (weakens checks 0.03, risk 0.00, security 0.02)
- **hint** 9 changed file(s) agree with the PR document 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: werkrevisor/__init__.py:1
- **hint** model recommends changes before merge
### Findings
1. **[medium] Delayed release** at `werkrevisor/codexrunner.py:259-264`, ORANGE, as a line comment
2. **[low] Version mismatch** at `werkrevisor/__init__.py:1`, hint, as a line comment
### Classifier
8 of 8 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 45132, calls 1, tokens in 43488 / out 38340 (reasoning included in out), duration 571.4 s, cost 0.0590 USD (reported), classifier `jev-1.14.0` calls 8, tokens in 7037, cost 0.0003 USD, finding judge `jev-1.14.0` calls 1, tokens in 1768, cost 0.0001 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 26490 / out 444, cost 0.0035 USD (reported), PR document check `jev-1.14.0` calls 9, tokens in 32193, cost 0.0014 USD, build file judge `jev-1.14.0` calls 7, tokens in 8724, cost 0.0004 USD, phases: path_judge 0.5 s, classifier 0.4 s, doc_check 0.6 s, context 7.0 s, model_review 562.1 s, finding_judge 0.2 s, config: defaults + host + repository (.werkrevisor.toml at main 2bb445f).<br>
Reviewed head `2d6234ffbdc7551893943266d8111cb5617ab02c` against base `2bb445fd25bb11a8d8f697dd698c60b89614bb22`, werkrevisor 0.64.0.
</sub>
### Diagrams
Drawn by a model from the diff with [PR Lens](https://github.com/coldteadotai/pr-lens): a view of what the PR touches, not a statement of what it does.


</details>
werkrevisor: ORANGE / FINDINGS for 2d6234ffbdc7551893943266d8111cb5617ab02c.
The result comment of werkrevisor holds the details.
werkrevisor: ORANGE / FINDINGS for `2d6234ffbdc7551893943266d8111cb5617ab02c`.
The result comment of werkrevisor holds the details.
<!-- werkrevisor-review:2d6234ffbdc7551893943266d8111cb5617ab02c -->
The package and statistics versions are 0.65.0 from a 0.64.0 base, and the PR document also names 0.65.0, while the PR title advertises werkrevisor 0.63.0. This contradictory release identity can mislabel release notes or deployment records; align the title with the code before merging.
**[low] Version mismatch** (werkrevisor)
hint
The package and statistics versions are `0.65.0` from a `0.64.0` base, and the PR document also names `0.65.0`, while the PR title advertises `werkrevisor 0.63.0`. This contradictory release identity can mislabel release notes or deployment records; align the title with the code before merging.
The release check runs once per PR while candidates are collected, before potentially long Codex reviews. If a line comment is resolved after that PR was scanned, the current run cannot release it; with the defaults of three 1,800-second reviews and a one-minute restart delay, the documented within a minute result can take about 91 minutes. Run a release pass after the reviews or change the documented SLA.
**[medium] Delayed release** (werkrevisor)
ORANGE; Jev: real 0.75, severity 2.9 of 3
The release check runs once per PR while candidates are collected, before potentially long Codex reviews. If a line comment is resolved after that PR was scanned, the current run cannot release it; with the defaults of three 1,800-second reviews and a one-minute restart delay, the documented `within a minute` result can take about 91 minutes. Run a release pass after the reviews or change the documented SLA.
Fixed in 6e023c0 by the documentation: the runner releases in its next run; a run with Codex reviews ends later. The README and the PR document name the bound (about 31 minutes with max_reviews_per_run = 1). A second release pass after the reviews would add API calls each minute for a rare case.
Fixed in `6e023c0` by the documentation: the runner releases in its next run; a run with Codex reviews ends later. The README and the PR document name the bound (about 31 minutes with `max_reviews_per_run = 1`). A second release pass after the reviews would add API calls each minute for a rare case.
claude-code
changed title from werkrevisor 0.63.0: the Codex runner releases a held merge once every line comment is resolved to werkrevisor 0.65.0: the Codex runner releases a held merge once every line comment is resolved2026-10-23 13:49:29 +02:00
[high] Refresh the Codex status before releasing the merge (Codex review)
The runner releases the merge before collect() refreshes the Codex gate. If a previously resolved Codex thread is reopened and the last werkrevisor hint is resolved between polls, ai-review/codex still says success. release_held_merge ignores Codex threads, so it schedules the merge while all checks can still be green; Gitea can merge before collect() changes the status to pending. An in-memory reproduction confirmed this call order. Refresh the gate successfully before releasing the merge.
Fix it, or reply why it does not hold, and resolve this comment.
**[high] Refresh the Codex status before releasing the merge** (Codex review)
The runner releases the merge before collect() refreshes the Codex gate. If a previously resolved Codex thread is reopened and the last werkrevisor hint is resolved between polls, ai-review/codex still says success. release_held_merge ignores Codex threads, so it schedules the merge while all checks can still be green; Gitea can merge before collect() changes the status to pending. An in-memory reproduction confirmed this call order. Refresh the gate successfully before releasing the merge.
Fix it, or reply why it does not hold, and resolve this comment.
<!-- werkrevisor-codex -->
Fixed in 7375eda: the runner first brings ai-review/codex up to date and releases only after that; if that fails, it releases nothing. Red/green with test_the_codex_status_is_up_to_date_before_a_release and test_no_release_when_the_codex_status_cannot_be_brought_up_to_date.
Fixed in `7375eda`: the runner first brings `ai-review/codex` up to date and releases only after that; if that fails, it releases nothing. Red/green with `test_the_codex_status_is_up_to_date_before_a_release` and `test_no_release_when_the_codex_status_cannot_be_brought_up_to_date`.
This changes the merge gate by automatically scheduling merges and withdrawing human review requests. A mistake can bypass required review and merge unsafe changes.
Findings
[high] Refresh the Codex status before releasing the merge at werkrevisor/codexrunner.py:260, as a line comment
The merge waits for the status ai-review/codex: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here.
Model `gpt-6-astra`, effort high, tokens in 507791 (cached 463360) / out 2650, 108.8 s, 9 commands; reviewed head `2d6234ffbdc7551893943266d8111cb5617ab02c`.
<!-- werkrevisor-codex:2d6234ffbdc7551893943266d8111cb5617ab02c -->
<!-- werkrevisor-codex-critical:true -->
<!-- werkrevisor-codex-unattached:0 -->
<!-- werkrevisor-codex -->
## Codex review: critical
This changes the merge gate by automatically scheduling merges and withdrawing human review requests. A mistake can bypass required review and merge unsafe changes.
### Findings
1. **[high] Refresh the Codex status before releasing the merge** at `werkrevisor/codexrunner.py:260`, as a line comment
The merge waits for the status `ai-review/codex`: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here.
<sub>
Model `gpt-6-astra`, effort high, tokens in 507791 (cached 463360) / out 2650, 108.8 s, 9 commands; reviewed head `2d6234ffbdc7551893943266d8111cb5617ab02c`.
</sub>
YELLOW Weakened merge gate according to Jev: werkrevisor/codexrunner.py (0.81); a human checks it, unless you revert the change because the task does not need it
hint writing rules violated in the changed docs: README.md:1613: line longer than 128 characters (156)
hint 5 changed file(s) that neither weaken the checks, touch security nor show a risk category of the repository config according to Jev
hint 1 build change(s) of low risk according to Jev: statistics/build.gradle.kts (weakens checks 0.03, risk 0.00, security 0.02)
hint 9 changed file(s) agree with the PR document 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 the model review failed: TimeoutError: review exceeded 720 seconds (advisory: Jev judged every changed file)
Classifier
8 of 8 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 failed (TimeoutError), tokens counted before the call 44384, duration 734.8 s, cost unknown, classifier `jev-1.14.0` calls 8, tokens in 7110, cost 0.0003 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 26490 / out 567, cost 0.0005 USD (reported), PR document check `jev-1.14.0` calls 9, tokens in 32844, cost 0.0014 USD, build file judge `jev-1.14.0` calls 7, tokens in 8724, cost 0.0004 USD, phases: path_judge 0.3 s, classifier 0.4 s, doc_check 0.5 s, context 8.9 s, model_review 723.4 s, config: defaults + host + repository (.werkrevisor.toml at main 2bb445f).
Reviewed head `6e023c094454525b535e5fd4e7a8c542258540d8` against base `2bb445fd25bb11a8d8f697dd698c60b89614bb22`, werkrevisor 0.64.0.
Diagrams
Drawn by a model from the diff with PR Lens: a view of what the PR touches, not a statement of what it does.
<!-- werkrevisor:6e023c094454525b535e5fd4e7a8c542258540d8 -->
<!-- werkrevisor-verdict:YELLOW -->
<!-- werkrevisor-blocks:5e2ddc4c4797894951f57126041cc9ef,85a0ed435cec8ab070ab5b19de94daee,db25f3c6ac977e5e51c32aec3f45ec2d,225a409d8334b4c7e36b217c859ac591,18c12ed57ee75c890747413e8c79bc2b,811ad2a6aef7a49cfd9d660d564bc99e,f725c8bb64f74017e6dca8fed6b1236d,3eb6213fc7b5b5cf90bcc536cba094f9,b1f8e786d55bd5408802fab166eec4da,2eb46fcc50c2da27e14bfef57f71ee0e,d3997809d5f049918f9423a880736b9b,1372147d6d0f8298e0c005e0e8d7c9a0,759cfb3a67a321212eede9ceb72b070c,f8334b383537a2bbded49319dc0dddd0,c213a6fdf7c131193829f314f6834d00,c555122f423bb5f363b4c84bbbc0a726,84a1c69982068892d808fbf663d5f1e2,f1f57f31f42651873220d756c0d09580,32fedac106d070481a1453c75993f66e,a273fed29bdca7b99f3f69a4d9f8fa54,5c0a0e06a784c137f4c3570c9fdd1587,44ab8f374f524af45b28e61b9b537b64,3eef8ff96af7c17958f71366fa7b001c,3e50d0fc7850a1aed49fd6aabea01e4b,10b280d050c1583a2670ff39b0799f59,52b609f726cd81e1a1d0e89e331dae4e,358227ae4b483397be05b004422ac740,81f2b914e72b750f59ddf8a7cd6a984b,3dab73f91231d103f045ba36ab3dcf4a -->
<!-- werkrevisor:diagrams -->
<!-- werkrevisor-folded -->
<details><summary>🟡 werkrevisor YELLOW for <code>6e023c0</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/135#issuecomment-7289">the result for <code>7375eda</code></a></summary>
## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind: `mixed`.
### Reasons
- **YELLOW** Weakened merge gate according to Jev: werkrevisor/codexrunner.py (0.81); a human checks it, unless you revert the change because the task does not need it
- **hint** writing rules violated in the changed docs: README.md:1613: line longer than 128 characters (156)
- **hint** 5 changed file(s) that neither weaken the checks, touch security nor show a risk category of the repository config according to Jev
- **hint** 1 build change(s) of low risk according to Jev: statistics/build.gradle.kts (weakens checks 0.03, risk 0.00, security 0.02)
- **hint** 9 changed file(s) agree with the PR document 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** the model review failed: TimeoutError: review exceeded 720 seconds (advisory: Jev judged every changed file)
### Classifier
8 of 8 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 failed (TimeoutError), tokens counted before the call 44384, duration 734.8 s, cost unknown, classifier `jev-1.14.0` calls 8, tokens in 7110, cost 0.0003 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 26490 / out 567, cost 0.0005 USD (reported), PR document check `jev-1.14.0` calls 9, tokens in 32844, cost 0.0014 USD, build file judge `jev-1.14.0` calls 7, tokens in 8724, cost 0.0004 USD, phases: path_judge 0.3 s, classifier 0.4 s, doc_check 0.5 s, context 8.9 s, model_review 723.4 s, config: defaults + host + repository (.werkrevisor.toml at main 2bb445f).<br>
Reviewed head `6e023c094454525b535e5fd4e7a8c542258540d8` against base `2bb445fd25bb11a8d8f697dd698c60b89614bb22`, werkrevisor 0.64.0.
</sub>
### Diagrams
Drawn by a model from the diff with [PR Lens](https://github.com/coldteadotai/pr-lens): a view of what the PR touches, not a statement of what it does.


</details>
werkrevisor: YELLOW / HUMAN_REVIEW for 6e023c094454525b535e5fd4e7a8c542258540d8.
The result comment of werkrevisor holds the details.
werkrevisor: YELLOW / HUMAN_REVIEW for `6e023c094454525b535e5fd4e7a8c542258540d8`.
The result comment of werkrevisor holds the details.
<!-- werkrevisor-review:6e023c094454525b535e5fd4e7a8c542258540d8 -->
- With the workstation off, a `gate` repository waits, with the status `pending`.
- In each listed repository, also with `mode = "off"`, the runner releases a merge that werkrevisor held only for its
line comments, once each one is resolved, in the first run that starts afterwards;
a run that reviews with Codex ends later, so the release may wait for those reviews: it schedules the merge and withdraws the review request of the human,
[high] Refresh the Codex gate before releasing the merge (Codex review)
If a Codex thread is reopened after the previous poll marked its gate successful, resolving the remaining werkrevisor hints triggers release() while that success status is still active. collect() updates the Codex gate to pending only afterwards, allowing Gitea to merge with an unresolved Codex finding. A reproduction using the repository’s fakes confirms the order: schedule_merge with success, then set_status pending. Refresh the gate before releasing, and skip release if that refresh fails.
Fix it, or reply why it does not hold, and resolve this comment.
**[high] Refresh the Codex gate before releasing the merge** (Codex review)
If a Codex thread is reopened after the previous poll marked its gate successful, resolving the remaining werkrevisor hints triggers release() while that success status is still active. collect() updates the Codex gate to pending only afterwards, allowing Gitea to merge with an unresolved Codex finding. A reproduction using the repository’s fakes confirms the order: schedule_merge with success, then set_status pending. Refresh the gate before releasing, and skip release if that refresh fails.
Fix it, or reply why it does not hold, and resolve this comment.
<!-- werkrevisor-codex -->
Fixed in 7375eda, the same finding as on 2d6234f (review of the earlier head 6e023c0): the runner updates ai-review/codex first and skips the release if that fails.
Fixed in `7375eda`, the same finding as on `2d6234f` (review of the earlier head `6e023c0`): the runner updates `ai-review/codex` first and skips the release if that fails.
The change adds an automatic path that schedules merges and withdraws human review requests. Errors in this path could bypass review gates and merge unreviewed changes.
Findings
[high] Refresh the Codex gate before releasing the merge at werkrevisor/codexrunner.py:260, as a line comment
The merge waits for the status ai-review/codex: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here.
Model `gpt-6-astra`, effort high, tokens in 358703 (cached 308352) / out 2886, 115.4 s, 8 commands; reviewed head `6e023c094454525b535e5fd4e7a8c542258540d8`.
<!-- werkrevisor-codex:6e023c094454525b535e5fd4e7a8c542258540d8 -->
<!-- werkrevisor-codex-critical:true -->
<!-- werkrevisor-codex-unattached:0 -->
<!-- werkrevisor-codex -->
## Codex review: critical
The change adds an automatic path that schedules merges and withdraws human review requests. Errors in this path could bypass review gates and merge unreviewed changes.
### Findings
1. **[high] Refresh the Codex gate before releasing the merge** at `werkrevisor/codexrunner.py:260`, as a line comment
The merge waits for the status `ai-review/codex`: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here.
<sub>
Model `gpt-6-astra`, effort high, tokens in 358703 (cached 308352) / out 2886, 115.4 s, 8 commands; reviewed head `6e023c094454525b535e5fd4e7a8c542258540d8`.
</sub>
YELLOW Weakened merge gate according to Jev: werkrevisor/codexrunner.py (0.77); a human checks it, unless you revert the change because the task does not need it
hint 5 changed file(s) that neither weaken the checks, touch security nor show a risk category of the repository config 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.02)
hint 9 changed file(s) agree with the PR document 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 the model review failed: TimeoutError: review exceeded 720 seconds (advisory: Jev judged every changed file)
Classifier
8 of 8 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 failed (TimeoutError), tokens counted before the call 46534, duration 732.2 s, cost unknown, classifier `jev-1.14.0` calls 8, tokens in 7159, cost 0.0003 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 26490 / out 532, cost 0.0005 USD (reported), PR document check `jev-1.14.0` calls 9, tokens in 34515, cost 0.0014 USD, build file judge `jev-1.14.0` calls 7, tokens in 9221, cost 0.0004 USD, phases: path_judge 0.4 s, classifier 0.4 s, doc_check 0.5 s, context 6.9 s, model_review 723.4 s, config: defaults + host + repository (.werkrevisor.toml at main 2bb445f).
Reviewed head `7375eda3ccc01524b25d08fe19d98dfecc60c33f` against base `2bb445fd25bb11a8d8f697dd698c60b89614bb22`, werkrevisor 0.64.0.
Diagrams
Drawn by a model from the diff with PR Lens: a view of what the PR touches, not a statement of what it does.
<!-- werkrevisor:7375eda3ccc01524b25d08fe19d98dfecc60c33f -->
<!-- werkrevisor-verdict:YELLOW -->
<!-- werkrevisor-blocks:5e2ddc4c4797894951f57126041cc9ef,aade5948f5696dce12331c6cb081c3bb,b8990346bdce8f35a305fa9a545e20a0,225a409d8334b4c7e36b217c859ac591,18c12ed57ee75c890747413e8c79bc2b,4a110239d9b6137c5d05fbdb408dce40,f725c8bb64f74017e6dca8fed6b1236d,3eb6213fc7b5b5cf90bcc536cba094f9,b1f8e786d55bd5408802fab166eec4da,2eb46fcc50c2da27e14bfef57f71ee0e,d3997809d5f049918f9423a880736b9b,1372147d6d0f8298e0c005e0e8d7c9a0,759cfb3a67a321212eede9ceb72b070c,f8334b383537a2bbded49319dc0dddd0,c213a6fdf7c131193829f314f6834d00,c555122f423bb5f363b4c84bbbc0a726,84a1c69982068892d808fbf663d5f1e2,f1f57f31f42651873220d756c0d09580,32fedac106d070481a1453c75993f66e,a273fed29bdca7b99f3f69a4d9f8fa54,5c0a0e06a784c137f4c3570c9fdd1587,44ab8f374f524af45b28e61b9b537b64,3eef8ff96af7c17958f71366fa7b001c,3e50d0fc7850a1aed49fd6aabea01e4b,5be01ab78b5b70e34c38c9fda9bf15a1,3372c98dad0d9360debd19eacd1ec433,52b609f726cd81e1a1d0e89e331dae4e,358227ae4b483397be05b004422ac740,81f2b914e72b750f59ddf8a7cd6a984b,3dab73f91231d103f045ba36ab3dcf4a -->
## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind: `mixed`.
### Reasons
- **YELLOW** Weakened merge gate according to Jev: werkrevisor/codexrunner.py (0.77); a human checks it, unless you revert the change because the task does not need it
- **hint** 5 changed file(s) that neither weaken the checks, touch security nor show a risk category of the repository config 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.02)
- **hint** 9 changed file(s) agree with the PR document 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** the model review failed: TimeoutError: review exceeded 720 seconds (advisory: Jev judged every changed file)
### Classifier
8 of 8 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 failed (TimeoutError), tokens counted before the call 46534, duration 732.2 s, cost unknown, classifier `jev-1.14.0` calls 8, tokens in 7159, cost 0.0003 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 26490 / out 532, cost 0.0005 USD (reported), PR document check `jev-1.14.0` calls 9, tokens in 34515, cost 0.0014 USD, build file judge `jev-1.14.0` calls 7, tokens in 9221, cost 0.0004 USD, phases: path_judge 0.4 s, classifier 0.4 s, doc_check 0.5 s, context 6.9 s, model_review 723.4 s, config: defaults + host + repository (.werkrevisor.toml at main 2bb445f).<br>
Reviewed head `7375eda3ccc01524b25d08fe19d98dfecc60c33f` against base `2bb445fd25bb11a8d8f697dd698c60b89614bb22`, werkrevisor 0.64.0.
</sub>
<!-- werkrevisor:diagrams -->
### Diagrams
Drawn by a model from the diff with [PR Lens](https://github.com/coldteadotai/pr-lens): a view of what the PR touches, not a statement of what it does.


The change adds an automatic path that schedules merges and withdraws human review requests. A mistake could bypass the review gate and merge changes without the required human review, so human review is required.
No findings.
The merge waits for the status ai-review/codex: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here.
Model `gpt-6-astra`, effort high, tokens in 492274 (cached 420992) / out 2403, 133.2 s, 11 commands; reviewed head `7375eda3ccc01524b25d08fe19d98dfecc60c33f`.
<!-- werkrevisor-codex:7375eda3ccc01524b25d08fe19d98dfecc60c33f -->
<!-- werkrevisor-codex-critical:true -->
<!-- werkrevisor-codex-unattached:0 -->
<!-- werkrevisor-codex -->
## Codex review: critical
The change adds an automatic path that schedules merges and withdraws human review requests. A mistake could bypass the review gate and merge changes without the required human review, so human review is required.
No findings.
The merge waits for the status `ai-review/codex`: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here.
<sub>
Model `gpt-6-astra`, effort high, tokens in 492274 (cached 420992) / out 2403, 133.2 s, 11 commands; reviewed head `7375eda3ccc01524b25d08fe19d98dfecc60c33f`.
</sub>
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 the PR document under docs/prs/.
🤖 Generated with Claude Code
4af64ad4a2tob38232a000🟠 werkrevisor ORANGE for
b38232a, superseded by the result for1e18155🟠 werkrevisor: ORANGE / FINDINGS
Change kind:
mixed.Reasons
Findings
werkrevisor/cli.py:1066-1073, ORANGE, as a line commentClassifier
8 of 8 units passed all questions (1 PR document(s)).
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 42855, calls 1, tokens in 41327 / out 36951 (reasoning included in out), duration 571.6 s, cost 0.0567 USD (reported), classifier `jev-1.14.0` calls 8, tokens in 6855, cost 0.0003 USD, finding judge `jev-1.14.0` calls 1, tokens in 1841, cost 0.0001 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 26272 / out 454, cost 0.0035 USD (reported), PR document check `jev-1.14.0` calls 9, tokens in 26238, cost 0.0011 USD, build file judge `jev-1.14.0` calls 7, tokens in 8114, cost 0.0003 USD, phases: path_judge 0.3 s, classifier 0.4 s, doc_check 0.5 s, context 6.6 s, model_review 563.1 s, finding_judge 0.2 s, config: defaults + host + repository (.werkrevisor.toml at main1 answer ignored because of a confidence below [classifier] min_confidence.
4ed2f1d).Reviewed head `b38232a000d616ac130040b12356ae4770b75ae8` against base `4ed2f1d19761bbc81b86dedd0e55b56ce8d27908`, werkrevisor 0.62.0.
Diagrams
Drawn by a model from the diff with PR Lens: a view of what the PR touches, not a statement of what it does.
werkrevisor: ORANGE / FINDINGS for
b38232a000d616ac130040b12356ae4770b75ae8.The result comment of werkrevisor holds the details.
@@ -140,5 +140,5 @@PR(["Pull request in Gitea"]):::iosubgraph WF["Workflow code – deterministic"]READ["Read the PR and the config layers<br/>reuse the result of an already reviewed head"]:::codeWriting rule: paragraph with 6 sentences, more than 5 (werkrevisor writing rule)
Fix the line, or reply why it stays, and resolve this comment.
Fixed in
1e18155: the paragraph is split.@@ -1033,0 +1063,4 @@return ""base_ref = (pr_data.get("base") or {}).get("ref") or pr.base_refnote = _schedule_merge(gate, pr, gitea, redactor, base_ref)if note in (MERGE_SCHEDULED, MERGE_ALREADY_SCHEDULED):[medium] Failed Withdrawal (werkrevisor)
ORANGE; Jev: real 0.73, severity 3.0 of 3
_withdraw_review_requestcatches API errors and returns anot withdrawnnote, but this branch still creates the once-per-head release marker. Every later run therefore exits at the marker check, leaving Gitea's pending official review request to block the scheduled merge indefinitely. Create the marker only after withdrawal succeeds so that the next run can retry after receivingMERGE_ALREADY_SCHEDULED.Fixed in
1e18155: a failed withdrawal returns without the release comment, so the next run tries again; red/green withtest_a_failed_withdrawal_is_tried_again_by_the_next_run.Codex review of
b38232a000d616ac130040b12356ae4770b75ae8@@ -1033,0 +1068,4 @@note += withdrawn# An open review request blocks the scheduled merge, so the next run tries the withdrawal again.if " not withdrawn: " in withdrawn:return note.removeprefix("; ")[medium] Failed review-request withdrawal permanently prevents retries (Codex review)
If scheduling succeeds but withdrawing the human review request fails, _withdraw_review_request returns an error note and execution still writes the release marker. Every later run returns immediately at line 1049, even after the API recovers. The outstanding review request continues blocking the merge, so resolving all comments still requires manual intervention. Record completion only after withdrawal succeeds, or retry incomplete withdrawals despite the marker.
Fix it, or reply why it does not hold, and resolve this comment.
Fixed in
1e18155, the same finding as werkrevisor's: a failed withdrawal writes no release marker, so the next run retries.Codex review: critical
This change automatically releases merge holds and withdraws human review requests. A mistake could bypass the intended review gate and merge changes without required human oversight.
Findings
werkrevisor/cli.py:1071, as a line commentThe merge waits for the status
Model `gpt-6-astra`, effort high, tokens in 453920 (cached 386944) / out 2178, 89.1 s, 16 commands; reviewed head `b38232a000d616ac130040b12356ae4770b75ae8`.ai-review/codex: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here.🟠 werkrevisor ORANGE for
1e18155, superseded by the result for2d6234f🟠 werkrevisor: ORANGE / FINDINGS
Change kind:
mixed.Reasons
Findings
[high] Merge Status Stuck at
werkrevisor/cli.py:1065-1077, ORANGE, as a line comment[medium] Stale Process Diagram at
docs/prs/2026-10-23-PR#135-release-held-merge.md:82hint; Jev: real 0.80, severity 1.8 of 3
The PR adds a new gate-release step and decision, but this line declares the required diagrams unchanged. Repository guidance requires diagrams in
docs/to be updated whenever review steps or decisions change; leaving them unchanged makes the required process documentation incomplete.Classifier
7 of 8 units passed all questions (1 PR document(s)).
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 43525, calls 1, tokens in 41962 / out 25461 (reasoning included in out), duration 455.3 s, cost 0.0431 USD (reported), classifier `jev-1.14.0` calls 8, tokens in 6877, cost 0.0003 USD, finding judge `jev-1.14.0` calls 2, tokens in 3583, cost 0.0002 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 26376 / out 635, cost 0.0036 USD (reported), PR document check `jev-1.14.0` calls 9, tokens in 26660, cost 0.0011 USD, build file judge `jev-1.14.0` calls 7, tokens in 8337, cost 0.0004 USD, phases: path_judge 0.4 s, classifier 0.4 s, doc_check 0.5 s, context 10.4 s, model_review 442.4 s, finding_judge 0.2 s, config: defaults + host + repository (.werkrevisor.toml at main4ed2f1d).Reviewed head `1e18155d224a0087a32de1b15b4ca172693d7533` against base `4ed2f1d19761bbc81b86dedd0e55b56ce8d27908`, werkrevisor 0.62.0.
Diagrams
Drawn by a model from the diff with PR Lens: a view of what the PR touches, not a statement of what it does.
werkrevisor: ORANGE / FINDINGS for
1e18155d224a0087a32de1b15b4ca172693d7533.The result comment of werkrevisor holds the details.
@@ -1033,0 +1062,4 @@if pr_data.get("state") != "open" or (pr_data.get("head") or {}).get("sha") != pr.head_sha:return ""base_ref = (pr_data.get("base") or {}).get("ref") or pr.base_refnote = _schedule_merge(gate, pr, gitea, redactor, base_ref)[high] Merge Status Stuck (werkrevisor)
ORANGE; Jev: real 0.60, severity 3.0 of 3
If
_hold_mergepreviously failed to cancel an existing scheduled merge,_approval_gateleaves the werkrevisor status non-success while still addingHELD_MARKER. After the threads are resolved, this path can schedule the merge or acceptMERGE_ALREADY_SCHEDULED, write the once-per-head release marker, and never restore that status. The protected branch therefore keeps the merge blocked and subsequent runner passes skip the PR. Restore the successful gate status before marking the release complete, or leave it retryable.Fixed in
1dc29de: a hold whose cancel failed gets noHELD_MARKER, so the runner leaves it to a new review, which can turn the gate check green; red/green withtest_a_failed_cancel_leaves_the_release_to_a_new_review.Codex review of
1e18155d224a0087a32de1b15b4ca172693d7533@@ -1033,0 +1046,4 @@"""comments = gitea.list_issue_comments(pr.number) or ()result, verdict = report.find_existing(comments, pr.head_sha, bot_login)own = [c for c in comments if ((c.get("user") or {}).get("login") or "") == bot_login][medium] An earlier release prevents releasing a later hold on the same head (Codex review)
After a successful release, reopening a line-comment thread and restarting werkrevisor cancels the scheduled merge. Resolving that thread again cannot release it: the earlier release marker causes this unconditional return, even though a newer restart comment records another hold. Reproduced: the second release returns an empty string and no merge remains scheduled.
Fix it, or reply why it does not hold, and resolve this comment.
Fixed in
2d6234f: the newest of release comment and held comment counts, so a later restart that holds the head again is released again; red/green withtest_a_hold_after_a_release_of_the_same_head_is_released_again.@@ -270,0 +279,4 @@"""ref = PullRequestRef(server.base_url, owner, repo, pr["number"], pr["head"]["sha"],base_ref=(pr.get("base") or {}).get("ref") or "")note = cli.release_held_merge(GateConfig(human_reviewers=server.human_reviewers, automerge=True), ref, gitea,[high] Previously held PRs bypass a subsequently disabled automerge setting (Codex review)
The runner hardcodes automerge=True. If an operator disables automerge after a head was held, even restarting werkrevisor with automerge=False leaves the historical hold marker intact. Once the threads are resolved, the runner schedules the merge despite that setting. Reproduced with the existing fakes.
Fix it, or reply why it does not hold, and resolve this comment.
Holds in part; documented in
2d6234finstead of a check. The runner cannot read the host config of werkrevisor on mih09. A hold proves that automerge was on when werkrevisor decided; after automerge is switched off, a merge that werkrevisor scheduled before also stays scheduled in Gitea, so the release behaves like that. The README and the PR document now say this, and that removing the repository fromconfig/codex-runner.tomlstops releases. The PR waits for the approval of the human anyway.Codex review: critical
This changes the merge gate by automatically scheduling merges and withdrawing human review requests. A mistake could merge a PR without the intended safeguards.
Findings
werkrevisor/codexrunner.py:282, as a line commentwerkrevisor/cli.py:1049, as a line commentThe merge waits for the status
Model `gpt-6-astra`, effort high, tokens in 512712 (cached 462848) / out 3208, 117.7 s, 12 commands; reviewed head `1e18155d224a0087a32de1b15b4ca172693d7533`.ai-review/codex: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here.Answer to the review of
1e18155(round 2), fixed in1dc29de:given_when_then_misused: the scenarios now have one state in Given, the author's action in When, one observable result in Then, and each has "Verified by".werkrevisor-pr-workflow.svgsays that GREEN merges after the author answered the hints, which stays true; it does not show who schedules the merge. The line in the PR document now says so.1dc29dedabto2d6234ffbd🟠 werkrevisor ORANGE for
2d6234f, superseded by the result for6e023c0🟠 werkrevisor: ORANGE / FINDINGS
Change kind:
mixed.Reasons
Findings
[medium] Delayed release at
werkrevisor/codexrunner.py:259-264, ORANGE, as a line comment[low] Version mismatch at
werkrevisor/__init__.py:1, hint, as a line commentClassifier
8 of 8 units passed all questions (1 PR document(s)).
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 45132, calls 1, tokens in 43488 / out 38340 (reasoning included in out), duration 571.4 s, cost 0.0590 USD (reported), classifier `jev-1.14.0` calls 8, tokens in 7037, cost 0.0003 USD, finding judge `jev-1.14.0` calls 1, tokens in 1768, cost 0.0001 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 26490 / out 444, cost 0.0035 USD (reported), PR document check `jev-1.14.0` calls 9, tokens in 32193, cost 0.0014 USD, build file judge `jev-1.14.0` calls 7, tokens in 8724, cost 0.0004 USD, phases: path_judge 0.5 s, classifier 0.4 s, doc_check 0.6 s, context 7.0 s, model_review 562.1 s, finding_judge 0.2 s, config: defaults + host + repository (.werkrevisor.toml at main1 answer ignored because of a confidence below [classifier] min_confidence.
2bb445f).Reviewed head `2d6234ffbdc7551893943266d8111cb5617ab02c` against base `2bb445fd25bb11a8d8f697dd698c60b89614bb22`, werkrevisor 0.64.0.
Diagrams
Drawn by a model from the diff with PR Lens: a view of what the PR touches, not a statement of what it does.
werkrevisor: ORANGE / FINDINGS for
2d6234ffbdc7551893943266d8111cb5617ab02c.The result comment of werkrevisor holds the details.
@@ -1 +1 @@__version__ = "0.64.0"__version__ = "0.65.0"[low] Version mismatch (werkrevisor)
hint
The package and statistics versions are
0.65.0from a0.64.0base, and the PR document also names0.65.0, while the PR title advertiseswerkrevisor 0.63.0. This contradictory release identity can mislabel release notes or deployment records; align the title with the code before merging.Fixed: the PR title now says 0.65.0, as the code and the PR document after the rebase onto 0.64.0.
@@ -257,3 +256,4 @@for pr in gitea.list_open_prs():if readiness.is_wip(pr.get("title") or ""):continuetry:[medium] Delayed release (werkrevisor)
ORANGE; Jev: real 0.75, severity 2.9 of 3
The release check runs once per PR while candidates are collected, before potentially long Codex reviews. If a line comment is resolved after that PR was scanned, the current run cannot release it; with the defaults of three 1,800-second reviews and a one-minute restart delay, the documented
within a minuteresult can take about 91 minutes. Run a release pass after the reviews or change the documented SLA.Fixed in
6e023c0by the documentation: the runner releases in its next run; a run with Codex reviews ends later. The README and the PR document name the bound (about 31 minutes withmax_reviews_per_run = 1). A second release pass after the reviews would add API calls each minute for a rare case.werkrevisor 0.63.0: the Codex runner releases a held merge once every line comment is resolvedto werkrevisor 0.65.0: the Codex runner releases a held merge once every line comment is resolvedCodex review of
2d6234ffbdc7551893943266d8111cb5617ab02c@@ -258,2 +257,4 @@if readiness.is_wip(pr.get("title") or ""):continuetry:self.release(server, gitea, owner, repo, login, pr)[high] Refresh the Codex status before releasing the merge (Codex review)
The runner releases the merge before collect() refreshes the Codex gate. If a previously resolved Codex thread is reopened and the last werkrevisor hint is resolved between polls, ai-review/codex still says success. release_held_merge ignores Codex threads, so it schedules the merge while all checks can still be green; Gitea can merge before collect() changes the status to pending. An in-memory reproduction confirmed this call order. Refresh the gate successfully before releasing the merge.
Fix it, or reply why it does not hold, and resolve this comment.
Fixed in
7375eda: the runner first bringsai-review/codexup to date and releases only after that; if that fails, it releases nothing. Red/green withtest_the_codex_status_is_up_to_date_before_a_releaseandtest_no_release_when_the_codex_status_cannot_be_brought_up_to_date.Codex review: critical
This changes the merge gate by automatically scheduling merges and withdrawing human review requests. A mistake can bypass required review and merge unsafe changes.
Findings
werkrevisor/codexrunner.py:260, as a line commentThe merge waits for the status
Model `gpt-6-astra`, effort high, tokens in 507791 (cached 463360) / out 2650, 108.8 s, 9 commands; reviewed head `2d6234ffbdc7551893943266d8111cb5617ab02c`.ai-review/codex: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here.🟡 werkrevisor YELLOW for
6e023c0, superseded by the result for7375eda🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind:
mixed.Reasons
Classifier
8 of 8 units passed all questions (1 PR document(s)).
Usage: model `openrouter/minimax/minimax-m3`, LLM failed (TimeoutError), tokens counted before the call 44384, duration 734.8 s, cost unknown, classifier `jev-1.14.0` calls 8, tokens in 7110, cost 0.0003 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 26490 / out 567, cost 0.0005 USD (reported), PR document check `jev-1.14.0` calls 9, tokens in 32844, cost 0.0014 USD, build file judge `jev-1.14.0` calls 7, tokens in 8724, cost 0.0004 USD, phases: path_judge 0.3 s, classifier 0.4 s, doc_check 0.5 s, context 8.9 s, model_review 723.4 s, config: defaults + host + repository (.werkrevisor.toml at main3 answers ignored because of a confidence below [classifier] min_confidence.
2bb445f).Reviewed head `6e023c094454525b535e5fd4e7a8c542258540d8` against base `2bb445fd25bb11a8d8f697dd698c60b89614bb22`, werkrevisor 0.64.0.
Diagrams
Drawn by a model from the diff with PR Lens: a view of what the PR touches, not a statement of what it does.
werkrevisor: YELLOW / HUMAN_REVIEW for
6e023c094454525b535e5fd4e7a8c542258540d8.The result comment of werkrevisor holds the details.
@@ -1607,1 +1610,4 @@- With the workstation off, a `gate` repository waits, with the status `pending`.- In each listed repository, also with `mode = "off"`, the runner releases a merge that werkrevisor held only for itsline comments, once each one is resolved, in the first run that starts afterwards;a run that reviews with Codex ends later, so the release may wait for those reviews: it schedules the merge and withdraws the review request of the human,Writing rule: line longer than 128 characters (156) (werkrevisor writing rule)
Fix the line, or reply why it stays, and resolve this comment.
Fixed in
7375eda: the line is wrapped.Codex review of
6e023c094454525b535e5fd4e7a8c542258540d8@@ -258,2 +257,4 @@if readiness.is_wip(pr.get("title") or ""):continuetry:self.release(server, gitea, owner, repo, login, pr)[high] Refresh the Codex gate before releasing the merge (Codex review)
If a Codex thread is reopened after the previous poll marked its gate successful, resolving the remaining werkrevisor hints triggers release() while that success status is still active. collect() updates the Codex gate to pending only afterwards, allowing Gitea to merge with an unresolved Codex finding. A reproduction using the repository’s fakes confirms the order: schedule_merge with success, then set_status pending. Refresh the gate before releasing, and skip release if that refresh fails.
Fix it, or reply why it does not hold, and resolve this comment.
Fixed in
7375eda, the same finding as on2d6234f(review of the earlier head6e023c0): the runner updatesai-review/codexfirst and skips the release if that fails.Codex review: critical
The change adds an automatic path that schedules merges and withdraws human review requests. Errors in this path could bypass review gates and merge unreviewed changes.
Findings
werkrevisor/codexrunner.py:260, as a line commentThe merge waits for the status
Model `gpt-6-astra`, effort high, tokens in 358703 (cached 308352) / out 2886, 115.4 s, 8 commands; reviewed head `6e023c094454525b535e5fd4e7a8c542258540d8`.ai-review/codex: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here.🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind:
mixed.Reasons
Classifier
8 of 8 units passed all questions (1 PR document(s)).
Usage: model `openrouter/minimax/minimax-m3`, LLM failed (TimeoutError), tokens counted before the call 46534, duration 732.2 s, cost unknown, classifier `jev-1.14.0` calls 8, tokens in 7159, cost 0.0003 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 26490 / out 532, cost 0.0005 USD (reported), PR document check `jev-1.14.0` calls 9, tokens in 34515, cost 0.0014 USD, build file judge `jev-1.14.0` calls 7, tokens in 9221, cost 0.0004 USD, phases: path_judge 0.4 s, classifier 0.4 s, doc_check 0.5 s, context 6.9 s, model_review 723.4 s, config: defaults + host + repository (.werkrevisor.toml at main3 answers ignored because of a confidence below [classifier] min_confidence.
2bb445f).Reviewed head `7375eda3ccc01524b25d08fe19d98dfecc60c33f` against base `2bb445fd25bb11a8d8f697dd698c60b89614bb22`, werkrevisor 0.64.0.
Diagrams
Drawn by a model from the diff with PR Lens: a view of what the PR touches, not a statement of what it does.
Codex review: critical
The change adds an automatic path that schedules merges and withdraws human review requests. A mistake could bypass the review gate and merge changes without the required human review, so human review is required.
No findings.
The merge waits for the status
Model `gpt-6-astra`, effort high, tokens in 492274 (cached 420992) / out 2403, 133.2 s, 11 commands; reviewed head `7375eda3ccc01524b25d08fe19d98dfecc60c33f`.ai-review/codex: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here.