diff --git a/doc/plans/2026-10-10-boat-validation.md b/doc/plans/2026-10-10-boat-validation.md
index 3c261282d85..13e193ce77d 100644
--- a/doc/plans/2026-10-10-boat-validation.md
+++ b/doc/plans/2026-10-10-boat-validation.md
@@ -2,18 +2,18 @@
**Experimental and unmerged. Local journeys and partial staging qualification passed on the sources below; final-source staging acceptance remains incomplete.** A successful build, probe, or earlier-source journey does not establish the remaining product conditions.
-## Current source boundary (2026-10-11 09:34 UTC)
+## Current source boundary (2026-10-11 09:55 UTC)
| Surface | Source and evidence |
| --- | --- |
-| Combined implementation | `17b0910b804ad356cf884f4c7bb1509c6808d5ec`, adding the reviewed dependency-loader correction; new-head CI is pending. At 09:27 UTC, combined PR head 35de9f0bae had 53 successful checks, no pending or failed checks, fresh review 5/5 and zero unresolved threads. The preceding code head `06906ab358c752dd263abfd56f102c00745cd23d` had green CI: at 08:54 UTC all 54 checks passed on the active PR workflow; fresh review scored 5/5 with zero unresolved threads. Ten cancelled entries belong to a superseded duplicate workflow and remain in the receipt. |
+| Combined implementation | `4809c1b724944db3ee427e0909cb178885ba63bf`, adding the reviewed dependency-loader correction and disconnect warning after panel closure; new-head CI is pending. At 09:27 UTC, combined PR head 35de9f0bae had 53 successful checks, no pending or failed checks, fresh review 5/5 and zero unresolved threads. The preceding code head `06906ab358c752dd263abfd56f102c00745cd23d` had green CI: at 08:54 UTC all 54 checks passed on the active PR workflow; fresh review scored 5/5 with zero unresolved threads. Ten cancelled entries belong to a superseded duplicate workflow and remain in the receipt. |
| Core branch | `8e8999d681b42a19bfee2540c4345193f29f31ca`, adding the reviewed dependency-loader correction; new-head CI is pending. For preceding head `1ab3cb94e0` at 09:27 UTC, 54 checks passed and four were skipped, with no pending or failed checks, fresh review 5/5 and zero unresolved threads. The preceding head `e3b12138c6c15460d2e372b0dce1d1cbba491fa9` had green CI: at 08:54 UTC, 54 checks passed and four were skipped; fresh review scored 5/5 with zero unresolved threads. Includes optional closed upload-phase diagnostics and two test-fixture corrections. |
-| Verified staging source | Deployment25 verified `ca07557247533531b85045a1dc20c231dc9cd1de` at 08:36:19.883 UTC through the official workflow. Includes shared upload scheduling, warm-owner orphan-sweep correction and the public-module import fix. Native Claude cold and warm turns passed. Actual Codex child cancellation and continued survival of its exact Claude sibling were observed; the sibling subsequently completed successfully. Native post-idle return failed after same-run recovery. |
-| Local retry | Local48 uses compatible controller `9808eae33768f4a8beb31f3955737713a5f737ae` and unchanged qualified immutable diagnostics pack `sha256:4ef25756f766016da224f37f68c138c0c4a9ef9d128e6c2fc415f5c57ce38573`. Full upload, cold and warm Claude turns, warm retention and natural archive passed. The same-session post-idle attempt failed its first `turn.start` at provider initialization; the primary attempt failed at 08:53:45.338, then same-run recovery ended at 08:55:27.617 with `runner_state_identity_mismatch: authority_indeterminate`. Local49 is now qualifying the corrected package through a new ordinary task. |
+| Verified staging source | Deployment26 verified d5bce13cca01732105df15487000a260ae3c973c at 09:41:21.624 UTC. Both simultaneous legacy runs succeeded and released their leases. Deployment27 is building candidate2605a03f00 with the dependency-loader correction and disconnect-warning fix; it is not yet serving. Earlier deployment25 verified `ca07557247533531b85045a1dc20c231dc9cd1de` at 08:36:19.883 UTC through the official workflow. Includes shared upload scheduling, warm-owner orphan-sweep correction and the public-module import fix. Native Claude cold and warm turns passed. Actual Codex child cancellation and continued survival of its exact Claude sibling were observed; the sibling subsequently completed successfully. Native post-idle return failed after same-run recovery. |
+| Local retry | Local48 uses compatible controller `9808eae33768f4a8beb31f3955737713a5f737ae` and unchanged qualified immutable diagnostics pack `sha256:4ef25756f766016da224f37f68c138c0c4a9ef9d128e6c2fc415f5c57ce38573`. Full upload, cold and warm Claude turns, warm retention and natural archive passed. The same-session post-idle attempt failed its first `turn.start` at provider initialization; the primary attempt failed at 08:53:45.338, then same-run recovery ended at 08:55:27.617 with `runner_state_identity_mismatch: authority_indeterminate`. Local49 cold and warm passed on immutable pack640c; its post-idle run exposed agent_startup_unverified_module and ended failed after same-run recovery at09:51:04.712. Local50 will qualify the dependency-loader correction using a new ordinary task; old saved authority remains intact. |
-Final-source live acceptance remains incomplete. Open conditions include reliable Claude post-idle continuation, simultaneous admission from archived state, embedded human input, and completion of the staging lifecycle. The full local suite remains **34,914 passed, 24 failed, 338 skipped**; no full-suite green result is claimed. Earlier-source computer-use and HMR passes remain recorded below.
+Final-source live acceptance remains incomplete. Open conditions include reliable Claude post-idle continuation and completion of the latest-package staging lifecycle. Simultaneous archived admission passed on deployment26. Embedded human mouse and keyboard input subsequently passed in Chrome on deployment25. The full local suite remains **34,914 passed, 24 failed, 338 skipped**; no full-suite green result is claimed. Earlier-source computer-use and HMR passes remain recorded below.
-Current [CI and review receipt](assets/2026-10-10-boat/evidence/ci-1ab3cb-35de9-passed.json), [verified deployment](assets/2026-10-10-boat/evidence/staging25-deployment.json). The [consolidated earlier retry receipt](assets/2026-10-10-boat/evidence/retry-qualification-summary.json) preserves earlier sources, failures and receipt hashes. A deployment proves serving source, not product acceptance. No provider stop was forced or cancelled, no quarantine was cleared, and no database history was reset or rewritten.
+Latest [CI and review snapshot](assets/2026-10-10-boat/evidence/ci-8e8999-9eb142-0949.json), [preceding green heads](assets/2026-10-10-boat/evidence/ci-1ab3cb-35de9-passed.json), [verified deployment26](assets/2026-10-10-boat/evidence/staging26-deployment.json). The [consolidated earlier retry receipt](assets/2026-10-10-boat/evidence/retry-qualification-summary.json) preserves earlier sources, failures and receipt hashes. A deployment proves serving source, not product acceptance. No provider stop was forced or cancelled, no quarantine was cleared, and no database history was reset or rewritten.
## Local48 and deployment25 follow-up (2026-10-11 08:57 UTC)
@@ -59,6 +59,25 @@ Core 8e8999d681 / combined 17b0910b80 corrects an offline-reproduced dependency-
This proves the offline defect, not the cause of historical live initialization failures. Local49 remains frozen on its preceding immutable package for its current lifecycle. Staging cherry-pick 683696352d is prepared but not deployed; the ongoing deployment26 still targets d5bce13cca.
+## Embedded human control passed in Chrome (2026-10-11 09:37 UTC)
+
+A normal Computer Connect in Chrome rendered one embedded stream. A native click on the observed remote dock icon visibly launched Chromium. Actual key events selected the address bar contents, entered example.net and pressed Return; the final screenshot shows that exact address and Example Domain content inside Paperclip's Computer panel. **Embedded mouse and keyboard control passed.** Text insertion through the automation typeText method had no effect and is not counted as keyboard proof. The in-app-browser attempt remains inconclusive. No direct viewer, second stream, guest input injection or product permission change was used. The viewer closed normally before 09:37:10 UTC. [Action receipt](assets/2026-10-10-boat/evidence/staging25-chrome-embedded-control.json), [visible successful result](assets/2026-10-10-boat/staging25-chrome-embedded-control.png).
+
+
+## Local49 warm pass and deployment26 admission (2026-10-11 09:45 UTC)
+
+Local49 cold run 6fcda24f succeeded at 09:39:01.367 after all 301 artifact chunks transferred without a recorded timeout/error. The 1166MiB provider package transfer was slow; this is a successful first-use transfer, not an acceptable-latency claim. Ordinary warm follow-up 6a07f42f succeeded at 09:41:00.398 with the same native session, logical runner, provider thread and physical owner/boot/launch identity. Both original file hashes matched. The configured warm deadline is 09:46:00.347; natural archive and post-idle continuation are still pending. [Lifecycle receipt](assets/2026-10-10-boat/evidence/local49-lifecycle.json), [cold result](assets/2026-10-10-boat/local49-claude-cold.png), [warm command result](assets/2026-10-10-boat/local49-claude-warm.png).
+
+Deployment26 verified d5bce13cca01732105df15487000a260ae3c973c serving at 09:41:21.624. A read-only provider check at 09:42:25.595 confirmed archived/healthy state and completed stop, without guest reads. Legacy Codex run 73bc6d17 and Claude run e3daa441 started 65ms apart at 09:43:05. Both acquired active leases and entered active ownership, with no admission error at 09:44:53.764. Actual task completion remains pending. [Deployment](assets/2026-10-10-boat/evidence/staging26-deployment.json), [archived baseline](assets/2026-10-10-boat/evidence/staging26-archived-baseline.json), [initial concurrent admission](assets/2026-10-10-boat/evidence/staging26-legacy-admission-initial.json), [both active leases](assets/2026-10-10-boat/evidence/staging26-legacy-admission-active.json).
+
+
+## Concurrent archived admission passed (2026-10-11 09:48 UTC)
+
+Both deployment26 legacy runs **succeeded**: Codex 73bc6d17 at 09:45:16.749 and Claude e3daa441 at 09:45:21.193. Each released its lease with successful cleanup and retired its owner; the scoped query found no replacement runs. Starting 65ms apart from completed archive no longer produced the observed HTTP409 admission failure. [Final run/lease receipt](assets/2026-10-10-boat/evidence/staging26-legacy-admission-final.json).
+
+Claude reported its unchanged original proof hash and personal home. Codex corrected helper argument/heredoc mistakes within its run and reached Done, but its final four fields were empty; its last activity was shown as interrupted before provider completion. Therefore this pair proves concurrent admission, successful run disposition and cleanup; it is **not** a fresh independent Codex proof-hash verification. Earlier successful proof reads remain source-specific evidence. [Claude result](assets/2026-10-10-boat/staging26-legacy-claude-result.png), [Codex reporting defect](assets/2026-10-10-boat/staging26-legacy-codex-result.png).
+
+
## Product outcomes
Historical product observations in this table are UTC on 2026-10-10; the retry table gives its later dates. “Passed” applies only to the named observation; gaps remain explicit.
@@ -79,6 +98,18 @@ Historical product observations in this table are UTC on 2026-10-10; the retry t
Receipts: [staging corrected legacy runs](assets/2026-10-10-boat/evidence/staging-11-legacy-regression.json), [local corrected legacy runs](assets/2026-10-10-boat/evidence/local-32-legacy-acceptance.json), [Claude lifecycle](assets/2026-10-10-boat/evidence/claude-cold-warm.json), [Codex second idle](assets/2026-10-10-boat/evidence/codex-second-idle.json), [local HMR](assets/2026-10-10-boat/evidence/vite-warm-hmr.json), [partial staging](assets/2026-10-10-boat/evidence/staging-73b2-acceptance.json), and [editor save](assets/2026-10-10-boat/evidence/local-30-persistent-save-proof.json).
+## Local49 final post-idle result (2026-10-11 09:53 UTC)
+
+Run `825e1f90` retained the original native session, logical runner, Claude thread and immutable pack640c after natural archive. Attach and snapshots passed, but `turn.start` rejected `agent_startup_unverified_module` at09:49:35.623. The corrected fatal-import settlement exposed a specific guarded dependency failure instead of another opaque initialize timeout. It does **not** identify the rejected module or prove that ctime drift caused this live rejection. Same-run recovery finally failed `runner_state_identity_mismatch: authority_indeterminate` at09:51:04.712. No active or queued runs or owners remained at09:52:03; Boat was archived and healthy, with normal stop completed at09:51:12.415. **Post-idle acceptance still fails on pack640c.** [Complete lifecycle receipt](assets/2026-10-10-boat/evidence/local49-lifecycle.json), [visible failed task](assets/2026-10-10-boat/local49-post-idle-failed.png).
+
+The next ordinary task will select qualified immutable pack `sha256:f6fbd13c71cdaf93060a7c240cbce1c8dfce2aefe5669db27d254b3b95dfb0a0`, which adds core8e8999's bounded dependency read continuity correction. No previous package, saved task authority, quarantine or checkpoint is being rewritten.
+
+## Reviewed viewer warning and staging27 candidate (2026-10-11 09:55 UTC)
+
+Combined `4809c1b724` surfaces a failed exact-owner disconnect after the Computer panel closes through the existing global warning toast. It survives panel unmount for the normal eight-second toast lifetime; a mounted panel displays the fixed safe message inline. Raw errors and credentials are excluded, and cleanup/retry behavior is unchanged. All52 affected UI tests, UI TypeScript, token gates and independent review passed. [Verification receipt](assets/2026-10-10-boat/evidence/computer-disconnect-warning.json).
+
+After the concurrent staging26 tasks and leases fully settled, deployment27 was dispatched through the official pipeline for compatible candidate `2605a03f00bc3d7decc8b8d5549ee06f8d77ae85`. This includes the reviewed loader and viewer-warning fixes. It remains pending; no serving-source or product-acceptance pass is inferred from dispatch.
+
## Latest retries
These outcomes do not erase earlier source-specific passes. The [retry receipt](assets/2026-10-10-boat/evidence/retry-qualification-summary.json) preserves the failures and the narrower boundary checks.
diff --git a/doc/plans/assets/2026-10-10-boat/evidence/ci-8e8999-9eb142-0949.json b/doc/plans/assets/2026-10-10-boat/evidence/ci-8e8999-9eb142-0949.json
new file mode 100644
index 00000000000..a89326cbe48
--- /dev/null
+++ b/doc/plans/assets/2026-10-10-boat/evidence/ci-8e8999-9eb142-0949.json
@@ -0,0 +1,135 @@
+{
+ "checkedAt": "2026-10-11T09:49:44.638945+00:00",
+ "prs": [
+ {
+ "pr": 15813,
+ "head": "8e8999d681b42a19bfee2540c4345193f29f31ca",
+ "reviewHead": "8e8999d681b42a19bfee2540c4345193f29f31ca",
+ "mergeable": "MERGEABLE",
+ "counts": {
+ "SKIPPED": 4,
+ "SUCCESS": 53,
+ "IN_PROGRESS": 1
+ },
+ "failures": [],
+ "focusChecks": [
+ {
+ "__typename": "CheckRun",
+ "completedAt": "2026-10-11T09:36:46Z",
+ "conclusion": "SUCCESS",
+ "detailsUrl": "https://github.com/paperclipai/paperclip/actions/runs/38128707028/job/114441222975",
+ "name": "ci / e2e shard (8/8)",
+ "startedAt": "2026-10-11T09:32:40Z",
+ "status": "COMPLETED",
+ "workflowName": "PR"
+ },
+ {
+ "__typename": "CheckRun",
+ "completedAt": "2026-10-11T09:39:27Z",
+ "conclusion": "SUCCESS",
+ "detailsUrl": "https://app.greptile.com/paperclip-org-3/github/paperclipai/paperclip/-/pull/15813",
+ "name": "Greptile Review",
+ "startedAt": "2026-10-11T09:32:05Z",
+ "status": "COMPLETED",
+ "workflowName": ""
+ }
+ ],
+ "pending": [
+ "ci / Verify serialized server suites (7/9)"
+ ],
+ "unresolved": [],
+ "moreThreads": false,
+ "greptileSummary": [
+ {
+ "url": "https://github.com/paperclipai/paperclip/pull/15813#issuecomment-6099291617",
+ "updatedAt": "2026-10-11T09:39:34Z",
+ "reviewedCommits": [
+ "8e8999d681b42a19bfee2540c4345193f29f31ca"
+ ],
+ "score": [
+ "5"
+ ]
+ }
+ ]
+ },
+ {
+ "pr": 15804,
+ "head": "9eb1424f4ecee14c528b33a2a0ed3f1628b05c79",
+ "reviewHead": "9eb1424f4ecee14c528b33a2a0ed3f1628b05c79",
+ "mergeable": "MERGEABLE",
+ "counts": {
+ "SUCCESS": 52,
+ "FAILURE": 1
+ },
+ "failures": [
+ {
+ "__typename": "CheckRun",
+ "completedAt": "2026-10-11T09:40:07Z",
+ "conclusion": "FAILURE",
+ "detailsUrl": "https://app.greptile.com/paperclip-org-3/github/paperclipai/paperclip/-/pull/15804",
+ "name": "Greptile Review",
+ "startedAt": "2026-10-11T09:34:21Z",
+ "status": "COMPLETED",
+ "workflowName": ""
+ }
+ ],
+ "focusChecks": [
+ {
+ "__typename": "CheckRun",
+ "completedAt": "2026-10-11T09:39:21Z",
+ "conclusion": "SUCCESS",
+ "detailsUrl": "https://github.com/paperclipai/paperclip/actions/runs/38128842350/job/114438792716",
+ "name": "ci / e2e shard (8/8)",
+ "startedAt": "2026-10-11T09:34:52Z",
+ "status": "COMPLETED",
+ "workflowName": "PR"
+ },
+ {
+ "__typename": "CheckRun",
+ "completedAt": "2026-10-11T09:40:07Z",
+ "conclusion": "FAILURE",
+ "detailsUrl": "https://app.greptile.com/paperclip-org-3/github/paperclipai/paperclip/-/pull/15804",
+ "name": "Greptile Review",
+ "startedAt": "2026-10-11T09:34:21Z",
+ "status": "COMPLETED",
+ "workflowName": ""
+ }
+ ],
+ "pending": [],
+ "unresolved": [
+ {
+ "id": "PRRT_kwDORclPyM6rMVUV",
+ "isResolved": false,
+ "isOutdated": false,
+ "comments": {
+ "nodes": [
+ {
+ "url": "https://github.com/paperclipai/paperclip/pull/15804#discussion_r4241086370",
+ "body": "
**Failed cleanup stays hidden**\n\n`release` silently drops every failed `disconnect` request. Closing the Computer tab can leave its viewer hold running until expiry without telling the user. This violates the UI directive: \u201cSurface failures clearly; do not silently ignore API errors.\u201d\n\nShow a cleanup warning through a toast or another surface that survives closing the panel. This repository requirement must be satisfied before merging.\n\n**Context Used:** AGENTS.md ([source](https://github.com/paperclipai/paperclip/blob/master/AGENTS.md))\n\nPrompt To Fix With AI
\n\n`````markdown\nThis is a comment left during a code review.\nPath: ui/src/components/task-side-panel/TaskComputerPanel.tsx\nLine: 47-49\n\nComment:\n**Failed cleanup stays hidden**\n\n`release` silently drops every failed `disconnect` request. Closing the Computer tab can leave its viewer hold running until expiry without telling the user. This violates the UI directive: \u201cSurface failures clearly; do not silently ignore API errors.\u201d\n\nShow a cleanup warning through a toast or another surface that survives closing the panel. This repository requirement must be satisfied before merging.\n\n**Context Used:** AGENTS.md ([source](https://github.com/paperclipai/paperclip/blob/master/AGENTS.md))\n\n---\n\nFor each issue above, determine whether it is valid and should be fixed. If so, fix it directly.\n`````\n ",
+ "commit": {
+ "oid": "9eb1424f4ecee14c528b33a2a0ed3f1628b05c79"
+ },
+ "author": {
+ "login": "greptile-apps"
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "moreThreads": false,
+ "greptileSummary": [
+ {
+ "url": "https://github.com/paperclipai/paperclip/pull/15804#issuecomment-6098591173",
+ "updatedAt": "2026-10-11T09:40:13Z",
+ "reviewedCommits": [
+ "9eb1424f4ecee14c528b33a2a0ed3f1628b05c79"
+ ],
+ "score": [
+ "4"
+ ]
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/doc/plans/assets/2026-10-10-boat/evidence/computer-disconnect-warning.json b/doc/plans/assets/2026-10-10-boat/evidence/computer-disconnect-warning.json
new file mode 100644
index 00000000000..4bf7766a501
--- /dev/null
+++ b/doc/plans/assets/2026-10-10-boat/evidence/computer-disconnect-warning.json
@@ -0,0 +1,24 @@
+{
+ "checkedAt": "2026-10-11T09:50:22.442194+00:00",
+ "scope": "TaskComputerPanel disconnect error reporting only",
+ "tests": {
+ "files": 2,
+ "passed": 52,
+ "skipped": 0,
+ "log": "computer-disconnect-toast-tests.log"
+ },
+ "uiTypecheck": "passed",
+ "tokenGates": "passed",
+ "diffCheck": "passed",
+ "proofs": [
+ "Failed exact-owner disconnect after panel removal remains visible in global toast",
+ "Mounted panel reports fixed copy inline with no duplicate toast",
+ "Raw error URL/token canary absent"
+ ],
+ "limits": [
+ "No backend cleanup or retry behavior changes",
+ "No live forced disconnect failure injected",
+ "Unmount notice uses existing eight-second warning toast; not indefinite persistence"
+ ],
+ "review": "Approved by independent live_state_probe reviewer; no findings"
+}
diff --git a/doc/plans/assets/2026-10-10-boat/evidence/local49-lifecycle.json b/doc/plans/assets/2026-10-10-boat/evidence/local49-lifecycle.json
new file mode 100644
index 00000000000..217e11428d0
--- /dev/null
+++ b/doc/plans/assets/2026-10-10-boat/evidence/local49-lifecycle.json
@@ -0,0 +1,125 @@
+{
+ "schema": "boat-local-lifecycle-proof/v1",
+ "capturedAt": "2026-10-11T09:52:23.813224+00:00",
+ "fixture": "local49 / BOA-23",
+ "controllerSource": "97f9ace67e7e199c2712522ab84095a2ceafa4c2",
+ "providerPack": {
+ "source": "1ab3cb94e036f5de43e4bad9fd4d345054e8763c",
+ "digest": "sha256:640c6c5405003f7d07603694413be14dc6c9601bc71f40b285f6cb247b5d412b",
+ "hasFatalImportSettlementFix": true,
+ "hasDependencyCtimeRereadFix": false
+ },
+ "runnerArtifact": {
+ "source": "86c1aa2b0c53b1b41888cea6b8e04e42e28dd05c",
+ "sha256": "b47ed0f4f29e4c945d12fa4f351c01ee5f03685974bf03591689969bb3b85b73",
+ "proof": "Selected immutable artifact; no guest executable hash probe in this lifecycle."
+ },
+ "upload": {
+ "diagnosticsEnabled": true,
+ "chunksCompleted": 301,
+ "chunkFailures": 0,
+ "chunkTimeouts": 0,
+ "maxQueuedAndActiveMs": 136239,
+ "packMiB": 1166,
+ "startedAt": "2026-10-11T09:18:10.306Z",
+ "completedAt": "2026-10-11T09:37:21.704Z"
+ },
+ "cold": {
+ "id": "6fcda24f-6063-4966-9730-ad2d68ddd7e2",
+ "status": "succeeded",
+ "started_at": "2026-10-11T09:14:32.008Z",
+ "finished_at": "2026-10-11T09:39:01.367Z",
+ "native_session_id": "5c37ce0f-ff2d-443c-a88c-8efaf8291e9a",
+ "runner_instance_id": "ee29038f-82ad-4928-b223-5056179925d8",
+ "session_id_before": null,
+ "session_id_after": "fd2407a7-42d7-4164-b279-2a19fa91948a",
+ "error_code": null
+ },
+ "warm": {
+ "id": "6a07f42f-6e30-4b3d-8924-a15bc9de24f9",
+ "status": "succeeded",
+ "started_at": "2026-10-11T09:39:47.251Z",
+ "finished_at": "2026-10-11T09:41:00.398Z",
+ "native_session_id": "5c37ce0f-ff2d-443c-a88c-8efaf8291e9a",
+ "runner_instance_id": "ee29038f-82ad-4928-b223-5056179925d8",
+ "session_id_before": "fd2407a7-42d7-4164-b279-2a19fa91948a",
+ "session_id_after": "fd2407a7-42d7-4164-b279-2a19fa91948a",
+ "error_code": null
+ },
+ "nativeSessionId": "5c37ce0f-ff2d-443c-a88c-8efaf8291e9a",
+ "logicalRunnerId": "ee29038f-82ad-4928-b223-5056179925d8",
+ "providerSessionId": "fd2407a7-42d7-4164-b279-2a19fa91948a",
+ "warmOwner": {
+ "id": "6e208d55-cc8c-4afd-9cfb-49843a936c02",
+ "kind": "runner",
+ "phase": "warm",
+ "runId": "6a07f42f-6e30-4b3d-8924-a15bc9de24f9",
+ "deadline": "2026-10-11T09:46:00.347Z",
+ "generation": 2,
+ "process": {
+ "nonce": "37f768f4-5719-40c1-87c9-8b3f790c9714",
+ "bootId": "37936b19-7dba-4ec1-a094-1d71cc5f299e",
+ "unitName": "paperclip-6e208d55-cc8c-4afd-9cfb-49843a936c02.service",
+ "launchGeneration": 1
+ }
+ },
+ "proofFiles": [
+ {
+ "name": "boat-final-claude.txt",
+ "sha256": "14fa23911a1a95ede22a93f43fc027934b20a1ba497f8e6120abc8769498e124"
+ },
+ {
+ "name": "boat-claude-framing-proof.txt",
+ "sha256": "afaf525f4bf0c38614c5df0cf97140e7d1bf9cad96faa293e2317dc82116af4a"
+ }
+ ],
+ "proofEvidence": "Parent observed both hashes in actual browser tool output for cold and warm; warm host UTC09:40:48.",
+ "naturalArchive": {
+ "status": "completed",
+ "warmDeadline": "2026-10-11T09:46:00.347Z",
+ "noLiveOwnersObservedAt": "2026-10-11T09:46:21.342Z",
+ "providerObservedAt": "2026-10-11T09:46:29.675Z",
+ "providerState": "archived",
+ "providerHealth": "ok",
+ "stopId": "stop_9dc90636776cb256",
+ "stopCompletedAt": "2026-10-11T09:46:27.243Z",
+ "guestReads": false
+ },
+ "postIdle": {
+ "id": "825e1f90-556e-4e06-9557-b17d4a3d7e99",
+ "status": "failed",
+ "started_at": "2026-10-11T09:46:49.578Z",
+ "finished_at": "2026-10-11T09:51:04.712Z",
+ "native_session_id": "5c37ce0f-ff2d-443c-a88c-8efaf8291e9a",
+ "runner_instance_id": "ee29038f-82ad-4928-b223-5056179925d8",
+ "session_id_before": "fd2407a7-42d7-4164-b279-2a19fa91948a",
+ "session_id_after": "fd2407a7-42d7-4164-b279-2a19fa91948a",
+ "error_code": "adapter_failed",
+ "error": "runner_state_identity_mismatch: authority_indeterminate",
+ "primaryFailure": {
+ "observedAt": "2026-10-11T09:49:35.623Z",
+ "command": "turn.start",
+ "classification": "agent_startup_unverified_module",
+ "lastSafeStage": "turn_ownership_verified",
+ "admissionElapsedMs": 2482,
+ "runAttachCompleted": true,
+ "committedSessionEvents": 4,
+ "drainCompleted": true,
+ "suspendCompleted": true
+ },
+ "sameRunAutomaticRecovery": "Failed with authority_indeterminate; no separate successor or manual reset.",
+ "packDigest": "sha256:640c6c5405003f7d07603694413be14dc6c9601bc71f40b285f6cb247b5d412b",
+ "classificationLimit": "Proves guarded provider startup rejected an unverified module. The exact rejected check/module is not exposed; ctime-only dependency drift remains a tested candidate, not a proven live cause."
+ },
+ "observerPolicy": "Controller logs, local database and provider status only. No guest reads, manual wake, or executable prewarming during this lifecycle.",
+ "manualReset": false,
+ "oldImmutablePacksChanged": false,
+ "finalCleanup": {
+ "noActiveOrQueuedRunsOrOwnersAt": "2026-10-11T09:52:03.054Z",
+ "providerState": "archived",
+ "providerHealth": "ok",
+ "stopId": "stop_6a069a997e1066c2",
+ "completedAt": "2026-10-11T09:51:12.415Z",
+ "observedAt": "2026-10-11T09:52:04.360Z"
+ }
+}
diff --git a/doc/plans/assets/2026-10-10-boat/evidence/staging25-chrome-embedded-control.json b/doc/plans/assets/2026-10-10-boat/evidence/staging25-chrome-embedded-control.json
new file mode 100644
index 00000000000..6b027c90b20
--- /dev/null
+++ b/doc/plans/assets/2026-10-10-boat/evidence/staging25-chrome-embedded-control.json
@@ -0,0 +1,24 @@
+{
+ "observedBeforeUtc": "2026-10-11T09:37:10Z",
+ "source": "ca07557247533531b85045a1dc20c231dc9cd1de",
+ "browser": "Chrome",
+ "surface": "Paperclip task Computer panel embedded Moonlight iframe",
+ "issue": "BOA-2",
+ "result": "passed",
+ "steps": [
+ "Normal Computer Connect from archived Boat",
+ "Native coordinate click on visible remote Chrome dock icon visibly launched Chromium",
+ "typeText had no visible effect; not counted as keyboard proof",
+ "Actual key e appeared in remote omnibox",
+ "Ctrl+A, individual native keys example.net, then Return",
+ "Final screenshot visibly shows example.net and Example Domain content within Paperclip Computer panel",
+ "Normal Close Computer"
+ ],
+ "singleViewer": true,
+ "directViewerUsed": false,
+ "guestInputInjection": false,
+ "limitations": [
+ "In-app-browser input remains inconclusive",
+ "Source-specific pass on staging25; later loader-only changes are separate"
+ ]
+}
diff --git a/doc/plans/assets/2026-10-10-boat/evidence/staging26-archived-baseline.json b/doc/plans/assets/2026-10-10-boat/evidence/staging26-archived-baseline.json
new file mode 100644
index 00000000000..daf53e9f705
--- /dev/null
+++ b/doc/plans/assets/2026-10-10-boat/evidence/staging26-archived-baseline.json
@@ -0,0 +1,15 @@
+{
+ "observedAt": "2026-10-11T09:42:25.595Z",
+ "providerId": "bx_b8sawfyp",
+ "guestRead": false,
+ "state": "archived",
+ "health": "ok",
+ "stop": {
+ "id": "stop_798d173a0d5eb5ae",
+ "status": "completed",
+ "timestamps": {
+ "endedAt": "2026-10-11T09:37:19.030Z"
+ },
+ "errorPresent": false
+ }
+}
diff --git a/doc/plans/assets/2026-10-10-boat/evidence/staging26-deployment.json b/doc/plans/assets/2026-10-10-boat/evidence/staging26-deployment.json
new file mode 100644
index 00000000000..7b24e694567
--- /dev/null
+++ b/doc/plans/assets/2026-10-10-boat/evidence/staging26-deployment.json
@@ -0,0 +1,14 @@
+{
+ "version": 1,
+ "requestId": "14f4fbec-0bf7-4e7c-b287-f565d83c69a7",
+ "sha": "d5bce13cca01732105df15487000a260ae3c973c",
+ "stage": "deploy",
+ "hostname": "boat.staging.paperclip.app",
+ "environment": "staging",
+ "status": "succeeded",
+ "verification": "verified",
+ "appVersion": "sha-d5bce13cca01732105df15487000a260ae3c973c-cloud",
+ "targetStackId": "stack-pool-474c42a4b545",
+ "campaignUrl": "https://admin-staging.paperclip.app/admin/fleet/campaigns/fleet-campaign-1791706429498",
+ "checkedAt": "2026-10-11T09:41:21.624Z"
+}
diff --git a/doc/plans/assets/2026-10-10-boat/evidence/staging26-legacy-admission-active.json b/doc/plans/assets/2026-10-10-boat/evidence/staging26-legacy-admission-active.json
new file mode 100644
index 00000000000..5d7f25467d3
--- /dev/null
+++ b/doc/plans/assets/2026-10-10-boat/evidence/staging26-legacy-admission-active.json
@@ -0,0 +1,89 @@
+{
+ "observedAt": "2026-10-11T09:44:53.764Z",
+ "source": "staging26_simultaneous_legacy_read_only",
+ "companyId": "76e38a59-75e7-5ff8-a4bf-ebb78a7b8ebe",
+ "runs": [
+ {
+ "runId": "73bc6d17-4d37-4a59-a72d-d82b4b420191",
+ "agentId": "d227579b-7543-4c8c-94aa-9dfea261fa16",
+ "taskId": "612d0551-2947-435e-9b7d-d64dc584a41a",
+ "runtime": "legacy_codex",
+ "status": "running",
+ "startedAt": "2026-10-11T09:43:05.427Z",
+ "finishedAt": null,
+ "errorCode": null,
+ "categories": [],
+ "nativeSessionId": null,
+ "runnerInstanceId": null
+ },
+ {
+ "runId": "e3daa441-de0c-4de6-946a-e6d024d8893d",
+ "agentId": "644df48a-6c38-4bfb-8f8e-1dec3253ee55",
+ "taskId": "8a437e8b-3a17-4ec6-8bda-9aab1c067c29",
+ "runtime": "legacy_claude",
+ "status": "running",
+ "startedAt": "2026-10-11T09:43:05.362Z",
+ "finishedAt": null,
+ "errorCode": null,
+ "categories": [],
+ "nativeSessionId": null,
+ "runnerInstanceId": null
+ }
+ ],
+ "leases": [
+ {
+ "id": "1b463e96-a333-430e-932e-412432886039",
+ "runId": "73bc6d17-4d37-4a59-a72d-d82b4b420191",
+ "status": "active",
+ "cleanupStatus": null,
+ "acquiredAt": "2026-10-11T09:43:29.192Z",
+ "releasedAt": null,
+ "expiresAt": null,
+ "computerId": "6d53efb3-5b96-4694-a1c1-9746dc8278f0",
+ "ownerId": "59b07669-f13b-4b28-a215-a9bc71c9e66b",
+ "generation": 1
+ },
+ {
+ "id": "93f7f9a3-8bee-403f-b37c-bafa423b019d",
+ "runId": "e3daa441-de0c-4de6-946a-e6d024d8893d",
+ "status": "active",
+ "cleanupStatus": null,
+ "acquiredAt": "2026-10-11T09:43:28.522Z",
+ "releasedAt": null,
+ "expiresAt": null,
+ "computerId": "6d53efb3-5b96-4694-a1c1-9746dc8278f0",
+ "ownerId": "5595da57-5265-4a14-ae50-2d01eccfba66",
+ "generation": 1
+ }
+ ],
+ "owners": [
+ {
+ "computerId": "6d53efb3-5b96-4694-a1c1-9746dc8278f0",
+ "ledgerStatus": "attached",
+ "actionPresent": false,
+ "ownerId": "5595da57-5265-4a14-ae50-2d01eccfba66",
+ "runId": "e3daa441-de0c-4de6-946a-e6d024d8893d",
+ "agentId": "644df48a-6c38-4bfb-8f8e-1dec3253ee55",
+ "generation": 1,
+ "phase": "active",
+ "admittedAt": "2026-10-11T09:43:09.824Z",
+ "deadline": null,
+ "retirementDeadline": null,
+ "processBindingPresent": false
+ },
+ {
+ "computerId": "6d53efb3-5b96-4694-a1c1-9746dc8278f0",
+ "ledgerStatus": "attached",
+ "actionPresent": false,
+ "ownerId": "59b07669-f13b-4b28-a215-a9bc71c9e66b",
+ "runId": "73bc6d17-4d37-4a59-a72d-d82b4b420191",
+ "agentId": "d227579b-7543-4c8c-94aa-9dfea261fa16",
+ "generation": 1,
+ "phase": "active",
+ "admittedAt": "2026-10-11T09:43:09.866Z",
+ "deadline": null,
+ "retirementDeadline": null,
+ "processBindingPresent": false
+ }
+ ]
+}
\ No newline at end of file
diff --git a/doc/plans/assets/2026-10-10-boat/evidence/staging26-legacy-admission-final.json b/doc/plans/assets/2026-10-10-boat/evidence/staging26-legacy-admission-final.json
new file mode 100644
index 00000000000..d13415d1c79
--- /dev/null
+++ b/doc/plans/assets/2026-10-10-boat/evidence/staging26-legacy-admission-final.json
@@ -0,0 +1,89 @@
+{
+ "observedAt": "2026-10-11T09:47:09.818Z",
+ "source": "staging26_simultaneous_legacy_read_only",
+ "companyId": "76e38a59-75e7-5ff8-a4bf-ebb78a7b8ebe",
+ "runs": [
+ {
+ "runId": "73bc6d17-4d37-4a59-a72d-d82b4b420191",
+ "agentId": "d227579b-7543-4c8c-94aa-9dfea261fa16",
+ "taskId": "612d0551-2947-435e-9b7d-d64dc584a41a",
+ "runtime": "legacy_codex",
+ "status": "succeeded",
+ "startedAt": "2026-10-11T09:43:05.427Z",
+ "finishedAt": "2026-10-11T09:45:16.749Z",
+ "errorCode": null,
+ "categories": [],
+ "nativeSessionId": null,
+ "runnerInstanceId": null
+ },
+ {
+ "runId": "e3daa441-de0c-4de6-946a-e6d024d8893d",
+ "agentId": "644df48a-6c38-4bfb-8f8e-1dec3253ee55",
+ "taskId": "8a437e8b-3a17-4ec6-8bda-9aab1c067c29",
+ "runtime": "legacy_claude",
+ "status": "succeeded",
+ "startedAt": "2026-10-11T09:43:05.362Z",
+ "finishedAt": "2026-10-11T09:45:21.193Z",
+ "errorCode": null,
+ "categories": [],
+ "nativeSessionId": null,
+ "runnerInstanceId": null
+ }
+ ],
+ "leases": [
+ {
+ "id": "1b463e96-a333-430e-932e-412432886039",
+ "runId": "73bc6d17-4d37-4a59-a72d-d82b4b420191",
+ "status": "released",
+ "cleanupStatus": "success",
+ "acquiredAt": "2026-10-11T09:43:29.192Z",
+ "releasedAt": "2026-10-11T09:45:22.633Z",
+ "expiresAt": null,
+ "computerId": "6d53efb3-5b96-4694-a1c1-9746dc8278f0",
+ "ownerId": "59b07669-f13b-4b28-a215-a9bc71c9e66b",
+ "generation": 1
+ },
+ {
+ "id": "93f7f9a3-8bee-403f-b37c-bafa423b019d",
+ "runId": "e3daa441-de0c-4de6-946a-e6d024d8893d",
+ "status": "released",
+ "cleanupStatus": "success",
+ "acquiredAt": "2026-10-11T09:43:28.522Z",
+ "releasedAt": "2026-10-11T09:45:26.731Z",
+ "expiresAt": null,
+ "computerId": "6d53efb3-5b96-4694-a1c1-9746dc8278f0",
+ "ownerId": "5595da57-5265-4a14-ae50-2d01eccfba66",
+ "generation": 1
+ }
+ ],
+ "owners": [
+ {
+ "computerId": "6d53efb3-5b96-4694-a1c1-9746dc8278f0",
+ "ledgerStatus": "attached",
+ "actionPresent": false,
+ "ownerId": "5595da57-5265-4a14-ae50-2d01eccfba66",
+ "runId": "e3daa441-de0c-4de6-946a-e6d024d8893d",
+ "agentId": "644df48a-6c38-4bfb-8f8e-1dec3253ee55",
+ "generation": 1,
+ "phase": "retired",
+ "admittedAt": "2026-10-11T09:43:09.824Z",
+ "deadline": null,
+ "retirementDeadline": null,
+ "processBindingPresent": false
+ },
+ {
+ "computerId": "6d53efb3-5b96-4694-a1c1-9746dc8278f0",
+ "ledgerStatus": "attached",
+ "actionPresent": false,
+ "ownerId": "59b07669-f13b-4b28-a215-a9bc71c9e66b",
+ "runId": "73bc6d17-4d37-4a59-a72d-d82b4b420191",
+ "agentId": "d227579b-7543-4c8c-94aa-9dfea261fa16",
+ "generation": 1,
+ "phase": "retired",
+ "admittedAt": "2026-10-11T09:43:09.866Z",
+ "deadline": null,
+ "retirementDeadline": null,
+ "processBindingPresent": false
+ }
+ ]
+}
\ No newline at end of file
diff --git a/doc/plans/assets/2026-10-10-boat/evidence/staging26-legacy-admission-initial.json b/doc/plans/assets/2026-10-10-boat/evidence/staging26-legacy-admission-initial.json
new file mode 100644
index 00000000000..57c6bcaf920
--- /dev/null
+++ b/doc/plans/assets/2026-10-10-boat/evidence/staging26-legacy-admission-initial.json
@@ -0,0 +1,64 @@
+{
+ "observedAt": "2026-10-11T09:43:24.761Z",
+ "source": "staging26_simultaneous_legacy_read_only",
+ "companyId": "76e38a59-75e7-5ff8-a4bf-ebb78a7b8ebe",
+ "runs": [
+ {
+ "runId": "73bc6d17-4d37-4a59-a72d-d82b4b420191",
+ "agentId": "d227579b-7543-4c8c-94aa-9dfea261fa16",
+ "taskId": "612d0551-2947-435e-9b7d-d64dc584a41a",
+ "runtime": "legacy_codex",
+ "status": "running",
+ "startedAt": "2026-10-11T09:43:05.427Z",
+ "finishedAt": null,
+ "errorCode": null,
+ "categories": [],
+ "nativeSessionId": null,
+ "runnerInstanceId": null
+ },
+ {
+ "runId": "e3daa441-de0c-4de6-946a-e6d024d8893d",
+ "agentId": "644df48a-6c38-4bfb-8f8e-1dec3253ee55",
+ "taskId": "8a437e8b-3a17-4ec6-8bda-9aab1c067c29",
+ "runtime": "legacy_claude",
+ "status": "running",
+ "startedAt": "2026-10-11T09:43:05.362Z",
+ "finishedAt": null,
+ "errorCode": null,
+ "categories": [],
+ "nativeSessionId": null,
+ "runnerInstanceId": null
+ }
+ ],
+ "leases": [],
+ "owners": [
+ {
+ "computerId": "6d53efb3-5b96-4694-a1c1-9746dc8278f0",
+ "ledgerStatus": "attached",
+ "actionPresent": false,
+ "ownerId": "5595da57-5265-4a14-ae50-2d01eccfba66",
+ "runId": "e3daa441-de0c-4de6-946a-e6d024d8893d",
+ "agentId": "644df48a-6c38-4bfb-8f8e-1dec3253ee55",
+ "generation": 1,
+ "phase": "starting",
+ "admittedAt": "2026-10-11T09:43:09.824Z",
+ "deadline": "2026-10-11T09:45:09.824Z",
+ "retirementDeadline": null,
+ "processBindingPresent": false
+ },
+ {
+ "computerId": "6d53efb3-5b96-4694-a1c1-9746dc8278f0",
+ "ledgerStatus": "attached",
+ "actionPresent": false,
+ "ownerId": "59b07669-f13b-4b28-a215-a9bc71c9e66b",
+ "runId": "73bc6d17-4d37-4a59-a72d-d82b4b420191",
+ "agentId": "d227579b-7543-4c8c-94aa-9dfea261fa16",
+ "generation": 1,
+ "phase": "starting",
+ "admittedAt": "2026-10-11T09:43:09.866Z",
+ "deadline": "2026-10-11T09:45:09.866Z",
+ "retirementDeadline": null,
+ "processBindingPresent": false
+ }
+ ]
+}
\ No newline at end of file
diff --git a/doc/plans/assets/2026-10-10-boat/local49-claude-cold.png b/doc/plans/assets/2026-10-10-boat/local49-claude-cold.png
new file mode 100644
index 00000000000..78aff39561d
Binary files /dev/null and b/doc/plans/assets/2026-10-10-boat/local49-claude-cold.png differ
diff --git a/doc/plans/assets/2026-10-10-boat/local49-claude-warm.png b/doc/plans/assets/2026-10-10-boat/local49-claude-warm.png
new file mode 100644
index 00000000000..0caa273926b
Binary files /dev/null and b/doc/plans/assets/2026-10-10-boat/local49-claude-warm.png differ
diff --git a/doc/plans/assets/2026-10-10-boat/local49-post-idle-failed.png b/doc/plans/assets/2026-10-10-boat/local49-post-idle-failed.png
new file mode 100644
index 00000000000..efe236832c1
Binary files /dev/null and b/doc/plans/assets/2026-10-10-boat/local49-post-idle-failed.png differ
diff --git a/doc/plans/assets/2026-10-10-boat/staging25-chrome-embedded-control.png b/doc/plans/assets/2026-10-10-boat/staging25-chrome-embedded-control.png
new file mode 100644
index 00000000000..f0866befd0c
Binary files /dev/null and b/doc/plans/assets/2026-10-10-boat/staging25-chrome-embedded-control.png differ
diff --git a/doc/plans/assets/2026-10-10-boat/staging26-legacy-claude-result.png b/doc/plans/assets/2026-10-10-boat/staging26-legacy-claude-result.png
new file mode 100644
index 00000000000..8100fdc75c3
Binary files /dev/null and b/doc/plans/assets/2026-10-10-boat/staging26-legacy-claude-result.png differ
diff --git a/doc/plans/assets/2026-10-10-boat/staging26-legacy-codex-result.png b/doc/plans/assets/2026-10-10-boat/staging26-legacy-codex-result.png
new file mode 100644
index 00000000000..a302b9291ac
Binary files /dev/null and b/doc/plans/assets/2026-10-10-boat/staging26-legacy-codex-result.png differ