Skip to content

Keep a chat's accepted model options in what it shows and sends - #31208

Merged
brennanb2025 merged 15 commits into
mainfrom
brennanb2025/chat-pick-held-create
Oct 29, 2026
Merged

brennanb2025 merged 15 commits into
mainfrom
brennanb2025/chat-pick-held-create

Conversation

@brennanb2025

@brennanb2025 brennanb2025 commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

A model, effort or Fast choice made while a chat was being created could later revert when an older request completed. An open window could also send a different choice from the one it showed after another client changed the chat. This change keeps accepted choices with the chat, applies newer choices in order, and captures each message’s accepted selection when it is sent.

  • Choices made during creation remain available for later messages; the opening message keeps the selection captured when it was submitted.
  • Query answers own the current chat values. Catalog refreshes supply labels and capabilities without turning provider observations into accepted choices.
  • Structured-chat pickers remain usable during a reply, and the next message carries the accepted choice. Terminal chats keep their existing restriction while commands are running.
  • New clients send the complete accepted model, effort, Fast and speed selection only when the host advertises support. Existing clients and hosts keep their supported request paths; older hosts retain their existing capture limitations.

Changed default: when a chat has no saved or seeded Fast choice, new hosts show Fast off and apply false. This also affects older clients connected to a new host. Saved Fast on and off choices are preserved; older hosts retain their existing behavior.

A Codex message with a different effective speed is accepted and queued immediately, then runs in the next compatible turn. Messages at the same speed can still join the running turn. The configured default speed stays intact.

The shared Send correction tracked in #31927 is merged and adopted here. Native request compilation and applied-input knowledge remain owned by that shared implementation. No saved-data migration or minimum paired-server version is introduced.

Tracked in STA-10852, STA-11443, #30561 and #28046. The remaining launch-registry performance issue is tracked in STA-11837; held-option settlement now bypasses its global notifier.

Validation on reviewed head 89c5c9b: the complete CI watch passed, including all ten root test shards, static analysis/typechecking, mobile verification and WSL. The latest test-only repair passed 91 targeted tests across five named files and the normal commit hook. Full-path correctness, reference and readiness/performance reviews completed within terminal round 6; the terminal design ruling retained this implementation. Independent execution review confirmed that the compiler ran, the specific Bun cold store/controller cases passed, and the eight required mobile files passed all 135 cases and both type gates.

Real Windows QA carried saved Claude and Codex chats from the previous build through a graceful restart and obtained two new replies each. Both agents completed held-create and follow-up flows; Claude's opening was captured once and retained its selection. The longer artificial holds reached the existing uncertainty deadline, so prompt handback was expected. A targeted Claude Fast Off→On run obtained a real next reply and proved that native Fast=true was acknowledged and read back as effective=true. That reply nevertheless reported Fast off, reason preference, and standard speed; provider Fast execution is not claimed. Independent matching-CLI and main-parity analysis identifies this as an inherited availability/application discrepancy: the earlier baseline also returned standard with Fast selected, and incoming main retains the same native path. The baseline did not capture a raw preference-reason frame or native acknowledgement; main parity is a source comparison, not a new main replay. The verified result for this PR is exact capture, successful native application and a real reply. Provider Fast execution is not claimed, and no unsupported-account or opt-in cause is inferred. The inherited discrepancy is tracked in STA-12849; no rig fault or PR caller defect was established.

The QA runtime head is ac6e39a. Commit 4ccdfac changes a type annotation and test proofs; 89c5c9b changes only test fixtures/project placement. Their bounded delta reviews confirmed unchanged runtime behavior. All test copies stopped gracefully with zero owned survivors; five real-config hashes stayed unchanged. No second full QA round was run.

A pick held while a new chat is created is committed into the chat's
active option record once accepted, through the same step a normal pick
takes, and older options reads are dropped. The host also publishes the
chat's saved effort, Fast and speed as optional status fields so another
device's pick moves the option stamp and re-reads options.
@brennanb2025
brennanb2025 marked this pull request as ready for review October 20, 2026 20:23
@coderabbitai

coderabbitai Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
Walkthrough

This change adds selection payloads to structured-session create and send requests. It adds shared schemas, accepted-input-source metadata, and selection controllers for queued option changes. Renderer and mobile hooks capture option selections with sends, while launch flows can include selections in first messages. Runtime calls now carry pairing-revision context, and option reads and status summaries track additional option fields. Tests cover selection validation, capture, controller lifetimes, launch behavior, and runtime transitions.

