Skip to content

fix(security): fail closed on unavailable dependency review - #897

Open
seonghobae wants to merge 16 commits into
mainfrom
fix/dependency-review-fail-closed-current-main-20260809
Open

fix(security): fail closed on unavailable dependency review#897
seonghobae wants to merge 16 commits into
mainfrom
fix/dependency-review-fail-closed-current-main-20260809

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Purpose

Replace the stale, conflicted #799 integration path with a bounded current-main repair for #810. Preserve #799 as historical evidence only; do not import its divergent removal of later Strix work.

Root cause

The central required Security Scan could conclude success when the exact dependency-review comparison returned HTTP 403 or 404. The support probe emitted supported=false, exited zero, and skipped the pinned Dependency Review action. A hard supply-chain evidence boundary had therefore been modeled as an optional capability optimization.

Remedy and TDD identity

  • exact protected base: 6eb06cdd08c79a06f7b390069d4ffa49e2eb7dba;
  • RED commit b06bb25c1af99b784730209dceb299cd493734f7 reverses the stale fail-open queue contract;
  • GREEN commit 71947d24828cfb42806f5ef0a8abf83f9279d0af accepts only HTTP 200, preserves curl transport status separately, bounds connect/total time, discards the response body, checks out the explicit PR-head repository/SHA, and emits exact-identity failure evidence;
  • transport-failure regression b527192d7b758fc2f8a95545f25545cec7747c99 proves a partial transfer that prints 200 but exits non-zero cannot pass;
  • exact current head: 59d702f30fa419a016e24c18e87e05c76fbee4a3;
  • read-only permissions and immutable action pins remain unchanged.

Scope correction

Unrelated scheduler-secret and Python-lock-materializer source/test changes that had accumulated on this branch were removed. Flattening an include-bearing requirements lock under a generated filename does not preserve relative include targets and requires a separately designed, test-first path-preservation contract.

The final scope changes only the Dependency Review control plane and its durable architecture, operator, release-note, and workflow-contract evidence. The existing executable mode of scripts/ci/materialize_base_python_requirements.py is preserved; the final mode-only correction introduces no source-content change.

Acceptance contract

Merge only after:

  1. all exact-current-head deterministic, security, dependency, and required workflows are terminal and clean;
  2. Dependency Review reaches the immutably pinned action through a complete exact HTTP-200 comparison whose transport exits zero;
  3. current automated review has no valid unresolved finding;
  4. a qualifying counted non-author formal approval exists; and
  5. repository protection permits normal integration.

After merge, require a protected-main public-repository consumer run proving a non-200 or failed-transfer comparison cannot produce a green Dependency Review gate before closing #810.

Summary by CodeRabbit

  • 보안 강화

    • 보안 스캔이 PR의 정확한 기준·변경 커밋을 검증하도록 개선되었습니다.
    • 의존성 검토에서 네트워크 오류, 불완전한 응답, 빈 응답 및 비정상 상태 코드를 허용하지 않습니다.
    • Trivy와 Scorecard 결과가 정확한 변경 커밋에 연결됩니다.
  • 문서

    • 의존성 검토의 실패 종료 정책, 권한 범위 및 예외 처리 기준을 문서화했습니다.
  • 테스트

    • 보안 스캔의 커밋 검증과 실패 처리 동작에 대한 자동화 테스트를 강화했습니다.

Open in Devin Review

@coderabbitai

coderabbitai Bot commented Aug 9, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

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

Next review available in: 55 minutes

Limit details: You’ve used the included review currently available.

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?

Wait for the limit to reset, then comment @coderabbitai review or push new commits to the PR.

An organization admin can change what happens after included review limits in Billing.

How do review limits work?

CodeRabbit enforces per-developer PR review limits within each organization.

For paid Pro and Pro+ reviews, CodeRabbit uses a developer's included PR review attempts over the past 7 days to set the current hourly allowance. At typical activity levels, the full plan allowance applies. Higher sustained activity can lower the allowance until earlier attempts leave the 7-day window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 359a2b60-e7b1-4cd8-a157-96cf03d26796

📥 Commits

Reviewing files that changed from the base of the PR and between 07efb4a and ef3d210.

📒 Files selected for processing (3)
  • CHANGELOG.md
  • requirements-pip-audit-ci-hashes.txt
  • tests/test_required_workflow_queue_contract.py

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 6c52c7aa-33d3-4477-8a84-d7cf70105d89

📥 Commits

Reviewing files that changed from the base of the PR and between 3cc65a7 and 07efb4a.

📒 Files selected for processing (1)
  • CHANGELOG.md
🚧 Files skipped from review as they are similar to previous changes (1)
  • CHANGELOG.md

Included review availability: Your plan includes up to 1 review per rolling hour; 0 remain after this review.


📝 Walkthrough

Walkthrough

dependency-review 게이트가 exact base/head 비교의 HTTP 200 증거만 허용하도록 변경되었습니다. 오류, 빈 응답, 부분 전송, 비정상 상태 코드는 실패 처리합니다. PR head checkout, 회귀 계약 테스트, 운영 문서를 갱신했습니다.

