# Proof audit, pass 1 — capture fixture matrix

Target only: [#25761](https://git.cafe/pingdotgg/t3code/pull/25761) ([GitHub mirror #25761](https://github.com/pingdotgg/t3code/pull/25761)), fork [Bil0000/t3code](https://github.com/Bil0000/t3code), branch `t3/speed-up-pr-loading-1`, local `pr-25761`. Reviewed head [e39f603334](https://github.com/pingdotgg/t3code/commit/e39f603334941501836836083a3ef70e9dff24a3), diff `origin/main...e39f603334`; local main ref [60aec28a9c](https://github.com/pingdotgg/t3code/commit/60aec28a9c6fdb7417a7382ec094ccc4984d0738). Audit started 2026-11-02 21:22 UTC, 45-minute ceiling. This is a read-only source-derived capture plan, not visual verification, benchmark results, or a merge-readiness verdict. No browser, native client, server, emulator, test repository or mutation was started by this auditor. Tests were read, not rerun.

## Findings first

1. **All affected evidence is missing.** No before/after recordings, live request transcripts, desktop pass or native pass exists in this audit. CI/unit assertions cannot establish action-to-UI timing. Every affected row below is NOT CAPTURED. A still is insufficient for every row marked recording.
2. **Source-visible exception to “every reader at once”: modern thread snapshots are a different path.** `ThreadPullRequestsPanel.LinkRow` calls `PullRequestSpeedActions` without `onActed`; it renders `link.snapshot`. `useLinkedThreadPullRequest` returns modern snapshot status before the linked-summary value, `RightPanelTabs` prefers linked snapshots, and mobile `resolveThreadPrSource` skips the summary atom when modern links have a presentation. This diff patches query atoms, not thread shell snapshots. Record B12 and B19 with snapshot rereads held: they cannot be certified by a detail-panel or legacy-summary recording. This is a source-confirmed coverage/scope gap; observed live delay and severity remain unverified.
3. **The request-count claim needs a precise boundary.** The server still publishes its ordinary refresh revision before returning the action result. Mounted readers may reread from that stream. Web update-branch explicitly invalidates/refreshes; reopening and a changed head trigger a detail reread; an in-flight/no-value reader can restart. A successful merge skips confirmation only when its reply already has `state=merged` AND non-null `mergedAt`. Do not label an entire live action “zero reads” from an atom-only test.
4. **Host coverage is unequal.** GitHub identity/API access, GitCafe PR read access, and GitLab authenticated API access were verified. Owner-repo creation/write permissions and advanced settings were not exercised. No authenticated writable Azure DevOps, Bitbucket, or Forgejo host/repository was established; these live rows are unavailable on this VM until such a target is supplied. This does not claim their public websites are network-unreachable. Queue-specific and deterministic race/error rows need labelled harness captures even on reachable hosts.
5. **Reference shapes must be included.** Patching deliberately requires matching environment, project, host presence/value (case-insensitive), repository, number and expectedAccountId. Actual branch/composer readers often omit host while list/URL readers provide it. Account-scoped replies never patch unscoped lists. C13 must show both genuine cross-host isolation and what happens to these natural caller combinations; “same PR number” alone is inadequate evidence.

## Capture contract and minimum viewport × theme set

`A` = changed behaviour directly affected by this diff. `G` = existing conditional/layout guard through a touched reader/caller, retained to bound regression coverage. Both are uncaptured. All rows are recording rows because they involve an action, an interaction, an arrival order, paging or a changing connection/theme/width. A chaptered recording can cover several row IDs only if its chapters identify each row's complete initial data, action and final state. Multi-stage rows explicitly reuse already named A-fixture states; they do not require an unbounded Cartesian product.

Profiles specify the minimum combinations, not a promise the VM already has that client:

| Profile | Real surface and viewport | Theme |
|---|---|---|
| W-D / W-L | Web, 1440×1000; page detail about 640 px; thread details/right panel about 360–420 px | dark / light |
| N-D / N-L | Web, 390×844; also shrink the thread/detail container to its supported narrow width | dark / light |
| E-D / E-L | Actual Electron client, content viewport 1440×1000; local then remote connection | dark / light |
| I-D / I-L | Actual iOS client, logical viewport about 393×852; record actual model/insets | dark / light |
| A-D / A-L | Actual Android client, logical viewport about 412×915; record actual model/insets | dark / light |
| T-L | Native split/sidebar layout, about 1024×1366 on an available tablet-sized iOS/Android client | light |

Use the profile combinations printed on each row. D06 covers the cross-theme/status/width guard; it is unnecessary to multiply every timing race by both themes when the output state/layout is already covered there. Both iOS and Android still need the changed action/list-hook paths. Desktop wraps web but D05 requires a real shell run; a Chromium viewport named desktop is not desktop evidence. If any profile/device cannot be obtained, mark the particular capture blocked instead of substituting silently.

For an actual before/after comparison, use the same named seed on main and head (separate disposable PRs for irreversible merges). Label videos **Before — main** and **After — e39f603334**. Identify app commit, viewport/theme, provider, route, initial ref, and action. Record from before confirmation/click, through pending, action reply, immediate UI state, necessary rereads, and settled state. Keep the acted reader and corroborating list/tab/badge visible, or show them sequentially while retained in the same client registry. Two separate browser sessions do not share reply patches.

Request evidence accompanies every A/F timing row: timestamped sanitized RPC method/target/response-kind log plus server/host operation counts, query names and cursors. Separate preflight permission/node/action-state reads, writes, server merge-confirmation reads, refresh-subscription reads, explicit UI refreshes, detail/head/permission rereads, activity/check/stack reads, and cold-start loads. Count per client/environment/reference. Baseline the already mounted readers before the action; do not count initial seeding as post-action traffic. For a causal no-reread proof, use labelled H gates on normal refreshes/reads and show the reply updates the real component before releasing those gates. Also perform the live path with refreshes enabled. A network waterfall alone cannot show host requests served behind the T3 server cache.

Expected controlled counts: direct same-head summary patch of loaded detail/preview/card/legacy linked summary/existing accepting list requires zero new metadata read *from the patch itself*. Missing accepting first page: one logical list refresh; cursor page: no guessed insertion. Undefined result: detail and both previews refresh; linked/list depend on refresh stream. Reopen/new-head: refresh loaded detail, show patch while waiting. Waiting/no-value readers can restart. Server merge confirmation: 0 only for complete merged reply, otherwise 1 attempt. GitHub checks: 0–100 contexts = 1 core, 0 continuations; 101–200 = 1 core, 1 continuation; cap = 1 core, at most 9 continuations. Reviewer-field refusal adds one failed core attempt. Other provider preflight/auth/lookups are not claimed to be zero.

## Seed recipes (plans only)

- **S0 — disposable owned repo and stopped thread.** Capturer creates a uniquely named throwaway repo under their authenticated account on the indicated forge, with main plus non-conflicting feature branches, 1/3/12 changed-file fixtures, short and deliberately long metadata, open ready/draft/closed and merged references. Use forge CLI/API on these owned fixtures only; never mutate the audited repository's PRs. Clone under a capturer-owned scratch/checkout, add it through the app's Add Project flow, create a stopped thread without starting an agent, and use isolated worktree `.t3` state. The app's live install/database must not be written. Explicit PR actions go through the app or its normal `pullRequests.runAction` command/RPC, not a host CLI used as the actor. Host CLI is for seeding and independent state checks.
- **W — real web/desktop route.** `/pull-requests?state=open&repository=OWNER/REPO&number=N&projectId=PROJECT&environmentId=ENV&selectedHost=HOST`, substituting ids obtained from the isolated app. Use `state=all|closed|merged`, `draft=only|hide`, `q`, involvement/author/check/review/label/project/host filters as indicated. For list caches, seed earlier scopes by visiting them; H can mount multiple real query atoms in the same registry with specific inputs. Thread route is `/{environmentId}/{threadId}`; open thread details, a PR right-panel tab, or the thread Pull Requests panel through the normal UI.
- **M — native route.** `PullRequest` screen with `{environmentId, projectId, repository, number, host?, initialSummary?}`. Enter through actual PR list, thread PR badge, or app navigation driver. Cover `initialSummary` present/absent and summary-only while detail pending. Full list is `PullRequestsScreen` in WorkspaceRootScreen; iOS root, Android root `renderFrame`, and Android sidebar/native primary-column paths are separate caller variants. Native menus/dialogs must be captured on iOS/Android, not RN-web.
- **S1 — auto-merge/queued fixture.** On an owned GitHub repo allow auto-merge and configure an owned required check/context; leave it pending to arm auto-merge, then satisfy it for immediate-merge control. Merge queue itself may require an unavailable organization/plan: use H for queue semantics unless the capturer proves the owned target supports it. On an owned GitLab project use a pending CI pipeline with permitted automatic merge, then cancel it through the app. Advanced-feature inability is a labelled seed limitation, not a successful fallback capture.
- **S2 — branch update/conflict fixture.** Advance main after opening the feature PR; choose non-conflicting files for update-by-merge/rebase and intentionally conflicting files for conflict UI. Open files/code/inline review first, mark a file viewed, and hold detail after action when measuring order. Use method capability actually advertised by that host. Do not create artificial real-host conflicts on a maintainer PR.
- **S3 — linked/preview fixture.** Link owned PRs to the stopped thread with the app's Link pull request flow (`thread.pull-request.link` via normal orchestration dispatch if driving RPC). Wait for its snapshot before acting, unless the row calls for snapshot=null. Put PR URLs in a local draft/message using normal compose UI, add a PR context chip, open markdown/chip hover cards, and show sidebar/search/command-palette readers. Legacy shell shapes require H rather than editing a live database. Register enough linked PRs to exercise `Show N more`, multiple badges and chains.
- **S4 — stack fixture.** An owned GitCafe native stack of 2–3 feature layers, expected heads known; act through an intermediate layer so an upper layer stays open. Stack action result remains void on all hosts. Exact partial failure should be H unless safely inducible in owned repos.
- **S5 — pagination fixture.** Populate more rows than the configured page size and use Load more/scroll-to-load. For deterministic proof, H supplies contract-valid first and continuation pages with an acted row exclusively beyond the head. A live huge repo is not required just to manufacture page counts. Mobile must exercise `pullRequestListPagesFamily`, not only the cursor query atom.
- **S6 — compatibility/connections fixture.** Two isolated environments/clients, with app Connections routing permission settings. Keep writer/reader identities explicit. Pair remote client normally; never bake localhost origins or consume a maintainer pairing token. Old server/Void decode and denied destination can be a protocol harness. MCP/agent-origin actions on the fixture must call the same service path and show untouched clients updating by subscription.
- **H — labelled harness capture.** Mount the actual changed components/hooks/query families with contract-valid detail/list/preview/provider payloads and the production `runAction` path at the relevant boundary. Gate replies and reads with explicit signals/Deferred; do not fake final CSS/HTML or replace the whole component with a lookalike. Provider-only decoder/count fixtures additionally feed real raw host envelopes/stdout (not just prebuilt summaries). Clearly label H on screen and in filename; it proves that branch, not live host authentication or host reply shape. Drivers/captures use a new timestamped run directory under the capturer's one scratch root. This auditor has not implemented these drivers.

## Forge seedability and exact action coverage

| Forge | Live seed on this VM | Reply path changed | Fallback path that must remain visible |
|---|---|---|---|
| GitHub (GH) | Authenticated API identity verified; owned repo feasible, write/settings not exercised | merge, enable/disable auto-merge, ready, draft, close, reopen, update-branch GraphQL summary fragment | null/missing/DecodeError result; no-op update; delete/revert/workflow approvals; queue/merge still open; stack void |
| GitCafe (GC) | Authenticated PR/API read verified; owned repo feasible, creation not exercised | ready, draft, close, reopen JSON reply; omits unknown totals/conflict; head SHA only when present | single merge and every stack action void; malformed reply; no auto-merge claim |
| GitLab (GL) | Auth status and authenticated `GET user` verified; owned project feasible, write/settings not exercised | disable-auto-merge API reply only; stripped default zero totals | other supported actions through `glab mr` prose remain void; unavailable auto-merge feature becomes labelled H |
| Azure DevOps (ADO) | **Unavailable live:** no authenticated org/project/repo established; `az` absent from PATH | supported lifecycle/auto actions decode `az repos pr update` JSON | empty/malformed JSON void; only advertise methods/actions in actual capability set; H F16/F11 |
| Bitbucket (BB) | **Unavailable live:** no authenticated writable workspace/repo established | merge and close/decline synchronous PR body; time/conflict/totals omitted | asynchronous merge task or undecodable body void; H A05/A03/F14/F11 |
| Forgejo (FJ) | **Unavailable live:** no authenticated instance/repo established | close/reopen PATCH PR; unknown mergeability omitted | merge/update empty body void; H F15/F11 |

`H only` never means a live host was tested. Public-site network access is not sufficient to seed authenticated action rows. GH/GC/GL can seed the lifecycle data across most rows; exact timing, malformed payloads, identity collisions, absent optional fields, permission races and page inconsistencies are deterministic harness rows regardless of credentials. GH check-pagination rows are GitHub-specific, not seeded on GC/GL.

## Fixture matrix

Every row is pending. The forge and profile cells are part of the capture minimum; the expected-observation cell defines what the video/transcript must demonstrate. `H` suffix denotes a harness, and “void control” is intentionally the fallback variant of the same visual fixture, not evidence of reply optimization.

| ID | Named fixture / data needed | Diff | Evidence | Minimum viewport × theme | Forge seed | App seed / driver | Observable assertion + request evidence | Status |
|---|---|---|---|---|---|---|---|---|
| A01 | Draft becomes ready — Open draft; write+ready allowed; same head; 1 file; no checks; loaded detail/list/preview/summary. | A | recording | W-D, I-D, A-D | GH, GC; GL void control; ADO H | S0+W page action; M footer and status menu. | Ready/open glyph and primary action change on reply; no explicit success-path detail reread. Activity/stack reads remain separate. | NOT CAPTURED |
| A02 | Ready becomes draft — Open ready; no conflicts; passing checks; 3 files; draft action permitted. | A | recording | W-D, I-D, A-D | GH, GC; GL void control; ADO H | S0+W header menu; M status menu. | Draft glyph/status; merge control replaced/disabled; draft-only/hide lists obey filter. | NOT CAPTURED |
| A03 | Close with siblings — 3 open rows; acted row selected; open-state list; watched and un-watched references mounted. | A | recording | W-D, I-D, A-D | GH, GC; GL void control; ADO/BB/FJ H | S0+W close menu; M status menu/Android toolbar. | Reply closes detail; list 3→2; selected panel survives removal; status-dependent actions change; no false merged state. | NOT CAPTURED |
| A04 | Reopen with missing branch permissions — Closed row retained in detail; source branch exists; closed-list row, open-list initially absent; gate fresh detail answer. | A | recording | W-D, I-D, A-D | GH, GC; GL void control; ADO/FJ H | S0+W reopen; M footer reopen; H gate for causal ordering. | Open state appears BEFORE detail reread settles; one logical detail refresh obtains branch/permissions; open list rereads to place row, closed list drops it. | NOT CAPTURED |
| A05 | Confirmed merge with merge time — Open ready mergeable; no stack; merge reply state=merged and mergedAt non-null; all-state list. | A | recording | W-L, I-L, A-L | GH; GC/GL void controls; ADO/BB H | S0+W merge/method choice; M footer confirm. | Merged glyph/footer, no remaining merge action; server extra merge-confirmation summary reads=0; published merge uses host time. | NOT CAPTURED |
| A06 | Merge accepted but still open — Required check pending or merge queue; action=merge; reply open, optionally autoMergeEnabled=true. | A | recording | W-D, I-D, A-D | GH live for pending auto-merge; queue H; ADO H | S1 pending requirement; queue specifically H unless owned repo supports it. | Remain open/queued; never claim merged merely because action succeeded; server merge confirmation=1, no merged event unless independently confirmed. | NOT CAPTURED |
| A07 | Arm auto-merge, requirements pending — Open ready; pending required check/pipeline; method selected; autoMergeEnabled false→true. | A | recording | W-D, I-D, A-D | GH; GL void control; ADO H | S1+W auto-merge menu; M merge-options menu, confirm. | Auto-merge pending/armed label and method change from reply, still open. Enabling is distinct from action=merge. | NOT CAPTURED |
| A08 | Disarm auto-merge — Open armed auto-merge with a known method; reply autoMergeEnabled=false. | A | recording | W-D, I-D, A-D | GH, GL reply; ADO H | S1 arm first, then disable in W/M. | Armed label disappears; stale autoMergeMethod is removed; merge controls return; no counts erased. | NOT CAPTURED |
| A09 | Enable auto-merge merges immediately — Open ready; requirements already met; enable-auto-merge routes to MergePullRequest. | A | recording | W-D, I-D, A-D | GH; ADO H | S1 satisfy required check before enable action. | Show merged immediately, rather than an armed open PR; action label alone must not drive UI. | NOT CAPTURED |
| A10 | Update branch by merge, new head — Open behind base; known old SHA; 2 changed files, viewed marks, checks; updateMethod=merge; gate next detail. | A | recording | W-D, I-D, A-D | GH; GL void control; FJ H void | S2 advance base non-conflictingly; W expanded branch control; M Branch row. | Reply metadata appears first; branch data/permissions/head and viewed-file state become fresh after reread. Web deliberately also invalidates/refreshes from host. | NOT CAPTURED |
| A11 | Update branch by rebase, new head — Open behind base; updateMethod=rebase allowed; existing code/guide state; gate detail. | A | recording | W-D, I-D, A-D | GH; GL void control where supported | S2; W condensed header branch control; M Branch menu. | Same ordering as A10; new head does not silently keep old diff/viewed marks; rebase refusal gets correct error. | NOT CAPTURED |
| A12 | Update already-current branch — Branch not behind; provider action-state read says behindBy=0; success has undefined reply. | A | recording | W-D, I-D, A-D | GH; H for deterministic no-op | S0 current base; RPC action or enabled app control; H if UI correctly hides it. | No invented change; fallback detail read remains functional; no mutation on GitHub, still no failed action UI. | NOT CAPTURED |
| A13 | Comment then close — Open detail; comment composer has body; post succeeds, close succeeds. | A | recording | W-D | GH, GC; GL void control | W timeline comment-and-close, S0. | Comment remains visible; state and list update from reply; timeline activity refreshed; submit does not discard text prematurely. | NOT CAPTURED |
| A14 | Comment then reopen — Closed detail; comment body; post succeeds, reopen succeeds. | A | recording | W-D | GH, GC; GL void control | W timeline comment-and-reopen; S0. | Posted comment retained, immediate open state, then permissions reread; list return works. | NOT CAPTURED |
| A15 | State action rejected after optimistic list change — Open row selected in page; close/draft request is pending; reject host action (and a comment-then-close variant). | A | recording | W-D, I-D, A-D | GH/GC/GL live failure possible; H deterministic | H refusal at actual RPC boundary; optional owned-repo permission revocation. | Page sent override rolls back on failure; no reply patch or false success; toast/dialog shown; busy clears and retry works. Posted comment still refreshed if close fails. | NOT CAPTURED |
| A16 | Delete source branch, void reply — Closed/merged PR; source branch exists; delete permitted. | A | recording | W-D, I-D, A-D | GH; other hosts only if advertised | S0 disposable branch; W delete confirmation and M toolbar/menu. | Fallback detail refresh still clears branch-related controls; success notification; no invented summary. | NOT CAPTURED |
| A17 | Revert opens another change request, void reply — Merged PR; revert supported; old PR remains merged. | A | recording | W-D, I-D, A-D | GH/GL where advertised; otherwise H | S0 merged disposable PR; W/M revert menu. | Fallback refresh does not unmerge old PR; new revert notification/link appears according to existing host flow. | NOT CAPTURED |
| A18 | Approve workflows, void reply — Open cross-fork PR with workflowApprovalsRequired>0 and checks action-required. | A | recording | W-D, I-D, A-D | GH live conditional; H deterministic | H unless an owned fork workflow awaiting approval can safely be seeded. | Web explicit host refresh and mobile runtime fallback update checks/approval control; original state preserved. | NOT CAPTURED |
| B01 | Thread-details ready action — Draft, non-conflicting; long title wraps 2 lines; current PR plus 2 expanded linked rows. | A | recording | W-D | GH, GC; GL void control | S3 thread details; expand Show 2 more; act via Ready. | Ready/Marking→new icon/control in current and expanded rows; checks + branch-status refresh still occur, direct success detail refresh removed. | NOT CAPTURED |
| B02 | Thread-details merge action and watching — Ready; all checks passing; watching=true; selected default method differs from last-used; merge confirmation. | A | recording | W-D | GH; GC/GL void controls | S3+S0; thread details Merge, cancel once then confirm. | Merging→merged; watch control and trailing merge disappear as applicable; tooltip shows new state. Cancel makes no request. | NOT CAPTURED |
| B03 | Thread row conflict/check control branches — Open conflict (including draft+conflict), then open failing checks, pending checks, no checks; 0/1/many check rollups. | G | recording | W-D | GH live; GC/GL as capability allows; H | S3+S2 actual conflict; owned status checks; H for exact check combinations. | Resolve takes precedence over Ready; Fix for failures; pending suppresses merge; no-check state can merge; tooltips/popover retain counts through action reply. | NOT CAPTURED |
| B04 | Thread row without detail, with/without watch — Missing project/reference or server capability; first read pending or failed; persisted PR/status fallback; watch on then off. | G | recording | W-D | Any reachable host; H for null project/capability | H mounts actual ThreadDetailsPrRows with supplied data; S3 network gate for live pending/error. | Watched split row and plain fallback row remain usable; no bogus action/detail load; recovering read replaces fallback without a layout glitch. | NOT CAPTURED |
| B05 | Speed ready, quick actions change — Shift-only held; draft row shows Close+Ready; reply is ready. | A | recording | W-D | GH, GC; GL void control | W /pull-requests, Shift, Ready. | Busy spinner persists if Shift released in flight; new row shows Close+Merge after success; onActed receives reply. | NOT CAPTURED |
| B06 | Speed close removes final filtered row — Exactly 1 open row after filters; quick Close; panel open. | A | recording | W-D | GH, GC; GL void control | W state=open + owner fixture filter; Shift Close. | 1→0, correct filtered empty state, panel retained; no phantom row from page override or late list read. | NOT CAPTURED |
| B07 | Speed reopen from closed list — Exactly 1 closed row; source branch exists; current open list cache absent/empty. | A | recording | W-D | GH, GC; GL void control | W state=closed, Shift Reopen. | Reopen pending, row leaves closed list; opening open scope rereads/places it; no speculative order. | NOT CAPTURED |
| B08 | Speed merged row in all list — 3 all-state rows; oldest acted PR now has newest updatedAt; reply merged. | A | recording | W-D | GH; GC/GL void controls | W state=all, sort=updated, Shift Merge. | Row reorders by update time, becomes merged, quick action group disappears; selected row identity persists. | NOT CAPTURED |
| B09 | Speed queued merge stays open — Quick merge accepted with open reply; all/open scopes; later read can report merged. | A | recording | W-D | GH pending live; queue H | S1; W Shift Merge; H order late replies. | Reply-backed page override remains open; older queued reply cannot outrank a newer merged row. | NOT CAPTURED |
| B10 | Quick-action availability guard — Merged row/actions=[]; hostActions empty; no source-control grant; stacked row; other modifier with Shift; closing/sweeping. | G | recording | W-D | GH/GC/GL; H for capability permutations | W list with seeded capabilities/permissions via H; GC stack for real disabled merge. | No-action branch hidden, denied/stack merge disabled, Shift-only visibility correct, duplicate clicks ignored, close sweep only primary left pointer. | NOT CAPTURED |
| B11 | Close sweep batch, mixed outcomes — 4 open entries plus already closed row; 2 successes, 1 refusal, duplicate entry; selected and off-screen rows. | A | recording | W-D | GH/GC live successes; H mixed refusal | W Shift primary-pointer drag across rows; H refusal and gated replies; include drag-cancel. | Serialize within environment, each reply applied once; failed row remains; toast counts success/failure; sweeping UI clears; existing closed row not submitted. | NOT CAPTURED |
| B12 | Thread linked-list quick action (snapshot reader) — Modern thread.pullRequests snapshots; single non-stack PR open; LinkRow quick action supplies no onActed callback. | A | recording | W-D | GH, GC; GL void control | S3 open thread Pull Requests panel; Shift Close/Ready; H hold snapshot refresh. | Record whether row glyph/actions update at reply or only after server snapshot sync. Source shows no direct reply patch of this snapshot. A delayed read must not be reported as immediate coverage. | NOT CAPTURED |
| B13 | Detail caller, tabs and condensed chrome — Same PR in global page and thread right panel; summary/timeline/code/guide tabs retained; long title/branches; scroll header condensed. | A | recording | W-D, N-L | GH; GC/GL for supported tabs; H guide fixture | W global selected detail and /ENV/THREAD right panel. Repeat A01/A10 with each tab active; guide seeded once. | Both callers and each active/retained tab show new state; page-only links/overrides and thread composer target work; expanded and condensed branch controls refresh correctly. | NOT CAPTURED |
| B14 | Markdown live hover and preview read — PR URL in chat markdown; hover card already mounted; author with display name ≠ login; another loaded reader performs close. | A | recording | W-D | GH, GC, GL (reply availability differs) | S3 chat markdown link + W action in same registry (navigate retained surfaces or H driver). | Hover state/title/author patch from reply; click preview remains separate and click opens correct updated URL; modified click behaves normally. | NOT CAPTURED |
| B15 | Context-chip hover, narrow and missing author — PR context chip with fallback metadata; long repository/title/author; null author; ready/draft transition. | A | recording | N-L | GH/GC/GL; H exact null/length fixtures | S3 attach PR chip to draft; hover; H null author/long strings if host cannot supply. | Live card updates while embedded static context metadata is distinguished; ghost author path, wrapping and width clamp remain readable. | NOT CAPTURED |
| B16 | Hover failure independent of click — Hover pending, then error; markdown has no fallback; chip has fallback; separate click read succeeds/fails. | A | recording | W-D | Any host via H | H gates/rejects previewCard only; then drive real links and separate preview query. | No card while empty/pending; URL tooltip on markdown error; chip fallback on error; click still resolves independently; resolvingClick blocks duplicates and fallback opens safely. | NOT CAPTURED |
| B17 | Tabs and composer exact/list lookup — Unlinked PR detail tab; composer PR lookup from recent list then exact numeric missing-from-list; same ref forms used by actual callers. | A | recording | W-D, I-D, A-D | GH/GC/GL; H exact identity and URL change | W composer PR trigger; S3 unlinked tab; app commands/keybindings. M composer lookup via state/queries. | Reply-backed list/detail propagates to tab glyph and lookup item; copy/open URL commands in ChatView, page, CommandPalette still use correct PR; no per-row extra detail reads. | NOT CAPTURED |
| B18 | Legacy/branch linked-summary readers — No modern pullRequests snapshot selected; branchPullRequest/legacy linkedPullRequest; visible sidebar row + thread search/command palette. | A | recording | W-D, I-D, A-D | GH/GC/GL; H legacy shell shape | S3 branch discovery; H seed older shell shape because current app creates modern links. | Independently constructed linked-summary query updates at reply, including mobile bounded summary snapshot; re-enter virtualized row keeps new state. | NOT CAPTURED |
| B19 | Modern linked badge and snapshot tab readers — Modern links selected: one PR, multiple independent links, native stack; snapshot present vs null; counts 1/2/3. | A | recording | W-D, I-D, A-D | GH, GC; GL non-native multi-link; H exact snapshot timing | S3 modern link flow; S4 stack; H hold server snapshot update while reply arrives. | Record sidebar badge, mini-list, thread search/command palette, right-panel tab, mobile thread row. These prefer thread snapshots and bypass direct summary patch; separate snapshot arrival from action reply. | NOT CAPTURED |
| C01 | Draft filter membership and query precedence — Mounted lists draft=only and hide; typed draft qualifier conflicts with menu; 1 matching row; optional reply isDraft absent in control. | A | recording | W-D, I-D, A-D | GH, GC; GL void control; H sparse draft | W /pull-requests?draft=only or hide and q qualifier; M filters/search; H mounts both cached scopes. | Ready/draft removes mismatches; typed query takes precedence; absent draft preserves known draft; unchanged filters retained; empty-state label correct. | NOT CAPTURED |
| C02 | Missing row in head versus cursor page — Reply matches list state/draft but acted row absent; loaded first-page and cursor-page atoms; also list whose state rejects reply. | A | recording | W-D, I-D, A-D | GH/GC/GL data; H deterministic paging | H real query atoms with limit/cursors; real app filter switch and Load more. | First-page matching list refreshes once; cursor page and nonmatching list do not fabricate insertion; no duplicated or wrongly sorted row. | NOT CAPTURED |
| C03 | Web accumulated pages and newer override — At least 2 pages; acted row only beyond head; selected panel and held row remain; state=all then state=open. | A | recording | W-D | GH/GC/GL; H page timing | S5 W Load more; action in selected detail and via quick row; H for late head ordering. | Reply reaches displayed retained row, old override settles/does not unmerge newer rows, filtered disappearance remains gone after head reread and scroll. | NOT CAPTURED |
| C04 | Mobile appended pages beyond head — At least 2 pages; acted row only in pagesFamily cache; head can refresh independently; pages null control. | A | recording | I-D, A-D | GH/GC/GL; H exact page placement | S5 M scroll to load; native row menu and return from detail; H observe pages atom. | Reply patches/removes appended row, preserves diff stats, does not resurrect via stale pages; null/unrelated cached lists remain unchanged. | NOT CAPTURED |
| C05 | Sparse reply preserves rich detail and counters — Rich loaded detail: 12 files, +340/-90, known conflict, author, timestamps, labels, check/review signals, stack; reply omits counts/conflict/times/auto state. Then explicit zeros/null/false. | A | recording | W-D, I-D, A-D | GC, GL live; GH live rich; ADO/BB/FJ H | H full contract-valid sparse replies; GC live sparse lifecycle, GL cancel-auto reply. | Only defined fields replace known values; absent totals do not become zero; explicit false disarms; explicit null clears timestamps; 0/1/many counters stay accurate. Head/stack data use required rereads. | NOT CAPTURED |
| C06 | Undefined reply and old-server compatibility — Loaded detail, both previews, linked summary and list; runAction resolves undefined; normal refresh stream kept, then gated control. | A | recording | W-D, I-D, A-D | GL, GC live void; all hosts H compatibility | S6 old-server or RPC H; real GL lifecycle and GC merge. | Detail + previews explicitly reread; linked/list rely on normal refresh stream (no explicit rereadWithoutReply); web/mobile fallback row changes still work. New client+old server and old client+new summary are separate protocol checks. | NOT CAPTURED |
| C07 | Saved reply survives cold/offline restart — Loaded persisted detail, preview/card, list and web detail/list snapshots; successful close/ready; then restart before read, offline. | A | recording | W-D, I-D, A-D | GH/GC/GL; H storage failure | S0 isolated app storage only; stop network after cache save event; reload/relaunch; H failing store. | Saved copies show replied state; no old open/draft flash; failures of cache save do not turn successful mutation into failure. Legacy linked query itself has no disk persistence: test its client snapshot separately. | NOT CAPTURED |
| C08 | Older host update wins over newer receipt — Shown updatedAt=T2/observedAt=100; reply updatedAt=T1/observedAt=200; same PR. | A | recording | W-D, I-D, A-D | All via H; no trustworthy live timing seed | H synthetic timestamps; drive action from real components. | Ignore reply in detail, previews, linked summary, list and web override; retain exact visual state, no redundant reread. | NOT CAPTURED |
| C09 | Equal/missing update time, observation ordering — Equal updatedAt and older observedAt; newer observedAt acceptance; preview updatedAt absent; legacy both missing control. | A | recording | W-D, I-D, A-D | All via H | H schema-valid optional times and sequential reply gates. | Observation tie-breaker is exercised in both directions; old server fields remain compatible; missing-time semantics labelled rather than pretending host ordering exists. | NOT CAPTURED |
| C10 | Never unmerge — Loaded merged state; reply open or closed with newer times; queued web override also open. | A | recording | W-D, I-D, A-D | All via H | H deterministic reply; no reopening real merged PR needed. | No reader or override turns merged back to open/closed; merged final control remains. | NOT CAPTURED |
| C11 | Read begun before action returns late — Loaded open data; detail/list/preview/card/summary refresh in flight captures old state; action returns new summary; release old read last. | A | recording | W-D, I-D, A-D | All via H | H Deferred/driver gates at query/RPC boundary; record every affected reader, not only detail. | New reply remains shown after old response settles; pre-mutation read is restarted/cancelled as needed; no stale flash. Count restarts separately from eliminated reads. | NOT CAPTURED |
| C12 | Action while reader has no value or failed previous — Reader mounted but pending with no answer; separate failure-with-previous case; action elsewhere succeeds. | A | recording | W-D, I-D, A-D | All via H | H gates initial reads and injects failure-with-previous; includes detail ghost/list ghost/preview no card. | No-value atom refreshes rather than building invalid partial detail; previous value is preserved while waiting; failure UI recovers without losing new patch. | NOT CAPTURED |
| C13 | Identity/account isolation and natural ref forms — Two environments; two projects; host case variants; repo case variants; explicit vs missing host; expectedAccountId matches/mismatches; same number elsewhere. | A | recording | W-D, I-D, A-D | GH+GC real identities; H alternate account/host | H contract-valid duplicate identities plus actual refs from W thread/menu and M branch reader; S0 across GH/GC for real contrast. | Patch only exact environment/project/host/repo/number/account scope; list unscoped/account-scoped exclusion respected. Also record actual explicit-list versus implicit-branch refs: missing host is deliberately NOT wildcard. | NOT CAPTURED |
| C14 | Routed action, destination identity differs — Origin env lacks local host credential; authorized destination can serve; summary carries destination project/repository; origin readers loaded. | A | recording | W-D, I-D, A-D | GH/GC/GL if two envs configured; H fallback | S6 two isolated environments and Connections routing permissions; H deterministic routing/denial. | UI shows reply but preserves origin reader identity; other host/account/environment remains unchanged; destination permission denial does not optimistically succeed. | NOT CAPTURED |
| C15 | Other client or agent action — Writer and untouched reader clients connected to same isolated server; loaded detail/summary/list; close→reopen→merge via app or MCP. | A | recording | W-D + one remote I-D or A-D | GH, GC, GL | S6 two app clients; source-control MCP runAction equivalent on owned fixture only; include remote/relay connection. | Writer shows reply; untouched client still refreshes through existing subscription. Record its additional reads and eventual state; never claim replies broadcast to all registries. | NOT CAPTURED |
| C16 | Disconnected/read-only/unsupported guards — Offline with cached data; source-control write grant absent; provider viewer denies; no supported actions/merge methods; stack unknown/error. | G | recording | W-D, I-D, A-D | GH/GC/GL; H exact unsupported branches | App Connections/access settings for isolated env; H capability/viewer/stack errors. | State remains readable; action unavailable/disabled; no mutation, no success patch; reconnect/retry restores valid controls. | NOT CAPTURED |
| D01 | Native list context menu lifecycle — Native PR list head with ready,draft,closed,merged; sidebar selected row and full-list variants; action busyKey. | A | recording | I-D, A-D, T-L | GH, GC; GL void control | M full list and split/sidebar list; row long-press menu; S0 lifecycle. | Close/reopen/draft/ready confirmation and native menu update; summary success bypasses onChanged fallback, void uses it; cancel makes zero mutations. | NOT CAPTURED |
| D02 | Native reviewers screen permission transition — Reviewers sheet mounted; open PR with candidates; close action via same-registry H; reopen with gated permissions read. | A | recording | I-D, A-D | GH/GC/GL; H action ordering | M PullRequestReviewers; H invokes normal runAction command while sheet stays mounted. | Request-review controls disable on closed state and recover only when refreshed permissions allow; candidate list is not erased. Android uses selectDetail; iOS navigation path. | NOT CAPTURED |
| D03 | Native files and inline-comment new head — Files overview/sheet/route + inline comment with params.headSha=old; viewed marks set; action update branch yields new head. | A | recording | I-D, A-D | GH live; GL where supported; H exact timing | M PullRequestFile/PullRequestFiles + InlineComment; S2/H update action. | New head lands via reread, viewed state invalidates, stale diff/inline review notices prevent posting against wrong head; commit-specific view remains pinned. | NOT CAPTURED |
| D04 | Native guide/review/discussion readers — Guide screen and review sheet loaded; discussion with reply/resolve and reactions; edit/labels forms have a local draft; close/reopen/new head. | A | recording | I-D, A-D | GH live richest; GC/GL supported subset; H seeded guide/discussion | M navigate each real screen; H run normal action on shared registry while active; record active screen separately within one chaptered clip. | State-sensitive review permissions update; reply/resolve/reactions retain their own permissions; unsaved edit form text survives; labels/counts/description unchanged by sparse reply. | NOT CAPTURED |
| D05 | Electron shell integration — Same seeded page/thread/hover/list readers as web; desktop app on local server, then paired remote server. | A | recording | E-D, E-L | GH; GC lifecycle alternate | Desktop own isolated dev build; repeat A03/A04/A05 and B14; no production T3 home. | Reply updates render through actual Electron client; tab/status/copy/open keybindings and pending state preserved; no browser-only substitution. | NOT CAPTURED |
| D06 | Theme, width, counts and long-content sweep — Open/ready/draft/closed/merged states; titles 1 vs 2+ lines; branches/repo/author long; null/name=login/name≠login authors; 0/1/12 files, checks 0/1/100. | G | recording | W-D, W-L, N-D, N-L, E-D, E-L, I-D, I-L, A-D, A-L, T-L | GH/GC/GL; H exact zero/null | S0 exact long metadata; Appearance theme setting, real resizes, M split layout; H zero/null values. | All touched status colours/icons/labels remain legible; panel expanded/condensed/maximized, narrow page, card width clamp and mobile split layout fit; no text overlap as state/action lengths change. | NOT CAPTURED |
| F01 | GitHub checks: zero — Core rollup no contexts; no next page. | A | recording | W-D, I-D, A-D | GH | Owned GH PR without statuses; open checks on W/M. | No checks UI; core query=1, continuation queries=0; no invented passing context. | NOT CAPTURED |
| F02 | GitHub checks: one — 1 named successful check/context, no next page. | A | recording | W-D | GH | Owned GH PR, one status context. | Singular count/control; core=1, continuation=0; retained across ready/close action. | NOT CAPTURED |
| F03 | GitHub checks: 100 boundary — Exactly 100 contexts, no next page; long check names; success/pending mix. | A | recording | W-D | GH | Owned GH fixture statuses via API; open expanded checks/popover. | Full rollup and Show completed branch; core=1, continuation=0; no double first-page read. | NOT CAPTURED |
| F04 | GitHub checks: 101, failure last — 100 passing checks in first page; failing check only on second; same head. | A | recording | W-D, I-D, A-D | GH live + H deterministic | Owned GH PR, 101 status/check contexts; API transcript validates placement; H if ordering not reliable. | UI failing and total complete; core=1, continuation=1 with after=core.endCursor, never after=null; not falsely merge-ready. | NOT CAPTURED |
| F05 | GitHub checks: continuation cap — At least 1001 unique contexts, hasNextPage after 10 total pages. | A | recording | W-D | GH H | H provider reply sequence; large live statuses unnecessary. | At most 1 core+9 continuation requests; truncated=true at cap, no full-success implication from partial data. | NOT CAPTURED |
| F06 | GitHub checks: repeated cursor — First cursor c1; continuation returns c1 again. | A | recording | W-D | GH H | H provider page sequence with request counter. | Stop as truncated, no loop; do not append repeated-cursor page; UI indicates incomplete data according to existing presentation. | NOT CAPTURED |
| F07 | GitHub checks: missing continuation — Core says more; continuation PR disappears; separately rollup/contexts absent, or hasNextPage=true without usable endCursor. | A | recording | W-D | GH H | H provider GraphQL payload + real client error path; count attempts. | Missing PR or changed head fails; missing core cursor stays truncated. Absent continuation contexts normalize to empty: record actual completeness/result rather than claiming this case rejects; verify no false all-passing UI. | NOT CAPTURED |
| F08 | GitHub checks: head changes mid-walk — Core head H1; second page H2. | A | recording | W-D, I-D, A-D | GH H; live optional | H gated provider pages; optional owned GH push between pages. | Reject mixed revisions; no combine; eventual retry shows one head consistently. | NOT CAPTURED |
| F09 | GitHub checks: reviewer field refused — Initial PullRequestCore requestedReviewers=100 refused; retry with 0; checks have second page. | A | recording | W-D | GH H | H GraphQL permission refusal; unavailable to seed deterministically with owner account. | Exactly 2 core attempts+1 continuation for 101 checks, after=c1; do not cache suppression into unrelated later reads. | NOT CAPTURED |
| F10 | Merge summary missing timestamp / confirmation failure — Reply merged but mergedAt absent; confirm succeeds, returns open, or fails; separate undefined/open reply controls. | A | recording | W-D | All hosts H; BB live reply normally lacks mergedAt | H PullRequestService provider stub, transcript plus UI; no extra provider read merely to build reply. | Exactly 1 server confirmation attempt when action=merge and no complete merged timestamp; successful merge event retained if fallback fails, using current time when needed; returned RPC remains original summary/undefined. | NOT CAPTURED |
| F11 | Successful write, unusable host reply — GH mutation result missing PR/null or DecodeError; GC/ADO/BB/FJ/GL reply empty or malformed. | A | recording | W-D, I-D, A-D | All six providers H | H per-provider actual reply decoder boundary, not a summary-shaped fake alone. | Mutation is not retried/reported failed solely for undecodable success body; success returns undefined and C06 fallback applies. Transport/permission errors still fail as A15. | NOT CAPTURED |
| F12 | GitCafe stack succeeds, void reply — 2+ native layers; merge through selected layer, upper layer remains; expected heads valid; stack action returns undefined. | A | recording | W-D, I-D, A-D | GC live; other stack-capable hosts H only | S4 owned GC repo/stack; M footer and W stack menu. | Runtime rereads details and activity/stack data; no one-layer summary guessed; layer counts/statuses update; single-PR speed merge stays blocked. | NOT CAPTURED |
| F13 | Stack partly merges then fails — 2+ layers; lower layer merged, later failure; RPC fails. | A | recording | W-D, I-D, A-D | GC H; live conditional | H stack provider deterministic failure; optional owned GC conflict injection. | Mobile explicit failure refresh preserved, web stack failure handling recovers; actual layer state shown, no all-or-nothing fiction; busy/error clear. | NOT CAPTURED |
| F14 | Bitbucket async merge task, void — POST merge success returns task rather than PR; later summary says open then merged; decline returns PR in counterpart A03. | A | recording | W-D, I-D, A-D | BB H only | H Bitbucket API raw response; no authenticated writable BB host established. | Async task does not decode as a PR; C06 fallback+merge confirmation operate; never show merged merely from HTTP success. | NOT CAPTURED |
| F15 | Forgejo state PATCH preserves conflict — PATCH close/reopen returns PR with unknown conflict and missing totals; loaded detail has known conflicting state and nonzero totals. | A | recording | W-D, I-D, A-D | FJ H only | H Forgejo CLI raw stdout; no configured writable Forgejo host established. | Summary omits unknown conflict, preserves known conflict/counts; merge/update empty replies take C06 path. | NOT CAPTURED |
| F16 | Azure update JSON supplies lifecycle summary — az repos pr update returns JSON for supported merge/auto/ready/draft/close/reopen; timestamps/auto method and conflict state present. | A | recording | W-D, I-D, A-D | ADO H only | H Azure CLI raw JSON fixtures; no az binary or authenticated org/repo established. | Map A01–A09 states correctly; abandoned→closed and completed→merged; no extra az pr show to construct result; F11 covers empty JSON. Do not advertise unsupported update-branch strategy. | NOT CAPTURED |
| F17 | GitLab cancel-auto sparse summary — MR armed on pending pipeline; POST cancel_merge_when_pipeline_succeeds returns MR JSON without line counts. | A | recording | W-D, I-D, A-D | GL live conditional; H fallback | S1 GitLab CI pending pipeline; A08 through app; H if owned project cannot enable pending auto-merge. | A08 from native GitLab reply; known totals not zeroed; false auto state clears method. Other actions glab mr return prose/undefined and use C06. | NOT CAPTURED |
| G01 | PR list capability/initial-loading ghosts — Capability unknown, then known supported; first list load pending with no data; ghost rows=7; selected detail seeded or absent. | G | recording | W-D, I-D, A-D | GH/GC/GL; H exact gates | H config/list gates; W initial route and M initialSummary present/absent. | Loading/capability ghosts transition without briefly showing empty or false replied state; actions elsewhere cannot build invalid list/detail. | NOT CAPTURED |
| G02 | PR list total failure and retry — Known supported; zero retained entries; list RPC fails; retry pending, then success; unsupported server variant. | G | recording | W-D, I-D, A-D | All via H | H list rejection/config capability; drive real Retry. | Unavailable/error retry and unsupported-server guidance remain correct; no successful action patch manufactures a complete missing list. | NOT CAPTURED |
| G03 | Partial host failure with retained rows — 2 hosts/environments; one fails; other has rows; list refreshing fails while previous rows retained. | G | recording | W-D, I-D, A-D | GH+GC live data; H failure | S0 GH+GC isolated project aggregation; H reject one host/list read. | Warning/retry coexists with patched rows; provider/environment labels and filters survive; error state does not hide a successful action. | NOT CAPTURED |
| G04 | Empty list variants and carried search — No projects vs no matching rows; no filters vs filtered/search result; query unsettled or carried old results; then action removes final match. | G | recording | W-D, I-D, A-D | GH/GC/GL; H no-project/carry gates | W route filters and query typing; M workspace search; H carry/loading gates. | Correct no-project/unfiltered/filtered/searching empty state or carried-result ghost; clear search/refresh/load-more works; no lost selected PR panel. | NOT CAPTURED |
| G05 | Truncated footer and loading continuation — truncated=true with entries; valid next cursor vs page-size fallback vs maximum exhausted; loadingMore true/false; cursor versus head update. | G | recording | W-D, I-D, A-D | GH/GC/GL; H caps | S5 actual Load more; H exact max-page/repeated cursor cases. | Loading more/Updating pull requests labels, disabled Load more, and narrow-search end state are correct while reply removes/reorders a row; no repeat-cursor loop. | NOT CAPTURED |

## Source-to-fixture inventory: callers, shapes and conditionals

This inventory distinguishes production callers from tests and code-generated declarations. A fixture may be reused by several callers with the same input shape, but every distinct caller below must appear in that row's chapter checklist. These are the conditional axes the diff can change or pass through. Unchanged child editors, guide generation, review submission, checkout/handoff implementation and unrelated list-filter algorithms are not new features in this PR; their forms/content are preservation guards, not an instruction to launch provider agents or exhaust every unchanged subtree.

| Changed component / shared reader | Every production caller / entry path | Prop, data, layout and interaction branches | Fixture coverage |
|---|---|---|---|
| [PullRequestDetailPanel.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/web/src/components/pullRequest/PullRequestDetailPanel.tsx#L263) | [PullRequestsPage.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/web/src/components/pullRequest/PullRequestsPage.tsx), [RightPanelSurfaceContent.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/web/src/components/chat/RightPanelSurfaceContent.tsx) | Two production render paths: page caller passes listEntry, tabOnPage and onActed(sent/done/failed, reply); thread/right-panel caller passes threadRef, initialTab/onTabChange, computed page/thread context, composerDraftTarget, onBack, no page override callback. Input axes: reference identity/host, environment, matching/missing listEntry, sharedSummary/live/cached detail; config capabilities unknown/supported; permissions/read-only/disconnected. Detail absent+pending renders ghost (with/without list/summary seed); absent+error shows unavailable/retry/open-host; data+waiting keeps data. Header expanded versus scroll-condensed, onBack/onClose present/absent; page linked-thread count/picker vs thread context; panel normal/maximized/narrow. Active and retained summary/timeline/code/guide tabs; unavailable code/guide falls to summary; timeline pending/error/content, counts 0/1/many commits/comments/approvals, oldest/newest. State-dependent primary action: ready/merge/auto-merge armed or arm/resolve/conflict; draft toggle; auto off removes method; allowed merge methods/default/last-used; stack owns merge, stale/pending/error stack and retry; branch update merge/rebase; workflow approval count; delete branch on final state. Title, repo, branches, author/profile, file/diff counts long/absent/0/1/many. Interactions: lifecycle/auto/merge dialogs+cancel, comment-close/reopen, native stack menu, manual refresh, pane/tab navigation and scroll, copy/open and panel shortcuts, retained code/guide/review state. Action reply versus undefined determines refresh path; update branch/workflow approvals retain explicit host refresh. | A01–A18; B13; C05–C16; D06; F12–F13; G01–G05 |
| [ThreadDetailsPrRow.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/web/src/components/chat/ThreadDetailsPrRow.tsx#L84) | [ThreadDetailsPrRows.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/web/src/components/chat/ThreadDetailsPrRows.tsx), [BranchToolbarBranchSelector.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/web/src/components/BranchToolbarBranchSelector.tsx) | ThreadDetailsPrRows renders the current row directly and extra ThreadDetailsPrLinkRow wrappers when expanded; BranchToolbarBranchSelector renders this only in displayMode=panel with known PR number+URL. No composer-mode duplicate of this row. Reference: explicit linkedReference vs project-derived repository, or null when project/config unavailable. Icons from live detail vs fallback pr+status vs generic. Tooltip simple fallback vs rich detail with branches/counts; open-state checks none/passing/pending/failing; draft+conflict warning; 0/positive diff breakdown and singular file count. Resolve has priority over Ready, then failing Fix, pending no trailing action, otherwise permitted merge. Layout: detail+checks/action/watch gives title+meta line; no detail+watch gives split row; otherwise plain row. Watching only while open; current+0/1/multiple rest rows collapsed/expanded. Merge modal cancel/confirm and allowed method/default; duplicate guard/pending labels; ready success now refreshes checks and branch status, not detail explicitly. Resolve/Fix handoffs are unchanged guards: capture in H without starting a real provider agent. | B01–B04; C05–C16; D06 |
| [PullRequestSpeedActions.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/web/src/components/pullRequest/PullRequestSpeedActions.tsx#L31) | [PullRequestRow.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/web/src/components/pullRequest/PullRequestRow.tsx), [PullRequestListGroups.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/web/src/components/pullRequest/PullRequestListGroups.tsx), [ThreadPullRequestsPanel.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/web/src/components/pullRequest/ThreadPullRequestsPanel.tsx) | Actual JSX callers are PullRequestRow and ThreadPullRequestsPanel.LinkRow (the latter supplies no onActed). PullRequestListGroups transports onActed and batch/sweep flags to row. Entry ready/open→Close+Merge, draft→Close+Ready, closed→Reopen, merged→none; filter by hostActions, possibly none. canWrite false, busy, closing, sweeping, stack present disables merge. Shift-only shows group; other modifiers hide, but busy keeps it visible. 0/1/2 quick buttons; pending spinner; tooltip changes for stack or close-sweep. Pointer primary left Close may start sweep; click performs once; no explicit method leads to fresh-detail method resolver and stack preflight. Caller may receive reply-backed onActed or have no callback. Native/branch chains and stack size 1/many change LinkRow icon/meta/indent; selected/provider/project/env labels, labels length 0/many and author lengths affect row width. | B05–B12; B19; C01–C04; C08–C16; D06; F12 |
| [PullRequestsPage.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/web/src/components/pullRequest/PullRequestsPage.tsx#L430) | [_chat.pull-requests.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/web/src/routes/_chat.pull-requests.tsx) | One route, /pull-requests. Filters/state/involvement/sort/query/host/projects/env/author/labels/review/checks affect list/group membership and retained snapshots. Typed draft qualifier overrides draft menu. Whole page branches: unknown capability ghost, unsupported, first-load 7 ghosts, error+0, carried-search-to-nothing ghost, empty with/without projects/filter/query/load-more, populated groups, warning+retained rows, truncated footer updating/loading/load-more/narrow-search. Single/multiple hosts/env labels. Panel closed/open, selected missing/held/offscreen PR, multiple retained surfaces and maximize. Page override inputs are no reply versus reply state/isDraft/updatedAt/observedAt; sent/done/failed phases and tokens; older reply-backed override loses to newer/merged row. Quick action, batch sweep and detail callback all feed overrides; merge without reply defers to reads. Counts 0/1/many and order after reply, page2 and virtualized/offscreen rows; scroll/load/refresh, debounce/carry, selection, panel/keybindings/copy/open, close-drag start/move/cancel. Existing ranking by updated/created/ready/blocked and search grouping must retain relative order of unaffected rows. | A03–A15; B05–B11; B13; C01–C16; D06; G01–G05 |
| [usePullRequestActions.ts](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/web/src/components/pullRequest/usePullRequestActions.ts#L127) | usePullRequestActionRunner: [ThreadDetailsPrRow.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/web/src/components/chat/ThreadDetailsPrRow.tsx), [PullRequestSpeedActions.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/web/src/components/pullRequest/PullRequestSpeedActions.tsx); usePullRequestCloseBatch: [PullRequestsPage.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/web/src/components/pullRequest/PullRequestsPage.tsx) | Runner action key/reference null and duplicate-key gate; environment-scoped scheduler; merge method resolve succeeds/refuses because detail closed/draft/permission/stack/method changed; pending clears on failure; action-specific success/error toast; onSuccess receives optional summary. Batch filters non-open/already pending rows, handles empty batch, serial per env through runtime, accumulates success/error and caps error descriptions. Reply-defined callback versus undefined old behaviour; interrupted/refused commands not successes. | B01–B11; A15; C06; C13–C16 |
| [PullRequestMergeControls.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/mobile/src/features/pull-requests/PullRequestMergeControls.tsx#L31) | [PullRequestRouteScreen → PullRequestOverview](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx) | Overview footer only. Method preference local selection→saved preference→squash→first allowed/none; merge label changes for stack layers>1; disabled if busy/no method/reason. Reasons: disconnected, no write/viewer capability, conflict/checks, stack displayed but unsupported, stale membership, unknown/loading, membership error/retry. Status priority: permitted ready/reopen action; merged; closed; draft; conflict; auto pending with/without method; checking-stack; ordinary merge. Final closed/merged hides menu. Single merge uses fresh detail resolver; stack uses expectedStackHeads; arm/disarm menu guards and confirmation/cancel. Pending/local busy/stateAction busy; activity+stack refresh on every result, explicit detail refresh only on failure (runtime handles success summary/void). | A01–A12; A15; C05–C16; D01; D06; F12–F13 |
| [usePullRequestAction.ts](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/mobile/src/features/pull-requests/usePullRequestAction.ts#L18) | [PullRequestStatusRows.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/mobile/src/features/pull-requests/PullRequestStatusRows.tsx), [PullRequestRouteScreen.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx), [PullRequestMergeControls.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/mobile/src/features/pull-requests/PullRequestMergeControls.tsx) | All production hook callers: PullRequestStatusMenu; PullRequestChecksRow (approve-workflows); PullRequestBranchRow (update-branch merge/rebase); PullRequestRouteScreen toolbar/menu (including delete branch); MergeControls stateAction (Ready/Reopen). pr null/busy/no write/unavailable action disables; pending ref blocks duplicates. Status menu actions ready/draft/close/reopen/revert depend on state; no actions renders non-button status, otherwise native Menu. Close/revert/delete confirm including Cancel. Checks disclosure collapsed/expanded, 0/1/many checks, failures and required-approval row; branch conflicting/mergeable/unknown, behind count and busy Updating…, allowed update methods or resolve action. iOS Menu symbols and Android toolbar/menu paths differ. Success refreshes activity only at hook; failure dialog and busy reset; runtime owns detail patch/fallback. | A01–A18; D01–D04; C05–C16; D06 |
| [usePullRequestListActions.ts](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/mobile/src/features/pull-requests/usePullRequestListActions.ts#L27) | [PullRequestsScreen.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/mobile/src/features/pull-requests/PullRequestsScreen.tsx) through [WorkspaceRootScreen.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/mobile/src/features/workspace/WorkspaceRootScreen.tsx), [WorkspaceRootScreen.android.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/mobile/src/features/workspace/WorkspaceRootScreen.android.tsx), [AndroidWorkspaceSidebar.android.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/mobile/src/features/workspace/AndroidWorkspaceSidebar.android.tsx) | Single action-hook caller PullRequestsScreen. List layout: sidebar prop or NativePrimaryColumnContext, selected key prop or context, renderFrame Android toolbar, iOS safe insets vs Android header, full/split. ConnectedTargets grant controls native actions; open→request-review/draft-or-ready/close, closed→reopen, merged/read-only→no lifecycle items. Open/copy/provider/share unchanged. Confirm Cancel vs perform; action initially reads fresh detail for authorization (count it), then command; defined reply bypasses onChanged; void uses inferred fallback patch. pending blocks concurrent list action, busyKey indicates row; errors alert. request-review navigates Android selectDetail pair vs iOS navigate. List states pending/error/retained/empty/search/filter/refresh/load-more retain layout and counts. | D01–D02; C01–C04; C06; C13–C16; G01–G05 |
| [pull-requests.ts](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/mobile/src/state/pull-requests.ts#L25) | [usePullRequestList.ts](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/mobile/src/features/pull-requests/usePullRequestList.ts), [PullRequestsScreen.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/mobile/src/features/pull-requests/PullRequestsScreen.tsx) | Pages-family key=(environment,input), atom null vs loaded head+continuations; actionReply iterates living matching-environment page atoms and calls patchPullRequestListEntries, ignoring refresh sentinel for appended data. Unknown/string registry nodes, different env, null pages, same entries are no-op. Head lists patched by runtime and list callback maintains pages; stats are retained separately and refreshed only when listed counts/revisions demand it. Scoped-account action callback excluded. Detail answer compares previous head and invalidates filesViewed when changed. | C02–C07; C11–C14; D03 |
| [pullRequests.ts](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/packages/client-runtime/src/state/pullRequests.ts#L141) | Web and mobile factories; [pullRequests.ts](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/web/src/state/pullRequests.ts), [pull-requests.ts](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/mobile/src/state/pull-requests.ts), [use-thread-pr.ts](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/mobile/src/state/use-thread-pr.ts) | All patched reader families: detail, preview click, previewCard hover, linked-summary (independent factory), first/cursor list. Patch discovery only registered atoms living in the command registry, not all clients or arbitrary old disk keys. Environment/ref/account match; undefined reply versus summary; no value restarts; failure/previous/waiting preserves previous value; same value reuses old object; reread sentinel for missing accepting head list; keep identity on routed summaries. Summary fields patch defined keys; detail head is deliberately reread, not assigned from summary; autoMergeEnabled=false removes autoMergeMethod; linked-summary spreads reply but preserves local identity. Reply and onAnswer snapshot persistence; list accept state/draft, remove/sort existing rows, preserve untouched arrays. Metadata stale-order and unmerge guard are shared; expectedAccount scoped replies excluded from unscoped list/callback. | All A–F rows; especially C01–C15 |
| [pullRequestReply.ts](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/packages/client-runtime/src/pullRequestReply.ts#L9); [pullRequestList.logic.ts](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/web/src/components/pullRequest/pullRequestList.logic.ts#L807) | Runtime detail/preview/linked/list patchers; web reply-backed page overrides. | shown merged outranks any nonmerged reply regardless of time. Compare parsed updatedAt first when both present and finite difference nonzero; otherwise observedAt with -Infinity for absence. Equal/new/missing timestamps, absent observedAt and exact identical values. Overrides fromReply true differ from fallback inferred state; reply queued/open must not become merged; override state/draft filter, newer row outranks old override, list retentions preserve closed/reopened selection. | A06/A09; B08–B09; C05–C11; C13 |
| [PullRequestLinkPreview.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/web/src/components/pullRequest/PullRequestLinkPreview.tsx) | [ChatMarkdown.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/web/src/components/ChatMarkdown.tsx), [contextChipParts.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/web/src/components/contextChipParts.tsx) | Two JSX callers: chat markdown external/autolink path, and PullRequestChip. Hover uses previewCard only while open; click uses separate preview query only when confirmBeforeOpen true. Pending/no data→no card; error+fallback→static chip details; error without fallback→URL tooltip; success→repo/number/state/title/author/opened relative time. Author null→ghost, display name different→name+login, same/no display→login; length/wrapping; w-80 with viewport clamp. Click plain versus modified, duplicate resolving, open internal success versus original URL fallback, interrupted request. Hover failure must not control click destination. | B14–B16; C05–C13; D06 |
| Other web readers of patched detail/list/summary | [RightPanelTabs.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/web/src/components/RightPanelTabs.tsx), [PullRequestChecksPopover.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx), [useComposerMenuItems.ts](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/web/src/components/chat/useComposerMenuItems.ts), [useOpenPanelPullRequestUrl.ts](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/web/src/hooks/useOpenPanelPullRequestUrl.ts), [ThreadStatusIndicators.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/web/src/components/ThreadStatusIndicators.tsx) | RightPanelTabs: modern linkedSnapshot preferred; else detail+shared summary; else seed; else generic glyph. ChecksPopover lazy detail has loading/error/no-checks/content and completed disclosure; count versus full trigger uses supplied detail/checks. Composer PR lookup uses list then exact numeric detail when absent, and may prioritize modern link metadata. useOpenPanelPullRequestUrl is consumed by ChatView, PullRequestsPage and CommandPalette: no separate action runner. Linked-summary consumers: ThreadRowLeadingStatus and ThreadSearchPullRequestNumber (sidebar and CommandPaletteThreadItems); BranchToolbarBranchSelector uses linked status. Modern snapshot badge/mini-list intentionally separate; visible/virtualized demand leases control reads. Settings source control/appearance/connections affect permissions/method/theme/routing, but no distinct lifecycle action entry point exists there; keybindings open/copy/toggle/navigate panels, not an untraced extra merge implementation. | B03; B13–B19; C07; C13–C16; D06 |
| Other native readers of patched detail and legacy summary | [PullRequestRouteScreen.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx), [PullRequestReviewersScreen.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/mobile/src/features/pull-requests/PullRequestReviewersScreen.tsx), [PullRequestInlineCommentScreen.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/mobile/src/features/pull-requests/PullRequestInlineCommentScreen.tsx), [PullRequestReviewSheet.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/mobile/src/features/pull-requests/PullRequestReviewSheet.tsx), [PullRequestDiscussionScreen.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/mobile/src/features/pull-requests/PullRequestDiscussionScreen.tsx), [PullRequestEditScreen.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/mobile/src/features/pull-requests/PullRequestEditScreen.tsx), [PullRequestLabelsScreen.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/mobile/src/features/pull-requests/PullRequestLabelsScreen.tsx), [PullRequestFiles.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/mobile/src/features/pull-requests/PullRequestFiles.tsx), [PullRequestReactions.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/mobile/src/features/pull-requests/PullRequestReactions.tsx), [PullRequestGuideScreen.tsx](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/mobile/src/features/pull-requests/guide/PullRequestGuideScreen.tsx), [queries.ts](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/mobile/src/state/queries.ts), [newTaskPromptLink.ts](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/mobile/src/features/prompt-links/newTaskPromptLink.ts) | Route identity uses detail or initialSummary (interactive status vs plain summary); 0/1/many files vs skeleton; author null; title/branch/updated lengths; overview/activity/guide; summary-only/no identity/error/offline. Native Stack registers PullRequestRouteScreen; file-route content also reads detail, distinguishes commit-pinned vs current head. Reviewer request allowed only open with permissions; inline/comment/review controls react to state/head; discussion reply/resolve and reactions have separate permissions. Edit title/body/comment drafts and labels must not be reset by sparse reply; guide/current code/viewed files use head-sensitive refresh. useComposerPullRequestSearch and newTaskPromptLink perform list/exact or one-shot detail lookup, not lifecycle writes. Legacy mobile summary feeds useThreadPr → thread-list-v2-items; modern resolveThreadPrSource chooses linkedPresentation and skips query. Read-only secondary screens are preservation chapters, not new action UIs. | B17–B19; C05–C16; D01–D04; D06 |
| Server/contracts/provider and generated-file paths | [PullRequestService.ts](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/apps/server/src/pullRequest/PullRequestService.ts), [pullRequest.ts](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/packages/contracts/src/pullRequest.ts), [rpc.ts](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/packages/contracts/src/rpc.ts), [PullRequestProvider.ts](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/packages/source-control-core/src/server/PullRequestProvider.ts), [GitHubPullRequestApi.ts](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/packages/source-control-github/src/server/GitHubPullRequestApi.ts), [gitHubPullRequestJson.ts](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/packages/source-control-github/src/server/gitHubPullRequestJson.ts), [pullRequestMutations.graphql](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/packages/source-control-github/src/server/pullRequestMutations.graphql), [pullRequestReads.graphql](https://github.com/pingdotgg/t3code/blob/e39f603334941501836836083a3ef70e9dff24a3/packages/source-control-github/src/server/pullRequestReads.graphql) | No direct render method. Same runAction RPC now Summary/undefined and optional provider return; service summary mapper omits absent action times while ordinary read normalizes missing times to null; observedAt stamped at action result; stack forces undefined; invalidate/refresh stream remains; merge confirmation as F10. Summary adds optional headSha/auto fields, Preview adds optional times. GH GraphQL fragment serves all 8 action mutation selections; check core exposes endCursor; generated .graphql.ts mirrors those selections/codecs (no extra render paths). Core page and continuation paths, 10-page bound, repeated cursor, changed/missing PR, reviewer-permission retry. ADO/BB/GC/FJ/GL adapters each have raw-body/CLI decoder success versus void shape. Client-runtime package export and runtime queryPersistenceKey introduce no new UI caller. MCP transports call this same service and other clients refresh normally; agent-runtime adapters Codex/Claude/Cursor/Grok/OpenCode/Antigravity are not changed and need no separate matrix per provider harness. | A01–A18; C06; C14–C15; F01–F17 |

## Additional minimum host obligations (avoid multiplying platforms unnecessarily)

The profile cells above specify primary UI evidence for each fixture. “Forge seed” lists feasible hosts, not a demand to run every platform on every forge. For host-boundary proof, at minimum:

- GitHub: live A01–A11 (A06 queue-specific may be H), F01–F04; F05–F11 deterministic H; at least one actual web, Electron, iOS and Android successful reply path. All eight changed GraphQL mutations need raw reply/request evidence, even when their visual states are already covered elsewhere.
- GitCafe: live A01–A04 with its raw lifecycle replies and unchanged nonzero stats; W-D is sufficient for the additional host run. At least one successful single merge void fallback, plus F12 native stack if the owned repo supports stacks. F13 partial failure remains H unless safely seedable.
- GitLab: live F17/A08 if an owned pending auto-merge MR can be seeded, plus at least close/reopen void fallback C06. If automatic merge cannot be enabled, keep live F17 blocked and label the substitute H. Do not pretend a glab prose action exercised summary patching.
- Azure DevOps: F16 raw `az` JSON replay across the supported lifecycle/auto action branches, F11 undecodable success. H only.
- Bitbucket: raw synchronous merge and decline replies for A05/A03, F14 async task, F11 bad body. H only.
- Forgejo: raw close/reopen PATCH replies F15/A03/A04 and empty merge/update C06, plus F11 bad body. H only.

Source-level tests already present on this head cover several reply patch/merge-confirmation/race/cursor paths; reading them does not fill any recording row. An individual H row may pair a recording of the real client with a focused provider/service test transcript; record which boundary each proves. No test outcomes are claimed by this pass.

## Handoff and completion accounting

Coverage completed in pass 1: full functional diff scope, production caller tracing, action/reply/fallback matrix, viewport/theme allocation, live versus harness seedability and request-count boundaries. Coverage not completed: every recording, every before/after comparison, live mutation/read counts, any actual desktop/native/device run, provider success-body validation against live hosts, and benchmark/latency conclusions. There is no evidence URL for any row yet.

The auditor started no server, emulator or device lease and made no worktree changes. The lead's `/home/ubuntu/wt/pr-25761` is read-only and must remain. Only the auditor-created `/tmp/lead-25761-r6b/proof-audit-1/` is to be removed after uploading this matrix. No WIP branch is needed: no commits were made. Available disk was 16 GB during audit, above the 5 GB stop threshold.

FRICTION:
- tool | Installed glab rejects `glab api user --jq .username`; authenticated identity check succeeded with JSON piped to Python instead. | Use this installed CLI's help/version before borrowing gh flags.
- forge | No authenticated writable Azure DevOps, Bitbucket or Forgejo fixture target was established; their live reply shapes cannot be proved from this VM. | Provide owned test host/repo credentials or accept explicitly labelled provider-boundary harness evidence.

VERDICT: INSUFFICIENT <all affected rows: not yet captured>
