Skip to content
Merged
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
6 changes: 3 additions & 3 deletions .github/workflows/opencode-review-dispatch.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5605,12 +5605,12 @@ jobs:
}

emit_known_missing_string_finding \
"STRIX_MODEL: contextual-orchestrator/orchestrator/auto" \
"Strix PR scans must use contextual-orchestrator/orchestrator/auto" \
"STRIX_MODEL: contextual-orchestrator/orchestrator/free" \
"Strix PR scans must use contextual-orchestrator/orchestrator/free" \
".github/workflows/strix.yml" \
"scripts/ci/strix_required_workflow_smoke.sh"
emit_known_missing_string_finding \
"Strix model overrides are limited to contextual-orchestrator/orchestrator/auto." \
"Strix model overrides are limited to contextual-orchestrator/orchestrator/free." \
"Strix model overrides must remain gateway-only" \
".github/workflows/strix.yml" \
"scripts/ci/strix_required_workflow_smoke.sh"
Expand Down
14 changes: 7 additions & 7 deletions .github/workflows/strix.yml
Original file line number Diff line number Diff line change
Expand Up @@ -549,14 +549,14 @@ jobs:
- name: Gate Strix secrets
id: gate
env:
STRIX_MODEL: contextual-orchestrator/orchestrator/auto
STRIX_MODEL: contextual-orchestrator/orchestrator/free
STRIX_MODEL_REQUESTED: ${{ github.event.client_payload.strix_llm || '' }}
run: |
requested_model="$(printf '%s' "$STRIX_MODEL_REQUESTED" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')"
case "$requested_model" in
""|orchestrator/auto|contextual-orchestrator/orchestrator/auto) ;;
""|orchestrator/free|contextual-orchestrator/orchestrator/free) ;;
*)
echo '::error::Strix model overrides are limited to contextual-orchestrator/orchestrator/auto.'
echo '::error::Strix model overrides are limited to contextual-orchestrator/orchestrator/free.'
exit 1
;;
esac
Expand All @@ -574,7 +574,7 @@ jobs:
OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
CONTEXTUAL_ORCHESTRATOR_REQUIRE_ZDR: ${{ steps.target_visibility.outputs.is_private }}
CONTEXTUAL_ORCHESTRATOR_POOL: auto
CONTEXTUAL_ORCHESTRATOR_POOL: free
run: |
set -euo pipefail
bash "$TRUSTED_STRIX_SOURCE/scripts/ci/contextual_orchestrator_review_sidecar.sh"
Expand Down Expand Up @@ -713,11 +713,11 @@ jobs:
strix_llm_file="$RUNNER_TEMP/strix_llm.txt"
strix_model="$(printf '%s' "$STRIX_MODEL" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')"
case "$strix_model" in
orchestrator/auto | contextual-orchestrator/orchestrator/auto)
printf '%s' 'orchestrator/auto' > "$strix_llm_file"
orchestrator/free | contextual-orchestrator/orchestrator/free)
printf '%s' 'orchestrator/free' > "$strix_llm_file"
;;
*)
echo '::error::STRIX_LLM must select contextual-orchestrator/orchestrator/auto.'
echo '::error::STRIX_LLM must select contextual-orchestrator/orchestrator/free.'
exit 1
;;
esac
Expand Down
13 changes: 7 additions & 6 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,12 @@ sidecar (`scripts/ci/contextual_orchestrator_review_sidecar.sh`). The five
provider secrets (`BYTEZ_API_KEY`, `NVIDIA_NIM_API_KEY`,
`NVIDIA_NIM_API_KEY_SUB`, `OPENROUTER_API_KEY`, `OPENAI_API_KEY`) enter its KV
as bootstrap transport in the same process that discovers models and serves;
OpenCode and Noema use the fail-closed zero-cost pool `orchestrator/free`.
Authoritative Strix analysis uses the correctness-first `orchestrator/auto`
provider-diverse pool. Non-free Strix routes
are admitted only with complete published prompt/completion price and currency
evidence, and private targets still require ZDR-compliant routes under
OpenCode, Noema, and Strix all use the fail-closed zero-cost pool
`orchestrator/free`. Strix uses the zero-cost `orchestrator/free` pool by
explicit 2026-08-30 owner decision, superseding the prior `orchestrator/auto`
(provider-diverse, non-free-admitting) default; private targets still require
ZDR-compliant routes under
[`scripts/ci/zdr_policy.py`](scripts/ci/zdr_policy.py).
See [`docs/adr/0003-contextual-orchestrator-vendored-free-zdr.md`](docs/adr/0003-contextual-orchestrator-vendored-free-zdr.md).
See [`docs/adr/0003-contextual-orchestrator-vendored-free-zdr.md`](docs/adr/0003-contextual-orchestrator-vendored-free-zdr.md)
and its 2026-08-30 amendment.
The materialization contract is also covered by [`docs/doctoring/exact-artifact-sbom-attestation.md`](docs/doctoring/exact-artifact-sbom-attestation.md).
34 changes: 34 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,40 @@ this file. The format follows Keep a Changelog, and versioned releases follow
Semantic Versioning where the repository publishes a release.

## [Unreleased]
- Raise `contextual_orchestrator_review_sidecar.sh`'s
`ORCHESTRATOR_CATALOG_FAMILY_CAP` default from 4 to 8: root-caused the
live "no provider route passed the Strix plain-chat preflight" outage
blocking `noema-review`/`opencode-review`/`strix` org-wide to
`contextual_orchestrator_review_policy.py`'s family-cap candidate
selection deterministically admitting the same 4 alphabetically-first
`nvidia_nim`/`nvidia_nim_sub` free-model candidates on every run — 2 of
which are confirmed NVIDIA-retired model ids returning HTTP 404 forever —
while ~19 other healthy free candidates in the same discovery report
never got a chance. See the 2026-08-30 sidecar-preflight gap-baseline
entry for the full evidence trail, the exact trade-off reasoned through
(not live-verified, since this session lacks provider credentials), and
the more complete fix if this proves insufficient.
- Switch Strix from `orchestrator/auto` to `orchestrator/free`, matching
OpenCode and Noema: `strix.yml`'s `STRIX_MODEL`/`CONTEXTUAL_ORCHESTRATOR_POOL`
default and both model-override allowlists, and
`scripts/ci/strix_quick_gate.sh`'s `is_contextual_orchestrator_model`, now
accept only `orchestrator/free`. This is an explicit, informed owner
override of `docs/adr/0003-contextual-orchestrator-vendored-free-zdr.md`'s
original `orchestrator/auto` decision (see that ADR's 2026-08-30
amendment and the matching gap-baseline entry for the full trade-off and
evidence trail): Strix no longer has a paid-model fallback and can go
fully dark during the class of single-provider-family-collapse incident
the original decision was written to survive, until the free-catalog's
stale-model and provider-diversity gaps are separately closed.
- Strengthen `scripts/ci/zdr_policy.py`'s `nvidia_nim`/`nvidia_nim_sub` ZDR
attestation with a direct primary-source citation: NVIDIA's own current
*NVIDIA API Trial Terms of Service* (v. September 19, 2025), Section
3.3(iv), states User Content and Generated Content are collected "to
improve NVIDIA products and services, including AI models" — affirmative
evidence against zero data retention, not just an absence of attestation.
`zero_data_retention` stays `False` as it already was; only the citation
and note change. See the 2026-08-30 ZDR/NIM-routing gap-baseline entry for
the full architecture review this citation was part of.
- Bump the vendored `contextual-orchestrator` review-sidecar pin from
`5f2753a` (the #1422 pin) to current `main` `30c6d716`, picking up
`ContextualWisdomLab/contextual-orchestrator#919`: generalizes the
Expand Down
38 changes: 36 additions & 2 deletions docs/adr/0003-contextual-orchestrator-vendored-free-zdr.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
# ADR-0003: Vendored contextual-orchestrator review sidecar with governed gateway pools

- Status: accepted
- Status: accepted, amended 2026-08-30 (see "2026-08-30 amendment" below — Strix
now uses `orchestrator/free`, not the `orchestrator/auto` this header
originally recorded)
- Date: 2026-08-27
- Scope: ContextualWisdomLab/.github central review pipelines (OpenCode autofix/dispatch + shared `opencode.jsonc` default + required Noema + Strix review)
- Decision: Route every central CI review write/model execution that touches contracts in this repository through the **vendored** `contextual-orchestrator` gateway, served as a per-runner sidecar. OpenCode and Noema retain the fail-closed zero-cost virtual model id `orchestrator/free`; authoritative Strix security analysis uses the provider-diverse `orchestrator/auto` pool. Strix is intentionally correctness-first rather than zero-cost. **Zero Data Retention (ZDR)-compliant routes remain mandatory for private targets.**
- Decision: Route every central CI review write/model execution that touches contracts in this repository through the **vendored** `contextual-orchestrator` gateway, served as a per-runner sidecar. OpenCode, Noema, and (as of the 2026-08-30 amendment) Strix all use the fail-closed zero-cost virtual model id `orchestrator/free`. **Zero Data Retention (ZDR)-compliant routes remain mandatory for private targets.**
- Ownership: `.github` owns control-plane evidence; `ContextualWisdomLab/contextual-orchestrator` owns the gateway. The 2026-08-18 org decision (recorded in `ContextualWisdomLab/contextual-orchestrator` AGENTS.md) already migrated OpenCode/Noema/Strix to the orchestrator backend; this ADR is the org-repo (provider-config) half of that decision.
- Figma File ID: N/A (no customer UI).

Expand Down Expand Up @@ -142,3 +144,35 @@ all five, and auto-optimize routing by cost.
set `CONTEXTUAL_ORCHESTRATOR_REQUIRE_ZDR=true`; the catalog then excludes
every non-ZDR route and fails closed when no attested ZDR route exists in the
selected workflow pool.

- **2026-08-30 amendment: Strix uses `orchestrator/free`, superseding this
ADR's original `orchestrator/auto` decision.** The org owner explicitly
directed Strix off the paid-inclusive `orchestrator/auto` pool and onto the
same zero-cost `orchestrator/free` pool OpenCode and Noema already use, so
no central review path executes a paid model. This is a deliberate,
informed override of the original decision above, not an oversight of it:
the trade-off the original decision recorded — "the 2026-08-29 exact-head
DiskSage scan proved that four discovered free routes all shared the
OpenRouter outage domain, which the gateway correctly collapsed to one
provider attempt... Strix has no external fallback" — was surfaced to the
owner explicitly, including a live 2026-08-30 reproduction of that same
single-family-collapse pattern (a `strix` run's `orchestrator/auto`
primary/free stage rejected 4/4 candidates — 2 timeouts, 2 HTTP 404s from
retired NVIDIA-hosted models — and only the `auto` pool's paid fallback
kept that run alive; see `docs/product-technical-gap-baseline.md`'s
2026-08-30 sidecar-preflight entries for the full evidence trail). The
owner's response, verbatim in substance: implement the free-only directive
as originally instructed. **Accepted consequence**: Strix has no external
fallback and can go fully dark (rather than degraded-but-running) during
the exact class of incident this ADR originally used `orchestrator/auto`
to survive, until the free-catalog's stale-model and provider-diversity
gaps documented alongside this amendment are separately closed. This is
the owner's accepted risk, not an unnoticed regression.
`scripts/ci/strix_quick_gate.sh`'s `is_contextual_orchestrator_model` no
longer accepts `orchestrator/auto`; `strix.yml`'s `STRIX_MODEL`/
`CONTEXTUAL_ORCHESTRATOR_POOL` default to `orchestrator/free`; and
`scripts/ci/strix_required_workflow_smoke.sh`/`AGENTS.md` were updated to
match. The `orchestrator/auto` pool mode itself is unchanged and still
exists in `contextual_orchestrator_review_policy.py`/the sidecar for any
other caller that opts into it explicitly — this amendment only removes it
as Strix's default and as an accepted Strix override value.
Loading
Loading