# Issue 23507 — executed before/after proof

Final evidence/fixture head: [396d43d148](https://git.cafe/pingdotgg/t3code/commit/396d43d148bbf201b1264d80fcd70eab1669d4f5) (full SHA `396d43d148bbf201b1264d80fcd70eab1669d4f5`). Implementation base [5484b34d23](https://git.cafe/pingdotgg/t3code/commit/5484b34d23); before [ff525478e2](https://git.cafe/pingdotgg/t3code/commit/ff525478e2). Branch `fix/issue-23507`, clean. No push, PR, or forge mutation.

Executed **8 matched still pairs, 4 matched recording pairs**, plus a negative-control recording. Every matrix row is accounted for below; several conditional branches remain explicitly unverified. This is web evidence, not native mobile/Electron verification.

![before-after-desktop-light.png](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b630355a6f42698a/before-after-desktop-light.png)


## Replay and provenance

Only three reusable fixture files were committed by the evidence capturer: [seeder](https://git.cafe/pingdotgg/t3code/blob/396d43d148bbf201b1264d80fcd70eab1669d4f5/apps/server/src/provider/testing/ClaudeSkills.fixture.mjs), [fixture data](https://git.cafe/pingdotgg/t3code/blob/396d43d148bbf201b1264d80fcd70eab1669d4f5/apps/server/src/provider/testing/ClaudeSkills.fixture.json), [transparent CLI observer](https://git.cafe/pingdotgg/t3code/blob/396d43d148bbf201b1264d80fcd70eab1669d4f5/apps/server/src/provider/testing/ClaudeStdin.fixture.mjs). No implementation edits or proof assets committed.

Replay from the committed head, using a new isolated `/tmp` sandbox and a stopped isolated dev server:

```sh
node apps/server/src/provider/testing/ClaudeSkills.fixture.mjs /tmp/issue-23507 enabled
node apps/server/src/provider/testing/ClaudeSkills.fixture.mjs /tmp/issue-23507 inventory
node apps/server/src/provider/testing/ClaudeSkills.fixture.mjs /tmp/issue-23507 registry /home/ubuntu/wt/issue-23507/apps/server
node apps/server/src/provider/testing/ClaudeSkills.fixture.mjs /tmp/issue-23507 invalid-registry /home/ubuntu/wt/issue-23507/apps/server
node apps/server/src/provider/testing/ClaudeSkills.fixture.mjs /tmp/issue-23507 disabled
node apps/server/src/provider/testing/ClaudeSkills.fixture.mjs /tmp/issue-23507 enabled
CLAUDE_CONFIG_DIR=/tmp/issue-23507/claude vp run dev
```

The seeder preserves existing isolated settings, creates no credentials, and is idempotent even after its unreadable-file variant. Supply your own authorized provider configuration privately. Never upload settings or auth. Seed `.t3` using the repository's migrate-dev-db workflow with the server stopped. Captures used an initialized Claude thread in workspace `/home/ubuntu/wt/issue-23507/apps/server`, existing benign Reply OK history, real filesystem fixtures and real server snapshots. No fabricated menu items, mocked RPC, or inventory injection. Before used a detached isolated checkout; after used final committed head. Baseline demo data was identical; inventory variants were separately refreshed through the actual app.

For observation put the committed observer on the isolated CLI PATH as `claude`, with `T3_CLAUDE_OBSERVER_EXECUTABLE` pointing to the actual Claude executable and `T3_CLAUDE_OBSERVER_OUTPUT` to a `/tmp` JSONL file. It transparently forwards stdin, records only user text blocks, and propagates file-write errors. Final code uses **NodeFS.appendFileSync** outside the JSON-parse catch. Final committed observer smoke passed. Before logs predate the faulty renamed observer and are nonempty; after dispatch was recaptured with the corrected observer. No faulty b188 logs are submitted.

All three touched fixture files passed targeted `vp lint`. Fixture replay/idempotence and final committed observer smoke passed. Implementation test/typecheck/lint results were supplied by the implementation agent, not rerun as evidence claims here.

## Rendering controls and differences

Linux Chrome 154 (`Chrome/154.0.0.0`), DPR 2, zoom 1, font scale 1, root 16px, body 16px/24px system font. CSS viewports 1440×900 and 390×844; light/dark theme, scroll 0, sidebar collapsed, same seeded history. No native-device emulation. Date frozen to 2026-10-22 09:40:00 UTC for stills only; real clock restored for recordings/refresh. Preview still output is 1280×800 for desktop (tool resampling), 780×1688 for narrow web. Source recordings are 2880×1800 / 780×1688, except combined R2 normalized to 1440×900.

Each pair includes (1) absolute RGB difference amplified 8× with zero threshold, black for exact equality; (2) magenta overlay on after where max channel difference exceeds **16/255**. No registration/cropping or ignored region. [Pixel statistics](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/08aec64aa4c594b7/diff-stats.json) report all changed pixels. Differences below are visually inspected; popup text rasterization/background changes are included, not suppressed.

| Pair | Before | After | Zero, 8× | Threshold 16 | All visible differences |
|---|---|---|---|---|---|
| V1-1440-dark | [Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4bdd1a660972aba3/V1-1440-dark.png) | [After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5819f9ddd6c7d9cd/V1-1440-dark.png) | [Diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/141da3e9130917a6/zero-V1-1440-dark.png) | [Diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/08aa5e49cbc5fa54/threshold16-V1-1440-dark.png) | Empty “No skills found” popup becomes Manual, Review, NoDescription rows; Review highlighted, description and Personal Skill badge. Zero 4.183%; threshold16 0.457%. |
| V1-1440-light | [Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/055082a0d8aa48be/V1-1440-light.png) | [After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d4d43538e2713744/V1-1440-light.png) | [Diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0e0136f0eeaba423/zero-V1-1440-light.png) | [Diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/498f5a40f0e78e30/threshold16-V1-1440-light.png) | Empty “No skills found” popup becomes Manual, Review, NoDescription rows; Review highlighted, description and Personal Skill badge. Zero 4.119%; threshold16 0.410%. |
| V1-390-dark | [Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f92fc719e99975f6/V1-390-dark.png) | [After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/df5f848ea2b3c580/V1-390-dark.png) | [Diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0f00621484d981ec/zero-V1-390-dark.png) | [Diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5624c4680f3fc7f8/threshold16-V1-390-dark.png) | Empty “No skills found” popup becomes Manual, Review, NoDescription rows; Review highlighted, description and Personal Skill badge. Names/descriptions truncate at 390; badges remain readable. Zero 8.458%; threshold16 1.110%. |
| V1-390-light | [Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/145cf08aa97e68c2/V1-390-light.png) | [After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/af4eb8417fafb2c3/V1-390-light.png) | [Diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/526a5936553e9ba8/zero-V1-390-light.png) | [Diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/365da83569b4af54/threshold16-V1-390-light.png) | Empty “No skills found” popup becomes Manual, Review, NoDescription rows; Review highlighted, description and Personal Skill badge. Names/descriptions truncate at 390; badges remain readable. Zero 8.463%; threshold16 0.975%. |
| V2-1440-dark | [Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/026195c51b666ece/V2-1440-dark.png) | [After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e8cdbadc7c956949/V2-1440-dark.png) | [Diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f9c484a5ffb6c060/zero-V2-1440-dark.png) | [Diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ceee9b758a4e808c/threshold16-V2-1440-dark.png) | Empty “No matching command” popup becomes /skill: Manual, Review, NoDescription rows; Manual highlighted; Personal badges, descriptions; Please prose unchanged. Zero 3.306%; threshold16 0.470%. |
| V2-1440-light | [Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d98653c5b4082d5b/V2-1440-light.png) | [After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6cee29a0d8fc20d3/V2-1440-light.png) | [Diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/63f38eb3f832f0ec/zero-V2-1440-light.png) | [Diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d562908d380608a1/threshold16-V2-1440-light.png) | Empty “No matching command” popup becomes /skill: Manual, Review, NoDescription rows; Manual highlighted; Personal badges, descriptions; Please prose unchanged. Zero 3.247%; threshold16 0.373%. |
| V2-390-dark | [Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c61ab99f1c26c18e/V2-390-dark.png) | [After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8681b422be95d927/V2-390-dark.png) | [Diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/df0c3ef1f55ebbbb/zero-V2-390-dark.png) | [Diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/65a50b0453534d45/threshold16-V2-390-dark.png) | Empty “No matching command” popup becomes /skill: Manual, Review, NoDescription rows; Manual highlighted; Personal badges, descriptions; Please prose unchanged. Names/descriptions truncate at 390; badges remain readable. Tiny blue submit-button texture also differs. Zero 7.138%; threshold16 1.449%. |
| V2-390-light | [Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5d11f7cf38dfa2a4/V2-390-light.png) | [After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/36287c66b118c37b/V2-390-light.png) | [Diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/22d5a2930892bf2c/zero-V2-390-light.png) | [Diff](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ddbc8b8857f36a8c/threshold16-V2-390-light.png) | Empty “No matching command” popup becomes /skill: Manual, Review, NoDescription rows; Manual highlighted; Personal badges, descriptions; Please prose unchanged. Names/descriptions truncate at 390; badges remain readable. Zero 7.141%; threshold16 0.815%. |

## Recording pairs (timestamped on-screen narration)

Captions narrate steps and observations; no audio narration. Raw recordings, exact step timestamps and SRT captions are retained in the downloadable bundle. No still substitutes for interaction proof.

| Pair | Before | After | Observed flow |
|---|---|---|---|
| R1-1440-light | [before-R1-1440-light-narrated.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/12c4507000f56ca3/before-R1-1440-light-narrated.mp4) | [after-R1-1440-light-narrated.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6672dfce50a192df/after-R1-1440-light-narrated.mp4) | Keyboard Enter selection, undo, mid-message click selection, chip removal retaining prose/trailing space, leading slash, Escape/reopen. Before no row prevents selection. |
| R1-390-dark | [before-R1-390-dark-narrated.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4775e77361fa1a24/before-R1-390-dark-narrated.mp4) | [after-R1-390-dark-narrated.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/db15e6f6a1096a6f/after-R1-390-dark-narrated.mp4) | Same interaction/reverse-state sequence at 390 dark, including narrow truncation. |
| R2-1440-light | [before-R2-1440-light-narrated.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ddc001efdd61a1c5/before-R2-1440-light-narrated.mp4) | [after-R2-1440-light-narrated.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/029063833e6b23e7/after-R2-1440-light-narrated.mp4) | Settings slash on→off→on; dollar retained while slash off; filesystem plugin disable→enable with real provider and workspace refresh completion. Before absent throughout. |
| R3-1440-light | [before-R3-1440-light-narrated.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8f4b2a9a0bd28f4b/before-R3-1440-light-narrated.mp4) | [after-R3-1440-light-narrated.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5113c17801a3913e/after-R3-1440-light-narrated.mp4) | Real benign fresh and active steer; before literal dollar mention, after final native slash block. Actual outbound JSONL below. |

R1 after desktop: Enter 1.37s, click 4.03s, deletion 5.80s, leading slash 7.48s, Escape 8.75s, reopen 10.01s. Narrow equivalent: 1.34/4.00/5.80/7.15/8.42/9.67s.

R2 after: off 5.59s, on 9.88s; machine refresh 32.16s still leaves the cached workspace inventory, so recording continues until genuine workspace expiry/refresh. Disabled absence at 136.27s. **Two recorded segments are joined:** second segment resumes after the normal five-minute TTL wait; enabled dollar/slash restored once at segment2 3.35s. Raw parts retained. No forced clock advance or injected snapshot. Before Settings refresh completes disabled/enabled while adoption remains absent.

R3 after: first fresh send at start; first attempted steer at 28.01s landed after completion and is retained as a fresh-turn control. Actual new active turn begins 53.37s; Stop generation establishes activity; Ctrl+Enter while Queue message visible at 55.37s. Outbound fresh at 10:08:33.485Z and steer at 10:08:34.348Z (same PID) each end with a separate `/demo-tools:review` text block and preserve the preceding request. Persisted turn-item event marks `inputIntent:steer` at 10:08:34.288Z. Before actual active inputs at 09:49:14.079/.498Z remain literal `$demo-tools:review`. All requested turns explicitly forbid tools/file edits and request only OK.

[after-negative-controls.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0f41d7da8ee1ae35/after-negative-controls.mp4) — agent-only unavailable and sent as literal text; disabled plugin native dispatch absent despite an already cached composer chip.

## Conditional matrix accountability

The pass-1 F3/F4 expectations are stale after native parity fixes: **skills-dir requires a valid manifest.name, rejects colon names, and skips any folder containing root SKILL.md**. It has no folder-name namespace fallback. Existing installed-registry fallback is unchanged.

| Row | Executed real-app evidence | Limits / unverified |
|---|---|---|
| F1 | Default-on demo-tools discovered user scope with lexical symlink path, actual description; no wrapper alias/duplicate. Before absent. V1/V2/R1/R3 + snapshots. | None for baseline. |
| F2 | Explicit false removes demo and default-off opt-in; explicit true restores opt-in; absent demo override and manifest-on sibling discovered. R2 + snapshots. | None for seeded variants. |
| F3 corrected | Missing/malformed/nameless manifests rejected, ordinary directory not adopted, hidden plugin absent; root ordinary skills preserved. | Missing/unreadable entire skills parent unverified. |
| F4 corrected | Root-masked and root-unnamed remain ordinary skills, no plugin adoption even with plugin marker; registry root fallback preserved. | Declared-empty root suppression not conclusively isolated; do not infer from README-only empty fixture. |
| F5 | String/array declared directory roots plus default additive; repeated default root deduped with first-root naming; valid direct single-skill directories discovered. | Literal manifest path directly to SKILL.md file unverified. Registry/personal canonical collision not isolated. |
| F6 | Lexical ../, absolute outside, escaping symlink and missing target skipped; valid siblings retained. Default child symlink remains allowed. | realPath failure branches not fault-injected. In-tree declared symlink shares direct-root name, so distinct attribution is ambiguous after dedupe. |
| F7 | User/managed→user and applicable project/local→project; disabled/invalid/unmatched omitted; registry-key fallback preserved; malformed registry still allows adopted personal plugins. Before registry controls remain. | No full helper-shape × registry-scope crossproduct. |
| F8 | Description/no-description metadata visible; agent-only in snapshot but not menu/native dispatch; manual user-invocable row present; malformed/unreadable and invalid/colon namespace absent; ordinary user root preserved. | Separate ordinary project skill not seeded. |
| F9 | Real Settings provider refresh and actual initialized workspace snapshot; demonstrated workspace precedence and waited real TTL on disable/re-enable. Snapshots + R2. | Settings snapshot contains project entries as well; not claimed as an isolated pure no-cwd service test. |
| F10 | Fresh + actual active steer native command shown by observer; disabled and agent-only remain literal. R3, negative video, persisted steer event. | None for these seeded controls. |

## Supporting evidence

[snapshot-phases.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d287e37e6a3838e7/snapshot-phases.json)

[before-dispatch.jsonl](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e15fedb25fb1eda4/before-dispatch.jsonl)

[after-dispatch.jsonl](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/27449cd4602227e4/after-dispatch.jsonl)

[after-steer-events.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bd459785b93a8a22/after-steer-events.json)

[diff-stats.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/08aec64aa4c594b7/diff-stats.json)

[final-metadata.json](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/be2a5745dbf6de1b/final-metadata.json)

[observer-final-smoke.jsonl](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a775aec71de316e2/observer-final-smoke.jsonl)

## Surfaces, cleanup, friction

Verified real web composer dollar/slash entry points, leading/mid-message queries, Settings gate, chips/reverse states, fresh/active-steer dispatch. Responsive 390 web is not native mobile. Electron shell, native iOS/Android, relay/tunnel and other providers were not executed; no claim of native/remote proof. No new palette/keybinding/editor surface exists in this change.

All own servers stopped with retained sessions (18806, 25193, 74051, 72936, 63803, 19876, 91299; exited130). Confirmed ports 5803/13843/7393/15433 free. Extra detached checkout **removed: `/tmp/issue-23507/before`**. Final checkout restored/retained on `fix/issue-23507`, clean. Main task checkout and `/tmp/issue-23507` intentionally retained for parent proof-audit pass2 and final cleanup. No kill by pattern.

FRICTION category|what|avoid

- refresh|machine refresh does not invalidate workspace TTL|await actual workspace refresh; record stale-to-fresh transition
- navigation|Settings transition can retain previous controls briefly|await destination control before clicking
- pairing|copied environment identity shares localhost cookies across ports|use fresh isolated pairing when needed
- capture|desktop still tool resamples output|state CSS viewport and effective output pixels separately
- observer|namespace rename left swallowed file-write error in an intermediate version|final NodeFS.appendFileSync outside parse catch; smoke committed head and require both logs nonempty

## Complete curated bundle

[issue-23507-evidence.zip](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/330a115ef204324c/issue-23507-evidence.zip)

Includes raw recordings/parts, timestamp JSON/SRT, narrated versions, all stills/diffs, safe snapshots/dispatch logs, final metadata and observer smoke. No settings/auth/database/server log/pairing URL included.


## Independent replay UI setup

The filesystem seeder prepares the provider inventory. To recreate the still's conversation after dispatch tests have added history, create a **new thread through the real app** in the same workspace. Send `Reply only OK. Do not use tools or change files.`, await the assistant's `OK` and completed turn, and rename the thread `Reply OK`. Dismiss the provider-update notification; collapse the sidebar and details panel. Use the stated theme, viewport and frozen still clock, enter `$demo`, and highlight Review. Do not reuse a thread containing later dispatch turns.

Independent audit replay at the committed evidence head recovered the popup and composer exactly. Full-image difference: 588/1,024,000 pixels (0.05742%), confined to the top-left sidebar control; zero pixels exceed 16/255. The audit report gives the row-by-row checks and replay procedure.


### Complete audited UI recipe

The committed filesystem seeder/data recreate provider state. They do not create the visual thread, title, history, panel state or dismissed toast. Reusing a thread after R3 will not reproduce the earlier still. Add this explicit real-app setup to the index; no repository edit is required by this audit.

1. Confirm requested clean head. With the isolated server stopped, run `node apps/server/src/provider/testing/ClaudeSkills.fixture.mjs /tmp/issue-23507 enabled`. Existing inventory fixtures may remain: `$demo` filters them out. Use the supplied private isolated provider configuration; never upload it.
2. Start `CLAUDE_CONFIG_DIR=/tmp/issue-23507/claude vp run dev` in `/home/ubuntu/wt/issue-23507`; retain the session and read actual ports. This run used web7393/server15433 and worktree `.t3`, never live T3 state.
3. Open the T3 preview and pair through the normal startup pairing flow. If navigating a hash link leaves the existing Pair page unchanged, paste that fresh startup token into Pairing token and click Continue. Keep tokens private.
4. Open the existing server project rooted at `/home/ubuntu/wt/issue-23507/apps/server`. Use breadcrumb **New thread in server** to create a NEW draft with **Current checkout**, `fix/issue-23507`, **Claude Opus 5.5**, **Medium**, **Full access**. Do not reuse or edit the original proof thread.
5. Type exactly `Reply only OK. Do not use tools or change files.` in Message and submit with Enter. Await actual assistant `OK` and completion of the turn (Stop generation/working state gone). One user message and one assistant reply only; do not run a skill in this fixture turn.
6. Automatic title was `Identify Thread Subject` in this replay. Open its breadcrumb Thread actions, choose **Rename thread**, replace Thread title with `Reply OK`, press Enter.
7. Click **Dismiss notification** on the Claude update toast if present. Do not install an update. Collapse the **thread details panel** and **main sidebar** with their real buttons. Confirm sidebar state collapsed; avoid Ctrl+B in the rich-text composer because it formats bold.
8. Set preview CSS viewport 1440×900 and light appearance. Type `$demo` in Message, press ArrowDown once to highlight **Review** (Manual is initially selected). Do not press Enter or submit this query.
9. After setup/turn completion, freeze Date/new Date/Date.now to `2026-10-22T09:40:00Z` for this still only. Scroll timeline and page to0; move pointer off controls. No menu, RPC or React-state injection. Verify actual UA/DPR/font/viewport and highlighted row.
10. Save one preview snapshot, compare RGB directly to delivered after V1 desktop-light image. Restore the real clock. For other delivered grid cells the controls are CSS390×844 or1440×900, light/dark; this audit independently replayed only the required single affected cell.

New sandbox thread retained in isolated state: `f70b2d6b-f1e6-4afb-a798-cca3be044086`. It contains only the authorized benign exchange and an unsent `$demo` query. No original thread mutation or file rewind. Local replay images and diff/stat files are under `/tmp/issue-23507/pass2/new-thread-replay-*`; they are independent audit artifacts, not replacement evidence rows.


[Independent PASS2 audit report](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/64460063fa7e6399/proof-audit-pass-2.md). Verdict: SUFFICIENT with disclosed coverage limits.
