werkrevisor 0.60.0: rotate the secrets of the review builds without a stop #128

Merged
ai-reviewer merged 16 commits from claude-code/rotate-secrets into main 2026-10-21 22:33:42 +02:00
Collaborator

A tool and a procedure to rotate GITEA_BOT_TOKEN, OPENROUTER_API_KEY, TYPESAFE_API_KEY and WERKREVISOR_STATS_TOKEN.

🤖 Generated with Claude Code

A tool and a procedure to rotate GITEA_BOT_TOKEN, OPENROUTER_API_KEY, TYPESAFE_API_KEY and WERKREVISOR_STATS_TOKEN. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
claude-code marked the pull request as ready for review 2026-10-20 18:17:48 +02:00
Collaborator
🟡 werkrevisor YELLOW for 729e0c7, superseded by the result for 7deb465

🟡 werkrevisor: YELLOW / HUMAN_REVIEW

Change kind: mixed.

Reasons

  • YELLOW risky paths changed: tests/test_rotate_secret.py (/secret), tests/test_secretprobe.py (/secret), tools/host_secret.py (**/secret) and 2 more
  • YELLOW PR too large for an AI-only approval: 911 changed lines (docs and mechanical files not counted) exceed [size] max_changed_lines = 800; please review it yourself
  • YELLOW spec: docs/prs/2026-10-20-PR#128-rotate-secrets.md Scenario#128.05 more_than_one_aspect (0.68 > yellow_above = 0.6)
  • YELLOW spec: docs/prs/2026-10-20-PR#128-rotate-secrets.md section 'Follow-up PRs' hard_to_understand (0.59 > yellow_above = 0.5)
  • hint writing rules violated in the changed docs: README.md:1289: line longer than 128 characters (129)
  • hint 2 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 changed file(s) agree with the PR document according to Jev

Classifier

Unit Question Problem Confidence Verdict
docs/prs/2026-10-20-PR#128-rotate-secrets.md Scenario#128.05 more_than_one_aspect 0.68 – YELLOW
docs/prs/2026-10-20-PR#128-rotate-secrets.md section 'Follow-up PRs' hard_to_understand 0.59 0.60 YELLOW

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

Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 51159, calls 1, tokens in 49367 / out 53186 (reasoning included in out), duration 630.6 s, cost 0.0786 USD (reported), classifier `jev-1.13.0` calls 11, tokens in 9855, cost 0.0004 USD, PR document check `jev-1.13.0` calls 11, tokens in 51031, cost 0.0021 USD, build file judge `jev-1.13.0` calls 3, tokens in 1680, cost 0.0001 USD, phases: path_judge 0.2 s, classifier 0.7 s, doc_check 0.8 s, context 0.7 s, model_review 627.6 s, config: defaults + host + repository (.werkrevisor.toml at main 88772c4).
Reviewed head `729e0c75e35cb1ede8f734810663059109989d30` against base `88772c494abe8d265952e10c082327a0785451c2`, werkrevisor 0.54.1.

Diagrams

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

pr-lens-v-containers.svg

pr-lens-v-flow.svg

<!-- werkrevisor:729e0c75e35cb1ede8f734810663059109989d30 --> <!-- werkrevisor-verdict:YELLOW --> <!-- werkrevisor-blocks:edff65c2b349faa3d559f8b4cf89094d,a33676818e75e6188a182f2a3eec7cd6,5ab4d08cecb0cee075c95588bcb3c066,644e8213df2f22fe4f937fed26303105,264997333769cbbb2e7ecc621ab004c6,4d26b639a2aa631b992d4af528884219,f13bbb1408183b836c6d9c6a70c23ff8,fb744df02bc6bd32ff24bd88ded26ce0,fb300cb9a76e9717d1133028abfb254c,82aaa6e069eedc74893a19334adae421,c53429501a14ae6a34c05e2f32c10734,aa4a2b4673e729e52b5ad663686d5db5,0cb27dcd33de5b6d0d1c28e1af5d1c2c,0d0ca179671352a902aeab0629cafa45,e677f5f6b17a5bde279cbf9a13c4098f,578ddb83ffdfaa1aa204031ff63f815d,97f0de698613ce7de2257f9530bccd39,d375483220680e71b8050685bcf76db7 --> <!-- werkrevisor:diagrams --> <!-- werkrevisor-folded --> <details><summary>🟡 werkrevisor YELLOW for <code>729e0c7</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/128#issuecomment-6898">the result for <code>7deb465</code></a></summary> ## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW Change kind: `mixed`. ### Reasons - **YELLOW** risky paths changed: tests/test_rotate_secret.py (**/*secret*), tests/test_secretprobe.py (**/*secret*), tools/host_secret.py (**/*secret*) and 2 more - **YELLOW** PR too large for an AI-only approval: 911 changed lines (docs and mechanical files not counted) exceed [size] max_changed_lines = 800; please review it yourself - **YELLOW** spec: docs/prs/2026-10-20-PR#128-rotate-secrets.md Scenario#128.05 more_than_one_aspect (0.68 > yellow_above = 0.6) - **YELLOW** spec: docs/prs/2026-10-20-PR#128-rotate-secrets.md section 'Follow-up PRs' hard_to_understand (0.59 > yellow_above = 0.5) - **hint** writing rules violated in the changed docs: README.md:1289: line longer than 128 characters (129) - **hint** 2 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 changed file(s) agree with the PR document according to Jev ### Classifier | Unit | Question | Problem | Confidence | Verdict | |---|---|---|---|---| | docs/prs/2026-10-20-PR#128-rotate-secrets.md Scenario#128.05 | more_than_one_aspect | 0.68 | – | YELLOW | | docs/prs/2026-10-20-PR#128-rotate-secrets.md section 'Follow-up PRs' | hard_to_understand | 0.59 | 0.60 | YELLOW | 9 of 11 units passed all questions (1 PR document(s)). 5 answers ignored because of a confidence below [classifier] min_confidence. <sub> Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 51159, calls 1, tokens in 49367 / out 53186 (reasoning included in out), duration 630.6 s, cost 0.0786 USD (reported), classifier `jev-1.13.0` calls 11, tokens in 9855, cost 0.0004 USD, PR document check `jev-1.13.0` calls 11, tokens in 51031, cost 0.0021 USD, build file judge `jev-1.13.0` calls 3, tokens in 1680, cost 0.0001 USD, phases: path_judge 0.2 s, classifier 0.7 s, doc_check 0.8 s, context 0.7 s, model_review 627.6 s, config: defaults + host + repository (.werkrevisor.toml at main 88772c4).<br> Reviewed head `729e0c75e35cb1ede8f734810663059109989d30` against base `88772c494abe8d265952e10c082327a0785451c2`, werkrevisor 0.54.1. </sub> ### Diagrams Drawn by a model from the diff with [PR Lens](https://github.com/coldteadotai/pr-lens): a view of what the PR touches, not a statement of what it does. ![pr-lens-v-containers.svg](https://git.javagil.de/attachments/2e77309d-8b3d-4992-ae0c-4e7d4a4f656b) ![pr-lens-v-flow.svg](https://git.javagil.de/attachments/e7a36ca6-fc8c-4484-a974-084c9ff980c2) </details>
ai-reviewer left a comment
Collaborator

werkrevisor: YELLOW / HUMAN_REVIEW for 729e0c75e35cb1ede8f734810663059109989d30.
The result comment of werkrevisor holds the details.

werkrevisor: YELLOW / HUMAN_REVIEW for `729e0c75e35cb1ede8f734810663059109989d30`. The result comment of werkrevisor holds the details. <!-- werkrevisor-review:729e0c75e35cb1ede8f734810663059109989d30 -->
README.md Outdated
@@ -1286,6 +1286,21 @@ A machine config may leave out the keys that the `.werkrevisor.toml` of its repo
these keys show as "only in the file", and `--apply` would add them.
`--apply` keeps the old file as `.werkator.yml.bak-config-<time>`, and the two newest of these backups.
Rotate one secret, e.g. `OPENROUTER_API_KEY`, in each machine config that has it and in `~/.config/ai-coding-agents/secrets.env`:
Collaborator

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

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

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

Fixed in 7deb465: the sentence is split after "has it".

Fixed in `7deb465`: the sentence is split after "has it".
claude-code marked this conversation as resolved
ai-reviewer scheduled this pull request to auto merge when all checks succeed 2026-10-20 18:28:26 +02:00
ai-reviewer requested review from mi 2026-10-20 18:28:26 +02:00
ai-reviewer left a comment
Collaborator

Codex review of 729e0c75e35cb1ede8f734810663059109989d30

Codex review of `729e0c75e35cb1ede8f734810663059109989d30` <!-- werkrevisor-codex -->
@@ -0,0 +60,4 @@
try:
with open(path) as f:
found = find(f.read().split("\n"), key, yaml)
except (OSError, UnicodeDecodeError):
Collaborator

[medium] Unreadable live configurations silently pass verification (Codex review)

value_of converts read failures into None, and check silently skips those targets. Consequently, a permission-denied or undecodable machine configuration can retain the old credential while check exits successfully. Read failures on live configurations must be reported as errors rather than treated as absent keys.

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

**[medium] Unreadable live configurations silently pass verification** (Codex review) value_of converts read failures into None, and check silently skips those targets. Consequently, a permission-denied or undecodable machine configuration can retain the old credential while check exits successfully. Read failures on live configurations must be reported as errors rather than treated as absent keys. Fix it, or reply why it does not hold, and resolve this comment. <!-- werkrevisor-codex -->
Author
Collaborator

