Skip to content

A kill that reached the agent ends it, so the next message after Stop goes through - #34653

Merged
brennanb2025 merged 18 commits into
mainfrom
brennanb2025/kill-exit-proof
Oct 29, 2026
Merged

brennanb2025 merged 18 commits into
mainfrom
brennanb2025/kill-exit-proof

Conversation

@brennanb2025

@brennanb2025 brennanb2025 commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor
Files Added Deleted Net
Test 21 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​1701 $\color{#cf222e}{\Huge{\mathbf{−}}}$​60 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​1641
Prod 49 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​924 $\color{#cf222e}{\Huge{\mathbf{−}}}$​304 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​620

Problem and behavior

After Stop force-killed an agent, a late or missing exit callback could leave the native chat permanently closing. Later provider actions repeated the stop ladder and could refuse with “Couldn't stop {agent} from before.” A journal-write failure could likewise leave a turn Working because recovery abandoned the unconfirmed close.

An irreversible kill delivered to the conversation writer now settles the child and releases its existing ownership fence with kill-delivered evidence. The next message resumes the same conversation without repeating the kill ladder just to rediscover that fact. If writer termination remains unproven, Orca retains the closing child and retries through the existing action path. Next-turn option intent can still be saved without waiting for a provider close; old approval cards remain tied to their original child.

Journal failure retains the existing host-fault cause while closing. Once writer death is established, the turn ends with the existing failure presentation and a later send can resume. Without death proof, the child remains closing with that fault retained until a legitimate termination or exit; this does not manufacture a successful close.

Mechanism and compatibility

  • On supervised macOS/Linux launches, including the normal Pi and ACP paths, writer evidence comes from delivery to the actual agent process group. Killing only its supervisor does not count. An actually unsupervised launch uses its root process.
  • On Windows, successful process-tree termination supplies the new delivery fact. Root-only cleanup supplies none. A later cleanup error cannot erase successful delivery.
  • Stop, failed acquisition and attachment, route release, workspace sleep, recovery and existing close consumers carry the same evidence. Managed retries keep the irreversible fact for the same child while stricter descendant cleanup remains independently retryable.
  • The stored-record reader accepts the new evidence kind. A late observation can refine only the same released fence and cannot release a replacement owner. Old saved records and old paired execution paths retain their existing behavior.

The common pattern is to finalize a stopped context and serialize the next operation. The intended difference is Orca's durable ownership fence across chat, terminal and paired clients: failed termination cannot authorize another writer.

Scope and validation

Full review path: this changes process lifecycle, ownership, recovery and persisted evidence. The pre-code plan was independently reviewed; the review loop found and repaired evidence-retention, detached-cleanup and evidence-forwarding defects in place. Brennan's 10-27 scope ruling keeps this PR on the two reported bugs. The pre-existing case where a wrapper exits while its writer survives is a temporary limitation tracked in STA-12558; this PR does not claim to replace root-exit authority with a new process-containment system.

Four formal review rounds are complete. The final production review, reference comparison and readiness review passed on the current head, with no new confirmed findings. Main was integrated before QA. A later proven merge conflict required integrating pinned main 54fa316; independent review confirmed that the two test-infrastructure resolutions and compiler-erased Pi return annotation preserve the QA’d behavior. Targeted production-contract tests run through actual Claude connections, managed teardown, routing, host/journal and SQLite settlement, including failed acquisition, healthy continuation, retained non-root exits and close before acknowledgment; three controlled pre-fix cases reproduce the wrong evidence kind. The Stop feedback consumer also accepts the exact child’s delivered termination, including cached and already-retired close paths, so a missing root callback alone does not produce an unconfirmed Stop warning. Independent pause, interrupt, workload and request errors still produce their existing feedback. Mandatory commit hooks passed.

CI is green on current head b602e74d21a4b8a43fde4bdc6c2440694a9d1bbd (primary run 40897984016, WSL/templates 40897983863, three-platform runtime 40897983986). The exact-head watcher completed successfully, covering static analysis/typechecking, the test shards, persistence, cross-version compatibility and packaging. Final maintenance uses the canonical test-fixture provider-handle reader; all nine retained Stop-evidence cases and mandatory hooks passed.

The required runtime QA round is complete on 87d49d9adef8f274defad4b165a909af68751bf9, carried across the reviewed main integration above. Accepted evidence covers a real graceful previous-build upgrade preserving setup results, default tabs, settings and histories, plus two Claude/Codex replies; published Sleep/wake; both agents’ Stop/continuation, journal-failure recovery, failed attachment/reopen/reply, and acquired-unpublished Sleep/cancel/wake/reply. Windows Claude and Codex termination both reached Interrupted and a real next reply, with independent writer absence, ownership release and genuine old-callback isolation. The final Codex outcome is observed as pause acknowledged, interrupt accepted, root unproven, workload exited, kill-delivered and errors empty. Windows Pi termination, closeAll continuation and existing queued-message recovery are accepted. OpenCode exercised ACP output-failure/automatic-close/reopen/reply and startup cancellation/recovery.

The final review comment links 32 original whole-window captures. Historical failed attempts remain failed, with their instrumentation and containment limits preserved in the private evidence ledger. The last Windows Codex image shows Interrupted and the successor request but omits the reply paragraph from its viewport; actual DOM, loaded state and the saved completed turn confirm the distinct reply. Its pre-send image was stale, and the requested tool yield argument was unexposed. These are disclosed capture limits, not fabricated passes. Owned QA copies, controllers, leads and readers are stopped and both machine admissions released.

A temporary, pre-existing P2 observed during ACP recovery is tracked in STA-12826: recovered output from the same local request can be labelled as an outside continuation. Independent source and saved-artifact review confirmed the misleading attribution without demonstrating a PR regression or history loss; the failed turn remains and the next reply completed. Recovery presentation is unchanged in this PR.

Tracked in STA-12354 and STA-12355. Earlier attempts: #25866 and #24507 (left open).

…message goes through

After Stop, tab close, idle rest or workspace sleep, Orca force-kills the
agent. It used to accept the old agent as gone only when it saw the exit
report within about a second; otherwise every later message re-ran the kill
and was refused with "Couldn't stop {agent} from before." A kill delivered to
the agent itself now ends it and releases the chat with kill-delivered
evidence; the refusal remains only when the kill could not reach the agent.

When writing the chat's journal fails and the following kill can't be
confirmed, recovery now records the close with its fault instead of silently
returning, so the turn no longer stays Working and later sends retry the stop.

Tracked in STA-12354 and STA-12355.
@brennanb2025
brennanb2025 marked this pull request as ready for review October 28, 2026 01:30
@coderabbitai

coderabbitai Bot commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Note

Reviews paused

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

Use the following commands to manage reviews:

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

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
Walkthrough

Provider teardown and managed-process close results now report delivered-kill evidence separately from observed root or tree exit. ACP, Claude, Codex, and Pi connections use this evidence during close and acquisition handling. Structured-session events and lease records can preserve the evidence, and stored evidence can be upgraded when a later event reports an observed exit. Tests cover teardown outcomes, evidence persistence, and subsequent session activity.

Priority: Pending latest changes

Merge Risk: Moderate · up to f843c

Static-analysis readiness remains unresolved, and recovered sessions may fail to persist final termination evidence in read-only mode.

Pre-merge checks: Passed 4 · Failed 1

Failed Failed checks: 1 warning

Check name Status Explanation Resolution
Docstring Coverage Warning Docstring coverage is 43.75% 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 describes the main behavior change: a delivered kill ends the agent so the next message can proceed after Stop.
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 directly addresses the problem, behavior, mechanism, compatibility, linked issues, review status, testing, QA, and known limitations. It does not use all template headi…
Full details: Description check

Explanation

The description is detailed and directly addresses the problem, behavior, mechanism, compatibility, linked issues, review status, testing, QA, and known limitations. It does not use all template headings or checklist boxes, and it does not provide a dedicated Visual Proof section, but the required information is largely present in substance.

Full details: Docstring Coverage

Explanation

Docstring coverage is 43.75% 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 48 functions across 57 files.

Resolution

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

Finishing Touches: 💡 2
📝 Generate docstrings: 💡
  • Commit to this branch
  • Create a new PR
🛠️ Fix failing CI checks: 💡
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2


Review info
Run configuration
  • 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: b2f0a5bd-9331-4e01-a3cd-6ae2a38ffb1c
Commits

Reviewing files that changed from the base of the PR and between e8d5713 and 9d0ffd4.

Files selected for processing: 56
  • config/vitest.config.ts
  • src/main/acp/acp-agent-connection.test.ts
  • src/main/acp/acp-agent-connection.ts
  • src/main/acp/acp-detached-cleanup.test.ts
  • src/main/acp/acp-structured-child-lifecycle.ts
  • src/main/acp/acp-structured-connection.ts
  • src/main/acp/acp-structured-session-adapter.ts
  • src/main/acp/acp-structured-session.ts
  • src/main/claude/claude-agent-sdk-exit-proof.test.ts
  • src/main/claude/claude-agent-sdk-exit-proof.ts
  • src/main/claude/claude-stream-json-connection.ts
  • src/main/claude/claude-structured-acquisition-launch.ts
  • src/main/claude/claude-structured-session-close.ts
  • src/main/claude/structured/claude-structured-session-state.ts
  • src/main/codex/codex-app-server-connection.ts
  • src/main/codex/codex-structured-acquisition-lifecycle.ts
  • src/main/codex/codex-structured-session-close.ts
  • src/main/codex/codex-structured-session-teardown.ts
  • src/main/ipc/pty-spawn-saved-resume-admission.test.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-acquisition-errors.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-acquisition-route.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-adapter-router.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-adapter.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-attach-failure.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-child-close.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-child-exit.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-claude-stop-exit-ends-record.test.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-codex-input-host.test.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-current-work.test.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-event-recovery.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-failed-create-refusal.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-host-types.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-lease-release.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-provider-exit-proof.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-queued-quit.test.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-restart-interruption-test-harness.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-stale-turn-open.test.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-workspace-sleep-stop.ts
  • src/main/pi/rpc-session-adapter.ts
  • src/main/pi/rpc-session.ts
  • src/main/provider-process/managed-provider-process-fallback-tree.test.ts
  • src/main/provider-process/managed-provider-process.ts
  • src/main/provider-process/managed-provider-writer-close.test.ts
  • src/main/provider-process/provider-acquisition-starts.ts
  • src/main/provider-process/provider-process-close.ts
  • src/main/provider-process/provider-process-teardown.test.ts
  • src/main/provider-process/provider-process-teardown.ts
  • src/main/provider-process/supervised-child-process-stop.ts
  • src/main/runtime/agent-session-acquisition-exit-transition.ts
  • src/main/runtime/agent-session-acquisition-failure-settlement.ts
  • src/main/runtime/agent-session-death-evidence-persistence.test.ts
  • src/main/runtime/agent-session/ownership/agent-session-surface-release-transition.ts
  • src/main/runtime/structured-agent-session-codex-goal-stop-settings.test.ts
  • src/main/runtime/structured-agent-session-pi-kill-retry.test.ts
  • src/main/runtime/structured-claude-runtime-adapter.ts
  • src/shared/agent-session-record.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.

Comment thread src/main/pi/rpc-session.ts Resolved

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to GitHub limitations.

⚠️ Outside diff range comments (1)

Minor · Use an in-memory transaction for the late… · structured-agent-session-lease-release.ts:46-79

src/main/native-chat/agent-session-wire/structured-agent-session-lease-release.ts:46-79
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Use an in-memory transaction for the late evidence upgrade.

When no live child matches, settleStructuredAgentSessionChildExit calls the upgrade. transitionHandoff calls mutate without transaction options, so a read-only store rejects the upgrade. The rejection propagates from structured-agent-session-event-recovery.handle, and the record remains kill-delivered.

Forward an optional transaction option through mutate, and enable it only for this evidence-only transition.

Suggested fix
   transitionHandoff = (
     sessionId: string,
-    transition: (record: AgentSessionRecord) => AgentSessionRecord
-  ): Promise<AgentSessionRecord> => this.mutate(sessionId, transition)
+    transition: (record: AgentSessionRecord) => AgentSessionRecord,
+    options: { inMemoryWhenReadOnly?: boolean } = {}
+  ): Promise<AgentSessionRecord> => this.mutate(sessionId, transition, options)
...
   private async mutate(
     sessionId: string,
-    apply: (record: AgentSessionRecord) => AgentSessionRecord
+    apply: (record: AgentSessionRecord) => AgentSessionRecord,
+    options: { inMemoryWhenReadOnly?: boolean } = {}
   ): Promise<AgentSessionRecord> {
-    return this.transact((draft) => {
+    return this.transact((draft) => {
       const record = requireWritableAgentSessionRecord(draft, sessionId)
       const next = apply(record)
       draft.records.set(sessionId, next)
       return next
-    })
+    }, options)
   }
-    await store.transitionHandoff(event.sessionId, (current) => {
+    await store.transitionHandoff(event.sessionId, (current) => {
       if (
         current.lease.claimStatus !== 'released' ||
         current.lease.deathEvidence?.kind !== 'kill-delivered' ||
@@
           }
         }
       }
-    })
+    }, { inMemoryWhenReadOnly: true })

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: c59e1b2f-fa2f-4449-8e4a-3ec2b972dc67
Commits

