See [docs/prs/2026-10-06-PR#29-wider-context.md](docs/prs/2026-10-06-PR%2329-wider-context.md).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
claude-code
changed title from WIP: werkrevisor 0.19.2: larger full files and a wider diff context instead of YELLOW to werkrevisor 0.19.2: larger full files, excerpts instead of YELLOW for files beyond the limits2026-10-06 13:38:32 +02:00
Full files up to 80000 characters; a larger file goes as excerpt with 40 lines around each change, which is a hint.
PR-Agent caps its own diff context at 10 lines, so werkrevisor builds the excerpt itself.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
RED the changed .werkrevisor.toml is invalid: .werkrevisor.toml: [review] max_full_file_chars = 80000 exceeds the host value 40000; the repository config may only lower it; after the merge every review would end with ERROR
hint 1 build change(s) of low risk according to Jev: server/build.gradle.kts (weakens checks 0.02, risk 0.00)
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/anthropic/claude-sonnet-5.5`, LLM skipped (invalid .werkrevisor.toml), duration 1.0 s, no model call, cost 0 USD, classifier `jev-1.13.0` calls 7, tokens in 5840, cost 0.0002 USD, build file judge `jev-1.13.0` calls 1, tokens in 560, cost 0.0000 USD, config: defaults + host + repository (.werkrevisor.toml at base f585223).
Reviewed head `4a3313a84bc192aa8b0a12151663dd60783b18a4` against base `f5852232e0b7cd9959c922c9ef081d90c029daf3`, werkrevisor 0.19.0.
<!-- werkrevisor:4a3313a84bc192aa8b0a12151663dd60783b18a4 -->
<!-- werkrevisor-verdict:RED -->
<!-- werkrevisor-folded -->
<details><summary>🔴 werkrevisor RED for <code>4a3313a</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/29#issuecomment-1270">the result for <code>09de937</code></a></summary>
## 🔴 werkrevisor: RED / CHANGES_REQUIRED
Change kind: `mixed`.
### Reasons
- **RED** the changed .werkrevisor.toml is invalid: .werkrevisor.toml: [review] max_full_file_chars = 80000 exceeds the host value 40000; the repository config may only lower it; after the merge every review would end with ERROR
- **YELLOW** risky paths changed: .werkrevisor.toml (built in), werkrevisor/config.py (werkrevisor/config.py)
- **hint** 1 build change(s) of low risk according to Jev: server/build.gradle.kts (weakens checks 0.02, risk 0.00)
### 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/anthropic/claude-sonnet-5.5`, LLM skipped (invalid .werkrevisor.toml), duration 1.0 s, no model call, cost 0 USD, classifier `jev-1.13.0` calls 7, tokens in 5840, cost 0.0002 USD, build file judge `jev-1.13.0` calls 1, tokens in 560, cost 0.0000 USD, config: defaults + host + repository (.werkrevisor.toml at base f585223).<br>
Reviewed head `4a3313a84bc192aa8b0a12151663dd60783b18a4` against base `f5852232e0b7cd9959c922c9ef081d90c029daf3`, werkrevisor 0.19.0.
</sub>
</details>
werkrevisor: RED / CHANGES_REQUIRED for 4a3313a84bc192aa8b0a12151663dd60783b18a4.
the changed .werkrevisor.toml is invalid: .werkrevisor.toml: [review] max_full_file_chars = 80000 exceeds the host value 40000; the repository config may only lower it; after the merge every review would end with ERROR
The result comment of werkrevisor holds the details.
werkrevisor: RED / CHANGES_REQUIRED for `4a3313a84bc192aa8b0a12151663dd60783b18a4`.
- the changed .werkrevisor.toml is invalid: .werkrevisor.toml: [review] max_full_file_chars = 80000 exceeds the host value 40000; the repository config may only lower it; after the merge every review would end with ERROR
The result comment of werkrevisor holds the details.
<!-- werkrevisor-review:4a3313a84bc192aa8b0a12151663dd60783b18a4 -->
ai-review/assessment AI findings; a developer approval after checking them unlocks the merge; review requested from mi; merge scheduled for when the checks succeed
YELLOW 2 changed files were given to the AI only as diff, not in full, so it could not check them against the rest of their file (each larger than [review] max_full_file_chars = 40000): werkrevisor/cli.py, werkrevisor/config.py
hint 1 build change(s) of low risk according to Jev: server/build.gradle.kts (weakens checks 0.02, risk 0.00)
hint 2 finding(s) of low severity or rated minor by Jev: tests/test_config_layers.py:117, werkrevisor/fullfiles.py:110-118
hint model recommends merge with caution
Findings
[medium] Added lines beyond file end silently dropped at werkrevisor/fullfiles.py:40-52, ORANGE, as a line comment
[high] Weakened lower-only limit test at tests/test_config_layers.py:117, hint, as a line comment
[medium] Excerpt lines can exceed limits unchecked at werkrevisor/fullfiles.py:110-118, hint, 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/anthropic/claude-sonnet-5.5`, LLM done, tokens counted before the call 54723, calls 1, tokens in 53810 / out 782 (reasoning included in out), duration 15.1 s, cost 0.1154 USD (reported), classifier `jev-1.13.0` calls 7, tokens in 5865, cost 0.0002 USD, finding judge `jev-1.13.0` calls 3, tokens in 4846, cost 0.0002 USD, build file judge `jev-1.13.0` calls 1, tokens in 560, cost 0.0000 USD, config: defaults + host + repository (.werkrevisor.toml at base f585223).
Reviewed head `09de937810f23ea462d340b26e377b4c96b94fb0` against base `f5852232e0b7cd9959c922c9ef081d90c029daf3`, werkrevisor 0.19.0.
<!-- werkrevisor:09de937810f23ea462d340b26e377b4c96b94fb0 -->
<!-- werkrevisor-verdict:ORANGE -->
<!-- werkrevisor-folded -->
<details><summary>🟠 werkrevisor ORANGE for <code>09de937</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/29#issuecomment-1278">the result for <code>dcc7fbd</code></a></summary>
## 🟠 werkrevisor: ORANGE / FINDINGS
Change kind: `mixed`.
### Reasons
- **ORANGE** 1 finding(s) that Jev rates as probably real and severe: werkrevisor/fullfiles.py:40-52
- **YELLOW** risky paths changed: .werkrevisor.toml (built in), werkrevisor/config.py (werkrevisor/config.py)
- **YELLOW** 2 changed files were given to the AI only as diff, not in full, so it could not check them against the rest of their file (each larger than [review] max_full_file_chars = 40000): werkrevisor/cli.py, werkrevisor/config.py
- **hint** 1 build change(s) of low risk according to Jev: server/build.gradle.kts (weakens checks 0.02, risk 0.00)
- **hint** 2 finding(s) of low severity or rated minor by Jev: tests/test_config_layers.py:117, werkrevisor/fullfiles.py:110-118
- **hint** model recommends merge with caution
### Findings
1. **[medium] Added lines beyond file end silently dropped** at `werkrevisor/fullfiles.py:40-52`, ORANGE, as a line comment
2. **[high] Weakened lower-only limit test** at `tests/test_config_layers.py:117`, hint, as a line comment
3. **[medium] Excerpt lines can exceed limits unchecked** at `werkrevisor/fullfiles.py:110-118`, hint, 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/anthropic/claude-sonnet-5.5`, LLM done, tokens counted before the call 54723, calls 1, tokens in 53810 / out 782 (reasoning included in out), duration 15.1 s, cost 0.1154 USD (reported), classifier `jev-1.13.0` calls 7, tokens in 5865, cost 0.0002 USD, finding judge `jev-1.13.0` calls 3, tokens in 4846, cost 0.0002 USD, build file judge `jev-1.13.0` calls 1, tokens in 560, cost 0.0000 USD, config: defaults + host + repository (.werkrevisor.toml at base f585223).<br>
Reviewed head `09de937810f23ea462d340b26e377b4c96b94fb0` against base `f5852232e0b7cd9959c922c9ef081d90c029daf3`, werkrevisor 0.19.0.
</sub>
</details>
werkrevisor: ORANGE / FINDINGS for 09de937810f23ea462d340b26e377b4c96b94fb0.
The result comment of werkrevisor holds the details.
werkrevisor: ORANGE / FINDINGS for `09de937810f23ea462d340b26e377b4c96b94fb0`.
The result comment of werkrevisor holds the details.
<!-- werkrevisor-review:09de937810f23ea462d340b26e377b4c96b94fb0 -->
[high] Weakened lower-only limit test (werkrevisor)
hint; Jev: real 0.39, severity 2.0 of 3
The max_full_file_chars case now uses higher = 90000 against the host value 80000 in config/werkprobe.toml, so it checks only a small excess, and max_full_files_chars still uses a much larger one. The test still verifies that values above the host limit are refused, so it is not clearly weaker. However, the new excerpt_context_lines setting is host-only and has no test that a repository config cannot set it. Part of that contract is left unchecked. Uncertain: the host-only enforcement may be covered by a generic test not shown in the diff.
**[high] Weakened lower-only limit test** (werkrevisor)
hint; Jev: real 0.39, severity 2.0 of 3
The `max_full_file_chars` case now uses `higher = 90000` against the host value 80000 in `config/werkprobe.toml`, so it checks only a small excess, and `max_full_files_chars` still uses a much larger one. The test still verifies that values above the host limit are refused, so it is not clearly weaker. However, the new `excerpt_context_lines` setting is host-only and has no test that a repository config cannot set it. Part of that contract is left unchecked. Uncertain: the host-only enforcement may be covered by a generic test not shown in the diff.
[medium] Added lines beyond file end silently dropped (werkrevisor)
ORANGE; Jev: real 0.60, severity 2.7 of 3
excerpt_ranges skips changed lines where first > last (a line number past the end of the file). If every change is skipped, ranges is empty and the file goes only as diff, which is safe. The case where the diff and the fetched content differ is handled only by this silent skip. No test covers it.
**[medium] Added lines beyond file end silently dropped** (werkrevisor)
ORANGE; Jev: real 0.60, severity 2.7 of 3
`excerpt_ranges` skips changed lines where `first > last` (a line number past the end of the file). If every change is skipped, `ranges` is empty and the file goes only as diff, which is safe. The case where the diff and the fetched content differ is handled only by this silent skip. No test covers it.
[medium] Excerpt lines can exceed limits unchecked (werkrevisor)
hint; Jev: real 0.47, severity 2.2 of 3
In excerpt(), the size check uses total through closure while the caller later adds len(part). That is consistent. However, max_full_file_chars is compared with the excerpt, which is documented as a limit per rendered file. A file just over the limit with changes spread widely can produce an excerpt that is not smaller than the full file. The excerpt is then rejected, and excerpt_context_lines up to 500 makes this likely. That case is handled, so the main gap is a missing test for the over_total excerpt path.
**[medium] Excerpt lines can exceed limits unchecked** (werkrevisor)
hint; Jev: real 0.47, severity 2.2 of 3
In `excerpt()`, the size check uses `total` through closure while the caller later adds `len(part)`. That is consistent. However, `max_full_file_chars` is compared with the excerpt, which is documented as a limit per rendered file. A file just over the limit with changes spread widely can produce an excerpt that is not smaller than the full file. The excerpt is then rejected, and `excerpt_context_lines` up to 500 makes this likely. That case is handled, so the main gap is a missing test for the `over_total` excerpt path.
ai-reviewer
scheduled this pull request to auto merge when all checks succeed 2026-10-06 13:39:40 +02:00
ai-reviewer
requested review from mi 2026-10-06 13:39:40 +02:00
YELLOW 2 changed files were given to the AI only as diff, not in full, so it could not check them against the rest of their file (each larger than [review] max_full_file_chars = 40000): werkrevisor/cli.py, werkrevisor/config.py
YELLOW 1 finding(s) possibly severe, but Jev doubts that they are real: werkrevisor/fullfiles.py:115-123
hint 1 build change(s) of low risk according to Jev: server/build.gradle.kts (weakens checks 0.02, risk 0.00)
hint 1 finding(s) of low severity or rated minor by Jev: README.md:87-88
hint model recommends merge with caution
Findings
[medium] Excerpt line count ignores files with trailing text beyond splitlines at werkrevisor/fullfiles.py:115-123, YELLOW, as a line comment
[low] README example contradicts new limits at README.md:87-88, hint, 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/anthropic/claude-sonnet-5.5`, LLM done, tokens counted before the call 56216, calls 1, tokens in 55337 / out 577 (reasoning included in out), duration 11.6 s, cost 0.1164 USD (reported), classifier `jev-1.13.0` calls 7, tokens in 5865, cost 0.0002 USD, finding judge `jev-1.13.0` calls 1, tokens in 1619, cost 0.0001 USD, build file judge `jev-1.13.0` calls 1, tokens in 560, cost 0.0000 USD, config: defaults + host + repository (.werkrevisor.toml at base f585223).
Reviewed head `dcc7fbd80c2e0c8a9da332fa1182558a43404ccb` against base `f5852232e0b7cd9959c922c9ef081d90c029daf3`, werkrevisor 0.19.0.
<!-- werkrevisor:dcc7fbd80c2e0c8a9da332fa1182558a43404ccb -->
<!-- werkrevisor-verdict:YELLOW -->
<!-- werkrevisor-folded -->
<details><summary>🟡 werkrevisor YELLOW for <code>dcc7fbd</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/29#issuecomment-1284">the result for <code>4f6484b</code></a></summary>
## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind: `mixed`.
### Reasons
- **YELLOW** risky paths changed: .werkrevisor.toml (built in), werkrevisor/config.py (werkrevisor/config.py)
- **YELLOW** 2 changed files were given to the AI only as diff, not in full, so it could not check them against the rest of their file (each larger than [review] max_full_file_chars = 40000): werkrevisor/cli.py, werkrevisor/config.py
- **YELLOW** 1 finding(s) possibly severe, but Jev doubts that they are real: werkrevisor/fullfiles.py:115-123
- **hint** 1 build change(s) of low risk according to Jev: server/build.gradle.kts (weakens checks 0.02, risk 0.00)
- **hint** 1 finding(s) of low severity or rated minor by Jev: README.md:87-88
- **hint** model recommends merge with caution
### Findings
1. **[medium] Excerpt line count ignores files with trailing text beyond splitlines** at `werkrevisor/fullfiles.py:115-123`, YELLOW, as a line comment
2. **[low] README example contradicts new limits** at `README.md:87-88`, hint, 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/anthropic/claude-sonnet-5.5`, LLM done, tokens counted before the call 56216, calls 1, tokens in 55337 / out 577 (reasoning included in out), duration 11.6 s, cost 0.1164 USD (reported), classifier `jev-1.13.0` calls 7, tokens in 5865, cost 0.0002 USD, finding judge `jev-1.13.0` calls 1, tokens in 1619, cost 0.0001 USD, build file judge `jev-1.13.0` calls 1, tokens in 560, cost 0.0000 USD, config: defaults + host + repository (.werkrevisor.toml at base f585223).<br>
Reviewed head `dcc7fbd80c2e0c8a9da332fa1182558a43404ccb` against base `f5852232e0b7cd9959c922c9ef081d90c029daf3`, werkrevisor 0.19.0.
</sub>
</details>
werkrevisor: YELLOW / HUMAN_REVIEW for dcc7fbd80c2e0c8a9da332fa1182558a43404ccb.
The result comment of werkrevisor holds the details.
werkrevisor: YELLOW / HUMAN_REVIEW for `dcc7fbd80c2e0c8a9da332fa1182558a43404ccb`.
The result comment of werkrevisor holds the details.
<!-- werkrevisor-review:dcc7fbd80c2e0c8a9da332fa1182558a43404ccb -->
[low] README example contradicts new limits (werkrevisor)
hint
The README still shows the example reason with max_full_files_chars = 120000, while the default is now 160000. The comments in config/werkator.toml and config/werkprobe.toml also still say "120000 chars are about 34000 of the 100000 input tokens", which no longer matches the new limit of 160000.
**[low] README example contradicts new limits** (werkrevisor)
hint
The README still shows the example reason with `max_full_files_chars = 120000`, while the default is now 160000. The comments in `config/werkator.toml` and `config/werkprobe.toml` also still say "120000 chars are about 34000 of the 100000 input tokens", which no longer matches the new limit of 160000.
[medium] Excerpt line count ignores files with trailing text beyond splitlines (werkrevisor)
YELLOW; Jev: real 0.51, severity 2.6 of 3
The excerpt closure checks the per-file limit with len(part) > max_full_file_chars, but total is read from the enclosing scope at call time. That is fine. The bigger problem is that excerpt_ranges returns an empty list when a PR has no added or removed lines in the diff (e.g. a rename or mode change). if ranges is then falsy, so the file goes only as diff and gives YELLOW, which the PR document does not mention. Also, for a file of 1 line lines[i - 1] is safe, but ranges computed from a diff that does not match the head file raise no error because of the None check only for added lines. This is uncertain and limited to odd diffs.
**[medium] Excerpt line count ignores files with trailing text beyond splitlines** (werkrevisor)
YELLOW; Jev: real 0.51, severity 2.6 of 3
The `excerpt` closure checks the per-file limit with `len(part) > max_full_file_chars`, but `total` is read from the enclosing scope at call time. That is fine. The bigger problem is that `excerpt_ranges` returns an empty list when a PR has no added or removed lines in the diff (e.g. a rename or mode change). `if ranges` is then falsy, so the file goes only as diff and gives YELLOW, which the PR document does not mention. Also, for a file of 1 line `lines[i - 1]` is safe, but ranges computed from a `diff` that does not match the head file raise no error because of the `None` check only for added lines. This is uncertain and limited to odd diffs.
Assessment of the werkrevisor findings (as of the last commit):
Fixed:
RED, invalid .werkrevisor.toml: the installed 0.19.0 has the limit 40000, and a repository config may only lower it. .werkrevisor.toml no longer sets the limits; it inherits them from the host, so it is valid before and after the deployment.
fullfiles.py (ORANGE), changed lines beyond the end of the file: an added line beyond the end means the diff does not fit the file, so the file goes only as diff (YELLOW); a removed line at the end counts at the last line. Test added.
test_config_layers.py: excerpt_context_lines is tested as host only and validated.
README example and the comments in config/werkator.toml and config/werkprobe.toml follow the new limits.
Not changed:
fullfiles.py:115-123 (YELLOW, Jev doubts it), a too-large file without changed lines goes only as diff: intended and safe. A pure rename is already a mechanical file and skips the full files; a mode change of a file above 80000 characters without content change is rare, and YELLOW is the safe side.
The over_total path of the excerpt is tested in test_files_beyond_the_limits_go_as_excerpt_and_are_a_hint (subtest max_full_files_chars).
YELLOW cli.py and config.py only as diff: this review still runs with the installed 0.19.0 and its limit 40000; from 0.19.2 on, both files go in full (44901 and 42771 characters with line numbers).
YELLOW risky paths .werkrevisor.toml and werkrevisor/config.py: by design.
Deployment: right after the merge, the rootfs 0.19.2 and the Werkator machine configs of werkprobe and werkator with the new limits.
Assessment of the werkrevisor findings (as of the last commit):
Fixed:
- RED, invalid `.werkrevisor.toml`: the installed 0.19.0 has the limit 40000, and a repository config may only lower it. `.werkrevisor.toml` no longer sets the limits; it inherits them from the host, so it is valid before and after the deployment.
- `fullfiles.py` (ORANGE), changed lines beyond the end of the file: an added line beyond the end means the diff does not fit the file, so the file goes only as diff (YELLOW); a removed line at the end counts at the last line. Test added.
- `test_config_layers.py`: `excerpt_context_lines` is tested as host only and validated.
- README example and the comments in `config/werkator.toml` and `config/werkprobe.toml` follow the new limits.
Not changed:
- `fullfiles.py:115-123` (YELLOW, Jev doubts it), a too-large file without changed lines goes only as diff: intended and safe. A pure rename is already a mechanical file and skips the full files; a mode change of a file above 80000 characters without content change is rare, and YELLOW is the safe side.
- The `over_total` path of the excerpt is tested in `test_files_beyond_the_limits_go_as_excerpt_and_are_a_hint` (subtest `max_full_files_chars`).
- YELLOW `cli.py` and `config.py` only as diff: this review still runs with the installed 0.19.0 and its limit 40000; from 0.19.2 on, both files go in full (44901 and 42771 characters with line numbers).
- YELLOW risky paths `.werkrevisor.toml` and `werkrevisor/config.py`: by design.
Deployment: right after the merge, the rootfs 0.19.2 and the Werkator machine configs of werkprobe and werkator with the new limits.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
YELLOW 2 changed files were given to the AI only as diff, not in full, so it could not check them against the rest of their file (each larger than [review] max_full_file_chars = 40000): werkrevisor/cli.py, werkrevisor/config.py
hint 1 build change(s) of low risk according to Jev: server/build.gradle.kts (weakens checks 0.02, risk 0.00)
hint 3 finding(s) of low severity or rated minor by Jev: werkrevisor/fullfiles.py:115-123, werkrevisor/fullfiles.py:121, docs/prs/2026-10-06-PR#29-wider-context.md:1
hint model recommends changes before merge
Findings
[high] Excerpt can exceed the total limit at werkrevisor/fullfiles.py:115-123, hint, still open in an earlier line comment
[medium] Line exceeds 128 characters at werkrevisor/fullfiles.py:121, hint, as a line comment
[low] Title and document disagree with the code at docs/prs/2026-10-06-PR#29-wider-context.md:1, hint, 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/anthropic/claude-sonnet-5.5`, LLM done, tokens counted before the call 56510, calls 1, tokens in 55621 / out 708 (reasoning included in out), duration 11.9 s, cost 0.1183 USD (reported), classifier `jev-1.13.0` calls 7, tokens in 5865, cost 0.0002 USD, finding judge `jev-1.13.0` calls 2, tokens in 2926, cost 0.0001 USD, build file judge `jev-1.13.0` calls 1, tokens in 560, cost 0.0000 USD, config: defaults + host + repository (.werkrevisor.toml at base f585223).
Reviewed head `4f6484be06056f5c891f560fc56bb31141e39ce6` against base `f5852232e0b7cd9959c922c9ef081d90c029daf3`, werkrevisor 0.19.0.
<!-- werkrevisor:4f6484be06056f5c891f560fc56bb31141e39ce6 -->
<!-- werkrevisor-verdict:YELLOW -->
<!-- werkrevisor-folded -->
<details><summary>🟡 werkrevisor YELLOW for <code>4f6484b</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/29#issuecomment-1294">the result for <code>9cc201d</code></a></summary>
## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind: `mixed`.
### Reasons
- **YELLOW** risky paths changed: .werkrevisor.toml (built in), werkrevisor/config.py (werkrevisor/config.py)
- **YELLOW** 2 changed files were given to the AI only as diff, not in full, so it could not check them against the rest of their file (each larger than [review] max_full_file_chars = 40000): werkrevisor/cli.py, werkrevisor/config.py
- **hint** 1 build change(s) of low risk according to Jev: server/build.gradle.kts (weakens checks 0.02, risk 0.00)
- **hint** 3 finding(s) of low severity or rated minor by Jev: werkrevisor/fullfiles.py:115-123, werkrevisor/fullfiles.py:121, docs/prs/2026-10-06-PR#29-wider-context.md:1
- **hint** model recommends changes before merge
### Findings
1. **[high] Excerpt can exceed the total limit** at `werkrevisor/fullfiles.py:115-123`, hint, still open in [an earlier line comment](http://git.javagil.de/mi/werkrevisor/pulls/29#issuecomment-1279)
2. **[medium] Line exceeds 128 characters** at `werkrevisor/fullfiles.py:121`, hint, as a line comment
3. **[low] Title and document disagree with the code** at `docs/prs/2026-10-06-PR#29-wider-context.md:1`, hint, 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/anthropic/claude-sonnet-5.5`, LLM done, tokens counted before the call 56510, calls 1, tokens in 55621 / out 708 (reasoning included in out), duration 11.9 s, cost 0.1183 USD (reported), classifier `jev-1.13.0` calls 7, tokens in 5865, cost 0.0002 USD, finding judge `jev-1.13.0` calls 2, tokens in 2926, cost 0.0001 USD, build file judge `jev-1.13.0` calls 1, tokens in 560, cost 0.0000 USD, config: defaults + host + repository (.werkrevisor.toml at base f585223).<br>
Reviewed head `4f6484be06056f5c891f560fc56bb31141e39ce6` against base `f5852232e0b7cd9959c922c9ef081d90c029daf3`, werkrevisor 0.19.0.
</sub>
</details>
werkrevisor: YELLOW / HUMAN_REVIEW for 4f6484be06056f5c891f560fc56bb31141e39ce6.
The result comment of werkrevisor holds the details.
werkrevisor: YELLOW / HUMAN_REVIEW for `4f6484be06056f5c891f560fc56bb31141e39ce6`.
The result comment of werkrevisor holds the details.
<!-- werkrevisor-review:4f6484be06056f5c891f560fc56bb31141e39ce6 -->
[low] Title and document disagree with the code (werkrevisor)
hint
The title says "a wider diff context instead of YELLOW", but the code adds excerpts of the file and does not widen the diff. The Scenario#29.03 table also says "a file that is not UTF-8 text but is reviewable for PR-Agent", which the code does not check separately.
**[low] Title and document disagree with the code** (werkrevisor)
hint
The title says "a wider diff context instead of YELLOW", but the code adds excerpts of the file and does not widen the diff. The Scenario#29.03 table also says "a file that is not UTF-8 text but is reviewable for PR-Agent", which the code does not check separately.
[medium] Line exceeds 128 characters (werkrevisor)
hint; Jev: real 0.58, severity 0.9 of 3
The condition line in excerpt is about 135 characters long, which breaks the line-length convention of the Python code and hurts readability. Split the condition over several lines.
**[medium] Line exceeds 128 characters** (werkrevisor)
hint; Jev: real 0.58, severity 0.9 of 3
The condition line in `excerpt` is about 135 characters long, which breaks the line-length convention of the Python code and hurts readability. Split the condition over several lines.
YELLOW 2 changed files were given to the AI only as diff, not in full, so it could not check them against the rest of their file (each larger than [review] max_full_file_chars = 40000): werkrevisor/cli.py, werkrevisor/config.py
hint 1 build change(s) of low risk according to Jev: server/build.gradle.kts (weakens checks 0.02, risk 0.00)
hint 1 finding(s) of low severity or rated minor by Jev: werkrevisor/fullfiles.py:121
hint model recommends merge with caution
Findings
[medium] Excerpt of a changed file can silently miss deleted-only context and be marked GREEN at werkrevisor/fullfiles.py:40-57, ORANGE, still open in an earlier line comment
[low] Over-long line in excerpt helper at werkrevisor/fullfiles.py:121, hint, still open in an earlier 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/anthropic/claude-sonnet-5.5`, LLM done, tokens counted before the call 56513, calls 1, tokens in 55623 / out 619 (reasoning included in out), duration 31.9 s, cost 0.1174 USD (reported), classifier `jev-1.13.0` calls 7, tokens in 5865, cost 0.0002 USD, finding judge `jev-1.13.0` calls 1, tokens in 1715, cost 0.0001 USD, build file judge `jev-1.13.0` calls 1, tokens in 560, cost 0.0000 USD, config: defaults + host + repository (.werkrevisor.toml at base e95f148).
Reviewed head `9cc201d65c8a17aa021e3c99c442b5eb6815f509` against base `e95f148df8dc7cadc14f8cf268617deb3b9b5a9d`, werkrevisor 0.19.1.
<!-- werkrevisor:9cc201d65c8a17aa021e3c99c442b5eb6815f509 -->
<!-- werkrevisor-verdict:ORANGE -->
<!-- werkrevisor-folded -->
<details><summary>🟠 werkrevisor ORANGE for <code>9cc201d</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/29#issuecomment-1297">the result for <code>eb3d4cc</code></a></summary>
## 🟠 werkrevisor: ORANGE / FINDINGS
Change kind: `mixed`.
### Reasons
- **ORANGE** 1 finding(s) that Jev rates as probably real and severe: werkrevisor/fullfiles.py:40-57
- **YELLOW** risky paths changed: .werkrevisor.toml (built in), werkrevisor/config.py (werkrevisor/config.py)
- **YELLOW** 2 changed files were given to the AI only as diff, not in full, so it could not check them against the rest of their file (each larger than [review] max_full_file_chars = 40000): werkrevisor/cli.py, werkrevisor/config.py
- **hint** 1 build change(s) of low risk according to Jev: server/build.gradle.kts (weakens checks 0.02, risk 0.00)
- **hint** 1 finding(s) of low severity or rated minor by Jev: werkrevisor/fullfiles.py:121
- **hint** model recommends merge with caution
### Findings
1. **[medium] Excerpt of a changed file can silently miss deleted-only context and be marked GREEN** at `werkrevisor/fullfiles.py:40-57`, ORANGE, still open in [an earlier line comment](http://git.javagil.de/mi/werkrevisor/pulls/29#issuecomment-1273)
2. **[low] Over-long line in `excerpt` helper** at `werkrevisor/fullfiles.py:121`, hint, still open in [an earlier line comment](http://git.javagil.de/mi/werkrevisor/pulls/29#issuecomment-1285)
### 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/anthropic/claude-sonnet-5.5`, LLM done, tokens counted before the call 56513, calls 1, tokens in 55623 / out 619 (reasoning included in out), duration 31.9 s, cost 0.1174 USD (reported), classifier `jev-1.13.0` calls 7, tokens in 5865, cost 0.0002 USD, finding judge `jev-1.13.0` calls 1, tokens in 1715, cost 0.0001 USD, build file judge `jev-1.13.0` calls 1, tokens in 560, cost 0.0000 USD, config: defaults + host + repository (.werkrevisor.toml at base e95f148).<br>
Reviewed head `9cc201d65c8a17aa021e3c99c442b5eb6815f509` against base `e95f148df8dc7cadc14f8cf268617deb3b9b5a9d`, werkrevisor 0.19.1.
</sub>
</details>
ai-reviewer
requested review from mi 2026-10-06 13:46:48 +02:00
ai-review/assessment AI findings; a developer approval after checking them unlocks the merge; a human review request is pending; merge already scheduled
YELLOW 2 changed files were given to the AI only as diff, not in full, so it could not check them against the rest of their file (each larger than [review] max_full_file_chars = 40000): werkrevisor/cli.py, werkrevisor/config.py
YELLOW 1 finding(s) possibly severe, but Jev doubts that they are real: werkrevisor/config.py:92
hint 1 build change(s) of low risk according to Jev: server/build.gradle.kts (weakens checks 0.02, risk 0.00)
hint 1 finding(s) of low severity or rated minor by Jev: tests/test_fullfiles.py:193-198
hint model recommends merge with caution
Findings
[medium] Excerpt total check uses stale total for over-total decision at werkrevisor/fullfiles.py:141-145, ORANGE, as a line comment
[medium] excerpt_context_lines host-only enforcement is not visible in the diff at werkrevisor/config.py:92, YELLOW, as a line comment
[high] Test body lost its own test name at tests/test_fullfiles.py:193-198, hint, as a line comment
6 of 7 units passed all questions (1 PR document(s)).
2 answers ignored because of a confidence below [classifier] min_confidence.
Usage: model `openrouter/anthropic/claude-sonnet-5.5`, LLM done, tokens counted before the call 59379, calls 1, tokens in 58213 / out 807 (reasoning included in out), duration 13.4 s, cost 0.1245 USD (reported), classifier `jev-1.13.0` calls 7, tokens in 5865, cost 0.0002 USD, finding judge `jev-1.13.0` calls 3, tokens in 4653, cost 0.0002 USD, build file judge `jev-1.13.0` calls 1, tokens in 560, cost 0.0000 USD, config: defaults + host + repository (.werkrevisor.toml at base e95f148).
Reviewed head `eb3d4ccac44587a34cb6e2263b73a3e9a569daa1` against base `e95f148df8dc7cadc14f8cf268617deb3b9b5a9d`, werkrevisor 0.19.1.
<!-- werkrevisor:eb3d4ccac44587a34cb6e2263b73a3e9a569daa1 -->
<!-- werkrevisor-verdict:ORANGE -->
<!-- werkrevisor-folded -->
<details><summary>🟠 werkrevisor ORANGE for <code>eb3d4cc</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/29#issuecomment-1304">the result for <code>8116b42</code></a></summary>
## 🟠 werkrevisor: ORANGE / FINDINGS
Change kind: `mixed`.
### Reasons
- **ORANGE** 1 finding(s) that Jev rates as probably real and severe: werkrevisor/fullfiles.py:141-145
- **YELLOW** risky paths changed: .werkrevisor.toml (built in), werkrevisor/config.py (werkrevisor/config.py)
- **YELLOW** spec: docs/prs/2026-10-06-PR#29-wider-context.md Scenario#29.03 hard_to_read (0.50 > yellow_above = 0.5)
- **YELLOW** 2 changed files were given to the AI only as diff, not in full, so it could not check them against the rest of their file (each larger than [review] max_full_file_chars = 40000): werkrevisor/cli.py, werkrevisor/config.py
- **YELLOW** 1 finding(s) possibly severe, but Jev doubts that they are real: werkrevisor/config.py:92
- **hint** 1 build change(s) of low risk according to Jev: server/build.gradle.kts (weakens checks 0.02, risk 0.00)
- **hint** 1 finding(s) of low severity or rated minor by Jev: tests/test_fullfiles.py:193-198
- **hint** model recommends merge with caution
### Findings
1. **[medium] Excerpt total check uses stale `total` for over-total decision** at `werkrevisor/fullfiles.py:141-145`, ORANGE, as a line comment
2. **[medium] `excerpt_context_lines` host-only enforcement is not visible in the diff** at `werkrevisor/config.py:92`, YELLOW, as a line comment
3. **[high] Test body lost its own test name** at `tests/test_fullfiles.py:193-198`, hint, as a line comment
### Classifier
| Unit | Question | Problem | Confidence | Verdict |
|---|---|---|---|---|
| docs/prs/2026-10-06-PR#29-wider-context.md Scenario#29.03 | hard_to_read | 0.50 | 0.47 | YELLOW |
6 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/anthropic/claude-sonnet-5.5`, LLM done, tokens counted before the call 59379, calls 1, tokens in 58213 / out 807 (reasoning included in out), duration 13.4 s, cost 0.1245 USD (reported), classifier `jev-1.13.0` calls 7, tokens in 5865, cost 0.0002 USD, finding judge `jev-1.13.0` calls 3, tokens in 4653, cost 0.0002 USD, build file judge `jev-1.13.0` calls 1, tokens in 560, cost 0.0000 USD, config: defaults + host + repository (.werkrevisor.toml at base e95f148).<br>
Reviewed head `eb3d4ccac44587a34cb6e2263b73a3e9a569daa1` against base `e95f148df8dc7cadc14f8cf268617deb3b9b5a9d`, werkrevisor 0.19.1.
</sub>
</details>
werkrevisor: ORANGE / FINDINGS for eb3d4ccac44587a34cb6e2263b73a3e9a569daa1.
The result comment of werkrevisor holds the details.
werkrevisor: ORANGE / FINDINGS for `eb3d4ccac44587a34cb6e2263b73a3e9a569daa1`.
The result comment of werkrevisor holds the details.
<!-- werkrevisor-review:eb3d4ccac44587a34cb6e2263b73a3e9a569daa1 -->
[high] Test body lost its own test name (werkrevisor)
hint; Jev: real 0.25, severity 1.7 of 3
The old test_incomplete_context_is_never_green was replaced by test_a_large_file_without_excerpt_is_never_green, but it keeps the same assertions. With diffs=None in the flow, the file goes only as diff and the test remains as strict as before, so this is acceptable. The remaining uncertainty is whether execute actually passes diffs in the flow, because the new GREEN test (test_a_large_file_as_excerpt_can_be_green) depends on it. Without a visible diffs argument at the call site in cli.py, a mismatch would make the excerpt path dead.
**[high] Test body lost its own test name** (werkrevisor)
hint; Jev: real 0.25, severity 1.7 of 3
The old `test_incomplete_context_is_never_green` was replaced by `test_a_large_file_without_excerpt_is_never_green`, but it keeps the same assertions. With `diffs=None` in the flow, the file goes only as diff and the test remains as strict as before, so this is acceptable. The remaining uncertainty is whether `execute` actually passes `diffs` in the flow, because the new GREEN test (`test_a_large_file_as_excerpt_can_be_green`) depends on it. Without a visible `diffs` argument at the call site in `cli.py`, a mismatch would make the excerpt path dead.
[medium] excerpt_context_lines host-only enforcement is not visible in the diff (werkrevisor)
YELLOW; Jev: real 0.42, severity 2.8 of 3
The new test expects the repository config to be refused for excerpt_context_lines. The diff shows only the dataclass field and the validation, not the host-only key list. If the host-only table was not updated elsewhere in config.py, a repository could widen the excerpt and inflate the prompt size. This cannot be verified from the shown hunks.
**[medium] `excerpt_context_lines` host-only enforcement is not visible in the diff** (werkrevisor)
YELLOW; Jev: real 0.42, severity 2.8 of 3
The new test expects the repository config to be refused for `excerpt_context_lines`. The diff shows only the dataclass field and the validation, not the host-only key list. If the host-only table was not updated elsewhere in `config.py`, a repository could widen the excerpt and inflate the prompt size. This cannot be verified from the shown hunks.
[medium] Excerpt total check uses stale total for over-total decision (werkrevisor)
ORANGE; Jev: real 0.76, severity 2.6 of 3
For a file beyond max_full_file_chars, the excerpt is checked against max_full_files_chars using total, which is correct. However, an excerpt that fails is recorded under the cause too_large or over_total of the full file, not of the excerpt. A file that is too large and whose excerpt exceeds the total limit is therefore reported as "each larger than max_full_file_chars", which hides the real cause and misleads the operator about which limit to raise.
**[medium] Excerpt total check uses stale `total` for over-total decision** (werkrevisor)
ORANGE; Jev: real 0.76, severity 2.6 of 3
For a file beyond `max_full_file_chars`, the excerpt is checked against `max_full_files_chars` using `total`, which is correct. However, an excerpt that fails is recorded under the cause `too_large` or `over_total` of the full file, not of the excerpt. A file that is too large and whose excerpt exceeds the total limit is therefore reported as "each larger than max_full_file_chars", which hides the real cause and misleads the operator about which limit to raise.
Assessment of the werkrevisor findings since my last comment (as of the last commit):
Fixed:
Merge conflict with PR#28 resolved: version 0.19.2 on top of 0.19.1; all tests green. This commit dismissed the approval, so the PR needs a new one.
fullfiles.py (ORANGE), a removed line counted at its old line number: the diff parser now records where a removed line was in the new version, so earlier hunks no longer shift the excerpt. Test added (red with the old line number).
fullfiles.py:141-145 (ORANGE), the reason of a file only as diff named only the original limit: it now adds "and no excerpt fits the limits either".
fullfiles.py:121: the long condition is wrapped.
Scenario#29.03 (YELLOW, hard to read): split into a case table with one condition per row.
Not changed:
config.py:92 (YELLOW, Jev doubts it), host-only excerpt_context_lines: REPOSITORY_KEYS does not list it, and test_excerpt_context_is_host_only_and_validated checks that a repository config is refused.
test_fullfiles.py:193-198, whether cli.py passes the diffs: it does (fullfiles.collect(..., rules.mechanical, diffs)), and test_a_large_file_as_excerpt_can_be_green runs through the whole flow and sees the excerpt in the prompt.
YELLOW cli.py and config.py only as diff: this review still runs with the installed 0.19.1 and its limit 40000.
Follow-up idea: a finding that reuses an open line comment keeps the old comment text; its new text is only in the result comment.
Assessment of the werkrevisor findings since my last comment (as of the last commit):
Fixed:
- Merge conflict with PR#28 resolved: version 0.19.2 on top of 0.19.1; all tests green. This commit dismissed the approval, so the PR needs a new one.
- `fullfiles.py` (ORANGE), a removed line counted at its old line number: the diff parser now records where a removed line was in the new version, so earlier hunks no longer shift the excerpt. Test added (red with the old line number).
- `fullfiles.py:141-145` (ORANGE), the reason of a file only as diff named only the original limit: it now adds "and no excerpt fits the limits either".
- `fullfiles.py:121`: the long condition is wrapped.
- Scenario#29.03 (YELLOW, hard to read): split into a case table with one condition per row.
Not changed:
- `config.py:92` (YELLOW, Jev doubts it), host-only `excerpt_context_lines`: `REPOSITORY_KEYS` does not list it, and `test_excerpt_context_is_host_only_and_validated` checks that a repository config is refused.
- `test_fullfiles.py:193-198`, whether `cli.py` passes the diffs: it does (`fullfiles.collect(..., rules.mechanical, diffs)`), and `test_a_large_file_as_excerpt_can_be_green` runs through the whole flow and sees the excerpt in the prompt.
- YELLOW `cli.py` and `config.py` only as diff: this review still runs with the installed 0.19.1 and its limit 40000.
Follow-up idea: a finding that reuses an open line comment keeps the old comment text; its new text is only in the result comment.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
YELLOW 2 changed files were given to the AI only as diff, not in full, so it could not check them against the rest of their file (each larger than [review] max_full_file_chars = 40000): werkrevisor/cli.py, werkrevisor/config.py
hint 1 build change(s) of low risk according to Jev: server/build.gradle.kts (weakens checks 0.02, risk 0.00)
hint 2 finding(s) of low severity or rated minor by Jev: werkrevisor/fullfiles.py:120-121, docs/prs/2026-10-06-PR#29-wider-context.md:1
hint model recommends merge with caution
Findings
[medium] Excerpt with empty ranges silently falls back to YELLOW at werkrevisor/fullfiles.py:120-121, hint, still open in an earlier line comment
[low] Document contradicts the code on the total limit at docs/prs/2026-10-06-PR#29-wider-context.md:1, hint, still open in an earlier line comment
Classifier
7 of 7 units passed all questions (1 PR document(s)).
3 answers ignored because of a confidence below [classifier] min_confidence.
Usage: model `openrouter/anthropic/claude-sonnet-5.5`, LLM done, tokens counted before the call 61745, calls 1, tokens in 60530 / out 481 (reasoning included in out), duration 11.0 s, cost 0.1259 USD (reported), classifier `jev-1.13.0` calls 7, tokens in 5870, cost 0.0002 USD, finding judge `jev-1.13.0` calls 1, tokens in 1387, cost 0.0001 USD, build file judge `jev-1.13.0` calls 1, tokens in 560, cost 0.0000 USD, config: defaults + host + repository (.werkrevisor.toml at base e95f148).
Reviewed head `8116b42e908fecc451166b0ca501bf6ae4cff23e` against base `e95f148df8dc7cadc14f8cf268617deb3b9b5a9d`, werkrevisor 0.19.1.
<!-- werkrevisor:8116b42e908fecc451166b0ca501bf6ae4cff23e -->
<!-- werkrevisor-verdict:YELLOW -->
## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind: `mixed`.
### Reasons
- **YELLOW** risky paths changed: .werkrevisor.toml (built in), werkrevisor/config.py (werkrevisor/config.py)
- **YELLOW** 2 changed files were given to the AI only as diff, not in full, so it could not check them against the rest of their file (each larger than [review] max_full_file_chars = 40000): werkrevisor/cli.py, werkrevisor/config.py
- **hint** 1 build change(s) of low risk according to Jev: server/build.gradle.kts (weakens checks 0.02, risk 0.00)
- **hint** 2 finding(s) of low severity or rated minor by Jev: werkrevisor/fullfiles.py:120-121, docs/prs/2026-10-06-PR#29-wider-context.md:1
- **hint** model recommends merge with caution
### Findings
1. **[medium] Excerpt with empty ranges silently falls back to YELLOW** at `werkrevisor/fullfiles.py:120-121`, hint, still open in [an earlier line comment](http://git.javagil.de/mi/werkrevisor/pulls/29#issuecomment-1285)
2. **[low] Document contradicts the code on the total limit** at `docs/prs/2026-10-06-PR#29-wider-context.md:1`, hint, still open in [an earlier line comment](http://git.javagil.de/mi/werkrevisor/pulls/29#issuecomment-1286)
### Classifier
7 of 7 units passed all questions (1 PR document(s)).
3 answers ignored because of a confidence below [classifier] min_confidence.
<sub>
Usage: model `openrouter/anthropic/claude-sonnet-5.5`, LLM done, tokens counted before the call 61745, calls 1, tokens in 60530 / out 481 (reasoning included in out), duration 11.0 s, cost 0.1259 USD (reported), classifier `jev-1.13.0` calls 7, tokens in 5870, cost 0.0002 USD, finding judge `jev-1.13.0` calls 1, tokens in 1387, cost 0.0001 USD, build file judge `jev-1.13.0` calls 1, tokens in 560, cost 0.0000 USD, config: defaults + host + repository (.werkrevisor.toml at base e95f148).<br>
Reviewed head `8116b42e908fecc451166b0ca501bf6ae4cff23e` against base `e95f148df8dc7cadc14f8cf268617deb3b9b5a9d`, werkrevisor 0.19.1.
</sub>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
See docs/prs/2026-10-06-PR#29-wider-context.md.
🤖 Generated with Claude Code
WIP: werkrevisor 0.19.2: larger full files and a wider diff context instead of YELLOWto werkrevisor 0.19.2: larger full files, excerpts instead of YELLOW for files beyond the limits🔴 werkrevisor RED for
4a3313a, superseded by the result for09de937🔴 werkrevisor: RED / CHANGES_REQUIRED
Change kind:
mixed.Reasons
Classifier
7 of 7 units passed all questions (1 PR document(s)).
Usage: model `openrouter/anthropic/claude-sonnet-5.5`, LLM skipped (invalid .werkrevisor.toml), duration 1.0 s, no model call, cost 0 USD, classifier `jev-1.13.0` calls 7, tokens in 5840, cost 0.0002 USD, build file judge `jev-1.13.0` calls 1, tokens in 560, cost 0.0000 USD, config: defaults + host + repository (.werkrevisor.toml at base2 answers ignored because of a confidence below [classifier] min_confidence.
f585223).Reviewed head `4a3313a84bc192aa8b0a12151663dd60783b18a4` against base `f5852232e0b7cd9959c922c9ef081d90c029daf3`, werkrevisor 0.19.0.
werkrevisor: RED / CHANGES_REQUIRED for
4a3313a84bc192aa8b0a12151663dd60783b18a4.The result comment of werkrevisor holds the details.
🟠 werkrevisor ORANGE for
09de937, superseded by the result fordcc7fbd🟠 werkrevisor: ORANGE / FINDINGS
Change kind:
mixed.Reasons
Findings
[medium] Added lines beyond file end silently dropped at
werkrevisor/fullfiles.py:40-52, ORANGE, as a line comment[high] Weakened lower-only limit test at
tests/test_config_layers.py:117, hint, as a line comment[medium] Excerpt lines can exceed limits unchecked at
werkrevisor/fullfiles.py:110-118, hint, as a line commentClassifier
7 of 7 units passed all questions (1 PR document(s)).
Usage: model `openrouter/anthropic/claude-sonnet-5.5`, LLM done, tokens counted before the call 54723, calls 1, tokens in 53810 / out 782 (reasoning included in out), duration 15.1 s, cost 0.1154 USD (reported), classifier `jev-1.13.0` calls 7, tokens in 5865, cost 0.0002 USD, finding judge `jev-1.13.0` calls 3, tokens in 4846, cost 0.0002 USD, build file judge `jev-1.13.0` calls 1, tokens in 560, cost 0.0000 USD, config: defaults + host + repository (.werkrevisor.toml at base2 answers ignored because of a confidence below [classifier] min_confidence.
f585223).Reviewed head `09de937810f23ea462d340b26e377b4c96b94fb0` against base `f5852232e0b7cd9959c922c9ef081d90c029daf3`, werkrevisor 0.19.0.
werkrevisor: ORANGE / FINDINGS for
09de937810f23ea462d340b26e377b4c96b94fb0.The result comment of werkrevisor holds the details.
@@ -115,3 +115,3 @@("model", "max_output_tokens", 3000, 8000),("budget", "max_usd_per_review", 0.3, 2.0),("review", "max_full_file_chars", 20000, 80000),("review", "max_full_file_chars", 20000, 90000),[high] Weakened lower-only limit test (werkrevisor)
hint; Jev: real 0.39, severity 2.0 of 3
The
max_full_file_charscase now useshigher = 90000against the host value 80000 inconfig/werkprobe.toml, so it checks only a small excess, andmax_full_files_charsstill uses a much larger one. The test still verifies that values above the host limit are refused, so it is not clearly weaker. However, the newexcerpt_context_linessetting is host-only and has no test that a repository config cannot set it. Part of that contract is left unchecked. Uncertain: the host-only enforcement may be covered by a generic test not shown in the diff.@@ -35,6 +37,33 @@ def render_file(path, text):return f"### Full file: '{_safe_path(path)}' ({len(lines)} lines)\n{numbered}\n"def excerpt_ranges(file_diff, line_count, context):[medium] Added lines beyond file end silently dropped (werkrevisor)
ORANGE; Jev: real 0.60, severity 2.7 of 3
excerpt_rangesskips changed lines wherefirst > last(a line number past the end of the file). If every change is skipped,rangesis empty and the file goes only as diff, which is safe. The case where the diff and the fetched content differ is handled only by this silent skip. No test covers it.@@ -69,0 +107,4 @@# Per cause the files that went as excerpt and those that went only as diff.too_large, over_total = ([], []), ([], [])def excerpt(path, text):[medium] Excerpt lines can exceed limits unchecked (werkrevisor)
hint; Jev: real 0.47, severity 2.2 of 3
In
excerpt(), the size check usestotalthrough closure while the caller later addslen(part). That is consistent. However,max_full_file_charsis compared with the excerpt, which is documented as a limit per rendered file. A file just over the limit with changes spread widely can produce an excerpt that is not smaller than the full file. The excerpt is then rejected, andexcerpt_context_linesup to 500 makes this likely. That case is handled, so the main gap is a missing test for theover_totalexcerpt path.🟡 werkrevisor YELLOW for
dcc7fbd, superseded by the result for4f6484b🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind:
mixed.Reasons
Findings
[medium] Excerpt line count ignores files with trailing text beyond splitlines at
werkrevisor/fullfiles.py:115-123, YELLOW, as a line comment[low] README example contradicts new limits at
README.md:87-88, hint, as a line commentClassifier
7 of 7 units passed all questions (1 PR document(s)).
Usage: model `openrouter/anthropic/claude-sonnet-5.5`, LLM done, tokens counted before the call 56216, calls 1, tokens in 55337 / out 577 (reasoning included in out), duration 11.6 s, cost 0.1164 USD (reported), classifier `jev-1.13.0` calls 7, tokens in 5865, cost 0.0002 USD, finding judge `jev-1.13.0` calls 1, tokens in 1619, cost 0.0001 USD, build file judge `jev-1.13.0` calls 1, tokens in 560, cost 0.0000 USD, config: defaults + host + repository (.werkrevisor.toml at base2 answers ignored because of a confidence below [classifier] min_confidence.
f585223).Reviewed head `dcc7fbd80c2e0c8a9da332fa1182558a43404ccb` against base `f5852232e0b7cd9959c922c9ef081d90c029daf3`, werkrevisor 0.19.0.
werkrevisor: YELLOW / HUMAN_REVIEW for
dcc7fbd80c2e0c8a9da332fa1182558a43404ccb.The result comment of werkrevisor holds the details.
@@ -83,5 +83,5 @@6. Run the PR-Agent reviewer with all settings forced by werkrevisor.7. Check that the model saw every changed file completely.8. Read the PR again.If the head moved meanwhile, stop with exit 30 and write nothing.9. Write one PR comment, the commit status `ai-review/assessment`, and one usage line.[low] README example contradicts new limits (werkrevisor)
hint
The README still shows the example reason with
max_full_files_chars = 120000, while the default is now 160000. The comments inconfig/werkator.tomlandconfig/werkprobe.tomlalso still say "120000 chars are about 34000 of the 100000 input tokens", which no longer matches the new limit of 160000.@@ -69,0 +112,4 @@# Per cause the files that went as excerpt and those that went only as diff.too_large, over_total = ([], []), ([], [])def excerpt(path, text):[medium] Excerpt line count ignores files with trailing text beyond splitlines (werkrevisor)
YELLOW; Jev: real 0.51, severity 2.6 of 3
The
excerptclosure checks the per-file limit withlen(part) > max_full_file_chars, buttotalis read from the enclosing scope at call time. That is fine. The bigger problem is thatexcerpt_rangesreturns an empty list when a PR has no added or removed lines in the diff (e.g. a rename or mode change).if rangesis then falsy, so the file goes only as diff and gives YELLOW, which the PR document does not mention. Also, for a file of 1 linelines[i - 1]is safe, but ranges computed from adiffthat does not match the head file raise no error because of theNonecheck only for added lines. This is uncertain and limited to odd diffs.Assessment of the werkrevisor findings (as of the last commit):
Fixed:
.werkrevisor.toml: the installed 0.19.0 has the limit 40000, and a repository config may only lower it..werkrevisor.tomlno longer sets the limits; it inherits them from the host, so it is valid before and after the deployment.fullfiles.py(ORANGE), changed lines beyond the end of the file: an added line beyond the end means the diff does not fit the file, so the file goes only as diff (YELLOW); a removed line at the end counts at the last line. Test added.test_config_layers.py:excerpt_context_linesis tested as host only and validated.config/werkator.tomlandconfig/werkprobe.tomlfollow the new limits.Not changed:
fullfiles.py:115-123(YELLOW, Jev doubts it), a too-large file without changed lines goes only as diff: intended and safe. A pure rename is already a mechanical file and skips the full files; a mode change of a file above 80000 characters without content change is rare, and YELLOW is the safe side.over_totalpath of the excerpt is tested intest_files_beyond_the_limits_go_as_excerpt_and_are_a_hint(subtestmax_full_files_chars).cli.pyandconfig.pyonly as diff: this review still runs with the installed 0.19.0 and its limit 40000; from 0.19.2 on, both files go in full (44901 and 42771 characters with line numbers)..werkrevisor.tomlandwerkrevisor/config.py: by design.Deployment: right after the merge, the rootfs 0.19.2 and the Werkator machine configs of werkprobe and werkator with the new limits.
🤖 Generated with Claude Code
🟡 werkrevisor YELLOW for
4f6484b, superseded by the result for9cc201d🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind:
mixed.Reasons
Findings
[high] Excerpt can exceed the total limit at
werkrevisor/fullfiles.py:115-123, hint, still open in an earlier line comment[medium] Line exceeds 128 characters at
werkrevisor/fullfiles.py:121, hint, as a line comment[low] Title and document disagree with the code at
docs/prs/2026-10-06-PR#29-wider-context.md:1, hint, as a line commentClassifier
7 of 7 units passed all questions (1 PR document(s)).
Usage: model `openrouter/anthropic/claude-sonnet-5.5`, LLM done, tokens counted before the call 56510, calls 1, tokens in 55621 / out 708 (reasoning included in out), duration 11.9 s, cost 0.1183 USD (reported), classifier `jev-1.13.0` calls 7, tokens in 5865, cost 0.0002 USD, finding judge `jev-1.13.0` calls 2, tokens in 2926, cost 0.0001 USD, build file judge `jev-1.13.0` calls 1, tokens in 560, cost 0.0000 USD, config: defaults + host + repository (.werkrevisor.toml at base2 answers ignored because of a confidence below [classifier] min_confidence.
f585223).Reviewed head `4f6484be06056f5c891f560fc56bb31141e39ce6` against base `f5852232e0b7cd9959c922c9ef081d90c029daf3`, werkrevisor 0.19.0.
werkrevisor: YELLOW / HUMAN_REVIEW for
4f6484be06056f5c891f560fc56bb31141e39ce6.The result comment of werkrevisor holds the details.
@@ -0,0 +1,96 @@# PR#29: larger full files and a wider diff context instead of YELLOW[low] Title and document disagree with the code (werkrevisor)
hint
The title says "a wider diff context instead of YELLOW", but the code adds excerpts of the file and does not widen the diff. The Scenario#29.03 table also says "a file that is not UTF-8 text but is reviewable for PR-Agent", which the code does not check separately.
@@ -69,0 +118,4 @@return Noneranges = excerpt_ranges(file_diff, len(text.splitlines()), review_config.excerpt_context_lines)part = render_excerpt(path, text, ranges) if ranges else Noneif part is None or len(part) > review_config.max_full_file_chars or total + len(part) > review_config.max_full_files_chars:[medium] Line exceeds 128 characters (werkrevisor)
hint; Jev: real 0.58, severity 0.9 of 3
The condition line in
excerptis about 135 characters long, which breaks the line-length convention of the Python code and hurts readability. Split the condition over several lines.New commits pushed, approval review dismissed automatically according to repository settings
🟠 werkrevisor ORANGE for
9cc201d, superseded by the result foreb3d4cc🟠 werkrevisor: ORANGE / FINDINGS
Change kind:
mixed.Reasons
Findings
[medium] Excerpt of a changed file can silently miss deleted-only context and be marked GREEN at
werkrevisor/fullfiles.py:40-57, ORANGE, still open in an earlier line comment[low] Over-long line in
excerpthelper atwerkrevisor/fullfiles.py:121, hint, still open in an earlier line commentClassifier
7 of 7 units passed all questions (1 PR document(s)).
Usage: model `openrouter/anthropic/claude-sonnet-5.5`, LLM done, tokens counted before the call 56513, calls 1, tokens in 55623 / out 619 (reasoning included in out), duration 31.9 s, cost 0.1174 USD (reported), classifier `jev-1.13.0` calls 7, tokens in 5865, cost 0.0002 USD, finding judge `jev-1.13.0` calls 1, tokens in 1715, cost 0.0001 USD, build file judge `jev-1.13.0` calls 1, tokens in 560, cost 0.0000 USD, config: defaults + host + repository (.werkrevisor.toml at base2 answers ignored because of a confidence below [classifier] min_confidence.
e95f148).Reviewed head `9cc201d65c8a17aa021e3c99c442b5eb6815f509` against base `e95f148df8dc7cadc14f8cf268617deb3b9b5a9d`, werkrevisor 0.19.1.
🟠 werkrevisor ORANGE for
eb3d4cc, superseded by the result for8116b42🟠 werkrevisor: ORANGE / FINDINGS
Change kind:
mixed.Reasons
Findings
[medium] Excerpt total check uses stale
totalfor over-total decision atwerkrevisor/fullfiles.py:141-145, ORANGE, as a line comment[medium]
excerpt_context_lineshost-only enforcement is not visible in the diff atwerkrevisor/config.py:92, YELLOW, as a line comment[high] Test body lost its own test name at
tests/test_fullfiles.py:193-198, hint, as a line commentClassifier
6 of 7 units passed all questions (1 PR document(s)).
Usage: model `openrouter/anthropic/claude-sonnet-5.5`, LLM done, tokens counted before the call 59379, calls 1, tokens in 58213 / out 807 (reasoning included in out), duration 13.4 s, cost 0.1245 USD (reported), classifier `jev-1.13.0` calls 7, tokens in 5865, cost 0.0002 USD, finding judge `jev-1.13.0` calls 3, tokens in 4653, cost 0.0002 USD, build file judge `jev-1.13.0` calls 1, tokens in 560, cost 0.0000 USD, config: defaults + host + repository (.werkrevisor.toml at base2 answers ignored because of a confidence below [classifier] min_confidence.
e95f148).Reviewed head `eb3d4ccac44587a34cb6e2263b73a3e9a569daa1` against base `e95f148df8dc7cadc14f8cf268617deb3b9b5a9d`, werkrevisor 0.19.1.
werkrevisor: ORANGE / FINDINGS for
eb3d4ccac44587a34cb6e2263b73a3e9a569daa1.The result comment of werkrevisor holds the details.
@@ -122,0 +190,4 @@self.assertIn("full_files_partial", [r.code for r in outcome.result.reasons])self.assertIn("### Excerpt of file: 'src/a.py' (lines 1-41 of 500)", model.sections[0])def test_a_large_file_without_excerpt_is_never_green(self):[high] Test body lost its own test name (werkrevisor)
hint; Jev: real 0.25, severity 1.7 of 3
The old
test_incomplete_context_is_never_greenwas replaced bytest_a_large_file_without_excerpt_is_never_green, but it keeps the same assertions. Withdiffs=Nonein the flow, the file goes only as diff and the test remains as strict as before, so this is acceptable. The remaining uncertainty is whetherexecuteactually passesdiffsin the flow, because the new GREEN test (test_a_large_file_as_excerpt_can_be_green) depends on it. Without a visiblediffsargument at the call site incli.py, a mismatch would make the excerpt path dead.@@ -89,0 +89,4 @@max_full_files_chars: int = 160000# A file too large to go in full goes as excerpt with these lines around each changed line;# PR-Agent caps its own diff context at 10 lines.excerpt_context_lines: int = 40[medium]
excerpt_context_lineshost-only enforcement is not visible in the diff (werkrevisor)YELLOW; Jev: real 0.42, severity 2.8 of 3
The new test expects the repository config to be refused for
excerpt_context_lines. The diff shows only the dataclass field and the validation, not the host-only key list. If the host-only table was not updated elsewhere inconfig.py, a repository could widen the excerpt and inflate the prompt size. This cannot be verified from the shown hunks.@@ -84,0 +138,4 @@cause = too_largeelif total + len(part) > review_config.max_full_files_chars:cause = over_totalif cause is not None:[medium] Excerpt total check uses stale
totalfor over-total decision (werkrevisor)ORANGE; Jev: real 0.76, severity 2.6 of 3
For a file beyond
max_full_file_chars, the excerpt is checked againstmax_full_files_charsusingtotal, which is correct. However, an excerpt that fails is recorded under the causetoo_largeorover_totalof the full file, not of the excerpt. A file that is too large and whose excerpt exceeds the total limit is therefore reported as "each larger than max_full_file_chars", which hides the real cause and misleads the operator about which limit to raise.Assessment of the werkrevisor findings since my last comment (as of the last commit):
Fixed:
fullfiles.py(ORANGE), a removed line counted at its old line number: the diff parser now records where a removed line was in the new version, so earlier hunks no longer shift the excerpt. Test added (red with the old line number).fullfiles.py:141-145(ORANGE), the reason of a file only as diff named only the original limit: it now adds "and no excerpt fits the limits either".fullfiles.py:121: the long condition is wrapped.Not changed:
config.py:92(YELLOW, Jev doubts it), host-onlyexcerpt_context_lines:REPOSITORY_KEYSdoes not list it, andtest_excerpt_context_is_host_only_and_validatedchecks that a repository config is refused.test_fullfiles.py:193-198, whethercli.pypasses the diffs: it does (fullfiles.collect(..., rules.mechanical, diffs)), andtest_a_large_file_as_excerpt_can_be_greenruns through the whole flow and sees the excerpt in the prompt.cli.pyandconfig.pyonly as diff: this review still runs with the installed 0.19.1 and its limit 40000.Follow-up idea: a finding that reuses an open line comment keeps the old comment text; its new text is only in the result comment.
🤖 Generated with Claude Code
🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind:
mixed.Reasons
Findings
[medium] Excerpt with empty ranges silently falls back to YELLOW at
werkrevisor/fullfiles.py:120-121, hint, still open in an earlier line comment[low] Document contradicts the code on the total limit at
docs/prs/2026-10-06-PR#29-wider-context.md:1, hint, still open in an earlier line commentClassifier
7 of 7 units passed all questions (1 PR document(s)).
Usage: model `openrouter/anthropic/claude-sonnet-5.5`, LLM done, tokens counted before the call 61745, calls 1, tokens in 60530 / out 481 (reasoning included in out), duration 11.0 s, cost 0.1259 USD (reported), classifier `jev-1.13.0` calls 7, tokens in 5870, cost 0.0002 USD, finding judge `jev-1.13.0` calls 1, tokens in 1387, cost 0.0001 USD, build file judge `jev-1.13.0` calls 1, tokens in 560, cost 0.0000 USD, config: defaults + host + repository (.werkrevisor.toml at base3 answers ignored because of a confidence below [classifier] min_confidence.
e95f148).Reviewed head `8116b42e908fecc451166b0ca501bf6ae4cff23e` against base `e95f148df8dc7cadc14f8cf268617deb3b9b5a9d`, werkrevisor 0.19.1.
latest findings accepted
latest findings accepted
Stale RED of
4a3313a: the invalid .werkrevisor.toml was fixed in 09de937; later reviews are not RED.