# Issue 16534 — final pass-1 proof matrix reconciliation

This is the read-only reconciliation of the prospective pass-1 matrix, not review round 4, proof pass 2, a code verdict, or acceptance of captures. Missing evidence is evidence still owed, not a product bug. No browser, server, checkout, fixture application, test runner, forge operation, or worktree edit was performed. The capture owner's checkout was not used as product truth.

## Fixed inputs and authority

Product comparison: [a12d6ed942](https://git.cafe/pingdotgg/t3code/commit/a12d6ed9428d8e64d76ca86d178abbf564b57cee) → [2c84c27829](https://git.cafe/pingdotgg/t3code/commit/2c84c2782957dfb058e64cfd7b7a7381cd7ef604). Product paths are AppSidebarLayout.tsx, Sidebar.tsx, LegacySidebar.tsx and sidebar/routeReveal.ts. The product commit also contains earlier fixture files; distinguish their version from the product version in the evidence manifest.

Supplied fixture tip [a0462dfc86](https://git.cafe/pingdotgg/t3code/commit/a0462dfc86603e0e24958e8c1ce2e999d9d0339c) is superseded, at inspection, by [8bc79af8d5](https://git.cafe/pingdotgg/t3code/commit/8bc79af8d5a027940dc140a46e4580ed98ff2598). The difference from PRODUCT to this fixture tip touches only scripts/fixtures/issue-16534/{README.md,bootstrap.js,replay.js,seed.py,transcript.py}. Later additions must be identified by exact commit and file hashes, with product-path equality established before accepting their captures. Do not infer the running build from the currently checked-out branch or HEAD.

Read: both checkouts' AGENTS.md, /tmp/issue-16534-proof-pass1.md, both /tmp/issue-16534-review-round3-* reports, /tmp/issue-16534-remount-scroll-correction.md and /tmp/issue-16534-capture-progress.md. Also consulted capture handoff/ready, older capture report/index and resume notes to distinguish superseded operational constraints. Committed synthetic fixtures are explicitly required by the user; round-3's objection to committing these fixtures is superseded. Do not move or remove them for that reason.

Final policy: only a changed observed route-row key can authorize automatic scope widening. Every sidebar mount independently owes one scroll of the active row if rendered, with delayed-shell/row retry as applicable. Same-route remount preserves manually selected scope. Completed reveal does not repeatedly snap manual scrolling. Initial direct load starts with no observed key and therefore can widen. A different final route while unmounted can widen on return. A → B → A while no sidebar observes B is still same observed key on return; do not falsely require widening for an unobserved intermediate route.

## Derivation from actual render paths and consumers

- [AppSidebarLayout.tsx:334](https://git.cafe/pingdotgg/t3code/blob/2c84c2782957dfb058e64cfd7b7a7381cd7ef604/apps/web/src/components/AppSidebarLayout.tsx#L334) owns observed/pending state above both sidebar implementations. Settings replaces children at line 424; responsive Sheet also unmounts children. These are real mount boundaries, unlike wide sidebar hiding that may only move/inert the existing tree. Both Settings and narrow drawer remounts need evidence.
- [Sidebar.tsx:1072](https://git.cafe/pingdotgg/t3code/blob/2c84c2782957dfb058e64cfd7b7a7381cd7ef604/apps/web/src/components/Sidebar.tsx#L1072) observes the resolved row key, waits for the shell, widens only a pending route whose shell is scope-excluded but globally eligible, then scrolls on the next render. Scope setter at line 910 also clears selection; record that consequence. Effect retries on row key, threads and scope. Its non-widen path completes even without an aria-current DOM row: search is not cleared, and clearing search does not itself rearm reveal. A same-mount search transition cannot be required to scroll again by this patch.
- New shelf partition/route retention at Sidebar.tsx:344–453 is unchanged. Working/snoozed collapsed shelves keep the route row; expanded settled tail unions an out-of-tail route row; collapsed settled keeps route-only; pinned has its own list. They still consume newly widened scope and supply the scroll target, so representative affected captures remain mandatory. Shelf toggling/settling/snooze expiry/reordering as independent features do not become new test suites.
- [LegacySidebar.tsx:1207](https://git.cafe/pingdotgg/t3code/blob/2c84c2782957dfb058e64cfd7b7a7381cd7ef604/apps/web/src/components/LegacySidebar.tsx#L1207) unions the eligible active thread with preview keys, then filters the original sorted project list. It does not append an arbitrary duplicate. hiddenThreads excludes that active thread, changing Show more status. Project-level status still aggregates all eligible project threads in unchanged useProjectThreads.
- [LegacySidebar.tsx:3185](https://git.cafe/pingdotgg/t3code/blob/2c84c2782957dfb058e64cfd7b7a7381cd7ef604/apps/web/src/components/LegacySidebar.tsx#L3185) computes matching global visible order. It feeds jump labels/targets, previous/next and prewarming. Collapsed-project single-active-row logic predates this patch. Range selection receives orderedProjectThreadKeys from all eligible sorted project threads (lines 1174, 1769), not the new preview union; a newly reachable retained row can still participate, but the range algorithm/order is unchanged.
- [LegacySidebar.tsx:3319](https://git.cafe/pingdotgg/t3code/blob/2c84c2782957dfb058e64cfd7b7a7381cd7ef604/apps/web/src/components/LegacySidebar.tsx#L3319) waits for actual active DOM row before completing; routeRowRendered changes retry after eligible shell arrival. Include delayed legacy arrival explicitly, absent as its own row in the old matrix.
- [Sidebar.logic.ts:522](https://git.cafe/pingdotgg/t3code/blob/2c84c2782957dfb058e64cfd7b7a7381cd7ef604/apps/web/src/components/Sidebar.logic.ts#L522) resolves new-sidebar subagent routes up to the parent row, environment-scoped; forks remain their own row. Eligibility at line 539 excludes archived/subagent rows, independent of scope. These helpers are unchanged, but their results now govern pending reveal and scope widening. Legacy uses the raw scoped route key, not the new-sidebar root alias. Never impose new root-alias behavior on legacy.

## Capture standard retained

Every final capture set below is a **RECORDING**, including interaction, time, delayed-data and no-resnap guards. Execute each at **1440×900 light, 1440×900 dark, 390×844 light, 390×844 dark**, CSS pixels. Narrow is responsive web, not native mobile. Show main content with drawer closed and the drawer open at relevant endpoints; reopen after actual auto-close. Narrate the actual steps; captions/explicit textual narration may index a recording, but isolated endpoint stills do not prove interaction order. Record hardware keyboard use at narrow width.

Use identical synthetic data, exact scoped routes, initial scope, sort, expansion, search, keybindings, browser/OS, DPR/zoom, fonts/readiness, locale/timezone, animation/reduced-motion settings, sidebar width, scroll offsets and network/replay settings at both revisions. Freeze Date before module evaluation at 2026-10-22T00:00:00.000Z; preserve native timers. Record actual values. Do not rely on bootstrap applied after dependencies evaluated. Do not resize height to manufacture scroll: add committed deterministic spacers, record order/count and target/container bounds with target wholly outside scroll viewport before reveal.

At every required endpoint checkpoint preserve a matched whole-surface before/after still pair; include menus, Settings, main routed title/content and drawer state as relevant. For each pair publish raw absolute RGB difference gain 1, **zero-threshold amplified difference gain 8** (later explicit steering, not a replacement for raw), and thresholded difference max-channel delta >8/255; state formulas, alpha background, pixel count/percentage and bounds. Explain every visible difference, including expected scope label, insertion/removal, badge, scroll, wrapping and main route changes. No masking, unexplained crops, upscaling or tolerance-based automatic acceptance.

Capture progress documents the preview bitmap cap at 1280px. At 1440 CSS/DPR2, full-resolution video is 2880×1800; extraction from the original recording with exact timestamp, original dimensions and compression disclosure is authorized. Resized preview snapshots alone are corroboration, not compliant wide stills. Verify actual dimensions independently. Narrow frames at DPR2 should be 780×1688. This audit did not inspect or accept the videos or frames.

## Minimum final capture sets

There are **12 sets × 4 configurations = 48 paired scenario runs**, each requiring before and after recording coverage (96 revision-specific scenario records). This replaces the prospective 64-pair denominator, not its evidence obligations. Several old rows are chapters of one set; listed subcases/checkpoints remain individually mandatory. Eight continuous videos (two builds × four configs) can contain all sets if timestamps, resets and every checkpoint are indexed. Sets are not counts of individual files or fixture variants; F4, for example, includes both implementations and multiple resets. Do not report 48/48 by counting only a set's easiest chapter.

| Set | Required synthetic inputs and real-app seed | RECORDING sequence and required checkpoints / assessment |
|---|---|---|
| F1 New route/scope/scroll and entry callers | S+ plain eligible A/B plus spacers; new sidebar, preview-independent normal list, deterministic sort; exact A1/A8/B8 routes and real transcript links. Prepare history A target → B8, B scope, empty query. | Back to excluded A, Forward B, then manually select B without route change: route reveal widens to All only on changed key; manual scope persists. Reset with active target wholly offscreen in All; Back, manually scroll away, change unrelated menu/data without route change, Forward. Repeat matching A scope (no widen). With B scope reset separately for palette and real rendered link to A. Ordinary visible-row click is a short control chapter. Record target bounds, main route, All/B labels, no extra snap and main/page scroll. Include a pre-existing B selection before automatic widening and show clearing through existing scope setter. Do not require any provider start. |
| F2 New mount lifecycle | S+; same active A1, offscreen when list starts at top. Separate All/matching scope and manually chosen B hiding A1; persisted layout reveal already completed. Same seed can provide direct-load route. | Settings button → Back same A; Forward Settings → Back again. Visible case scrolls once each mount; hidden case preserves B and does not reveal another row. After mount manually scroll away and cause data/menu rerender: no snap. At 390 close/reopen drawer on same route in both visible and hidden cases. While Settings/drawer has sidebar unmounted, arrange a **different final route** then return/open: widening and scroll owed. Cold direct A URL with persisted B also widens because observed state is new. Record Settings and closed/open drawer endpoints, not only active row. Settings palette entry shares same destination/mount boundary and can be a short chapter here; no separate duplicate set. Include a same-route Settings toggle to legacy and back to new: the shared layout history remains completed, manual B persists on returning to new, and each newly mounted visible-active list scrolls once. |
| F3 New shelf reveal paths | S+ variants: pinned A1; working A1 with working shelf enabled; future-snoozed A1; settled A1 beyond initial tail with enough newer settled threads. Use valid transformed shells and exact expansion storage. | For each of four distinct list paths: B8/B scope → real route activation of A1, relevant shelf collapsed where supported. Record widened label, correct route-only/normal row, uniqueness and nearest scroll. For settled also record expanded shelf with active row beyond initial tail retained after scope reset, and hidden count/control. A brief expand/collapse checkpoint can locate the target, but no independent full shelf-management matrix. Working is synthetic running-looking shell, no actual process. Pinned has no invented collapse control. |
| F4 Delayed shell/row and eligibility, BOTH sidebars | S+, committed real HTTP/WS shell replay withholding A1 and explicit release, no stale cached A1. New B scope; legacy expanded A, preview6, target beyond cut. Separate archived A1, orphan subagent with absent ancestor, and wholly missing key. | In each sidebar navigate to A1 **before** shell arrives, record absent row/precondition, release through real decoder/reducer, record row arrival and scroll; new also widens on eligible arrival, legacy retains past-cut row. Repeat a mount-owned reveal with delayed shell (no pending route change): establish completed observed A, remount while A shell absent, release; active visible row scrolls once without new scope widening. For new also use B hiding A to show scope preserved. After success manually scroll away and deliver unrelated data: no repeat snap. Ineligible archived/orphan/missing route chapters must not inject arbitrary row or spuriously clear scope. Record actual route/ref and absence; missing cannot be marked passed by never attempting navigation. |
| F5 New lineage key transitions | Valid A1 root, child A9, grandchild A10, sibling A12, fork A11; all same explicit environment; source transcript links and B scope. | Route to child from different row: root A1 is revealed. Grandchild/sibling transitions sharing resolved root must not repeatedly widen; explicitly manually set B before a different child route under same root. Then fork route uses its own key/row and can widen. Record main routed target as well as root row. If real link redirects to an unintended route, this chapter remains unresolved; forcing a router/store key or photographing A1 is not proof of child semantics. |
| F6 New alternate search/null route | S+ normal A1/B8 with real search results; B scope and query matching B8 but not A1; real new-thread/draft route. | Navigate to A1 with query active; record query retained, actual result tree, scope and main content. Clear search and record restored normal row tree; **do not require a fresh scroll solely for clearing query**. Reset to null/new-thread route then return A1: no arbitrary active-row scroll on null, next valid changed key reveals. A draft carrying a valid scoped thread ref is not automatically a null case; log resolved route type. Direct-load requirement is F2, not a second run here. |
| F7 Legacy preview union, boundaries and route callers | Plain S with exactly 8 eligible threads in A, preview6, descending verified order A8…A1; expanded A with list collapsed. Avoid `all` lineage/fork extra eligible rows changing this order. S+ for offscreen caller chapter. | A1 → B8, Show less, Back A1, Forward B8, Back, Show more/less. After has A8…A3 plus A1 once, sorted, Show more retained; Forward removes extra A1. Boundary A3 (sixth) versus A2 (seventh) has no duplicate and correct extra row; preview8 has no overflow; fully expanded shows all. New-thread/null removes retained old active. Palette and real-link route to offscreen eligible legacy row exercise shared scroll observer; manually scroll away/menu rerender does not re-snap; visible click is a control. Record matching main route, list/control endpoints and bounds. |
| F8 Legacy collapsed project | S+; active A8 → B8, collapse A, header/active insertion position out of view with measured scroll. | Back A8, Forward B8, Back, expand A/collapse A. Both versions already support one active row beneath collapsed A; new scroll is affected. Record only active row under collapsed A, no preview spill, disappearance on leaving A, and nearest scroll on return. Inactive collapsed B is an unchanged guard checkpoint, no separate set. |
| F9 Legacy mount lifecycle | S+; A1 past preview, A expanded; layout survives Settings; preview6. | Settings button and palette entry → same-route Back (repeat): mounted active row exists and scrolls once, including active beyond preview. Narrow drawer close/reopen same route also scrolls. After manual scroll, unrelated data/menu does not snap. Different final route while sidebar unmounted is revealed on mount. Show Settings/closed drawer and returned main+list, not a claimed preserved old scroll offset. Delayed mount is covered in F4. |
| F10 Legacy visible order consumers | Plain S with A first, A1 retained seventh after six preview rows, B next; measured keybindings/hints, no terminal focus interception. | Hold configured hint modifiers, record labels, jump7; reset. Traverse previous/next at A3→A1→B boundary, record actual recalculated order when leaving retained A1 removes it. Reset; Shift-click A3→retained A1: a short guard for newly reachable row uses unchanged full eligible range (may include hidden A2); record selected IDs/count. Do not assume the range uses preview-only order. All interactions recorded; prewarm is source-only as below. |
| F11 Legacy hidden status summary | Plain S ordering, preview6; A1 hidden unique higher-priority status and A2 lower distinct status, preview rows neutral; deterministic visit state. Real shell replay uses status resolver inputs. | B8 active: record A Show more summary. Back A1: row status visible, A1 removed from hidden summary and A2 determines remaining summary. Show more/less then Forward B8: summary restored as appropriate. Record actual labels resolved by status/visit state, not presumed failed/completed strings. Project-header aggregate itself is unchanged; do not demand it drop A1 merely because Show more does. Include its stable value as a nearby checkpoint. |
| F12 Legacy logical grouped project | S+ with distinct physical A and B projects grouped under same synthetic git origin, Spacer explicitly separate; actual repository grouping settings and logical expansion keys; eligible target from member beyond preview. | Navigate via real route from another group to retained target in grouped A/B; record correct single group, one active row, sorted union, Show more, jump hint/order and scroll. Collapse/expand logical group; active-only collapsed row remains. Grouping algorithm is unchanged but union/global key consumers operate through physical→logical mapping; a separate-mode capture cannot prove this affected composition. Missing/archived controls are F4, not a reason to drop this chapter. |

## Old IDs: complete reconciliation

Disposition vocabulary: KEEP = affected capture retained; MERGE = mandatory chapters share final set; CORRECT = old expected outcome superseded; SOURCE = precisely identified unchanged/nonvisual part, no separate capture obligation. No entire old ID is silently removed.

| Old ID | Final disposition and exact retained / reduced checkpoints |
|---|---|
| N1 | KEEP/MERGE → F1. Back/Forward, excluded scope, manual unchanged-route filter all retained. Includes matching scope/no-widen via old N3. |
| N2 | CORRECT → F2. Old “Settings same-route return widens B” is wrong for final policy. Hidden manual B survives; visible active scrolls once on every remount. Repeated Settings returns retained; narrow drawer and different-final-route cases added. |
| N3 | MERGE → F1/F2. All/matching scope scroll, wholly offscreen precondition, manual no-resnap and menu guard retained. Drawer close/open is mount behavior in F2, not evidence of in-tree route change. |
| N4 | MERGE → F1. Palette and **real rendered internal link** mandatory; ordinary click short unchanged control. All callers converge on route-key effect; no separate full 4-config row per trigger is needed beyond chapters in each F1 config. Hard link capture does not excuse it. |
| N5 | KEEP → F3. Four render paths remain because the changed effect widens scope and queries their actual active DOM rows. SOURCE: routeThreadOnly, shelf toggling, settled active tail retention already exist at Sidebar.tsx:344–453 unchanged from base; independent collapse management, snooze expiry, settlement and drag behaviors removed from exhaustive scope. Expanded settled beyond-cut checkpoint remains. |
| N6 | KEEP/EXTEND → F4. New delayed, archived, orphan, missing retained; delayed legacy route AND same-route mount-owned arrival added for final correction. Eligibility helper unchanged does not excuse the new effect's different pending/completion paths. |
| N7 | KEEP → F5. Child, grandchild/sibling same-root guard and fork retained. SOURCE: alias algorithm unchanged, so no exhaustive lineage topology/cycle/fork-management suite; actual alias result is essential input to changed observed key. |
| N8 | SPLIT → F6 + F2. Search/results/clear/null retained in F6; direct mount with persisted scope in F2. CORRECT: query clearing does not promise rearmed scroll. SOURCE: draft creation/composer behavior itself unchanged; use real route only to establish null versus non-null ref. |
| L1 | KEEP/MERGE → F7. Preview6-plus-active union, order, uniqueness, history removal, Show more/less all retained. |
| L2 | KEEP → F8. Collapsed single row was already supported by base; SOURCE for insertion semantics, affected capture for new scroll. Expand/collapse endpoints remain controls. No claim that this patch first makes collapsed row visible. |
| L3 | CORRECT → F9. Same-route remount **does scroll** at final PRODUCT; round-3 GPT conclusion that it should not is superseded by correction. Settings button/palette and repeated returns retained; drawer/different-route added. Manual scope is inapplicable to legacy. |
| L4 | MERGE → F7 (route/palette/link/click and no-resnap chapters); F9 for mount-only part. All affected scroll triggers retained. SOURCE: route-free context menu action behavior unrelated to reveal not independently tested. |
| L5 | MERGE → F7. Sixth/seventh, preview8/no overflow, expanded list, null route retained. Inactive collapsed project control → F8. SOURCE: empty-project creation/deletion and every numeric preview setting are outside changed union branches; do not invent a full settings suite. |
| L6 | KEEP → F10. Jump labels/jump target/traversal all affected by changed global visible order. Shift-click on newly retained row remains short recording guard; SOURCE for the range algorithm and orderedProjectThreadKeys (full eligible list), unchanged at lines 1174/1769. SOURCE for prewarming: changed input order follows visible keys at 3235, but no independent visible surface or provider session result is claimed. No fabricated “prewarm screenshot”; source trace plus stopped-provider constraint only. |
| L7 | KEEP → F11. Unique active status removal from hidden summary and restoration mandatory. SOURCE for project-header status aggregation and status resolver internals, unchanged; recording still includes nearby header so unexpected visible movement is explained. |
| L8 | SPLIT → F12 grouped union/order/collapse; F4 archived/subagent/missing eligibility. SOURCE for grouping construction itself; affected physical→logical consumer composition still captured. Same names alone are insufficient grouping. Multi-environment identity collision is source-only, not simulated by renaming projects. |

## Reconstructible fixture requirements, per set

S = two synthetic projects A/B, eight threads each, no live provider sessions; recorded exact scoped environment ID, generated routes and deterministic sort. S+ adds forty Spacer threads or a committed sufficient count with measured overflow at both real heights. The count must be in fixture hash, not a manual undocumented DB tweak. A/B8 stopped synthetic transcript turns render navigable links in the real app. Stopped completed run records are allowed and now supplied; “zero runs” in the earlier plan is superseded for transcript fixtures. **Zero newly spawned provider sessions** remains required.

Real-app application is owned by the capturer, not performed by this audit: stop only its tracked isolated server; generate committed fixture script output; apply reset/isolation/project/thread/message/turn-item/transcript SQL through the documented SQLite helper to isolated statev2 only; boot the actual web app; set exact client settings and scoped UI keys; clear only relevant same-origin projection caches; navigate real routes and verify actual rendered order. Never touch live userdata. README's fixture settings object is not proof that the corresponding app storage has been populated. Commit reproducible reset/storage/replay inputs or index their committed declarative configuration; existing database alone is insufficient.

| Sets | Seed recipe / additional inputs that acceptance must reconstruct |
|---|---|
| F1,F2 | `spacers` (or `all` with explicit lineage exclusion), transcript SQL, new sidebar setting, scope/group/storage keys, selected B ID for F1, history initial entries and exact target scroll. Reset visit metadata, record actual sort fields; updated_at setting does not justify assuming A8…A1 once transcript timestamps change. |
| F3 | Four explicit shelf recipes. `pinned`, `snoozed`, `settled` projection variants exist; working/status variant names alone do not modify DB thread status, so working needs actual replay `shelf:"working"` with enabled option and working setting. Settled must exceed actual tail limit and target sort after it; at 8bc79 replay adds A13…A26, while generator's settled variant adds rows too. Choose one recipe, hash it, verify no duplication and record actual order. Match identical inputs at base/head. |
| F4 | Plain/spacers + replay enabled/delay, recorded HTTP initial and WS snapshot/chunk path, explicit release, request ID/sequence semantics, empty shell cache. Prove replay decoder success and row absence/arrival, not merely delay option existence. Archived/orphan generator variants exist; wholly missing key absent from seed. Mount-delay reset must preserve layout observed key while withholding active shell; if not reconstructible, retain chapter as unresolved. |
| F5 | `lineage` or `all` + lineage enabled when replay filtering would otherwise remove A9/A10/A11/A12; root/parent/fork relationships as committed; transcript links. Record actual resolved main route. Current progress reports redirect mismatch, so this fixture's existence is not accepted behavior evidence. |
| F6 | Plain/spacers with actual search backend indexed synthetic titles, saved B8 query, exact history A1, real draft/null route and storage. Query results must be observed; title rows in SQLite do not alone prove search hydration. |
| F7,F8,F9,F10 | For preview boundaries use **plain** eligible A8…A1, preview6 then8, A before B, explicit project/list expansion, shell/cache/visit reset and configured shortcuts. Add Spacer for scroll/mount without changing eligible A cut. F8 explicit collapsed logical project key; F9 layout lifetime proof; F10 exact selected IDs and keybinding map. |
| F11 | Replay `status:true` enabled with A1 failed-looking shell, A2 completed/unvisited-looking shell and neutral preview; verify actual resolveThreadStatusPill priorities and lastVisited overrides. Navigation may mark A1 visited; record status at each checkpoint. If both resolve null/equal, refine committed inputs rather than treating caption as evidence. |
| F12 | `grouped` name does not establish grouping by itself. Per README initialize synthetic A/B/Spacer git repos with same synthetic origin (no fetch), repository grouping setting plus Spacer separate override, real discovered physical/logical keys, project order/expansion and beyond-cut eligible member. Record actual VCS metadata and settings; flat A/B screenshot is insufficient. |

The supplied fixture README at a046 already describes HTTP/WS replay, grouping setup and cache reset; old reports calling all of those absent are stale. 8bc79 adds transcript.py, transcript SQL and settled HTTP snapshot extension. None of these source additions alone validates decoder paths, scope keys, actual order, delayed release, grouped mapping or working/status labels. Required manifest must include applied SQL hashes plus replay/bootstrap/config hashes, not only sha256.txt: seed.py hashes fixture.json but transcript/replay changes can alter rendered proof without altering that hash. Record source and generation SHAs separately.

## Independent pass-2 handoff and evidence accounting

Treat /tmp/issue-16534-capture-progress.md as a mutable status log, not acceptance. Its 08:30 snapshot reports baseline wide N1–N4/L1–L5 subsets; narrow lacks some L2/L4 guards; narrow-light shelf/delay/status extras exist; lineage redirect unresolved; matching corrected-head set/export/diffs pending. Older capture-final/index saying no uploads and old product32099 are superseded operational snapshots, not the current final matrix. This audit makes no updated accepted count.

Pass 2 must map each old ID and each F-set subcase/config to timestamped before/after recordings, matched checkpoints, images/diffs, written differences and status (accepted/unverified/blocked/source-only with reason). Core N1/L1 endpoint captures do not accept whole F1/F7, because history, guards, callers and control checkpoints remain separate. Reuse compatible old-ID artifacts rather than recapture merely for naming; reject wrong product SHA, wrong geometry/clock, missing subcase or unreconstructible input. Capture difficulty is not an unaffected disposition.

Independently inspect every mapped artifact and replay at least one nontrivial complete set from committed inputs in clean isolated real app after capture owner's handoff; F4 delayed plus F2/F9 mount policy is particularly informative. That later browser execution requires its own authorized pass-2 context; none ran here. Record drift if later fixture version changes proof. Do not count source-only prewarm/platform coverage as capture success.

Surface boundaries: new and legacy both required; 390 responsive web required; native mobile files/runtime/contracts untouched and excluded; desktop renderer shares web code but **desktop/Electron cannot be verified here**. No added server/API/provider protocol, agent action, scheduler or transport behavior; provider/permission/settings feature crossproducts, every sorting/grouping mode, relay/tunnel/live multi-environment deployment are outside minimum. Delayed-data rendering remains required despite unchanged networking. Source-only scoped identity is not a claim of multi-environment runtime verification.

## FRICTION

FRICTION POLICY: Earlier N2 scope widening and round-3 same-route no-scroll expectations are superseded; final policy requires preserved manual scope plus one visible-active-row scroll per mount.
FRICTION SOURCE: Capture owns checkout; explicit immutable product objects were inspected, with no checkout/server/browser intervention or product verdict.
FRICTION FIXTURE: Fixture tip advanced to 8bc79af8d5; committed replay/transcript inputs exist, but full reset/storage hashes and each real rendered precondition still require pass-2 validation.
FRICTION CAPTURE: Progress is partial and ongoing; missing recordings/checkpoints are outstanding evidence, not counted as bugs or silently excused affected paths.
FRICTION TOOLING: Preview bitmap cap requires authorized full-resolution video-frame extraction for wide stills; clock injection, replay envelopes, cache isolation and earlier redirect mismatch must be documented per artifact, not inferred fixed from source.
FRICTION PLATFORM: Native mobile untouched; desktop/Electron/macOS cannot verify here; narrow web does not verify native mobile.
FRICTION SECRETS: Report contains synthetic fixture identifiers and public source links only; no auth tokens, pairing URLs, private transcripts, environment secrets or copied personal data are included. Inspect before public upload.
