Skip to content

feat(session-history): Resume in New CLI forks a native chat's conversation into the terminal - #26336

Merged
brennanb2025 merged 8 commits into
mainfrom
brennanb2025/native-chat-cli-switcher
Oct 8, 2026
Merged

brennanb2025 merged 8 commits into
mainfrom
brennanb2025/native-chat-cli-switcher

Conversation

@brennanb2025

@brennanb2025 brennanb2025 commented Oct 7, 2026 •

Copy link
Copy Markdown
Contributor
Files Added Deleted Net
Test 10 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​686 $\color{#cf222e}{\Huge{\mathbf{−}}}$​12 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​674
Prod 33 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​573 $\color{#cf222e}{\Huge{\mathbf{−}}}$​162 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​411

ELI5

Once a conversation was moved into native chat, there was no way to pick it back up in a terminal (the CLI). Agent Session History now has a Resume in New CLI button for those conversations. It opens the CLI with a copy of the whole conversation, and the native chat stays exactly as it was.

What Changed

The problem. The old terminal-based native chat had a live chat/terminal switcher, because a terminal was always running underneath it. The updated structured native chat talks to the agent directly, with no terminal underneath, so there is nothing to switch to. Agent Session History already let you move a terminal session into native chat ("Resume in New Chat"), but nothing went the other way. A row owned by a native chat only offered "Resume", which reopens the chat. Orca also refuses to resume a chat-owned conversation in a terminal on purpose: if the chat and a terminal both wrote the same conversation, it would split silently (Codex takes no lock of its own).

What's different for you (Agent Session History: the row's ⋯ menu, its right-click menu, and its expanded details):

  • Rows whose conversation a native chat owns (Claude or Codex) now have Resume in New CLI. Its tooltip says it forks: "Forks this conversation into a new CLI session." / "The native chat stays as it is." Clicking it opens a new terminal tab running claude --resume <id> --fork-session or codex fork <id>.
  • A Codex fork runs under the Codex account you have selected, the same as a plain Resume of a terminal session.
  • If the paired host that runs the chat is on an older Orca that refuses the fork, you see "Update Orca on the host that runs this chat to resume it in a new CLI." instead of a raw error code.
  • Resume in New Chat is renamed Resume in New Native Chat. It behaves the same: it moves a terminal session into a native chat.
  • Plain Resume is unchanged. It reopens the chat for chat rows and starts the CLI for terminal rows.

How it works.

  • The fork command comes from the same resume builder as a normal terminal resume. It keeps your custom agent command, default args and env, the Codex account home, Windows shell quoting, and the recorded working folder. If an agent can't fork, the click reports an error. It never falls back to a plain resume, which would make the terminal a second writer.
  • A resumed terminal tab normally records the session id it re-enters after an Orca restart. A fork tab records none, so a restart can't quietly reopen the chat's own conversation in the terminal. The tab learns the fork's new id once the agent reports it.
  • Orca's host check that refuses terminal commands resuming a chat-owned conversation now lets claude … --fork-session through, because a fork only reads the original. It only counts --fork-session before a -- and never when --session-id is also given (Claude would then write under that id). codex fork already passed.
  • Codex account home. Plain Resume first moves a Codex session to the selected account's home folder; that step refused chat-owned conversations. It now takes an optional fork flag that skips only that refusal, because a fork never writes the original. When the fork stays in the row's own home, Orca sets up its status hooks there the same way plain Resume does (one shared function), and only for a home the host itself lists. An older host ignores the flag and refuses, which shows the update message above.
  • Codex history rows. Forking a Codex conversation saved in the older (non-paginated) history format copies the parent's header line into the fork's file after the fork's own. Orca's history scanner kept the last header, so the fork's row took the chat's id and title. It now keeps the first header, which is the rule Codex itself uses and the one Orca's duplicate-file check already used. This also corrects rows for such forks made by hand in a terminal.
  • Two pure moves keep files under their line limits. The "which platform does this resume run on" helper moved to ai-vault-resume-platform.ts. The duplicated platform/shell lookup became one resolveAiVaultResumeHost. "Resume" and the fork now share one terminal-launch path, so targeting, toasts and errors are identical.

Why

Fork, not move. The alternative was to move the conversation: stop and retire the chat, and hand ownership to the terminal. That needs a new saved "handed off" state on every chat record, a guard so a handed-off chat never restarts, and a new host call that paired remote hosts must support. A rollback to an older Orca would also treat the chat as owning the conversation again. Forking needs none of that, works while the chat is open or mid-reply, and can't create two writers. The trade-off is that the chat and the CLI copy go separate ways after the fork. The tooltip says so.

Differences from the common pattern:

  • Resume in New CLI is an Orca-only menu item. Intended: Orca is the one with both a terminal mode and a chat mode for the same conversation. It lives in the existing row menus, with no new notices.

Linked Issue

N/A (maintainer request)

Visual Proof

Captured with a hidden, isolated Orca dev build (its own home folder and agent config folders; stand-in claude/codex scripts that only print their arguments, so no real agent ran). The session is a seeded Claude transcript, adopted into a native chat with "Resume in New (Native) Chat".

Chat-owned row, ⋯ menu. Before: no way back to the CLI. After: "Resume in New CLI", with the fork tooltip ("Forks this conversation into a new CLI session." / "The native chat stays as it is.").

Before (main) After
before-chat-row-menu after-chat-row-menu-tooltip

Terminal-session row, ⋯ menu. "Resume in New Chat" is renamed "Resume in New Native Chat"; nothing else changes.

Before (main) After
before-cli-row-menu after-cli-row-menu

After: the same action in the row's expanded details, and what clicking it runs. The new terminal tab ran the stand-in with --resume <id> --fork-session.

after-chat-row-details-tooltip

after-fork-terminal

Re-checked at the final commit (a856685) on a second Mac, in a hidden, isolated dev build with stand-in agents:

Chat-owned row: "Resume in New CLI" and its tooltip Terminal-session row: "Resume in New Native Chat", no "Resume in New CLI"
chat row menu terminal row menu

After clicking it: the new terminal ran --resume <id> --fork-session, and the original row is still the native chat ("Claude Chat", its own transcript, "Resume in New CLI" still offered). No extra row appeared.

after the fork

Testing

  • tc:web, tc:node, orca-ci-checks (lint, code quality, localization) pass locally at each pushed commit.

  • Targeted vitest across the changed areas passes. New tests cover the fork commands (Claude and Codex, including a stored --continue selector being replaced), that a fork tab never records the chat's session id, that agents without fork support return nothing rather than a resume, which rows show the item (both menus), the click path (fork plan, never the resume plan; one toast on failure; the update message, including the desktop's wrapped error text), the host check (admits real forks; refuses --fork-session after -- or with --session-id), the Codex account-home step with fork, the hook setup for a kept home (only host-listed homes; skipped for remote, WSL, missing service; failure never blocks), and a fork-shaped Codex history file keeping the fork's own id.

  • Manual: the flow above in isolated macOS dev builds of this branch and of main, and again at the final commit on a second Mac. Claude only: the Codex fork command is covered by unit tests, but a Codex fork was not run live (a stand-in can't make a chat-owned Codex row, and no real agent was run).

  • Platforms: macOS locally. Windows/PowerShell quoting and Codex homes go through the same shared resume builder as an ordinary resume.

  • I manually tested these changes locally

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

Review

Agent skill upstream boundary

  • Not applicable, or this change follows docs/reference/agent-skill-sharing-upstream-boundary.md and copies or mechanically translates no upstream skill-installer source, tests, fixtures, registry entries, path tables, comments, or documentation.

Notes

  • SSH / remote: SSH rows are never chat-owned, so the item never appears there. Rows from a paired Orca host keep their chat ownership, so the item does appear for chats that run on a paired host, and the fork runs on that host. A paired host on an older Orca refuses the Claude fork (its host check predates this change) and the user sees the update message; nothing is written.
  • Mobile: unchanged. The sidebar is desktop-only.
  • Cross-platform: the command goes through the shared resume builder (POSIX, PowerShell, cmd).

Checklist

  • This PR is small and focused (one feature; it grew through review fixes, about half of the added lines are tests)
  • 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)