Changes

공급망 검증 제어

Layer / File(s) Summary
Exact-head dependency-review 게이트
.github/workflows/security-scan.yml, tests/test_required_workflow_queue_contract.py
PR head 저장소와 정확한 SHA를 checkout합니다. API probe는 응답 본문을 저장하지 않습니다. 전송 코드 0과 HTTP 200을 모두 확인하지 못하면 게이트를 실패시킵니다. 회귀 테스트는 부분 전송과 GITHUB_OUTPUT 미생성을 검증합니다.
Fail-closed 운영 계약 문서
docs/doctoring/dependency-review-fail-closed.md, CHANGELOG.md
fail-closed 정책, 권한 범위, 오류 분류, 수용·롤백 조건과 관련 표준을 문서화합니다.

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

Merge Risk: ⚪ Minimal · up to 07efb

The dependency-review gate is changed to fail closed when comparison evidence is unavailable, and no actionable merge-blocking risk remains in the supplied evidence beyond normal checks and review.

Sequence Diagram(s)

sequenceDiagram
  participant PullRequest
  participant security_scan
  participant GitHubCompareAPI
  participant dependency_review
  PullRequest->>security_scan: PR head repository와 head SHA 전달
  security_scan->>GitHubCompareAPI: 정확한 base...head 비교 요청
  GitHubCompareAPI-->>security_scan: HTTP 상태와 전송 결과 반환
  security_scan->>dependency_review: 전송 코드 0 및 HTTP 200일 때 실행
Loading

Possibly related issues

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed Docstring coverage is 83.33% which is sufficient. The required threshold is 80.00%.
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 제목은 dependency-review를 사용할 수 없을 때 fail closed로 처리하는 주요 변경을 정확하고 간결하게 설명합니다.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/dependency-review-fail-closed-current-main-20260809

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 enabled auto-merge (squash) August 9, 2026 12:47

Copy link
Copy Markdown
Contributor Author

/oc Refetch and abort unless exact head is still 71947d24828cfb42806f5ef0a8abf83f9279d0af. There is one blocking source defect in the current GREEN candidate: the dependency-review probe still uses status="$(curl ... || true)". That discards curl's transport exit code. A partial-transfer/body-write/TLS/transport failure can therefore emit HTTP 200 and still reach supported=true, contradicting this PR's own fail-closed contract and the historical regression already observed in predecessor work.

Fix test-first on this existing branch only. Add a permanent regression that models a fake/controlled curl which writes HTTP 200 to stdout but exits nonzero (for example curl exit 18 partial transfer) and proves the support probe fails rather than setting supported=true. Then change the shell to preserve both channels independently: capture curl output/status without || true erasing the exit code, restore set -e, and require both curl_status == 0 and exact HTTP status 200 before emitting supported=true. Any nonzero transport exit, empty/malformed status, or non-200 status must produce only bounded exact repository/base/head/status/transport diagnostics and exit 1. Continue discarding the response body, keep 10s connect/30s total timeouts, exact-head checkout, read-only permissions, immutable dependency-review action pin, and no credential/model/ruleset changes.

Strengthen tests/test_required_workflow_queue_contract.py or a focused companion to reject the literal || true support-probe pattern and require the captured transport-status branch. Run the focused fail-closed contract, complete central suite, compilation, git diff --check, Strix quick gate, then exact-head security/supply-chain gates. Do not mark this head accepted from the current queued checks; they are stale as soon as this repair lands.

Copy link
Copy Markdown
Contributor Author

Exact-head RCA and proof for 8fc17de86d1d22c9c11946dd7f70ff934c0b553a:

  • First failing boundary on predecessor 71947d24828cfb42806f5ef0a8abf83f9279d0af: the support probe used command substitution with || true, which erased curl's transport exit. A partial transfer could emit HTTP 200, exit nonzero, and still reach supported=true.
  • Technical root cause: HTTP response status and transport integrity were collapsed into one string channel. Systemic control: the permanent executable regression now supplies a controlled curl that prints 200 and exits 18, and requires fail-closed behavior with no GitHub output.
  • Remedy: capture the curl transport exit separately under a bounded set +e region, immediately restore set -e, normalize the body-free HTTP status, and require transport exit 0 plus exact HTTP 200. Diagnostics remain bounded to repository/base/head, normalized HTTP status, and numeric transport exit.
  • Preserved boundaries: discarded response body, 10-second connect/30-second total timeouts, exact-head checkout, read-only permissions, immutable dependency-review pin, and no credential/model/ruleset changes.
  • RED: focused contract failed 2 tests, including the executable HTTP-200/exit-18 counterexample.
  • GREEN: focused 2 passed; complete central suite 978 passed + 16 subtests; compile/diff checks clean; Strix self-test PASS.

Hosted exact-head security and supply-chain results remain authoritative.

Copy link
Copy Markdown
Contributor Author

@opencode-agent review

