claude-code
changed title from WIP: werkrevisor 0.45.0: Werkator releases werkrevisor after each merge to WIP: werkrevisor 0.46.0: Werkator releases werkrevisor after each merge2026-10-17 13:54:29 +02:00
tools/release_rootfs.py assembles the rootfs archive without a container engine,
from the base archive of the PR-Agent image and werkrevisor/ and config/ of main,
and installs it in each machine config that names a werkrevisor archive.
tools/deploy-rootfs installs through the same code; tools/build-rootfs --base creates the base archive.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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 10 section(s) of the PR document agree with the change summary of openrouter/minimax/minimax-m3, and its 11 change(s) belong to the PR document, according to Jev
hint 2 finding(s) of low severity or rated minor by Jev: docs/prs/2026-10-17-PR#118-release-build.md:86, docs/prs/2026-10-17-PR#118-release-build.md:84-85
Findings
Incorrect standard-library claim at docs/prs/2026-10-17-PR#118-release-build.md:86, severity unknown, counted as medium, hint, as a line comment
Contradictory explanation at docs/prs/2026-10-17-PR#118-release-build.md:84-85, severity unknown, counted as medium, hint, as a line comment
Classifier
10 of 10 units passed all questions (1 PR document(s)).
2 answers ignored because of a confidence below [classifier] min_confidence.
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 29222, calls 1, tokens in 28095 / out 11992 (reasoning included in out), duration 98.6 s, cost 0.0228 USD (reported), classifier `jev-1.13.0` calls 10, tokens in 8081, cost 0.0003 USD, finding judge `jev-1.13.0` calls 2, tokens in 3416, cost 0.0001 USD, change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 8553 / out 1989, cost 0.0049 USD (reported), PR document check `jev-1.13.0` calls 21, tokens in 41649, cost 0.0017 USD, build file judge `jev-1.13.0` calls 7, tokens in 10299, cost 0.0004 USD, phases: path_judge 0.6 s, classifier 0.7 s, change_summary 8.9 s, doc_check 1.3 s, context 0.3 s, model_review 86.0 s, finding_judge 0.3 s, config: defaults + host + repository (.werkrevisor.toml at main d0b4dfe).
Reviewed head `02dbc76655868f35088cab0296f4d0d455393fed` against base `d0b4dfed34977f793140a47b72d9fa7181d8796d`, werkrevisor 0.44.1.
<!-- werkrevisor:02dbc76655868f35088cab0296f4d0d455393fed -->
<!-- werkrevisor-verdict:YELLOW -->
<!-- werkrevisor-blocks:e430777418a2fbe5716bdf64a4cda10e,cf3806d84c7608a3f72474308d8ce2b7,eb30e60592570cab7c9327bfd99cda1b,f8f54a4a2178c7be779daa83c9f2385b,f3be62070e58b230abf2cb97ecc241bb,6a47756cac1ac89e7c620b248f03ae5e,14f8ff60e9501f4bb3327dd1d1421bd6,eb2dce5a64b389a1bf49fdc01d5e74df,fa61c658eca33726d25d8c74eb8b8fa0,8bcc9402ac7716694e1def98fc4804ec,2fd3d8abad9d310b0436e96c008b58ec,1b29af6daa4c1d46ddb669ee9e236733,e56c332f8b6de6bbbc6245c30eee7df5,396480be167e624f102465e9c71b7eda,b126745a694ccf6108326f729f9bdfb6,f63ec1ec558fe0bb0135e4bb97e65243,663403f50ff023fc28b91a74d8a82aa7,04a083b61fb2c7e69f0b54b07ab1122f,51cb8b20505f362460e3d7b2df4a8550,c8ba107f40c9b96fe39908f66a4803c3,62c2e149e84c7c0c26f7f3a2d6e1d269,8551148f4bbb38d6b20ace323cb93842,a6369492adca7dddee5ec1cb246c282f,2be42d2ff6b685e827d0f0dc0e6d25b1,f5f32783c33ef9f95507962e31a622c7,e34977974d668c09b9a51c41e426dbf7 -->
<!-- werkrevisor-folded -->
<details><summary>🟡 werkrevisor YELLOW for <code>02dbc76</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/118#issuecomment-6207">the result for <code>5bfc65e</code></a></summary>
## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind: `mixed`.
### Reasons
- **YELLOW** risky paths changed: .werkrevisor.toml (built in)
- **YELLOW** risky build changes according to Jev: .werkator.yml (weakens checks 0.05, risk 1.84, security 0.03), tools/build-rootfs (weakens checks 0.05, risk 2.02, security 0.02)
- **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** 10 section(s) of the PR document agree with the change summary of openrouter/minimax/minimax-m3, and its 11 change(s) belong to the PR document, according to Jev
- **hint** 2 finding(s) of low severity or rated minor by Jev: docs/prs/2026-10-17-PR#118-release-build.md:86, docs/prs/2026-10-17-PR#118-release-build.md:84-85
### Findings
1. **Incorrect standard-library claim** at `docs/prs/2026-10-17-PR#118-release-build.md:86`, severity unknown, counted as medium, hint, as a line comment
2. **Contradictory explanation** at `docs/prs/2026-10-17-PR#118-release-build.md:84-85`, severity unknown, counted as medium, hint, as a line comment
### Classifier
10 of 10 units passed all questions (1 PR document(s)).
2 answers ignored because of a confidence below [classifier] min_confidence.
<sub>
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 29222, calls 1, tokens in 28095 / out 11992 (reasoning included in out), duration 98.6 s, cost 0.0228 USD (reported), classifier `jev-1.13.0` calls 10, tokens in 8081, cost 0.0003 USD, finding judge `jev-1.13.0` calls 2, tokens in 3416, cost 0.0001 USD, change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 8553 / out 1989, cost 0.0049 USD (reported), PR document check `jev-1.13.0` calls 21, tokens in 41649, cost 0.0017 USD, build file judge `jev-1.13.0` calls 7, tokens in 10299, cost 0.0004 USD, phases: path_judge 0.6 s, classifier 0.7 s, change_summary 8.9 s, doc_check 1.3 s, context 0.3 s, model_review 86.0 s, finding_judge 0.3 s, config: defaults + host + repository (.werkrevisor.toml at main d0b4dfe).<br>
Reviewed head `02dbc76655868f35088cab0296f4d0d455393fed` against base `d0b4dfed34977f793140a47b72d9fa7181d8796d`, werkrevisor 0.44.1.
</sub>
</details>
werkrevisor: YELLOW / HUMAN_REVIEW for 02dbc76655868f35088cab0296f4d0d455393fed.
The result comment of werkrevisor holds the details.
werkrevisor: YELLOW / HUMAN_REVIEW for `02dbc76655868f35088cab0296f4d0d455393fed`.
The result comment of werkrevisor holds the details.
<!-- werkrevisor-review:02dbc76655868f35088cab0296f4d0d455393fed -->
Contradictory explanation, severity unknown, counted as medium (werkrevisor)
hint; Jev: real 0.76, severity 1.5 of 3
The solution section says the new archive's file list equals the 0.44.1 list "plus /work" and then states "the reviews do not need it". If the reviews do not need the work directory, the rationale for adding it back is missing; if they do need it, the sentence is wrong. The current wording leaves the reader unable to tell why the directory is reinstated, which is exactly the kind of decision a PR document is supposed to record.
**Contradictory explanation**, severity unknown, counted as medium (werkrevisor)
hint; Jev: real 0.76, severity 1.5 of 3
The solution section says the new archive's file list equals the 0.44.1 list "plus `/work`" and then states "the reviews do not need it". If the reviews do not need the `work` directory, the rationale for adding it back is missing; if they do need it, the sentence is wrong. The current wording leaves the reader unable to tell why the directory is reinstated, which is exactly the kind of decision a PR document is supposed to record.
Fixed in 5bfc65e: the document now says why /work is there: it is the WORKDIR of the Dockerfile, so the assembled archive matches it, although the reviews do not use it.
Fixed in `5bfc65e`: the document now says why `/work` is there: it is the `WORKDIR` of the `Dockerfile`, so the assembled archive matches it, although the reviews do not use it.
Incorrect standard-library claim, severity unknown, counted as medium (werkrevisor)
hint; Jev: real 0.87, severity 1.9 of 3
The PR document states "It takes zstd from the standard library of Python 3.14", but the compression module used in tools/release_rootfs.py is a third-party package, not part of Python's standard library. The code itself shows this with try: from compression import zstd / except ImportError, falling back to the zstd program when the package is missing. Claiming the opposite in the PR document misleads future maintainers and readers about where the module comes from and whether it requires an extra dependency.
**Incorrect standard-library claim**, severity unknown, counted as medium (werkrevisor)
hint; Jev: real 0.87, severity 1.9 of 3
The PR document states "It takes zstd from the standard library of Python 3.14", but the `compression` module used in `tools/release_rootfs.py` is a third-party package, not part of Python's standard library. The code itself shows this with `try: from compression import zstd / except ImportError`, falling back to the `zstd` program when the package is missing. Claiming the opposite in the PR document misleads future maintainers and readers about where the module comes from and whether it requires an extra dependency.
Not a defect in the code: compression.zstd is part of the standard library since Python 3.14 (PEP 784); the PR-Agent image has Python 3.14.7, mih09 has 3.11 and takes the zstd program.
To prevent the misreading, 5bfc65e names the module and PEP 784 in the document.
Not a defect in the code: `compression.zstd` is part of the standard library since Python 3.14 (PEP 784); the PR-Agent image has Python 3.14.7, mih09 has 3.11 and takes the `zstd` program.
To prevent the misreading, `5bfc65e` names the module and PEP 784 in the document.
claude-code marked this conversation as resolved
ai-reviewer
scheduled this pull request to auto merge when all checks succeed 2026-10-17 13:58:21 +02:00
ai-reviewer
requested review from mi 2026-10-17 13:58:21 +02:00
Opening the live configuration with "w" truncates it before writing the replacement. Concurrent readers can observe an empty or partial configuration, and an interrupted or failed write leaves it damaged. This regresses the previous sed -i implementation, which replaced the file through a temporary file. Write a temporary file with the original permissions and atomically replace the live configuration.
Fix it, or reply why it does not hold, and resolve this comment.
**[medium] Replace machine configurations atomically** (Codex review)
Opening the live configuration with "w" truncates it before writing the replacement. Concurrent readers can observe an empty or partial configuration, and an interrupted or failed write leaves it damaged. This regresses the previous sed -i implementation, which replaced the file through a temporary file. Write a temporary file with the original permissions and atomically replace the live configuration.
Fix it, or reply why it does not hold, and resolve this comment.
<!-- werkrevisor-codex -->
Fixed in 5bfc65e: _replace writes a temporary file in the same directory, copies the mode and replaces the machine config with os.replace; a failed write removes the temporary file.
Fixed in `5bfc65e`: `_replace` writes a temporary file in the same directory, copies the mode and replaces the machine config with `os.replace`; a failed write removes the temporary file.
The change introduces automatic releases outside the sandbox and rewrites token-bearing machine configurations across repositories. Mistakes could disrupt production review gates or damage their configuration in ways the unit tests would not reveal.
Findings
[medium] Replace machine configurations atomically at tools/release_rootfs.py:178, 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 240876 (cached 195328) / out 2031, 74.3 s, 6 commands; reviewed head `02dbc76655868f35088cab0296f4d0d455393fed`.
<!-- werkrevisor-codex:02dbc76655868f35088cab0296f4d0d455393fed -->
<!-- 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/118#issuecomment-6207">the result for <code>5bfc65e</code></a></summary>
## Codex review: critical
The change introduces automatic releases outside the sandbox and rewrites token-bearing machine configurations across repositories. Mistakes could disrupt production review gates or damage their configuration in ways the unit tests would not reveal.
### Findings
1. **[medium] Replace machine configurations atomically** at `tools/release_rootfs.py:178`, 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 240876 (cached 195328) / out 2031, 74.3 s, 6 commands; reviewed head `02dbc76655868f35088cab0296f4d0d455393fed`.
</sub>
</details>
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 10 section(s) of the PR document agree with the change summary of openrouter/minimax/minimax-m3, and its 8 change(s) belong to the PR document, according to Jev
Classifier
10 of 10 units passed all questions (1 PR document(s)).
2 answers ignored because of a confidence below [classifier] min_confidence.
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 29998, calls 1, tokens in 28854 / out 26596 (reasoning included in out), duration 163.0 s, cost 0.0405 USD (reported), classifier `jev-1.13.0` calls 10, tokens in 8153, cost 0.0003 USD, change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 8852 / out 1964, cost 0.0050 USD (reported), PR document check `jev-1.13.0` calls 18, tokens in 34812, cost 0.0015 USD, build file judge `jev-1.13.0` calls 7, tokens in 10613, cost 0.0004 USD, phases: path_judge 0.5 s, classifier 0.7 s, change_summary 19.0 s, doc_check 1.2 s, context 0.3 s, model_review 140.4 s, config: defaults + host + repository (.werkrevisor.toml at main d0b4dfe).
Reviewed head `5bfc65e1c4e457e562ebcca30c6d409d62744f91` against base `d0b4dfed34977f793140a47b72d9fa7181d8796d`, werkrevisor 0.44.1.
<!-- werkrevisor:5bfc65e1c4e457e562ebcca30c6d409d62744f91 -->
<!-- werkrevisor-verdict:YELLOW -->
<!-- werkrevisor-blocks:e430777418a2fbe5716bdf64a4cda10e,cf3806d84c7608a3f72474308d8ce2b7,eb30e60592570cab7c9327bfd99cda1b,f8f54a4a2178c7be779daa83c9f2385b,f3be62070e58b230abf2cb97ecc241bb,6a47756cac1ac89e7c620b248f03ae5e,14f8ff60e9501f4bb3327dd1d1421bd6,eb2dce5a64b389a1bf49fdc01d5e74df,fa61c658eca33726d25d8c74eb8b8fa0,04f905ac95f4c27b9c8858a131c609ba,2fd3d8abad9d310b0436e96c008b58ec,1b29af6daa4c1d46ddb669ee9e236733,a7f5838f5633cf307123ad8955aa31ba,396480be167e624f102465e9c71b7eda,b126745a694ccf6108326f729f9bdfb6,f63ec1ec558fe0bb0135e4bb97e65243,663403f50ff023fc28b91a74d8a82aa7,04a083b61fb2c7e69f0b54b07ab1122f,51cb8b20505f362460e3d7b2df4a8550,c8ba107f40c9b96fe39908f66a4803c3,62c2e149e84c7c0c26f7f3a2d6e1d269,8551148f4bbb38d6b20ace323cb93842,a6369492adca7dddee5ec1cb246c282f,2be42d2ff6b685e827d0f0dc0e6d25b1,0db6f3e80ff859943e52417265fe0463,e34977974d668c09b9a51c41e426dbf7 -->
<!-- werkrevisor-folded -->
<details><summary>🟡 werkrevisor YELLOW for <code>5bfc65e</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/118#issuecomment-6217">the result for <code>8dbfe64</code></a></summary>
## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind: `mixed`.
### Reasons
- **YELLOW** risky paths changed: .werkrevisor.toml (built in)
- **YELLOW** risky build changes according to Jev: .werkator.yml (weakens checks 0.05, risk 1.79, security 0.02), tools/build-rootfs (weakens checks 0.05, risk 2.02, security 0.02)
- **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** 10 section(s) of the PR document agree with the change summary of openrouter/minimax/minimax-m3, and its 8 change(s) belong to the PR document, according to Jev
### Classifier
10 of 10 units passed all questions (1 PR document(s)).
2 answers ignored because of a confidence below [classifier] min_confidence.
<sub>
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 29998, calls 1, tokens in 28854 / out 26596 (reasoning included in out), duration 163.0 s, cost 0.0405 USD (reported), classifier `jev-1.13.0` calls 10, tokens in 8153, cost 0.0003 USD, change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 8852 / out 1964, cost 0.0050 USD (reported), PR document check `jev-1.13.0` calls 18, tokens in 34812, cost 0.0015 USD, build file judge `jev-1.13.0` calls 7, tokens in 10613, cost 0.0004 USD, phases: path_judge 0.5 s, classifier 0.7 s, change_summary 19.0 s, doc_check 1.2 s, context 0.3 s, model_review 140.4 s, config: defaults + host + repository (.werkrevisor.toml at main d0b4dfe).<br>
Reviewed head `5bfc65e1c4e457e562ebcca30c6d409d62744f91` against base `d0b4dfed34977f793140a47b72d9fa7181d8796d`, werkrevisor 0.44.1.
</sub>
</details>
[medium] Automatic installation can point configurations at missing archives (Codex review)
Without an explicit repository list, install updates every discovered configuration but replaces only the archive basename. If repositories use different archive directories, the new archive exists only in the supplied directory while other configurations point to nonexistent files, breaking their builds. This also affects release <directory>, which the error from archive_directory explicitly suggests when multiple directories exist.
Fix it, or reply why it does not hold, and resolve this comment.
**[medium] Automatic installation can point configurations at missing archives** (Codex review)
Without an explicit repository list, install updates every discovered configuration but replaces only the archive basename. If repositories use different archive directories, the new archive exists only in the supplied directory while other configurations point to nonexistent files, breaking their builds. This also affects `release <directory>`, which the error from archive_directory explicitly suggests when multiple directories exist.
Fix it, or reply why it does not hold, and resolve this comment.
<!-- werkrevisor-codex -->
Fixed in 8dbfe64: install refuses, before it changes anything, if a selected machine config names a werkrevisor archive outside the target directory; archive_directory no longer suggests to give one.
Fixed in `8dbfe64`: `install` refuses, before it changes anything, if a selected machine config names a werkrevisor archive outside the target directory; `archive_directory` no longer suggests to give one.
The change introduces automatic deployment outside the sandbox, rewrites live merge-gate configurations across repositories, and deletes old archives. Mistakes could disrupt or compromise the review gate in ways the isolated tests would not reveal.
Findings
[medium] Automatic installation can point configurations at missing archives at tools/release_rootfs.py:191, 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 256346 (cached 202752) / out 2672, 92.8 s, 8 commands; reviewed head `5bfc65e1c4e457e562ebcca30c6d409d62744f91`.
<!-- werkrevisor-codex:5bfc65e1c4e457e562ebcca30c6d409d62744f91 -->
<!-- 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/118#issuecomment-6217">the result for <code>8dbfe64</code></a></summary>
## Codex review: critical
The change introduces automatic deployment outside the sandbox, rewrites live merge-gate configurations across repositories, and deletes old archives. Mistakes could disrupt or compromise the review gate in ways the isolated tests would not reveal.
### Findings
1. **[medium] Automatic installation can point configurations at missing archives** at `tools/release_rootfs.py:191`, 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 256346 (cached 202752) / out 2672, 92.8 s, 8 commands; reviewed head `5bfc65e1c4e457e562ebcca30c6d409d62744f91`.
</sub>
</details>
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 11 section(s) of the PR document agree with the change summary of openrouter/minimax/minimax-m3, and its 8 change(s) belong to the PR document, according to Jev
hint 1 finding(s) of low severity or rated minor by Jev: README.md:1216
Findings
Wording inconsistency at README.md:1216, severity unknown, counted as medium
hint; Jev: real 0.70, severity 1.0 of 3
The new README section says "Without repositories it switches each machine config on the host that names a werkrevisor archive." The word "switches" is non-standard in this context and inconsistent with the parallel wording in tools/deploy-rootfs ("it takes each machine config on the host that names a werkrevisor archive") and the PR document. A reader would expect "updates" or "takes".
Classifier
11 of 11 units passed all questions (1 PR document(s)).
3 answers ignored because of a confidence below [classifier] min_confidence.
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 30833, calls 1, tokens in 29660 / out 51634 (reasoning included in out), duration 299.7 s, cost 0.0708 USD (reported), classifier `jev-1.13.0` calls 11, tokens in 8825, cost 0.0004 USD, finding judge `jev-1.13.0` calls 1, tokens in 1535, cost 0.0001 USD, change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 9160 / out 1663, cost 0.0041 USD (reported), PR document check `jev-1.13.0` calls 19, tokens in 35824, cost 0.0015 USD, build file judge `jev-1.13.0` calls 7, tokens in 10944, cost 0.0005 USD, phases: path_judge 0.5 s, classifier 0.8 s, change_summary 15.2 s, doc_check 1.2 s, context 0.3 s, model_review 280.8 s, finding_judge 0.3 s, config: defaults + host + repository (.werkrevisor.toml at main d0b4dfe).
Reviewed head `8dbfe6488cd9a17dea38aa49376460e4c68b6751` against base `d0b4dfed34977f793140a47b72d9fa7181d8796d`, werkrevisor 0.44.1.
<!-- werkrevisor:8dbfe6488cd9a17dea38aa49376460e4c68b6751 -->
<!-- werkrevisor-verdict:YELLOW -->
<!-- werkrevisor-blocks:e430777418a2fbe5716bdf64a4cda10e,cf3806d84c7608a3f72474308d8ce2b7,eb30e60592570cab7c9327bfd99cda1b,f8f54a4a2178c7be779daa83c9f2385b,f3be62070e58b230abf2cb97ecc241bb,6a47756cac1ac89e7c620b248f03ae5e,14f8ff60e9501f4bb3327dd1d1421bd6,eb2dce5a64b389a1bf49fdc01d5e74df,fa61c658eca33726d25d8c74eb8b8fa0,f8b3f560565b8a224f15c765c144d075,2fd3d8abad9d310b0436e96c008b58ec,1b29af6daa4c1d46ddb669ee9e236733,3afb46584f8c181663ac9a1adffa5673,396480be167e624f102465e9c71b7eda,b126745a694ccf6108326f729f9bdfb6,f63ec1ec558fe0bb0135e4bb97e65243,663403f50ff023fc28b91a74d8a82aa7,04a083b61fb2c7e69f0b54b07ab1122f,51cb8b20505f362460e3d7b2df4a8550,c8ba107f40c9b96fe39908f66a4803c3,62c2e149e84c7c0c26f7f3a2d6e1d269,8551148f4bbb38d6b20ace323cb93842,a6369492adca7dddee5ec1cb246c282f,2be42d2ff6b685e827d0f0dc0e6d25b1,45392d3ffcc43398bc6f97d929eb63b5,e34977974d668c09b9a51c41e426dbf7 -->
<!-- werkrevisor-folded -->
<details><summary>🟡 werkrevisor YELLOW for <code>8dbfe64</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/118#issuecomment-6226">the result for <code>5d0ce6c</code></a></summary>
## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind: `mixed`.
### Reasons
- **YELLOW** risky paths changed: .werkrevisor.toml (built in)
- **YELLOW** risky build changes according to Jev: .werkator.yml (weakens checks 0.05, risk 1.87, security 0.02), tools/build-rootfs (weakens checks 0.05, risk 2.02, security 0.02)
- **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** 11 section(s) of the PR document agree with the change summary of openrouter/minimax/minimax-m3, and its 8 change(s) belong to the PR document, according to Jev
- **hint** 1 finding(s) of low severity or rated minor by Jev: README.md:1216
### Findings
1. **Wording inconsistency** at `README.md:1216`, severity unknown, counted as medium
hint; Jev: real 0.70, severity 1.0 of 3
The new README section says "Without repositories it switches each machine config on the host that names a werkrevisor archive." The word "switches" is non-standard in this context and inconsistent with the parallel wording in `tools/deploy-rootfs` ("it takes each machine config on the host that names a werkrevisor archive") and the PR document. A reader would expect "updates" or "takes".
### Classifier
11 of 11 units passed all questions (1 PR document(s)).
3 answers ignored because of a confidence below [classifier] min_confidence.
<sub>
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 30833, calls 1, tokens in 29660 / out 51634 (reasoning included in out), duration 299.7 s, cost 0.0708 USD (reported), classifier `jev-1.13.0` calls 11, tokens in 8825, cost 0.0004 USD, finding judge `jev-1.13.0` calls 1, tokens in 1535, cost 0.0001 USD, change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 9160 / out 1663, cost 0.0041 USD (reported), PR document check `jev-1.13.0` calls 19, tokens in 35824, cost 0.0015 USD, build file judge `jev-1.13.0` calls 7, tokens in 10944, cost 0.0005 USD, phases: path_judge 0.5 s, classifier 0.8 s, change_summary 15.2 s, doc_check 1.2 s, context 0.3 s, model_review 280.8 s, finding_judge 0.3 s, config: defaults + host + repository (.werkrevisor.toml at main d0b4dfe).<br>
Reviewed head `8dbfe6488cd9a17dea38aa49376460e4c68b6751` against base `d0b4dfed34977f793140a47b72d9fa7181d8796d`, werkrevisor 0.44.1.
</sub>
</details>
[low] Full paths cause incorrect release retention (Codex review)
The installer now passes full paths to release_files.to_remove(), whose version() extracts the first dotted number anywhere in its input. With a directory such as /srv/releases/1.0, every archive sorts as version 1.0, so retention follows glob order instead of release versions. Reproducing with versions 0.8.0 through 0.11.0 and 0.11.0 in use deletes 0.10.0 while retaining both older archives. The backup cleanup at line 214 has the same problem.
Fix it, or reply why it does not hold, and resolve this comment.
**[low] Full paths cause incorrect release retention** (Codex review)
The installer now passes full paths to release_files.to_remove(), whose version() extracts the first dotted number anywhere in its input. With a directory such as /srv/releases/1.0, every archive sorts as version 1.0, so retention follows glob order instead of release versions. Reproducing with versions 0.8.0 through 0.11.0 and 0.11.0 in use deletes 0.10.0 while retaining both older archives. The backup cleanup at line 214 has the same problem.
Fix it, or reply why it does not hold, and resolve this comment.
<!-- werkrevisor-codex -->
Fixed in 5d0ce6c: _old_files passes only file names to release_files.to_remove, for archives and backups.
The new test with the directory releases-1.0 fails with the code before and passes with it.
Fixed in `5d0ce6c`: `_old_files` passes only file names to `release_files.to_remove`, for archives and backups.
The new test with the directory `releases-1.0` fails with the code before and passes with it.
The change introduces an unsandboxed deployment job that rewrites review-runner configurations across repositories and deletes release archives. Deployment mistakes could disrupt or compromise merge gates beyond what the synthetic archive tests establish.
Findings
[low] Full paths cause incorrect release retention at tools/release_rootfs.py:209, 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 308909 (cached 257024) / out 2294, 83.5 s, 9 commands; reviewed head `8dbfe6488cd9a17dea38aa49376460e4c68b6751`.
<!-- werkrevisor-codex:8dbfe6488cd9a17dea38aa49376460e4c68b6751 -->
<!-- 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/118#issuecomment-6226">the result for <code>5d0ce6c</code></a></summary>
## Codex review: critical
The change introduces an unsandboxed deployment job that rewrites review-runner configurations across repositories and deletes release archives. Deployment mistakes could disrupt or compromise merge gates beyond what the synthetic archive tests establish.
### Findings
1. **[low] Full paths cause incorrect release retention** at `tools/release_rootfs.py:209`, 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 308909 (cached 257024) / out 2294, 83.5 s, 9 commands; reviewed head `8dbfe6488cd9a17dea38aa49376460e4c68b6751`.
</sub>
</details>
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 11 section(s) of the PR document agree with the change summary of openrouter/minimax/minimax-m3, and its 8 change(s) belong to the PR document, according to Jev
hint model recommends merge with caution
Classifier
11 of 11 units passed all questions (1 PR document(s)).
4 answers ignored because of a confidence below [classifier] min_confidence.
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 31538, calls 1, tokens in 30333 / out 17183 (reasoning included in out), duration 99.7 s, cost 0.0297 USD (reported), classifier `jev-1.13.0` calls 11, tokens in 8825, cost 0.0004 USD, change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 9444 / out 1667, cost 0.0048 USD (reported), PR document check `jev-1.13.0` calls 19, tokens in 35538, cost 0.0015 USD, build file judge `jev-1.13.0` calls 7, tokens in 11247, cost 0.0005 USD, phases: path_judge 0.6 s, classifier 0.9 s, change_summary 9.6 s, doc_check 1.3 s, context 0.3 s, model_review 86.4 s, config: defaults + host + repository (.werkrevisor.toml at main d0b4dfe).
Reviewed head `5d0ce6c0930f60056e651f9cfaa99dc052b3d539` against base `d0b4dfed34977f793140a47b72d9fa7181d8796d`, werkrevisor 0.44.1.
<!-- werkrevisor:5d0ce6c0930f60056e651f9cfaa99dc052b3d539 -->
<!-- werkrevisor-verdict:YELLOW -->
<!-- werkrevisor-blocks:e430777418a2fbe5716bdf64a4cda10e,cf3806d84c7608a3f72474308d8ce2b7,eb30e60592570cab7c9327bfd99cda1b,2b9918243537da06937544d98f0753db,f3be62070e58b230abf2cb97ecc241bb,6a47756cac1ac89e7c620b248f03ae5e,14f8ff60e9501f4bb3327dd1d1421bd6,eb2dce5a64b389a1bf49fdc01d5e74df,fa61c658eca33726d25d8c74eb8b8fa0,f8b3f560565b8a224f15c765c144d075,2fd3d8abad9d310b0436e96c008b58ec,1b29af6daa4c1d46ddb669ee9e236733,460db994500076966de9f9b9f366f176,396480be167e624f102465e9c71b7eda,b126745a694ccf6108326f729f9bdfb6,f63ec1ec558fe0bb0135e4bb97e65243,663403f50ff023fc28b91a74d8a82aa7,04a083b61fb2c7e69f0b54b07ab1122f,51cb8b20505f362460e3d7b2df4a8550,c8ba107f40c9b96fe39908f66a4803c3,62c2e149e84c7c0c26f7f3a2d6e1d269,8551148f4bbb38d6b20ace323cb93842,a6369492adca7dddee5ec1cb246c282f,2be42d2ff6b685e827d0f0dc0e6d25b1,56a7b9291c434f5d9453ceb11b162625,e34977974d668c09b9a51c41e426dbf7 -->
## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind: `mixed`.
### Reasons
- **YELLOW** risky paths changed: .werkrevisor.toml (built in)
- **YELLOW** risky build changes according to Jev: .werkator.yml (weakens checks 0.05, risk 1.85, security 0.02), tools/build-rootfs (weakens checks 0.05, risk 2.02, security 0.02)
- **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** 11 section(s) of the PR document agree with the change summary of openrouter/minimax/minimax-m3, and its 8 change(s) belong to the PR document, according to Jev
- **hint** model recommends merge with caution
### Classifier
11 of 11 units passed all questions (1 PR document(s)).
4 answers ignored because of a confidence below [classifier] min_confidence.
<sub>
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 31538, calls 1, tokens in 30333 / out 17183 (reasoning included in out), duration 99.7 s, cost 0.0297 USD (reported), classifier `jev-1.13.0` calls 11, tokens in 8825, cost 0.0004 USD, change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 9444 / out 1667, cost 0.0048 USD (reported), PR document check `jev-1.13.0` calls 19, tokens in 35538, cost 0.0015 USD, build file judge `jev-1.13.0` calls 7, tokens in 11247, cost 0.0005 USD, phases: path_judge 0.6 s, classifier 0.9 s, change_summary 9.6 s, doc_check 1.3 s, context 0.3 s, model_review 86.4 s, config: defaults + host + repository (.werkrevisor.toml at main d0b4dfe).<br>
Reviewed head `5d0ce6c0930f60056e651f9cfaa99dc052b3d539` against base `d0b4dfed34977f793140a47b72d9fa7181d8796d`, werkrevisor 0.44.1.
</sub>
The release job runs outside the sandbox, replaces the live review runtime across repositories, modifies host configurations containing credentials, and deletes older archives and backups. Mistakes could compromise or disrupt merge gates in ways the unit tests would not reveal.
No findings.
The merge waits for the status ai-review/codex: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here.
Model `gpt-6-astra`, effort high, tokens in 265876 (cached 213632) / out 1750, 58.2 s, 8 commands; reviewed head `5d0ce6c0930f60056e651f9cfaa99dc052b3d539`.
<!-- werkrevisor-codex:5d0ce6c0930f60056e651f9cfaa99dc052b3d539 -->
<!-- werkrevisor-codex-critical:true -->
<!-- werkrevisor-codex-unattached:0 -->
<!-- werkrevisor-codex -->
## Codex review: critical
The release job runs outside the sandbox, replaces the live review runtime across repositories, modifies host configurations containing credentials, and deletes older archives and backups. Mistakes could compromise or disrupt merge gates in ways the unit tests would not reveal.
No findings.
The merge waits for the status `ai-review/codex`: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here.
<sub>
Model `gpt-6-astra`, effort high, tokens in 265876 (cached 213632) / out 1750, 58.2 s, 8 commands; reviewed head `5d0ce6c0930f60056e651f9cfaa99dc052b3d539`.
</sub>
Review of 5d0ce6c: no open line comments, no findings.
The YELLOW reasons (.werkrevisor.toml, .werkator.yml, tools/build-rootfs) and Codex's "critical" rate a native release build that rewrites the machine configs; that is structural and left to the human.
Tested: 756 unit tests; on mih09 with Python 3.11 and the zstd program in a temporary home; tools/deploy-rootfs with a local ssh stand-in.
Review of `5d0ce6c`: no open line comments, no findings.
The YELLOW reasons (`.werkrevisor.toml`, `.werkator.yml`, `tools/build-rootfs`) and Codex's "critical" rate a native release build that rewrites the machine configs; that is structural and left to the human.
Tested: 756 unit tests; on mih09 with Python 3.11 and the `zstd` program in a temporary home; `tools/deploy-rootfs` with a local ssh stand-in.
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 the PR document under docs/prs/.
🤖 Generated with Claude Code
WIP: werkrevisor 0.45.0: Werkator releases werkrevisor after each mergeto WIP: werkrevisor 0.46.0: Werkator releases werkrevisor after each merge🟡 werkrevisor YELLOW for
02dbc76, superseded by the result for5bfc65e🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind:
mixed.Reasons
Findings
Incorrect standard-library claim at
docs/prs/2026-10-17-PR#118-release-build.md:86, severity unknown, counted as medium, hint, as a line commentContradictory explanation at
docs/prs/2026-10-17-PR#118-release-build.md:84-85, severity unknown, counted as medium, hint, as a line commentClassifier
10 of 10 units passed all questions (1 PR document(s)).
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 29222, calls 1, tokens in 28095 / out 11992 (reasoning included in out), duration 98.6 s, cost 0.0228 USD (reported), classifier `jev-1.13.0` calls 10, tokens in 8081, cost 0.0003 USD, finding judge `jev-1.13.0` calls 2, tokens in 3416, cost 0.0001 USD, change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 8553 / out 1989, cost 0.0049 USD (reported), PR document check `jev-1.13.0` calls 21, tokens in 41649, cost 0.0017 USD, build file judge `jev-1.13.0` calls 7, tokens in 10299, cost 0.0004 USD, phases: path_judge 0.6 s, classifier 0.7 s, change_summary 8.9 s, doc_check 1.3 s, context 0.3 s, model_review 86.0 s, finding_judge 0.3 s, config: defaults + host + repository (.werkrevisor.toml at main2 answers ignored because of a confidence below [classifier] min_confidence.
d0b4dfe).Reviewed head `02dbc76655868f35088cab0296f4d0d455393fed` against base `d0b4dfed34977f793140a47b72d9fa7181d8796d`, werkrevisor 0.44.1.
werkrevisor: YELLOW / HUMAN_REVIEW for
02dbc76655868f35088cab0296f4d0d455393fed.The result comment of werkrevisor holds the details.
@@ -0,0 +81,4 @@It reads the version and assembles `werkrevisor-rootfs-<version>.tar.zst` with Python's `tarfile`:the base archive `pr-agent-rootfs-<digest>.tar.zst`, plus `/work`, `werkrevisor/werkrevisor/` and `werkrevisor/config/`,owned by root, without `__pycache__`.Its file list equals the one of the archive 0.44.1, plus `/work`:Contradictory explanation, severity unknown, counted as medium (werkrevisor)
hint; Jev: real 0.76, severity 1.5 of 3
The solution section says the new archive's file list equals the 0.44.1 list "plus
/work" and then states "the reviews do not need it". If the reviews do not need theworkdirectory, the rationale for adding it back is missing; if they do need it, the sentence is wrong. The current wording leaves the reader unable to tell why the directory is reinstated, which is exactly the kind of decision a PR document is supposed to record.Fixed in
5bfc65e: the document now says why/workis there: it is theWORKDIRof theDockerfile, so the assembled archive matches it, although the reviews do not use it.@@ -0,0 +83,4 @@owned by root, without `__pycache__`.Its file list equals the one of the archive 0.44.1, plus `/work`:the Docker build of 0.43.0 holds it, the Podman build of 0.44.1 does not, and the reviews do not need it.- It takes zstd from the standard library of Python 3.14, else the `zstd` program; mih09 has Python 3.11.Incorrect standard-library claim, severity unknown, counted as medium (werkrevisor)
hint; Jev: real 0.87, severity 1.9 of 3
The PR document states "It takes zstd from the standard library of Python 3.14", but the
compressionmodule used intools/release_rootfs.pyis a third-party package, not part of Python's standard library. The code itself shows this withtry: from compression import zstd / except ImportError, falling back to thezstdprogram when the package is missing. Claiming the opposite in the PR document misleads future maintainers and readers about where the module comes from and whether it requires an extra dependency.Not a defect in the code:
compression.zstdis part of the standard library since Python 3.14 (PEP 784); the PR-Agent image has Python 3.14.7, mih09 has 3.11 and takes thezstdprogram.To prevent the misreading,
5bfc65enames the module and PEP 784 in the document.Codex review of
02dbc76655868f35088cab0296f4d0d455393fed@@ -0,0 +175,4 @@shutil.copy2(yml, backup)with open(yml, encoding="utf-8") as f:text = ARCHIVE.sub(name, f.read())with open(yml, "w", encoding="utf-8") as f:[medium] Replace machine configurations atomically (Codex review)
Opening the live configuration with "w" truncates it before writing the replacement. Concurrent readers can observe an empty or partial configuration, and an interrupted or failed write leaves it damaged. This regresses the previous sed -i implementation, which replaced the file through a temporary file. Write a temporary file with the original permissions and atomically replace the live configuration.
Fix it, or reply why it does not hold, and resolve this comment.
Fixed in
5bfc65e:_replacewrites a temporary file in the same directory, copies the mode and replaces the machine config withos.replace; a failed write removes the temporary file.⚠️ werkrevisor ERROR for
?, superseded by the result for5bfc65eCodex review: critical
The change introduces automatic releases outside the sandbox and rewrites token-bearing machine configurations across repositories. Mistakes could disrupt production review gates or damage their configuration in ways the unit tests would not reveal.
Findings
tools/release_rootfs.py:178, as a line commentThe merge waits for the status
Model `gpt-6-astra`, effort high, tokens in 240876 (cached 195328) / out 2031, 74.3 s, 6 commands; reviewed head `02dbc76655868f35088cab0296f4d0d455393fed`.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.🟡 werkrevisor YELLOW for
5bfc65e, superseded by the result for8dbfe64🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind:
mixed.Reasons
Classifier
10 of 10 units passed all questions (1 PR document(s)).
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 29998, calls 1, tokens in 28854 / out 26596 (reasoning included in out), duration 163.0 s, cost 0.0405 USD (reported), classifier `jev-1.13.0` calls 10, tokens in 8153, cost 0.0003 USD, change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 8852 / out 1964, cost 0.0050 USD (reported), PR document check `jev-1.13.0` calls 18, tokens in 34812, cost 0.0015 USD, build file judge `jev-1.13.0` calls 7, tokens in 10613, cost 0.0004 USD, phases: path_judge 0.5 s, classifier 0.7 s, change_summary 19.0 s, doc_check 1.2 s, context 0.3 s, model_review 140.4 s, config: defaults + host + repository (.werkrevisor.toml at main2 answers ignored because of a confidence below [classifier] min_confidence.
d0b4dfe).Reviewed head `5bfc65e1c4e457e562ebcca30c6d409d62744f91` against base `d0b4dfed34977f793140a47b72d9fa7181d8796d`, werkrevisor 0.44.1.
Codex review of
5bfc65e1c4e457e562ebcca30c6d409d62744f91@@ -0,0 +188,4 @@if not os.path.exists(backup):shutil.copy2(yml, backup)with open(yml, encoding="utf-8") as f:text = ARCHIVE.sub(name, f.read())[medium] Automatic installation can point configurations at missing archives (Codex review)
Without an explicit repository list, install updates every discovered configuration but replaces only the archive basename. If repositories use different archive directories, the new archive exists only in the supplied directory while other configurations point to nonexistent files, breaking their builds. This also affects
release <directory>, which the error from archive_directory explicitly suggests when multiple directories exist.Fix it, or reply why it does not hold, and resolve this comment.
Fixed in
8dbfe64:installrefuses, before it changes anything, if a selected machine config names a werkrevisor archive outside the target directory;archive_directoryno longer suggests to give one.⚠️ werkrevisor ERROR for
?, superseded by the result for8dbfe64Codex review: critical
The change introduces automatic deployment outside the sandbox, rewrites live merge-gate configurations across repositories, and deletes old archives. Mistakes could disrupt or compromise the review gate in ways the isolated tests would not reveal.
Findings
tools/release_rootfs.py:191, as a line commentThe merge waits for the status
Model `gpt-6-astra`, effort high, tokens in 256346 (cached 202752) / out 2672, 92.8 s, 8 commands; reviewed head `5bfc65e1c4e457e562ebcca30c6d409d62744f91`.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.🟡 werkrevisor YELLOW for
8dbfe64, superseded by the result for5d0ce6c🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind:
mixed.Reasons
Findings
Wording inconsistency at
README.md:1216, severity unknown, counted as mediumhint; Jev: real 0.70, severity 1.0 of 3
The new README section says "Without repositories it switches each machine config on the host that names a werkrevisor archive." The word "switches" is non-standard in this context and inconsistent with the parallel wording in
tools/deploy-rootfs("it takes each machine config on the host that names a werkrevisor archive") and the PR document. A reader would expect "updates" or "takes".Classifier
11 of 11 units passed all questions (1 PR document(s)).
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 30833, calls 1, tokens in 29660 / out 51634 (reasoning included in out), duration 299.7 s, cost 0.0708 USD (reported), classifier `jev-1.13.0` calls 11, tokens in 8825, cost 0.0004 USD, finding judge `jev-1.13.0` calls 1, tokens in 1535, cost 0.0001 USD, change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 9160 / out 1663, cost 0.0041 USD (reported), PR document check `jev-1.13.0` calls 19, tokens in 35824, cost 0.0015 USD, build file judge `jev-1.13.0` calls 7, tokens in 10944, cost 0.0005 USD, phases: path_judge 0.5 s, classifier 0.8 s, change_summary 15.2 s, doc_check 1.2 s, context 0.3 s, model_review 280.8 s, finding_judge 0.3 s, config: defaults + host + repository (.werkrevisor.toml at main3 answers ignored because of a confidence below [classifier] min_confidence.
d0b4dfe).Reviewed head `8dbfe6488cd9a17dea38aa49376460e4c68b6751` against base `d0b4dfed34977f793140a47b72d9fa7181d8796d`, werkrevisor 0.44.1.
Codex review of
8dbfe6488cd9a17dea38aa49376460e4c68b6751@@ -0,0 +206,4 @@changed = [str(i + 1) for i, (a, b) in enumerate(zip(old, text.splitlines())) if a != b]print(f"{repo}: {' '.join(changed)}", file=out)in_use = names_in_use(home)for old in release_files.to_remove(glob.glob(os.path.join(directory, "werkrevisor-rootfs-*.tar.zst")),[low] Full paths cause incorrect release retention (Codex review)
The installer now passes full paths to release_files.to_remove(), whose version() extracts the first dotted number anywhere in its input. With a directory such as /srv/releases/1.0, every archive sorts as version 1.0, so retention follows glob order instead of release versions. Reproducing with versions 0.8.0 through 0.11.0 and 0.11.0 in use deletes 0.10.0 while retaining both older archives. The backup cleanup at line 214 has the same problem.
Fix it, or reply why it does not hold, and resolve this comment.
Fixed in
5d0ce6c:_old_filespasses only file names torelease_files.to_remove, for archives and backups.The new test with the directory
releases-1.0fails with the code before and passes with it.⚠️ werkrevisor ERROR for
?, superseded by the result for5d0ce6cCodex review: critical
The change introduces an unsandboxed deployment job that rewrites review-runner configurations across repositories and deletes release archives. Deployment mistakes could disrupt or compromise merge gates beyond what the synthetic archive tests establish.
Findings
tools/release_rootfs.py:209, as a line commentThe merge waits for the status
Model `gpt-6-astra`, effort high, tokens in 308909 (cached 257024) / out 2294, 83.5 s, 9 commands; reviewed head `8dbfe6488cd9a17dea38aa49376460e4c68b6751`.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.🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind:
mixed.Reasons
Classifier
11 of 11 units passed all questions (1 PR document(s)).
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 31538, calls 1, tokens in 30333 / out 17183 (reasoning included in out), duration 99.7 s, cost 0.0297 USD (reported), classifier `jev-1.13.0` calls 11, tokens in 8825, cost 0.0004 USD, change summary `openrouter/minimax/minimax-m3` via Minimax calls 1, tokens in 9444 / out 1667, cost 0.0048 USD (reported), PR document check `jev-1.13.0` calls 19, tokens in 35538, cost 0.0015 USD, build file judge `jev-1.13.0` calls 7, tokens in 11247, cost 0.0005 USD, phases: path_judge 0.6 s, classifier 0.9 s, change_summary 9.6 s, doc_check 1.3 s, context 0.3 s, model_review 86.4 s, config: defaults + host + repository (.werkrevisor.toml at main4 answers ignored because of a confidence below [classifier] min_confidence.
d0b4dfe).Reviewed head `5d0ce6c0930f60056e651f9cfaa99dc052b3d539` against base `d0b4dfed34977f793140a47b72d9fa7181d8796d`, werkrevisor 0.44.1.
Codex review: critical
The release job runs outside the sandbox, replaces the live review runtime across repositories, modifies host configurations containing credentials, and deletes older archives and backups. Mistakes could compromise or disrupt merge gates in ways the unit tests would not reveal.
No findings.
The merge waits for the status
Model `gpt-6-astra`, effort high, tokens in 265876 (cached 213632) / out 1750, 58.2 s, 8 commands; reviewed head `5d0ce6c0930f60056e651f9cfaa99dc052b3d539`.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.Review of
5d0ce6c: no open line comments, no findings.The YELLOW reasons (
.werkrevisor.toml,.werkator.yml,tools/build-rootfs) and Codex's "critical" rate a native release build that rewrites the machine configs; that is structural and left to the human.Tested: 756 unit tests; on mih09 with Python 3.11 and the
zstdprogram in a temporary home;tools/deploy-rootfswith a local ssh stand-in.