Author: @BrennanKB5

…LI session

Agent Session History offered "Resume in New Chat" to move a terminal session
into native chat, but nothing went the other way: once a native chat owned a
conversation, its row only reopened the chat, and Orca refused any terminal
resume of it so two programs never write one conversation.

Rows a native chat owns (Claude, Codex) now offer "Resume in New CLI". It forks:
the terminal runs `claude --resume <id> --fork-session` or `codex fork <id>`,
so the CLI gets the full history under a new id and the chat is unchanged. The
host's resume guard lets a Claude fork through, and the fork tab records no
provider session, so a restart never re-enters the chat's conversation.
"Resume in New Chat" is renamed "Resume in New Native Chat".
The tooltip balanced one wrapped string inside a box sized before balancing,
leaving a gap beside its lines. It is now two block lines with no fixed width.
… and tighten the fork guard

- Resume in New CLI now asks the host for the same Codex account home plain
  Resume uses, so a fork no longer starts under whichever account's copy of the
  rollout sorted first. The preparation call carries an optional `fork` flag
  that skips only the owned-conversation refusal; plain resume still refuses.
- An older paired host that refuses the fork now shows "Update Orca on the host
  that runs this chat to resume it in a new CLI." instead of a raw error code.
- The host guard admits `--fork-session` only before a `--` terminator and
  never alongside `--session-id`, since either shape lets Claude write the
  owned conversation.
