fix(e2e): claude-code MiniMax slug must be bare MiniMax-M2.7 not colon (internal#718 UNREGISTERED) #2311

Merged
core-devops merged 1 commits from fix/e2e-claude-code-minimax-bare-slug into main 2026-06-05 17:19:03 +00:00
Member

Root cause

The staging full-SaaS e2e (tests/e2e/test_staging_full_saas.sh) provisions a claude-code parent workspace using a slug from tests/e2e/lib/model_slug.sh, which for the claude-code/MiniMax-BYOK path emitted the colon form minimax:MiniMax-M2.7. That id is intentionally unregistered for the claude-code runtime — the claude-code adapter cannot strip the minimax: prefix, so create-validation (provider-registry SSOT, internal#718) rejects it.

Evidence — real staging run job 295075 (main 797351bb) failed at 5/11 Provisioning parent workspace with HTTP 422:

{"code":"UNREGISTERED_MODEL_FOR_RUNTIME","error":"model \"minimax:MiniMax-M2.7\" is not a registered model for runtime \"claude-code\"; pick one of the runtime's registered models (provider-registry SSOT, internal#718)"}

This 422 is correct, intentional product behavior, codified in workspace-server/internal/providers/derive_provider_matrix_test.go (the #2263/#2274 colon-vs-slash-vs-bare MiniMax triple):

{"minimax bare -> BYOK minimax provider",   "claude-code", "MiniMax-M2.7",         []string{"MINIMAX_API_KEY"}, "minimax",  false},
{"minimax slash -> platform (proxy upstream)","claude-code","minimax/MiniMax-M2.7", nil,                         "platform", false},
{"minimax colon -> UNREGISTERED on claude-code (adapter can't strip minimax:)","claude-code","minimax:MiniMax-M2.7", nil, "", true},

The bare form is the registered claude-code BYOK id (registry_gen.go:88minimax arm Models = [MiniMax-M2, MiniMax-M2.7, MiniMax-M2.7-highspeed, MiniMax-M3]) and derives provider=minimax (BYOK via MINIMAX_API_KEY). The colon form only resolves on openclaw/hermes, whose adapters do strip minimax:.

Fix (test-only — ZERO production code)

  • tests/e2e/lib/model_slug.sh — claude-code|seo-agent MiniMax-BYOK path now emits the bare registered MiniMax-M2.7. Rewrote the now-incorrect comments that claimed the colon form gives BYOK on claude-code (it 422s; bare gives BYOK, slash gives platform, colon is UNREGISTERED).
  • tests/e2e/test_model_slug.sh — updated the three pins (claude-code+minimax, both-keys priority, seo-agent) from the colon to the bare form.
  • tests/e2e/test_priority_runtimes_e2e.sh — the live MiniMax arm directly POST /workspaces with runtime=claude-code, model=minimax:MiniMax-M2.7 (the same UNREGISTERED 422 class the audit was meant to catch). Switched to bare MiniMax-M2.7 and corrected the misleading "registry-skew → best-effort" framing.
  • tests/e2e/test_staging_full_saas.sh — corrected one stale diagnostic string that named the colon form as the default.

Audit of other arms (per task)

emitted slug runtime registered? action
openai/gpt-4o hermes yes (slash→BYOK-openai, established #1714/#2571 contract) unchanged
openai/gpt-4o codex (*) fallback) slash form, pinned by passing test; not the failing runtime unchanged (noted)
gemini-2.5-pro google-adk yes (matrix: bare→google BYOK) unchanged
minimax/MiniMax-M2.7 test_peer_visibility minimax label slash form → platform (registered, not UNREGISTERED) unchanged
minimax:MiniMax-M2.7 claude-code (model_slug + priority arm) NO — UNREGISTERED fixed → bare

Only the colon-on-claude-code arms were UNREGISTERED; all others are registered for their runtime per the matrix test. openclaw/hermes colon-minimax is correct (those strip the prefix) and is not emitted by this helper.

Verification

  • bash -n clean on all 4 changed scripts.
  • shellcheck -x clean on model_slug.sh + test_model_slug.sh; the two larger scripts show only pre-existing SC1091/SC2329 (source-path / unused-fn), none from this diff.
  • bash tests/e2e/test_model_slug.sh21 passed, 0 failed.

No assertion semantics, continue-on-error, or workflow gating changed.

🤖 Generated with Claude Code

## Root cause The staging full-SaaS e2e (`tests/e2e/test_staging_full_saas.sh`) provisions a **claude-code** parent workspace using a slug from `tests/e2e/lib/model_slug.sh`, which for the claude-code/MiniMax-BYOK path emitted the **colon** form `minimax:MiniMax-M2.7`. That id is **intentionally unregistered** for the claude-code runtime — the claude-code adapter cannot strip the `minimax:` prefix, so create-validation (provider-registry SSOT, internal#718) rejects it. **Evidence — real staging run job 295075 (main `797351bb`)** failed at `5/11 Provisioning parent workspace` with HTTP 422: ```json {"code":"UNREGISTERED_MODEL_FOR_RUNTIME","error":"model \"minimax:MiniMax-M2.7\" is not a registered model for runtime \"claude-code\"; pick one of the runtime's registered models (provider-registry SSOT, internal#718)"} ``` This 422 is **correct, intentional product behavior**, codified in `workspace-server/internal/providers/derive_provider_matrix_test.go` (the #2263/#2274 colon-vs-slash-vs-bare MiniMax triple): ```go {"minimax bare -> BYOK minimax provider", "claude-code", "MiniMax-M2.7", []string{"MINIMAX_API_KEY"}, "minimax", false}, {"minimax slash -> platform (proxy upstream)","claude-code","minimax/MiniMax-M2.7", nil, "platform", false}, {"minimax colon -> UNREGISTERED on claude-code (adapter can't strip minimax:)","claude-code","minimax:MiniMax-M2.7", nil, "", true}, ``` The **bare** form is the registered claude-code BYOK id (`registry_gen.go:88` — `minimax` arm `Models = [MiniMax-M2, MiniMax-M2.7, MiniMax-M2.7-highspeed, MiniMax-M3]`) and derives `provider=minimax` (BYOK via `MINIMAX_API_KEY`). The colon form only resolves on openclaw/hermes, whose adapters **do** strip `minimax:`. ## Fix (test-only — ZERO production code) - **`tests/e2e/lib/model_slug.sh`** — claude-code|seo-agent MiniMax-BYOK path now emits the bare registered `MiniMax-M2.7`. Rewrote the now-incorrect comments that claimed the colon form gives BYOK on claude-code (it 422s; bare gives BYOK, slash gives platform, colon is UNREGISTERED). - **`tests/e2e/test_model_slug.sh`** — updated the three pins (claude-code+minimax, both-keys priority, seo-agent) from the colon to the bare form. - **`tests/e2e/test_priority_runtimes_e2e.sh`** — the live MiniMax arm directly `POST /workspaces` with `runtime=claude-code, model=minimax:MiniMax-M2.7` (the **same** UNREGISTERED 422 class the audit was meant to catch). Switched to bare `MiniMax-M2.7` and corrected the misleading "registry-skew → best-effort" framing. - **`tests/e2e/test_staging_full_saas.sh`** — corrected one stale diagnostic string that named the colon form as the default. ## Audit of other arms (per task) | emitted slug | runtime | registered? | action | |---|---|---|---| | `openai/gpt-4o` | hermes | yes (slash→BYOK-openai, established #1714/#2571 contract) | unchanged | | `openai/gpt-4o` | codex (`*)` fallback) | slash form, pinned by passing test; not the failing runtime | unchanged (noted) | | `gemini-2.5-pro` | google-adk | yes (matrix: bare→`google` BYOK) | unchanged | | `minimax/MiniMax-M2.7` | test_peer_visibility `minimax` label | **slash** form → platform (registered, not UNREGISTERED) | unchanged | | `minimax:MiniMax-M2.7` | claude-code (model_slug + priority arm) | **NO — UNREGISTERED** | **fixed → bare** | Only the colon-on-claude-code arms were UNREGISTERED; all others are registered for their runtime per the matrix test. openclaw/hermes colon-minimax is correct (those strip the prefix) and is not emitted by this helper. ## Verification - `bash -n` clean on all 4 changed scripts. - `shellcheck -x` clean on `model_slug.sh` + `test_model_slug.sh`; the two larger scripts show only pre-existing SC1091/SC2329 (source-path / unused-fn), none from this diff. - `bash tests/e2e/test_model_slug.sh` → **21 passed, 0 failed**. No assertion semantics, continue-on-error, or workflow gating changed. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
core-devops added 1 commit 2026-06-05 17:14:49 +00:00
fix(e2e): claude-code MiniMax slug must be bare MiniMax-M2.7 not colon (internal#718 UNREGISTERED)
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 4s
Lint shellcheck (arm64 pilot) / shellcheck-arm64 (pilot) (pull_request) Successful in 2s
CI / Detect changes (pull_request) Successful in 9s
E2E Chat / detect-changes (pull_request) Successful in 8s
Lint forbidden tenant-env keys / Scan for repo-host token write into tenant workspace surface (pull_request) Successful in 3s
E2E Staging Canvas (Playwright) / detect-changes (pull_request) Successful in 8s
E2E API Smoke Test / detect-changes (pull_request) Successful in 11s
Handlers Postgres Integration / detect-changes (pull_request) Successful in 8s
Lint forbidden tenant-env keys / Scan workspace_secrets writers for forbidden env keys (pull_request) Successful in 7s
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 5s
sop-checklist / review-refire (pull_request_target) Has been skipped
gate-check-v3 / gate-check (pull_request_target) Successful in 7s
CI / Platform (Go) (pull_request) Successful in 2s
qa-review / approved (pull_request_target) Failing after 6s
sop-checklist / all-items-acked (pull_request) acked: 0/7 — missing: comprehensive-testing, local-postgres-e2e, staging-smoke, +4 — body-unfilled: comprehensive-testing, local-postgres-e2
CI / Canvas (Next.js) (pull_request) Successful in 2s
sop-checklist / na-declarations (pull_request) N/A: (none)
E2E Chat / E2E Chat (pull_request) Successful in 2s
E2E Staging Canvas (Playwright) / Canvas tabs E2E (pull_request) Successful in 2s
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Successful in 1s
security-review / approved (pull_request_target) Failing after 13s
sop-checklist / all-items-acked (pull_request_target) Successful in 13s
sop-tier-check / tier-check (pull_request_target) Failing after 11s
CI / Shellcheck (E2E scripts) (pull_request) Successful in 13s
CI / Canvas Deploy Status (pull_request) Has been skipped
CI / all-required (pull_request) Successful in 2s
lint-required-no-paths / lint-required-no-paths (pull_request) Successful in 1m7s
E2E API Smoke Test / E2E API Smoke Test (pull_request) Successful in 53s
qa-review / approved (pull_request_review) Has been skipped
security-review / approved (pull_request_review) Has been skipped
sop-tier-check / tier-check (pull_request_review) Failing after 4s
audit-force-merge / audit (pull_request_target) Successful in 5s
E2E Staging SaaS (full lifecycle) / pr-validate (pull_request) Waiting to run
E2E Staging SaaS (full lifecycle) / E2E Staging SaaS (pull_request) Waiting to run
E2E Staging SaaS (full lifecycle) / E2E Staging Platform Boot (pull_request) Waiting to run
E2E Staging Reconciler (heals terminated EC2) / pr-validate (pull_request) Waiting to run
E2E Staging Reconciler (heals terminated EC2) / E2E Staging Reconciler (pull_request) Waiting to run
64fdfa6e77
The staging full-SaaS e2e provisioned a claude-code parent workspace with
the colon-namespaced model id `minimax:MiniMax-M2.7` (from
tests/e2e/lib/model_slug.sh), which is INTENTIONALLY unregistered for the
claude-code runtime: the claude-code adapter cannot strip the `minimax:`
prefix, so create-validation (provider-registry SSOT, internal#718) rejects
it 422 UNREGISTERED_MODEL_FOR_RUNTIME.

Evidence: real staging run job 295075 (main 797351bb) failed at
"5/11 Provisioning parent workspace" with:
  {"code":"UNREGISTERED_MODEL_FOR_RUNTIME","error":"model
  \"minimax:MiniMax-M2.7\" is not a registered model for runtime
  \"claude-code\"; pick one of the runtime's registered models
  (provider-registry SSOT, internal#718)"}

This 422 is correct, intentional product behavior, pinned by
workspace-server/internal/providers/derive_provider_matrix_test.go
(the #2263/#2274 colon-vs-slash-vs-bare MiniMax triple):
  bare  "MiniMax-M2.7"        -> provider=minimax  (BYOK)
  slash "minimax/MiniMax-M2.7" -> provider=platform
  colon "minimax:MiniMax-M2.7" -> UNREGISTERED (adapter can't strip minimax:)
The bare form is registered in claude-code's `minimax` arm
(registry_gen.go:88 Models=[MiniMax-M2,MiniMax-M2.7,MiniMax-M2.7-highspeed,
MiniMax-M3]) and derives provider=minimax BYOK via MINIMAX_API_KEY.

Test-only fix (zero production code):
- tests/e2e/lib/model_slug.sh: claude-code|seo-agent MiniMax-BYOK path now
  emits the bare registered `MiniMax-M2.7`; rewrote the now-wrong comments
  that claimed the colon form gives BYOK on claude-code (it doesn't — colon
  is only the correct BYOK id on openclaw/hermes, which DO strip the prefix).
- tests/e2e/test_model_slug.sh: updated the three pins from the colon form to
  the bare form (claude-code + minimax, both-keys priority, seo-agent).
- tests/e2e/test_priority_runtimes_e2e.sh: the live MiniMax arm directly
  provisioned claude-code with the same colon id (same UNREGISTERED 422 class)
  — switched to bare `MiniMax-M2.7` and corrected the "registry-skew" framing.
- tests/e2e/test_staging_full_saas.sh: corrected a stale diagnostic string.

Audit of other arms (no other UNREGISTERED mismatch found): hermes/codex
slash `openai/gpt-4o` and google-adk bare `gemini-2.5-pro` and the
test_peer_visibility `minimax/MiniMax-M2.7` slash form are all registered
for their runtimes per the matrix test; left unchanged. openclaw/hermes
colon-minimax is correct (those adapters strip the prefix) and is not
emitted by this helper.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
claude-ceo-assistant approved these changes 2026-06-05 17:17:14 +00:00
claude-ceo-assistant left a comment
Owner

APPROVED (CTO review). Verified diff: 4 tests/e2e files ONLY, zero production code. Correct root cause + fix — claude-code MiniMax BYOK slug must be BARE MiniMax-M2.7 (registry_gen.go:88), NOT colon minimax:MiniMax-M2.7 which the claude-code adapter cannot strip and which create-validation (internal#718) rightly 422s (real evidence: job 295075). Confirmed by the #2292 matrix test line 288 (colon→UNREGISTERED on claude-code BY DESIGN; colon only valid on openclaw/hermes). Only behavioral change is the slug (printf + POST body + 3 test pins) colon→bare; bestfail/gating/assertion-semantics untouched; comments rewritten accurately. Audit correctly caught a 2nd instance (test_priority_runtimes_e2e.sh) and correctly left slash/platform forms (peer_visibility minimax/, hermes openai/, google-adk bare) alone. bash -n + shellcheck clean; test_model_slug.sh 21/21. This makes the real-runtime provisioning guard FUNCTIONAL. Approving.

APPROVED (CTO review). Verified diff: 4 tests/e2e files ONLY, zero production code. Correct root cause + fix — claude-code MiniMax BYOK slug must be BARE MiniMax-M2.7 (registry_gen.go:88), NOT colon minimax:MiniMax-M2.7 which the claude-code adapter cannot strip and which create-validation (internal#718) rightly 422s (real evidence: job 295075). Confirmed by the #2292 matrix test line 288 (colon→UNREGISTERED on claude-code BY DESIGN; colon only valid on openclaw/hermes). Only behavioral change is the slug (printf + POST body + 3 test pins) colon→bare; bestfail/gating/assertion-semantics untouched; comments rewritten accurately. Audit correctly caught a 2nd instance (test_priority_runtimes_e2e.sh) and correctly left slash/platform forms (peer_visibility minimax/, hermes openai/, google-adk bare) alone. bash -n + shellcheck clean; test_model_slug.sh 21/21. This makes the real-runtime provisioning guard FUNCTIONAL. Approving.
agent-reviewer approved these changes 2026-06-05 17:17:51 +00:00
agent-reviewer left a comment
Member

APPROVED after 5-axis review on current head 64fdfa6e77.

Correctness: the change fixes the claude-code MiniMax BYOK slug from the colon form minimax:MiniMax-M2.7 to the registered bare MiniMax-M2.7, matching the documented runtime/provider matrix contract. The openclaw/hermes slash/colon behavior is not changed.

Robustness: only four tests/e2e/** files changed. No workflow files, no continue-on-error, no bestfail/gating/assertion-semantics changes. The tests and comments now align with create-validation behavior and the existing BYOK provider-routing matrix.

Security: no production code, auth, or secret-handling changes. The diff only adjusts E2E model slug selection and explanatory diagnostics.

Performance: no runtime performance impact; test-only slug selection/comment update.

Readability: comments now clearly explain bare vs slash vs colon semantics for claude-code versus openclaw/hermes.

Required contexts are green: CI / all-required, E2E API Smoke Test, and Handlers Postgres Integration. I am not treating combined_state / non-required staging status as the merge gate.

APPROVED after 5-axis review on current head 64fdfa6e7727a7e0c66a15a8806ce04c455ca9c0. Correctness: the change fixes the claude-code MiniMax BYOK slug from the colon form `minimax:MiniMax-M2.7` to the registered bare `MiniMax-M2.7`, matching the documented runtime/provider matrix contract. The openclaw/hermes slash/colon behavior is not changed. Robustness: only four `tests/e2e/**` files changed. No workflow files, no `continue-on-error`, no bestfail/gating/assertion-semantics changes. The tests and comments now align with create-validation behavior and the existing BYOK provider-routing matrix. Security: no production code, auth, or secret-handling changes. The diff only adjusts E2E model slug selection and explanatory diagnostics. Performance: no runtime performance impact; test-only slug selection/comment update. Readability: comments now clearly explain bare vs slash vs colon semantics for claude-code versus openclaw/hermes. Required contexts are green: CI / all-required, E2E API Smoke Test, and Handlers Postgres Integration. I am not treating combined_state / non-required staging status as the merge gate.
core-devops merged commit 4b3590e3dc into main 2026-06-05 17:19:03 +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#2311