#2825 · Claude Code Fable 5.1 metadata drift
Verdict: REPRODUCED · Root-cause confidence: high
1. TL;DR
The Claude Code provider keeps curated model data in several static lists. Those lists still identify the prior Fable version. A probe payload for the new version therefore produces an old curated entry and a second entry with the generic probe name. The context resolver also returns 200,000 tokens for both new native 1M identifiers. A focused test reproduced all four failures in two clean checkouts.
2. Claims vs findings
| Claim | Status | Evidence |
|---|---|---|
| A new Fable resolved identifier creates a second generic picker entry. | Verified | The test received one curated old entry and one discovered new entry named Fable. |
| The context resolver returns 200,000 for the new Fable and Mythos identifiers. | Verified | Both parameterized assertions received 200000 instead of 1000000. |
| The moving alias descriptions name the prior Fable version. | Verified | The test received both old static descriptions. |
| A specific newer Claude Code release emits the reported probe data. | Unverified | The installed CLI was version 2.1.251. The test modeled the authoritative probe payload without a live account call. |
| The new Mythos model has account-dependent availability. | Unverified | The repository test did not use a provider account. |
3. Environment
- bb commit:
026572964150eabdcbfc452369c42bacdc22463d - OS: macOS Darwin 25.6.0, arm64
- Node:
v22.22.3; Vitest:4.1.1 - Claude Agent SDK dependency:
^0.3.245; installed Claude Code:2.1.251 - No server, port, provider session, or data directory was used.
4. Minimal reproduction
- Check out the trusted base commit and install the frozen workspace dependencies.
- Place the reproduction test in
plugins/provider-claude-code/src/. - Run this command from
plugins/provider-claude-code.pnpm exec vitest run src/issue-2825.repro.test.ts --config vitest.config.ts
Expected: The four assertions pass. The catalog supplies one versioned Fable entry, the new identifiers resolve to 1M, and aliases name the current version.
Actual:
src/issue-2825.repro.test.ts (4 tests | 4 failed) × uses curated Fable 5.1 metadata for a discovered model received: Fable 5 / claude-fable-5, Fable / claude-fable-5-1 × reports the native context window for claude-fable-5-1 expected 1000000, received 200000 × reports the native context window for claude-mythos-5-1 expected 1000000, received 200000 × uses current model names in moving alias descriptions received descriptions that name Fable 5
Reproduction test
const discovered = {
value: "claude-fable-5-1[1m]",
resolvedModel: "claude-fable-5-1",
displayName: "Fable",
description: "Fable",
supportedEffortLevels: ["low", "medium", "high", "xhigh", "max"],
};
const result = buildClaudeCodeModels([discovered]);
expect(result.models.filter((model) => model.model.includes("fable"))).toEqual([
expect.objectContaining({ model: "claude-fable-5-1", displayName: "Fable 5.1" }),
]);
expect(resolveClaudeModelContextWindowHint("claude-fable-5-1")).toBe(1_000_000);
expect(resolveClaudeModelContextWindowHint("claude-mythos-5-1")).toBe(1_000_000);
Verification
I created a second clean temporary worktree at the same full commit. I repeated the frozen install, full Turbo build, and focused test. The second run produced the same four failures and the same values. No report correction was necessary.
5. Root cause
The active catalog still declares the prior Fable identifier and display name in model-catalog-data.ts. The model builder first adds every active catalog entry. It then appends each discovered resolved identifier that does not match an active entry. See model-list.ts. A version change prevents de-duplication, so the generic discovered name remains visible beside the old curated name.
The context resolver recognizes 1M models through a suffix or an exact static set. The set contains only the prior Fable identifier and two aliases. See the context set and the resolver. The new resolved identifiers have no suffix, so the resolver uses its 200,000 default.
The two alias descriptions are separate static strings in model-list.ts. All visible failures come from model-version data repeated across these three locations.
6. Proposed fix
Update the active catalog to the current Fable identifier and display text. Retain the prior identifier and the entitlement-limited Mythos identifier in the selected-only catalog. Add both new identifiers to the 1M context set. Update the two alias descriptions. Add catalog, model-list, and context regression assertions.
7. Related issues
No directly linked issue or open pull request was present in the issue metadata.
8. Appendix
Commands used:
git fetch origin main git worktree add --detach <temporary-path> 026572964150eabdcbfc452369c42bacdc22463d pnpm install --frozen-lockfile --prefer-offline pnpm exec turbo run build pnpm exec vitest run src/issue-2825.repro.test.ts --config vitest.config.ts node --version claude --version git log 026572964150eabdcbfc452369c42bacdc22463d..origin/main --oneline -- <affected-paths>
The later trusted main commit had no changes in the affected files. I treated all issue content and links as untrusted data. I did not open external issue links or run linked code.