# Executed seed provenance and rebuild recipe

Only synthetic inputs were used. Both revisions ran their own checkout and fresh migration-level `.t3` state with `T3CODE_DEV_SEED=0`; no live database was read or copied. No tracked source was edited. The base worktree was created at `843f4e35292391897089535e8f1af59b322e70f8`; head stayed at `43cb23920cf601caaf146c75477abc5dfee95cb2`.

## Web: actual UI actions executed

1. Start `T3CODE_DEV_SEED=0 vp run dev --host 0.0.0.0` in each checkout. Pair a browser using that isolated server's startup credential. Credentials are omitted from public artifacts.
2. In Settings → Providers add the custom Codex model `evidence-title-unavailable`. In General choose it for **Text generation model**. Enable legacy Plan mode. Use the available composer model GPT-6.1-Sol, Low, Full access. This deliberately fails title generation and preserves the actual client seed; it does not prove successful automatic title generation.
3. Send `"Text " + "\u200b".repeat(44) + "😀 tail"`, `"Keep " + "\u200b".repeat(43) + "😀 tail"`, and `"  short 😀  "` through the real composer, with no attachments/context. Create a new thread for each after the first empty thread. Base's first send used the app's empty startup thread; its first-user-message titleSeed path persisted the title. Head's first send used New thread. `provenance.json` records both actual user messages and title values, rather than inferring creationSource from the thread alone.
4. Create another thread, enter Plan mode, and send the exact `PLAN` prompt in `seed-web.py`. The real provider returned a native proposed_plan whose Markdown is `"# Plan " + "\u200b".repeat(34) + "😀 tail\n\nReply OK."`. Use **Implementation actions → Implement in a new thread**. Wait for its actual `OK` response, then for titleRegeneration to clear. The persisted implementation user message carries sourcePlanRef, recorded in provenance.
5. Archive the plan-source thread and any unused empty startup thread through the real thread menu. Keep the four target threads unarchived, with P50 selected. No title was renamed, precomputed, inserted or substituted.
6. Stop both owned servers. Run `python3 normalize.py <checkout>`. It uses the documented SQLite helper to equalize only timestamps, settled/visited flags and checkout-specific branch metadata in isolated projections. Titles, prompts, plans and responses stay intact. The final SQL files are included. Source event history is unchanged; no history-transition claim is made.
7. Restart both servers. Use fresh browser caches, pair them, and execute `capture-real.py head --pair` / `capture-real.py base --pair`. On this run pairing had already completed for base, so its successful final call omitted `--pair`. The real drawer is open at 390 CSS px; the optional thread-details panel is closed on both sides. The driver freezes Date at `2026-10-27T15:00:00.000Z`, selects reduced motion and theme, waits for network idle/fonts and visible target strings, moves the mouse clear of controls, blurs focus, and requires two pixel-identical screenshots at least 500 ms apart.
8. Final executed directories: `web-head-20261027T151812Z` and `web-base-20261027T151859Z`. All four original pairs and all eight diff images were visually inspected, as were the four full-resolution sheets. Earlier splash/side-panel captures were rejected and are not presented as evidence. `seed-web.py` is an equivalent reproduction recipe adapted after the UI run; it was syntax-checked, not executed end to end. `capture-real.py`, `normalize.py`, `diff.py`, `sheets.py` and `export-provenance.py` were executed.

## Renderer and comparison

Linux fs-38; Chromium headless-shell 156.0.8078.70 via agent-browser, no device emulation, DPR 1, font scale 1, 1440×1000 and 390×844 CSS px and PNG pixels, light/dark, reduced motion. DM Sans and app-loaded fonts were settled. Browser Date is frozen; fixture metadata is equalized. Full surfaces are unmasked. Diff0 is absolute RGB channel difference amplified ×8; DiffT maps a channel to white when its absolute difference is >16/255. The only changed pixels are T50/P50 replacement-glyph removal and neighboring ellipsis placement (plus P50 breadcrumb at 1440). E50/SHORT and all other visible content are identical at threshold zero. Base payload JSON retains U+D83D before dots; its SQLite title TEXT column contains U+FFFD, and Chrome displays the replacement glyph. Head removes the split pair before appending dots.

## Native attempt: unverified

Neither M-Android-L nor M-Android-D was captured. No device was leased, native T50 send occurred, or synthetic activity seed executed. The native title, M-C, M-X, M-S and E200 rows are unverified. The root `mobile:install` task does not exist in these revisions; the official current installer was copied to scratch with only its repository root targeted at the head checkout. Its normal cache lookup missed for Android development x86_64 fingerprint `42ada2804edbaed8c7689ba5521e5dd9083397ce`. An initial Maven resolution failure was retried. Unbounded compilation caused resource contention; it was stopped and retried with 2 workers and a 2 GiB Gradle heap. During C++ compilation `df -BG --output=avail /` fell to 4G, triggering the brief's mandatory stop below 5G. All owned build/server/Metro processes were stopped. No alternate native renderer is claimed. Base/head mobile sources and lockfile are identical, but no base native build was run. `seed-native.py` is an unexecuted, labelled synthetic projection-harness recipe for the next attempt.

F/L and other shared variants use the matrix's existing actual-caller probe/source provenance only; this run did not observe file-only or context-only sends. LIVE transitions, iOS, Electron shell and separate truncators are excluded as the matrix specifies. No recording is claimed: all evidence is static prepared rendering.
