fix(e2e): saas workflow E2E_MODEL_SLUG default must be bare MiniMax-M2.7 not colon (the override #2311 missed) #2312

Merged
core-devops merged 1 commits from fix/e2e-saas-model-slug-bare into main 2026-06-05 17:31:23 +00:00
Member

Problem

The e2e-staging-saas regression guard fails at parent workspace-create with HTTP 422:

{"code":"UNREGISTERED_MODEL_FOR_RUNTIME","error":"model \"minimax:MiniMax-M2.7\" is not a registered model for runtime \"claude-code\" ... internal#718"}

Real failure: job 295233, main 4b3590e3.

Why #2311 didn't fix it

PR #2311 fixed the bare-vs-colon slug in tests/e2e/lib/model_slug.sh. But pick_model_slug() returns $E2E_MODEL_SLUG verbatim when that env var is set+non-empty — and this workflow sets E2E_MODEL_SLUG to the colon form. The workflow env overrides the lib #2311 fixed, so the saas guard kept sending minimax:MiniMax-M2.7 and 422ing.

The fix

In .gitea/workflows/e2e-staging-saas.yml, change the default fallback of the E2E_MODEL_SLUG expression from the colon form 'minimax:MiniMax-M2.7' to the bare registered form 'MiniMax-M2.7'. Per-runtime overrides (hermes / codex / google-adk) are left exactly as-is.

  • Bare MiniMax-M2.7 is the BYOK-minimax form — registry_gen.go:88 registers it on the minimax arm (resolves provider=minimax via MINIMAX_API_KEY), so the #1994 byok-not-platform guard still passes.
  • Colon minimax:MiniMax-M2.7 is UNREGISTERED on claude-code — the adapter can't strip the minimax: prefix (derive_provider_matrix_test.go:288, the expectErr=true row).
  • Slash minimax/MiniMax-M2.7 is the platform-billed arm (would trip the byok guard).

The stale comment block (claiming the colon form is needed / that bare 400s on deploy-skew) is corrected.

Audit of all workflows for the same colon-on-claude-code mismatch

Workflow E2E_MODEL_SLUG default Form Action
e2e-staging-saas.yml minimax:MiniMax-M2.7MiniMax-M2.7 colon → bare FIXED (this PR)
e2e-staging-reconciler.yml MiniMax-M2 bare none
staging-smoke.yml MiniMax-M2 bare none
continuous-synth-e2e.yml `${{ inputs.model_slug 'MiniMax-M2' }}`

grep -rn 'minimax:' .gitea/workflows/ matched only e2e-staging-saas.yml (the literal + its comment). No other workflow has the colon-on-claude-code default.

Scope / verification

  • Test-infra-only: 1 file (.gitea/workflows/e2e-staging-saas.yml), model-slug literal + comment only. Zero production .go, zero registry/providers.yaml, zero test-script logic. No change to continue-on-error, triggers, timeouts, concurrency.
  • python3 -c 'yaml.safe_load(...)' → OK.
  • Repo hostile-shapes linter (.gitea/scripts/lint-workflow-yaml.py) → 57 workflow file(s) checked, no fatal Gitea-1.22.6-hostile shapes. (0 heuristic warning(s)), exit 0. The ${{ }} expression keeps its single-expression && / || chain shape — only the final string literal changed.

🤖 Generated with Claude Code

## Problem The `e2e-staging-saas` regression guard fails at parent workspace-create with HTTP 422: ``` {"code":"UNREGISTERED_MODEL_FOR_RUNTIME","error":"model \"minimax:MiniMax-M2.7\" is not a registered model for runtime \"claude-code\" ... internal#718"} ``` Real failure: **job 295233**, main `4b3590e3`. ## Why #2311 didn't fix it PR #2311 fixed the bare-vs-colon slug in `tests/e2e/lib/model_slug.sh`. But `pick_model_slug()` returns `$E2E_MODEL_SLUG` **verbatim** when that env var is set+non-empty — and this workflow sets `E2E_MODEL_SLUG` to the colon form. The workflow env **overrides** the lib #2311 fixed, so the saas guard kept sending `minimax:MiniMax-M2.7` and 422ing. ## The fix In `.gitea/workflows/e2e-staging-saas.yml`, change the **default fallback** of the `E2E_MODEL_SLUG` expression from the colon form `'minimax:MiniMax-M2.7'` to the **bare registered** form `'MiniMax-M2.7'`. Per-runtime overrides (hermes / codex / google-adk) are left **exactly** as-is. - Bare `MiniMax-M2.7` is the **BYOK-minimax** form — `registry_gen.go:88` registers it on the `minimax` arm (resolves `provider=minimax` via `MINIMAX_API_KEY`), so the #1994 byok-not-platform guard still passes. - Colon `minimax:MiniMax-M2.7` is **UNREGISTERED** on claude-code — the adapter can't strip the `minimax:` prefix (`derive_provider_matrix_test.go:288`, the `expectErr=true` row). - Slash `minimax/MiniMax-M2.7` is the platform-billed arm (would trip the byok guard). The stale comment block (claiming the colon form is needed / that bare 400s on deploy-skew) is corrected. ## Audit of all workflows for the same colon-on-claude-code mismatch | Workflow | `E2E_MODEL_SLUG` default | Form | Action | |---|---|---|---| | `e2e-staging-saas.yml` | `minimax:MiniMax-M2.7` → `MiniMax-M2.7` | colon → **bare** | **FIXED (this PR)** | | `e2e-staging-reconciler.yml` | `MiniMax-M2` | bare | none | | `staging-smoke.yml` | `MiniMax-M2` | bare | none | | `continuous-synth-e2e.yml` | `${{ inputs.model_slug || 'MiniMax-M2' }}` | bare | none | `grep -rn 'minimax:' .gitea/workflows/` matched **only** `e2e-staging-saas.yml` (the literal + its comment). No other workflow has the colon-on-claude-code default. ## Scope / verification - **Test-infra-only**: 1 file (`.gitea/workflows/e2e-staging-saas.yml`), model-slug literal + comment only. Zero production `.go`, zero registry/`providers.yaml`, zero test-script logic. No change to continue-on-error, triggers, timeouts, concurrency. - `python3 -c 'yaml.safe_load(...)'` → OK. - Repo hostile-shapes linter (`.gitea/scripts/lint-workflow-yaml.py`) → `57 workflow file(s) checked, no fatal Gitea-1.22.6-hostile shapes. (0 heuristic warning(s))`, exit 0. The `${{ }}` expression keeps its single-expression `&& / ||` chain shape — only the final string literal changed. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
core-devops added 1 commit 2026-06-05 17:28:17 +00:00
fix(e2e): saas workflow E2E_MODEL_SLUG default must be bare MiniMax-M2.7 not colon
ci-arm64-advisory / fast-checks (pull_request) Waiting to run
Block internal-flavored paths / Block forbidden paths (pull_request) Successful in 3s
CI / Python Lint & Test (pull_request) Successful in 3s
Lint curl status-code capture / Scan workflows for curl status-capture pollution (pull_request) Successful in 5s
CI / Detect changes (pull_request) Successful in 12s
E2E API Smoke Test / detect-changes (pull_request) Successful in 10s
E2E Staging Canvas (Playwright) / detect-changes (pull_request) Successful in 9s
E2E Chat / detect-changes (pull_request) Successful in 10s
Lint shellcheck (arm64 pilot) / shellcheck-arm64 (pilot) (pull_request) Successful in 1s
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 4s
lint-required-workflows-docker-host-pinned / Lint docker-host pin on docker-touching workflows (pull_request) Successful in 4s
Lint forbidden tenant-env keys / Scan for repo-host token write into tenant workspace surface (pull_request) Successful in 10s
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 11s
gate-check-v3 / gate-check (pull_request_target) Successful in 4s
qa-review / approved (pull_request_target) Failing after 5s
security-review / approved (pull_request_target) Failing after 6s
sop-checklist / review-refire (pull_request_target) Has been skipped
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
sop-checklist / na-declarations (pull_request) N/A: (none)
sop-checklist / all-items-acked (pull_request_target) Successful in 6s
CI / Platform (Go) (pull_request) Successful in 3s
sop-tier-check / tier-check (pull_request_target) Failing after 5s
CI / Canvas (Next.js) (pull_request) Successful in 3s
CI / Shellcheck (E2E scripts) (pull_request) Successful in 2s
E2E API Smoke Test / E2E API Smoke Test (pull_request) Successful in 3s
E2E Chat / E2E Chat (pull_request) Successful in 3s
CI / all-required (pull_request) Successful in 2s
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Successful in 2s
CI / Canvas Deploy Status (pull_request) Has been skipped
E2E Staging Canvas (Playwright) / Canvas tabs E2E (pull_request) Successful in 3s
lint-continue-on-error-tracking / lint-continue-on-error-tracking (pull_request) Failing after 1m2s
lint-required-no-paths / lint-required-no-paths (pull_request) Successful in 1m2s
Lint pre-flip continue-on-error / Verify continue-on-error flips have run-log proof (pull_request) Successful in 1m2s
lint-required-context-exists-in-bp / lint-required-context-exists-in-bp (pull_request) Successful in 1m8s
Lint workflow YAML (Gitea-1.22.6-hostile shapes) / Lint workflow YAML for Gitea-1.22.6-hostile shapes (pull_request) Successful in 1m10s
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
2efeb6a1bb
The e2e-staging-saas regression guard 422s at parent workspace-create with
UNREGISTERED_MODEL_FOR_RUNTIME for model "minimax:MiniMax-M2.7" on runtime
"claude-code" (internal#718; real failure job 295233, main 4b3590e3).

PR #2311 fixed the bare-vs-colon slug in tests/e2e/lib/model_slug.sh, but the
workflow env var E2E_MODEL_SLUG OVERRIDES the pick_model_slug lib (it returns
$E2E_MODEL_SLUG verbatim when set), so the saas run kept sending the colon form.

The claude-code adapter can't strip the `minimax:` prefix, so the colon id is
UNREGISTERED (derive_provider_matrix_test.go:288). The bare registered id
`MiniMax-M2.7` is the BYOK-minimax form (registry_gen.go:88, MINIMAX_API_KEY),
which keeps the #1994 byok-not-platform guard passing. Swap the default fallback
to the bare form and correct the stale comment. Per-runtime overrides
(hermes/codex/google-adk) are unchanged.

Test-infra-only: workflow file + comment, zero production/registry/test-script
changes.

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

APPROVED (CTO review). Verified diff: ONLY .gitea/workflows/e2e-staging-saas.yml; the single non-comment change is the E2E_MODEL_SLUG default literal minimax:MiniMax-M2.7 (colon) → MiniMax-M2.7 (bare). This is the override that #2311 missed — E2E_MODEL_SLUG (workflow env) wins over the pick_model_slug lib, so the saas guard kept sending the colon form and 422ing UNREGISTERED_MODEL_FOR_RUNTIME on claude-code (real evidence job 295233). Bare is registered (registry_gen.go:88); colon is intentionally UNREGISTERED on claude-code (matrix test :288). hermes/codex/google-adk per-runtime overrides preserved; no triggers/timeouts/concurrency/continue-on-error change. Audit confirmed saas was the only colon offender (reconciler/smoke/synth use bare). YAML hostile-shapes lint exit 0. Approving.

APPROVED (CTO review). Verified diff: ONLY .gitea/workflows/e2e-staging-saas.yml; the single non-comment change is the E2E_MODEL_SLUG default literal minimax:MiniMax-M2.7 (colon) → MiniMax-M2.7 (bare). This is the override that #2311 missed — E2E_MODEL_SLUG (workflow env) wins over the pick_model_slug lib, so the saas guard kept sending the colon form and 422ing UNREGISTERED_MODEL_FOR_RUNTIME on claude-code (real evidence job 295233). Bare is registered (registry_gen.go:88); colon is intentionally UNREGISTERED on claude-code (matrix test :288). hermes/codex/google-adk per-runtime overrides preserved; no triggers/timeouts/concurrency/continue-on-error change. Audit confirmed saas was the only colon offender (reconciler/smoke/synth use bare). YAML hostile-shapes lint exit 0. Approving.
agent-reviewer approved these changes 2026-06-05 17:30:45 +00:00
agent-reviewer left a comment
Member

APPROVED after 5-axis review on current head 2efeb6a1bb.

Correctness: this fixes the workflow-level E2E_MODEL_SLUG override from the claude-code-invalid colon form minimax:MiniMax-M2.7 to the registered bare MiniMax-M2.7, so #2311's model_slug lib fix is no longer bypassed by the workflow env default.

Robustness: only .gitea/workflows/e2e-staging-saas.yml changed. The hermes/codex overrides remain openai/gpt-4o, google-adk remains google_genai:gemini-2.5-pro, and no trigger/concurrency/continue-on-error/gating semantics changed. Required contexts are green: CI / all-required, E2E API Smoke Test, and Handlers Postgres Integration.

Security: no production code, auth, or secret handling changes.

Performance: no runtime performance impact; workflow env default/comment only.

Readability: the updated comment clearly documents bare-vs-colon-vs-slash semantics and why this workflow must match the provider registry contract. I am not treating combined_state/non-required lint or review ceremony statuses as the merge gate.

APPROVED after 5-axis review on current head 2efeb6a1bb1583206c7c2344e76072e4e39ca7a5. Correctness: this fixes the workflow-level `E2E_MODEL_SLUG` override from the claude-code-invalid colon form `minimax:MiniMax-M2.7` to the registered bare `MiniMax-M2.7`, so #2311's model_slug lib fix is no longer bypassed by the workflow env default. Robustness: only `.gitea/workflows/e2e-staging-saas.yml` changed. The hermes/codex overrides remain `openai/gpt-4o`, google-adk remains `google_genai:gemini-2.5-pro`, and no trigger/concurrency/continue-on-error/gating semantics changed. Required contexts are green: CI / all-required, E2E API Smoke Test, and Handlers Postgres Integration. Security: no production code, auth, or secret handling changes. Performance: no runtime performance impact; workflow env default/comment only. Readability: the updated comment clearly documents bare-vs-colon-vs-slash semantics and why this workflow must match the provider registry contract. I am not treating combined_state/non-required lint or review ceremony statuses as the merge gate.
core-devops merged commit f1558b548d into main 2026-06-05 17:31:23 +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#2312