Repository navigation
Show sign-in guidance for all native chat agents - #26544
Conversation
Review summaryThe problemIn the updated native chat, a signed-out agent was recognized inconsistently: Claude only when the chat started, Pi only on send, and Codex, Grok, OpenCode and OMP mostly never. Users saw lines like "The provider did not accept this message: Authentication required." with no agent name and no sign-in command, Codex's raw error, or "…is not signed in for the selected account." for agents that have no Orca accounts. No message named the agent's own sign-in command. What changes for you
Review
What was verified
Not verified
|
|
Note Reviews pausedIt 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 Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configuration
📒 Files selected for processing (4)
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 3 remain after this review. 📝 WalkthroughWalkthroughThe change classifies sign-in failures across ACP, Claude, Codex, and Pi. It preserves provider diagnostics and account context in failure facts. Shared wording now selects agent-specific login commands and retry guidance. Native-chat and mobile flows localize these failures and avoid duplicate resend instructions. Signed-out provider children are retired before replacement when no open work remains. Tests cover provider classification, rendering, mobile delivery, and child lifecycle behavior. Priority: ➖ Normal Merge Risk: 🔵 Low · up to Some sign-in guidance may still be missing from mobile message cards or OMP launch guidance. The changed child-replacement path does not send to a closing agent, but these guidance concerns warrant owner follow-up. 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 2📝 Generate docstrings 💡
⚔️ Resolve 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. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
ℹ️ Review info
⚙️ Run configuration
- Configuration used: Repository UI
- Review profile: CHILL
- Plan: Advanced
- Run ID:
bcf4849e-f16a-4ef7-8a1a-1af97030d195
📒 Files selected for processing (101)
config/scripts/structured-agent-session-start-failure-row-render.test.mjsconfig/scripts/vitest-sqlite-runtime-files.mjsmobile/src/session/mobile-dictation-refused-start-routing.test.tsxmobile/src/session/mobile-native-chat-render-data.tsmobile/src/session/mobile-structured-agent-session-launch.test.tsmobile/src/session/mobile-structured-agent-session-send.tsmobile/src/session/mobile-structured-queued-message-cards.test.tsmobile/src/session/mobile-structured-queued-message-cards.tsmobile/src/session/mobile-structured-send-delivery.test.tsmobile/src/session/mobile-structured-send-delivery.tsmobile/src/session/use-mobile-native-chat-controller.tsmobile/src/session/use-mobile-native-chat-send-error.test.tsmobile/src/session/use-mobile-native-chat-send-error.tsmobile/src/session/use-mobile-native-chat-session-lane.tsmobile/src/session/use-mobile-session-native-chat-dictation.tsmobile/src/session/use-mobile-structured-agent-session-queued.test.tsxmobile/src/session/use-mobile-structured-agent-session-send.test.tsxmobile/src/session/use-mobile-structured-agent-session.tsmobile/src/session/use-mobile-structured-queued-message-controls.tsmobile/src/session/use-mobile-structured-send-with-outcome.tssrc/main/acp/acp-dialects/acp-dialect.tssrc/main/acp/acp-dialects/grok-dialect.tssrc/main/acp/acp-dialects/omp-dialect.tssrc/main/acp/acp-launch-specs.tssrc/main/acp/acp-structured-acquire.tssrc/main/acp/acp-structured-sign-in.test.tssrc/main/acp/acp-structured-turns.tssrc/main/acp/acp-timeline-translator.tssrc/main/acp/acp-turn-failures.tssrc/main/claude/claude-authentication-failures.tssrc/main/claude/claude-message-journaling.tssrc/main/claude/claude-result-journaling.tssrc/main/claude/claude-structured-journal-translation.tssrc/main/claude/claude-structured-session-acquisition.tssrc/main/claude/claude-structured-session-journal-control.tssrc/main/claude/claude-structured-sign-in.test.tssrc/main/codex/codex-authentication-failure.tssrc/main/codex/codex-structured-dispatch-echo.tssrc/main/codex/codex-structured-journal-contracts.tssrc/main/codex/codex-structured-journal-generic-frames.tssrc/main/codex/codex-structured-session-acquire.tssrc/main/codex/codex-structured-session-journal.tssrc/main/codex/codex-structured-session-state.tssrc/main/codex/codex-structured-sign-in.test.tssrc/main/codex/codex-structured-turn-end-settlement.test.tssrc/main/codex/codex-structured-turn-end-settlement.tssrc/main/codex/codex-structured-turn-start.tssrc/main/native-chat/agent-session-wire/structured-agent-session-failed-create-refusal.tssrc/main/native-chat/agent-session-wire/structured-agent-session-failure-text.test.tssrc/main/native-chat/agent-session-wire/structured-agent-session-failure-text.tssrc/main/native-chat/agent-session-wire/structured-agent-session-pre-spawn-first-answer.test.tssrc/main/native-chat/agent-session-wire/structured-agent-session-refusal-details.test.tssrc/main/native-chat/agent-session-wire/structured-agent-session-startup-failure-exit.test.tssrc/main/pi/rpc-capture-replay.test.tssrc/main/pi/rpc-prompt-delivery.test.tssrc/main/pi/rpc-prompt-delivery.tssrc/main/pi/rpc-turn-races.test.tssrc/main/pi/rpc-turns.tssrc/main/runtime/claude-structured-session-integration.test.tssrc/main/runtime/structured-agent-runtime-registrations.tssrc/renderer/src/components/native-chat/NativeChatMessageList.tsxsrc/renderer/src/components/native-chat/NativeChatMessageRow.tsxsrc/renderer/src/components/native-chat/NativeChatNoticeRow.test.tsxsrc/renderer/src/components/native-chat/NativeChatNoticeRow.tsxsrc/renderer/src/components/native-chat/NativeChatQueuedMessageCard.tsxsrc/renderer/src/components/native-chat/NativeChatQueuedMessageList.test.tsxsrc/renderer/src/components/native-chat/NativeChatQueuedMessageList.tsxsrc/renderer/src/components/native-chat/NativeChatStructuredSession.availability-notice.test.tsxsrc/renderer/src/components/native-chat/NativeChatStructuredSession.launch-lifecycle.test.tsxsrc/renderer/src/components/native-chat/NativeChatStructuredSession.tsxsrc/renderer/src/components/native-chat/NativeChatTranscriptRow.tsxsrc/renderer/src/components/native-chat/agent-session-availability-words-text.tssrc/renderer/src/components/native-chat/agent-session-failure-words-text.test.tssrc/renderer/src/components/native-chat/native-chat-structured-session-notices.tssrc/renderer/src/components/native-chat/structured-agent-session-delivery-notices.tssrc/renderer/src/components/native-chat/structured-conversation-command-send.test.tssrc/renderer/src/components/native-chat/use-native-chat-availability-notice.test.tsxsrc/renderer/src/components/native-chat/use-native-chat-availability-notice.tssrc/renderer/src/components/native-chat/use-structured-agent-session-delivery-notices.tssrc/renderer/src/i18n/en-runtime-required.jsonsrc/renderer/src/i18n/locales/en.jsonsrc/renderer/src/i18n/locales/es.jsonsrc/renderer/src/i18n/locales/fr.jsonsrc/renderer/src/i18n/locales/ja.jsonsrc/renderer/src/i18n/locales/ko.jsonsrc/renderer/src/i18n/locales/zh.jsonsrc/renderer/src/i18n/native-chat-locales.test.tssrc/renderer/src/lib/structured-agent-session-launch-failure.tssrc/renderer/src/lib/structured-agent-session-launch-outcome-tracking.tssrc/renderer/src/lib/structured-agent-session-launch-registry.tssrc/shared/agent-session-availability-sentences.tssrc/shared/agent-session-availability.test.tssrc/shared/agent-session-availability.tssrc/shared/agent-session-failure-copy.tssrc/shared/agent-session-failure-words.test.tssrc/shared/agent-session-failure-words.tssrc/shared/agent-session-refusal-notice.test.tssrc/shared/agent-session-sign-in.test.tssrc/shared/agent-session-sign-in.tssrc/shared/agent-session-visible-failures.tssrc/shared/structured-agent-session-status-block.ts
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 8 remain after this review.
| pendingPrompt, | ||
| agentName: args.agentName, | ||
| statedFailures: queuedMessages?.some((draft) => draft.state === 'returned') | ||
| ? agentSessionVisibleFailureFacts(args.journalItems ?? []) |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Exclude hidden child failures before shortening returned-card captions.
If a child-agent status has the same notSignedIn fact as a returned root card, agentSessionVisibleFailureFacts includes it. The mobile transcript hides child-agent rows, but the card then says only “Your message was not sent.” Filter journal items to the root conversation before collecting stated failures, as the transcript fold does.
There was a problem hiding this comment.
Actionable comments posted: 1
ℹ️ Review info
⚙️ Run configuration
- Configuration used: Repository UI
- Review profile: CHILL
- Plan: Advanced
- Run ID:
ef046bc1-cc80-4e09-907c-de83e936d857
📒 Files selected for processing (9)
src/main/acp/acp-launch-specs.tssrc/renderer/src/components/native-chat/NativeChatQueuedMessageList.tsxsrc/renderer/src/i18n/locales/en.jsonsrc/renderer/src/i18n/locales/es.jsonsrc/renderer/src/i18n/locales/fr.jsonsrc/renderer/src/i18n/locales/ja.jsonsrc/renderer/src/i18n/locales/ko.jsonsrc/renderer/src/i18n/locales/zh.jsonsrc/shared/agent-session-refusal-notice.test.ts
🚧 Files skipped from review as they are similar to previous changes (6)
- src/renderer/src/i18n/locales/es.json
- src/renderer/src/i18n/locales/en.json
- src/renderer/src/i18n/locales/zh.json
- src/renderer/src/i18n/locales/fr.json
- src/renderer/src/i18n/locales/ko.json
- src/renderer/src/i18n/locales/ja.json
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 7 remain after this review.
| env: {}, | ||
| dialect: GROK_ACP_DIALECT, | ||
| loginCommand: ['grok', 'login'], | ||
| loginCommand: agentSessionSignInFor('grok')?.loginCommand ?? [], |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🔎 Supported by static analysis
🏁 Script executed:
#!/bin/bash
set -euo pipefail
rg -n -C 5 'grok|opencode|omp|loginCommand' src/shared/agent-session-sign-in.tsRepository: stablyai/orca
Length of output: 843
🏁 Script executed:
set -euo pipefail
printf '%s\n' '--- current launch specs ---'
nl -ba src/main/acp/acp-launch-specs.ts | sed -n '55,140p'
printf '%s\n' '--- merge-base launch specs ---'
git show 3e27e62f434ec612474bb9631d19e5c89f341805:src/main/acp/acp-launch-specs.ts | nl -ba | sed -n '55,140p'
printf '%s\n' '--- shared sign-in declaration ---'
nl -ba src/shared/agent-session-sign-in.ts | sed -n '1,35p'Repository: stablyai/orca
Length of output: 9819
Restore OMP’s login command in the shared sign-in table.
grok and opencode retain their commands, but the shared omp entry is explicitly empty. This changes OMP’s launch specification from ['omp'] to [] and removes its /login guidance.
🐛 Suggested fix
- { agent: 'omp', loginCommand: [] }
+ { agent: 'omp', loginCommand: ['omp'] }…th-parity # Conflicts: # src/main/claude/claude-structured-session-journal-control.ts # src/renderer/src/components/native-chat/NativeChatNoticeRow.tsx # src/renderer/src/components/native-chat/NativeChatStructuredSession.tsx
There was a problem hiding this comment.
Actionable comments posted: 1
ℹ️ Review info
⚙️ Run configuration
- Configuration used: Repository UI
- Review profile: CHILL
- Plan: Advanced
- Run ID:
7a612325-8f4c-44aa-a7fc-e7966372edf8
📒 Files selected for processing (26)
config/scripts/vitest-sqlite-runtime-files.mjssrc/main/acp/acp-dialects/omp-dialect.tssrc/main/acp/acp-structured-acquire.tssrc/main/claude/claude-structured-session-acquisition.tssrc/main/claude/claude-structured-session-journal-control.tssrc/main/claude/claude-structured-session-state.tssrc/main/codex/codex-structured-session-acquire.tssrc/main/native-chat/agent-session-wire/structured-agent-session-attach-orchestration.tssrc/main/native-chat/agent-session-wire/structured-agent-session-failure-text.tssrc/main/native-chat/agent-session-wire/structured-agent-session-host-types.tssrc/main/native-chat/agent-session-wire/structured-agent-session-host.tssrc/main/native-chat/agent-session-wire/structured-agent-session-pre-spawn-first-answer.test.tssrc/main/runtime/structured-agent-runtime-registrations.tssrc/renderer/src/components/native-chat/NativeChatNoticeRow.tsxsrc/renderer/src/components/native-chat/NativeChatStructuredSession.tsxsrc/renderer/src/components/native-chat/native-chat-structured-session-notices.tssrc/renderer/src/i18n/en-runtime-required.jsonsrc/renderer/src/i18n/locales/en.jsonsrc/renderer/src/i18n/locales/es.jsonsrc/renderer/src/i18n/locales/fr.jsonsrc/renderer/src/i18n/locales/ja.jsonsrc/renderer/src/i18n/locales/ko.jsonsrc/renderer/src/i18n/locales/zh.jsonsrc/renderer/src/i18n/native-chat-locales.test.tssrc/shared/agent-session-failure-copy.tssrc/shared/agent-session-failure-words.ts
🚧 Files skipped from review as they are similar to previous changes (8)
- src/main/native-chat/agent-session-wire/structured-agent-session-pre-spawn-first-answer.test.ts
- src/renderer/src/i18n/en-runtime-required.json
- 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/ko.json
- src/renderer/src/i18n/locales/ja.json
- src/renderer/src/i18n/locales/zh.json
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 0 remain after this review.
| const cause = | ||
| lifecycle === 'failed' && failure | ||
| ? agentSessionWriteNoticeText( | ||
| ? (failure.authStartupMessage ?? |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🔎 Supported by static analysis
🏁 Script executed:
#!/bin/bash
# Inspect the value's producer and the launch-notice assertions.
rg -n -C 5 'authStartupMessage' src/renderer/src/lib src/renderer/src/components/native-chatRepository: stablyai/orca
Length of output: 3619
Verify the locale of authStartupMessage.
structuredLaunchFailure stores error.message directly in authStartupMessage, and native-chat-structured-session-notices.ts displays that value before the translated refusal-cause path. If the host error is not localized, failed launches can show English text in other locales. Build this notice from translated failure facts, or localize the stored message before displaying it.
…d only its own rows
…th-parity # Conflicts: # mobile/src/session/mobile-structured-queued-message-cards.test.ts # mobile/src/session/mobile-structured-queued-message-cards.ts # mobile/src/session/use-mobile-native-chat-controller.ts # mobile/src/session/use-mobile-native-chat-send-error.test.ts # mobile/src/session/use-mobile-native-chat-send-error.ts # mobile/src/session/use-mobile-native-chat-session-lane.ts # mobile/src/session/use-mobile-structured-agent-session.ts # mobile/src/session/use-mobile-structured-queued-message-controls.ts # mobile/src/session/use-mobile-structured-send-with-outcome.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
…, and skip the check during a Stop
…ain) Rebuilds #26561 on main now that #26416 is squash-merged. Same change as before, re-applied onto what main has since: - Every adapter answers acquire at spawn and reports `started` on protocol readiness with its real handle (Claude initialize, Codex thread, ACP session new/load plus restore, Pi session file plus restore). No bridge, no per-adapter phase or Stop opt-outs. - Picks made while starting are intents applied model then effort before the start is accepted; rewind, goal, rewind recovery and compact wait for a proven start outside the session queue. - One Stop rule: Stop ends the session for every agent (Codex: interrupt, up to 2 s for the turn to end, then close). - Orchestration worker starts share one deadline; a send's answer copies its row; a re-attach during start keeps the start wait. Integrated with main: - ACP: the subagent-stop probe, child-work delivery and new/loaded origin move into the handshake; the sign-in rule (#26544) classifies a failed handshake; acpAgentName stays in acp-structured-agent-definitions. - Codex: the session journal translator and account kind (#26407) reach the start step. - Pi: the start choice (#26821) and the signed-out verdict (#26743) are read in Pi's start, so both exist when `started` is reported; commands follow. - openWithAgent keeps main's pre-agent check and replay rule. - A report with no model drops the saved one, as #26587 decided. - The renderer re-reads a start's sign-in verdict once the start is proven.
ELI5
Signed-out agents in native chat produced inconsistent failures: generic rejection text, raw errors, or references to accounts that Orca does not manage. The sign-in command was often missing, startup diagnostics could disappear, and the same failure could repeat above the composer and in the transcript. Chats now name the agent and its sign-in method, keep its diagnostic, and show one explanation while still telling users when a message was not sent. Send remains available.
What Changed
claude auth login; managed accounts keep Claude Accounts settings guidance.codex login; managed accounts keep Codex Accounts settings guidance.grok login, with Grok's diagnostic retained.opencode auth login.piand use/loginon the computer running the chat; keep the missing-key detail.-32603internal error whosedata.detailsstarts with its missing-key prefix. Other internal errors remain ordinary failures.One shared table supplies agent-specific guidance. Desktop and mobile queued-message cards receive the chat's agent identity and keep their existing Send controls. Loaded authentication rows suppress matching catalog and delivery explanations; rejected messages still say they were not sent. Desktop transcript rows translate complete authentication facts when they fully explain either standard host sentence, including startup rows that ask the user to resend. Diagnostics stay literal. Command instructions, other failures and unknown facts keep the host wording. Failed desktop launches retain the host-composed authentication diagnostic beside Retry. The phone retains the authentication rejection fact with its existing temporary banner and derives the banner from the transcript after its normal display filtering and folding. A hidden child row cannot remove the only visible sign-in guidance. It keeps sign-in guidance when no row explains the failure, then says only that the message was not sent when a matching row appears, regardless of reply and row arrival order. Failure-fact scans run only for existing consumers, and desktop cards and delivery notices share their derived facts. Startup replies before any message was submitted omit resend instructions, including the phone's direct-create fallback. English, Spanish, French, Japanese, Korean, Chinese and the English runtime catalog are covered.
When an authentication diagnostic lacks ending punctuation, retry advice now starts a separate sentence. Existing periods, question marks, exclamation marks and punctuation inside closing quotes or parentheses stay intact. The provider fact remains literal, details without following advice stay unchanged, and all six locale catalogs are unchanged. This fixes the captured Pi 1.0.4 message ending in
docs/models.mdas well as other unpunctuated details.Signing in while a chat is open now takes effect on the next send. Before: when a chat whose agent was already running reported "not signed in", Orca kept that agent running. The user signed in from a terminal, sent again as the chat told them to, and some agents failed again, because they read their saved login only when they start. Measured locally with each real agent in a throwaway home folder and a local fake model server (no real accounts): OMP 17.0.5 kept failing with "No model selected" in the same process, even in a new session, while a freshly started OMP used the new login; OpenCode 2.0.14 used the new login in the same process. Grok (
grok agent stdio) keeps its login in memory and re-reads it from disk only on reconnect or token refresh (from its source, not run). After: before handing the next message to a running agent, Orca checks whether that agent itself reported "not signed in": a message it rejected for that reason, or a sign-in failure row written by the chat's own agent (not a subagent). Both are tied to the agent by the fence each agent gets when it starts, so a fresh agent is never restarted for an earlier agent's failure. If the agent reported it and owes no other work, Orca stops it quietly, the way the idle sweep puts an agent to rest, and the send starts a fresh agent that reads the new login. "Owes no other work" is the idle sweep's own check, now shared: no running turn, no running child agent, no open orchestration dispatch, no send the agent is still holding, and no unanswered prompt. It also waits while background work has finished since the agent's last turn ended, since the agent may still owe the turn that reads that result; the idle sweep covers that case with its 30-minute window, which a restart before the next send does not have. The check is skipped while a person's Stop is still ending the turn, since the send is not handed over then anyway. The chat, its history and its tab are unchanged, and nothing is shown for the restart. The check reads the transcript without building a snapshot, so a message waiting on a Stop costs no extra transcript reads. If the stop cannot be confirmed, the start waits on or refuses it exactly as for any other stop, and the failure is logged; it never blocks the send on bookkeeping.OMP 18.4.0 source: the missing-key check constructs the error; the ACP prompt path forwards it; the transport wraps it as an internal error with
data.details. This is why the classifier checks both the code and the demonstrated prefix.Why
Each protocol has one authentication classification point, and clients reuse the existing failure-word construction and journal facts. This keeps sign-in advice consistent without adding probes, stored presentation flags, credential access or a new surface. Unknown facts keep the host's fallback rather than receiving advice based on a partial read.
Naming the agent's sign-in method, preserving its diagnostic, and starting a fresh agent before the next turn after a sign-in failure follow the common pattern. Keeping Send available follows it for an existing chat; for a brand-new chat whose agent is known to be signed out, the common pattern disables Send until sign-in, which Orca does not do here (intended: Orca has no sign-in check before the first send yet, so it cannot know; see PR2 below). Other intended differences: Orca keeps its existing surfaces and managed-account settings guidance; OMP uses generic sign-in advice because a command at Orca's supported release floor remains unverified. Temporary difference: additional pre-send checks remain PR2. An interactive sign-in action is separate work.
Linked Issue
Builds on #25666. Requested by @BrennanKB5.
Visual Proof
Hidden-window QA on macOS at
3627aaf58f3with stand-in agents built from this PR's own fixtures (never the real CLIs), isolated config folders, real config files unchanged. Every scenario passed. The only later change is the sentence-boundary fix below (the Grok and Pi shots still show the old run-on "… Then send"), covered by scripted tests.claude auth logincodex login.")grok loginand keeps Grok's detailopencode auth loginpiand/login, keeps "No API key found for …"Testing
QA follow-up scripted validation on macOS: 983 root tests in an explicit 64-file list and 139 mobile tests in an explicit 9-file list passed. The lists include every changed test in this PR, tests importing the changed sentence module, and tests importing its immediate production importers. Coverage includes the existing captured Pi 1.0.4 signed-out reply, punctuation controls, closing quotes and parentheses, and all six locales. One ablation removed the sentence boundary: eight intended assertions failed (the captured Pi reply, one shared case and six locale cases), while 36 controls passed. Restoring the source passed all 44 focused tests.
The earlier round-3 lists passed 504 root and 254 mobile tests, including the actual startup-row writer and mobile display filtering and folding. Both round-3 ablations detected their intended failures. Prior rounds also passed their documented classification, fallback, startup, arrival-order and scan-count coverage; the round-2 importer lists passed 840 root and 272 mobile tests. These are targeted lists, not claims that the entire repository suite passed.
Serial
tc-gatenode, web, CLI and mobile typechecks passed; the mobile test typecheck ratchet also passed with no newly failing files. Pre-pushorca-ci-checks --no-typecheckpassed 21 of 22 checks. Its sole failure is five existing mobile import-cycle warnings, reproduced in the prior baseline audit; all four affected files are unchanged from the PR base. An earlier wider root run also reproduced a pre-existing viewport anchoring failure on the PR base. No warnings were suppressed or unrelated code refactored. Commit-hook lint, React checks and formatting passed. No real agent CLI, account credentials or desktop input were used for this follow-up. Windows, Linux, SSH execution, managed-account interaction and current-head Electron verification remain unverified.Restart after a sign-in failure (commits
496b4037d05,96884850ca2,729dbacf1e2):structured-agent-session-signed-out-child.test.tsruns on the real host test rig: a send the running agent rejects as not signed in makes the next send stop that agent and start a new one, the new agent is kept for the send after that, and any other rejection keeps the agent. Unit cases: a row an earlier agent or a subagent wrote, another failure kind, an agent still starting; and the agent is kept while a turn runs, a prompt is unanswered, an orchestration dispatch is open, or it still holds a send; a failed stop is logged. Removing the subagent filter or the open-work guard fails exactly those cases. A second review round confirmed those fixes and found two more, both now fixed: a possible lost wake-up turn after background work finishes, and a transcript walk on every delivery step while a send waits on a Stop. The first review found the first version scanned a full transcript snapshot on every delivery step (CI caught it as six reads where three are allowed), ignored work the idle sweep protects, and counted subagent rows; all three are fixed. Under Node, 885 test files across native chat, ACP, Pi, Claude and Codex pass, then 216 host-session files after the last fix;pnpm tc:nodepassed.Merge with
mainat5de53910aa1(commit8c8617b00af):mainreverted Claude per-account folders (#26638), which removed the Claude "Sign in" button from failure rows. The resolution keeps this PR's failure-row wording and drops that button. The start-failure scan no longer runs for every Claude chat (that condition existed only for the removed button); it runs when a queued card was returned or a send was rejected, which are its remaining readers. To stay under the file-length limit, the Claude account the transcript wording reads now lives on the acquisition attempt rather than a separate variable; behavior is unchanged. #26416 (messages wait until the agent has started) composes with the restart: the check already skips an agent that is still starting. After the merge,orca-ci-checkspassed 22 of 23 including typecheck; the one failure is fivemobile/import-cycle warnings caused by ignored generated files in the local checkout, which pass in a clean checkout. PR and overlappingmaintests (121 files) show no failures outside the local bun runtime's missingnode:sqlite.Review
All eight round-1, four round-2 and two round-3 findings were verified and addressed; none was disputed. Reviewed protocol classification, account guidance, diagnostic preservation, duplicate suppression, retry behavior, localization and unknown-fact compatibility. The execution host still owns classification; no new wire fields or opcodes are exchanged. Folder workspaces and remote chats use the same existing paths.
The QA OpenCode finding needs no code change: the longer
data.messagewas invented by the stand-in. At the supported 1.x floor (1.18.31), the prompt service keeps only the provider identifier for an authentication error, and the error serializer emits the short messageprovider authentication required. At the supported 2.x floor (2.0.14), the prompt service delegates to the stream, the authentication branch constructs an error with no fields, and the serializer emits the same short message with empty data. Neither sends the longer authentication detail. Orca retains the message it receives. This is source verification, not a real CLI run.The extra “Worked for 0s” and “Claude stopped while this response was in progress” beside a signed-out
/compactrefusal are pre-existing under the timing described by QA. The host opens the command turn before startup completes; if the child ends before command-refusal cleanup, the translator interrupts that open turn, existing exit handling adds the stopped row, and the interrupted turn uses the worked-duration label. Eight files on that path and the translator's ended-event branch are byte-identical to merge base5252884a9c7a34ab556ee8e3e1d8d4decae4982b. The base is therefore expected to do the same under that timing. This is a code-comparison inference; the base app and real Claude timing were not run. No lifecycle change is included in this follow-up.Agent skill upstream boundary
Notes
Both lockfiles are unchanged from the PR merge base. No merge or auto-merge is enabled. No new probes, process-launch behavior, shortcuts or UI surfaces.
Checklist