# Real Claude lifecycle evidence — issue 23948

Captured head [9031bd1140](https://git.cafe/pingdotgg/t3code/commit/9031bd114036754fc14500d60594d0ef9a3e34da), baseline [b3d382e100](https://git.cafe/pingdotgg/t3code/commit/b3d382e1009d5430de8c528aef99a39854a7cbc4). These are capture SHAs, not the lead's later merge. Both were clean during capture. No code changes, commits, PR or forge writes by this evidence agent.

Outcome: real head waiting -> UUID acceptance, Stop terminal cleanup, and persisted crash/restart/reconnect/reload with disclosure are demonstrated in the web app. Baseline/head dark comparison demonstrates missing pending feedback on baseline versus explicit waiting on head. The original permanent CLI stall was NOT reproduced: baseline completed and acknowledged the steer using installed Claude 2.1.303. Do not claim this proves a stall fix.

## Environment and actions

T3 collaborative preview, owned tab tab_2_0f64c61e-0f49-4bf7-b95e-e7770de25a9f. CSS viewport1280x800, wide desktop web, light first and dark comparison (root class dark and prefers-color-scheme dark verified). PNG exports1280x800; recordings2560x1600. Claude Opus5.5, medium effort, fastMode false, full access, installed CLI2.1.303. No native or Electron shell test in this pass; web is the shared desktop renderer, not proof of Electron IPC/shell behavior.

Head: one dev runner in /home/ubuntu/wt/issue-23948, isolated .t3; server13946/web5906. Startup's read-only live-data snapshot migration failed due recorded migrations68/69 names differing; runner continued with initialized isolated state. Used app-created threads and actual provider calls, no projection or event fixture writes. Initial project is server with cwd apps/server. Existing credentials were inherited privately.

First new thread: choose Claude Opus5.5; close details; start recording; submit exact prompt:

```text
Evidence test only. Do not inspect or change any repository files. Use Bash to run exactly this foreground command with timeout 240000 and run_in_background false: for i in $(seq 1 90); do printf 'ISSUE23948_TICK_%s\n' "$i"; sleep 2; done. Wait for it to finish before answering. Then respond with ISSUE23948_DONE.
```

While Running command, submit via Enter these two distinct steers:

```text
STEER_A_23948: Keep the foreground Bash running to completion. After it completes, mention A_ACK_23948 in your final answer. Do not run any additional tools.
STEER_B_23948: Keep waiting for that same foreground command. Add B_ACK_23948 only after it finishes. Do not run any additional tools.
```

## UTC runtime and persisted event correlation

All dates2026-10-25. Logs in bundle preserve complete UUIDs and native frames. Timestamps below are source log/event times, not inferred video offsets.

| Step | Native event | Persisted event / observable result |
|---|---|---|
| Bash |07:31:03.358 assistant Bash tool_use, foreground false-background flag, timeout240000|Running command; tool result07:34:05.574 contains ticks1–90|
| A |07:31:11.746 prompt.offer priority now UUID f905d7bb-fb52-476d-b5c3-fee813c64890; queued07:31:11.751|waiting07:31:11.752|
| B |07:31:19.278 prompt.offer priority now UUID0ef2d1a3-95e5-41f6-8571-2f7f106a3059; queued07:31:19.319|waiting07:31:19.308|
| A/B accepted |07:34:05.645 command_lifecycle started for each exact UUID|A accepted07:34:05.646; B accepted07:34:05.653, same native steer item IDs, completed/info|
| Result |07:34:07.654 result echoes both UUIDs and both ACKs|Visible DONE + A_ACK + B_ACK; completion lifecycle07:34:07.812/.814|
| Stop |Second foreground sleep180; steer UUID2a374b8d-5f3e-4ed9-99ec-4fa007f8d7d3 offered07:35:32.717, queued. Click Stop generation.|waiting07:35:32.726 -> completed warning07:35:36.190: The turn ended before Claude confirmed it accepted this steer. Run interrupted / Stopped by user.|
| Crash/restart |Third foreground sleep180; steer UUIDbd8cbf45-74f9-407c-88f6-e8c10aecea84. SIGKILL captured backend PID1066325 at07:36:28.453 after verifying cwd and parent watcher. touch src/bin.ts restarts same watcher, no source-content edit.|waiting07:36:27.552 -> cancelled warning07:36:41.263: T3 Code restarted before Claude confirmed it accepted this steer. Reconnected automatically, resumed turn. Stop resumed sleep, reload page, same notice persists; open/close its disclosure.|

The crash can lose buffered native log lines: restart-steer's persisted waiting event is present, but its outgoing native offer was not retained. Recovery is proved by persisted before/after events plus actual crash, restart, reconnect and reload, not by a fabricated recovery fixture.

Acceptance was batched. No real A-accepted/B-waiting state was forced or claimed; lead reports that selective identity behavior is unit-test covered. These runtime captures are not exhaustive protocol alternative coverage.

## Matched wide dark comparison

Fresh app-created threads on each build; exact same initial prompt as above except seq1 30 and timeout120000 (60-second tick command); same steer:

```text
STEER_COMPARE_23948: Keep the foreground command running. After completion add COMPARE_ACK_23948. Do not run additional tools.
```

Head prompt.offer07:38:37.245; steer8258a212-b319-4257-93e8-b59c3b0228d3 offered07:39:24.562 priority now; waiting persisted07:39:24.565; exact UUID started07:39:41.932; accepted persisted07:39:41.944; result07:39:44.125. Dark recording ends at acceptance, before that final result; first light lifecycle recording includes full final result.

Baseline clean detached scratch worktree /tmp/issue-23948-baseline-test, isolated .t3, server15767/web7727, T3CODE_DEV_SEED=0. Same model/effort/theme/viewport. Steer user event07:45:23.992 while foreground command active. No waiting/acceptance notice exists on baseline. Tool completed and result07:45:38.502 includes COMPARE_ACK. Thus no permanent stall reproduced.

Full-frame screenshots differ in generated title, sidebar thread titles/ref state, elapsed timer and wall-clock times. They are not asserted pixel-identical outside the affected timeline. Main command and steer text/layout match. Both recordings include the same two-thread sidebar shape; only actual app-created history was used. The earlier attempted sidebar collapse did not persist through new-thread navigation; it was not used as a claim of hidden sidebar evidence.

Stable comparison crops come from original recordings at head94/95seconds and baseline66/67seconds, coordinates[800,680,2272,1210] in2560x1600 video. This intentionally frames the steer and pending-notice area, excluding the working timer, continuously repainting Running command label, sidebar and composer. No resizing, masks, synthetic text, or pixel changes. Both1-second repeat crops are exact RGB-identical:0 changed pixels of780160, also0 above8/255 threshold. stability.json and full extracted source frames are included. This establishes stable affected-content frames, not whole-window paint stability.

## Coverage and gaps

- Proved here on web: two distinct real pending steers held until command completion, exact UUID acceptance, final response, Stop unconfirmed terminalization, crash recovery persisted notice, automatic reconnect, full reload persistence and disclosure open/close.
- Baseline/head: actual same command/steer wide dark recordings and stable affected timeline comparison; baseline lacks pending feedback. Permanent stall not reproduced.
- Unverified: native iOS/Android (GhosttyKit build blocker reported by lead; no build attempted), actual Electron shell, narrow widths, dark/light Cartesian matrix, exhaustive protocol/control alternatives, natural turn-end-unconfirmed separate from Stop, real selective batching (not needed per lead).
- Renderer discoverability: terminal notices readable collapsed; restart notice disclosure opens/closes after reload. Not a keyboard/screen-reader accessibility audit.

## Cleanup and FRICTION

All owned runners/server children/Vite processes stopped by captured PID after cwd/parent validation; four ports5906/13946/7727/15767 verified closed. Old Claude PID1069158 verified exited. Owned preview tab closed. Scratch baseline worktree removed. Shared worktree retained; no source content changes. Later lead commits/merge are not relabeled as capture SHAs.

FRICTION:
- Seed migration: live snapshot migration68/69 history mismatch. Continued isolated initialization and created real test threads; no live writes.
- Pairing baseline: startup URL left app unauthenticated; minted fresh isolated token and entered pairing form. No credential included in uploads.
- Locators: generated thread titles change composer accessible names. Initial baseline attempt missed steer window and is excluded. Repeated with observed contenteditable selector. Several earlier incorrect label waits timed out; these are automation friction, not app failures.
- Timing: video duration differs from wall interval; UTC event logs are authoritative. Relative offsets are video coordinates only.
- Capture: PNG tool exports1280x800 but video2560x1600. Initial crop-coordinate attempt rejected and corrected. Stable ROI explicitly excludes animated Running command text; no claim of zero whole-window repaints.
- Baseline symptom: original permanent stall not reproduced on installed CLI. Report the pending-feedback difference without upgrading the stall claim.

## Artifacts

- [head-real-lifecycle.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/019f222e968f23dc/head-real-lifecycle.mp4)
- [head-stop.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b7c4f725ae718822/head-stop.mp4)
- [head-restart-reconnect.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/62b45d208942f759/head-restart-reconnect.mp4)
- [head-compare-dark.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/212c1066e6569441/head-compare-dark.mp4)
- [baseline-compare-dark.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/06121b408a7e70a6/baseline-compare-dark.mp4)
- [head-waiting-dark.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/70fecd0892fa2e0e/head-waiting-dark.png)
- [baseline-steer-dark.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/62852d970029061d/baseline-steer-dark.png)
- [head-timeline-0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c0995baadfb83664/head-timeline-0.png)
- [baseline-timeline-0.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2fe77a21d735dd49/baseline-timeline-0.png)
- [head-stop-light.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/773705dc26876b2c/head-stop-light.png)
- [head-restart-reloaded-expanded.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/913d56332cfd53c5/head-restart-reloaded-expanded.png)
- [head-accepted-light.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/415f9d34cb6a51c7/head-accepted-light.png)
- [issue-23948-lifecycle-evidence.tar.gz](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4482a6a5a9860324/issue-23948-lifecycle-evidence.tar.gz)

Before — baseline affected timeline:

![Before: steer appears without pending feedback](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2fe77a21d735dd49/baseline-timeline-0.png)

After — head affected timeline:

![After: explicit waiting until Claude accepts](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c0995baadfb83664/head-timeline-0.png)