Fixed in 7deb465: read_lines() turns a read or decode error into an error with exit code 2 for check, set and purge; test_an_unreadable_machine_config_is_an_error (Scenario#128.08). Only a backup that cannot be read counts as not holding the value.

Fixed in `7deb465`: `read_lines()` turns a read or decode error into an error with exit code 2 for `check`, `set` and `purge`; `test_an_unreadable_machine_config_is_an_error` (Scenario#128.08). Only a backup that cannot be read counts as not holding the value.
claude-code marked this conversation as resolved
@@ -0,0 +68,4 @@
def backups(path):
directory, name = os.path.split(path)
return sorted(os.path.join(directory, n) for n in os.listdir(directory or ".")
if n.startswith(name) and n != name and os.path.isfile(os.path.join(directory, n)))
Collaborator

[high] Purge can delete live files sharing the filename prefix (Codex review)

Every regular file beginning with the target's basename is classified as a backup. For example, purging secrets.env also deletes secrets.env.production if it contains the old token, even though that file can be an independent live configuration. Restrict deletion to recognized backup names.

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

**[high] Purge can delete live files sharing the filename prefix** (Codex review) Every regular file beginning with the target's basename is classified as a backup. For example, purging secrets.env also deletes secrets.env.production if it contains the old token, even though that file can be an independent live configuration. Restrict deletion to recognized backup names. Fix it, or reply why it does not hold, and resolve this comment. <!-- werkrevisor-codex -->
Author
Collaborator

Fixed in 7deb465: backups() takes only the backup names on the hosts, <file>.bak…, .pre… and .before…, so secrets.env.production stays; test_purge_keeps_a_file_that_only_shares_the_prefix proves it. On mih09 the counts of check are the same as before.

Fixed in `7deb465`: `backups()` takes only the backup names on the hosts, `<file>.bak…`, `.pre…` and `.before…`, so `secrets.env.production` stays; `test_purge_keeps_a_file_that_only_shares_the_prefix` proves it. On mih09 the counts of `check` are the same as before.
claude-code marked this conversation as resolved
@@ -0,0 +69,4 @@
return Outcome(False, f"the token belongs to {login!r}, not to {GITEA_USER}")
status, repo = _call(opener, "GET", f"{GITEA_URL}/api/v1/repos/{GITEA_REPO}", header)
if status != 200:
return Outcome(False, f"{GITEA_USER}, but reading {GITEA_REPO} gives HTTP {status}")
Collaborator

[low] The second Gitea request misclassifies outages as refusal (Codex review)

If /user succeeds but the repository request returns HTTP 502 or 503, this branch returns Outcome(False), producing exit code 1. That contradicts the probe's distinction between refused credentials and an incomplete probe; server failures here should return exit code 2, as they do for the first request.

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

**[low] The second Gitea request misclassifies outages as refusal** (Codex review) If /user succeeds but the repository request returns HTTP 502 or 503, this branch returns Outcome(False), producing exit code 1. That contradicts the probe's distinction between refused credentials and an incomplete probe; server failures here should return exit code 2, as they do for the first request. Fix it, or reply why it does not hold, and resolve this comment. <!-- werkrevisor-codex -->
Author
Collaborator

Fixed in 7deb465: the repository request uses _refused(), so 401/403 refuse and any other status exits with 2; covered in test_an_outage_is_no_refusal.

Fixed in `7deb465`: the repository request uses `_refused()`, so 401/403 refuse and any other status exits with 2; covered in `test_an_outage_is_no_refusal`.
claude-code marked this conversation as resolved
@@ -0,0 +70,4 @@
status, repo = _call(opener, "GET", f"{GITEA_URL}/api/v1/repos/{GITEA_REPO}", header)
if status != 200:
return Outcome(False, f"{GITEA_USER}, but reading {GITEA_REPO} gives HTTP {status}")
if not (repo.get("permissions") or {}).get("push"):
Collaborator

[medium] Repository permissions do not prove the token has write scopes (Codex review)

An ai-reviewer token with only read:user and read:repository passes both GET requests and can return permissions.push=true. That field describes the account's repository permissions, while token scopes are enforced separately, so the probe accepts a token that cannot submit reviews or comments. See Gitea's permission conversion and scope enforcement.

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

**[medium] Repository permissions do not prove the token has write scopes** (Codex review) An ai-reviewer token with only read:user and read:repository passes both GET requests and can return permissions.push=true. That field describes the account's repository permissions, while token scopes are enforced separately, so the probe accepts a token that cannot submit reviews or comments. See Gitea's [permission conversion](https://raw.githubusercontent.com/go-gitea/gitea/v1.24.6/services/convert/repository.go) and [scope enforcement](https://raw.githubusercontent.com/go-gitea/gitea/v1.24.6/routers/api/v1/api.go). Fix it, or reply why it does not hold, and resolve this comment. <!-- werkrevisor-codex -->
Author
Collaborator

Fixed in 7deb465: the probe now posts {} to pulls/0/reviews (write:repository) and issues/0/comments (write:issue). Gitea checks the scope first: 403 without it; with it 404 or 422, and nothing is created. Live with the current token: 404 and 422, probe accepted.

Fixed in `7deb465`: the probe now posts `{}` to `pulls/0/reviews` (write:repository) and `issues/0/comments` (write:issue). Gitea checks the scope first: 403 without it; with it 404 or 422, and nothing is created. Live with the current token: 404 and 422, probe accepted.
claude-code marked this conversation as resolved
Collaborator
⚠️ werkrevisor ERROR for ?, superseded by the result for 7deb465

Codex review: critical

This changes production credential handling and permanently deletes files containing secrets. Mistakes could expose credentials, interrupt review builds, or delete live configuration in ways the mocked tests would not reveal.

Findings

  1. [high] Purge can delete live files sharing the filename prefix at tools/host_secret.py:71, as a line comment
  2. [medium] Repository permissions do not prove the token has write scopes at werkrevisor/secretprobe.py:73, as a line comment
  3. [medium] Unreadable live configurations silently pass verification at tools/host_secret.py:63, as a line comment
  4. [low] The second Gitea request misclassifies outages as refusal at werkrevisor/secretprobe.py:72, 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 477935 (cached 406272) / out 3158, 118.9 s, 12 commands; reviewed head `729e0c75e35cb1ede8f734810663059109989d30`.
<!-- werkrevisor-codex:729e0c75e35cb1ede8f734810663059109989d30 --> <!-- 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/128#issuecomment-6898">the result for <code>7deb465</code></a></summary> ## Codex review: critical This changes production credential handling and permanently deletes files containing secrets. Mistakes could expose credentials, interrupt review builds, or delete live configuration in ways the mocked tests would not reveal. ### Findings 1. **[high] Purge can delete live files sharing the filename prefix** at `tools/host_secret.py:71`, as a line comment 2. **[medium] Repository permissions do not prove the token has write scopes** at `werkrevisor/secretprobe.py:73`, as a line comment 3. **[medium] Unreadable live configurations silently pass verification** at `tools/host_secret.py:63`, as a line comment 4. **[low] The second Gitea request misclassifies outages as refusal** at `werkrevisor/secretprobe.py:72`, 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 477935 (cached 406272) / out 3158, 118.9 s, 12 commands; reviewed head `729e0c75e35cb1ede8f734810663059109989d30`. </sub> </details>
Author
Collaborator

Answer to the review of 729e0c7, fixed in 7deb465:

  • Codex findings 1 to 4: fixed, see the threads.
  • Scenario#128.05 had two aspects: split into 128.05 (only backups with the old value go) and 128.07 (purge waits while a machine config holds the old value); 128.08 covers unreadable configs.
  • Follow-up PRs: rewritten in plain sentences.
  • README line of 129 characters: split.
  • Left to the human, since they are structural: the risky paths **/*secret* and the size of 911 lines.
    The PR touches the handling of production secrets, so the human reviews it anyway.

The rotation itself waits for werkator PR#166 and werkdock PR#17 on mih09.

Answer to the review of `729e0c7`, fixed in `7deb465`: - Codex findings 1 to 4: fixed, see the threads. - Scenario#128.05 had two aspects: split into 128.05 (only backups with the old value go) and 128.07 (purge waits while a machine config holds the old value); 128.08 covers unreadable configs. - Follow-up PRs: rewritten in plain sentences. - README line of 129 characters: split. - Left to the human, since they are structural: the risky paths `**/*secret*` and the size of 911 lines. The PR touches the handling of production secrets, so the human reviews it anyway. The rotation itself waits for werkator PR#166 and werkdock PR#17 on mih09.
Collaborator
🟡 werkrevisor YELLOW for 7deb465, superseded by the result for a6e8897

🟡 werkrevisor: YELLOW / HUMAN_REVIEW

Gate: no human review requested; merge conflict with main: the author rebases the branch onto main and pushes.

Change kind: mixed.

Reasons

  • YELLOW risky paths changed: tests/test_rotate_secret.py (/secret), tests/test_secretprobe.py (/secret), tools/host_secret.py (**/secret) and 2 more
  • YELLOW PR too large for an AI-only approval: 970 changed lines (docs and mechanical files not counted) exceed [size] max_changed_lines = 800; please review it yourself
  • hint 2 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.01)
  • hint 11 changed file(s) agree with the PR document according to Jev
  • hint model recommends merge with caution

Classifier

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

Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 53811, calls 1, tokens in 51913 / out 35379 (reasoning included in out), duration 464.4 s, cost 0.0580 USD (reported), classifier `jev-1.13.0` calls 13, tokens in 11843, cost 0.0005 USD, PR document check `jev-1.13.0` calls 11, tokens in 57268, cost 0.0024 USD, build file judge `jev-1.13.0` calls 3, tokens in 1680, cost 0.0001 USD, phases: path_judge 0.2 s, classifier 1.0 s, doc_check 1.0 s, context 1.2 s, model_review 452.8 s, config: defaults + host + repository (.werkrevisor.toml at main 02c5cad).
Reviewed head `7deb465d58a0beaf6fa1e5b001ec477328394db6` against base `02c5cad01497e3bc457babf06bdcace76a87a777`, werkrevisor 0.55.0.

Diagrams

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

pr-lens-arch-overview.svg

pr-lens-flow-set.svg

<!-- werkrevisor:7deb465d58a0beaf6fa1e5b001ec477328394db6 --> <!-- werkrevisor-verdict:YELLOW --> <!-- werkrevisor-blocks:0a77a3e761bde6b4b07156a7bd986e94,a33676818e75e6188a182f2a3eec7cd6,5ab4d08cecb0cee075c95588bcb3c066,644e8213df2f22fe4f937fed26303105,264997333769cbbb2e7ecc621ab004c6,4d26b639a2aa631b992d4af528884219,f13bbb1408183b836c6d9c6a70c23ff8,fb744df02bc6bd32ff24bd88ded26ce0,caf5ca85dbb95633344534eb144a85fd,82aaa6e069eedc74893a19334adae421,c53429501a14ae6a34c05e2f32c10734,aa4a2b4673e729e52b5ad663686d5db5,947518cb31c089915207a1bc69e28e60,b32b9cea84dc00e70cc32350253d3ddd,b581e22ac39db474f163353219129b4f,fd54c48d432edb8d99d4c6976faac941,97f0de698613ce7de2257f9530bccd39,bde9cd068e9b1c9a4c3f699812faed23 --> <!-- werkrevisor:diagrams --> <!-- werkrevisor-folded --> <details><summary>🟡 werkrevisor YELLOW for <code>7deb465</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/128#issuecomment-6906">the result for <code>a6e8897</code></a></summary> ## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW Gate: no human review requested; merge conflict with main: the author rebases the branch onto main and pushes. Change kind: `mixed`. ### Reasons - **YELLOW** risky paths changed: tests/test_rotate_secret.py (**/*secret*), tests/test_secretprobe.py (**/*secret*), tools/host_secret.py (**/*secret*) and 2 more - **YELLOW** PR too large for an AI-only approval: 970 changed lines (docs and mechanical files not counted) exceed [size] max_changed_lines = 800; please review it yourself - **hint** 2 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.01) - **hint** 11 changed file(s) agree with the PR document according to Jev - **hint** model recommends merge with caution ### Classifier 13 of 13 units passed all questions (1 PR document(s)). 5 answers ignored because of a confidence below [classifier] min_confidence. <sub> Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 53811, calls 1, tokens in 51913 / out 35379 (reasoning included in out), duration 464.4 s, cost 0.0580 USD (reported), classifier `jev-1.13.0` calls 13, tokens in 11843, cost 0.0005 USD, PR document check `jev-1.13.0` calls 11, tokens in 57268, cost 0.0024 USD, build file judge `jev-1.13.0` calls 3, tokens in 1680, cost 0.0001 USD, phases: path_judge 0.2 s, classifier 1.0 s, doc_check 1.0 s, context 1.2 s, model_review 452.8 s, config: defaults + host + repository (.werkrevisor.toml at main 02c5cad).<br> Reviewed head `7deb465d58a0beaf6fa1e5b001ec477328394db6` against base `02c5cad01497e3bc457babf06bdcace76a87a777`, werkrevisor 0.55.0. </sub> ### Diagrams Drawn by a model from the diff with [PR Lens](https://github.com/coldteadotai/pr-lens): a view of what the PR touches, not a statement of what it does. ![pr-lens-arch-overview.svg](https://git.javagil.de/attachments/20004fc0-2856-4ee2-9958-8716927587b5) ![pr-lens-flow-set.svg](https://git.javagil.de/attachments/b0f7a6b5-d501-4c3f-afea-b67c43f737ca) </details>
ai-reviewer left a comment
Collaborator

Codex review of 7deb465d58a0beaf6fa1e5b001ec477328394db6

Codex review of `7deb465d58a0beaf6fa1e5b001ec477328394db6` <!-- werkrevisor-codex -->
@@ -0,0 +135,4 @@
print(__doc__.strip(), file=sys.stderr)
return 2
key = argv[0]
value = stdin.read().strip()
Collaborator

[high] Multiline probe input exposes the secret in a traceback (Codex review)

If probe <KEY> - receives a key with an embedded newline, .strip() preserves that newline. Python's HTTP client raises ValueError: Invalid header value containing the complete Authorization header. Only _Failed is caught, so the traceback prints the secret to stderr. Reproduced without network access using synthetic input. Validate the input before constructing the header and report malformed values without including them.

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

**[high] Multiline probe input exposes the secret in a traceback** (Codex review) If `probe <KEY> -` receives a key with an embedded newline, `.strip()` preserves that newline. Python's HTTP client raises `ValueError: Invalid header value` containing the complete Authorization header. Only `_Failed` is caught, so the traceback prints the secret to stderr. Reproduced without network access using synthetic input. Validate the input before constructing the header and report malformed values without including them. Fix it, or reply why it does not hold, and resolve this comment. <!-- werkrevisor-codex -->
Author
Collaborator

Fixed in a6e8897: main() accepts only [A-Za-z0-9._~+/=-]{16,512}, as set does, and names the allowed characters without the value. Red/green: MalformedValueTest uses the real opener; without the fix it errored with ValueError: Invalid header value holding the synthetic value, with the fix it passes.

Fixed in `a6e8897`: `main()` accepts only `[A-Za-z0-9._~+/=-]{16,512}`, as `set` does, and names the allowed characters without the value. Red/green: `MalformedValueTest` uses the real opener; without the fix it errored with `ValueError: Invalid header value` holding the synthetic value, with the fix it passes.
claude-code marked this conversation as resolved
Collaborator
⚠️ werkrevisor ERROR for ?, superseded by the result for a6e8897

Codex review: critical

This change replaces live review credentials, deletes credential backups, and checks authentication and token scopes. Mistakes could expose secrets or interrupt production reviews in ways mocked tests would not reveal.

Findings

  1. [high] Multiline probe input exposes the secret in a traceback at werkrevisor/secretprobe.py:138, 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 305122 (cached 264320) / out 2816, 101.8 s, 7 commands; reviewed head `7deb465d58a0beaf6fa1e5b001ec477328394db6`.
<!-- werkrevisor-codex:7deb465d58a0beaf6fa1e5b001ec477328394db6 --> <!-- 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/128#issuecomment-6906">the result for <code>a6e8897</code></a></summary> ## Codex review: critical This change replaces live review credentials, deletes credential backups, and checks authentication and token scopes. Mistakes could expose secrets or interrupt production reviews in ways mocked tests would not reveal. ### Findings 1. **[high] Multiline probe input exposes the secret in a traceback** at `werkrevisor/secretprobe.py:138`, 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 305122 (cached 264320) / out 2816, 101.8 s, 7 commands; reviewed head `7deb465d58a0beaf6fa1e5b001ec477328394db6`. </sub> </details>
claude-code force-pushed claude-code/rotate-secrets from 7deb465d58 to a6e8897b40 2026-10-20 19:15:37 +02:00 Compare
Author
Collaborator

Answer to the review of 7deb465, fixed in a6e8897:

  • Merge conflict with main: rebased onto 0.55.0 of PR#124; the version stays 0.56.0.
  • Codex finding on a value with a line break: fixed with a red/green proof, see the thread.
  • Left to the human, since they are structural: the risky paths **/*secret* and the size.
Answer to the review of `7deb465`, fixed in `a6e8897`: - Merge conflict with main: rebased onto 0.55.0 of PR#124; the version stays 0.56.0. - Codex finding on a value with a line break: fixed with a red/green proof, see the thread. - Left to the human, since they are structural: the risky paths `**/*secret*` and the size.
Collaborator
🟡 werkrevisor YELLOW for a6e8897, superseded by the result for 241535b

🟡 werkrevisor: YELLOW / HUMAN_REVIEW

Change kind: mixed.

Reasons

  • YELLOW risky paths changed: tests/test_rotate_secret.py (/secret), tests/test_secretprobe.py (/secret), tools/host_secret.py (**/secret) and 2 more
  • YELLOW PR too large for an AI-only approval: 991 changed lines (docs and mechanical files not counted) exceed [size] max_changed_lines = 800; please review it yourself
  • hint 2 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.01)
  • hint 11 changed file(s) agree with the PR document according to Jev

Classifier

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

Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 55198, calls 1, tokens in 53235 / out 19360 (reasoning included in out), duration 229.0 s, cost 0.0392 USD (reported), classifier `jev-1.13.0` calls 14, tokens in 12847, cost 0.0005 USD, PR document check `jev-1.13.0` calls 11, tokens in 59785, cost 0.0025 USD, build file judge `jev-1.13.0` calls 3, tokens in 1680, cost 0.0001 USD, phases: path_judge 0.3 s, classifier 0.9 s, doc_check 0.8 s, context 0.3 s, model_review 226.1 s, config: defaults + host + repository (.werkrevisor.toml at main 02c5cad).
Reviewed head `a6e8897b40dd9bd01a1d5fed516ccd7b4c57cfaa` against base `02c5cad01497e3bc457babf06bdcace76a87a777`, werkrevisor 0.55.0.

Diagrams

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

pr-lens-arch-containers.svg

pr-lens-flow-set.svg

pr-lens-flow-probe.svg

<!-- werkrevisor:a6e8897b40dd9bd01a1d5fed516ccd7b4c57cfaa --> <!-- werkrevisor-verdict:YELLOW --> <!-- werkrevisor-blocks:0a77a3e761bde6b4b07156a7bd986e94,a33676818e75e6188a182f2a3eec7cd6,5ab4d08cecb0cee075c95588bcb3c066,644e8213df2f22fe4f937fed26303105,264997333769cbbb2e7ecc621ab004c6,4d26b639a2aa631b992d4af528884219,f13bbb1408183b836c6d9c6a70c23ff8,fb744df02bc6bd32ff24bd88ded26ce0,d2e572e11827e9ff509eb94a91c546c6,82aaa6e069eedc74893a19334adae421,a59e9624fee5e1e6bacb716b160a2557,aa4a2b4673e729e52b5ad663686d5db5,947518cb31c089915207a1bc69e28e60,11171aee79193bfaae968770d5a56b61,b581e22ac39db474f163353219129b4f,fd54c48d432edb8d99d4c6976faac941,28f806da8974182b8051c301bc2170ce,cdadb3e031b8479e9414ceebcae930f8 --> <!-- werkrevisor:diagrams --> <!-- werkrevisor-folded --> <details><summary>🟡 werkrevisor YELLOW for <code>a6e8897</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/128#issuecomment-6912">the result for <code>241535b</code></a></summary> ## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW Change kind: `mixed`. ### Reasons - **YELLOW** risky paths changed: tests/test_rotate_secret.py (**/*secret*), tests/test_secretprobe.py (**/*secret*), tools/host_secret.py (**/*secret*) and 2 more - **YELLOW** PR too large for an AI-only approval: 991 changed lines (docs and mechanical files not counted) exceed [size] max_changed_lines = 800; please review it yourself - **hint** 2 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.01) - **hint** 11 changed file(s) agree with the PR document according to Jev ### Classifier 14 of 14 units passed all questions (1 PR document(s)). 7 answers ignored because of a confidence below [classifier] min_confidence. <sub> Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 55198, calls 1, tokens in 53235 / out 19360 (reasoning included in out), duration 229.0 s, cost 0.0392 USD (reported), classifier `jev-1.13.0` calls 14, tokens in 12847, cost 0.0005 USD, PR document check `jev-1.13.0` calls 11, tokens in 59785, cost 0.0025 USD, build file judge `jev-1.13.0` calls 3, tokens in 1680, cost 0.0001 USD, phases: path_judge 0.3 s, classifier 0.9 s, doc_check 0.8 s, context 0.3 s, model_review 226.1 s, config: defaults + host + repository (.werkrevisor.toml at main 02c5cad).<br> Reviewed head `a6e8897b40dd9bd01a1d5fed516ccd7b4c57cfaa` against base `02c5cad01497e3bc457babf06bdcace76a87a777`, werkrevisor 0.55.0. </sub> ### Diagrams Drawn by a model from the diff with [PR Lens](https://github.com/coldteadotai/pr-lens): a view of what the PR touches, not a statement of what it does. ![pr-lens-arch-containers.svg](https://git.javagil.de/attachments/3fda04a3-7094-4668-9ed6-f3c91a7a027b) ![pr-lens-flow-set.svg](https://git.javagil.de/attachments/b9c1938f-5b5d-49cb-83d4-f1e7215fc641) ![pr-lens-flow-probe.svg](https://git.javagil.de/attachments/155c81a5-2cef-4119-b4d7-b45984300349) </details>
ai-reviewer left a comment
Collaborator

Codex review of a6e8897b40dd9bd01a1d5fed516ccd7b4c57cfaa

Codex review of `a6e8897b40dd9bd01a1d5fed516ccd7b4c57cfaa` <!-- werkrevisor-codex -->
@@ -0,0 +128,4 @@
else
value=$(cat)
fi
old=$(digest 2>/dev/null) || old=""
Collaborator

[medium] Abort on local secrets-file errors before changing remote credentials (Codex review)

Every digest failure is treated as a missing key, including unreadable files, invalid encoding and duplicate definitions. The script consequently sends old_sha256=null and updates the remote configs before locally set rejects the same file, leaving the rotation partially applied and bypassing the old-value consistency check. Distinguish a missing key from a failed read or parse, and abort on the latter before calling on_host set.

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

**[medium] Abort on local secrets-file errors before changing remote credentials** (Codex review) Every digest failure is treated as a missing key, including unreadable files, invalid encoding and duplicate definitions. The script consequently sends old_sha256=null and updates the remote configs before locally set rejects the same file, leaving the rotation partially applied and bypassing the old-value consistency check. Distinguish a missing key from a failed read or parse, and abort on the latter before calling on_host set. Fix it, or reply why it does not hold, and resolve this comment. <!-- werkrevisor-codex -->
Author
Collaborator

Fixed in 241535b: set calls digest optional, which writes nothing only for a file without the key and fails for a file it cannot read or parse, before the first connection. test_set_stops_before_the_host_if_the_secrets_file_cannot_be_parsed failed without the fix (the host changed, then the local set failed) and passes with it.

Fixed in `241535b`: `set` calls `digest optional`, which writes nothing only for a file without the key and fails for a file it cannot read or parse, before the first connection. `test_set_stops_before_the_host_if_the_secrets_file_cannot_be_parsed` failed without the fix (the host changed, then the local set failed) and passes with it.
claude-code marked this conversation as resolved
Collaborator
⚠️ werkrevisor ERROR for ?, superseded by the result for 241535b

Codex review: critical

This change replaces live authentication credentials and deletes secret-bearing backups. Mistakes could expose credentials or interrupt review builds in ways the mocked tests would not reveal, so human review is required.

Findings

  1. [medium] Abort on local secrets-file errors before changing remote credentials at tools/rotate-secret:131, 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 505556 (cached 434944) / out 2866, 106.0 s, 14 commands; reviewed head `a6e8897b40dd9bd01a1d5fed516ccd7b4c57cfaa`.
<!-- werkrevisor-codex:a6e8897b40dd9bd01a1d5fed516ccd7b4c57cfaa --> <!-- 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/128#issuecomment-6912">the result for <code>241535b</code></a></summary> ## Codex review: critical This change replaces live authentication credentials and deletes secret-bearing backups. Mistakes could expose credentials or interrupt review builds in ways the mocked tests would not reveal, so human review is required. ### Findings 1. **[medium] Abort on local secrets-file errors before changing remote credentials** at `tools/rotate-secret:131`, 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 505556 (cached 434944) / out 2866, 106.0 s, 14 commands; reviewed head `a6e8897b40dd9bd01a1d5fed516ccd7b4c57cfaa`. </sub> </details>
Collaborator
🟠 werkrevisor ORANGE for 241535b, superseded by the result for dd927f4

🟠 werkrevisor: ORANGE / FINDINGS

Change kind: mixed.

Reasons

  • ORANGE 3 finding(s) that Jev rates as probably real and severe: tools/rotate-secret:68-72, tools/host_secret.py:87-90, docs/betrieb-git.javagil.de.md:188-190
  • YELLOW risky paths changed: tests/test_rotate_secret.py (/secret), tests/test_secretprobe.py (/secret), tools/host_secret.py (**/secret) and 2 more
  • YELLOW PR too large for an AI-only approval: 1002 changed lines (docs and mechanical files not counted) exceed [size] max_changed_lines = 800; please review it yourself
  • YELLOW model reports a security concern: Sensitive information persistence: purge silently treats an unreadable or unparsable matching backup as not containing the revoked credential and can return success while that credential remains on disk.
  • hint 2 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.01)
  • hint 11 changed file(s) agree with the PR document according to Jev
  • hint model recommends changes before merge

