Skip to content

Open native chats on the phone in place - #36315

Merged
brennanb2025 merged 39 commits into
mainfrom
brennanb2025/phone-open-chats
Nov 1, 2026
Merged

brennanb2025 merged 39 commits into
mainfrom
brennanb2025/phone-open-chats

Conversation

@brennanb2025

@brennanb2025 brennanb2025 commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor
Files Added Deleted Net
Test 76 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​7709 $\color{#cf222e}{\Huge{\mathbf{−}}}$​1069 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​6640
Prod 93 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​3480 $\color{#cf222e}{\Huge{\mathbf{−}}}$​973 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​2507

Tapping a native chat in phone Session History could resume it in a terminal, and a notification could not open the chat after its tab was closed. Reopening also exposed races where a delayed close or saved layout write could remove a newer tab. A cold host could incorrectly report a saved chat as gone. A retained History entry could also recreate a stray tab after its workspace was removed.

The phone now opens native chats in place through the same opening policy as desktop Session History, restart offers and existing sender arrows. It follows the conversation's current continuation, reuses an existing tab or reopens the closed chat, and selects the returned chat only for the phone that opened it. The computer and other phones keep their current selection. Notifications can reopen a closed chat after inventory has loaded and the notification's chat identity has been validated.

The shared opening path checks the workspace separately from the saved conversation. If the workspace has been removed, the phone shows its existing workspace-unavailable notice before opening a new tab, chat screen or composer. The conversation, its history and provider identity remain saved. The shared fix also affects desktop History and existing desktop callers: they cannot create a new shared tab under a removed workspace and show the existing localized workspace-unavailable feedback once. There is no new reader, copy, restoration or workspace-recreation flow, and History is not erased.

Desktop and phone use one shared opening policy, with selection handled by the client that requested the chat. Each reopened tab has its own lifetime, so a delayed close cannot remove a newer tab. The same workspace check covers showing the tab, writing its saved layout and completing the open, including a layout write that was already queued when removal began. Stop remains independent of tab bookkeeping, including when showing the chat failed and it displays Retry. Unknown workspace evidence stays unknown.

Compatibility is intended: omitted reveal navigation retains desktop's activating, best-effort behavior. Explicit old-host/schema/method/permission refusals before effects retain History's terminal resume path; an ambiguous timeout never starts an extra resume or an activating retry. Closed-chat notifications need a host that supports caller reveal. Strict caller publication may refuse where the legacy desktop path can still show Retry.

The shared host tab list with per-client selection is an intended adaptation of the common pattern for independently updated paired clients. Legacy/custom IDs remain compatible; a reopened surface receives a distinct lifetime ID. Resolving senders on another computer is temporary and tracked in https://linear.app/stably/issue/STA-12948. Message cards and their phone arrow adapter remain tracked in #36162 and are outside this PR.

Resume on a chat whose workspace was deleted is a temporary limitation, tracked in https://linear.app/stably/issue/STA-13107. Broader behavior for those conversations is deferred; this PR only prevents the stray tab through the existing workspace-unavailable outcome.

CI is green on reviewed head 7ce89cfa28b5522a9dff55daa97b29d4d62ef2f7: static analysis, typecheck and all 12 unit shards, plus Mobile verify. Focused tests cover shared opening, lineage, cold-host lookup, old-host compatibility, delayed writes, close/create and Stop races, worker cleanup and worktree removal. The three older automation Details cases now use a real workspace identity and matching saved records; every case and assertion is unchanged.

Real phone QA used preserved previous-build state and both Claude and Codex. It covered closed History chats opening natively with completed replies while the desktop kept its active Reference view, close/reopen and recovery, Stop during provider startup, worker-stop, and normal worktree removal. Targeted runs of the removed-workspace repair confirmed both retained History taps show the existing notice with no composer and no new target tab, saved layout or pending operation, stable operation/receipt totals, and no observed new target provider process after settled reads. Original History and provider records remain saved. The literal History-reveal/close overlap is covered by a deterministic production-path test; notification routing and compatibility are covered by tests. Controlled localized component captures prove layout only.

Two driver assertions remain recorded as failures with bounded dispositions: an empty inactive workspace remembered its first tab without changing the active desktop view, as permitted by the visibility contract; a zero-count map key disappeared before the observer was ready and more than a minute before the Codex negative tap, with no after-ready target mutation. That omission's cause remains unknown. Exact operation-key/receipt-ID and updatedAt equality is report-only; independently inspected inventories show stable totals and zero target state. Sampled native frames do not establish continuous absence of a flash. The current Codex History/thread metadata and completed reply establish conversation continuity; an unsaved live PID-to-thread observation is not claimed as proof of exclusive process ownership.

Running-app evidence is on ffbcbfaa553ddba5cff9645e71c71307d5e8a172 and the earlier unchanged flow heads identified in the review status. It carries across the test-only commits 5449eb2, 8edb6a6, 7ce89cf and accepted main merge 9174120; these were reviewed, and CI passed on the final head. Screenshots and the complete validation summary are in the review status comment.

@brennanb2025
brennanb2025 marked this pull request as ready for review October 30, 2026 09:28
@coderabbitai

coderabbitai Bot commented Oct 30, 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

No actionable comments were generated in the recent review.

Recent 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: d74b4ef2-8d5c-4149-86a7-63b20a1b7c34
Commits

Reviewing files that changed from the base of the PR and between e6eb836 and b546f38.

Files selected for processing: 1
  • src/main/runtime/rpc/structured-worker-cli.integration.test.ts

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

Walkthrough

The change adds structured-session opening flows for mobile and desktop entry points. It also adds reopened-tab identities and revises how sessions publish, reveal, close, and retire tabs. Saved-layout updates now support admission checks against current workspace state. Tests cover opening outcomes, caller-specific tab selection, publication and close races, and saved-tab cleanup.

Merge Risk: Moderate · up to b546f

Resolve the publication-result inconsistency and restore localized mobile failure messages before merging.

Pre-merge checks: Passed 4 · Failed 1

Failed Failed checks: 1 warning

Check name Status Explanation Resolution
Docstring Coverage Warning Docstring coverage is 38.46% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff with cyclomatic complexity of at least 2. Documenta… Write docstrings for the functions missing them to satisfy the coverage threshold.
Passed Passed checks: 4 passed
Check name Status Explanation
Title check Passed The title clearly and concisely describes the main change: opening native chats in place on mobile.
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 is detailed and covers the user impact, implementation scope, rationale, testing, QA evidence, compatibility, known limitations, and linked tracking issues. It does not reproduce every…
Full details: Description check

Explanation

The description is detailed and covers the user impact, implementation scope, rationale, testing, QA evidence, compatibility, known limitations, and linked tracking issues. It does not reproduce every template heading or checklist item, but the required substantive information is mostly present.

Full details: Docstring Coverage

Explanation

Docstring coverage is 38.46% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff with cyclomatic complexity of at least 2. Documentation-only edits and deletions within surviving functions are included; unchanged diff context and fully deleted functions are excluded. Analyzed 65 functions across 92 files.

Resolution

Write docstrings for the functions missing them to satisfy the coverage threshold.

Finishing Touches
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

@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: 1d7fc9bc-669f-4528-b792-3e6ebf00b594
Commits

Reviewing files that changed from the base of the PR and between 4a0c762 and 22fc43d.

Files ignored due to path filters: 1
  • src/shared/rpc-contract/rpc-params-catalog.generated.ts is excluded by !**/*.generated.*
Files selected for processing: 92
  • mobile/src/agent-history/MobileAgentSessionHistoryPanel.tsx
  • mobile/src/agent-history/agent-history-pending-resume-ownership.test.tsx
  • mobile/src/agent-history/mobile-history-resume-target-preparation.ts
  • mobile/src/agent-history/open-mobile-agent-history-chat.ts
  • mobile/src/session/mobile-structured-session-open-rpc.ts
  • mobile/src/session/open-mobile-structured-session.test.ts
  • mobile/src/session/open-mobile-structured-session.ts
  • mobile/src/session/use-mobile-session-close-actions.test.tsx
  • mobile/src/session/use-mobile-session-close-actions.ts
  • mobile/src/session/use-mobile-session-controller.ts
  • mobile/src/session/use-mobile-session-tab-switching.ts
  • mobile/src/session/use-mobile-structured-session-opening.test.tsx
  • mobile/src/session/use-mobile-structured-session-opening.ts
  • mobile/src/session/use-notification-pane-navigation.test.tsx
  • mobile/src/session/use-notification-pane-navigation.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-host-tabs.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-host-types.ts
  • src/main/persistence/terminal-topology/layout-command-persistence.ts
  • src/main/runtime/agent-session-tab-layout-queue.test.ts
  • src/main/runtime/agent-session-tab-layout-queue.ts
  • src/main/runtime/agent-session/agent-session-tab-identity.ts
  • src/main/runtime/agent-session/agent-session-tab-layout.test.ts
  • src/main/runtime/agent-session/agent-session-tab-layout.ts
  • src/main/runtime/agent-session/agent-session-tab-table.ts
  • src/main/runtime/agent-session/structured-agent-session-close.test.ts
  • src/main/runtime/agent-session/structured-agent-session-close.ts
  • src/main/runtime/agent-session/structured-agent-session-tab-index-seed.ts
  • src/main/runtime/agent-session/structured-agent-session-tab-retirement.ts
  • src/main/runtime/agent-session/structured-session-renderer-close.ts
  • src/main/runtime/client-session-tab-selection.test.ts
  • src/main/runtime/client-session-tab-selection.ts
  • src/main/runtime/construction/runtime-identity-state.ts
  • src/main/runtime/orca-runtime.ts
  • src/main/runtime/orchestration/orchestration-party-location.test.ts
  • src/main/runtime/orchestration/orchestration-party-location.ts
  • src/main/runtime/orchestration/structured-session-lineage.ts
  • src/main/runtime/orchestration/terminal-pane-mail-routing.ts
  • src/main/runtime/rpc/methods/orchestration-structured-worker-session.ts
  • src/main/runtime/rpc/methods/orchestration/caller-show.ts
  • src/main/runtime/rpc/methods/session-tab-mutation-methods.ts
  • src/main/runtime/rpc/methods/structured-agent-session-close-before-create.test.ts
  • src/main/runtime/rpc/methods/structured-agent-session-close-before-create.ts
  • src/main/runtime/rpc/methods/structured-agent-session-close-method.ts
  • src/main/runtime/rpc/methods/structured-agent-session-create-handler.ts
  • src/main/runtime/rpc/methods/structured-agent-session-create.ts
  • src/main/runtime/rpc/methods/structured-agent-session-reveal.test.ts
  • src/main/runtime/rpc/methods/structured-agent-session-reveal.ts
  • src/main/runtime/rpc/methods/structured-agent-session-rpc.test-fixture.ts
  • src/main/runtime/rpc/methods/structured-agent-session-schemas.ts
  • src/main/runtime/rpc/methods/structured-agent-session.test.ts
  • src/main/runtime/rpc/methods/structured-agent-session.ts
  • src/main/runtime/rpc/methods/structured-chat-tab-lifetime.test-fixture.ts
  • src/main/runtime/rpc/methods/structured-chat-tab-lifetime.test.ts
  • src/main/runtime/rpc/methods/structured-chat-tab-table.test-fixture.ts
  • src/main/runtime/rpc/methods/structured-chat-tab-table.test.ts
  • src/main/runtime/runtime-layout-apply.ts
  • src/main/runtime/runtime-rpc/runtime-rpc-mobile-method-routing.ts
  • src/main/runtime/session-lifecycle/close/close-mobile-session-tab.ts
  • src/main/runtime/session-lifecycle/projection/apply-mobile-session-tab-navigation.ts
  • src/main/runtime/session-lifecycle/projection/perform-mobile-session-pty-records-refresh.ts
  • src/main/runtime/session-tabs/restored-chat-tab-changes.ts
  • src/main/runtime/session-tabs/session-tab-prototype-dispatch.test.ts
  • src/main/runtime/session-tabs/structured-session-create-support.ts
  • src/main/runtime/session-tabs/structured-session-tab-close.ts
  • src/main/runtime/session-tabs/structured-session-tab-presentation.ts
  • src/main/runtime/session-tabs/structured-session-tab-publication.ts
  • src/main/runtime/session-tabs/structured-session-tab-restoration.ts
  • src/main/runtime/structured-agent-session-tab-authority.test-support.ts
  • src/main/runtime/structured-agent-session-tab-authority.test.ts
  • src/main/runtime/structured-chat-dispatch-worker-lifecycle.test.ts
  • src/main/runtime/structured-chat-tab-compatibility.test.ts
  • src/main/runtime/structured-chat-tab-lifetime-cost.test.ts
  • src/main/runtime/structured-session-worktree-teardown.test.ts
  • src/main/runtime/structured-session-worktree-teardown.ts
  • src/renderer/src/components/NativeChatResumeOnRestartModal.tsx
  • src/renderer/src/lib/activate-ai-vault-structured-session-host.test.ts
  • src/renderer/src/lib/activate-ai-vault-structured-session.test.ts
  • src/renderer/src/lib/activate-ai-vault-structured-session.ts
  • src/renderer/src/lib/open-agent-message-sender.test.ts
  • src/renderer/src/lib/open-agent-message-sender.ts
  • src/renderer/src/runtime/sync-runtime-graph-chat-tab-order.test.ts
  • src/renderer/src/runtime/sync-runtime-graph/mobile-session-capture.ts
  • src/renderer/src/runtime/sync-runtime-graph/mobile-session-group-projection.ts
  • src/renderer/src/runtime/sync-runtime-graph/mobile-session-inputs.ts
  • src/renderer/src/runtime/sync-runtime-graph/types.ts
  • src/shared/open-structured-agent-session.test.ts
  • src/shared/open-structured-agent-session.ts
  • src/shared/rpc-contract/structured-agent-session-params.ts
  • src/shared/structured-agent-session-host-tab-id.ts
  • src/shared/structured-session-notification-pane.ts
  • src/shared/workspace-layout/old-client/old-client-session-row-ids.ts
  • src/shared/workspace-layout/old-client/old-client-session-tabs-projection.ts
Files with no reviewable changes: 2
  • src/main/runtime/orchestration/terminal-pane-mail-routing.ts
  • src/main/runtime/rpc/methods/orchestration-structured-worker-session.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 5 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

Duplicate comments: 1
src/shared/open-structured-agent-session.ts: 1

66-78: Minor · Functional Correctness · Quick win

structuredSessionOpenMessage still returns hardcoded English text.

This function builds fixed English strings. The mobile hook (use-mobile-structured-session-opening.ts) shows this text in its toasts. These strings are not localized. Users with a non-English locale see English for every failure to open a structured chat.

Keep the shared mapping from reason to message. Resolve the text in each platform adapter: use translate on desktop and t on mobile. Alternatively, add a translator parameter to the shared function. Use an intent-named ID and a named placeholder for the agent label in both cases.

Based on learnings: "For newly added user-facing strings in stablyai/orca TypeScript and TSX files, follow config/i18n-translation-source.md: use intent-named localization IDs with named interpolation placeholders."

Source: Learnings


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: 4b0653e3-f576-47a8-ab60-208235d7fe13
Commits

Reviewing files that changed from the base of the PR and between 22fc43d and 11d859f.

Files ignored due to path filters: 1
  • src/shared/rpc-contract/rpc-params-catalog.generated.ts is excluded by !**/*.generated.*
Files selected for processing: 57
  • mobile/src/agent-history/agent-history-pending-resume-ownership.test.tsx
  • mobile/src/session/open-mobile-structured-session.ts
  • mobile/src/session/use-mobile-session-close-actions.test.tsx
  • mobile/src/session/use-mobile-structured-session-opening.test.tsx
  • mobile/src/session/use-mobile-structured-session-opening.ts
  • mobile/src/session/use-notification-pane-navigation.test.tsx
  • mobile/src/session/use-notification-pane-navigation.ts
  • src/main/runtime/agent-session-tab-layout-command.test.ts
  • src/main/runtime/agent-session-tab-layout-queue.test.ts
  • src/main/runtime/folder-workspace-mixed-host-routing.test.ts
  • src/main/runtime/orca-runtime-desktop-tab-names.test.ts
  • src/main/runtime/orca-runtime-structured-session-restore.test.ts
  • src/main/runtime/orchestration/worker-terminal-release-runtime.ts
  • src/main/runtime/project-removal-structured-sessions.test.ts
  • src/main/runtime/rpc/methods/orchestration-structured-worker-lifecycle.test.ts
  • src/main/runtime/rpc/methods/orchestration-structured-worker-lifecycle.ts
  • src/main/runtime/rpc/methods/orchestration-structured-worker-retry.test.ts
  • src/main/runtime/rpc/methods/orchestration-structured-worker-session.test.ts
  • src/main/runtime/rpc/methods/orchestration-structured-worker-start-failure.test.ts
  • src/main/runtime/rpc/methods/session-tabs.test.ts
  • src/main/runtime/rpc/methods/structured-agent-session-admission.test.ts
  • src/main/runtime/rpc/methods/structured-agent-session-reveal.test.ts
  • src/main/runtime/rpc/methods/structured-agent-session-reveal.ts
  • src/main/runtime/rpc/methods/structured-agent-session-rpc.test-fixture.ts
  • src/main/runtime/rpc/methods/structured-worker-tab-retirement.test.ts
  • src/main/runtime/rpc/methods/workspace-layout-apply.test.ts
  • src/main/runtime/runtime-layout-apply.test.ts
  • src/main/runtime/session-lifecycle/close/close-mobile-session-tab.ts
  • src/main/runtime/session-tabs/session-tab-prototype-dispatch.test.ts
  • src/main/runtime/session-tabs/structured-session-tab-close.ts
  • src/main/runtime/session-tabs/structured-session-tab-presentation.ts
  • src/main/runtime/session-tabs/structured-session-tab-publication.ts
  • src/main/runtime/session-tabs/structured-session-tab-restoration.ts
  • src/main/runtime/structured-agent-session-startup-reconcile.test.ts
  • src/main/runtime/structured-agent-session-tab-authority.test-support.ts
  • src/main/runtime/structured-agent-session-tab-authority.test.ts
  • src/main/runtime/structured-agent-session-windowless-layout-host.test.ts
  • src/main/runtime/structured-agent-session-windowless-layout.test.ts
  • src/main/runtime/structured-chat-tab-compatibility.test.ts
  • src/main/runtime/structured-chat-tab-lifetime-cost.test.ts
  • src/main/runtime/structured-chat-tab-unavailable-host.test.ts
  • src/main/runtime/structured-worker-at-rest.test.ts
  • src/main/runtime/structured-worker-cleared-session.test.ts
  • src/main/runtime/workspaces/persisted-surfaces/restored-terminal-placement.test.ts
  • src/renderer/src/components/NativeChatResumeOnRestartModal.test.tsx
  • src/renderer/src/components/native-chat/NativeChatAgentMessageCard.test.tsx
  • src/renderer/src/components/right-sidebar/AiVaultSessionVirtualList.keyboard.test.tsx
  • src/renderer/src/components/right-sidebar/ai-vault-session-resume-here.ts
  • src/renderer/src/lib/activate-ai-vault-structured-session-host.test.ts
  • src/renderer/src/lib/activate-ai-vault-structured-session-reveal.test.ts
  • src/renderer/src/lib/activate-ai-vault-structured-session.test.ts
  • src/renderer/src/lib/activate-ai-vault-structured-session.ts
  • src/renderer/src/lib/open-agent-message-sender.test.ts
  • src/renderer/src/lib/open-agent-message-sender.ts
  • src/renderer/src/lib/structured-session-open-consumers.test.tsx
  • src/shared/open-structured-agent-session.test.ts
  • src/shared/open-structured-agent-session.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.

@brennanb2025

Copy link
Copy Markdown
Contributor Author

Phone Session History could resume a native chat in a terminal, and notifications could not reopen a closed chat. Delayed closes/layout writes also crossed reopened-tab lifetimes; a retained History row could recreate a stray tab after workspace removal.

The phone now opens the native chat in place through the shared desktop opening policy. It selects the chat on the requesting phone while the computer keeps its active view. Removed workspaces use the existing notice before a new chat, composer or shared tab is opened; History remains saved.

The full review completed six normal rounds, architecture/reference comparison, lifecycle and compatibility settlements, focused regression checks and the required real-agent QA. Later authorized CI fixture/type repairs preserved every existing case and assertion; they were independently reviewed and are not additional rounds. Redundant tests were pruned; this remains a substantial lifecycle change. CI is green on reviewed head 7ce89cfa28b5522a9dff55daa97b29d4d62ef2f7, including static/type checks and all unit shards and Mobile verify.

Verified with real Claude and Codex on preserved previous-build state: upgrade/restart, closed native History open and completed phone reply, desktop Reference preserved with passive shared membership, normal close/reopen and recovery, Stop during provider startup, shipped worker-stop, and normal worktree removal retiring the correct tabs and recorded processes while unrelated shells survived. The targeted removed-workspace repair was exercised for both agents: retained History taps reach the existing notice, with zero target tab/saved-layout/pending additions, stable operation/receipt totals and no observed new target process after settled reads. Original History and provider records remain saved. The raw reports, events, inventories and screenshots were independently audited; a successful driver exit alone was not treated as a pass.

Evidence limits: two literal driver FAILs remain in the records. The Claude positive run remembered the first tab in an initially empty inactive workspace; active desktop selection/content stayed unchanged, as the visibility contract allows. A zero-count map key disappeared 6.971 seconds before observer readiness and over a minute before the Codex negative tap; there were no after-ready recorder changes. Its cause is unknown. Native frames are samples, not continuous no-flash proof. Current Codex History/thread metadata and the completed reply establish conversation continuity, but its unsaved PID-to-thread observation does not establish exclusive process ownership. The initial normal Codex Close followed an already-exited provider, so that exit is not attributed to Close. Earlier overlapping Codex-chain ownership and the short unidentified Claude process at the current tap remain unknown; current target retirement uses recorded PID/start identities. Recovery completed a new reply before processing the retained queued prompt/reply, then cleared the queue. Exact operation-key/receipt-ID equality is report-only; the underlying settled inventories independently establish unchanged totals and zero target state. The literal History-RPC/close overlap is covered by a deterministic production-path test; app QA exercised provider startup cancellation. Notification routing/compatibility are tests-row flows. Localized captures below are controlled layout fixtures only.

Deferred: senders on another computer (STA-12948); broader Resume behavior after workspace deletion (STA-13107); phone message cards/arrow tracked in #36162. A separate pre-existing failed-dispatch mailbox issue remains tracked in STA-12976; permanent mail quiescence is not claimed, and worker-stop's failed/stopped result is not a successful completion/release. An unsupported-agent fallback concern had no proven shipped input. A historical Windows ARM teardown flake passed its narrow retry; no shipped Stop failure was established.

For Brennan’s review, the screenshots below cover the real flows and the controlled copy/layout fixture. The baseline phone showed ownership-unknown; the unrelated pre-existing Codex server toast is not attributed to the tap. The candidate opens the native chat. Desktop activity/sidebar changes are expected; the invariant is the selected Reference view, not pixel equality of the entire window.

Upgrade comparison: previous-build phone versus native open/reply

Previous-build phone:

Claude Codex
Previous-build Claude History result Previous-build Codex History result

Same preserved profile after upgrade:

Claude Codex
Upgraded Claude native reply Upgraded Codex native reply

Desktop before/after baseline taps:

Baseline full desktop before

Baseline full desktop after

Current repaired path: native open and real reply, desktop kept in place

Full desktop before either tap (existing phone-control overlay already present):

Desktop Reference before current phone taps

Claude Codex
Current Claude real phone reply Current Codex real phone reply
Claude Codex
Desktop Reference after Claude phone open Desktop Reference after Codex phone open
Close/reopen, startup Stop, and recovery

Normal Close retires the Claude tab; the surviving Codex chat remains visible:

Normal Close: target absent and surviving Codex visible

Normal close/reopen completed replies:

Claude Codex
Claude normal reopen recovery Codex normal reopen recovery

Startup cancellation sampled sequence and fallback; timing comes from host records:

Claude Codex
Claude startup X and Stop sampled sequence Codex startup X and Stop sampled sequence

Recovery after startup Stop:

Claude Codex
Claude recovery after startup Stop Codex recovery after startup Stop
Worker-stop and normal removal

Reopened original workers completed a real reply before Stop:

Claude Codex
Reopened Claude worker reply Reopened Codex worker reply

Desktop after shipped worker-stop:

Claude Codex
Claude worker retired Codex worker retired

Current normal removal, settled full desktop:

Removed workspace stays removed after settling

Both retained History negative taps after removal
Claude Codex
Claude retained History: existing notice, no composer Codex retained History: existing notice, no composer
Controlled localized layout fixtures

The old History fixture proves wrapping only and does not depict the current dismissible control; the actual current notices are above.

Controlled French/pseudo History notice wrapping fixture

Controlled French/pseudo opening-toast wrapping fixture

Three judgment points: shared opening policy, resource-owned workspace admission, existing phone notice routing.

Latest changed-flow running-app QA is on ffbcbfaa553ddba5cff9645e71c71307d5e8a172; earlier unchanged upgrade/close/Stop/worker flows retain their audited evidence. The marker carries that evidence across test-only commits 5449eb264cf4eaeb337866e970df904e6fb50f16, 8edb6a6050ad7fe099abc6d74fd1d99d78cb973f, 7ce89cfa28b5522a9dff55daa97b29d4d62ef2f7 and accepted main merge 9174120536ac2e36a84d05f50e2c27b1d61684fb; current review and CI cover the final head. No app run on the test-only head is claimed.

@brennanb2025
brennanb2025 merged commit 7e2f29a into main Nov 1, 2026
71 checks passed
nwparker added a commit that referenced this pull request Nov 1, 2026
…36852)

#36315 added two lines to runtime-identity-state.ts, which was already at
the 300-line cap, so main's Lint step fails (302 lines) and every PR
based on main fails static analysis.

Mobile session snapshot version stamping moves, unchanged, into
mobile-session-snapshot-version.ts.
@brennanb2025
brennanb2025 deleted the brennanb2025/phone-open-chats branch November 1, 2026 02:33
brennanb2025 added a commit that referenced this pull request Nov 1, 2026
Brings in 3601c5a, including #36315 (open native chats on the phone in place).
Created chats publish through main's shared tab publication and capture their
surface for close-before-create; the founding attempt still records the chat as
installed once its tab is in the host's list, even if notifying viewers fails.
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