From b172dfc16b7355c17004903de951d04f12327209 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Fri, 21 Aug 2026 07:33:07 +0900 Subject: [PATCH] fix(strix): classify caido sandbox startup failure --- .github/workflows/strix.yml | 5 +-- CHANGELOG.md | 1 + .../strix-nvidia-nim-not-found-fallback.md | 5 +++ ...est_strix_nvidia_nim_not_found_fallback.py | 32 +++++++++++++++++++ 4 files changed, 41 insertions(+), 2 deletions(-) diff --git a/.github/workflows/strix.yml b/.github/workflows/strix.yml index 4155c73461..b362dc94f6 100644 --- a/.github/workflows/strix.yml +++ b/.github/workflows/strix.yml @@ -844,7 +844,8 @@ jobs: # exit 1 both for genuine blocking vulnerabilities AND for # LLM-backend-unavailable outcomes (GitHub Models "Too many requests" # rate limits, OpenAI quota starvation, 413 tokens_limit_reached - # token-cap, connection/warm-up failures) that could not complete a scan. A backend outage is CI + # token-cap, connection/warm-up failures, and the local Caido guest-login + # sandbox startup failure) that could not complete a scan. A backend outage is CI # infrastructure noise, not a security finding, so it must not fail # the required check and block merges. strix_run_log="$RUNNER_TEMP/strix_gate_console.log" @@ -866,7 +867,7 @@ jobs: fi # Recognized signals that the LLM backend was unavailable / starved. - backend_unavailable_signal='RateLimitError|Too many requests\. For more on scraping GitHub|exceeded your current quota|insufficient_quota|billing details|"status"[[:space:]]*:[[:space:]]*"RESOURCE_EXHAUSTED"|tokens_limit_reached|Request body too large|Max size:[[:space:]]*[0-9]+[[:space:]]+tokens|Error code:[[:space:]]*413|LLM CONNECTION FAILED|Could not establish connection to the language model|LLM warm-up failed|Configured model and fallback models were unavailable|Configured Vertex model and fallback models were unavailable|emitted provider infrastructure or failure-signal output|before provider infrastructure failure|litellm(\.exceptions)?\.NotFoundError[^[:cntrl:]]*Nvidia_nimException[^[:cntrl:]]*Error code:[[:space:]]*404' + backend_unavailable_signal='RateLimitError|Too many requests\. For more on scraping GitHub|exceeded your current quota|insufficient_quota|billing details|"status"[[:space:]]*:[[:space:]]*"RESOURCE_EXHAUSTED"|tokens_limit_reached|Request body too large|Max size:[[:space:]]*[0-9]+[[:space:]]+tokens|Error code:[[:space:]]*413|LLM CONNECTION FAILED|Could not establish connection to the language model|LLM warm-up failed|Configured model and fallback models were unavailable|Configured Vertex model and fallback models were unavailable|emitted provider infrastructure or failure-signal output|before provider infrastructure failure|litellm(\.exceptions)?\.NotFoundError[^[:cntrl:]]*Nvidia_nimException[^[:cntrl:]]*Error code:[[:space:]]*404|loginAsGuest failed after [0-9]+ attempts:[^[:cntrl:]]*curl exit 7:[^[:cntrl:]]*Failed to connect to 127\.0\.0\.1 port 48080' # Any evidence that a vulnerability was actually reported. Its presence # forces a hard failure so real findings are NEVER downgraded. Keep the # severity branch anchored away from identifiers so environment lines diff --git a/CHANGELOG.md b/CHANGELOG.md index f4903c2f3f..7786afef9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ Semantic Versioning where the repository publishes a release. ### Changed +- Classified the known Caido guest-login sandbox startup failure on `127.0.0.1:48080` as bounded Strix infrastructure evidence, while retaining fail-closed behavior for arbitrary connection failures and all vulnerability signals. - Require the hourly repair worker to establish an exact-head root cause, enumerate the smallest remediation candidates, and prove writer authority, sealed-path scope, credentials, dependency order, verifiability, and causal effect before editing; infeasible or external blockers leave the tree unchanged while the broader loop continues with another eligible PR or buyer-visible product gap. - Run the bounded Quarantine Sandbox Runtime heartbeat at minute 14 without granting the caller model secrets, repository mutation permissions, approval, merge, release, artifact-execution, or final security-verdict authority. - Run the bounded Clearfolio PR review-feedback repair caller at minute 23 of every hour while keeping the shared scheduler free of product-specific timers and repository names for modular reuse by naruon, contextual-orchestrator, Inkspan, and other CWL services. diff --git a/docs/doctoring/strix-nvidia-nim-not-found-fallback.md b/docs/doctoring/strix-nvidia-nim-not-found-fallback.md index 70299ebdf7..8842a017f9 100644 --- a/docs/doctoring/strix-nvidia-nim-not-found-fallback.md +++ b/docs/doctoring/strix-nvidia-nim-not-found-fallback.md @@ -35,6 +35,11 @@ when the run log contains no vulnerability signal. Any reported severity or non-zero vulnerability count remains blocking. Scanner reports and attempt logs remain available as artifacts. +The same bounded infrastructure classification covers the known Caido guest-login +sandbox startup failure (`loginAsGuest` followed by `curl exit 7` to the local +`127.0.0.1:48080` service). It does not cover arbitrary loopback or curl failures, +and a vulnerability signal still fails the check. + ## Verification contract Regression evidence proves that: diff --git a/tests/test_strix_nvidia_nim_not_found_fallback.py b/tests/test_strix_nvidia_nim_not_found_fallback.py index a48f3092d2..0c38dcdef6 100644 --- a/tests/test_strix_nvidia_nim_not_found_fallback.py +++ b/tests/test_strix_nvidia_nim_not_found_fallback.py @@ -233,6 +233,38 @@ def test_outer_workflow_rejects_nvidia_404_without_litellm_context(self) -> None ) ) + def test_outer_workflow_neutralizes_caido_guest_login_sandbox_failure(self) -> None: + """Neutralize only the known local Caido guest-login startup failure.""" + + self.assertTrue( + _workflow_neutralizes( + "loginAsGuest failed after 10 attempts: curl exit 7: " + "Failed to connect to 127.0.0.1 port 48080\n" + "Vulnerabilities 0\n" + ) + ) + + def test_outer_workflow_does_not_neutralize_caido_failure_with_findings(self) -> None: + """Keep vulnerability evidence blocking despite a Caido startup failure.""" + + self.assertFalse( + _workflow_neutralizes( + "loginAsGuest failed after 10 attempts: curl exit 7: " + "Failed to connect to 127.0.0.1 port 48080\n" + "Severity: HIGH\nVulnerabilities 1\n" + ) + ) + + def test_outer_workflow_does_not_neutralize_arbitrary_local_connection_failure(self) -> None: + """Do not broaden the exception to arbitrary curl or loopback failures.""" + + self.assertFalse( + _workflow_neutralizes( + "curl exit 7: Failed to connect to 127.0.0.1 port 48081\n" + "Vulnerabilities 0\n" + ) + ) + def test_outer_workflow_never_neutralizes_reported_vulnerabilities(self) -> None: """Keep a real vulnerability signal blocking despite provider failure."""