Repository navigation
A chat never starts writing a conversation a terminal is still writing, and restored panes respect open chats - #30930
Conversation
…uses to start while a terminal writes its conversation Each chat link now carries its role (head or earlier) and key; Session History names the chat continuing a conversation first, duplicate adoption checks only head links in both the pre-commit check and the store transaction, and terminal resumes stay refused exactly as before. The terminal-writer check now also runs inside acquireOwner before the spawn, refusing with the typed pre-spawn reason conversationOpenInTerminal.
…l reports it An in-memory registry of managed terminal starts per conversation, registered in the same step as the resume admission (terminal.send with a resume command, createTerminal with a command), bound to the PTY execution that runs it, and ended only when that terminal's hooks report the conversation or the execution is gone. A chat's agent start refuses while an entry may hold its conversation.
… an open chat continues Resume recipes built from a pane's saved facts (cold restore, deferred and late reattach, sleeping wake, host mobile materialization) carry resumeOrigin 'saved'. The execution host decides before any command is issued: while an open chat continues the conversation, or a chat may be writing it, the pane starts its plain shell with the started-fresh notice and its saved claim is forgotten; with unreadable records only a saved restore is refused and its record kept. An admitted resume registers its managed start in the same step, so the chat's agent start refuses until the terminal reports it or exits. Clearing the last saved record now reaches disk.
|
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
Walkthrough
Priority: Merge Risk:
|
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:
242c924f-b081-4a33-bb04-24d95c5ee508
📒 Files selected for processing: 120
src/main/agent-hooks/server/server-tab-cleanup.tssrc/main/ai-vault/structured-session-ownership.test-support.tssrc/main/ai-vault/structured-session-ownership.test.tssrc/main/ai-vault/structured-session-ownership.tssrc/main/codex/codex-structured-thread-open.test.tssrc/main/codex/codex-structured-thread-open.tssrc/main/ipc/pty-codex-account-attribution.test.tssrc/main/ipc/pty-daemon-spawn-agent-home-env.test.tssrc/main/ipc/pty-ipc-mock-registry.tssrc/main/ipc/pty-ipc-suite-environment.tssrc/main/ipc/pty-spawn-codex-home-unavailable.test.tssrc/main/ipc/pty-spawn-env-codex-resume-provenance.test.tssrc/main/ipc/pty-spawn-saved-resume-admission.test.tssrc/main/ipc/pty/host-env/saved-resume-admission.tssrc/main/ipc/pty/ipc/spawn-commit.tssrc/main/ipc/pty/ipc/spawn-env-codex.tssrc/main/ipc/pty/ipc/spawn-execute.tssrc/main/ipc/pty/ipc/spawn-run.tssrc/main/ipc/pty/ipc/spawn-state.tssrc/main/ipc/pty/ipc/spawn-types.tssrc/main/ipc/pty/pane/stable-owner.tssrc/main/ipc/pty/runtime/spawn-commit.tssrc/main/ipc/pty/runtime/spawn-early.tssrc/main/ipc/pty/runtime/spawn-execute.tssrc/main/ipc/pty/runtime/spawn-preflight-saved-resume.test.tssrc/main/ipc/pty/runtime/spawn-preflight.tssrc/main/ipc/pty/runtime/spawn-state.tssrc/main/ipc/pty/runtime/spawn.tssrc/main/native-chat/agent-session-wire/structured-agent-session-acquisition.tssrc/main/native-chat/agent-session-wire/structured-agent-session-adapter.tssrc/main/native-chat/agent-session-wire/structured-agent-session-attach-flow.tssrc/main/native-chat/agent-session-wire/structured-agent-session-attach-orchestration.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.tssrc/main/native-chat/agent-session-wire/structured-agent-session-host-types.tssrc/main/native-chat/agent-session-wire/structured-agent-session-provider-open.test.tssrc/main/native-chat/agent-session-wire/structured-agent-session-terminal-writer-acquire.test.tssrc/main/native-chat/agent-session-wire/structured-provider-session-ownership.tssrc/main/native-chat/structured-agent-session-history-adoption.test.tssrc/main/native-chat/structured-agent-session-history-adoption.tssrc/main/native-chat/structured-conversation-key.tssrc/main/providers/pty-spawn-result.tssrc/main/runtime/agent-session-reservation-admission.test.tssrc/main/runtime/agent-session-reservation-admission.tssrc/main/runtime/cli-terminal-create-host-session-binding.test.tssrc/main/runtime/hook-status-resume-sleep-ordering.test.tssrc/main/runtime/rpc/methods/terminal/terminal-lifecycle-methods.tssrc/main/runtime/runtime-pty-controller-contract.tssrc/main/runtime/runtime-terminal-contracts.tssrc/main/runtime/runtime-terminal-state-records.tssrc/main/runtime/session-construction/agent-session/get-agent-session-execution-namespace.tssrc/main/runtime/session-lifecycle/projection/perform-mobile-session-pty-records-refresh.tssrc/main/runtime/session-tabs/structured-session-cli-writer-host.tssrc/main/runtime/session-tabs/structured-session-create-support.tssrc/main/runtime/structured-agent-session-runtime.tssrc/main/runtime/terminal/launch/mobile-terminal-owned-create.tssrc/main/runtime/terminal/launch/terminal-create.tssrc/main/runtime/terminal/launch/terminal-launch-result.tssrc/main/runtime/terminal/stop/worktree-sleep-resume-recording.tssrc/main/runtime/workspaces/workspace-process-listing-dependencies.tssrc/main/runtime/workspaces/workspace-process-listing.tssrc/preload/api/pty-api.tssrc/preload/api/pty-bridge-session-control.tssrc/renderer/src/components/native-chat/agent-session-failure-words-text.tssrc/renderer/src/components/tab-bar/cli-chat-resume-feedback.tssrc/renderer/src/components/terminal-pane/ipc-pty-connect-result.tssrc/renderer/src/components/terminal-pane/ipc-pty-connect.tssrc/renderer/src/components/terminal-pane/ipc-pty-spawn-request.tssrc/renderer/src/components/terminal-pane/pty-connection-types.tssrc/renderer/src/components/terminal-pane/pty-connection/apply-reattach-payload.tssrc/renderer/src/components/terminal-pane/pty-connection/cold-restore-resume-startup.tssrc/renderer/src/components/terminal-pane/pty-connection/connect-pane-pty.tssrc/renderer/src/components/terminal-pane/pty-connection/deferred-cold-restore-and-snapshot.tssrc/renderer/src/components/terminal-pane/pty-connection/deferred-session-reattach-connect.tssrc/renderer/src/components/terminal-pane/pty-connection/fresh-spawn-start.tssrc/renderer/src/components/terminal-pane/pty-connection/fresh-spawn-types.tssrc/renderer/src/components/terminal-pane/pty-connection/hidden-agent-resume-deferral.tssrc/renderer/src/components/terminal-pane/pty-connection/pane-serializer-settle.tssrc/renderer/src/components/terminal-pane/pty-connection/pane-transport-options.tssrc/renderer/src/components/terminal-pane/pty-connection/reattach-payload-context.test.tssrc/renderer/src/components/terminal-pane/pty-connection/reattach-payload-session.tssrc/renderer/src/components/terminal-pane/pty-connection/reattach-result-handler.tssrc/renderer/src/components/terminal-pane/pty-connection/saved-resume-cancellation.test.tssrc/renderer/src/components/terminal-pane/pty-connection/saved-resume-startup-cancellation.tssrc/renderer/src/components/terminal-pane/pty-connection/sleeping-record-access.tssrc/renderer/src/components/terminal-pane/pty-connection/spawn-deferred-sleep.tssrc/renderer/src/components/terminal-pane/pty-connection/title-spawn-bell.tssrc/renderer/src/components/terminal-pane/pty-transport-types.tssrc/renderer/src/components/terminal-pane/remote-runtime-pty-transport-host-session-launch.test.tssrc/renderer/src/components/terminal-pane/remote-runtime-pty-transport-spawn-intent.test.tssrc/renderer/src/components/terminal-pane/remote-runtime-pty-transport.tssrc/renderer/src/hooks/ipc-events/agent-status-listeners.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/lib/forget-refused-pane-resume.tssrc/renderer/src/lib/sleeping-agent-session-launch.tssrc/renderer/src/lib/workspace-session-patch.test.tssrc/renderer/src/lib/workspace-session-patch.tssrc/renderer/src/store/terminals/terminal-actions.tssrc/renderer/src/store/terminals/terminal-state.tssrc/shared/agent-session-attachment-failure-words.tssrc/shared/agent-session-failure-copy.tssrc/shared/agent-session-failure-words.tssrc/shared/agent-session-failure.tssrc/shared/agent-session-host-authority.tssrc/shared/agent-session-refusal-details.tssrc/shared/agent-session-refusal-reason-words.tssrc/shared/agent-session-resume.tssrc/shared/agent-status-ipc-payload.tssrc/shared/agent-status-types.tssrc/shared/protocol-version.tssrc/shared/rpc-contract/agent-session-params.tssrc/shared/rpc-contract/terminal-unary-params.tssrc/shared/runtime-terminal-contracts.tssrc/shared/structured-agent-session-dispatch-rejection.ts
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 9 remain after this review.
There was a problem hiding this comment.
Actionable comments posted: 3
ℹ️ Review info
⚙️ Run configuration
- Configuration used: Repository UI
- Review profile: CHILL
- Plan: Advanced
- Run ID:
f5e5e3e4-8e40-47c5-9e48-16d0ca83e837
📒 Files selected for processing: 24
src/main/runtime/cli-terminal-create-host-session-binding.test.tssrc/main/runtime/rpc/methods/terminal-stream-extraction-characterization.test.tssrc/main/runtime/rpc/methods/terminal/terminal-multiplex-initial-snapshot.tssrc/main/runtime/rpc/methods/terminal/terminal-multiplex-subscribe-frame.tssrc/main/runtime/rpc/terminal-multiplex-test-harness.tssrc/main/runtime/terminal/recovery/resolve-terminal-pane.tssrc/renderer/src/components/terminal-pane/pty-connection/apply-reattach-payload.tssrc/renderer/src/components/terminal-pane/pty-connection/deferred-session-reattach-connect.tssrc/renderer/src/components/terminal-pane/pty-connection/fresh-spawn-start.tssrc/renderer/src/components/terminal-pane/pty-connection/reattach-payload-session.tssrc/renderer/src/components/terminal-pane/pty-connection/reattach-result-handler-park-reveal-verdict.test.tssrc/renderer/src/components/terminal-pane/pty-connection/reattach-result-handler.tssrc/renderer/src/components/terminal-pane/pty-connection/reattach-success-settle.test.tssrc/renderer/src/components/terminal-pane/pty-connection/saved-resume-startup-cancellation.tssrc/renderer/src/components/terminal-pane/pty-connection/terminal-launch-result-policy.tssrc/renderer/src/components/terminal-pane/pty-connection/transport-output-callbacks.tssrc/renderer/src/components/terminal-pane/pty-transport-types.tssrc/renderer/src/components/terminal-pane/remote-runtime-pty-transport.tssrc/renderer/src/components/terminal-pane/remote-runtime-saved-result-consumer.test.tssrc/renderer/src/runtime/remote-runtime-terminal-multiplexer-types.tssrc/renderer/src/runtime/remote-runtime-terminal-response-controller.tssrc/shared/runtime-terminal-contracts.tssrc/shared/terminal-attachment-launch-result.tssrc/shared/workspace-session-sleeping-agents.ts
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 9 remain after this review.
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to GitHub limitations.
🟡 Minor · Clear the saved-origin probe cache after transient… · remote-runtime-pty-transport.ts:3146-3162
src/renderer/src/components/terminal-pane/remote-runtime-pty-transport.ts:3146-3162
🔒 Security & Privacy | 🟡 Minor | ⚡ Quick winClear the saved-origin probe cache after transient failures.
runtimeEnvironmentSupportsCapabilitycan reject whilestatus.getis unavailable. The transport then caches{}insavedOriginOptions. Later connects can reuse that value and omitresumeOrigin. SinceadmitResumeSpawnchecks ownership only forresumeOrigin: 'saved', the native-chat refusal can be skipped.Suggested fix
} catch (error) { if (isRuntimeCompatBlockError(error)) { throw error } + // Why: a transient probe failure is not a capability answer; let the next connect probe again. + savedOriginOptions = undefined return {} }
ℹ️ Review info
⚙️ Run configuration
- Configuration used: Repository UI
- Review profile: CHILL
- Plan: Advanced
- Run ID:
b6afc1a1-13b8-489d-a20c-6d854a39a8ba
📒 Files selected for processing: 5
src/main/runtime/cli-terminal-create-host-session-binding.test.tssrc/main/runtime/rpc/methods/terminal/terminal-multiplex-initial-snapshot.tssrc/renderer/src/components/terminal-pane/pty-connection/terminal-launch-result-policy.tssrc/renderer/src/components/terminal-pane/remote-runtime-pty-transport.tssrc/renderer/src/components/terminal-pane/remote-runtime-saved-result-consumer.test.ts
🚧 Files skipped from review as they are similar to previous changes: 2
- src/main/runtime/rpc/methods/terminal/terminal-multiplex-initial-snapshot.ts
- src/main/runtime/cli-terminal-create-host-session-binding.test.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.
|
Reopening native chat could start its agent while a terminal was still writing the same conversation. Automatic terminal restoration could also restart a conversation belonging to an open native chat. This PR checks ownership immediately before acquisition and gives a conflicting fresh restore a usable shell while preserving the conversation. Bounded followup completed on the published head. Published head After the main merge Admission commit Final shipped delta from Test receipts are separate, not a cumulative current-head pass count:
The normal commit hook passed with no committed tree churn. Its generated package-manager metadata was restored to the incoming bytes; no lock change was committed. These are hook/test receipts, not an executed compiler or current CI result. Accepted fresh matching refusal settlement still releases only that operation's share before publication; physical/adopted owners and mismatched, historical or unknown outcomes remain conservative. Source validation, result receipts, cancellation and metadata contracts carry. Existing whole-mechanism reference and checklist qualifications carry where unchanged; the independent correction review checked the changed proof retention. Five bounded performance contracts and their N/10N operation-count limits carry: final proof checks add no process query, and no general linearity, latency, CPU or heap claim follows. Current-head CI: the sole watch on M4Air ticket2388, finite Claude followup — independently audited AGREE on The refusal image proves the History toast, ending “then open this conversation from Session History.” The provisional native tab also shows generic “Chat could not be started.” and Retry; no Retry or native prompt was taken. A bounded source comparison with the retained e091 and accepted7a objects confirms that the provisional tab, generic banner and Retry presentation predates686/43/71; only the approved toast words changed. This remains an inherited visible qualification, with no new regression established. It does not prove the chat-notice variant ending “to continue here.” Product Sleep exit/recipe, matched OS identity/absence, native request/reply and shell-result evidence support the finite results. Raw Sleep return and actual materializer/settlement/cancellation keys were unavailable; no fresh/adopted-result, B-share, kernel-exit or universal single-writer proof is inferred. No later explicit resume or automatic retired-recipe revival is claimed. The installed stop helper reported graceful Browser.close/root-tree stop and the keeper recorded runner exit0. All28 recorded process identities were absent afterward, with no recorded survivor; real-config hashes were unchanged. This is positive helper/keeper evidence plus bounded per-process absence, not per-process kernel teardown proof. Unrecorded Playwright-daemon exit remains qualified. Ticket2388 is released, the lead is closed and all owned transfer terminals are closed. Source/index remained unchanged. Raw logs/profiles are retained privately; no homes/auth/config values were archived.
All three are original uncropped1710×1073 captures on The PR body’s historical Conflict-blocking main sync and mechanical CI correction — Oct25 18:44Z. Pushed merge Intended refused-resume input (Brennan, Oct25): When resume is refused, text typed before the shell was ready stays on the shell's command line, unexecuted; the user can edit or clear it. Enter and control sequences are stripped from this same-pane user input, and the bracketed paste adds no Enter. The existing previous-session-unavailable / started-fresh line identifies the shell. This keeps today's editable input rather than adding a separate draft-recovery surface. The earlier finite Claude/Codex runtime assignment is complete, with the limits below; it does not cover the new admission followup. Its QA head remains
The fresh matching claim-settlement callback, conditional registered-entry/timer cleanup, historical/adopted or ambiguous receipts and optional old-host result fields remain source/contract-qualified. Their conditional arms were not all observed live. Missing optional fields do not require another completed-journey replay. Codex CLI exit means client exit, not background-server shutdown. Existing conservative overlap and unknown-dispatch protection can remain held without an expiry guarantee. Known limits remain visible: native History omits newer CLI turns in the Windows previous and candidate builds (STA-11703); the earlier Claude OPEN Sleep stop failure and later qualified followthrough remain recorded. Eight independently reproduced baseline main-layout failures and the inherited pane retry issue (STA-11918) remain disclosed. Operation-count contracts prove bounded work for the tested populations, not latency, heap, CPU or complete native teardown. No new source defect was established by the bounded evidence audits. Both historical finite-journey QA tickets are released; this does not describe the newly admitted ticket2388. Recorded app/daemon cleanup has positive exit receipts; final allocated listeners and known survivors were absent, and real config hashes were unchanged. A naturally settled Mac utility lacks a prearmed exit event and is only reported absent. No foreign rig was reused or stopped. For Brennan’s review: the retained whole-window captures below show the stated local and Windows Claude outcomes on their original heads. All captures retain their original heads and limits; none certifies the new71 admission flow or final-copy screenshot.
These captures retain their original heads and stated limits. Older-host compatibility, Claude (qualified completed evidence): exact older client FIRST returned the original target shell with usable input. The final client SECOND on the same progressed official 1.4.232 host reached the distinct same-conversation reply after normal native close. These images support the table above; the late recipe absence remains unattributed.
Current/current paired Codex: the refusal shell accepts ordinary input, then the original conversation replies elsewhere after normal native close. The raw audit and authentic CLI-client exit support this completed journey; the ownership and recipe-timing limits above remain.
Final finite Codex proof: older-client FIRST and final-client SECOND show distinct replies on the original conversation. Windows shows OPEN Sleep followthrough and useful PowerShell after CLOSED cold reply/exit. These whole-window images were hash-verified and personally inspected; the qualifications above apply.
Main merges after the retained QA head are Targeted in-chat notice proof and current-main attribution (Oct 25)The missing chat-send capture is below: a real terminal Claude is alive on the same conversation, and the existing native chat’s send is refused on History’s empty failed tab is inherited from actual current main, compared at
Added one known-limit line to the PR body and appended this cleanup to STA-12161, with normalized description readback verified. No ticket comment or production change was made. The existing review/QA limits and marker remain; no passed matrix was replayed. Fresh M4Air ticket2411 exercised only the missing in-chat cell on |





















ELI5
A Claude or Codex conversation can be open in two places in Orca at once: a terminal running the CLI (
claude --resume …,codex resume …) and a native chat tab. Before this PR, both could write to that one conversation at the same time. That happened in two ways:Two agents writing one conversation file can interleave turns or fork the history.
Now Orca checks first. A chat won't start its agent while a terminal might still be writing the conversation, and a restored terminal won't resume a conversation that an open chat holds.
What Changed
When a chat refuses, and what you see
The check runs each time a chat has to start its agent: when you send a message and the chat's agent isn't running. That covers the first message after reopening the chat tab, after an Orca restart, or from the phone. Opening or viewing the tab never triggers it. If a terminal might still be writing that conversation, the agent is not started. The message stays in the chat marked "Your message was not sent.", with this red notice below it:
(The agent name changes to match.) Once the terminal's CLI exits, the next send goes through normally. No timer, no button.
The same check applies to Resume in chat from a terminal tab and opening a conversation from Session History. Both paths show a toast: "{{agent}} is already running this conversation in another terminal. Quit {{agent}} there or close that terminal, then open this conversation from Session History."
Codex has its own lock as well. If Codex's server itself reports that the conversation already has an active writer, the chat shows: "Codex is still holding this conversation open. Try again in a moment, or close other Codex terminals."
What restored terminal panes do after a restart or wake
When Orca restarts or a sleeping workspace wakes, a terminal pane that had an agent conversation normally re-runs its resume command automatically. Before that command runs, the machine running the terminal now reads its saved chat records. It refuses the automatic resume if:
A refused pane opens as an ordinary, usable shell with the existing line
--- previous session unavailable, started fresh ---at the top. Nothing else runs in it. Orca also drops that pane's saved "resume this conversation" note, so the next restart doesn't try again. The only exception is the "can't tell" case, which keeps the note and checks again next time. If the chat holding the conversation is closed and its agent has stopped, the resume runs as before.Only automatic restores are checked. A command you type yourself is never changed or blocked. If the terminal's agent survived the restart (Orca's terminal daemon kept it running), Orca just reconnects to it, starts nothing, and shows no started-fresh line.
How detection works
There is no lock file and no new saved field. Orca combines two things it already has on the machine running the terminal:
The rule: while the agent's CLI is alive in a terminal, whether it's replying or idle at its prompt, the chat won't start its agent. Once the CLI exits (or the terminal is closed), the next send goes through.
Anything uncertain about an existing terminal or a known agent process counts as "might still be writing": a process Orca can't inspect, or a terminal that changed while it was checking. Losing that evidence never counts as proof that the agent exited.
Edge cases:
agent-session.saved-resume-origin.v1). Older servers keep their existing launch path and don't get the new restore check; a newer client still works with them. New result fields are optional: old servers leave them out and old clients ignore them. No new stream message type and no minimum server version.Why
The common pattern is to check ownership when the agent starts and to attach to the real live owner. Orca follows that pattern. It reuses the existing check that "Resume in chat" already used, and runs it right before a chat's agent starts, rather than adding a second record of who started what. Orca needs the process-list evidence because people start CLIs in terminals themselves, outside Orca's control. It needs the optional launch-result fields because client and server versions mix.
Alternatives I rejected:
Linked Issue
Tracked in #26417. Includes the saved-pane repair from #28288 without changing that draft PR.
Visual Proof
All screenshots are whole-window captures from test copies of Orca on this PR's QA commit. No "before" captures are attached.
Mac, Codex: restart with the chat open
--- previous session unavailable, started fresh ---./statusshows the same session, and a new prompt gets a reply. Refusing the restore lost nothing.pwdruns at a normal prompt. Codex's message means its shared background server may still hold the conversation; see known limits.Mac, Claude: chat refused while a terminal is writing
71e0d77, this existing native chat was reopened while the same conversation’s real terminal Claude was alive. The send shows "Your message was not sent." and the red notice: "Claude is already running this conversation in another terminal. Quit Claude there or close that terminal to continue here."claude --resume …, its earlier turns intact and a new reply.Windows, Claude: Sleep and Wake
/exitends Claude. It prints "Resume this session with: claude --resume …" and a normal PowerShell prompt returns. The Claude screen above it is leftover scrollback.Older paired server (Orca 1.4.232), Claude
claude --resume …run is in the scrollback, then the shell runs a typedprintf. It shows the old server's launch path still leaves a usable shell. The image alone can't show whether a resume was refused there.Paired remote server running this PR, Codex
codex resume …lines in its scrollback, no Codex running, and the shell running a typed command. The started-fresh line is not in this frame.More Codex runs: older server, then Windows
Testing
e09187b; its unchanged flows carry across later main merges and reviewed follow-ups. The targeted Claude Sleep → History reply → wake-to-shell flow and genuine live-Claude History refusal were exercised on71e0d77. CI on71e0d77is green (48 successful checks, 17 skipped).Notes
Intended differences
Known limits and follow-ups