feat(providerroutes): expand the vendor table 23 → 50 rows, with fences that can go red - #6
Merged
Conversation
…es that can go red
The credential dialog carried a hand-written provider list that had drifted nine
entries from this table. Expanding the table is only half the fix; the other half
is making the drift impossible to reintroduce silently.
Rows: the anthropic second face for deepseek / moonshot / qwen / doubao / minimax
/ zhipu(z.ai), plus eleven new openai-compatible vendors. Only-add — the 23
existing rows are byte-identical apart from one `default: true` that I-5 requires.
Fences (each was deliberately broken once and observed red; the actual failure
text is recorded in the change's fence-proof.md):
I-3 baseline round-trip frozen BEFORE the expansion. The assertion is "the row
this URL resolves to has not CHANGED", not "resolves to ITSELF" — two rows
are deliberate alias rows, and a self-hit assertion would fail on real
behaviour then get "fixed" into a whitelist exception.
I-4 segment-aligned longest prefix, auto-discovering containment pairs rather
than whitelisting them.
I-5 every (provider, protocol) resolves. Its failure mode is a silently blank
URL box, not an error.
I-6 every routed provider has a registry identity. RED ON ARRIVAL: huggingface,
yunwu and zeroeleven had been routed with no identity for months.
I-9 no secret-shaped literals, comments included.
I-11 the mixed-version difference is enumerated, not vague: 26 affected rows,
5 of them silent.
Also adds LegacyProtocolForProvider. Giving five providers a second protocol face
falsified the "exactly one declared protocol" fallback that protocol-less legacy
credentials resolve through, which would have made every one of them 502.
(zhipu had been failing that way since 2026-05, unnoticed, because nothing
asserted the property.) The rule is semantic — the protocol of the bare-host rows,
which a second face cannot move — not "the first row in YAML order".
And PathDiscarded, for R-9: an old proxy silently swallows a path segment it does
not recognise, and LookupByBaseURL returns ok=true so the existing WARN never
fires. Query only; forwarding is untouched.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part of provider-credential-cascade (6 coordinated PRs — see the list at the bottom).
Why
The credential dialog carried a hand-written provider list that had drifted nine entries from this table. Expanding the table is only half the fix; the other half is making that drift impossible to reintroduce silently.
What
Rows — the anthropic second face for deepseek / moonshot / qwen / doubao / minimax / zhipu(z.ai), plus eleven new openai-compatible vendors. Only-add: the 23 existing rows are byte-identical apart from one
default: truethat I-5 requires.Fences — each was deliberately broken once and observed red; the actual failure text is in
fence-proof.md:Two additions worth reviewer attention
LegacyProtocolForProvider— giving five providers a second protocol face falsified the "exactly one declared protocol" fallback that protocol-less legacy credentials resolve through, which would have made every one of them 502. (zhipuhad been failing that way since 2026-05, unnoticed, because nothing asserted the property.) The rule is semantic — the protocol of the bare-host rows, which a second face cannot move — not "the first row in YAML order".PathDiscarded— for R-9. An old proxy silently swallows a path segment it does not recognise, andLookupByBaseURLreturnsok=trueso the existing WARN never fires. Query only; forwarding is untouched.Coordinated PRs
pkg← this oneaikey-cli— the yaml source of truth + the Rust half of the same regressionaikey-control— codegen + the repo's first web CIaikey-control-master— the dialog, the combination matrix, a second defect found in the bindings pageaikey-proxy— the R-9 WARN and the mixed-version replayroadmap20260320— evidence (targetsmain; that repo has nodevelop-v1.0.5)🤖 Generated with Claude Code