# Supplemental pass-1 fixture audit

Target [#22585](https://git.cafe/pingdotgg/t3code/pulls/22585), [GitHub mirror #22585](https://github.com/pingdotgg/t3code/pull/22585), inspected [7d1650ea51](https://git.cafe/pingdotgg/t3code/commit/7d1650ea51f81a4000937f5c76d31221f1c89ac2). Read-only source work in `/home/ubuntu/wt/pr-22585`; clean before/after. No device interaction, native captures, source edits, forge comments, pushes, merges or rebases. Ops evidence standard read only. This supplements `/tmp/22585-evidence-matrix-v2.md`; it neither replaces its rows nor accepts any delivered evidence. No pass-2 verdict is issued.

## Findings first: capture now versus true fixture gaps

1. **T3 placeholder is not proved by G2.** G2's `file:///fixture/project-favicon-missing` IS a recognized placeholder (the shared helper compares the final pathname segment). But G2 mounts `ProjectFavicon`, while thread chips use `resolveProjectChipIcon` → `projectGlyphImageAtom` → native enriched inline image. Those are different rendering paths. T3-normal/punctuation/digit supply absent URLs only. G2 proves the shared recognizer/component fallback, not the required thread placeholder branch or its inline raster. Keep T3 placeholder outstanding until a labelled supplemental fixture seeds that URL into the linked project's favicon atom and renders the three thread paths. No production contrast source change is needed; fixture data/seed change is needed. Do not claim the entire T3 row from G2.
2. **X2 navigation cannot succeed in this build.** The sole mounted stack screen is `ChipEvidence`. Production taps request `Thread`, `ThreadFile`, `ThreadAttachment`; none is registered. File/mention/thread destination claims therefore need an additional seeded real navigator/destination fixture or a later paired build. Logging the requested route, showing an unhandled-navigation warning, or mounting an arbitrary stub proves dispatch only, not successful destination behavior. In contrast, user context-sheet presentation, native menus/copy, selection, and collapsed composer focus can be exercised now; exact instructions below.
3. **K2 excerpt is impossible from current seeds.** `useThreadSearch` searches connected workspace environments. Fixture registry projects/thread shells do not seed connected environments or search matches. `PaletteRow` renders excerpt only from `searchMatch`; local title filtering cannot produce one. Seed a deterministic user/assistant content match via the actual search state in a supplemental paired fixture. Long titles/details, action no-detail, thread/action symbols, indices 8/9 and empty results ARE available through existing palette interactions. Missing excerpt must remain visible as a gap.
4. **G3 is a partial equivalence proof.** G3-sizes has 15/18/20/24/48, loaded favicon, emoji, one/two-glyph monograms, normal/0.4 opacity, all on grouped-card. It does not reproduce the different screen/sidebar/selected backgrounds. G3-home has no pending tasks and only ordinary palette-color projects; Settings is unmounted. Do not waive these: add only missing size × compositing classes, using faithful labelled production wrappers, rather than rebuilding every route or crossing every palette color. G3-home/archive/new-task and K1 can share captures when actual props/background/size/opacity match. 48pt grouped-card is not automatically Settings' screen surface; 15pt grouped-card is not automatically a sidebar row.
5. **E2 mostly exists, with precise limits.** E2 = screen width; E2-note's marginLeft=40 matches guide note marker 28 + gap 12; E2-timeline uses actual production timeline and can expand. E2-description is locked expanded=false with inert callbacks: only clipped state. E2-grouped is p-3 without guide attention's border/p-4, so it is not exact attention width. Repository context is `fixture/repo`, not a valid absolute repository URL, and current PREVIEW has no repository shorthand. `githubMarkdownLinks` consequently cannot demonstrate repository rewriting. Add valid `https://github.com/fixture/repo` plus shorthand if claiming repository-aware equivalence. Existing file/context color classes remain capturable; do not discard those builds. A description-expanded representative can reuse full-width E2 only with documented equal effective width/style/surface; it cannot prove the description expand interaction.
6. **W2 native scale still requires actual OS setting/evidence.** fontSize=22 only sets app base size. Use W1-chat and W1-composer under changed OS accessibility size, record actual font scale, then separately fontSize=22 if desired. No source change is intrinsically required for OS scaling. A claim that native text ignores system scaling must be observed at that setting.
7. **X1 delayed assets are not deterministic.** Existing scenes and Light / dark button can establish theme invalidation without changing the draft. They cannot force initial no-assets → settled assets. T4-pending/failed are pinned, never released. Need supplementary controlled asset completion state for the delayed-document-assets subcase. Cold launch timing alone is not deterministic proof.

These are fixture/evidence gaps, not newly alleged production contrast defects. Preserve the stable submitted builds and current head. The lead can use them for every reachable subcase, then decide how to supply the missing paired cases. No required row is waived.

## Capturer instructions

Use `t3code-preview://chip-fixture?scene=<scene>&theme=<id>&appearance=<light|dark>`. P/B/T/W retain v2 definitions; all screenshots must show the full native fixture surface, exact visible subcase and scroll/keyboard state. Scroll long feeds/grids to capture every requested chip; initial viewport alone is not coverage. Same interactions, offsets, environment and overlay for before and after.

- **G2:** Open G2 fresh; capture absent; press `Next favicon stage` once per stage: placeholder → invalid-data → loaded → new-revision → blank-title. The stage label is the setup provenance. `Inspect native favicon cache` adds stage/cache state to the page and console; use it after settled load and error, with identical inspection sequence on both builds. Cache=false alone cannot distinguish pending/error/never-requested, and invalid data starts optimistically loaded because data: status initializes loaded. Thus a static invalid-data screenshot is not pending evidence. Record cold loaded→new-revision transition with first fallback/new image frames and native load/error milestones; if fallback is too brief to observe, keep pending/revision intermediate outstanding and supply a deterministic supplemental load gate. The revision switches distinct bundled assets, so final images must differ. This fixture does not seed a remote pending URL.
- **X2 now:** U1-1 terminal; U1-2 element/preview/review/skill context; T1 thread context/raw link; C1-1/C1-2/C1-3 composer. Tap terminal or other ordinary context to open the real in-component `ComposerContextSheet`; capture its content/close. Long-press user context for `Open context`/`Copy context` menu; copy known record and verify clipboard through an allowed visible paste/readback. Long-press assistant raw thread for Copy link and file for path actions. Select native text/chip and capture selection/menu. In C2-thread-composer capture initial unfocused single line, tap inert chip once to focus/expand, then dismiss keyboard to recollapse; long enough draft yields card through actual overflow measurement. Do not count an unsupported file/thread/mention navigation as a successful open.
- **K1/K2 now:** K1/K2 auto-open same real palette (scene name itself changes no data). Blank query intentionally hides project items. Type `Loaded favicon`, `Emoji project`, `One glyph`, `Two glyphs`, `Lucide project`, or `Mobile application` to reveal the corresponding project plus matching thread. First result is selected; use native palette-next/previous hardware command to move selection WITHOUT activating a row, retaining both selected/unselected project views. Tapping a row closes and attempts unsupported navigation. Query `>` gives action symbols/no detail. Blank query lists eight actions, then shells: scroll to indices 8 (⌘9) and 9 (no digit), preserving original result indices. Query `zzzz-no-fixture-match` gives No results. Query `Mobile application` gives long title and thread detail with the long project title. No query can synthesize content excerpts. If keyboard command injection is unavailable, selected/unselected rows need another supported selection mechanism; pressing Return is activation, not selection movement.
- **E2:** capture E2, E2-grouped, E2-note, E2-description and E2-timeline separately in B. Timeline long-body condition is >450 chars OR >8 lines; current repeated PREVIEW satisfies it. Capture clipped fade, press Show more, capture expanded, Show less, capture restored. Description Show more is inert; do not waste attempts. Underlying guide excerpt diff/loading is irrelevant to the caption's own PullRequestMarkdown and does not multiply this color matrix. Map equivalent captions/outline/summary/questions to E2 only after documenting equal width/background/native style; current guide attention differs as described above.
- **T1–T5:** every T scene now includes user context + user raw link + assistant raw link; capture all three visibly after rasterization. T2 uses actual rasterizer; T4 pending/failed pin its atoms. T4-scratch cwd matches configured scratch root; T4-blank supplies whitespace; T4-missing has no shell. T5-before → T5-renamed updates remote shell and local alias-title index with distinct satellite project icon. Capture both states in same session; raw title should refresh, while explicit context label `Remote context` stays intentional. T5 remote project need not be in project-list atom because actual icon lookup uses individual project atom. This resolves the old role/scratch/lookup objections, subject to native rendering.
- **X1 now:** C1-1 or C1-2, capture unchanged text/context LIGHT → DARK → LIGHT via top button, verifying resolved header theme before each. Repeat URLs already occur in P3, but external URL duplication does not prove delayed chip-asset completion.

## Row-by-row coverage status (source feasibility only)

READY = scenes permit capture, not captured/passed. PARTIAL = exact missing subcase named. UNVERIFIED = expected platform limit. No row is dropped.

| Row | Existing scene / capture action | Status or remaining exact gap |
|---|---|---|
| U1 | U1-1 / U1-2, P × T; scroll every kind | READY |
| A1 | A1-1 / A1-2, P × T; assistant has no records plus skill/file refs | READY |
| C1 | C1-1 / C1-2 / C1-3, P × T; focus/scroll editor | READY; plain empty draft also can be obtained by editing, record exact text |
| P1 | P1-user / P1-composer, P × T | READY; same review-context state data as P2, map visible status symbols |
| P2 | P2-user / P2-composer, P × B | READY |
| P3 | P3-user / P3-assistant / P3-streaming | READY for role states; streaming now explicitly assistant, capture streaming then settled with same text |
| F1 | F1-user/assistant/composer-1/-2 | READY; all seven MIME/extension distinctions |
| F2 | F2-user / F2-composer | PARTIAL: sizes are files only, absent is missing record; no known image absent/zero/normal/large variants or long variants per size. Keep v2's requested image/file subcases unless valid branch equivalence is documented |
| N1 | N1-user / N1-assistant / N1-composer | PARTIAL: UNKNOWN + missing records exist; no explicit supplied-empty-list user state or custom high/low/unparseable accent supplement |
| M1 | No actual Android palette on iOS | UNVERIFIED as explicitly permitted; frozen supplement is not native Android |
| E1 | E1 actual FileMarkdownPreview, no invented skills | READY |
| E2 | E2 / grouped / note / description / timeline | PARTIAL: repository-aware seed invalid; exact attention wrapper differs; description expand inert, conditional expanded equivalence needs mapping |
| E3 | E3-expanded / E3-collapsed; actual toggle callback | READY |
| E4 | E4 / E4-empty; real user review segment plus prose | READY subject to actual rendered review card/empty state visibility |
| C2 | C2-1 / C2-2 / C2-pr; C2-thread-composer focus/blur | READY for requested entry/layout pair |
| W1 | W1-chat / W1-composer / W1-plain in portrait/landscape | READY; scroll long draft and capture suffixes; expanded composer requires focus |
| W2 | W1 scenes with actual changed native accessibility setting | CAPTURE ACTION required; fontSize=22 is separately labelled supplement |
| T1 | T1 all three link paths | READY |
| T2 | T2-emoji / mono1 / mono2 / lucide all three paths | READY |
| T3 | T3-normal / punctuation / digit | PARTIAL: thread placeholder URL not seeded; G2 not render-equivalent |
| T4 | T4-missing / blank / scratch / pending / failed | READY for named visible fallback states; shell-found/project-missing separately not seeded, can share identical no-icon output only with branch setup evidence |
| T5 | T5-before → T5-renamed, user context/raw + assistant raw | READY; verify exact live label/icon outcomes |
| G1 | G1 scroll all 18 colors; T2 gives overrides | READY; intrinsic grid supplement, preserve lower-layer control attribution |
| G2 | Stage sequence and cache inspection above | PARTIAL: no deterministic pending remote URL/native load gate; stage/cache labels insufficient alone for transition claim |
| G3 | G3-sizes / home / archive / new-task + K1 | PARTIAL: missing distinct screen/sidebar/selected compositing classes and grouped new-task selection seed; no pending task. Component-equivalent wrappers allowed per v2, screen names alone not mandatory |
| K1 | Query per project, hardware select next/previous | READY with usable native selection commands; blank query hides projects |
| K2 | Queries/scroll indices above | PARTIAL: content search excerpt lacks connected/search-match seed; other variants reachable |
| X1 | C1 Light/dark/light unchanged draft | PARTIAL: deterministic no-assets→settled missing; static pinned T4 is not completion |
| X2 | Context sheet/menu/copy/selection; composer focus | PARTIAL: Thread/ThreadFile/ThreadAttachment destination navigator missing |
| Z1 | Android native | UNVERIFIED; outside iOS authorization |

## Harness scope and artifact provenance

Read the ops standard's exact rule: “The seeding script and fixture data must be in the repo (or linked from the PR body) so an auditor can rebuild any captured state from the SHA.” Its interim mobile rule explicitly permits embedded simulator builds fed static mock data. Therefore **neither a mandatory in-repo harness nor mandatory deletion follows from EVIDENCE**. The substantive question is whether this PR's test tooling earns its maintenance cost. This is substantial PR-specific tooling (alternate entry, registry pinning, build profile, package hook, arch patch, snapshot adapter), so a linked-only artifact is a reasonable smaller landing scope; it is not a reason to waive captures or destroy provenance.

Minimum linked-only alternative for the lead to prepare, without this auditor changing head:

1. Preserve immutable archive/patch of the exact fixture source at the inspected fixture SHA: all `src/features/chip-evidence` files; exact index entry switch; exact EAS profile; native build hook and package-script change; snapshot extraction/rebuild tool. Include SHA-256 manifest of every overlaid file, source and fixture commit IDs, dependency/lockfile/build environment and native font/scale/device settings. Include baseline rasterizer no-op exception explicitly.
2. Link archive, seed/rebuild commands and file hash manifest from the PR evidence section with immutable ghdrop URLs. Preserve original committed fixture revision independently of a force-push/rewrite (downloadable archive or reachable archival ref); a soon-unreachable commit link alone is inadequate.
3. Keep contrast production files and lower layers byte-identical when extracting/removing harness. Current snapshot overlays committed `git archive <fixtureSha>` files and records sourceSha/fixtureSha, which fixes prior dirty-working-overlay provenance. Record full-file package.json overlay rather than claiming this is merely a script hunk.
4. **Head movement still requires recapture.** EVIDENCE says current-head captures and recapture whenever head moves. Existing submitted builds retain valid provenance for their original source+fixture IDs, but cannot be relabelled as a later landing head. For a harness-removed head, rebuild from that exact source with linked identical overlay, record sourceSha=new head and fixtureSha=archived fixture, then recapture required pairs. Do not silently treat production-byte equivalence as exemption from the explicit head rule. Supplemental new scenes need separate fixture SHA/hashes and identical before/after overlay, not false attribution to the original build.

No change to current builds/head is requested by this report. Lead chooses retention versus linked-only; either must preserve reproducibility and pass the complete capture matrix.

## Checks performed and limits

- Focused command: `./node_modules/.bin/vp test run apps/mobile/src/lib/composerChipPresentation.test.ts apps/mobile/src/lib/enrichedLinkPresentation.test.ts apps/mobile/src/lib/projectIcon.test.ts apps/mobile/src/lib/mobileTheme.test.ts apps/mobile/src/lib/nativeComposerTheme.test.ts apps/mobile/src/features/chip-evidence/fixtures.test.ts` — **6 files passed; 38 tests passed; 0 failed**, 2.88s. The fixture contract test is one test; it does not assert the matrix is complete or native screens mount.
- `git diff --check` passed, exit 0. Worktree status empty before/after. HEAD matches requested revision.
- Compared inherited ProjectFavicon, projectIcon, ProjectChipIconImages, CommandPalette and commandPaletteItems against lower-layer tip: no diff. This is source preservation, not screenshot equality. Main merge changes were not counted as takeover scope.
- No lint, typecheck, builds, browser, simulator or screenshots run. No delivered capture or pixel comparison assessed. PR registered with this thread; no monitoring started.

Pass-1 supplemental audit complete. All v2 rows remain required with the feasible selections and precise gaps above. This document intentionally has no pass-2 sufficiency verdict.
