-
Notifications
You must be signed in to change notification settings - Fork 0
fix(strix): make Azure and cross-provider fallbacks executable #1263
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Closed
Closed
Changes from all commits
Commits
Show all changes
37 commits
Select commit
Hold shift + click to select a range
f89c0c5
fix(strix): make provider fallback capability-aware
seonghobae b05edc0
fix(strix): track shared routing quality paths
seonghobae 4fc6a24
fix(strix): harden provider fallback boundaries
seonghobae 1fd718f
fix(strix): align console advisory filter
seonghobae de3abcd
fix(strix): keep privileged dependencies trusted
seonghobae 975a9e4
fix(strix): preserve bootstrap smoke marker
seonghobae 02f43ee
test(strix): retrigger on NIM doctoring changes
seonghobae af55904
fix(strix): bind privileged install to trusted lock
seonghobae 9ca02e8
merge: preserve concurrent Strix trust repair
seonghobae 71afa06
test(strix): retrigger trusted-lock doctoring
seonghobae 5c28166
Merge branch 'main' into codex/strix-provider-failover-main-20260823
seonghobae 6b569a5
fix(strix): fail closed on unverifiable evidence
seonghobae f5c3f7e
fix(strix): require structured finding evidence
seonghobae 40ba02d
fix(strix): isolate privileged evidence boundaries
seonghobae 7be1e60
fix(strix): drop retired fallback credentials
seonghobae 667db5a
fix(strix): satisfy protected main's frozen smoke contract at check time
seonghobae cd6d2e5
fix(strix): reject severity identifier suffixes
seonghobae 50a6ad9
test(strix): isolate severity boundary regression
seonghobae 2f15aba
fix(strix): canonicalize direct fallback provider
seonghobae 844cef4
Merge protected main into Strix provider repair
seonghobae 05feeb1
fix(strix): restore complete owner tree after main sync
seonghobae 847ad99
fix(strix): preserve frozen smoke alias during provider repair
seonghobae f428b3e
Merge protected main after Strix owner-tree recovery
seonghobae 0445447
docs(strix): name direct OpenAI fallback accurately
seonghobae 3669bce
Merge branch 'main' into codex/strix-provider-failover-main-20260823
seonghobae ddaca1b
fix: restore base-merged strix work reverted by prior merge
seonghobae 7333818
fix(strix): restore verified owner tree after semantic replay regression
seonghobae b851a16
fix(strix): normalize provider fallback before dispatch
seonghobae 43e7f21
merge(main): absorb direct-OpenAI fallback hotfix
seonghobae 026c26a
fix(strix): avoid duplicate direct fallback
seonghobae 14cd0e8
docs: qualify contextual-orchestrator reference
seonghobae 7011fee
test(strix): make empty fallback explicit
seonghobae 94f56fd
fix(strix): pin direct OpenAI fallback endpoint
seonghobae d6c34c5
fix(strix): authenticate provider failure words
seonghobae a73831f
fix(strix): preserve altered advisory failure
seonghobae 4fb737a
fix(strix): retrigger quality for contract inputs
seonghobae ab3d764
Merge protected main into Strix provider failover repair
seonghobae File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Some comments aren't visible on the classic Files Changed page.
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,126 @@ | ||
| # Strix privileged dependency-lock boundary | ||
|
|
||
| ## Observed failure | ||
|
|
||
| Repository-dispatch run `32651685973` scanned pull request #1263 and reported a | ||
| high-severity supply-chain path in the protected `pull_request_target` Strix | ||
| workflow. The workflow copied `requirements-strix-ci-hashes.txt` from the pull | ||
| request head, installed the selected distributions, and later executed the | ||
| installed `strix` console script with provider credentials. | ||
|
|
||
| The hosted report overstated its proof as a demonstrated exploit: the dispatch | ||
| path did not take the same-repository `pull_request_target` copy step, and the | ||
| artifact contained no malicious package command or output. The source path was | ||
| nevertheless deterministic and security-relevant. Hashes selected by the same | ||
| untrusted pull request authenticate attacker-selected content; they do not make | ||
| that content trusted. | ||
|
|
||
| ## Root cause and repair | ||
|
|
||
| The workflow treated a hash lock as trusted because every distribution was | ||
| pinned and hashed. That protects a reviewed lock from index tampering, but it | ||
| does not establish the provenance of a lock supplied by a pull request. | ||
| GitHub's privileged-trigger guidance requires pull-request content to remain | ||
| data and never become executed code. pip's secure-install guidance separately | ||
| requires hash checking and disallows source distributions. | ||
|
|
||
| The repair deletes PR-head lock materialization. The install step now: | ||
|
|
||
| 1. reads only the lock from the trusted workflow checkout; | ||
| 2. rejects a missing or symbolic-link lock; | ||
| 3. compares the on-disk Git blob with `HEAD:requirements-strix-ci-hashes.txt` | ||
| immediately before installation; and | ||
| 4. pins LiteLLM to the first compatible release with a Python 3.13 manylinux | ||
| wheel, then installs with `--require-hashes`, `--only-binary=:all:`, and | ||
| `--no-deps`. | ||
|
|
||
| Pull-request copies of the workflow and scheduler remain bounded self-test or | ||
| scan inputs; they do not select installed dependencies or receive provider | ||
| credentials. | ||
|
|
||
| ## Scanner, credential, and status boundary | ||
|
|
||
| Default-branch dispatch run `32656142905` then tested the repaired branch with | ||
| the direct OpenAI provider and reported eight possible trust-boundary failures. | ||
| The credential-inheritance claim did not match the pinned `strix-agent==1.5.3` | ||
| runtime: its default backend is Docker, target commands run through a sandbox | ||
| manifest, and that manifest contains only the proxy, host identity, and Python | ||
| runtime variables required by Strix. The hosted proof used a fake scanner that | ||
| executed target code directly on the runner, which the pinned scanner does not | ||
| do. | ||
|
|
||
| The workflow now executes the installed Strix session-construction path before | ||
| loading provider credentials. It fails if the backend is not Docker or if the | ||
| sandbox manifest adds any host environment key outside the reviewed allowlist. | ||
| This proves only the target-command environment boundary. It does not claim | ||
| network isolation or read-only source mounts. | ||
|
|
||
| GitHub creates a distinct `GITHUB_TOKEN` for each job. The `strix` job currently | ||
| retains `statuses: write` only because protected main's trusted required-workflow | ||
| smoke pins that live permission layout. The gate constructs the scanner child | ||
| environment from an allowlist that omits both `GITHUB_TOKEN` and | ||
| `GITHUB_STATUS_TOKEN`, so the scanner process cannot exercise the job token's | ||
| status authority. The separate follow-up job has no `statuses: write` | ||
| permission; after the scan exports evidence that repository-dispatch inputs | ||
| matched live pull-request number, base SHA, and head SHA, it publishes with an | ||
| exchanged app token. | ||
|
|
||
| ## Report evidence boundary | ||
|
|
||
| The remaining hosted findings exposed real fail-open behavior in the shared | ||
| gate. The repair applies one rule to every scanner attempt and report format: | ||
|
|
||
| - a nonzero scanner exit is incomplete evidence even when all emitted findings | ||
| are below the configured severity threshold; | ||
| - Markdown and JSON vulnerability reports enter the same severity and | ||
| changed-path mapping gate; | ||
| - report roots and every descendant must be ordinary non-symlink paths before | ||
| classification, copying, or publication; | ||
| - a finding in a changed file blocks regardless of its reported line range; | ||
| and | ||
| - a report path outside a narrowed scan target is unmappable failure evidence, | ||
| not an unchanged baseline exemption. | ||
|
|
||
| Absolute paths that identify a file actually materialized in the narrowed scan | ||
| target remain mappable. This preserves legitimate Strix output without allowing | ||
| an outside-target path to be normalized against the repository root. | ||
|
|
||
| ## Verification | ||
|
|
||
| - A static regression rejects any PR-head materialization of the Strix lock and | ||
| requires the trusted Git-blob comparison and binary-only install. | ||
| - The short required-workflow smoke test enforces the same boundary. | ||
| - The workflow contract verifies Docker-backed sandbox construction, isolated | ||
| status permission, and live dispatch metadata evidence. | ||
| - Realistic regressions cover nonzero low-severity output, JSON findings, | ||
| symlinked report trees, changed-file line drift, narrowed-target escapes, and | ||
| absolute paths inside the active target. | ||
| - The complete Strix shell harness, Python suite, actionlint, Bash syntax, and | ||
| source-tree coverage run on the final exact head. | ||
|
|
||
| ## References | ||
|
|
||
| GitHub. (n.d.). *GITHUB_TOKEN*. GitHub Docs. Retrieved August 24, 2026, from | ||
| https://docs.github.com/en/actions/concepts/security/github_token | ||
|
|
||
| GitHub. (n.d.). *Secure use reference*. GitHub Docs. Retrieved August 24, 2026, | ||
| from | ||
| https://docs.github.com/en/actions/reference/security/secure-use | ||
|
|
||
| GitHub. (n.d.). *Securely using pull_request_target*. GitHub Docs. Retrieved | ||
| August 24, 2026, from | ||
| https://docs.github.com/en/actions/reference/security/securely-using-pull_request_target | ||
|
|
||
| GitHub. (n.d.). *Workflow syntax for GitHub Actions*. GitHub Docs. Retrieved | ||
| August 24, 2026, from | ||
| https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax | ||
|
|
||
| Python Packaging Authority. (2026). *Secure installs (pip 26.2.1 | ||
| documentation)*. https://pip.pypa.io/en/stable/topics/secure-installs/ | ||
|
|
||
| Python Software Foundation. (n.d.). *subprocess—Subprocess management*. Python | ||
| 3 documentation. Retrieved August 24, 2026, from | ||
| https://docs.python.org/3/library/subprocess.html | ||
|
|
||
| Strix. (2026, August 10). *Strix* (Version 1.5.3) [Computer software]. GitHub. | ||
| https://github.com/usestrix/strix/tree/v1.5.3 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,74 @@ | ||
| # Strix unsupported sampling-parameter fallback | ||
|
|
||
| ## Observed failure | ||
|
|
||
| An Azure `gpt-5.6-sol` Strix run failed before vulnerability analysis because | ||
| LiteLLM sent `temperature=0.2`. Azure accepts only the model default of `1`, | ||
| and LiteLLM had no fallback group for the selected model. Microsoft documents | ||
| `temperature` as unsupported for GPT-5 reasoning models (Microsoft, 2026), | ||
| while the pinned Strix configuration surface exposes no generation-parameter | ||
| control (usestrix, n.d.). | ||
|
|
||
| ## Root cause and repair | ||
|
|
||
| The preferred request-boundary repair is to omit a sampling parameter that a | ||
| caller did not explicitly provide. [ContextualWisdomLab/contextual-orchestrator](https://github.com/ContextualWisdomLab/contextual-orchestrator) | ||
| owns that provider | ||
| boundary for organization software. The pinned Strix integration cannot yet | ||
| express the omission through its documented configuration, so the trusted | ||
| quick gate recognizes only one physical error line containing all of these | ||
| signals: | ||
|
|
||
| - a LiteLLM `BadRequestError`; | ||
| - Azure or OpenAI exception context; | ||
| - the unsupported `temperature` value and supported default; and | ||
| - the missing LiteLLM fallback model group. | ||
|
|
||
| That exact capability failure is infrastructure evidence and may move directly | ||
| to an already-configured distinct outer fallback. It is not eligible for a | ||
| same-model retry. A direct-OpenAI primary has no second approved direct model | ||
| configured, so its bounded same-model retries are followed by a fail-closed | ||
| result rather than a duplicate fallback entry. The shared model normalizer translates the workflow's | ||
| accepted `openai-direct/` alias to the canonical `openai_direct/` selector; | ||
| the LiteLLM child dispatch then uses its provider-compatible `openai/` form. A | ||
| cross-provider direct OpenAI fallback reads the established OpenAI secret and | ||
| the explicit `https://api.openai.com/v1` endpoint from trusted runtime files; | ||
| otherwise a NVIDIA or OpenRouter run could send the fallback to the wrong | ||
| endpoint with the wrong credential. If either input is unavailable, the | ||
| attempted fallback fails configuration closed. | ||
| If no distinct fallback exists or every fallback fails, the required Strix | ||
| check remains non-passing. Existing changed, unmapped, manifest, | ||
| `ModelBehaviorError`, and vulnerability-report boundaries remain fail closed. | ||
|
|
||
| Cross-line signal assembly is deliberately rejected so unrelated target output | ||
| cannot manufacture a provider capability error from separate log lines. | ||
|
|
||
| ## Verification | ||
|
|
||
| - The reproduced single-line Azure failure reaches the configured distinct | ||
| outer fallback exactly once and succeeds only when that scan completes. | ||
| - A direct-OpenAI primary does not attempt its normalized primary model again | ||
| as a fallback after bounded same-model retries. | ||
| - The configured `openai-direct/gpt-5.6-luna` alias normalizes to the canonical | ||
| `openai_direct/gpt-5.6-luna` selector, then dispatches through LiteLLM as | ||
| `openai/gpt-5.6-luna`. | ||
| - A NVIDIA-primary run dispatches that fallback with the OpenAI credential and | ||
| the explicit OpenAI API base, with no inherited NVIDIA API base. | ||
| - A split-line imitation is non-recoverable and never dispatches the fallback. | ||
| - The full Python suite, native workflow validation, Bash syntax checks, and | ||
| complete Strix shell regression suite run on the final tree. | ||
|
|
||
| ## References | ||
|
|
||
| AkikoOrenji. (2026, June 4). *[Feature] Expose LLM generation parameters to | ||
| control local/OpenAI-compatible model behaviour and prevent runaway tool-call | ||
| loops* (Issue No. 514) [GitHub issue]. GitHub. | ||
| https://github.com/usestrix/strix/issues/514 | ||
|
|
||
| Microsoft. (2026, August 20). *Azure OpenAI reasoning models—GPT-5 series, | ||
| o3-mini, o1, o1-mini*. Microsoft Learn. | ||
| https://learn.microsoft.com/en-us/azure/foundry/openai/how-to/reasoning | ||
|
|
||
| usestrix. (n.d.). *Configuration* [Computer software documentation]. GitHub. | ||
| Retrieved August 23, 2026, from | ||
| https://github.com/usestrix/strix/blob/main/docs/advanced/configuration.mdx |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.