feat(models): discover Claude models from a remote manifest - #246
Merged
Conversation
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: Scenario and decoded snapshot size10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
This was referenced Sep 2, 2026
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.
Two upstream commits, in order:
#9078add Claude Fable 5.1#9084discover Claude models from a remote manifestClaude's model list stops being 500 hand-maintained lines in
ClaudeProvider.tsand becomes data in
model-manifest.json, resolved through a newClaudeModelCatalog. Net −1029 lines across the pair.#9078is not subsumedI had this filed as "skip, subsumed by
#9084." That was wrong.#9084nevertouches
packages/contracts/src/model.ts, so skipping#9078would have droppedthe Fable 5.1 slug aliases entirely and left Pylon's manifest on
claude-fable-5.Carve-outs
checkClaudeProviderStatusparam collision. Pylon added a 5th parameterresolveUsagefor the composer capacity gauge;#9084adds a 5th parametermodelCatalog. Taking upstream's positionally would have silently dropped theusage probe. Pylon's stays 5th, the catalog is 6th, and the
ClaudeDrivercallsite now uses upstream's sequencing — manifest first, since the catalog shapes the
probe rather than post-processing its draft — while carrying Pylon's
usageProbeCache/retainUsageLimitschain and theHttpClientservice it needs.Manifest schema hardening. The manifest is fetched over the network, and Pylon
had bounded it: non-empty and length-capped driver kinds and slugs, a cap on
models per provider and providers per manifest, a supported-driver allowlist, and
onExcessProperty: "error". Upstream's#9084rewrites the same struct asSchema.Record(Schema.String, Schema.Array(Schema.String))with none of that.All of Pylon's checks are kept and upstream's
providerscatalog plus itsreference validation added alongside.
That combination has a trap. Moving
onExcessProperty: "error"onto the envelopeis not enough — the annotation does not survive
.pipe(Schema.check(...)), so theguard silently stopped applying and a payload with an unknown
internalNotesfield was accepted. Pylon's own "rejects otherwise valid payloads with non-public
metadata" test caught it. The annotation now sits on the schema that actually
decodes.
providerModels.tstakes upstream's manifest-awareresolveSelectableModelwhile keeping Pylon's
background-text-generationcapability branch.Retired test.
#9084empties the Claude alias table in contracts, becausealiases now live in the manifest (verified:
fable,opus, and the rest are allpresent under
providers.claudeAgent.models[].aliases, andClaudeModelCatalog.test.tscovers alias resolution). ThenormalizeModelSlugassertion for Claude was therefore testing a retired path and is dropped. Pylon's
"Prime Agent default model availability" suite in the same file is kept.
Verification
t3,@t3tools/web,@t3tools/shared,@t3tools/contractstypecheck clean.Lint clean. 1428 server provider tests, 601 web tests, 11 shared model tests
passing — including both Pylon's manifest-rejection suite and upstream's new
last-good-cache suite, which were unioned rather than one replacing the other.
Model: Claude Opus 5 in Claude Code.
Need help on this PR? Tag
@codesmith-botwith what you need. Autofix is disabled.