- Tests for the click path, the menu item's eligibility, the fork home
  preparation, and the tightened guard.
…session record

A fork of an older (non-paginated) Codex thread writes its own session record
first and then copies the parent's history, the parent's session record
included. The history scanner kept the last one it saw, so the fork's row took
the parent's id, title, folder and branch: on a native chat's fork it looked
like the chat itself, and Resume on it opened the chat instead of the fork.
Codex itself treats the first session record as the thread's own and ignores
later ones; the scanner now does the same, as Orca's duplicate-rollout check
already did.
…k keeps

When Resume in New CLI can't move a Codex fork to the selected account (that
account has no copy of the conversation yet, or the system default is
selected), the fork runs in the account home the history row came from. A new
Codex tab only gets Orca's status hooks in the selected account's home, and the
fork carries no provider session, so nothing set up the hooks in that row home.
In a home only native chat had used, the fork tab could show no working or
idle status.

The fork's home preparation now readies that home the same way a resumed
session's home is readied (hook install or refresh, plus the daemon-socket
guard). That code is moved into prepareCodexPinnedLaunchHome and shared by both
paths. The fork tab still carries no provider session, so it never reopens the
chat's conversation on restart.
… fork

The fork's hook setup ran in whatever Codex home the request named, so a paired
client could have Orca write hook and config files into any directory. Plain
Resume only readies a home it has verified: one this host lists for Codex
sessions that actually holds the rollout. The fork now uses that same check,
through a shared trustedCodexResumeHomes list, and readies the home only when
the verified home is the one the fork will run in. With no Codex runtime home
service it does nothing, as plain Resume does. A failed check or setup is
logged and never stops the fork from launching.

Tests cover the untrusted home, a missing runtime home service, a rollout on
another host, a WSL home, a fork moved into the real home, and a failed setup.
…raps the fork refusal

When the local preparation step for Resume in New CLI is refused, Electron
hands the renderer the error as "Error invoking remote method '…': Error:
agent_session_conflict". The fork's failure text matched only the bare code,
so the toast showed that raw line instead of asking the user to update Orca on
the host. It now unwraps the message with the shared IPC error helper before
matching.
@brennanb2025

Copy link
Copy Markdown
Contributor Author

Review summary (head a856685)

