What
.github/workflows/hourly-product-development.yml in this repository makes its LLM call directly against a provider
(NVIDIA NIM), bypassing the org's shared contextual-orchestrator gateway
and its orchestrator/free fail-closed zero-cost pool entirely.
OpenCode's generated opencode.json hardcodes "model":"nvidia/nemotron-3-super-120b-a12b" with "provider":{"nvidia":{"options":{"baseURL":"https://integrate.api.nvidia.com/v1","apiKey":"{env:NVIDIA_API_KEY}"}}} — a direct NVIDIA NIM call with zero reference to orchestrator/, a sidecar, or any contextual-orchestrator gateway.
Why this is a violation, not a judgment call
ADR-0003 in ContextualWisdomLab/.github scopes itself explicitly to
that repo's three central review pipelines (OpenCode autofix/dispatch,
Noema, Strix) — it does not authorize this repository's own workflow to
call a provider directly, and does not mention this repository at all.
- The org owner has directed that all GitHub Actions workflows that make
an LLM call route through orchestrator/free.
ContextualWisdomLab/contextual-orchestrator's own hourly loop
(opencode-hourly-loop.yml) already demonstrates the pattern this
repository's loop should follow: vendor the pinned
contextual-orchestrator sidecar, register the five provider credentials
(BYTEZ_API_KEY, NVIDIA_NIM_API_KEY, NVIDIA_NIM_API_KEY_SUB,
OPENROUTER_API_KEY, OPENAI_API_KEY) into its KV, serve the loopback
gateway, and point OpenCode's model at
contextual_orchestrator_gateway/orchestrator/free instead of a direct
provider id/base URL. See
ContextualWisdomLab/contextual-orchestrator/pull/1013 for a worked
example of the pool-string half of that pattern (that PR does not add the
gateway to a repo that lacks it; this repo's workflow doesn't have the
gateway wired in at all yet, which is the larger piece of work here).
What "fixed" looks like
- Vendor/provision the
contextual-orchestrator sidecar in this workflow
(mirroring .github's scripts/ci/contextual_orchestrator_review_sidecar.sh
or contextual-orchestrator's own opencode-hourly-loop.yml job).
- Register the five provider secrets into the sidecar's KV instead of
passing NVIDIA_API_KEY/NVIDIA_NIM_API_KEY straight to the direct
provider call.
- Point the OpenCode config's
model (and any OPENCODE_MODEL/
OPENCODE_MODEL_CANDIDATES/enabled_providers override) at the gateway's
orchestrator/free virtual id instead of a direct nvidia/nvidia-nim
provider id or integrate.api.nvidia.com base URL.
- Retire the repo-local NIM broker/proxy/bridge process this workflow
currently starts, if one exists, once the gateway sidecar replaces it.
- Add or update a workflow-contract test (shell-syntax or string-pinning,
matching this org's usual pattern) covering the changed file, and run it.
This is intentionally left as a tracking issue rather than a same-pass fix:
each of these hourly loops has its own broker/proxy wiring that a blind
string substitution would not safely replace, and getting the sidecar
provisioning right needs repo-specific verification this issue's audit pass
did not have time to do safely.
Filed by the org-wide orchestrator/free routing audit (2026-09-02). See
ContextualWisdomLab/.github's docs/adr/0003-contextual-orchestrator-vendored-free-zdr.md
for the governed-gateway pattern (vendored sidecar, 5-credential KV, free-only
route admission) and docs/product-technical-gap-baseline.md's 2026-09-02
entry for the full audit disposition table.
This is a real, unauthorized violation (case b in the audit), not a half-fix:
routing a hardcoded direct-provider call through the shared gateway is a
bigger change than a model-string swap (own broker/proxy code, secret wiring,
and gateway startup all need to move), so it is being tracked here rather
than attempted blind in the audit pass.
🤖 Filed with Claude Code
What
.github/workflows/hourly-product-development.ymlin this repository makes its LLM call directly against a provider(NVIDIA NIM), bypassing the org's shared
contextual-orchestratorgatewayand its
orchestrator/freefail-closed zero-cost pool entirely.OpenCode's generated
opencode.jsonhardcodes"model":"nvidia/nemotron-3-super-120b-a12b"with"provider":{"nvidia":{"options":{"baseURL":"https://integrate.api.nvidia.com/v1","apiKey":"{env:NVIDIA_API_KEY}"}}}— a direct NVIDIA NIM call with zero reference toorchestrator/, a sidecar, or any contextual-orchestrator gateway.Why this is a violation, not a judgment call
ADR-0003inContextualWisdomLab/.githubscopes itself explicitly tothat repo's three central review pipelines (OpenCode autofix/dispatch,
Noema, Strix) — it does not authorize this repository's own workflow to
call a provider directly, and does not mention this repository at all.
an LLM call route through
orchestrator/free.ContextualWisdomLab/contextual-orchestrator's own hourly loop(
opencode-hourly-loop.yml) already demonstrates the pattern thisrepository's loop should follow: vendor the pinned
contextual-orchestratorsidecar, register the five provider credentials(
BYTEZ_API_KEY,NVIDIA_NIM_API_KEY,NVIDIA_NIM_API_KEY_SUB,OPENROUTER_API_KEY,OPENAI_API_KEY) into its KV, serve the loopbackgateway, and point OpenCode's
modelatcontextual_orchestrator_gateway/orchestrator/freeinstead of a directprovider id/base URL. See
ContextualWisdomLab/contextual-orchestrator/pull/1013for a workedexample of the pool-string half of that pattern (that PR does not add the
gateway to a repo that lacks it; this repo's workflow doesn't have the
gateway wired in at all yet, which is the larger piece of work here).
What "fixed" looks like
contextual-orchestratorsidecar in this workflow(mirroring
.github'sscripts/ci/contextual_orchestrator_review_sidecar.shor
contextual-orchestrator's ownopencode-hourly-loop.ymljob).passing
NVIDIA_API_KEY/NVIDIA_NIM_API_KEYstraight to the directprovider call.
model(and anyOPENCODE_MODEL/OPENCODE_MODEL_CANDIDATES/enabled_providersoverride) at the gateway'sorchestrator/freevirtual id instead of a directnvidia/nvidia-nimprovider id or
integrate.api.nvidia.combase URL.currently starts, if one exists, once the gateway sidecar replaces it.
matching this org's usual pattern) covering the changed file, and run it.
This is intentionally left as a tracking issue rather than a same-pass fix:
each of these hourly loops has its own broker/proxy wiring that a blind
string substitution would not safely replace, and getting the sidecar
provisioning right needs repo-specific verification this issue's audit pass
did not have time to do safely.
Filed by the org-wide
orchestrator/freerouting audit (2026-09-02). SeeContextualWisdomLab/.github'sdocs/adr/0003-contextual-orchestrator-vendored-free-zdr.mdfor the governed-gateway pattern (vendored sidecar, 5-credential KV, free-only
route admission) and
docs/product-technical-gap-baseline.md's 2026-09-02entry for the full audit disposition table.
This is a real, unauthorized violation (case b in the audit), not a half-fix:
routing a hardcoded direct-provider call through the shared gateway is a
bigger change than a model-string swap (own broker/proxy code, secret wiring,
and gateway startup all need to move), so it is being tracked here rather
than attempted blind in the audit pass.
🤖 Filed with Claude Code