# Proof audit pass 2, re-review of the corrected narration

Scope: [#22831](https://github.com/pingdotgg/t3code/pull/22831), mirror [#22830](https://git.cafe/pingdotgg/t3code/pulls/22830). Before [1688f965](https://git.cafe/pingdotgg/t3code/commit/1688f965682d331da16a8c39f049592361f69c8d), after [7aa1e55f7b](https://git.cafe/pingdotgg/t3code/commit/7aa1e55f7b669bbf0bd1587485b531f1a215efbe). Inputs: `/tmp/pr22831-matrix.md` (13 rows, 52 C4 pairs, 96 recordings) and `/tmp/pr-22831-round3` only. The partial `/tmp/pr-22831-round3-final` probes were ignored. The first audit is kept unchanged as `proof-audit-pass2-initial.md`.

This review was read-only: no PR or forge writes, no browser or server launch, no process signals, no delegation, and no edits other than this report. The only network access was read-only GETs of the existing ghdrop uploads, to compare them with the local files.

`briefs/proof-audit.md`, `briefs/evidence-capture.md` and `docs/EVIDENCE.md` are absent from the checkouts, so this review applies the explicit brief and the matrix. The round-2 attachments objection stays superseded by dispatcher decision `vm-userdata-recordings`.

**Audited snapshot.** `captures-index.md` was regenerated twice while I was auditing (mtimes 19:25:50, then 19:27:21; `build_index.py` changed alongside it). This verdict applies to the snapshot with sha256 `d5907f06b542e926e8c03593015710d57ceef3d737af23dd2a13addf3623ad52`, which I re-hashed as unchanged at the end of the review. Any later edit needs another look.

## Inherited vs newly checked

- **Inherited from the initial audit, not repeated:**
  - full cv2 decode of all 96 recordings
  - dimensions and frame counts
  - checks of the SHA, environment and port owner
  - the S0 pixel-exact source-still match
  - the 48 pair traces compared step by step against the code diff
  - the first-frame anomaly scan over all 96 recordings
  - the visual samples listed in the initial report
- **Newly checked in this pass:**
  - sha256 of all 96 MP4s against `media-metadata.json`: 96 of 96 match, 0 missing. The originals are unchanged; MP4 mtimes run 18:33–19:04.
  - All 228 index links: the label matches the URL filename, and every link matches `uploads.md` (224 media and trace files, 3 scripts, the matrix).
  - Remote ghdrop content matches the local sha256 for six spot-checked uploads:
    - after-1440-light-I2.json
    - before-390-light-M6.json
    - after-1440-dark-M2.mp4
    - before-1440-light-M6.mp4
    - after-390-dark-S0.png
    - capture-runner.js
  - I2 traces in all 8 recordings: request modes, response tags, and whether the dialog is mounted after the first rejection.
  - The runner's step-clock semantics in `capture-runner.js`: `start = Date.now()` is set after `preview_recording_start`, and a step's `seconds` is recorded at step start.
  - New timing measurements using sequential decode PTS, not seeks:
    - after-1440-dark-M2 (viewed as frames)
    - after-390-light-M2, before-390-dark-M2, before-1440-dark-R1 (motion onsets)
  - The uploaded copy of `captures-index.md`.

## Initial objections vs the corrected index

1. **Timecodes: resolved, by the allowed alternative.**
   - **What changed.** The global preamble and every one of the 96 narrations now say "runner clock" and say these are not exact seek times. Each recording has a timing disclosure for its class: desktop opening at 1.45–2.17s and later actions roughly +1.5–2s; narrow opening at 0.30–0.92s and later lag generally under 0.9s.
   - **after-1440-dark-M2, desktop, newly measured** with sequential decode:

     | Event | Runner clock | Media | Lag |
     |---|---|---|---|
     | Opening onset | 0 | 1.64s | — |
     | Key a → `A` shown | 2.55s | ≤3.88s | ≤+1.3s |
     | Key b → `AB` shown | 3.50s | 4.35–5.26s | — |
     | Save (5.34s) → dialog closed | 5.34s | 5.70–6.69s | — |
     | Reopen → visible | 6.05s | ~7.8s | ~+1.75s |

     This is consistent with the disclosure. The video is variable frame rate, with frame gaps up to 0.49s.
   - **after-390-light-M2 and before-390-dark-M2, narrow:** motion onsets fall within about 0–0.5s of the runner offsets. Consistent with the disclosure.
   - **Cosmetic nit.** The preamble says "Each recording discloses the measured lead". What each recording actually repeats is the class-wide measured range, not a lead measured for that recording. Not blocking: the text is clear that values are approximate and from samples.
2. **Baseline stale toasts: resolved.**
   - A "Baseline reset disclosure" now appears on exactly:
     - before-390-light M3, M4, M6
     - before-390-dark M3, M4, M6
     - before-1440-light M6, E1
   - M4 is worded as an automated flag that was not visually confirmed. before-1440-light-M6 gives the 1.18s and 5.35s media times. The environment section also says the independent-reset boundary was imperfect.
   - This matches the initial findings. No disclosure appears on head recordings or on 1440-dark baselines, consistent with the inherited scan.
3. **I2 "duplicate Save": resolved, and verified against all 8 traces.**
   - **Head, all 4 conditions:** requests are reject, reject, pass, with responses Failure, Failure, Success. Examples are requestId 81/82/83 in 1440-light and 183/184/185 in 390-dark. The dialog stays mounted with "Connection closed." The head narration ("sequential Save retry … (second rejected request)") and the "I2 scope" block match.
   - **Baseline, all 4 conditions:** requests are reject, pass; the dialog is unmounted after step 0. The baseline narration now reads "attempt second Save only if still mounted; baseline closes after the first rejection", which matches.
   - The index no longer claims I2 deduplication. The "Unverified boundaries" section says so, and points to I1, M1 and E1 for the pending guard.
4. **I1/I2 reopen restoration: resolved.**
   - Every I1/I2 narration of both revisions carries a "Persistence scope" block and a `[reopen recorded; picker selection restoration is unverified; helper clicks Blue]` tag.
   - The environment section and the boundaries section both limit the claim to Settings `Layers 2 · blue` plus the real OK response.
   - Elsewhere, reopen and colour claims are scoped to "unless a pre-click selection was directly inspected". This is consistent with the initial visual check of after-1440-light-M1.
5. **Smaller items: resolved.**
   - T3CODE_HOME wording is fixed: the dev runner sets it internally to the worktree `.t3`, and the agent did not set it.
   - M4 spaces normalising to empty on head is disclosed.
   - M4 `aria-invalid` is now explicitly unverified.
   - The audit inspection scope is described accurately and with bounds.

## Remaining issues

- **A. The published index is stale. This blocks publication, not the local evidence.**
  - `index-upload.md` points to [captures-index.md (b02afd71)](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b02afd7177cfff1c/captures-index.md), uploaded at 19:09, before the corrections.
  - I fetched it: sha256 `c0f3d1df…`, 74,716 bytes, against 116,969 bytes locally.
  - It contains zero "runner clock" labels and zero "Baseline reset disclosure" blocks. It still claims "action-start offsets from each recording's start".
  - So anyone following the public link still sees all four original objections.
  - **Fix:** upload exactly the audited snapshot `d5907f06…` (or a re-audited successor), cite that new URL, and stop citing b02afd71. No recapture is needed. All media, trace and script uploads I sampled match the local files.
- **B. Trace labels differ from the index. Non-blocking nit.** The raw I2 JSON step labels, in both revisions and all conditions, still say "Synthetic generic rejection; duplicate Save attempt". The index rewrites that label in `build_index.py`. Add one sentence saying the trace step labels keep the runner's original wording, and that request modes and counts are authoritative.

## Coverage: rows captured vs checkpoints left unverified

- **All 13 rows are captured at C4 on both revisions:**
  - S0: 8 contact sheets and 24 source stills
  - M1–M7, I1, I2, E1, E2, R1: 96 recordings, each with a JSON trace
- **Behaviour the evidence supports on every row** (inherited trace and code review, plus the samples):
  - M1: head's retained pending state and single update
  - M2: two-grapheme limit while typing
  - M3: normalisation
  - M4: zero requests for invalid input
  - M5: composition guard, synthetic
  - M6: real server invariant shown inline, then retry
  - M7, E2, R1: recovery after synthetic failures
  - I1 and E1: pending dismissal guards
  - R1: save lock and reset
- **Checkpoints explicitly left unverified, all disclosed:**
  - I1/I2 picker icon and colour restoration on reopen
  - I2 in-flight deduplication
  - M4 `aria-invalid`
  - E1/E2 custom field refill: it reopens blank; persistence is proven by an unchanged re-save
  - a clean independent reset at the start of the 8 baseline recordings listed in item 2 above
  - native IME, native mobile, Electron file selection, remote/relay/tunnel, multi-environment and multi-member behaviour
  - frame-accurate timecodes: runner clock only

## Limits of this pass

- I did not decode all 96 recordings again; nothing inconsistent showed up to call for it. The full decode is inherited from the initial audit.
- I viewed after-1440-dark-M2 as frames.
- I measured motion onsets for three more recordings: after-390-light-M2, before-390-dark-M2 and before-1440-dark-R1.
- I did not watch any recording continuously end to end.
- Frames taken with cv2 seeks on this variable-frame-rate media are unreliable. All timings above come from sequential decode.

VERDICT: SUFFICIENT, for the local `captures-index.md` snapshot sha256 `d5907f06b542e926e8c03593015710d57ceef3d737af23dd2a13addf3623ad52` together with the unchanged original 96 recordings, traces and S0 artifacts. All four initial objections and the smaller items are resolved, and no narration contradiction against the media or traces remains. The one unresolved objection is about publication: the uploaded index b02afd71 is the pre-correction version (issue A). It must be replaced with this exact snapshot before the evidence is cited publicly. Issue B (I2 trace label wording) is a non-blocking nit.
