Skip to content

fix(sandbox): redact credential-shaped subprocess evidence - #842

Open
seonghobae wants to merge 11 commits into
mainfrom
fix/sandbox-log-redaction-current-main-20260809
Open

fix(sandbox): redact credential-shaped subprocess evidence#842
seonghobae wants to merge 11 commits into
mainfrom
fix/sandbox-log-redaction-current-main-20260809

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Purpose

Create a clean current-main, test-first replacement for the sandbox output-redaction portion of #841 without importing its unrelated SSRF slice or rewriting Jules history.

RCA

Protected main captures and prints subprocess stdout/stderr in scripts/ci/sandboxed_verify.py and scripts/ci/sandboxed_web_e2e.py, decodes timeout stdout/stderr through timeout_output_text(), and prints backend/frontend service log tails through tail_text() without passing those evidence paths through the mature redact_sensitive_log.redact_text boundary. A credential-shaped value emitted by a repository test or service can therefore become CI/review evidence even though the sandbox scrubs ambient secret environment variables.

This is an evidence-redaction defect, not shell injection, provider routing, SSRF, reviewer identity, or branch-protection failure.

Feasibility decision

RED state

Exact base: 6eb06cdd08c79a06f7b390069d4ffa49e2eb7dba.

Initial test-only head: f33b37d882ddb8ab0ef8ffd4e843cb5edce9adc9.

The only changed file at this RED head is tests/test_sandboxed_log_redaction_regression.py. It requires all CI-facing evidence paths to redact representative credential-shaped values while preserving ordinary diagnostic text:

  • completed sandboxed_verify stdout/stderr;
  • sandboxed_verify timeout stdout/stderr bytes;
  • completed sandboxed_web_e2e stdout/stderr;
  • backend/frontend service log tails; and
  • E2E timeout stdout/stderr bytes.

Protected main does not satisfy these contracts, so this head is intentionally not merge-ready. No production file has been changed yet.

Required GREEN implementation

After hosted RED evidence confirms the intended failure, make only the smallest production repair:

  1. import/use redact_sensitive_log.redact_text at the sandbox evidence-output boundary;
  2. redact completed stdout/stderr and decoded timeout evidence without changing argv, shell=False, process-group, timeout, readiness, network, or cleanup behavior;
  3. redact service log tails before printing;
  4. preserve ordinary non-sensitive diagnostic text and exit codes;
  5. add only necessary doctoring/CHANGELOG evidence.

Do not add readiness-URL SSRF changes, provider/model changes, credential changes, workflow-permission changes, branch-protection changes, or output-resource-limit work owned by #766.

Acceptance

Keep Draft until the RED→GREEN lineage is visible, focused sandbox tests and the complete central suite pass, changed production statement/branch coverage and public docstrings are 100%, Strix/security/supply-chain exact-head gates are green, automated review is current-head, zero valid unresolved findings remain, and a qualifying counted non-author human approval exists. Protected-main operational evidence remains required before closing any incident tied to real log disclosure.

Supersedes only the redaction slice of #841 after this replacement proves its own exact-head evidence; preserve #841 history unchanged.

Follow-up exhaustive boundary review (current head)

Exact follow-up head: 9d24ea60ac9a281b7ac9d855ad4c86e3b68db182 (tree 21891b5aad2bb6e86007ee05c8b4b1a7b727b48a), still based directly on 19405408ab832fcc507d84cf75689d8cc7b9c80d.

The initial GREEN exposed five narrower defects in the shared boundary: opaque JSON strings were not scanned, benign metadata keys were over-redacted, terminal controls could split signatures, explicit --allow-env values were not supplied to the redactor, and assignment parsing was quadratic. Consumer-path review then added fail-first coverage for result-marker integrity, credential-bearing JSON keys, authorization headers, URL userinfo, private-key blocks, escaped/multiline literals, service-tail truncation order, terminal overwrite/default-ignorable controls, pathological JSON depth, separated credential options, setup/launch exceptions, and fixed-evidence collisions.

The bounded follow-up:

  • centralizes terminal canonicalization, JSON key/value recursion, semantic key classification, exact literal/escaped-value handling, provider/JWT recognition, private-key and authorization redaction, and linear assignment parsing in redact_sensitive_log.py;
  • threads captured explicit allowed values through completed, timeout, exception, service-tail, command-metadata, and structured result paths without changing executed argv;
  • redacts complete service logs before selecting the bounded tail;
  • keeps result markers as one-line valid JSON with stable keys;
  • rejects only ambiguous short or fixed-evidence-colliding allowed values before execution, while preserving whitespace-bearing credential semantics; and
  • expands the exact-head quality workflow to own the shared redactor and its security-boundary tests.

