Skip to content

feat(models): fold legacy models behind a row in the model picker - #2282

Merged
chuks-qua merged 4 commits into
mainfrom
feat/issue-2228
Oct 23, 2026
Merged

chuks-qua merged 4 commits into
mainfrom
feat/issue-2228

Conversation

@chuks-qua

@chuks-qua chuks-qua commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

What

Each Claude model now carries a lifecycle flag, either current or legacy. A missing flag means current. The flag comes from one static list in the contracts package and applies to the static fallback and to REST discovery. Dated discovery ids such as claude-sonnet-5-20260514 resolve to their alias, so claude-opus-5-5 is not folded under claude-opus-5.

The model picker shows current models first, then a "Legacy models" row with a count and a chevron. Picking the row, by click or Enter, opens or closes the legacy models in place.

<ModelSelector> tab = Claude
  Claude Opus 5.5 ... Haiku 4.5        Ctrl+1..4
  Legacy models  7  >                   disclosure, aria-expanded, no Ctrl+N
    Claude Opus 5, Fable 5, ...         shown when the fold is open

The fold opens automatically when the selected model is legacy. During a search, matches show unfolded. Favourites behave as before. A provider with no legacy models shows no row. The flag is separate from availableUntil.

Closes #2228

Why

The Claude tab listed eleven models, with previous generations mixed in among the current ones. Folding the superseded models keeps the newest of each family at the top. Older models are still one pick away, and still appear in search.

UI Changes

Captured in the Electron live-testing harness on an empty database. Same window and workflow in each shot.

Before After, fold closed After, fold open
before after, fold closed after, fold open

Review Notes

  • Claude legacy list is wider than the board seed. The seed named Opus 5 and Sonnet 5. I also folded Fable 5, Opus 4.8, 4.7, 4.6 and Sonnet 4.6, because each has a newer model in its family. Haiku 4.5 stays current because it has no successor. Please confirm or trim the list in packages/contracts/src/providers/claude-static-fallback.ts.
  • Other providers have no legacy list yet, as the issue proposed agreeing those lists in review. Codex's RETIRED_CODEX_MODEL_IDS is the obvious first candidate. Until then those tabs show no fold row.
  • The disclosure row lives in the shared Picker (PickerRow.expanded). It skips numbered shortcuts, so Ctrl+N always picks a model.
  • No migration. The server model cache stores JSON, and the new field is optional.
  • Tests: contracts static-models (24), Claude provider (278), and web ModelSelector, picker and model-registry (158) pass. Typecheck is clean for contracts, providers and web. Lint passes.

View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.

Add an optional lifecycle flag (current or legacy, absent means current) to
ProviderModelInfo. Claude flags models superseded by a newer release in the
same family, in its static fallback and in discovery, including dated
snapshots.
A provider tab lists current models, then a Legacy models row with its count
and a chevron that shows or hides the legacy models in place. The fold opens
when the selected model is legacy, and a search lists legacy matches unfolded.
@chuks-qua
chuks-qua merged commit 6581202 into main Oct 23, 2026
11 checks passed
@chuks-qua
chuks-qua deleted the feat/issue-2228 branch October 23, 2026 12:12
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.

feat(MPE-06): Legacy models fold in the picker

1 participant