Skip to content

fix(strix): honor incomplete-retry log-only severity - #956

Closed
seonghobae wants to merge 6 commits into
mainfrom
fix/strix-incomplete-retry-severity-neutralize
Closed

fix(strix): honor incomplete-retry log-only severity#956
seonghobae wants to merge 6 commits into
mainfrom
fix/strix-incomplete-retry-severity-neutralize

Conversation

@seonghobae

Copy link
Copy Markdown
Contributor

Summary

Required Strix on #930f745422 (run 31665090829) selected NVIDIA NIM, printed leftover TUI Severity: HIGH / Vulnerabilities 2 from a midstream retry that never wrote a report artifact, then hit GitHub Models 410 github_models_retirement_brownout. The trusted gate already said those markers are incomplete log-only evidence and that zero accepted vulnerabilities preceded the provider failure. The outer workflow grepped the full console tee, treated the leftover TUI lines as findings, and failed the required check for a non-backend reason.

This change:

  • classifies github_models_retirement_brownout as backend unavailability
  • honors the gate's incomplete-evidence sentences so leftover TUI severity cannot override a trusted incomplete-scan verdict
  • keeps Vulnerabilities 1 / Severity: HIGH without that gate verdict fail-closed

Does not lower the two-approval ruleset. Review agents remain edit: deny. NVIDIA NIM remains the live public-scan provider.

Test plan

  • pytest tests/test_strix_nvidia_nim_not_found_fallback.py tests/test_required_workflow_queue_contract.py tests/test_opencode_agent_contract.py tests/test_central_required_workflow_ruleset_audit.py
  • bash -n is not the workflow contract; YAML was edited only in the Run Strix neutralization block
  • Current-head required Strix on this PR should neutralize the same leftover-TUI + 410 shape instead of failing closed for a non-backend reason

Closes the current-head Strix fail shape seen on #930, #949, #941, and #934.

A midstream NIM retry can print boxed Severity:/Vulnerabilities N
TUI lines and then fail before writing a report artifact. The gate
already calls those markers incomplete evidence, but the outer
workflow grepped the full console tee and failed the required
check. Honor that trusted verdict, classify GitHub Models 410
retirement brownout as backend unavailability, and keep accepted
findings fail-closed.
@coderabbitai

coderabbitai Bot commented Aug 13, 2026

Copy link
Copy Markdown

Warning

Review limit reached

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

Next review available in: 98 minutes

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

How can I continue?

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

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

How do review limits work?

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

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

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8e8a79b3-8240-4988-9d1e-b0aac5121da7

📥 Commits

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

📒 Files selected for processing (12)
  • .github/workflows/strix.yml
  • AGENTS.md
  • ARCHITECTURE.md
  • CHANGELOG.md
  • CLAUDE.md
  • docs/doctoring/strix-incomplete-retry-severity.md
  • docs/doctoring/strix-nvidia-nim-not-found-fallback.md
  • scripts/ci/materialize_base_python_requirements.py
  • tests/test_materialize_base_python_requirements.py
  • tests/test_required_workflow_queue_contract.py
  • tests/test_strix_nvidia_nim_not_found_fallback.py
  • tests/test_strix_workflow_shell_syntax.py

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

❤️ Share

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

Indented <<'PY' closers are valid after Actions strips run-block
indent, but a raw bash -n of strix.yml treated the trusted-source
resolver as an unclosed heredoc through EOF. Quote those three
programs as python3 -c so the shell sees a closed string, and
execute the extracted trusted-source, executable-hash, and Vertex
credential snippets on real inputs.
@seonghobae

Copy link
Copy Markdown
Contributor Author

@cwl-noema-review @opencode-agent

Please review this exact current head (0c253f0dfdef28faf6e532ffed63e88be6b23a56).

Buyer-felt miss: required Strix failed closed after a midstream NIM retry left boxed Severity: / Vulnerabilities N TUI lines without a report artifact, then GitHub Models returned 410 github_models_retirement_brownout. The trusted gate already printed that those markers are incomplete log-only evidence. This head honors that verdict, classifies the 410 brownout as backend unavailability, and replaces indented <<'PY' inline Python with quoted python3 -c programs so the shell sees a closed string.