Current source-tree acceptance:

  • focused redaction contract: 102 passed;
  • exact coverage: 605 statements / 206 branches, 100% across the shared redactor and both wrappers;
  • complete repository suite: 1020 passed, 16 subtests passed;
  • central Strix quick gate: PASS;
  • compileall, public-docstring AST contract, and git diff --check: PASS;
  • 500,000-character key-like input: 0.72 s locally.

Output-memory and service-file quotas remain explicitly out of scope under #766. Hosted checks must prove this exact head, and the branch must still satisfy the live ruleset's two approvals, last-push approval, and resolved-thread requirements before merge.

@coderabbitai

coderabbitai Bot commented Aug 9, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@seonghobae, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 58 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8fa5b951-d0fd-4db8-a04c-fd739d856600

📥 Commits

Reviewing files that changed from the base of the PR and between 6eb06cd and c05d527.

📒 Files selected for processing (10)
  • .github/workflows/sandbox-log-redaction-quality-ci.yml
  • CHANGELOG.md
  • docs/doctoring/sandbox-log-redaction.md
  • scripts/ci/redact_sensitive_log.py
  • scripts/ci/sandboxed_verify.py
  • scripts/ci/sandboxed_web_e2e.py
  • tests/test_opencode_security_boundaries.py
  • tests/test_sandboxed_log_redaction_regression.py
  • tests/test_sandboxed_verify.py
  • tests/test_sandboxed_web_e2e.py

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@seonghobae
seonghobae marked this pull request as ready for review August 9, 2026 03:27

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

Please review the exact current head 19405408ab832fcc507d84cf75689d8cc7b9c80d against protected base 6eb06cdd08c79a06f7b390069d4ffa49e2eb7dba. Focus on the bounded sandbox evidence-redaction contract only: completed stdout/stderr, timeout stdout/stderr bytes, backend/frontend service-log tails, preservation of ordinary diagnostics and exit/process semantics, and absence of unrelated SSRF/provider/credential/workflow-permission changes. Treat the visible RED→GREEN lineage and exact-head quality/security results as evidence, not as a substitute for source review.

@coderabbitai

coderabbitai Bot commented Aug 9, 2026

Copy link
Copy Markdown
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

base='6eb06cdd08c79a06f7b390069d4ffa49e2eb7dba'
head='19405408ab832fcc507d84cf75689d8cc7b9c80d'

printf '%s\n' '== Exact commits and ancestry =='
git rev-parse "$base" "$head"
git merge-base --is-ancestor "$base" "$head" && echo 'base is an ancestor of head'
git log --oneline --reverse "${base}..${head}"

printf '%s\n' '== Changed paths and change summary =='
git diff --name-status "$base" "$head"
git diff --stat "$base" "$head"

printf '%s\n' '== Production diff =='
git diff --unified=80 "$base" "$head" -- \
  scripts/ci/sandboxed_verify.py \
  scripts/ci/sandboxed_web_e2e.py \
  scripts/ci/redact_sensitive_log.py

printf '%s\n' '== Regression-test diff =='
git diff --unified=40 "$base" "$head" -- \
  tests/test_sandboxed_log_redaction_regression.py

printf '%s\n' '== Affected source outlines =='
ast-grep outline scripts/ci/sandboxed_verify.py --items all
ast-grep outline scripts/ci/sandboxed_web_e2e.py --items all
ast-grep outline scripts/ci/redact_sensitive_log.py --items all
ast-grep outline tests/test_sandboxed_log_redaction_regression.py --items all

printf '%s\n' '== Evidence-output call sites in affected helpers =='
rg -n -C 8 -e 'timeout_output_text\s*\(' -e 'tail_text\s*\(' -e '\bprint\s*\(' \
  scripts/ci/sandboxed_verify.py scripts/ci/sandboxed_web_e2e.py

printf '%s\n' '== Full focused regression test =='
cat -n tests/test_sandboxed_log_redaction_regression.py

Length of output: 63799


🏁 Script executed:

#!/bin/bash
set -euo pipefail

