A link between two HTML artifacts of a private repository opens for the operator (v1.43.4) #164

Merged
ai-reviewer merged 4 commits from claude-code/artifact-links-private into main 2026-10-17 16:36:40 +02:00
Collaborator

Bug report from vm4006: every link inside the scenario report of hs.hsadmin.ng answers 404, because the sandboxed artifact navigates cross-site and the SameSite=Strict control-token cookie stays behind. See docs/prs/.

🤖 Generated with Claude Code

Bug report from vm4006: every link inside the scenario report of hs.hsadmin.ng answers 404, because the sandboxed artifact navigates cross-site and the SameSite=Strict control-token cookie stays behind. See docs/prs/. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
claude-code added 1 commit 2026-10-17 15:14:26 +02:00
claude-code added 1 commit 2026-10-17 15:17:51 +02:00
claude-code added 1 commit 2026-10-17 15:26:37 +02:00
PR-doc: browser check of the link between two artifacts
ai-review/codex Codex review: a human approval of the head unlocks the merge
werkator build succeeded after 03:17
ai-review/assessment human review required; a human approval unlocks the merge; review requested from mi; merge scheduled for when the checks succeed
ai-review/gate build succeeded after 01:50
fb6ebec64f
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude-code marked the pull request as ready for review 2026-10-17 15:30:05 +02:00
Collaborator
🟡 werkrevisor YELLOW for fb6ebec, superseded by the result for 09e9741

🟡 werkrevisor: YELLOW / HUMAN_REVIEW

Change kind: mixed.

Reasons

  • YELLOW risky paths changed: src/test/kotlin/de/javagil/werkator/server/ControlTokenCookieUnitTest.kt (**/ControlToken)
  • YELLOW spec: docs/prs/2026-10-17-PR#164-artifact-links-private-repos.md Scenario#164.01 hard_to_read (0.56 > yellow_above = 0.5)
  • YELLOW spec: docs/prs/2026-10-17-PR#164-artifact-links-private-repos.md Scenario#164.01 implementation_details (0.76 > yellow_above = 0.6)
  • YELLOW spec: docs/prs/2026-10-17-PR#164-artifact-links-private-repos.md Scenario#164.02 hard_to_read (0.54 > yellow_above = 0.5)
  • YELLOW spec: docs/prs/2026-10-17-PR#164-artifact-links-private-repos.md Scenario#164.02 implementation_details (0.73 > yellow_above = 0.6)
  • YELLOW spec: docs/prs/2026-10-17-PR#164-artifact-links-private-repos.md Scenario#164.02 given_when_then_misused (0.74 > yellow_above = 0.6)
  • YELLOW spec: docs/prs/2026-10-17-PR#164-artifact-links-private-repos.md Scenario#164.03 hard_to_read (0.58 > yellow_above = 0.5)
  • YELLOW spec: docs/prs/2026-10-17-PR#164-artifact-links-private-repos.md Scenario#164.03 implementation_details (0.76 > yellow_above = 0.6)
  • YELLOW model reports a security concern: SameSite weakening (documented in the PR): the change from SameSite=Strict to SameSite=Lax weakens RFC 0003 D8 — a foreign page visited by an authenticated operator can now open private pages and use timing or frame-counting to probe whether a private repository of a given name exists. The PR document acknowledges this trade-off and presents the alternatives (path-scoped cookies, signed URLs) …
  • hint 2 changed file(s) that neither weaken the checks, touch security nor show a risk category of jvm-spring-backend according to Jev
  • hint 1 build change(s) of low risk according to Jev: build.gradle.kts (weakens checks 0.03, risk 0.00, security 0.01)
  • hint 1 changed file was given to the AI as excerpt with 40 lines around each changed line, not in full (each larger than [review] max_full_file_chars = 80000): src/main/resources/static/werkator.js
  • hint 1 changed file was given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (each larger than [review] max_full_file_chars = 80000): src/main/resources/templates/releases.html
  • hint excerpt selection by openrouter/openai/gpt-6-luna failed, the fixed window was used: src/main/resources/static/werkator.js (a range lies outside the file)
  • hint 1 finding(s) possibly severe, but Jev doubts that they are real: docs/prs/2026-10-17-PR#164-artifact-links-private-repos.md:76-80 (advisory: Jev judged every changed file)
  • hint model recommends merge with caution

Findings

  1. [medium] D8 Weakening Trade-off at docs/prs/2026-10-17-PR#164-artifact-links-private-repos.md:76-80, YELLOW, as a line comment

Classifier

Unit Question Problem Confidence Verdict
docs/prs/2026-10-17-PR#164-artifact-links-private-repos.md Scenario#164.01 hard_to_read 0.56 0.65 YELLOW
docs/prs/2026-10-17-PR#164-artifact-links-private-repos.md Scenario#164.01 implementation_details 0.76 – YELLOW
docs/prs/2026-10-17-PR#164-artifact-links-private-repos.md Scenario#164.02 hard_to_read 0.54 0.56 YELLOW
docs/prs/2026-10-17-PR#164-artifact-links-private-repos.md Scenario#164.02 implementation_details 0.73 – YELLOW
docs/prs/2026-10-17-PR#164-artifact-links-private-repos.md Scenario#164.02 given_when_then_misused 0.74 – YELLOW
docs/prs/2026-10-17-PR#164-artifact-links-private-repos.md Scenario#164.03 hard_to_read 0.58 0.69 YELLOW
docs/prs/2026-10-17-PR#164-artifact-links-private-repos.md Scenario#164.03 implementation_details 0.76 – YELLOW

4 of 7 units passed all questions (1 PR document(s)).

Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 19582, calls 1, tokens in 18801 / out 8693 (reasoning included in out), duration 100.9 s, cost 0.0160 USD (reported), classifier `jev-1.13.0` calls 7, tokens in 6020, cost 0.0003 USD, finding judge `jev-1.13.0` calls 1, tokens in 2357, cost 0.0001 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 2, tokens in 65523 / out 509, cost 0.0084 USD (reported), build file judge `jev-1.13.0` calls 3, tokens in 3881, cost 0.0002 USD, phases: path_judge 0.3 s, classifier 0.5 s, context 10.4 s, model_review 89.2 s, finding_judge 0.3 s, config: defaults + host + repository (.werkrevisor.toml at main 06e29e8).
Reviewed head `fb6ebec64f4bd78b265352608f08ea6dbfda69ee` against base `06e29e871da52815f88dd78e347b07cf0e6b02c0`, werkrevisor 0.48.0.
<!-- werkrevisor:fb6ebec64f4bd78b265352608f08ea6dbfda69ee --> <!-- werkrevisor-verdict:YELLOW --> <!-- werkrevisor-blocks:a8a81001a318e113b2162d3bbeae92a6,e1f9d074169f58fd57b5b0be7c79c204,7fe0c6ab7a2f435f76f4b54c59156bbd,2c9ace79eb2930d5a58391413d099c93,bd2002a934dbcb49d8ba56231604e89c,54ecf88ec0183253d43ac0710fbe3f2b,0a60edbf6485f5dd27ef3b9753642216,35e9b7d9daf6d75c7d69ce98ab2d2aa3 --> <!-- werkrevisor-folded --> <details><summary>🟡 werkrevisor YELLOW for <code>fb6ebec</code>, superseded by <a href="http://git.javagil.de/mi/werkator/pulls/164#issuecomment-6304">the result for <code>09e9741</code></a></summary> ## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW Change kind: `mixed`. ### Reasons - **YELLOW** risky paths changed: src/test/kotlin/de/javagil/werkator/server/ControlTokenCookieUnitTest.kt (**/*ControlToken*) - **YELLOW** spec: docs/prs/2026-10-17-PR#164-artifact-links-private-repos.md Scenario#164.01 hard_to_read (0.56 > yellow_above = 0.5) - **YELLOW** spec: docs/prs/2026-10-17-PR#164-artifact-links-private-repos.md Scenario#164.01 implementation_details (0.76 > yellow_above = 0.6) - **YELLOW** spec: docs/prs/2026-10-17-PR#164-artifact-links-private-repos.md Scenario#164.02 hard_to_read (0.54 > yellow_above = 0.5) - **YELLOW** spec: docs/prs/2026-10-17-PR#164-artifact-links-private-repos.md Scenario#164.02 implementation_details (0.73 > yellow_above = 0.6) - **YELLOW** spec: docs/prs/2026-10-17-PR#164-artifact-links-private-repos.md Scenario#164.02 given_when_then_misused (0.74 > yellow_above = 0.6) - **YELLOW** spec: docs/prs/2026-10-17-PR#164-artifact-links-private-repos.md Scenario#164.03 hard_to_read (0.58 > yellow_above = 0.5) - **YELLOW** spec: docs/prs/2026-10-17-PR#164-artifact-links-private-repos.md Scenario#164.03 implementation_details (0.76 > yellow_above = 0.6) - **YELLOW** model reports a security concern: SameSite weakening (documented in the PR): the change from `SameSite=Strict` to `SameSite=Lax` weakens RFC 0003 D8 — a foreign page visited by an authenticated operator can now open private pages and use timing or frame-counting to probe whether a private repository of a given name exists. The PR document acknowledges this trade-off and presents the alternatives (path-scoped cookies, signed URLs) … - **hint** 2 changed file(s) that neither weaken the checks, touch security nor show a risk category of jvm-spring-backend according to Jev - **hint** 1 build change(s) of low risk according to Jev: build.gradle.kts (weakens checks 0.03, risk 0.00, security 0.01) - **hint** 1 changed file was given to the AI as excerpt with 40 lines around each changed line, not in full (each larger than [review] max_full_file_chars = 80000): src/main/resources/static/werkator.js - **hint** 1 changed file was given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (each larger than [review] max_full_file_chars = 80000): src/main/resources/templates/releases.html - **hint** excerpt selection by openrouter/openai/gpt-6-luna failed, the fixed window was used: src/main/resources/static/werkator.js (a range lies outside the file) - **hint** 1 finding(s) possibly severe, but Jev doubts that they are real: docs/prs/2026-10-17-PR#164-artifact-links-private-repos.md:76-80 (advisory: Jev judged every changed file) - **hint** model recommends merge with caution ### Findings 1. **[medium] D8 Weakening Trade-off** at `docs/prs/2026-10-17-PR#164-artifact-links-private-repos.md:76-80`, YELLOW, as a line comment ### Classifier | Unit | Question | Problem | Confidence | Verdict | |---|---|---|---|---| | docs/prs/2026-10-17-PR#164-artifact-links-private-repos.md Scenario#164.01 | hard_to_read | 0.56 | 0.65 | YELLOW | | docs/prs/2026-10-17-PR#164-artifact-links-private-repos.md Scenario#164.01 | implementation_details | 0.76 | – | YELLOW | | docs/prs/2026-10-17-PR#164-artifact-links-private-repos.md Scenario#164.02 | hard_to_read | 0.54 | 0.56 | YELLOW | | docs/prs/2026-10-17-PR#164-artifact-links-private-repos.md Scenario#164.02 | implementation_details | 0.73 | – | YELLOW | | docs/prs/2026-10-17-PR#164-artifact-links-private-repos.md Scenario#164.02 | given_when_then_misused | 0.74 | – | YELLOW | | docs/prs/2026-10-17-PR#164-artifact-links-private-repos.md Scenario#164.03 | hard_to_read | 0.58 | 0.69 | YELLOW | | docs/prs/2026-10-17-PR#164-artifact-links-private-repos.md Scenario#164.03 | implementation_details | 0.76 | – | YELLOW | 4 of 7 units passed all questions (1 PR document(s)). <sub> Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 19582, calls 1, tokens in 18801 / out 8693 (reasoning included in out), duration 100.9 s, cost 0.0160 USD (reported), classifier `jev-1.13.0` calls 7, tokens in 6020, cost 0.0003 USD, finding judge `jev-1.13.0` calls 1, tokens in 2357, cost 0.0001 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 2, tokens in 65523 / out 509, cost 0.0084 USD (reported), build file judge `jev-1.13.0` calls 3, tokens in 3881, cost 0.0002 USD, phases: path_judge 0.3 s, classifier 0.5 s, context 10.4 s, model_review 89.2 s, finding_judge 0.3 s, config: defaults + host + repository (.werkrevisor.toml at main 06e29e8).<br> Reviewed head `fb6ebec64f4bd78b265352608f08ea6dbfda69ee` against base `06e29e871da52815f88dd78e347b07cf0e6b02c0`, werkrevisor 0.48.0. </sub> </details>
ai-reviewer left a comment
Collaborator

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

werkrevisor: YELLOW / HUMAN_REVIEW for `fb6ebec64f4bd78b265352608f08ea6dbfda69ee`. The result comment of werkrevisor holds the details. <!-- werkrevisor-review:fb6ebec64f4bd78b265352608f08ea6dbfda69ee -->
@@ -0,0 +73,4 @@
It cannot read the answer, because the page is cross-origin to it.
- A script in a sandboxed artifact has an opaque origin: it cannot read `document.cookie` or `localStorage` of Werkator,
and its `fetch` or `iframe` requests to Werkator are cross-site subresource requests, which do not carry a Lax cookie.
- Residual risk, new with Lax: a foreign page can open a private page in the operator's browser and time it,
Collaborator

[medium] D8 Weakening Trade-off (werkrevisor)

YELLOW; Jev: real 0.53, severity 3.0 of 3

The change from SameSite=Strict to SameSite=Lax weakens RFC 0003 D8: a foreign page can now open a private repository page in the operator's browser and use timing or frame-counting to tell a 200 from a 404, thereby guessing whether a private repository of a given name exists. The PR document explicitly discusses this trade-off (lines 76–80) and notes that the alternatives (a path-scoped artifact cookie or signed artifact URLs) cost a server-side token per artifact. The change is deliberate, minimal, and documented, but it weakens a documented privacy guarantee and therefore deserves focused reviewer attention rather than routine approval.

**[medium] D8 Weakening Trade-off** (werkrevisor) YELLOW; Jev: real 0.53, severity 3.0 of 3 The change from `SameSite=Strict` to `SameSite=Lax` weakens RFC 0003 D8: a foreign page can now open a private repository page in the operator's browser and use timing or frame-counting to tell a 200 from a 404, thereby guessing whether a private repository of a given name exists. The PR document explicitly discusses this trade-off (lines 76–80) and notes that the alternatives (a path-scoped artifact cookie or signed artifact URLs) cost a server-side token per artifact. The change is deliberate, minimal, and documented, but it weakens a documented privacy guarantee and therefore deserves focused reviewer attention rather than routine approval.
Author
Collaborator

Not changed: the trade-off is deliberate and documented under "Solution". Whether the residual risk to D8 is acceptable is the decision of the human at approval. The scenarios are rewritten as behaviour in 09e9741.

Not changed: the trade-off is deliberate and documented under "Solution". Whether the residual risk to D8 is acceptable is the decision of the human at approval. The scenarios are rewritten as behaviour in `09e9741`.
claude-code marked this conversation as resolved
ai-reviewer scheduled this pull request to auto merge when all checks succeed 2026-10-17 15:32:00 +02:00
ai-reviewer requested review from mi 2026-10-17 15:32:00 +02:00
claude-code added 1 commit 2026-10-17 15:32:49 +02:00
PR-doc: the scenarios describe what the operator sees
ai-review/codex Codex review passed
ai-review/assessment human review required; a human approval unlocks the merge; a human review request is pending; merge already scheduled
ai-review/gate build succeeded after 02:17
werkator build succeeded after 03:57
09e9741f52
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Collaborator
⚠️ werkrevisor ERROR for ?, superseded by the result for 09e9741

Codex review: critical

Changing the private-content authorization cookie from SameSite=Strict to Lax changes a security boundary and requires human review. The documented cross-site information-disclosure risk is not covered by the source-text tests.

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 204798 (cached 164992) / out 1119, 44.1 s, 10 commands; reviewed head `fb6ebec64f4bd78b265352608f08ea6dbfda69ee`.
<!-- werkrevisor-codex:fb6ebec64f4bd78b265352608f08ea6dbfda69ee --> <!-- 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/werkator/pulls/164#issuecomment-6304">the result for <code>09e9741</code></a></summary> ## Codex review: critical Changing the private-content authorization cookie from SameSite=Strict to Lax changes a security boundary and requires human review. The documented cross-site information-disclosure risk is not covered by the source-text tests. 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 204798 (cached 164992) / out 1119, 44.1 s, 10 commands; reviewed head `fb6ebec64f4bd78b265352608f08ea6dbfda69ee`. </sub> </details>
Collaborator

🟡 werkrevisor: YELLOW / HUMAN_REVIEW

Change kind: mixed.

Reasons

  • YELLOW risky paths changed: src/test/kotlin/de/javagil/werkator/server/ControlTokenCookieUnitTest.kt (**/ControlToken)
  • hint 2 changed file(s) that neither weaken the checks, touch security nor show a risk category of jvm-spring-backend according to Jev
  • hint 1 build change(s) of low risk according to Jev: build.gradle.kts (weakens checks 0.03, risk 0.00, security 0.01)
  • hint 2 changed files were given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (each larger than [review] max_full_file_chars = 80000): src/main/resources/static/werkator.js, src/main/resources/templates/releases.html

Classifier

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

Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 20169, calls 1, tokens in 19371 / out 20599 (reasoning included in out), duration 131.8 s, cost 0.0305 USD (reported), classifier `jev-1.13.0` calls 7, tokens in 6028, cost 0.0003 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 2, tokens in 65523 / out 542, cost 0.0009 USD (reported), build file judge `jev-1.13.0` calls 3, tokens in 3881, cost 0.0002 USD, phases: path_judge 0.3 s, classifier 0.5 s, context 8.7 s, model_review 121.9 s, config: defaults + host + repository (.werkrevisor.toml at main 06e29e8).
Reviewed head `09e9741f523690f8ced4009776d36b5633219e6f` against base `06e29e871da52815f88dd78e347b07cf0e6b02c0`, werkrevisor 0.48.0.
<!-- werkrevisor:09e9741f523690f8ced4009776d36b5633219e6f --> <!-- werkrevisor-verdict:YELLOW --> <!-- werkrevisor-blocks:a8a81001a318e113b2162d3bbeae92a6,3747e78d4e30af60b9936bb02860584a,7fe0c6ab7a2f435f76f4b54c59156bbd,2c9ace79eb2930d5a58391413d099c93,bd2002a934dbcb49d8ba56231604e89c,54ecf88ec0183253d43ac0710fbe3f2b,0a60edbf6485f5dd27ef3b9753642216,35e9b7d9daf6d75c7d69ce98ab2d2aa3 --> ## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW Change kind: `mixed`. ### Reasons - **YELLOW** risky paths changed: src/test/kotlin/de/javagil/werkator/server/ControlTokenCookieUnitTest.kt (**/*ControlToken*) - **hint** 2 changed file(s) that neither weaken the checks, touch security nor show a risk category of jvm-spring-backend according to Jev - **hint** 1 build change(s) of low risk according to Jev: build.gradle.kts (weakens checks 0.03, risk 0.00, security 0.01) - **hint** 2 changed files were given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (each larger than [review] max_full_file_chars = 80000): src/main/resources/static/werkator.js, src/main/resources/templates/releases.html ### Classifier 7 of 7 units passed all questions (1 PR document(s)). 2 answers ignored because of a confidence below [classifier] min_confidence. <sub> Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 20169, calls 1, tokens in 19371 / out 20599 (reasoning included in out), duration 131.8 s, cost 0.0305 USD (reported), classifier `jev-1.13.0` calls 7, tokens in 6028, cost 0.0003 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 2, tokens in 65523 / out 542, cost 0.0009 USD (reported), build file judge `jev-1.13.0` calls 3, tokens in 3881, cost 0.0002 USD, phases: path_judge 0.3 s, classifier 0.5 s, context 8.7 s, model_review 121.9 s, config: defaults + host + repository (.werkrevisor.toml at main 06e29e8).<br> Reviewed head `09e9741f523690f8ced4009776d36b5633219e6f` against base `06e29e871da52815f88dd78e347b07cf0e6b02c0`, werkrevisor 0.48.0. </sub>
Collaborator

Codex review: critical

Changing the control-token cookie from SameSite=Strict to Lax changes the authorization boundary for private repository content and requires human review. The added source-text tests cannot establish browser-level security, including the cross-site information-disclosure risk acknowledged in the PR documentation.

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 145739 (cached 110464) / out 1001, 38.9 s, 6 commands; reviewed head `09e9741f523690f8ced4009776d36b5633219e6f`.
<!-- werkrevisor-codex:09e9741f523690f8ced4009776d36b5633219e6f --> <!-- werkrevisor-codex-critical:true --> <!-- werkrevisor-codex-unattached:0 --> <!-- werkrevisor-codex --> ## Codex review: critical Changing the control-token cookie from SameSite=Strict to Lax changes the authorization boundary for private repository content and requires human review. The added source-text tests cannot establish browser-level security, including the cross-site information-disclosure risk acknowledged in the PR documentation. 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 145739 (cached 110464) / out 1001, 38.9 s, 6 commands; reviewed head `09e9741f523690f8ced4009776d36b5633219e6f`. </sub>
mi approved these changes 2026-10-17 16:36:22 +02:00
ai-reviewer merged commit 6badbcee7a into main 2026-10-17 16:36:40 +02:00
ai-reviewer deleted branch claude-code/artifact-links-private 2026-10-17 16:36:40 +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/werkator#164