Reviewing files that changed from the base of the PR and between 17a4130 and f843c94.

Files selected for processing: 3
  • src/main/claude/claude-stream-json-connection.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-current-work.test.ts
  • src/main/runtime/agent-session-death-evidence-persistence.test.ts
Files skipped from review as they are similar to previous changes: 1
  • src/main/claude/claude-stream-json-connection.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.

@greptile-apps

greptile-apps Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

RetriggerView in GreptileConfidence Score: 5/5

[High impact] No actionable code issue was found; the author's stated runtime QA gate still applies before merging.

Summary

The PR lets a delivered kill end the current agent child and release its ownership fence without waiting for a missing exit callback.

  • Provider closes record when termination reaches the conversation writer.
  • Shared chat lifecycle settles the matching child and saves its termination evidence.

No new actionable issue was found. This review did not run tests or runtime QA.

Acknowledged limitations in the PR description supplied by brennanb2025:

  • A wrapper can exit while its writer survives. This is explicitly deferred to STA-12558.
  • ACP recovery can label output from the same request as an outside continuation. This is described as pre-existing and tracked in STA-12826.
  • Runtime QA is still in progress, including incomplete Windows Claude and Codex termination proof.

Diagram

%%{init: {'theme': 'neutral'}}%%
flowchart TD
  A[Stop or recovery requests close] --> B{Writer death established?}
  B -->|Exit observed| C[End the current child]
  B -->|Kill delivered to writer| C
  B -->|No proof| D[Keep the child closing]
  D --> E[Retry through a later action]
  C --> F[Release the same ownership fence]
  F --> G[Next send resumes the conversation]
Loading

Reviews (1) · Last reviewed commit: "Merge main to resolve integration confli..." · Reviewed by Greptile

@brennanb2025

brennanb2025 commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor Author

After Stop force-killed an agent, a missing exit callback could leave later sends waiting on the old process. A journal failure could also leave a turn Working without showing its failure. The PR carries confirmed writer termination through the existing ownership and failure-settlement paths, and keeps unknown termination conservative.

Four formal review rounds are complete, with zero new findings in round 4. Fixes include teardown evidence, same-child close-result retention, failed acquisition and attachment, and exact-child Stop feedback through cached and already-retired close paths. Independent pause, interrupt, workload and request errors retain their existing feedback. Final source, reference, performance and readiness reviews agreed. QA evidence is on 87d49d9. After the pre-QA main sync, a proven merge conflict required integrating pinned main 54fa316. Independent review confirmed the two test-infrastructure resolutions and erased Pi return-type repair preserve the exercised behavior.

Current head: b602e74. CI GREEN: same-head watcher completed successfully; primary campaign 40897984016 covers static analysis/typechecking, ten unit shards, packaging and cross-version checks; campaigns 40897983863 and 40897983986 cover WSL/templates and three-platform runtime checks. Mandatory hooks and nine retained Stop-to-SQLite contract cases passed after the final fixture maintenance; the prescribed merge hook also passed.

Temporary: the pre-existing Windows wrapper-exit authority boundary remains tracked in STA-12558 under the binding scope ruling. Optional late same-fence refinement remains deferred without a confirmed user-visible failure.

The required QA round is complete. Accepted evidence covers a real graceful upgrade with preserved settings, setup, default tabs and histories; two Claude/Codex replies; normal published Sleep/wake; Claude and Codex Stop/reply; Claude and Codex journal-failure recovery (including the retained-close legitimate wake); and both agents' failed-attachment/reopen/reply and acquired-unpublished Sleep/cancel/wake/reply. The final Codex Stop capture shows the actual clean wind-down, no new warning, real next reply and late-event isolation. Windows Pi termination, its closeAll continuation and its existing queued-card recovery/reply are accepted, with the first forced stop distinguished from the later graceful same-profile restart. Historical instrumentation gaps remain disclosed in the private ledger. Supplemental new-kind reload and folder contracts are covered by tests and the accepted upgrade rather than duplicate app campaigns.

Windows Claude termination, real next reply and late-callback isolation are accepted after independent source/artifact review. Its session-only acknowledgment and absence of a Codex composite outcome are disclosed rather than replaced with fabricated fields. Windows Codex termination is also accepted: default process-tree termination returned true while the original callback was held; independent queries found the recorded writer processes absent; the exact child’s kill-delivered receipt released the captured ownership fence; Stop showed Interrupted; one new message produced a real reply under the sole successor. The complete observed Codex outcome retained root=unproven with delivered termination, workload=exited, acknowledged pause, accepted interrupt and no errors. Restoring the genuine old callback left the successor intact. A fresh restoration acknowledgment preceded return to the driver. ACP output-failure lifecycle evidence is accepted: actual resolver rejection, automatic close, released ownership, ordinary same-native reopen and a completed real reply. On reopen, native history imported the failed prompt and one provider assistant record with five lines beneath a ‘Continued outside this chat’ divider; independent source and saved-artifact tracing classifies that attribution as a pre-existing P2 tracked in STA-12826, with no demonstrated PR regression or history loss. ACP acquired-unpublished cancellation/wake/reply is accepted; its helper’s exact text locator missed the actual trailing period, with completion independently confirmed in UI and persisted records. Owned copies and controllers were stopped and cleanup verified. The earlier failed attempts remain failed; the accepted outcomes come from the later completed attempts. The final Windows Codex screenshot shows Interrupted and the successor request, but its assistant text is outside the captured viewport; the actual DOM, loaded state and persisted completed turn independently contain the new reply. The pre-send image was stale and is not draft proof, and the requested tool yield argument was not exposed. No result is inferred from those missing fields.