base='6eb06cdd08c79a06f7b390069d4ffa49e2eb7dba'
red='f33b37d882ddb8ab0ef8ffd4e843cb5edce9adc9'
head='19405408ab832fcc507d84cf75689d8cc7b9c80d'

printf '%s\n' '== RED commit changed paths =='
git diff --name-status "$base" "$red"
git diff --unified=20 "$base" "$red" -- tests/test_sandboxed_log_redaction_regression.py

printf '%s\n' '== Shared redactor implementation =='
cat -n scripts/ci/redact_sensitive_log.py

printf '%s\n' '== Dedicated quality workflow =='
cat -n .github/workflows/sandbox-log-redaction-quality-ci.yml

printf '%s\n' '== Doctoring and changelog changes =='
git diff --unified=30 "$base" "$head" -- \
  docs/doctoring/sandbox-log-redaction.md \
  CHANGELOG.md

printf '%s\n' '== All changed diff lines that can affect excluded scope =='
git diff --unified=5 "$base" "$head" | rg -n -i -C 3 \
  '(^[+-].*(ready|url|redirect|urllib|ssrf|provider|model|credential|token|secret|permission|permissions|workflow|shell|process|timeout|redact))' || true

printf '%s\n' '== Existing shared-redactor tests and direct sandbox helper tests =='
fd -t f -e py . tests scripts | sort | while read -r file; do
  if rg -q 'redact_text|timeout_output_text|tail_text|sandboxed_verify|sandboxed_web_e2e' "$file"; then
    echo "--- $file"
    rg -n -C 2 'redact_text|timeout_output_text|tail_text|sandboxed_verify|sandboxed_web_e2e' "$file"
  fi
done

Length of output: 85587


🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo='ContextualWisdomLab/.github'
pr='842'
head='19405408ab832fcc507d84cf75689d8cc7b9c80d'

printf '%s\n' '== Pull request head and base =='
gh pr view "$pr" --repo "$repo" \
  --json number,state,isDraft,baseRefOid,headRefOid,statusCheckRollup,reviews \
  --jq '{number, state, isDraft, baseRefOid, headRefOid, reviews: [.reviews[] | {author: .author.login, state, submittedAt}]}'

printf '%s\n' '== Check runs attached to requested head =='
gh api "repos/${repo}/commits/${head}/check-runs?per_page=100" \
  --jq '.check_runs[] | {name, status, conclusion, details_url: .details_url, started_at, completed_at}'

printf '%s\n' '== Commit statuses attached to requested head =='
gh api "repos/${repo}/commits/${head}/status" \
  --jq '{state, statuses: [.statuses[] | {context, state, target_url}]}'

Length of output: 22395


@seonghobae I found no source-level findings in the requested scope.

The reviewed head is a descendant of the specified protected base. The RED commit changes only the regression test. The final code applies redact_text at all required evidence boundaries:

  • completed stdout and stderr in sandboxed_verify.py;
  • decoded timeout stdout and stderr in sandboxed_verify.py;
  • completed stdout and stderr in sandboxed_web_e2e.py;
  • E2E timeout stdout and stderr through the shared timeout helper; and
  • backend and frontend service-log tails before printing.

The implementation preserves the reviewed process behavior. It does not change argv, shell=False, process-group handling, timeout values, readiness logic, cleanup order, or timeout exit codes. The tests also preserve ordinary diagnostics and empty-output behavior.

I found no production changes for readiness URL handling, SSRF, provider routing, credentials, or existing workflow permissions. The new quality workflow uses only contents: read and sets persist-credentials: false. It does not grant write permission.

The exact PR base and head match the requested OIDs. A prior exact-head redaction-contract run and Strix run succeeded. At review time, the newest Strix, pip-audit, and CodeQL runs were still in progress. The PR is also not Draft and has no human approval. Therefore, the source review is clear, but the stated merge-readiness acceptance is not complete yet.

⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

Please perform a fresh full review of unchanged exact head 19405408ab832fcc507d84cf75689d8cc7b9c80d against protected base 6eb06cdd08c79a06f7b390069d4ffa49e2eb7dba. Re-fetch both identities before reviewing. The prior request 5229570014 produced an analysis-chain reply but never a completed review conclusion, formal review, or actionable thread after several hours, so treat it as incomplete rather than current acceptance evidence. Review only the strict six-file sandbox evidence-redaction slice: completed stdout/stderr, timeout stdout/stderr bytes, backend/frontend service-log tails, preservation of ordinary diagnostic and process/exit semantics, visible RED→GREEN lineage, and absence of unrelated SSRF/provider/credential/workflow-permission changes. Exact-head Sandbox Log Redaction Quality, Strix, CodeQL, Python Security, Security Scan, Semgrep, Secret Scan, OSV, Scorecard, and SBOM are terminal-success. Report only current source-backed findings. This automated review remains separate from the required counted non-author human approval.

@coderabbitai

coderabbitai Bot commented Aug 9, 2026

Copy link
Copy Markdown
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo='ContextualWisdomLab/.github'
base='6eb06cdd08c79a06f7b390069d4ffa49e2eb7dba'
head='19405408ab832fcc507d84cf75689d8cc7b9c80d'
red='f33b37d882ddb8ab0ef8ffd4e843cb5edce9adc9'

git fetch --no-tags origin "$base" "$head" "$red"

printf '%s\n' '== Exact object identities =='
git show -s --format='commit=%H%ntree=%T%nparents=%P%nsubject=%s' "$base" "$red" "$head"
git merge-base --is-ancestor "$base" "$head"
printf '%s\n' 'base_is_ancestor_of_head=yes'

printf '%s\n' '== Commit lineage =='
git log --oneline --reverse "${base}..${head}"

printf '%s\n' '== Changed paths =='
git diff --name-status "$base" "$head"

printf '%s\n' '== Focused source outlines =='
for file in \
  scripts/ci/sandboxed_verify.py \
  scripts/ci/sandboxed_web_e2e.py \
  scripts/ci/redact_sensitive_log.py \
  tests/test_sandboxed_log_redaction_regression.py \
  docs/doctoring/sandbox-log-redaction.md \
  CHANGELOG.md
do
  if test -f "$file"; then
    echo "--- $file"
    ast-grep outline "$file" --items all || true
  fi
done

printf '%s\n' '== RED test-only diff =='
git diff --unified=35 "$base" "$red" -- tests/test_sandboxed_log_redaction_regression.py

printf '%s\n' '== GREEN implementation and evidence diff =='
git diff --unified=70 "$base" "$head" -- \
  scripts/ci/sandboxed_verify.py \
  scripts/ci/sandboxed_web_e2e.py \
  scripts/ci/redact_sensitive_log.py \
  tests/test_sandboxed_log_redaction_regression.py \
  docs/doctoring/sandbox-log-redaction.md \
  CHANGELOG.md

printf '%s\n' '== Evidence-output and process-related call sites =='
rg -n -C 10 \
  -e '\b(redact_text|timeout_output_text|tail_text)\s*\(' \
  -e '\b(print|subprocess\.run|Popen)\s*\(' \
  -e '\b(shell|start_new_session|timeout|returncode)\b' \
  scripts/ci/sandboxed_verify.py scripts/ci/sandboxed_web_e2e.py

printf '%s\n' '== Excluded-scope diff indicators =='
git diff --unified=3 "$base" "$head" | rg -n -i -C 2 \
  '^[+-].*\b(ssrf|url|urllib|redirect|provider|model|credential|permission|permissions|workflow)\b' || true

printf '%s\n' '== PR identity =='
gh pr view 842 --repo "$repo" --json baseRefOid,headRefOid,isDraft,state \
  --jq '{baseRefOid,headRefOid,isDraft,state}'

Length of output: 91246


🏁 Script executed:

#!/bin/bash
set -euo pipefail

base='6eb06cdd08c79a06f7b390069d4ffa49e2eb7dba'
head='19405408ab832fcc507d84cf75689d8cc7b9c80d'

printf '%s\n' '== New quality workflow =='
cat -n .github/workflows/sandbox-log-redaction-quality-ci.yml

printf '%s\n' '== Shared redactor contract =='
cat -n scripts/ci/redact_sensitive_log.py

printf '%s\n' '== Shared timeout-helper references =='
rg -n -C 6 '\btimeout_output_text\s*\(' .

printf '%s\n' '== Existing direct sandbox tests =='
rg -n -C 4 \
  -e '\b(run_command|run_shell|timeout_output_text|tail_text|start_service|stop_service)\s*\(' \
  tests scripts/ci \
  -g '*.py'

printf '%s\n' '== Exact implementation-only delta =='
git diff --word-diff=plain --unified=12 "$base" "$head" -- \
  scripts/ci/sandboxed_verify.py scripts/ci/sandboxed_web_e2e.py

printf '%s\n' '== Changed workflow permission and checkout settings =='
git diff --unified=20 "$base" "$head" -- .github/workflows/sandbox-log-redaction-quality-ci.yml | \
  rg -n -C 8 'permissions|persist-credentials|ref:|checkout|pull_request|workflow_dispatch|contents:' || true

Length of output: 41226


@seonghobae Fresh scoped review completed for #842.

I re-fetched and verified the requested identities. The pull request base is 6eb06cdd08c79a06f7b390069d4ffa49e2eb7dba. The head is 19405408ab832fcc507d84cf75689d8cc7b9c80d. The base is an ancestor of the head.

I found no current source-backed findings in the requested scope.

The RED→GREEN lineage is visible. Commit f33b37d882ddb8ab0ef8ffd4e843cb5edce9adc9 changes only the new regression test. Later commits add the bounded production repair.

The repair applies redact_text before all reviewed evidence output:

  • completed stdout and stderr in scripts/ci/sandboxed_verify.py;
  • decoded TimeoutExpired stdout and stderr in scripts/ci/sandboxed_verify.py;
  • completed stdout and stderr in scripts/ci/sandboxed_web_e2e.py;
  • E2E timeout output through the shared redacted timeout helper; and
  • backend and frontend service-log tails in tail_text() before printing.

The regression tests cover credential-shaped values, ordinary diagnostics, byte-valued timeout output, absent timeout streams, and empty completed streams.

The production diff does not change subprocess argv, shell=False in sandboxed_verify.py, process-group creation or cleanup, timeout values, readiness behavior, or timeout exit code 124. It preserves the service-readiness exit code 125 and completed-process return codes.

The changed workflow is restricted to this contract. It grants only contents: read, checks out the exact pull request head, and sets persist-credentials: false. I found no unrelated SSRF, provider, credential, or expanded workflow-permission change.

⚠️ Action not completed

Review rate limited.


Your included review limit is currently reached under our Fair Usage Limits Policy. This review may still proceed through usage-based billing if eligible. Your next included review will be available in 55 minutes.

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

Please perform one fresh full review of unchanged exact head 19405408ab832fcc507d84cf75689d8cc7b9c80d against protected base 6eb06cdd08c79a06f7b390069d4ffa49e2eb7dba. The last recorded OSS review cooldown was 55 minutes and has elapsed. Review only the six-file sandbox log-redaction slice: completed stdout/stderr, timeout stdout/stderr bytes, backend/frontend service tails, preservation of subprocess/process-group/timeout/network semantics, and absence of unrelated provider/SSRF/permission changes. Treat machine checks and RED→GREEN lineage as evidence, not as a substitute for source review or counted human approval. If capacity is still unavailable, report it once; do not infer a source defect.

@coderabbitai

coderabbitai Bot commented Aug 9, 2026

Copy link
Copy Markdown
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo='ContextualWisdomLab/.github'
base='6eb06cdd08c79a06f7b390069d4ffa49e2eb7dba'
head='19405408ab832fcc507d84cf75689d8cc7b9c80d'
red='f33b37d882ddb8ab0ef8ffd4e843cb5edce9adc9'

git fetch --no-tags origin "$base" "$red" "$head"

printf '%s\n' '== Exact commit identities and ancestry =='
git show -s --format='commit=%H%ntree=%T%nparents=%P%nsubject=%s' "$base" "$red" "$head"
git merge-base --is-ancestor "$base" "$head"
echo 'base_is_ancestor_of_head=yes'

printf '%s\n' '== Pull request identity =='
gh pr view 842 --repo "$repo" --json baseRefOid,headRefOid,state,isDraft \
  --jq '{baseRefOid,headRefOid,state,isDraft}'

printf '%s\n' '== Commit lineage and changed paths =='
git log --oneline --reverse "${base}..${head}"
git diff --name-status "$base" "$head"

printf '%s\n' '== Scoped file outlines =='
for file in \
  scripts/ci/sandboxed_verify.py \
  scripts/ci/sandboxed_web_e2e.py \
  scripts/ci/redact_sensitive_log.py \
  tests/test_sandboxed_log_redaction_regression.py \
  docs/doctoring/sandbox-log-redaction.md \
  CHANGELOG.md \
  .github/workflows/sandbox-log-redaction-quality-ci.yml
do
  if test -f "$file"; then
    echo "--- $file"
    ast-grep outline "$file" --items all || true
  fi
done

printf '%s\n' '== RED test-only delta =='
git diff --unified=45 "$base" "$red" -- tests/test_sandboxed_log_redaction_regression.py

printf '%s\n' '== Scoped GREEN delta =='
git diff --unified=90 "$base" "$head" -- \
  scripts/ci/sandboxed_verify.py \
  scripts/ci/sandboxed_web_e2e.py \
  scripts/ci/redact_sensitive_log.py \
  tests/test_sandboxed_log_redaction_regression.py \
  docs/doctoring/sandbox-log-redaction.md \
  CHANGELOG.md \
  .github/workflows/sandbox-log-redaction-quality-ci.yml

printf '%s\n' '== Evidence-output and subprocess call sites =='
rg -n -C 12 \
  -e '\b(redact_text|timeout_output_text|tail_text)\s*\(' \
  -e '\b(print|subprocess\.run|Popen)\s*\(' \
  -e '\b(shell|start_new_session|timeout|returncode|killpg|terminate|wait)\b' \
  scripts/ci/sandboxed_verify.py scripts/ci/sandboxed_web_e2e.py

printf '%s\n' '== Excluded-scope diff indicators =='
git diff --unified=5 "$base" "$head" | rg -n -i -C 3 \
  '^[+-].*\b(ssrf|url|urllib|redirect|provider|model|credential|permission|permissions|workflow|network|socket)\b' || true

printf '%s\n' '== Current exact-head checks =='
gh api "repos/${repo}/commits/${head}/check-runs?per_page=100" \
  --jq '.check_runs[] | {name,status,conclusion}' | sort

Length of output: 106088


@seonghobae Fresh scoped source review completed for #842.

I re-fetched the requested commits. The pull request base is 6eb06cdd08c79a06f7b390069d4ffa49e2eb7dba. The head is 19405408ab832fcc507d84cf75689d8cc7b9c80d. The base is an ancestor of the head.

I found no current source-backed findings in the requested scope.

The RED→GREEN lineage is visible. Commit f33b37d882ddb8ab0ef8ffd4e843cb5edce9adc9 adds only the fail-first regression test. Later commits make the bounded production changes.

The production code redacts all reviewed evidence paths:

  • scripts/ci/sandboxed_verify.py redacts completed stdout and stderr.
  • scripts/ci/sandboxed_verify.py decodes and redacts TimeoutExpired stdout and stderr, including byte values.
  • scripts/ci/sandboxed_web_e2e.py redacts completed E2E stdout and stderr.
  • scripts/ci/sandboxed_web_e2e.py uses the shared redacted timeout helper.
  • scripts/ci/sandboxed_web_e2e.py redacts backend and frontend log tails before printing.

The tests cover credential-shaped values, ordinary diagnostic text, byte-valued timeout output, missing timeout streams, and empty completed streams.

The source diff does not change subprocess arguments, shell=False in scripts/ci/sandboxed_verify.py, process-group creation, cleanup order, timeout values, readiness control flow, network behavior, or exit codes 124 and 125.

The diff does not add provider, SSRF, or credential behavior changes. The added workflow grants only contents: read and uses persist-credentials: false.

Exact-head checks include successful redaction-contract, CodeQL, Semgrep, pip-audit, secret-scan, OSV, SBOM, and Strix runs. These results support the review. They do not replace source review or the required counted non-author human approval.

⚠️ Action not completed

Review rate limited.


Your included review limit is currently reached under our Fair Usage Limits Policy. This review may still proceed through usage-based billing if eligible. Your next included review will be available in 39 minutes.

seonghobae added a commit that referenced this pull request Aug 9, 2026
🎯 **What:** Aborted the code health refactoring of `scripts/ci/sandboxed_verify.py` and reverted changes.
💡 **Why:** As noted in code review, the requested extraction of the printing logic into a helper function overlaps unsafely with an active security fix (PR #842) which introduces a redaction boundary. Merging this would cause conflicts and potentially reintroduce a pre-redaction vulnerability.
✅ **Verification:** Verified that the working tree is clean and all tests, including interrogator and bandit, pass.
✨ **Result:** No changes made, task closed safely.
Comment thread tests/test_opencode_security_boundaries.py Outdated
Comment thread tests/test_opencode_security_boundaries.py Outdated
Comment thread tests/test_opencode_security_boundaries.py Outdated
Comment thread tests/test_opencode_security_boundaries.py Outdated
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants