# Evidence artifact index

## Evidence

Coverage: 2/5 required groups complete (H, Android A03); A04 has instrumentation-harness coverage only; phone A01/A05 blocked by an existing LegendList `Maximum update depth exceeded` on both revisions. Optional iPad A02 unverified. No phone Home still or Home render-count claim. A12/A13 have shared-selector proof only, without direct consumer/device verification or synthetic PR payloads.

Environment: real dev clients installed through `mobile:install`, agent-device pool capture + Hermes/Metro CDP, dark, font scale 1. Android Pixel Tablet: API36, 1280×800dp, DPR2, 2560×1600px. iPhone17 Pro: reported iOS27.2, 402×874pt, DPR3, 1206×2622px video. Same native fingerprints on both SHAs; React Compiler enabled. One theme suffices for this selector-only change.

Android script (approximate video timestamps Before / After): B selected → 100 synthetic pure-stream shell ticks; clear overlay and restore real provider → scroll 00:57/00:27 → RPC rename A 00:59/00:28 → open renamed Working A 01:03/00:34 → show real Codex text 01:12/00:47 → return B 01:23/01:06 → stop A 01:24/01:07 → row leaves Working by 01:27/01:10. First ~17s of After includes connection recovery/sync. Timing differences are tool/network variability, not a speed benchmark. Same driver, real provider prompt, and seeded project; ten filler threads are idle never-run threads rather than historical stopped runs.

Sheet script: 00:00 actual Arrange threads sheet visible; apply 100 controlled active-shell ticks during the clip; record ends ~01:03 Before / ~00:39 After. This is an **instrumentation harness**; no provider-backed sheet interaction, drag, or pin action is claimed.

| Recording row | Before<br>[96fc7b9](https://github.com/pingdotgg/t3code/commit/96fc7b955196637605cbf3b415152ce4dd0e2294) | After<br>[4859c3a](https://github.com/pingdotgg/t3code/commit/4859c3a7d372dba06a50adee68d157643a305a10) |
|---|---|---|
| A03 Android tablet sidebar, dark; real provider interaction + instrumentation harness | [before-android-sidebar.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d4d6d7d214670fb6/before-android-sidebar.mp4) | [after-android-sidebar.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/83308f0563568232/after-android-sidebar.mp4) |
| A04 iPhone Arrange threads, dark; instrumentation harness only | [before-ios-arrangement.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/092d7d16a2750f4c/before-ios-arrangement.mp4) | [after-ios-arrangement.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/dd3c64ecfedd1e80/after-ios-arrangement.mp4) |

| Static row | Before<br>[96fc7b9](https://github.com/pingdotgg/t3code/commit/96fc7b955196637605cbf3b415152ce4dd0e2294) | After<br>[4859c3a](https://github.com/pingdotgg/t3code/commit/4859c3a7d372dba06a50adee68d157643a305a10) | Diff0 (32×) | DiffT (32×; any RGB channel >8/255) |
|---|---|---|---|---|
| Android tablet Home, dark; static fixture, normalized clock/status bar | ![before-android-home.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ea7a3aedb8601a3a/before-android-home.png) | ![after-android-home.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bb5ab9fa7c4795ed/after-android-home.png) | ![diff0-amplified.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d55df9bba2082dfa/diff0-amplified.png) | ![diffT8-amplified.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7fc851fae9ba3ad1/diffT8-amplified.png) |

H selector harness: each pure sequence uses 100 events. All 57 semantic sequences assert the correct value/membership and exactly one notification on both SHAs; focused scratch test passed on each revision. [H-transcript.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a7a04a187036e25d/H-transcript.md)

| H metric | Before | After |
|---|---:|---:|
| Navigation notifications, each of updatedAt / positive itemCount / positive visibleItemCount / message / combined | 100 each | 0 each |
| List replacements / A-row replacements / idle-row replacements, each pure sequence | 100 / 100 / 0 | 0 / 0 / 0 |
| Live threadShell subscription callbacks, each pure sequence | 100 | 100 |
| Each semantic transition: rename, statuses, approval/input set+clear, child aggregation, zero crossings, stop/post-stop, ordering/membership, duplicate IDs across environments | 1 | 1 |

I **instrumentation harness**: identical uncommitted patch on both sides; 100 sequential CDP writes increment positive item/visible counts on an active A, ≥100ms host spacing; native timers run; mounts excluded. Counts are component-body executions, not commits or FPS. Live provider snapshots are restored before semantic interaction.

| I metric | Before | After |
|---|---:|---:|
| Android shell deliveries / navigation notifications | 100 / 100 | 100 / 0 |
| Android sidebar / thread-row executions | 101 / 1,313 | 1 / 13 |
| iPhone sheet shell deliveries / navigation notifications / sheet executions | 100 / 100 / 100 | 100 / 0 / 0 |

One additional sidebar pass and 13 row executions remain beyond the navigation-driven work; no causal or elapsed-time claim is made for them. Phone Home counters are unverified.

What else changed: no pixels differ in the controlled Android Home stills at threshold zero (0/4,096,000 pixels, max RGB delta 0); same result at threshold8. Each side had two exactly equal whole-device screenshots ≥500ms apart. Application Date.now was fixed only for stills; native timers stayed live. Explicit network-idle/font-ready signals were unavailable. Recording clocks, ages, Working durations, generated prose/progress, and after-side connection recovery differ; these are uncontrolled runtime differences, with no intended static product change.

Rebuild and complete artifact URLs: [REBUILD.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bb6c615f6cd62cb3/REBUILD.md); seed/RPC [rpc-driver.ts](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2b7578f1e3601b24/rpc-driver.ts); device flow [device-driver.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9adb67afc6dd79dd/device-driver.py); count driver [measure-pure.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f443548e53d5755a/measure-pure.mjs); sheet recipe [sheet-driver.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9ecdf33b390ce8b5/sheet-driver.py); selector test [selector.capture.test.ts](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ee8fb0e9e0db6700/selector.capture.test.ts); identical patch [instrumentation.patch](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/91ad306da0062342/instrumentation.patch); static fixture [static-fixture.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b88214356a558d65/static-fixture.mjs); settled capture [settled-capture.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/854a057e63fbc72a/settled-capture.py); diff [diff-stills.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0a04be1f9551ae44/diff-stills.py). Remaining pairing/CDP/environment scripts and every direct URL are in the artifact index. [capture-artifacts.tar.gz](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/39947db597e32504/capture-artifacts.tar.gz) contains raw diagnostics/retakes, logs, snapshots, recordings, frames and scripts; [archive-manifest.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2094eb8b5d467813/archive-manifest.json) indexes members and SHA256. Credentials and full config excluded; text URL credentials redacted. Curated rows above are authoritative.

Cleanup: both leases closed, all owned backend/Metro ports clear, before checkout removed, after checkout clean at [4859c3a](https://github.com/pingdotgg/t3code/commit/4859c3a7d372dba06a50adee68d157643a305a10). No commits, pushes or PR mutations.

## Rebuild instructions

# Rebuild the evidence

PR [#24651](https://git.cafe/pingdotgg/t3code/pull/24651). Before [96fc7b9](https://github.com/pingdotgg/t3code/commit/96fc7b955196637605cbf3b415152ce4dd0e2294), after [4859c3a](https://github.com/pingdotgg/t3code/commit/4859c3a7d372dba06a50adee68d157643a305a10). No tracked changes remain. The before checkout was removed; both device leases were closed and owned dev-server/Metro ports were clear before handoff.

Use two checkouts at those revisions, install with `vp install`, and start each with `T3CODE_DEV_SEED=0 vp run dev --host 0.0.0.0`. Never seed from a real T3 database. Derived server ports in this capture were before 15881 and after 16101. Start Metro from each `apps/mobile`: `REACT_NATIVE_PACKAGER_HOSTNAME=fs-34.tail131df4.ts.net vp run dev:client --port 8082` before / `8081` after. Change the hostname in the scratch CDP drivers for another VM. The VM hostname here was fs-34. These development clients use React Compiler; these are development captures, not release performance benchmarks.

Apply the identical `instrumentation.patch` in each checkout with `git apply`. It adds render-body counters and a writable shell snapshot overlay. It does not freeze timers. It is deliberately untyped scratch instrumentation, not a production patch or passing typecheck claim. `instrument.py` and `add-pure-phase.py` are the construction scripts; applying the final patch directly is sufficient. The older asynchronous `__capturePureTicks` helper is unused by definitive runs; use `measure-pure.mjs`.

H: temporarily copy `selector.capture.test.ts` to `packages/client-runtime/src/state/selector.capture.test.ts`. Set `CAPTURE_OUTPUT` and `CAPTURE_SHA` as shown at the test's footer, then run `vp test run packages/client-runtime/src/state/selector.capture.test.ts`. Remove the copied file afterwards. `H-before.json` and `H-after.json` are the definitive outputs; `H-table.py` builds `H-transcript.md`. Each of 5 pure-stream sequences independently drives 100 events; 57 semantic sequences independently assert the correct value/membership and exactly one callback. The subscriber scheduler drains synchronously. This verifies the shared selector, not the PR-stack hook or destination navigation itself.

Copy `rpc-driver.ts` into each checkout at `apps/server/scripts/capture-driver.ts` so owning-package dependencies resolve. Create a local authenticated bearer credential and put it in a private file; credentials are intentionally excluded from uploads. Invoke `node apps/server/scripts/capture-driver.ts seed http://127.0.0.1:<port> <private-token-file> <output.json>`. Initialize the generated `garden-workspace` directory as a Git repository. This creates Fictional Garden and 12 synthetic threads: A, B, and ten idle never-run filler threads. The real-flow client also had one automatically created New thread. These fillers were idle rather than historical stopped runs.

Check `server.getConfig` provider readiness with the driver's `config` action. Codex was ready here, using `gpt-6.1-sol` through the configured hub, auth mode apiKey. The `stream` action dispatches a real provider request for 600 numbered garden paragraphs. `rename` and `stop` dispatch real orchestration commands. No tools or file edits were requested. The same script seeded both fresh isolated databases.

Prepare and install native clients with `vp run mobile:install ios --prepare`, `vp run mobile:install android --prepare`, then lease named devices through agent-device and install with `--session`. Both revisions reused the same native fingerprints: iOS f532a0c5902b69c7f69cc5fe9c807053700a07eb; Android ed36a9cc9856c84a322bb71e6d67744f0a00877d. Pair using `pair-via-cdp.py <checkout> <server-port> <metro-port> <device-title>` and select the correct environment using `node select-environment.mjs <metro-port> <device-title> <environment-id>`. Device titles in this run were Pixel Tablet and iPhone 17 Pro. The pairing driver passes a fresh short-lived URL directly to the app and does not retain its credential.

Android definitive driver: `python3 device-driver.py <before|after> <checkout> <server-port> <metro-port> cap24651-android 'Pixel Tablet' android-sidebar`. It resets A's title, starts a real run, selects B, records, then runs the 100-event instrumentation harness. The harness overlays an active A with positive counts, increments itemCount and visibleItemCount once per sequential CDP write, and waits 100ms on the host between writes. It checks exactly 100 shell deliveries, starts counters after a warm-up, and excludes mounts. It then clears the overlay so live server state drives the list, scrolls, renames A, opens A to show generated text, returns to B, and stops A. All count metrics are component function-body executions, not commits, frame counts, or FPS. One additional sidebar pass and 13 row executions occurred on both sides beyond the pure navigation-driven work; after also recorded one HomeRouteScreen execution. No claim is made about the cause or elapsed runtime of those additional renders.

Definitive Android directories: before-android-sidebar-20261027T084302Z and after-android-sidebar-20261027T084826Z. Their driver.json files contain commands, command-completion timestamps, snapshots and outputs. Other Android attempts and I-before-android-sidebar-final.json are diagnostics, NOT the reported comparison. The after recording begins with a connection recovery/sync interval (roughly 0–17s). The real-provider interaction chapter begins around 26s after recovery; before around 56s. Video wall time, live text, clock, ages and Working durations are not controlled comparisons. The counts use fixed 100-event input, not equal elapsed duration. Android screenrecord omits unchanged trailing frames; after video ends at 70.6s. Both final frames and device snapshots show A no longer Working.

Phone Home repeatedly throws a LegendList `Maximum update depth exceeded` error on both revisions, after pairing, reload and Try again. The phone A01 flow, phone A05 rename/stop chapter, Home counters, and settled phone Home pair could not be captured. This was not fixed or hidden in production code. Diagnostic screenshots and Metro logs preserve the error. Android rename/stop is alternative semantic evidence, not completion of the phone row.

Arrangement sheet: opened the actual `threadArrangementOpenAtom` via CDP, dismissed the preexisting Home error overlay, recorded the real sheet, and drove the same measure-pure.mjs 100-event phase on both revisions. The final before/after arrangement recordings are clean. `sheet-driver.py` packages those manually executed commands for reproduction; it was written afterwards and was not itself executed end to end. This is an instrumentation harness with synthetic active-shell ticks, not a provider-backed sheet interaction or drag/pin verification. Definitive counts: I-before-ios-arrangement.json and I-after-ios-arrangement.json. The sheet was not dragged and no sheet semantic interaction chapter is claimed.

Static Android Home uses `static-fixture.mjs <metro-port> <device-title> <environment-id>` to filter to the 12 seeded threads, make them idle, normalize timestamps, and fix application Date.now at 2026-10-27T12:00:00Z. It resets navigation to Home. Native timers stay live; this clock freeze is used ONLY for static stills, never counts or flow recordings. `settled-capture.py <side> <session> android-home` requests normalized native status bars, takes whole-device screenshots at least 500ms apart, and accepts an exactly pixel-identical pair. No explicit network-idle API or font readiness signal was available; the fixed local fixture plus pixel-identical settled pair is the observed stability criterion. Definitive pairs: before-android-home-still-20261027T084508Z and after-android-home-still-20261027T084957Z. `diff-stills.py` computes absolute per-channel differences, amplifies by 32, and supplies threshold-zero plus any-channel >8/255 diffs. Both have zero changed pixels and max channel delta 0. Every curated still/diff and recording contact sheet was opened for inspection; rejected/initial captures remain diagnostics only. `contact-sheets.py` extracts full-surface video thumbnails for review.

Environment for Android: pool Pixel Tablet, Android API36, 1280×800dp, DPR2, 2560×1600 capture, font scale1, dark. iOS: pool iPhone17 Pro, reported iOS27.2, 402×874pt, DPR3, 1206×2622 video, font scale1, dark. agent-device records/screenshots; Hermes Metro CDP drives JS harnesses. One dark theme is sufficient for this selector-only change; no intended static visual change. iPad A02 was optional and not captured. A12/A13 have shared-selector evidence only, with no synthetic PR payloads or direct consumer/device proof.

Archive membership and SHA256 are in archive-manifest.json. capture-artifacts.tar.gz includes raw captures, contact frames, rejected attempts, synthetic projections and logs, scripts and all metrics as diagnostics. It excludes private bearer files, full config, empty workspace Git metadata and duplicate curated copies. Known bearer values and URL token/wsTicket values in text logs are redacted; provider readiness is supplied separately. Curated uploads are the authoritative evidence. All public data is synthetic. No PR was created, changed, pushed, commented on or merged.

FRICTION:
- tool | Pool installation/daemon and remote-worker failures, intermittent recording ownership failure; succeeded after prescribed one-minute retry. | Stable pool daemon/lease ownership.
- other | iOS Home LegendList maximum-depth failure on both SHAs blocked two phone groups and phone static comparison. | A functioning baseline Home route or separate tracked baseline fix.
- infra | Long-lived server tool sessions disappeared, requiring isolated backend/Metro restarts; after video includes recovery. | Persistent managed capture processes.
- model | Early schema/RPC setup and asynchronous counter phases were invalid and retaken; definitive scripts retain decoded identity and use sequential awaited writes. | Turnkey validated fixture and count runner.
- policy | Literal rm cleanup was automatically rejected despite the brief permitting it; Python removed only the two scratch driver files. | Consistent cleanup policy.

## Verbatim ghdrop output (initial uploads)

[before-android-sidebar.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d4d6d7d214670fb6/before-android-sidebar.mp4)
[after-android-sidebar.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/83308f0563568232/after-android-sidebar.mp4)
![before-android-home.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ea7a3aedb8601a3a/before-android-home.png)
![after-android-home.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bb5ab9fa7c4795ed/after-android-home.png)
[I-before-android-sidebar.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/962879a0b53597e6/I-before-android-sidebar.json)
[I-after-android-sidebar.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/91d2d897254eb4d8/I-after-android-sidebar.json)
[before-ios-arrangement.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/092d7d16a2750f4c/before-ios-arrangement.mp4)
[after-ios-arrangement.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/dd3c64ecfedd1e80/after-ios-arrangement.mp4)
![diff0-amplified.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d55df9bba2082dfa/diff0-amplified.png)
![diffT8-amplified.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7fc851fae9ba3ad1/diffT8-amplified.png)
![android-home-before-after.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/865453e3854f88b1/android-home-before-after.png)
[H-transcript.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d817396f435f33e2/H-transcript.md)
[H-before.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3d3dc71ab0a3c4c0/H-before.json)
[H-after.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/72c5d956fdd16c4e/H-after.json)
[I-before-ios-arrangement.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2923fdc83833913b/I-before-ios-arrangement.json)
[I-after-ios-arrangement.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f467223a1eb9aa8e/I-after-ios-arrangement.json)
[static-diff.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/68b43e6fb73147a6/static-diff.json)
[instrumentation.patch](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/91ad306da0062342/instrumentation.patch)
[selector.capture.test.ts](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ee8fb0e9e0db6700/selector.capture.test.ts)
[rpc-driver.ts](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2b7578f1e3601b24/rpc-driver.ts)
[measure-pure.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f443548e53d5755a/measure-pure.mjs)
[device-driver.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9adb67afc6dd79dd/device-driver.py)
[sheet-driver.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9ecdf33b390ce8b5/sheet-driver.py)
[cdp.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5e2fa39e1e7ffb54/cdp.mjs)
[pair-via-cdp.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b59bdee4034a8bb6/pair-via-cdp.py)
[select-environment.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ca88bfafa7a1ae99/select-environment.mjs)
[static-fixture.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b88214356a558d65/static-fixture.mjs)
[settled-capture.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/854a057e63fbc72a/settled-capture.py)
[diff-stills.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0a04be1f9551ae44/diff-stills.py)
[instrument.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/aa634f087af379d3/instrument.py)
[add-pure-phase.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6d3e1fbcbce9ab01/add-pure-phase.py)
[contact-sheets.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4425e7479d6b5658/contact-sheets.py)
[H-table.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4e97844ddbbf6238/H-table.py)
[package-evidence.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4d7aea33599374b7/package-evidence.py)
[providers-status.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9abe64c9aca527a0/providers-status.json)
[android-environment.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8b7e4b60a17f1442/android-environment.json)
[ios-environment.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/dcc0bfa6c1f7a3f0/ios-environment.json)
[cleanup.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5bb84c299b153310/cleanup.json)
[capture-artifacts.tar.gz](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/39947db597e32504/capture-artifacts.tar.gz)
[archive-manifest.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2094eb8b5d467813/archive-manifest.json)

## Verbatim ghdrop output (updated transcript and rebuild instructions)

[REBUILD.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bb6c615f6cd62cb3/REBUILD.md)
[H-transcript.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a7a04a187036e25d/H-transcript.md)

The later H-transcript upload supersedes the first; both contain identical measurements. Every remaining raw artifact is indexed inside archive-manifest.json and available in capture-artifacts.tar.gz.