The problem. In the old terminal-backed native chat you could switch a conversation between the chat and the terminal. The updated structured native chat has no terminal underneath, so once a conversation belonged to a native chat there was no way back to the CLI. Agent Session History only offered "Resume", which reopens the chat. Orca deliberately refuses to resume a chat-owned conversation in a terminal, because two writers on one conversation split it silently.

What changes for you. Rows in Agent Session History whose conversation a native chat owns (Claude or Codex) get Resume in New CLI in the ⋯ menu, the right-click menu and the expanded details. Its tooltip says it makes a copy: "Forks this conversation into a new CLI session." / "The native chat stays as it is." Clicking it opens a terminal tab that forks the conversation (claude --resume <id> --fork-session, codex fork <id>), and the chat is left alone. "Resume in New Chat" is renamed "Resume in New Native Chat". Plain "Resume" is unchanged.

Fixed during review

  • A Codex fork used the history row's Codex home folder, which can belong to a different account than the one you have selected. It now goes through the same account-home step as plain Resume. That step used to refuse chat-owned conversations; it now skips the refusal only for a fork, which never writes the original.
  • When the fork stays in the row's own Codex home, Orca now sets up its status hooks there, as plain Resume does. Without that, a fork tab in a home only the chat had used showed no working/idle status. The setup only runs for a home the host itself lists; it never runs for a folder a client names.
  • A paired host on an older Orca refuses the fork. The toast showed the raw code agent_session_conflict; it now says "Update Orca on the host that runs this chat to resume it in a new CLI." This includes the desktop app's wrapped error text.
  • The host check that lets a fork through was too broad. It accepted --fork-session after -- (where Claude treats it as prompt text) and together with --session-id <owned id> (Claude then writes under that id). Both are now refused, and real forks still pass.
  • When you fork a Codex conversation saved in the older (non-paginated) history format, the fork's file also holds the parent's header line. Orca's history scanner read the last header, so the fork's row showed up as the native chat. It now reads the first header, which matches Codex and Orca's own duplicate-file check.
  • Added tests for the click path (fork plan only, one toast, which rows offer it).

Checked and ruled out

  • Neither CLI writes the original conversation. Codex's own tests assert that a fork leaves the source file unchanged. For Claude, a live run in an isolated folder showed every hook reporting the fork's new id and the original transcript untouched. So a fork tab can never reopen the chat's own conversation after a restart.
  • No fallback to a plain resume on any error path, local or on a paired host.
  • An older chain row would fork stale history: not possible today, because every row of a Claude/Codex chat carries the same conversation id.

Deferred (P2/P3, not blocking)

  • On a Windows paired host, a Codex fork that pins a managed account's home builds a POSIX-style command (CODEX_HOME=… codex …), so it fails to start. History rows from a paired host don't record the host's OS. Claude forks and unpinned Codex forks work there. The fix is to stamp the host platform on paired-host rows.
  • A fork taken while the chat is mid-reply copies the conversation as it is on disk, including the unfinished turn. The chat itself resumes from its last completed turn. Not checked live.
  • A fork from a per-account row on a paired host gets no status-hook setup on that host. Plain Resume behaves the same there, and asking older hosts would break forks that work today.
  • After an update, a copied Codex fork that an older build already cached keeps the parent's id until its file changes.
  • The fork tab can wait up to about 3 s for hook setup before it opens, with no feedback.
  • Hand-typed command edge cases the host check doesn't model: && chains, letter case, an unparseable custom command that contains --.
  • The Codex usage-stats parser also reads the last header line. That's a separate stats issue, out of scope here.

Verified

  • CI at a856685: all checks pass. One package (windows) failure in an untouched persistence timing test passed on re-run.
  • Local typecheck (web and node), orca-ci-checks and targeted tests at each pushed commit.
  • Electron at the final commit on a second Mac, in a hidden, isolated build with stand-in agents (screenshots in the PR body). Checked: the chat row's item and tooltip, the renamed item on terminal rows, the fork terminal running --resume <id> --fork-session, and the chat row unchanged after the fork. The machine's real agent config files were unchanged.