Priority: Normal

Merge Risk: High · up to aa2ea

Phone chats can lose their selected model after a connection path migration, and the mobile CI checks currently fail. Fix the migration state handling and the failing tests before merging. Smaller follow-ups remain on the opening-message echo fingerprint and on error handling when options are set during legacy launches.

Pre-merge checks: Passed 4
Check name Status Explanation
Title check Passed The title clearly summarizes the main change: keeping accepted model options consistent between the chat display and sent messages.
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.
Description check Passed The description clearly explains the problem, implementation, behavior changes, compatibility impact, known limitation, linked work, and extensive validation. It does not follow the repository templat…
Full details: Description check

Explanation

The description clearly explains the problem, implementation, behavior changes, compatibility impact, known limitation, linked work, and extensive validation. It does not follow the repository template headings and omits explicit Visual Proof, AI Disclosure, Agent skill upstream boundary, and Checklist entries. These omissions are minor because the core required context is present.

Finishing Touches: 💡 1
🛠️ Fix failing CI checks: 💡
  • Commit to this branch
  • Create a new PR
📝 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: c5c4ec59-d327-4b4a-a598-22219a2c65d4
📥 Commits

Reviewing files that changed from the base of the PR and between c2cbdbd and 061a57b.

📒 Files selected for processing: 68
  • mobile/src/session/mobile-structured-agent-session-host-support.ts
  • mobile/src/session/mobile-structured-agent-session-rpc.ts
  • mobile/src/session/mobile-structured-agent-session-send.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.ts
  • mobile/src/session/use-mobile-structured-option-surface.ts
  • mobile/src/session/use-mobile-structured-selection-controller.ts
  • mobile/src/session/use-mobile-structured-send-with-outcome.ts
  • mobile/src/session/use-mobile-structured-session-option-stamp.ts
  • src/main/codex/codex-structured-message-options.test.ts
  • src/main/codex/codex-structured-message-options.ts
  • src/main/codex/codex-structured-session-adapter.ts
  • src/main/codex/codex-structured-turn-start.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-adapter-router.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-adapter.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-create.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-delivery-context.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-delivery-loop.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-execution-options.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-host-mutations.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-message-options.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-mutation-plans.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/native-chat/agent-session-wire/structured-agent-session-queued-message-rig-provider.test-fixture.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-queued-messages.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-send-options.test.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-startup-attempt.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-status-summary-equality.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-status-summary.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-steer-while-stopping.test.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-turns.ts
  • src/renderer/src/components/native-chat/StructuredAgentSessionStatusBridge.test.tsx
  • src/renderer/src/components/native-chat/StructuredAgentSessionStatusBridge.tsx
  • src/renderer/src/components/native-chat/structured-agent-session-message-sender.ts
  • src/renderer/src/components/native-chat/structured-agent-session-pending-sends.ts
  • src/renderer/src/components/native-chat/structured-agent-session-send-attempt.ts
  • src/renderer/src/components/native-chat/structured-agent-session-send-slot.ts
  • src/renderer/src/components/native-chat/use-structured-agent-session-option-state.ts
  • src/renderer/src/components/native-chat/use-structured-agent-session-options.test.tsx
  • src/renderer/src/components/native-chat/use-structured-agent-session-options.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/components/native-chat/use-structured-agent-session-sends.ts
  • src/renderer/src/components/native-chat/use-structured-agent-session.ts
  • src/renderer/src/lib/launch-structured-agent-session.ts
  • src/renderer/src/lib/structured-agent-session-launch-create-call.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/renderer/src/lib/structured-agent-session-launch-lifecycle.ts
  • src/renderer/src/lib/structured-agent-session-launch-options.test.ts
  • src/renderer/src/lib/structured-agent-session-launch-options.ts
  • src/renderer/src/lib/structured-agent-session-launch-registry.ts
  • src/renderer/src/lib/structured-agent-session-selection-controller.ts
  • src/renderer/src/runtime/structured-agent-session-client.ts
  • src/shared/agent-session-create-capabilities.ts
  • src/shared/agent-session-execution-options.ts
  • src/shared/agent-session-status-option-stamp.ts
  • src/shared/agent-session-wire.ts
  • src/shared/rpc-contract/structured-agent-session-agent-params.test.ts
  • src/shared/rpc-contract/structured-agent-session-identifiers.ts
  • src/shared/rpc-contract/structured-agent-session-params.ts
  • src/shared/structured-agent-session-create.ts
  • src/shared/structured-agent-session-option-view.ts
  • src/shared/structured-agent-session-selection-operations.test.ts
  • src/shared/structured-agent-session-selection-operations.ts
  • src/shared/structured-agent-session-send-mutation.ts

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

