werkrevisor 0.32.0: an approval survives a rebase #73

Merged
ai-reviewer merged 8 commits from claude-code/approval-carry-over into main 2026-10-10 13:56:16 +02:00
Collaborator

After a rebase or a merge of main, an approval of the unchanged change stays valid; Jev judges new blocks first.

See docs/prs/2026-10-10-PR#73-approval-carry-over.md.

🤖 Generated with Claude Code

After a rebase or a merge of `main`, an approval of the unchanged change stays valid; Jev judges new blocks first. See docs/prs/2026-10-10-PR#73-approval-carry-over.md. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
claude-code added 1 commit 2026-10-10 13:13:13 +02:00
PR document and Werkbaum: an approval survives a rebase
werkator build succeeded after 00:23
werkator/werkrevisor-statistics build succeeded after 00:31
71bcc97e7b
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
mi added 1 commit 2026-10-10 13:19:02 +02:00
Carry an approval over to a head with the same changed blocks
werkator build succeeded after 00:10
werkator/werkrevisor-statistics build succeeded after 00:30
5050b1939a
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
mi added 1 commit 2026-10-10 13:23:33 +02:00
Tests, README, diagram and version 0.32.0 for the carried-over approval
werkator build succeeded after 00:10
werkator/werkrevisor-statistics build succeeded after 00:36
70ccf7eeae
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
mi added 1 commit 2026-10-10 13:26:22 +02:00
Werkbaum: the Werkregie frontend becomes a PWA
werkator build succeeded after 00:11
werkator/werkrevisor-statistics build succeeded after 00:29
ai-review/assessment human review required; a human approval unlocks the merge; review requested from mi; merge scheduled for when the checks succeed
ai-review/gate build succeeded after 05:56
31b7919868
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude-code marked the pull request as ready for review 2026-10-10 13:26:52 +02:00
Collaborator
🟡 werkrevisor YELLOW for 31b7919, superseded by the result for e5e8d8b

🟡 werkrevisor: YELLOW / HUMAN_REVIEW

Change kind: mixed.

Reasons

  • YELLOW spec: docs/prs/2026-10-10-PR#73-approval-carry-over.md Scenario#73.03 hard_to_read (0.52 > yellow_above = 0.5)
  • YELLOW spec: docs/prs/2026-10-10-PR#73-approval-carry-over.md Scenario#73.05 vague_then (0.64 > yellow_above = 0.6)
  • hint 8 changed file(s) that neither weaken the checks nor touch security according to Jev
  • hint 1 build change(s) of low risk according to Jev: statistics/build.gradle.kts (weakens checks 0.02, risk 0.00, security 0.02)
  • hint 12 section(s) of the PR document agree with the change summary of openrouter/minimax/minimax-m3 according to Jev
  • hint 1 changed file was given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (all full files together would exceed [review] max_full_files_chars = 160000): werkrevisor/config.py
  • hint files the model cannot review: docs/werkrevisor-review-decisions-dark.svg, docs/werkrevisor-review-decisions.svg (advisory: Jev judged every changed file)

Classifier

Unit Question Problem Confidence Verdict
docs/prs/2026-10-10-PR#73-approval-carry-over.md Scenario#73.03 hard_to_read 0.52 0.52 YELLOW
docs/prs/2026-10-10-PR#73-approval-carry-over.md Scenario#73.05 vague_then 0.64 – YELLOW

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

Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 65477, calls 1, tokens in 63345 / out 35173 (reasoning included in out), duration 353.5 s, cost 0.0612 USD (reported), classifier `jev-1.13.0` calls 12, tokens in 9790, cost 0.0004 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 15493 / out 303, cost 0.0021 USD (reported), change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 19840 / out 2167, cost 0.0085 USD (reported), PR document check `jev-1.13.0` calls 12, tokens in 23968, cost 0.0010 USD, build file judge `jev-1.13.0` calls 9, tokens in 12545, cost 0.0005 USD, phases: path_judge 0.8 s, classifier 0.7 s, change_summary 16.2 s, doc_check 0.8 s, context 5.8 s, model_review 329.1 s, config: defaults + host + repository (.werkrevisor.toml at main 5e91298).
Reviewed head `31b7919868f266ae14789f1e39f9673746125642` against base `5e91298b44e729f3f3a9aa3567b8c1ec57e88b2d`, werkrevisor 0.31.6.
<!-- werkrevisor:31b7919868f266ae14789f1e39f9673746125642 --> <!-- werkrevisor-verdict:YELLOW --> <!-- werkrevisor-folded --> <details><summary>🟡 werkrevisor YELLOW for <code>31b7919</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/73#issuecomment-3124">the result for <code>e5e8d8b</code></a></summary> ## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW Change kind: `mixed`. ### Reasons - **YELLOW** spec: docs/prs/2026-10-10-PR#73-approval-carry-over.md Scenario#73.03 hard_to_read (0.52 > yellow_above = 0.5) - **YELLOW** spec: docs/prs/2026-10-10-PR#73-approval-carry-over.md Scenario#73.05 vague_then (0.64 > yellow_above = 0.6) - **hint** 8 changed file(s) that neither weaken the checks nor touch security according to Jev - **hint** 1 build change(s) of low risk according to Jev: statistics/build.gradle.kts (weakens checks 0.02, risk 0.00, security 0.02) - **hint** 12 section(s) of the PR document agree with the change summary of openrouter/minimax/minimax-m3 according to Jev - **hint** 1 changed file was given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (all full files together would exceed [review] max_full_files_chars = 160000): werkrevisor/config.py - **hint** files the model cannot review: docs/werkrevisor-review-decisions-dark.svg, docs/werkrevisor-review-decisions.svg (advisory: Jev judged every changed file) ### Classifier | Unit | Question | Problem | Confidence | Verdict | |---|---|---|---|---| | docs/prs/2026-10-10-PR#73-approval-carry-over.md Scenario#73.03 | hard_to_read | 0.52 | 0.52 | YELLOW | | docs/prs/2026-10-10-PR#73-approval-carry-over.md Scenario#73.05 | vague_then | 0.64 | – | YELLOW | 10 of 12 units passed all questions (1 PR document(s)). 2 answers ignored because of a confidence below [classifier] min_confidence. <sub> Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 65477, calls 1, tokens in 63345 / out 35173 (reasoning included in out), duration 353.5 s, cost 0.0612 USD (reported), classifier `jev-1.13.0` calls 12, tokens in 9790, cost 0.0004 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 15493 / out 303, cost 0.0021 USD (reported), change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 19840 / out 2167, cost 0.0085 USD (reported), PR document check `jev-1.13.0` calls 12, tokens in 23968, cost 0.0010 USD, build file judge `jev-1.13.0` calls 9, tokens in 12545, cost 0.0005 USD, phases: path_judge 0.8 s, classifier 0.7 s, change_summary 16.2 s, doc_check 0.8 s, context 5.8 s, model_review 329.1 s, config: defaults + host + repository (.werkrevisor.toml at main 5e91298).<br> Reviewed head `31b7919868f266ae14789f1e39f9673746125642` against base `5e91298b44e729f3f3a9aa3567b8c1ec57e88b2d`, werkrevisor 0.31.6. </sub> </details>
ai-reviewer scheduled this pull request to auto merge when all checks succeed 2026-10-10 13:32:58 +02:00
ai-reviewer requested review from mi 2026-10-10 13:32:58 +02:00
mi added 1 commit 2026-10-10 13:33:20 +02:00
PR document: concrete outcomes in Scenario#73.03 to #73.05
werkator build succeeded after 00:33
werkator/werkrevisor-statistics build succeeded after 00:57
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 02:01
e5e8d8be76
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Collaborator
🟡 werkrevisor YELLOW for e5e8d8b, superseded by the result for aebb210

🟡 werkrevisor: YELLOW / HUMAN_REVIEW

Change kind: mixed.

Reasons

  • YELLOW spec: docs/prs/2026-10-10-PR#73-approval-carry-over.md Scenario#73.05 given_when_then_misused (0.67 > yellow_above = 0.6)
  • hint 8 changed file(s) that neither weaken the checks nor touch security according to Jev
  • hint 1 build change(s) of low risk according to Jev: statistics/build.gradle.kts (weakens checks 0.02, risk 0.00, security 0.02)
  • hint 12 section(s) of the PR document agree with the change summary of openrouter/minimax/minimax-m3 according to Jev
  • hint 1 changed file was given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (all full files together would exceed [review] max_full_files_chars = 160000): werkrevisor/config.py
  • hint files the model cannot review: docs/werkrevisor-review-decisions-dark.svg, docs/werkrevisor-review-decisions.svg (advisory: Jev judged every changed file)
  • hint 2 finding(s) of low severity or rated minor by Jev: docs/prs/2026-10-10-PR#73-approval-carry-over.md:130-131, docs/prs/2026-10-10-PR#73-approval-carry-over.md:81-87
  • hint model recommends merge with caution

Findings

  1. Scope Creep at docs/prs/2026-10-10-PR#73-approval-carry-over.md:130-131, severity unknown, counted as medium, hint, as a line comment

  2. Possible Bug at docs/prs/2026-10-10-PR#73-approval-carry-over.md:81-87, severity unknown, counted as medium, hint, as a line comment

Classifier

