test(mobile): matrix the dialog-dismiss site and name the three reaches left behind

The reply matrix drives every reply a family's base scenario scripts, and the browser dialog
family scripted only the accept leg, so repointing `browser.dialogDismiss` at another method
survived the whole suite. A scenario for the dismiss leg closes it; the mutation is killed now.

The inventory loses five section headers that no longer list anything, and the three entries
that resisted migration each carry what blocks them: a `worktree.ps` inside the history screen
component's own effect, an unsubscribe closed over inside a `subscribe` callback, and a
`notifications.getMissedSince` gated behind the OS notification tray and the keychain host
catalog. Faking either of the last two would record device state, not a wire.

Eighteen goldens move on `adapterSha256` alone: removing two inner casts from the browser and
history adapters re-digests the goldens mounted through them and nothing else. All 263 were
re-recorded from the pinned baseline and compare byte-identical to the previous recording
apart from those headers and the new file.

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb
This commit is contained in:
Jinwoo-H
2026-09-14 16:11:22 -04:00
parent 5ca367632d
commit 336bcb05f1
27 changed files with 224 additions and 68 deletions
@@ -6,7 +6,7 @@
"baseline": "c6a72169843ececf3a21da370ac50c5c5a4e6462",
"lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571",
"recorderSha256": "6145e3e91fe5b17a9262db21965a2a23535ff01bba1ec2c662e68ab8e13c24da",
"adapterSha256": "00864bce221e5c5e72f10c30939a40b26bdb342913a59770ff8c92fc02309f27",
"adapterSha256": "0326d26df79bf4930e2af844b07a09047f0be9bae90ab7dc2a39c330b827473b",
"scenarioSha256": "0431ac82cbb8c60b16f4432fd0da7cff665485d668e512b20fc1168ec63db3fe",
"platform": "darwin",
"scenarioVersion": 1,
@@ -6,7 +6,7 @@
"baseline": "c6a72169843ececf3a21da370ac50c5c5a4e6462",
"lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571",
"recorderSha256": "6145e3e91fe5b17a9262db21965a2a23535ff01bba1ec2c662e68ab8e13c24da",
"adapterSha256": "00864bce221e5c5e72f10c30939a40b26bdb342913a59770ff8c92fc02309f27",
"adapterSha256": "0326d26df79bf4930e2af844b07a09047f0be9bae90ab7dc2a39c330b827473b",
"scenarioSha256": "e97c6db772a70ee1912419ac67835b6074aaf9a341d4360389a11465f08092c5",
"platform": "darwin",
"scenarioVersion": 1,
@@ -6,7 +6,7 @@
"baseline": "c6a72169843ececf3a21da370ac50c5c5a4e6462",
"lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571",
"recorderSha256": "6145e3e91fe5b17a9262db21965a2a23535ff01bba1ec2c662e68ab8e13c24da",
"adapterSha256": "2fc41099434386a9b110ad53b2ead737afad0d57a8eb48f944cf5bd77007e402",
"adapterSha256": "6bc6da818394e2e35b873fa44bc4f2cf6ce3bcbbc3bb0a738765aaa25b884a0f",
"scenarioSha256": "95f377bc4d8bf1248cafed26b2e9f425ad37e8d3c99e354bd6a8c67eb9bd9b1b",
"platform": "darwin",
"scenarioVersion": 1,
@@ -0,0 +1,92 @@
{
"operation": "browser.page-commands",
"family": "browser.dialog",
"namedDeltas": [],
"runnerVersion": 1,
"baseline": "c6a72169843ececf3a21da370ac50c5c5a4e6462",
"lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571",
"recorderSha256": "6145e3e91fe5b17a9262db21965a2a23535ff01bba1ec2c662e68ab8e13c24da",
"adapterSha256": "6bc6da818394e2e35b873fa44bc4f2cf6ce3bcbbc3bb0a738765aaa25b884a0f",
"scenarioSha256": "5071188ee492a4ced5be793b2dab32baa9750ee6535128635f274fd79198e2f1",
"platform": "darwin",
"scenarioVersion": 1,
"projectionVersion": 2,
"goldenFormatVersion": 5,
"values": {
"9855d4ec3415": {
"busy": false,
"dialog": {
"$rpc": "null"
},
"error": {
"$rpc": "null"
},
"keyboardValue": "hello",
"pointerModifiers": []
},
"be3e7ad116a5": {
"name": "browser.dialogDismiss#1",
"args": [
{
"name": "method",
"value": "browser.dialogDismiss"
},
{
"name": "params",
"value": {
"page": "page-1",
"worktree": "id:worktree-1"
}
},
{
"name": "options",
"value": {
"timeoutMs": 5000
}
}
],
"settlement": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"id": "frame-1",
"ok": true,
"result": {
"dismissed": true
}
}
}
},
"e14582853169": {
"name": "browser.dialogDismiss#1",
"json": "{\"id\":\"frame-1\",\"deviceToken\":\"recording-device\",\"method\":\"browser.dialogDismiss\",\"params\":{\"worktree\":\"id:worktree-1\",\"page\":\"page-1\"}}"
},
"eb79a9b3682a": {
"status": "fulfilled",
"startedAt": 0,
"settledAt": 0,
"value": {
"$rpc": "undefined"
}
}
},
"recording": {
"scenario": "browser-dialog-dismissed",
"checkpoints": [
{
"id": "dismissed",
"observation": {
"sender": ["be3e7ad116a5"],
"payloads": ["e14582853169"],
"settlements": {
"mount": "eb79a9b3682a",
"dialog": "eb79a9b3682a"
},
"state": "9855d4ec3415",
"effects": []
}
}
]
}
}
@@ -6,7 +6,7 @@
"baseline": "c6a72169843ececf3a21da370ac50c5c5a4e6462",
"lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571",
"recorderSha256": "6145e3e91fe5b17a9262db21965a2a23535ff01bba1ec2c662e68ab8e13c24da",
"adapterSha256": "2fc41099434386a9b110ad53b2ead737afad0d57a8eb48f944cf5bd77007e402",
"adapterSha256": "6bc6da818394e2e35b873fa44bc4f2cf6ce3bcbbc3bb0a738765aaa25b884a0f",
"scenarioSha256": "eb2294c30af70ebc2bac092dc5105249ae8cf1941f750406622f7ff6dd70cc1b",
"platform": "darwin",
"scenarioVersion": 1,
@@ -6,7 +6,7 @@
"baseline": "c6a72169843ececf3a21da370ac50c5c5a4e6462",
"lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571",
"recorderSha256": "6145e3e91fe5b17a9262db21965a2a23535ff01bba1ec2c662e68ab8e13c24da",
"adapterSha256": "2fc41099434386a9b110ad53b2ead737afad0d57a8eb48f944cf5bd77007e402",
"adapterSha256": "6bc6da818394e2e35b873fa44bc4f2cf6ce3bcbbc3bb0a738765aaa25b884a0f",
"scenarioSha256": "73faa87b359a11959543542016295bb6b36a10934dd99ad5c1a77a4290a608cd",
"platform": "darwin",
"scenarioVersion": 1,
@@ -6,7 +6,7 @@
"baseline": "c6a72169843ececf3a21da370ac50c5c5a4e6462",
"lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571",
"recorderSha256": "6145e3e91fe5b17a9262db21965a2a23535ff01bba1ec2c662e68ab8e13c24da",
"adapterSha256": "2fc41099434386a9b110ad53b2ead737afad0d57a8eb48f944cf5bd77007e402",
"adapterSha256": "6bc6da818394e2e35b873fa44bc4f2cf6ce3bcbbc3bb0a738765aaa25b884a0f",
"scenarioSha256": "20779e28880cf62340bc34cef8f40a49311e11262ac069df909743da9b5500ff",
"platform": "darwin",
"scenarioVersion": 1,
@@ -6,7 +6,7 @@
"baseline": "c6a72169843ececf3a21da370ac50c5c5a4e6462",
"lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571",
"recorderSha256": "6145e3e91fe5b17a9262db21965a2a23535ff01bba1ec2c662e68ab8e13c24da",
"adapterSha256": "2fc41099434386a9b110ad53b2ead737afad0d57a8eb48f944cf5bd77007e402",
"adapterSha256": "6bc6da818394e2e35b873fa44bc4f2cf6ce3bcbbc3bb0a738765aaa25b884a0f",
"scenarioSha256": "e1bc21248ccff45ff217e385a51618b6f5724c037bfbefa03bb76a48dd4d793b",
"platform": "darwin",
"scenarioVersion": 1,
@@ -6,7 +6,7 @@
"baseline": "c6a72169843ececf3a21da370ac50c5c5a4e6462",
"lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571",
"recorderSha256": "6145e3e91fe5b17a9262db21965a2a23535ff01bba1ec2c662e68ab8e13c24da",
"adapterSha256": "00864bce221e5c5e72f10c30939a40b26bdb342913a59770ff8c92fc02309f27",
"adapterSha256": "0326d26df79bf4930e2af844b07a09047f0be9bae90ab7dc2a39c330b827473b",
"scenarioSha256": "efb8d1cd2a2ff0ade4cdc48a1aacec565e33b405bbe95c100b86534cdde49740",
"platform": "darwin",
"scenarioVersion": 1,
@@ -6,7 +6,7 @@
"baseline": "c6a72169843ececf3a21da370ac50c5c5a4e6462",
"lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571",
"recorderSha256": "6145e3e91fe5b17a9262db21965a2a23535ff01bba1ec2c662e68ab8e13c24da",
"adapterSha256": "00864bce221e5c5e72f10c30939a40b26bdb342913a59770ff8c92fc02309f27",
"adapterSha256": "0326d26df79bf4930e2af844b07a09047f0be9bae90ab7dc2a39c330b827473b",
"scenarioSha256": "a5698ca720dad08561a509c9c18f7586611fc68c58bd86791f4fcefc7915ab1f",
"platform": "darwin",
"scenarioVersion": 1,
@@ -6,7 +6,7 @@
"baseline": "c6a72169843ececf3a21da370ac50c5c5a4e6462",
"lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571",
"recorderSha256": "6145e3e91fe5b17a9262db21965a2a23535ff01bba1ec2c662e68ab8e13c24da",
"adapterSha256": "2fc41099434386a9b110ad53b2ead737afad0d57a8eb48f944cf5bd77007e402",
"adapterSha256": "6bc6da818394e2e35b873fa44bc4f2cf6ce3bcbbc3bb0a738765aaa25b884a0f",
"scenarioSha256": "9cae732e4227d4c2fe874a5fb2e104552c16cbc91b59523de8fd46454660cde8",
"platform": "darwin",
"scenarioVersion": 1,
@@ -6,7 +6,7 @@
"baseline": "c6a72169843ececf3a21da370ac50c5c5a4e6462",
"lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571",
"recorderSha256": "6145e3e91fe5b17a9262db21965a2a23535ff01bba1ec2c662e68ab8e13c24da",
"adapterSha256": "2fc41099434386a9b110ad53b2ead737afad0d57a8eb48f944cf5bd77007e402",
"adapterSha256": "6bc6da818394e2e35b873fa44bc4f2cf6ce3bcbbc3bb0a738765aaa25b884a0f",
"scenarioSha256": "fc3411f3f4cb58b6a1338ea943f59446fda7819931814e9ab002e35e2de42462",
"platform": "darwin",
"scenarioVersion": 1,
@@ -6,7 +6,7 @@
"baseline": "c6a72169843ececf3a21da370ac50c5c5a4e6462",
"lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571",
"recorderSha256": "6145e3e91fe5b17a9262db21965a2a23535ff01bba1ec2c662e68ab8e13c24da",
"adapterSha256": "2fc41099434386a9b110ad53b2ead737afad0d57a8eb48f944cf5bd77007e402",
"adapterSha256": "6bc6da818394e2e35b873fa44bc4f2cf6ce3bcbbc3bb0a738765aaa25b884a0f",
"scenarioSha256": "c1df871e84d4399e9a447caaff244241933c0dfc7c3d5e114d022e54b0ed7ed4",
"platform": "darwin",
"scenarioVersion": 1,
@@ -6,7 +6,7 @@
"baseline": "c6a72169843ececf3a21da370ac50c5c5a4e6462",
"lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571",
"recorderSha256": "6145e3e91fe5b17a9262db21965a2a23535ff01bba1ec2c662e68ab8e13c24da",
"adapterSha256": "2fc41099434386a9b110ad53b2ead737afad0d57a8eb48f944cf5bd77007e402",
"adapterSha256": "6bc6da818394e2e35b873fa44bc4f2cf6ce3bcbbc3bb0a738765aaa25b884a0f",
"scenarioSha256": "74adcaa668164bc7430e9984f100988bf72975dc8ebbe6b52fac34367cf31a4d",
"platform": "darwin",
"scenarioVersion": 1,
@@ -6,7 +6,7 @@
"baseline": "c6a72169843ececf3a21da370ac50c5c5a4e6462",
"lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571",
"recorderSha256": "6145e3e91fe5b17a9262db21965a2a23535ff01bba1ec2c662e68ab8e13c24da",
"adapterSha256": "2fc41099434386a9b110ad53b2ead737afad0d57a8eb48f944cf5bd77007e402",
"adapterSha256": "6bc6da818394e2e35b873fa44bc4f2cf6ce3bcbbc3bb0a738765aaa25b884a0f",
"scenarioSha256": "db84000f262c6812db55b5f735ab7fe32c914e9ab52b9a7ccc0c21386b782298",
"platform": "darwin",
"scenarioVersion": 1,
@@ -6,7 +6,7 @@
"baseline": "c6a72169843ececf3a21da370ac50c5c5a4e6462",
"lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571",
"recorderSha256": "6145e3e91fe5b17a9262db21965a2a23535ff01bba1ec2c662e68ab8e13c24da",
"adapterSha256": "2fc41099434386a9b110ad53b2ead737afad0d57a8eb48f944cf5bd77007e402",
"adapterSha256": "6bc6da818394e2e35b873fa44bc4f2cf6ce3bcbbc3bb0a738765aaa25b884a0f",
"scenarioSha256": "35ef15037791fa2e87456ee4585ddaaa00fbf5cde578d7c0b5df143cd40dd9a1",
"platform": "darwin",
"scenarioVersion": 1,
@@ -6,7 +6,7 @@
"baseline": "c6a72169843ececf3a21da370ac50c5c5a4e6462",
"lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571",
"recorderSha256": "6145e3e91fe5b17a9262db21965a2a23535ff01bba1ec2c662e68ab8e13c24da",
"adapterSha256": "2fc41099434386a9b110ad53b2ead737afad0d57a8eb48f944cf5bd77007e402",
"adapterSha256": "6bc6da818394e2e35b873fa44bc4f2cf6ce3bcbbc3bb0a738765aaa25b884a0f",
"scenarioSha256": "47868afdd6d593526ea6f0a0a1e19377ee8306ab70636f2dace0da9ef2454397",
"platform": "darwin",
"scenarioVersion": 1,
@@ -6,7 +6,7 @@
"baseline": "c6a72169843ececf3a21da370ac50c5c5a4e6462",
"lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571",
"recorderSha256": "6145e3e91fe5b17a9262db21965a2a23535ff01bba1ec2c662e68ab8e13c24da",
"adapterSha256": "2fc41099434386a9b110ad53b2ead737afad0d57a8eb48f944cf5bd77007e402",
"adapterSha256": "6bc6da818394e2e35b873fa44bc4f2cf6ce3bcbbc3bb0a738765aaa25b884a0f",
"scenarioSha256": "c1283bbfb340e968bbd4c86ac63489995d6191290751316228d27779dc6a2c55",
"platform": "darwin",
"scenarioVersion": 1,
@@ -6,7 +6,7 @@
"baseline": "c6a72169843ececf3a21da370ac50c5c5a4e6462",
"lockfileSha256": "788c1234b38a61fc882fca292341fce6690deee9cc6695673b0575cf2c4cf571",
"recorderSha256": "6145e3e91fe5b17a9262db21965a2a23535ff01bba1ec2c662e68ab8e13c24da",
"adapterSha256": "2fc41099434386a9b110ad53b2ead737afad0d57a8eb48f944cf5bd77007e402",
"adapterSha256": "6bc6da818394e2e35b873fa44bc4f2cf6ce3bcbbc3bb0a738765aaa25b884a0f",
"scenarioSha256": "092777c9ce457dcae95eafbe083c70510580569ac74e31c0d4224ac94b9fad76",
"platform": "darwin",
"scenarioVersion": 1,
@@ -7902,6 +7902,46 @@
"checkpoint": "dismissed"
}
]
},
{
"id": "browser-dialog-dismissed",
"operation": "browser.page-commands",
"version": 1,
"family": "browser.dialog",
"sites": [
"mobile/src/browser/use-mobile-browser-request.ts",
"mobile/src/browser/use-mobile-browser-commands.ts"
],
"schedules": [],
"steps": [
{
"action": "mount",
"id": "mount"
},
{
"action": "dialog",
"id": "dialog",
"args": {
"accept": false
}
},
{
"complete": "browser.dialogDismiss#1",
"params": {
"page": "page-1",
"worktree": "id:worktree-1"
},
"reply": {
"ok": true,
"result": {
"dismissed": true
}
}
},
{
"checkpoint": "dismissed"
}
]
}
]
}
@@ -1,8 +1,8 @@
import { optionalSettingsRead } from '../transport/settings-read-operations'
import { refusedRpcMessageOrFallback } from '../transport/rpc-refusal-message'
import { rpcPayloadMember } from '../transport/rpc-reader-payload'
import { readAcceptedResumeList } from './resume-metadata-lists'
import {
readAcceptedResumeList,
resumeFolderWorkspaceListRead,
resumeProjectGroupListRead,
resumeRepoListRead,
@@ -79,18 +79,3 @@ export const resumeWorktreeListRead = bindDeferredRpcOperation(
read: rpcUncheckedPayloadReader('resume-worktrees')
})
)
/**
* One list off an enrichment read. Optional-chained on purpose: main tolerated both a refusal and
* a null result here, and folding the member read into the reader would have thrown on the latter.
*/
export function readAcceptedResumeList<T>(
accepted: { accepted: false } | { accepted: true; value: unknown } | null,
key: string
): T[] | undefined {
if (!accepted?.accepted) {
return undefined
}
// oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary.
return (accepted.value as Record<string, T[] | undefined> | null | undefined)?.[key]
}
@@ -0,0 +1,16 @@
/**
* One list off an enrichment read in the resume sheet's metadata load.
*
* Optional-chained on purpose: main tolerated both a refusal and a null result here, so folding
* the member read into the operation's own reader would have started throwing on the latter.
*/
export function readAcceptedResumeList<T>(
accepted: { accepted: false } | { accepted: true; value: unknown } | null,
key: string
): T[] | undefined {
if (!accepted?.accepted) {
return undefined
}
// oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary.
return (accepted.value as Record<string, T[] | undefined> | null | undefined)?.[key]
}
+4 -3
View File
@@ -243,12 +243,13 @@ export function MobileBrowserPane({
setError('Enter a valid URL.')
return
}
const result = (await sendBrowserRequest(
const settled = await sendBrowserRequest(
async (rpc, page, options) =>
browserNavigate.interpret(await browserNavigate.request(rpc, { ...page, url }, options)),
{ showBusy: true, timeoutMs: 30_000 }
// oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary.
)) as { url?: string } | null
)
// oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: Preserve the established response shape at this boundary.
const result = settled as { url?: string } | null
if (typeof result?.url === 'string') {
setAddressValue(displayBrowserUrl(result.url))
lastZoomResetUrlRef.current = result.url
@@ -72,13 +72,14 @@ export function agentHistoryMountAdapters(
let worktreesLoaded = true
let renderer: ReactTestRenderer | undefined
function Harness() {
observed.history = useHistory({
// oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: the hook and its scope derivation read only these three worktree fields.
const params = {
hostId: HOST_ID,
worktreeId: WORKTREE_ID,
worktrees: WORKTREES,
worktreesLoaded
// oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: the hook and its scope derivation read only these three worktree fields.
} as unknown as Parameters<typeof useHistory>[0])
} as unknown as Parameters<typeof useHistory>[0]
observed.history = useHistory(params)
return null
}
const element = () =>
@@ -1,3 +1,4 @@
import type { Dispatch, SetStateAction } from 'react'
import type { MountAdapter } from '../recording-scenario'
import { hookMount, performHookAction } from '../hook-mount'
import type { operationModuleLoader } from '../operation-module-loader'
@@ -29,6 +30,12 @@ export function browserMountAdapters(
let dialog: { dialogType: string; message: string } | null = null
let keyboardValue = 'hello'
let pointerModifiers: string[] = []
// React's own setter shape, so the recorder reads an updater the way the hook writes one.
const setter =
<T>(read: () => T, write: (value: T) => void): Dispatch<SetStateAction<T>> =>
(next) =>
// oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: SetStateAction's function arm is exactly this updater; the typeof check is what narrows it.
write(typeof next === 'function' ? (next as (prev: T) => T)(read()) : next)
let commands: ReturnType<typeof useCommands>
const hook = hookMount(() => {
// oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: the recorder supplies plain setters where the hook declares React dispatchers.
@@ -36,12 +43,18 @@ export function browserMountAdapters(
busyRef,
client,
pageId: PAGE_ID,
setBusy: (next: unknown) => {
busy = typeof next === 'function' ? next(busy) : next === true
},
setError: (next: unknown) => {
error = typeof next === 'function' ? next(error) : (next as string | null)
},
setBusy: setter(
() => busy,
(value) => {
busy = value
}
),
setError: setter(
() => error,
(value) => {
error = value
}
),
worktreeId: WORKTREE_ID
} as unknown as Parameters<typeof useRequest>[0])
// oxlint-disable-next-line typescript/consistent-type-assertions -- SAFETY: the recorder supplies only the refs, setters and geometry the commands hook reads.
@@ -54,18 +67,30 @@ export function browserMountAdapters(
pageParams,
pointerModifiers,
sendBrowserRequest,
setDialog: (next: unknown) => {
dialog = typeof next === 'function' ? next(dialog) : next
},
setError: (next: unknown) => {
error = typeof next === 'function' ? next(error) : (next as string | null)
},
setKeyboardValue: (next: string) => {
keyboardValue = next
},
setPointerModifiers: (next: unknown) => {
pointerModifiers = typeof next === 'function' ? next(pointerModifiers) : next
},
setDialog: setter(
() => dialog,
(value) => {
dialog = value
}
),
setError: setter(
() => error,
(value) => {
error = value
}
),
setKeyboardValue: setter(
() => keyboardValue,
(value) => {
keyboardValue = value
}
),
setPointerModifiers: setter(
() => pointerModifiers,
(value) => {
pointerModifiers = value
}
),
zoomRef: { current: { scale: 1, offsetX: 0, offsetY: 0 } }
} as unknown as Parameters<typeof useCommands>[0])
})
@@ -53,10 +53,10 @@ export const UNVALIDATED_RPC_REQUEST_PORT_PENDING: readonly UnvalidatedRpcReques
{ file: 'app/terminal-settings.tsx', references: 3 },
// src/agent-history/ — agent history loads
// Holdout: the last reach is a worktree.ps inside the screen component's own effect, which no
// recording can mount without a fabricated react-native view tree.
{ file: 'src/agent-history/MobileAgentSessionHistoryPanel.tsx', references: 1 },
// src/browser/ — hosted browser control
// src/components/ — shared widgets that fetch their own data
{ file: 'src/components/codex-reset-credit-capability.ts', references: 2 },
{ file: 'src/components/codex-reset-credit.ts', references: 3 },
@@ -65,8 +65,6 @@ export const UNVALIDATED_RPC_REQUEST_PORT_PENDING: readonly UnvalidatedRpcReques
{ file: 'src/components/use-new-workspace-runtime-context.ts', references: 3 },
{ file: 'src/components/use-new-workspace-setup-script.ts', references: 1 },
// src/dictation/ — dictation session control
// src/files/ — file read, write and preview
{ file: 'src/files/mobile-file-mutation-ownership.ts', references: 3 },
{ file: 'src/files/mobile-file-preview-request.ts', references: 6 },
@@ -77,8 +75,6 @@ export const UNVALIDATED_RPC_REQUEST_PORT_PENDING: readonly UnvalidatedRpcReques
// src/home/ — home screen host reads
{ file: 'src/home/mobile-home-host-requests.ts', references: 5 },
// src/hooks/ — cross-screen data hooks
// src/host-screen/ — host screen catalog and actions
{ file: 'src/host-screen/host-screen-overlays.tsx', references: 1 },
{ file: 'src/host-screen/use-host-repo-metadata.ts', references: 1 },
@@ -86,7 +82,11 @@ export const UNVALIDATED_RPC_REQUEST_PORT_PENDING: readonly UnvalidatedRpcReques
{ file: 'src/host-screen/use-host-worktree-actions.ts', references: 3 },
// src/notifications/ — push registration and delivery
// Holdout: the unsubscribe is a closure inside a `subscribe` callback, and subscriptions are a
// later step; the request-only recording runner refuses to open one.
{ file: 'src/notifications/mobile-notifications.ts', references: 1 },
// Holdout: the send is gated behind the OS notification tray and the keychain host catalog, and
// faking either would record a fiction of device state rather than of the wire.
{ file: 'src/notifications/push-dismissal-reconciliation.ts', references: 2 },
// src/session/ — session screen: chat, diff review, PR actions, tabs
@@ -138,8 +138,6 @@ export const UNVALIDATED_RPC_REQUEST_PORT_PENDING: readonly UnvalidatedRpcReques
{ file: 'src/session/use-mobile-terminal-paste.ts', references: 1 },
{ file: 'src/session/use-quick-commands.ts', references: 2 },
// src/settings/ — settings screen actions
// src/settings/ — notification display probe
{ file: 'src/settings/notification-display-test.tsx', references: 1 },
@@ -186,8 +184,6 @@ export const UNVALIDATED_RPC_REQUEST_PORT_PENDING: readonly UnvalidatedRpcReques
{ file: 'src/tasks/use-mobile-tasks-task-list-loading.tsx', references: 4 },
{ file: 'src/tasks/use-mobile-tasks-task-pagination-actions.tsx', references: 1 },
// src/terminal/ — terminal input, viewport and queries
// src/transport/ — pairing, endpoint probing and capability reads
{ file: 'src/transport/host-status-gates.ts', references: 1 },
{ file: 'src/transport/mobile-relay-credential-rotation.ts', references: 2 },