@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: 1


ℹ️ Review info
⚙️ Run configuration
  • Configuration used: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: f63461a4-c112-4cfd-9187-fc94d63eebbb
📥 Commits

Reviewing files that changed from the base of the PR and between 5ac6730 and e5177fc.

📒 Files selected for processing: 2
  • src/main/codex/codex-structured-message-options.test.ts
  • src/main/codex/codex-structured-message-options.ts

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

@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)

🟠 Major · Allow accepted model-only messages to use the… · codex-structured-message-options.ts:30-38

src/main/codex/codex-structured-message-options.ts:30-38
🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Allow accepted model-only messages to use the provider default effort.

An accepted delayed message can contain a model without an effort. If another client stores an effort and the captured model has no applicable default, this guard throws before turn/start. The resolver already preserves the captured model and removes effort in this case. Limit the guard to messages without a captured model.

Suggested fix
-  if (choices.effort === undefined && priorEffort && !defaultEffort) {
+  if (
+    choices.effort === undefined &&
+    priorEffort &&
+    !defaultEffort &&
+    choices.model === undefined
+  ) {
     throw new AgentSessionOptionRejectedError(new Error('codex default effort is unavailable'))
   }

ℹ️ Review info
⚙️ Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 97ce3b24-735c-49a0-be55-c3429ac97cc1
📥 Commits

Reviewing files that changed from the base of the PR and between e5177fc and 1ef826d.

📒 Files selected for processing: 3
  • src/renderer/src/components/native-chat/NativeChatSessionOptionPickers.mid-turn.test.tsx
  • src/renderer/src/components/native-chat/NativeChatSessionOptionPickers.test.tsx
  • src/renderer/src/components/native-chat/NativeChatSessionOptionPickers.tsx

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

@greptile-apps

greptile-apps Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

RetriggerView in GreptileConfidence Score: 5/5

[Medium impact] The changes since the previous review appear safe to merge.

Summary

Keeps each chat’s accepted choices separate from provider reports and captures those choices when a message is sent.

  • Each structured-chat message keeps the choices its sender accepted.
  • Mobile chats keep picker choices in the messages they send.
  • New hosts show and apply Fast off when a chat has no saved choice.

Both supplied previous threads are unnumbered and resolved. The mobile fixture now supplies sendOptions: false. Legacy launches now return required-choice failures through configurationFailure, preventing the opening prompt from sending.

Diagram

sequenceDiagram
  participant User
  participant Client
  participant Host
  User->>Client: Pick model or options
  Client->>Host: Save choice in order
  Host-->>Client: Accept or refuse choice
  Client->>Host: Read current chat choices
  Host-->>Client: Accepted choices and catalog details
  User->>Client: Send message
  Client->>Host: Message with captured selection
  Host->>Host: Queue or run with captured choices
Loading

Reviews (6) · Last reviewed commit: "test(chat): place affinity integration i..." · Reviewed by Greptile

@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: 5


Review info
Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: fbe043b1-1f84-48e8-9d66-65579dcdea7e
Commits

Reviewing files that changed from the base of the PR and between 1ef826d and aa2eab2.

Files selected for processing: 94
  • mobile/src/session/mobile-structured-agent-session-host-support.ts
  • mobile/src/session/mobile-structured-agent-session-send.ts
  • mobile/src/session/use-mobile-structured-agent-options.lifetime.test.ts
  • mobile/src/session/use-mobile-structured-agent-options.test-fixture.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.ts
  • mobile/src/session/use-mobile-structured-option-state.ts
  • mobile/src/session/use-mobile-structured-option-surface.ts
  • mobile/src/session/use-mobile-structured-selection-controller.ts
  • mobile/src/session/use-mobile-structured-send-with-outcome.ts
  • mobile/src/session/use-mobile-structured-session-option-stamp.ts
  • src/main/codex/codex-structured-message-options.test.ts
  • src/main/ipc/runtime-environments/runtime-environment-selection-affinity.test-fixture.ts
  • src/main/ipc/runtime-environments/runtime-environments-call-routing.test.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-codex-applied-inputs.test.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-create.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-execution-options.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-host-mutations.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-mutation-plans.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-options-read.accepted-inputs.test.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/native-chat/agent-session-wire/structured-agent-session-queued-messages.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-resting-options.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-send-options.test.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-startup-attempt.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-status-summary-equality.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-status-summary.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-turns.ts
  • src/renderer/src/components/native-chat/NativeChatSessionOptionPickers.mid-turn.test.tsx
  • src/renderer/src/components/native-chat/NativeChatSessionOptionPickers.test.tsx
  • src/renderer/src/components/native-chat/NativeChatSessionOptionPickers.tsx
  • src/renderer/src/components/native-chat/native-chat-session-option-settings-write.ts
  • src/renderer/src/components/native-chat/native-chat-subscriptions.performance.test.tsx
  • src/renderer/src/components/native-chat/structured-agent-session-option-first-frame.ts
  • src/renderer/src/components/native-chat/structured-agent-session-options-contract.ts
  • src/renderer/src/components/native-chat/structured-agent-session-pending-sends.ts
  • src/renderer/src/components/native-chat/structured-agent-session-send-attempt.ts
  • src/renderer/src/components/native-chat/structured-agent-session-send-slot.ts
  • src/renderer/src/components/native-chat/use-host-model-catalog-upgrade.test.tsx
  • src/renderer/src/components/native-chat/use-host-model-catalog-upgrade.unavailable.test.tsx
  • src/renderer/src/components/native-chat/use-native-chat-provisional-launch.ts
  • src/renderer/src/components/native-chat/use-structured-agent-session-option-state.ts
  • src/renderer/src/components/native-chat/use-structured-agent-session-options.first-frame.test.tsx
  • src/renderer/src/components/native-chat/use-structured-agent-session-options.learned-default.test.tsx
  • src/renderer/src/components/native-chat/use-structured-agent-session-options.preloaded-agents.test.tsx
  • src/renderer/src/components/native-chat/use-structured-agent-session-options.test-fixture.tsx
  • src/renderer/src/components/native-chat/use-structured-agent-session-options.test.tsx
  • src/renderer/src/components/native-chat/use-structured-agent-session-options.ts
  • src/renderer/src/components/native-chat/use-structured-agent-session-provisional.test.tsx
  • 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/components/native-chat/use-structured-agent-session-sends.ts
  • src/renderer/src/components/native-chat/use-structured-agent-session.ts
  • src/renderer/src/components/native-chat/use-structured-session-selection-reads.ts
  • src/renderer/src/lib/agent-session/launch/structured-agent-session-launch-outcome-tracking.ts
  • src/renderer/src/lib/agent-session/launch/structured-agent-session-launch-registry.ts
  • src/renderer/src/lib/agent-session/launch/structured-agent-session-launch-reload.test.ts
  • src/renderer/src/lib/agent-session/launch/structured-agent-session-launch-reload.ts
  • src/renderer/src/lib/launch-structured-agent-session.ts
  • src/renderer/src/lib/structured-agent-session-launch-action-effort.test-fixture.ts
  • src/renderer/src/lib/structured-agent-session-launch-create-call.ts
  • src/renderer/src/lib/structured-agent-session-launch-create-message.test-fixture.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/renderer/src/lib/structured-agent-session-launch-lifecycle.ts
  • src/renderer/src/lib/structured-agent-session-launch-options.test.ts
  • src/renderer/src/lib/structured-agent-session-launch-options.ts
  • src/renderer/src/lib/structured-agent-session-launch.ts
  • src/renderer/src/lib/structured-agent-session-selection-controller.ts
  • src/renderer/src/lib/structured-agent-session-selection-lifetime.test.tsx
  • src/renderer/src/runtime/runtime-environment-revision.ts
  • src/renderer/src/runtime/runtime-host-contact-regained.test.ts
  • src/renderer/src/runtime/runtime-host-contact-regained.ts
  • src/renderer/src/runtime/runtime-rpc-selection-order.test.ts
  • src/renderer/src/runtime/structured-agent-session-client.ts
  • src/renderer/src/runtime/structured-agent-session-tab-retirement.test.ts
  • src/renderer/src/runtime/structured-agent-session-tab-retirement.ts
  • src/renderer/src/store/slices/worktrees/teardown/purged-structured-launch-retirement.ts
  • src/shared/agent-session-create-capabilities.ts
  • src/shared/agent-session-execution-options.ts
  • src/shared/agent-session-options-result.ts
  • src/shared/agent-session-wire.ts
  • src/shared/rpc-contract/structured-agent-session-params.ts
  • src/shared/structured-agent-session-create.ts
  • src/shared/structured-agent-session-option-state.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-selection-operations.test.ts
  • src/shared/structured-agent-session-selection-operations.ts
  • src/shared/structured-agent-session-send-mutation.ts
Files skipped from review as they are similar to previous changes: 1
  • src/renderer/src/components/native-chat/NativeChatSessionOptionPickers.test.tsx

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

@brennanb2025

Copy link
Copy Markdown
Contributor Author

A choice made while a chat was being created could be replaced by an older request. Another client could also change the chat after the window displayed its choice, causing the next message to use different controls. This PR keeps current choices with the chat, orders accepted updates, and captures each message’s selection at submission. The opening message retains its original capture, while later messages use later accepted choices. The shared Send implementation from merged #31927 owns native application. On capable hosts an unpicked Fast choice means Off; saved choices are preserved, and older hosts retain their supported paths.

The full review ended at terminal round 6. Fixes cover logical ownership across reconnects, held versus attached selection ordering, phone display and permission parity, original-host request outcomes, and message journal identity. The final whole-mechanism comparison is complete; the differences from the common pattern are intended adaptations for independently updated clients and hosts. No open source defect is claimed by the final bounded reviews.

Validation: complete final-head CI passed, including all ten root shards, compiler/static checks, mobile and WSL. Actual Bun execution passed the specific cold store/controller imports and the relocated queue/affinity case; mobile passed all 135 required cases and both type gates. Real Windows lifecycle QA carried prior-build saved Claude and Codex chats through graceful restart, then received two new replies each. Both held-create/follow-up flows completed; Claude retained the opening capture and produced one opening. The targeted Fast step proved exact selection capture, a matching native Fast=true acknowledgement, effective=true readbacks and the same real reply. That reply used standard speed and reported Fast off/preference. Matching-CLI/main-parity analysis identifies the discrepancy as inherited; the earlier baseline also showed selected Fast with an off/standard result, while incoming main retains the native path unchanged. Main parity is source-based, and the baseline did not save a raw reason/ack trace. The lane owner’s scoped acceptance condition closes this PR’s caller/application target; provider Fast execution and the underlying availability cause remain unproved. Separate inherited follow-up: tracked in STA-12849. All copies stopped gracefully with zero owned survivors; five real-config hashes were unchanged.

Reviewed head: 89c5c9b. Runtime QA head: ac6e39a. The intervening 4ccdfac type annotation/proof repair and 89c5c9b test-only repair were independently reviewed; they leave the exercised lifecycle behavior unchanged. Their targeted tests and current-head CI passed.

Deferred P3: on an older host, if original ownership ends after creation, the existing failed-start/Retry wording can be generic. The unsent draft remains and no automatic resend occurs. The inherited lifecycle serializer cost remains tracked in STA-11837; held-option settlements bypass the global notifier, but this PR does not claim to remove that separate cost.

For Brennan’s review

Saved Claude conversation on main, and two real replies after restart on the branch:

Main Claude saved conversation

Branch Claude after restart and two replies

Saved Codex conversation on main, and two real replies after restart on the branch:

Main Codex saved conversation

Branch Codex after restart and two replies

Held creation followed by a distinct real reply (Claude caption is not proof of provider Fast execution):

Claude held creation and follow-up

Codex held creation and follow-up

Targeted Fast Off→On and the one next reply. These show the UI choice and completed reply; native telemetry reported standard speed, so the images do not prove provider Fast execution.

Claude Fast Off

Claude Fast On

Claude real next reply

@brennanb2025
brennanb2025 merged commit 2e38249 into main Oct 29, 2026
57 checks passed
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