Skip to content

fix(ai): add claude-fable-5-1 to the cursor capability table and variant aliases - #1613

Open
thisisjun786 wants to merge 3 commits into
code-yeongyu:mainfrom
thisisjun786:fix/cursor-claude-fable-5-1-capability
Open

thisisjun786 wants to merge 3 commits into
code-yeongyu:mainfrom
thisisjun786:fix/cursor-claude-fable-5-1-capability

Conversation

@thisisjun786

@thisisjun786 thisisjun786 commented Sep 11, 2026

Copy link
Copy Markdown
Contributor

Summary

Cursor now serves claude-fable-5-1-{low,medium,high,xhigh,max} and the matching -thinking- variants, but they post-date the 2026-08-18 capture that CURSOR_MODEL_CAPABILITIES and cursor-variant-aliases.json were built from. As a result:

  • normalizeCursorCatalog left the ten variants ungrouped and stamped each with the 200000 unknown-family fallback (FALLBACK_WINDOW), even though GetUsableModels names them Claude Fable 5.1 1M ... and discovery had already recovered a 1M window from that label.
  • regroupStoredCursorModels had no alias to fold an existing models-store.json into the grouped shape, so the picker showed ten separate 200k entries instead of one plain and one thinking identity with an effort ladder.
  • Compaction therefore fired at 200k on a 1M model.

Changes

  • packages/ai/src/cursor/model-capabilities.ts: claude-fable-5-1 takes the same contract as claude-fable-5 (1M window, 1M maxWindow, 300k default context, 1m request context, low..max ladder).
  • packages/ai/src/cursor/cursor-variant-aliases.json: ten aliases mapping the variants onto claude-fable-5-1 / claude-fable-5-1-thinking; source records the 2026-09-11 capture.
  • packages/ai/test/fixtures/cursor-usable-models-claude-fable-5-1-20260911.json: the ten raw GetUsableModels entries exactly as Cursor served them on 2026-09-11.
  • Tests: claude-fable-5-1 joins the expected-window map and variant resolution cases in cursor-model-capabilities.test.ts; a new cursor-model-grouping.test.ts block runs the live fixture through normalizeCursorCatalog and asserts two identities, a full low..max map, and a 1M window (the previously failing behaviour).
  • packages/ai/src/changes.md section per the contributing contract.

Evidence

Live fetchCursorUsableModels capture, 2026-09-11 (223 ids):

claude-fable-5-1-high            "Claude Fable 5.1 1M (NO ZDR)"
claude-fable-5-1-xhigh           "Claude Fable 5.1 1M Extra High (NO ZDR)"
claude-fable-5-1-thinking-xhigh  "Claude Fable 5.1 1M Extra High Thinking (NO ZDR)"
... (10 ids total, all carrying "1M", no -fast variants)

Before this change the stored catalog had all ten at contextWindow: 200000, compat: {}; after it regroupStoredCursorModels produces claude-fable-5-1 / claude-fable-5-1-thinking at 1000000 with cursorReasoning compat, matching claude-fable-5.

Verification

  • vitest run test/cursor* in packages/ai: 20 files, 147 tests pass.
  • packages/coding-agent/test/cursor-legacy-model-resolution.test.ts passes.
  • bun run check (biome, pinned deps, ts imports, shrinkwrap, install-lock, tsc, browser smoke) passes via the pre-commit hook.

Summary by cubic

Registers claude-fable-5-1 in the Cursor capability table and variant aliases. Previously the ten variants fell back to the 200k unknown-family window, so the picker showed ten separate entries and compaction fired at 200k on a 1M model.

Changes

  • claude-fable-5-1 takes the same contract as claude-fable-5: 1M window, 300k default context, low..max ladder.
  • Ten aliases collapse the variants into claude-fable-5-1 / claude-fable-5-1-thinking.
  • A 2026-09-11 live fixture, new grouping and resolution tests, and changelog entries in both packages verify the fix.

Written for commit 92336c1. Summary will update on new commits.

Review in cubic

…ant aliases

Cursor began serving `claude-fable-5-1-{low,medium,high,xhigh,max}` and the
matching `-thinking-` variants after the 2026-08-18 capture the static table
was built from. With no `CURSOR_MODEL_CAPABILITIES` entry, `normalizeCursorCatalog`
left the ten variants ungrouped and stamped each with the 200000 unknown-family
fallback, even though `GetUsableModels` names them "Claude Fable 5.1 1M ...";
with no alias, `regroupStoredCursorModels` could never fold an existing store
into the grouped shape. The result was ten separate 200k picker entries and
compaction firing at 200k on a 1M model.

- `claude-fable-5-1` takes the same contract as `claude-fable-5`: 1M window,
  1M maxWindow, `300k` default context, `1m` request context, `low..max` ladder.
- ten aliases map the variants onto `claude-fable-5-1` / `claude-fable-5-1-thinking`.
- the raw 2026-09-11 `GetUsableModels` entries are committed as a fixture and
  drive new grouping and resolution tests.
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 11, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review Completed 2026-09-12T10:36:38.265827Z 92336c1 New commits
🔒 Security Review Completed 2026-09-11T19:03:55.655404Z c9553a3 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

thisisjun786 and others added 2 commits September 12, 2026 19:24
Preserve both change trackers while merging upstream/main. Include the upstream DeepSeek catalog assertion fix and document the Cursor grouping fix in both release notes.

Ultraworked with [omo](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: sisyphus-dev-ai <sisyphus-dev-ai@users.noreply.github.com>
Merge the upstream Devin preset fix without dropping the Cursor Fable 5.1 release note. Static checks, focused tests, and the full build pass.

Ultraworked with [omo](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: sisyphus-dev-ai <sisyphus-dev-ai@users.noreply.github.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8042c5686e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +133 to +137
"claude-fable-5-1-high": {
"targetId": "claude-fable-5-1",
"level": "high",
"legacyVariantId": "claude-fable-5-1-high",
"encoding": "legacy-variant"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve observed limits while regrouping Fable aliases

When upgrading a user who previously ran a raw Fable 5.1 variant, this new alias makes regroupStoredCursorModels replace that raw ID with the grouped target, but cursor-context-limits.json remains keyed by the raw ID and entryToModel queries only the grouped entry.id. Consequently, a persisted server limit such as 200k for claude-fable-5-1-medium is ignored and the migrated model is advertised as 1M, so a resumed large turn can exceed the account's actual ceiling before another checkpoint is received; migrate or consult the representative/legacy alias limits during regrouping.

Useful? React with 👍 / 👎.

Comment on lines +163 to +167
"claude-fable-5-1-thinking-high": {
"targetId": "claude-fable-5-1-thinking",
"level": "high",
"legacyVariantId": "claude-fable-5-1-thinking-high",
"encoding": "legacy-variant"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Keep raw variants in the Cursor CLI cache

When a Cursor CLI probe includes these new variants, parseCursorAgentModelsListing groups them and writeCache saves only the resulting grouped configs. On the next launch, parseCachedCatalog feeds the grouped IDs back through normalizeEntries; because those target IDs are not alias keys, both entries become non-reasoning models without cursorReasoning or upstreamModelId, and resolveCursorSelectionDescriptor sends the bare claude-fable-5-1[-thinking] ID that Cursor Run rejects with not_found. Thus these identities work immediately after a probe but fail while the 24-hour cache is fresh; cache the raw variants or deserialize the normalized configs without regrouping them.

Useful? React with 👍 / 👎.

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