# fix\(web,mobile\): new replies show overwritten local images · PR \#23212 · pingdotgg/t3code

[View on GitCafe](https://git.cafe/pingdotgg/t3code/pull/23212)

Repository: [pingdotgg/t3code](https://git.cafe/pingdotgg/t3code)

Visibility: public

State: open

Source repository: pingdotgg/t3code

Source branch: fix/issue-15676

Target branch: main

Head commit: f7082ecebb44b72cff641b6ff381b83fad5d7111

[Discussion and reviews](https://git.cafe/pingdotgg/t3code/pull/23212)

[Commits](https://git.cafe/pingdotgg/t3code/pull/23212/commits?format=markdown)

[Files changed](https://git.cafe/pingdotgg/t3code/pull/23212/diffs?format=markdown)

## Description

---

## Problem

An agent overwrites a local image, embeds the same path in a later reply, and the new reply displays the previous bytes until reload. Reproduced on Linux in the real web app with Claude: the PNG on disk was green while the new reply still rendered red.

## Change

Key local image asset URLs by assistant message ID in web and mobile, so a new reply requests a fresh URL while chunks of the same reply share one entry. Strip the client-only revision before asset RPC calls. Existing callers without a revision keep their behavior. This does not snapshot image history or refresh an image overwritten within one message.

Include the synthetic PNG/SVG fixture data and stopped-server projection seed helper required to rebuild the evidence. No server contract or persisted app data changes.

## Scope and approval

Fixes #15676
GitCafe: https://git.cafe/pingdotgg/t3code/issues/15676
Triaged bug via the automated issue flow: [#15676](https://git.cafe/pingdotgg/t3code/issues/15676). `via-triage`; requires Julius review for unavailable client surfaces. No auto-merge or `land` label.

## Verification

- `vp test run packages/client-runtime/src/state/assets.test.ts apps/mobile/src/state/assets.test.ts packages/client-runtime/src/state/runtime.test.ts`: **28 passed** across three files after merging current main.
- `tsc-rs --noEmit` in client-runtime, web and mobile: **passed** (client-runtime emits existing suggestions).
- Targeted lint, formatting and `git diff --check`: **passed**; lint reports existing mobile warnings.
- Capture proof chosen after the red-test step found that reproducing browser image reuse in existing test files requires substantial new asset-server/RPC scaffolding. Both reviewers agreed that a generic cache-key test would already pass on main and would not reproduce this bug.
- Primary current-head integrated pass: four loaded yellow images, overwrite the same path to magenta, request another real Claude reply; new reply magenta without reload, four earlier replies yellow.
- Two model reviews found no implementation bug. **Full proof matrix is incomplete; this is not a claim of merge readiness.** The central overwrite regression is supported in all four web recordings. Detailed limits follow.
- **cannot-verify desktop, android, ios**: Electron/Android unavailable; both EAS iOS builds failed resolving GhosttyKit. Streaming stability, reconnect/recovery, some default-revision callers, successful direct-image controls, and remote fallback remain unverified. The independent capture rebuild/pixel-delta check was not performed. Route these limits to Julius.

### Provenance and rendering environment

- Captured base: [b5a226e49c](https://git.cafe/pingdotgg/t3code/commit/b5a226e49c52ecab4ddc2d678a7012d97e651a6a); captured feature head: [89ee147526](https://git.cafe/pingdotgg/t3code/commit/89ee147526dc132b44b573c112e18efb3b28e38f). Captures were made 2026-10-22 approximately 00:19–00:43 UTC. Reflog places feature head at 2026-10-21 23:50:04 UTC and the later main merge [3098ef2f93](https://git.cafe/pingdotgg/t3code/commit/3098ef2f934aee68acab769852de52566eadf132) at 00:47:49 UTC. Old dev logs identify head checkout `/home/ubuntu/wt/issue-15676` on web5817/backend13857 and base checkout `/home/ubuntu/wt/issue-15676-base` on web7881/backend15921; base reflog starts at b5a226e49c at 23:57:15 UTC. Existing metadata has no embedded SHA: attribution is reconstructed from checkout/reflog, launch logs and capture timeline, not cryptographically stamped at capture.
- Fixtures committed later as [e76c41919d](https://git.cafe/pingdotgg/t3code/commit/e76c41919d5dc466d8c2091211e9746689bb2d7d). All eight implementation paths are unchanged between captured feature head and the merge. Fixture commit changes only seed script/data. No evidence artifact is committed.
- Real web development app, T3 collaborative browser, Linux x86_64, Chrome/154.0.0.0, DPR 2. Reported CSS viewports: wide 1440×900 and narrow 390×844, each light/dark. Wide recordings are 2880×1800, but saved wide stills are 1280×800; narrow recordings/stills are 780×1688. Wide-still scaling/viewport discrepancy is unresolved and must not be described as exact 1440×900 still proof.
- Font: `16px / 24px -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif` (computed stack; installed face not recorded). Themes: light `oklch(0.992 0 0)`, dark `oklch(0.145 0 none)`. UI clock frozen at 2026-10-22 00:00 UTC for matching relative labels; timing marks use performance time, not frozen UI Date.
- Synthetic project and image files in isolated worktree state. R1–R4 are static projection fixtures cloned from app-written rows, not event-history proof. R5 comes from a real Claude Sonnet 5.5 turn through app commands. Same path overwritten in place; ordinary cache retained during each decisive sequence; no reload between overwrite and R5. Separate base/head sessions.

### Paired endpoint index

`diff0` is whole-surface absolute RGB difference amplified ×8 (black means equal); `diffT` is a magenta mask where maximum absolute RGB channel delta is >16/255. No crop/mask excludes surrounding UI. Counts below are pixels, not percentages. Endpoint differences can include layout/scroll/caret differences and do not themselves prove timing.

| Cell | Before: stale R5 | After: fresh R5 | diff0 | diffT (T=16) | Changed >0 / >16 |
|---|---|---|---|---|---|
| wide-light | ![Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a017303581516282/base-wide-light-final.png) | ![After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/13bee66c300aa2c0/head-wide-light-final.png) | ![diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/cc57dd1051c1144c/pair-wide-light-final-diff0-x8.png) | ![diffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0fdb8f4a8dca9572/pair-wide-light-final-diff16.png) | 27995 / 27906 |
| wide-dark | ![Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e879fc176db48c4a/base-wide-dark-final.png) | ![After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a1764f97507c1dbd/head-wide-dark-final.png) | ![diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/849e8f13c41d91b7/pair-wide-dark-final-diff0-x8.png) | ![diffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2a7df5593e7f44f4/pair-wide-dark-final-diff16.png) | 27410 / 27408 |
| narrow-light | ![Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e7babfac13eee7c3/base-narrow-light-settled.png) | ![After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9ee3920141c5079e/head-narrow-light-final.png) | ![diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9439c4092a871601/pair-narrow-light-final-diff0-x8.png) | ![diffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4f7045a08db4bb93/pair-narrow-light-final-diff16.png) | 136826 / 136822 |
| narrow-dark | ![Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/35280c62c0a08672/base-narrow-dark-final.png) | ![After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7a1d1255a11a0da3/head-narrow-dark-final.png) | ![diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4d9c8b21438100bc/pair-narrow-dark-final-diff0-x8.png) | ![diffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e5117454ba6b4c53/pair-narrow-dark-final-diff16.png) | 659838 / 483400 |

**Narrow light uses `base-narrow-light-settled.png`.** The earlier `base-narrow-light-final.png` shows Thinking with no R5 and is not the decisive before endpoint. Existing final-pair statistics already name the settled file; the packaging pass independently checked the matching diffs against it.

Before — narrow light, stale blue R5:

![Before: new R5 remains BLUE v1 after same-path overwrite](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e7babfac13eee7c3/base-narrow-light-settled.png)

After — narrow light, fresh yellow R5:

![After: new R5 shows YELLOW v2 while earlier replies remain blue](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9ee3920141c5079e/head-narrow-light-final.png)

### Static boards and whole-surface comparisons

<details>
<summary>Static fixture comparisons</summary>

Board 0 shows upper PNG/inline/file-URL/tall fixtures; boards 1–4 overlap the lower SVG/fragment/missing/blocked/linked/direct-data section. Repeated lower boards are not additional independent cases. Narrow boards match exactly; wide boards differ by 0 or 17 pixels consistent with composer caret. This establishes visual parity of captured fixtures, not correctness of every URL/fragment branch. Authored-size and spaced/encoded supplemental fixture data exists but has no captured board.

| Cell / board | Before | After | diff0 | diffT | Changed >0 / >16 |
|---|---|---|---|---|---|
| wide-light / 0 | ![Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f2ae69e5f205e697/base-wide-light-board-0.png) | ![After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b8778962c3bc77e8/head-wide-light-board-0.png) | ![diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/271659d4212d9265/pair-wide-light-board-0-diff0-x8.png) | ![diffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4a3804c1b52c59c8/pair-wide-light-board-0-diff16.png) | 17 / 17 |
| wide-light / 1 | ![Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5f0c2c99db025c2b/base-wide-light-board-1.png) | ![After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/cbcc43808ea921c5/head-wide-light-board-1.png) | ![diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/932fde694e3f31c2/pair-wide-light-board-1-diff0-x8.png) | ![diffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a41698df0266a875/pair-wide-light-board-1-diff16.png) | 17 / 17 |
| wide-light / 2 | ![Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/aa8aec10d7cc1e5a/base-wide-light-board-2.png) | ![After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2c71014ffab975d6/head-wide-light-board-2.png) | ![diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/43851e39a6a9de4f/pair-wide-light-board-2-diff0-x8.png) | ![diffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f3633a3c8f0af01f/pair-wide-light-board-2-diff16.png) | 17 / 17 |
| wide-light / 3 | ![Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/58371d733410b429/base-wide-light-board-3.png) | ![After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6d4e9f4c3873faa3/head-wide-light-board-3.png) | ![diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c793b729ee26bcce/pair-wide-light-board-3-diff0-x8.png) | ![diffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3df15ac749121b27/pair-wide-light-board-3-diff16.png) | 17 / 17 |
| wide-light / 4 | ![Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e14bec115d3503f4/base-wide-light-board-4.png) | ![After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/31c0d85588e6923b/head-wide-light-board-4.png) | ![diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/79f6380d22406c16/pair-wide-light-board-4-diff0-x8.png) | ![diffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/98e4a8a777670078/pair-wide-light-board-4-diff16.png) | 17 / 17 |
| wide-dark / 0 | ![Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8051766c5d41fa59/base-wide-dark-board-0.png) | ![After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8e1db56315e1fc03/head-wide-dark-board-0.png) | ![diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/282f6d95222f8f11/pair-wide-dark-board-0-diff0-x8.png) | ![diffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bce3855cb8a4a2f6/pair-wide-dark-board-0-diff16.png) | 17 / 17 |
| wide-dark / 1 | ![Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ecc1ec36207e2fc0/base-wide-dark-board-1.png) | ![After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b1add5e2ea3807e0/head-wide-dark-board-1.png) | ![diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/757a7e6bbdf2805b/pair-wide-dark-board-1-diff0-x8.png) | ![diffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9aba2e3b1437bfd6/pair-wide-dark-board-1-diff16.png) | 0 / 0 |
| wide-dark / 2 | ![Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9496441d548abc7f/base-wide-dark-board-2.png) | ![After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a1ac474df6694b8c/head-wide-dark-board-2.png) | ![diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/83efb358c7c6ffe1/pair-wide-dark-board-2-diff0-x8.png) | ![diffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/656f0506c5198db0/pair-wide-dark-board-2-diff16.png) | 17 / 17 |
| wide-dark / 3 | ![Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c236d24f6e6c40b3/base-wide-dark-board-3.png) | ![After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/72ae9f22126dfa28/head-wide-dark-board-3.png) | ![diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1fbac0848cf39391/pair-wide-dark-board-3-diff0-x8.png) | ![diffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1740e969d5faaee2/pair-wide-dark-board-3-diff16.png) | 17 / 17 |
| wide-dark / 4 | ![Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/23fad11ea50bb989/base-wide-dark-board-4.png) | ![After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/563d6a486431b4df/head-wide-dark-board-4.png) | ![diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3532fdba956354ca/pair-wide-dark-board-4-diff0-x8.png) | ![diffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a2ac920017764d7d/pair-wide-dark-board-4-diff16.png) | 17 / 17 |
| narrow-light / 0 | ![Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d6bdbab5a7182e2d/base-narrow-light-board-0.png) | ![After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ebe3cd6ada644bf8/head-narrow-light-board-0.png) | ![diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/351a73004ba12b15/pair-narrow-light-board-0-diff0-x8.png) | ![diffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/94d16258715e0e18/pair-narrow-light-board-0-diff16.png) | 0 / 0 |
| narrow-light / 1 | ![Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b43e2edf72d0ced6/base-narrow-light-board-1.png) | ![After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/cebcd2be83a2841a/head-narrow-light-board-1.png) | ![diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f9c7109542ae5fef/pair-narrow-light-board-1-diff0-x8.png) | ![diffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6a864ed295c62202/pair-narrow-light-board-1-diff16.png) | 0 / 0 |
| narrow-light / 2 | ![Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/426a8b101a52c4d8/base-narrow-light-board-2.png) | ![After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/478fb263473c01a9/head-narrow-light-board-2.png) | ![diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9e5874eabbe3e72e/pair-narrow-light-board-2-diff0-x8.png) | ![diffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9360f89bcafee17f/pair-narrow-light-board-2-diff16.png) | 0 / 0 |
| narrow-light / 3 | ![Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9a0163431140ba71/base-narrow-light-board-3.png) | ![After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/191343c4a38cd1a9/head-narrow-light-board-3.png) | ![diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/827fcab7cc13e8f6/pair-narrow-light-board-3-diff0-x8.png) | ![diffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b62dfbd7fb12f0eb/pair-narrow-light-board-3-diff16.png) | 0 / 0 |
| narrow-light / 4 | ![Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/67071bc6fd4ee79d/base-narrow-light-board-4.png) | ![After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/497d93e07b33e2d0/head-narrow-light-board-4.png) | ![diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7ae1682f28491f2f/pair-narrow-light-board-4-diff0-x8.png) | ![diffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3a1b77a023536d69/pair-narrow-light-board-4-diff16.png) | 0 / 0 |
| narrow-dark / 0 | ![Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3374836c0239f89b/base-narrow-dark-board-0.png) | ![After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f7135fe1ca478a79/head-narrow-dark-board-0.png) | ![diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a65c06f695d57f72/pair-narrow-dark-board-0-diff0-x8.png) | ![diffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ca473185ec7a18ab/pair-narrow-dark-board-0-diff16.png) | 0 / 0 |
| narrow-dark / 1 | ![Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1d5b569b3f0ce03a/base-narrow-dark-board-1.png) | ![After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/62f2b5ed8486b0f8/head-narrow-dark-board-1.png) | ![diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bcef8d196eb96a3b/pair-narrow-dark-board-1-diff0-x8.png) | ![diffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/059a9656041c8e7a/pair-narrow-dark-board-1-diff16.png) | 0 / 0 |
| narrow-dark / 2 | ![Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d3be907c5ec6532c/base-narrow-dark-board-2.png) | ![After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/cfc2dac7e935ecb9/head-narrow-dark-board-2.png) | ![diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0f202398282d287a/pair-narrow-dark-board-2-diff0-x8.png) | ![diffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/69ea89feae690973/pair-narrow-dark-board-2-diff16.png) | 0 / 0 |
| narrow-dark / 3 | ![Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4e0f906b5c39ff1b/base-narrow-dark-board-3.png) | ![After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/fa02a3356e62b4c4/head-narrow-dark-board-3.png) | ![diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d04e69f5e3567ad2/pair-narrow-dark-board-3-diff0-x8.png) | ![diffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/757a013baa6a5df5/pair-narrow-dark-board-3-diff16.png) | 0 / 0 |
| narrow-dark / 4 | ![Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/12fa77d1c3c40361/base-narrow-dark-board-4.png) | ![After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/106d41d70b8ba016/head-narrow-dark-board-4.png) | ![diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bf64c9ed0e70ee89/pair-narrow-dark-board-4-diff0-x8.png) | ![diffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ca438195156efcbd/pair-narrow-dark-board-4-diff16.png) | 0 / 0 |

Other initial/expanded pairs and all metadata are linked in the artifact catalog below. Expanded overwrite images differ intentionally (base blue/head yellow); static gallery boards use yellow source bytes on both builds.

</details>

### Recordings: steps and times

Times below are recovered marks in seconds from recording start; encoded duration is measured from the actual MP4. Marks are approximate and can diverge from encoded time after transport stalls/static-frame handling. Raw recordings are untrimmed. The overwrite happens through the fixture command outside the browser, so a colored transition alone does not document disk bytes; the script, metadata, reply labels and endpoint samples support that sequence.

| Build / cell | Recording | Start UTC | Duration | Step marks (seconds) | Limitation |
|---|---|---|---|---|---|
| base / wide-light / overwrite | [MP4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ac574114b3986837/base-wide-light-recording.mp4) | 00:23:20.671 | 20.661s | scrollBaseline 2.31, overwrite 6.099, submit 6.438, completed 13.263, expand 15.739, closed 19.918 | R5 endpoint and expansion visible in sampled frames |
| base / wide-light / gallery | [MP4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/08c78ca1fef02480/base-wide-light-gallery-recording.mp4) | 00:39:18.361 | 16.331s | landscapeOpen 1.163, landscapeNext 6.763, landscapeClosed 9.623, vectorOpen 10.524, vectorNext 12.422, vectorClosed 15.181 | PNG and SVG open → next → close; link href diagnostic only, not clicked navigation proof |
| base / wide-light / stream | [MP4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/90d2b92dc985981f/base-wide-light-stream-recording.mp4) | 00:41:28.489 | 9.047s | submit 0.09, complete 6.663 | W3 unverified: only completed streaming:false event; no observed image insertion on head |
| base / wide-dark / overwrite | [MP4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3e01900177b97a9a/base-wide-dark-recording.mp4) | 00:24:02.743 | 19.175s | scrollBaseline 3.191, overwrite 6.656, submit 6.798, completed 12.303, expand 14.432, closed 17.372 | R5 endpoint and expansion visible in sampled frames |
| base / wide-dark / gallery | [MP4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f4462f2b976c79fd/base-wide-dark-gallery-recording.mp4) | 00:39:37.473 | 12.142s | landscapeOpen 0.699, landscapeNext 2.84, landscapeClosed 5.631, vectorOpen 6.204, vectorNext 7.946, vectorClosed 11.318 | PNG and SVG open → next → close; link href diagnostic only, not clicked navigation proof |
| base / wide-dark / stream | [MP4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bb5f68efdc6f807e/base-wide-dark-stream-recording.mp4) | 00:41:39.639 | 17.258s | submit 0.153, complete 5.732 | W3 unverified: only completed streaming:false event; no observed image insertion on head |
| base / narrow-light / overwrite | [MP4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e98de8e22e54556b/base-narrow-light-recording.mp4) | 00:24:31.128 | 306.151s | scrollBaseline 2.552, overwrite 7.663, submit 7.907, completed 285.204, expand 292.633, closed 306.05 | Final proof audit locates stale R5 at approximately 291s; use settled still |
| base / narrow-light / gallery | [MP4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/199c2938c50db265/base-narrow-light-gallery-recording.mp4) | 00:39:51.735 | 12.011s | landscapeOpen 0.513, landscapeNext 1.852, landscapeClosed 5.257, vectorOpen 6.005, vectorNext 7.637, vectorClosed 10.958 | PNG and SVG open → next → close; link href diagnostic only, not clicked navigation proof |
| base / narrow-light / stream | [MP4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/661e327d85b21f98/base-narrow-light-stream-recording.mp4) | 00:41:58.424 | 7.012s | submit 0.093, complete 5.602 | W3 unverified: only completed streaming:false event; no observed image insertion on head |
| base / narrow-dark / overwrite | [MP4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4d79e79da85480e0/base-narrow-dark-recording.mp4) | 00:31:52.543 | 16.134s | scrollBaseline 2.19, overwrite 4.511, submit 4.608, completed 10.345, expand 12.397, closed 15.631 | R5 endpoint and expansion visible in sampled frames |
| base / narrow-dark / gallery | [MP4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2bd189652aa07554/base-narrow-dark-gallery-recording.mp4) | 00:40:04.783 | 10.093s | landscapeOpen 0.383, landscapeNext 1.822, landscapeClosed 3.912, vectorOpen 4.465, vectorNext 7.188, vectorClosed 9.635 | PNG and SVG open → next → close; link href diagnostic only, not clicked navigation proof |
| base / narrow-dark / stream | [MP4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7dfbf43d5663e4b9/base-narrow-dark-stream-recording.mp4) | 00:42:08.582 | 6.717s | submit 0.086, complete 5.65 | W3 unverified: only completed streaming:false event; no observed image insertion on head |
| head / wide-light / overwrite | [MP4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a93db80bedc86198/head-wide-light-recording.mp4) | 00:19:12.737 | 14.452s | scrollBaseline 2.411, overwrite 4.781, submit 4.933, completed 8.779, expand 10.789, closed 13.408 | Final proof audit confirms yellow R5 in later frames; short contact-sheet samples missed it |
| head / wide-light / gallery | [MP4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/347c6d2389494ff8/head-wide-light-gallery-recording.mp4) | 00:40:18.881 | 11.936s | landscapeOpen 0.708, landscapeNext 2.742, landscapeClosed 5.942, vectorOpen 6.707, vectorNext 8.313, vectorClosed 11.324 | PNG and SVG open → next → close; link href diagnostic only, not clicked navigation proof |
| head / wide-light / stream | [MP4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6cf03f33ac4a01e2/head-wide-light-stream-recording.mp4) | 00:42:19.184 | 8.333s | submit 0.144, complete 6.018 | W3 unverified: only completed streaming:false event; no observed image insertion on head |
| head / wide-dark / overwrite | [MP4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6a35ac2bd2143bfb/head-wide-dark-recording.mp4) | 00:20:15.604 | 13.283s | scrollBaseline 2.283, overwrite 4.693, submit 4.782, completed 8.386, expand 10.183, closed 12.778 | R5 endpoint and expansion visible in sampled frames |
| head / wide-dark / gallery | [MP4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c61ebee3dc15bf7d/head-wide-dark-gallery-recording.mp4) | 00:40:33.226 | 15.528s | landscapeOpen 4.64, landscapeNext 6.752, landscapeClosed 9.495, vectorOpen 10.058, vectorNext 11.797, vectorClosed 14.72 | PNG and SVG open → next → close; link href diagnostic only, not clicked navigation proof |
| head / wide-dark / stream | [MP4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a1839b79da7bb3af/head-wide-dark-stream-recording.mp4) | 00:42:30.389 | 8.837s | submit 0.143, complete 7.234 | W3 unverified: only completed streaming:false event; no observed image insertion on head |
| head / narrow-light / overwrite | [MP4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1e9421224a3dd38c/head-narrow-light-recording.mp4) | 00:22:25.364 | 12.667s | scrollBaseline 2.18, overwrite 4.516, submit 4.616, completed 8.063, expand 10.177, closed 12.513 | R5 endpoint and expansion visible in sampled frames |
| head / narrow-light / gallery | [MP4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6b167d38b9a568e4/head-narrow-light-gallery-recording.mp4) | 00:40:50.062 | 10.885s | landscapeOpen 0.354, landscapeNext 1.657, landscapeClosed 3.917, vectorOpen 4.425, vectorNext 5.757, vectorClosed 8.203 | PNG and SVG open → next → close; link href diagnostic only, not clicked navigation proof |
| head / narrow-light / stream | [MP4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/16ccba8954e33006/head-narrow-light-stream-recording.mp4) | 00:42:40.707 | 6.488s | submit 0.248, complete 5.503 | W3 unverified: only completed streaming:false event; no observed image insertion on head |
| head / narrow-dark / overwrite | [MP4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e4338d9ea76d84cc/head-narrow-dark-recording.mp4) | 00:22:51.240 | 13.167s | scrollBaseline 2.213, overwrite 4.79, submit 5.01, completed 8.846, expand 10.371, closed 12.845 | R5 endpoint and expansion visible in sampled frames |
| head / narrow-dark / gallery | [MP4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a699593c19d9fcf2/head-narrow-dark-gallery-recording.mp4) | 00:41:02.864 | 11.925s | landscapeOpen 0.859, landscapeNext 2.306, landscapeClosed 5.022, vectorOpen 5.48, vectorNext 8.926, vectorClosed 11.286 | PNG and SVG open → next → close; link href diagnostic only, not clicked navigation proof |
| head / narrow-dark / stream | [MP4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/18544f980a1c896e/head-narrow-dark-stream-recording.mp4) | 00:42:48.573 | 10.222s | submit 0.123, complete 5.243 | W3 unverified: only completed streaming:false event; no observed image insertion on head |

Review sheets were regenerated during packaging directly from the current final `*-recording.mp4` files (sampled 0%, 35%, 70%, 95%; not edited recordings). Old `*-contact.png` files are excluded from publication because one was stale. Sheets are sampling aids, not a claim that every intervening frame was inspected.

[Current recording review sheet 1](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bfb1e9bb8965b7ae/review-0.jpg)

[Current recording review sheet 2](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c786a821025658eb/review-1.jpg)

[Current recording review sheet 3](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f5d33ca63dc476c8/review-2.jpg)

[Current recording review sheet 4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ea5a8aa9905359f8/review-3.jpg)

### Honest matrix result

| Row | Result | Evidence and remaining gap |
|---|---|---|
| W1 | Supported in all four web cells | Final proof audit inspected actual MP4s and confirmed stale base R5 / fresh head R5 in all four cells, including later head wide-light frames. Base narrow-light decisive at approximately 291s; use settled endpoint. Short contact-sheet sampling initially missed the wide-light result. Attempted repeat failed transport but is not needed for existing recording proof. |
| W2 | Partial | PNG, tall/inline/file URL/relative source and SVG boards in four cells. SVG fragment source renders, but clipping semantics not independently established. No authored-size/spaced/encoded supplement capture. Wide still dimension discrepancy remains. |
| W3 | Unverified | Eight attempted streamed-reply recordings exist. All metadata only reports a final streaming:false event; head image observations are empty. No independent chunk-by-chunk stability/flicker proof. |
| W4 | Unverified | No file-preview workspace mutation or reconnect recovery recording. |
| W5 | Partial | Four-cell base/head PNG/SVG open, next, close recordings. Separate static gallery board does not establish all post-R5 reauthorization/reopen paths. Linked href retained diagnostically, not clicked. Full linked-image click semantics remain unproven. |
| W6 | Partial static only | Missing/blocked placeholders on boards. No permission-restricted session, deterministic loading, disconnection or recovery proof. |
| W7 | Unverified | User/plan/reasoning/tool/file-preview/PR/attachment undefined-revision control board not captured. |
| W8 | Partial | Blocked/missing and direct-data fallback visible. Direct data is unavailable on both sides, not a successful direct-image control; GitHub/context-reference paths not verified. |
| N1–N4 | Unverified | Both iOS EAS builds failed GhosttyKit; no iOS screenshots or interaction proof, no retry. Android unavailable. Browser at 390 is not native evidence. |
| E1 | Partial diagnostic | Head createUrl observations have only resource input and hasRevision:false (1/2/3/4 calls for wide-light/wide-dark/narrow-light/narrow-dark). No remote host-local fallback, environment-separated-cache or relay/tunnel proof. Empty base RPC observations are not positive exclusion proof. |
| X1 | Excluded | Video media playback intentionally outside scope; evidence MP4s document image behavior. |
| Desktop | Unverified | No Electron client verification available. Shared web source is not desktop proof. |

### Supplement after merge and fixture commit

The primary agent independently reported a real-app no-reload check at [e76c41919d](https://git.cafe/pingdotgg/t3code/commit/e76c41919d5dc466d8c2091211e9746689bb2d7d) on a 1280×800 browser: four loaded yellow images stayed yellow after same-path overwrite to RGB(208,0,208); a new Claude reply rendered magenta. The prompt itself also embeds magenta, so six elements represent four old replies, a user prompt and a new assistant reply. This is a supplemental still/pixel transcript, not paired-base evidence or a recording and separate from the paired recordings.

[Primary check transcript](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a2beb04b55cfa51b/primary-integrated-check.json)

![Supplement: old yellow reply, magenta user prompt, and new magenta assistant reply](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f66451dab1c8d68b/browser-screenshot-localhost-mvitrk4w-c243fb0c.png)

Model and harness: Claude Opus 5.5 through the Claude harness (implementation); GPT-6.1-Sol through the Codex harness (triage, proof and PR), both models reviewed.


## Evidence

> **Supersedes** the earlier Verification, recordings, paired-endpoint and matrix sections above for the web rows they cover (W1, E1, and reply-1/reload/thread-switch behaviour). Those sections are kept unedited for the record. This round ran on 2026-10-22 against before = main [8d3b061121](https://git.cafe/pingdotgg/t3code/commit/8d3b061121fe65669d5d43d011b48cd3027a4108) and after = head [f7082eceb](https://git.cafe/pingdotgg/t3code/commit/f7082ecebb44b72cff641b6ff381b83fad5d7111). It used the real web app in headless Chromium driven by Playwright, with an isolated `--home-dir` and synthetic data only. Replies came from real Claude Haiku 5.5 turns. The image was overwritten in place (same inode), and reply 2 mounted 10.3 s (before) and 10.1 s (after) after reply 1's image loaded, inside the 5-minute query stale window.

Recordings, where an on-page overlay names the side, the SHA, the row and the elapsed time: [before.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2064b6a864bfb5e0/base-run.mp4) · [after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/895f2fb25122470d/head-run.mp4)

| Row | Scenario | Before (main) | After (head) | Stills |
|---|---|---|---|---|
| M1 | Reply 1 shows local `chart.png` | BLUE | BLUE | [before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f6a8c75ef45600a6/base-W-M1.png) / [after](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2e0b8a308c1616eb/head-W-M1.png) |
| M2 | Overwrite in place to YELLOW; new reply 2 embeds the same path, no reload | **BLUE (stale)** | **YELLOW** | [before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8292106ccf6a6dfd/base-W-M2.png) / [after](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0688894a7787a070/head-W-M2.png) |
| M3 | Reply 1 after the overwrite, same frame (expected BLUE on both sides: its cached URL is reused) | BLUE | BLUE | same as M2 |
| M5 | Switch to another thread and back, no reload | BLUE / BLUE | BLUE / YELLOW | [before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d724b4d5f6684e30/base-W-M5.png) / [after](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f748318ce6957bb4/head-W-M5.png) |
| M4 | Full reload | YELLOW / YELLOW | YELLOW / YELLOW | [before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8947f50f0c54a17a/base-W-M4.png) / [after](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0ba0871133ec3b2f/head-W-M4.png) |
| M6 | `assets.createUrl` WebSocket frames before the reload | 1 call (both replies share one signed URL) | 2 calls, one per reply. No `cacheRevision` in any frame. Payload is exactly `{"resource":{"_tag":"media-file",threadId,path}}` | [before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a08d0fea3d27234e/base-createUrl.json) / [after](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3bd99224b81edee1/head-createUrl.json) |

Colours are sampled RGB of each rendered image: BLUE (18,97,232), YELLOW (255,225,0). Readouts: [before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c83f045dbbebea55/base-pixels.json) / [after](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bdf084fee8d11deb/head-pixels.json).

M2 endpoint, 1440×900 light. Before: reply 2 is stale BLUE.

![Before, 1440 light: reply 2 still shows the old BLUE image after the file was overwritten](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/02f627ca420a844a/base-still-1440-light.png)

After: reply 2 is YELLOW and reply 1 stays BLUE.

![After, 1440 light: reply 2 shows the new YELLOW image while reply 1 keeps BLUE](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/53d063d9dfd51b9c/head-still-1440-light.png)

M2 endpoint, 390×844 dark: [before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/82a1365571d16751/base-still-390-dark.png) / [after](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/86d0f5c8c3cbd72f/head-still-390-dark.png)

- **Driver:** [driver.mjs](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3051b1ae64cd6014/driver.mjs), sha256 `23d8d8ee7d697d1e0420c53b037dfa4e0e46b5a5d30d749238e9743804487ed7`. Image helper: [mkimg.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/11e2987aaf8c8448/mkimg.py).
- **What else changed:** [what-else-changed.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/efbf08e46e4e3034/what-else-changed.md). The head forks from ed9b7ca9c5, and main is 39 commits ahead of it. `http.ts`, `ChatMarkdownMedia.tsx` and `assetUrls.ts` are identical between the two. The `fileRevision` that main adds ([#23106](https://github.com/pingdotgg/t3code/pull/23106)) is not read on the chat image path. Even with that change, main still shows the stale image.
- **Not covered:**
  - **Mobile (iOS/Android) is unverified.** T3 device tools are disabled on the evidence host, and the EAS simulator cannot reach the dev server.
  - **Desktop (Electron) is unverified.** No Electron client was available.
  - Overwriting an image partway through a single streamed reply is out of scope, as stated above.

<details><summary>Verification log</summary>

- 2026-10-22, round 2, evidence-only, on host fs-08, all steps on Claude Opus 5.5 subagents:
  - **Proof matrix from the code:** [matrix.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d987ef5d8ff697ec/matrix.md). This pass established the 5-minute stale-window constraint on the before-side repro.
  - **Web capture:** expected and observed matched on every row.
  - **Independent audit:** [report.md](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/f4e1f430c280877e/report.md), **VERDICT: SUFFICIENT (web)**. The audit re-extracted frames from both MP4s and recomputed the M2 reply-2 colour from the raw crops. It recounted the createUrl frames and checked for `cacheRevision` in the raw WebSocket logs. It confirmed the server SHAs, the driver sha256 and that all 21 upload URLs resolve, with the MP4s byte-identical to the local files.
- No commits, pushes or labels.

</details>