Findings

  1. [medium] Exit Codes at tools/rotate-secret:68-72, ORANGE, as a line comment

  2. [medium] Backup Blind Spot at tools/host_secret.py:87-90, ORANGE, as a line comment

  3. [medium] Stats Verification at docs/betrieb-git.javagil.de.md:188-190, ORANGE, as a line comment

Classifier

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

Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 55726, calls 1, tokens in 53762 / out 24901 (reasoning included in out), duration 216.2 s, cost 0.0460 USD (reported), classifier `jev-1.13.0` calls 14, tokens in 12903, cost 0.0005 USD, finding judge `jev-1.13.0` calls 3, tokens in 5132, cost 0.0002 USD, PR document check `jev-1.13.0` calls 11, tokens in 61072, cost 0.0026 USD, build file judge `jev-1.13.0` calls 3, tokens in 1680, cost 0.0001 USD, phases: path_judge 0.2 s, classifier 0.9 s, doc_check 0.8 s, context 0.3 s, model_review 212.4 s, finding_judge 0.3 s, config: defaults + host + repository (.werkrevisor.toml at main 02c5cad).
Reviewed head `241535b2cf08af52e8135242a54c0dca5d7214eb` against base `02c5cad01497e3bc457babf06bdcace76a87a777`, werkrevisor 0.55.0.

