# Runtime evidence: H1 and H2

PR [#32460](https://git.cafe/pingdotgg/t3code/pull/32460). Captured **2 / 2 assigned runtime rows**. Both real app checkouts were verified at the requested commits. The earlier partial capture was reused as requested; no production state was seeded or changed.

Environment: Linux x86_64 VM fs-73; T3 Browser panel / headless Chrome 157; no device emulation; CSS viewport 1440×900; DPR 2; PNG/video pixels 2880×1800; app default light appearance. Claude Code 2.1.321 through the intended configured hub, same selected provider/model on both sides; model picker hidden with CSS before captures, identifiers omitted from uploaded transcripts. Dev servers used T3CODE_DEV_SEED=0 and each checkout's own isolated .t3 state. Only synthetic README/project data.

## H1: delayed first side-chat message

Scripted order: set `/goal The user has sent a later chat message containing the word banana`; let the parent settle; open an empty side chat at that stable boundary; clear the goal in the parent and await success; send `What is 2+2? One word.` as the side chat's first message.

UTC on 2026-11-10, from persisted state and provider logs:

| Step | Before | After |
|---|---|---|
| Goal offered; initial parent settled | 15:25:00.179; 15:25:47.627 | 15:31:38.970; 15:41:40.678 |
| Empty side chat created at parent turn 1 | 15:26:37.203 | 17:34:34.027 |
| Parent clear succeeded, num_turns 0 | 15:26:52.772 | 17:34:59.996 |
| Additional after-only parent clear returned No goal set, num_turns 0 | — | 17:35:05.391 |
| Native fork at the old turn | 15:27:17.044 | 17:35:19.997 |
| Fork-local clear result | None | 17:35:21.049, Goal cleared, num_turns 0 |
| Side user prompt offered | 15:27:17.838 | 17:35:23.441 |
| Side result | 15:28:28.274, cap after 9 Stop-hook blocks | 17:35:26.755, Four, 1 model turn, 0 Stop-hook blocks |

| Before | After |
|---|---|
| [d313b2aff3](https://git.cafe/pingdotgg/t3code/commit/d313b2aff31991ab94c8ac80cdc38a54dd575604) | [3932502e50](https://git.cafe/pingdotgg/t3code/commit/3932502e5036eb5bd75ad6356a6c991d21efc26d) |
| ![h1-still-b.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c582a3444d1aa9f9/h1-still-b.png) | ![h1-still-b.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0d4a1c7a6272ec95/h1-still-b.png) |
| [h1-sequence-part1.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2a9f924a439465aa/h1-sequence-part1.mp4) | [h1-side-sequence.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1e534328b0e62050/h1-side-sequence.mp4) |
| [h1-settled.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e61ea0d9bdb6ad98/h1-settled.mp4) | [h1-parent-goal-intro.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3678b44c8c1121a6/h1-parent-goal-intro.mp4) |
| [h1-parent.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bb5da33077cfa22f/h1-parent.txt) | [h1-parent.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/33380204672d74ae/h1-parent.txt) |
| [h1-side.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5d30bd0ef6944cd2/h1-side.txt) | [h1-side.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b4eeea7025b85677/h1-side.txt) |

Before recording narration: 0:00 initial parent goal turn; approximately 0:48 parent settles; approximately 1:38 empty side chat opens; approximately 1:53 parent clears; approximately 2:18 side chat first message; sequence part 1 ends while the side is working. The separate 19.65-second settled clip shows its final nine-block warning. Provider timestamps above are authoritative; recordings are observational evidence, not a latency benchmark.

After recording narration (`h1-side-sequence.mp4`, 17:34:21–17:35:33 UTC): 0:00 settled goal-bearing parent; 0:13 empty side chat created; 0:38 banner Clear submits parent clear; 0:44 extra typed clear submits and returns No goal set; 0:59 native fork and fork-local clear; 1:02 side user prompt; 1:06 Four appears, then settles. The 20-second parent-goal intro is extracted from the earlier partial parent recording. The full original is also available: [h1-parent-part1.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/330946d78926b976/h1-parent-part1.mp4). It contains a stale Working display after the original capture failed; use the condensed native log for completion and the retry recording for the completed workflow. There is a recording gap between the initial goal run and retry.

The after side transcript confirms **query.open = 2**, first with `tools: []` for `/goal clear`, then the normal user query. The old fork cursor is `b8d58f32-a482-4011-ba29-4a5d16b91bb5`; the parent is currently goal-null and has later completed provider turns. The fork clears the historical goal and answers Four without Stop-hook feedback. The before side has query.open = 1 and 9 Stop-hook feedback events. Both transcripts include session.fork and the selected native boundary.

## H2: already goal-free older fork

Real app, after checkout. Fresh goal-free parent: Say ready → Ready (17:36:25.884); open empty side chat (17:36:34.483); parent Say updated → Updated (17:36:47.306); first side message What is 2+2? One word. Native fork at the first parent response, then `/goal clear` returns **No goal set**, **num_turns 0**, success, at 17:36:55.829. The normal query then returns Four at 17:36:59.776, num_turns 1, with zero Stop-hook feedback. No CLI fallback was needed.

[h2-parent.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c473567ea3acf5eb/h2-parent.txt)
[h2-side.txt](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5439d5925d58ea11/h2-side.txt)
![h2-still-b.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d886204c86197388/h2-still-b.png)

## Still validation, diffs, and what else changed

Every retained still was captured twice at least 500 ms apart after idle; each pair was byte-identical. SHA256 hashes are in README-scripts.md. Captures were opened for visual review; recordings were checked with ffprobe and representative contact sheets. No mobile/dark variant was captured: this is a server-only change with one visible web outcome.

Zero-threshold RGB absolute difference, amplified ×8:

![h1-diff-zero-amplified.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/65b5404dd046f084/h1-diff-zero-amplified.png)

Thresholded RGB difference, per-channel absolute difference greater than 16/255 (6.2745098%):

![h1-diff-threshold-16.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/53a81e1665304cb3/h1-diff-threshold-16.png)

What else changed:

- Intended: side chat's answer replaces its stale-goal continuation and nine-block warning.
- Parent and side chat auto-generated titles, parent answer wording, worked duration, timestamps and sidebar relative ages differ between independent runs.
- After includes an extra harmless parent `/goal clear` and its No goal set response; this is a disclosed sequence deviation, not a byte-for-byte identical script run.
- Before has an extra synthetic readiness thread; after has only the captured goal thread at the H1 still. Sidebar rows therefore differ.
- The after still exposes a parent message hover toolbar/timestamp; before does not. It does not cover any result text.
- Both use the same viewport, theme, hidden picker and panel split. No client layout change is claimed. Content differences dominate the diffs.

Whitelisted persisted-state evidence (source goal null, selected older provider turn, latest retained turn, side-chat lineage and native transfer):

[state-evidence.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e221c8d6f1fcab89/state-evidence.json)

Unverified: no assigned runtime row remains missing. H1 has the disclosed extra-clear and recording-gap limitations. E1/E2/T1/N1 belong to the separate unit-test task and were not executed here. G1/R1/L1/C1 were outside this runtime capture assignment. No cross-client or other-provider behavior is inferred from these captures.

## Scripts and synthetic seed

[start-server.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/54c2d202647a91fa/start-server.py)
[seed-project.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/430c9b9445af2c07/seed-project.sh)
[condense.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0924ba946d8b4e2f/condense.py)
[browser-redaction.js](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/73e8ff05fb2065c8/browser-redaction.js)
[state-evidence.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/14f6187658f31a0d/state-evidence.py)
[state-evidence.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e221c8d6f1fcab89/state-evidence.json)
[make-diffs.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/904617c78f16fa47/make-diffs.sh)
[media-commands.sh](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d81d36d9a974cbb7/media-commands.sh)
[browser-driver.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/946b4456f78548a3/browser-driver.mjs)
[README-scripts.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ec199f2ff78d9c32/README-scripts.md)
[README.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7b424a3a88c4f394/README.md)

Additional archive and report-building scripts:

[scripts-and-transcripts.tar.gz](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0d6f65c11b471c3a/scripts-and-transcripts.tar.gz)
[build-report.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b015786b068fece5/build-report.py)
[sanitize-server-logs.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5e2079f86a754f1a/sanitize-server-logs.py)
[archive-public.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/31de45f91ea4c27f/archive-public.py)

Teardown verified: both captured process groups stopped, all four dev ports closed, preview tab closed, and both capture worktrees removed. Free disk after teardown: 100 GB. Scratch is removed after this final evidence upload.

AI-assisted; verified with the tests and tools listed above.

FRICTION:
infra | The original provider stream closed and left a partial after recording with a stale Working display | Reuse completed state and logs, then resume with short provider turns and incremental uploads.
tool | Browser actions can return before React has rendered their result; a banner clear succeeded before a second typed clear was sent | Check the persisted command result and refreshed DOM before sending another command.
tool | The VM has python3 but no python alias, and Pillow is absent | Use python3 and the installed ImageMagick tools.
tool | Inline HTML comparison preview timed out twice, using remote and local images | The embedded PNGs and uploaded evidence report remain available.