Evaluate exact current head 8fc17de86d1d22c9c11946dd7f70ff934c0b553a against independently resolved live main 6eb06cdd08c79a06f7b390069d4ffa49e2eb7dba. Keep source revision, current-base compatibility, deterministic checks, model judgment, and qualifying independent human approval as separate evidence channels; do not infer merge authority.

Copy link
Copy Markdown
Contributor Author

Follow-up at current head 59505c1d: declared optional PR_REVIEW_MERGE_TOKEN and OPENCODE_APPROVE_TOKEN under workflow_call.secrets in both reusable review schedulers, added the permanent contract test and fail-closed operations note. This enables callers to pass only the two required review credentials instead of secrets: inherit. Evidence: actionlint passed; focused contract suite 52 passed. The full suite reached 974 passed with 5 pre-existing platform-gated trusted-uv tests failing on this macOS arm64 workstation before the archive-verification assertions; no unrelated source was changed. No self/Admin/bypass approval or merge was used.

Copy link
Copy Markdown
Contributor Author

@opencode-agent review

Review exact current head 59505c1d89eb7ea816e921b6da38079c736608c2 against independently resolved live main 6eb06cdd08c79a06f7b390069d4ffa49e2eb7dba. Nine exact-head hosted workflows are terminal-success and no review thread is unresolved. Verify dependency-review unavailable, skipped, neutral, and absent evidence fail closed without manufacturing a dependency finding, while successful exact-head evidence remains distinct from semantic review and merge authority. Automated judgment is not qualifying independent human approval or merge authorization.

Copy link
Copy Markdown
Contributor Author

@coderabbitai review
@opencode-agent review
@cwl-noema-review review

Review exact current head 59505c1d89eb7ea816e921b6da38079c736608c2 only. All nine exact-head quality, security, and supply-chain workflows are terminal-success. Validate that dependency-review capability accepts only a transport-successful HTTP 200 for the exact base/head comparison, with 10-second connect and 30-second total bounds, response body discarded, literal PR-head repository/SHA checkout, read-only permissions, and no substitute security gate. Review only; do not mutate, merge, or alter protections.

@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown

@seonghobae I will review PR #897 at exact head 59505c1d89eb7ea816e921b6da38079c736608c2 only.

I will verify the dependency-review fail-closed boundary and the listed workflow invariants. I will keep exact-head check evidence separate from review judgment, approval, and merge authority. I will not modify code, merge, or change protections.

I used the repository guidance that only successful checks for the exact current head are valid merge evidence.


🧠 Learnings used
Learnt from: seonghobae
Repo: ContextualWisdomLab/.github PR: 0
File: :0-0
Timestamp: 2026-08-05T13:44:10.007Z
Learning: For PR `#782`, only successful checks associated with the exact current head are valid merge evidence. Do not treat queued, in-progress, cancelled, predecessor-head, temporary-workflow, or administrative-bypass results as passing evidence. Before a formal approval, verify that the direct security and supply-chain workflows, the permanent hourly NVIDIA NIM contract, current-head reviews, unresolved-thread checks, and an independent approval have completed successfully.

Learnt from: CR
Repo: ContextualWisdomLab/.github PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-07-29T06:47:25.581Z
Learning: Applies to opencode.jsonc : All reviewer agents in `opencode.jsonc` must keep `"edit": "deny"`; reviewers must never implement changes.
⚠️ 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

Exact-current-head review request for 59505c1d89eb7ea816e921b6da38079c736608c2 over protected main@6eb06cdd08c79a06f7b390069d4ffa49e2eb7dba.

Review the bounded six-file supply-chain evidence repair: dependency-review support accepts only HTTP 200; non-200, timeout, or unavailable comparison fails closed with exact identity and operator guidance; response bodies are discarded; checkout is bound to the explicit PR head repository/SHA; and read-only permissions plus immutable action pins remain. Strix Changed Path Quality CI, CodeQL PR, Python Security, Security Scan, SAST Semgrep, Secret Scan, OSV-Scanner PR, Scorecard PR, and SBOM Generation are terminal-success on this exact head. No review thread exists.

Keep the exact head unchanged. Do not update the branch, synthesize author approval, substitute another scanner for dependency-review evidence, add credentials, merge, release, or bypass protection.

@coderabbitai review
@opencode-agent review
@cwl-noema-review review
@strix review

@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown

Rate Limit Exceeded

@seonghobae have exceeded the limit for the number of chat messages per hour. Please wait 4 minutes and 33 seconds before sending another message.

@seonghobae

Copy link
Copy Markdown
Contributor Author

@opencode-agent review

Re-evaluate exact current head 3af29c40796490ced463a9a6de7c4495a4ae97c8. 리뷰 확인 for the bounded-include increment; do not treat Checks wait as a blocker.

Copy link
Copy Markdown
Contributor Author

@opencode-agent

Please perform a fresh exact-head semantic review of 3af29c40796490ced463a9a6de7c4495a4ae97c8, keeping source findings separate from merge-readiness evidence. Do not infer approval from wrapper checks; submit a formal review only if the current head is defect-free under the protected control-plane contract.