Diagrams

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

pr-lens-arch-overview.svg

pr-lens-flow-set.svg

pr-lens-flow-probe.svg

<!-- werkrevisor:241535b2cf08af52e8135242a54c0dca5d7214eb --> <!-- werkrevisor-verdict:ORANGE --> <!-- werkrevisor-blocks:0a77a3e761bde6b4b07156a7bd986e94,a33676818e75e6188a182f2a3eec7cd6,5ab4d08cecb0cee075c95588bcb3c066,644e8213df2f22fe4f937fed26303105,264997333769cbbb2e7ecc621ab004c6,4d26b639a2aa631b992d4af528884219,f13bbb1408183b836c6d9c6a70c23ff8,fb744df02bc6bd32ff24bd88ded26ce0,61e38704335a8437509db6fce70f9a7f,82aaa6e069eedc74893a19334adae421,a59e9624fee5e1e6bacb716b160a2557,aa4a2b4673e729e52b5ad663686d5db5,ee905bb3462aa8505d7eddc2c7c7a674,11171aee79193bfaae968770d5a56b61,b581e22ac39db474f163353219129b4f,87dd1a8a20e9eba55cddd673387a2cca,28f806da8974182b8051c301bc2170ce,cdadb3e031b8479e9414ceebcae930f8 --> <!-- werkrevisor:diagrams --> <!-- werkrevisor-folded --> <details><summary>🟠 werkrevisor ORANGE for <code>241535b</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/128#issuecomment-6929">the result for <code>dd927f4</code></a></summary> ## 🟠 werkrevisor: ORANGE / FINDINGS Change kind: `mixed`. ### Reasons - **ORANGE** 3 finding(s) that Jev rates as probably real and severe: tools/rotate-secret:68-72, tools/host_secret.py:87-90, docs/betrieb-git.javagil.de.md:188-190 - **YELLOW** risky paths changed: tests/test_rotate_secret.py (**/*secret*), tests/test_secretprobe.py (**/*secret*), tools/host_secret.py (**/*secret*) and 2 more - **YELLOW** PR too large for an AI-only approval: 1002 changed lines (docs and mechanical files not counted) exceed [size] max_changed_lines = 800; please review it yourself - **YELLOW** model reports a security concern: Sensitive information persistence: `purge` silently treats an unreadable or unparsable matching backup as not containing the revoked credential and can return success while that credential remains on disk. - **hint** 2 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.01) - **hint** 11 changed file(s) agree with the PR document according to Jev - **hint** model recommends changes before merge ### Findings 1. **[medium] Exit Codes** at `tools/rotate-secret:68-72`, ORANGE, as a line comment 2. **[medium] Backup Blind Spot** at `tools/host_secret.py:87-90`, ORANGE, as a line comment 3. **[medium] Stats Verification** at `docs/betrieb-git.javagil.de.md:188-190`, ORANGE, as a line comment ### Classifier 14 of 14 units passed all questions (1 PR document(s)). 6 answers ignored because of a confidence below [classifier] min_confidence. <sub> Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 55726, calls 1, tokens in 53762 / out 24901 (reasoning included in out), duration 216.2 s, cost 0.0460 USD (reported), classifier `jev-1.13.0` calls 14, tokens in 12903, cost 0.0005 USD, finding judge `jev-1.13.0` calls 3, tokens in 5132, cost 0.0002 USD, PR document check `jev-1.13.0` calls 11, tokens in 61072, cost 0.0026 USD, build file judge `jev-1.13.0` calls 3, tokens in 1680, cost 0.0001 USD, phases: path_judge 0.2 s, classifier 0.9 s, doc_check 0.8 s, context 0.3 s, model_review 212.4 s, finding_judge 0.3 s, config: defaults + host + repository (.werkrevisor.toml at main 02c5cad).<br> Reviewed head `241535b2cf08af52e8135242a54c0dca5d7214eb` against base `02c5cad01497e3bc457babf06bdcace76a87a777`, werkrevisor 0.55.0. </sub> ### Diagrams Drawn by a model from the diff with [PR Lens](https://github.com/coldteadotai/pr-lens): a view of what the PR touches, not a statement of what it does. ![pr-lens-arch-overview.svg](https://git.javagil.de/attachments/f10173c2-8a01-42ab-905a-c8db45e906cd) ![pr-lens-flow-set.svg](https://git.javagil.de/attachments/5f9fe0a5-f83f-4c0b-b01d-ca71bd14c588) ![pr-lens-flow-probe.svg](https://git.javagil.de/attachments/c9a1daf3-6b72-45e6-8d91-596eeac0645b) </details>
ai-reviewer left a comment
Collaborator

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

werkrevisor: ORANGE / FINDINGS for `241535b2cf08af52e8135242a54c0dca5d7214eb`. The result comment of werkrevisor holds the details. <!-- werkrevisor-review:241535b2cf08af52e8135242a54c0dca5d7214eb -->
@@ -175,0 +185,4 @@
beim OpenRouter-Key auch einen PR von werkrevisor mit Diagrammen.
Fehlt ein PR, einen Review in der Werkator-Oberfläche neu starten.
Dass der neue Wert genutzt wird, zeigen OpenRouter mit der Nutzung je Key und Gitea mit „Zuletzt verwendet“ am Token.
6. Den alten Wert beim Dienst widerrufen.
Collaborator

[medium] Stats Verification (werkrevisor)

ORANGE; Jev: real 0.80, severity 2.7 of 3

The documented current secrets.env lacks WERKREVISOR_STATS_TOKEN, and set backs up that file before adding a missing key. Consequently, the generated secrets.env.bak-secret-WERKREVISOR_STATS_TOKEN-* contains no old token, so the prescribed probe fails with “does not set” instead of verifying that the old token was revoked. Provide a secure source for the old token or a statistics-specific verification step.

**[medium] Stats Verification** (werkrevisor) ORANGE; Jev: real 0.80, severity 2.7 of 3 The documented current `secrets.env` lacks `WERKREVISOR_STATS_TOKEN`, and `set` backs up that file before adding a missing key. Consequently, the generated `secrets.env.bak-secret-WERKREVISOR_STATS_TOKEN-*` contains no old token, so the prescribed probe fails with “does not set” instead of verifying that the old token was revoked. Provide a secure source for the old token or a statistics-specific verification step.
Author
Collaborator

Fixed in dd927f4: the new tools/rotate-secret fetch mih09 <KEY> copies the value that all machine configs hold into a secrets.env without the key, through pipes only (the host part export refuses a terminal). Step 1 of the procedure runs it for a missing key, so the backup that set makes holds the old value for step 6. Scenario#128.10.

Fixed in `dd927f4`: the new `tools/rotate-secret fetch mih09 <KEY>` copies the value that all machine configs hold into a `secrets.env` without the key, through pipes only (the host part `export` refuses a terminal). Step 1 of the procedure runs it for a missing key, so the backup that `set` makes holds the old value for step 6. Scenario#128.10.
claude-code marked this conversation as resolved
@@ -0,0 +84,4 @@
"""The backups of path whose value of KEY has the SHA-256 digest; an unreadable backup counts as not holding it."""
held = []
for backup in backups(path):
try:
Collaborator

[medium] Backup Blind Spot (werkrevisor)

ORANGE; Jev: real 0.78, severity 3.0 of 3

holding() catches every SecretError and treats an unreadable, corrupt, or unsupported matching backup as if it did not contain the target secret. Such a backup can still contain the revoked credential, while purge skips it and exits successfully, falsely reporting that cleanup completed; propagate the error or report an indeterminate backup instead.

**[medium] Backup Blind Spot** (werkrevisor) ORANGE; Jev: real 0.78, severity 3.0 of 3 `holding()` catches every `SecretError` and treats an unreadable, corrupt, or unsupported matching backup as if it did not contain the target secret. Such a backup can still contain the revoked credential, while `purge` skips it and exits successfully, falsely reporting that cleanup completed; propagate the error or report an indeterminate backup instead.
Author
Collaborator

