Skip to content

Route hourly LLM-calling workflow through contextual-orchestrator (orchestrator/free) in .github/workflows/hourly-product-development.yml #234

Description

@seonghobae

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

  1. 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).
  2. 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.
  3. 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.
  4. Retire the repo-local NIM broker/proxy/bridge process this workflow
    currently starts, if one exists, once the gateway sidecar replaces it.
  5. 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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions