Skip to content

fix(native-chat): a Claude chat keeps a model its CLI stopped listing - #30436

Merged
brennanb2025 merged 7 commits into
mainfrom
brennanb2025/claude-keep-unlisted-model
Oct 19, 2026
Merged

brennanb2025 merged 7 commits into
mainfrom
brennanb2025/claude-keep-unlisted-model

Conversation

@brennanb2025

@brennanb2025 brennanb2025 commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

ELI5

When Claude Code updated itself, it stopped listing opus[1m] in its model menu, though that model still runs. Orca read "not in the list" as "can't run", so on your next message it quietly moved your Claude chat to another model (Sonnet or plain Opus), sometimes with a different effort. Plain Opus here has a 200k context instead of 1M. Now a chat keeps the model and effort it was on. The picker shows them even when Claude's list no longer has them, and every message runs on them.

What Changed

The problem. Claude Code 2.1.280 auto-updated to 2.1.302, which lists opus but no longer opus[1m]. Chats in the native Chat UI that were on opus[1m], running or reopened, switched to the list's default model on the next Send, and their effort moved to the "nearest" level. Nothing told the user. opus[1m] still runs fine on the newer CLI: an off-list run succeeds, and the switch shrinks the context from 1M to 200k.

Why it happened. The picker treated the model list as authority over the chat's own saved choice. When the list didn't name the chat's model, the shared picker logic derived a replacement: the list's default row with the effort moved to the nearest level. The picker showed it, every send carried it, and the host saved it. #30022 already narrowed this once for the same incident, but a reopened chat still hit it. A list that lacks a model is not evidence the model can't run.

What you see now.

  • A Claude chat on a model its CLI no longer lists keeps that model. It shows in that chat's picker as a selected-only entry (named by its id), and only in that chat. The other entries are exactly what Claude lists.
  • The chat's effort under that model shows as read-only text, named the way a listed model names that level (for example "Reasoning effort Max"), because no list says which levels that model takes. There is no guessed menu, and the effort is never moved. It reads the same while the chat is running as while it's stopped.
  • Every message runs on that model and effort, on desktop and phone.
  • New chats behave as on main. With nothing saved, a new chat starts on the list's default. A new Claude chat whose remembered default model the host's saved list no longer names starts on the list's default, with its effort moved to the nearest level offered. That's main's fallback, now applied by the host when it seeds the chat, so desktop, phone and CLI launches all get it. It never applies to a chat's own saved or running model.
  • If the agent itself refuses the model (a real model_not_found reply from Claude, or an option ACP agents or Pi couldn't take), the failed message shows as it does today, the running chat moves to what the agent now runs, and the picker shows that. The next message saves it. Nothing is resent automatically.

Unchanged: listed models with no effort control (Haiku) still show no effort. A model you pick still runs as picked. Codex, ACP agents and Pi never had their model replaced, and what they send is unchanged.

Intended differences for every agent (Codex, ACP agents, Pi included):

  • (a) A chat on a model its list doesn't name shows its saved effort as read-only text. The common pattern renders a kept, unavailable model's saved option as label and value text the same way. For Codex this is new: on main such a chat showed no effort. The text is the effort the chat already launches with, so nothing it sends changes.
  • (b) The options answer skips options the running child refused, so the picker shows what runs. This uses the restore-failure list ACP agents and Pi already keep, as well as Claude's.

Intended: the new-chat fallback now runs on the host, so it applies to every way of creating a chat. That covers desktop, phone, the CLI's orca agent launch and orchestration's worker-start --agent claude when they don't pass --model. On main only desktop and phone moved such a chat off the remembered unlisted model; CLI and worker creates kept it and failed or ran on it. To launch on a specific model anyway, pass --model.

How (the mechanism).

  1. The shared picker view no longer derives a replacement (structuredAgentSessionListedPicks and nearestAgentEffort are deleted). The client-only "verified ids" state that fed it goes too, except the ids a chat's own options answer lists. Those now only tell an unlisted model from a listed one, for the read-only effort.
  2. When the shown model is one the chat's own answer doesn't list and the chat holds an effort for it, the snapshot adds a read-only effort with that one value, labelled as listed rows label it. Desktop and phone render it as text, not a control. A live child with no listing of its own gets the saved listing's ids in its answer, the same ones the stopped chat's answer carries, so the row doesn't flip when the chat starts.
  3. Host: the options answer already shows the saved pick over the live child's report. It now skips keys the running child couldn't take (the existing restore-failure list, which a model_not_found reply fills), so the picker shows what actually runs.
  4. Host, for older clients: a reopened chat's agentSession.modelCatalog read also lists that chat's own saved model as a row. Released clients (desktop v1.4.226–229, the shipped phone app) verify against this answer, so they keep the model too.
  5. Host, new chats: when the host seeds a new Claude chat from the remembered default, a model its saved, finished listing no longer names moves to that listing's default row (else its first), effort to the nearest level. This happens after the create's fingerprints, so retries replay as before. A model the create itself names is left alone.

Why

The bug class is "the list decides the chat's model". A second guard on the replacement (#30022 was the first) would leave the class in place, so this removes the replacement from the chat's own selection instead. What remains is only the new-chat seeding fallback main already had, now in the one place the host seeds. The common pattern replaces an absent selection with the default unless the selection is kept as a selected-only entry. Intended difference: we always keep the chat's own selection, because a real CLI update produced exactly this state, the model still ran, and the replacement cost real context. The common pattern also keeps a preferred effort the model's row says nothing about, which matches the read-only effort.

Considered and rejected:

#30107 is the broader follow-up redesign of this area. This PR fixes only the incident and lands first.

Mixed versions. There is no new wire field, opcode or saved field.

  • New client, older host: the client keeps the model, as before fix: a Claude model that's gone switches to the list's default when you send #27826.
  • Older client (v1.4.226–229), new host: a reopened chat's catalog read names its model, so that client's own replacement finds it and keeps it.
  • Old-client gap, accepted: v1.4.226–229 can still replace the model of any chat that client created, while that chat stays open (its catalog read names a workspace, so it gets no extra row), or a running model that came from the user's own Claude config with no saved pick. Updating the client fixes it.
  • Temporary gap, new client on a v1.4.228/229 host: a truly retired saved model (the provider refuses it) keeps showing, and each restart fails its first message once until the user picks another model. The same goes for new chats: such a host has no new-chat fallback, so a truly retired remembered model stays, and each new chat's first message fails until the user picks a model. It needs both a provider-retired model and an older host, and the user sees the failure and can pick another model. Upgrading the host removes it. No follow-up lane is planned.

Linked Issue

Tracked in STA-10947.

Visual Proof

Electron QA on another machine with real signed-in Claude Code, branch compared with main (full list in the review status comment).

Chat on opus[1m] after the CLI stopped listing it: the model is kept, effort is read-only, and the reply runs on them.
incident picker
incident reply

New chat from a remembered opus[1m], branch then main (same fallback):
new chat branch
new chat main

Testing

  • structured-agent-session-option-view.test.ts: the incident as a flow. A chat on opus[1m] at max, under a list naming only plain opus, shows opus[1m] and a read-only max through a refresh and a live answer, and every send carries { model: 'opus[1m]', effort: 'max' }. A listed Haiku shows no effort. A new chat with an unlisted remembered model names no other model.

  • use-mobile-structured-agent-session-send.test.tsx: the same on the phone, through the real hooks, ending in a send carrying the literal model and effort.

  • structured-agent-session-options-read.test.ts (RPC): a reopened chat's catalog read lists its own model. A new chat's read and the account's read list only the CLI's.

  • claude-structured-retired-saved-model.test.ts: after a real model_not_found reply, the options answer no longer shows the retired model. I confirmed this assertion fails without the change.

  • Updated the tests that asserted the replacement (send options, launch create, catalog application).

  • Ran locally: pnpm tc:node, pnpm tc:web, the mobile typecheck, and the named test files above plus the related option, permission, picker, send-options and retired-model files. All passed.

  • Not run: full lint (CI), the full suites (CI), and the real Claude CLI tests (no src/main/claude/claude-structured-* file changed).

  • I manually tested these changes locally

  • Automated tests added/updated, or explained why not below

AI Disclosure

Review

Agent skill upstream boundary

  • Not applicable, or this change copies or mechanically translates no upstream skill-installer source, tests, fixtures, registry entries, path tables, comments, or documentation.

Notes

  • Author: Brennan Benson (X: @BrennanKB5)
  • SSH / paired servers: the host that owns the chat decides; see Mixed versions.
  • Mobile: same shared logic. The phone's options row shows the read-only effort as text with no page behind it.
  • Cross-platform: pure logic and one text row.
  • Performance: no new reads. The catalog row is one array check per read.

Checklist

  • This PR is small and focused
  • I explained what changed and why (ELI5, the user-facing before/after, the mechanism, and why over the alternatives)
  • Before/after screenshots or videos attached for UI changes, or N/A with reason
  • Self-reviewed for correctness, security, and performance
  • Cross-platform, SSH/remote, and path/shortcut impact considered (or N/A)
  • pnpm lint, pnpm typecheck, pnpm test, and pnpm build pass (or CI will cover; local preferred)

Claude Code 2.1.302 stopped listing opus[1m], which still runs, and chats on
it moved to the list's default on the next send, effort remapped. The picker
no longer derives a replacement from the list: the chat's own model shows as
a selected-only entry, its effort read-only, and every send carries both.

A real model_not_found reply still recovers: the options answer shows what
the reset child runs, so the next send records it. A reopened chat's catalog
read lists its own model so older clients that replace one keep it too.

Tracked in STA-10947.
@brennanb2025
brennanb2025 marked this pull request as ready for review October 18, 2026 22:16
@coderabbitai

coderabbitai Bot commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: f5d60f1f-4705-4bea-b3ca-36fdd42587ff
📥 Commits

Reviewing files that changed from the base of the PR and between ce2eed4 and 06c2c4d.

📒 Files selected for processing: 4
  • src/main/runtime/rpc/methods/orchestration/worker/structured-worker-launch-seed-options.test.ts
  • src/main/runtime/rpc/methods/structured-agent-session-create.ts
  • src/main/runtime/session-tabs/structured-launch-seed-listing.ts
  • src/shared/structured-agent-session-unlisted-effort.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 1 remain after this review.

📝 Walkthrough

Shared option views retain unlisted model and effort picks instead of substituting listed picks. Runtime reads add an eligible session model to its catalog and use saved values when restore does not report failures. Claude launch seeds adapt to available saved catalog listings. Mobile and renderer clients display single-choice read-only values as text.

Priority: ⬇️ Low

Merge Risk: ⚪ Minimal · up to 06c2c

The change keeps a Claude chat on its saved model and effort when the CLI no longer lists them. Resumed chats are not affected by the new-chat fallback. No actionable merge-blocking risk remains from the supplied review evidence.

Pre-merge checks: Passed 4 · Failed 1

Failed Failed checks: 1 warning

Check name Status Explanation Resolution
Docstring Coverage Warning Docstring coverage is 51.52% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 33 functions across 32 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
Passed Passed checks: 4 passed
Check name Status Explanation
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Title check Passed The title clearly identifies the primary fix: preserving a Claude chat model after the CLI stops listing it.
Description check Passed The description is detailed and covers the user impact, implementation, rationale, compatibility, visual proof, testing, and checklist items. It references issue STA-10947, although it does not use th…
Full details: Description check

Explanation

The description is detailed and covers the user impact, implementation, rationale, compatibility, visual proof, testing, and checklist items. It references issue STA-10947, although it does not use the template's requested Fixes # issue link. The AI Disclosure and Review sections are also empty, but these omissions do not make the description incomplete overall.

  • Fix all pre-merge checks with AI
✨ Finishing Touches: 💡 1
📝 Generate docstrings: 💡
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 2


ℹ️ Review info
⚙️ Run configuration
  • Configuration used: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 6edb82fa-4bbf-49d3-9611-dac8553f5cce
📥 Commits

Reviewing files that changed from the base of the PR and between bad74e1 and 411a550.

📒 Files selected for processing: 26
  • mobile/src/session/MobileNativeChatSessionOptionPickers.tsx
  • mobile/src/session/MobileNativeChatSessionOptionRows.tsx
  • mobile/src/session/use-mobile-structured-agent-options.first-frame.test.ts
  • mobile/src/session/use-mobile-structured-agent-options.permission-mode.test.ts
  • mobile/src/session/use-mobile-structured-agent-options.test.ts
  • mobile/src/session/use-mobile-structured-agent-options.ts
  • mobile/src/session/use-mobile-structured-agent-session-send.test.tsx
  • mobile/src/session/use-mobile-structured-option-surface.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-options-read.ts
  • src/main/runtime/claude-structured-retired-saved-model.test.ts
  • src/main/runtime/rpc/methods/structured-agent-session-options-read.test.ts
  • src/main/runtime/rpc/methods/structured-agent-session-options-read.ts
  • src/renderer/src/components/native-chat/NativeChatSessionOptionRows.tsx
  • src/renderer/src/components/native-chat/use-structured-agent-session-option-state.ts
  • src/renderer/src/components/native-chat/use-structured-agent-session-send-options.test.tsx
  • src/renderer/src/components/native-chat/use-structured-agent-session-send-options.ts
  • src/renderer/src/lib/structured-agent-session-launch-create-message.test.ts
  • src/renderer/src/lib/structured-agent-session-launch-create-message.ts
  • src/shared/native-chat-session-options.ts
  • src/shared/structured-agent-session-model-catalog-application.test.ts
  • src/shared/structured-agent-session-option-view.test.ts
  • src/shared/structured-agent-session-option-view.ts
  • src/shared/structured-agent-session-options.test.ts
  • src/shared/structured-agent-session-options.ts
  • src/shared/structured-agent-session-permission-option.test.ts
  • src/shared/structured-agent-session-unlisted-effort.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 0 remain after this review.

Comment thread src/shared/structured-agent-session-options.ts
…red model falls back as on main

- The read-only value predicate keys on the effort row, so the phone's legacy
  host Permissions row opens as before.
- The desktop read-only effort row honours a row kept from the previous model.
- A live child with no listing of its own answers with the saved listing's
  ids, so the read-only effort reads the same live and at rest.
- The read-only effort borrows listed rows' effort label and level names.
- The host seeds a new Claude chat from a remembered default the saved listing
  no longer names on that listing's default, effort nearest, as main did; a
  chat's own saved or running model is never replaced.

Tracked in STA-10947.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to GitHub limitations.

⚠️ Outside diff range comments (1)

🟡 Minor · Drop the effort when the model restore fails. · structured-agent-session-options-read.ts:271-281

src/main/native-chat/agent-session-wire/structured-agent-session-options-read.ts:271-281
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Drop the effort when the model restore fails.

When Claude reports model_not_found, the child switches to its default model, but shownSaved('effort') remains true. The reader therefore returns the replacement model with the old model's effort. The option view records that pair, and Claude sends both values on later messages. Claude's own option code states that an effort can remain from the old model even when the new model does not support it.

Treat a model restore failure as invalidating the saved effort and omit the live effort before building current.

Suggested fix
   const saved = record?.options
   const shownSaved = (key: 'model' | 'effort'): boolean =>
-    saved?.[key] !== undefined && !refused.includes(key)
+    saved?.[key] !== undefined &&
+    !refused.includes(key) &&
+    !(key === 'effort' && refused.includes('model'))
   const selected = live && (shownSaved('model') || shownSaved('effort')) ? await atRest() : options
+  const { effort: _staleEffort, ...liveWithoutEffort } = options.current
   const current = {
-    ...options.current,
+    ...(refused.includes('model') ? liveWithoutEffort : options.current),
     ...(shownSaved('model') ? { model: selected.current.model } : {}),
     ...(shownSaved('effort') ? { effort: selected.current.effort } : {})
   }

ℹ️ Review info
⚙️ Run configuration
  • Configuration used: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 1083e5da-bb57-4a30-9d8d-f81e804478a3
📥 Commits

Reviewing files that changed from the base of the PR and between 411a550 and ce2eed4.

📒 Files selected for processing: 10
  • src/main/claude/claude-structured-effort-default-at-rest.test.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-option-models.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-options-read.test.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-options-read.ts
  • src/main/runtime/rpc/methods/orchestration/worker/structured-worker-launch-seed-options.test.ts
  • src/main/runtime/rpc/methods/structured-agent-session-create.ts
  • src/main/runtime/session-tabs/structured-launch-seed-listing.ts
  • src/renderer/src/components/native-chat/NativeChatSessionOptionRows.tsx
  • src/shared/native-chat-session-options.ts
  • src/shared/structured-agent-session-unlisted-effort.ts
🚧 Files skipped from review as they are similar to previous changes: 2
  • src/shared/native-chat-session-options.ts
  • src/renderer/src/components/native-chat/NativeChatSessionOptionRows.tsx

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 0 remain after this review.

…model; one guard

- An at-rest create carrying an effort but no model, on a remembered model
  the saved listing no longer names, now moves that effort to the nearest
  level the fallback model offers, as main did.
- A create whose own options name no model, and whose merged options carry
  none, reads no listing.
- The seed fallback keeps one guard and no unreachable branch.
- The read-only effort finds its level's name in any listed model's choices.

Tracked in STA-10947.
@brennanb2025

Copy link
Copy Markdown
Contributor Author

Review loop status: ready on df5a3d3

The problem. Claude Code auto-updated from 2.1.280 to 2.1.302, and the new version no longer lists opus[1m] in its model menu, though the model still runs. Orca treated "not in the list" as "can't run": on the next message, running and reopened Claude chats on opus[1m] quietly moved to the list's default (plain Opus, 200k context instead of 1M), and their effort moved to the "nearest" level.

What changes for the user. A chat keeps the model and effort it was on. The picker shows that model as an entry only that chat has, and shows its effort as read-only text labelled like a listed model's effort row. Every message runs on them, on desktop and phone. A new chat whose remembered model the list no longer names starts on the list's default, as on main. A model Claude really refuses still shows the failed turn, then the picker shows what actually runs.

Review. Three rounds plus a readiness check, all with Claude reviewers.
Fixed during review:

  • The phone's "Host's Agent Permissions" row (hosts on 1.4.224 or older) had stopped opening: the new read-only check matched it too.
  • A stale "Effort Max" line stayed under Haiku after switching models with the picker open.
  • A Codex chat's read-only effort disappeared when the chat started; it now reads the same stopped and running.
  • On the phone the effort level read as raw text ("max") instead of "Max".
  • New chats from an unlisted remembered model: they now fall back as on main. Per the lane's ruling, this replaces an earlier version that failed their first message with Claude's raw error.
  • The options read threw an error for a running chat with no saved record (caught by CI).
  • Two type casts in a test, and tests that asserted the old behavior.

Deferred, P3 or unproven: one extra saved-list read per options call when nothing is saved; a stopped chat's saved list could disagree with a running child after a failed listing; the new-chat fallback test covers the helper, not the create step around it. Labelled in the PR body: the read-only effort and the "show what runs" answer apply to every agent (intended); the new-chat fallback now covers orca agent launch and worker-start without --model (intended; pass --model to keep a specific one); gaps with older hosts and clients (temporary or accepted, listed under Mixed versions).

Verified.

  • Full PR workflow green on df5a3d3 (PR Checks run 39175466507), Mobile Checks green, mergeable.
  • Electron QA on the M4Air with real signed-in Claude Code, built from 06c2c4d and rebuilt at df5a3d3 for the incident flow and Codex, compared with main:
    • an opus[1m] chat kept its model and a read-only Max/High, and sent the literal model and effort with real replies;
    • the effort line clears after picking Haiku;
    • a new chat from a remembered opus[1m] starts on Opus/Max with a real reply, the same on main;
    • Haiku shows no effort, as on main;
    • the Codex menus are identical to main;
    • no effort text lag (placeholder about 89 ms).
  • An earlier QA run on 411a550 covered restarts from 2.1.280 into 2.1.302.
  • QA marked the label "Effort" as a fail against the spec's "Reasoning effort". The spec was wrong: the read-only row copies the listed rows' label, and Claude's listed rows say "Effort".

Not verified. The phone app and a 1.4.224-or-older host (no rig; covered by named tests only), a Codex chat on an unlisted model in the real app (couldn't be set up; covered by the stopped-equals-running host test), SSH and WSL.

For Brennan's review

Incident chat after the CLI update, before Send, and its reply:
incident picker
incident reply
Effort clears after picking a listed model:
switch to listed
New chat from a remembered opus[1m], branch and main:
new chat branch
new chat main
Codex and Haiku, branch and main:
codex branch
codex main
haiku branch
haiku main

Where a human judgment matters:

  1. src/main/runtime/session-tabs/structured-launch-seed-listing.ts: the new-chat fallback runs on the host, so CLI and worker launches without --model now also move off an unlisted remembered model (on main they kept it).
  2. src/shared/structured-agent-session-unlisted-effort.ts: the read-only effort applies to every agent, so a Codex chat on an unlisted model now shows its effort (on main it showed none).
  3. src/main/native-chat/agent-session-wire/structured-agent-session-options-read.ts: a running chat with no list of its own borrows the saved list's ids, so stopped and running look the same; the picker also stops showing an option the running child refused.

@brennanb2025
brennanb2025 merged commit 0322185 into main Oct 19, 2026
34 checks passed
brennanb2025 added a commit that referenced this pull request Oct 19, 2026
…#30436)

* fix(native-chat): a Claude chat keeps a model its CLI stopped listing

Claude Code 2.1.302 stopped listing opus[1m], which still runs, and chats on
it moved to the list's default on the next send, effort remapped. The picker
no longer derives a replacement from the list: the chat's own model shows as
a selected-only entry, its effort read-only, and every send carries both.

A real model_not_found reply still recovers: the options answer shows what
the reset child runs, so the next send records it. A reopened chat's catalog
read lists its own model so older clients that replace one keep it too.

Tracked in STA-10947.

* test(mobile): drop the send-options capability the options hook no longer reads

* test: an unlisted model's saved effort shows read-only at rest, as live, for every agent

* fix(native-chat): round-1 review fixes; a new chat's unlisted remembered model falls back as on main

- The read-only value predicate keys on the effort row, so the phone's legacy
  host Permissions row opens as before.
- The desktop read-only effort row honours a row kept from the previous model.
- A live child with no listing of its own answers with the saved listing's
  ids, so the read-only effort reads the same live and at rest.
- The read-only effort borrows listed rows' effort label and level names.
- The host seeds a new Claude chat from a remembered default the saved listing
  no longer names on that listing's default, effort nearest, as main did; a
  chat's own saved or running model is never replaced.

Tracked in STA-10947.

* test: pin the new-chat seed fallback on its typed helper, with no casts

* fix(native-chat): round-2: a carried effort moves with a fallen-back model; one guard

- An at-rest create carrying an effort but no model, on a remembered model
  the saved listing no longer names, now moves that effort to the nearest
  level the fallback model offers, as main did.
- A create whose own options name no model, and whose merged options carry
  none, reads no listing.
- The seed fallback keeps one guard and no unreachable branch.
- The read-only effort finds its level's name in any listed model's choices.

Tracked in STA-10947.

* fix(native-chat): a live options read with no record borrows no saved ids and never throws

(cherry picked from commit 0322185)
nachumi-a2zoperations added a commit to A2Z-Operations/orca that referenced this pull request Oct 20, 2026
Resolution groups:
1. Revert-caused conflicts (29 files under acp, ai-vault, native-chat, pi,
   claude, codex, runtime/rpc, renderer ai-vault, shared ai-vault, mobile
   picker): upstream side taken. Our side carried only upstream release-branch
   commits there (2213562, c361d26, bb20d8f, 42e1469), none of ours.
   Files deleted on one side follow upstream (3 restored, 3 removed).
   Also aligned to v1.4.232: 40 files that auto-merged but still carried the
   stablyai#29977 revert (c361d26) or a duplicated stablyai#30436 test block (bb20d8f);
   no fork or PR commit touches them.
2. package.json: upstream (version 1.4.232); no own change on our side.
3. cloud-operate-relay-production-reserve-watch.yml: upstream. 5974258 is an
   upstream "match main's workflow files" commit; .github now equals v1.4.232.
4. src/main/updater/updater-setup.ts: upstream structure (macOS ShipIt
   scheduling, stablyai#30944) plus our kill-switch import; the early returns in both
   check entry points and setupAutoUpdater auto-merged unchanged.
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