Copy link
Copy Markdown
Contributor Author

@cwl-noema-review

Please provide an independent exact-head review of 3af29c40796490ced463a9a6de7c4495a4ae97c8. Confirm that unavailable or skipped dependency-review evidence cannot satisfy the required security contract, and submit a formal review verdict rather than a status-only acknowledgement.

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

Please review exact head 3af29c40796490ced463a9a6de7c4495a4ae97c8, focusing on whether every unavailable, skipped, neutral, or metadata-incomplete dependency-review path fails closed and cannot satisfy the required security contract.

@coderabbitai

coderabbitai Bot commented Aug 14, 2026

Copy link
Copy Markdown

Rate Limit Exceeded

@seonghobae have exceeded the limit for the number of chat messages per hour. Please wait 50 minutes and 4 seconds before sending another message.

@seonghobae
seonghobae marked this pull request as draft August 14, 2026 08:45
auto-merge was automatically disabled August 14, 2026 08:45

Pull request was converted to draft

Copy link
Copy Markdown
Contributor Author

Returned to Draft because this branch overlaps the authoritative prerequisite #821 and no longer matches its own four-file bounded-scope claim.

#821 already owns the fail-closed dependency-review boundary and exact-head focused quality gate. This branch contains a useful incremental refinement—capturing the curl exit status independently while discarding the response body—but its current eleven-file diff also duplicates the security workflow, materializer/governance changes, and scheduler-token changes outside that refinement.

After #821 reaches protected main, rebuild this as a narrow follow-up retaining only the independently justified transport-status refinement, its focused regression proving a numeric HTTP 200 plus non-zero curl exit still fails closed, and bounded doctoring/changelog evidence. Remove duplicated prerequisite and unrelated scheduler/materializer changes, then reacquire exact-head checks and independent review.

@seonghobae
seonghobae marked this pull request as ready for review August 14, 2026 09:00
@seonghobae
seonghobae enabled auto-merge (squash) August 14, 2026 09:00

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

Please review exact head 94f799f7e0701e1a317bbe407759988cbad915c4. The branch is now narrowed to the dependency-review fail-closed control plane; unrelated scheduler-secret and incomplete requirements-include materializer changes were removed. Verify exact-head checkout, curl transport/HTTP-200 binding, body discard, timeout bounds, and the permanent fail-closed contract.

@coderabbitai

coderabbitai Bot commented Aug 14, 2026

Copy link
Copy Markdown

Rate Limit Exceeded

@seonghobae have exceeded the limit for the number of chat messages per hour. Please wait 16 minutes and 31 seconds before sending another message.

Copy link
Copy Markdown
Contributor Author

@opencode-agent

Please perform a fresh exact-head semantic review of 94f799f7e0701e1a317bbe407759988cbad915c4. Confirm that only a complete HTTP-200 exact base/head comparison can reach the pinned dependency-review action, every transport/non-200/malformed outcome fails closed without response-body disclosure, and the scope cleanup removed unrelated changes. Submit a formal current-head verdict.

Copy link
Copy Markdown
Contributor Author

@cwl-noema-review

After a qualifying exact-head OpenCode verdict, independently review 94f799f7e0701e1a317bbe407759988cbad915c4. Confirm unavailable dependency evidence cannot be converted into a passing security contract and that no complementary scanner is treated as a semantic substitute.

Copy link
Copy Markdown
Contributor Author

@opencode-agent review exact head 3cc65a7b24371ee453875d9efe06e82ff06477b7 and submit a formal current-head verdict.

Merge protected main 0c6b9a6 while retaining only Security Scan owner changes. Full suite: 1,399 passed, 1 skipped, 16 subtests; shared full Strix quick-gate: PASS.

Copy link
Copy Markdown
Contributor Author

@opencode-agent review

Please submit a substantive formal Reviews API verdict for exact current head ec777d3a74e874352aaa330b67766636c99439e0 against protected main@0c6b9a6459c9dbdf5e23fb01df7a32a8a14964b3. All substantive commit-associated workflows are terminal success, unresolved review threads are 0, and no qualifying exact-head formal verdict exists. Review the current Security exact-head checkout/attestation and fail-closed dependency evidence contract only; predecessor reviews and status/check success are non-passing substitutes. Review-only: do not mutate or merge the branch.

@seonghobae
seonghobae enabled auto-merge (squash) August 24, 2026 06:46

Copy link
Copy Markdown
Contributor Author

@opencode-agent review

Please publish an independent substantive formal Reviews API verdict for exact current head 6406b4663b216e4a85fbf96a7cbd33bf9c0a990e against protected main@613a33e0cb1c6db9790fae99f6253445712ac37a. All 12 substantive exact-head workflows are terminal-success and unresolved review threads are 0. Older CHANGES_REQUESTED, COMMENTED, check/status, and predecessor-head evidence is historical. Inspect the complete current diff and bind APPROVED or CHANGES_REQUESTED only to this SHA; do not reuse an older verdict.

