werkrevisor 0.68.0: the model learns the base branch and which changesets are new #141

Open
claude-code wants to merge 9 commits from claude-code/model-facts into main
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 marked the pull request as ready for review 2026-10-23 20:16:33 +02:00
Collaborator
🟠 werkrevisor ORANGE for a23fd3c, superseded by the result for e385001

🟠 werkrevisor: ORANGE / FINDINGS

Change kind: mixed.

Reasons

  • ORANGE 1 finding(s) that Jev rates as probably real and severe: werkrevisor/dbschema.py:175-190
  • hint writing rules violated in the changed docs: README.md:309: paragraph with 6 sentences, more than 5; README.md:593: paragraph with 7 sentences, more than 5
  • hint 6 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 2 finding(s) of low severity or rated minor by Jev: README.md:595-599, werkrevisor/dbschema.py:196-197
  • hint model recommends changes before merge

Findings

  1. [medium] Release Mislabelling at werkrevisor/dbschema.py:175-190, ORANGE, as a line comment

  2. [low] Contradictory Gate Docs at README.md:595-599

    hint

    The newly added rule says an absent-default changeset is not released, but the following sentence still states that any changed or removed changeset gives YELLOW without Jev. For a stacked PR, a changed non-repeatable changeset absent from the default branch is sent to Jev, while an absent-default removed changeset is omitted from released, so neither necessarily creates that YELLOW. Qualify the sentence to released changed or removed changesets.

  3. [low] Wrong Comparison Basis at werkrevisor/dbschema.py:196-197, hint, as a line comment

Classifier

7 of 7 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 35405, calls 1, tokens in 34097 / out 61859 (reasoning included in out), duration 527.2 s, cost 0.0844 USD (reported), classifier `jev-1.14.0` calls 7, tokens in 6007, cost 0.0003 USD, finding judge `jev-1.14.0` calls 1, tokens in 1889, cost 0.0001 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 26074 / out 384, cost 0.0035 USD (reported), PR document check `jev-1.14.0` calls 9, tokens in 24563, cost 0.0010 USD, build file judge `jev-1.14.0` calls 7, tokens in 7106, cost 0.0003 USD, phases: path_judge 0.5 s, classifier 0.4 s, doc_check 0.5 s, context 6.8 s, model_review 518.5 s, finding_judge 0.2 s, config: defaults + host + repository (.werkrevisor.toml at main bad4782).
Reviewed head `a23fd3cf0b421783e2c7fae9be44f0c9ba0f7234` against base `bad4782b99657b8a662db8b9333722c04619962e`, werkrevisor 0.65.2.

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-architecture.svg

pr-lens-data-flow.svg

<!-- werkrevisor:a23fd3cf0b421783e2c7fae9be44f0c9ba0f7234 --> <!-- werkrevisor-verdict:ORANGE --> <!-- werkrevisor-blocks:4d0e99007bb38ee07bef52c0af8b25f3,30850af94e22fe8b77b78357374cf599,0768737a119a0df665e988d254bb9bbf,1d27fc4208c2fb3c76e5d1c40c37b1be,ceb75b2ec6ebad040d0f37fc1c73b600,3504c87556d69f12b87e36ef34da29eb,5c0c43e13d7a293b5f1f841e2b1a6b5e,a7e157c3e43c168b8a3c7216c04c34da,1049118ba978101504d4bc2fcc4df6d7,01b5b0e5ce271b4872634f8198bbf177,7886141979091e88cad67e119a0cb32e,c1177ea8aa78949a90272aace2a3d32f,b1e98e4509248aaa41498c6e3b2889b5,20690698f525507e9c2e2ebe6d43bd02,5a85072c5c79e1957c819a45290843f5,436519e7d635bbb66a441e005e64a54f,963ab64b950494a43f4c90bdef6419ac,8e9d846cafb6e8c5c241efc1d6f65d03,167455c89500547433801a5705402928,e9169b8f12862cccc73e0a0b9d6e55c5,f9b3ec981a3ca76702803ea750782fc4,0ea33fd49a83d33be8e8a669620c237e,30430364899ed4a786559f6f72cccf66 --> <!-- werkrevisor:diagrams --> <!-- werkrevisor-folded --> <details><summary>🟠 werkrevisor ORANGE for <code>a23fd3c</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/141#issuecomment-7568">the result for <code>e385001</code></a></summary> ## 🟠 werkrevisor: ORANGE / FINDINGS Change kind: `mixed`. ### Reasons - **ORANGE** 1 finding(s) that Jev rates as probably real and severe: werkrevisor/dbschema.py:175-190 - **hint** writing rules violated in the changed docs: README.md:309: paragraph with 6 sentences, more than 5; README.md:593: paragraph with 7 sentences, more than 5 - **hint** 6 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** 2 finding(s) of low severity or rated minor by Jev: README.md:595-599, werkrevisor/dbschema.py:196-197 - **hint** model recommends changes before merge ### Findings 1. **[medium] Release Mislabelling** at `werkrevisor/dbschema.py:175-190`, ORANGE, as a line comment 2. **[low] Contradictory Gate Docs** at `README.md:595-599` hint The newly added rule says an absent-default changeset is not released, but the following sentence still states that any changed or removed changeset gives YELLOW without Jev. For a stacked PR, a changed non-repeatable changeset absent from the default branch is sent to Jev, while an absent-default removed changeset is omitted from `released`, so neither necessarily creates that YELLOW. Qualify the sentence to released changed or removed changesets. 3. **[low] Wrong Comparison Basis** at `werkrevisor/dbschema.py:196-197`, hint, as a line comment ### Classifier 7 of 7 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 35405, calls 1, tokens in 34097 / out 61859 (reasoning included in out), duration 527.2 s, cost 0.0844 USD (reported), classifier `jev-1.14.0` calls 7, tokens in 6007, cost 0.0003 USD, finding judge `jev-1.14.0` calls 1, tokens in 1889, cost 0.0001 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 26074 / out 384, cost 0.0035 USD (reported), PR document check `jev-1.14.0` calls 9, tokens in 24563, cost 0.0010 USD, build file judge `jev-1.14.0` calls 7, tokens in 7106, cost 0.0003 USD, phases: path_judge 0.5 s, classifier 0.4 s, doc_check 0.5 s, context 6.8 s, model_review 518.5 s, finding_judge 0.2 s, config: defaults + host + repository (.werkrevisor.toml at main bad4782).<br> Reviewed head `a23fd3cf0b421783e2c7fae9be44f0c9ba0f7234` against base `bad4782b99657b8a662db8b9333722c04619962e`, werkrevisor 0.65.2. </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-architecture.svg](https://git.javagil.de/attachments/23c75acd-6263-480f-884f-46706380649a) ![pr-lens-data-flow.svg](https://git.javagil.de/attachments/4a939dc8-4778-4313-9bbc-fd63ceca9ed9) </details>
ai-reviewer left a comment
Collaborator

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

werkrevisor: ORANGE / FINDINGS for `a23fd3cf0b421783e2c7fae9be44f0c9ba0f7234`. The result comment of werkrevisor holds the details. <!-- werkrevisor-review:a23fd3cf0b421783e2c7fae9be44f0c9ba0f7234 -->
@@ -308,6 +308,7 @@ The steps have the numbers of the inside diagram.
a large file goes as an excerpt, see [`[excerpt]`](#excerpt).
8. Run the PR-Agent reviewer with all settings forced by werkrevisor, except in classifier mode.
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.
claude-code marked this conversation as resolved
@@ -591,6 +592,9 @@ Optional, host only: only the operator knows whether a repository deploys throug
werkrevisor splits Liquibase formatted SQL at `--changeset` lines
Collaborator

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

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

**Writing rule: paragraph with 7 sentences, more than 5** (werkrevisor writing rule) Fix the line, or reply why it stays, and resolve this comment.
claude-code marked this conversation as resolved
@@ -153,11 +175,28 @@ def collect(files, diffs, fetch_head, fetch_base):
elif previous.text != current.text:
Collaborator

[medium] Release Mislabelling (werkrevisor)

ORANGE; Jev: real 0.90, severity 2.8 of 3

The current.repeatable branch bypasses is_released(cs), so a changed runOnChange or similar changeset that exists on the stacked base but not on the default branch is stored with unreleased=False. model_note then lists it only as repeatable, omitting the promised “not on the default branch yet” fact and leaving the model to guess its release status. Determine release state independently of repeatability and cover this case with a test.

**[medium] Release Mislabelling** (werkrevisor) ORANGE; Jev: real 0.90, severity 2.8 of 3 The `current.repeatable` branch bypasses `is_released(cs)`, so a changed `runOnChange` or similar changeset that exists on the stacked base but not on the default branch is stored with `unreleased=False`. `model_note` then lists it only as repeatable, omitting the promised “not on the default branch yet” fact and leaving the model to guess its release status. Determine release state independently of repeatability and cover this case with a test.
claude-code marked this conversation as resolved
@@ -161,0 +193,4 @@
lines += [f"- released, changed or removed: {r}" for r in run.released]
if not lines:
return ""
return ("werkrevisor compared the Liquibase changesets of this PR with its base branch; "
Collaborator

[low] Wrong Comparison Basis (werkrevisor)

hint

model_note tells the model that changesets were compared with the PR's base branch, but _judge_db_schema supplies merge_base or the base-SHA fallback to collect. If the target branch has commits after that merge base, the note presents merge-base facts as base-branch facts. State “merge base” in the note or compare with the intended base revision.

**[low] Wrong Comparison Basis** (werkrevisor) hint `model_note` tells the model that changesets were compared with the PR's base branch, but `_judge_db_schema` supplies `merge_base` or the base-SHA fallback to `collect`. If the target branch has commits after that merge base, the note presents merge-base facts as base-branch facts. State “merge base” in the note or compare with the intended base revision.
claude-code marked this conversation as resolved
ai-reviewer scheduled this pull request to auto merge when all checks succeed 2026-10-23 20:25:33 +02:00
ai-reviewer requested review from mi 2026-10-23 20:25:33 +02:00
Author
Collaborator

Review round 1, all fixed in e385001:

  • werkrevisor/dbschema.py:175 Release Mislabelling: a changed repeatable changeset that the default branch lacks is now unreleased too; new test test_a_repeatable_change_missing_on_main_is_not_released.
  • werkrevisor/dbschema.py:196 Wrong Comparison Basis: the note now says "the merge base of its base branch".
  • README.md:595-599 Contradictory Gate Docs: the stacked-PR sentences follow the YELLOW rule and say that Jev judges such a change and that its removal gives no YELLOW; new test for the removal.
  • README.md:309 and README.md:593 paragraph length: both paragraphs are split.
Review round 1, all fixed in `e385001`: - `werkrevisor/dbschema.py:175` Release Mislabelling: a changed repeatable changeset that the default branch lacks is now `unreleased` too; new test `test_a_repeatable_change_missing_on_main_is_not_released`. - `werkrevisor/dbschema.py:196` Wrong Comparison Basis: the note now says "the merge base of its base branch". - `README.md:595-599` Contradictory Gate Docs: the stacked-PR sentences follow the YELLOW rule and say that Jev judges such a change and that its removal gives no YELLOW; new test for the removal. - `README.md:309` and `README.md:593` paragraph length: both paragraphs are split.
ai-reviewer left a comment
Collaborator

Codex review of a23fd3cf0b421783e2c7fae9be44f0c9ba0f7234

Codex review of `a23fd3cf0b421783e2c7fae9be44f0c9ba0f7234` <!-- werkrevisor-codex -->
@@ -175,1 +175,3 @@
_judge_db_schema(config, deps, use_llm, result, rules, diffs, fetch, pr_data.get("merge_base") or pr.base_sha)
base_ref = (pr_data.get("base") or {}).get("ref") or pr.base_ref
default_branch = _default_branch(deps.gitea, pr_data)
stacked_on = default_branch if base_ref and default_branch and base_ref != default_branch else ""
Collaborator

[high] Do not treat every non-default target as an unreleased PR branch (Codex review)

The condition also matches maintenance and release branches, without checking whether the target belongs to an unmerged PR. A changeset already deployed from release/1.x but absent from main consequently loses its mandatory db_schema_released_changed warning. An in-memory reproduction changed a non-repeatable changeset and produced only db_schema_judged/GREEN instead of YELLOW. Restrict this exemption to verified unreleased branches; otherwise retain the existing released-changeset protection.

Fix it, or reply why it does not hold, and resolve this comment.

**[high] Do not treat every non-default target as an unreleased PR branch** (Codex review) The condition also matches maintenance and release branches, without checking whether the target belongs to an unmerged PR. A changeset already deployed from release/1.x but absent from main consequently loses its mandatory db_schema_released_changed warning. An in-memory reproduction changed a non-repeatable changeset and produced only db_schema_judged/GREEN instead of YELLOW. Restrict this exemption to verified unreleased branches; otherwise retain the existing released-changeset protection. Fix it, or reply why it does not hold, and resolve this comment. <!-- werkrevisor-codex -->
claude-code marked this conversation as resolved
Collaborator

Codex review: critical

The change relaxes the mandatory human-review gate for changes to existing database migrations and changes instructions that influence model review. Incorrect release-state assumptions could allow unsafe migration changes through without tests detecting the deployment consequences.

Findings

  1. [high] Do not treat every non-default target as an unreleased PR branch at werkrevisor/cli.py:177, 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 431698 (cached 384768) / out 2780, 105.4 s, 13 commands; reviewed head `a23fd3cf0b421783e2c7fae9be44f0c9ba0f7234`.
<!-- werkrevisor-codex:a23fd3cf0b421783e2c7fae9be44f0c9ba0f7234 --> <!-- werkrevisor-codex-critical:true --> <!-- werkrevisor-codex-unattached:0 --> <!-- werkrevisor-codex --> ## Codex review: critical The change relaxes the mandatory human-review gate for changes to existing database migrations and changes instructions that influence model review. Incorrect release-state assumptions could allow unsafe migration changes through without tests detecting the deployment consequences. ### Findings 1. **[high] Do not treat every non-default target as an unreleased PR branch** at `werkrevisor/cli.py:177`, 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 431698 (cached 384768) / out 2780, 105.4 s, 13 commands; reviewed head `a23fd3cf0b421783e2c7fae9be44f0c9ba0f7234`. </sub>
Collaborator
🟠 werkrevisor ORANGE for e385001, superseded by the result for e0c72a6

🟠 werkrevisor: ORANGE / FINDINGS

Change kind: mixed.

Reasons

  • ORANGE 3 finding(s) that Jev rates as probably real and severe: werkrevisor/cli.py:177, werkrevisor/dbschema.py:165-170, werkrevisor/dbschema.py:123-132
  • hint 6 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 model recommends changes before merge
  • hint model rates the risk as high (advisory: Jev judged every changed file)

Findings

  1. [high] Non-default base treated as stacked at werkrevisor/cli.py:177, ORANGE, as a line comment

  2. [medium] Deleted files skip the check at werkrevisor/dbschema.py:165-170, ORANGE, as a line comment

  3. [medium] Missing file means not released at werkrevisor/dbschema.py:123-132, ORANGE, as a line comment

Classifier

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

Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 35380, calls 1, tokens in 34051 / out 37822 (reasoning included in out), duration 513.9 s, cost 0.0556 USD (reported), classifier `jev-1.14.0` calls 7, tokens in 6084, cost 0.0003 USD, finding judge `jev-1.14.0` calls 3, tokens in 5452, cost 0.0002 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 26074 / out 455, cost 0.0005 USD (reported), PR document check `jev-1.14.0` calls 9, tokens in 26136, cost 0.0011 USD, build file judge `jev-1.14.0` calls 7, tokens in 7386, cost 0.0003 USD, phases: path_judge 0.3 s, classifier 0.3 s, doc_check 0.5 s, context 9.5 s, model_review 502.0 s, finding_judge 0.5 s, config: defaults + host + repository (.werkrevisor.toml at main bad4782).
Reviewed head `e3850012eb6d71843c61f65bf6d55f1973fedc9e` against base `bad4782b99657b8a662db8b9333722c04619962e`, werkrevisor 0.65.2.

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-containers.svg

pr-lens-model-facts-flow-view.svg

<!-- werkrevisor:e3850012eb6d71843c61f65bf6d55f1973fedc9e --> <!-- werkrevisor-verdict:ORANGE --> <!-- werkrevisor-blocks:f42dfa0d6984b84fa529197d454505a9,6fedba1400419b514f332c5b1a4f753a,de69a50be96268609fe992e444ede916,1d27fc4208c2fb3c76e5d1c40c37b1be,ceb75b2ec6ebad040d0f37fc1c73b600,3504c87556d69f12b87e36ef34da29eb,5c0c43e13d7a293b5f1f841e2b1a6b5e,3e1def864335e978388ecf0447e46fac,1049118ba978101504d4bc2fcc4df6d7,01b5b0e5ce271b4872634f8198bbf177,7886141979091e88cad67e119a0cb32e,c1177ea8aa78949a90272aace2a3d32f,b1e98e4509248aaa41498c6e3b2889b5,20690698f525507e9c2e2ebe6d43bd02,5a85072c5c79e1957c819a45290843f5,436519e7d635bbb66a441e005e64a54f,963ab64b950494a43f4c90bdef6419ac,8e9d846cafb6e8c5c241efc1d6f65d03,167455c89500547433801a5705402928,e9169b8f12862cccc73e0a0b9d6e55c5,6a512c49ea2f9360a4050ce6e4b56ba5,755c20f370dfa15e9da41a174d0d85ee,30430364899ed4a786559f6f72cccf66 --> <!-- werkrevisor:diagrams --> <!-- werkrevisor-folded --> <details><summary>🟠 werkrevisor ORANGE for <code>e385001</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/141#issuecomment-7586">the result for <code>e0c72a6</code></a></summary> ## 🟠 werkrevisor: ORANGE / FINDINGS Change kind: `mixed`. ### Reasons - **ORANGE** 3 finding(s) that Jev rates as probably real and severe: werkrevisor/cli.py:177, werkrevisor/dbschema.py:165-170, werkrevisor/dbschema.py:123-132 - **hint** 6 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** model recommends changes before merge - **hint** model rates the risk as high (advisory: Jev judged every changed file) ### Findings 1. **[high] Non-default base treated as stacked** at `werkrevisor/cli.py:177`, ORANGE, as a line comment 2. **[medium] Deleted files skip the check** at `werkrevisor/dbschema.py:165-170`, ORANGE, as a line comment 3. **[medium] Missing file means not released** at `werkrevisor/dbschema.py:123-132`, ORANGE, as a line comment ### Classifier 7 of 7 units passed all questions (1 PR document(s)). 2 answers ignored because of a confidence below [classifier] min_confidence. <sub> Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 35380, calls 1, tokens in 34051 / out 37822 (reasoning included in out), duration 513.9 s, cost 0.0556 USD (reported), classifier `jev-1.14.0` calls 7, tokens in 6084, cost 0.0003 USD, finding judge `jev-1.14.0` calls 3, tokens in 5452, cost 0.0002 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 26074 / out 455, cost 0.0005 USD (reported), PR document check `jev-1.14.0` calls 9, tokens in 26136, cost 0.0011 USD, build file judge `jev-1.14.0` calls 7, tokens in 7386, cost 0.0003 USD, phases: path_judge 0.3 s, classifier 0.3 s, doc_check 0.5 s, context 9.5 s, model_review 502.0 s, finding_judge 0.5 s, config: defaults + host + repository (.werkrevisor.toml at main bad4782).<br> Reviewed head `e3850012eb6d71843c61f65bf6d55f1973fedc9e` against base `bad4782b99657b8a662db8b9333722c04619962e`, werkrevisor 0.65.2. </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-containers.svg](https://git.javagil.de/attachments/9c6701b6-d665-4c40-95ae-4821fb9fb679) ![pr-lens-model-facts-flow-view.svg](https://git.javagil.de/attachments/7e97641a-6004-475f-aaef-b4802db5d1e8) </details>
ai-reviewer left a comment
Collaborator

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

werkrevisor: ORANGE / FINDINGS for `e3850012eb6d71843c61f65bf6d55f1973fedc9e`. The result comment of werkrevisor holds the details. <!-- werkrevisor-review:e3850012eb6d71843c61f65bf6d55f1973fedc9e -->
@@ -175,1 +175,3 @@
_judge_db_schema(config, deps, use_llm, result, rules, diffs, fetch, pr_data.get("merge_base") or pr.base_sha)
base_ref = (pr_data.get("base") or {}).get("ref") or pr.base_ref
default_branch = _default_branch(deps.gitea, pr_data)
stacked_on = default_branch if base_ref and default_branch and base_ref != default_branch else ""
Collaborator

[high] Non-default base treated as stacked (werkrevisor)

ORANGE; Jev: real 0.81, severity 3.0 of 3

stacked_on is set to the default branch for every PR whose base ref differs from the repository default, so the new release test looks only at the default branch. A PR that targets a release or maintenance branch (not the branch of another open PR) and changes a non-repeatable changeset already deployed from that branch now gets is_released == False: the change goes to Jev instead of raising the db_schema_released_changed YELLOW, and the model is told the changeset is "not on the default branch yet". The gate can then approve a change to an already released migration. The PR document limits this to "a PR on another PR's branch", but the code cannot distinguish that from a long-lived base branch; restrict the default-branch comparison to stacked PR branches or keep the released classification otherwise.

**[high] Non-default base treated as stacked** (werkrevisor) ORANGE; Jev: real 0.81, severity 3.0 of 3 `stacked_on` is set to the default branch for every PR whose base ref differs from the repository default, so the new release test looks only at the default branch. A PR that targets a release or maintenance branch (not the branch of another open PR) and changes a non-repeatable changeset already deployed from that branch now gets `is_released == False`: the change goes to Jev instead of raising the `db_schema_released_changed` YELLOW, and the model is told the changeset is "not on the default branch yet". The gate can then approve a change to an already released migration. The PR document limits this to "a PR on another PR's branch", but the code cannot distinguish that from a long-lived base branch; restrict the default-branch comparison to stacked PR branches or keep the released classification otherwise.
claude-code marked this conversation as resolved
@@ -120,3 +122,2 @@
def collect(files, diffs, fetch_head, fetch_base):
"""Returns (units, released changes, unjudgeable files); fetch_base returns None for a file missing at the base."""
def _on_default(fetch_default, path):
Collaborator

[medium] Missing file means not released (werkrevisor)

ORANGE; Jev: real 0.64, severity 2.8 of 3

_on_default turns a 404 on the default branch into an empty set, which asserts that none of the base changesets is released, while every other read failure falls back to the safe "assume released". Whenever the file is not found under the queried path on the default branch, for example because the schema file was renamed on the base branch and only a rename made by this PR supplies previous_path, all changed changesets of that file are downgraded to "not on the default branch yet" and the YELLOW for changed released changesets is lost. Distinguish "the file is absent on the default branch" from "the file was not found under this path" and keep the safe side in the latter case.

**[medium] Missing file means not released** (werkrevisor) ORANGE; Jev: real 0.64, severity 2.8 of 3 `_on_default` turns a 404 on the default branch into an empty set, which asserts that none of the base changesets is released, while every other read failure falls back to the safe "assume released". Whenever the file is not found under the queried path on the default branch, for example because the schema file was renamed on the base branch and only a rename made by this PR supplies `previous_path`, all changed changesets of that file are downgraded to "not on the default branch yet" and the YELLOW for changed released changesets is lost. Distinguish "the file is absent on the default branch" from "the file was not found under this path" and keep the safe side in the latter case.
claude-code marked this conversation as resolved
@@ -146,3 +163,3 @@
units.append(Unit(f.path, "", f.added, _diff_text(diffs.get(f.path))))
continue
released += [f"{f.path}: changeset {cs} removed" for cs in base_sets if cs not in head_sets]
on_default = _on_default(fetch_default, f.previous_path or f.path)
Collaborator

[medium] Deleted files skip the check (werkrevisor)

ORANGE; Jev: real 0.86, severity 2.9 of 3

Deleted schema files bypass the new default-branch check: collect puts " deleted" into released and returns before it consults the default branch. A stacked PR that deletes a schema file which exists only on its base branch, and was therefore never deployed, still raises the YELLOW "released DB changes: deleted". This contradicts the rule the PR adds for removed changesets and blocks the merge on a change that cannot affect any released database. The deleted-file case has to consult the default branch as well.

**[medium] Deleted files skip the check** (werkrevisor) ORANGE; Jev: real 0.86, severity 2.9 of 3 Deleted schema files bypass the new default-branch check: `collect` puts "<path> deleted" into `released` and returns before it consults the default branch. A stacked PR that deletes a schema file which exists only on its base branch, and was therefore never deployed, still raises the YELLOW "released DB changes: <path> deleted". This contradicts the rule the PR adds for removed changesets and blocks the merge on a change that cannot affect any released database. The deleted-file case has to consult the default branch as well.
claude-code marked this conversation as resolved
ai-reviewer left a comment
Collaborator

Codex review of e3850012eb6d71843c61f65bf6d55f1973fedc9e

Codex review of `e3850012eb6d71843c61f65bf6d55f1973fedc9e` <!-- werkrevisor-codex -->
@@ -146,3 +163,3 @@
units.append(Unit(f.path, "", f.added, _diff_text(diffs.get(f.path))))
continue
released += [f"{f.path}: changeset {cs} removed" for cs in base_sets if cs not in head_sets]
on_default = _on_default(fetch_default, f.previous_path or f.path)
Collaborator

[high] A changelog renamed by the parent branch loses released protection (Codex review)

If the parent branch renames an existing released changelog, a child PR modifying it has no previous_path: the rename predates its merge base. This lookup therefore requests the new path on the default branch, receives 404, and treats every changeset as unreleased even though they exist there under the original path. Reproducing this returns unreleased=True and no released-change reason. Consequently, editing a non-repeatable deployed changeset can pass with a low-risk Jev answer instead of requiring human review. Missing the current path must not establish that its changesets were never released.

Fix it, or reply why it does not hold, and resolve this comment.

**[high] A changelog renamed by the parent branch loses released protection** (Codex review) If the parent branch renames an existing released changelog, a child PR modifying it has no previous_path: the rename predates its merge base. This lookup therefore requests the new path on the default branch, receives 404, and treats every changeset as unreleased even though they exist there under the original path. Reproducing this returns unreleased=True and no released-change reason. Consequently, editing a non-repeatable deployed changeset can pass with a low-risk Jev answer instead of requiring human review. Missing the current path must not establish that its changesets were never released. Fix it, or reply why it does not hold, and resolve this comment. <!-- werkrevisor-codex -->
claude-code marked this conversation as resolved
Collaborator

Codex review: critical

This change relaxes the merge gate for database migration edits and changes the instructions used by the review model. Incorrect release classification can bypass mandatory human review of changes to deployed migrations.

Findings

  1. [high] A changelog renamed by the parent branch loses released protection at werkrevisor/dbschema.py:165, 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 438746 (cached 380288) / out 2785, 97.7 s, 15 commands; reviewed head `e3850012eb6d71843c61f65bf6d55f1973fedc9e`.
<!-- werkrevisor-codex:e3850012eb6d71843c61f65bf6d55f1973fedc9e --> <!-- werkrevisor-codex-critical:true --> <!-- werkrevisor-codex-unattached:0 --> <!-- werkrevisor-codex --> ## Codex review: critical This change relaxes the merge gate for database migration edits and changes the instructions used by the review model. Incorrect release classification can bypass mandatory human review of changes to deployed migrations. ### Findings 1. **[high] A changelog renamed by the parent branch loses released protection** at `werkrevisor/dbschema.py:165`, 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 438746 (cached 380288) / out 2785, 97.7 s, 15 commands; reviewed head `e3850012eb6d71843c61f65bf6d55f1973fedc9e`. </sub>
Author
Collaborator

Review round 2 (werkrevisor and Codex), all fixed in e0c72a6:

  • werkrevisor/cli.py:177 Non-default base treated as stacked (werkrevisor) and "Do not treat every non-default target as an unreleased PR branch" (Codex): _stack now counts a base branch as stacked only if it is the head branch of an open PR of the repository, and follows the chain to its target. A release or maintenance branch gives no stack, so its changed released changeset gives YELLOW again. Red/green: test_a_release_branch_keeps_its_released_changesets failed on e385001 and passes now.
  • werkrevisor/dbschema.py:165 Deleted files skip the check: a deleted file that is absent on the target and added by a PR of the stack is not released; test test_a_deleted_file_missing_on_main_is_not_released.
  • werkrevisor/dbschema.py:123 Missing file means not released: a 404 on the target counts as absent only if a PR of the stack adds the path; otherwise the safe side holds. Red/green: test_a_file_missing_on_main_needs_an_adding_pr failed on e385001 for that case.
Review round 2 (werkrevisor and Codex), all fixed in `e0c72a6`: - `werkrevisor/cli.py:177` Non-default base treated as stacked (werkrevisor) and "Do not treat every non-default target as an unreleased PR branch" (Codex): `_stack` now counts a base branch as stacked only if it is the head branch of an open PR of the repository, and follows the chain to its target. A release or maintenance branch gives no stack, so its changed released changeset gives YELLOW again. Red/green: `test_a_release_branch_keeps_its_released_changesets` failed on `e385001` and passes now. - `werkrevisor/dbschema.py:165` Deleted files skip the check: a deleted file that is absent on the target and added by a PR of the stack is not released; test `test_a_deleted_file_missing_on_main_is_not_released`. - `werkrevisor/dbschema.py:123` Missing file means not released: a 404 on the target counts as absent only if a PR of the stack adds the path; otherwise the safe side holds. Red/green: `test_a_file_missing_on_main_needs_an_adding_pr` failed on `e385001` for that case.
Collaborator
🟠 werkrevisor ORANGE for e0c72a6, superseded by the result for 0720ccc

🟠 werkrevisor: ORANGE / FINDINGS

Change kind: mixed.

Reasons

  • ORANGE 1 finding(s) that Jev rates as probably real and severe: werkrevisor/cli.py:419-423
  • hint 6 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: werkrevisor/dbschema.py:199-201
  • hint model recommends changes before merge

Findings

  1. [medium] Ambiguous Target at werkrevisor/cli.py:419-423, ORANGE, as a line comment

  2. [low] Misclassified Error at werkrevisor/dbschema.py:199-201, hint, as a line comment

Classifier

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

Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 38870, calls 1, tokens in 37432 / out 42515 (reasoning included in out), duration 644.5 s, cost 0.0622 USD (reported), classifier `jev-1.14.0` calls 7, tokens in 6396, cost 0.0003 USD, finding judge `jev-1.14.0` calls 1, tokens in 1577, cost 0.0001 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 26855 / out 545, cost 0.0036 USD (reported), PR document check `jev-1.14.0` calls 9, tokens in 30952, cost 0.0013 USD, build file judge `jev-1.14.0` calls 7, tokens in 8596, cost 0.0004 USD, phases: path_judge 0.4 s, classifier 0.4 s, doc_check 0.5 s, context 8.9 s, model_review 633.5 s, finding_judge 0.2 s, config: defaults + host + repository (.werkrevisor.toml at main bad4782).
Reviewed head `e0c72a634573922a5b13a3f7d3abafe7cd7bd28a` against base `bad4782b99657b8a662db8b9333722c04619962e`, werkrevisor 0.65.2.

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-arch-containers.svg

pr-lens-flow-view.svg

<!-- werkrevisor:e0c72a634573922a5b13a3f7d3abafe7cd7bd28a --> <!-- werkrevisor-verdict:ORANGE --> <!-- werkrevisor-blocks:035419384f7342eb38d438b0991981f3,f700957d61e54f16b384c72aa0f3e914,b8c5ac000f15ad4a55e75923bf42bbc1,1d27fc4208c2fb3c76e5d1c40c37b1be,ceb75b2ec6ebad040d0f37fc1c73b600,da926178f10e294c1ec1d95e45bc265a,5c0c43e13d7a293b5f1f841e2b1a6b5e,5bea467942dadd34ca6230d37efc531e,423936b4962021a64ba4edb873f2b282,1049118ba978101504d4bc2fcc4df6d7,01b5b0e5ce271b4872634f8198bbf177,4d33247e0fd7807265db41b178b9b579,f75b48c551d8335bfb3c096aad41478f,cc22e8f72670bb4411779c5bbec04dfa,a4b73ae39c60c310111c946d21db1233,bf398b2529a4da42641a2510ea5feac0,8fd52333ad49ea650ea9bdbe1fd44664,436519e7d635bbb66a441e005e64a54f,963ab64b950494a43f4c90bdef6419ac,e316ccd8f727864d897338c1774a6ea3,04837dca7e9615c30114f8211ddbfde7,73a82853df8055e0c1485def1037db32,d33e470fcefdc6dfaad9951006b2ecf7,6a512c49ea2f9360a4050ce6e4b56ba5,321ba90ee412ac76a7ef031ed59b86a6,60bbf9d877930eddefa1ee3189266a70 --> <!-- werkrevisor:diagrams --> <!-- werkrevisor-folded --> <details><summary>🟠 werkrevisor ORANGE for <code>e0c72a6</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/141#issuecomment-7601">the result for <code>0720ccc</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:419-423 - **hint** 6 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: werkrevisor/dbschema.py:199-201 - **hint** model recommends changes before merge ### Findings 1. **[medium] Ambiguous Target** at `werkrevisor/cli.py:419-423`, ORANGE, as a line comment 2. **[low] Misclassified Error** at `werkrevisor/dbschema.py:199-201`, hint, as a line comment ### Classifier 7 of 7 units passed all questions (1 PR document(s)). 5 answers ignored because of a confidence below [classifier] min_confidence. <sub> Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 38870, calls 1, tokens in 37432 / out 42515 (reasoning included in out), duration 644.5 s, cost 0.0622 USD (reported), classifier `jev-1.14.0` calls 7, tokens in 6396, cost 0.0003 USD, finding judge `jev-1.14.0` calls 1, tokens in 1577, cost 0.0001 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 26855 / out 545, cost 0.0036 USD (reported), PR document check `jev-1.14.0` calls 9, tokens in 30952, cost 0.0013 USD, build file judge `jev-1.14.0` calls 7, tokens in 8596, cost 0.0004 USD, phases: path_judge 0.4 s, classifier 0.4 s, doc_check 0.5 s, context 8.9 s, model_review 633.5 s, finding_judge 0.2 s, config: defaults + host + repository (.werkrevisor.toml at main bad4782).<br> Reviewed head `e0c72a634573922a5b13a3f7d3abafe7cd7bd28a` against base `bad4782b99657b8a662db8b9333722c04619962e`, werkrevisor 0.65.2. </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-arch-containers.svg](https://git.javagil.de/attachments/017dbd27-ec18-41e8-a029-8f42e7556548) ![pr-lens-flow-view.svg](https://git.javagil.de/attachments/4ebec849-362d-42c0-b048-8e7044edd7a6) </details>
ai-reviewer left a comment
Collaborator

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

werkrevisor: ORANGE / FINDINGS for `e0c72a634573922a5b13a3f7d3abafe7cd7bd28a`. The result comment of werkrevisor holds the details. <!-- werkrevisor-review:e0c72a634573922a5b13a3f7d3abafe7cd7bd28a -->
@@ -404,0 +416,4 @@
"""
try:
by_head = {}
for p in gitea.list_open_prs() or ():
Collaborator

[medium] Ambiguous Target (werkrevisor)

ORANGE; Jev: real 0.80, severity 2.9 of 3

_stack retains only one PR for each head branch through setdefault. If the same branch has open PRs with different target branches, the selected PR depends on API order. The model note and schema comparison can then name the wrong target and treat a changeset released on one possible target as unreleased on the other. Detect duplicate head branches and avoid selecting a stack, or model every possible target.

**[medium] Ambiguous Target** (werkrevisor) ORANGE; Jev: real 0.80, severity 2.9 of 3 `_stack` retains only one PR for each head branch through `setdefault`. If the same branch has open PRs with different target branches, the selected PR depends on API order. The model note and schema comparison can then name the wrong target and treat a changeset released on one possible target as unreleased on the other. Detect duplicate head branches and avoid selecting a stack, or model every possible target.
claude-code marked this conversation as resolved
@@ -161,0 +196,4 @@
("changed, repeatable (runOnChange, runAlways or validCheckSum ANY)",
[u for u in run.units if u.changeset and not u.new and not u.unreleased]),
(f"changed, not on `{target}` yet", [u for u in run.units if u.unreleased]))
lines = [f"- {label}: {', '.join(f'`{u.changeset}` in `{u.path}`' for u in units)}"
Collaborator

[low] Misclassified Error (werkrevisor)

hint

The new model note assumes every entry in run.released represents a released change, but collect also stores DuplicateChangeset errors there. A Liquibase file with duplicate changeset IDs therefore produces a note such as released, changed or removed: ... duplicate changeset id ..., giving the model a false release fact instead of a schema error. Keep parse errors separate from released changes or exclude them from model_note.

**[low] Misclassified Error** (werkrevisor) hint The new model note assumes every entry in `run.released` represents a released change, but `collect` also stores `DuplicateChangeset` errors there. A Liquibase file with duplicate changeset IDs therefore produces a note such as `released, changed or removed: ... duplicate changeset id ...`, giving the model a false release fact instead of a schema error. Keep parse errors separate from released changes or exclude them from `model_note`.
claude-code marked this conversation as resolved
Author
Collaborator

Review round 3:

  • werkrevisor/dbschema.py:165 changelog renamed by the parent branch (Codex, on e385001): fixed in e0c72a6 already. A 404 on the target counts as absence only if a PR of the stack lists the path as added; a rename there raises, and every changeset stays released. test_a_file_renamed_by_the_stack_stays_released (added in 0720ccc) passes on e0c72a6 too.
  • werkrevisor/cli.py:419 Ambiguous Target: fixed in 0720ccc; a branch that is the head of two open PRs with different targets gives no stack. Red/green: test_a_branch_with_two_targets_gives_no_stack failed on e0c72a6.
  • werkrevisor/dbschema.py:199 Misclassified Error: fixed in 0720ccc; duplicate ids stand in the note as "unreadable". Red/green: test_duplicate_ids_are_no_released_change_for_the_model failed on e0c72a6.
Review round 3: - `werkrevisor/dbschema.py:165` changelog renamed by the parent branch (Codex, on `e385001`): fixed in `e0c72a6` already. A 404 on the target counts as absence only if a PR of the stack lists the path as `added`; a rename there raises, and every changeset stays released. `test_a_file_renamed_by_the_stack_stays_released` (added in `0720ccc`) passes on `e0c72a6` too. - `werkrevisor/cli.py:419` Ambiguous Target: fixed in `0720ccc`; a branch that is the head of two open PRs with different targets gives no stack. Red/green: `test_a_branch_with_two_targets_gives_no_stack` failed on `e0c72a6`. - `werkrevisor/dbschema.py:199` Misclassified Error: fixed in `0720ccc`; duplicate ids stand in the note as "unreadable". Red/green: `test_duplicate_ids_are_no_released_change_for_the_model` failed on `e0c72a6`.
ai-reviewer left a comment
Collaborator

Codex review of e0c72a634573922a5b13a3f7d3abafe7cd7bd28a

Codex review of `e0c72a634573922a5b13a3f7d3abafe7cd7bd28a` <!-- werkrevisor-codex -->
@@ -404,0 +419,4 @@
for p in gitea.list_open_prs() or ():
head, base = p.get("head") or {}, p.get("base") or {}
if ((head.get("repo") or {}).get("id") or 0) == ((base.get("repo") or {}).get("id") or -1):
ref = head.get("ref") or ""
Collaborator

[high] Open forward-port PRs incorrectly make release branches unreleased (Codex review)

A release branch can itself have an open PR targeting main. _stack then treats reviews targeting that release branch as a stack whose released changesets exist only on main. A changeset already deployed from the release branch but absent on main loses its mandatory db_schema_released_changed warning. An in-memory reproduction confirmed that removing such a changeset produces no schema reasons while the forward-port PR is open, but produces the required warning when it is closed. An open PR alone is insufficient evidence that its head branch is unreleased.

Fix it, or reply why it does not hold, and resolve this comment.

**[high] Open forward-port PRs incorrectly make release branches unreleased** (Codex review) A release branch can itself have an open PR targeting main. `_stack` then treats reviews targeting that release branch as a stack whose released changesets exist only on main. A changeset already deployed from the release branch but absent on main loses its mandatory `db_schema_released_changed` warning. An in-memory reproduction confirmed that removing such a changeset produces no schema reasons while the forward-port PR is open, but produces the required warning when it is closed. An open PR alone is insufficient evidence that its head branch is unreleased. Fix it, or reply why it does not hold, and resolve this comment. <!-- werkrevisor-codex -->
claude-code marked this conversation as resolved
Collaborator

Codex review: critical

This changes the merge gate by exempting some database migration edits and removals from mandatory human review. Incorrect release classification can let unsafe migration changes merge automatically.

Findings

  1. [high] Open forward-port PRs incorrectly make release branches unreleased at werkrevisor/cli.py:422, 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 481729 (cached 436352) / out 2539, 93.8 s, 12 commands; reviewed head `e0c72a634573922a5b13a3f7d3abafe7cd7bd28a`.
<!-- werkrevisor-codex:e0c72a634573922a5b13a3f7d3abafe7cd7bd28a --> <!-- werkrevisor-codex-critical:true --> <!-- werkrevisor-codex-unattached:0 --> <!-- werkrevisor-codex --> ## Codex review: critical This changes the merge gate by exempting some database migration edits and removals from mandatory human review. Incorrect release classification can let unsafe migration changes merge automatically. ### Findings 1. **[high] Open forward-port PRs incorrectly make release branches unreleased** at `werkrevisor/cli.py:422`, 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 481729 (cached 436352) / out 2539, 93.8 s, 12 commands; reviewed head `e0c72a634573922a5b13a3f7d3abafe7cd7bd28a`. </sub>
Collaborator
🟢 werkrevisor GREEN for 0720ccc, superseded by the result for ed0a05c

🟢 werkrevisor: GREEN / PASS

Change kind: mixed.

Reasons

  • hint 6 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

Classifier

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

Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 40063, calls 1, tokens in 38593 / out 53848 (reasoning included in out), duration 480.8 s, cost 0.0762 USD (reported), classifier `jev-1.14.0` calls 7, tokens in 6508, cost 0.0003 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 27029 / out 351, cost 0.0036 USD (reported), PR document check `jev-1.14.0` calls 9, tokens in 33299, cost 0.0014 USD, build file judge `jev-1.14.0` calls 7, tokens in 9071, cost 0.0004 USD, phases: path_judge 0.4 s, classifier 0.4 s, doc_check 0.5 s, context 5.4 s, model_review 473.4 s, config: defaults + host + repository (.werkrevisor.toml at main bad4782).
Reviewed head `0720ccc1d7525e83758974068ae9975926cbed3f` against base `bad4782b99657b8a662db8b9333722c04619962e`, werkrevisor 0.65.2.
<!-- werkrevisor:0720ccc1d7525e83758974068ae9975926cbed3f --> <!-- werkrevisor-verdict:GREEN --> <!-- werkrevisor-blocks:035419384f7342eb38d438b0991981f3,f700957d61e54f16b384c72aa0f3e914,26cb7bf2ed93df3f23a73bf2c74e4a86,1d27fc4208c2fb3c76e5d1c40c37b1be,ceb75b2ec6ebad040d0f37fc1c73b600,da926178f10e294c1ec1d95e45bc265a,5c0c43e13d7a293b5f1f841e2b1a6b5e,5bea467942dadd34ca6230d37efc531e,ee3e1e99d3dd64aed45718001c638246,1049118ba978101504d4bc2fcc4df6d7,01b5b0e5ce271b4872634f8198bbf177,4d33247e0fd7807265db41b178b9b579,f75b48c551d8335bfb3c096aad41478f,cc22e8f72670bb4411779c5bbec04dfa,c762fed837ecf2c83b14bc90ee9625d6,f89661da5b87b0bae7971d1c9d94f6a8,8fd52333ad49ea650ea9bdbe1fd44664,436519e7d635bbb66a441e005e64a54f,963ab64b950494a43f4c90bdef6419ac,e316ccd8f727864d897338c1774a6ea3,04837dca7e9615c30114f8211ddbfde7,73a82853df8055e0c1485def1037db32,d33e470fcefdc6dfaad9951006b2ecf7,6a512c49ea2f9360a4050ce6e4b56ba5,4af3acf88814380afac36a59a71fbeac,60bbf9d877930eddefa1ee3189266a70 --> <!-- werkrevisor-folded --> <details><summary>🟢 werkrevisor GREEN for <code>0720ccc</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/141#issuecomment-7616">the result for <code>ed0a05c</code></a></summary> ## 🟢 werkrevisor: GREEN / PASS Change kind: `mixed`. ### Reasons - **hint** 6 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 ### Classifier 7 of 7 units passed all questions (1 PR document(s)). 5 answers ignored because of a confidence below [classifier] min_confidence. <sub> Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 40063, calls 1, tokens in 38593 / out 53848 (reasoning included in out), duration 480.8 s, cost 0.0762 USD (reported), classifier `jev-1.14.0` calls 7, tokens in 6508, cost 0.0003 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 27029 / out 351, cost 0.0036 USD (reported), PR document check `jev-1.14.0` calls 9, tokens in 33299, cost 0.0014 USD, build file judge `jev-1.14.0` calls 7, tokens in 9071, cost 0.0004 USD, phases: path_judge 0.4 s, classifier 0.4 s, doc_check 0.5 s, context 5.4 s, model_review 473.4 s, config: defaults + host + repository (.werkrevisor.toml at main bad4782).<br> Reviewed head `0720ccc1d7525e83758974068ae9975926cbed3f` against base `bad4782b99657b8a662db8b9333722c04619962e`, werkrevisor 0.65.2. </sub> </details>
ai-reviewer approved these changes 2026-10-23 21:16:04 +02:00
Dismissed
ai-reviewer left a comment
Collaborator

werkrevisor: GREEN / PASS for 0720ccc1d7525e83758974068ae9975926cbed3f.
The result comment of werkrevisor holds the details.

werkrevisor: GREEN / PASS for `0720ccc1d7525e83758974068ae9975926cbed3f`. The result comment of werkrevisor holds the details. <!-- werkrevisor-review:0720ccc1d7525e83758974068ae9975926cbed3f -->
ai-reviewer removed review request for mi 2026-10-23 21:16:05 +02:00
ai-reviewer left a comment
Collaborator

Codex review of 0720ccc1d7525e83758974068ae9975926cbed3f

Codex review of `0720ccc1d7525e83758974068ae9975926cbed3f` <!-- werkrevisor-codex -->
@@ -404,0 +424,4 @@
ambiguous.add(ref)
by_head.setdefault(ref, p)
numbers, added, ref = [], set(), base_ref
while ref in by_head and len(numbers) < MAX_STACK:
Collaborator

[high] An outgoing PR can make released migrations bypass human review (Codex review)

_stack treats any branch with an outgoing open PR as an unreleased feature branch, including main and release branches. If main has an open PR into an older branch lacking a deployed changeset, modifying that changeset is classified as unreleased and loses db_schema_released_changed. I reproduced the same modification changing from YELLOW to GREEN solely by adding that outgoing PR; release/1.x behaves identically. An outgoing PR does not establish that its source branch has never been released.

Fix it, or reply why it does not hold, and resolve this comment.

**[high] An outgoing PR can make released migrations bypass human review** (Codex review) _stack treats any branch with an outgoing open PR as an unreleased feature branch, including main and release branches. If main has an open PR into an older branch lacking a deployed changeset, modifying that changeset is classified as unreleased and loses db_schema_released_changed. I reproduced the same modification changing from YELLOW to GREEN solely by adding that outgoing PR; release/1.x behaves identically. An outgoing PR does not establish that its source branch has never been released. Fix it, or reply why it does not hold, and resolve this comment. <!-- werkrevisor-codex -->
claude-code marked this conversation as resolved
Collaborator

Codex review: critical

The change relaxes the merge gate for database migrations by removing mandatory human review when changesets are classified as unreleased. Incorrect classification can allow changes to deployed migrations to merge automatically.

Findings

  1. [high] An outgoing PR can make released migrations bypass human review at werkrevisor/cli.py:427, 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 489037 (cached 428416) / out 2374, 82.0 s, 12 commands; reviewed head `0720ccc1d7525e83758974068ae9975926cbed3f`.
<!-- werkrevisor-codex:0720ccc1d7525e83758974068ae9975926cbed3f --> <!-- werkrevisor-codex-critical:true --> <!-- werkrevisor-codex-unattached:0 --> <!-- werkrevisor-codex --> ## Codex review: critical The change relaxes the merge gate for database migrations by removing mandatory human review when changesets are classified as unreleased. Incorrect classification can allow changes to deployed migrations to merge automatically. ### Findings 1. **[high] An outgoing PR can make released migrations bypass human review** at `werkrevisor/cli.py:427`, 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 489037 (cached 428416) / out 2374, 82.0 s, 12 commands; reviewed head `0720ccc1d7525e83758974068ae9975926cbed3f`. </sub>
Author
Collaborator

Review round 4 (Codex), fixed in ed0a05c, rebased onto main with PR#139:

  • werkrevisor/cli.py:422 forward-port PRs: a protected base branch, e.g. a release branch with an open forward port to main, gives no stack, so its released changesets keep their YELLOW. Red/green: test_a_protected_branch_with_an_open_pr_gives_no_stack failed before and passes now. An unprotected release branch with an open PR stays a gap; the PR document names it.
Review round 4 (Codex), fixed in `ed0a05c`, rebased onto `main` with PR#139: - `werkrevisor/cli.py:422` forward-port PRs: a protected base branch, e.g. a release branch with an open forward port to `main`, gives no stack, so its released changesets keep their YELLOW. Red/green: `test_a_protected_branch_with_an_open_pr_gives_no_stack` failed before and passes now. An unprotected release branch with an open PR stays a gap; the PR document names it.
claude-code added 8 commits 2026-10-23 21:19:05 +02:00
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A PR on another PR's branch gets a note that Gitea enforces the merge order.
The instructions list the new and changed Liquibase changesets, also without Jev.
A changed changeset that the default branch does not have yet is no released one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The note names the merge base; the README sentences on the stacked PR follow the rule they qualify.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A release branch kept its released changesets only by chance before; now its changes give YELLOW again.
A deleted file absent on the target is not released, and a 404 on the target
counts as absent only if a PR of the stack adds the file.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review round 4: a protected branch with an open PR gives no stack
werkator build succeeded after 00:28
werkator/werkrevisor-statistics build succeeded after 00:33
ai-review/assessment AI review passed; approved by werkrevisor; merge already scheduled
ai-review/gate build succeeded after 08:23
ai-review/codex author ✍️: resolve 1 open Codex finding(s)
ed0a05c7d8
A release branch with an open forward port may have deployed changesets that main lacks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude-code force-pushed claude-code/model-facts from 0720ccc1d7 to ed0a05c7d8 2026-10-23 21:19:05 +02:00 Compare
claude-code dismissed ai-reviewer's review 2026-10-23 21:19:05 +02:00
Reason:

New commits pushed, approval review dismissed automatically according to repository settings

Collaborator
🟢 werkrevisor GREEN for ed0a05c, superseded by the result for 6f047e1

🟢 werkrevisor: GREEN / PASS

Change kind: mixed.

Reasons

  • hint approval of werkrevisor for 0720ccc not carried over: 7 approved block(s) are missing
  • hint 6 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 merge with caution

Classifier

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

Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 40660, calls 1, tokens in 39163 / out 60768 (reasoning included in out), duration 500.3 s, cost 0.0846 USD (reported), classifier `jev-1.14.0` calls 7, tokens in 6657, cost 0.0003 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 27121 / out 461, cost 0.0036 USD (reported), PR document check `jev-1.14.0` calls 9, tokens in 35281, cost 0.0015 USD, build file judge `jev-1.14.0` calls 7, tokens in 9436, cost 0.0004 USD, phases: path_judge 0.4 s, classifier 0.4 s, doc_check 0.5 s, context 6.0 s, model_review 492.2 s, config: defaults + host + repository (.werkrevisor.toml at main 65b32d1).
Reviewed head `ed0a05c7d8d4cd9ddbed272495fceb0648be98cc` against base `65b32d1bc3b2e58f66555e2b1ff2315e223fa625`, werkrevisor 0.66.0.
<!-- werkrevisor:ed0a05c7d8d4cd9ddbed272495fceb0648be98cc --> <!-- werkrevisor-verdict:GREEN --> <!-- werkrevisor-blocks:035419384f7342eb38d438b0991981f3,5f9294f497956831a5db62d2ef3343ee,897f8d6abb238e49ab866686de6bf9ab,1d27fc4208c2fb3c76e5d1c40c37b1be,e040ac42d20f065ae3e7c870aa0ec320,450fc34af325eb4eb27a86f3b1758695,5c0c43e13d7a293b5f1f841e2b1a6b5e,5bea467942dadd34ca6230d37efc531e,007a36229e1aed5502c52838bad0e0a6,57270bfe4b34780679308c561587df3e,057a9dceed73d9af21592182d7ce171d,01b5b0e5ce271b4872634f8198bbf177,4d33247e0fd7807265db41b178b9b579,f75b48c551d8335bfb3c096aad41478f,cc22e8f72670bb4411779c5bbec04dfa,ab3daa36fbb38198e2bf8233738c3809,f89661da5b87b0bae7971d1c9d94f6a8,8fd52333ad49ea650ea9bdbe1fd44664,436519e7d635bbb66a441e005e64a54f,963ab64b950494a43f4c90bdef6419ac,e316ccd8f727864d897338c1774a6ea3,04837dca7e9615c30114f8211ddbfde7,73a82853df8055e0c1485def1037db32,d33e470fcefdc6dfaad9951006b2ecf7,6a512c49ea2f9360a4050ce6e4b56ba5,4af3acf88814380afac36a59a71fbeac,60bbf9d877930eddefa1ee3189266a70 --> <!-- werkrevisor-folded --> <details><summary>🟢 werkrevisor GREEN for <code>ed0a05c</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/141#issuecomment-7651">the result for <code>6f047e1</code></a></summary> ## 🟢 werkrevisor: GREEN / PASS Change kind: `mixed`. ### Reasons - **hint** approval of werkrevisor for `0720ccc` not carried over: 7 approved block(s) are missing - **hint** 6 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 merge with caution ### Classifier 7 of 7 units passed all questions (1 PR document(s)). 5 answers ignored because of a confidence below [classifier] min_confidence. <sub> Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 40660, calls 1, tokens in 39163 / out 60768 (reasoning included in out), duration 500.3 s, cost 0.0846 USD (reported), classifier `jev-1.14.0` calls 7, tokens in 6657, cost 0.0003 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 27121 / out 461, cost 0.0036 USD (reported), PR document check `jev-1.14.0` calls 9, tokens in 35281, cost 0.0015 USD, build file judge `jev-1.14.0` calls 7, tokens in 9436, cost 0.0004 USD, phases: path_judge 0.4 s, classifier 0.4 s, doc_check 0.5 s, context 6.0 s, model_review 492.2 s, config: defaults + host + repository (.werkrevisor.toml at main 65b32d1).<br> Reviewed head `ed0a05c7d8d4cd9ddbed272495fceb0648be98cc` against base `65b32d1bc3b2e58f66555e2b1ff2315e223fa625`, werkrevisor 0.66.0. </sub> </details>
ai-reviewer approved these changes 2026-10-23 21:29:19 +02:00
Dismissed
ai-reviewer left a comment
Collaborator

werkrevisor: GREEN / PASS for ed0a05c7d8d4cd9ddbed272495fceb0648be98cc.
The result comment of werkrevisor holds the details.

werkrevisor: GREEN / PASS for `ed0a05c7d8d4cd9ddbed272495fceb0648be98cc`. The result comment of werkrevisor holds the details. <!-- werkrevisor-review:ed0a05c7d8d4cd9ddbed272495fceb0648be98cc -->
Collaborator

Codex review: critical

This change relaxes the merge gate by allowing changes or removals of migrations classified as unreleased without human approval. Branch topology cannot prove deployment history, so a mistaken classification could allow changes to deployed migrations that the mocked tests would not detect.

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 477888 (cached 429184) / out 2705, 98.3 s, 15 commands; reviewed head `ed0a05c7d8d4cd9ddbed272495fceb0648be98cc`.
<!-- werkrevisor-codex:ed0a05c7d8d4cd9ddbed272495fceb0648be98cc --> <!-- werkrevisor-codex-critical:true --> <!-- werkrevisor-codex-unattached:0 --> <!-- werkrevisor-codex --> ## Codex review: critical This change relaxes the merge gate by allowing changes or removals of migrations classified as unreleased without human approval. Branch topology cannot prove deployment history, so a mistaken classification could allow changes to deployed migrations that the mocked tests would not detect. 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 477888 (cached 429184) / out 2705, 98.3 s, 15 commands; reviewed head `ed0a05c7d8d4cd9ddbed272495fceb0648be98cc`. </sub>
Author
Collaborator

Review round 5 (Codex), fixed in 6f047e1 by a change of design, chosen by the human:

  • werkrevisor/cli.py:427 outgoing PRs: the stack no longer changes the verdict. A changed or removed changeset of the base branch gives YELLOW as on main, whatever the target of the stack has; the model only learns which of them the target lacks. Branch topology cannot prove what was deployed, and each review round found another case that dropped a YELLOW. collect keeps the verdict logic of main; the tests test_a_change_missing_on_the_target_stays_released and test_a_deleted_file_missing_on_the_target_stays_released pin the YELLOW for a stacked PR.
Review round 5 (Codex), fixed in `6f047e1` by a change of design, chosen by the human: - `werkrevisor/cli.py:427` outgoing PRs: the stack no longer changes the verdict. A changed or removed changeset of the base branch gives YELLOW as on `main`, whatever the target of the stack has; the model only learns which of them the target lacks. Branch topology cannot prove what was deployed, and each review round found another case that dropped a YELLOW. `collect` keeps the verdict logic of `main`; the tests `test_a_change_missing_on_the_target_stays_released` and `test_a_deleted_file_missing_on_the_target_stays_released` pin the YELLOW for a stacked PR.
claude-code added 1 commit 2026-10-23 22:30:03 +02:00
Review round 5: the stack only informs the model; the verdict stays as on main
werkator build succeeded after 00:15
werkator/werkrevisor-statistics build succeeded after 00:30
ai-review/assessment AI review passed; approved by werkrevisor; merge already scheduled
ai-review/gate build succeeded after 12:13
ai-review/codex human 👤: approve the head to unlock the merge
6f047e17a4
Branches cannot prove what was deployed, and each round found a new way to lose a YELLOW.
A changed or removed changeset of the base branch gives YELLOW again in any case;
the model learns which of them the target of the stack lacks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude-code dismissed ai-reviewer's review 2026-10-23 22:30:03 +02:00
Reason:

New commits pushed, approval review dismissed automatically according to repository settings

Collaborator

🟢 werkrevisor: GREEN / PASS

Change kind: mixed.

Reasons

  • hint approval of werkrevisor for ed0a05c not carried over: 13 approved block(s) are missing
  • hint 6 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

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

Usage: model `openrouter/minimax/minimax-m3`, LLM failed (TimeoutError), tokens counted before the call 39831, duration 731.3 s, cost unknown, classifier `jev-1.14.0` calls 7, tokens in 6334, cost 0.0003 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 27188 / out 380, cost 0.0036 USD (reported), PR document check `jev-1.14.0` calls 9, tokens in 30409, cost 0.0013 USD, build file judge `jev-1.14.0` calls 7, tokens in 8988, cost 0.0004 USD, phases: path_judge 0.4 s, classifier 0.3 s, doc_check 0.5 s, context 6.2 s, model_review 723.1 s, config: defaults + host + repository (.werkrevisor.toml at main 65b32d1).
Reviewed head `6f047e17a470037a6f0010785cb19751c0ccd381` against base `65b32d1bc3b2e58f66555e2b1ff2315e223fa625`, werkrevisor 0.66.0.
<!-- werkrevisor:6f047e17a470037a6f0010785cb19751c0ccd381 --> <!-- werkrevisor-verdict:GREEN --> <!-- werkrevisor-blocks:035419384f7342eb38d438b0991981f3,75b629f61c7bd6d35f020ccda2f49c30,4fcc8da9e4de2b2bce6d51e656c93a41,1d27fc4208c2fb3c76e5d1c40c37b1be,e040ac42d20f065ae3e7c870aa0ec320,450fc34af325eb4eb27a86f3b1758695,5c0c43e13d7a293b5f1f841e2b1a6b5e,5bea467942dadd34ca6230d37efc531e,007a36229e1aed5502c52838bad0e0a6,81a1a88473f3d00a9ddda6efaf9acc93,057a9dceed73d9af21592182d7ce171d,01b5b0e5ce271b4872634f8198bbf177,4d33247e0fd7807265db41b178b9b579,f75b48c551d8335bfb3c096aad41478f,1fbafa92d76346a887e2e0241210796a,a3861f9e566ea33300de32517d077383,f89661da5b87b0bae7971d1c9d94f6a8,4348b8bbde487016a95752dbcbf95af5,963ab64b950494a43f4c90bdef6419ac,1997670ad9cd7841cf6f51e80e5a0387,ee74393ae11ab6cba22ae6ed5b1119b6,fdcfd484bf3fe9f82cfd6690bbe28a1d,6ba099eb05ea6c8b76c3eca4ab76a13f,c8a1d5dc858749f3b68b5e38e01ae4a0,6af04e2c3f51de696831046363a25c39,c8c14036af34e8c3fcb1f1f1ce6b8e0a,e04164bf57579e06c0f26526c5b5ee33,60bbf9d877930eddefa1ee3189266a70 --> ## 🟢 werkrevisor: GREEN / PASS Change kind: `mixed`. ### Reasons - **hint** approval of werkrevisor for `ed0a05c` not carried over: 13 approved block(s) are missing - **hint** 6 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 7 of 7 units passed all questions (1 PR document(s)). 2 answers ignored because of a confidence below [classifier] min_confidence. <sub> Usage: model `openrouter/minimax/minimax-m3`, LLM failed (TimeoutError), tokens counted before the call 39831, duration 731.3 s, cost unknown, classifier `jev-1.14.0` calls 7, tokens in 6334, cost 0.0003 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 1, tokens in 27188 / out 380, cost 0.0036 USD (reported), PR document check `jev-1.14.0` calls 9, tokens in 30409, cost 0.0013 USD, build file judge `jev-1.14.0` calls 7, tokens in 8988, cost 0.0004 USD, phases: path_judge 0.4 s, classifier 0.3 s, doc_check 0.5 s, context 6.2 s, model_review 723.1 s, config: defaults + host + repository (.werkrevisor.toml at main 65b32d1).<br> Reviewed head `6f047e17a470037a6f0010785cb19751c0ccd381` against base `65b32d1bc3b2e58f66555e2b1ff2315e223fa625`, werkrevisor 0.66.0. </sub>
ai-reviewer left a comment
Collaborator

werkrevisor: GREEN / PASS for 6f047e17a470037a6f0010785cb19751c0ccd381.
The result comment of werkrevisor holds the details.

werkrevisor: GREEN / PASS for `6f047e17a470037a6f0010785cb19751c0ccd381`. The result comment of werkrevisor holds the details. <!-- werkrevisor-review:6f047e17a470037a6f0010785cb19751c0ccd381 -->
Collaborator

Codex review: critical

The change alters the merge gate’s model instructions, including directing it not to report merge-order risks. Incorrect guidance could suppress valid findings and permit unsafe merges, which the mocked-model tests would not reveal.

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 430095 (cached 387456) / out 2177, 79.0 s, 9 commands; reviewed head `6f047e17a470037a6f0010785cb19751c0ccd381`.
<!-- werkrevisor-codex:6f047e17a470037a6f0010785cb19751c0ccd381 --> <!-- werkrevisor-codex-critical:true --> <!-- werkrevisor-codex-unattached:0 --> <!-- werkrevisor-codex --> ## Codex review: critical The change alters the merge gate’s model instructions, including directing it not to report merge-order risks. Incorrect guidance could suppress valid findings and permit unsafe merges, which the mocked-model tests would not reveal. 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 430095 (cached 387456) / out 2177, 79.0 s, 9 commands; reviewed head `6f047e17a470037a6f0010785cb19751c0ccd381`. </sub>
Some checks are pending
werkator build succeeded after 00:15
Required
Details
werkator/werkrevisor-statistics build succeeded after 00:30
ai-review/assessment AI review passed; approved by werkrevisor; merge already scheduled
ai-review/gate build succeeded after 12:13
Required
Details
ai-review/codex human 👤: approve the head to unlock the merge
Required
Some required checks are missing.
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin claude-code/model-facts:claude-code/model-facts
git checkout claude-code/model-facts
Sign in to join this conversation.
No Reviewers
No labels
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: mi/werkrevisor#141