# Proof audit pass 2 — mobile Mermaid

Issue [#24223](https://git.cafe/pingdotgg/t3code/issues/24223). Audited final [ca1d44b14e](https://git.cafe/pingdotgg/t3code/commit/ca1d44b14e017e01c0e219c088db6e50dc7afa08) against actual merged base [bfc7177f9f](https://git.cafe/pingdotgg/t3code/commit/bfc7177f9f54b0a4b9d3571d30723a51cd4b31bd). Scope: evidence sufficiency against the pass-1 matrix, not merge approval or a replacement full code review.

The core Android portrait appearance is demonstrated. Assistant, proposed-plan and both reasoning callers render centered compact diagrams; invalid source remains native code between valid graphs. I found no internal blank gap remaining in the small graph. The evidence does not complete the entire matrix, especially live streaming, platform/width coverage, controlled failures, or offscreen recycling. These are proof limits, not observed failures or requests to add unrelated features.

## Provenance and independent rebuild

Read the final seven-file diff: mobile dependency and lock entry, MermaidDiagram, ThreadFeed integration, splitter and tests, and lint allowlist. No contracts, provider adapters, server behavior, web or desktop implementation changed. The assistant Markdown integration also reaches proposed-plan and reasoning callers; user-message Markdown remains separate. Parser tests describe extraction/guards/reference context, but cannot establish native WebView appearance or live lifecycle behavior.

Authoritative [uploaded evidence index](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8c5d112b3e21a930/index.md) was also read and audited; its row 2 original-fences wording exceeds what the tiny clipboard preview independently proves, and its 12-row wording includes reused row 15 rather than 12 seed threads. Delivered files are in `/tmp/issue-24223-03db-evidence`; its historical directory name is not a commit identifier. Supplied report identifies final captures at 07:36–07:44 UTC and fresh actual-base captures at 07:46–07:47 UTC on 2026-10-26. Old baseline material outside this set is not core proof here. I read the projection-only fixture script and driver, report, numerical differences, upload index and PR draft. Synthetic stopped projection fixtures establish rendering, not coherent orchestration/event streaming.

I independently used only the existing Android real-client session `issue-24223-final`, existing backend 13773 with isolated home `/tmp/t3-issue-24223-runtime`, and Metro 8081. No new server, checkout, database write or device lease. Primary subsequently confirmed Metro stopped and device closed. I navigated from the thread list into Proof 01 assistant widths in dark mode and captured `/tmp/issue-24223-audit-rebuild.png` using `--normalize-status-bar`. Immediately after navigation the accessibility snapshot still contained the raw-code lazy-load fallback; the settled screenshot displayed both diagrams. This observation is not a recorded live-stream transition.

The rebuild is **pixel-identical** to final `after-01-dark-a.png`: 1080×2424 RGB, 0 changed pixels, 0 pixels over 16/255, maximum channel delta 0. The independently generated Diff0 amplified 4× is completely black. I informed the primary immediately after capture that the runtime/device were no longer needed by this audit.

Known environment: native Android pooled phone/emulator, portrait 1080×2424 physical pixels, T3 Code Dev, backend displayed as fs-19. Supplied native fingerprint is 0328f4ec326e7e4bf1bf87625118f3ff2f7a18d7. Device model, Android/API version, logical density and exact content dp were not independently measured. OS clock was **not frozen**: still status bars are normalized to 9:41; recordings show actual capture-time clocks and occasional normalized still chrome. This is not proof of stability under clock changes.

## Images, differences and recordings

I visually opened a contact-sheet representation of every distinct delivered baseline/final a-image and all eight before/after maps, plus full-size affected final images and the independent rebuild/delta. I independently recomputed all 22 numerical comparisons: the 18 a/b still pairs are exactly equal in RGB, and the four before/after counts agree with the report. Exact equality means inspecting each a-image also inspects its b-image content. Still pairs show stability only over their capture interval, not an animation/performance guarantee.

|Before/after comparison|Changed pixels|Pixels with maximum channel delta >16/255|
|---|---:|---:|
|01 dark|476,103|67,292|
|01 light|553,229|73,994|
|02 dark|129,775|54,294|
|07 dark|607,473|55,658|

Maps use full native frames with no alignment, crop or rescale. Diff0 amplifies nonzero absolute channel differences 4× with saturation; Diff16 keeps raw deltas above the threshold. Different content height legitimately moves headings/prose; subtraction cannot alone establish a defect. Large space above short conversations is existing bottom-aligned feed positioning. It is not the now-fixed internal diagram gap.

I opened all five recording review sheets (16 evenly spaced samples where available), independently extracted and opened a full-size sample from every recording, and checked recording metadata:

- Theme/re-entry: 36.906 s, 242 encoded frames; dark→light→dark and navigation away are visible. It does not establish offscreen recycling or an exact return scroll position.
- Plan controls: 11.587 s, 74 frames; copy feedback/Android preview and save dialog appear. Preview alone does not verify complete Markdown fences or clipboard bytes. No save-file byte comparison.
- Reasoning: 49.038 s, 261 frames; lone row expands and internally scrolls, then actual Thought (×2) group expands and scrolls to its second graph/tail. These samples do not exhaust every parent/nested gesture boundary.
- Reference link: 7.931 s, 57 frames; Guide launches Chrome onboarding and returns. Destination page content is not verified.
- Diagram gestures: **one encoded frame, zero video duration**. It cannot prove motion, drag passthrough or continuous non-navigation. Static unchanged screen plus command telemetry is weaker evidence than a functioning gesture recording.

## Matrix assessment

“Supported” below is limited to the stated observations, not every original subclaim.

|Row|Supported evidence and limits|
|---|---|
|1 assistant widths/themes|Supported in portrait light/dark: two graphs, surrounding prose/list/ordinary code in order, compact small intrinsic size, wide four-node graph within content. Wide labels are small but visible at native size. Theme switching recorded. Landscape/independent wider viewport and exact dp absent; full width matrix incomplete.|
|2 proposed plan|Supported dark portrait: one title, graphs within padded card, checklist and copy/save controls accessible, save dialog opens. Clipboard bytes/original complete fences and saved contents unverified; do not claim these passed from the preview.|
|3 lone reasoning|Supported expanded wide graph and nested scroll into later paragraphs. No complete copy/parent-boundary proof.|
|4 grouped reasoning|Supported actual two-item group, first wide graph, second small graph, subsequent tail and internal scrolling. No exhaustive parent/nested boundary proof.|
|5 assistant streaming|Insufficient: no real command/event open→closed transition, later append or feed settling recording. Parser snapshot test is not native streaming proof.|
|6 plan streaming|Insufficient: same missing live transition in padded card.|
|7 invalid fallback|Supported settled invalid native code with language and wrap/copy controls between valid diagrams, no hole/crash. Selection/copy interaction unverified.|
|8 import/dimension guards|Source-audited successful import/pending fallback and guards; independent initial snapshot observed pending raw code. Import rejection and <=0 size were not induced. No claim these faults passed runtime.|
|9 fence variants|Supported four graphs and trailing text across top/bottom captures; fixture contains uppercase Mermaid, tilde/long closer/CRLF, info suffix and consecutive graphs. Exact parser offsets rely on tests.|
|10 non-extracted controls|Supported empty, two-space-indented, nested, inline, Python and open fences as native Markdown/code. One-/three-space variants not independently seeded. These are scope controls, not support for indented diagram rendering.|
|11 Markdown context|Supported reference Guide styling and actual external-app launch plus list numbering 1→2 and tail. Cross-segment reference definitions have a source fix/test. External destination body unverified due to Chrome onboarding.|
|12 adjacent artifacts/media|Supported artifact card, prose, diagram, file chip, tail ordering. No image/skill fixture or template/chip action; source preserves handler forwarding but runtime behavior not proven.|
|13 user/plain controls|Supported user Mermaid remains native code and plain assistant remains text. No import instrumentation; lazy import is a source claim.|
|14 labels/navigation/gestures|HTML-looking label renders **bold HTML label**, not literal escaped tags. Do not claim literal escaping; fixture prose/title are descriptive input, not proof. Links/images are disabled in renderer options by source; no image/network instrumentation. One-frame video cannot prove gesture passthrough.|
|15 lifecycle/accessibility|Supported mounted theme refresh and accessibility snapshot image label “Mermaid diagram”. No screen-reader session, actual offscreen recycling, exact return-position or lifecycle-motion proof.|

There are **11 distinct seeded fixture threads**. Row 15 reuses row 1, so wording such as “12 matrix rows have some evidence” must not become “12 distinct fixtures” or “12 complete passes”. iOS is unverified; shared TS logic does not substitute for its WebView engine. The current draft correctly leaves evidence/check placeholders pending and should not be presented as ready until replaced. This audit did not run tests or certify CI.

The narrow claim “the seeded completed Android portrait assistant/plan/reasoning Mermaid now renders, with invalid-source native fallback” is sufficient. A claim that all mobile behavior or the complete pass-1 matrix is verified is insufficient. Missing landscape/iOS/streaming/fault coverage can be disclosed explicitly; this report does not demand a new feature or broad platform expansion.

## FRICTION

Initial independent accessibility snapshot briefly showed lazy-load raw code before the settled pixel-identical result. Existing runtime reload coordination was required but no new runtime was created. Supplied capture history reports intermittent pool transport failures and rejected unsettled screenshots; accepted pairs were independently recomputed. Model/API/density details remain unknown. Initial ghdrop upload of this audit failed with a transport error; no forge state was changed. Sampled recordings cannot rule out every transient; the gestures artifact has no motion frames. No source edit, push, forge comment, merge, watch, checkout, server start/stop or live-state write by this audit. Existing untracked app.json preserved. Used the test-t3-mobile runbook and ghdrop skill for the authorized independent capture/report upload.

VERDICT: INSUFFICIENT rows 1 (landscape/width), 2 (clipboard bytes), 5–6 (live streaming), 8 (controlled failures), 12 (media/actions), 14 (network/gestures/literal-escaping claim), 15 (recycling/screen reader); Android portrait core appearance is sufficient as scoped above.
