Issue 25160 server-only runtime evidence
UTC 2026-10-26T01:08:46.171268+00:00
head=1f354b28e1a29ad221c1bd28acb2f53d18c88163
red=8306240cefa44bb4d730519b4d01349861ab44f8
base=5fee09a2c109fa973294c1d5fc3729bfd1a7f093
checkout HEAD=1f354b28e1a29ad221c1bd28acb2f53d18c88163
INITIAL git status --porcelain=v1: ''
Scope: existing two merge cases; real in-memory SQLite orchestration; deterministic mocked external PullRequestService; no external PR access. No agent receipt, restart, or disk durability claim.
Loader substitutes instrumented test and selected git-show reactor source in memory; original checkout source never swapped. Instrumentation captured in prepare.py and instrumented-runtimeLayer.test.ts.
SHA256 proof.config.ts 16f8139d84f3d46e8043ca10e0b6e03816e4c8e78bb2c611fb7dd063c279e8a4
SHA256 prepare.py d3f541eccba0a2eb2fd42502e8873cff6e041c72edfc33ca87a0e920fcb20944
SHA256 instrumented-runtimeLayer.test.ts 36060c5222b98faf2f44dfd93abd5ff7171e58ab87b7570f30b33c3cbf86c59b
SHA256 red-PullRequestWatchReactor.ts 750081f459e442954ed9f2bc18578c18a7caeb72b1b45a5246a6ca6d0c12ddf2
SHA256 green-PullRequestWatchReactor.ts 21469c178dc67e12659d0ec5de31e5f14f21f8d8be20e2dbcbc5863ba0246556

CWD /home/ubuntu/wt/issue-25160/apps/server
COMMAND PROOF_VARIANT=red PROOF_REVISION=8306240cef vp test run src/orchestration-v2/runtimeLayer.test.ts -t 'tells the agent once when a watched PR merges' --config /tmp/issue-25160-proof/proof.config.ts --silent=false --reporter=verbose --fsModuleCachePath /tmp/issue-25160-proof/cache-red-verbose
note: You are running `vp test` as a Vite+ built-in command. If you meant to run the test npm script, use `vpr test` instead.

 RUN  v5.0.5 /home/ubuntu/wt/issue-25160/apps/server

 ↓ src/orchestration-v2/runtimeLayer.test.ts > project deletion during thread commands > deleting a thread removes its thread-bound automations through the effect worker
 ↓ src/orchestration-v2/runtimeLayer.test.ts > project deletion during thread commands > deleting a project removes its thread-bound automations through the effect worker
 ↓ src/orchestration-v2/runtimeLayer.test.ts > project deletion during thread commands > waits for an in-flight thread update before planning deletion
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive > projects a rollback that fails every attempt and clears it on the next one
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive > rejects non-ready rollback targets before persisting events or effects
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive > resolves delivery intent against the active run and starts after it completes
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive > answers an async question after its provider exits and commits the answer once
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive > reports an answer that never reaches its provider without reopening it
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive > dismisses message-capable questions directly and while settling
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive > merges an explicit provider-finished run while checkpoint capture is pending
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2 legacy import > hydrates imported transcripts before commands and propagates hydration failures
stdout | src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > tells the agent once when a watched PR merges (host-read)
PROOF {"implementation":"8306240cef","case":"host-read","stage":"before-sweep","detailCalls":0,"activityCalls":0,"activeWatch":{"startedAt":"1970-01-01T00:00:00.000Z","headSha":null,"failedChecks":[],"passed":false,"passedChecks":[],"remarksThrough":"1970-01-01T00:00:00.000Z","remarkIds":[],"conflicting":false,"wakes":0},"retainedLinks":[{"host":"github.com","repository":"pingdotgg/t3code","number":20,"url":"https://github.com/pingdotgg/t3code/pull/20","source":"agent","linkedAt":"1970-01-01T00:00:00.000Z","snapshot":null,"stack":null,"watch":{"startedAt":"1970-01-01T00:00:00.000Z","headSha":null,"failedChecks":[],"passed":false,"passedChecks":[],"remarksThrough":"1970-01-01T00:00:00.000Z","remarkIds":[],"conflicting":false,"wakes":0}}],"notificationCount":0,"notifications":[]}
PROOF {"implementation":"8306240cef","case":"host-read","stage":"after-sweep-1","detailCalls":1,"activityCalls":1,"activeWatch":null,"retainedLinks":[{"host":"github.com","repository":"pingdotgg/t3code","number":20,"url":"https://github.com/pingdotgg/t3code/pull/20","source":"agent","linkedAt":"1970-01-01T00:00:00.000Z","snapshot":null,"stack":null,"endedWatch":{"startedAt":"1970-01-01T00:00:00.000Z","headSha":null,"failedChecks":[],"passed":false,"passedChecks":[],"remarksThrough":"1970-01-01T00:00:00.000Z","remarkIds":[],"conflicting":false,"wakes":0}}],"notificationCount":0,"notifications":[]}

