Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions .github/workflows/strix.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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
Expand Down
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
5 changes: 5 additions & 0 deletions docs/doctoring/strix-nvidia-nim-not-found-fallback.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
32 changes: 32 additions & 0 deletions tests/test_strix_nvidia_nim_not_found_fallback.py
Original file line number Diff line number Diff line change
Expand Up @@ -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."""

Expand Down
Loading