@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 could not approve from deterministic current-head evidence because GitHub Checks have failed.

Findings

1. HIGH Current-head GitHub Checks - Fix failed required checks before approval

  • Problem: Failed same-head checks remain for 6406b4663b216e4a85fbf96a7cbd33bf9c0a990e.
  • Root cause: The model-unavailable evidence fallback is allowed only when peer GitHub Checks are complete and clean.
  • Fix: Read and fix the failed check logs below, then rerun the current-head checks.
  • Regression test: Keep the model-unavailable fallback gated on an empty failed-check rollup.

Failed checks:

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Workflow: security-scan.yml"]
  S1 --> I1["GitHub Actions review job"]
  I1 --> R1["Review risk: Workflow: security-scan.yml"]
  R1 --> V1["actionlint plus required checks"]
  Evidence --> S2["Changed file: CHANGELOG.md"]
  S2 --> I2["repository behavior"]
  I2 --> R2["Review risk: Changed file: CHANGELOG.md"]
  R2 --> V2["required checks"]
  Evidence --> S3["Docs: dependency-review-fail-closed.md"]
  S3 --> I3["operator or user guidance"]
  I3 --> R3["Review risk: Docs: dependency-review-fail-closed.md"]
  R3 --> V3["docs review"]
  Evidence --> S4["Test: test_required_workflow_queue_contract.py"]
  S4 --> I4["regression suite"]
  I4 --> R4["Review risk: Test: test_required_workflow_queue_contract.py"]
  R4 --> V4["targeted test run"]
Loading

@opencode-agent
opencode-agent Bot disabled auto-merge August 24, 2026 17:51

@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 could not approve from deterministic current-head evidence because GitHub Checks have failed.

Findings

1. HIGH Current-head GitHub Checks - Fix failed required checks before approval

  • Problem: Failed same-head checks remain for 6406b4663b216e4a85fbf96a7cbd33bf9c0a990e.
  • Root cause: The model-unavailable evidence fallback is allowed only when peer GitHub Checks are complete and clean.
  • Fix: Read and fix the failed check logs below, then rerun the current-head checks.
  • Regression test: Keep the model-unavailable fallback gated on an empty failed-check rollup.

Failed checks:

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Workflow: security-scan.yml"]
  S1 --> I1["GitHub Actions review job"]
  I1 --> R1["Review risk: Workflow: security-scan.yml"]
  R1 --> V1["actionlint plus required checks"]
  Evidence --> S2["Changed file: CHANGELOG.md"]
  S2 --> I2["repository behavior"]
  I2 --> R2["Review risk: Changed file: CHANGELOG.md"]
  R2 --> V2["required checks"]
  Evidence --> S3["Docs: dependency-review-fail-closed.md"]
  S3 --> I3["operator or user guidance"]
  I3 --> R3["Review risk: Docs: dependency-review-fail-closed.md"]
  R3 --> V3["docs review"]
  Evidence --> S4["Test: test_required_workflow_queue_contract.py"]
  S4 --> I4["regression suite"]
  I4 --> R4["Review risk: Test: test_required_workflow_queue_contract.py"]
  R4 --> V4["targeted test run"]
Loading

Copy link
Copy Markdown
Contributor Author

