← reports

#2825 · Claude Code Fable 5.1 metadata drift

Bug Medium Effort: Low providers provider-claude-code open on GitHub 2026-09-01 · base 026572964150eabdcbfc452369c42bacdc22463d

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

ClaimStatusEvidence
A new Fable resolved identifier creates a second generic picker entry.VerifiedThe 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.VerifiedBoth parameterized assertions received 200000 instead of 1000000.
The moving alias descriptions name the prior Fable version.VerifiedThe test received both old static descriptions.
A specific newer Claude Code release emits the reported probe data.UnverifiedThe 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.UnverifiedThe repository test did not use a provider account.

3. Environment

4. Minimal reproduction

  1. Check out the trusted base commit and install the frozen workspace dependencies.
  2. Place the reproduction test in plugins/provider-claude-code/src/.
  3. 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.