stdout | src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > tells the agent once when a watched PR merges (host-read)
PROOF {"implementation":"8306240cef","case":"host-read","stage":"after-sweep-2","detailCalls":1,"activityCalls":1,"activeWatch":null,"retainedLinks":[{"host":"github.com","repository":"pingdotgg/t3code","number":20,"url":"https://github.com/pingdotgg/t3code/pull/20","source":"agent","linkedAt":"1970-01-01T00:00:00.000Z","snapshot":null,"stack":null,"endedWatch":{"startedAt":"1970-01-01T00:00:00.000Z","headSha":null,"failedChecks":[],"passed":false,"passedChecks":[],"remarksThrough":"1970-01-01T00:00:00.000Z","remarkIds":[],"conflicting":false,"wakes":0}}],"notificationCount":0,"notifications":[]}

stdout | src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > tells the agent once when a watched PR merges (host-read)
PROOF {"implementation":"8306240cef","case":"host-read","stage":"after-sweep-3","detailCalls":1,"activityCalls":1,"activeWatch":null,"retainedLinks":[{"host":"github.com","repository":"pingdotgg/t3code","number":20,"url":"https://github.com/pingdotgg/t3code/pull/20","source":"agent","linkedAt":"1970-01-01T00:00:00.000Z","snapshot":null,"stack":null,"endedWatch":{"startedAt":"1970-01-01T00:00:00.000Z","headSha":null,"failedChecks":[],"passed":false,"passedChecks":[],"remarksThrough":"1970-01-01T00:00:00.000Z","remarkIds":[],"conflicting":false,"wakes":0}}],"notificationCount":0,"notifications":[]}