Unit Question Problem Confidence Verdict
docs/prs/2026-10-10-PR#73-approval-carry-over.md Scenario#73.05 given_when_then_misused 0.67 – YELLOW

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

Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 65044, calls 1, tokens in 62928 / out 13882 (reasoning included in out), duration 116.4 s, cost 0.0355 USD (reported), classifier `jev-1.13.0` calls 12, tokens in 9802, cost 0.0004 USD, finding judge `jev-1.13.0` calls 2, tokens in 2658, cost 0.0001 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 15493 / out 216, cost 0.0003 USD (reported), change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 19840 / out 1330, cost 0.0028 USD (reported), PR document check `jev-1.13.0` calls 12, tokens in 20992, cost 0.0009 USD, build file judge `jev-1.13.0` calls 9, tokens in 12545, cost 0.0005 USD, phases: path_judge 0.7 s, classifier 0.8 s, change_summary 8.6 s, doc_check 0.9 s, context 3.7 s, model_review 100.9 s, finding_judge 0.2 s, config: defaults + host + repository (.werkrevisor.toml at main 5e91298).
Reviewed head `e5e8d8be76085cbe0b3697cc4030894ee79d01c6` against base `5e91298b44e729f3f3a9aa3567b8c1ec57e88b2d`, werkrevisor 0.31.6.
<!-- werkrevisor:e5e8d8be76085cbe0b3697cc4030894ee79d01c6 --> <!-- werkrevisor-verdict:YELLOW --> <!-- werkrevisor-folded --> <details><summary>🟡 werkrevisor YELLOW for <code>e5e8d8b</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/73#issuecomment-3142">the result for <code>aebb210</code></a></summary> ## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW Change kind: `mixed`. ### Reasons - **YELLOW** spec: docs/prs/2026-10-10-PR#73-approval-carry-over.md Scenario#73.05 given_when_then_misused (0.67 > yellow_above = 0.6) - **hint** 8 changed file(s) that neither weaken the checks nor touch security according to Jev - **hint** 1 build change(s) of low risk according to Jev: statistics/build.gradle.kts (weakens checks 0.02, risk 0.00, security 0.02) - **hint** 12 section(s) of the PR document agree with the change summary of openrouter/minimax/minimax-m3 according to Jev - **hint** 1 changed file was given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (all full files together would exceed [review] max_full_files_chars = 160000): werkrevisor/config.py - **hint** files the model cannot review: docs/werkrevisor-review-decisions-dark.svg, docs/werkrevisor-review-decisions.svg (advisory: Jev judged every changed file) - **hint** 2 finding(s) of low severity or rated minor by Jev: docs/prs/2026-10-10-PR#73-approval-carry-over.md:130-131, docs/prs/2026-10-10-PR#73-approval-carry-over.md:81-87 - **hint** model recommends merge with caution ### Findings 1. **Scope Creep** at `docs/prs/2026-10-10-PR#73-approval-carry-over.md:130-131`, severity unknown, counted as medium, hint, as a line comment 2. **Possible Bug** at `docs/prs/2026-10-10-PR#73-approval-carry-over.md:81-87`, severity unknown, counted as medium, hint, as a line comment ### Classifier | Unit | Question | Problem | Confidence | Verdict | |---|---|---|---|---| | docs/prs/2026-10-10-PR#73-approval-carry-over.md Scenario#73.05 | given_when_then_misused | 0.67 | – | YELLOW | 11 of 12 units passed all questions (1 PR document(s)). 3 answers ignored because of a confidence below [classifier] min_confidence. <sub> Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 65044, calls 1, tokens in 62928 / out 13882 (reasoning included in out), duration 116.4 s, cost 0.0355 USD (reported), classifier `jev-1.13.0` calls 12, tokens in 9802, cost 0.0004 USD, finding judge `jev-1.13.0` calls 2, tokens in 2658, cost 0.0001 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 15493 / out 216, cost 0.0003 USD (reported), change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 19840 / out 1330, cost 0.0028 USD (reported), PR document check `jev-1.13.0` calls 12, tokens in 20992, cost 0.0009 USD, build file judge `jev-1.13.0` calls 9, tokens in 12545, cost 0.0005 USD, phases: path_judge 0.7 s, classifier 0.8 s, change_summary 8.6 s, doc_check 0.9 s, context 3.7 s, model_review 100.9 s, finding_judge 0.2 s, config: defaults + host + repository (.werkrevisor.toml at main 5e91298).<br> Reviewed head `e5e8d8be76085cbe0b3697cc4030894ee79d01c6` against base `5e91298b44e729f3f3a9aa3567b8c1ec57e88b2d`, werkrevisor 0.31.6. </sub> </details>
ai-reviewer left a comment
Collaborator

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

werkrevisor: YELLOW / HUMAN_REVIEW for `e5e8d8be76085cbe0b3697cc4030894ee79d01c6`. The result comment of werkrevisor holds the details. <!-- werkrevisor-review:e5e8d8be76085cbe0b3697cc4030894ee79d01c6 -->
@@ -0,0 +78,4 @@
#### Scenario#73.05: a dropped approved change is not carried over
So that a check that the PR added cannot disappear unnoticed in a rebase.
Collaborator

Possible Bug, severity unknown, counted as medium (werkrevisor)

hint; Jev: real 0.58, severity 1.1 of 3

Scenario#73.05 reads "a changed block of A is missing in the new head" as a precondition via "And" under "Given", but the missing block is what triggers the not-carried-over outcome. The classifier also flagged this line (0.67) for "given when then misused". Phrasing the missing block as a consequence of the rebase action (or moving it into "When") would match the other scenarios and make the trigger clearer.

**Possible Bug**, severity unknown, counted as medium (werkrevisor) hint; Jev: real 0.58, severity 1.1 of 3 Scenario#73.05 reads "a changed block of A is missing in the new head" as a precondition via "And" under "Given", but the missing block is what triggers the not-carried-over outcome. The classifier also flagged this line (0.67) for "given when then misused". Phrasing the missing block as a consequence of the rebase action (or moving it into "When") would match the other scenarios and make the trigger clearer.
Author
Collaborator

Fixed: the dropped block is now the action ("When a rebase drops a changed block of A").

Fixed: the dropped block is now the action ("When a rebase drops a changed block of A").
claude-code marked this conversation as resolved
@@ -0,0 +127,4 @@
## Additional Changes
- The Werkbaum gets the plan `#werkregie.pwa`: the Werkregie frontend becomes a PWA; this PR does not implement it.
Collaborator

Scope Creep, severity unknown, counted as medium (werkrevisor)

hint; Jev: real 0.75, severity 1.4 of 3

The PR adds a Werkregie PWA plan (#werkregie.pwa) to docs/werkrevisor.werkbaum and the "Additional Changes" section, which is unrelated to the approval carry-over feature. Per AGENTS.md, the Werkbaum tracks review plans, and "A PR that changes the steps or decisions of a review updates the diagrams in docs/"; adding a PWA initiative here muddles the scope and makes the Werkbaum history of this PR misleading. This plan belongs in its own PR.

**Scope Creep**, severity unknown, counted as medium (werkrevisor) hint; Jev: real 0.75, severity 1.4 of 3 The PR adds a Werkregie PWA plan (`#werkregie.pwa`) to `docs/werkrevisor.werkbaum` and the "Additional Changes" section, which is unrelated to the approval carry-over feature. Per `AGENTS.md`, the Werkbaum tracks review plans, and "A PR that changes the steps or decisions of a review updates the diagrams in `docs/`"; adding a PWA initiative here muddles the scope and makes the Werkbaum history of this PR misleading. This plan belongs in its own PR.
Author
Collaborator

Not changed: the user asked for this node in this PR, as an additional change; the PR document declares it under "Additional Changes" and says that this PR does not implement it.

Not changed: the user asked for this node in this PR, as an additional change; the PR document declares it under "Additional Changes" and says that this PR does not implement it.
Author
Collaborator

Update: the node was meant for Werkregie's own Werkbaum; it is removed from this PR.

Update: the node was meant for Werkregie's own Werkbaum; it is removed from this PR.
claude-code marked this conversation as resolved
mi added 1 commit 2026-10-10 13:36:19 +02:00
PR document: Scenario#73.05 names the dropped block as the action
werkator build succeeded after 00:18
werkator/werkrevisor-statistics build succeeded after 00:40
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 06:45
aebb210ac0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Collaborator
🟡 werkrevisor YELLOW for aebb210, superseded by the result for f40619f

🟡 werkrevisor: YELLOW / HUMAN_REVIEW

Change kind: mixed.

Reasons

  • YELLOW spec: docs/prs/2026-10-10-PR#73-approval-carry-over.md Scenario#73.01 hard_to_read (0.51 > yellow_above = 0.5)
  • hint 8 changed file(s) that neither weaken the checks nor touch security according to Jev
  • hint 1 build change(s) of low risk according to Jev: statistics/build.gradle.kts (weakens checks 0.02, risk 0.00, security 0.01)
  • hint 12 section(s) of the PR document agree with the change summary of openrouter/minimax/minimax-m3 according to Jev
  • hint 1 changed file was given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (all full files together would exceed [review] max_full_files_chars = 160000): werkrevisor/config.py
  • hint files the model cannot review: docs/werkrevisor-review-decisions-dark.svg, docs/werkrevisor-review-decisions.svg (advisory: Jev judged every changed file)
  • hint model recommends merge with caution

Classifier

Unit Question Problem Confidence Verdict
docs/prs/2026-10-10-PR#73-approval-carry-over.md Scenario#73.01 hard_to_read 0.51 0.49 YELLOW

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

Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 65090, calls 1, tokens in 62975 / out 38835 (reasoning included in out), duration 401.6 s, cost 0.0655 USD (reported), classifier `jev-1.13.0` calls 12, tokens in 9781, cost 0.0004 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 15493 / out 271, cost 0.0003 USD (reported), change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 19840 / out 5054, cost 0.0073 USD (reported), PR document check `jev-1.13.0` calls 12, tokens in 20995, cost 0.0009 USD, build file judge `jev-1.13.0` calls 9, tokens in 12545, cost 0.0005 USD, phases: path_judge 0.7 s, classifier 0.7 s, change_summary 29.1 s, doc_check 0.7 s, context 4.3 s, model_review 365.4 s, config: defaults + host + repository (.werkrevisor.toml at main 5e91298).
Reviewed head `aebb210ac0069b1b053d809c65bb6dec1c3dc0ac` against base `5e91298b44e729f3f3a9aa3567b8c1ec57e88b2d`, werkrevisor 0.31.6.
<!-- werkrevisor:aebb210ac0069b1b053d809c65bb6dec1c3dc0ac --> <!-- werkrevisor-verdict:YELLOW --> <!-- werkrevisor-folded --> <details><summary>🟡 werkrevisor YELLOW for <code>aebb210</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/73#issuecomment-3152">the result for <code>f40619f</code></a></summary> ## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW Change kind: `mixed`. ### Reasons - **YELLOW** spec: docs/prs/2026-10-10-PR#73-approval-carry-over.md Scenario#73.01 hard_to_read (0.51 > yellow_above = 0.5) - **hint** 8 changed file(s) that neither weaken the checks nor touch security according to Jev - **hint** 1 build change(s) of low risk according to Jev: statistics/build.gradle.kts (weakens checks 0.02, risk 0.00, security 0.01) - **hint** 12 section(s) of the PR document agree with the change summary of openrouter/minimax/minimax-m3 according to Jev - **hint** 1 changed file was given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (all full files together would exceed [review] max_full_files_chars = 160000): werkrevisor/config.py - **hint** files the model cannot review: docs/werkrevisor-review-decisions-dark.svg, docs/werkrevisor-review-decisions.svg (advisory: Jev judged every changed file) - **hint** model recommends merge with caution ### Classifier | Unit | Question | Problem | Confidence | Verdict | |---|---|---|---|---| | docs/prs/2026-10-10-PR#73-approval-carry-over.md Scenario#73.01 | hard_to_read | 0.51 | 0.49 | YELLOW | 11 of 12 units passed all questions (1 PR document(s)). 3 answers ignored because of a confidence below [classifier] min_confidence. <sub> Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 65090, calls 1, tokens in 62975 / out 38835 (reasoning included in out), duration 401.6 s, cost 0.0655 USD (reported), classifier `jev-1.13.0` calls 12, tokens in 9781, cost 0.0004 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 15493 / out 271, cost 0.0003 USD (reported), change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 19840 / out 5054, cost 0.0073 USD (reported), PR document check `jev-1.13.0` calls 12, tokens in 20995, cost 0.0009 USD, build file judge `jev-1.13.0` calls 9, tokens in 12545, cost 0.0005 USD, phases: path_judge 0.7 s, classifier 0.7 s, change_summary 29.1 s, doc_check 0.7 s, context 4.3 s, model_review 365.4 s, config: defaults + host + repository (.werkrevisor.toml at main 5e91298).<br> Reviewed head `aebb210ac0069b1b053d809c65bb6dec1c3dc0ac` against base `5e91298b44e729f3f3a9aa3567b8c1ec57e88b2d`, werkrevisor 0.31.6. </sub> </details>
mi added 1 commit 2026-10-10 13:43:42 +02:00
PR document: Scenario#73.01 names the rebase as the action
werkator build succeeded after 00:11
werkator/werkrevisor-statistics build succeeded after 00: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 05:55
f40619f8ab
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Collaborator
🟠 werkrevisor ORANGE for f40619f, superseded by the result for 7a3b39c

🟠 werkrevisor: ORANGE / FINDINGS

Change kind: mixed.

Reasons

  • ORANGE 1 finding(s) that Jev rates as probably real and severe: werkrevisor/rules.py:211-213
  • YELLOW spec: docs/prs/2026-10-10-PR#73-approval-carry-over.md Scenario#73.01 given_when_then_misused (0.61 > yellow_above = 0.6)
  • hint 8 changed file(s) that neither weaken the checks nor touch security according to Jev
  • hint 1 build change(s) of low risk according to Jev: statistics/build.gradle.kts (weakens checks 0.02, risk 0.00, security 0.01)
  • hint 12 section(s) of the PR document agree with the change summary of openrouter/minimax/minimax-m3 according to Jev
  • hint 1 changed file was given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (all full files together would exceed [review] max_full_files_chars = 160000): werkrevisor/config.py
  • hint files the model cannot review: docs/werkrevisor-review-decisions-dark.svg, docs/werkrevisor-review-decisions.svg (advisory: Jev judged every changed file)
  • hint model recommends merge with caution

Findings

  1. change_kind ignores approved files at werkrevisor/rules.py:211-213, severity unknown, counted as medium, ORANGE, as a line comment

Classifier

Unit Question Problem Confidence Verdict
docs/prs/2026-10-10-PR#73-approval-carry-over.md Scenario#73.01 given_when_then_misused 0.61 – YELLOW

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

Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 65609, calls 1, tokens in 63468 / out 47050 (reasoning included in out), duration 352.2 s, cost 0.0755 USD (reported), classifier `jev-1.13.0` calls 12, tokens in 9742, cost 0.0004 USD, finding judge `jev-1.13.0` calls 1, tokens in 1540, cost 0.0001 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 15493 / out 295, cost 0.0003 USD (reported), change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 19840 / out 1800, cost 0.0034 USD (reported), PR document check `jev-1.13.0` calls 12, tokens in 22552, cost 0.0009 USD, build file judge `jev-1.13.0` calls 9, tokens in 12545, cost 0.0005 USD, phases: path_judge 0.7 s, classifier 0.7 s, change_summary 12.0 s, doc_check 0.8 s, context 6.3 s, model_review 331.0 s, finding_judge 0.2 s, config: defaults + host + repository (.werkrevisor.toml at main 5e91298).
Reviewed head `f40619f8ab9345d66c2b858c0eb165c0c1ae6b7a` against base `5e91298b44e729f3f3a9aa3567b8c1ec57e88b2d`, werkrevisor 0.31.6.
<!-- werkrevisor:f40619f8ab9345d66c2b858c0eb165c0c1ae6b7a --> <!-- werkrevisor-verdict:ORANGE --> <!-- werkrevisor-folded --> <details><summary>🟠 werkrevisor ORANGE for <code>f40619f</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/73#issuecomment-3158">the result for <code>7a3b39c</code></a></summary> ## 🟠 werkrevisor: ORANGE / FINDINGS Change kind: `mixed`. ### Reasons - **ORANGE** 1 finding(s) that Jev rates as probably real and severe: werkrevisor/rules.py:211-213 - **YELLOW** spec: docs/prs/2026-10-10-PR#73-approval-carry-over.md Scenario#73.01 given_when_then_misused (0.61 > yellow_above = 0.6) - **hint** 8 changed file(s) that neither weaken the checks nor touch security according to Jev - **hint** 1 build change(s) of low risk according to Jev: statistics/build.gradle.kts (weakens checks 0.02, risk 0.00, security 0.01) - **hint** 12 section(s) of the PR document agree with the change summary of openrouter/minimax/minimax-m3 according to Jev - **hint** 1 changed file was given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (all full files together would exceed [review] max_full_files_chars = 160000): werkrevisor/config.py - **hint** files the model cannot review: docs/werkrevisor-review-decisions-dark.svg, docs/werkrevisor-review-decisions.svg (advisory: Jev judged every changed file) - **hint** model recommends merge with caution ### Findings 1. **change_kind ignores approved files** at `werkrevisor/rules.py:211-213`, severity unknown, counted as medium, ORANGE, as a line comment ### Classifier | Unit | Question | Problem | Confidence | Verdict | |---|---|---|---|---| | docs/prs/2026-10-10-PR#73-approval-carry-over.md Scenario#73.01 | given_when_then_misused | 0.61 | – | YELLOW | 11 of 12 units passed all questions (1 PR document(s)). 4 answers ignored because of a confidence below [classifier] min_confidence. <sub> Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 65609, calls 1, tokens in 63468 / out 47050 (reasoning included in out), duration 352.2 s, cost 0.0755 USD (reported), classifier `jev-1.13.0` calls 12, tokens in 9742, cost 0.0004 USD, finding judge `jev-1.13.0` calls 1, tokens in 1540, cost 0.0001 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 15493 / out 295, cost 0.0003 USD (reported), change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 19840 / out 1800, cost 0.0034 USD (reported), PR document check `jev-1.13.0` calls 12, tokens in 22552, cost 0.0009 USD, build file judge `jev-1.13.0` calls 9, tokens in 12545, cost 0.0005 USD, phases: path_judge 0.7 s, classifier 0.7 s, change_summary 12.0 s, doc_check 0.8 s, context 6.3 s, model_review 331.0 s, finding_judge 0.2 s, config: defaults + host + repository (.werkrevisor.toml at main 5e91298).<br> Reviewed head `f40619f8ab9345d66c2b858c0eb165c0c1ae6b7a` against base `5e91298b44e729f3f3a9aa3567b8c1ec57e88b2d`, werkrevisor 0.31.6. </sub> </details>
ai-reviewer left a comment
Collaborator

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

werkrevisor: ORANGE / FINDINGS for `f40619f8ab9345d66c2b858c0eb165c0c1ae6b7a`. The result comment of werkrevisor holds the details. <!-- werkrevisor-review:f40619f8ab9345d66c2b858c0eb165c0c1ae6b7a -->
@@ -206,3 +209,3 @@
weakening, changed_tests = find_test_weakening(files, diffs, cats_by_file, mechanical)
weakening, changed_tests = find_test_weakening(files, diffs, cats_by_file, set(mechanical) | set(approved))
# A mechanical file tells nothing about the kind, e.g. a test file with changed imports adds no test.
reviewed_cats = {c for path, c in cats_by_file.items() if path not in mechanical}
Collaborator

change_kind ignores approved files, severity unknown, counted as medium (werkrevisor)

ORANGE; Jev: real 0.86, severity 3.0 of 3

evaluate_rules accepts an approved set but uses it only in find_test_weakening; reviewed_cats and change_kind are computed from all non-mechanical files, so the categories of human-approved files still drive the kind. When carry-over leaves only unapproved files in some categories, the model's change_kind_instruction (e.g. "feature_with_tests") names a category the prompt has none of, and the left_out text is the only signal that this is wrong. Realistic case: an unapproved test file together with an approved main file yields change_kind "feature_with_tests" while the model receives only the test file and no main code in the prompt.

**change_kind ignores approved files**, severity unknown, counted as medium (werkrevisor) ORANGE; Jev: real 0.86, severity 3.0 of 3 evaluate_rules accepts an `approved` set but uses it only in find_test_weakening; `reviewed_cats` and `change_kind` are computed from all non-mechanical files, so the categories of human-approved files still drive the kind. When carry-over leaves only unapproved files in some categories, the model's change_kind_instruction (e.g. "feature_with_tests") names a category the prompt has none of, and the left_out text is the only signal that this is wrong. Realistic case: an unapproved test file together with an approved main file yields change_kind "feature_with_tests" while the model receives only the test file and no main code in the prompt.
Author
Collaborator

Fixed: the change kind now comes from the files outside the approval; only when every file is approved does it come from all of them. Test: ChangeKindTest.

Fixed: the change kind now comes from the files outside the approval; only when every file is approved does it come from all of them. Test: ChangeKindTest.
claude-code marked this conversation as resolved
mi added 1 commit 2026-10-10 13:50:45 +02:00
The change kind comes from the files outside the approval
werkator build succeeded after 00:13
werkator/werkrevisor-statistics build succeeded after 00:58
ai-review/assessment AI findings; a developer approval after checking them unlocks the merge; approved by mi for this head commit; merge already scheduled
ai-review/gate build succeeded after 05:27
7a3b39cba8
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
mi approved these changes 2026-10-10 13:51:44 +02:00
Collaborator

🟠 werkrevisor: ORANGE / FINDINGS

Change kind: mixed.

Reasons

  • ORANGE 1 finding(s) that Jev rates as probably real and severe: werkrevisor/carryover.py:15-16
  • YELLOW spec: docs/prs/2026-10-10-PR#73-approval-carry-over.md Scenario#73.01 given_when_then_misused (0.75 > yellow_above = 0.6)
  • YELLOW model reports a security concern: The 64-bit fingerprint carries an explicit claim ("a PR author cannot construct a different block with the fingerprint of an approved one") that does not hold against a determined attacker. With 64 bits, a birthday attack at ~2^32 work — well under a second on commodity hardware — is enough to construct a colliding block. In the human-approval carry-over path with no new blocks, such a colliding b…
  • hint 8 changed file(s) that neither weaken the checks nor touch security according to Jev
  • hint 1 build change(s) of low risk according to Jev: statistics/build.gradle.kts (weakens checks 0.02, risk 0.00, security 0.02)
  • hint 12 section(s) of the PR document agree with the change summary of openrouter/minimax/minimax-m3 according to Jev
  • hint 2 changed files were given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (all full files together would exceed [review] max_full_files_chars = 160000): werkrevisor/config.py, werkrevisor/rules.py
  • hint files the model cannot review: docs/werkrevisor-review-decisions-dark.svg, docs/werkrevisor-review-decisions.svg (advisory: Jev judged every changed file)
  • hint model recommends merge with caution

Findings

  1. Fingerprint security claim is wrong at werkrevisor/carryover.py:15-16, severity unknown, counted as medium, ORANGE, as a line comment

Classifier

Unit Question Problem Confidence Verdict
docs/prs/2026-10-10-PR#73-approval-carry-over.md Scenario#73.01 given_when_then_misused 0.75 – YELLOW

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

Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 64059, calls 1, tokens in 61984 / out 28501 (reasoning included in out), duration 324.7 s, cost 0.0528 USD (reported), classifier `jev-1.13.0` calls 12, tokens in 9760, cost 0.0004 USD, finding judge `jev-1.13.0` calls 1, tokens in 1307, cost 0.0001 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 2, tokens in 22070 / out 662, cost 0.0013 USD (reported), change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 20079 / out 1517, cost 0.0078 USD (reported), PR document check `jev-1.13.0` calls 12, tokens in 20650, cost 0.0009 USD, build file judge `jev-1.13.0` calls 9, tokens in 12791, cost 0.0005 USD, phases: path_judge 0.7 s, classifier 0.7 s, change_summary 12.4 s, doc_check 0.7 s, context 11.4 s, model_review 298.1 s, finding_judge 0.2 s, config: defaults + host + repository (.werkrevisor.toml at main 5e91298).
Reviewed head `7a3b39cba8384fa28a44e51197cb778ce4f498a6` against base `5e91298b44e729f3f3a9aa3567b8c1ec57e88b2d`, werkrevisor 0.31.6.
<!-- werkrevisor:7a3b39cba8384fa28a44e51197cb778ce4f498a6 --> <!-- werkrevisor-verdict:ORANGE --> ## 🟠 werkrevisor: ORANGE / FINDINGS Change kind: `mixed`. ### Reasons - **ORANGE** 1 finding(s) that Jev rates as probably real and severe: werkrevisor/carryover.py:15-16 - **YELLOW** spec: docs/prs/2026-10-10-PR#73-approval-carry-over.md Scenario#73.01 given_when_then_misused (0.75 > yellow_above = 0.6) - **YELLOW** model reports a security concern: The 64-bit fingerprint carries an explicit claim ("a PR author cannot construct a different block with the fingerprint of an approved one") that does not hold against a determined attacker. With 64 bits, a birthday attack at ~2^32 work — well under a second on commodity hardware — is enough to construct a colliding block. In the human-approval carry-over path with no new blocks, such a colliding b… - **hint** 8 changed file(s) that neither weaken the checks nor touch security according to Jev - **hint** 1 build change(s) of low risk according to Jev: statistics/build.gradle.kts (weakens checks 0.02, risk 0.00, security 0.02) - **hint** 12 section(s) of the PR document agree with the change summary of openrouter/minimax/minimax-m3 according to Jev - **hint** 2 changed files were given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (all full files together would exceed [review] max_full_files_chars = 160000): werkrevisor/config.py, werkrevisor/rules.py - **hint** files the model cannot review: docs/werkrevisor-review-decisions-dark.svg, docs/werkrevisor-review-decisions.svg (advisory: Jev judged every changed file) - **hint** model recommends merge with caution ### Findings 1. **Fingerprint security claim is wrong** at `werkrevisor/carryover.py:15-16`, severity unknown, counted as medium, ORANGE, as a line comment ### Classifier | Unit | Question | Problem | Confidence | Verdict | |---|---|---|---|---| | docs/prs/2026-10-10-PR#73-approval-carry-over.md Scenario#73.01 | given_when_then_misused | 0.75 | – | YELLOW | 11 of 12 units passed all questions (1 PR document(s)). 3 answers ignored because of a confidence below [classifier] min_confidence. <sub> Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 64059, calls 1, tokens in 61984 / out 28501 (reasoning included in out), duration 324.7 s, cost 0.0528 USD (reported), classifier `jev-1.13.0` calls 12, tokens in 9760, cost 0.0004 USD, finding judge `jev-1.13.0` calls 1, tokens in 1307, cost 0.0001 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 2, tokens in 22070 / out 662, cost 0.0013 USD (reported), change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 20079 / out 1517, cost 0.0078 USD (reported), PR document check `jev-1.13.0` calls 12, tokens in 20650, cost 0.0009 USD, build file judge `jev-1.13.0` calls 9, tokens in 12791, cost 0.0005 USD, phases: path_judge 0.7 s, classifier 0.7 s, change_summary 12.4 s, doc_check 0.7 s, context 11.4 s, model_review 298.1 s, finding_judge 0.2 s, config: defaults + host + repository (.werkrevisor.toml at main 5e91298).<br> Reviewed head `7a3b39cba8384fa28a44e51197cb778ce4f498a6` against base `5e91298b44e729f3f3a9aa3567b8c1ec57e88b2d`, werkrevisor 0.31.6. </sub>
ai-reviewer left a comment
Collaborator

werkrevisor: ORANGE / FINDINGS for 7a3b39cba8384fa28a44e51197cb778ce4f498a6.
The result comment of werkrevisor holds the details.

werkrevisor: ORANGE / FINDINGS for `7a3b39cba8384fa28a44e51197cb778ce4f498a6`. The result comment of werkrevisor holds the details. <!-- werkrevisor-review:7a3b39cba8384fa28a44e51197cb778ce4f498a6 -->
@@ -0,0 +12,4 @@
from werkrevisor import report
BLOCKS_PREFIX = "werkrevisor-blocks:"
# 64 bits: a PR author cannot construct a different block with the fingerprint of an approved one.
Collaborator

Fingerprint security claim is wrong, severity unknown, counted as medium (werkrevisor)

ORANGE; Jev: real 0.86, severity 3.0 of 3

The comment on FINGERPRINT_CHARS = 16 asserts that with a 64-bit fingerprint "a PR author cannot construct a different block with the fingerprint of an approved one." 64 bits is not collision-resistant: a birthday attack finds a collision in ~2^32 work, which fits in a fraction of a second on a modern GPU. An attacker who previously had a head approved could construct a malicious block whose fingerprint collides with an approved one and replace the original (or supplement it) in a new head; compare would count it as approved because the legitimate block is gone, so carry.missing stays 0 and carry.new_paths stays empty. In the human-approval carry-over branch with no new blocks, the review would then approve without calling Jev or the model; CI is the only remaining barrier, and it does not catch subtle logic or security regressions. Truncating at 32 hex chars (128 bits) is the standard remedy and would not change the design.

**Fingerprint security claim is wrong**, severity unknown, counted as medium (werkrevisor) ORANGE; Jev: real 0.86, severity 3.0 of 3 The comment on `FINGERPRINT_CHARS = 16` asserts that with a 64-bit fingerprint "a PR author cannot construct a different block with the fingerprint of an approved one." 64 bits is not collision-resistant: a birthday attack finds a collision in ~2^32 work, which fits in a fraction of a second on a modern GPU. An attacker who previously had a head approved could construct a malicious block whose fingerprint collides with an approved one and replace the original (or supplement it) in a new head; `compare` would count it as approved because the legitimate block is gone, so `carry.missing` stays 0 and `carry.new_paths` stays empty. In the human-approval carry-over branch with no new blocks, the review would then approve without calling Jev or the model; CI is the only remaining barrier, and it does not catch subtle logic or security regressions. Truncating at 32 hex chars (128 bits) is the standard remedy and would not change the design.
Author
Collaborator

Fixed: right, the PR author writes the approved block too, so a birthday attack applies. A fingerprint now has 128 bits (32 hex chars of SHA-256), a collision costs about 2^64 hashes; MAX_BLOCKS is 1000 to keep the comment small. The test test_a_fingerprint_has_128_bits fails with 64 bits.

Fixed: right, the PR author writes the approved block too, so a birthday attack applies. A fingerprint now has 128 bits (32 hex chars of SHA-256), a collision costs about 2^64 hashes; MAX_BLOCKS is 1000 to keep the comment small. The test test_a_fingerprint_has_128_bits fails with 64 bits.
claude-code marked this conversation as resolved
ai-reviewer merged commit 12e7417fbd into main 2026-10-10 13:56:16 +02:00
ai-reviewer deleted branch claude-code/approval-carry-over 2026-10-10 13:56:16 +02:00
Sign in to join this conversation.
No Reviewers
No labels
3 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: mi/werkrevisor#73