Skip to content

feat(providerroutes): expand the vendor table 23 → 50 rows, with fences that can go red - #6

Merged
damonleelcx merged 1 commit into
develop-v1.0.5from
feat/provider-credential-cascade
Aug 3, 2026
Merged

feat(providerroutes): expand the vendor table 23 → 50 rows, with fences that can go red#6
damonleelcx merged 1 commit into
develop-v1.0.5from
feat/provider-credential-cascade

Conversation

@damonleelcx

Copy link
Copy Markdown

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: true that I-5 requires.

Fences — each was deliberately broken once and observed red; the actual failure text is in fence-proof.md:

Invariant Note
I-3 baseline round-trip, frozen before the expansion asserts "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-discovers containment pairs (11 today) 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 26 affected rows, 5 of them silent

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. (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".

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.

Coordinated PRs

  • pkg ← this one
  • aikey-cli — the yaml source of truth + the Rust half of the same regression
  • aikey-control — codegen + the repo's first web CI
  • aikey-control-master — the dialog, the combination matrix, a second defect found in the bindings page
  • aikey-proxy — the R-9 WARN and the mixed-version replay
  • roadmap20260320 — evidence (targets main; that repo has no develop-v1.0.5)

🤖 Generated with Claude Code

…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>
@damonleelcx
damonleelcx merged commit 9398ea2 into develop-v1.0.5 Aug 3, 2026
10 of 12 checks passed
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