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)
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 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
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
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
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>
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 -->
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.
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.
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.
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)
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>
ai-review/assessment AI findings; a developer approval after checking them unlocks the merge; a human review request is pending; merge already scheduled
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
change_kind ignores approved files at werkrevisor/rules.py:211-213, severity unknown, counted as medium, ORANGE, as a line comment
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>
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 -->
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.
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.
ai-review/assessment AI findings; a developer approval after checking them unlocks the merge; approved by mi for this head commit; merge already scheduled
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
Fingerprint security claim is wrong at werkrevisor/carryover.py:15-16, severity unknown, counted as medium, ORANGE, as a line comment
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>
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 -->
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.
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.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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
🟡 werkrevisor YELLOW for
31b7919, superseded by the result fore5e8d8b🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind:
mixed.Reasons
Classifier
10 of 12 units passed all questions (1 PR document(s)).
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 main2 answers ignored because of a confidence below [classifier] min_confidence.
5e91298).Reviewed head `31b7919868f266ae14789f1e39f9673746125642` against base `5e91298b44e729f3f3a9aa3567b8c1ec57e88b2d`, werkrevisor 0.31.6.
🟡 werkrevisor YELLOW for
e5e8d8b, superseded by the result foraebb210🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind:
mixed.Reasons
Findings
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 commentPossible Bug at
docs/prs/2026-10-10-PR#73-approval-carry-over.md:81-87, severity unknown, counted as medium, hint, as a line commentClassifier
11 of 12 units passed all questions (1 PR document(s)).
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 main3 answers ignored because of a confidence below [classifier] min_confidence.
5e91298).Reviewed head `e5e8d8be76085cbe0b3697cc4030894ee79d01c6` against base `5e91298b44e729f3f3a9aa3567b8c1ec57e88b2d`, werkrevisor 0.31.6.
werkrevisor: YELLOW / HUMAN_REVIEW for
e5e8d8be76085cbe0b3697cc4030894ee79d01c6.The result comment of werkrevisor holds the details.
@@ -0,0 +78,4 @@#### Scenario#73.05: a dropped approved change is not carried overSo that a check that the PR added cannot disappear unnoticed in a rebase.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.
Fixed: the dropped block is now the action ("When a rebase drops a changed block of A").
@@ -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.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) todocs/werkrevisor.werkbaumand the "Additional Changes" section, which is unrelated to the approval carry-over feature. PerAGENTS.md, the Werkbaum tracks review plans, and "A PR that changes the steps or decisions of a review updates the diagrams indocs/"; adding a PWA initiative here muddles the scope and makes the Werkbaum history of this PR misleading. This plan belongs in its own PR.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.
Update: the node was meant for Werkregie's own Werkbaum; it is removed from this PR.
🟡 werkrevisor YELLOW for
aebb210, superseded by the result forf40619f🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind:
mixed.Reasons
Classifier
11 of 12 units passed all questions (1 PR document(s)).
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 main3 answers ignored because of a confidence below [classifier] min_confidence.
5e91298).Reviewed head `aebb210ac0069b1b053d809c65bb6dec1c3dc0ac` against base `5e91298b44e729f3f3a9aa3567b8c1ec57e88b2d`, werkrevisor 0.31.6.
🟠 werkrevisor ORANGE for
f40619f, superseded by the result for7a3b39c🟠 werkrevisor: ORANGE / FINDINGS
Change kind:
mixed.Reasons
Findings
werkrevisor/rules.py:211-213, severity unknown, counted as medium, ORANGE, as a line commentClassifier
11 of 12 units passed all questions (1 PR document(s)).
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 main4 answers ignored because of a confidence below [classifier] min_confidence.
5e91298).Reviewed head `f40619f8ab9345d66c2b858c0eb165c0c1ae6b7a` against base `5e91298b44e729f3f3a9aa3567b8c1ec57e88b2d`, werkrevisor 0.31.6.
werkrevisor: ORANGE / FINDINGS for
f40619f8ab9345d66c2b858c0eb165c0c1ae6b7a.The result comment of werkrevisor holds the details.
@@ -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}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
approvedset but uses it only in find_test_weakening;reviewed_catsandchange_kindare 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.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.
🟠 werkrevisor: ORANGE / FINDINGS
Change kind:
mixed.Reasons
Findings
werkrevisor/carryover.py:15-16, severity unknown, counted as medium, ORANGE, as a line commentClassifier
11 of 12 units passed all questions (1 PR document(s)).
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 main3 answers ignored because of a confidence below [classifier] min_confidence.
5e91298).Reviewed head `7a3b39cba8384fa28a44e51197cb778ce4f498a6` against base `5e91298b44e729f3f3a9aa3567b8c1ec57e88b2d`, werkrevisor 0.31.6.
werkrevisor: ORANGE / FINDINGS for
7a3b39cba8384fa28a44e51197cb778ce4f498a6.The result comment of werkrevisor holds the details.
@@ -0,0 +12,4 @@from werkrevisor import reportBLOCKS_PREFIX = "werkrevisor-blocks:"# 64 bits: a PR author cannot construct a different block with the fingerprint of an approved one.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 = 16asserts 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;comparewould count it as approved because the legitimate block is gone, socarry.missingstays 0 andcarry.new_pathsstays 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.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.