stdout | src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > tells the agent once when a watched PR merges (host-read)
[01:09:00.984] ERROR (#3045): Error [AssertionError]: expected [] to have a length of 1 but got +0
    at /home/ubuntu/wt/issue-25160/apps/server/src/orchestration-v2/runtimeLayer.test.ts:2885:16 {
  actual: 0,
  expected: 1,
  showDiff: true,
  [cause]: undefined
}

 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > applies lifecycle commands idempotently and emits archive/removal shell deltas
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > keeps the branch pull request when linking another pull request
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > retains multiple pull requests and dismissed stack members through rebuilds
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > starts, records, and stops a pull request watch
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > settling ends every pull request watch: manual
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > settling ends every pull request watch: automatic
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > archiving ends watches, and an archived thread cannot start one
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > ends a watch it cannot read, and tells the agent
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > wakes once for a state it reported, across a restart and a new watch
stdout | src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > tells the agent once when a watched PR merges (synced-snapshot)
PROOF {"implementation":"8306240cef","case":"synced-snapshot","stage":"before-sweep","detailCalls":0,"activityCalls":0,"activeWatch":{"startedAt":"1970-01-01T00:06:00.000Z","headSha":null,"failedChecks":[],"passed":false,"passedChecks":[],"remarksThrough":"1970-01-01T00:06:00.000Z","remarkIds":[],"conflicting":false,"wakes":0},"retainedLinks":[{"host":"github.com","repository":"pingdotgg/t3code","number":20,"url":"https://github.com/pingdotgg/t3code/pull/20","source":"agent","linkedAt":"1970-01-01T00:06:00.000Z","snapshot":{"state":"merged","title":"Watched pull request","headBranch":"feature","baseBranch":"main","isDraft":false,"updatedAt":"2026-10-02T12:00:00.000Z","syncedAt":"2026-10-02T12:00:00.000Z","mergedAt":"2026-10-02T12:00:00.000Z"},"stack":null,"watch":{"startedAt":"1970-01-01T00:06:00.000Z","headSha":null,"failedChecks":[],"passed":false,"passedChecks":[],"remarksThrough":"1970-01-01T00:06:00.000Z","remarkIds":[],"conflicting":false,"wakes":0}}],"notificationCount":0,"notifications":[]}

stdout | src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > tells the agent once when a watched PR merges (synced-snapshot)
PROOF {"implementation":"8306240cef","case":"synced-snapshot","stage":"after-sweep-1","detailCalls":0,"activityCalls":0,"activeWatch":null,"retainedLinks":[{"host":"github.com","repository":"pingdotgg/t3code","number":20,"url":"https://github.com/pingdotgg/t3code/pull/20","source":"agent","linkedAt":"1970-01-01T00:06:00.000Z","snapshot":{"state":"merged","title":"Watched pull request","headBranch":"feature","baseBranch":"main","isDraft":false,"updatedAt":"2026-10-02T12:00:00.000Z","syncedAt":"2026-10-02T12:00:00.000Z","mergedAt":"2026-10-02T12:00:00.000Z"},"stack":null,"endedWatch":{"startedAt":"1970-01-01T00:06:00.000Z","headSha":null,"failedChecks":[],"passed":false,"passedChecks":[],"remarksThrough":"1970-01-01T00:06:00.000Z","remarkIds":[],"conflicting":false,"wakes":0}}],"notificationCount":0,"notifications":[]}

stdout | src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > tells the agent once when a watched PR merges (synced-snapshot)
PROOF {"implementation":"8306240cef","case":"synced-snapshot","stage":"after-sweep-2","detailCalls":0,"activityCalls":0,"activeWatch":null,"retainedLinks":[{"host":"github.com","repository":"pingdotgg/t3code","number":20,"url":"https://github.com/pingdotgg/t3code/pull/20","source":"agent","linkedAt":"1970-01-01T00:06:00.000Z","snapshot":{"state":"merged","title":"Watched pull request","headBranch":"feature","baseBranch":"main","isDraft":false,"updatedAt":"2026-10-02T12:00:00.000Z","syncedAt":"2026-10-02T12:00:00.000Z","mergedAt":"2026-10-02T12:00:00.000Z"},"stack":null,"endedWatch":{"startedAt":"1970-01-01T00:06:00.000Z","headSha":null,"failedChecks":[],"passed":false,"passedChecks":[],"remarksThrough":"1970-01-01T00:06:00.000Z","remarkIds":[],"conflicting":false,"wakes":0}}],"notificationCount":0,"notifications":[]}

stdout | src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > tells the agent once when a watched PR merges (synced-snapshot)
PROOF {"implementation":"8306240cef","case":"synced-snapshot","stage":"after-sweep-3","detailCalls":0,"activityCalls":0,"activeWatch":null,"retainedLinks":[{"host":"github.com","repository":"pingdotgg/t3code","number":20,"url":"https://github.com/pingdotgg/t3code/pull/20","source":"agent","linkedAt":"1970-01-01T00:06:00.000Z","snapshot":{"state":"merged","title":"Watched pull request","headBranch":"feature","baseBranch":"main","isDraft":false,"updatedAt":"2026-10-02T12:00:00.000Z","syncedAt":"2026-10-02T12:00:00.000Z","mergedAt":"2026-10-02T12:00:00.000Z"},"stack":null,"endedWatch":{"startedAt":"1970-01-01T00:06:00.000Z","headSha":null,"failedChecks":[],"passed":false,"passedChecks":[],"remarksThrough":"1970-01-01T00:06:00.000Z","remarkIds":[],"conflicting":false,"wakes":0}}],"notificationCount":0,"notifications":[]}

stdout | src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > tells the agent once when a watched PR merges (synced-snapshot)
[01:09:01.062] ERROR (#3081): Error [AssertionError]: expected [] to have a length of 1 but got +0
    at /home/ubuntu/wt/issue-25160/apps/server/src/orchestration-v2/runtimeLayer.test.ts:2885:16 {
  actual: 0,
  expected: 1,
  showDiff: true,
  [cause]: undefined
}

 × src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > tells the agent once when a watched PR merges (host-read) 95ms
   → expected [] to have a length of 1 but got +0
 × src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > tells the agent once when a watched PR merges (synced-snapshot) 74ms
   → expected [] to have a length of 1 but got +0
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > finishes owed checks once after pending sweeps, a restart, and a re-watch
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > a watch that ends on the comment limit keeps what its last pass saw
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > wakes once when no checks report on the head, without saying they passed
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > wakes for checks that complete after the no-checks notice on the same head
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > watching a dismissed stack layer again keeps what its last watch told
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > wakes a watched thread once: single page
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > wakes a watched thread once: paginated
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > wakes a watched thread once: page failure
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > wakes a watched thread once: repeated cursor
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > wakes a watched thread once: missing comments
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > wakes a watched thread once: thread list truncated
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > persists rejected command receipts across retries
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > admits restart continuations once and rejects a stale continuation behind newer work
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > admits a restart continuation of a failed run that lost a shell: false
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > admits a restart continuation of a completed run that lost a shell: false
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > admits a restart continuation of a waiting run that lost a shell: false
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > admits a restart continuation of a cancelled run that lost a shell: false
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > admits a restart continuation of a completed run that lost a watchdog-monitor: false
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > admits a restart continuation of a failed run that lost a awaited-monitor: false
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > admits a restart continuation of a completed run that lost a awaited-monitor: true
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > admits a restart continuation of a waiting run that lost a awaited-monitor: true
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > admits a restart continuation of a cancelled run that lost a awaited-monitor: true
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > rejects settling a thread while a run is active
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > settles a thread its own agent settled once the turn completes
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > settles past held automatic runs but not held user messages
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > cancels preparing work on archive and keeps it cancelled through replay
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > promotes only one queued run after each terminal run (notification: false)
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > promotes only one queued run after each terminal run (notification: true)
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > starts a wake's work clock from the run that ran before it
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > handles a queued message after a usage_limit failure
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > handles a queued message after a provider_error failure
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > keeps queued user selections and pauses only the limited provider
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > delivers a queued monitor update from server after conversation selection {"instanceId":"codex","model":"gpt-5.4"}
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > delivers a queued monitor update from provider after conversation selection {"instanceId":"codex","model":"gpt-5.4"}
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > delivers a queued monitor update from provider after conversation selection {"instanceId":"codex_alternate","model":"gpt-5.4"}
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > keeps the queue after a user interrupts the active run
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > places held queued messages after a continuation that started first
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > preserves and holds queued messages across startup until explicitly resumed
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > preserves and holds queued messages across shutdown until explicitly resumed
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > edits and removes queued runs
 ↓ src/orchestration-v2/runtimeLayer.test.ts > pending provider interruption > interrupts a pending provider start without launching provider work
 ↓ src/orchestration-v2/runtimeLayer.test.ts > snooze queued runs > only user messages block snooze with a held notification run
 ↓ src/orchestration-v2/runtimeLayer.test.ts > snooze queued runs > only user messages block snooze with a held delegated-completion run
 ↓ src/orchestration-v2/runtimeLayer.test.ts > snooze queued runs > only user messages block snooze with a held user run
 ↓ src/orchestration-v2/runtimeLayer.test.ts > snooze queued runs > a notification message on a snoozed thread keeps the snooze only when automatic
 ↓ src/orchestration-v2/runtimeLayer.test.ts > snooze queued runs > a user message on a snoozed thread keeps the snooze only when automatic
 ↓ src/orchestration-v2/runtimeLayer.test.ts > snooze projection > carries snooze state through the V2 shell projection
 ↓ src/orchestration-v2/runtimeLayer.test.ts > visited projection > carries the visited watermark through the V2 shell projection
 ↓ src/orchestration-v2/runtimeLayer.test.ts > thread opens > counts opens on the server clock, merges quick reopens, and keeps picked queries
 ↓ src/orchestration-v2/runtimeLayer.test.ts > compact PR events > persists only the changed PR link and replays it without losing other links
 ↓ src/orchestration-v2/runtimeLayer.test.ts > shared application data plane > orders retained project transactions and V2 thread transactions in one source
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > manually resumes an interrupted run ahead of its queued message only once
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > manually resumes an usage_limit run ahead of its queued message only once
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > guards a scheduled usage-limit continuation against resume
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > guards a scheduled usage-limit continuation against queued-resume
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > guards a scheduled usage-limit continuation against rearm
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > guards a scheduled usage-limit continuation against snooze-race
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > guards a scheduled usage-limit continuation against archive
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > guards a scheduled usage-limit continuation against replacement
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > guards a scheduled usage-limit continuation against manual-snooze
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > guards a scheduled usage-limit continuation against invalid-snooze
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > guards a scheduled usage-limit continuation against cancel-resume-keep-snooze
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > guards a scheduled usage-limit continuation against independent-patches
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > guards a scheduled usage-limit continuation against expired-snooze
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > guards a scheduled usage-limit continuation against wake
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > guards a scheduled usage-limit continuation against stop
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > guards a scheduled usage-limit continuation against stop-before-arm
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > guards a scheduled usage-limit continuation against stop-before-arm-mismatched-recovery
 ↓ src/orchestration-v2/runtimeLayer.test.ts > queue.resume on a project-disabled instance > holds a queued run instead of starting it on an instance the project turned off

⎯⎯⎯⎯⎯⎯⎯ Failed Tests 2 ⎯⎯⎯⎯⎯⎯⎯

 FAIL  src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > tells the agent once when a watched PR merges (host-read)
 FAIL  src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > tells the agent once when a watched PR merges (synced-snapshot)
AssertionError: expected [] to have a length of 1 but got +0

- Expected
+ Received

- 1
+ 0

 ❯ src/orchestration-v2/runtimeLayer.test.ts:2885:16
    2883|       yield* orchestrator.dispatch({
    2884|         type: "thread.create",
    2885|         createdBy: "user",
       |                ^
    2886|         creationSource: "web",
    2887|         commandId: CommandId.make("pr-watch-owed-create"),
 ❯ ~effect/Effect/successCont ../../node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/effect.ts:1422:28
 ❯ ~effect/Effect/evaluate ../../node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/core.ts:585:30
 ❯ FiberImpl.runLoop ../../node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/effect.ts:654:41
 ❯ FiberImpl.evaluate ../../node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/effect.ts:595:23
 ❯ FiberImpl.evaluate ../../node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/effect.ts:589:27
 ❯ ../../node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/effect.ts:1159:17
 ❯ Array.<anonymous> ../../node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/effect.ts:804:44

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/2]⎯


 Test Files  1 failed (1)
      Tests  2 failed | 89 skipped (91)
   Start at  01:08:47
   Duration  14.12s (transform 70%, import 27%, tests 3%, setup 1%)


EXIT_STATE red exit_code=1

CWD /home/ubuntu/wt/issue-25160/apps/server
COMMAND PROOF_VARIANT=green PROOF_REVISION=1f354b28e1 vp test run src/orchestration-v2/runtimeLayer.test.ts -t 'tells the agent once when a watched PR merges' --config /tmp/issue-25160-proof/proof.config.ts --silent=false --reporter=verbose --fsModuleCachePath /tmp/issue-25160-proof/cache-green-verbose
note: You are running `vp test` as a Vite+ built-in command. If you meant to run the test npm script, use `vpr test` instead.

 RUN  v5.0.5 /home/ubuntu/wt/issue-25160/apps/server

 ↓ src/orchestration-v2/runtimeLayer.test.ts > project deletion during thread commands > deleting a thread removes its thread-bound automations through the effect worker
 ↓ src/orchestration-v2/runtimeLayer.test.ts > project deletion during thread commands > deleting a project removes its thread-bound automations through the effect worker
 ↓ src/orchestration-v2/runtimeLayer.test.ts > project deletion during thread commands > waits for an in-flight thread update before planning deletion
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive > projects a rollback that fails every attempt and clears it on the next one
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive > rejects non-ready rollback targets before persisting events or effects
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive > resolves delivery intent against the active run and starts after it completes
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive > answers an async question after its provider exits and commits the answer once
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive > reports an answer that never reaches its provider without reopening it
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive > dismisses message-capable questions directly and while settling
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive > merges an explicit provider-finished run while checkpoint capture is pending
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2 legacy import > hydrates imported transcripts before commands and propagates hydration failures
stdout | src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > tells the agent once when a watched PR merges (host-read)
PROOF {"implementation":"1f354b28e1","case":"host-read","stage":"before-sweep","detailCalls":0,"activityCalls":0,"activeWatch":{"startedAt":"1970-01-01T00:00:00.000Z","headSha":null,"failedChecks":[],"passed":false,"passedChecks":[],"remarksThrough":"1970-01-01T00:00:00.000Z","remarkIds":[],"conflicting":false,"wakes":0},"retainedLinks":[{"host":"github.com","repository":"pingdotgg/t3code","number":20,"url":"https://github.com/pingdotgg/t3code/pull/20","source":"agent","linkedAt":"1970-01-01T00:00:00.000Z","snapshot":null,"stack":null,"watch":{"startedAt":"1970-01-01T00:00:00.000Z","headSha":null,"failedChecks":[],"passed":false,"passedChecks":[],"remarksThrough":"1970-01-01T00:00:00.000Z","remarkIds":[],"conflicting":false,"wakes":0}}],"notificationCount":0,"notifications":[]}

stdout | src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > tells the agent once when a watched PR merges (host-read)
PROOF {"implementation":"1f354b28e1","case":"host-read","stage":"after-sweep-1","detailCalls":1,"activityCalls":1,"activeWatch":null,"retainedLinks":[{"host":"github.com","repository":"pingdotgg/t3code","number":20,"url":"https://github.com/pingdotgg/t3code/pull/20","source":"agent","linkedAt":"1970-01-01T00:00:00.000Z","snapshot":null,"stack":null,"endedWatch":{"startedAt":"1970-01-01T00:00:00.000Z","headSha":null,"failedChecks":[],"passed":false,"passedChecks":[],"remarksThrough":"1970-01-01T00:00:00.000Z","remarkIds":[],"conflicting":false,"wakes":0}}],"notificationCount":1,"notifications":[{"messageId":"message:pr-watch:d1126f46-4ead-4f7d-be52-3201708c5986","notification":{"source":{"kind":"monitor"},"outcome":"updated","summary":"#20: merged, stopped watching"}}]}

stdout | src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > tells the agent once when a watched PR merges (host-read)
PROOF {"implementation":"1f354b28e1","case":"host-read","stage":"after-sweep-2","detailCalls":1,"activityCalls":1,"activeWatch":null,"retainedLinks":[{"host":"github.com","repository":"pingdotgg/t3code","number":20,"url":"https://github.com/pingdotgg/t3code/pull/20","source":"agent","linkedAt":"1970-01-01T00:00:00.000Z","snapshot":null,"stack":null,"endedWatch":{"startedAt":"1970-01-01T00:00:00.000Z","headSha":null,"failedChecks":[],"passed":false,"passedChecks":[],"remarksThrough":"1970-01-01T00:00:00.000Z","remarkIds":[],"conflicting":false,"wakes":0}}],"notificationCount":1,"notifications":[{"messageId":"message:pr-watch:d1126f46-4ead-4f7d-be52-3201708c5986","notification":{"source":{"kind":"monitor"},"outcome":"updated","summary":"#20: merged, stopped watching"}}]}

stdout | src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > tells the agent once when a watched PR merges (host-read)
PROOF {"implementation":"1f354b28e1","case":"host-read","stage":"after-sweep-3","detailCalls":1,"activityCalls":1,"activeWatch":null,"retainedLinks":[{"host":"github.com","repository":"pingdotgg/t3code","number":20,"url":"https://github.com/pingdotgg/t3code/pull/20","source":"agent","linkedAt":"1970-01-01T00:00:00.000Z","snapshot":null,"stack":null,"endedWatch":{"startedAt":"1970-01-01T00:00:00.000Z","headSha":null,"failedChecks":[],"passed":false,"passedChecks":[],"remarksThrough":"1970-01-01T00:00:00.000Z","remarkIds":[],"conflicting":false,"wakes":0}}],"notificationCount":1,"notifications":[{"messageId":"message:pr-watch:d1126f46-4ead-4f7d-be52-3201708c5986","notification":{"source":{"kind":"monitor"},"outcome":"updated","summary":"#20: merged, stopped watching"}}]}

 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > applies lifecycle commands idempotently and emits archive/removal shell deltas
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > keeps the branch pull request when linking another pull request
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > retains multiple pull requests and dismissed stack members through rebuilds
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > starts, records, and stops a pull request watch
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > settling ends every pull request watch: manual
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > settling ends every pull request watch: automatic
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > archiving ends watches, and an archived thread cannot start one
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > ends a watch it cannot read, and tells the agent
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > wakes once for a state it reported, across a restart and a new watch
 ✓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > tells the agent once when a watched PR merges (host-read) 94ms
stdout | src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > tells the agent once when a watched PR merges (synced-snapshot)
PROOF {"implementation":"1f354b28e1","case":"synced-snapshot","stage":"before-sweep","detailCalls":0,"activityCalls":0,"activeWatch":{"startedAt":"1970-01-01T00:06:00.000Z","headSha":null,"failedChecks":[],"passed":false,"passedChecks":[],"remarksThrough":"1970-01-01T00:06:00.000Z","remarkIds":[],"conflicting":false,"wakes":0},"retainedLinks":[{"host":"github.com","repository":"pingdotgg/t3code","number":20,"url":"https://github.com/pingdotgg/t3code/pull/20","source":"agent","linkedAt":"1970-01-01T00:06:00.000Z","snapshot":{"state":"merged","title":"Watched pull request","headBranch":"feature","baseBranch":"main","isDraft":false,"updatedAt":"2026-10-02T12:00:00.000Z","syncedAt":"2026-10-02T12:00:00.000Z","mergedAt":"2026-10-02T12:00:00.000Z"},"stack":null,"watch":{"startedAt":"1970-01-01T00:06:00.000Z","headSha":null,"failedChecks":[],"passed":false,"passedChecks":[],"remarksThrough":"1970-01-01T00:06:00.000Z","remarkIds":[],"conflicting":false,"wakes":0}}],"notificationCount":0,"notifications":[]}

stdout | src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > tells the agent once when a watched PR merges (synced-snapshot)
PROOF {"implementation":"1f354b28e1","case":"synced-snapshot","stage":"after-sweep-1","detailCalls":0,"activityCalls":0,"activeWatch":null,"retainedLinks":[{"host":"github.com","repository":"pingdotgg/t3code","number":20,"url":"https://github.com/pingdotgg/t3code/pull/20","source":"agent","linkedAt":"1970-01-01T00:06:00.000Z","snapshot":{"state":"merged","title":"Watched pull request","headBranch":"feature","baseBranch":"main","isDraft":false,"updatedAt":"2026-10-02T12:00:00.000Z","syncedAt":"2026-10-02T12:00:00.000Z","mergedAt":"2026-10-02T12:00:00.000Z"},"stack":null,"endedWatch":{"startedAt":"1970-01-01T00:06:00.000Z","headSha":null,"failedChecks":[],"passed":false,"passedChecks":[],"remarksThrough":"1970-01-01T00:06:00.000Z","remarkIds":[],"conflicting":false,"wakes":0}}],"notificationCount":1,"notifications":[{"messageId":"message:pr-watch:fd3e4845-a4c3-41ec-8166-30fd2b48ec01","notification":{"source":{"kind":"monitor"},"outcome":"updated","summary":"#20: merged, stopped watching"}}]}

stdout | src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > tells the agent once when a watched PR merges (synced-snapshot)
PROOF {"implementation":"1f354b28e1","case":"synced-snapshot","stage":"after-sweep-2","detailCalls":0,"activityCalls":0,"activeWatch":null,"retainedLinks":[{"host":"github.com","repository":"pingdotgg/t3code","number":20,"url":"https://github.com/pingdotgg/t3code/pull/20","source":"agent","linkedAt":"1970-01-01T00:06:00.000Z","snapshot":{"state":"merged","title":"Watched pull request","headBranch":"feature","baseBranch":"main","isDraft":false,"updatedAt":"2026-10-02T12:00:00.000Z","syncedAt":"2026-10-02T12:00:00.000Z","mergedAt":"2026-10-02T12:00:00.000Z"},"stack":null,"endedWatch":{"startedAt":"1970-01-01T00:06:00.000Z","headSha":null,"failedChecks":[],"passed":false,"passedChecks":[],"remarksThrough":"1970-01-01T00:06:00.000Z","remarkIds":[],"conflicting":false,"wakes":0}}],"notificationCount":1,"notifications":[{"messageId":"message:pr-watch:fd3e4845-a4c3-41ec-8166-30fd2b48ec01","notification":{"source":{"kind":"monitor"},"outcome":"updated","summary":"#20: merged, stopped watching"}}]}

stdout | src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > tells the agent once when a watched PR merges (synced-snapshot)
PROOF {"implementation":"1f354b28e1","case":"synced-snapshot","stage":"after-sweep-3","detailCalls":0,"activityCalls":0,"activeWatch":null,"retainedLinks":[{"host":"github.com","repository":"pingdotgg/t3code","number":20,"url":"https://github.com/pingdotgg/t3code/pull/20","source":"agent","linkedAt":"1970-01-01T00:06:00.000Z","snapshot":{"state":"merged","title":"Watched pull request","headBranch":"feature","baseBranch":"main","isDraft":false,"updatedAt":"2026-10-02T12:00:00.000Z","syncedAt":"2026-10-02T12:00:00.000Z","mergedAt":"2026-10-02T12:00:00.000Z"},"stack":null,"endedWatch":{"startedAt":"1970-01-01T00:06:00.000Z","headSha":null,"failedChecks":[],"passed":false,"passedChecks":[],"remarksThrough":"1970-01-01T00:06:00.000Z","remarkIds":[],"conflicting":false,"wakes":0}}],"notificationCount":1,"notifications":[{"messageId":"message:pr-watch:fd3e4845-a4c3-41ec-8166-30fd2b48ec01","notification":{"source":{"kind":"monitor"},"outcome":"updated","summary":"#20: merged, stopped watching"}}]}

 ✓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > tells the agent once when a watched PR merges (synced-snapshot) 72ms
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > finishes owed checks once after pending sweeps, a restart, and a re-watch
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > a watch that ends on the comment limit keeps what its last pass saw
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > wakes once when no checks report on the head, without saying they passed
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > wakes for checks that complete after the no-checks notice on the same head
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > watching a dismissed stack layer again keeps what its last watch told
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > wakes a watched thread once: single page
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > wakes a watched thread once: paginated
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > wakes a watched thread once: page failure
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > wakes a watched thread once: repeated cursor
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > wakes a watched thread once: missing comments
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > wakes a watched thread once: thread list truncated
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > persists rejected command receipts across retries
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > admits restart continuations once and rejects a stale continuation behind newer work
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > admits a restart continuation of a failed run that lost a shell: false
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > admits a restart continuation of a completed run that lost a shell: false
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > admits a restart continuation of a waiting run that lost a shell: false
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > admits a restart continuation of a cancelled run that lost a shell: false
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > admits a restart continuation of a completed run that lost a watchdog-monitor: false
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > admits a restart continuation of a failed run that lost a awaited-monitor: false
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > admits a restart continuation of a completed run that lost a awaited-monitor: true
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > admits a restart continuation of a waiting run that lost a awaited-monitor: true
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > admits a restart continuation of a cancelled run that lost a awaited-monitor: true
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > rejects settling a thread while a run is active
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > settles a thread its own agent settled once the turn completes
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > settles past held automatic runs but not held user messages
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > cancels preparing work on archive and keeps it cancelled through replay
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > promotes only one queued run after each terminal run (notification: false)
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > promotes only one queued run after each terminal run (notification: true)
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > starts a wake's work clock from the run that ran before it
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > handles a queued message after a usage_limit failure
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > handles a queued message after a provider_error failure
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > keeps queued user selections and pauses only the limited provider
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > delivers a queued monitor update from server after conversation selection {"instanceId":"codex","model":"gpt-5.4"}
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > delivers a queued monitor update from provider after conversation selection {"instanceId":"codex","model":"gpt-5.4"}
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > delivers a queued monitor update from provider after conversation selection {"instanceId":"codex_alternate","model":"gpt-5.4"}
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > keeps the queue after a user interrupts the active run
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > places held queued messages after a continuation that started first
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > preserves and holds queued messages across startup until explicitly resumed
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > preserves and holds queued messages across shutdown until explicitly resumed
 ↓ src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > edits and removes queued runs
 ↓ src/orchestration-v2/runtimeLayer.test.ts > pending provider interruption > interrupts a pending provider start without launching provider work
 ↓ src/orchestration-v2/runtimeLayer.test.ts > snooze queued runs > only user messages block snooze with a held notification run
 ↓ src/orchestration-v2/runtimeLayer.test.ts > snooze queued runs > only user messages block snooze with a held delegated-completion run
 ↓ src/orchestration-v2/runtimeLayer.test.ts > snooze queued runs > only user messages block snooze with a held user run
 ↓ src/orchestration-v2/runtimeLayer.test.ts > snooze queued runs > a notification message on a snoozed thread keeps the snooze only when automatic
 ↓ src/orchestration-v2/runtimeLayer.test.ts > snooze queued runs > a user message on a snoozed thread keeps the snooze only when automatic
 ↓ src/orchestration-v2/runtimeLayer.test.ts > snooze projection > carries snooze state through the V2 shell projection
 ↓ src/orchestration-v2/runtimeLayer.test.ts > visited projection > carries the visited watermark through the V2 shell projection
 ↓ src/orchestration-v2/runtimeLayer.test.ts > thread opens > counts opens on the server clock, merges quick reopens, and keeps picked queries
 ↓ src/orchestration-v2/runtimeLayer.test.ts > compact PR events > persists only the changed PR link and replays it without losing other links
 ↓ src/orchestration-v2/runtimeLayer.test.ts > shared application data plane > orders retained project transactions and V2 thread transactions in one source
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > manually resumes an interrupted run ahead of its queued message only once
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > manually resumes an usage_limit run ahead of its queued message only once
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > guards a scheduled usage-limit continuation against resume
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > guards a scheduled usage-limit continuation against queued-resume
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > guards a scheduled usage-limit continuation against rearm
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > guards a scheduled usage-limit continuation against snooze-race
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > guards a scheduled usage-limit continuation against archive
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > guards a scheduled usage-limit continuation against replacement
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > guards a scheduled usage-limit continuation against manual-snooze
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > guards a scheduled usage-limit continuation against invalid-snooze
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > guards a scheduled usage-limit continuation against cancel-resume-keep-snooze
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > guards a scheduled usage-limit continuation against independent-patches
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > guards a scheduled usage-limit continuation against expired-snooze
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > guards a scheduled usage-limit continuation against wake
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > guards a scheduled usage-limit continuation against stop
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > guards a scheduled usage-limit continuation against stop-before-arm
 ↓ src/orchestration-v2/runtimeLayer.test.ts > usage-limit recovery > guards a scheduled usage-limit continuation against stop-before-arm-mismatched-recovery
 ↓ src/orchestration-v2/runtimeLayer.test.ts > queue.resume on a project-disabled instance > holds a queued run instead of starting it on an instance the project turned off

 Test Files  1 passed (1)
      Tests  2 passed | 89 skipped (91)
   Start at  01:09:01
   Duration  13.70s (transform 69%, import 27%, tests 3%, setup 1%)


EXIT_STATE green exit_code=0
FINAL git status --porcelain=v1: ''
FINAL checkout HEAD=1f354b28e1a29ad221c1bd28acb2f53d18c88163
FRICTION: temporary Vite load hook required for detailed observations and red implementation injection without altering reviewer-visible files. No server/browser startup, public writes, merges, watches, or uploads performed.

SOURCE EXTRACTION COMMANDS (executed by prepare.py, subprocess argv; stdout saved as loader artifacts):
git show 8306240cef:apps/server/src/orchestration-v2/PullRequestWatchReactor.ts
git show 1f354b28e1:apps/server/src/orchestration-v2/PullRequestWatchReactor.ts
POSTCAPTURE COMMAND: python /tmp/issue-25160-proof/verify-proof.py
VERIFIED: 16 runtime observations; red both cases [] and exit 1; green both cases one stable merged monitor/updated notification through three sweeps and exit 0; retained links/watch removal; detail/activity counts host-read 1/1, snapshot 0/0. Transcript manually reviewed and credential-pattern scan found no matches.
FRICTION detail: pilot instrumentation incorrectly expected activityCalls=0 for host-read; corrected to 1. Vite filesystem cache reused pilot instrumentation until distinct scratch cache paths were supplied. Default reporter hid passed-test logs; final capture explicitly used --silent=false --reporter=verbose. Pilot/quiet transcripts retained separately and are not the final proof. No reviewer-visible source edits at any time.