Accepted findings without that gate verdict stay fail-closed. Reviewers remain edit: deny. Do not lower the two-approval ruleset (#948).

seonghobae added a commit that referenced this pull request Aug 13, 2026
Live router run 31672030631 queued Noema for #9560c253f0 and then
failed OpenCode with HTTP 422: repository_dispatch allows 10
client_payload properties and the review-only flags made 14. Nest
those flags under review_contract, bind the wrapper to that object,
and leave the flat invocation-key claim unchanged.
The gate prints "failed after provider infrastructure or failure-signal
output" after NVIDIA NIM exit 2. The outer regex only listed the sibling
"emitted ..." wording, so required CI treated that line as a non-backend
fail. Fold #957 into this neutralization.
@seonghobae

Copy link
Copy Markdown
Contributor Author

@cwl-noema-review

Please review this exact current head ($(git rev-parse HEAD)).

This head honors leftover-TUI incomplete-evidence verdicts, classifies GitHub Models 410 github_models_retirement_brownout as backend unavailability, classifies the gate sentence failed after provider infrastructure or failure-signal output (#957), and quotes inline Python as python3 -c. Accepted findings stay fail-closed. Reviewers remain edit: deny.

@seonghobae

Copy link
Copy Markdown
Contributor Author

@cwl-noema-review exact current head is 4aa8280fc0031ed9970bfdfbc73c26090c15b718. Please bind the verdict to that SHA.

Record that a mid-retry Severity TUI line cannot override the trusted
incomplete-log-only verdict. Force the trusted-uv installer tests onto
the linux x86_64 runner path and add the control-plane architecture
diagram.
A mid-retry Severity: line plus the exact gate sentence failed after
provider infrastructure still blocked neutralization. Include that
sentence and the hyphenated incomplete-evidence token in the
log-only override so leftover TUI is not treated as an accepted finding.
@seonghobae

Copy link
Copy Markdown
Contributor Author

@cwl-noema-review exact current head 92f6fd8f. The head moved after 4aa8280f. Independent Noema APPROVE on this SHA is required; leftover-TUI Strix recheck waits until this lands on main.

@seonghobae

Copy link
Copy Markdown
Contributor Author

@cwl-noema-review exact current head 92f6fd8f. Independent Noema APPROVE on this SHA is required. Required-workflow runs were cancelled, not a code failure.

Materialize a base Python lock only when every package line is an exact
SHA-256 pin or a two-token relative -r/--requirement include of a
candidate lock path. A lone --require-hashes directive, ./dotted paths,
and -r other-hashes.txt no longer enter the trusted build context.
@seonghobae

Copy link
Copy Markdown
Contributor Author

@cwl-noema-review exact current head 145d11e3 — incomplete-retry log-only severity; coverage now accepts only bounded relative requirement includes. Head moved after 92f6fd8f. Independent Noema APPROVE on this SHA is required. Do not wait on two-approval. Reviewers remain edit: deny. NVIDIA_NIM_API_KEY only.

@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 145d11e354fe5cc9d08dd247fc53f46c46d74f59.
  • 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: strix.yml"]
  S1 --> I1["GitHub Actions review job"]
  I1 --> R1["Review risk: Workflow: strix.yml"]
  R1 --> V1["actionlint plus required checks"]
  Evidence --> S2["Changed file (4 files)"]
  S2 --> I2["repository behavior"]
  I2 --> R2["Review risk: Changed file (4 files)"]
  R2 --> V2["required checks"]
  Evidence --> S3["Docs (2 files)"]
  S3 --> I3["operator or user guidance"]
  I3 --> R3["Review risk: Docs (2 files)"]
  R3 --> V3["docs review"]
  Evidence --> S4["CI script: materialize_base_python_requirements.py"]
  S4 --> I4["review and security gate shell path"]
  I4 --> R4["Review risk: CI script: materialize_base_python_requirements.py"]
  R4 --> V4["bash -n plus Strix self-test"]
  Evidence --> S5["Test (4 files)"]
  S5 --> I5["regression suite"]
  I5 --> R5["Review risk: Test (4 files)"]
  R5 --> V5["targeted test run"]
Loading

@opencode-agent

Copy link
Copy Markdown
Contributor

OpenCode Review Overview

  • Head SHA: 145d11e354fe5cc9d08dd247fc53f46c46d74f59
  • Workflow run: 31724671704
  • Workflow attempt: 1
  • Gate result: REQUEST_CHANGES (approval step)

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 145d11e354fe5cc9d08dd247fc53f46c46d74f59.
  • 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: strix.yml"]
  S1 --> I1["GitHub Actions review job"]
  I1 --> R1["Review risk: Workflow: strix.yml"]
  R1 --> V1["actionlint plus required checks"]
  Evidence --> S2["Changed file (4 files)"]
  S2 --> I2["repository behavior"]
  I2 --> R2["Review risk: Changed file (4 files)"]
  R2 --> V2["required checks"]
  Evidence --> S3["Docs (2 files)"]
  S3 --> I3["operator or user guidance"]
  I3 --> R3["Review risk: Docs (2 files)"]
  R3 --> V3["docs review"]
  Evidence --> S4["CI script: materialize_base_python_requirements.py"]
  S4 --> I4["review and security gate shell path"]
  I4 --> R4["Review risk: CI script: materialize_base_python_requirements.py"]
  R4 --> V4["bash -n plus Strix self-test"]
  Evidence --> S5["Test (4 files)"]
  S5 --> I5["regression suite"]
  I5 --> R5["Review risk: Test (4 files)"]
  R5 --> V5["targeted test run"]
Loading

@opencode-agent
opencode-agent Bot disabled auto-merge August 13, 2026 20:17
@seonghobae
seonghobae enabled auto-merge (squash) August 13, 2026 22:12
@opencode-agent
opencode-agent Bot disabled auto-merge August 13, 2026 22:15
@seonghobae
seonghobae enabled auto-merge (squash) August 13, 2026 22:19
@opencode-agent
opencode-agent Bot disabled auto-merge August 13, 2026 22:24
@seonghobae
seonghobae enabled auto-merge (squash) August 13, 2026 22:27
@opencode-agent
opencode-agent Bot disabled auto-merge August 13, 2026 22:35
@seonghobae
seonghobae enabled auto-merge (squash) August 13, 2026 22:51
@opencode-agent
opencode-agent Bot disabled auto-merge August 13, 2026 23:06
@seonghobae
seonghobae enabled auto-merge (squash) August 13, 2026 23:20
@opencode-agent
opencode-agent Bot disabled auto-merge August 13, 2026 23:38
@seonghobae
seonghobae enabled auto-merge (squash) August 13, 2026 23:50
@opencode-agent
opencode-agent Bot disabled auto-merge August 13, 2026 23:50
@seonghobae
seonghobae enabled auto-merge (squash) August 13, 2026 23:52
@opencode-agent
opencode-agent Bot disabled auto-merge August 13, 2026 23:53
@seonghobae
seonghobae enabled auto-merge (squash) August 14, 2026 00:04
@opencode-agent
opencode-agent Bot disabled auto-merge August 14, 2026 00:15
@seonghobae
seonghobae marked this pull request as draft August 14, 2026 09:10

Copy link
Copy Markdown
Contributor Author

Returned to Draft because the exact current tree mixes the incomplete-retry evidence classifier with an unrelated trusted-uv materializer branch.

The valid fail-closed boundary is narrow: only when the trusted inner gate explicitly reports incomplete log-only evidence and zero accepted findings may stale TUI severity be ignored during a provider-family outage; standalone Severity: HIGH / Vulnerabilities N must still fail. Head 145d11e354fe5cc9d08dd247fc53f46c46d74f59 additionally changes materialize_base_python_requirements.py and its tests plus broad governance files.

Rebuild from protected main retaining only the Strix workflow classification, focused cross-line/spoofing/standalone-finding regressions, doctoring, directly attributable governance/changelog evidence, and no materializer changes. Coordinate with #955 so provider-budget and evidence-classification ownership remain explicit rather than duplicated, then reacquire exact-head Strix/security/supply-chain and independent-review evidence.

Copy link
Copy Markdown
Contributor Author

Closing as superseded by the fail-closed evidence architecture in #965. This branch's outer wrapper deliberately exits 0 when a provider-unavailability signal coexists with a trusted incomplete_log_only_signal, even though no authoritative Strix report artifact exists. That conflicts with the central security contract tracked in #891 and with #965's stricter rule: any non-zero/incomplete/missing provider-backed scan remains non-passing until a complete exact-head structured report is produced. The useful GitHub Models retirement-brownout/provider-budget work is separately preserved in #955. Do not reintroduce neutral-success semantics for incomplete mandatory security evidence.

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

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

1 participant