Not verified

  • A Codex fork was not run live, and neither was a real Claude fork from the app. The stand-in Codex can't complete the chat handshake, so no chat-owned Codex row could be made. The Codex command and account-home steps are covered by unit tests and Codex's own source.
  • Not run on Windows, Linux, WSL, SSH or a paired host. That includes the older-host message and the Windows paired-host gap above, which come from reading the code.
  • That Claude's --fork-session leaves the original untouched was checked with one isolated run of Claude Code 2.1.280, not across versions.

The stacked follow-up #26375 has these fixes merged in. This PR stays a draft.

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

coderabbitai Bot commented Oct 8, 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: 6f2c8fb9-5326-4445-926c-c59358d3a807
📥 Commits

Reviewing files that changed from the base of the PR and between 8ae5264 and 4152a2a.

📒 Files selected for processing (43)
  • src/main/ai-vault/session-scanner-codex-parser.test.ts
  • src/main/ai-vault/session-scanner-codex-parser.ts
  • src/main/ai-vault/structured-session-ownership.test.ts
  • src/main/ai-vault/structured-session-ownership.ts
  • src/main/codex/codex-ai-vault-session-resume.test.ts
  • src/main/codex/codex-ai-vault-session-resume.ts
  • src/main/codex/codex-session-resume-home.ts
  • src/main/runtime/rpc/methods/ai-vault.test.ts
  • src/main/runtime/rpc/methods/ai-vault.ts
  • src/main/startup/codex-session-resume-launch.ts
  • src/main/startup/main-process-runtime-service.ts
  • src/main/startup/main-window-core-services.ts
  • src/renderer/src/components/right-sidebar/AiVaultPanel.tsx
  • src/renderer/src/components/right-sidebar/AiVaultSessionActionMenuItems.tsx
  • src/renderer/src/components/right-sidebar/AiVaultSessionDetails.tsx
  • src/renderer/src/components/right-sidebar/AiVaultSessionRow.tsx
  • src/renderer/src/components/right-sidebar/AiVaultSessionVirtualList.tsx
  • src/renderer/src/components/right-sidebar/AiVaultVirtualRow.test.tsx
  • src/renderer/src/components/right-sidebar/AiVaultVirtualRow.tsx
  • src/renderer/src/components/right-sidebar/SessionRowTrailingActions.tsx
  • src/renderer/src/components/right-sidebar/ai-vault-session-cli-fork-copy.tsx
  • src/renderer/src/components/right-sidebar/ai-vault-session-cli-fork.test.ts
  • src/renderer/src/components/right-sidebar/ai-vault-session-cli-fork.ts
  • src/renderer/src/components/right-sidebar/ai-vault-session-launch-actions.test.ts
  • src/renderer/src/components/right-sidebar/ai-vault-session-launch-actions.ts
  • src/renderer/src/i18n/locales/en.json
  • src/renderer/src/i18n/locales/es.json
  • src/renderer/src/i18n/locales/fr.json
  • src/renderer/src/i18n/locales/ja.json
  • src/renderer/src/i18n/locales/ko.json
  • src/renderer/src/i18n/locales/zh.json
  • src/renderer/src/lib/ai-vault-resume-command.ts
  • src/renderer/src/lib/ai-vault-resume-platform.ts
  • src/renderer/src/lib/ai-vault-session-fork-startup.test.ts
  • src/renderer/src/lib/ai-vault-session-fork-startup.ts
  • src/renderer/src/lib/ai-vault-session-resume-preparation.test.ts
  • src/renderer/src/lib/ai-vault-session-resume-preparation.ts
  • src/shared/agent-resume-argv.ts
  • src/shared/agent-session-resume.ts
  • src/shared/ai-vault-resume-preparation.ts
  • src/shared/rpc-contract/ai-vault-params.ts
  • src/shared/tui-agent-fork-startup.test.ts
  • src/shared/tui-agent-resume-startup.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.


📝 Walkthrough

Walkthrough

The change adds a “Resume in New CLI” action for eligible Claude and Codex sessions. It builds fork startup commands, sends fork mode through session preparation, and adds conditional Codex launch-home preparation. The session list exposes the action in its menus and details, with updated labels, tooltips, and translations. The Codex session parser now ignores metadata records after the first.

