werkrevisor 0.65.0: the Codex runner releases a held merge once every line comment is resolved #135

Merged
ai-reviewer merged 9 commits from claude-code/release-held-merge into main 2026-10-23 14:23:46 +02:00
Collaborator

See the PR document under docs/prs/.

🤖 Generated with Claude Code

See the PR document under docs/prs/. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
claude-code force-pushed claude-code/release-held-merge from 4af64ad4a2 to b38232a000 2026-10-23 12:33:33 +02:00 Compare
claude-code marked the pull request as ready for review 2026-10-23 12:36:48 +02:00
Collaborator
🟠 werkrevisor ORANGE for b38232a, superseded by the result for 1e18155

🟠 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.

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.

pr-lens-view-architecture.svg

pr-lens-view-flow.svg

<!-- 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. ![pr-lens-view-architecture.svg](https://git.javagil.de/attachments/59f1e0df-b731-473e-a61c-ca56a8406a5e) ![pr-lens-view-flow.svg](https://git.javagil.de/attachments/8541e723-91f7-49b3-9882-c1aedf5f6a30) </details>
ai-reviewer left a comment
Collaborator

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 -->
@@ -140,5 +140,5 @@
PR(["Pull request in Gitea"]):::io
subgraph WF["Workflow code – deterministic"]
READ["Read the PR and the config layers<br/>reuse the result of an already reviewed head"]:::code
Collaborator

Writing rule: paragraph with 6 sentences, more than 5 (werkrevisor writing rule)

Fix the line, or reply why it stays, and resolve this comment.

**Writing rule: paragraph with 6 sentences, more than 5** (werkrevisor writing rule) Fix the line, or reply why it stays, and resolve this comment.
Author
Collaborator

Fixed in 1e18155: the paragraph is split.

Fixed in `1e18155`: the paragraph is split.
claude-code marked this conversation as resolved
@@ -1033,0 +1063,4 @@
return ""
base_ref = (pr_data.get("base") or {}).get("ref") or pr.base_ref
note = _schedule_merge(gate, pr, gitea, redactor, base_ref)
if note in (MERGE_SCHEDULED, MERGE_ALREADY_SCHEDULED):
Collaborator

[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.

**[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`.
Author
Collaborator

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
ai-reviewer left a comment
Collaborator

Codex review of b38232a000d616ac130040b12356ae4770b75ae8

Codex review of `b38232a000d616ac130040b12356ae4770b75ae8` <!-- werkrevisor-codex -->
@@ -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("; ")
Collaborator

[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.

**[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 -->
Author
Collaborator

Fixed in 1e18155, the same finding as werkrevisor's: a failed withdrawal writes no release marker, so the next run retries.

Fixed in `1e18155`, the same finding as werkrevisor's: a failed withdrawal writes no release marker, so the next run retries.
claude-code marked this conversation as resolved
Collaborator

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.

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>
Collaborator
🟠 werkrevisor ORANGE for 1e18155, superseded by the result for 2d6234f

🟠 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)).

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.

pr-lens-view-containers.svg

pr-lens-view-release-flow.svg

<!-- 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. ![pr-lens-view-containers.svg](https://git.javagil.de/attachments/1e3ecec3-644e-46a8-a562-15dfe97157d6) ![pr-lens-view-release-flow.svg](https://git.javagil.de/attachments/c209f5d4-c144-4c78-aaa1-6123094141b0) </details>
ai-reviewer left a comment
Collaborator

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 -->
@@ -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_ref
note = _schedule_merge(gate, pr, gitea, redactor, base_ref)
Collaborator

[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.

**[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.
Author
Collaborator

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`.
claude-code marked this conversation as resolved
ai-reviewer left a comment
Collaborator

Codex review of 1e18155d224a0087a32de1b15b4ca172693d7533

Codex review of `1e18155d224a0087a32de1b15b4ca172693d7533` <!-- werkrevisor-codex -->
@@ -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]
Collaborator

[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 -->
Author
Collaborator

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`.
claude-code marked this conversation as resolved
@@ -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,
Collaborator

[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 -->
Author
Collaborator

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.
claude-code marked this conversation as resolved
Collaborator

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.

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>
Author
Collaborator

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.
claude-code added 7 commits 2026-10-23 13:34:39 +02:00
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review finding of round 1; README paragraph split for the writing rule.

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>
A hold after a release of the same head is released again; the README names how to stop releases
ai-review/codex 1 open Codex finding(s); resolve each line comment
werkator build succeeded after 00:54
werkator/werkrevisor-statistics build succeeded after 01:39
ai-review/assessment AI findings; a developer approval after checking them unlocks the merge; a human review request is pending; merge already scheduled
ai-review/gate build succeeded after 10:31
2d6234ffbd
Codex findings of round 3.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude-code force-pushed claude-code/release-held-merge from 1dc29dedab to 2d6234ffbd 2026-10-23 13:34:39 +02:00 Compare
Collaborator
🟠 werkrevisor ORANGE for 2d6234f, superseded by the result for 6e023c0

🟠 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.

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.

pr-lens-view-containers.svg

pr-lens-view-flow.svg

<!-- 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. ![pr-lens-view-containers.svg](https://git.javagil.de/attachments/1d5a6224-8b85-4d50-b840-384321ef72ce) ![pr-lens-view-flow.svg](https://git.javagil.de/attachments/17366e29-206c-490f-9f51-96ed94ae670d) </details>
ai-reviewer left a comment
Collaborator

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 -->
@@ -1 +1 @@
__version__ = "0.64.0"
__version__ = "0.65.0"
Collaborator

[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.

**[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.
Author
Collaborator

Fixed: the PR title now says 0.65.0, as the code and the PR document after the rebase onto 0.64.0.

Fixed: the PR title now says 0.65.0, as the code and the PR document after the rebase onto 0.64.0.
claude-code marked this conversation as resolved
@@ -257,3 +256,4 @@
for pr in gitea.list_open_prs():
if readiness.is_wip(pr.get("title") or ""):
continue
try:
Collaborator

[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.

**[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.
Author
Collaborator

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 marked this conversation as resolved
claude-code added 1 commit 2026-10-23 13:49:21 +02:00
The release happens in the next run of the runner, not within a minute
ai-review/codex 2 open Codex finding(s); resolve each line comment
werkator build succeeded after 00:19
werkator/werkrevisor-statistics build succeeded after 01:14
ai-review/assessment human review required; a human approval unlocks the merge; a human review request is pending; merge already scheduled
ai-review/gate build succeeded after 12:58
6e023c0944
Review finding of round 4.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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 resolved 2026-10-23 13:49:29 +02:00
ai-reviewer left a comment
Collaborator

Codex review of 2d6234ffbdc7551893943266d8111cb5617ab02c

Codex review of `2d6234ffbdc7551893943266d8111cb5617ab02c` <!-- werkrevisor-codex -->
@@ -258,2 +257,4 @@
if readiness.is_wip(pr.get("title") or ""):
continue
try:
self.release(server, gitea, owner, repo, login, pr)
Collaborator

[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 -->
Author
Collaborator

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`.
claude-code marked this conversation as resolved
Collaborator

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.

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>
Collaborator
🟡 werkrevisor YELLOW for 6e023c0, superseded by the result for 7375eda

🟡 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.

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.

pr-lens-v-containers.svg

pr-lens-v-release-flow.svg

<!-- 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. ![pr-lens-v-containers.svg](https://git.javagil.de/attachments/32628c63-1c68-4300-90e1-1b80706bfc4e) ![pr-lens-v-release-flow.svg](https://git.javagil.de/attachments/6b9c40a7-f98e-47b9-9844-6101e06c626d) </details>
ai-reviewer left a comment
Collaborator

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 -->
README.md Outdated
@@ -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 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,
Collaborator

Writing rule: line longer than 128 characters (156) (werkrevisor writing rule)

Fix the line, or reply why it stays, and resolve this comment.

**Writing rule: line longer than 128 characters (156)** (werkrevisor writing rule) Fix the line, or reply why it stays, and resolve this comment.
Author
Collaborator

Fixed in 7375eda: the line is wrapped.

Fixed in `7375eda`: the line is wrapped.
claude-code marked this conversation as resolved
ai-reviewer left a comment
Collaborator

Codex review of 6e023c094454525b535e5fd4e7a8c542258540d8

Codex review of `6e023c094454525b535e5fd4e7a8c542258540d8` <!-- werkrevisor-codex -->
@@ -258,2 +257,4 @@
if readiness.is_wip(pr.get("title") or ""):
continue
try:
self.release(server, gitea, owner, repo, login, pr)
Collaborator

[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 -->
Author
Collaborator

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.
claude-code marked this conversation as resolved
Collaborator

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.

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>
claude-code added 1 commit 2026-10-23 14:03:57 +02:00
The runner releases a held merge only after it brought the Codex status up to date
werkator build succeeded after 00:12
werkator/werkrevisor-statistics build succeeded after 00:29
ai-review/assessment human review required; a human approval unlocks the merge; a human review request is pending; merge already scheduled
ai-review/gate build succeeded after 12:51
ai-review/codex Codex review passed
7375eda3cc
Codex finding of round 4; README line wrapped for the writing rule.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Collaborator

🟡 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.

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.

pr-lens-v-context.svg

pr-lens-v-flow.svg

<!-- 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. ![pr-lens-v-context.svg](https://git.javagil.de/attachments/c9a258b1-39b1-4031-868a-af2abfdd96a8) ![pr-lens-v-flow.svg](https://git.javagil.de/attachments/7e47f4e6-da10-47a3-b359-352363942012)
mi approved these changes 2026-10-23 14:17:53 +02:00
Dismissed
Collaborator

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.

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>
mi approved these changes 2026-10-23 14:22:23 +02:00
Dismissed
mi approved these changes 2026-10-23 14:23:38 +02:00
ai-reviewer merged commit 284f80eeae into main 2026-10-23 14:23:46 +02:00
ai-reviewer deleted branch claude-code/release-held-merge 2026-10-23 14:23:46 +02:00
Sign in to join this conversation.
No labels
3 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: mi/werkrevisor#135