For Brennan’s review: three judgment points are irreversible writer-delivery evidence, release of the captured owner fence, and Stop feedback that retains independent errors.

For Brennan’s review: whole-window captures of each exercised flow. Visible outcomes are supported by process, ownership and persistence artifacts; screenshots alone do not establish those facts.

QA screenshots
Flow Capture
Previous-build upgrade / two Claude replies Screenshot
Previous-build upgrade / two Codex replies Screenshot
Folder preservation Screenshot
Codex Stop Screenshot
Codex after Stop reply Screenshot
Claude journal failure Screenshot
Claude startup cancellation Screenshot
Claude attachment failure Screenshot
Claude after attachment failure Screenshot
Codex attachment failure Screenshot
Codex startup cancellation Screenshot
Claude after journal failure Screenshot
Codex after attachment failure Screenshot
Codex journal recovery failure.png Screenshot
Codex journal recovery real-reply.png Screenshot
Claude Stop Screenshot
Claude after Stop reply Screenshot
Normal published Sleep Screenshot
ACP startup cancellation Screenshot
Windows Pi existing queued card before recovery Screenshot
Windows Pi recovered reply Screenshot
Accepted Windows Pi Windows-Pi-F10-interrupted Screenshot
Accepted Windows Pi Windows-Pi-F10-reply Screenshot
Accepted Windows Pi Windows-Pi-after-closeAll Screenshot
ACP existing failed turn before recovery Screenshot
ACP output failure Screenshot
ACP recovered reply, including observed history divider Screenshot
Baseline Codex Stop Screenshot
Baseline Codex refused next send Screenshot
Windows Claude F10 actual before Send Screenshot
Windows Claude F10 actual Stop and real reply; internal observer gaps recorded Screenshot

| Windows Codex F10 Interrupted and completed successor request; reply text confirmed by DOM and persistence | Screenshot |

@brennanb2025
brennanb2025 merged commit 98f5d13 into main Oct 29, 2026
59 checks passed
@brennanb2025
brennanb2025 deleted the brennanb2025/kill-exit-proof branch October 29, 2026 19:16
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