Priority: ⬇️ Low

Merge Risk: ⚪ Minimal · up to 4152a

This adds a Resume in New CLI fork action for Claude and Codex sessions. No concrete merge-blocking risk was found in the reviewed changes. Live Codex fork behavior and paired-host behavior were not exercised, which is normal validation uncertainty rather than an identified defect.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 30.43% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 46 functions across 37 files. (6 skipped:… Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the main feature: forking a native chat conversation into a new CLI session.
Description check ✅ Passed The description is complete and aligned with the template. It explains the user-facing behavior, implementation, rationale, testing, visual proof, compatibility considerations, and known limitations. …
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.
Full details: Docstring Coverage

Explanation

Docstring coverage is 30.43% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 46 functions across 37 files. (6 skipped: 6 unsupported.)

  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Commit to this branch
  • Create a new PR
  • Autopilot · 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.

@brennanb2025
brennanb2025 merged commit 496ee9b into main Oct 8, 2026
37 checks passed
@brennanb2025

brennanb2025 commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor Author

Post-merge audit (main at e0a98a4)

What this PR was for. A native chat has no terminal behind it, so before this PR you couldn't continue a native chat's conversation in the Claude or Codex CLI. Session History now offers Resume in New CLI on a chat's row. It opens a new terminal with a copy (fork) of the conversation: the chat stays as it was, and the two can diverge from there. "Resume in New Chat" was renamed Resume in New Native Chat.

What the audit checked. After the merge, four fresh reviewers each read the landed code on current main (the squash has the same changes as the head reviewed before merge, a856685). One sketched a design from the issue alone before reading the code, then compared the two. The other three covered:

  • which session owns a conversation, and how the machine that runs the agent admits a resume;
  • the Session History UI and its text;
  • Codex accounts, status-hook setup, the history scanner, and remote and platform launches.

Result: no follow-up fix needed. No problem found at P0-P2.

  • Every launch path either forks or refuses. None quietly reopens the chat's own conversation in a terminal.
  • The new terminal never saves the chat's id as its own. Restoring it after a restart needs the fork's own id, reported by its status hooks.
  • A paired host on an older Orca either refuses with an update message or runs a real fork. It never falls back to a plain resume.
  • The open PR that makes Chat UI the default for structured agent chats does not conflict with this one. "Resume in New Native Chat" stays available with the Chat UI preference off.

Minor issues found and deferred (none blocks anything):

  • Misleading message for an up-to-date host. If your default Claude arguments include --session-id, an up-to-date host refuses the fork too, and the message wrongly tells you to update Orca on that host.
  • Stale branch on some Codex history rows: follow-up fix in fix(session-history): keep a legacy Codex conversation's branch current after Codex updates it #26563. Codex rows that use the older history format can now show a stale branch. The history scanner keeps the first session header. That is correct for forks, but it also skips Codex's own later same-id header updates, written when a reply creates a branch. fix(session-history): keep a legacy Codex conversation's branch current after Codex updates it #26563 lets a later header with the conversation's own id update the branch only, and still ignores headers with any other id.
  • Design note. The fork is still decided by a command line the app builds and the host checks, and the fork's new id is learned from status hooks. The common pattern has the host create the fork and record the new id when it makes it. Moving to that would remove the remaining text check and make a fork tab reopenable after a restart even with hooks off. This is a possible future refactor, not a bug.
  • The items deferred in the earlier review summary are unchanged.

Verified:

  • All four reviews read the code on current main, and I checked each finding above in the code myself.
  • The final PR head 4152a2a: 23 checks passed, 15 skipped, 0 failed.
  • The workflows that ran on main after the merge passed.

Not verified:

  • No tests or typecheck were re-run for this audit.
  • No new live run: no Electron, no live Codex fork, and nothing on Windows, WSL, SSH or a paired host.
  • Claude forks keep their own id only as checked earlier on Claude Code 2.1.280.

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