fix(strix): retry artifact-less provider crashes without weakening exhaustion - #734
fix(strix): retry artifact-less provider crashes without weakening exhaustion#734seonghobae wants to merge 3 commits into
Conversation
When the primary NVIDIA NIM model (nemotron-3-ultra-550b-a55b) is rate-limited or unavailable, try nvidia_nim/nvidia/llama-3.1-nemotron- ultra-253b-v1 and nvidia_nim/nvidia/nemotron-3-super-120b-a12b — both already part of the contract-tested opencode NIM candidate pool — before degrading to the cross-provider GitHub Models fallbacks (o3, gpt-5-chat). NIM candidates reuse the already-provisioned NIM key and API base, and the chain stays bounded by STRIX_TOTAL_TIMEOUT_SECONDS. Updates the pinned contract assertion in test_strix_quick_gate.sh. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ructure Observed on wardnet PR #68 run 30879125169 (job 91896495516): the primary model nvidia_nim/nvidia/nemotron-3-ultra-550b-a55b crashed with a litellm RateLimitError 429. The crash left warning/fatal markers in report artifacts and severity-like markers in the console log, but produced no vulnerabilities/*.md artifact. The gate classified the log-only markers as block_unmapped and returned non-recoverable BEFORE the fallback loop, so the configured STRIX_FALLBACK_MODELS chain never ran, and the crash text also matched reported_vulnerability_signal, bypassing the workflow-level backend-unavailable neutral skip. Gate (scripts/ci/strix_quick_gate.sh): - When INFRA_ERROR_DETECTED is set and no attempt produced a vulnerabilities/*.md artifact, the block_changed/block_unmapped/ block_manifest_unverified decisions are reclassified as retryable provider infrastructure: the primary falls through to the fallback loop and fallback attempts continue to the next candidate. - Scope the report-artifact failure-signal check to run directories created by the current attempt, so a crashed primary's warning/fatal report logs no longer poison a clean fallback success in strict provider-signal mode. Earlier-attempt errors stay recorded in the sticky INFRA_ERROR_DETECTED flag. - Invariant preserved: any attempt that produced an actual vulnerabilities/*.md artifact at/above STRIX_FAIL_ON_MIN_SEVERITY still fails closed (fail_reported_vulnerabilities_before_fallback_success runs first, and the reclassification requires artifact absence). Workflow (.github/workflows/strix.yml): - Neutral-skip a backend-unavailable failure whose severity markers are log-text only: when the backend_unavailable_signal matched but no vulnerabilities/*.md artifact exists on disk, skip neutrally instead of hard-failing on crash-echoed severity markers. A real report artifact on disk keeps failing closed. Tests: - test_strix_quick_gate.sh: two new scenarios — ratelimit-crash-log-only-severity-no-artifact-fallback-succeeds (429 crash, FATAL report log, log-only Severity marker, no artifact → fallback attempted and succeeds) and ratelimit-crash-with-report-artifact-fails-closed (429 crash plus real CRITICAL artifact → fails closed before any fallback attempt); synced the stale actions/setup-python pin to main (v7.0.0). - strix_required_workflow_smoke.sh: pin the new gate classification and the workflow artifact check on the CI-gated required path. - test_required_workflow_queue_contract.py: pin the artifact-aware neutral-skip block. Verification: full test_strix_quick_gate.sh suite passes on Linux (0 failures vs 1 stale-pin failure on the pristine baseline); smoke test passes; pytest contract suite shows no new failures. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Warning Review limit reached
Next review available in: 3 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the 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 configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (7)
Comment |
|
@coderabbitai review |
✅ Action performedReview finished.
|
There was a problem hiding this comment.
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
successwith required evidence or explicit no-source not-applicable evidence. -
Regression test: Keep the approval branch checking
needs.coverage-evidence.result == successbefore 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 head269456cfe749385f85e1928f3ebd30252d556504. -
Head SHA:
269456cfe749385f85e1928f3ebd30252d556504 -
Workflow run: 30900198092
-
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: strix.yml"]
S1 --> I1["GitHub Actions review job"]
I1 --> R1["Review risk: Workflow: strix.yml"]
R1 --> V1["actionlint plus required checks"]
Evidence --> S2["CI script (3 files)"]
S2 --> I2["review and security gate shell path"]
I2 --> R2["Review risk: CI script (3 files)"]
R2 --> V2["bash -n plus Strix self-test"]
Evidence --> S3["Test (3 files)"]
S3 --> I3["regression suite"]
I3 --> R3["Review risk: Test (3 files)"]
R3 --> V3["targeted test run"]
OpenCode Review Overview
Pull request overviewOpenCode cannot approve yet because required coverage evidence did not pass. Review outcome1. HIGH .github/workflows/opencode-review.yml:1 - Coverage evidence did not prove required test/docstring evidence
Coverage evidenceCoverage Decision
Changed-File Evidence Mapflowchart 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["CI script (3 files)"]
S2 --> I2["review and security gate shell path"]
I2 --> R2["Review risk: CI script (3 files)"]
R2 --> V2["bash -n plus Strix self-test"]
Evidence --> S3["Test (3 files)"]
S3 --> I3["regression suite"]
I3 --> R3["Review risk: Test (3 files)"]
R3 --> V3["targeted test run"]
|
|
@opencode-agent Please re-review exact head |
|
@cwl-noema-review Please independently review exact head |
Problem
A provider crash can emit fatal/warning text and severity-like console markers without producing a
vulnerabilities/*.mdreport. The gate previously interpreted that crash debris as unmapped vulnerability evidence and returned non-recoverable before trying configured fallback models. Separately, the workflow used to convert exhausted provider failures into a neutral success, leaving the required security context green without completed evidence.Observed on wardnet #68: the primary NVIDIA NIM model returned HTTP 429, produced no vulnerability artifact, and the fallback chain never ran.
Changes
Retry only the artifact-less infrastructure classification
INFRA_ERROR_DETECTEDwith no current-runvulnerabilities/*.mdartifact as retryable across fallback models;Add bounded same-provider fallbacks
For
nvidia_nimmode, try the existing approved Nemotron candidates before degrading to GitHub Models:nvidia_nim/nvidia/llama-3.1-nemotron-ultra-253b-v1nvidia_nim/nvidia/nemotron-3-super-120b-a12bgithub_models/openai/o3github_models/openai/gpt-5-chatNo new credentials or unbounded retry path are introduced.
Preserve fail-closed exhaustion
After all configured attempts, any nonzero Strix result remains nonzero. Provider unavailability without a vulnerability report is incomplete security evidence; it is not converted into a neutral success. Artifacts and the exact gate console log are still collected under
always()for diagnosis.Regression contracts
Scope
Seven files change: the Strix workflow, gate, full and bounded shell contracts, shared Bash-test collection guard, required-workflow contract, and executable workflow-wrapper contract.
Supersession
This PR supersedes #733's fallback-only change and #587's wrapper-only fail-closed change by composing both with the crash-debris retry classifier. It deliberately does not synthesize success or weaken the Medium+ vulnerability threshold.