Fresh owner-path evidence for current head 38bf4b268fa6bd9bfd5f8155d273c6b2b66e49bd on live main@8fd471a31399a914d9cb22a840f4a4c68e010ea6:

  1. Strix Changed Path Quality CI run/job 32803963370/97670278083 is a deterministic exact-head failure, not provider latency. The job checked out 38bf4b2... and completed 1406 passed, 1 skipped, 2 failed. The two failing contracts are tests/test_required_workflow_queue_contract.py::test_nvidia_nim_defaults_preserve_existing_fallbacks_without_secret and tests/test_strix_nvidia_nim_not_found_fallback.py::StrixNvidiaNotFoundFallbackTests::test_workflow_uses_available_free_first_nvidia_plan: both still assert gpt-5.6-luna, while current protected-main/workflow contract is gpt-5.4 (main fix(strix): align required-path smoke fallback assertions with the gpt-5.4 contract #1318 already aligned the required-path smoke). Please treat this as RED current-head contract drift. Smallest safe remedy is to update only the stale test expectations if the protected-main gpt-5.4 fallback remains authoritative, retain negative coverage for missing NIM credentials/fallback ordering, then rerun the full exact-head suite.

  2. Independent of that test drift, the current security-scan.yml delta still feeds ${{ github.event.pull_request.base.sha }} into OSV base checkout/comparison and dependency-review BASE_SHA/base-ref. That field is the PR/event base snapshot, not an independently resolved live protected-base tip. For base-sensitive evidence, add a RED case where event base snapshot != live base-ref tip; resolve the current base branch tip immediately before comparison, keep source_head_sha, pr_base_snapshot_sha, and live_base_tip_sha distinct/attested, and fail closed on identity mismatch. This is the same exact-evidence class tracked by security: bind reusable SAST and security scans to the exact pull-request head #1222; it should be fixed at the central owner boundary rather than by a ScopeWeave leaf workaround.

@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 cannot approve yet because required coverage evidence did not pass.

Review outcome

1. HIGH .github/workflows/opencode-review.yml:1 - Coverage evidence did not prove required test/docstring evidence

  • Problem: The required coverage-evidence job result was failure, so OpenCode cannot establish approval sufficiency for this head.

  • Root cause: Automated approval is only valid when the same-head coverage-evidence job proves supported repository test suites passed and configured docstring gates passed or were advisory, or reports not applicable because no supported source files or package manifests exist. Missing, failed, skipped, unavailable, or unsupported-tooling test evidence is a blocker.

  • Fix: Install or configure the repository test/docstring evidence tooling when source files or package manifests exist, rerun the current-head coverage-evidence job, and approve only after it reports success with required evidence or explicit no-source not-applicable evidence.

  • Regression test: Keep the approval branch checking needs.coverage-evidence.result == success before posting APPROVE, and publish REQUEST_CHANGES when coverage-evidence blocker states such as cancelled, skipped, failed, unsupported-tooling, or below-100 evidence are present.

  • Result: REQUEST_CHANGES

  • Reason: coverage-evidence result was failure, so required test/docstring evidence was not proven for current head 38bf4b268fa6bd9bfd5f8155d273c6b2b66e49bd.

  • Head SHA: 38bf4b268fa6bd9bfd5f8155d273c6b2b66e49bd

  • Workflow run: 32816462924

  • Workflow attempt: 1

Coverage evidence

Coverage Decision

  • Result: FAIL
  • Test evidence: not proven passing
  • Docstring evidence: not proven passing when configured
  • Failure count: 1

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Workflow: security-scan.yml"]
  S1 --> I1["GitHub Actions review job"]
  I1 --> R1["Review risk: Workflow: security-scan.yml"]
  R1 --> V1["actionlint plus required checks"]
  Evidence --> S2["Changed file: CHANGELOG.md"]
  S2 --> I2["repository behavior"]
  I2 --> R2["Review risk: Changed file: CHANGELOG.md"]
  R2 --> V2["required checks"]
  Evidence --> S3["Docs: dependency-review-fail-closed.md"]
  S3 --> I3["operator or user guidance"]
  I3 --> R3["Review risk: Docs: dependency-review-fail-closed.md"]
  R3 --> V3["docs review"]
  Evidence --> S4["Test: test_required_workflow_queue_contract.py"]
  S4 --> I4["regression suite"]
  I4 --> R4["Review risk: Test: test_required_workflow_queue_contract.py"]
  R4 --> V4["targeted test run"]
Loading

Copy link
Copy Markdown
Contributor Author

Owner-path exact failure handoff for current #897 (no foreign source/ref mutation from the Noema writer):

  • current PR head: 38bf4b268fa6bd9bfd5f8155d273c6b2b66e49bd
  • live/protected base: main@8fd471a31399a914d9cb22a840f4a4c68e010ea6
  • failing Strix run/job: 32803963370 / 97670278083
  • checkout reached the exact PR head successfully; this is not an infrastructure/checkout failure.
  • full suite result: 2 failed, 1406 passed, 1 skipped.
  • failing contracts:
    1. tests/test_required_workflow_queue_contract.py::test_nvidia_nim_defaults_preserve_existing_fallbacks_without_secret
    2. tests/test_strix_nvidia_nim_not_found_fallback.py::StrixNvidiaNotFoundFallbackTests::test_workflow_uses_available_free_first_nvidia_plan
  • first causal boundary: protected central main itself still carries stale gpt-5.6-luna expectations while the current strix.yml contract emits/uses gpt-5.4; fix(security): fail closed on unavailable dependency review #897 inherits that drift. An unchanged rerun cannot change this deterministic failure.

Smallest owner-side causal remedy: on the existing canonical central owner branch, update only the stale Strix fallback expectations to the current protected workflow contract (gpt-5.4) while retaining the negative/provider/fail-closed controls; then run the two focused tests, current full central test breadth, and regenerate #897 exact-head Strix/security evidence. Do not weaken the Strix gate or change Noema product code for this.

Noema revalidation criterion after central integration: regenerate the Noema PR Security Scan on an unchanged exact contributor head/live base and verify the scanner checkout/evidence is exact-head authoritative under .github#1222 before any merge-readiness classification.

@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 cannot approve yet because required coverage evidence did not pass.

Review outcome

1. HIGH .github/workflows/opencode-review.yml:1 - Coverage evidence did not prove required test/docstring evidence

  • Problem: The required coverage-evidence job result was failure, so OpenCode cannot establish approval sufficiency for this head.

  • Root cause: Automated approval is only valid when the same-head coverage-evidence job proves supported repository test suites passed and configured docstring gates passed or were advisory, or reports not applicable because no supported source files or package manifests exist. Missing, failed, skipped, unavailable, or unsupported-tooling test evidence is a blocker.

  • Fix: Install or configure the repository test/docstring evidence tooling when source files or package manifests exist, rerun the current-head coverage-evidence job, and approve only after it reports success with required evidence or explicit no-source not-applicable evidence.

  • Regression test: Keep the approval branch checking needs.coverage-evidence.result == success before posting APPROVE, and publish REQUEST_CHANGES when coverage-evidence blocker states such as cancelled, skipped, failed, unsupported-tooling, or below-100 evidence are present.

  • Result: REQUEST_CHANGES

  • Reason: coverage-evidence result was failure, so required test/docstring evidence was not proven for current head 38bf4b268fa6bd9bfd5f8155d273c6b2b66e49bd.

  • Head SHA: 38bf4b268fa6bd9bfd5f8155d273c6b2b66e49bd

  • Workflow run: 32822053544

  • Workflow attempt: 1

Coverage evidence

Coverage Decision

  • Result: FAIL
  • Test evidence: not proven passing
  • Docstring evidence: not proven passing when configured
  • Failure count: 1

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Workflow: security-scan.yml"]
  S1 --> I1["GitHub Actions review job"]
  I1 --> R1["Review risk: Workflow: security-scan.yml"]
  R1 --> V1["actionlint plus required checks"]
  Evidence --> S2["Changed file: CHANGELOG.md"]
  S2 --> I2["repository behavior"]
  I2 --> R2["Review risk: Changed file: CHANGELOG.md"]
  R2 --> V2["required checks"]
  Evidence --> S3["Docs: dependency-review-fail-closed.md"]
  S3 --> I3["operator or user guidance"]
  I3 --> R3["Review risk: Docs: dependency-review-fail-closed.md"]
  R3 --> V3["docs review"]
  Evidence --> S4["Test: test_required_workflow_queue_contract.py"]
  S4 --> I4["regression suite"]
  I4 --> R4["Review risk: Test: test_required_workflow_queue_contract.py"]
  R4 --> V4["targeted test run"]
Loading

Copy link
Copy Markdown
Contributor Author

Fresh downstream-owner handoff from Inkspan after protected central main materially advanced; no foreign source/ref mutation is being performed here.

Current owner identities:

The new protected-main commit is material to the previously observed #897 Strix blocker: #1320 includes fallback-model contract alignment, NVIDIA-overload fallback, direct-OpenAI fallback endpoint cleanup, repository-visibility handling, provider-leak regression coverage, and scanner-notice classification fixes. Therefore another unchanged #897 rerun on the pre-#1320 branch is not a materially distinct remedy, and predecessor review/check evidence must not be promoted.

First causal boundary remains this existing central Security owner branch plus then-current central workflow source. Smallest safe owner action is to non-destructively reconcile #897 with protected main@d2c554d..., resolve only genuine conflicts while preserving #897's exact PR-head / fail-closed dependency-review scope, and regenerate the complete exact-head gate set. RED acceptance remains the current same-head coverage failure plus the already-recorded stale Strix contract failures; GREEN requires the reconciled exact head to pass deterministic tests, required coverage/docstring evidence, Security/Strix, and current formal review without transferring predecessor results.

Inkspan revalidation after protected integration remains unchanged: rerun the then-current unchanged/successor Inkspan consumer head and require head-oriented Security jobs to attest actual checkout SHA == pull_request.head.sha, while base-sensitive comparison independently resolves the then-live protected Inkspan base and fails closed on unavailable/non-200 evidence. Do not weaken severity, permissions, immutable pins, or dependency-review execution semantics.

Copy link
Copy Markdown
Contributor Author

Current owner-path convergence for #1222: exact head 96949c39ef2304a27410c214a7591e7719622ed8 is now a non-force two-parent synchronization with protected main@d2c554dbbc04854db6215970fabb70cef1ceb690. The merge preserved only this PR's four Security Scan files while retaining main's corrected Strix/OpenCode contract in the overlapping test and changelog files.

Hosted run 32843524109 / job 97788034968 checked out and attested the exact head, completed 1420 passed, 1 skipped, 16 subtests passed, and finished the full Strix quick-gate with PASS. Current security/CodeQL/SBOM workflows and exact-current-head formal review remain authoritative; pending evidence is non-passing and no merge is claimed.

Copy link
Copy Markdown
Contributor Author

@opencode-agent review

Please publish an independent substantive formal Reviews API verdict for exact current head 96949c39ef2304a27410c214a7591e7719622ed8 against protected main@d2c554dbbc04854db6215970fabb70cef1ceb690. All substantive commit-associated workflows are now terminal-success and unresolved review threads are 0. Existing CHANGES_REQUESTED reviews are bound to predecessor heads and do not transfer.

Review the current Security Scan exact-head repository/SHA checkout and attestation, live-base versus event-base identity separation, fail-closed dependency evidence, and preserved scanner severity/SARIF semantics. Bind APPROVED or CHANGES_REQUESTED only to this SHA through the formal review surface. Review-only: do not mutate, merge, or close #1222; downstream operational acceptance remains separately required.

Copy link
Copy Markdown
Contributor Author

Additional downstream RED evidence from Inkspan confirms this owner path is still release-relevant.

Affected downstream source: ContextualWisdomLab/inkspan PR #384 exact head 78d3f447315f85830b26c4bf81bdb5c376f1fcdf against protected main fd75c835a2a7c5d9a1f57c3e080364237d69819a at observation time. Inkspan Security Scan run 32875283556, dependency-review job 97891634200, is associated with that exact PR head and completed success, while its pinned Dependency review step completed skipped immediately after Check dependency review support completed success.

First causal boundary / falsifiable RCA: the currently protected central workflow still treats unavailable comparison support as a successful capability probe and converts the required dependency-review evidence path into a skipped action. If that proposition is wrong, a protected-main consumer run should show a non-success gate whenever the exact comparison cannot be established; this Inkspan run instead shows success + skipped required evidence.

Acceptance for #897 remains fail-closed: comparison transport must complete successfully, exact base/head comparison must return HTTP 200, the immutable dependency-review action must actually run, and only then may the gate pass. A 403/404/transport failure/empty or partial response must be terminal non-passing evidence. The smallest remedy remains this existing #897 central-writer change; no Inkspan-local workflow workaround is correct because the organization ruleset owns the required workflow.

Post-merge GREEN proof required before closing the owning defect: rerun an Inkspan public-repository PR on an exact current head and verify (1) the central Security Scan checks out/identifies the intended exact source generation, (2) the comparison reaches HTTP 200 with successful transport, (3) the Dependency Review action is not skipped, and (4) the job is terminal success only after that action. Inkspan will continue treating run 32875283556 / job 97891634200 as non-passing supply-chain evidence despite the outer workflow conclusion.

Copy link
Copy Markdown
Contributor Author

Fresh Inkspan consumer canary for the current exact owner head, captured after protected-main synchronization:

  • Consumer: ContextualWisdomLab/inkspan PR Reject trivial approvals for material changes #222, Draft, exact head 09f941c8a34eaf9461dd27fc185d64f158f9cf94, live base main@fd75c835a2a7c5d9a1f57c3e080364237d69819a.
  • Consumer Security Scan run 32893517332 completed success, but job 97950681554 (dependency-review) shows Check dependency review support: success followed by the pinned Dependency review step skipped. Under Inkspan's fail-closed evidence contract that is non-passing despite the green job/run. This is the live protected-central behavior, not predecessor evidence.
  • Current owner candidate is still fix(security): fail closed on unavailable dependency review #897 exact head 1d3624869b6dedc84af086bb15bdbce498ca3fe3 against live .github/main@95b05b393c75931044b405ae491079d336d89293; all review threads are resolved. Its own exact-head Security Scan 32866557994, dependency-review job 97863158507, reaches Checkout exact dependency-review head, Verify Dependency Review head checkout, Check dependency review support, and Dependency review, all success.

This gives a current RED consumer / candidate-GREEN pair at the actual owning boundary. Keep the remedy fail-closed: do not convert unavailable comparison evidence into skip/success. Before normal integration, independently revalidate #897's unchanged exact head/live base, current required jobs and checkout identities, current formal review state, and protection; do not transfer stale reviews or bypass the two-approval policy. After protected integration, re-run an Inkspan public-repository PR canary and require the Dependency Review action itself to execute terminally on the exact submitted head before treating Security Scan as release evidence.

Copy link
Copy Markdown
Contributor Author

Exact-current-head convergence and verification (2026-08-26)

  • protected base: main@33dc57d7984b937e4f5ab915d5eae69a0f42e3a5
  • exact head: f22662e3373bb928e27482e329ebdbc15a05ef5c
  • remote tree: b8d99972081ba94299d6d203dae43ad6fb90f14e
  • parents: prior owner head 1d3624869b6dedc84af086bb15bdbce498ca3fe3 + protected main 33dc57d7984b937e4f5ab915d5eae69a0f42e3a5
  • non-force fast-forward publication; remote tree/parents match the independently verified local merge
  • focused Security Scan/required-workflow contracts: 66 passed
  • full central suite: 1,439 passed, 1 skipped, 16 subtests
  • full Strix quick gate: PASS
  • git diff --check: PASS
  • unresolved review threads immediately after publication: 0
  • exact-current-head formal approvals: 0

The newly dispatched security, CodeQL, SBOM, provenance, and quality runs are queued and remain non-passing until terminal. #1222 still requires a downstream ScopeWeave exact-head SAST/Trivy canary after both owner changes integrate; this source convergence is not operational acceptance by itself.

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

Labels

area: dependencies Dependency or lockfile maintenance area: security Security boundary, hardening, or vulnerability prevention merge: urgent-review Central or critical pull request requiring immediate review attention priority: critical Immediate blocker, P0, urgent deadlock, or critical incident status: blocked Blocked by conflict, dependency, or required prerequisite type: maintenance Maintenance, build, dependency, or operational upkeep

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant