From 3d8da459f140124215ffcc05184d30040137630b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pierzcha=C5=82a?= Date: Thu, 15 Oct 2026 12:55:43 +0200 Subject: [PATCH] chore(interaction): remove retired readiness forwarding --- .../interaction-touch-response.test.ts | 22 ++++------------- .../internal/interaction-touch-response.ts | 1 - ...on-replay-runtime-failure-response.test.ts | 24 ------------------- ...session-replay-runtime-failure-response.ts | 1 - .../__tests__/command-tools-readiness.test.ts | 20 ---------------- 5 files changed, 4 insertions(+), 64 deletions(-) delete mode 100644 src/mcp/__tests__/command-tools-readiness.test.ts diff --git a/packages/daemon/src/execution/interaction/internal/__tests__/interaction-touch-response.test.ts b/packages/daemon/src/execution/interaction/internal/__tests__/interaction-touch-response.test.ts index 13ea9cd835..5ba9173951 100644 --- a/packages/daemon/src/execution/interaction/internal/__tests__/interaction-touch-response.test.ts +++ b/packages/daemon/src/execution/interaction/internal/__tests__/interaction-touch-response.test.ts @@ -85,7 +85,7 @@ test('commandless longpress response omits internal interaction diagnostics', () ).toEqual({ completedSteps: 1 }); }); -function selectorResult(readiness?: { polls: number; waitedMs: number }): PressCommandResult { +function selectorResult(): PressCommandResult { return { kind: 'selector', point: { x: 10, y: 20 }, @@ -93,12 +93,9 @@ function selectorResult(readiness?: { polls: number; waitedMs: number }): PressC node: { ref: 'e1', index: 0, type: 'Button', label: 'Continue' }, selectorChain: ['label=Continue'], warning: 'earlier warning', - ...(readiness ? { readiness } : {}), }; } -const WAITED_SELECTOR_RESULT = selectorResult({ polls: 3, waitedMs: 400 }); - test.each([false, true])('selector-touch observation after retirement=%s', async (retired) => { const sessionStore = makeSessionStore(); const address = 'cwd:selector-touch-response:default'; @@ -252,25 +249,14 @@ test.each([ }, ); -test('the response builder reports the resolved wait and keeps the prior warning', () => { - const { responseData, result } = buildInteractionResponseData({ - source: { kind: 'runtime', result: WAITED_SELECTOR_RESULT }, - referenceFrame: undefined, - staleRefsWarning: 'stale refs', - }); - - expect(responseData.readiness).toEqual({ polls: 3, waitedMs: 400 }); - expect(responseData.warning).toBe('earlier warning stale refs'); - expect(result.readiness).toBeUndefined(); -}); - -test('the response builder omits readiness when nothing waited', () => { +test('the response builder keeps the prior warning', () => { const { responseData } = buildInteractionResponseData({ source: { kind: 'runtime', result: selectorResult() }, referenceFrame: undefined, + staleRefsWarning: 'stale refs', }); - expect('readiness' in responseData).toBe(false); + expect(responseData.warning).toBe('earlier warning stale refs'); }); test('an already retired coordinate touch skips its frame probe without a warning', async () => { diff --git a/packages/daemon/src/execution/interaction/internal/interaction-touch-response.ts b/packages/daemon/src/execution/interaction/internal/interaction-touch-response.ts index 36ab7bcdee..bc71151c9e 100644 --- a/packages/daemon/src/execution/interaction/internal/interaction-touch-response.ts +++ b/packages/daemon/src/execution/interaction/internal/interaction-touch-response.ts @@ -236,7 +236,6 @@ export function buildInteractionResponseData(params: { visualization.warning = warning; responseData.warning = warning; } - if ('readiness' in result && result.readiness) responseData.readiness = result.readiness; return { result: visualization, responseData, ...recordedTargetCapture(result) }; } diff --git a/packages/replay-port/src/daemon-port/__tests__/session-replay-runtime-failure-response.test.ts b/packages/replay-port/src/daemon-port/__tests__/session-replay-runtime-failure-response.test.ts index 9a8edededd..18445258fe 100644 --- a/packages/replay-port/src/daemon-port/__tests__/session-replay-runtime-failure-response.test.ts +++ b/packages/replay-port/src/daemon-port/__tests__/session-replay-runtime-failure-response.test.ts @@ -52,30 +52,6 @@ test('native replay failure metadata keeps machine fields and daemon-owned paths expect(response.error.details).not.toHaveProperty('reas'); }); -test('a replay divergence carries the readiness evidence of an exhausted target wait', () => { - const readiness = { polls: 11, waitedMs: 2_004, end: 'expired' }; - const response = buildReplayDivergenceFailureResponseFromDescriptor({ - error: { - code: 'COMMAND_FAILED', - message: 'Selector did not match', - details: { reason: 'selector_not_found', readiness }, - }, - actionLabel: 'press label=Continue', - action: 'press', - positionals: ['label=Continue'], - step: 3, - replayPath: '/tmp/flows/checkout.ad', - artifactPaths: [], - divergence: {}, - scrubVars: [], - }); - - expect(response.ok).toBe(false); - if (response.ok) return; - expect(response.error.code).toBe('REPLAY_DIVERGENCE'); - expect(response.error.details).toMatchObject({ reason: 'selector_not_found', readiness }); -}); - // #2997: the Android platform states `open --test-ime` because it sees one dispatched // session-open. On this surface that advice is unactionable — a flow caller never runs // `open` — so the cause's hint is replaced off the typed reason, never off the message. diff --git a/packages/replay-port/src/daemon-port/session-replay-runtime-failure-response.ts b/packages/replay-port/src/daemon-port/session-replay-runtime-failure-response.ts index 0b55f409ee..c73642f7d6 100644 --- a/packages/replay-port/src/daemon-port/session-replay-runtime-failure-response.ts +++ b/packages/replay-port/src/daemon-port/session-replay-runtime-failure-response.ts @@ -141,7 +141,6 @@ function readStringDetail( } const SAFE_CAUSE_DETAIL_KEYS = [ - 'readiness', 'reason', 'recovery', 'retriable', diff --git a/src/mcp/__tests__/command-tools-readiness.test.ts b/src/mcp/__tests__/command-tools-readiness.test.ts deleted file mode 100644 index 73ab2c4596..0000000000 --- a/src/mcp/__tests__/command-tools-readiness.test.ts +++ /dev/null @@ -1,20 +0,0 @@ -import assert from 'node:assert/strict'; -import { test } from 'vitest'; -import { createAgentDeviceClient } from '../../agent-device-client.ts'; -import { createTransport } from '../../__tests__/client-transport-fixture.ts'; -import { createCommandToolExecutor } from '../command-tools.ts'; - -test('MCP press returns the daemon data.readiness in structuredContent', async () => { - const readiness = { polls: 2, waitedMs: 180 }; - const setup = createTransport(async () => ({ ok: true, data: { ref: '@e1', readiness } })); - const executor = createCommandToolExecutor({ - createClient: () => createAgentDeviceClient(setup.config, { transport: setup.transport }), - }); - - const result = await executor.execute('press', { - target: { kind: 'selector', selector: 'label=Continue' }, - }); - - assert.equal(result.isError, false); - assert.deepEqual(result.structuredContent?.readiness, readiness); -});