Fixed in dd927f4: holding() returns the backups it cannot read or parse apart; check names them and exits with 2, purge refuses before it removes anything. Test test_a_backup_it_cannot_parse_may_hold_the_value. On mih09, no backup of the three keys is unclear today.

Fixed in `dd927f4`: `holding()` returns the backups it cannot read or parse apart; `check` names them and exits with 2, `purge` refuses before it removes anything. Test `test_a_backup_it_cannot_parse_may_hold_the_value`. On mih09, no backup of the three keys is unclear today.
claude-code marked this conversation as resolved
@@ -0,0 +65,4 @@
import host_secret
try:
value = host_secret.value_of(sys.argv[3], sys.argv[2], False)
except host_secret.SecretError as e:
Collaborator

[medium] Exit Codes (werkrevisor)

ORANGE; Jev: real 0.73, severity 3.0 of 3

from_secrets_file exits with status 1 when the secrets file is unreadable, malformed, or lacks a required key, although the command contract reserves 1 for a refusal or differing value and uses 2 for errors. In particular, probe KEY can return the documented refusal code without contacting the service, causing automation to interpret a local setup failure as a revoked credential; exit with status 2 on these errors and update the corresponding test.

**[medium] Exit Codes** (werkrevisor) ORANGE; Jev: real 0.73, severity 3.0 of 3 `from_secrets_file` exits with status 1 when the secrets file is unreadable, malformed, or lacks a required key, although the command contract reserves 1 for a refusal or differing value and uses 2 for errors. In particular, `probe KEY` can return the documented refusal code without contacting the service, causing automation to interpret a local setup failure as a revoked credential; exit with status 2 on these errors and update the corresponding test.
Author
Collaborator

Fixed in dd927f4: from_secrets_file prints the reason and exits with 2 for a file it cannot read or parse and for a missing key; probe and digest exit with 2 then. Test test_a_secrets_file_without_the_key_is_an_error_with_2.

Fixed in `dd927f4`: `from_secrets_file` prints the reason and exits with 2 for a file it cannot read or parse and for a missing key; `probe` and `digest` exit with 2 then. Test `test_a_secrets_file_without_the_key_is_an_error_with_2`.
claude-code marked this conversation as resolved
Collaborator
⚠️ werkrevisor ERROR for ?, superseded by the result for dd927f4

Codex review: critical

This change replaces production authentication credentials, checks token permissions, and deletes credential backups. A mistake could expose secrets or interrupt review builds in ways the mocked tests would not reveal, so human review is required.

No findings.

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

Model `gpt-6-astra`, effort high, tokens in 259583 (cached 195968) / out 1988, 77.8 s, 12 commands; reviewed head `241535b2cf08af52e8135242a54c0dca5d7214eb`.
<!-- werkrevisor-codex:241535b2cf08af52e8135242a54c0dca5d7214eb --> <!-- 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/128#issuecomment-6929">the result for <code>dd927f4</code></a></summary> ## Codex review: critical This change replaces production authentication credentials, checks token permissions, and deletes credential backups. A mistake could expose secrets or interrupt review builds in ways the mocked tests would not reveal, so human review is required. No findings. The merge waits for the status `ai-review/codex`: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here. <sub> Model `gpt-6-astra`, effort high, tokens in 259583 (cached 195968) / out 1988, 77.8 s, 12 commands; reviewed head `241535b2cf08af52e8135242a54c0dca5d7214eb`. </sub> </details>
Author
Collaborator

Answer to the review of 241535b, fixed in dd927f4:

  • The three ORANGE findings: fixed, see the threads.
  • YELLOW security concern of the model (unreadable backups in purge): the same as the second finding, fixed.
  • Left to the human, since they are structural: the risky paths **/*secret* and the size.
Answer to the review of `241535b`, fixed in `dd927f4`: - The three ORANGE findings: fixed, see the threads. - YELLOW security concern of the model (unreadable backups in `purge`): the same as the second finding, fixed. - Left to the human, since they are structural: the risky paths `**/*secret*` and the size.
Collaborator
🟡 werkrevisor YELLOW for dd927f4, superseded by the result for a9f44a8

🟡 werkrevisor: YELLOW / HUMAN_REVIEW

Change kind: mixed.

Reasons

  • YELLOW risky paths changed: tests/test_rotate_secret.py (/secret), tests/test_secretprobe.py (/secret), tools/host_secret.py (**/secret) and 2 more
  • YELLOW PR too large for an AI-only approval: 1089 changed lines (docs and mechanical files not counted) exceed [size] max_changed_lines = 800; please review it yourself
  • hint 2 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.01)
  • hint 11 changed file(s) agree with the PR document according to Jev
  • hint model recommends merge with caution

Classifier

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

Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 59441, calls 1, tokens in 57311 / out 24321 (reasoning included in out), duration 300.4 s, cost 0.0463 USD (reported), classifier `jev-1.13.0` calls 15, tokens in 14028, cost 0.0006 USD, PR document check `jev-1.13.0` calls 11, tokens in 66828, cost 0.0028 USD, build file judge `jev-1.13.0` calls 3, tokens in 1680, cost 0.0001 USD, phases: path_judge 0.4 s, classifier 0.9 s, doc_check 0.8 s, context 0.8 s, model_review 297.0 s, config: defaults + host + repository (.werkrevisor.toml at main 02c5cad).
Reviewed head `dd927f45b76bff9502d3a99ea043f62d9c9549b2` against base `02c5cad01497e3bc457babf06bdcace76a87a777`, werkrevisor 0.55.0.

Diagrams

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

pr-lens-overview.svg

pr-lens-rotate-sequence.svg

<!-- werkrevisor:dd927f45b76bff9502d3a99ea043f62d9c9549b2 --> <!-- werkrevisor-verdict:YELLOW --> <!-- werkrevisor-blocks:5de0c65d61fa69729337814dac489e41,a33676818e75e6188a182f2a3eec7cd6,5ab4d08cecb0cee075c95588bcb3c066,644e8213df2f22fe4f937fed26303105,264997333769cbbb2e7ecc621ab004c6,4d26b639a2aa631b992d4af528884219,83d6838cd7bd8f3d42f7bdec540e64e9,fb744df02bc6bd32ff24bd88ded26ce0,c97d7ba6636cea5e792f1390340ae59f,82aaa6e069eedc74893a19334adae421,a59e9624fee5e1e6bacb716b160a2557,aa4a2b4673e729e52b5ad663686d5db5,5058600a1ac5144ef750b1e2915b9eea,11171aee79193bfaae968770d5a56b61,a85f7df80154500758e4fb896eb36e94,69d4a2f5adf840978856c1811ba47e5d,28f806da8974182b8051c301bc2170ce,cdadb3e031b8479e9414ceebcae930f8 --> <!-- werkrevisor:diagrams --> <!-- werkrevisor-folded --> <details><summary>🟡 werkrevisor YELLOW for <code>dd927f4</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/128#issuecomment-6945">the result for <code>a9f44a8</code></a></summary> ## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW Change kind: `mixed`. ### Reasons - **YELLOW** risky paths changed: tests/test_rotate_secret.py (**/*secret*), tests/test_secretprobe.py (**/*secret*), tools/host_secret.py (**/*secret*) and 2 more - **YELLOW** PR too large for an AI-only approval: 1089 changed lines (docs and mechanical files not counted) exceed [size] max_changed_lines = 800; please review it yourself - **hint** 2 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.01) - **hint** 11 changed file(s) agree with the PR document according to Jev - **hint** model recommends merge with caution ### Classifier 15 of 15 units passed all questions (1 PR document(s)). 8 answers ignored because of a confidence below [classifier] min_confidence. <sub> Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 59441, calls 1, tokens in 57311 / out 24321 (reasoning included in out), duration 300.4 s, cost 0.0463 USD (reported), classifier `jev-1.13.0` calls 15, tokens in 14028, cost 0.0006 USD, PR document check `jev-1.13.0` calls 11, tokens in 66828, cost 0.0028 USD, build file judge `jev-1.13.0` calls 3, tokens in 1680, cost 0.0001 USD, phases: path_judge 0.4 s, classifier 0.9 s, doc_check 0.8 s, context 0.8 s, model_review 297.0 s, config: defaults + host + repository (.werkrevisor.toml at main 02c5cad).<br> Reviewed head `dd927f45b76bff9502d3a99ea043f62d9c9549b2` against base `02c5cad01497e3bc457babf06bdcace76a87a777`, werkrevisor 0.55.0. </sub> ### Diagrams Drawn by a model from the diff with [PR Lens](https://github.com/coldteadotai/pr-lens): a view of what the PR touches, not a statement of what it does. ![pr-lens-overview.svg](https://git.javagil.de/attachments/c3bd553c-5ffd-4ecb-a4b4-417a24b2ebee) ![pr-lens-rotate-sequence.svg](https://git.javagil.de/attachments/426d0b22-d8f1-48df-886c-344c407d8922) </details>
ai-reviewer left a comment
Collaborator

Codex review of dd927f45b76bff9502d3a99ea043f62d9c9549b2

Codex review of `dd927f45b76bff9502d3a99ea043f62d9c9549b2` <!-- werkrevisor-codex -->
@@ -0,0 +128,4 @@
[[ -z "$(digest optional)" ]] || { echo "$(basename "$secrets_env") sets $key already" >&2; exit 2; }
payload="{}"
# The value goes from the host straight into the local set, through pipes only.
payload=$(retrying on_host export) && locally set
Collaborator

[medium] Propagate remote export failures from fetch (Codex review)

If SSH fails or the host rejects export because its configurations contain different values, the assignment fails and skips locally set. Because it precedes &&, set -e does not stop execution; the following unset payload returns success. Reproduced with export returning 2: fetch exits 0 without copying anything. This falsely reports completion of the step needed to retain the old credential for verification after revocation.

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

**[medium] Propagate remote export failures from fetch** (Codex review) If SSH fails or the host rejects export because its configurations contain different values, the assignment fails and skips `locally set`. Because it precedes `&&`, `set -e` does not stop execution; the following `unset payload` returns success. Reproduced with export returning 2: fetch exits 0 without copying anything. This falsely reports completion of the step needed to retain the old credential for verification after revocation. Fix it, or reply why it does not hold, and resolve this comment. <!-- werkrevisor-codex -->
Author
Collaborator

Fixed in a9f44a8: the export is a plain assignment now, so set -e stops fetch with the exit code of the host. test_fetch_stops_if_the_host_holds_no_single_value exited with 0 without the fix and passes with it. No other assignment in the script stands before && or ||.

Fixed in `a9f44a8`: the export is a plain assignment now, so `set -e` stops `fetch` with the exit code of the host. `test_fetch_stops_if_the_host_holds_no_single_value` exited with 0 without the fix and passes with it. No other assignment in the script stands before `&&` or `||`.
claude-code marked this conversation as resolved
Collaborator
⚠️ werkrevisor ERROR for ?, superseded by the result for a9f44a8

Codex review: critical

This change handles production credentials, checks authentication and token scopes, and deletes credential backups. Mistakes could expose secrets or interrupt review builds in ways the mocked tests would not reveal, so human review is required.

Findings

  1. [medium] Propagate remote export failures from fetch at tools/rotate-secret:131, 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 255723 (cached 192512) / out 2098, 69.1 s, 12 commands; reviewed head `dd927f45b76bff9502d3a99ea043f62d9c9549b2`.
<!-- werkrevisor-codex:dd927f45b76bff9502d3a99ea043f62d9c9549b2 --> <!-- 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/128#issuecomment-6945">the result for <code>a9f44a8</code></a></summary> ## Codex review: critical This change handles production credentials, checks authentication and token scopes, and deletes credential backups. Mistakes could expose secrets or interrupt review builds in ways the mocked tests would not reveal, so human review is required. ### Findings 1. **[medium] Propagate remote export failures from fetch** at `tools/rotate-secret:131`, 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 255723 (cached 192512) / out 2098, 69.1 s, 12 commands; reviewed head `dd927f45b76bff9502d3a99ea043f62d9c9549b2`. </sub> </details>
Collaborator
🟡 werkrevisor YELLOW for a9f44a8, superseded by the result for 7c9395f

🟡 werkrevisor: YELLOW / HUMAN_REVIEW

Change kind: mixed.

Reasons

  • YELLOW risky paths changed: tests/test_rotate_secret.py (/secret), tests/test_secretprobe.py (/secret), tools/host_secret.py (**/secret) and 2 more
  • YELLOW PR too large for an AI-only approval: 1105 changed lines (docs and mechanical files not counted) exceed [size] max_changed_lines = 800; please review it yourself
  • hint 2 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.01)
  • hint 11 changed file(s) agree with the PR document according to Jev
  • hint the model review failed: TimeoutError: review exceeded 720 seconds (advisory: Jev judged every changed file)

Classifier

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

Usage: model `openrouter/minimax/minimax-m3`, LLM failed (TimeoutError), tokens counted before the call 59964, duration 729.0 s, cost unknown, classifier `jev-1.13.0` calls 15, tokens in 14048, cost 0.0006 USD, PR document check `jev-1.13.0` calls 11, tokens in 67661, cost 0.0028 USD, build file judge `jev-1.13.0` calls 3, tokens in 1680, cost 0.0001 USD, phases: path_judge 0.3 s, classifier 0.9 s, doc_check 0.8 s, context 0.3 s, model_review 725.9 s, config: defaults + host + repository (.werkrevisor.toml at main 02c5cad).
Reviewed head `a9f44a8b1d7d52e20e7af9ee939b63eec58f0e8b` against base `02c5cad01497e3bc457babf06bdcace76a87a777`, werkrevisor 0.55.0.

Diagrams

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

pr-lens-containers.svg

pr-lens-set-flow-view.svg

<!-- werkrevisor:a9f44a8b1d7d52e20e7af9ee939b63eec58f0e8b --> <!-- werkrevisor-verdict:YELLOW --> <!-- werkrevisor-blocks:5de0c65d61fa69729337814dac489e41,a33676818e75e6188a182f2a3eec7cd6,5ab4d08cecb0cee075c95588bcb3c066,644e8213df2f22fe4f937fed26303105,264997333769cbbb2e7ecc621ab004c6,4d26b639a2aa631b992d4af528884219,83d6838cd7bd8f3d42f7bdec540e64e9,fb744df02bc6bd32ff24bd88ded26ce0,ba1769c566b16dfac20d078bcde02613,82aaa6e069eedc74893a19334adae421,a59e9624fee5e1e6bacb716b160a2557,aa4a2b4673e729e52b5ad663686d5db5,706c4bb89fd25be4ec5826b26db24b5c,11171aee79193bfaae968770d5a56b61,a85f7df80154500758e4fb896eb36e94,ad30b329542f456028f7c04842396f88,28f806da8974182b8051c301bc2170ce,cdadb3e031b8479e9414ceebcae930f8 --> <!-- werkrevisor:diagrams --> <!-- werkrevisor-folded --> <details><summary>🟡 werkrevisor YELLOW for <code>a9f44a8</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/128#issuecomment-6992">the result for <code>7c9395f</code></a></summary> ## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW Change kind: `mixed`. ### Reasons - **YELLOW** risky paths changed: tests/test_rotate_secret.py (**/*secret*), tests/test_secretprobe.py (**/*secret*), tools/host_secret.py (**/*secret*) and 2 more - **YELLOW** PR too large for an AI-only approval: 1105 changed lines (docs and mechanical files not counted) exceed [size] max_changed_lines = 800; please review it yourself - **hint** 2 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.01) - **hint** 11 changed file(s) agree with the PR document according to Jev - **hint** the model review failed: TimeoutError: review exceeded 720 seconds (advisory: Jev judged every changed file) ### Classifier 15 of 15 units passed all questions (1 PR document(s)). 7 answers ignored because of a confidence below [classifier] min_confidence. <sub> Usage: model `openrouter/minimax/minimax-m3`, LLM failed (TimeoutError), tokens counted before the call 59964, duration 729.0 s, cost unknown, classifier `jev-1.13.0` calls 15, tokens in 14048, cost 0.0006 USD, PR document check `jev-1.13.0` calls 11, tokens in 67661, cost 0.0028 USD, build file judge `jev-1.13.0` calls 3, tokens in 1680, cost 0.0001 USD, phases: path_judge 0.3 s, classifier 0.9 s, doc_check 0.8 s, context 0.3 s, model_review 725.9 s, config: defaults + host + repository (.werkrevisor.toml at main 02c5cad).<br> Reviewed head `a9f44a8b1d7d52e20e7af9ee939b63eec58f0e8b` against base `02c5cad01497e3bc457babf06bdcace76a87a777`, werkrevisor 0.55.0. </sub> ### Diagrams Drawn by a model from the diff with [PR Lens](https://github.com/coldteadotai/pr-lens): a view of what the PR touches, not a statement of what it does. ![pr-lens-containers.svg](https://git.javagil.de/attachments/84a299e0-c042-4b0d-af9d-59d40ee3e1f4) ![pr-lens-set-flow-view.svg](https://git.javagil.de/attachments/e0f60431-179f-4b1a-a767-cd16a7dc6b0f) </details>
Collaborator
⚠️ werkrevisor ERROR for ?, superseded by the result for 7c9395f

Codex review: critical

The change replaces live authentication credentials and deletes backups containing secrets. Mistakes could expose credentials or interrupt review gates in ways the mocked tests would not reveal, so human review is required.

No findings.

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

Model `gpt-6-astra`, effort high, tokens in 634780 (cached 554240) / out 2862, 112.9 s, 12 commands; reviewed head `a9f44a8b1d7d52e20e7af9ee939b63eec58f0e8b`.
<!-- werkrevisor-codex:a9f44a8b1d7d52e20e7af9ee939b63eec58f0e8b --> <!-- 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/128#issuecomment-6992">the result for <code>7c9395f</code></a></summary> ## Codex review: critical The change replaces live authentication credentials and deletes backups containing secrets. Mistakes could expose credentials or interrupt review gates in ways the mocked tests would not reveal, so human review is required. No findings. The merge waits for the status `ai-review/codex`: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here. <sub> Model `gpt-6-astra`, effort high, tokens in 634780 (cached 554240) / out 2862, 112.9 s, 12 commands; reviewed head `a9f44a8b1d7d52e20e7af9ee939b63eec58f0e8b`. </sub> </details>
claude-code changed title from werkrevisor 0.56.0: rotate the secrets of the review builds without a stop to werkrevisor 0.58.0: rotate the secrets of the review builds without a stop 2026-10-21 10:23:42 +02:00
claude-code force-pushed claude-code/rotate-secrets from a9f44a8b1d to 7c9395fe09 2026-10-21 10:23:43 +02:00 Compare
Collaborator
🟡 werkrevisor YELLOW for 7c9395f, superseded by the result for 4a7f720

🟡 werkrevisor: YELLOW / HUMAN_REVIEW

Change kind: mixed.

Reasons

  • YELLOW risky paths changed: tests/test_rotate_secret.py (/secret), tests/test_secretprobe.py (/secret), tools/host_secret.py (**/secret) and 2 more
  • YELLOW PR too large for an AI-only approval: 1105 changed lines (docs and mechanical files not counted) exceed [size] max_changed_lines = 800; please review it yourself
  • hint 2 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.01)
  • hint 11 changed file(s) agree with the PR document according to Jev

Classifier

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

Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 60008, calls 1, tokens in 57851 / out 40417 (reasoning included in out), duration 617.2 s, cost 0.0658 USD (reported), classifier `jev-1.13.0` calls 15, tokens in 14048, cost 0.0006 USD, PR document check `jev-1.13.0` calls 11, tokens in 67661, cost 0.0028 USD, build file judge `jev-1.13.0` calls 3, tokens in 1680, cost 0.0001 USD, phases: path_judge 0.4 s, classifier 0.8 s, doc_check 0.6 s, context 0.3 s, model_review 614.2 s, config: defaults + host + repository (.werkrevisor.toml at main 0349323).
Reviewed head `7c9395fe09ffdebf96099567c3bf08fabdc4d118` against base `0349323c850e9ae89e15daf05725a635933bb37a`, werkrevisor 0.57.0.

Diagrams

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

pr-lens-containers.svg

pr-lens-set-sequence.svg

<!-- werkrevisor:7c9395fe09ffdebf96099567c3bf08fabdc4d118 --> <!-- werkrevisor-verdict:YELLOW --> <!-- werkrevisor-blocks:5de0c65d61fa69729337814dac489e41,a33676818e75e6188a182f2a3eec7cd6,5ab4d08cecb0cee075c95588bcb3c066,644e8213df2f22fe4f937fed26303105,264997333769cbbb2e7ecc621ab004c6,4d26b639a2aa631b992d4af528884219,83d6838cd7bd8f3d42f7bdec540e64e9,fb744df02bc6bd32ff24bd88ded26ce0,ba1769c566b16dfac20d078bcde02613,82aaa6e069eedc74893a19334adae421,217cb7f0d31b525bcb62e18bdd5928a8,aa4a2b4673e729e52b5ad663686d5db5,706c4bb89fd25be4ec5826b26db24b5c,11171aee79193bfaae968770d5a56b61,a85f7df80154500758e4fb896eb36e94,ad30b329542f456028f7c04842396f88,fb924eef16b91108496759dd8e86ff54,cdadb3e031b8479e9414ceebcae930f8 --> <!-- werkrevisor:diagrams --> <!-- werkrevisor-folded --> <details><summary>🟡 werkrevisor YELLOW for <code>7c9395f</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/128#issuecomment-7039">the result for <code>4a7f720</code></a></summary> ## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW Change kind: `mixed`. ### Reasons - **YELLOW** risky paths changed: tests/test_rotate_secret.py (**/*secret*), tests/test_secretprobe.py (**/*secret*), tools/host_secret.py (**/*secret*) and 2 more - **YELLOW** PR too large for an AI-only approval: 1105 changed lines (docs and mechanical files not counted) exceed [size] max_changed_lines = 800; please review it yourself - **hint** 2 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.01) - **hint** 11 changed file(s) agree with the PR document according to Jev ### Classifier 15 of 15 units passed all questions (1 PR document(s)). 8 answers ignored because of a confidence below [classifier] min_confidence. <sub> Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 60008, calls 1, tokens in 57851 / out 40417 (reasoning included in out), duration 617.2 s, cost 0.0658 USD (reported), classifier `jev-1.13.0` calls 15, tokens in 14048, cost 0.0006 USD, PR document check `jev-1.13.0` calls 11, tokens in 67661, cost 0.0028 USD, build file judge `jev-1.13.0` calls 3, tokens in 1680, cost 0.0001 USD, phases: path_judge 0.4 s, classifier 0.8 s, doc_check 0.6 s, context 0.3 s, model_review 614.2 s, config: defaults + host + repository (.werkrevisor.toml at main 0349323).<br> Reviewed head `7c9395fe09ffdebf96099567c3bf08fabdc4d118` against base `0349323c850e9ae89e15daf05725a635933bb37a`, werkrevisor 0.57.0. </sub> ### Diagrams Drawn by a model from the diff with [PR Lens](https://github.com/coldteadotai/pr-lens): a view of what the PR touches, not a statement of what it does. ![pr-lens-containers.svg](https://git.javagil.de/attachments/3a42b097-2e45-4bfc-a128-c0c4e338235a) ![pr-lens-set-sequence.svg](https://git.javagil.de/attachments/e0c6fbde-c825-4df2-b983-82064d92d722) </details>
Collaborator
⚠️ werkrevisor ERROR for ?, superseded by the result for 4a7f720

Codex review: critical

The change distributes authentication credentials, checks token permissions, and deletes backups containing secrets. Mistakes could expose credentials or disrupt review builds in ways the mocked tests would not reveal, so human review is required.

No findings.

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

Model `gpt-6-astra`, effort high, tokens in 334919 (cached 272768) / out 2316, 116.4 s, 8 commands; reviewed head `7c9395fe09ffdebf96099567c3bf08fabdc4d118`.
<!-- werkrevisor-codex:7c9395fe09ffdebf96099567c3bf08fabdc4d118 --> <!-- 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/128#issuecomment-7039">the result for <code>4a7f720</code></a></summary> ## Codex review: critical The change distributes authentication credentials, checks token permissions, and deletes backups containing secrets. Mistakes could expose credentials or disrupt review builds in ways the mocked tests would not reveal, so human review is required. No findings. The merge waits for the status `ai-review/codex`: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here. <sub> Model `gpt-6-astra`, effort high, tokens in 334919 (cached 272768) / out 2316, 116.4 s, 8 commands; reviewed head `7c9395fe09ffdebf96099567c3bf08fabdc4d118`. </sub> </details>
Author
Collaborator

Answer to the review of 7c9395f (rebased onto 0.57.0, version 0.58.0):

  • Codex: no findings.
  • werkrevisor YELLOW: only the structural reasons, the risky paths **/*secret* and the size; left to the human.

The PR waits for the approval of mi.

Answer to the review of `7c9395f` (rebased onto 0.57.0, version 0.58.0): - Codex: no findings. - werkrevisor YELLOW: only the structural reasons, the risky paths `**/*secret*` and the size; left to the human. The PR waits for the approval of mi.
claude-code changed title from werkrevisor 0.58.0: rotate the secrets of the review builds without a stop to werkrevisor 0.60.0: rotate the secrets of the review builds without a stop 2026-10-21 21:38:44 +02:00
claude-code force-pushed claude-code/rotate-secrets from 7c9395fe09 to 4a7f7208c8 2026-10-21 21:38:45 +02:00 Compare
Collaborator
🟡 werkrevisor YELLOW for 4a7f720, superseded by the result for deb0b3f

🟡 werkrevisor: YELLOW / HUMAN_REVIEW

Gate: no human review requested; merge conflict with main: the author rebases the branch onto main and pushes.

Change kind: mixed.

Reasons

  • YELLOW risky paths changed: tests/test_rotate_secret.py (/secret), tests/test_secretprobe.py (/secret), tools/host_secret.py (**/secret) and 2 more
  • YELLOW PR too large for an AI-only approval: 1105 changed lines (docs and mechanical files not counted) exceed [size] max_changed_lines = 800; please review it yourself
  • hint 2 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.01)
  • hint 11 changed file(s) agree with the PR document according to Jev
  • hint the model review failed: TimeoutError: review exceeded 720 seconds (advisory: Jev judged every changed file)

Classifier

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

Usage: model `openrouter/minimax/minimax-m3`, LLM failed (TimeoutError), tokens counted before the call 60012, duration 738.2 s, cost unknown, classifier `jev-1.13.0` calls 15, tokens in 14048, cost 0.0006 USD, PR document check `jev-1.13.0` calls 11, tokens in 67661, cost 0.0028 USD, build file judge `jev-1.13.0` calls 3, tokens in 1680, cost 0.0001 USD, phases: path_judge 0.2 s, classifier 0.8 s, doc_check 0.7 s, context 1.0 s, model_review 734.4 s, config: defaults + host + repository (.werkrevisor.toml at main b571067).
Reviewed head `4a7f7208c83c28a5e386968f89f00aa34d8af822` against base `b57106773fde846378c072b83be6fa58aa836ea8`, werkrevisor 0.59.0.

Diagrams

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

pr-lens-containers.svg

pr-lens-flow-set.svg

pr-lens-flow-probe.svg

<!-- werkrevisor:4a7f7208c83c28a5e386968f89f00aa34d8af822 --> <!-- werkrevisor-verdict:YELLOW --> <!-- werkrevisor-blocks:5de0c65d61fa69729337814dac489e41,a33676818e75e6188a182f2a3eec7cd6,5ab4d08cecb0cee075c95588bcb3c066,644e8213df2f22fe4f937fed26303105,264997333769cbbb2e7ecc621ab004c6,4d26b639a2aa631b992d4af528884219,83d6838cd7bd8f3d42f7bdec540e64e9,fb744df02bc6bd32ff24bd88ded26ce0,ba1769c566b16dfac20d078bcde02613,82aaa6e069eedc74893a19334adae421,b0eeb3065b7c6140161c59069f59d177,aa4a2b4673e729e52b5ad663686d5db5,706c4bb89fd25be4ec5826b26db24b5c,11171aee79193bfaae968770d5a56b61,a85f7df80154500758e4fb896eb36e94,ad30b329542f456028f7c04842396f88,4d504487f5aea4cea6a52d89488b6b8e,cdadb3e031b8479e9414ceebcae930f8 --> <!-- werkrevisor:diagrams --> <!-- werkrevisor-folded --> <details><summary>🟡 werkrevisor YELLOW for <code>4a7f720</code>, superseded by <a href="http://git.javagil.de/mi/werkrevisor/pulls/128#issuecomment-7049">the result for <code>deb0b3f</code></a></summary> ## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW Gate: no human review requested; merge conflict with main: the author rebases the branch onto main and pushes. Change kind: `mixed`. ### Reasons - **YELLOW** risky paths changed: tests/test_rotate_secret.py (**/*secret*), tests/test_secretprobe.py (**/*secret*), tools/host_secret.py (**/*secret*) and 2 more - **YELLOW** PR too large for an AI-only approval: 1105 changed lines (docs and mechanical files not counted) exceed [size] max_changed_lines = 800; please review it yourself - **hint** 2 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.01) - **hint** 11 changed file(s) agree with the PR document according to Jev - **hint** the model review failed: TimeoutError: review exceeded 720 seconds (advisory: Jev judged every changed file) ### Classifier 15 of 15 units passed all questions (1 PR document(s)). 8 answers ignored because of a confidence below [classifier] min_confidence. <sub> Usage: model `openrouter/minimax/minimax-m3`, LLM failed (TimeoutError), tokens counted before the call 60012, duration 738.2 s, cost unknown, classifier `jev-1.13.0` calls 15, tokens in 14048, cost 0.0006 USD, PR document check `jev-1.13.0` calls 11, tokens in 67661, cost 0.0028 USD, build file judge `jev-1.13.0` calls 3, tokens in 1680, cost 0.0001 USD, phases: path_judge 0.2 s, classifier 0.8 s, doc_check 0.7 s, context 1.0 s, model_review 734.4 s, config: defaults + host + repository (.werkrevisor.toml at main b571067).<br> Reviewed head `4a7f7208c83c28a5e386968f89f00aa34d8af822` against base `b57106773fde846378c072b83be6fa58aa836ea8`, werkrevisor 0.59.0. </sub> ### Diagrams Drawn by a model from the diff with [PR Lens](https://github.com/coldteadotai/pr-lens): a view of what the PR touches, not a statement of what it does. ![pr-lens-containers.svg](https://git.javagil.de/attachments/f9da640e-4a7e-41d3-9517-4cf2ebc0fb41) ![pr-lens-flow-set.svg](https://git.javagil.de/attachments/bd21681e-506c-42dc-acad-3e03db115267) ![pr-lens-flow-probe.svg](https://git.javagil.de/attachments/5141a5f8-5203-40f0-b612-3d10cfd7176e) </details>
ai-reviewer left a comment
Collaborator

Codex review of 4a7f7208c83c28a5e386968f89f00aa34d8af822

Codex review of `4a7f7208c83c28a5e386968f89f00aa34d8af822` <!-- werkrevisor-codex -->
@@ -0,0 +95,4 @@
echo "connection refused, retry in $((30 * attempt)) s" >&2
sleep $((30 * attempt))
done
return 1
Collaborator

[low] Exhausted SSH retries return the wrong exit code (Codex review)

After six SSH failures, retrying returns 1 instead of the documented error code 2. Consequently, check reports the same status for an unreachable host as for a verified credential mismatch, although it never inspected the remote files. Return 2 when connection retries are exhausted.

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

**[low] Exhausted SSH retries return the wrong exit code** (Codex review) After six SSH failures, retrying returns 1 instead of the documented error code 2. Consequently, check reports the same status for an unreachable host as for a verified credential mismatch, although it never inspected the remote files. Return 2 when connection retries are exhausted. Fix it, or reply why it does not hold, and resolve this comment. <!-- werkrevisor-codex -->
Author
Collaborator

Fixed in deb0b3f: retrying names the six refused connections and returns 2. test_an_unreachable_host_is_an_error_with_2 failed without the fix (1 != 2) and passes with it.

Fixed in `deb0b3f`: `retrying` names the six refused connections and returns 2. `test_an_unreachable_host_is_an_error_with_2` failed without the fix (1 != 2) and passes with it.
claude-code marked this conversation as resolved
Collaborator
⚠️ werkrevisor ERROR for ?, superseded by the result for deb0b3f

Codex review: critical

This changes production credential replacement, authentication checks and deletion of credential backups. Mistakes could expose secrets or interrupt review builds in ways the mocked tests would not reveal.

Findings

  1. [low] Exhausted SSH retries return the wrong exit code at tools/rotate-secret:98, 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 333790 (cached 253824) / out 2635, 80.7 s, 21 commands; reviewed head `4a7f7208c83c28a5e386968f89f00aa34d8af822`.
<!-- werkrevisor-codex:4a7f7208c83c28a5e386968f89f00aa34d8af822 --> <!-- 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/128#issuecomment-7049">the result for <code>deb0b3f</code></a></summary> ## Codex review: critical This changes production credential replacement, authentication checks and deletion of credential backups. Mistakes could expose secrets or interrupt review builds in ways the mocked tests would not reveal. ### Findings 1. **[low] Exhausted SSH retries return the wrong exit code** at `tools/rotate-secret:98`, 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 333790 (cached 253824) / out 2635, 80.7 s, 21 commands; reviewed head `4a7f7208c83c28a5e386968f89f00aa34d8af822`. </sub> </details>
Author
Collaborator

