Skip to content

chore: sync main → staging (auto, ff to d35a2420) - #2263

Merged
HongmingWang-Rabbit merged 1 commit into
stagingfrom
auto-sync/main-d35a2420
Apr 29, 2026
Merged

chore: sync main → staging (auto, ff to d35a2420)#2263
HongmingWang-Rabbit merged 1 commit into
stagingfrom
auto-sync/main-d35a2420

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

Automated fast-forward of staging to origin/main (d35a2420). Staging has no in-flight commits that diverge from main. Merge queue lands this; no human action needed.

This PR is auto-generated by .github/workflows/auto-sync-main-to-staging.yml on every push to main. It exists because this repo's staging branch has a merge_queue ruleset that blocks direct pushes — even from the GitHub Actions integration.

@github-actions
github-actions Bot enabled auto-merge April 29, 2026 05:34
@HongmingWang-Rabbit
HongmingWang-Rabbit merged commit 4742b6c into staging Apr 29, 2026
31 checks passed
@HongmingWang-Rabbit
HongmingWang-Rabbit deleted the auto-sync/main-d35a2420 branch April 29, 2026 09:32
HongmingWang-Rabbit pushed a commit that referenced this pull request Jun 12, 2026
…2263)

The staging SaaS E2E provisioned its claude-code canary with the BARE id
`MiniMax-M2`. The deployed staging tenant ws-server's compiled model
registry lags source, so validateRegisteredModelForRuntime returns HTTP
400 on the bare id at workspace-create. The sibling Platform Boot job, on
the SAME image, succeeds with the NAMESPACED `moonshot/kimi-k2.6` — only
the id form differs (deploy-skew, internal#718; NOT flaky).

Harness-side fix: switch the claude-code MiniMax default from bare
`MiniMax-M2` to the COLON-namespaced `minimax:MiniMax-M2.7`. Crucially
this is the colon (BYOK) form, NOT the slash/platform form
`minimax/MiniMax-M2.7` the issue floated: the canary injects
E2E_MINIMAX_API_KEY (BYOK), so the #1994 byok-not-platform guard asserts
provider_selection=minimax. The colon form stays in the BYOK `minimax`
arm (providers.yaml:851 → provider=minimax, passes the guard); the slash
form resolves to provider=platform and would trip it. Mirrors how the
proven-working kimi BYOK colon-form is registered.

Changed both the operator-override default in e2e-staging-saas.yml (which
sets E2E_MODEL_SLUG and wins over pick_model_slug) and the pick_model_slug
fallback in lib/model_slug.sh, plus the pinned unit-test expectations.

Also: widen the known-answer A2A POST retry grep to include the
Cloudflare-shaped literal `error code: 502/504` token, matching the
cold-start PONG probe and delegation loops. A single un-retried edge 502
right after a healthy round-trip (Platform Boot, task 268859) fell through
to break and failed the gate on the first attempt. Bounded by the existing
6-attempt/sleep-10 loop — no new sleep-as-fix.

NOTE: harness-side only. The durable fix is promoting the staging tenant
ws-server runtime image to a build whose compiled registry includes the
bare id.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
HongmingWang-Rabbit pushed a commit that referenced this pull request Jun 12, 2026
…ed minimax id + match edge-502 retry' (#2274) from fix/2263-staging-canary-namespaced-model into main
HongmingWang-Rabbit pushed a commit that referenced this pull request Jun 12, 2026
…fered runtime×provider gated (keyless, required-lane)

Closes the provider-routing-correctness coverage hole identified in the
regression-coverage audit: many offered (runtime → provider) pairs — hermes's
17 name-only BYOK arms, claude-code's zai/deepseek/xiaomi-mimo, openclaw's
byok-openai/byok-minimax/groq/openrouter/custom, codex's byok-minimax, etc. —
are pure prefix-routing resolved by DeriveProvider(runtime, modelId) and had
ZERO test. A regression in the routing table (wrong provider, dropped arm, bad
regex) shipped silently and wedged tenant agents at boot.

DeriveProvider + ModelPrefixMatch resolve a model id to a provider with NO
upstream call — fully keyless — so the ENTIRE offered routing table is gateable
in the REQUIRED CI / all-required lane with zero secrets.

derive_provider_matrix_test.go is SSOT-DRIVEN (not hardcoded): it iterates
LoadManifest().Runtimes (the same registry production reads) and, for every
runtime × every offered model/provider arm, asserts (a) DeriveProvider resolves
to the EXACT expected provider (computed from the SSOT), (b) the (runtime, model)
is registration-valid (the validateRegisteredModelForRuntime predicate), and
(c) no offered id silently resolves to the wrong arm or falls through.

  - exact-listed arms: every model id iterated off the SSOT, expected provider
    computed from native declaration order (first-declared wins the codex/
    anthropic "one id, two auth arms" shape). A newly-added model is auto-covered.
  - name-only arms (zero models, pure prefix BYOK): each probed with a
    representative BYOK id its regex must own. The matrix REQUIRES a representative
    for every name-only arm in the SSOT — "added an arm, forgot routing/sample"
    fails RED. A dead representative (provider removed) also fails RED.

Coverage: 5 runtimes, 43 (runtime×provider) arms across 29 distinct providers,
53 exact-listed (runtime×model) assertions + 29 name-only BYOK routing probes.

Known-tricky forms pinned as explicit assertions so a regression names its class:
the #2263/#2274 colon-vs-slash-vs-bare MiniMax triple on claude-code (bare→minimax,
slash→platform, colon→unregistered), openai-namespaced-rejected-on-claude-code
(#2265 class), groq→groq, hermes anthropic//gemini//openai://minimax: →
byok-* (NOT platform — cp#529 billing safety), codex gpt default→openai-subscription
vs OPENAI_API_KEY→openai-api, google-adk platform: vs bare gemini.

Watch-it-fail proven: adding minimax:MiniMax-M2.7 to claude-code's platform arm
(pointing the colon BYOK form at platform) reds the matrix naming the exact
mismatch ("= platform, want an unregistered/unrouteable ERROR"); reverted → green.

go build ./... and go vet ./internal/providers/ clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
HongmingWang-Rabbit pushed a commit that referenced this pull request Jun 12, 2026
…n (internal#718 UNREGISTERED)

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 797351b) 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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant