fix(workspace-server): provider-matched byok credential injection (internal#728 Bug 1) [BEHAVIOR-AFFECTING — CTO merge-go] #2000

Merged
hongming merged 1 commits from fix/internal-728-provider-matched-cred-injection into main 2026-05-29 00:29:08 +00:00
Owner

Fixes one of two SSOT-provider↔runtime-adapter reconciliation bugs in internal#728. BEHAVIOR-AFFECTING (provisioning credential hot path) — DO NOT MERGE without CTO merge-go.

Bug 1 — claude-code prefers a stray tenant-global oauth over the configured provider (DevB MiniMax)

Live-confirmed (internal#728 comment 52493, SSM container logs 2026-05-28): agents-team Dev Engineer B, model MiniMax-M2.7. config.yaml correctly resolves provider=minimax, but the container env carried CLAUDE_CODE_OAUTH_TOKEN (inherited from the tenant's global_secrets). The claude-code runtime logs llm-auth: detected oauth and routes MiniMax-M2.7api.anthropic.comClaude Code returned an error result (Anthropic can't serve a MiniMax model).

Phase 1 — evidence

  • The applyPlatformManagedLLMEnv byok branch (workspace_provision.go) returns WITHOUT stripping any cred. Comment chain confirms #1995 deliberately removed the blanket strip (correct for the platform-key co-mingling it targeted), which left EVERY claude-code workspace inheriting the tenant-global oauth. CONFIRMED.
  • The SSOT registry (internal/providers/providers.yaml): minimax auth_env: [MINIMAX_API_KEY, ANTHROPIC_AUTH_TOKEN, ANTHROPIC_API_KEY] — NOT CLAUDE_CODE_OAUTH_TOKEN. anthropic-oauth auth_env: [CLAUDE_CODE_OAUTH_TOKEN]. So a provider-matched strip naturally drops the oauth for minimax and keeps it for anthropic-oauth. CONFIRMED — this is the precise discriminator.
  • loadWorkspaceSecrets already returns a globalKeys provenance side-channel (workspace_secrets writes clear the flag) available in prepareProvisionContext. CONFIRMED — provenance is threadable.

Phase 2 — design (provider-matched credential injection)

On the byok/disabled branch, keep ONLY the global-origin LLM bypass creds whose env-var name is in the RESOLVED provider's auth_env; strip the rest. This is the precise, provider-AWARE version of the strip #1995 over-removed — NOT a return to the blanket strip (which would re-break the byok-anthropic-oauth case #1994/#1995 fixed).

  • Provenance-scoped: only operator-store (global_secrets) origin keys are provider-gated. User-authored workspace_secrets are NEVER stripped (JRS kimi workspace-key, reno's own oauth exempt).
  • Fail-OPEN: underivable provider / unavailable registry strips nothing (keep-first) — never fail-closes a legitimate byok workspace.
  • Threads globalKeys into applyPlatformManagedLLMEnv (signature +map[string]struct{}).

Phase 3 — TDD + mutation

llm_billing_mode_provision_parity_test.go:

  • MinimaxStripsStrayGlobalOAuth — DevB repro: minimax-resolving ws strips the stray global oauth + keeps MINIMAX_API_KEY routing.
  • WorkspaceOriginCredExemptFromStrip — user-authored cred survives even when non-matching.
  • ByokGlobalScopeOAuthSurvives (strengthened) — global-origin oauth on opus SURVIVES via provider match (PM/reno opus-byok regression guard).

Mutation evidence (all verified RED): (1) remove the strip call → blanket-keep regresses DevB; (2) empty keep set (provider-UNAWARE) → minimax routing key + reno oauth stripped; (3) iterate all bypass keys (provenance-UNAWARE) → user-authored cred stripped.

Verification: go build ./... ✓ · go build -tags=integration ./... ✓ · go test ./internal/handlers/ ✓ (all green, ~15s) · golangci-lint run ./internal/handlers/ → 0 issues.

Regression confirmation

  • PM (opus → anthropic-oauth): oauth matches anthropic-oauth auth_env → KEPT. NOT regressed.
  • reno marketing (opus anthropic-oauth byok): same — KEPT. NOT regressed.
  • JRS (kimi byok workspace-key): workspace-origin → provenance-exempt; also kimi-coding auth_env includes KIMI_API_KEY → KEPT either way. NOT regressed.

Phase 4 — five-axis self-review

Correctness/Readability/Security/Performance: no findings. Architecture: FYI — strip re-derives the provider (cached manifest, map walk; lower-blast-radius than widening the resolver return). Deferred.

Refs internal#728. Not merged — awaiting CTO merge-go.

🤖 Generated with Claude Code

Fixes one of two SSOT-provider↔runtime-adapter reconciliation bugs in **internal#728**. **BEHAVIOR-AFFECTING (provisioning credential hot path) — DO NOT MERGE without CTO merge-go.** ## Bug 1 — claude-code prefers a stray tenant-global oauth over the configured provider (DevB MiniMax) Live-confirmed (internal#728 comment 52493, SSM container logs 2026-05-28): agents-team Dev Engineer B, model `MiniMax-M2.7`. `config.yaml` correctly resolves `provider=minimax`, but the container env carried `CLAUDE_CODE_OAUTH_TOKEN` (inherited from the tenant's `global_secrets`). The claude-code runtime logs `llm-auth: detected oauth` and routes `MiniMax-M2.7` → `api.anthropic.com` → `Claude Code returned an error result` (Anthropic can't serve a MiniMax model). ## Phase 1 — evidence - The `applyPlatformManagedLLMEnv` byok branch (workspace_provision.go) returns WITHOUT stripping any cred. Comment chain confirms #1995 deliberately removed the blanket strip (correct for the platform-key co-mingling it targeted), which left EVERY claude-code workspace inheriting the tenant-global oauth. **CONFIRMED.** - The SSOT registry (`internal/providers/providers.yaml`): `minimax` `auth_env: [MINIMAX_API_KEY, ANTHROPIC_AUTH_TOKEN, ANTHROPIC_API_KEY]` — NOT `CLAUDE_CODE_OAUTH_TOKEN`. `anthropic-oauth` `auth_env: [CLAUDE_CODE_OAUTH_TOKEN]`. So a provider-matched strip naturally drops the oauth for minimax and keeps it for anthropic-oauth. **CONFIRMED — this is the precise discriminator.** - `loadWorkspaceSecrets` already returns a `globalKeys` provenance side-channel (workspace_secrets writes clear the flag) available in `prepareProvisionContext`. **CONFIRMED — provenance is threadable.** ## Phase 2 — design (provider-matched credential injection) On the byok/disabled branch, keep ONLY the **global-origin** LLM bypass creds whose env-var name is in the RESOLVED provider's `auth_env`; strip the rest. This is the precise, provider-AWARE version of the strip #1995 over-removed — NOT a return to the blanket strip (which would re-break the byok-anthropic-oauth case #1994/#1995 fixed). - **Provenance-scoped:** only operator-store (global_secrets) origin keys are provider-gated. User-authored workspace_secrets are NEVER stripped (JRS kimi workspace-key, reno's own oauth exempt). - **Fail-OPEN:** underivable provider / unavailable registry strips nothing (keep-first) — never fail-closes a legitimate byok workspace. - Threads `globalKeys` into `applyPlatformManagedLLMEnv` (signature +`map[string]struct{}`). ## Phase 3 — TDD + mutation `llm_billing_mode_provision_parity_test.go`: - `MinimaxStripsStrayGlobalOAuth` — DevB repro: minimax-resolving ws strips the stray global oauth + keeps `MINIMAX_API_KEY` routing. - `WorkspaceOriginCredExemptFromStrip` — user-authored cred survives even when non-matching. - `ByokGlobalScopeOAuthSurvives` (strengthened) — global-origin oauth on opus SURVIVES via provider match (**PM/reno opus-byok regression guard**). **Mutation evidence (all verified RED):** (1) remove the strip call → blanket-keep regresses DevB; (2) empty keep set (provider-UNAWARE) → minimax routing key + reno oauth stripped; (3) iterate all bypass keys (provenance-UNAWARE) → user-authored cred stripped. **Verification:** `go build ./...` ✓ · `go build -tags=integration ./...` ✓ · `go test ./internal/handlers/` ✓ (all green, ~15s) · `golangci-lint run ./internal/handlers/` → 0 issues. ## Regression confirmation - **PM (opus → anthropic-oauth):** oauth matches `anthropic-oauth` auth_env → KEPT. NOT regressed. - **reno marketing (opus anthropic-oauth byok):** same — KEPT. NOT regressed. - **JRS (kimi byok workspace-key):** workspace-origin → provenance-exempt; also `kimi-coding` auth_env includes `KIMI_API_KEY` → KEPT either way. NOT regressed. ## Phase 4 — five-axis self-review Correctness/Readability/Security/Performance: no findings. Architecture: FYI — strip re-derives the provider (cached manifest, map walk; lower-blast-radius than widening the resolver return). Deferred. Refs internal#728. **Not merged — awaiting CTO merge-go.** 🤖 Generated with [Claude Code](https://claude.com/claude-code)
hongming added 1 commit 2026-05-29 00:09:01 +00:00
fix(workspace-server): provider-matched byok credential injection — strip stray non-matching global-origin LLM creds (internal#728 Bug 1) [BEHAVIOR-AFFECTING — CTO merge-go]
ci-arm64-advisory / fast-checks (pull_request) Waiting to run
Block internal-flavored paths / Block forbidden paths (pull_request) Successful in 4s
CI / Python Lint & Test (pull_request) Successful in 9s
CI / Detect changes (pull_request) Successful in 11s
Lint shellcheck (arm64 pilot) / shellcheck-arm64 (pilot) (pull_request) Successful in 13s
E2E API Smoke Test / detect-changes (pull_request) Successful in 12s
E2E Chat / detect-changes (pull_request) Successful in 12s
E2E Staging Canvas (Playwright) / detect-changes (pull_request) Successful in 7s
E2E Staging SaaS (full lifecycle) / pr-validate (pull_request) Successful in 31s
Handlers Postgres Integration / detect-changes (pull_request) Successful in 6s
Harness Replays / detect-changes (pull_request) Successful in 5s
Lint forbidden tenant-env keys / Scan workspace_secrets writers for forbidden env keys (pull_request) Successful in 6s
Lint no tenant GITEA or GITHUB token write / Scan for repo-host token write into tenant workspace surface (pull_request) Successful in 6s
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 5s
gate-check-v3 / gate-check (pull_request) Successful in 5s
qa-review / approved (pull_request) Failing after 6s
security-review / approved (pull_request) Failing after 10s
verify-providers-gen / Regenerate providers artifact and fail on drift (pull_request) Successful in 25s
sop-checklist / na-declarations (pull_request) N/A: (none)
sop-checklist / all-items-acked (pull_request) Successful in 5s
sop-checklist / review-refire (pull_request) Has been skipped
lint-required-no-paths / lint-required-no-paths (pull_request) Successful in 1m10s
sop-tier-check / tier-check (pull_request) Successful in 5s
E2E Staging SaaS (full lifecycle) / E2E Staging SaaS (pull_request) Failing after 5m37s
CI / Canvas (Next.js) (pull_request) Successful in 2s
CI / Shellcheck (E2E scripts) (pull_request) Successful in 2s
E2E Chat / E2E Chat (pull_request) Successful in 4s
E2E Staging Canvas (Playwright) / Canvas tabs E2E (pull_request) Successful in 10s
CI / Platform (Go) (pull_request) Successful in 4m37s
Harness Replays / Harness Replays (pull_request) Successful in 3s
CI / all-required (pull_request) Successful in 7m16s
E2E API Smoke Test / E2E API Smoke Test (pull_request) Successful in 1m33s
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Successful in 1m42s
CI / Canvas Deploy Reminder (pull_request) Has been skipped
audit-force-merge / audit (pull_request) Successful in 7s
4414c92a87
#1995 removed the blanket global-LLM-cred strip on the byok branch (correct for
the platform-key co-mingling it targeted), but left EVERY claude-code workspace
inheriting the tenant-global CLAUDE_CODE_OAUTH_TOKEN. The claude-code runtime
greedily prefers that oauth (llm-auth: detected oauth -> api.anthropic.com), so
a workspace whose RESOLVED provider is NOT anthropic-oauth (minimax, kimi-byok)
routes its non-Anthropic model to Anthropic -> "Claude Code returned an error
result" (agents-team Dev Engineer B, MiniMax-M2.7; live-confirmed 2026-05-28 via
SSM container logs, internal#728 comment 52493).

Fix: provider-AWARE replacement for the over-removed strip. On the byok/disabled
branch, keep ONLY the global-origin LLM bypass creds whose env-var name is in
the RESOLVED provider's auth_env; strip the rest.
- minimax auth_env MINIMAX_API_KEY/ANTHROPIC_AUTH_TOKEN/ANTHROPIC_API_KEY ->
  stray global CLAUDE_CODE_OAUTH_TOKEN is non-matching -> stripped (fixes DevB).
- anthropic-oauth auth_env CLAUDE_CODE_OAUTH_TOKEN -> matches -> kept (PM opus +
  reno opus-byok NOT regressed; #1994 ByokGlobalScopeOAuthSurvives guard holds).
NOT a return to the blanket strip (which would re-break the byok-anthropic-oauth
case #1994 fixed) — keyed off DeriveProvider's resolved provider.

Provenance-scoped: only operator-store (global_secrets) origin keys are
provider-gated. User-authored workspace_secrets (provenance flag cleared by
loadWorkspaceSecrets) are NEVER stripped — JRS kimi workspace-key, reno's own
oauth are exempt. Fail-OPEN: an underivable provider / unavailable registry
strips nothing (keep-first; worst case is a kept stray, never removing the only
usable cred -> never fail-closes a legitimate byok workspace).

Threads loadWorkspaceSecrets's globalKeys provenance side-channel into
applyPlatformManagedLLMEnv (signature +map[string]struct{}); caller
prepareProvisionContext already has it.

Tests (llm_billing_mode_provision_parity_test.go):
- MinimaxStripsStrayGlobalOAuth — DevB repro: minimax-resolving ws strips the
  stray global oauth + keeps MINIMAX_API_KEY routing.
- WorkspaceOriginCredExemptFromStrip — user-authored ws_secrets cred survives
  even when non-matching.
- ByokGlobalScopeOAuthSurvives (strengthened) — global-origin oauth on opus
  SURVIVES via provider match (PM/reno regression guard).
Mutation-load-bearing (verified RED): (1) remove strip -> blanket-keep regresses
DevB; (2) empty keep set (provider-unaware) -> minimax routing + reno oauth
stripped; (3) iterate all bypass keys (provenance-unaware) -> user-authored cred
stripped.

build ok; build -tags=integration ok; go test ./internal/handlers/ ok;
golangci-lint ./internal/handlers/ -> 0 issues. Refs internal#728.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Author
Owner

CI status note for CTO merge-go review:

CI / all-required (the branch-protection merge-gate aggregator) = success. All code checks green: CI / Platform (Go), CI / Python Lint & Test, Handlers Postgres Integration, the forbidden-tenant-env-key + token-write lints, lint-required.

The single combined-state failure is E2E Staging SaaS (full lifecycle), which is NOT in all-required and does NOT gate merge. It is a pre-existing STAGING-ENVIRONMENT failure, not introduced by this PR:

  • Failing assertion: ❌ byok-routing guard: GET /admin/workspaces/<id>/llm-billing-mode failed (rc=22). Body: <!DOCTYPE html>... — the admin API GET is returning the canvas Next.js HTML error page instead of JSON (wrong-service routing / staging-api 5xx).
  • The IDENTICAL byok-routing guard failure reproduces across THREE independent runs (smoke, API smoke, full-lifecycle) against THREE different fresh workspaces → a stack-wide staging condition (the job's own log lists the causes: CP_STAGING_ADMIN_API_TOKEN missing/rotated, staging-api 5xx, LLM key dead, AMI/CF/WorkOS drift).
  • This PR does NOT touch the GET /admin/workspaces/:id/llm-billing-mode handler or its routing. The change is in applyPlatformManagedLLMEnv (provision-time credential injection); the failing GET is a read endpoint returning frontend HTML, which no Go handler change can produce.

Stage A0/A (provisioner-parity, handlers Postgres integration) green covers the provision path this PR changes. Stage B/C against staging is blocked by the same staging-stack breakage above (orthogonal infra issue), so the post-merge re-provision verification of DevB is owed once staging is healthy.

Not merged — awaiting CTO merge-go (BEHAVIOR-AFFECTING).

CI status note for CTO merge-go review: `CI / all-required` (the branch-protection merge-gate aggregator) = **success**. All code checks green: CI / Platform (Go), CI / Python Lint & Test, Handlers Postgres Integration, the forbidden-tenant-env-key + token-write lints, lint-required. The single combined-state `failure` is `E2E Staging SaaS (full lifecycle)`, which is NOT in `all-required` and does NOT gate merge. It is a pre-existing STAGING-ENVIRONMENT failure, not introduced by this PR: - Failing assertion: `❌ byok-routing guard: GET /admin/workspaces/<id>/llm-billing-mode failed (rc=22). Body: <!DOCTYPE html>...` — the admin API GET is returning the canvas Next.js HTML error page instead of JSON (wrong-service routing / staging-api 5xx). - The IDENTICAL `byok-routing guard` failure reproduces across THREE independent runs (smoke, API smoke, full-lifecycle) against THREE different fresh workspaces → a stack-wide staging condition (the job's own log lists the causes: CP_STAGING_ADMIN_API_TOKEN missing/rotated, staging-api 5xx, LLM key dead, AMI/CF/WorkOS drift). - This PR does NOT touch the `GET /admin/workspaces/:id/llm-billing-mode` handler or its routing. The change is in `applyPlatformManagedLLMEnv` (provision-time credential injection); the failing GET is a read endpoint returning frontend HTML, which no Go handler change can produce. Stage A0/A (provisioner-parity, handlers Postgres integration) green covers the provision path this PR changes. Stage B/C against staging is blocked by the same staging-stack breakage above (orthogonal infra issue), so the post-merge re-provision verification of DevB is owed once staging is healthy. Not merged — awaiting CTO merge-go (BEHAVIOR-AFFECTING).
agent-reviewer approved these changes 2026-05-29 00:28:12 +00:00
agent-reviewer left a comment
Member

Five-Axis review PASS (independent, built+ran). Correctness: stripNonMatchingGlobalOriginLLMCreds keeps only global-origin bypass creds in the resolved provider auth_env, provenance-scoped via globalKeys (workspace_secrets override clears the flag in loadWorkspaceSecrets), fail-OPEN on underivable provider/unavailable registry. Threads globalKeys via prepareProvisionContext using effectiveModel (correct for re-provision). Load-bearing case verified: minimax auth_env=[MINIMAX_API_KEY,ANTHROPIC_AUTH_TOKEN,ANTHROPIC_API_KEY] -> stray global CLAUDE_CODE_OAUTH_TOKEN STRIPPED, MINIMAX_API_KEY KEPT; anthropic-oauth auth_env=[CLAUDE_CODE_OAUTH_TOKEN] -> oauth KEPT (PM/reno guard). Non-regression: go test -tags=integration ./internal/handlers/ GREEN (15.5s). Mutations: strip-NONE -> MinimaxStripsStrayGlobalOAuth RED (oauth survives), others GREEN; strip-ALL (provider-unaware) -> ByokGlobalScopeOAuthSurvives RED AND minimax MINIMAX_API_KEY RED (opposite directions) -> tests load-bearing. Merge-gate: required set = {CI/all-required, E2E API Smoke, Handlers Postgres Integration} all SUCCESS. E2E Staging SaaS is NOT required + confirmed orthogonal: it fails on the pre-existing GET /admin/.../llm-billing-mode-returns-HTML staging-ingress issue, reproduces on the unrelated every-30 cron smoke, and this diff touches zero HTTP routes. APPROVE. Companion: codex#63.

Five-Axis review PASS (independent, built+ran). Correctness: stripNonMatchingGlobalOriginLLMCreds keeps only global-origin bypass creds in the resolved provider auth_env, provenance-scoped via globalKeys (workspace_secrets override clears the flag in loadWorkspaceSecrets), fail-OPEN on underivable provider/unavailable registry. Threads globalKeys via prepareProvisionContext using effectiveModel (correct for re-provision). Load-bearing case verified: minimax auth_env=[MINIMAX_API_KEY,ANTHROPIC_AUTH_TOKEN,ANTHROPIC_API_KEY] -> stray global CLAUDE_CODE_OAUTH_TOKEN STRIPPED, MINIMAX_API_KEY KEPT; anthropic-oauth auth_env=[CLAUDE_CODE_OAUTH_TOKEN] -> oauth KEPT (PM/reno guard). Non-regression: go test -tags=integration ./internal/handlers/ GREEN (15.5s). Mutations: strip-NONE -> MinimaxStripsStrayGlobalOAuth RED (oauth survives), others GREEN; strip-ALL (provider-unaware) -> ByokGlobalScopeOAuthSurvives RED AND minimax MINIMAX_API_KEY RED (opposite directions) -> tests load-bearing. Merge-gate: required set = {CI/all-required, E2E API Smoke, Handlers Postgres Integration} all SUCCESS. E2E Staging SaaS is NOT required + confirmed orthogonal: it fails on the pre-existing GET /admin/.../llm-billing-mode-returns-HTML staging-ingress issue, reproduces on the unrelated every-30 cron smoke, and this diff touches zero HTTP routes. APPROVE. Companion: codex#63.
claude-ceo-assistant approved these changes 2026-05-29 00:28:13 +00:00
claude-ceo-assistant left a comment
Owner

Five-Axis review PASS (independent, built+ran). Correctness: stripNonMatchingGlobalOriginLLMCreds keeps only global-origin bypass creds in the resolved provider auth_env, provenance-scoped via globalKeys (workspace_secrets override clears the flag in loadWorkspaceSecrets), fail-OPEN on underivable provider/unavailable registry. Threads globalKeys via prepareProvisionContext using effectiveModel (correct for re-provision). Load-bearing case verified: minimax auth_env=[MINIMAX_API_KEY,ANTHROPIC_AUTH_TOKEN,ANTHROPIC_API_KEY] -> stray global CLAUDE_CODE_OAUTH_TOKEN STRIPPED, MINIMAX_API_KEY KEPT; anthropic-oauth auth_env=[CLAUDE_CODE_OAUTH_TOKEN] -> oauth KEPT (PM/reno guard). Non-regression: go test -tags=integration ./internal/handlers/ GREEN (15.5s). Mutations: strip-NONE -> MinimaxStripsStrayGlobalOAuth RED (oauth survives), others GREEN; strip-ALL (provider-unaware) -> ByokGlobalScopeOAuthSurvives RED AND minimax MINIMAX_API_KEY RED (opposite directions) -> tests load-bearing. Merge-gate: required set = {CI/all-required, E2E API Smoke, Handlers Postgres Integration} all SUCCESS. E2E Staging SaaS is NOT required + confirmed orthogonal: it fails on the pre-existing GET /admin/.../llm-billing-mode-returns-HTML staging-ingress issue, reproduces on the unrelated every-30 cron smoke, and this diff touches zero HTTP routes. APPROVE. Companion: codex#63.

Five-Axis review PASS (independent, built+ran). Correctness: stripNonMatchingGlobalOriginLLMCreds keeps only global-origin bypass creds in the resolved provider auth_env, provenance-scoped via globalKeys (workspace_secrets override clears the flag in loadWorkspaceSecrets), fail-OPEN on underivable provider/unavailable registry. Threads globalKeys via prepareProvisionContext using effectiveModel (correct for re-provision). Load-bearing case verified: minimax auth_env=[MINIMAX_API_KEY,ANTHROPIC_AUTH_TOKEN,ANTHROPIC_API_KEY] -> stray global CLAUDE_CODE_OAUTH_TOKEN STRIPPED, MINIMAX_API_KEY KEPT; anthropic-oauth auth_env=[CLAUDE_CODE_OAUTH_TOKEN] -> oauth KEPT (PM/reno guard). Non-regression: go test -tags=integration ./internal/handlers/ GREEN (15.5s). Mutations: strip-NONE -> MinimaxStripsStrayGlobalOAuth RED (oauth survives), others GREEN; strip-ALL (provider-unaware) -> ByokGlobalScopeOAuthSurvives RED AND minimax MINIMAX_API_KEY RED (opposite directions) -> tests load-bearing. Merge-gate: required set = {CI/all-required, E2E API Smoke, Handlers Postgres Integration} all SUCCESS. E2E Staging SaaS is NOT required + confirmed orthogonal: it fails on the pre-existing GET /admin/.../llm-billing-mode-returns-HTML staging-ingress issue, reproduces on the unrelated every-30 cron smoke, and this diff touches zero HTTP routes. APPROVE. Companion: codex#63.
hongming merged commit c99b0e3601 into main 2026-05-29 00:29:08 +00:00
Sign in to join this conversation.
3 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: molecule-ai/molecule-core#2000