EPIC Context
- Parent: none — standalone
- Epic goal: Offer a reproducible Claude Opus 5 pin while preserving aliases and saved configurations.
- This ticket's role: Extend the shared Claude catalog and its persistence/launch regression coverage.
- Depends on: none Enables: operators can select and persist
claude-opus-5 across both model-selection surfaces.
- Contracts to respect/expose:
MODEL_OPTIONS.claude remains the single catalog; opus remains the first concrete option; valid saved model values must survive normalization and launch unchanged.
- Out of scope here (later tickets): Claude effort controls, free-text models, provider profiles, and all non-Claude catalog changes.
Goal
Make Claude Opus 5 selectable as an explicit pinned model in QuadWork, while preserving the existing opus (latest) alias and every saved agent configuration. An operator must be able to choose claude-opus-5 from both model-selection surfaces, persist it, and have the Claude Code PTY launch with that exact model argument.
Scope
- Add
{ value: "claude-opus-5", label: "claude-opus-5" } to MODEL_OPTIONS.claude in src/lib/agentModels.ts, immediately after claude-fable-5 and before the 4.x pins. Do not reorder opus; it remains the first concrete Claude option.
- Keep the CLI-default behavior and do not silently migrate saved
opus or Opus 4.x values.
- Extend
server/agentModels.test.js to assert the Claude catalog contains the pin, effectiveModel("claude", "claude-opus-5") preserves it, and sanitizeModel("claude", "claude-opus-5") preserves it.
- Add a Butler-normalization regression in
server/agentModels.test.js: normalizeButler({command:"claude", model:"claude-opus-5"}).model remains claude-opus-5.
- Extend the existing Claude branch in
server/agentArgs.gemini.test.js with claude-opus-5; assert buildAgentArgs() emits --model claude-opus-5 and retains the existing permission and MCP arguments.
- Run the full test suite and production build.
Acceptance Criteria
Non-Goals
- Do not remove or replace
opus (latest).
- Do not change the default Claude model, restart running agents, or modify existing project configuration.
- Do not add free-text model entry, provider profiles, non-Claude model changes, or Claude effort controls.
Implementation baseline
Verified on main commit caf94e2 (2026-07-25). Related prior art: #840 added the Opus 4.8 pin; #841 added the current latest-model aliases; #931 made the model selectors backend-aware.
EPIC Context
claude-opus-5across both model-selection surfaces.MODEL_OPTIONS.clauderemains the single catalog;opusremains the first concrete option; valid saved model values must survive normalization and launch unchanged.Goal
Make Claude Opus 5 selectable as an explicit pinned model in QuadWork, while preserving the existing
opus (latest)alias and every saved agent configuration. An operator must be able to chooseclaude-opus-5from both model-selection surfaces, persist it, and have the Claude Code PTY launch with that exact model argument.Scope
{ value: "claude-opus-5", label: "claude-opus-5" }toMODEL_OPTIONS.claudeinsrc/lib/agentModels.ts, immediately afterclaude-fable-5and before the 4.x pins. Do not reorderopus; it remains the first concrete Claude option.opusor Opus 4.x values.server/agentModels.test.jsto assert the Claude catalog contains the pin,effectiveModel("claude", "claude-opus-5")preserves it, andsanitizeModel("claude", "claude-opus-5")preserves it.server/agentModels.test.js:normalizeButler({command:"claude", model:"claude-opus-5"}).modelremainsclaude-opus-5.server/agentArgs.gemini.test.jswithclaude-opus-5; assertbuildAgentArgs()emits--model claude-opus-5and retains the existing permission and MCP arguments.Acceptance Criteria
claude-opus-5for Claude Code agents and Butler.model: "claude-opus-5"; loading or saving unrelated settings does not rewrite existing saved models.--model claude-opus-5while retaining permission and MCP arguments.opus (latest)remains available and remains the first concrete Claude option.npm testandnpm run buildpass.Non-Goals
opus (latest).Implementation baseline
Verified on
maincommitcaf94e2(2026-07-25). Related prior art: #840 added the Opus 4.8 pin; #841 added the current latest-model aliases; #931 made the model selectors backend-aware.