Skip to content

fix(strix): resolve evidence binder from trusted source - #2291

Open
seonghobae wants to merge 14 commits into
mainfrom
codex/strix-trusted-binder-root
Open

seonghobae wants to merge 14 commits into
mainfrom
codex/strix-trusted-binder-root

Conversation

@seonghobae

@seonghobae seonghobae commented Sep 19, 2026

Copy link
Copy Markdown
Contributor

Current authority — 2026-09-22 KST

Exact head is 1794626af3473ef23b9c2e678c3f06fd6c11636f on protected main@e6334e229581a918e2f22de18733b76fa65d7e71; OPEN / Ready. The prior source-repair head bbe225d6559ba5ba562d06d2802d3d9687cc02e3 remains audit-visible; the current commit is an ordinary-forward focused-test inheritance, not a rewrite.

This PR remains the canonical trusted Strix runtime/binder owner. Production strix_quick_gate.sh resolves strix_evidence_binding.py from the trusted source runtime rather than STRIX_REPO_ROOT; the consumer remains scan/artifact source and must not be required to carry the binder.

24-site specialized-fixture P1 — source repaired

The accepted P1 was that 24 specialized scripts/ci/test_strix_quick_gate.sh fixtures still called materialize_trusted_gate_fixture "$repo_root_dir/scripts/ci", co-locating trusted gate/model/binder with the consumer and masking regressions to consumer-root binder lookup. Structural RED tests/test_strix_trusted_fixture_boundary.py records that forbidden materialization string.

Ordinary-forward commit bbe225d6559ba5ba562d06d2802d3d9687cc02e3 repaired the specialized matrix without changing the product gate. Each affected case materializes into a sibling $tmp_dir/trusted-source/scripts/ci, invokes the trusted gate by absolute path, and supplies STRIX_REPO_ROOT="$repo_root_dir". Exact-source search found zero remaining occurrences of the forbidden consumer-root materialization. Consumer copies of gate/model remain only where a scenario intentionally places those files under scan; the trusted binder is not reintroduced there.

#2331 valid-delta succession — complete

Direct-main sibling #2331 independently reproduced the original consumer-root binder failure and contributed one valid delta not previously present here: tests/test_strix_evidence_binder_trusted_path.py. Its production gate fix is semantically the same $SCRIPT_DIR/strix_evidence_binding.py resolution already owned here, while its fixture strategy copies the binder alongside consumer-root fixture materialization and is weaker than this owner's sibling trusted-source architecture.

Commit 1794626af3473ef23b9c2e678c3f06fd6c11636f inherits that valid focused contract into this canonical owner without copying #2331's weaker fixture topology. The regression executes the real sanitize_remediation_evidence_claims bash function with a consumer REPO_ROOT containing no central binder, requires success through the trusted sibling binder, then removes the trusted binder and requires fail-closed exit 2. CodeRabbit independently re-read exact 1794626a... and reported no remaining finding in this trusted-binder boundary; that review evidence is current-head but not a substitute for hosted required checks.

Fresh exact-head hosted state

The older exact-head security generation remains cancelled audit history and is not acceptance. The replacement generation is now terminal in all visible lanes:

  • Agent Review Runtime Quality CI 35661200424: SUCCESS.
  • SAST Semgrep 35672611347: SUCCESS.
  • Security Scan 35672611396: SUCCESS.
  • Python Security 35672611349: FAILURE. Detect Python and Bandit are SUCCESS; pip-audit job 106599684140 is the sole failing leaf after real hosted execution.
  • CodeQL PR 35672611353: FAILURE, but current job evidence does not establish a source/SARIF defect. Detect CodeQL languages succeeded. Both compatibility jobs successfully read the current-head dispatch verdict and then failed at Release runner or enforce current-head CodeQL verdict; the subsequent Dispatch current-head CodeQL scan job 106661445370 ran later and succeeded. Treat this as the same current-head verdict/lifecycle lane owned through ops: diagnose and bound organization GitHub Actions queue starvation #712 unless a terminal scan verdict proves otherwise; do not normalize it to GREEN and do not blind-rerun.

The Python Security failure is not owned by this six-file Strix binder delta: #2291 does not change any dependency manifest or lock. Protected central main and this exact head still contain shared requirements-strix-ci-hashes.txt authority with AnyIO 4.14.0. Canonical dependency owner #2278 is the one-file requirements-strix-ci-hashes.txt successor that advances AnyIO 4.14.0 -> 4.14.2; on exact 8a5251bf409fe84b3dd0cba1e48992f5b8d9eda5, Python Security 35649352757, SAST 35649352729, and Security Scan 35649352800 are terminal SUCCESS. Its CodeQL 35649352653 is a separate terminal lifecycle/current-head-verdict failure and remains under #712. Do not copy that dependency delta into this owner.

Normal repair order is #2278 governance/integration -> ordinary/non-force reconciliation of #2291 onto the resulting protected central main -> fresh exact-head Python Security and all other required evidence. This classification does not transfer #2278 checks to #2291 and does not declare the current pip-audit log equivalent without reconciliation. It identifies the existing canonical shared-dependency owner and prevents duplicate mutation while the same protected AnyIO 4.14.0 lock remains in this branch.

All visible inline review threads are resolved/outdated. Submitted reviews remain COMMENTED; there is still no qualifying independent current-head APPROVED review.

Acceptance / landing order

Merge authority remains withheld until the shared dependency repair reaches protected authority and this branch is ordinarily reconciled, then one unchanged exact head has terminal Runtime Quality, SAST, Security Scan, Python Security and CodeQL acceptance; no actionable review thread; qualifying independent current-head review evidence; and normal protected-main merge. #2109 remains the Draft/Ready + stacked-base admission successor and must consume this owner only after normal protected integration.

No predecessor evidence transfer, self-approval, source-neutral wake/no-op commit, blind rerun, dependency-fix duplication, force push, destructive rebase, review dismissal, or gate weakening is authorized.

@coderabbitai

coderabbitai Bot commented Sep 19, 2026

Copy link
Copy Markdown
Contributor

Review Change StackReview Change Stack

📝 Walkthrough

Walkthrough

Strix 게이트가 신뢰 소스 디렉터리에서 증거 바인더를 해석하도록 변경되었습니다. 테스트 하니스는 소비자 워크스페이스와 신뢰 런타임을 분리하고 STRIX_REPO_ROOT를 전달합니다. OpenCode 커버리지 단언과 관련 문서도 갱신되었습니다.

Changes

Strix 신뢰 런타임 격리

Layer / File(s) Summary
신뢰 게이트와 바인더 해석
scripts/ci/strix_quick_gate.sh, scripts/ci/test_strix_quick_gate.sh
게이트는 $SCRIPT_DIR/strix_evidence_binding.py를 사용합니다. 하니스는 게이트, 모델 유틸리티, 바인더를 trusted-source/scripts/ci에 배치하고 절대 경로로 실행합니다.
픽스처 시나리오 전환
scripts/ci/test_strix_quick_gate.sh, tests/test_strix_trusted_fixture_boundary.py
게이트 시나리오가 공통 materialize_trusted_gate_fixture() 헬퍼를 사용합니다. 소비자 루트의 신뢰 런타임 materialization을 검사하는 회귀 테스트가 추가되었습니다.
커버리지 검증 및 기록
scripts/ci/test_strix_quick_gate.sh, CHANGELOG.d/20260920-strix-trusted-binder-runtime-fixture.md, docs/product-technical-gap-baseline.md
커버리지 단언이 validate-pr-metadata 단계와 새 실패 메시지를 확인하도록 변경되었습니다. 관련 변경이 changelog와 기술 기준 문서에 기록되었습니다.

Priority: ➖ Normal

Estimated code review effort: 3 (Moderate) | ~25 minutes

Change: Bug fix · Severity of issue fixed: Medium

Sequence Diagram(s)

sequenceDiagram
  participant Harness as test_strix_quick_gate.sh
  participant Gate as trusted Strix quick gate
  participant Binder as strix_evidence_binding.py
  participant Workspace as consumer workspace
  Harness->>Gate: 절대 경로로 실행
  Harness->>Gate: STRIX_REPO_ROOT 전달
  Gate->>Binder: SCRIPT_DIR에서 바인더 로드
  Gate->>Workspace: 소비자 입력과 저장소 상태 처리
Loading

Suggested reviewers: claude

Merge Risk: 🟡 Moderate · up to a8d62

The current test harness fails and does not consistently verify the required trusted-runtime isolation. Fix the specialized fixtures before merging.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 3 functions across 2 files. (3 skipped: 2 …
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목은 Strix가 신뢰된 소스에서 evidence binder를 해석하도록 수정하는 변경 사항을 정확하고 간결하게 설명합니다.
✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

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.

Copy link
Copy Markdown
Contributor Author

Exact-head evidence — c08b13d207c5c086802d80acf8a85cd982a8ed95

  • protected main@e6334e229581a918e2f22de18733b76fa65d7e71 대비 2 ahead / 0 behind
  • exactly two owned paths, +3/-1
  • RED source-boundary contract: 513302a9…
  • GREEN production repair: c08b13d2…
  • mergeable, Draft/Proposed, unresolved threads 0
  • fresh Runtime Quality, Security, Python Security, CodeQL, and Semgrep workflows are queued

The failing consumer fixtures deliberately set STRIX_REPO_ROOT to an isolated target. The executable central helper must therefore remain relative to immutable SCRIPT_DIR; no consumer file copy or fallback is introduced.

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Sep 19, 2026

Copy link
Copy Markdown
Contributor

@seonghobae: I will review pull request #2291 at the current exact head. I will verify that the evidence binder resolves from SCRIPT_DIR and that the consumer REPO_ROOT remains limited to consumer scan and artifact roots.

⚠️ 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.

@seonghobae seonghobae left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 — add a production-shaped consumer-isolation regression before accepting this repair.

The source change points the binder at the correct trusted owner, but the new test only greps for the literal assignment. It never runs the gate with STRIX_REPO_ROOT rebound to an isolated consumer that deliberately has no scripts/ci/strix_evidence_binding.py, which is the exact boundary that produced the 527 binder is missing: <consumer>/... failures.

Please add an executable fixture that invokes the real gate (or a source-faithful extracted function) with:

  • the gate and binder present only under the central trusted SCRIPT_DIR;
  • an isolated consumer STRIX_REPO_ROOT with no binder;
  • a fake Strix log/report that reaches sanitize_remediation_evidence_claims; and
  • assertions that the run does not read the consumer binder path and that the central binder actually transforms or validates the report.

The existing positive/negative string assertions can remain as static contracts, but they do not prove the repaired data flow. Keep the hosted exact-head checks and independent review as separate acceptance gates; the currently queued runs are not passing evidence.

@seonghobae seonghobae added bug Something isn't working priority: critical Immediate blocker, P0, urgent deadlock, or critical incident labels Sep 19, 2026 — with ChatGPT Codex Connector

@seonghobae seonghobae left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Current-head re-review: the earlier P1 executable consumer-isolation gap is repaired. The harness now materializes the trusted gate, model helper, and evidence binder as one central runtime fixture across every isolated-consumer family; STRIX_REPO_ROOT remains the binder-free consumer workspace. The original exact head reproduced exit 2 with the consumer-path missing-binder error, while the repaired filtered scenario exits 0 in normal and GITHUB_ACTIONS=true environments. Focused tests are 51 passed, the complete Python suite is 3,392 passed / 5 skipped / 40 subtests, and the complete Strix shell harness reports PASS. Exact head db1fd614934c32ee01340de8524cce4141df9b24, tree 741a72afac667baa5394f60eb3aa8b784e3ba589. This COMMENT records evidence only and is not an approval; hosted current-head gates and independent review remain required.

Copy link
Copy Markdown
Contributor Author

Naruon consumer owner-path note: #2291 should be treated as the canonical Strix trusted-binder production/runtime owner. Existing .github#2272@4e8829f5... carries a Pages/SAST lane but also touches scripts/ci/test_strix_quick_gate.sh for isolated-fixture binder materialization, so that overlap must converge here rather than remain two independent Strix writers.

Please keep #2291's invariant explicit through integration: consumer scan/artifact roots stay consumer-owned; strix_evidence_binding.py stays trusted central-source-owned and is resolved from the gate's trusted script directory; executable isolated fixtures materialize the complete trusted runtime bundle. If #2272 is restacked after this lane, its Pages/SAST delta may consume this exact owner contract but must not copy or redefine the production binder boundary.

Naruon does not consume this source directly; only a normally integrated/released central contract plus fresh downstream exact-head evidence is acceptable. No receipt transfer, force rewrite, or duplicate runtime owner.

@seonghobae seonghobae left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Current-head transport recovery review.

fb9c0e212c711e45b6ee82a1f194609fcc299e0e changed only scripts/ci/test_strix_quick_gate.sh, replacing the 13,102-line executable harness with a binary-like single-line blob (+1,213/-13,101 versus its verified parent). The corrupted blob had no shell shebang/newlines and no materialize_trusted_gate_fixture, so it carried no valid executable test delta.

Ordinary-forward successor 78b33a8d576f36ad4b28ce971e824876749d4d34 preserves the incident in ancestry and restores exact verified tree 741a72afac667baa5394f60eb3aa8b784e3ba589. Fresh remote comparison against db1fd614934c32ee01340de8524cce4141df9b24 is two commits ahead with zero file differences, and the harness blob is again 502075f9343d2d83b42c34e9c3d8982555600406 with its executable shebang.

This records tree recovery only, not hosted acceptance or approval. Runtime Quality 35474568056, Python Security 35474568060, CodeQL 35474568053, SAST 35474568076, and Security 35474568087 are queued/nonterminal; fresh exact-head checks and qualifying independent review remain required.

@seonghobae seonghobae left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Exact-head repair receipt for 00082e8dc7ab6bdd3261c4f7131f6e300a66b645.

Re-review found the predecessor fixture still placed strix_evidence_binding.py under the consumer repo_root_dir/scripts/ci and invoked the gate from that same path. It therefore could not prove the claimed trusted-source / consumer-root separation.

RED 191bd630bb5df0f8f3f5f43f095d832bb40f2c6d makes a consumer-owned binder an executable fixture failure. GREEN ef1a866734618cd8c18c21c6c6a0c5aeea62254f moves the gate/model/binder bundle to a sibling trusted-source/scripts/ci, passes the binder-free workspace only through STRIX_REPO_ROOT, and invokes the trusted gate by absolute path. Gap and CHANGELOG evidence are corrected at abc9a7d1… and 00082e8d….

Fresh exact remote verification: owner-boundary assertions 7/7; bash -n for gate and 13k-line harness 2/2; a production-shaped direct gate probe with no consumer binder exited 0; exact binder sanitization produced all three required markers (remediation NOT applied, rejection marker, State=remediation_failed). Predecessor full-suite results are not current-head acceptance.

This COMMENT records direct repair evidence only, not approval. Fresh exact-head hosted Checks and qualifying independent review remain required.

seonghobae added a commit that referenced this pull request Sep 19, 2026
Preserve #2272's Pages shell-boundary delta while adopting #2291's trusted-source Strix runtime. Remove the superseded consumer binder copies, count-only closure test, and stale owner claims.

Copy link
Copy Markdown
Contributor Author

Downstream single-writer convergence is now explicit. #2272 exact head 0379535a87cb3c7fd4b4038c76b0670f4730fb7b is an ordinary two-parent child of #2272 predecessor 4e8829f5… and this canonical owner exact head 00082e8d…; its base is retargeted to codex/strix-trusted-binder-root.

The stacked #2272 diff now contains only 7 Pages/SAST paths. It no longer changes the Strix production gate/harness, no longer carries tests/test_strix_fixture_runtime_closure.py, and no longer requires 25 consumer binder copies. Exact-tree checks confirm the binder-copy pattern is absent while the trusted-source fixture and binder-free STRIX_REPO_ROOT boundary remain present.

This is downstream topology and source verification only. #2291's queued exact-head Checks and qualifying independent review remain its acceptance gates; no review/check receipt transfers to #2272.

seonghobae added a commit that referenced this pull request Sep 19, 2026
Preserve #2109 workflow-admission and sandbox evidence while adopting #2291 trusted-source Strix runtime as an ordinary second parent.
seonghobae added a commit that referenced this pull request Sep 19, 2026
A Ready canary on the #2291 stacked base generated Security, SAST, and CodeQL but omitted Runtime Quality and Python Security. Remove only those two pull_request base-name filters and pin the five-workflow stacked-base contract; push filters and all job guards remain unchanged.

@seonghobae seonghobae left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Exact-head COMMENT review for 782d67b433aa71cf2c81b2a81f55ae192a317f3b (tree 37503f7f6c1522f727e83cf40bec8b7171b9fed3). This is not an approval.

The trusted gate/model/binder runtime remains isolated under trusted-source/scripts/ci; the consumer is passed only through STRIX_REPO_ROOT and owns no binder. Full-matrix execution exposed one narrower fixture requirement: when the canonical .github gate itself is the changed source, the consumer scan tree must contain the gate and model helper as source under review. This head materializes those two files only for pr-changed-scope-includes-ci-dependency, while continuing to execute the trusted absolute gate and leaving the consumer binder absent.

Fresh exact-tree verification: focused binder/runtime-quality 85 passed; full warnings-as-errors 3,394 passed / 3 skipped / 40 subtests; complete Strix shell integration PASS; required-workflow smoke, bash -n, compileall, and diff check PASS. Remote/local trees and the 643,680-byte harness blob are byte-identical. Unresolved threads are 0; I found no additional source defect.

Ready may admit independent review. Fresh exact-head hosted Checks and a qualifying independent approval remain merge gates.

@seonghobae
seonghobae marked this pull request as ready for review September 20, 2026 00:13
seonghobae added a commit that referenced this pull request Sep 20, 2026
Preserve the lane's current tree and integrate #2291 exact head 782d67b. The only owner delta since the previous stack base is the five-line changed-scope source fixture in scripts/ci/test_strix_quick_gate.sh.

@seonghobae seonghobae left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hosted exact-head Runtime Quality RED is now concrete at a8d6261d4fc2c2a82a9b8ad6636e75677ecc5081: run 35512696971, job 106083294309, failed at Verify scheduler and contextual-orchestrator review-repair contracts. The new tests/test_strix_trusted_fixture_boundary.py correctly rejects every specialized fixture that still calls materialize_trusted_gate_fixture "$repo_root_dir/scripts/ci".

run_gate_case() already demonstrates the causal repair shape: materialize strix_quick_gate.sh, strix_model_utils.sh, and strix_evidence_binding.py under a separate trusted script root; execute that trusted gate; pass STRIX_REPO_ROOT="$repo_root_dir" so the gate still observes the consumer repository; and copy gate/model into the consumer tree only for scenarios that intentionally exercise those consumer source files. All remaining specialized fixture families in scripts/ci/test_strix_quick_gate.sh must adopt that split-root pattern.

Do not repair this by changing the regression to sample only one fixture, by restoring binder lookup from $REPO_ROOT, or by leaving trusted binder/runtime material in the consumer root. Those variants can hide the exact boundary the production SCRIPT_DIR repair is meant to protect. After the complete fixture-matrix repair, require fresh exact-head Runtime Quality GREEN before #2109 reconciliation; predecessor success does not transfer.

seonghobae commented Sep 21, 2026

Copy link
Copy Markdown
Contributor Author

Fresh hosted-security evidence changes the status of this exact head but does not change the 24-site causal repair.

Python Security run 35512696949 is now terminal failure. Job 106155330569 reached a GitHub-hosted Ubuntu 24.04 runner and failed specifically in pip-audit; Bandit completed success. The audit reports anyio==4.14.0 in requirements-strix-ci-hashes.txt with CVE-2026-63374, CVE-2026-64847, and CVE-2026-63349, all fixed in 4.14.2. Security Scan 35512696977 is now terminal success; SAST remains success; CodeQL remains queued.

This dependency RED is not introduced by #2291: the same AnyIO 4.14.0 lock exists on base main@e6334e229581a918e2f22de18733b76fa65d7e71, while this PR changes only its trusted-runtime fixture/boundary paths. Fresh owner sweep found that the complete canonical repair already exists as #2278 chore(deps): bump anyio from 4.14.0 to 4.14.2, exact 8a5251bf409fe84b3dd0cba1e48992f5b8d9eda5, one effective lock-file path +3/-3. The temporary duplicate issue #2321 was therefore closed only after verified full ownership/evidence inheritance by #2278. New hosted reproduction evidence has been added to #2278.

For #2291 itself, the existing hosted Runtime Quality RED and unresolved Major still require the complete 24-site split-root fixture repair. Neither failed lane should be blind-rerun before its causal source is repaired.

@seonghobae

Copy link
Copy Markdown
Contributor Author

Consumer-side reproduction from fast-mlsirm (lead verification, no fmls workaround committed).

Affected required Strix jobs: fast-mlsirm #2005 job 106100379387 (scan finished, Vulnerabilities 0) and #2018 job 106100530048. Both exited 2 with ERROR: Strix evidence binder is missing: /home/runner/work/_temp/trusted-workspace/scripts/ci/strix_evidence_binding.py. trusted-workspace is the consumer checkout, and the binder only exists in this repo.

Minimal repro: extract sanitize_remediation_evidence_claims from scripts/ci/strix_quick_gate.sh at a given rev, set SCRIPT_DIR=<rev>/scripts/ci and REPO_ROOT=<fast-mlsirm checkout>, then call it with an empty log and report dir:

  • e6334e22 (current main): rc=2, same ERROR line
  • this PR a8d6261d: rc=0

So the $SCRIPT_DIR fix resolves the consumer-side failure. It still needs its own red checks cleared and an undraft before it can land.

…e the consumer root

Green step for a8d6261. The 24 specialized cases in
test_strix_quick_gate.sh installed the trusted gate/model/binder into
$repo_root_dir/scripts/ci and ran ./scripts/ci/strix_quick_gate.sh, so a
consumer-root binder lookup could never fail there and masked the #2292
defect. Each case now materializes into
$tmp_dir/trusted-source/scripts/ci and runs the gate from that directory
with STRIX_REPO_ROOT=$repo_root_dir, which keeps the old repo-root
semantics (the gate defaults REPO_ROOT to SCRIPT_DIR/../..).

Evidence:
- tests/test_strix_trusted_fixture_boundary.py: fails on a8d6261 (CI
  job 106083294309), passes here.
- bash scripts/ci/test_strix_quick_gate.sh on Linux, umask 022:
  a8d6261 PASS (rc=0, 727s) and this commit PASS (rc=0, 726s).
- strix-related pytest (8 files): 242 passed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P5o6j4zfxGPdRaH4Lug8UY
@seonghobae

Copy link
Copy Markdown
Contributor Author

Green step pushed as bbe225d6 (on top of a8d6261d, no force-push).

  • agent-review-runtime-quality RED (test_specialized_strix_fixtures_keep_trusted_runtime_outside_consumer): the 24 specialized fixtures now materialize the trusted gate/model/binder in $tmp_dir/trusted-source/scripts/ci and run the gate from there with STRIX_REPO_ROOT=$repo_root_dir. The gate defaults REPO_ROOT to SCRIPT_DIR/../.., so setting it keeps the old repo-root semantics. The boundary test fails at a8d6261d and passes at bbe225d6.
  • Harness, bash scripts/ci/test_strix_quick_gate.sh on Linux with umask 022: a8d6261d rc=0 (727s), bbe225d6 rc=0 (726s), 0 FAIL lines in both.
    • With umask 002, both revisions fail the same 795 cases on STRIX_EXECUTABLE_PATH must not be group/world writable. That comes from the host umask, not this change.
  • Strix-related pytest (8 files referencing the harness): 242 passed.
  • pip-audit RED (anyio 4.14.0 → CVE-2026-63374 / 64847 / 63349) is not in this PR's scope. Dependabot chore(deps): bump anyio from 4.14.0 to 4.14.2 #2278 bumps it to 4.14.2 and has 34/34 checks green but is still draft. Once chore(deps): bump anyio from 4.14.0 to 4.14.2 #2278 lands on main, rebasing this PR clears it.
  • CodeQL compatibility ×2 are the dispatch fail-closed wait, not findings.

Copy link
Copy Markdown
Contributor Author

Fresh downstream owner-graph finding from Naruon commercial sweep:

Concurrent Draft #2331 (52a0231ef979517935c1e77b6e3728cf33a00d2b) is a direct-main sibling, not a descendant of this canonical owner. Git compare against current #2291 exact bbe225d6559ba5ba562d06d2802d3d9687cc02e3 reports diverged, ahead 1 / behind 13 with merge-base protected main@e6334e229581a918e2f22de18733b76fa65d7e71.

Verified overlap:

  • both change production sanitize_remediation_evidence_claims() from consumer $REPO_ROOT/scripts/ci/strix_evidence_binding.py to trusted $SCRIPT_DIR/strix_evidence_binding.py;
  • fix(strix): resolve the evidence binder next to the trusted gate #2331 then copies the binder next to copied gates in many consumer-root fixture setups, while this owner deliberately repaired the specialized matrix to a sibling trusted-source root + absolute gate invocation + explicit consumer STRIX_REPO_ROOT, preventing fixture colocation from masking the trust-boundary regression.

Verified potentially valid delta not present on current #2291: #2331 adds focused tests/test_strix_evidence_binder_trusted_path.py, directly exercising a consumer REPO_ROOT without central scripts and fail-closed behavior when the trusted binder is absent. Current #2291 does not contain that path.

Treat #2331 as a repair/succession finding, not a second accepted Strix owner: ordinary/non-force adopt the focused test (or an equivalent stronger contract) into this canonical stack if it remains valid, while preserving this owner's sibling trusted-source fixture boundary rather than importing #2331's consumer-root binder-copy strategy. Do not close either lane as fully superseded until every valid test/fixture/evidence delta is demonstrably inherited.

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

Please review exact current head 1794626af3473ef23b9c2e678c3f06fd6c11636f. The new delta is the focused tests/test_strix_evidence_binder_trusted_path.py succession from #2331. Verify that it exercises the real sanitize_remediation_evidence_claims function with a consumer STRIX_REPO_ROOT that lacks central scripts, proves trusted $SCRIPT_DIR binder resolution, and still fails closed when the trusted binder is absent. Also verify that the existing stronger sibling trusted-source fixture topology is preserved; no consumer-root binder colocation should be reintroduced.

@coderabbitai

coderabbitai Bot commented Sep 21, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

head="1794626af3473ef23b9c2e678c3f06fd6c11636f"
base="e6334e229581a918e2f22de18733b76fa65d7e71"
gate="scripts/ci/strix_quick_gate.sh"
harness="scripts/ci/test_strix_quick_gate.sh"
focused_test="tests/test_strix_evidence_binder_trusted_path.py"
boundary_test="tests/test_strix_trusted_fixture_boundary.py"

printf '%s\n' '== exact topology =='
git cat-file -t "$head"
printf 'merge-base: '
git merge-base "$base" "$head"
printf '%s\n' '== effective changed paths =='
git diff --name-status "$base" "$head"
git diff --stat "$base" "$head"
printf '%s\n' '== succession delta =='
git diff --no-ext-diff --unified=80 "$head^" "$head" -- "$focused_test"

printf '%s\n' '== focused test outline =='
ast-grep outline "$focused_test" --items all || true
printf '%s\n' '== focused test, numbered =='
git show "$head:$focused_test" | nl -ba

printf '%s\n' '== production function and relevant initialisation =='
git show "$head:$gate" | nl -ba | sed -n '1,100p;220,285p'

printf '%s\n' '== all runtime materialisations, gate paths, and consumer roots =='
git show "$head:$harness" | nl -ba | grep -E -C 4 'materialize_trusted_gate_fixture|trusted-source|gate_under_test=|STRIX_REPO_ROOT=|bash "\./scripts/ci/strix_quick_gate\.sh"|bash "\$gate_under_test"' || true

printf '%s\n' '== forbidden consumer materialisations and binder copies =='
git show "$head:$harness" | grep -nE 'materialize_trusted_gate_fixture "\$repo_root_dir/scripts/ci"|repo_root_dir/scripts/ci/strix_evidence_binding\.py|cp .*strix_evidence_binding\.py' || true

printf '%s\n' '== boundary test and its source-based offender search =='
git show "$head:$boundary_test" | nl -ba

printf '%s\n' '== full effective relevant diff =='
git diff --no-ext-diff --unified=30 "$base" "$head" -- "$gate" "$harness" "$focused_test" "$boundary_test"

Length of output: 160580


@seonghobae I reviewed exact head 1794626af3473ef23b9c2e678c3f06fd6c11636f.

I found no issue in the requested trusted-binder boundary.

  • tests/test_strix_evidence_binder_trusted_path.py extracts the current production sanitize_remediation_evidence_claims function from scripts/ci/strix_quick_gate.sh.
  • The success case uses an empty consumer directory as the effective consumer root. It sets SCRIPT_DIR to the trusted central scripts/ci directory. It passes only when the trusted strix_evidence_binding.py exists there.
  • The failure case sets SCRIPT_DIR to a directory without the binder. It asserts exit code 2 and the exact missing-binder path.
  • sanitize_remediation_evidence_claims resolves the binder only from $SCRIPT_DIR/strix_evidence_binding.py.

The sibling trusted-runtime fixture topology remains preserved.

  • scripts/ci/test_strix_quick_gate.sh materializes the complete gate, model-helper, and binder bundle under trusted-source/scripts/ci.
  • The specialized fixture invocations execute the trusted gate path and pass STRIX_REPO_ROOT="$repo_root_dir".
  • I found no materialize_trusted_gate_fixture "$repo_root_dir/scripts/ci" call.
  • I found no direct consumer-root copy of strix_evidence_binding.py.
  • The existing boundary test remains effective against the former consumer-root materialization pattern.

I used the prior trusted-binder boundary guidance during this review. I did not execute repository code.


🧠 Learnings used
Learnt from: seonghobae
URL: https://github.com/ContextualWisdomLab/.github/pull/2291

Timestamp: 2026-09-20T14:32:38.791Z
Learning: For the Strix trusted-binder boundary, `scripts/ci/strix_quick_gate.sh` must resolve `strix_evidence_binding.py` from the trusted gate `SCRIPT_DIR`. Executable fixtures must keep the consumer `STRIX_REPO_ROOT` binder-free and must run a complete gate/model-helper/binder bundle from a separate trusted runtime directory.

You are interacting with an AI system.

@seonghobae

Copy link
Copy Markdown
Contributor Author

Marked ready for review at exact head 1794626a (.github lead).

@seonghobae seonghobae left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Current exact-head review after fresh hosted-state read. Runtime Quality 35661200424 and SAST 35672611347 are now terminal SUCCESS. Security 35672611396 has admitted and completed Detect changed scope plus gitleaks; only trivy-fs/scorecard remain queued with runner_id=0. Python Security 35672611349 has completed Detect Python; pip-audit/Bandit remain queued with no runner. CodeQL 35672611353 is still waiting at Detect CodeQL languages with no runner. The binder source repair remains intact and all visible inline threads are resolved/outdated, but there is still no qualifying independent APPROVED review. This COMMENT records current authority only; it is not approval. Do not blind-rerun, add a wake commit, or transfer predecessor receipts while this generation is live.

@seonghobae

Copy link
Copy Markdown
Contributor Author

Impact evidence: this binder defect is now confirmed to fail the required Strix check across consumer repositories, not only in .github. In every case the scan itself succeeds and the run then dies in the evidence step, so a green security result is being reported as a red required gate.

This PR resolves the binder next to the trusted gate instead of under the scanned repository root, and its own run of agent-review-runtime-quality is SUCCESS at head 1794626a.

Two operational notes for whoever merges: the required opencode-review on this PR cannot produce a verdict until #2333 lands (that self-reference is escalated for an owner decision), and once this merges each consumer needs a new run — re-running an old run does not pick up the fix.

@seonghobae

Copy link
Copy Markdown
Contributor Author

Shepherding status at exact head 1794626a (.github lead). Evidence only, not an approval: this account authored the PR. Nothing was re-run, relaxed or merged.

Current-head classification

Check Required Job Classification Unblock condition
agent-review-runtime-quality no SUCCESS — the fix working: the same workflow is red on main with 527 quick-gate failures
CodeQL compatibility analysis (actions) / (python) yes 106620318108 / 106620318155 External, designed interim: "CodeQL scan dispatched. The dispatch workflow will rerun this exact failed CodeQL job after publishing its terminal verdict." the dispatch scan publishes its verdict and reruns these jobs; automatic, no action
opencode-review yes 106601692678 External: "No APPROVED or CHANGES_REQUESTED from opencode-agent on the current head." No verdict is possible while the base dispatch path hits gateway route_not_found #2333 merges; that self-reference is escalated for an owner decision
noema-review yes 106602565875 In progress a terminal result, or the bounded 429 re-dispatch
pip-audit no 106599684140 Dependency defect inherited from main: anyio 4.14.0, CVE-2026-63349 and 2 more, fixed in 4.14.2 #2278 already carries that pin, so no duplicate work here
non-author approval absent; only coderabbitai: COMMENTED@bbe225d6 one App review on this exact head: opencode-agent needs #2333, cwl-noema-review needs its run to finish

Consumer-fixture regression evidence, re-verified locally at this head

  • tests/test_strix_evidence_binder_trusted_path.py plus tests/test_strix_trusted_fixture_boundary.py: 3 passed. The first test materializes a consumer checkout with no scripts/ci of its own, points REPO_ROOT at it, and asserts the gate no longer exits 2 and never prints "binder is missing" — the binder resolves next to the trusted gate via SCRIPT_DIR, which is exactly this PR's one-line change.
  • Swap in main's scripts/ci/strix_quick_gate.sh and the same tests go 2 failed, so the RED is real and this change is what closes it.

Acceptance conditions for calling the consumer path repaired

None of these may be waived:

  1. All 12 required contexts green at the exact merge head.
  2. One non-author App review on that same head.
  3. After merge, a new run — not a re-run of an old one — on at least one consumer repository shows the Strix step completing past the evidence stage with no "binder is missing" and no exit 2. The reference failure to compare against is fast-mlsirm run 35691835394, job 106665320528, where the scan reported 0 vulnerabilities and then exited 2.
  4. CO's strix, a required context there, goes green on a fresh run for CO#1209, security: bind reusable SAST and security scans to the exact pull-request head #1222 and fix(scheduler): derive org-queue-sweep rotation tick from wall-clock time #1223.

Next recheck: the CodeQL dispatch verdict and the noema-review result. My merge-gate monitor polls every 5 minutes, and I will post again when either turns terminal.

@opencode-agent opencode-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

OpenCode reviewed the current-head product diff. Coverage is a separate gate.

Changed files

  • CHANGELOG.d/20260920-strix-trusted-binder-runtime-fixture.md — repository behavior
  • docs/product-technical-gap-baseline.md — operator or user guidance
  • scripts/ci/strix_quick_gate.sh — review and security gate shell path
  • scripts/ci/test_strix_quick_gate.sh — review and security gate shell path
  • tests/test_strix_evidence_binder_trusted_path.py — regression suite
  • tests/test_strix_trusted_fixture_boundary.py — regression suite

Changed behavior

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Repository file: 20260920-strix-trusted-binder-runtime-fixture.md"]
  S1 --> I1["repository behavior"]
  I1 --> R1["Review risk: Repository file: 20260920-strix-trusted-binder-runtime-fixture.md"]
  R1 --> V1["required checks"]
  Evidence --> S2["Docs: product-technical-gap-baseline.md"]
  S2 --> I2["operator or user guidance"]
  I2 --> R2["Review risk: Docs: product-technical-gap-baseline.md"]
  R2 --> V2["docs review"]
  Evidence --> S3["CI script: strix_quick_gate.sh"]
  S3 --> I3["review and security gate shell path"]
  I3 --> R3["Review risk: CI script: strix_quick_gate.sh"]
  R3 --> V3["bash -n plus Strix self-test"]
  Evidence --> S4["CI script: test_strix_quick_gate.sh"]
  S4 --> I4["review and security gate shell path"]
  I4 --> R4["Review risk: CI script: test_strix_quick_gate.sh"]
  R4 --> V4["bash -n plus Strix self-test"]
  Evidence --> S5["Test: test_strix_evidence_binder_trusted_path.py (2 files)"]
  S5 --> I5["regression suite"]
  I5 --> R5["Review risk: Test: test_strix_evidence_binder_trusted_path.py (2 files)"]
  R5 --> V5["targeted test run"]
Loading

Findings

No source-backed product finding is synthesized from the coverage gate. A coverage miss belongs in the status comment.

  • Head SHA: 1794626af3473ef23b9c2e678c3f06fd6c11636f
  • Workflow run: 35694049570
  • Workflow attempt: 1
  • Coverage gate: failure

Review outcome

Coverage is a gate, not the review. This body reviews the changed product files.

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Repository file: 20260920-strix-trusted-binder-runtime-fixture.md"]
  S1 --> I1["repository behavior"]
  I1 --> R1["Review risk: Repository file: 20260920-strix-trusted-binder-runtime-fixture.md"]
  R1 --> V1["required checks"]
  Evidence --> S2["Docs: product-technical-gap-baseline.md"]
  S2 --> I2["operator or user guidance"]
  I2 --> R2["Review risk: Docs: product-technical-gap-baseline.md"]
  R2 --> V2["docs review"]
  Evidence --> S3["CI script: strix_quick_gate.sh"]
  S3 --> I3["review and security gate shell path"]
  I3 --> R3["Review risk: CI script: strix_quick_gate.sh"]
  R3 --> V3["bash -n plus Strix self-test"]
  Evidence --> S4["CI script: test_strix_quick_gate.sh"]
  S4 --> I4["review and security gate shell path"]
  I4 --> R4["Review risk: CI script: test_strix_quick_gate.sh"]
  R4 --> V4["bash -n plus Strix self-test"]
  Evidence --> S5["Test: test_strix_evidence_binder_trusted_path.py (2 files)"]
  S5 --> I5["regression suite"]
  I5 --> R5["Review risk: Test: test_strix_evidence_binder_trusted_path.py (2 files)"]
  R5 --> V5["targeted test run"]
Loading

@opencode-agent

opencode-agent Bot commented Sep 22, 2026

Copy link
Copy Markdown
Contributor

OpenCode Review Overview

Coverage evidence did not pass, so approval is blocked. The formal pull-request review is the source-backed diff review, not this status comment.

seonghobae added a commit that referenced this pull request Sep 23, 2026
Three defects that would each have failed the gate's first Actions run, none
of which a local unit test could surface:

- Python 3.11 made `-I` imply `-P`, so under `python3 -I <script>` sys.path
  carries neither the invoking directory nor the script's own. Every `capture`,
  `gate`, and `seal` invocation would have died on ImportError before argparse.
  The sibling policy module is now resolved next to this script by real path,
  exactly as the Strix evidence binder already is. Verified by running the CLI
  under `-I` from an unrelated directory.

- setup-python's interpreter ships pip (often setuptools/wheel too), so
  inspecting it directly would raise LOCK_ENV_MISMATCH on every run and invite a
  bootstrap exemption the brief forbids. The workflow now builds
  `python3 -m venv --without-pip`, installs the lock into it with
  `pip --python`, and threads that interpreter through the capture script's
  `pip inspect --local` and `pip show`. The environment is made honest rather
  than the rule weakened. The interpreter argument is passed only for a release
  that declared a Python lock, so a cargo-only release still gates.

- The capture step now strips the lock's hashes into a plain `name==version`
  list and fetches without hash checking, then hashes the bytes itself. Fetching
  with --require-hashes would have pip reject a tampered distribution first, so
  the gate could never observe SOURCE_HASH_MISMATCH.

Strix is no longer invoked through a guessed CLI. Each isolated fixture
workspace is scanned by the organization's own trusted entry point
scripts/ci/strix_quick_gate.sh via STRIX_REPO_ROOT, with strix.yml's bootstrap
invariants mirrored verbatim: private install umask, --require-hashes --no-deps
against the unmodified requirements-strix-ci-hashes.txt, an absolute
non-symlinked executable inside the interpreter's own scripts root, chmod go-w,
digest pinned into GITHUB_ENV, the sidecar-provided LLM_API_KEY_FILE /
LLM_API_BASE_FILE / STRIX_LLM_FILE, and orchestrator/free as the only accepted
model. Every Strix timeout knob is pinned to the unbounded value 0 per
docs/product-goal-directive.md section 8, and a contract test now forbids any
other timeout on an executable line.

The trusted gate resolves its evidence binder against STRIX_REPO_ROOT on
current main and against its own script directory once #2291 lands, so the
trusted binder is copied into each fixture workspace and both resolutions hold
without editing that file.

strix_runs/**/vulnerabilities.json is consumed by the existing gate as free
text, so its top-level shape is not contractual. The binding writer accepts it
only when it is already an array, or an object carrying a `vulnerabilities`
array; any other shape writes no binding at all, so the gate refuses with
STRIX_BINDING_MISSING rather than inventing a result.

The trusted-gate sparse-checkout is now the whole scripts/ci tree, because the
Strix gate, the orchestrator sidecar, and the token loader each source siblings
(strix_model_utils.sh, sanitize_contextual_orchestrator_sidecar_stream.py,
install_strix_timeout_compat.py, strix_timeout_compat.py) by their own
directory; an enumerated file list breaks silently when one gains another.

Refs #2342.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FvosNg4GVUjaV5UfrimrsX
seonghobae added a commit that referenced this pull request Sep 23, 2026
Read against strix_quick_gate.sh rather than assumed:

- sanitize_remediation_evidence_claims returns 2 when
  $REPO_ROOT/scripts/ci/strix_evidence_binding.py is absent, and REPO_ROOT is
  STRIX_REPO_ROOT on current main. Copying the trusted binder into each isolated
  fixture workspace is therefore required, not defensive -- which is also what
  makes #2291's repair visible.
- With STRIX_TARGET_PATH="./" that binder was inside the scan target, so Strix
  would pentest a 756-line urllib client this PR did not ship and a single
  MEDIUM finding against it would fail every dependency. The fixture now lives in
  $workspace/fixture/ and the target is narrowed to `fixture`; the binder sits
  beside the scanned directory, never inside it. validate_raw_target_path_input /
  resolve_scan_target_path accept a relative in-repository directory, so the
  narrowed target is supported rather than improvised.
- PR_NUMBER, PR_BASE_SHA, PR_HEAD_SHA and GH_TOKEN are all read as optional by
  the trusted gate, and changed-file scoping engages only when base and head are
  both set, so a release scan needs none of them. IS_PR_EVIDENCE_RUN already
  defaults to false; it is now stated explicitly because this is a release scan,
  not PR evidence.
- CONTEXTUAL_ORCHESTRATOR_BASE_URL is written to $GITHUB_ENV by the sidecar, so
  the later binding step reads it across the step boundary as intended.

Refs #2342.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FvosNg4GVUjaV5UfrimrsX
@seonghobae

Copy link
Copy Markdown
Contributor Author

Another consumer instance of the same defect, for the record: late-life-anxiety-reanalysis#248, run 35776707610, job 106951311984. The scan itself finished with Vulnerabilities 0, then the job exited 2 because the trusted binder was absent at /home/runner/work/_temp/trusted-workspace/scripts/ci/strix_evidence_binding.py. Same shape as fast-mlsirm run 35691835394 / job 106665320528 and CO#1222 job 106594135790.

Two things this instance makes explicit:

  • A clean scan is not a passing gate. Vulnerabilities 0 (No exploitable vulnerabilities detected) in the log is not acceptance while the structured evidence step fails; the required strix context is red and stays red. We are not counting scan text as a pass anywhere.
  • Precedence for [codex] Update central workflow rollout ledger #248 going green is exactly this PR, then a new run. This PR merges → each affected consumer needs a fresh run, because re-running an old run does not pick up the base-branch fix. [codex] Update central workflow rollout ledger #248's CodeQL dispatch (35808787162) and OpenCode dispatch (35799767977) are still QUEUED and are not being re-run.

This PR's own merge precedence is unchanged: the required opencode-review here cannot produce a current-head verdict until #2333 lands, which is escalated as a single documented owner decision. So the chain is #2333 → this PR → fresh consumer runs (#248, fast-mlsirm#2114/#2120, CO#1209/#1222/#1223).

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working priority: critical Immediate blocker, P0, urgent deadlock, or critical incident

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant