werkrevisor 0.61.0: tools/draft-review drafts a review for a human, with a local config and an HTML report #132

Merged
ai-reviewer merged 11 commits from claude-code/draft-review into main 2026-10-23 10:15:09 +02:00
Collaborator

See docs/prs for the PR document.

🤖 Generated with Claude Code

See docs/prs for the PR document. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
claude-code added 1 commit 2026-10-23 07:26:43 +02:00
PR document: tools/draft-review drafts a review for a human, with a local config and an HTML report
werkator build succeeded after 00:38
werkator/werkrevisor-statistics build succeeded after 00:32
ab40c77007
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude-code added 1 commit 2026-10-23 07:26:45 +02:00
PR document gets the number 132
werkator build succeeded after 00:15
werkator/werkrevisor-statistics build succeeded after 00:31
0c93c4ecf7
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude-code added 1 commit 2026-10-23 07:30:30 +02:00
werkrevisor 0.61.0: tools/draft-review drafts a review for a human, with a local config and an HTML report
werkator build succeeded after 00:12
werkator/werkrevisor-statistics build succeeded after 00:38
ai-review/assessment human review required; a human approval unlocks the merge; review requested from mi; merge scheduled for when the checks succeed
ai-review/gate build succeeded after 00:01
ai-review/codex 1 open Codex finding(s); resolve each line comment
61b5b803ca
Replaces ~/bin/hs-review of one workstation: server, default repository, werkrevisor config, secrets file
and token names come from ~/.config/werkrevisor/draft-review.toml; a PR on another server is refused.
It writes report.html with pandoc; each diagram links to its SVG.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude-code marked the pull request as ready for review 2026-10-23 07:31:50 +02:00
Collaborator
🟡 werkrevisor YELLOW for 61b5b80, superseded by the result for 4b9622b

🟡 werkrevisor: YELLOW / HUMAN_REVIEW

Change kind: mixed.

Reasons

  • YELLOW possible secrets in added lines: README.md:1640 (generic_secret), README.md:1641 (generic_secret)
  • YELLOW changed files not judged by Jev (possible secrets in the diff): statistics/build.gradle.kts, tests/test_draftreview.py, tools/draft-review and 3 more
  • hint the PR document was not compared with the diff: possible secrets in the diff
Usage: model `openrouter/minimax/minimax-m3`, LLM skipped (possible secrets in the diff), duration 0.2 s, no model call, cost 0 USD, config: defaults + host + repository (.werkrevisor.toml at main e44836d).
Reviewed head `61b5b803ca3e3aea2944f37818a750cdfa897ded` against base `e44836d6a0db073aa6b58248a7d3c96317721f29`, werkrevisor 0.60.1.
<!-- werkrevisor:61b5b803ca3e3aea2944f37818a750cdfa897ded --> <!-- werkrevisor-verdict:YELLOW --> <!-- werkrevisor-blocks:f690462264c640f6d8453aa9b1c3164a,05e74eea6b64049128ccc3f668140291,65bc154317865bd400fbc19f5ed6302d,389819b5c43c0946f078a57cb1e4727f,c72712b89a1626b64a0a389527bd5d4b,c11a79b9e2892700aaf06d1f0b3d955f,581051c710db376beeb73d037ba07e84,06d5ea6e19dcfc3c3f953261d8fa050d,55ae6deb45a82cb6dca141952a280ac3 --> <!-- werkrevisor-folded --> <details><summary>🟡 werkrevisor YELLOW for <code>61b5b80</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/132#issuecomment-7097">the result for <code>4b9622b</code></a></summary> ## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW Change kind: `mixed`. ### Reasons - **YELLOW** possible secrets in added lines: README.md:1640 (generic_secret), README.md:1641 (generic_secret) - **YELLOW** changed files not judged by Jev (possible secrets in the diff): statistics/build.gradle.kts, tests/test_draftreview.py, tools/draft-review and 3 more - **hint** the PR document was not compared with the diff: possible secrets in the diff <sub> Usage: model `openrouter/minimax/minimax-m3`, LLM skipped (possible secrets in the diff), duration 0.2 s, no model call, cost 0 USD, config: defaults + host + repository (.werkrevisor.toml at main e44836d).<br> Reviewed head `61b5b803ca3e3aea2944f37818a750cdfa897ded` against base `e44836d6a0db073aa6b58248a7d3c96317721f29`, werkrevisor 0.60.1. </sub> </details>
ai-reviewer scheduled this pull request to auto merge when all checks succeed 2026-10-23 07:31:54 +02:00
ai-reviewer requested review from mi 2026-10-23 07:31:54 +02:00
claude-code added 1 commit 2026-10-23 07:32:55 +02:00
draft-review: the local config names read_token_variable and write_token_variable
werkator build failed after 00:13
werkator/werkrevisor-statistics build succeeded after 00:30
ai-review/gate build failed after 12:06
734409b59f
The values are names of variables, and the keys no longer look like secrets to the secret scan.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude-code added 1 commit 2026-10-23 07:33:38 +02:00
Tests use the renamed keys of the local config
werkator build succeeded after 00:13
werkator/werkrevisor-statistics build succeeded after 00:30
ai-review/assessment human review required; a human approval unlocks the merge; a human review request is pending; merge already scheduled
ai-review/gate build succeeded after 12:53
ai-review/codex 2 open Codex finding(s); resolve each line comment
4b9622b901
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ai-reviewer left a comment
Collaborator

Codex review of 61b5b803ca3e3aea2944f37818a750cdfa897ded

Codex review of `61b5b803ca3e3aea2944f37818a750cdfa897ded` <!-- werkrevisor-codex -->
@@ -0,0 +15,4 @@
import os
import sys
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
Collaborator

[high] Resolve the script symlink before locating the package (Codex review)

With the documented installation ~/bin/hs-review -> <checkout>/tools/draft-review, abspath(__file__) retains the symlink path, so this inserts the user's home directory instead of the checkout into sys.path. Unless the package is independently installed, invocation fails with ModuleNotFoundError: No module named 'werkrevisor', preventing both review and attachment. Resolve the symlink with realpath before taking the parent directories.

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

**[high] Resolve the script symlink before locating the package** (Codex review) With the documented installation `~/bin/hs-review -> <checkout>/tools/draft-review`, `abspath(__file__)` retains the symlink path, so this inserts the user's home directory instead of the checkout into sys.path. Unless the package is independently installed, invocation fails with `ModuleNotFoundError: No module named 'werkrevisor'`, preventing both review and attachment. Resolve the symlink with realpath before taking the parent directories. Fix it, or reply why it does not hold, and resolve this comment. <!-- werkrevisor-codex -->
Author
Collaborator

Fixed in 6e75f60: tools/draft-review takes os.path.realpath(__file__). Red/green by hand: through a link the old version stopped with ModuleNotFoundError, the new one reaches its own message; LinkTest calls the tool through a link.

Fixed in `6e75f60`: `tools/draft-review` takes `os.path.realpath(__file__)`. Red/green by hand: through a link the old version stopped with `ModuleNotFoundError`, the new one reaches its own message; `LinkTest` calls the tool through a link.
claude-code marked this conversation as resolved
Collaborator
⚠️ werkrevisor ERROR for ?, superseded by the result for 4b9622b

Codex review: critical

The change introduces loading and selecting read/write Gitea credentials and restricting their destination. Mistakes in that boundary could expose credentials or permit unintended authenticated writes, so human review is required.

Findings

  1. [high] Resolve the script symlink before locating the package at tools/draft-review:18, 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 277121 (cached 227072) / out 2384, 103.9 s, 7 commands; reviewed head `61b5b803ca3e3aea2944f37818a750cdfa897ded`.
<!-- werkrevisor-codex:61b5b803ca3e3aea2944f37818a750cdfa897ded --> <!-- werkrevisor-codex-critical:true --> <!-- werkrevisor-codex-unattached:0 --> <!-- werkrevisor-codex --> <!-- werkrevisor-folded --> <details><summary>⚠️ werkrevisor ERROR for <code>?</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/132#issuecomment-7097">the result for <code>4b9622b</code></a></summary> ## Codex review: critical The change introduces loading and selecting read/write Gitea credentials and restricting their destination. Mistakes in that boundary could expose credentials or permit unintended authenticated writes, so human review is required. ### Findings 1. **[high] Resolve the script symlink before locating the package** at `tools/draft-review:18`, 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 277121 (cached 227072) / out 2384, 103.9 s, 7 commands; reviewed head `61b5b803ca3e3aea2944f37818a750cdfa897ded`. </sub> </details>
Collaborator
🟡 werkrevisor YELLOW for 4b9622b, superseded by the result for 6e75f60

🟡 werkrevisor: YELLOW / HUMAN_REVIEW

Change kind: mixed.

Reasons

  • YELLOW changes that touch security according to Jev: werkrevisor/draftreview.py (weakens checks 0.03, security 0.95)
  • hint 4 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 8 changed file(s) agree with the PR document according to Jev
  • 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)).
1 answer ignored because of a confidence below [classifier] min_confidence.

Usage: model `openrouter/minimax/minimax-m3`, LLM failed (TimeoutError), tokens counted before the call 23550, duration 724.5 s, cost unknown, classifier `jev-1.14.0` calls 7, tokens in 5756, cost 0.0002 USD, PR document check `jev-1.14.0` calls 8, tokens in 21952, cost 0.0009 USD, build file judge `jev-1.14.0` calls 6, tokens in 8019, cost 0.0003 USD, phases: path_judge 0.4 s, classifier 0.3 s, doc_check 0.4 s, context 0.2 s, model_review 722.6 s, config: defaults + host + repository (.werkrevisor.toml at main e44836d).
Reviewed head `4b9622b901cda6fd3c232e835476149e5ccb4048` against base `e44836d6a0db073aa6b58248a7d3c96317721f29`, werkrevisor 0.60.1.

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

pr-lens-view-run-flow.svg

<!-- werkrevisor:4b9622b901cda6fd3c232e835476149e5ccb4048 --> <!-- werkrevisor-verdict:YELLOW --> <!-- werkrevisor-blocks:11c5ba2e6ff518cfc3b0534adbd29112,05e74eea6b64049128ccc3f668140291,65bc154317865bd400fbc19f5ed6302d,389819b5c43c0946f078a57cb1e4727f,ec1b6caf9626f8c21f3da4669aacbeb9,c11a79b9e2892700aaf06d1f0b3d955f,581051c710db376beeb73d037ba07e84,f32348e54de15f2c3797cf44892e5527,55ae6deb45a82cb6dca141952a280ac3 --> <!-- werkrevisor:diagrams --> <!-- werkrevisor-folded --> <details><summary>🟡 werkrevisor YELLOW for <code>4b9622b</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/132#issuecomment-7105">the result for <code>6e75f60</code></a></summary> ## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW Change kind: `mixed`. ### Reasons - **YELLOW** changes that touch security according to Jev: werkrevisor/draftreview.py (weakens checks 0.03, security 0.95) - **hint** 4 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** 8 changed file(s) agree with the PR document according to Jev - **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)). 1 answer ignored because of a confidence below [classifier] min_confidence. <sub> Usage: model `openrouter/minimax/minimax-m3`, LLM failed (TimeoutError), tokens counted before the call 23550, duration 724.5 s, cost unknown, classifier `jev-1.14.0` calls 7, tokens in 5756, cost 0.0002 USD, PR document check `jev-1.14.0` calls 8, tokens in 21952, cost 0.0009 USD, build file judge `jev-1.14.0` calls 6, tokens in 8019, cost 0.0003 USD, phases: path_judge 0.4 s, classifier 0.3 s, doc_check 0.4 s, context 0.2 s, model_review 722.6 s, config: defaults + host + repository (.werkrevisor.toml at main e44836d).<br> Reviewed head `4b9622b901cda6fd3c232e835476149e5ccb4048` against base `e44836d6a0db073aa6b58248a7d3c96317721f29`, werkrevisor 0.60.1. </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-ctx-containers.svg](https://git.javagil.de/attachments/a565ddbf-071f-45a2-a2f0-e9960e5f9c25) ![pr-lens-view-run-flow.svg](https://git.javagil.de/attachments/00420d54-a60e-495c-9743-02a5f944453e) </details>
claude-code added 1 commit 2026-10-23 07:58:34 +02:00
draft-review finds its package also through a link such as ~/bin/hs-review
ai-review/gate build succeeded after 12:50
ai-review/codex 2 open Codex finding(s); resolve each line comment
werkator build succeeded after 00:13
werkator/werkrevisor-statistics build succeeded after 00:33
ai-review/assessment human review required; a human approval unlocks the merge; a human review request is pending; merge already scheduled
6e75f60b6d
Found by the Codex review of 61b5b80 (line comment 7094).

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

Answer to the review of 4b9622b:

  • YELLOW "changes that touch security" for werkrevisor/draftreview.py (Jev 0.95): holds as a reason for a human look, nothing to fix. The file reads the secrets file and passes one token to tools/review-report: the read token for a review, the write token only for --attach. A PR URL on another server is refused before any request (Scenario#132.02), and no output holds a token value (test_a_review_reads_with_the_read_token_and_prints_the_verdict).
  • Model review timed out (720 s): advisory; Jev judged every file.
Answer to the review of `4b9622b`: - **YELLOW "changes that touch security" for `werkrevisor/draftreview.py` (Jev 0.95):** holds as a reason for a human look, nothing to fix. The file reads the secrets file and passes one token to `tools/review-report`: the read token for a review, the write token only for `--attach`. A PR URL on another server is refused before any request (Scenario#132.02), and no output holds a token value (`test_a_review_reads_with_the_read_token_and_prints_the_verdict`). - **Model review timed out (720 s):** advisory; Jev judged every file.
ai-reviewer left a comment
Collaborator

Codex review of 4b9622b901cda6fd3c232e835476149e5ccb4048

Codex review of `4b9622b901cda6fd3c232e835476149e5ccb4048` <!-- werkrevisor-codex -->
@@ -0,0 +15,4 @@
import os
import sys
# realpath: a link such as ~/bin/<name> must still find the package of the checkout.
Collaborator

[medium] The documented symlink launch cannot import werkrevisor (Codex review)

When invoked through ~/bin/hs-review as documented, file names the symlink. abspath does not resolve it, so this inserts the home directory instead of the repository root into sys.path. Without a separately configured PYTHONPATH or installed package, execution fails with ModuleNotFoundError before even displaying help. Resolve file with realpath before locating the repository.

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

**[medium] The documented symlink launch cannot import werkrevisor** (Codex review) When invoked through ~/bin/hs-review as documented, __file__ names the symlink. abspath does not resolve it, so this inserts the home directory instead of the repository root into sys.path. Without a separately configured PYTHONPATH or installed package, execution fails with ModuleNotFoundError before even displaying help. Resolve __file__ with realpath before locating the repository. Fix it, or reply why it does not hold, and resolve this comment. <!-- werkrevisor-codex -->
Author
Collaborator

Fixed in 6e75f60, as in the same finding 7094: tools/draft-review takes os.path.realpath(__file__); LinkTest calls it through a link.

Fixed in `6e75f60`, as in the same finding 7094: `tools/draft-review` takes `os.path.realpath(__file__)`; `LinkTest` calls it through a link.
claude-code marked this conversation as resolved
@@ -0,0 +107,4 @@
if which("pandoc") is None:
return None
html = os.path.join(os.path.dirname(report), "report.html")
run(["pandoc", report, "--standalone", "--metadata", f"title={title}", "--output", html], check=True,
Collaborator

[high] Generated HTML executes scripts from review content (Codex review)

Pandoc's default Markdown reader preserves raw HTML, while report.md includes unsanitized model findings derived from the PR. A finding containing a <script> block survives this conversion unchanged, as verified with pandoc. Opening report.html executes it, allowing draft content to be transmitted or displayed findings to be altered. Sanitize the HTML or disable active HTML content before rendering.

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

**[high] Generated HTML executes scripts from review content** (Codex review) Pandoc's default Markdown reader preserves raw HTML, while report.md includes unsanitized model findings derived from the PR. A finding containing a <script> block survives this conversion unchanged, as verified with pandoc. Opening report.html executes it, allowing draft content to be transmitted or displayed findings to be altered. Sanitize the HTML or disable active HTML content before rendering. Fix it, or reply why it does not hold, and resolve this comment. <!-- werkrevisor-codex -->
Author
Collaborator

Fixed in cf1f13c: pandoc reads markdown-raw_html, so HTML of the draft stays text, and the page carries Content-Security-Policy: default-src 'none'; img-src 'self' file: data:; style-src 'unsafe-inline', which also stops javascript: links. Red/green with pandoc 3 on a draft with <script> and a javascript: link: before 1 script tag and no policy, after 0 script tags, the script as text, and the policy. Scenario#132.04.

Fixed in `cf1f13c`: pandoc reads `markdown-raw_html`, so HTML of the draft stays text, and the page carries `Content-Security-Policy: default-src 'none'; img-src 'self' file: data:; style-src 'unsafe-inline'`, which also stops `javascript:` links. Red/green with pandoc 3 on a draft with `<script>` and a `javascript:` link: before 1 script tag and no policy, after 0 script tags, the script as text, and the policy. Scenario#132.04.
claude-code marked this conversation as resolved
Collaborator
⚠️ werkrevisor ERROR for ?, superseded by the result for 6e75f60

Codex review: critical

The change selects credentials and enforces their destination server, where mistakes could expose tokens. It also introduces browser rendering of untrusted review content, which requires security review.

Findings

  1. [high] Generated HTML executes scripts from review content at werkrevisor/draftreview.py:110, as a line comment
  2. [medium] The documented symlink launch cannot import werkrevisor at tools/draft-review:18, 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 295631 (cached 243712) / out 2606, 100.3 s, 7 commands; reviewed head `4b9622b901cda6fd3c232e835476149e5ccb4048`.
<!-- werkrevisor-codex:4b9622b901cda6fd3c232e835476149e5ccb4048 --> <!-- werkrevisor-codex-critical:true --> <!-- werkrevisor-codex-unattached:0 --> <!-- werkrevisor-codex --> <!-- werkrevisor-folded --> <details><summary>⚠️ werkrevisor ERROR for <code>?</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/132#issuecomment-7105">the result for <code>6e75f60</code></a></summary> ## Codex review: critical The change selects credentials and enforces their destination server, where mistakes could expose tokens. It also introduces browser rendering of untrusted review content, which requires security review. ### Findings 1. **[high] Generated HTML executes scripts from review content** at `werkrevisor/draftreview.py:110`, as a line comment 2. **[medium] The documented symlink launch cannot import werkrevisor** at `tools/draft-review:18`, 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 295631 (cached 243712) / out 2606, 100.3 s, 7 commands; reviewed head `4b9622b901cda6fd3c232e835476149e5ccb4048`. </sub> </details>
Collaborator
🟡 werkrevisor YELLOW for 6e75f60, superseded by the result for cf1f13c

🟡 werkrevisor: YELLOW / HUMAN_REVIEW

Change kind: mixed.

Reasons

  • YELLOW changes that touch security according to Jev: werkrevisor/draftreview.py (weakens checks 0.04, security 0.96)
  • hint 4 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 8 changed file(s) agree with the PR document according to Jev
  • 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 24170, duration 724.5 s, cost unknown, classifier `jev-1.14.0` calls 7, tokens in 5756, cost 0.0002 USD, PR document check `jev-1.14.0` calls 8, tokens in 22658, cost 0.0010 USD, build file judge `jev-1.14.0` calls 6, tokens in 8253, cost 0.0003 USD, phases: path_judge 0.3 s, classifier 0.4 s, doc_check 0.4 s, context 0.2 s, model_review 722.6 s, config: defaults + host + repository (.werkrevisor.toml at main e44836d).
Reviewed head `6e75f60b6d85ef0dacc16d98f88704e139c2de5e` against base `e44836d6a0db073aa6b58248a7d3c96317721f29`, werkrevisor 0.60.1.

Diagrams

Drawn by a model from the diff with PR Lens: a view of what the PR touches, not a statement of what it does.

pr-lens-v-containers.svg

pr-lens-v-flow.svg

<!-- werkrevisor:6e75f60b6d85ef0dacc16d98f88704e139c2de5e --> <!-- werkrevisor-verdict:YELLOW --> <!-- werkrevisor-blocks:11c5ba2e6ff518cfc3b0534adbd29112,92864a37cccf5f158a3f8b45019006dd,65bc154317865bd400fbc19f5ed6302d,389819b5c43c0946f078a57cb1e4727f,82ec9e1c7ce502c6303176d1e0098aa3,999ba91e9df98067fc5a6956d09d4488,581051c710db376beeb73d037ba07e84,f32348e54de15f2c3797cf44892e5527,55ae6deb45a82cb6dca141952a280ac3 --> <!-- werkrevisor:diagrams --> <!-- werkrevisor-folded --> <details><summary>🟡 werkrevisor YELLOW for <code>6e75f60</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/132#issuecomment-7113">the result for <code>cf1f13c</code></a></summary> ## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW Change kind: `mixed`. ### Reasons - **YELLOW** changes that touch security according to Jev: werkrevisor/draftreview.py (weakens checks 0.04, security 0.96) - **hint** 4 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** 8 changed file(s) agree with the PR document according to Jev - **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 24170, duration 724.5 s, cost unknown, classifier `jev-1.14.0` calls 7, tokens in 5756, cost 0.0002 USD, PR document check `jev-1.14.0` calls 8, tokens in 22658, cost 0.0010 USD, build file judge `jev-1.14.0` calls 6, tokens in 8253, cost 0.0003 USD, phases: path_judge 0.3 s, classifier 0.4 s, doc_check 0.4 s, context 0.2 s, model_review 722.6 s, config: defaults + host + repository (.werkrevisor.toml at main e44836d).<br> Reviewed head `6e75f60b6d85ef0dacc16d98f88704e139c2de5e` against base `e44836d6a0db073aa6b58248a7d3c96317721f29`, werkrevisor 0.60.1. </sub> ### Diagrams Drawn by a model from the diff with [PR Lens](https://github.com/coldteadotai/pr-lens): a view of what the PR touches, not a statement of what it does. ![pr-lens-v-containers.svg](https://git.javagil.de/attachments/6250df24-5821-401a-bf73-ba99d9c8ed51) ![pr-lens-v-flow.svg](https://git.javagil.de/attachments/499438d4-a2c6-41ac-b89f-cc7cc3eee72b) </details>
claude-code added 1 commit 2026-10-23 08:12:20 +02:00
report.html runs no script of the draft: no raw HTML, and a Content Security Policy without scripts
werkator build succeeded after 00:12
werkator/werkrevisor-statistics build succeeded after 00:31
ai-review/assessment human review required; a human approval unlocks the merge; a human review request is pending; merge already scheduled
ai-review/gate build succeeded after 12:26
ai-review/codex 1 open Codex finding(s); resolve each line comment
cf1f13c420
The draft holds findings of a model that read the PR; a quoted <script> ran when the human opened the page.
Found by the Codex review of 61b5b80 (line comment 7101).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ai-reviewer left a comment
Collaborator

Codex review of 6e75f60b6d85ef0dacc16d98f88704e139c2de5e

Codex review of `6e75f60b6d85ef0dacc16d98f88704e139c2de5e` <!-- werkrevisor-codex -->
@@ -0,0 +90,4 @@
def short(location):
return re.sub(r"[^\s:()]*/", "", location)
# A finding of this verdict says more than the reason that counts it: its title and file, without the directories.
finding = re.search(r"^\d+\. \*\*(.+?)\*\* at `([^`]+)`\n\n\s*" + word + ";", text, re.M)
Collaborator

[low] Summary omits the strongest finding in llm mode (Codex review)

The expression requires a semicolon after the finding verdict, but finding_text_lines() emits that semicolon only when Jev judgment text exists. In supported engine mode llm, an ORANGE finding is therefore missed and the summary falls back to the generic finding count instead of its title. Accept a verdict followed by a newline as well.

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

**[low] Summary omits the strongest finding in llm mode** (Codex review) The expression requires a semicolon after the finding verdict, but finding_text_lines() emits that semicolon only when Jev judgment text exists. In supported engine mode `llm`, an ORANGE finding is therefore missed and the summary falls back to the generic finding count instead of its title. Accept a verdict followed by a newline as well. Fix it, or reply why it does not hold, and resolve this comment. <!-- werkrevisor-codex -->
Author
Collaborator

Fixed in 95d40fe: the verdict of a finding may end the line, as without a judgment of Jev. test_a_finding_without_a_judgment_of_jev_is_named_too.

Fixed in `95d40fe`: the verdict of a finding may end the line, as without a judgment of Jev. `test_a_finding_without_a_judgment_of_jev_is_named_too`.
claude-code marked this conversation as resolved
@@ -0,0 +107,4 @@
def write_html(report, title, run=subprocess.run, which=shutil.which):
"""Writes report.html next to report.md with pandoc; returns its path, or None without pandoc."""
Collaborator

[high] HTML reports allow executable content from review text (Codex review)

Pandoc preserves raw HTML from the report without sanitization or a restrictive content security policy. A valid Codex finding containing <script>...</script> survives compose() and conversion unchanged. Opening the report therefore executes that code, allowing malicious review content to alter the displayed verdict or transmit private report contents. Sanitize the rendered output and block executable content.

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

**[high] HTML reports allow executable content from review text** (Codex review) Pandoc preserves raw HTML from the report without sanitization or a restrictive content security policy. A valid Codex finding containing `<script>...</script>` survives compose() and conversion unchanged. Opening the report therefore executes that code, allowing malicious review content to alter the displayed verdict or transmit private report contents. Sanitize the rendered output and block executable content. Fix it, or reply why it does not hold, and resolve this comment. <!-- werkrevisor-codex -->
Author
Collaborator

Fixed in cf1f13c, as in the same finding 7101: --from markdown-raw_html keeps HTML of the draft as text, and the page has a Content Security Policy without scripts. Scenario#132.04, red/green with pandoc 3.

Fixed in `cf1f13c`, as in the same finding 7101: `--from markdown-raw_html` keeps HTML of the draft as text, and the page has a Content Security Policy without scripts. Scenario#132.04, red/green with pandoc 3.
claude-code marked this conversation as resolved
Collaborator
⚠️ werkrevisor ERROR for ?, superseded by the result for cf1f13c

Codex review: critical

The change introduces credential selection and destination validation, and renders untrusted review content as local HTML. Mistakes at these boundaries can expose credentials or execute attacker-controlled browser content.

Findings

  1. [high] HTML reports allow executable content from review text at werkrevisor/draftreview.py:110, as a line comment
  2. [low] Summary omits the strongest finding in llm mode at werkrevisor/draftreview.py:93, 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 631070 (cached 567296) / out 2888, 110.3 s, 15 commands; reviewed head `6e75f60b6d85ef0dacc16d98f88704e139c2de5e`.
<!-- werkrevisor-codex:6e75f60b6d85ef0dacc16d98f88704e139c2de5e --> <!-- werkrevisor-codex-critical:true --> <!-- werkrevisor-codex-unattached:0 --> <!-- werkrevisor-codex --> <!-- werkrevisor-folded --> <details><summary>⚠️ werkrevisor ERROR for <code>?</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/132#issuecomment-7113">the result for <code>cf1f13c</code></a></summary> ## Codex review: critical The change introduces credential selection and destination validation, and renders untrusted review content as local HTML. Mistakes at these boundaries can expose credentials or execute attacker-controlled browser content. ### Findings 1. **[high] HTML reports allow executable content from review text** at `werkrevisor/draftreview.py:110`, as a line comment 2. **[low] Summary omits the strongest finding in llm mode** at `werkrevisor/draftreview.py:93`, 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 631070 (cached 567296) / out 2888, 110.3 s, 15 commands; reviewed head `6e75f60b6d85ef0dacc16d98f88704e139c2de5e`. </sub> </details>
Collaborator
🟡 werkrevisor YELLOW for cf1f13c, superseded by the result for 95d40fe

🟡 werkrevisor: YELLOW / HUMAN_REVIEW

Change kind: mixed.

Reasons

  • YELLOW changes that touch security according to Jev: werkrevisor/draftreview.py (weakens checks 0.03, security 0.95)
  • hint 4 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 8 changed file(s) agree with the PR document according to Jev
  • hint the model review failed: TimeoutError: review exceeded 720 seconds (advisory: Jev judged every changed file)

Classifier

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

Usage: model `openrouter/minimax/minimax-m3`, LLM failed (TimeoutError), tokens counted before the call 25383, duration 724.6 s, cost unknown, classifier `jev-1.14.0` calls 8, tokens in 6776, cost 0.0003 USD, PR document check `jev-1.14.0` calls 8, tokens in 25162, cost 0.0011 USD, build file judge `jev-1.14.0` calls 6, tokens in 8693, cost 0.0004 USD, phases: path_judge 0.3 s, classifier 0.4 s, doc_check 0.4 s, context 0.2 s, model_review 722.8 s, config: defaults + host + repository (.werkrevisor.toml at main e44836d).
Reviewed head `cf1f13c4208e8558e198b4280fd64f63c58bb1ce` against base `e44836d6a0db073aa6b58248a7d3c96317721f29`, werkrevisor 0.60.1.

Diagrams

Drawn by a model from the diff with PR Lens: a view of what the PR touches, not a statement of what it does.

pr-lens-v-arch.svg

pr-lens-v-flow.svg

<!-- werkrevisor:cf1f13c4208e8558e198b4280fd64f63c58bb1ce --> <!-- werkrevisor-verdict:YELLOW --> <!-- werkrevisor-blocks:11c5ba2e6ff518cfc3b0534adbd29112,cb5b8257fdb65eb15fc14116ca016e88,65bc154317865bd400fbc19f5ed6302d,389819b5c43c0946f078a57cb1e4727f,98b8eb8507f9672e26b8342a37c42a7b,999ba91e9df98067fc5a6956d09d4488,581051c710db376beeb73d037ba07e84,cee6b47586e9648edac46e22af6e6336,55ae6deb45a82cb6dca141952a280ac3 --> <!-- werkrevisor:diagrams --> <!-- werkrevisor-folded --> <details><summary>🟡 werkrevisor YELLOW for <code>cf1f13c</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/132#issuecomment-7120">the result for <code>95d40fe</code></a></summary> ## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW Change kind: `mixed`. ### Reasons - **YELLOW** changes that touch security according to Jev: werkrevisor/draftreview.py (weakens checks 0.03, security 0.95) - **hint** 4 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** 8 changed file(s) agree with the PR document according to Jev - **hint** the model review failed: TimeoutError: review exceeded 720 seconds (advisory: Jev judged every changed file) ### Classifier 8 of 8 units passed all questions (1 PR document(s)). 1 answer ignored because of a confidence below [classifier] min_confidence. <sub> Usage: model `openrouter/minimax/minimax-m3`, LLM failed (TimeoutError), tokens counted before the call 25383, duration 724.6 s, cost unknown, classifier `jev-1.14.0` calls 8, tokens in 6776, cost 0.0003 USD, PR document check `jev-1.14.0` calls 8, tokens in 25162, cost 0.0011 USD, build file judge `jev-1.14.0` calls 6, tokens in 8693, cost 0.0004 USD, phases: path_judge 0.3 s, classifier 0.4 s, doc_check 0.4 s, context 0.2 s, model_review 722.8 s, config: defaults + host + repository (.werkrevisor.toml at main e44836d).<br> Reviewed head `cf1f13c4208e8558e198b4280fd64f63c58bb1ce` against base `e44836d6a0db073aa6b58248a7d3c96317721f29`, werkrevisor 0.60.1. </sub> ### Diagrams Drawn by a model from the diff with [PR Lens](https://github.com/coldteadotai/pr-lens): a view of what the PR touches, not a statement of what it does. ![pr-lens-v-arch.svg](https://git.javagil.de/attachments/5b666794-6f7a-431d-a0be-9acc102784b6) ![pr-lens-v-flow.svg](https://git.javagil.de/attachments/5f9e193d-93e1-409a-906d-b168615e601a) </details>
claude-code added 1 commit 2026-10-23 08:25:29 +02:00
draft-review names the strongest finding also without a judgment of Jev
ai-review/codex 2 open Codex finding(s); resolve each line comment
werkator build succeeded after 00:13
werkator/werkrevisor-statistics build succeeded after 00:32
ai-review/assessment human review required; a human approval unlocks the merge; a human review request is pending; merge already scheduled
ai-review/gate build succeeded after 12:25
95d40fe3ea
Found by the Codex review of 61b5b80 (line comment 7110).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ai-reviewer left a comment
Collaborator

Codex review of cf1f13c4208e8558e198b4280fd64f63c58bb1ce

Codex review of `cf1f13c4208e8558e198b4280fd64f63c58bb1ce` <!-- werkrevisor-codex -->
@@ -0,0 +117,4 @@
with open(header, "w", encoding="utf-8") as f:
f.write(f'<meta http-equiv="Content-Security-Policy" content="{CONTENT_SECURITY_POLICY}">\n')
try:
# markdown-raw_html: HTML in the draft, e.g. a <script> quoted in a finding, stays text.
Collaborator

[high] Pandoc metadata can inject scripts before the security policy (Codex review)

markdown-raw_html still enables yaml_metadata_block and raw_attribute. A finding containing a YAML block with pagetitle: '</title><script>alert(1)</script><title>{=html}' inserts an executable script into the document head before the CSP meta tag. The policy therefore cannot block that script when the report opens. This was reproduced through the actual report composer and write_html command using Pandoc 3.7.0.2; the mocked Pandoc test does not detect it.

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

**[high] Pandoc metadata can inject scripts before the security policy** (Codex review) `markdown-raw_html` still enables `yaml_metadata_block` and `raw_attribute`. A finding containing a YAML block with pagetitle: '`</title><script>alert(1)</script><title>`{=html}' inserts an executable script into the document head before the CSP meta tag. The policy therefore cannot block that script when the report opens. This was reproduced through the actual report composer and write_html command using Pandoc 3.7.0.2; the mocked Pandoc test does not detect it. Fix it, or reply why it does not hold, and resolve this comment. <!-- werkrevisor-codex -->
Author
Collaborator

Fixed in 6c53bb1: pandoc reads markdown_strict-raw_html+pipe_tables, which has no YAML metadata block, no raw attribute and no raw HTML (gfm and commonmark kept inline HTML despite -raw_html). An own template puts the Content Security Policy first into the head and takes only the body and our title. Links with javascript:, vbscript: or data: lead to #blocked-…. Red/green with pandoc 3.7.0.2 and both payloads of these comments through compose and write_html: before 3 scripts, 2 in the head before the policy; after 0 scripts and 0 script links. test_a_draft_cannot_inject_a_script_with_pandoc runs the real pandoc where it is installed.

Fixed in `6c53bb1`: pandoc reads `markdown_strict-raw_html+pipe_tables`, which has no YAML metadata block, no raw attribute and no raw HTML (gfm and commonmark kept inline HTML despite `-raw_html`). An own template puts the Content Security Policy first into the head and takes only the body and our title. Links with `javascript:`, `vbscript:` or `data:` lead to `#blocked-…`. Red/green with pandoc 3.7.0.2 and both payloads of these comments through `compose` and `write_html`: before 3 scripts, 2 in the head before the policy; after 0 scripts and 0 script links. `test_a_draft_cannot_inject_a_script_with_pandoc` runs the real pandoc where it is installed.
claude-code marked this conversation as resolved
Collaborator
⚠️ werkrevisor ERROR for ?, superseded by the result for 95d40fe

Codex review: critical

The change handles read/write credentials and introduces browser rendering of untrusted model output. Mistakes in these security boundaries can expose credentials or execute attacker-controlled scripts.

Findings

  1. [high] Pandoc metadata can inject scripts before the security policy at werkrevisor/draftreview.py:120, 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 441196 (cached 382464) / out 3451, 112.5 s, 15 commands; reviewed head `cf1f13c4208e8558e198b4280fd64f63c58bb1ce`.
<!-- werkrevisor-codex:cf1f13c4208e8558e198b4280fd64f63c58bb1ce --> <!-- werkrevisor-codex-critical:true --> <!-- werkrevisor-codex-unattached:0 --> <!-- werkrevisor-codex --> <!-- werkrevisor-folded --> <details><summary>⚠️ werkrevisor ERROR for <code>?</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/132#issuecomment-7120">the result for <code>95d40fe</code></a></summary> ## Codex review: critical The change handles read/write credentials and introduces browser rendering of untrusted model output. Mistakes in these security boundaries can expose credentials or execute attacker-controlled scripts. ### Findings 1. **[high] Pandoc metadata can inject scripts before the security policy** at `werkrevisor/draftreview.py:120`, 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 441196 (cached 382464) / out 3451, 112.5 s, 15 commands; reviewed head `cf1f13c4208e8558e198b4280fd64f63c58bb1ce`. </sub> </details>
Collaborator
🟡 werkrevisor YELLOW for 95d40fe, superseded by the result for 6c53bb1

🟡 werkrevisor: YELLOW / HUMAN_REVIEW

Change kind: mixed.

Reasons

  • YELLOW changes that touch security according to Jev: werkrevisor/draftreview.py (weakens checks 0.04, security 0.95)
  • hint 4 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 8 changed file(s) agree with the PR document according to Jev
  • hint the model review failed: TimeoutError: review exceeded 720 seconds (advisory: Jev judged every changed file)

Classifier

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

Usage: model `openrouter/minimax/minimax-m3`, LLM failed (TimeoutError), tokens counted before the call 25655, duration 724.7 s, cost unknown, classifier `jev-1.14.0` calls 8, tokens in 6776, cost 0.0003 USD, PR document check `jev-1.14.0` calls 8, tokens in 25290, cost 0.0011 USD, build file judge `jev-1.14.0` calls 6, tokens in 8821, cost 0.0004 USD, phases: path_judge 0.4 s, classifier 0.4 s, doc_check 0.4 s, context 0.3 s, model_review 722.6 s, config: defaults + host + repository (.werkrevisor.toml at main e44836d).
Reviewed head `95d40fe3eaf6e26ef1f3bdf910c4e78f45984e69` against base `e44836d6a0db073aa6b58248a7d3c96317721f29`, werkrevisor 0.60.1.

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-draft-review.svg

<!-- werkrevisor:95d40fe3eaf6e26ef1f3bdf910c4e78f45984e69 --> <!-- werkrevisor-verdict:YELLOW --> <!-- werkrevisor-blocks:11c5ba2e6ff518cfc3b0534adbd29112,cb5b8257fdb65eb15fc14116ca016e88,65bc154317865bd400fbc19f5ed6302d,389819b5c43c0946f078a57cb1e4727f,c0344b80b7f7e804f1a95f277e22b871,999ba91e9df98067fc5a6956d09d4488,581051c710db376beeb73d037ba07e84,149b50cd9d79b3471cc63b222d6c8b02,55ae6deb45a82cb6dca141952a280ac3 --> <!-- werkrevisor:diagrams --> <!-- werkrevisor-folded --> <details><summary>🟡 werkrevisor YELLOW for <code>95d40fe</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/132#issuecomment-7130">the result for <code>6c53bb1</code></a></summary> ## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW Change kind: `mixed`. ### Reasons - **YELLOW** changes that touch security according to Jev: werkrevisor/draftreview.py (weakens checks 0.04, security 0.95) - **hint** 4 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** 8 changed file(s) agree with the PR document according to Jev - **hint** the model review failed: TimeoutError: review exceeded 720 seconds (advisory: Jev judged every changed file) ### Classifier 8 of 8 units passed all questions (1 PR document(s)). 1 answer ignored because of a confidence below [classifier] min_confidence. <sub> Usage: model `openrouter/minimax/minimax-m3`, LLM failed (TimeoutError), tokens counted before the call 25655, duration 724.7 s, cost unknown, classifier `jev-1.14.0` calls 8, tokens in 6776, cost 0.0003 USD, PR document check `jev-1.14.0` calls 8, tokens in 25290, cost 0.0011 USD, build file judge `jev-1.14.0` calls 6, tokens in 8821, cost 0.0004 USD, phases: path_judge 0.4 s, classifier 0.4 s, doc_check 0.4 s, context 0.3 s, model_review 722.6 s, config: defaults + host + repository (.werkrevisor.toml at main e44836d).<br> Reviewed head `95d40fe3eaf6e26ef1f3bdf910c4e78f45984e69` against base `e44836d6a0db073aa6b58248a7d3c96317721f29`, werkrevisor 0.60.1. </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/0bc5f4f8-63c0-49fb-940f-304440b03eb4) ![pr-lens-flow-draft-review.svg](https://git.javagil.de/attachments/378c12ed-4499-4285-84d9-45c0d3ac3a4d) </details>
mi approved these changes 2026-10-23 08:38:08 +02:00
Dismissed
ai-reviewer left a comment
Collaborator

Codex review of 95d40fe3eaf6e26ef1f3bdf910c4e78f45984e69

Codex review of `95d40fe3eaf6e26ef1f3bdf910c4e78f45984e69` <!-- werkrevisor-codex -->
@@ -0,0 +118,4 @@
f.write(f'<meta http-equiv="Content-Security-Policy" content="{CONTENT_SECURITY_POLICY}">\n')
try:
# markdown-raw_html: HTML in the draft, e.g. a <script> quoted in a finding, stays text.
run(["pandoc", report, "--from", "markdown-raw_html", "--standalone", "--metadata", f"title={title}",
Collaborator

[high] Pandoc metadata can inject scripts before the security policy (Codex review)

markdown-raw_html still enables YAML metadata and raw attributes. A finding containing a YAML block with css: 'x" /><script>alert(1)</script><link x="{=html}' produces an executable script in the HTML head before the CSP meta tag, where the policy cannot block it. Reproduced with the actual report composer and Pandoc 3.7.0.2. PR-controlled content copied into a finding can therefore execute JavaScript when the human opens report.html.

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

**[high] Pandoc metadata can inject scripts before the security policy** (Codex review) `markdown-raw_html` still enables YAML metadata and raw attributes. A finding containing a YAML block with css: '`x" /><script>alert(1)</script><link x="`{=html}' produces an executable script in the HTML head before the CSP meta tag, where the policy cannot block it. Reproduced with the actual report composer and Pandoc 3.7.0.2. PR-controlled content copied into a finding can therefore execute JavaScript when the human opens report.html. Fix it, or reply why it does not hold, and resolve this comment. <!-- werkrevisor-codex -->
Author
Collaborator

Fixed in 6c53bb1: pandoc reads markdown_strict-raw_html+pipe_tables, which has no YAML metadata block, no raw attribute and no raw HTML (gfm and commonmark kept inline HTML despite -raw_html). An own template puts the Content Security Policy first into the head and takes only the body and our title. Links with javascript:, vbscript: or data: lead to #blocked-…. Red/green with pandoc 3.7.0.2 and both payloads of these comments through compose and write_html: before 3 scripts, 2 in the head before the policy; after 0 scripts and 0 script links. test_a_draft_cannot_inject_a_script_with_pandoc runs the real pandoc where it is installed.

Fixed in `6c53bb1`: pandoc reads `markdown_strict-raw_html+pipe_tables`, which has no YAML metadata block, no raw attribute and no raw HTML (gfm and commonmark kept inline HTML despite `-raw_html`). An own template puts the Content Security Policy first into the head and takes only the body and our title. Links with `javascript:`, `vbscript:` or `data:` lead to `#blocked-…`. Red/green with pandoc 3.7.0.2 and both payloads of these comments through `compose` and `write_html`: before 3 scripts, 2 in the head before the policy; after 0 scripts and 0 script links. `test_a_draft_cannot_inject_a_script_with_pandoc` runs the real pandoc where it is installed.
claude-code marked this conversation as resolved
Collaborator
⚠️ werkrevisor ERROR for ?, superseded by the result for 6c53bb1

Codex review: critical

The change selects Gitea credentials and renders PR-influenced model output as browser content. Mistakes in these trust boundaries can expose credentials or execute attacker-controlled scripts.

Findings

  1. [high] Pandoc metadata can inject scripts before the security policy at werkrevisor/draftreview.py:121, 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 354477 (cached 301312) / out 2637, 102.1 s, 10 commands; reviewed head `95d40fe3eaf6e26ef1f3bdf910c4e78f45984e69`.
<!-- werkrevisor-codex:95d40fe3eaf6e26ef1f3bdf910c4e78f45984e69 --> <!-- werkrevisor-codex-critical:true --> <!-- werkrevisor-codex-unattached:0 --> <!-- werkrevisor-codex --> <!-- werkrevisor-folded --> <details><summary>⚠️ werkrevisor ERROR for <code>?</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/132#issuecomment-7130">the result for <code>6c53bb1</code></a></summary> ## Codex review: critical The change selects Gitea credentials and renders PR-influenced model output as browser content. Mistakes in these trust boundaries can expose credentials or execute attacker-controlled scripts. ### Findings 1. **[high] Pandoc metadata can inject scripts before the security policy** at `werkrevisor/draftreview.py:121`, 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 354477 (cached 301312) / out 2637, 102.1 s, 10 commands; reviewed head `95d40fe3eaf6e26ef1f3bdf910c4e78f45984e69`. </sub> </details>
mi approved these changes 2026-10-23 08:40:10 +02:00
Dismissed
claude-code added 1 commit 2026-10-23 08:42:48 +02:00
report.html: strict Markdown without raw HTML, an own template with the policy first, script links defused
werkator build succeeded after 00:13
werkator/werkrevisor-statistics build succeeded after 00:28
ai-review/assessment human review required; a human approval unlocks the merge; review requested from mi; merge already scheduled
ai-review/gate build succeeded after 12:26
ai-review/codex Codex review: a human approval of the head unlocks the merge
6c53bb1714
pandoc's Markdown let a YAML block or a raw attribute in a finding put a script into the head before the policy;
gfm and commonmark kept inline HTML despite -raw_html. Found by the Codex review of cf1f13c (line comments 7117, 7122).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude-code dismissed mi's review 2026-10-23 08:42:49 +02:00
Reason:

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

Collaborator
🟡 werkrevisor YELLOW for 6c53bb1, superseded by the result for 6d772b5

🟡 werkrevisor: YELLOW / HUMAN_REVIEW

Change kind: mixed.

Reasons

  • YELLOW tests lost or disabled: tests/test_draftreview.py:148 disables a test
  • YELLOW changes that touch security according to Jev: werkrevisor/draftreview.py (weakens checks 0.04, security 0.95)
  • hint writing rules violated in the changed docs: docs/prs/2026-10-23-PR#132-draft-review.md💯 line longer than 128 characters (139)
  • hint 4 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 8 changed file(s) agree with the PR document according to Jev
  • hint the model review failed: TimeoutError: review exceeded 720 seconds (advisory: Jev judged every changed file)

Classifier

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

Usage: model `openrouter/minimax/minimax-m3`, LLM failed (TimeoutError), tokens counted before the call 27712, duration 724.7 s, cost unknown, classifier `jev-1.14.0` calls 8, tokens in 6860, cost 0.0003 USD, PR document check `jev-1.14.0` calls 8, tokens in 27888, cost 0.0012 USD, build file judge `jev-1.14.0` calls 6, tokens in 9643, cost 0.0004 USD, phases: path_judge 0.4 s, classifier 0.4 s, doc_check 0.4 s, context 0.2 s, model_review 722.6 s, config: defaults + host + repository (.werkrevisor.toml at main e44836d).
Reviewed head `6c53bb171479ee97e7a384a7666f15a41de32edb` against base `e44836d6a0db073aa6b58248a7d3c96317721f29`, werkrevisor 0.60.1.

Diagrams

Drawn by a model from the diff with PR Lens: a view of what the PR touches, not a statement of what it does.

pr-lens-v-containers.svg

pr-lens-v-flow.svg

<!-- werkrevisor:6c53bb171479ee97e7a384a7666f15a41de32edb --> <!-- werkrevisor-verdict:YELLOW --> <!-- werkrevisor-blocks:11c5ba2e6ff518cfc3b0534adbd29112,34325acbe6245e1597cc0bb1dae84745,65bc154317865bd400fbc19f5ed6302d,389819b5c43c0946f078a57cb1e4727f,c6ee8f0ae62f266726ff57acde02e67b,999ba91e9df98067fc5a6956d09d4488,581051c710db376beeb73d037ba07e84,655da247ff87733781e86b9914a2aff8,55ae6deb45a82cb6dca141952a280ac3 --> <!-- werkrevisor:diagrams --> <!-- werkrevisor-folded --> <details><summary>🟡 werkrevisor YELLOW for <code>6c53bb1</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/132#issuecomment-7137">the result for <code>6d772b5</code></a></summary> ## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW Change kind: `mixed`. ### Reasons - **YELLOW** tests lost or disabled: tests/test_draftreview.py:148 disables a test - **YELLOW** changes that touch security according to Jev: werkrevisor/draftreview.py (weakens checks 0.04, security 0.95) - **hint** writing rules violated in the changed docs: docs/prs/2026-10-23-PR#132-draft-review.md:100: line longer than 128 characters (139) - **hint** 4 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** 8 changed file(s) agree with the PR document according to Jev - **hint** the model review failed: TimeoutError: review exceeded 720 seconds (advisory: Jev judged every changed file) ### Classifier 8 of 8 units passed all questions (1 PR document(s)). 1 answer ignored because of a confidence below [classifier] min_confidence. <sub> Usage: model `openrouter/minimax/minimax-m3`, LLM failed (TimeoutError), tokens counted before the call 27712, duration 724.7 s, cost unknown, classifier `jev-1.14.0` calls 8, tokens in 6860, cost 0.0003 USD, PR document check `jev-1.14.0` calls 8, tokens in 27888, cost 0.0012 USD, build file judge `jev-1.14.0` calls 6, tokens in 9643, cost 0.0004 USD, phases: path_judge 0.4 s, classifier 0.4 s, doc_check 0.4 s, context 0.2 s, model_review 722.6 s, config: defaults + host + repository (.werkrevisor.toml at main e44836d).<br> Reviewed head `6c53bb171479ee97e7a384a7666f15a41de32edb` against base `e44836d6a0db073aa6b58248a7d3c96317721f29`, werkrevisor 0.60.1. </sub> ### Diagrams Drawn by a model from the diff with [PR Lens](https://github.com/coldteadotai/pr-lens): a view of what the PR touches, not a statement of what it does. ![pr-lens-v-containers.svg](https://git.javagil.de/attachments/671c4f64-db67-4236-a207-baf382e7ead6) ![pr-lens-v-flow.svg](https://git.javagil.de/attachments/91118fa4-c508-4b8d-98ed-95b2adb52881) </details>
ai-reviewer left a comment
Collaborator

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

werkrevisor: YELLOW / HUMAN_REVIEW for `6c53bb171479ee97e7a384a7666f15a41de32edb`. The result comment of werkrevisor holds the details. <!-- werkrevisor-review:6c53bb171479ee97e7a384a7666f15a41de32edb -->
@@ -0,0 +97,4 @@
read the secrets file, pass the read token, or the write token for `--attach`, to `tools/review-report`,
print the summary line and write `report.html` with pandoc.
- `report.html` is strict Markdown without raw HTML, plus tables (`--from markdown_strict-raw_html+pipe_tables`):
no raw HTML, no YAML metadata block, no raw attribute; an own template puts a Content Security Policy without scripts first into the head
Collaborator

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

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

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

Fixed in 6d772b5: the line is wrapped after the semicolon.

Fixed in `6d772b5`: the line is wrapped after the semicolon.
claude-code marked this conversation as resolved
ai-reviewer requested review from mi 2026-10-23 08:54:59 +02:00
Collaborator
⚠️ werkrevisor ERROR for ?, superseded by the result for 6d772b5

Codex review: critical

The change selects read/write credentials for Gitea requests and introduces HTML rendering of PR-derived model output. Mistakes at these boundaries could expose credentials or execute attacker-controlled content, so human review is required.

No findings.

The merge waits for the status ai-review/codex: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here.

Model `gpt-6-astra`, effort high, tokens in 318431 (cached 279296) / out 2643, 117.3 s, 15 commands; reviewed head `6c53bb171479ee97e7a384a7666f15a41de32edb`.
<!-- werkrevisor-codex:6c53bb171479ee97e7a384a7666f15a41de32edb --> <!-- werkrevisor-codex-critical:true --> <!-- werkrevisor-codex-unattached:0 --> <!-- werkrevisor-codex --> <!-- werkrevisor-folded --> <details><summary>⚠️ werkrevisor ERROR for <code>?</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/132#issuecomment-7137">the result for <code>6d772b5</code></a></summary> ## Codex review: critical The change selects read/write credentials for Gitea requests and introduces HTML rendering of PR-derived model output. Mistakes at these boundaries could expose credentials or execute attacker-controlled content, so human review is required. No findings. The merge waits for the status `ai-review/codex`: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here. <sub> Model `gpt-6-astra`, effort high, tokens in 318431 (cached 279296) / out 2643, 117.3 s, 15 commands; reviewed head `6c53bb171479ee97e7a384a7666f15a41de32edb`. </sub> </details>
claude-code added 1 commit 2026-10-23 09:14:58 +02:00
Lines of at most 128 characters in the PR document and draftreview.py
ai-review/codex Codex review: a human approval of the head unlocks the merge
werkator build succeeded after 00:14
werkator/werkrevisor-statistics build succeeded after 00:30
ai-review/assessment human review required; a human approval unlocks the merge; a human review request is pending; merge already scheduled
ai-review/gate build succeeded after 03:38
6d772b5baf
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Collaborator
🟡 werkrevisor YELLOW for 6d772b5, superseded by the result for 20000b2

🟡 werkrevisor: YELLOW / HUMAN_REVIEW

Change kind: mixed.

Reasons

  • YELLOW tests lost or disabled: tests/test_draftreview.py:148 disables a test
  • YELLOW changes that touch security according to Jev: werkrevisor/draftreview.py (weakens checks 0.04, security 0.95)
  • hint 4 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 8 changed file(s) agree with the PR document according to Jev
  • hint 1 finding(s) of low severity or rated minor by Jev: werkrevisor/draftreview.py:168-170

Findings

  1. Dead code in error message at werkrevisor/draftreview.py:168-170, severity unknown, counted as medium, hint, as a line comment

Classifier

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

Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 27726, calls 1, tokens in 26700 / out 25563 (reasoning included in out), duration 193.6 s, cost 0.0387 USD (reported), classifier `jev-1.14.0` calls 8, tokens in 6861, cost 0.0003 USD, finding judge `jev-1.14.0` calls 1, tokens in 1720, cost 0.0001 USD, PR document check `jev-1.14.0` calls 8, tokens in 27900, cost 0.0012 USD, build file judge `jev-1.14.0` calls 6, tokens in 9647, cost 0.0004 USD, phases: path_judge 0.6 s, classifier 0.6 s, doc_check 0.4 s, context 0.2 s, model_review 190.9 s, finding_judge 0.1 s, config: defaults + host + repository (.werkrevisor.toml at main e44836d).
Reviewed head `6d772b5baf66dc54a99947024753a4a06523eaad` against base `e44836d6a0db073aa6b58248a7d3c96317721f29`, werkrevisor 0.60.1.

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-draft-review.svg

<!-- werkrevisor:6d772b5baf66dc54a99947024753a4a06523eaad --> <!-- werkrevisor-verdict:YELLOW --> <!-- werkrevisor-blocks:11c5ba2e6ff518cfc3b0534adbd29112,1561df7e0d95b3021d59bc12f0e65b96,65bc154317865bd400fbc19f5ed6302d,389819b5c43c0946f078a57cb1e4727f,c6ee8f0ae62f266726ff57acde02e67b,999ba91e9df98067fc5a6956d09d4488,581051c710db376beeb73d037ba07e84,797d26f63016ac20ff48a6b4796efff1,55ae6deb45a82cb6dca141952a280ac3 --> <!-- werkrevisor:diagrams --> <!-- werkrevisor-folded --> <details><summary>🟡 werkrevisor YELLOW for <code>6d772b5</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/132#issuecomment-7143">the result for <code>20000b2</code></a></summary> ## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW Change kind: `mixed`. ### Reasons - **YELLOW** tests lost or disabled: tests/test_draftreview.py:148 disables a test - **YELLOW** changes that touch security according to Jev: werkrevisor/draftreview.py (weakens checks 0.04, security 0.95) - **hint** 4 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** 8 changed file(s) agree with the PR document according to Jev - **hint** 1 finding(s) of low severity or rated minor by Jev: werkrevisor/draftreview.py:168-170 ### Findings 1. **Dead code in error message** at `werkrevisor/draftreview.py:168-170`, severity unknown, counted as medium, hint, as a line comment ### Classifier 8 of 8 units passed all questions (1 PR document(s)). 1 answer ignored because of a confidence below [classifier] min_confidence. <sub> Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 27726, calls 1, tokens in 26700 / out 25563 (reasoning included in out), duration 193.6 s, cost 0.0387 USD (reported), classifier `jev-1.14.0` calls 8, tokens in 6861, cost 0.0003 USD, finding judge `jev-1.14.0` calls 1, tokens in 1720, cost 0.0001 USD, PR document check `jev-1.14.0` calls 8, tokens in 27900, cost 0.0012 USD, build file judge `jev-1.14.0` calls 6, tokens in 9647, cost 0.0004 USD, phases: path_judge 0.6 s, classifier 0.6 s, doc_check 0.4 s, context 0.2 s, model_review 190.9 s, finding_judge 0.1 s, config: defaults + host + repository (.werkrevisor.toml at main e44836d).<br> Reviewed head `6d772b5baf66dc54a99947024753a4a06523eaad` against base `e44836d6a0db073aa6b58248a7d3c96317721f29`, werkrevisor 0.60.1. </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/d7549a44-8505-4488-b763-2afbbce53c64) ![pr-lens-flow-draft-review.svg](https://git.javagil.de/attachments/5f958a0d-45ac-40f2-a228-c2110ad4c0ca) </details>
ai-reviewer left a comment
Collaborator

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

werkrevisor: YELLOW / HUMAN_REVIEW for `6d772b5baf66dc54a99947024753a4a06523eaad`. The result comment of werkrevisor holds the details. <!-- werkrevisor-review:6d772b5baf66dc54a99947024753a4a06523eaad -->
@@ -0,0 +165,4 @@
env = {**environ, **(read_secrets(settings["secrets"]) if settings.get("secrets") else {})}
# Only --attach writes to Gitea, so only it gets the token that may write.
name = settings.get("write_token_variable") if args.attach else settings["read_token_variable"]
if not name or not env.get(name):
Collaborator

Dead code in error message, severity unknown, counted as medium (werkrevisor)

hint; Jev: real 0.50, severity 1.0 of 3

The error message at the token check contains a dead or 'write_token_variable' fallback. The conditional f"... is not set" if name else "--attach needs write_token_variable in the local config" is only evaluated when name is truthy, so {name or 'write_token_variable'} always resolves to {name}. The error messages are correct, but the fallback clause is unreachable and just adds noise.

**Dead code in error message**, severity unknown, counted as medium (werkrevisor) hint; Jev: real 0.50, severity 1.0 of 3 The error message at the token check contains a dead `or 'write_token_variable'` fallback. The conditional `f"... is not set" if name else "--attach needs write_token_variable in the local config"` is only evaluated when `name` is truthy, so `{name or 'write_token_variable'}` always resolves to `{name}`. The error messages are correct, but the fallback clause is unreachable and just adds noise.
Author
Collaborator

Fixed in 20000b2: two plain checks, one for a missing write_token_variable and one for an unset token.

Fixed in `20000b2`: two plain checks, one for a missing `write_token_variable` and one for an unset token.
claude-code marked this conversation as resolved
claude-code added 1 commit 2026-10-23 09:19:22 +02:00
draft-review: two plain checks for a missing write token instead of a fallback that is never reached
werkator build succeeded after 00:13
werkator/werkrevisor-statistics build succeeded after 00:30
ai-review/assessment human review required; a human approval unlocks the merge; a human review request is pending; merge already scheduled
ai-review/gate build succeeded after 12:54
ai-review/codex Codex review passed
20000b2da4
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Collaborator
⚠️ werkrevisor ERROR for ?, superseded by the result for 20000b2

Codex review: critical

The change introduces credential selection and host restrictions for authenticated requests, plus HTML rendering of untrusted model output. Mistakes in these security boundaries could expose credentials or execute injected content, so human review is required.

No findings.

The merge waits for the status ai-review/codex: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here.

Model `gpt-6-astra`, effort high, tokens in 417518 (cached 360192) / out 2198, 101.3 s, 13 commands; reviewed head `6d772b5baf66dc54a99947024753a4a06523eaad`.
<!-- werkrevisor-codex:6d772b5baf66dc54a99947024753a4a06523eaad --> <!-- werkrevisor-codex-critical:true --> <!-- werkrevisor-codex-unattached:0 --> <!-- werkrevisor-codex --> <!-- werkrevisor-folded --> <details><summary>⚠️ werkrevisor ERROR for <code>?</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/132#issuecomment-7143">the result for <code>20000b2</code></a></summary> ## Codex review: critical The change introduces credential selection and host restrictions for authenticated requests, plus HTML rendering of untrusted model output. Mistakes in these security boundaries could expose credentials or execute injected content, so human review is required. No findings. The merge waits for the status `ai-review/codex`: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here. <sub> Model `gpt-6-astra`, effort high, tokens in 417518 (cached 360192) / out 2198, 101.3 s, 13 commands; reviewed head `6d772b5baf66dc54a99947024753a4a06523eaad`. </sub> </details>
Collaborator

🟡 werkrevisor: YELLOW / HUMAN_REVIEW

Change kind: mixed.

Reasons

  • YELLOW tests lost or disabled: tests/test_draftreview.py:148 disables a test
  • YELLOW changes that touch security according to Jev: werkrevisor/draftreview.py (weakens checks 0.04, security 0.95)
  • hint 4 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 8 changed file(s) agree with the PR document according to Jev
  • hint the model review failed: TimeoutError: review exceeded 720 seconds (advisory: Jev judged every changed file)

Classifier

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

Usage: model `openrouter/minimax/minimax-m3`, LLM failed (TimeoutError), tokens counted before the call 27728, duration 724.7 s, cost unknown, classifier `jev-1.14.0` calls 8, tokens in 6861, cost 0.0003 USD, PR document check `jev-1.14.0` calls 8, tokens in 27901, cost 0.0012 USD, build file judge `jev-1.14.0` calls 6, tokens in 9648, cost 0.0004 USD, phases: path_judge 0.3 s, classifier 0.4 s, doc_check 0.4 s, context 0.3 s, model_review 722.6 s, config: defaults + host + repository (.werkrevisor.toml at main e44836d).
Reviewed head `20000b2da494646b5db165b35a26d2eb7a3cce1e` against base `e44836d6a0db073aa6b58248a7d3c96317721f29`, werkrevisor 0.60.1.

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-flow-view.svg

<!-- werkrevisor:20000b2da494646b5db165b35a26d2eb7a3cce1e --> <!-- werkrevisor-verdict:YELLOW --> <!-- werkrevisor-blocks:11c5ba2e6ff518cfc3b0534adbd29112,1561df7e0d95b3021d59bc12f0e65b96,65bc154317865bd400fbc19f5ed6302d,389819b5c43c0946f078a57cb1e4727f,c6ee8f0ae62f266726ff57acde02e67b,999ba91e9df98067fc5a6956d09d4488,581051c710db376beeb73d037ba07e84,4478c842647213dce6130b50a20a24eb,55ae6deb45a82cb6dca141952a280ac3 --> ## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW Change kind: `mixed`. ### Reasons - **YELLOW** tests lost or disabled: tests/test_draftreview.py:148 disables a test - **YELLOW** changes that touch security according to Jev: werkrevisor/draftreview.py (weakens checks 0.04, security 0.95) - **hint** 4 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** 8 changed file(s) agree with the PR document according to Jev - **hint** the model review failed: TimeoutError: review exceeded 720 seconds (advisory: Jev judged every changed file) ### Classifier 8 of 8 units passed all questions (1 PR document(s)). 1 answer ignored because of a confidence below [classifier] min_confidence. <sub> Usage: model `openrouter/minimax/minimax-m3`, LLM failed (TimeoutError), tokens counted before the call 27728, duration 724.7 s, cost unknown, classifier `jev-1.14.0` calls 8, tokens in 6861, cost 0.0003 USD, PR document check `jev-1.14.0` calls 8, tokens in 27901, cost 0.0012 USD, build file judge `jev-1.14.0` calls 6, tokens in 9648, cost 0.0004 USD, phases: path_judge 0.3 s, classifier 0.4 s, doc_check 0.4 s, context 0.3 s, model_review 722.6 s, config: defaults + host + repository (.werkrevisor.toml at main e44836d).<br> Reviewed head `20000b2da494646b5db165b35a26d2eb7a3cce1e` against base `e44836d6a0db073aa6b58248a7d3c96317721f29`, werkrevisor 0.60.1. </sub> <!-- werkrevisor:diagrams --> ### Diagrams Drawn by a model from the diff with [PR Lens](https://github.com/coldteadotai/pr-lens): a view of what the PR touches, not a statement of what it does. ![pr-lens-containers.svg](https://git.javagil.de/attachments/ba202a27-e786-4a87-a34f-5e03ffd7132a) ![pr-lens-flow-view.svg](https://git.javagil.de/attachments/8dde13ef-a5f4-46e1-a27e-e5cb852ae4af)
Collaborator

Codex review: critical

The change introduces read/write token selection and host restrictions, and renders untrusted model output as HTML. Mistakes in these security boundaries could expose credentials or execute injected browser content, so human review is required.

No findings.

The merge waits for the status ai-review/codex: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here.

Model `gpt-6-astra`, effort high, tokens in 314966 (cached 261760) / out 2070, 111.4 s, 7 commands; reviewed head `20000b2da494646b5db165b35a26d2eb7a3cce1e`.
<!-- werkrevisor-codex:20000b2da494646b5db165b35a26d2eb7a3cce1e --> <!-- werkrevisor-codex-critical:true --> <!-- werkrevisor-codex-unattached:0 --> <!-- werkrevisor-codex --> ## Codex review: critical The change introduces read/write token selection and host restrictions, and renders untrusted model output as HTML. Mistakes in these security boundaries could expose credentials or execute injected browser content, so human review is required. No findings. The merge waits for the status `ai-review/codex`: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here. <sub> Model `gpt-6-astra`, effort high, tokens in 314966 (cached 261760) / out 2070, 111.4 s, 7 commands; reviewed head `20000b2da494646b5db165b35a26d2eb7a3cce1e`. </sub>
mi approved these changes 2026-10-23 10:14:39 +02:00
ai-reviewer merged commit bcab9fac7d into main 2026-10-23 10:15:09 +02:00
ai-reviewer deleted branch claude-code/draft-review 2026-10-23 10:15:09 +02:00
Sign in to join this conversation.
No Reviewers
No labels
3 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: mi/werkrevisor#132