Answer to the review of 4a7f720, fixed in deb0b3f:

  • Merge conflict: rebased onto 0.59.1 of PR#127; the version stays 0.60.0.
  • Codex finding on the exit code after six refused connections: fixed, see the thread.
  • The model review timed out; advisory only, Jev judged every changed file.
  • Left to the human, since they are structural: the risky paths **/*secret* and the size.
Answer to the review of `4a7f720`, fixed in `deb0b3f`: - Merge conflict: rebased onto 0.59.1 of PR#127; the version stays 0.60.0. - Codex finding on the exit code after six refused connections: fixed, see the thread. - The model review timed out; advisory only, Jev judged every changed file. - Left to the human, since they are structural: the risky paths `**/*secret*` and the size.
claude-code added 16 commits 2026-10-21 22:02:20 +02:00
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
set refuses a third value and adds a missing key to the secrets file.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Found by the Codex review; the spec splits Scenario#128.05 and states the follow-ups plainly.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Found by the Codex review: http.client quoted a value with a line break in its traceback.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Found by the Codex review.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Found by the review of werkrevisor.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Found by the Codex review: before "&&", set -e let a failed assignment pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review round 6: six refused connections exit with 2
werkator build succeeded after 01:20
werkator/werkrevisor-statistics build succeeded after 01:13
ai-review/assessment human review required; a human approval unlocks the merge; the approval of mi came before this result; review requested again, please approve again after reading it; merge already scheduled
ai-review/gate build succeeded after 13:53
ai-review/codex Codex review passed
deb0b3fb47
Found by the Codex review.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude-code force-pushed claude-code/rotate-secrets from 4a7f7208c8 to deb0b3fb47 2026-10-21 22:02:20 +02:00 Compare
mi approved these changes 2026-10-21 22:03:53 +02:00
Dismissed
Collaborator

🟡 werkrevisor: YELLOW / HUMAN_REVIEW

Gate: the approval of mi came before this result; review requested again, please approve again after reading it; merge already scheduled.

Change kind: mixed.

Reasons

  • YELLOW risky paths changed: tests/test_rotate_secret.py (/secret), tests/test_secretprobe.py (/secret), tools/host_secret.py (**/secret) and 2 more
  • YELLOW PR too large for an AI-only approval: 1117 changed lines (docs and mechanical files not counted) exceed [size] max_changed_lines = 800; please review it yourself
  • hint 2 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.01)
  • hint the PR document may contradict the file according to Jev: docs/werkrevisor.werkbaum:253
  • hint the model review failed: TimeoutError: review exceeded 720 seconds (advisory: Jev judged every changed file)

Findings

  1. [medium] Claimed implementation is missing in the file at docs/werkrevisor.werkbaum:253, hint, as a line comment

Classifier

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

Usage: model `openrouter/minimax/minimax-m3`, LLM failed (TimeoutError), tokens counted before the call 60489, duration 726.9 s, cost unknown, classifier `jev-1.13.0` calls 15, tokens in 14075, cost 0.0006 USD, PR document check `jev-1.13.0` calls 11, tokens in 68165, cost 0.0029 USD, build file judge `jev-1.13.0` calls 3, tokens in 1680, cost 0.0001 USD, phases: path_judge 0.2 s, classifier 0.8 s, doc_check 0.7 s, context 0.5 s, model_review 723.3 s, config: defaults + host + repository (.werkrevisor.toml at main 5a97264).
Reviewed head `deb0b3fb47a6614d621b7f946064a9e7e5809c25` against base `5a972645a158f05a958fbead69401c06116bf50b`, werkrevisor 0.59.1.

Diagrams

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

pr-lens-arch-overview.svg

pr-lens-flow-rotate.svg

<!-- werkrevisor:deb0b3fb47a6614d621b7f946064a9e7e5809c25 --> <!-- werkrevisor-verdict:YELLOW --> <!-- werkrevisor-blocks:5de0c65d61fa69729337814dac489e41,a33676818e75e6188a182f2a3eec7cd6,5ab4d08cecb0cee075c95588bcb3c066,644e8213df2f22fe4f937fed26303105,264997333769cbbb2e7ecc621ab004c6,4d26b639a2aa631b992d4af528884219,83d6838cd7bd8f3d42f7bdec540e64e9,fb744df02bc6bd32ff24bd88ded26ce0,273011fa9d072c8827518d1c910f7527,82aaa6e069eedc74893a19334adae421,4db0382c5f4a454694edd1f838150953,aa4a2b4673e729e52b5ad663686d5db5,708b5aa02773af0d9a52982d2510fadf,11171aee79193bfaae968770d5a56b61,a85f7df80154500758e4fb896eb36e94,df1c1b44c45876b9f948608098bce3de,80f662afe484f2c66bb37dd2f626bada,cdadb3e031b8479e9414ceebcae930f8 --> ## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW Gate: the approval of mi came before this result; review requested again, please approve again after reading it; merge already scheduled. Change kind: `mixed`. ### Reasons - **YELLOW** risky paths changed: tests/test_rotate_secret.py (**/*secret*), tests/test_secretprobe.py (**/*secret*), tools/host_secret.py (**/*secret*) and 2 more - **YELLOW** PR too large for an AI-only approval: 1117 changed lines (docs and mechanical files not counted) exceed [size] max_changed_lines = 800; please review it yourself - **hint** 2 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.01) - **hint** the PR document may contradict the file according to Jev: docs/werkrevisor.werkbaum:253 - **hint** the model review failed: TimeoutError: review exceeded 720 seconds (advisory: Jev judged every changed file) ### Findings 1. **[medium] Claimed implementation is missing in the file** at `docs/werkrevisor.werkbaum:253`, hint, as a line comment ### Classifier 15 of 15 units passed all questions (1 PR document(s)). 8 answers ignored because of a confidence below [classifier] min_confidence. <sub> Usage: model `openrouter/minimax/minimax-m3`, LLM failed (TimeoutError), tokens counted before the call 60489, duration 726.9 s, cost unknown, classifier `jev-1.13.0` calls 15, tokens in 14075, cost 0.0006 USD, PR document check `jev-1.13.0` calls 11, tokens in 68165, cost 0.0029 USD, build file judge `jev-1.13.0` calls 3, tokens in 1680, cost 0.0001 USD, phases: path_judge 0.2 s, classifier 0.8 s, doc_check 0.7 s, context 0.5 s, model_review 723.3 s, config: defaults + host + repository (.werkrevisor.toml at main 5a97264).<br> Reviewed head `deb0b3fb47a6614d621b7f946064a9e7e5809c25` against base `5a972645a158f05a958fbead69401c06116bf50b`, werkrevisor 0.59.1. </sub> <!-- werkrevisor:diagrams --> ### Diagrams Drawn by a model from the diff with [PR Lens](https://github.com/coldteadotai/pr-lens): a view of what the PR touches, not a statement of what it does. ![pr-lens-arch-overview.svg](https://git.javagil.de/attachments/ad7fb43b-d78f-410c-bbc1-ffda7202c324) ![pr-lens-flow-rotate.svg](https://git.javagil.de/attachments/28be31d9-78d9-4f75-af9b-578920c298b5)
ai-reviewer left a comment
Collaborator

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

werkrevisor: YELLOW / HUMAN_REVIEW for `deb0b3fb47a6614d621b7f946064a9e7e5809c25`. The result comment of werkrevisor holds the details. <!-- werkrevisor-review:deb0b3fb47a6614d621b7f946064a9e7e5809c25 -->
@@ -250,6 +250,17 @@
" PR#86: the old path ~/.config/pr-agent-test/ is gone.
- [^] #ops.rotate: Replace the token of ai-reviewer that reached a transcript (XS)
" 2026-10-11: new token in the five machine configs on mih09; the old one is revoked.
- [~] #ops.rotate2: Rotate the four secrets of the review builds without a stop
Collaborator

[medium] Claimed implementation is missing in the file (werkrevisor)

hint

Jev compared the diff of this file with the PR document: Claimed implementation is missing in the file 0.70.
Fix the PR document or the code, or reply why the file belongs to the PR, and resolve this comment.
File fingerprint 7b4db386cc39.

**[medium] Claimed implementation is missing in the file** (werkrevisor) hint Jev compared the diff of this file with the PR document: Claimed implementation is missing in the file 0.70. Fix the PR document or the code, or reply why the file belongs to the PR, and resolve this comment. File fingerprint `7b4db386cc39`.
Author
Collaborator

No change: the Werkbaum file is the plan, not the implementation. Its node tools/rotate-secret points to the code of this PR, tools/rotate-secret, tools/host_secret.py and werkrevisor/secretprobe.py; the four open nodes are the rotation itself, which follows the merge, as the PR document says under Non-Goals and Follow-up PRs.

No change: the Werkbaum file is the plan, not the implementation. Its node `tools/rotate-secret` points to the code of this PR, `tools/rotate-secret`, `tools/host_secret.py` and `werkrevisor/secretprobe.py`; the four open nodes are the rotation itself, which follows the merge, as the PR document says under Non-Goals and Follow-up PRs.
claude-code marked this conversation as resolved
ai-reviewer requested review from mi 2026-10-21 22:15:41 +02:00
Collaborator

Codex review: critical

This change replaces live review-build credentials, checks authentication and token scopes, and deletes credential backups. Mistakes could expose secrets or disrupt production reviews in ways mocked tests would not reveal, so human review is required.

No findings.

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

Model `gpt-6-astra`, effort high, tokens in 408714 (cached 335872) / out 2398, 78.4 s, 16 commands; reviewed head `deb0b3fb47a6614d621b7f946064a9e7e5809c25`.
<!-- werkrevisor-codex:deb0b3fb47a6614d621b7f946064a9e7e5809c25 --> <!-- werkrevisor-codex-critical:true --> <!-- werkrevisor-codex-unattached:0 --> <!-- werkrevisor-codex --> ## Codex review: critical This change replaces live review-build credentials, checks authentication and token scopes, and deletes credential backups. Mistakes could expose secrets or disrupt production reviews in ways mocked tests would not reveal, so human review is required. No findings. The merge waits for the status `ai-review/codex`: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here. <sub> Model `gpt-6-astra`, effort high, tokens in 408714 (cached 335872) / out 2398, 78.4 s, 16 commands; reviewed head `deb0b3fb47a6614d621b7f946064a9e7e5809c25`. </sub>
Author
Collaborator

Answer to the review of deb0b3f: Codex has no findings; the Jev hint on docs/werkrevisor.werkbaum is answered without a change, see the thread. Left to the human: the risky paths and the size. werkrevisor asks mi to approve the head deb0b3f again after reading its result.

Answer to the review of `deb0b3f`: Codex has no findings; the Jev hint on `docs/werkrevisor.werkbaum` is answered without a change, see the thread. Left to the human: the risky paths and the size. werkrevisor asks mi to approve the head `deb0b3f` again after reading its result.
mi approved these changes 2026-10-21 22:32:45 +02:00
ai-reviewer merged commit 4d8e4e2276 into main 2026-10-21 22:33:42 +02:00
ai-reviewer deleted branch claude-code/rotate-secrets 2026-10-21 22:33:43 +02:00
Sign in to join this conversation.
No Reviewers
No labels
3 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: mi/werkrevisor#128