Skip to main content
Glama

agent-device

npm version CI License: MIT Glama MCP server

Mobile app automation and verification for AI coding agents. Give coding agents a live app feedback loop through a CLI, built-in MCP server, or typed Node.js API.

Let your coding agent verify its changes in the running app. agent-device lets agents inspect, control, debug, and verify apps on iOS, Android, and HarmonyOS (simulators, emulators, and physical devices), plus tvOS, Android TV, Fire TV (Fire OS), Amazon Vega OS TV (Vega Virtual Device), web, macOS, and Linux. Agents read token-efficient accessibility snapshots instead of reasoning over screenshots alone, act through refs and selectors, and save evidence for review. It also coordinates device access across parallel agent worktrees and connects to remote device clouds.

Works with Claude Code, Codex, Cursor, Windsurf, Cline, Goose, and any agent that can run a CLI or connect over MCP, or as the runtime under agents you build with the AI SDK or Eve. Developers at Expensify, Shopify, and others use it to verify their apps.

Quick start

Install the CLI and check setup. It requires Node.js 22.12 or newer; web automation requires Node.js 24 or newer. See Installation for target requirements.

npm install -g agent-device@latest
agent-device doctor
agent-device help workflow

Run doctor yourself before you hand the CLI to an agent. help workflow links to the guides for debugging, replay, and profiling.

Drive an app from the CLI

Add a contact in the built-in iOS Contacts app:

# Start a session.
agent-device open Contacts --platform ios

# Inspect the screen. The example below shows the output; refs vary.
agent-device snapshot -i
# @e2 [button] "Add"

# Use the ref and wait for the UI to settle.
agent-device press @e2 --settle
# The diff includes:
# + @e7 [text-field] "First name"

agent-device fill @e7 "Ada" --settle
# The next diff shows changed values and current refs:
# - @e7 [text-field] "First name"
# + @e14 [text-field] "Ada"
# = @e15 [text-field] "Last name"

# Capture evidence and close the session.
agent-device screenshot ./contact-form.png
agent-device close

Refs are valid only in the latest output: after a --settle command, use the refs in its diff, and take a new snapshot only if the diff omits what you need. Snapshots come from the app's accessibility tree, so clear labels, roles, and test IDs make agent runs more reliable; use screenshots and video as evidence or when accessibility data is poor.

agent-device demo showing Codex using agent-device to create a new contact in the iOS Contacts app from a simple prompt

Add MCP tools to your agent

agent-device mcp starts the official stdio MCP server, exposing the installed commands as structured tools over the same execution path as the CLI:

{
  "mcpServers": {
    "agent-device": {
      "command": "agent-device",
      "args": ["mcp"]
    }
  }
}

See AI Agent Setup for per-client setup and when to prefer plain CLI over MCP.

Script it from Node.js

createAgentDeviceClient() gives Node.js code typed access to the same commands, as model tools in your own agent or from orchestration code:

import { createAgentDeviceClient } from 'agent-device';

const client = createAgentDeviceClient({ session: 'qa-run' });
try {
  await client.apps.open({ app: 'com.apple.Preferences', platform: 'ios' });
  const snapshot = await client.capture.snapshot({ interactiveOnly: true });
  const button = snapshot.nodes.find((node) => node.role === 'button');
  if (button) await client.interactions.press({ ref: button.ref });
} finally {
  await client.sessions.close();
}

See the Node.js API, the runnable examples, and the AI SDK and Eve integration guides.

Related MCP server: Taproom

What agents can do

  • Inspect app state through accessibility snapshots, refs, and selectors, and profile React Native renders to find what makes an interaction slow.

  • Act on visible UI by tapping or pressing elements, filling fields, scrolling, making gestures, waiting, asserting state, and handling alerts.

  • Diagnose failures with screenshots, video, logs, traces, network data, performance samples, crash details, and React profiles.

  • Repeat workflows by saving working steps as .ad scripts for local use or CI. Export strict Maestro YAML when needed.

See Commands for the commands and evidence each target supports.

Diagram of the agentic development loop: humans assign tasks, agents write and review code, agent-device verifies mobile apps, pull requests receive evidence, and bugs or performance issues lead to fixes

What to ask your agent

With the CLI installed, prompts like these work end to end:

  • "Implement the onboarding screen, run it on the iOS simulator and Android emulator, and attach screenshots."

  • "Reproduce this crash and capture the logs that lead up to it."

  • "Check whether this change causes unnecessary React Native re-renders."

  • "Explore the checkout flow once, save it as a replay script, and run it in CI."

  • "Verify this pull request on a physical device and attach reviewable evidence."

Next steps

Where to run agent-device

The same session and evidence model works at every step: the agent explores the app, captures evidence, saves a replay, runs it in CI, and moves onto remote devices.

Path

Best for

Start with

Local

Trying commands and debugging apps on simulators, emulators, physical devices, macOS, and Linux.

Follow the Quick Start.

CI/CD

Automated pull request and merge validation with replay scripts and captured artifacts.

Try the EAS workflow template.

Cloud / remote

Linux runners, managed devices, and remote jobs.

Set up a remote proxy, connect a device cloud (BrowserStack, AWS Device Farm, TestMu AI, Limrun), or contact Callstack for team QA.

How it works

agent-device keeps device state in sessions. It uses a local accessibility bridge for iOS Simulator snapshots and XCTest for iOS interactions, physical iOS, and tvOS; ADB and the snapshot helper on Android, Android TV, and Fire OS; HDC and ArkUI uitest on HarmonyOS; Vega CLI/VDA on the Vega Virtual Device; a local helper on macOS, including Electron and other Chromium-based apps through the accessibility tree; and AT-SPI on Linux.

Support depth varies by target. Some backends, such as HarmonyOS and Vega OS, cover a subset of commands; run agent-device capabilities --platform <platform> to see what a target supports.

Sessions are scoped to the caller's git worktree, and host-local device claims stop parallel agents from taking over each other's simulators and emulators. Run agent-device device status to inspect ownership without a daemon, and agent-device device release --stale to release claims whose owner is provably no longer running. The same commands drive hosted devices on BrowserStack, AWS Device Farm, TestMu AI, and Limrun.

agent-device uses the inspect-act-verify process from Vercel's agent-browser for mobile, TV, and desktop apps. Basic --platform web support runs agent-browser in the same session and replay system.

FAQ

What is agent-device?

agent-device is a command-line tool and MCP server that lets AI coding agents inspect, control, and verify mobile apps and save evidence for review. It supports iOS, Android, HarmonyOS, TV, web, macOS, and Linux.

Is there an MCP server for mobile app automation?

Yes. agent-device mcp starts the official stdio MCP server. The Quick start above has the client config, and AI Agent Setup covers per-client details.

Does it work with React Native, Expo, Flutter, and native apps?

Yes. agent-device supports native iOS and Android apps, plus React Native, Expo, and Flutter apps on supported targets. The commands and evidence vary by target.

How is it different from mobile MCP servers?

The MCP server is one entry point to the same runtime used by the CLI and typed Node.js API. Sessions, device ownership, selectors, evidence, replay, CI workflows, and cloud routing stay consistent across all three.

Can I build my own agent or QA product on agent-device?

Yes. The typed Node.js client is a public surface over that same runtime, so an agent you build inherits everything above. Start from the Node.js API, AI SDK, or Eve guides.

How is it different from Appium, Detox, or Maestro?

With agent-device, an agent reads app state and chooses each command at run time. Teams use Appium, Detox, and Maestro to write and maintain test suites. agent-device can complement them by saving its runs as .ad scripts or exporting them as strict Maestro YAML.

Can agent-device run in CI?

Yes. Record a run as an .ad script, replay it in CI, and keep the screenshots and logs as artifacts; the EAS workflow template is a working example.

Articles and videos

Articles

Videos

Who uses agent-device?

Teams and developers at Callstack, JPMorgan Chase, Expensify, Shopify, Kindred, Total Wine & More, LegendList, HerLyfe, App & Flow, and others use agent-device.

Documentation

Contributing

See CONTRIBUTING.md.

Made at Callstack

agent-device is open source under the MIT license. Visit agent-device.dev or contact Callstack.

Available Tools

62 tools
action-buttonA

Press the iPhone or iPad Action Button once. The press is dispatched without activating the session app and nothing is re-observed afterwards, so the app keeps the state the press found. What the system does with the press is not observed by this command: Simulators run no Shortcuts or App Intents, so delivery to an assigned Shortcut is verifiable only on a physical iPhone. Times out after 90s.

NameRequiredDescriptionDefault
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription
actionYes
messageYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It explains that the press does not activate the session app, that nothing is re-observed so state is preserved, that the system's response is not observed, and that the command times out after 90 seconds. This is unusually thorough.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three focused sentences with no filler. The core action is front-loaded, followed by the most important behavioral caveat and the timeout. Every sentence adds information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has no annotations but has a rich input schema and an output schema. The description covers the essential non-obvious runtime behavior: side-effect scope, observation behavior, simulator limitations, verification constraints, and timeout. Nothing critical is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline applies: the schema already explains every parameter. The description adds no parameter-specific guidance, which is acceptable because the structured schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Press the iPhone or iPad Action Button once.' It also differentiates the action from generic siblings by noting the press is dispatched without activating the session app and that nothing is re-observed afterwards, making the tool's scope unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when the tool is meaningful, notably that delivery to a Shortcut is verifiable only on a physical iPhone and that simulators run no Shortcuts or App Intents. It does not explicitly name alternative sibling tools or state 'use this instead of X', but the practical when/when-not context is present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

alertA

Inspect, wait for, accept, or dismiss a platform alert. Use get before acting when the alert content matters; accept and dismiss change the active alert state. Each iOS XCTest execution activates once, then only observes. Local Apple XCTest and Limrun iOS choose recognized English labels by preference (Allow While Using App before Allow Once); equal-ranked choices and unknown labels refuse, including a lone unknown button. Open, Done, and Confirm… accept; Keep Browsing, Deny, and Skip dismiss. On the Apple XCUITest runner, dismiss taps only a recognized decline label (Cancel, Don't Allow, Ask App Not to Track, and similar) or the close element of a popover whose accessibility marker reads exactly "dismiss popup"; when no button fits the action, accept and dismiss answer ALERT_BUTTON_NOT_FOUND having tapped nothing — read labels with alert get, then press the button by label. Inspect again after an unconfirmed action; never assume a timeout means nothing happened. Times out after 90s.

NameRequiredDescriptionDefault
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
actionNo
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
timeoutMsNo
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does so: it discloses state mutation, per-execution activation limits on iOS XCTest (activates once, then only observes), label preference ordering, refusal semantics for equal-ranked or unknown labels, the ALERT_BUTTON_NOT_FOUND result with "having tapped nothing," and a 90s timeout. These are exactly the non-obvious traits an agent could not infer from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and the read-before-mutate rule are front-loaded, then platform-specific detail follows in a logical order (iOS XCTest, then Apple XCUITest runner, then failure handling, then timeout). It is dense and long, but nearly every sentence carries operational information; the label enumeration is the only mildly padded stretch.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex, platform-divergent tool with 18 parameters, no annotations, and no output schema, the description covers action semantics, per-platform matching rules, and failure modes thoroughly. The remaining gap is return-shape information — what alert get actually yields and what wait returns versus timing out — which the agent must infer.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 89%, so the schema already documents nearly every parameter and baseline is 3. The description adds only a little parameter-level meaning: the four action verbs are described in prose and the 90s timeout implicitly documents the otherwise undescribed timeoutMs. Device-resolution parameters (udid, serial, device, platform, target) get no treatment beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb set and resource: "Inspect, wait for, accept, or dismiss a platform alert," which maps directly onto the four action enum values and distinguishes it from generic interaction siblings like click or find. It also immediately flags which of those verbs mutate state ("accept and dismiss change the active alert state").

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit sequencing rules ("Use get before acting when the alert content matters," "Inspect again after an unconfirmed action") and an explicit fallback path when the built-in label matching fails: read labels with alert get, then press the button by label. It also states when not to assume success ("never assume a timeout means nothing happened").

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

appsA

List the apps installed on the selected device. Include system or OEM apps only when they are needed as automation targets. Times out after 90s.

NameRequiredDescriptionDefault
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
platformNoPlatform selector used to resolve a device.
appsFilterNoRestrict the listing to user-installed apps, or include system and OEM apps.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription
appsYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral burden; it does disclose a 90s timeout, which is useful operational context. However, it does not state side effects, default filtering behavior, or failure modes beyond the timeout, and the system/OEM sentence reads more like policy than behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the action, then a scoping rule and timeout. There is no filler; every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema and 100% parameter coverage, the description does not need to explain return values or selector semantics. It includes the non-obvious operational constraint (90s timeout) and the policy on system/OEM apps, which is sufficient for a low-complexity listing tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents all 16 parameters; the description does not need to repeat parameter details. It adds only the system/OEM condition, which overlaps with the appsFilter parameter rather than extending its meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'List the apps installed on the selected device.' This clearly distinguishes the tool from siblings like install, appstate, and snapshot. The system/OEM qualification adds scope without obscuring the core purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a conditional usage hint—include system/OEM apps only when they are needed as automation targets—but does not name alternative tools or state when not to use this one. The guidance is implied rather than explicit, so an agent must infer that apps is for enumeration before automation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

appstateB

Show foreground app/activity (Android and HarmonyOS; iOS and macOS answer per session) Times out after 90s.

NameRequiredDescriptionDefault
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
platformNoPlatform selector used to resolve a device.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden but does disclose two useful traits: a 90s timeout and the platform-dependent answer semantics (Android/HarmonyOS direct vs iOS/macOS per session). It does not state read-only safety or what happens on timeout, so the disclosure is partial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact clauses, front-loaded with the core action and immediately qualified by platform and timeout. Minor flaw: the two sentences run together without punctuation after the closing parenthesis, slightly harming readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the description covers the key operational caveats (platform scope, 90s timeout). For a zero-required-param query tool this is largely sufficient, with only the read-only/timeout-behavior detail missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all 15 device-selection and output-shaping parameters are already documented in the schema. The description adds nothing about params, which is acceptable given the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: 'Show foreground app/activity', with platform scope parenthetically qualified (Android/HarmonyOS direct; iOS/macOS per session). It is distinguishable from query siblings like apps/get, though it never names them explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance and no alternatives named. An agent must infer that this is the read for current foreground state versus siblings such as apps, is, snapshot, or session, which is a plausible confusion in this crowded sibling set.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

app-switcherA

Open the device app switcher to inspect or change foreground apps. This changes the visible system UI and may move focus away from the current app. Times out after 90s.

NameRequiredDescriptionDefault
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription
actionYes
messageYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the disclosure burden. It honestly warns that the tool 'changes the visible system UI,' 'may move focus away from the current app,' and 'times out after 90s.' These are the key behavioral side effects an agent should know before invoking the tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: purpose first, then the key side effect, then the timeout. Every sentence provides necessary information and there is no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value details are not needed in the description. The description gives the essential behavioral context: it changes system UI, may move focus, and times out. It is sufficient for a safe call, though it could also have pointed to sibling alternatives.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100%, so all 16 parameters are already documented in the input schema. The description adds no parameter-level detail, and the baseline of 3 is appropriate because the schema does the semantic heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the action and resource: 'Open the device app switcher.' It also states the purpose ('inspect or change foreground apps'), which makes the tool's intent understandable. It does not explicitly distinguish itself from sibling tools like apps, open, or focus, so it misses top marks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The intended use is implied by 'to inspect or change foreground apps,' but there is no explicit guidance about when to use this tool versus siblings such as focus, open, or apps. An agent must infer the appropriate context rather than being told directly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

artifactsB

List daemon or cloud provider artifacts for an active or completed session. Times out after 90s.

NameRequiredDescriptionDefault
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
platformNoPlatform selector used to resolve a device.
providerNoCloud provider name, for example browserstack, aws-device-farm, or testmu.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
providerSessionIdNoCloud provider session id or ARN.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It usefully discloses a 90s timeout, which is genuine behavioral context, but says nothing about permissions, whether listing is read-only, pagination, or what an artifact actually is. Partial disclosure only.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with zero waste; the core action is front-loaded and the timeout caveat follows immediately. Nothing redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 17 parameters, no annotations, and no output schema, the description is thin. Because no output schema exists, the description should explain the return shape or artifact types, and it instead only names the timeout, leaving the agent unclear on what it will actually receive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% across all 17 parameters, so the schema fully documents selectors (udid, serial, session, providerSessionId, runId, etc.). The description adds no parameter-level meaning beyond that, which is the baseline 3 when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (daemon or cloud provider artifacts) scoped to an active or completed session. It is clear what the tool does, though 'artifacts' is left undefined and it never distinguishes itself from siblings like logs or screenshot that also surface session output.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'for an active or completed session' implies a session prerequisite, but there is no explicit when-to-use, when-not-to-use, or comparison against alternatives such as logs, snapshot, or screenshot. An agent must infer the selection condition entirely.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

audioA

Measure browser or host-rendered simulator/emulator audio as compact dBFS buckets. Start a probe before requesting its status or stopping it. Times out after 90s.

NameRequiredDescriptionDefault
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
actionNo
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
bucketMsNoAudio level bucket size in milliseconds.
platformNoPlatform selector used to resolve a device.
durationMsNoProbe duration in milliseconds.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
probeActionNo
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral disclosure burden. It discloses three important behaviors: the stateful probe lifecycle, the need to start before status/stop, and the 90-second timeout. This is meaningful operational context beyond what the schema alone provides.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no fluff. The primary purpose is front-loaded, and the lifecycle constraint and timeout are stated concisely. Every sentence adds useful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the core operation and lifecycle, but the tool has 19 parameters, no required parameters, no output schema, and no explanation of how durationMs and bucketMs interact. Common selectors are documented in the schema, but an agent still lacks clear guidance on the minimal invocation or expected structured response.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is high at 89%, so the baseline is 3. The description adds value beyond the schema by explaining that 'start', 'status', and 'stop' correspond to probe lifecycle phases, and by framing outputs as 'dBFS buckets,' which gives meaning to bucketMs and durationMs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Measure browser or host-rendered simulator/emulator audio as compact dBFS buckets.' This clearly defines what the tool does and the output format, making it distinguishable from sibling tools like record or logs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit lifecycle guidance: 'Start a probe before requesting its status or stopping it.' This tells the agent the correct order of operations. It does not mention alternative tools or when not to use audio, but the core usage context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

backA

Navigate back in the app or through system navigation. Use in-app for the app navigation stack and system when the platform back behavior is required. On a single-screen iPhone, an unreadable app tree can use a top-leading tap with before/after visual verification. A capture failure reports an unknown outcome. Times out after 90s; a caller-supplied budget extends it.

NameRequiredDescriptionDefault
modeNo
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
settleNoAfter the action, wait for the UI to go quiet and return the settled diff vs the pre-action tree in the same response. Best-effort; never fails the action.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
timeoutMsNoSettle: wait deadline in milliseconds (default 10000).
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
settleQuietMsNoSettle: quiet window in milliseconds (default 500; 300 when the settled tree comes from the iOS simulator snapshot bridge). On iOS, a broad screen replacement such as a modal dismissal is confirmed for at least 1500ms whatever window is asked for, within the timeoutMs settle deadline; a replacement from a screen the pre-action capture read as presenting nothing, such as a tab switch, gets no 1500ms confirmation and keeps the asked window.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription
modeYes
actionYes
settleNo
messageYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations at all, the description carries the full burden and mostly succeeds: it discloses the 90s timeout, that a caller-supplied budget extends it, and the significant failure semantics that a capture failure yields an unknown outcome rather than a clean error. It also documents the top-leading tap workaround with before/after visual verification. It does not state auth/permission requirements or whether the action is recorded, though the schema's noRecord parameter partly covers the latter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five tight sentences, purpose front-loaded before the mode guidance and edge cases. Minor waste in "a caller-supplied budget extends it", which never names which parameter carries that budget, leaving the reader to hunt through twenty fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the timeout/failure behaviour is covered. However, for a twenty-parameter tool with zero annotations and no required fields, an agent still lacks guidance on the device-selection parameters (udid vs serial vs device vs session) and on whether this action is recorded or requires an existing session/lease.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 95%, so the baseline is 3 and the schema already documents the twenty parameters in detail. The description adds genuine meaning for mode beyond the bare enum (which stack each value targets), which earns it the top of the baseline rather than above it — the remaining nineteen device/lease/response parameters are left entirely to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb plus resource ("Navigate back") and immediately disambiguates the two modes it can take. It does not explicitly contrast itself with near neighbours like home, app-switcher, or hardware-button, so an agent must infer that this is the in-app history pop rather than a system-level exit, but the core action is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Use in-app for the app navigation stack and system when the platform back behavior is required" is a real selection rule for the mode parameter, and the single-screen iPhone note gives a concrete fallback condition. What is missing is a negative rule — when not to use this and to reach for home, app-switcher, or press instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

batchB

Execute multiple commands in one daemon request. Times out after 90s.

NameRequiredDescriptionDefault
outNoOptional output path for command artifacts.
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
stepsYesStructured batch steps. Each step uses a command name and the same input object as that command tool.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
onErrorNoBatch failure policy.
sessionNoAgent-device session name.
maxStepsNoMaximum number of steps accepted for this batch.
platformNoPlatform selector used to resolve a device.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It discloses only the single-request execution model and 90s timeout, omitting execution ordering, failure semantics, side-effect risks of nested commands, and response behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short, front-loaded sentences with no repetition or filler. The timeout note is useful and every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a complex batch tool with many parameters, a large nested command enum, and no output schema. The rich schema covers parameter details adequately, but the description leaves important batch execution and response semantics unexplained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all 19 parameters. The description adds no parameter-level meaning beyond the general idea of running multiple commands.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: executing multiple commands in one daemon request. This distinguishes the batch tool from individual command siblings, though it does not explicitly name those alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The batching use case is implied by 'multiple commands in one daemon request,' but there is no explicit guidance on when to use this instead of separate command calls, nor any exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bootA

Boot or prepare the selected device or simulator so later commands can target it. The device is chosen through the device-selection inputs, not by naming it here. Times out after 90s; a caller-supplied budget extends it.

NameRequiredDescriptionDefault
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
headlessNoBoot without showing simulator UI when supported.
platformNoPlatform selector used to resolve a device.
timeoutMsNoStartup budget in milliseconds. Bounds the boot wait, so a never-booted Simulator can finish its first-boot migration or a cold emulator its boot; omit for the default startup behavior.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription
idYesStable device id.
kindYes
bootedYes
deviceYesHuman-readable device name.
targetYes
platformYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full disclosure burden. It usefully reveals a 90s default timeout and that a caller-supplied budget extends it, plus the device-selection rule, but says nothing about idempotency (behavior if already booted), failure modes, or permission/auth requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with purpose, then the selection rule, then the timeout constraint. Every sentence carries new information and none is redundant with the schema or name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the description covers purpose, selection, and timeout. It leaves minor gaps around idempotency and failure behavior for a no-annotation tool, but nothing that would prevent correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% (baseline 3), and the description adds a non-obvious cross-parameter rule: target device selection flows through the selector inputs rather than a name argument, and timeoutMs acts as an extendable budget. That is meaningful guidance beyond the schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (boot/prepare) and resource (device or simulator) plus the downstream purpose ('so later commands can target it'), so an agent understands it is a setup/readiness step. It does not explicitly distinguish itself from siblings like shutdown or install, but the semantics are unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context ('so later commands can target it') and an explicit usage rule: the device is chosen through device-selection inputs, not by naming it here. It stops short of naming alternatives or when-not-to-use conditions (e.g., what to do if already booted).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

capabilitiesA

List the commands supported by the selected device or active session. Use device-selection inputs when checking support before a session is open. Times out after 90s.

NameRequiredDescriptionDefault
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
platformNoPlatform selector used to resolve a device.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden of behavioral disclosure. It usefully notes the 90s timeout and distinguishes device-based vs active-session operation, but it does not mention whether the command is read-only, has side effects, or what failure modes to expect.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences carry the core purpose, the key usage context, and a critical timeout warning. Every sentence earns its place and the most important information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's 15 optional parameters, no annotations, and no output schema, the description covers the central usage but leaves the agent to infer return shape and how multiple selectors like udid, session, leaseId, and runId interact. The 100% schema coverage compensates substantially, but some contextual gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema covers all 15 parameters, so the baseline is 3. The description adds cross-parameter context by advising to use device-selection inputs before a session is open, which is not stated in the schema itself.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear action and resource: 'List the commands supported by the selected device or active session.' It communicates the tool's function specifically, though it does not explicitly distinguish it from the sibling 'help' tool or other listing-style commands.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete context: 'Use device-selection inputs when checking support before a session is open.' This tells the agent which parameter family to use in a common scenario, but it does not mention exclusions or explicitly contrast with alternatives like 'help'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clickA

Activate a UI target by snapshot ref, selector, or coordinates. Prefer a ref or selector after a snapshot; use coordinates only when semantic targeting is unavailable. This can change app state. Success means the click was dispatched, not that it landed: use settle or verify to confirm the result without a follow-up snapshot, or wait for the expected screen. A ref or selector target is re-checked for motion before dispatch when the session's previous action just animated the screen, and is dispatched at its resting position; one that has not stopped refuses with target_still_moving rather than acting where it was. Times out after 90s; a caller-supplied budget extends it.

NameRequiredDescriptionDefault
rawNoUse raw snapshot data during selector resolution.
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
countNoNumber of press/click repetitions.
debugNoEnable debug diagnostics.
depthNoSnapshot traversal depth.
runIdNoLease run identifier.
scopeNoSnapshot scope selector used before resolution.
buttonNoPointer button for platforms that support mouse buttons.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
holdMsNoHold duration for each action.
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
settleNoAfter the action, wait for the UI to go quiet and return the settled diff vs the pre-action tree in the same response. Best-effort; never fails the action.
targetYesUI target. This is separate from deviceTarget, which selects the device form.
tenantNoRemote tenant identifier.
verifyNoCapture cheap post-action evidence (AX digest, node counts, changedFromBefore) instead of a follow-up snapshot.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
jitterPxNoDeterministic per-axis coordinate jitter in pixels (each press offsets x and y by up to this amount).
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
doubleTapNoRequest a double-tap action.
timeoutMsNoSettle: wait deadline in milliseconds (default 10000).
intervalMsNoDelay between repeated press/click actions.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
settleQuietMsNoSettle: quiet window in milliseconds (default 500; 300 when the settled tree comes from the iOS simulator snapshot bridge). On iOS, a broad screen replacement such as a modal dismissal is confirmed for at least 1500ms whatever window is asked for, within the timeoutMs settle deadline; a replacement from a screen the pre-action capture read as presenting nothing, such as a tab switch, gets no 1500ms confirmation and keeps the asked window.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription
xNoResolved interaction x coordinate when available.
yNoResolved interaction y coordinate when available.
refNoSnapshot ref without the @ prefix when the target was an @ref.
costNo
hintNo
countNoNumber of press/click repetitions.
buttonNo
holdMsNoHold duration for each action.
settleNo
messageNo
warningNo
evidenceNo
jitterPxNoDeterministic per-axis coordinate jitter in pixels (each press offsets x and y by up to this amount).
refLabelNo
selectorNoSelector expression when the target was a selector.
doubleTapNoWhether the command requested a double-tap action.
intervalMsNoDelay between repeated press/click actions.
resolutionNoPre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path.
targetKindYesResolved interaction target kind.
selectorChainNo
referenceWidthNoReference frame width for visualizing the interaction point.
targetHittableNo
referenceHeightNoReference frame height for visualizing the interaction point.
maestroFallbackReasonNo
maestroNonHittableCoordinateFallbackUsedNoWhether the direct iOS Maestro coordinate fallback was actually used.
maestroNonHittableCoordinateFallbackAllowedNoWhether the direct iOS Maestro coordinate fallback was allowed for this selector.

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does: it discloses state mutation ('can change app state'), the critical dispatch-vs-landed success semantics, the motion re-check and the `target_still_moving` refusal, and a 90s timeout that a caller budget can extend. These are non-obvious runtime behaviors an agent could not infer from schema or annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and its targeting modes, then preference, then consequences. Every sentence carries distinct information; the only slight cost is the densely packed motion-detection sentence, which is valuable but reads as a run-on.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is definitionally simple but has 29 parameters and a real timing/safety surface; the description covers the parts an agent would otherwise get wrong (targeting choice, success ambiguity, motion refusal, timeout). An output schema exists, so return-shape explanation is correctly omitted.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3; the description earns more by explaining semantics the schema only labels — what `settle`/`verify` are for as substitutes for a follow-up snapshot, and how `timeoutMs` relates to the fixed 90s ceiling. It adds no extra detail on the device-selection or repetition parameters, which is acceptable given the schema covers them.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Activate a UI target') and enumerates the three targeting modes (snapshot ref, selector, coordinates), which lets an agent map the `target` union immediately. It does not distinguish itself from near-siblings like `press`, `longpress`, or `hover`, so the differentiation is incomplete.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit preference ordering — ref or selector after a snapshot, coordinates only when semantic targeting is unavailable — plus guidance to use settle/verify or a screen wait instead of a follow-up snapshot. It stops short of saying when to pick click over press/longpress/gesture, so no exclusion vs alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clipboardA

Read the current device clipboard text, or replace its contents with the given text. Android runs both through the clipboard service shell command, and a build that implements none (Android 16 does not) refuses with UNSUPPORTED_OPERATION rather than reporting an empty clipboard. Times out after 90s.

NameRequiredDescriptionDefault
textNo
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
actionYes
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It discloses mutability, the Android shell-command mechanism, the refusal behavior on unsupported builds, and the 90-second timeout. This is strong operational context, though it does not detail return/response behavior beyond what the output schema presumably covers.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three compact sentences with no filler. The core purpose comes first, followed by the Android-specific caveat and the timeout constraint. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema, the description does not need to explain return values. It covers purpose, mutation, platform-specific failure behavior, and timeout. It is complete for practical invocation, though platform coverage beyond Android relies on the schema's platform selector.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 89%, so the baseline is 3. The description adds only that 'given text' replaces clipboard contents, which lightly maps to the text parameter, but it does not enrich parameter meaning beyond the schema's existing descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the two operations ('read' / 'write') and the resource (device clipboard text) with a specific verb. It is unambiguous and distinguishable from the sibling list, where no other tool is clipboard-specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the tool's purpose obvious, but it does not explicitly say when to use this tool versus alternatives or when not to use it. The usage context is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

closeA

Close the named app, or close the active session app when app is omitted. Use shutdown only when the selected simulator or emulator should also stop. Android ADB close fails with android-app-close-timeout if the app stays foreground, or its process stays running, past its 2s check window. Times out after 90s.

NameRequiredDescriptionDefault
appNoOptional app to close.
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
forceNoOverwrite an existing --save-script target instead of refusing (alias: --overwrite).
runIdNoLease run identifier.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
shutdownNoShutdown the session/device where supported.
saveScriptNo
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does real work: it discloses the Android ADB failure mode (android-app-close-timeout when the app stays foreground or the process survives the 2s check window) and the 90s overall timeout. It does not state what state is lost when the app is killed or how the force flag changes failure behavior, which keeps it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, front-loaded with the primary action and default, then the sibling routing, then the failure modes. Every sentence carries operational information; no restatement of the name or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 20-parameter, zero-annotation tool the description is remarkably complete on the risky parts: scope, error conditions, and timeout budget. It stops short of describing what the response returns (no output schema exists) or how the mutation affects app data, but nothing needed to select and call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 95%, so the baseline is 3, but the description adds genuine meaning beyond the schema's "Optional app to close" by defining the default resolution (active session app). The remaining 19 device/session/lease selectors are left entirely to the schema, which is reasonable given their coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Close the named app") plus the default target when the argument is omitted, so the agent knows exactly what happens with zero args. It also explicitly separates itself from the sibling tool shutdown, so it is distinguishable without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the alternative (shutdown) and the condition that selects it: when the simulator/emulator itself should also stop. The omission case (no app arg) is also spelled out, leaving nothing to inference about which tool or argument to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

debugA

Symbolicate Apple crash artifacts with matching dSYM UUIDs. This debug namespace is intentionally narrow: use logs for app logs, network for HTTP evidence, perf for performance samples, record/trace for media and traces, and react-devtools for React Native components and render profiles. Times out after 90s.

NameRequiredDescriptionDefault
outNoOutput path for the symbolicated artifact.
dsymNoPath to a matching .dSYM bundle.
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
actionYes
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
artifactYesApple crash artifact path (.ips, .crash, or .log).
platformNoPlatform selector used to resolve a device.
searchPathNoDirectory to scan for matching .dSYM bundles.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

TDQS

A3.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It does disclose the 90s timeout and matching UUID requirement, but it omits whether symbolication is read-only, whether an 'out' path creates or overwrites files, permission requirements, failure behavior, and response shape. That is thin for a 20-parameter tool with no annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences: purpose first, sibling routing second, timeout third. It is front-loaded and every sentence earns its place, especially the alternatives list that prevents misuse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Purpose, sibling routing, and timeout are present, and the schema richly documents the 20 parameters. However, with no output schema and no annotations, the description should say more about return values, errors, and output-file behavior; as written it is adequate but incomplete for a complex tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 95%, so the schema already documents artifact, dsym, searchPath, out, and selectors. The description only restates the matching-dSYM-UUID idea and adds no syntax, format, or selector guidance beyond what the schema provides, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with the specific verb 'Symbolicate' and resource 'Apple crash artifacts', and scopes it to matching dSYM UUIDs. The namespace sentence names the sibling tools that handle adjacent evidence, so an agent can distinguish this tool from logs, network, perf, and others.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly routes non-debug evidence to alternatives: logs for app logs, network for HTTP, perf for performance, record/trace for media and traces, and react-devtools for React Native. Combined with the first sentence, this gives both when-to-use and when-to-use-another-tool guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

devicesA

List available devices and simulators that can be selected for automation. Use platform, device, udid, or serial inputs on later commands to target one result. Times out after 90s.

NameRequiredDescriptionDefault
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
platformNoPlatform selector used to resolve a device.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription
devicesYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals a 90-second timeout, which is a concrete operational detail. However, it does not state whether the operation is read-only, whether it requires special permissions, or how it behaves on failure or partial results. The timeout is useful but the overall behavioral picture is incomplete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero waste. The purpose is stated first, followed by a practical usage hint and a timeout note. Every sentence earns its place, and the description is appropriately brief for a list tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has a rich output schema (true) and 15 optional parameters all documented in the schema, so the description need not explain return values. It covers the core purpose, the selector reuse pattern, and the timeout. For a discovery tool, this is sufficient; the only minor gap is that it doesn't explicitly mention that the filters are optional or that the output is a list, but these are implied by the verb 'List' and the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so each parameter is already documented in the input schema. The description mentions platform, device, udid, or serial as selectors, but this primarily guides usage of later commands, not the parameters of this tool itself. It adds little semantic meaning beyond what the schema provides, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the action 'List' and the resource 'available devices and simulators' explicitly, and clarifies the purpose 'can be selected for automation.' The verb is specific and distinguishes it from action-oriented siblings like boot, click, or install, which have clearly different purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear guidance on how to use the output: 'Use platform, device, udid, or serial inputs on later commands to target one result.' This explains the primary use case. However, it does not explicitly mention when not to use this tool or name alternative listing tools (e.g., get, find), though the siblings suggest those might serve other resources. The guidance is sufficient but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

diffB

Compare accessibility snapshots or screenshots to identify UI changes. Use snapshot comparisons for semantic tree changes and screenshot comparisons for pixel differences. Times out after 90s.

NameRequiredDescriptionDefault
outNo
rawNo
kindYes
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
depthNo
runIdNoLease run identifier.
scopeNo
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
interactiveOnlyNo
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription
modeYes
linesYes
summaryYes
warningsNo
baselineInitializedYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations the description carries the full behavioral burden. It usefully discloses a hard constraint ('Times out after 90s'), but says nothing about permissions, side effects, recording behavior (relevant given the noRecord param), or how the diff is returned. The timeout disclosure is genuine added value, but the rest of the behavior is left to the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tightly written sentences, front-loaded with purpose before mode selection and the timeout caveat. No filler or restatement of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, and the timeout is covered. But for a 22-parameter tool with no annotations, the description omits any safety/side-effect profile and any guidance on the many resolution-related parameters, and the snapshot/screenshot mode discussion does not match the schema's single-valued kind.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 73% across 22 parameters, and the description adds no parameter-level meaning for out, raw, depth, scope, interactiveOnly, or the device selectors. Worse, it implies a 'screenshot' comparison mode while the schema constrains kind to the single value 'snapshot', so the description is actively misleading about the parameter space.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Compare accessibility snapshots or screenshots') plus the goal ('identify UI changes'), which is clearly distinct from the sibling snapshot and screenshot tools that merely capture. It stops short of explicitly naming those siblings or how to pick between them, but the purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit mode-selection guidance ('Use snapshot comparisons for semantic tree changes and screenshot comparisons for pixel differences'), which is more than implied usage. However, no guidance is given for choosing diff over its siblings snapshot/screenshot, and the guidance is partly unusable because the schema pins kind to the const 'snapshot'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

doctorA

Diagnose device, app, development-server, and React Native or Expo readiness issues. Returns compact evidence for local inventory, sessions, optional app discovery, toolchains, and server reachability. On iOS simulators it also warms the XCTest runner build cache in the background when missing, so run it before the first Apple snapshot or interaction of a session. Times out after 90s.

NameRequiredDescriptionDefault
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
remoteNoCheck remote connection setup instead of local device inventory.
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
platformNoPlatform selector used to resolve a device.
targetAppNoInstalled app package/bundle id or app name to verify without opening a session.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription
kindYes
metroNo
checksYes
statusYes
targetNo
summaryYes
platformNo
targetAppNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full transparency burden. It discloses a notable background side effect (XCTest cache warming on iOS simulators), a 90-second timeout, and the output shape ('compact evidence'). This goes beyond a generic 'diagnose' and gives the agent actionable expectations, though it could go further on potential state changes beyond cache warming.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with the purpose front-loaded, followed by return evidence and then the critical side-effect warning and timeout. Every sentence contributes new information, and nothing is redundant with the schema or output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a broad diagnostic tool with an output schema and fully documented optional parameters, the description provides everything needed to decide when and how to invoke it: what it checks, what it returns, the cache-warming side effect, and the 90s timeout. Even with 17 parameters, the schema fills the remaining detail, so the description is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the structured schema already documents all 17 optional parameters. The tool description adds no parameter-specific semantics—it only discusses overall behavior and output—so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Diagnose') and a concrete resource scope: device, app, development-server, and React Native or Expo readiness issues. It also enumerates the returned evidence (local inventory, sessions, app discovery, toolchains, server reachability), which clearly differentiates it from single-purpose sibling commands like screenshot or gesture.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent to run this before the first Apple snapshot or interaction of a session to warm the XCTest runner cache, which is a clear, concrete use-case. It stops short of naming alternatives or stating when not to use it, so it does not fully satisfy the 'explicit when/when-not/alternatives' level.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

eventsB

Read the daemon-owned session event timeline as paged JSON-friendly entries Times out after 90s.

NameRequiredDescriptionDefault
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
limitNo
runIdNoLease run identifier.
cursorNo
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
platformNoPlatform selector used to resolve a device.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral disclosure burden. It does reveal that the operation is read-only, returns paged JSON-friendly entries, and times out after 90 seconds. However, it does not explain pagination mechanics, the entry shape, or what happens on timeout, leaving some behavioral gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very brief and front-loaded, with the core verb and resource stated first and the timeout note as the only extra detail. It is economical, though the missing punctuation and run-on feel ('entries Times out') make it slightly less polished than ideal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema and no annotations, and the description does not explain the event entry structure, pagination behavior, required selectors, or response format beyond 'JSON-friendly entries.' For a tool with 17 parameters and several sibling tools, this is a significant contextual gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 88%, so the schema already documents almost all parameters. The description adds little parameter-specific meaning beyond implying the relevance of paging through limit and cursor, and it does not clarify the two undocumented parameters (limit, cursor). The baseline of 3 is appropriate given the strong schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Read'), a clear resource ('daemon-owned session event timeline'), and the output form ('paged JSON-friendly entries'). It is clear about what the tool does, though it does not explicitly differentiate it from similar sibling tools like logs, trace, or session.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given for when to use this tool versus alternatives. The sibling set includes related tools such as logs, trace, session, and replay, but the description provides no selection criteria, exclusions, or context that would help an agent choose correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fillA

Replace text in a UI input selected by snapshot ref, selector, or coordinates. Pass an empty text to clear the field. Inspect unconfirmed evidence and assert the expected value or resulting screen before continuing. Prefer refs or selectors after snapshot; use recordAs to keep sensitive text out of a recorded replay while sending it to the live app. Times out after 90s; a caller-supplied budget extends it.

NameRequiredDescriptionDefault
rawNoUse raw snapshot data during selector resolution.
textYesText to enter into the target. Pass "" to clear it.
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
depthNoSnapshot traversal depth.
runIdNoLease run identifier.
scopeNoSnapshot scope selector used before resolution.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
settleNoAfter the action, wait for the UI to go quiet and return the settled diff vs the pre-action tree in the same response. Best-effort; never fails the action.
targetYesUI target. This is separate from deviceTarget, which selects the device form.
tenantNoRemote tenant identifier.
verifyNoCapture cheap post-action evidence (AX digest, node counts, changedFromBefore) instead of a follow-up snapshot.
delayMsNoDelay between typed characters.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
recordAsNoWhen script recording is armed, send text to the live app but publish it as ${VAR}. Use an uppercase replay variable name such as PASSWORD.
timeoutMsNoSettle: wait deadline in milliseconds (default 10000).
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
settleQuietMsNoSettle: quiet window in milliseconds (default 500; 300 when the settled tree comes from the iOS simulator snapshot bridge). On iOS, a broad screen replacement such as a modal dismissal is confirmed for at least 1500ms whatever window is asked for, within the timeoutMs settle deadline; a replacement from a screen the pre-action capture read as presenting nothing, such as a tab switch, gets no 1500ms confirmation and keeps the asked window.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does disclose useful traits: a 90s timeout with caller-supplied budget extension, the recordAs live-send-but-redact behavior, and the empty-string clear semantics. It stops short of stating failure modes, permission/auth requirements, or whether the mutation is reversible.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and five compact sentences with little waste. The middle sentence ('Inspect unconfirmed evidence and assert the expected value or resulting screen before continuing') is vague procedural advice that dilutes rather than sharpens the definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 26-parameter mutation tool with no annotations, the description covers target modes, timeout, and one privacy behavior, but leaves permission needs, error/failure behavior, and the semantics of the many device/resolution parameters entirely to the schema. An output schema exists, so return values need no explanation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% across 26 parameters, so the schema already documents target, text, recordAs, timeoutMs, verify, etc. The description reinforces only a few (text clearing, ref/selector preference, recordAs) and adds no syntax or interaction detail beyond what the structured fields provide.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Replace text in a UI input') and enumerates the three targeting modes (ref, selector, coordinates). However, it never distinguishes itself from the sibling 'type' tool, which on its face performs a very similar text-entry operation — an agent choosing between them gets no signal.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives implied guidance ('Prefer refs or selectors after snapshot', 'Pass an empty text to clear the field', use recordAs for sensitive text). That is real context, but there is no explicit when-to-use-this-vs-'type'/'click'/'press' routing, and no stated preconditions such as requiring a prior snapshot.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

findB

Find by text/label/value/role/id and run action. The role locator matches snapshot kind vocabulary (button, text, text-field, switch, ...); pre-reconciliation leaf spellings (statictext, edittext, textview) stay accepted on the nodes that carried them during a deprecation window. Times out after 90s.

NameRequiredDescriptionDefault
rawNo
lastNo
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
depthNo
firstNo
queryYes
runIdNoLease run identifier.
valueNo
actionNo
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
recordNoForce-record this out-of-band observation into a repair-armed heal (mutually exclusive with noRecord). Authored replay steps are recorded automatically and never need this. On find, valid only for a read-only action.
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
locatorNo
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
timeoutMsNo
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription
xNoResolved x coordinate for mutating find actions.
yNoResolved y coordinate for mutating find actions.
refNoSnapshot ref without the @ prefix when the find action returns one.
costNo
nodeNoSnapshot node for find get_attrs/get_text.
textNoText value returned by find get_text.
foundNoWhether a wait/exists/read-only find satisfied its condition.
queryNoQuery argument used for the find action.
locatorNoLocator kind used for the find action.
matchesNoEvery match for the read-only find list action (#1625): { ref, node } each.
messageNoDiagnostic message for mutating find actions.
waitedMsNoMilliseconds waited for a read-only find condition.
refsGenerationNoADR 0014 ref frame epoch for read-only find actions.

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations, so the description carries the full burden. It usefully discloses a 90s timeout and the pre-reconciliation spelling behavior during a deprecation window, which are non-obvious traits. However, it says nothing about whether actions mutate state, permission/prerequisite needs, or how recording interacts with actions despite a record param existing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Core behavior is front-loaded in the first sentence, followed by a role/deprecation clarification and a timeout note. Every sentence contributes, though the middle clause is dense and could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be explained, and the description covers locators, role vocabulary, and timeout. But for a 26-parameter tool spanning device/session/lease selectors, the description does little to orient an agent on the large selector surface, leaving much of the complexity to the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 65%, with many selector params (device, serial, udid, session, lease, target) documented in the schema itself. The description adds meaning for the locator/role vocabulary and role matches against snapshot kinds, but does not clarify query vs value vs id semantics. Baseline 3 is appropriate given the partial schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (find) plus the locator dimensions it searches and that it will run an action on the match. This distinguishes it from pure interaction siblings like click/fill, though it doesn't explicitly name which sibling to prefer for narrow cases such as get or snapshot.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use guidance or comparison to sibling locators/commands (get, is, snapshot, click). The agent must infer that find is the general locate-and-act path, and the deprecation-window note adds detail but not usage routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

focusA

Move input focus to explicit screen coordinates without entering text. Prefer semantic interactions when a snapshot ref or selector is available; use type or fill after focus. Times out after 90s.

NameRequiredDescriptionDefault
xYesX coordinate.
yYesY coordinate.
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses the 90-second timeout and the no-text-entry behavior, which is useful. However, it doesn't disclose potential failure modes, prerequisites (e.g., visible target), or what the response contains, leaving meaningful gaps for a UI-mutating operation with zero annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with the core purpose front-loaded first. Every sentence earns its place: purpose, usage guidance, and timeout. No filler or redundant wording.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a coordinate-based focus tool with no output schema, the description covers purpose, usage routing, and timeout. It could mention response shape or failure behavior, but the tool's simplicity and the fact that most of the 18 parameters are shared selectors (udid, device, platform) mean the description is reasonably complete for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description's 'explicit screen coordinates' maps to x/y, but that context is already implicit in the schema's 'X coordinate' and 'Y coordinate' entries. The description adds no parameter details beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Move input focus to explicit screen coordinates without entering text.' This is clear and the 'without entering text' clause differentiates it from type/fill siblings. However, it doesn't explicitly distinguish focus from other coordinate-based siblings like click or hover, so it falls just short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Prefer semantic interactions when a snapshot ref or selector is available; use type or fill after focus' gives explicit when-to-use guidance and names the complementary tools (type/fill). It doesn't enumerate exclusions relative to click/hover, but the coordination guidance is genuinely useful and clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

foldA

Fold or unfold a foldable iPhone simulator (iPhone Duo) or a foldable Android emulator into the closed, half-open, or open pose. iOS sends a simulator HID hinge event, then reads the hinge angle back from CoreDevice to confirm it, and can follow timestamped angle keyframes; Android sets the emulator console posture, then confirms the device state the guest commits and reports the hinge angle the AVD profile defines for that posture, and dismisses the lock screen a fold to the cover display can raise. On iOS a pose change moves the app to a different panel with a different point size; on Android a fold to or from closed moves the app between the cover and inner displays, and any pose change can reshape the app window, whose size the next snapshot reports. Either way every ref and coordinate from before it is stale: re-snapshot after this command. Taps, long presses, and scrolling target the app window on its current panel in closed, half-open, and open poses. Simulator and emulator only; iOS requires the iOS simulator SDK; Device Hub and host Accessibility permission are not required. A simulator scoped to a non-default simulator set is refused with UNSUPPORTED_OPERATION and reason unsupported-device-scope; run fold against a simulator in the default set. Times out after 255s.

NameRequiredDescriptionDefault
poseNoInstant preset; mutually exclusive with keyframes.
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
keyframesNoPiecewise-linear hinge motion. Start at 0ms; strictly increasing timestamps, up to 60000ms. Repeated angles create holds. Mutually exclusive with pose.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription
poseYes
actionYes
screenNo
messageYes
hingeAngleDegreesYesHinge angle read back after the pose settled: from CoreDevice on iOS, from the emulator hinge sensor on Android.

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and delivers: platform-specific mechanics (iOS sends a HID hinge event then reads back the angle from CoreDevice; Android sets the emulator console posture, confirms the guest-committed state, reports the AVD-defined hinge angle, and dismisses the cover-display lock screen). It discloses failure semantics (UNSUPPORTED_OPERATION/unsupported-device-scope), staleness of refs/coordinates requiring a re-snapshot, environment requirements, and a 255s timeout.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence, but the body is a dense, multi-clause run-on covering device mechanics, lock-screen behavior, app relocation, staleness, and timeouts. Content is high-value but packed without paragraph or bullet structure, slightly hurting scanability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values needn't be explained, and the description compensates for the absence of annotations with thorough behavioral coverage including the critical re-snapshot-after-fold instruction. The main gap is that it never states which Android and iOS values/platform selector combinations are valid or what the keyframes-vs-pose exclusivity means at the schema oneOf level.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all 18 parameters are already documented in the schema, making the baseline 3. The description adds behavioral meaning for the pose/keyframe distinction (instant preset vs. timestamped angle keyframes, with the confirmation/readback behavior), but does not extend the many device-selection parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (fold/unfold) and resource (foldable iPhone simulator / Android emulator) and enumerates the three poses it can reach. An agent can distinguish this from siblings like open, close, or orientation without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it (foldable simulators/emulators, pose changes) and discloses a hard precondition: a simulator scoped to a non-default simulator set is refused with UNSUPPORTED_OPERATION, and the tool is simulator/emulator-only. However it names no explicit alternative for non-foldable devices, so it falls short of a true when/when-not mapping.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gestureA

Perform a structured pan, fling, swipe, pinch, rotate, transform, tap, or drag gesture. Select the gesture kind, then provide only the inputs that apply to that kind. A tap touches 2 to 5 points at once; repeat it with count and pauseMs. Times out after 90s.

NameRequiredDescriptionDefault
kindYesGesture variant.
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
countNoTap repetitions; the same contacts run this many times.
debugNoEnable debug diagnostics.
deltaNoMovement delta for pan or transform gestures.
runIdNoLease run identifier.
scaleNoPinch or transform scale.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
holdMsNoTap contact hold duration.
moveMsNoDrag movement duration.
originNoGesture origin point.
pointsNoTap contact points, held together for holdMs.
presetNoSwipe preset.
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
sourceNoDrag source @ref or selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
degreesNoRotation in degrees.
leaseIdNoExisting lease identifier.
pauseMsNoDelay between tap repetitions, added to each repetition’s own time.
sessionNoAgent-device session name.
distanceNoFling distance.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
directionNoFling direction.
durationMsNoPan/transform duration.
destinationNoDrag destination @ref or selector.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
pointerCountNoPan touch pointer count (1 or 2).
sourceHoldMsNoDrag activation hold duration.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
destinationHoldMsNoHold before releasing at the destination.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full disclosure burden, and it does contribute two genuinely useful behavioral facts: a hard 90s timeout and the constraint that a tap spans 2–5 simultaneous contacts. It says nothing about whether the action is recorded (despite a noRecord parameter), what happens on failure, or whether a device lease/session must already exist — significant omissions for a 35-parameter interaction tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the verb and the kind enumeration. Every sentence adds a distinct fact — kind selection, tap semantics, and the timeout — with no filler or restatement of the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description is not obliged to explain return values, and the tap and timeout notes cover the trickiest bits. However, for a tool with 35 parameters spanning device selectors, sessions, leases, and response-format flags, the description says nothing about device targeting, prerequisite state, or response behavior, leaving real gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline would be 3, but the description adds value the schema cannot: it establishes that parameters are conditional on kind rather than a flat bag of 35 inputs, and it explains the tap-specific pairing of points with count and pauseMs. It could have gone further by mapping other param groups (preset/direction/distance, scale/degrees) to their kinds, which the schema only partly does.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and enumerates all eight gesture kinds, so the resource and its scope are unmistakable. It never distinguishes itself from sibling tools like swipe, longpress, or scroll that overlap with at least three of those kinds, leaving an agent to guess which one to pick.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Select the gesture kind, then provide only the inputs that apply to that kind" gives real intra-tool guidance on how to drive the schema, and the tap sentence clarifies repetition semantics. But there is no when-to-use framing against the obvious alternatives (swipe, longpress, scroll, click) and no mention of prerequisites such as an active session or lease, so usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

getA

Read text or accessibility attributes from a snapshot ref or selector without changing the app. Use format text for visible content or attrs for the element attribute map. Times out after 90s.

NameRequiredDescriptionDefault
rawNoUse raw snapshot data during selector resolution.
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
depthNoSnapshot traversal depth.
runIdNoLease run identifier.
scopeNoSnapshot scope selector used before resolution.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
formatYes
recordNoForce-record this out-of-band observation into a repair-armed heal (mutually exclusive with noRecord). Authored replay steps are recorded automatically and never need this. On find, valid only for a read-only action.
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetYesUI element target by snapshot ref or selector expression.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It states the operation is non-mutating ('without changing the app') and adds a specific timeout ('Times out after 90s'), which goes beyond the schema. It does not cover every error or edge case, but the key safety and timing traits are present.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler. The primary purpose and read-only nature are front-loaded, followed by format usage and the timeout. Every sentence earns its place and the structure is optimal for quick agent scanning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 21 parameters and no output schema, the description covers the essential invocation semantics: what to read, how to specify the format, that the operation is safe, and the timeout. Many optional parameters are left to the schema, but the core context an agent needs to select and call this tool correctly is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 95%, so the baseline is 3. The description adds meaningful semantics for the core parameters: it explains what 'format' values produce ('text for visible content', 'attrs for the element attribute map') and clarifies the target as 'snapshot ref or selector'. This is valuable beyond the bare schema enumerations.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Read') and resource ('text or accessibility attributes') from a 'snapshot ref or selector', and explicitly notes it does so 'without changing the app'. This makes it clearly distinguishable from siblings like snapshot or find, and the purpose is immediately apparent.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool: when you need visible content or an element attribute map from a ref or selector. It also gives format-selection guidance ('Use format text for visible content or attrs for the element attribute map'), though it does not explicitly contrast with alternative sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hardware-buttonA

Press a phone hardware button once: volume-up, volume-down, power, mute, sleep, wake, media-play-pause, media-next, media-previous, media-rewind, or media-fast-forward. The press is dispatched without activating the session app and nothing is re-observed afterwards, so the OS decides what the key does — which audio stream a volume press moves, which media session a media key reaches, and whether the HUD shows, is device behavior this command does not claim. Power toggles the Android screen; sleep and wake are the explicit Android events that turn it off or on without toggling, and after a press that turns it off, later commands may hit a locked screen. Android (ADB-backed and Appium) presses all eleven on phones and tablets; a physical iPhone or iPad presses volume only through the local runner or Appium, never power, mute, sleep, wake, or media. iOS Simulators, Android TV and tvOS targets refuse: on TV targets use tv-remote. Times out after 90s.

NameRequiredDescriptionDefault
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
buttonYesOne press each. volume-up and volume-down move the system volume stream the OS selects; power toggles the screen on Android; sleep and wake are the explicit Android events that turn the screen off or on without toggling; mute, media-play-pause, media-next, media-previous, media-rewind, and media-fast-forward are Android keys the OS routes to its own streams and media sessions. All of these except volume are refused on every Apple leaf.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription
actionYes
buttonYes
messageYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does so thoroughly: it explains that the press is dispatched without activating the session app, nothing is re-observed, the OS decides routing, power toggles the screen, sleep/wake are explicit events, screen-off may cause later commands to hit a locked screen, and the command times out after 90s.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and button list, then layers on constraints and side effects. It is dense and a bit long, but most sentences carry relevant operational detail for a complex hardware-control tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations, a rich input schema, and an output schema, the description is complete enough to call the tool correctly. It covers platform support, refusal cases, side effects, timeout behavior, and the command's non-observational nature.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds useful meaning around the button parameter by explaining OS routing, Android versus Apple support, and device-behavior limits. It does not add much for the many selector/session parameters beyond what the schema already documents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Press a phone hardware button once,' then enumerates the supported buttons. It also distinguishes itself from television controls by directing TV targets to tv-remote, so an agent can identify its scope without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit platform conditions: Android supports all eleven buttons, physical Apple devices support only volume, iOS Simulators and TV targets refuse, and TV users should use tv-remote. This provides clear when-to-use and when-not-to-use guidance plus an alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

helpA

Usage guides. No topic: the root decision card. topic = one of commands, manual-qa, maestro, workflow, scripting, gestures, tv, debugging, react-devtools, cdp, react-native, physical-device, ios-system-ui, foldable, remote, macos, web, dogfood, validate for that guide, or a tool name for its complete flag reference. For specialized work or an unclear command shape only; not a startup step, not needed after an error that carries a hint.

NameRequiredDescriptionDefault
topicNoGuide topic or tool name; omit for the card.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, but the description discloses the two response modes (card vs. guide) and states that a tool name yields its complete flag reference, which is meaningful behavioral detail beyond the schema. It also proactively suppresses unnecessary calls, reducing wasted round trips. It does not say the output is plain text vs. structured or whether the guide is long, so it stops short of 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the primary behavior and the default (no topic), then the value space, then the guardrails. The long topic enumeration is necessary but makes the middle a comma wall that is slower to scan than a list. Every sentence still carries information, so it is efficient, just dense.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter, no-side-effect lookup with no output schema, the description covers trigger conditions, default behavior, and the full value space. The only gap is what the returned guide/card actually looks like and how large it is, which matters if an agent is weighing whether to call it mid-task.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% but defines no enum, leaving 'topic' effectively unbounded. The description supplies the actual accepted space — ~20 named topics plus the rule that any tool name is valid for flag reference — which the schema cannot convey. This is exactly the kind of additive semantic guidance the description should carry.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Usage guides') and explains the two operating modes: no topic returns a root decision card, a topic returns that guide. 'Root decision card' is slightly internal jargon, but combined with the topic list an agent can tell exactly what this tool returns, distinct from every sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly scopes use to 'specialized work or an unclear command shape only' and names two exclusions: not a startup step, and not needed after an error that already carries a hint. That is a precise when/when-not with an implied alternative (rely on the hint instead).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

homeA

Send the selected device to its home screen. This leaves the app session open but moves the foreground away from the app. Times out after 90s.

NameRequiredDescriptionDefault
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription
actionYes
messageYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses that the app session remains open and that the tool times out after 90 seconds, which are key behaviors. It does not detail side effects like whether the home button is pressed or what happens on timeout, but the provided details are useful.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences, with the core action front-loaded and the critical behavioral nuance in the second sentence. No redundant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple in purpose and the output schema is present, so the description covers the essential facts (action, session behavior, timeout). It does not mention platform-specific behavior (mobile/tv/desktop) despite the target parameters, but the schema and output schema fill most gaps. Adequate for a straightforward navigation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds no additional meaning to any of the 16 parameters; all semantics are already captured in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Send the selected device to its home screen.' It clearly distinguishes the action from navigation tools like 'back' by explicitly noting it leaves the app session open, which is a defining behavioral difference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives some implied usage context (e.g., it moves foreground away from the app) but does not explicitly state when to use this tool versus alternatives like 'back' or 'app-switcher'. No exclusions or alternatives are named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hoverA

Move the pointer over a UI target by snapshot ref, selector, or coordinates without pressing, to reveal hover-gated UI such as row toolbars or menus. Web only; touch platforms have no hover state. Use settle to observe what the hover revealed without a follow-up snapshot. Times out after 90s; a caller-supplied budget extends it.

NameRequiredDescriptionDefault
rawNoUse raw snapshot data during selector resolution.
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
depthNoSnapshot traversal depth.
runIdNoLease run identifier.
scopeNoSnapshot scope selector used before resolution.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
settleNoAfter the action, wait for the UI to go quiet and return the settled diff vs the pre-action tree in the same response. Best-effort; never fails the action.
targetYesUI target. This is separate from deviceTarget, which selects the device form.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
timeoutMsNoSettle: wait deadline in milliseconds (default 10000).
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
settleQuietMsNoSettle: quiet window in milliseconds (default 500; 300 when the settled tree comes from the iOS simulator snapshot bridge). On iOS, a broad screen replacement such as a modal dismissal is confirmed for at least 1500ms whatever window is asked for, within the timeoutMs settle deadline; a replacement from a screen the pre-action capture read as presenting nothing, such as a tab switch, gets no 1500ms confirmation and keeps the asked window.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription
xNoResolved interaction x coordinate when available.
yNoResolved interaction y coordinate when available.
refNoSnapshot ref without the @ prefix when the target was an @ref.
costNo
hintNo
settleNo
gestureNo
messageNo
warningNo
evidenceNo
refLabelNo
selectorNoSelector expression when the target was a selector.
resolutionNoPre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path.
targetKindYesResolved interaction target kind.
selectorChainNo
referenceWidthNoReference frame width for visualizing the interaction point.
targetHittableNo
referenceHeightNoReference frame height for visualizing the interaction point.
maestroFallbackReasonNo
maestroNonHittableCoordinateFallbackUsedNoWhether the direct iOS Maestro coordinate fallback was actually used.
maestroNonHittableCoordinateFallbackAllowedNoWhether the direct iOS Maestro coordinate fallback was allowed for this selector.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and discloses key traits: it does not press (pure read-side hover), it is web-only, it has a 90s timeout, and a caller-supplied budget can extend it. It omits whether the action is recorded or what happens on non-hover-gated targets, but the timeout and platform constraints are substantive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four compact sentences, each carrying distinct information (action, target modes, platform constraint, settle tip, timeout). The core action and target modes are front-loaded before qualifications.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists, so return-value explanation is unnecessary. Given 22 parameters, the description sensibly does not attempt to cover them all and focuses on the ones that matter (target, settle, timeout). Minor gap: no mention of device/session selection context or recording behavior, but nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds meaning the schema does not: it frames the three target kinds as interchangeable recognition modes and explains that settle lets you capture what hover revealed without a follow-up snapshot, which clarifies that parameter's purpose. Timeout/budget semantics are also explained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb ('Move the pointer over') and resource, enumerates the three targeting modes (snapshot ref, selector, coordinates), and gives the intent ('reveal hover-gated UI such as row toolbars or menus'). It is clearly distinguishable from siblings like click, press, and longpress.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly scopes the tool to 'Web only' and explains why: 'touch platforms have no hover state', which is a genuine when-not-to-use rule. It also advises using settle to observe the revealed UI. It stops short of naming alternative tools for non-hover scenarios, so it is strong but not fully routed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

installA

Install an app binary from a local path. Provide an app identifier with the path when the target needs explicit app selection; use reinstall to replace an already installed app. Times out after 180s.

NameRequiredDescriptionDefault
appNoOptional app identifier hint.
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
appPathYesPath to app binary.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

TDQS

A4.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It discloses a 180s timeout, which is a behavioral detail. However, it does not state whether the install overwrites an existing app, what happens on failure, or any required permissions. The mutation nature is implicit, but there's limited additional transparency beyond the timeout.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no wasted words. It front-loads the purpose, then provides usage guidance and a timeout note. Every sentence earns its place, making it concise and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the absence of an output schema and the full schema coverage of parameters, the description covers the core operation, directs to reinstall for replacement, and notes the timeout. It does not specify behavior when the app is already installed, but that is handled by the reinstall reference. The description is sufficiently complete for an install command, though it could mention failure handling or overwrite behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds meaning to two parameters: it clarifies that 'app' is an identifier (via 'Provide an app identifier') and that 'appPath' is a local path (via 'from a local path'). This provides additional context beyond the schema, though it doesn't elaborate on the other 16 parameters. Given the high schema coverage, the description compensates adequately.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Install an app binary from a local path.' It uses a specific verb ('Install'), resource ('app binary'), and source ('local path'). It differentiates from the sibling 'reinstall' by explicitly stating 'use reinstall to replace an already installed app,' which helps an agent distinguish between the two.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage guidance: it tells the agent to provide an app identifier when explicit app selection is needed, and directs to 'reinstall' when replacing an already installed app. This clearly indicates when to use this tool versus the alternative. It also mentions the 180s timeout, which is useful context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

install-from-sourceB

Install app builds from URLs, remote source specs, or CI artifacts resolved by a remote daemon. Times out after 90s.

NameRequiredDescriptionDefault
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
sourceYesInstall source object.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
retainPathsNo
retentionMsNo
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses a 90-second timeout and remote daemon resolution, which are useful behavioral details. However, with no annotations, it omits prerequisites, side effects on the device, reversibility, or failure behavior. For a mutation tool, this is partial disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence states the purpose and a key constraint (timeout) upfront. No filler, front-loaded, and to the point.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (19 parameters, a nested source object, no output schema, no annotations), the description is far too brief. It lacks details on how to specify sources, what the response contains, error handling, or how to use the device selectors. An agent would need more context to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is high (89%), so the baseline is 3. The description adds no parameter-specific meaning beyond the schema; it doesn't clarify the structure of the 'source' object or how to combine the many device selectors. It neither enhances nor detracts from parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (install) and the resource (app builds) along with the source types (URLs, remote source specs, CI artifacts) and a remote daemon. It differentiates from the generic sibling 'install' by implying a source-based install, though it doesn't explicitly contrast with it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus the siblings 'install' or 'reinstall'. The description states what it does but doesn't provide context for selection, exclusions, or alternatives. An agent must infer that this is for source-based installs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

isA

Check whether a selector satisfies a UI predicate such as visible, hidden, exists, absent, editable, selected, focused, or text. absent passes only when one readable, complete, settled, unscoped, full-depth accessibility capture has zero matches. Use wait when the condition may appear asynchronously. Times out after 90s.

NameRequiredDescriptionDefault
rawNoUse raw snapshot data during selector resolution.
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
depthNoSnapshot traversal depth.
runIdNoLease run identifier.
scopeNoSnapshot scope selector used before resolution.
valueNo
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
recordNoForce-record this out-of-band observation into a repair-armed heal (mutually exclusive with noRecord). Authored replay steps are recorded automatically and never need this. On find, valid only for a read-only action.
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
selectorYes
predicateYes
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses an important edge case ('absent passes only when one readable, complete, settled, unscoped, full-depth accessibility capture has zero matches') and a timeout ('Times out after 90s'). These are real behavioral details beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, all high-signal: the core operation, the subtle absent behavior, and the async alternative plus timeout. No filler or repetition of schema fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a predicate-check tool with no output schema and no annotations, the description covers the main call semantics, the trickiest predicate, async handling, and timeout behavior. It does not describe the return value shape, but 'check whether' strongly implies a boolean result, and the 90s timeout bounds expectations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 87%, so the baseline is 3. The description adds meaningful semantics beyond the enum by explaining the special meaning of 'absent' and framing the predicate as a UI state check. It does not explain selector or value, but those are largely covered by schema context and the core predicate behavior is enriched.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Check whether a selector satisfies a UI predicate,' then enumerates the exact predicate values it supports. This clearly distinguishes it from nearby tools like snapshot (which captures UI state) or find (which locates elements).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says 'Use wait when the condition may appear asynchronously,' giving the agent a direct alternative for a common ambiguity. It does not exhaustively contrast with every sibling tool, but the guidance is concrete and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

keyboardA

Inspect Android keyboard visibility/type or press/dismiss the device keyboard. To hide the keyboard, use keyboard dismiss. It taps the keyboard dismiss/hide key when one is exposed, verifies the keyboard closed, and reports UNSUPPORTED_OPERATION when no dismiss key exists — background taps are never attempted. Times out after 90s.

NameRequiredDescriptionDefault
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
actionNo
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription
typeNo
actionYes
messageNo
visibleNo
attemptsNo
platformYes
dismissedNo
inputTypeNo
inputOwnerNo
wasVisibleNo
focusedPackageNo
focusedResourceIdNo
inputMethodPackageNo

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses key behaviors for dismiss: taps the dismiss key, verifies closure, reports UNSUPPORTED_OPERATION when no dismiss key exists, never attempts background taps, and times out after 90s. This is strong for one action, but other actions (status, enter, return) are not behaviorally disclosed, so it's not complete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a compact three-sentence block that front-loads the purpose and then details the dismiss behavior. There is no fluff, and every sentence contributes something. The structure is logical: purpose, usage hint, behavioral specifics.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema exists, so return values are presumably covered. However, the tool has 17 parameters and 6 enums, and the description only explains the dismiss action in detail. It doesn't cover the status, enter, or return actions, nor does it mention platform nuances (e.g., whether it works on iOS despite saying Android). This leaves gaps for an agent to call it correctly across all actions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 94%, so the schema already documents most parameters. The description adds value by explaining the 'dismiss' action's semantics (taps dismiss key, verifies, etc.), which the schema's enum values don't describe. However, it doesn't clarify the meaning of 'status', 'enter', or 'return', so it only partially compensates for the undocumented enum semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb-resource relationship: inspect or press/dismiss the keyboard. It is specific about the Android platform and distinguishes itself from generic tools like 'type' or 'click'. However, it doesn't fully disambiguate between the 'status' and 'enter' actions, so it's not perfect.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says 'To hide the keyboard, use keyboard dismiss', giving a concrete when-to-use for one action. But it doesn't provide guidance for when to use 'status', 'enter', or 'return', nor does it contrast with alternative tools like 'type' or 'keyboard' siblings. This is partial guidance at best.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

logsC

Session app log info, start/stop streaming, diagnostics, and markers Times out after 90s.

NameRequiredDescriptionDefault
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
actionNo
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
messageNo
restartNo
sessionNoAgent-device session name.
platformNoPlatform selector used to resolve a device.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden for behavioral transparency. It does disclose one useful behavior ('Times out after 90s'), but it does not mention side effects of start/stop/clear, whether operations mutate session state, what diagnostics and markers produce, or any permissions or environmental requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loads the core purpose, with the timeout disclosure placed at the end. The telegraphic phrasing 'Session app log info, start/stop streaming, diagnostics, and markers' is slightly fragmented but contains no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 18-parameter tool with no annotations and no output schema, this description is far too thin. It does not explain how actions like start, stop, mark, or clear behave, what output format is expected, or how the many optional parameters should be used together. The schema helps with parameter names but not with overall invocation strategy.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is high (83%), so the baseline is 3 even without additional parameter details. The description's action terms (start/stop streaming, diagnostics, markers) loosely map to the action enum, but it does not meaningfully clarify parameter relationships or add semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the resource ('session app log') and lists the main operations (log info, start/stop streaming, diagnostics, markers), which is enough to understand the tool's general purpose. It falls short of a crisp verb+resource phrasing like 'Manage session app logs' and does not explicitly distinguish itself from siblings such as events or record.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to use this tool versus alternatives like events, record, or debug. The description implies it is for session app log operations, but it provides no context about prerequisites, when not to use it, or how it should be selected among the many sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

longpressB

Hold a UI target by snapshot ref, selector, or coordinates to open a context menu or perform another hold gesture. Set durationMs when the default hold duration is unsuitable. Times out after 210s; a caller-supplied budget extends it.

NameRequiredDescriptionDefault
rawNoUse raw snapshot data during selector resolution.
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
depthNoSnapshot traversal depth.
runIdNoLease run identifier.
scopeNoSnapshot scope selector used before resolution.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
settleNoAfter the action, wait for the UI to go quiet and return the settled diff vs the pre-action tree in the same response. Best-effort; never fails the action.
targetYesUI target. This is separate from deviceTarget, which selects the device form.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
timeoutMsNoSettle: wait deadline in milliseconds (default 10000).
durationMsNoLong press duration in milliseconds.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
settleQuietMsNoSettle: quiet window in milliseconds (default 500; 300 when the settled tree comes from the iOS simulator snapshot bridge). On iOS, a broad screen replacement such as a modal dismissal is confirmed for at least 1500ms whatever window is asked for, within the timeoutMs settle deadline; a replacement from a screen the pre-action capture read as presenting nothing, such as a tab switch, gets no 1500ms confirmation and keeps the asked window.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription
xNoResolved interaction x coordinate when available.
yNoResolved interaction y coordinate when available.
refNoSnapshot ref without the @ prefix when the target was an @ref.
costNo
hintNo
settleNo
gestureNo
messageNo
warningNo
evidenceNo
refLabelNo
selectorNoSelector expression when the target was a selector.
durationMsNo
resolutionNoPre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path.
targetKindYesResolved interaction target kind.
selectorChainNo
referenceWidthNoReference frame width for visualizing the interaction point.
targetHittableNo
referenceHeightNoReference frame height for visualizing the interaction point.
maestroFallbackReasonNo
maestroNonHittableCoordinateFallbackUsedNoWhether the direct iOS Maestro coordinate fallback was actually used.
maestroNonHittableCoordinateFallbackAllowedNoWhether the direct iOS Maestro coordinate fallback was allowed for this selector.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It does disclose the 210s timeout and that a caller-supplied budget extends it, which is useful operational context, but it says nothing about side effects, permission requirements, device preconditions, or whether the gesture is cancellable — significant gaps for a mutating UI action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the action and target modes before the parameter note and the timeout caveat. Nothing is wasted, though the timeout sentence sits slightly awkwardly as an operational footnote rather than being grouped with the `timeoutMs` semantics.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 23-parameter tool with no annotations, the description is thin: it covers purpose, one parameter's override behavior, and the timeout, but omits device-resolution context, settle/diff behavior, and any safety framing. The existence of an output schema relieves it of explaining return values, which keeps this at an adequate-but-incomplete 3.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% across 23 parameters, so the schema already documents each field thoroughly. The description only annotates one of them (that durationMs exists to override a default), which is a marginal addition over the schema's own 'Long press duration in milliseconds.' Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (hold/long-press) and resource (UI target), and enumerates the three targeting modes — snapshot ref, selector, coordinates — which is more than the name alone conveys. It does not, however, distinguish itself from the sibling `press`, `click`, or `gesture` tools, leaving the agent to infer when a hold is required instead of a tap.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: 'to open a context menu or perform another hold gesture' gives the intent, and 'Set durationMs when the default hold duration is unsuitable' is genuine conditional guidance for one parameter. There is no explicit when-to-use-this-vs-`press`/`gesture` routing and no prerequisite or platform guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

metroB

Prepare a React Native development server or ask connected apps to reload, using the development server this session is bound to. Provide explicit runtime inputs only to override that binding for one call. The binding is cleared when the session closes, and a fresh open without runtime hints also clears any leftover binding from a previous same-name session. Times out after 90s.

NameRequiredDescriptionDefault
kindNo
portNo
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
actionYes
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
logPathNo
sessionNoAgent-device session name.
platformNoPlatform selector used to resolve a device.
bundleUrlNo
launchUrlNo
metroHostNo
metroPortNo
timeoutMsNo
listenHostNo
statusHostNo
bridgeScopeNo
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
projectRootNo
deviceTargetNoDevice target form. Maps to the CLI --target flag.
publicBaseUrlNo
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
reuseExistingNo
probeTimeoutMsNo
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
runtimeFilePathNo
startupTimeoutMsNo
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.
installDependenciesIfNeededNo

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It does disclose the binding lifecycle, the 90s timeout, and the override mechanism, which adds value. However, it omits details about side effects, error behavior, or what happens to existing server state, so it is only partially transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded with the core purpose, followed by the key binding rules and timeout. It is efficient with no redundant sentences, though the density of information might require careful reading.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 34 parameters, no output schema, and nested objects, the description is incomplete. It does not explain what the tool returns, the difference between 'prepare' and 'reload' beyond names, or how the many parameters interact. An agent would need to inspect the schema for many fields, but even that is insufficient for undocumented ones.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 44% (low), and the description does not compensate. It only mentions that runtime inputs override the binding, but does not explain the meaning or usage of the many undocumented parameters (e.g., kind, port, bundleUrl, projectRoot). The general note is too vague to help an agent understand which parameters are relevant for each action.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the two actions (prepare a React Native development server or reload connected apps) and identifies the resource (the development server bound to the session). It is specific about the verb and resource, though it does not explicitly differentiate from sibling tools like 'react-native' which might overlap, so it loses a point for missing sibling distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear guidance on when to use the tool: it uses the session-bound dev server, and explains how to override the binding with runtime inputs and the binding lifecycle (cleared on session close or fresh open). It does not explicitly mention alternatives or when not to use it, but the context is sufficient for an agent to decide.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

networkB

Dump recent HTTP(s) traffic parsed from the session app log Times out after 90s.

NameRequiredDescriptionDefault
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
limitNo
runIdNoLease run identifier.
actionNo
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
includeNo
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
platformNoPlatform selector used to resolve a device.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It mentions the timeout and that traffic is parsed from logs, implying read-only behavior, but does not disclose side effects, resource usage, or exact output behavior beyond 'dump'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with an appended timeout note, conveying the core purpose without extraneous detail. It is tightly focused and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema and the description does not explain return formats, structured content, or how the many parameters combine. While the purpose is clear, the tool context is incomplete for an agent needing to know what output to expect or how to choose options.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 83% and most parameters have meaningful descriptions explaining aliases, enums, defaults, and resolution behavior. A few parameters like 'limit' and 'include' lack descriptions, but the overall parameter semantics are well clarified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool dumps recent HTTP(S) traffic parsed from the session app log, using the specific verb 'Dump' and naming the resource and source. This distinguishes it from generic log retrieval tools like 'logs'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives such as 'logs' or 'perf'. It does not mention prerequisites, conditions, or scenarios where this should be preferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

openA

Boot the selected device when needed, then open an app, deep link, or URL in a session. Use the app or URL inputs to choose what becomes the foreground automation target. metroHost, metroPort, and bundleUrl choose the app's Metro server and save its address for later reloads. launchUrl selects the app's launch URL and does not select the reload server. A fresh open without Metro hints clears an older same-name binding; close also clears it. Times out after 90s; a caller-supplied budget extends it.

NameRequiredDescriptionDefault
appNoApp name, bundle id, package, or URL.
urlNoOptional URL passed with an app shell.
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
forceNoOverwrite an existing --save-script target instead of refusing (alias: --overwrite).
runIdNoLease run identifier.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
waitMsNoBlock this open for up to n milliseconds (100-120000) while another session holds the device, then fail with DEVICE_IN_USE naming that session. Only session contention is waited for: a device claim held by another workspace is refused at once with its recovery command. A device that never frees, or is taken again while this open waits, costs the full budget, which extends this command's timeout envelope rather than eating into it.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
surfaceNomacOS presentation surface to open: the app itself, the frontmost app, the desktop, or the menu bar.
testImeNoActivate the headless Android test IME for deterministic Unicode text entry (default on for emulators; opt-in on real devices).
activityNoAndroid activity name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
relaunchNoForce relaunch.
bundleUrlNoSession-scoped bundle URL hint applied to the opened app.
launchUrlNoLaunch URL for the opened app; does not select the server used by metro reload.
metroHostNoSession-scoped Metro/debug host hint applied to the opened app.
metroPortNoSession-scoped Metro/debug port hint applied to the opened app. On an emulator/simulator the host defaults to the loopback alias (Android 10.0.2.2, iOS 127.0.0.1) when --metro-host is omitted; physical devices still require an explicit --metro-host.
timeoutMsNoStartup budget in milliseconds. Bounds the Simulator boot wait, so a never-booted Simulator can finish its first-boot migration; omit for the default startup behavior.
foregroundNoInclude an initial interactive snapshot in a fresh open response. With no app argument, discover the sole running app on the sole booted iOS simulator; ambiguous environments fail closed.
launchArgsNoLaunch arguments forwarded verbatim to the platform launch command.
saveScriptNo
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
launchConsoleNoFile path on the daemon host for the stdout and stderr of the initial app launch. iOS simulator direct app launches only; not for URL opens.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden and discloses key side effects: a fresh open without Metro hints clears an older same-name binding, close also clears it, and the command times out at 90s unless a caller budget extends it. It does not cover permission requirements or whether an existing session is replaced, but the main behavioral traits are surfaced.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the primary action and then layers in key scoping and timeout details across four dense sentences. It is appropriately sized for a 33-parameter tool, with no obvious filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the high schema coverage and absence of an output schema, the description covers the essential behavior, side effects, and timeout envelope an agent needs before calling. It does not explain every one of the 33 parameters, but the schema carries those details, so this is reasonably complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 97%, so parameter semantics are already well documented. The description restates how metroHost, metroPort, bundleUrl, and launchUrl interact but adds little beyond the schema's own descriptions; baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb sequence ('Boot... then open an app, deep link, or URL in a session') and names the foreground automation target, making the scope unambiguous. It distinguishes this tool from siblings like boot and close by clarifying the conditional boot and the binding-clearing behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains how to choose the foreground target via app or URL inputs and clarifies the Metro versus launch URL distinction. It does not explicitly name alternatives like using boot alone or a dedicated reload tool, but the context is clear enough for an agent to decide when to call it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

orientationA

Set device orientation on iOS and Android. auto hands rotation back to the sensor on ADB-backed Android (local and Limrun); other backends refuse it. Times out after 90s.

NameRequiredDescriptionDefault
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
orientationYes
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription
actionYes
messageYes
warningNo
confirmedNo
orientationYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden and discloses platform scope, backend-specific auto behavior (local/Limrun ADB only; others refuse), and a 90s timeout. It still omits permission or auth requirements and richer failure modes, but the key special-case behavior is covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with purpose and immediately followed by the most important caveat and timeout. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 17 parameters, no annotations, and an existing output schema, the description provides enough operational context: platform scope, the special auto behavior, and timeout. Device-selection parameters are documented in the schema, so the description need not repeat them.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 94%, so the schema already documents most parameters. The description adds meaningful semantics for the required 'orientation' parameter by explaining 'auto' as handing rotation back to the sensor only on ADB-backed Android; other values are left to the enum.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('Set device orientation') and scopes it to iOS and Android. It is clear, though it does not explicitly distinguish this tool from any sibling such as viewport or gesture.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It implies usage by stating the orientation action and gives a conditional constraint for 'auto' on ADB-backed Android, including refusal on other backends. However, it does not say when to choose this tool over alternatives or when to prefer each orientation mode.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

perfA

Collect frame health, memory diagnostics, and platform profiling artifacts with compact agent-readable summaries. For CPU profiles, start and stop write the raw artifact while report writes a compact summary; request the report when the task needs readable native CPU evidence. Profiling output is evidence only: compact state, artifact path, and size. Times out after 90s.

NameRequiredDescriptionDefault
outNoOutput artifact path.
areaYes
kindNo
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
actionNo
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
subjectNo
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
templateNoxctrace template name, for example Time Profiler.
tracePathNoExisting .trace path to report, defaults to the latest session trace.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses the 90-second timeout, describes the output as 'evidence only' with 'compact state, artifact path, and size', and clarifies the behavior of start/stop vs report for CPU profiles. This goes beyond a minimal description, though it does not address side effects, permissions, or error conditions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, front-loaded with the primary purpose, then adding action-specific guidance and a timeout note. Every sentence contributes distinct information with no waste. It is compact and well-structured for an agent to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (23 parameters) and no output schema, the description covers the essential behavior: what it collects, the distinction between raw and summary artifacts, output shape, and the timeout. It relies on the schema for parameter details, which is reasonable given 83% coverage. It does not mention error handling or edge cases, but the information provided is sufficient for an agent to call it correctly in common cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 83%, so the schema already documents most parameters. The description adds value by explaining the action semantics (e.g., start/stop vs report behavior), which informs how parameters like 'action' and 'kind' are used. However, it does not elaborate on the many selector parameters (udid, serial, device), relying on the schema's existing descriptions. This is adequate given high coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Collect frame health, memory diagnostics, and platform profiling artifacts with compact agent-readable summaries.' It specifies the resource (profiling artifacts) and the action (collect). It distinguishes actions within the tool (start/stop vs report) but does not explicitly contrast with sibling tools like 'trace', so it stops short of full differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides some guidance on when to use the 'report' action ('request the report when the task needs readable native CPU evidence') and notes that start/stop write raw artifacts. However, it does not compare this tool to alternatives or state when to prefer 'perf' over a sibling like 'trace' or 'artifacts'. The guidance is limited to internal action selection, not tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pressA

Short-press a UI target by snapshot ref, selector, or coordinates. Use longpress instead when the target requires a context-menu or hold gesture. Success means the press was dispatched, not that it landed: use settle or verify to confirm the result, or wait for the expected screen. A ref or selector target is re-checked for motion before dispatch when the session's previous action just animated the screen, and is dispatched at its resting position; one that has not stopped refuses with target_still_moving rather than acting where it was. Times out after 90s; a caller-supplied budget extends it.

NameRequiredDescriptionDefault
rawNoUse raw snapshot data during selector resolution.
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
countNoNumber of press/click repetitions.
debugNoEnable debug diagnostics.
depthNoSnapshot traversal depth.
runIdNoLease run identifier.
scopeNoSnapshot scope selector used before resolution.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
holdMsNoHold duration for each action.
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
settleNoAfter the action, wait for the UI to go quiet and return the settled diff vs the pre-action tree in the same response. Best-effort; never fails the action.
targetYesUI target. This is separate from deviceTarget, which selects the device form.
tenantNoRemote tenant identifier.
verifyNoCapture cheap post-action evidence (AX digest, node counts, changedFromBefore) instead of a follow-up snapshot.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
jitterPxNoDeterministic per-axis coordinate jitter in pixels (each press offsets x and y by up to this amount).
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
doubleTapNoRequest a double-tap action.
timeoutMsNoSettle: wait deadline in milliseconds (default 10000).
intervalMsNoDelay between repeated press/click actions.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
settleQuietMsNoSettle: quiet window in milliseconds (default 500; 300 when the settled tree comes from the iOS simulator snapshot bridge). On iOS, a broad screen replacement such as a modal dismissal is confirmed for at least 1500ms whatever window is asked for, within the timeoutMs settle deadline; a replacement from a screen the pre-action capture read as presenting nothing, such as a tab switch, gets no 1500ms confirmation and keeps the asked window.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription
xNoResolved interaction x coordinate when available.
yNoResolved interaction y coordinate when available.
refNoSnapshot ref without the @ prefix when the target was an @ref.
costNo
hintNo
countNoNumber of press/click repetitions.
buttonNo
holdMsNoHold duration for each action.
settleNo
messageNo
warningNo
evidenceNo
jitterPxNoDeterministic per-axis coordinate jitter in pixels (each press offsets x and y by up to this amount).
refLabelNo
selectorNoSelector expression when the target was a selector.
doubleTapNoWhether the command requested a double-tap action.
intervalMsNoDelay between repeated press/click actions.
resolutionNoPre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path.
targetKindYesResolved interaction target kind.
selectorChainNo
referenceWidthNoReference frame width for visualizing the interaction point.
targetHittableNo
referenceHeightNoReference frame height for visualizing the interaction point.
maestroFallbackReasonNo
maestroNonHittableCoordinateFallbackUsedNoWhether the direct iOS Maestro coordinate fallback was actually used.
maestroNonHittableCoordinateFallbackAllowedNoWhether the direct iOS Maestro coordinate fallback was allowed for this selector.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so: it discloses that success means dispatch rather than landing, the motion re-check before dispatch and the target_still_moving refusal mode, the 90s timeout, and that a caller-supplied budget extends it. These are non-obvious failure and timing semantics an agent could not get from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and the sibling alternative, then the success-semantics caveat, then the motion edge case, then the timeout. Five sentences, none of which is filler; even the long motion sentence carries behavior found nowhere else.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 28-parameter, no-annotation tool the description covers the critical risks: dispatch-vs-effect ambiguity, the still-moving refusal, and timeout behavior, and the output schema makes return-value detail unnecessary. What remains unaddressed is the press-versus-click relationship and device-selection framing, though the latter is fully covered by schema descriptions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema for key parameters: it enumerates the target variants the oneOf encodes and explains what settle/verify actually deliver (post-action confirmation) rather than just naming them. It does not explain count, intervalMs, jitterPx, or holdMs, but those are well-documented in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Short-press a UI target") plus the three targeting modes (snapshot ref, selector, coordinates), so the agent knows exactly what action is performed and what input it consumes. It explicitly distinguishes itself from the longpress sibling in the next sentence.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-not with the alternative named: use longpress for context-menu or hold gestures. It also routes the agent to settle/verify/wait for result confirmation. The one gap is that the sibling 'click' is never differentiated, so an agent facing both still has to infer which to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pushA

Deliver push notification payloads to an installed app. Times out after 90s.

NameRequiredDescriptionDefault
appYes
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
payloadYes
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are attached, so the description must carry behavioral disclosure. It does provide a concrete operational constraint (90s timeout) and implies an installed-app prerequisite, which is useful. However, it doesn't disclose side effects on the device, permission/auth requirements, or failure behavior, so the burden is only partially met.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the operation and followed by the one critical constraint. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a very large schema (18 params) and no annotations, the description provides only the core action and timeout; it leaves side effects, usage context, and device-selection nuance to the schema. The rich schema and output schema offset some gaps, but the absence of any behavioral or usage context beyond the timeout makes the description only minimally complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is high (~89%), so the baseline is 3. The description names the two central concepts (app, payload) but adds no detail on payload shape or selector semantics; the schema already carries those details. Since app has no schema description and payload has only a type oneOf, a little more explicit parameter context would improve it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The sentence identifies a concrete operation ('Deliver push notification payloads') and a target ('an installed app'), so an agent can distinguish this push-notification tool from unrelated generic actions like install or click. No sibling tool appears to cover push notifications, so the description's specificity resolves the otherwise ambiguous name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance about when to choose push over alternatives or when not to use it. The description only states what it does and the timeout; the intended selection context is left to inference. With no comparable sibling, at least a note on prerequisites or when to use it would be needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

react-nativeA

Run supported React Native automation helpers. Use dismiss-overlay to close a visible development error overlay before continuing normal UI automation. Times out after 90s.

NameRequiredDescriptionDefault
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
actionYes
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It adds a useful 90-second timeout and states the dismissal action, but it does not disclose side effects, prerequisites, or failure behavior. This is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loaded with the intended action and use case. The opening phrase 'Run supported React Native automation helpers' is somewhat generic, but the following sentence earns its place by giving concrete guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-action helper with no output schema and no annotations, the description covers when to use it and the timeout. It does not explain what response to expect or whether the action has side effects on app state, leaving some gaps for the agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 94%, so the schema already documents almost all parameters. The description clarifies the one meaningful parameter ('dismiss-overlay') beyond the raw enum list, but it adds no further parameter-level detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a concrete action ('dismiss-overlay'), its target ('development error overlay'), and a clear purpose ('before continuing normal UI automation'). It does not simply restate the tool name, and it distinguishes this React Native-specific helper from the generic sibling automation commands.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent when to use the tool: when a visible development error overlay needs to be dismissed before continuing UI automation. It does not enumerate exclusions or direct the agent to an alternative, but the context is clear enough for the single supported action.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

recordA

Start or stop a screen recording for the active app session or, where supported, the selected device, or build a contact-sheet PNG from a recording already exported. Long Android recordings can return multiple video artifacts; HarmonyOS supports whole-screen recording on physical devices. Times out after 90s.

NameRequiredDescriptionDefault
fpsNo
pathNo
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
actionYes
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
qualityNo
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
hideTouchesNo
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
recordingScopeNo
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the full burden of behavioral disclosure. It discloses a 90-second timeout, potential multiple video artifacts on Android, and HarmonyOS whole-screen recording support. However, it does not mention side effects like file storage, permissions, or what happens to existing recordings. The description provides some useful behavioral context but is not comprehensive, missing aspects like the effect of the 'stop' action or how output artifacts are delivered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, concise and front-loaded with the primary purpose. It packs useful details (timeout, artifact behavior) without fluff. Each sentence earns its place, though the structure could be improved by separating the contact-sheet use case into a clearer secondary clause. Overall, it is efficient and well-sized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has 22 parameters and an output schema, so return values are covered. The description provides essential behavioral context (timeout, multi-artifact, platform support) but does not guide the agent on how to choose between app vs device vs contact-sheet modes, nor does it explain the interplay of parameters like recordingScope or quality. Given the complexity, the description is adequate but leaves several usage details to the schema, making it somewhat incomplete for optimal agent guidance.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 73%, so most parameters already have descriptions. The tool description adds little parameter-level meaning beyond hinting at device selection ('selected device') and platform-specific recording scope. It does not explain parameters like recordingScope, quality, fps, or hideTouches, but these are partially covered by the schema. Since coverage is high, the baseline is 3, and the description does not significantly elevate it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: start/stop a screen recording, and also build a contact-sheet PNG from an exported recording. It specifies the resource (active app session or selected device) and distinguishes from siblings like screenshot or snapshot by focusing on recording and contact-sheet generation. The verb 'Start or stop' and 'build' are specific and actionable, making the tool's role unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides context about when to use the tool (for screen recordings or contact-sheets) but does not explicitly mention alternatives or exclusions. It does not state 'use this instead of screenshot when you need video' or similar. The mention of 'Long Android recordings can return multiple video artifacts' and 'HarmonyOS supports whole-screen recording' hints at platform considerations but does not guide selection among sibling tools. There is no explicit when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reinstallA

Replace an installed app with a binary from a local path. Use this when preserving the same app identity while installing a new build on the selected device. Times out after 180s.

NameRequiredDescriptionDefault
appYes
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
appPathYesPath to app binary.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries the full burden. It discloses the core replacing behavior, the identity-preservation contract, and the 180s timeout. However, it does not explain prerequisites, whether app data is preserved, permission requirements, or what a successful response contains.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the action, then the key constraint and timeout. Every sentence earns its place with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The core operation is clearly described, but this is an 18-parameter mutation tool with no annotations and no output schema. The description does not cover selection prerequisites, behavioral side effects, or return expectations; it relies heavily on the schema for the rest.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 94%, so the schema carries most parameter meaning. The description adds useful context that app is the app identity and appPath is the local binary path, but it does not meaningfully enrich the many selector and response-control parameters already documented in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Replace'), the resource ('an installed app'), the source ('a binary from a local path'), and adds a distinguishing qualifier: preserving the same app identity while installing a new build. This clearly differentiates it from siblings like install and install-from-source.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use it: when preserving the same app identity while installing a new build on the selected device. It does not explicitly list when not to use it or name alternatives, but the usage context is clear enough for an agent to route correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

replayA

Run a recorded automation script, including compatible Maestro YAML flows. A script without a terminal close leaves its session active for subsequent automation. Times out after 90s; a caller-supplied budget extends it.

NameRequiredDescriptionDefault
envNo
pathYes
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
forceNo
runIdNoLease run identifier.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
updateNo
backendNo
leaseIdNoExisting lease identifier.
maestroNo
sessionNoAgent-device session name.
testImeNoActivate the headless Android test IME for the sessions this replay opens (default on for emulators; opt-in on real devices).
platformNoPlatform selector used to resolve a device.
bundleUrlNoBundle URL hint inherited by replay-opened sessions.
metroHostNoMetro/debug host hint inherited by replay-opened sessions.
metroPortNoMetro/debug port hint inherited by replay-opened sessions.
timeoutMsNoOperation wall-clock budget in milliseconds (default 60000). The client allows another 30000 milliseconds for the daemon result.
resumeFromNo
saveScriptNo
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
keepSessionNoLeave the session active by suppressing exactly an authored terminal close in native .ad.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
resumePlanDigestNo
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription
healedYes
messageYes
sessionYes
replayedYes
artifactPathsYes
sessionActiveYesTrue iff the session is still active — the script had no terminal close.
snapshotDiagnosticsNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it does disclose two meaningful behaviors: a script without a terminal close keeps its session active for later automation, and there is a 90s wall-clock limit extendable by a caller-supplied budget. It does not say what the tool mutates on the device, how failures/partial runs are handled, or what happens when a session name collides.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the purpose front-loaded and the two behavioral caveats following. No filler, though the timeout clause sits slightly awkwardly against the schema's own default (60000ms) and could have been folded into the parameter discussion.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 30-parameter executor with an output schema available, the description covers purpose, session persistence, and timeouts, which are the highest-risk unknowns. The device/lease/session routing among 30 params is left entirely to the schema, which is acceptable at 70% coverage but leaves a gap for an agent choosing selectors.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 70% across 30 parameters, so the baseline is 3. The description only touches the timeout budget (timeoutMs, whose 60s + 30s client allowance composes to the stated 90s), saying nothing about the device-selector, lease/session, or Maestro-flag parameters that dominate the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: "Run a recorded automation script, including compatible Maestro YAML flows." That distinguishes it from the recording side (record) and from other executors (batch, test) without naming them explicitly. A concrete format qualifier (Maestro YAML) further narrows scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by "recorded automation script" — an agent can infer you need an existing script path, but the description never says when to prefer replay over record, batch, or test, nor states prerequisites (device lease, script existence, platform support). No explicit exclusions are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

screenshotB

Capture a screenshot of the active app or web session. Choose the capture scope, density, size, or annotations through the corresponding input fields when needed. Times out after 90s.

NameRequiredDescriptionDefault
pathNoOutput path.
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
scaleNoScreenshot scale factor.
cropOnNoSelector expression; the capture is cropped to the frame the selector resolves on the same screen.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
surfaceNo
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
stabilizeNo
fullscreenNo
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
overlayRefsNo
deviceTargetNoDevice target form. Maps to the CLI --target flag.
pixelDensityNoOutput screenshot pixel density in pixels per logical point.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
normalizeStatusBarNo
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are absent, so the description carries full responsibility. It discloses a 90-second timeout, which is useful, but it does not explicitly state that the operation is read-only, what side effects occur (e.g., file creation at path), or what the return shape is. For a capture tool this is a moderate disclosure but not comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with purpose and ending with timeout. It is concise and readable, but the phrase 'capture scope, density, size, or annotations' is vague and could be more explicit without adding length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 25 parameters, no output schema, and no annotations, the description is far too brief. It does not explain what the tool returns (e.g., image path, metadata), how path is used, or how the various selectors (udid, serial, device, platform) work together. The timeout is the only behavioral note. This is inadequate for such a complex tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 80%, so baseline is 3. The description adds a little by mentioning 'capture scope, density, size, or annotations', which loosely maps to surface, pixelDensity, scale, and overlayRefs, but it does not explain any specific parameter semantics beyond what the schema already provides. It adds minimal value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Capture'), a clear resource ('screenshot of the active app or web session'), and mentions configurable aspects (scope, density, size, annotations). It clearly conveys what the tool does and is distinct from siblings like 'snapshot' or 'record'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to use this tool versus alternatives. It does not mention when not to use it or any prerequisites. The phrase 'when needed' refers to input fields, not to choosing between tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scrollA

Scroll in a direction, or toward the top/bottom edge of scrollable content. Set until to a selector to reach an off-screen target in one command rather than a scroll-and-check loop. The optional amount is the finger-path fraction of the viewport axis, honored up to 0.8 of it; directional scrolls reduce release momentum, while app scroll physics determine the final content offset. A visible keyboard shortens the swiped band instead of being dismissed; when too little is left, the command refuses with scroll_keyboard_occludes_surface. A directional scroll also reports the movement it observed as movement: moved, at-edge, unchanged, or unobserved when the two reads could not back a claim either way; an unchanged surface inside a container that still hides content in that direction refuses with scroll_no_progress rather than repeating the requested distance. The movement field is absent where a tier verifies per pass (top/bottom, until), where the runtime cannot read a screen, or where a settle observation or a replay already owns that observation. Times out after 90s; a caller-supplied budget extends it.

NameRequiredDescriptionDefault
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
untilNoRepeat scroll passes until this selector is visible on screen, then stop. Not valid with the top/bottom edge directions, which carry their own stop condition.
amountNoPlatform scroll amount.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
pixelsNoPixel scroll amount.
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
settleNoAfter the action, wait for the UI to go quiet and return the settled diff vs the pre-action tree in the same response. Best-effort; never fails the action.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
directionYes
maxPassesNoMaximum scroll gestures for an until search (default 12). Requires until.
timeoutMsNoSettle: wait deadline in milliseconds (default 10000).
durationMsNoScroll duration in milliseconds when the backend supports pacing.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
settleQuietMsNoSettle: quiet window in milliseconds (default 500; 300 when the settled tree comes from the iOS simulator snapshot bridge). On iOS, a broad screen replacement such as a modal dismissal is confirmed for at least 1500ms whatever window is asked for, within the timeoutMs settle deadline; a replacement from a screen the pre-action capture read as presenting nothing, such as a tab switch, gets no 1500ms confirmation and keeps the asked window.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription
edgeNo
untilNoUntil scrolls only: the selector the passes stopped on.
amountNo
passesNoEdge and until scrolls only: how many scroll-and-check passes ran.
pixelsNo
settleNo
messageNo
movementNoDirectional scrolls only: what the owner observed after its gesture. `moved` means the content inside the scroller the swipe ran in differs from the tree the session stored immediately before the gesture; `at-edge` and `unchanged` mean it did not change, with no hidden content left to reveal and with no end-of-content signal to read, respectively; `unobserved` means the pair could not back a claim in either direction — nothing comparable was available (no stored tree, a capture from another lineage, a surface that never came to rest), or every difference sits outside the scroller that was swiped, which a changing status bar does on Android — so the reported distance rests on the gesture plan alone. The field is absent — which is never a claim that nothing moved — on the tiers that verify per pass (`scroll top`/`bottom`, `--until`), on a runtime bound without a capture, on a platform whose scroll dispatches no swipe (the Linux wheel), and where the caller already owns that observation (`--settle`, or a replay with `postGestureStabilization: false`).
directionYes
durationMsNo
keyboardMinYNoWhere the keyboard began, in the same unit as the gesture coordinates. Clipped scrolls only.
keyboardAvoidedNoPresent only when an on-screen keyboard forced the swipe into the band above it; the reported pixels were planned against the shorter referenceHeight.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden and does so thoroughly: it explains amount limits, momentum reduction, scroll physics, keyboard occlusion refusal, movement reporting values, no-progress refusal, absent movement fields, and the 90s timeout. These operational details go well beyond the schema and are highly useful to an agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and every clause is relevant, but it is a dense run-on paragraph with many edge-case details packed into one block. It is appropriately sized for a complex tool, though it could be more scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the 25-parameter schema, the output schema, and the absence of annotations, the description is complete enough for an agent to call the tool correctly. It covers the key behaviors, failure modes, timing, and when to use 'until' mode without needing to explain return values already covered by the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 96%, so the baseline is 3, but the description adds meaningful semantics for core parameters such as 'amount' as a finger-path fraction honored up to 0.8 and 'until' as a way to avoid repeated scroll-and-check passes. It does not enrich every parameter, but it adds real value for the scroll-specific ones.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Scroll in a direction, or toward the top/bottom edge of scrollable content.' It clearly covers directional and edge-reaching scrolling, though it does not explicitly distinguish this from the sibling 'swipe' tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete guidance for the 'until' mode: use a selector to reach an off-screen target in one command rather than a scroll-and-check loop. It also explains when directional scrolling applies versus edge scrolling, but it does not explicitly compare against alternatives such as 'swipe'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sessionC

List active sessions, print the effective daemon state directory, or publish an armed open-to-destination script without closing its session Times out after 90s.

NameRequiredDescriptionDefault
pathNoOptional .ad output path for save-script.
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
forceNoAtomically replace an existing save-script target.
runIdNoLease run identifier.
actionNolist shows active sessions; state-dir prints the daemon state directory; save-script publishes an armed recording without teardown.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
platformNoPlatform selector used to resolve a device.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full burden. It does disclose two genuinely useful behavioral traits: the command times out after 90s, and save-script publishes without closing/tearing down the session. However, 'armed' is left undefined, side effects of publish are not stated, and the return shape of each action is undisclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loads the primary action, but it reads as a run-on with three operations crammed into one sentence. 'Times out after 90s' dangles at the end and ambiguously appears to modify 'session' rather than the command itself.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is an 18-parameter, zero-required, multi-action tool with no annotations and no output schema, so the description must do heavy lifting. It does not explain which selector parameters apply to which action, what 'armed' or 'open-to-destination' means, or what each action returns. The description is insufficient for reliable invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3 even with no parameter detail in the description. The description loosely rephrases the action enum's save-script semantics but adds no substantive meaning beyond the schema's per-parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names three distinct verb+resource operations: list active sessions, print the daemon state directory, and publish a save-script. This distinguishes the tool from the sibling list, none of which appear session/daemon-focused. However, the third operation is jargon-heavy ('armed open-to-destination script') and reads ambiguously, slightly weakening clarity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given for when to use this tool versus alternatives, nor when to choose one action over another. The sibling list offers no differentiation hints, and the description never mentions exclusions or prerequisites. The only routing signal is the action enum's per-value schema descriptions, which are brief.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

settingsC

Read or change supported operating-system settings, animation scales, appearance, or app permissions on the selected target. Platform support varies by setting and action. Times out after 90s.

NameRequiredDescriptionDefault
appNoApp the change targets, by bundle id, package name, or app name: the app `clear-app-state` clears, or the app a `permission` change (or an iOS-simulator `location on|off` privacy change) lands on. A name resolves to the installed app as `open` resolves it: an iOS simulator matches display names and accepts only an installed bundle id, Android accepts only an installed package and refuses a name that resolves to an intent with `setting_app_not_package`, and a Limrun iOS session resolves only the `settings` alias. One that resolves to nothing is refused with `app_not_installed` before anything changes. The app need not be running. Without it the session app is used; a device-wide change (`location set` on any target, the Android `location on|off` toggle, `mobile-data`, macOS permissions) refuses one with `setting_app_not_consumed`. The CLI reads it only from this invocation, never from `AGENT_DEVICE_TARGET_APP` or config `targetApp`.
modeNo
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
stateNo
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
settingYes
latitudeNo
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
longitudeNo
permissionNo
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral-disclosure burden, and it only adds a 90-second timeout and a vague platform-variance note. It does not explain destructive actions among the supported settings (e.g., reset-keychain, clear-app-state, permission changes), required permissions, reversibility, or side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three short, front-loaded sentences: purpose first, platform caveat second, timeout third. It is appropriately sized and contains no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex 23-parameter tool with no annotations and no output schema, the description is too thin. It does not explain platform/setting support, the meaning of individual setting actions, destructive behavior, or return expectations, leaving major gaps for an agent selecting and invoking it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 74%, so many parameters are already documented in the schema. The description adds some meaning to the 'setting' parameter by naming animation scales, appearance, and app permissions, but it leaves most enum values (wifi, bluetooth, location, reset-keychain, etc.) and several undocumented parameters without added semantic detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb pair ('Read or change') and resource ('operating-system settings'), and names representative categories such as animation scales, appearance, and app permissions. It is specific enough to identify the tool's purpose, though it does not distinguish it from any sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no explicit when-to-use guidance, no exclusions, and no alternatives to use instead. 'Platform support varies by setting and action' hints at caveats but does not tell an agent which settings/actions are valid on which platforms or when another tool would be preferable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

shutdownC

Shutdown a selected simulator or emulator. Times out after 90s.

NameRequiredDescriptionDefault
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
platformNoPlatform selector used to resolve a device.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription
idYesStable device id.
kindYes
deviceYesHuman-readable device name.
targetYes
platformYes
shutdownYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It does add a useful timeout fact ('Times out after 90s'), but it does not disclose that this is a destructive operation, what happens to the device's state, whether shutdown is graceful or forced, or what the agent should expect on timeout. This is a meaningful gap for a shutdown command.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences with no filler. The primary action is front-loaded, and the timeout detail earns its place as a useful operational constraint. It is appropriately sized for a tool whose behavior is simple, even if the parameter surface is large.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 15 parameters, no annotations, and only a two-sentence description, the context is incomplete. Although the schema documents each parameter and an output schema exists, the description does not explain which selectors are relevant, how the 'selected' device is resolved, or what the shutdown operation entails beyond stopping. An agent would likely need to inspect many sibling tools and parameter descriptions to use it confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the input schema already documents all 15 parameters in detail. The description itself adds no parameter-level meaning, such as which selector (udid, device, serial, platform) is preferred or how to identify the target. Per the baseline rule for high coverage, a 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Shutdown') and a clear resource ('a selected simulator or emulator'), which makes the core action immediately understandable. It does not explicitly differentiate from siblings like 'close' or 'boot', but the action is distinct enough that a well-informed agent can infer the intent.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance about when to use shutdown instead of sibling tools such as 'close', 'boot', or 'session'. The phrase 'selected simulator or emulator' implies there is a selection mechanism, but it never explains how the agent should choose this tool over alternatives or under what conditions shutdown is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

snapshotB

Capture the accessibility tree or compare it with the previous session baseline. Use the returned refs for subsequent semantic interactions and the diff option to verify UI changes. Times out after 90s; a caller-supplied budget extends it.

NameRequiredDescriptionDefault
rawNo
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
depthNo
runIdNoLease run identifier.
scopeNo
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
recordNoForce-record this out-of-band observation into a repair-armed heal (mutually exclusive with noRecord). Authored replay steps are recorded automatically and never need this.
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
forceFullNo
timeoutMsNoMaximum wall-clock time for the snapshot command.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
observeOnlyNoiOS only. Refuse instead of activating or repairing the session app. Reports XCUIApplication state, which does not prove screen ownership (#2696).
deviceTargetNoDevice target form. Maps to the CLI --target flag.
customActionsNoName the affordances an element merged away (iOS UIAccessibilityCustomAction, React Native accessibilityActions) — a card whose reply/options controls are not separate elements still lists them here. The names are for PLANNING, not invocation: there is no API to trigger them, so reach the affordance through the element detail screen, through the same control exposed as a labeled element elsewhere, or by coordinates from its rect. iOS simulator only; costs one accessibility round trip per merged element.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
interactiveOnlyNo
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It usefully discloses a 90s timeout and that a caller-supplied budget extends it, which is genuine behavioral context. However, it omits baseline/session prerequisites, permission or device-resolution requirements, and response shape for a 25-parameter tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences with the core purpose front-loaded, followed by result-usage and the timeout caveat. Every sentence earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 25-parameter tool with no annotations and no output schema, the description covers the essential return semantics (refs) and the timeout, but leaves device-resolution and mode (record/noRecord/observeOnly) interactions unexplained. Adequate but with clear gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is high (~80%), so the schema already documents most parameters and a baseline of 3 is appropriate. The description adds only marginal meaning (the 'budget' tied to timeoutMs, and the 'diff option'); it does not clarify the many device-selector parameters beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ("Capture") and resource ("accessibility tree"), plus the alternate dual mode (compare with previous session baseline). This clearly separates it from visual siblings like screenshot, though it doesn't explicitly name any sibling to contrast with.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Guidance is output-oriented rather than selection-oriented: it says to reuse the returned refs for 'subsequent semantic interactions' and to use the diff option to verify UI changes. There is no explicit when-to-use-vs-alternatives or when-not, so the usage is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

swipeB

Quick coordinate fling with optional repeat pattern. Times out after 90s.

NameRequiredDescriptionDefault
toYesSwipe end point.
fromYesSwipe start point.
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
countNoNumber of swipe repetitions.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
patternNo
pauseMsNoPause between repeated swipes.
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full responsibility for revealing behavior. It discloses a 90s timeout and the possibility of repetition, but does not mention side effects like screen interaction, potential failures, or that it performs a touch gesture, which is central to its behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence that efficiently communicates the core action, repeatability, and timeout. No wasted words or redundant information; it is well-structured for quick parsing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite the tool having 21 parameters and nested objects, the description offers minimal context about the expected outcome or return value. The schema covers parameter details, but without an output schema or any mention of what the agent can expect (e.g., success/failure indication), the description alone is not fully complete for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is high (95%) and parameters like from/to already have descriptions ('Swipe start point', 'Swipe end point'). The tool description adds little beyond a summary; it does not clarify ambiguous parameters like 'pattern' or 'count' beyond what the schema already provides, so it stays at the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('fling') and the resource (coordinates), clearly indicating a swipe gesture. It distinguishes itself from siblings like 'scroll' and 'click' by implying a quick coordinate-based movement, though it could be even more explicit about being a single swipe action.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives (e.g., scroll, longpress, or gesture). It mentions optional repeat pattern and timeout but does not specify conditions or exclusions, leaving the agent to infer appropriate usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

telephonyA

Simulate an incoming phone call or SMS on an Android emulator through its console over adb: call rings from the number, accept answers, cancel ends the call, and sms delivers a text message. The call screen or notification can cover the app, so re-snapshot afterwards. Times out after 90s.

NameRequiredDescriptionDefault
textNoMessage text for sms; required for sms and refused for the call actions. The emulator drops characters outside the Basic Multilingual Plane, such as emoji.
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
actionYescall starts an incoming call, accept answers it, cancel ends it, sms delivers a text message.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
numberYesCaller or sender phone number: digits with an optional leading +.
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It usefully discloses the execution path (emulator console over adb), a hard 90s timeout, and a real side effect (call UI occludes the app, so re-snapshot). It says nothing about prerequisites such as a booted, connected emulator, whether an accept without a ringing call errors, or whether any state persists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, purpose front-loaded, no filler. The action glosses are compact and the caveat and timeout are appended in the right place. The first sentence is dense but every clause conveys behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 19-parameter tool with an output schema, the description covers purpose, timing and the post-action caveat adequately. It is incomplete on device selection, though: the schema exposes udid, platform (apple/ios/macos) and serial (Android/HarmonyOS/Vega), yet the description scopes the tool to an 'Android emulator', which can steer an agent away from valid iOS/simulator use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all 19 parameters including the action enum and the text-required-for-sms constraint. The description's action gloss largely restates the enum description, adding no format or selection detail beyond the schema; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb-and-resource pair (simulate a call/SMS) plus scope (Android emulator via adb console) and enumerates the four actions with their effects: call rings, accept answers, cancel ends, sms delivers. No sibling tool touches telephony, so the agent can route here unambiguously.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the sequencing implied by the actions (a call rings, accept answers it, cancel ends it) and gives a concrete operational instruction: re-snapshot afterwards because the call screen or notification can cover the app. It does not name when to avoid the tool or what to do if no device/emulator is attached, so it stops short of full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

testC

Run one or more replay scripts as a serial test suite Streams progress; no fixed client timeout.

NameRequiredDescriptionDefault
envNo
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
pathsYes
runIdNoLease run identifier.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
updateNo
backendNo
leaseIdNoExisting lease identifier.
maestroNo
retriesNo
sessionNoAgent-device session name.
testImeNoActivate the headless Android test IME for the sessions each suite attempt opens (default on for emulators; opt-in on real devices).
failFastNo
platformNoPlatform selector used to resolve a device.
shardAllNo
bundleUrlNoBundle URL hint inherited by each test session.
metroHostNoMetro/debug host hint inherited by each test session.
metroPortNoMetro/debug port hint inherited by each test session.
timeoutMsNo
shardSplitNo
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
recordVideoNo
artifactsDirNo
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription
testsYes
totalYes
failedYes
notRunYes
passedYes
skippedYes
executedYes
failuresYes
durationMsYes
snapshotDiagnosticsNo

TDQS

C2.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are absent, so the description carries the full behavioral burden. It does disclose two useful traits — progress is streamed and there is no fixed client timeout — but says nothing about what the run mutates on a device, whether sessions are leased/reused, what happens on partial failure (failFast exists), or artifact/video side effects implied by recordVideo and artifactsDir.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is short and front-loaded, which is good, but the two clauses are run together without punctuation ('suite Streams progress') and the brevity crosses into under-specification for a tool with 31 parameters. Efficient, but not fully earned.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be described. However, for a 31-parameter, mutation-capable, device-selecting tool with no annotations, the description omits device/session requirements, execution semantics, and failure behavior — far too thin for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 31 parameters and only 61% schema description coverage, the description must compensate, and it adds nothing about parameter meaning. The required 'paths' parameter — the core input — is entirely unexplained in both structured fields and description (paths to what: scripts? directories? globs?).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource: 'Run one or more replay scripts as a serial test suite.' The 'one or more ... serial test suite' framing distinguishes it in spirit from the sibling 'replay' (singular), but it never names that sibling or states the contrast explicitly, so differentiation must be inferred.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this tool versus alternatives such as 'replay' or 'batch', no prerequisites (device/session/lease), and no exclusions. The agent must guess between several closely-related execution tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

traceA

Start or stop trace-log capture and return the resulting artifact when capture ends. Without a path, start writes a timestamped trace log named after the session in the sessions directory of the daemon state; a path on stop moves the finished trace there. Times out after 90s.

NameRequiredDescriptionDefault
pathNo
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
actionYes
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and discloses key behaviors: the 90s timeout, the default log location and naming, and that a path on stop moves the finished trace. It does not cover permissions or concurrency, but the core behavior is well explained.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tightly written sentences, front-loaded with the core action and then moving to operational details. Every sentence adds distinct information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the 18 parameters, output schema, and high schema description coverage, the description focuses appropriately on the action and path behavior. It omits device/session selection but those are delegated to the schema, and return values are covered by the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is high (89%), but the description goes beyond the schema by clarifying exactly how the path parameter is used differently on start versus stop, including default naming and directory. This adds meaningful semantics not present in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb pair (start/stop) and resource (trace-log capture) and notes the artifact return. It does not differentiate from sibling tools like record or logs, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the start/stop mechanics and path behavior but offers no guidance on when to choose this tool over alternatives such as record or logs, nor any prerequisites. It is purely operational, not selective.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

trigger-app-eventA

Ask the app to handle an app-defined automation or test event, with an optional structured payload. Call this only for event names and payload shapes the app documents. Times out after 90s.

NameRequiredDescriptionDefault
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
eventYesName of an app-defined automation or test event the app documents.
runIdNoLease run identifier.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
payloadNoStructured payload passed to the event, in the shape the app documents for it.
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription
eventYes
messageYes
eventUrlYes
transportYes

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It discloses the 90-second timeout and the optional structured payload, but it does not say whether triggering the event can mutate app state, require authentication, or produce side effects. For an app-defined trigger command, this is a significant transparency gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, under 30 words, and front-loads the core action and the critical documentation constraint. The timeout is a useful closing detail with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The schema and output schema already carry substantial parameter and return-value detail. The description adds the app-documentation precondition and timeout, but it remains thin on side effects and how this relates to sibling event-related tools. It is adequate but not fully complete for a tool with 18 parameters and no annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and every parameter has a clear description. The description's mention of event names and payload shapes mostly echoes the schema entries for event and payload rather than adding new meaning. The baseline of 3 applies because the schema already documents parameters thoroughly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete action: ask the app to handle an app-defined automation or test event with an optional structured payload. The description clearly identifies the resource and the condition that event names be app-documented. It does not explicitly contrast with sibling tools like events or test, so it falls just short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Call this only for event names and payload shapes the app documents' provides an explicit precondition for correct use. However, it does not name alternatives or describe when to prefer a sibling tool, so it provides clear context rather than full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tv-remoteA

Press or long-press a TV remote button on Android TV, tvOS, or Vega OS. Android TV also supports volume, power, media, channel, guide, captions, input, color keys, and android-keycode:N. tvOS and Vega OS support up, down, left, right, select, menu, home, and back. Phones and WebDriver sessions are unsupported. The aliases ok, center, and enter map to select. Times out after 90s.

NameRequiredDescriptionDefault
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
buttonYesTV remote button. Android TV also accepts android-keycode:<n> with n from 1 to 2147483647.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
durationMsNoPress duration in milliseconds. tvOS and Vega OS use the exact hold duration; Android TV maps any positive value to an ADB longpress (longpress).
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription
actionYes
buttonYesTV remote button. Android TV also accepts android-keycode:<n> with n from 1 to 2147483647.
messageYes
durationMsNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden well: it discloses the 90s timeout, the platform support matrix, alias normalization (ok/center/enter -> select), and the Android TV long-press mapping. It omits prerequisites such as whether a device lease/session must already exist and what failure or recording behavior looks like.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core action is stated first, followed by per-platform capability and exclusion facts; every sentence adds decision-relevant information (platform matrix, aliases, timeout) with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 18-parameter tool with full schema coverage and an output schema, the description covers the operation, platform constraints, and button semantics adequately. It leaves the device-resolution and response-shaping parameters (udid, serial, leaseId, session, responseLevel, includeCost) entirely to the schema, which is acceptable but means an agent gets no guidance on whether a session/lease is required before pressing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds genuine meaning beyond the schema: the flat enum doesn't say volume/power/media/channel only apply to Android TV, nor that android-keycode:N is Android-only, nor that ok/center/enter are aliases of select. That is real disambiguation the schema alone does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb pair (press / long-press) plus resource (TV remote button) with explicit platform scope (Android TV, tvOS, Vega OS). It clearly separates itself from generic siblings like press, hardware-button, and longpress by restricting itself to TV-device remote keys.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Strong context: names the supported platforms and explicitly excludes phones and WebDriver sessions, and lists which buttons each platform supports. It never names the alternative tool to use for phones/WebDriver or for non-remote key presses, so routing for the excluded cases is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

typeA

Append text to the currently focused input. Use fill when the existing field value should be replaced, and focus first when no input is active. Times out after 90s.

NameRequiredDescriptionDefault
textYesText to type.
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
delayMsNoDelay between typed characters.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It reveals the append-not-replace semantics, the requirement for an already-active input, and the 90s timeout. It could go further (e.g., behavior when the input is not editable, whether characters are sent literally), but the key operational traits are present.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each contributing distinct value: the core action, the alternative routing, and the timeout constraint. It is front-loaded with the most decision-relevant information and contains zero filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an interaction command, the description covers the essential behaviors and alternatives. The 18-parameter schema is fully self-documenting, so the description need not repeat it. It lacks return value details, but with no output schema and a straightforward typing action, this is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline of 3 applies. The description does not add parameter-level nuance, but the only required parameter (text) is self-explanatory and the schema thoroughly covers the rest. No additional semantic value is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action (append text) on a clear resource (currently focused input), distinguishing itself from fill (replace) and focus (activate input). The verb 'append' and the contrast with sibling tools make its purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly specifies when to use this tool ('currently focused input'), when to use alternatives ('use fill when the existing field value should be replaced'), and a prerequisite when no input is active ('focus first'). This leaves no ambiguity about tool selection among the type/fill/focus trio.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

uninstallA

Remove an installed app from the selected device. A package name or bundle id that is not installed succeeds with wasInstalled: false. Times out after 180s.

NameRequiredDescriptionDefault
appYesPackage name, bundle id, or installed app name.
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden; it does disclose two genuinely useful traits beyond the schema: idempotent-ish success with wasInstalled: false and a 180s timeout. However, it says nothing about whether app data/state is destroyed, permission or auth requirements, or failure modes other than timeout — significant gaps for a destructive operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, all load-bearing, with the core action front-loaded and the edge case and timeout following. No filler or restatement of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 17-parameter tool with no annotations and no output schema, the description covers the action and one edge case but leaves device-selection mechanics, result shape beyond wasInstalled, and failure behavior to the schema. Adequate but with clear gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema itself explains app, udid, device, serial, and the target aliases, so the baseline is 3. The description's 'package name or bundle id' merely echoes the app parameter and adds no selector-resolution detail across the other 16 optional parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Remove an installed app from the selected device'), and the scope (single selected device) makes it easy to tell apart from install, reinstall, and install-from-source. An agent can pick this without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the verb, and the not-installed case clarifies one edge condition, but there is no explicit guidance on when to prefer uninstall over reinstall, or on prerequisites such as an active session/lease. The agent must infer the surrounding workflow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

viewportA

Resize the active web viewport before taking snapshots or screenshots. Useful for fixed-layout or 100vh apps where changing the viewport reveals different content. Times out after 90s.

NameRequiredDescriptionDefault
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
widthYesViewport width in CSS pixels.
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
heightYesViewport height in CSS pixels.
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription
widthYes
heightYes
messageYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries the full burden. It discloses the 90-second timeout and that it targets the active web viewport, but it does not mention whether the resize persists, resets, or affects subsequent commands beyond the implied snapshot/screenshot use.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with no fluff. It front-loads the action and resource, adds a concrete use case, and ends with the timeout note; every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a straightforward resize tool with a rich input schema and an output schema, the description covers what, when, and the timeout. It could be more explicit about prerequisites such as being in a web context, but it is not seriously incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the input schema already documents all parameters. The description adds no extra meaning to width, height, or device selectors, keeping this at the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: "Resize the active web viewport". It also clarifies the intent ("before taking snapshots or screenshots"), which distinguishes it from capture-oriented siblings like screenshot and snapshot.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides clear when-to-use guidance: "Useful for fixed-layout or 100vh apps where changing the viewport reveals different content" and implies sequencing before snapshots/screenshots. It does not explicitly name alternatives or exclusions, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

waitA

Wait for a duration, text, snapshot ref, selector to appear, selector to be strictly absent, or stable UI. Use the strict absence target when zero selector matches are required; stable waits until the UI stays quiet for the requested window. Times out after 90s; a caller-supplied budget extends it.

NameRequiredDescriptionDefault
rawNo
refNo
kindNo
textNo
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
depthNo
runIdNoLease run identifier.
scopeNo
absentNo
deviceNoDevice name selector (a UDID belongs in udid, a serial in serial).
serialNoAndroid, HarmonyOS, or Vega VVD serial selector.
stableNo
targetNoAlias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.
tenantNoRemote tenant identifier.
leaseIdNoExisting lease identifier.
quietMsNo
sessionNoAgent-device session name.
noRecordNoDo not record this action.
platformNoPlatform selector used to resolve a device.
selectorNo
timeoutMsNo
durationMsNo
includeCostNoInclude per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.
deviceTargetNoDevice target form. Maps to the CLI --target flag.
responseLevelNoResponse verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.
mcpOutputFormatNoMCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.
androidDeviceAllowlistNoAndroid serial allowlist used for device resolution.

Output Schema

NameRequiredDescription
hintNo
kindNo
textNo
warningNo
capturesNo
selectorNo
waitedMsYes
nodeCountNo

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses a key behavioral limit: 'Times out after 90s; a caller-supplied timeout extends it.' It does not mention side effects, permissions, failure modes, or whether the operation is read-only, which is particularly relevant given no annotations are provided. Transparency is partial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise—two sentences—and front-loads the primary purpose before providing usage nuances. It avoids unnecessary words and is well-structured, making it easy to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 28 parameters and complex behavior, the description covers the core waiting modes and timeout but omits many contextual details such as response formats, interaction with other parameters (like includeCost, responseLevel), and edge cases. It is adequate for a basic understanding but not fully complete for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds semantic context for a few parameters: 'strict absence target' clarifies the 'absent' selector, 'stable waits until the UI stays quiet' explains 'quietMs', and the timeout extension relates to 'timeoutMs'. However, many parameters (raw, ref, scope, runId, etc.) remain unexplained in both the schema and the description, leaving a significant semantic gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action: 'Wait for a duration, text, snapshot ref, selector to appear, selector to be strictly absent, or stable UI.' This specifies the verb 'wait' and enumerates the distinct target conditions, making the purpose unambiguous. It does not explicitly name sibling tools, but the wait operation is distinct enough that no confusion arises.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides conditional guidance: 'Use the strict absence target when zero selector matches are required; stable waits until the UI stays quiet for the requested window,' and mentions the default timeout and extension. However, it does not advise when to choose this tool over alternatives (e.g., 'is' for immediate checks or polling manually), so usage direction is incomplete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 13 tool updatesv0.21.29
    • Changedbatch1 field changed
      • changedInput schema / properties / steps / items / properties / command / enum
        Previous value: -[
        -  "devices",
        -  "capabilities",
        -  "doctor",
        -  "apps",
        -  "boot",
        -  "shutdown",
        -  "appstate",
        -  "perf",
        -  "logs",
        -  "network",
        -  "audio",
        -  "test",
        -  "clipboard",
        -  "keyboard",
        -  "install",
        -  "reinstall",
        -  "push",
        -  "trigger-app-event",
        -  "open",
        -  "close",
        -  "snapshot",
        -  "diff",
        -  "wait",
        -  "alert",
        -  "settings",
        -  "react-native",
        -  "record",
        -  "trace",
        -  "find",
        -  "click",
        -  "fill",
        -  "longpress",
        -  "hover",
        -  "press",
        -  "type",
        -  "get",
        -  "is",
        -  "back",
        -  "gesture",
        -  "home",
        -  "tv-remote",
        -  "orientation",
        -  "fold",
        -  "scroll",
        -  "swipe",
        -  "focus",
        -  "screenshot",
        -  "app-switcher",
        -  "action-button",
        -  "install-from-source"
        -]New value: +[
        +  "devices",
        +  "capabilities",
        +  "doctor",
        +  "apps",
        +  "boot",
        +  "shutdown",
        +  "appstate",
        +  "perf",
        +  "logs",
        +  "network",
        +  "audio",
        +  "test",
        +  "clipboard",
        +  "keyboard",
        +  "install",
        +  "reinstall",
        +  "uninstall",
        +  "push",
        +  "trigger-app-event",
        +  "open",
        +  "close",
        +  "snapshot",
        +  "diff",
        +  "wait",
        +  "alert",
        +  "settings",
        +  "react-native",
        +  "record",
        +  "trace",
        +  "find",
        +  "click",
        +  "fill",
        +  "longpress",
        +  "hover",
        +  "press",
        +  "type",
        +  "get",
        +  "is",
        +  "back",
        +  "gesture",
        +  "home",
        +  "tv-remote",
        +  "orientation",
        +  "fold",
        +  "telephony",
        +  "scroll",
        +  "swipe",
        +  "focus",
        +  "screenshot",
        +  "app-switcher",
        +  "action-button",
        +  "hardware-button",
        +  "install-from-source"
        +]
    • Changedclick2 fields changed
      • changedInput schema / properties / jitterPx / description
        Previous value: -"Randomization radius in pixels."New value: +"Deterministic per-axis coordinate jitter in pixels (each press offsets x and y by up to this amount)."
      • changedOutput schema / properties / jitterPx / description
        Previous value: -"Randomization radius in pixels."New value: +"Deterministic per-axis coordinate jitter in pixels (each press offsets x and y by up to this amount)."
    • Changedgesture5 fields changed
      • addedInput schema / properties / count
        Added value: +{
        +  "description": "Tap repetitions; the same contacts run this many times.",
        +  "maximum": 200,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / holdMs
        Added value: +{
        +  "description": "Tap contact hold duration.",
        +  "maximum": 10000,
        +  "minimum": 16,
        +  "type": "integer"
        +}
      • changedInput schema / properties / kind / enum
        Previous value: -[
        -  "pan",
        -  "fling",
        -  "swipe",
        -  "pinch",
        -  "rotate",
        -  "transform",
        -  "drag"
        -]New value: +[
        +  "pan",
        +  "fling",
        +  "swipe",
        +  "pinch",
        +  "rotate",
        +  "transform",
        +  "tap",
        +  "drag"
        +]
      • addedInput schema / properties / pauseMs
        Added value: +{
        +  "description": "Delay between tap repetitions, added to each repetition’s own time.",
        +  "maximum": 10000,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / points
        Added value: +{
        +  "description": "Tap contact points, held together for holdMs.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "One contact point.",
        +    "properties": {
        +      "x": {
        +        "type": "number"
        +      },
        +      "y": {
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "x",
        +      "y"
        +    ],
        +    "type": "object"
        +  },
        +  "maxItems": 5,
        +  "minItems": 2,
        +  "type": "array"
        +}
    • Addedhardware-button
    • Changedopen1 field changed
      • changedInput schema / properties / launchConsole / description
        Previous value: -"Launch console mode."New value: +"File path on the daemon host for the stdout and stderr of the initial app launch. iOS simulator direct app launches only; not for URL opens."
    • Changedorientation2 fields changed
      • changedInput schema / properties / orientation / enum
        Previous value: -[
        -  "portrait",
        -  "portrait-upside-down",
        -  "landscape-left",
        -  "landscape-right"
        -]New value: +[
        +  "portrait",
        +  "portrait-upside-down",
        +  "landscape-left",
        +  "landscape-right",
        +  "auto"
        +]
      • changedOutput schema / properties / orientation / enum
        Previous value: -[
        -  "portrait",
        -  "portrait-upside-down",
        -  "landscape-left",
        -  "landscape-right"
        -]New value: +[
        +  "portrait",
        +  "portrait-upside-down",
        +  "landscape-left",
        +  "landscape-right",
        +  "auto"
        +]
    • Changedpress2 fields changed
      • changedInput schema / properties / jitterPx / description
        Previous value: -"Randomization radius in pixels."New value: +"Deterministic per-axis coordinate jitter in pixels (each press offsets x and y by up to this amount)."
      • changedOutput schema / properties / jitterPx / description
        Previous value: -"Randomization radius in pixels."New value: +"Deterministic per-axis coordinate jitter in pixels (each press offsets x and y by up to this amount)."
    • Changedreplay1 field changed
      • changedInput schema / properties / timeoutMs / description
        Previous value: -"Maximum wall-clock duration for the replay request."New value: +"Operation wall-clock budget in milliseconds (default 60000). The client allows another 30000 milliseconds for the daemon result."
    • Changedscroll1 field changed
      • addedInput schema / properties / maxPasses
        Added value: +{
        +  "description": "Maximum scroll gestures for an until search (default 12). Requires until.",
        +  "maximum": 200,
        +  "minimum": 1,
        +  "type": "integer"
        +}
    • Changedsettings2 fields changed
      • changedInput schema / properties / app / description
        Previous value: -"App the change targets, by bundle id, package name, or app name: the app `clear-app-state` clears, or the app a `permission` change (or an iOS-simulator `location on|off` privacy change) lands on. A name resolves to the installed app as `open` resolves it (an iOS simulator matches display names and accepts only an installed bundle id, Android accepts only an installed package and matches other names against installed package names, and a Limrun iOS session resolves only the `settings` alias); an app that resolves to nothing is refused with `app_not_installed` before anything changes. An app named here needs no session and need not be running (Android `deny|reset` of a held permission does kill a running one); without it those changes use the session app, and a change that is device-wide refuses one with `setting_app_not_consumed` (`location set` on any target, the Android `location on|off` toggle, macOS permissions). The CLI consumes it only when this invocation passes it: an `AGENT_DEVICE_TARGET_APP` or config `targetApp` never retargets a settings mutation."New value: +"App the change targets, by bundle id, package name, or app name: the app `clear-app-state` clears, or the app a `permission` change (or an iOS-simulator `location on|off` privacy change) lands on. A name resolves to the installed app as `open` resolves it: an iOS simulator matches display names and accepts only an installed bundle id, Android accepts only an installed package and refuses a name that resolves to an intent with `setting_app_not_package`, and a Limrun iOS session resolves only the `settings` alias. One that resolves to nothing is refused with `app_not_installed` before anything changes. The app need not be running. Without it the session app is used; a device-wide change (`location set` on any target, the Android `location on|off` toggle, `mobile-data`, macOS permissions) refuses one with `setting_app_not_consumed`. The CLI reads it only from this invocation, never from `AGENT_DEVICE_TARGET_APP` or config `targetApp`."
      • addedInput schema / properties / setting / enum
        Added value: +[
        +  "wifi",
        +  "bluetooth",
        +  "airplane",
        +  "mobile-data",
        +  "location",
        +  "animations",
        +  "appearance",
        +  "text-size",
        +  "faceid",
        +  "touchid",
        +  "fingerprint",
        +  "clear-app-state",
        +  "reset-keychain",
        +  "permission"
        +]
    • Addedtelephony
    • Changedtv-remote8 fields changed
      • addedInput schema / properties / button / description
        Added value: +"TV remote button. Android TV also accepts android-keycode:<n> with n from 1 to 2147483647."
      • removedInput schema / properties / button / enum
        Removed value: -[
        -  "up",
        -  "down",
        -  "left",
        -  "right",
        -  "select",
        -  "menu",
        -  "home",
        -  "back"
        -]
      • addedInput schema / properties / button / oneOf
        Added value: +[
        +  {
        +    "enum": [
        +      "up",
        +      "down",
        +      "left",
        +      "right",
        +      "select",
        +      "menu",
        +      "home",
        +      "back",
        +      "volume-up",
        +      "volume-down",
        +      "mute",
        +      "power",
        +      "sleep",
        +      "wake",
        +      "media-play-pause",
        +      "media-next",
        +      "media-previous",
        +      "media-rewind",
        +      "media-fast-forward",
        +      "channel-up",
        +      "channel-down",
        +      "last-channel",
        +      "guide",
        +      "info",
        +      "captions",
        +      "tv-input",
        +      "color-red",
        +      "color-green",
        +      "color-yellow",
        +      "color-blue"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "pattern": "^android-keycode:(?:[1-9][0-9]{0,8}|1[0-9]{9}|20[0-9]{8}|21[0-3][0-9]{7}|214[0-6][0-9]{6}|2147[0-3][0-9]{5}|21474[0-7][0-9]{4}|214748[0-2][0-9]{3}|2147483[0-5][0-9]{2}|21474836[0-3][0-9]|214748364[0-7])(?![\\s\\S])",
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / button / type
        Removed value: -"string"
      • addedOutput schema / properties / button / description
        Added value: +"TV remote button. Android TV also accepts android-keycode:<n> with n from 1 to 2147483647."
      • removedOutput schema / properties / button / enum
        Removed value: -[
        -  "up",
        -  "down",
        -  "left",
        -  "right",
        -  "select",
        -  "menu",
        -  "home",
        -  "back"
        -]
      • addedOutput schema / properties / button / oneOf
        Added value: +[
        +  {
        +    "enum": [
        +      "up",
        +      "down",
        +      "left",
        +      "right",
        +      "select",
        +      "menu",
        +      "home",
        +      "back",
        +      "volume-up",
        +      "volume-down",
        +      "mute",
        +      "power",
        +      "sleep",
        +      "wake",
        +      "media-play-pause",
        +      "media-next",
        +      "media-previous",
        +      "media-rewind",
        +      "media-fast-forward",
        +      "channel-up",
        +      "channel-down",
        +      "last-channel",
        +      "guide",
        +      "info",
        +      "captions",
        +      "tv-input",
        +      "color-red",
        +      "color-green",
        +      "color-yellow",
        +      "color-blue"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "pattern": "^android-keycode:(?:[1-9][0-9]{0,8}|1[0-9]{9}|20[0-9]{8}|21[0-3][0-9]{7}|214[0-6][0-9]{6}|2147[0-3][0-9]{5}|21474[0-7][0-9]{4}|214748[0-2][0-9]{3}|2147483[0-5][0-9]{2}|21474836[0-3][0-9]|214748364[0-7])(?![\\s\\S])",
        +    "type": "string"
        +  }
        +]
      • removedOutput schema / properties / button / type
        Removed value: -"string"
    • Addeduninstall
  2. 7 tool updatesv0.21.28
    • Changedback1 field changed
      • changedInput schema / properties / settleQuietMs / description
        Previous value: -"Settle: quiet window in milliseconds (default 500)."New value: +"Settle: quiet window in milliseconds (default 500; 300 when the settled tree comes from the iOS simulator snapshot bridge). On iOS, a broad screen replacement such as a modal dismissal is confirmed for at least 1500ms whatever window is asked for, within the timeoutMs settle deadline; a replacement from a screen the pre-action capture read as presenting nothing, such as a tab switch, gets no 1500ms confirmation and keeps the asked window."
    • Changedclick1 field changed
      • changedInput schema / properties / settleQuietMs / description
        Previous value: -"Settle: quiet window in milliseconds (default 500)."New value: +"Settle: quiet window in milliseconds (default 500; 300 when the settled tree comes from the iOS simulator snapshot bridge). On iOS, a broad screen replacement such as a modal dismissal is confirmed for at least 1500ms whatever window is asked for, within the timeoutMs settle deadline; a replacement from a screen the pre-action capture read as presenting nothing, such as a tab switch, gets no 1500ms confirmation and keeps the asked window."
    • Changedfill1 field changed
      • changedInput schema / properties / settleQuietMs / description
        Previous value: -"Settle: quiet window in milliseconds (default 500)."New value: +"Settle: quiet window in milliseconds (default 500; 300 when the settled tree comes from the iOS simulator snapshot bridge). On iOS, a broad screen replacement such as a modal dismissal is confirmed for at least 1500ms whatever window is asked for, within the timeoutMs settle deadline; a replacement from a screen the pre-action capture read as presenting nothing, such as a tab switch, gets no 1500ms confirmation and keeps the asked window."
    • Changedhover1 field changed
      • changedInput schema / properties / settleQuietMs / description
        Previous value: -"Settle: quiet window in milliseconds (default 500)."New value: +"Settle: quiet window in milliseconds (default 500; 300 when the settled tree comes from the iOS simulator snapshot bridge). On iOS, a broad screen replacement such as a modal dismissal is confirmed for at least 1500ms whatever window is asked for, within the timeoutMs settle deadline; a replacement from a screen the pre-action capture read as presenting nothing, such as a tab switch, gets no 1500ms confirmation and keeps the asked window."
    • Changedlongpress1 field changed
      • changedInput schema / properties / settleQuietMs / description
        Previous value: -"Settle: quiet window in milliseconds (default 500)."New value: +"Settle: quiet window in milliseconds (default 500; 300 when the settled tree comes from the iOS simulator snapshot bridge). On iOS, a broad screen replacement such as a modal dismissal is confirmed for at least 1500ms whatever window is asked for, within the timeoutMs settle deadline; a replacement from a screen the pre-action capture read as presenting nothing, such as a tab switch, gets no 1500ms confirmation and keeps the asked window."
    • Changedpress1 field changed
      • changedInput schema / properties / settleQuietMs / description
        Previous value: -"Settle: quiet window in milliseconds (default 500)."New value: +"Settle: quiet window in milliseconds (default 500; 300 when the settled tree comes from the iOS simulator snapshot bridge). On iOS, a broad screen replacement such as a modal dismissal is confirmed for at least 1500ms whatever window is asked for, within the timeoutMs settle deadline; a replacement from a screen the pre-action capture read as presenting nothing, such as a tab switch, gets no 1500ms confirmation and keeps the asked window."
    • Changedscroll1 field changed
      • changedInput schema / properties / settleQuietMs / description
        Previous value: -"Settle: quiet window in milliseconds (default 500)."New value: +"Settle: quiet window in milliseconds (default 500; 300 when the settled tree comes from the iOS simulator snapshot bridge). On iOS, a broad screen replacement such as a modal dismissal is confirmed for at least 1500ms whatever window is asked for, within the timeoutMs settle deadline; a replacement from a screen the pre-action capture read as presenting nothing, such as a tab switch, gets no 1500ms confirmation and keeps the asked window."
  3. 9 tool updatesv0.21.27
    • Changedappstate1 field changed
      • changedOutput schema / oneOf
        Previous value: -[
        -  {
        -    "properties": {
        -      "appBundleId": {
        -        "type": "string"
        -      },
        -      "appName": {
        -        "type": "string"
        -      },
        -      "device_udid": {
        -        "description": "iOS only — the session device UDID.",
        -        "type": "string"
        -      },
        -      "ios_simulator_device_set": {
        -        "description": "iOS only — the simulator set path, or null when unknown.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "platform": {
        -        "enum": [
        -          "ios",
        -          "macos"
        -        ],
        -        "type": "string"
        -      },
        -      "source": {
        -        "description": "runner when a live runner read the session app state; session when the record alone answered.",
        -        "enum": [
        -          "session",
        -          "runner"
        -        ],
        -        "type": "string"
        -      },
        -      "state": {
        -        "description": "The session app XCUIApplication state as a live runner reads it; absent with source session.",
        -        "enum": [
        -          "unknown",
        -          "notRunning",
        -          "runningBackgroundSuspended",
        -          "runningBackground",
        -          "runningForeground"
        -        ],
        -        "type": "string"
        -      },
        -      "surface": {
        -        "enum": [
        -          "app",
        -          "frontmost-app",
        -          "desktop",
        -          "menubar"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "platform",
        -      "appName",
        -      "source",
        -      "surface"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "activity": {
        -        "type": "string"
        -      },
        -      "package": {
        -        "type": "string"
        -      },
        -      "platform": {
        -        "const": "android",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "platform",
        -      "package",
        -      "activity"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "properties": {
        +      "appBundleId": {
        +        "type": "string"
        +      },
        +      "appName": {
        +        "type": "string"
        +      },
        +      "device_udid": {
        +        "description": "iOS only — the session device UDID.",
        +        "type": "string"
        +      },
        +      "ios_simulator_device_set": {
        +        "description": "iOS only — the simulator set path, or null when unknown.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "platform": {
        +        "enum": [
        +          "ios",
        +          "macos"
        +        ],
        +        "type": "string"
        +      },
        +      "source": {
        +        "description": "runner when a live runner read the session app state; session when the record alone answered.",
        +        "enum": [
        +          "session",
        +          "runner"
        +        ],
        +        "type": "string"
        +      },
        +      "state": {
        +        "description": "The session app XCUIApplication state as a live runner reads it; absent with source session.",
        +        "enum": [
        +          "unknown",
        +          "notRunning",
        +          "runningBackgroundSuspended",
        +          "runningBackground",
        +          "runningForeground"
        +        ],
        +        "type": "string"
        +      },
        +      "surface": {
        +        "enum": [
        +          "app",
        +          "frontmost-app",
        +          "desktop",
        +          "menubar"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "platform",
        +      "appName",
        +      "source",
        +      "surface"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "activity": {
        +        "type": "string"
        +      },
        +      "package": {
        +        "type": "string"
        +      },
        +      "platform": {
        +        "enum": [
        +          "android",
        +          "harmonyos"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "platform",
        +      "package",
        +      "activity"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedartifacts1 field changed
      • changedInput schema / properties / provider / description
        Previous value: -"Cloud provider name, for example browserstack or aws-device-farm."New value: +"Cloud provider name, for example browserstack, aws-device-farm, or testmu."
    • Changedfill2 fields changed
      • changedOutput schema / description
        Previous value: -"Fill response. Android may return target-bound unconfirmed evidence when the exact app-owned field changed but formatting prevented raw equality."New value: +"Fill response. Target-bound unconfirmed evidence reports an observed value different from the requested text. It does not establish that formatting preserved the input; assert the expected value or resulting screen before continuing."
      • changedOutput schema / oneOf
        Previous value: -[
        -  {
        -    "not": {
        -      "properties": {},
        -      "required": [
        -        "verification"
        -      ],
        -      "type": "object"
        -    },
        -    "properties": {
        -      "cost": {
        -        "properties": {
        -          "nodeCount": {
        -            "description": "Number of nodes in the original node tree when the response carries one.",
        -            "type": "number"
        -          },
        -          "runnerRoundTrips": {
        -            "description": "Number of real runner round-trips made while serving the request.",
        -            "type": "number"
        -          },
        -          "wallClockMs": {
        -            "description": "Total wall-clock time for the request in milliseconds.",
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "wallClockMs",
        -          "runnerRoundTrips"
        -        ],
        -        "type": "object"
        -      },
        -      "delayMs": {
        -        "description": "Delay between typed characters in milliseconds.",
        -        "type": "number"
        -      },
        -      "evidence": {
        -        "properties": {
        -          "changedFromBefore": {
        -            "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure. With surfaceChange present, no digest comparison is made: it reports that surface transition.",
        -            "type": "boolean"
        -          },
        -          "digest": {
        -            "description": "Order-independent digest of the post-action node multiset.",
        -            "type": "string"
        -          },
        -          "foregroundApp": {
        -            "description": "Foreground app bundle id or name, when the capture carries it.",
        -            "type": "string"
        -          },
        -          "interactiveNodeCount": {
        -            "description": "Subset of nodeCount the platform reports as hittable.",
        -            "type": "number"
        -          },
        -          "nodeCount": {
        -            "description": "Node count in the post-action interactive-only capture.",
        -            "type": "number"
        -          },
        -          "surfaceChange": {
        -            "description": "Present when an in-place system surface (web sign-in or Apple Pay sheet) was presented over the app, or left it.",
        -            "properties": {
        -              "disclosure": {
        -                "description": "Agent-facing sentence explaining the surface transition.",
        -                "type": "string"
        -              },
        -              "from": {
        -                "description": "Surface the pre-action baseline described: a host bundle id, or app.",
        -                "type": "string"
        -              },
        -              "to": {
        -                "description": "Surface the post-action capture describes: a host bundle id, or app.",
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "from",
        -              "to",
        -              "disclosure"
        -            ],
        -            "type": "object"
        -          }
        -        },
        -        "required": [
        -          "nodeCount",
        -          "interactiveNodeCount",
        -          "digest",
        -          "changedFromBefore"
        -        ],
        -        "type": "object"
        -      },
        -      "hint": {
        -        "type": "string"
        -      },
        -      "maestroFallbackReason": {
        -        "const": "non-hittable-coordinate",
        -        "type": "string"
        -      },
        -      "maestroNonHittableCoordinateFallbackAllowed": {
        -        "description": "Whether the direct iOS Maestro coordinate fallback was allowed for this selector.",
        -        "type": "boolean"
        -      },
        -      "maestroNonHittableCoordinateFallbackUsed": {
        -        "description": "Whether the direct iOS Maestro coordinate fallback was actually used.",
        -        "type": "boolean"
        -      },
        -      "message": {
        -        "type": "string"
        -      },
        -      "ref": {
        -        "description": "Snapshot ref without the @ prefix when the target was an @ref.",
        -        "type": "string"
        -      },
        -      "refLabel": {
        -        "type": "string"
        -      },
        -      "referenceHeight": {
        -        "description": "Reference frame height for visualizing the interaction point.",
        -        "type": "number"
        -      },
        -      "referenceWidth": {
        -        "description": "Reference frame width for visualizing the interaction point.",
        -        "type": "number"
        -      },
        -      "resolution": {
        -        "description": "Pre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path.",
        -        "oneOf": [
        -          {
        -            "properties": {
        -              "kind": {
        -                "const": "unique",
        -                "type": "string"
        -              },
        -              "phase": {
        -                "const": "pre-action",
        -                "type": "string"
        -              },
        -              "source": {
        -                "const": "runtime",
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "source",
        -              "phase",
        -              "kind"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "properties": {
        -              "alternatives": {
        -                "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.",
        -                "items": {
        -                  "properties": {
        -                    "diagnosticRef": {
        -                      "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        -                      "type": "string"
        -                    },
        -                    "label": {
        -                      "description": "UTF-8 truncated to 256 bytes.",
        -                      "type": "string"
        -                    },
        -                    "role": {
        -                      "description": "UTF-8 truncated to 256 bytes.",
        -                      "type": "string"
        -                    }
        -                  },
        -                  "required": [
        -                    "diagnosticRef"
        -                  ],
        -                  "type": "object"
        -                },
        -                "type": "array"
        -              },
        -              "kind": {
        -                "const": "disambiguated",
        -                "type": "string"
        -              },
        -              "matchCount": {
        -                "description": "Total matches resolveSelectorChain found before disambiguation.",
        -                "type": "number"
        -              },
        -              "phase": {
        -                "const": "pre-action",
        -                "type": "string"
        -              },
        -              "source": {
        -                "const": "runtime",
        -                "type": "string"
        -              },
        -              "tiebreak": {
        -                "description": "The comparison that decided the winner.",
        -                "enum": [
        -                  "visible",
        -                  "deepest",
        -                  "smallest-area",
        -                  "structural-equivalence"
        -                ],
        -                "type": "string"
        -              },
        -              "winnerDiagnostic": {
        -                "properties": {
        -                  "diagnosticRef": {
        -                    "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        -                    "type": "string"
        -                  },
        -                  "label": {
        -                    "description": "UTF-8 truncated to 256 bytes.",
        -                    "type": "string"
        -                  },
        -                  "role": {
        -                    "description": "UTF-8 truncated to 256 bytes.",
        -                    "type": "string"
        -                  }
        -                },
        -                "required": [
        -                  "diagnosticRef"
        -                ],
        -                "type": "object"
        -              }
        -            },
        -            "required": [
        -              "source",
        -              "phase",
        -              "kind",
        -              "matchCount",
        -              "winnerDiagnostic",
        -              "tiebreak"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "properties": {
        -              "kind": {
        -                "const": "exact",
        -                "type": "string"
        -              },
        -              "phase": {
        -                "const": "pre-action",
        -                "type": "string"
        -              },
        -              "source": {
        -                "const": "ref",
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "source",
        -              "phase",
        -              "kind"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "properties": {
        -              "kind": {
        -                "const": "label-fallback",
        -                "type": "string"
        -              },
        -              "phase": {
        -                "const": "pre-action",
        -                "type": "string"
        -              },
        -              "source": {
        -                "const": "ref",
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "source",
        -              "phase",
        -              "kind"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "properties": {
        -              "kind": {
        -                "const": "not-observed",
        -                "type": "string"
        -              },
        -              "source": {
        -                "const": "direct-ios",
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "source",
        -              "kind"
        -            ],
        -            "type": "object"
        -          }
        -        ],
        -        "type": "object"
        -      },
        -      "selector": {
        -        "description": "Selector expression when the target was a selector.",
        -        "type": "string"
        -      },
        -      "selectorChain": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "settle": {
        -        "properties": {
        -          "captures": {
        -            "type": "number"
        -          },
        -          "diff": {
        -            "description": "Settled diff vs the pre-action tree (changed lines only).",
        -            "properties": {
        -              "lines": {
        -                "items": {
        -                  "properties": {
        -                    "kind": {
        -                      "enum": [
        -                        "added",
        -                        "removed"
        -                      ],
        -                      "type": "string"
        -                    },
        -                    "ref": {
        -                      "description": "Plain ref body (e12) for added lines.",
        -                      "type": "string"
        -                    },
        -                    "text": {
        -                      "type": "string"
        -                    }
        -                  },
        -                  "required": [
        -                    "kind",
        -                    "text"
        -                  ],
        -                  "type": "object"
        -                },
        -                "type": "array"
        -              },
        -              "summary": {
        -                "properties": {
        -                  "additions": {
        -                    "type": "number"
        -                  },
        -                  "removals": {
        -                    "type": "number"
        -                  },
        -                  "unchanged": {
        -                    "type": "number"
        -                  }
        -                },
        -                "required": [
        -                  "additions",
        -                  "removals",
        -                  "unchanged"
        -                ],
        -                "type": "object"
        -              },
        -              "truncated": {
        -                "description": "Lines were capped to the response bound.",
        -                "type": "boolean"
        -              }
        -            },
        -            "required": [
        -              "summary",
        -              "lines"
        -            ],
        -            "type": "object"
        -          },
        -          "hint": {
        -            "type": "string"
        -          },
        -          "quietMs": {
        -            "type": "number"
        -          },
        -          "refs": {
        -            "items": {
        -              "properties": {
        -                "ref": {
        -                  "description": "Plain ref body (e12) minted from the stored settled tree.",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "ref"
        -              ],
        -              "type": "object"
        -            },
        -            "type": "array"
        -          },
        -          "refsGeneration": {
        -            "description": "Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.",
        -            "type": "number"
        -          },
        -          "settled": {
        -            "description": "Whether the UI held the quiet window before the deadline. false is advisory, not failure.",
        -            "type": "boolean"
        -          },
        -          "surfaceChange": {
        -            "description": "Present when an in-place system surface (web sign-in or Apple Pay sheet) was presented over the app, or left it.",
        -            "properties": {
        -              "disclosure": {
        -                "description": "Agent-facing sentence explaining the surface transition.",
        -                "type": "string"
        -              },
        -              "from": {
        -                "description": "Surface the pre-action baseline described: a host bundle id, or app.",
        -                "type": "string"
        -              },
        -              "to": {
        -                "description": "Surface the post-action capture describes: a host bundle id, or app.",
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "from",
        -              "to",
        -              "disclosure"
        -            ],
        -            "type": "object"
        -          },
        -          "tail": {
        -            "description": "Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).",
        -            "items": {
        -              "properties": {
        -                "label": {
        -                  "type": "string"
        -                },
        -                "ref": {
        -                  "description": "Plain ref body (e12) minted from the stored settled tree.",
        -                  "type": "string"
        -                },
        -                "role": {
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "ref",
        -                "role"
        -              ],
        -              "type": "object"
        -            },
        -            "type": "array"
        -          },
        -          "tailTruncated": {
        -            "description": "Present (true) when tail candidates exceeded the response cap.",
        -            "type": "boolean"
        -          },
        -          "timeoutMs": {
        -            "type": "number"
        -          },
        -          "waitedMs": {
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "settled",
        -          "waitedMs",
        -          "captures",
        -          "quietMs",
        -          "timeoutMs"
        -        ],
        -        "type": "object"
        -      },
        -      "targetHittable": {
        -        "type": "boolean"
        -      },
        -      "targetKind": {
        -        "description": "Resolved interaction target kind.",
        -        "enum": [
        -          "point",
        -          "ref",
        -          "selector"
        -        ],
        -        "type": "string"
        -      },
        -      "text": {
        -        "description": "Text submitted to the field.",
        -        "type": "string"
        -      },
        -      "warning": {
        -        "type": "string"
        -      },
        -      "x": {
        -        "description": "Resolved interaction x coordinate when available.",
        -        "type": "number"
        -      },
        -      "y": {
        -        "description": "Resolved interaction y coordinate when available.",
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "targetKind",
        -      "text"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "after": {
        -        "description": "Raw target text captured after the fill.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "before": {
        -        "description": "Raw target text captured before the fill.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "cost": {
        -        "properties": {
        -          "nodeCount": {
        -            "description": "Number of nodes in the original node tree when the response carries one.",
        -            "type": "number"
        -          },
        -          "runnerRoundTrips": {
        -            "description": "Number of real runner round-trips made while serving the request.",
        -            "type": "number"
        -          },
        -          "wallClockMs": {
        -            "description": "Total wall-clock time for the request in milliseconds.",
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "wallClockMs",
        -          "runnerRoundTrips"
        -        ],
        -        "type": "object"
        -      },
        -      "delayMs": {
        -        "description": "Delay between typed characters in milliseconds.",
        -        "type": "number"
        -      },
        -      "evidence": {
        -        "properties": {
        -          "changedFromBefore": {
        -            "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure. With surfaceChange present, no digest comparison is made: it reports that surface transition.",
        -            "type": "boolean"
        -          },
        -          "digest": {
        -            "description": "Order-independent digest of the post-action node multiset.",
        -            "type": "string"
        -          },
        -          "foregroundApp": {
        -            "description": "Foreground app bundle id or name, when the capture carries it.",
        -            "type": "string"
        -          },
        -          "interactiveNodeCount": {
        -            "description": "Subset of nodeCount the platform reports as hittable.",
        -            "type": "number"
        -          },
        -          "nodeCount": {
        -            "description": "Node count in the post-action interactive-only capture.",
        -            "type": "number"
        -          },
        -          "surfaceChange": {
        -            "description": "Present when an in-place system surface (web sign-in or Apple Pay sheet) was presented over the app, or left it.",
        -            "properties": {
        -              "disclosure": {
        -                "description": "Agent-facing sentence explaining the surface transition.",
        -                "type": "string"
        -              },
        -              "from": {
        -                "description": "Surface the pre-action baseline described: a host bundle id, or app.",
        -                "type": "string"
        -              },
        -              "to": {
        -                "description": "Surface the post-action capture describes: a host bundle id, or app.",
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "from",
        -              "to",
        -              "disclosure"
        -            ],
        -            "type": "object"
        -          }
        -        },
        -        "required": [
        -          "nodeCount",
        -          "interactiveNodeCount",
        -          "digest",
        -          "changedFromBefore"
        -        ],
        -        "type": "object"
        -      },
        -      "hint": {
        -        "type": "string"
        -      },
        -      "maestroFallbackReason": {
        -        "const": "non-hittable-coordinate",
        -        "type": "string"
        -      },
        -      "maestroNonHittableCoordinateFallbackAllowed": {
        -        "description": "Whether the direct iOS Maestro coordinate fallback was allowed for this selector.",
        -        "type": "boolean"
        -      },
        -      "maestroNonHittableCoordinateFallbackUsed": {
        -        "description": "Whether the direct iOS Maestro coordinate fallback was actually used.",
        -        "type": "boolean"
        -      },
        -      "message": {
        -        "type": "string"
        -      },
        -      "ref": {
        -        "description": "Snapshot ref without the @ prefix when the target was an @ref.",
        -        "type": "string"
        -      },
        -      "refLabel": {
        -        "type": "string"
        -      },
        -      "referenceHeight": {
        -        "description": "Reference frame height for visualizing the interaction point.",
        -        "type": "number"
        -      },
        -      "referenceWidth": {
        -        "description": "Reference frame width for visualizing the interaction point.",
        -        "type": "number"
        -      },
        -      "requested": {
        -        "description": "Literal text requested by the fill command.",
        -        "type": "string"
        -      },
        -      "resolution": {
        -        "description": "Pre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path.",
        -        "oneOf": [
        -          {
        -            "properties": {
        -              "kind": {
        -                "const": "unique",
        -                "type": "string"
        -              },
        -              "phase": {
        -                "const": "pre-action",
        -                "type": "string"
        -              },
        -              "source": {
        -                "const": "runtime",
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "source",
        -              "phase",
        -              "kind"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "properties": {
        -              "alternatives": {
        -                "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.",
        -                "items": {
        -                  "properties": {
        -                    "diagnosticRef": {
        -                      "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        -                      "type": "string"
        -                    },
        -                    "label": {
        -                      "description": "UTF-8 truncated to 256 bytes.",
        -                      "type": "string"
        -                    },
        -                    "role": {
        -                      "description": "UTF-8 truncated to 256 bytes.",
        -                      "type": "string"
        -                    }
        -                  },
        -                  "required": [
        -                    "diagnosticRef"
        -                  ],
        -                  "type": "object"
        -                },
        -                "type": "array"
        -              },
        -              "kind": {
        -                "const": "disambiguated",
        -                "type": "string"
        -              },
        -              "matchCount": {
        -                "description": "Total matches resolveSelectorChain found before disambiguation.",
        -                "type": "number"
        -              },
        -              "phase": {
        -                "const": "pre-action",
        -                "type": "string"
        -              },
        -              "source": {
        -                "const": "runtime",
        -                "type": "string"
        -              },
        -              "tiebreak": {
        -                "description": "The comparison that decided the winner.",
        -                "enum": [
        -                  "visible",
        -                  "deepest",
        -                  "smallest-area",
        -                  "structural-equivalence"
        -                ],
        -                "type": "string"
        -              },
        -              "winnerDiagnostic": {
        -                "properties": {
        -                  "diagnosticRef": {
        -                    "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        -                    "type": "string"
        -                  },
        -                  "label": {
        -                    "description": "UTF-8 truncated to 256 bytes.",
        -                    "type": "string"
        -                  },
        -                  "role": {
        -                    "description": "UTF-8 truncated to 256 bytes.",
        -                    "type": "string"
        -                  }
        -                },
        -                "required": [
        -                  "diagnosticRef"
        -                ],
        -                "type": "object"
        -              }
        -            },
        -            "required": [
        -              "source",
        -              "phase",
        -              "kind",
        -              "matchCount",
        -              "winnerDiagnostic",
        -              "tiebreak"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "properties": {
        -              "kind": {
        -                "const": "exact",
        -                "type": "string"
        -              },
        -              "phase": {
        -                "const": "pre-action",
        -                "type": "string"
        -              },
        -              "source": {
        -                "const": "ref",
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "source",
        -              "phase",
        -              "kind"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "properties": {
        -              "kind": {
        -                "const": "label-fallback",
        -                "type": "string"
        -              },
        -              "phase": {
        -                "const": "pre-action",
        -                "type": "string"
        -              },
        -              "source": {
        -                "const": "ref",
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "source",
        -              "phase",
        -              "kind"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "properties": {
        -              "kind": {
        -                "const": "not-observed",
        -                "type": "string"
        -              },
        -              "source": {
        -                "const": "direct-ios",
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "source",
        -              "kind"
        -            ],
        -            "type": "object"
        -          }
        -        ],
        -        "type": "object"
        -      },
        -      "selector": {
        -        "description": "Selector expression when the target was a selector.",
        -        "type": "string"
        -      },
        -      "selectorChain": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "settle": {
        -        "properties": {
        -          "captures": {
        -            "type": "number"
        -          },
        -          "diff": {
        -            "description": "Settled diff vs the pre-action tree (changed lines only).",
        -            "properties": {
        -              "lines": {
        -                "items": {
        -                  "properties": {
        -                    "kind": {
        -                      "enum": [
        -                        "added",
        -                        "removed"
        -                      ],
        -                      "type": "string"
        -                    },
        -                    "ref": {
        -                      "description": "Plain ref body (e12) for added lines.",
        -                      "type": "string"
        -                    },
        -                    "text": {
        -                      "type": "string"
        -                    }
        -                  },
        -                  "required": [
        -                    "kind",
        -                    "text"
        -                  ],
        -                  "type": "object"
        -                },
        -                "type": "array"
        -              },
        -              "summary": {
        -                "properties": {
        -                  "additions": {
        -                    "type": "number"
        -                  },
        -                  "removals": {
        -                    "type": "number"
        -                  },
        -                  "unchanged": {
        -                    "type": "number"
        -                  }
        -                },
        -                "required": [
        -                  "additions",
        -                  "removals",
        -                  "unchanged"
        -                ],
        -                "type": "object"
        -              },
        -              "truncated": {
        -                "description": "Lines were capped to the response bound.",
        -                "type": "boolean"
        -              }
        -            },
        -            "required": [
        -              "summary",
        -              "lines"
        -            ],
        -            "type": "object"
        -          },
        -          "hint": {
        -            "type": "string"
        -          },
        -          "quietMs": {
        -            "type": "number"
        -          },
        -          "refs": {
        -            "items": {
        -              "properties": {
        -                "ref": {
        -                  "description": "Plain ref body (e12) minted from the stored settled tree.",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "ref"
        -              ],
        -              "type": "object"
        -            },
        -            "type": "array"
        -          },
        -          "refsGeneration": {
        -            "description": "Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.",
        -            "type": "number"
        -          },
        -          "settled": {
        -            "description": "Whether the UI held the quiet window before the deadline. false is advisory, not failure.",
        -            "type": "boolean"
        -          },
        -          "surfaceChange": {
        -            "description": "Present when an in-place system surface (web sign-in or Apple Pay sheet) was presented over the app, or left it.",
        -            "properties": {
        -              "disclosure": {
        -                "description": "Agent-facing sentence explaining the surface transition.",
        -                "type": "string"
        -              },
        -              "from": {
        -                "description": "Surface the pre-action baseline described: a host bundle id, or app.",
        -                "type": "string"
        -              },
        -              "to": {
        -                "description": "Surface the post-action capture describes: a host bundle id, or app.",
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "from",
        -              "to",
        -              "disclosure"
        -            ],
        -            "type": "object"
        -          },
        -          "tail": {
        -            "description": "Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).",
        -            "items": {
        -              "properties": {
        -                "label": {
        -                  "type": "string"
        -                },
        -                "ref": {
        -                  "description": "Plain ref body (e12) minted from the stored settled tree.",
        -                  "type": "string"
        -                },
        -                "role": {
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "ref",
        -                "role"
        -              ],
        -              "type": "object"
        -            },
        -            "type": "array"
        -          },
        -          "tailTruncated": {
        -            "description": "Present (true) when tail candidates exceeded the response cap.",
        -            "type": "boolean"
        -          },
        -          "timeoutMs": {
        -            "type": "number"
        -          },
        -          "waitedMs": {
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "settled",
        -          "waitedMs",
        -          "captures",
        -          "quietMs",
        -          "timeoutMs"
        -        ],
        -        "type": "object"
        -      },
        -      "target": {
        -        "description": "Target identity captured before fill and matched after fill.",
        -        "properties": {
        -          "className": {
        -            "description": "Android class name of the exact field that changed.",
        -            "type": [
        -              "string",
        -              "null"
        -            ]
        -          },
        -          "packageName": {
        -            "description": "Android package name that owns the exact field.",
        -            "type": [
        -              "string",
        -              "null"
        -            ]
        -          },
        -          "rect": {
        -            "description": "Screen-space rectangle of the exact field that changed.",
        -            "properties": {
        -              "height": {
        -                "type": "number"
        -              },
        -              "width": {
        -                "type": "number"
        -              },
        -              "x": {
        -                "type": "number"
        -              },
        -              "y": {
        -                "type": "number"
        -              }
        -            },
        -            "required": [
        -              "x",
        -              "y",
        -              "width",
        -              "height"
        -            ],
        -            "type": "object"
        -          },
        -          "resourceId": {
        -            "description": "Android resource id of the exact field that changed.",
        -            "type": [
        -              "string",
        -              "null"
        -            ]
        -          }
        -        },
        -        "required": [
        -          "resourceId",
        -          "className",
        -          "packageName",
        -          "rect"
        -        ],
        -        "type": "object"
        -      },
        -      "targetHittable": {
        -        "type": "boolean"
        -      },
        -      "targetKind": {
        -        "description": "Resolved interaction target kind.",
        -        "enum": [
        -          "point",
        -          "ref",
        -          "selector"
        -        ],
        -        "type": "string"
        -      },
        -      "text": {
        -        "description": "Text submitted to the field.",
        -        "type": "string"
        -      },
        -      "verification": {
        -        "const": "unconfirmed",
        -        "type": "string"
        -      },
        -      "warning": {
        -        "type": "string"
        -      },
        -      "x": {
        -        "description": "Resolved interaction x coordinate when available.",
        -        "type": "number"
        -      },
        -      "y": {
        -        "description": "Resolved interaction y coordinate when available.",
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "targetKind",
        -      "text",
        -      "verification",
        -      "requested",
        -      "before",
        -      "after",
        -      "target"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "properties": {},
        +      "required": [
        +        "verification"
        +      ],
        +      "type": "object"
        +    },
        +    "properties": {
        +      "cost": {
        +        "properties": {
        +          "nodeCount": {
        +            "description": "Number of nodes in the original node tree when the response carries one.",
        +            "type": "number"
        +          },
        +          "runnerRoundTrips": {
        +            "description": "Number of real runner round-trips made while serving the request.",
        +            "type": "number"
        +          },
        +          "wallClockMs": {
        +            "description": "Total wall-clock time for the request in milliseconds.",
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "wallClockMs",
        +          "runnerRoundTrips"
        +        ],
        +        "type": "object"
        +      },
        +      "delayMs": {
        +        "description": "Delay between typed characters in milliseconds.",
        +        "type": "number"
        +      },
        +      "evidence": {
        +        "properties": {
        +          "changedFromBefore": {
        +            "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure. With surfaceChange present, no digest comparison is made: it reports that surface transition.",
        +            "type": "boolean"
        +          },
        +          "digest": {
        +            "description": "Order-independent digest of the post-action node multiset.",
        +            "type": "string"
        +          },
        +          "foregroundApp": {
        +            "description": "Foreground app bundle id or name, when the capture carries it.",
        +            "type": "string"
        +          },
        +          "interactiveNodeCount": {
        +            "description": "Subset of nodeCount the platform reports as hittable.",
        +            "type": "number"
        +          },
        +          "nodeCount": {
        +            "description": "Node count in the post-action interactive-only capture.",
        +            "type": "number"
        +          },
        +          "surfaceChange": {
        +            "description": "Present when an in-place system surface (web sign-in or Apple Pay sheet) was presented over the app, or left it.",
        +            "properties": {
        +              "disclosure": {
        +                "description": "Agent-facing sentence explaining the surface transition.",
        +                "type": "string"
        +              },
        +              "from": {
        +                "description": "Surface the pre-action baseline described: a host bundle id, or app.",
        +                "type": "string"
        +              },
        +              "to": {
        +                "description": "Surface the post-action capture describes: a host bundle id, or app.",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "from",
        +              "to",
        +              "disclosure"
        +            ],
        +            "type": "object"
        +          }
        +        },
        +        "required": [
        +          "nodeCount",
        +          "interactiveNodeCount",
        +          "digest",
        +          "changedFromBefore"
        +        ],
        +        "type": "object"
        +      },
        +      "hint": {
        +        "type": "string"
        +      },
        +      "maestroFallbackReason": {
        +        "const": "non-hittable-coordinate",
        +        "type": "string"
        +      },
        +      "maestroNonHittableCoordinateFallbackAllowed": {
        +        "description": "Whether the direct iOS Maestro coordinate fallback was allowed for this selector.",
        +        "type": "boolean"
        +      },
        +      "maestroNonHittableCoordinateFallbackUsed": {
        +        "description": "Whether the direct iOS Maestro coordinate fallback was actually used.",
        +        "type": "boolean"
        +      },
        +      "message": {
        +        "type": "string"
        +      },
        +      "ref": {
        +        "description": "Snapshot ref without the @ prefix when the target was an @ref.",
        +        "type": "string"
        +      },
        +      "refLabel": {
        +        "type": "string"
        +      },
        +      "referenceHeight": {
        +        "description": "Reference frame height for visualizing the interaction point.",
        +        "type": "number"
        +      },
        +      "referenceWidth": {
        +        "description": "Reference frame width for visualizing the interaction point.",
        +        "type": "number"
        +      },
        +      "resolution": {
        +        "description": "Pre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path.",
        +        "oneOf": [
        +          {
        +            "properties": {
        +              "kind": {
        +                "const": "unique",
        +                "type": "string"
        +              },
        +              "phase": {
        +                "const": "pre-action",
        +                "type": "string"
        +              },
        +              "source": {
        +                "const": "runtime",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "source",
        +              "phase",
        +              "kind"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "alternatives": {
        +                "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.",
        +                "items": {
        +                  "properties": {
        +                    "diagnosticRef": {
        +                      "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        +                      "type": "string"
        +                    },
        +                    "label": {
        +                      "description": "UTF-8 truncated to 256 bytes.",
        +                      "type": "string"
        +                    },
        +                    "role": {
        +                      "description": "UTF-8 truncated to 256 bytes.",
        +                      "type": "string"
        +                    }
        +                  },
        +                  "required": [
        +                    "diagnosticRef"
        +                  ],
        +                  "type": "object"
        +                },
        +                "type": "array"
        +              },
        +              "kind": {
        +                "const": "disambiguated",
        +                "type": "string"
        +              },
        +              "matchCount": {
        +                "description": "Total matches resolveSelectorChain found before disambiguation.",
        +                "type": "number"
        +              },
        +              "phase": {
        +                "const": "pre-action",
        +                "type": "string"
        +              },
        +              "source": {
        +                "const": "runtime",
        +                "type": "string"
        +              },
        +              "tiebreak": {
        +                "description": "The comparison that decided the winner.",
        +                "enum": [
        +                  "visible",
        +                  "deepest",
        +                  "smallest-area",
        +                  "structural-equivalence"
        +                ],
        +                "type": "string"
        +              },
        +              "winnerDiagnostic": {
        +                "properties": {
        +                  "diagnosticRef": {
        +                    "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        +                    "type": "string"
        +                  },
        +                  "label": {
        +                    "description": "UTF-8 truncated to 256 bytes.",
        +                    "type": "string"
        +                  },
        +                  "role": {
        +                    "description": "UTF-8 truncated to 256 bytes.",
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "diagnosticRef"
        +                ],
        +                "type": "object"
        +              }
        +            },
        +            "required": [
        +              "source",
        +              "phase",
        +              "kind",
        +              "matchCount",
        +              "winnerDiagnostic",
        +              "tiebreak"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "kind": {
        +                "const": "exact",
        +                "type": "string"
        +              },
        +              "phase": {
        +                "const": "pre-action",
        +                "type": "string"
        +              },
        +              "source": {
        +                "const": "ref",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "source",
        +              "phase",
        +              "kind"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "kind": {
        +                "const": "label-fallback",
        +                "type": "string"
        +              },
        +              "phase": {
        +                "const": "pre-action",
        +                "type": "string"
        +              },
        +              "source": {
        +                "const": "ref",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "source",
        +              "phase",
        +              "kind"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "kind": {
        +                "const": "not-observed",
        +                "type": "string"
        +              },
        +              "source": {
        +                "const": "direct-ios",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "source",
        +              "kind"
        +            ],
        +            "type": "object"
        +          }
        +        ],
        +        "type": "object"
        +      },
        +      "selector": {
        +        "description": "Selector expression when the target was a selector.",
        +        "type": "string"
        +      },
        +      "selectorChain": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "settle": {
        +        "properties": {
        +          "captures": {
        +            "type": "number"
        +          },
        +          "diff": {
        +            "description": "Settled diff vs the pre-action tree (changed lines only).",
        +            "properties": {
        +              "lines": {
        +                "items": {
        +                  "properties": {
        +                    "kind": {
        +                      "enum": [
        +                        "added",
        +                        "removed"
        +                      ],
        +                      "type": "string"
        +                    },
        +                    "ref": {
        +                      "description": "Plain ref body (e12) for added lines.",
        +                      "type": "string"
        +                    },
        +                    "text": {
        +                      "type": "string"
        +                    }
        +                  },
        +                  "required": [
        +                    "kind",
        +                    "text"
        +                  ],
        +                  "type": "object"
        +                },
        +                "type": "array"
        +              },
        +              "summary": {
        +                "properties": {
        +                  "additions": {
        +                    "type": "number"
        +                  },
        +                  "removals": {
        +                    "type": "number"
        +                  },
        +                  "unchanged": {
        +                    "type": "number"
        +                  }
        +                },
        +                "required": [
        +                  "additions",
        +                  "removals",
        +                  "unchanged"
        +                ],
        +                "type": "object"
        +              },
        +              "truncated": {
        +                "description": "Lines were capped to the response bound.",
        +                "type": "boolean"
        +              }
        +            },
        +            "required": [
        +              "summary",
        +              "lines"
        +            ],
        +            "type": "object"
        +          },
        +          "hint": {
        +            "type": "string"
        +          },
        +          "quietMs": {
        +            "type": "number"
        +          },
        +          "refs": {
        +            "items": {
        +              "properties": {
        +                "ref": {
        +                  "description": "Plain ref body (e12) minted from the stored settled tree.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "ref"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "refsGeneration": {
        +            "description": "Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.",
        +            "type": "number"
        +          },
        +          "settled": {
        +            "description": "Whether the UI held the quiet window before the deadline. false is advisory, not failure.",
        +            "type": "boolean"
        +          },
        +          "surfaceChange": {
        +            "description": "Present when an in-place system surface (web sign-in or Apple Pay sheet) was presented over the app, or left it.",
        +            "properties": {
        +              "disclosure": {
        +                "description": "Agent-facing sentence explaining the surface transition.",
        +                "type": "string"
        +              },
        +              "from": {
        +                "description": "Surface the pre-action baseline described: a host bundle id, or app.",
        +                "type": "string"
        +              },
        +              "to": {
        +                "description": "Surface the post-action capture describes: a host bundle id, or app.",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "from",
        +              "to",
        +              "disclosure"
        +            ],
        +            "type": "object"
        +          },
        +          "tail": {
        +            "description": "Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).",
        +            "items": {
        +              "properties": {
        +                "label": {
        +                  "type": "string"
        +                },
        +                "ref": {
        +                  "description": "Plain ref body (e12) minted from the stored settled tree.",
        +                  "type": "string"
        +                },
        +                "role": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "ref",
        +                "role"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "tailTruncated": {
        +            "description": "Present (true) when tail candidates exceeded the response cap.",
        +            "type": "boolean"
        +          },
        +          "timeoutMs": {
        +            "type": "number"
        +          },
        +          "waitedMs": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "settled",
        +          "waitedMs",
        +          "captures",
        +          "quietMs",
        +          "timeoutMs"
        +        ],
        +        "type": "object"
        +      },
        +      "targetHittable": {
        +        "type": "boolean"
        +      },
        +      "targetKind": {
        +        "description": "Resolved interaction target kind.",
        +        "enum": [
        +          "point",
        +          "ref",
        +          "selector"
        +        ],
        +        "type": "string"
        +      },
        +      "text": {
        +        "description": "Text submitted to the field.",
        +        "type": "string"
        +      },
        +      "warning": {
        +        "type": "string"
        +      },
        +      "x": {
        +        "description": "Resolved interaction x coordinate when available.",
        +        "type": "number"
        +      },
        +      "y": {
        +        "description": "Resolved interaction y coordinate when available.",
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "targetKind",
        +      "text"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "after": {
        +        "description": "Raw target text captured after the fill.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "before": {
        +        "description": "Raw target text captured before the fill.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "cost": {
        +        "properties": {
        +          "nodeCount": {
        +            "description": "Number of nodes in the original node tree when the response carries one.",
        +            "type": "number"
        +          },
        +          "runnerRoundTrips": {
        +            "description": "Number of real runner round-trips made while serving the request.",
        +            "type": "number"
        +          },
        +          "wallClockMs": {
        +            "description": "Total wall-clock time for the request in milliseconds.",
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "wallClockMs",
        +          "runnerRoundTrips"
        +        ],
        +        "type": "object"
        +      },
        +      "delayMs": {
        +        "description": "Delay between typed characters in milliseconds.",
        +        "type": "number"
        +      },
        +      "evidence": {
        +        "properties": {
        +          "changedFromBefore": {
        +            "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure. With surfaceChange present, no digest comparison is made: it reports that surface transition.",
        +            "type": "boolean"
        +          },
        +          "digest": {
        +            "description": "Order-independent digest of the post-action node multiset.",
        +            "type": "string"
        +          },
        +          "foregroundApp": {
        +            "description": "Foreground app bundle id or name, when the capture carries it.",
        +            "type": "string"
        +          },
        +          "interactiveNodeCount": {
        +            "description": "Subset of nodeCount the platform reports as hittable.",
        +            "type": "number"
        +          },
        +          "nodeCount": {
        +            "description": "Node count in the post-action interactive-only capture.",
        +            "type": "number"
        +          },
        +          "surfaceChange": {
        +            "description": "Present when an in-place system surface (web sign-in or Apple Pay sheet) was presented over the app, or left it.",
        +            "properties": {
        +              "disclosure": {
        +                "description": "Agent-facing sentence explaining the surface transition.",
        +                "type": "string"
        +              },
        +              "from": {
        +                "description": "Surface the pre-action baseline described: a host bundle id, or app.",
        +                "type": "string"
        +              },
        +              "to": {
        +                "description": "Surface the post-action capture describes: a host bundle id, or app.",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "from",
        +              "to",
        +              "disclosure"
        +            ],
        +            "type": "object"
        +          }
        +        },
        +        "required": [
        +          "nodeCount",
        +          "interactiveNodeCount",
        +          "digest",
        +          "changedFromBefore"
        +        ],
        +        "type": "object"
        +      },
        +      "hint": {
        +        "type": "string"
        +      },
        +      "maestroFallbackReason": {
        +        "const": "non-hittable-coordinate",
        +        "type": "string"
        +      },
        +      "maestroNonHittableCoordinateFallbackAllowed": {
        +        "description": "Whether the direct iOS Maestro coordinate fallback was allowed for this selector.",
        +        "type": "boolean"
        +      },
        +      "maestroNonHittableCoordinateFallbackUsed": {
        +        "description": "Whether the direct iOS Maestro coordinate fallback was actually used.",
        +        "type": "boolean"
        +      },
        +      "message": {
        +        "type": "string"
        +      },
        +      "ref": {
        +        "description": "Snapshot ref without the @ prefix when the target was an @ref.",
        +        "type": "string"
        +      },
        +      "refLabel": {
        +        "type": "string"
        +      },
        +      "referenceHeight": {
        +        "description": "Reference frame height for visualizing the interaction point.",
        +        "type": "number"
        +      },
        +      "referenceWidth": {
        +        "description": "Reference frame width for visualizing the interaction point.",
        +        "type": "number"
        +      },
        +      "requested": {
        +        "description": "Literal text requested by the fill command.",
        +        "type": "string"
        +      },
        +      "resolution": {
        +        "description": "Pre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path.",
        +        "oneOf": [
        +          {
        +            "properties": {
        +              "kind": {
        +                "const": "unique",
        +                "type": "string"
        +              },
        +              "phase": {
        +                "const": "pre-action",
        +                "type": "string"
        +              },
        +              "source": {
        +                "const": "runtime",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "source",
        +              "phase",
        +              "kind"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "alternatives": {
        +                "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.",
        +                "items": {
        +                  "properties": {
        +                    "diagnosticRef": {
        +                      "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        +                      "type": "string"
        +                    },
        +                    "label": {
        +                      "description": "UTF-8 truncated to 256 bytes.",
        +                      "type": "string"
        +                    },
        +                    "role": {
        +                      "description": "UTF-8 truncated to 256 bytes.",
        +                      "type": "string"
        +                    }
        +                  },
        +                  "required": [
        +                    "diagnosticRef"
        +                  ],
        +                  "type": "object"
        +                },
        +                "type": "array"
        +              },
        +              "kind": {
        +                "const": "disambiguated",
        +                "type": "string"
        +              },
        +              "matchCount": {
        +                "description": "Total matches resolveSelectorChain found before disambiguation.",
        +                "type": "number"
        +              },
        +              "phase": {
        +                "const": "pre-action",
        +                "type": "string"
        +              },
        +              "source": {
        +                "const": "runtime",
        +                "type": "string"
        +              },
        +              "tiebreak": {
        +                "description": "The comparison that decided the winner.",
        +                "enum": [
        +                  "visible",
        +                  "deepest",
        +                  "smallest-area",
        +                  "structural-equivalence"
        +                ],
        +                "type": "string"
        +              },
        +              "winnerDiagnostic": {
        +                "properties": {
        +                  "diagnosticRef": {
        +                    "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        +                    "type": "string"
        +                  },
        +                  "label": {
        +                    "description": "UTF-8 truncated to 256 bytes.",
        +                    "type": "string"
        +                  },
        +                  "role": {
        +                    "description": "UTF-8 truncated to 256 bytes.",
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "diagnosticRef"
        +                ],
        +                "type": "object"
        +              }
        +            },
        +            "required": [
        +              "source",
        +              "phase",
        +              "kind",
        +              "matchCount",
        +              "winnerDiagnostic",
        +              "tiebreak"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "kind": {
        +                "const": "exact",
        +                "type": "string"
        +              },
        +              "phase": {
        +                "const": "pre-action",
        +                "type": "string"
        +              },
        +              "source": {
        +                "const": "ref",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "source",
        +              "phase",
        +              "kind"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "kind": {
        +                "const": "label-fallback",
        +                "type": "string"
        +              },
        +              "phase": {
        +                "const": "pre-action",
        +                "type": "string"
        +              },
        +              "source": {
        +                "const": "ref",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "source",
        +              "phase",
        +              "kind"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "kind": {
        +                "const": "not-observed",
        +                "type": "string"
        +              },
        +              "source": {
        +                "const": "direct-ios",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "source",
        +              "kind"
        +            ],
        +            "type": "object"
        +          }
        +        ],
        +        "type": "object"
        +      },
        +      "selector": {
        +        "description": "Selector expression when the target was a selector.",
        +        "type": "string"
        +      },
        +      "selectorChain": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "settle": {
        +        "properties": {
        +          "captures": {
        +            "type": "number"
        +          },
        +          "diff": {
        +            "description": "Settled diff vs the pre-action tree (changed lines only).",
        +            "properties": {
        +              "lines": {
        +                "items": {
        +                  "properties": {
        +                    "kind": {
        +                      "enum": [
        +                        "added",
        +                        "removed"
        +                      ],
        +                      "type": "string"
        +                    },
        +                    "ref": {
        +                      "description": "Plain ref body (e12) for added lines.",
        +                      "type": "string"
        +                    },
        +                    "text": {
        +                      "type": "string"
        +                    }
        +                  },
        +                  "required": [
        +                    "kind",
        +                    "text"
        +                  ],
        +                  "type": "object"
        +                },
        +                "type": "array"
        +              },
        +              "summary": {
        +                "properties": {
        +                  "additions": {
        +                    "type": "number"
        +                  },
        +                  "removals": {
        +                    "type": "number"
        +                  },
        +                  "unchanged": {
        +                    "type": "number"
        +                  }
        +                },
        +                "required": [
        +                  "additions",
        +                  "removals",
        +                  "unchanged"
        +                ],
        +                "type": "object"
        +              },
        +              "truncated": {
        +                "description": "Lines were capped to the response bound.",
        +                "type": "boolean"
        +              }
        +            },
        +            "required": [
        +              "summary",
        +              "lines"
        +            ],
        +            "type": "object"
        +          },
        +          "hint": {
        +            "type": "string"
        +          },
        +          "quietMs": {
        +            "type": "number"
        +          },
        +          "refs": {
        +            "items": {
        +              "properties": {
        +                "ref": {
        +                  "description": "Plain ref body (e12) minted from the stored settled tree.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "ref"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "refsGeneration": {
        +            "description": "Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.",
        +            "type": "number"
        +          },
        +          "settled": {
        +            "description": "Whether the UI held the quiet window before the deadline. false is advisory, not failure.",
        +            "type": "boolean"
        +          },
        +          "surfaceChange": {
        +            "description": "Present when an in-place system surface (web sign-in or Apple Pay sheet) was presented over the app, or left it.",
        +            "properties": {
        +              "disclosure": {
        +                "description": "Agent-facing sentence explaining the surface transition.",
        +                "type": "string"
        +              },
        +              "from": {
        +                "description": "Surface the pre-action baseline described: a host bundle id, or app.",
        +                "type": "string"
        +              },
        +              "to": {
        +                "description": "Surface the post-action capture describes: a host bundle id, or app.",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "from",
        +              "to",
        +              "disclosure"
        +            ],
        +            "type": "object"
        +          },
        +          "tail": {
        +            "description": "Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).",
        +            "items": {
        +              "properties": {
        +                "label": {
        +                  "type": "string"
        +                },
        +                "ref": {
        +                  "description": "Plain ref body (e12) minted from the stored settled tree.",
        +                  "type": "string"
        +                },
        +                "role": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "ref",
        +                "role"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "tailTruncated": {
        +            "description": "Present (true) when tail candidates exceeded the response cap.",
        +            "type": "boolean"
        +          },
        +          "timeoutMs": {
        +            "type": "number"
        +          },
        +          "waitedMs": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "settled",
        +          "waitedMs",
        +          "captures",
        +          "quietMs",
        +          "timeoutMs"
        +        ],
        +        "type": "object"
        +      },
        +      "target": {
        +        "description": "Target identity captured before fill and matched after fill.",
        +        "properties": {
        +          "className": {
        +            "description": "Type of the exact field that changed: Android class name or Apple element type.",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "packageName": {
        +            "description": "App that owns the exact field: Android package name or Apple bundle id.",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "rect": {
        +            "description": "Screen-space rectangle of the exact field that changed.",
        +            "properties": {
        +              "height": {
        +                "type": "number"
        +              },
        +              "width": {
        +                "type": "number"
        +              },
        +              "x": {
        +                "type": "number"
        +              },
        +              "y": {
        +                "type": "number"
        +              }
        +            },
        +            "required": [
        +              "x",
        +              "y",
        +              "width",
        +              "height"
        +            ],
        +            "type": "object"
        +          },
        +          "resourceId": {
        +            "description": "Identifier of the exact field that changed: Android resource id or Apple accessibility identifier.",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          }
        +        },
        +        "required": [
        +          "resourceId",
        +          "className",
        +          "packageName",
        +          "rect"
        +        ],
        +        "type": "object"
        +      },
        +      "targetHittable": {
        +        "type": "boolean"
        +      },
        +      "targetKind": {
        +        "description": "Resolved interaction target kind.",
        +        "enum": [
        +          "point",
        +          "ref",
        +          "selector"
        +        ],
        +        "type": "string"
        +      },
        +      "text": {
        +        "description": "Text submitted to the field.",
        +        "type": "string"
        +      },
        +      "verification": {
        +        "const": "unconfirmed",
        +        "type": "string"
        +      },
        +      "warning": {
        +        "type": "string"
        +      },
        +      "x": {
        +        "description": "Resolved interaction x coordinate when available.",
        +        "type": "number"
        +      },
        +      "y": {
        +        "description": "Resolved interaction y coordinate when available.",
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "targetKind",
        +      "text",
        +      "verification",
        +      "requested",
        +      "before",
        +      "after",
        +      "target"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedfold1 field changed
      • changedOutput schema / properties / hingeAngleDegrees / description
        Previous value: -"Hinge angle CoreDevice read back after the pose settled."New value: +"Hinge angle read back after the pose settled: from CoreDevice on iOS, from the emulator hinge sensor on Android."
    • Changedopen1 field changed
      • changedInput schema / properties / launchUrl / description
        Previous value: -"Session-scoped launch URL hint applied to the opened app."New value: +"Launch URL for the opened app; does not select the server used by metro reload."
    • Changedreplay1 field changed
      • addedInput schema / properties / testIme
        Added value: +{
        +  "description": "Activate the headless Android test IME for the sessions this replay opens (default on for emulators; opt-in on real devices).",
        +  "type": "boolean"
        +}
    • Changedsettings1 field changed
      • addedInput schema / properties / app / description
        Added value: +"App the change targets, by bundle id, package name, or app name: the app `clear-app-state` clears, or the app a `permission` change (or an iOS-simulator `location on|off` privacy change) lands on. A name resolves to the installed app as `open` resolves it (an iOS simulator matches display names and accepts only an installed bundle id, Android accepts only an installed package and matches other names against installed package names, and a Limrun iOS session resolves only the `settings` alias); an app that resolves to nothing is refused with `app_not_installed` before anything changes. An app named here needs no session and need not be running (Android `deny|reset` of a held permission does kill a running one); without it those changes use the session app, and a change that is device-wide refuses one with `setting_app_not_consumed` (`location set` on any target, the Android `location on|off` toggle, macOS permissions). The CLI consumes it only when this invocation passes it: an `AGENT_DEVICE_TARGET_APP` or config `targetApp` never retargets a settings mutation."
    • Changedsnapshot1 field changed
      • addedInput schema / properties / observeOnly
        Added value: +{
        +  "description": "iOS only. Refuse instead of activating or repairing the session app. Reports XCUIApplication state, which does not prove screen ownership (#2696).",
        +  "type": "boolean"
        +}
    • Changedtest1 field changed
      • addedInput schema / properties / testIme
        Added value: +{
        +  "description": "Activate the headless Android test IME for the sessions each suite attempt opens (default on for emulators; opt-in on real devices).",
        +  "type": "boolean"
        +}
  4. 2 tool updatesv0.21.18
    • Changedboot1 field changed
      • addedInput schema / properties / timeoutMs
        Added value: +{
        +  "description": "Startup budget in milliseconds. Bounds the boot wait, so a never-booted Simulator can finish its first-boot migration or a cold emulator its boot; omit for the default startup behavior.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
    • Changeddiff1 field changed
      • changedOutput schema / properties / lines / items / properties / kind / enum
        Previous value: -[
        -  "added",
        -  "removed"
        -]New value: +[
        +  "added",
        +  "removed",
        +  "unchanged"
        +]
  5. 1 tool updatev0.21.15
    • Changedappstate1 field changed
      • changedOutput schema / oneOf
        Previous value: -[
        -  {
        -    "properties": {
        -      "appBundleId": {
        -        "type": "string"
        -      },
        -      "appName": {
        -        "type": "string"
        -      },
        -      "device_udid": {
        -        "description": "iOS only — the session device UDID.",
        -        "type": "string"
        -      },
        -      "ios_simulator_device_set": {
        -        "description": "iOS only — the simulator set path, or null when unknown.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "platform": {
        -        "enum": [
        -          "ios",
        -          "macos"
        -        ],
        -        "type": "string"
        -      },
        -      "source": {
        -        "const": "session",
        -        "type": "string"
        -      },
        -      "surface": {
        -        "enum": [
        -          "app",
        -          "frontmost-app",
        -          "desktop",
        -          "menubar"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "platform",
        -      "appName",
        -      "source",
        -      "surface"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "activity": {
        -        "type": "string"
        -      },
        -      "package": {
        -        "type": "string"
        -      },
        -      "platform": {
        -        "const": "android",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "platform",
        -      "package",
        -      "activity"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "properties": {
        +      "appBundleId": {
        +        "type": "string"
        +      },
        +      "appName": {
        +        "type": "string"
        +      },
        +      "device_udid": {
        +        "description": "iOS only — the session device UDID.",
        +        "type": "string"
        +      },
        +      "ios_simulator_device_set": {
        +        "description": "iOS only — the simulator set path, or null when unknown.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "platform": {
        +        "enum": [
        +          "ios",
        +          "macos"
        +        ],
        +        "type": "string"
        +      },
        +      "source": {
        +        "description": "runner when a live runner read the session app state; session when the record alone answered.",
        +        "enum": [
        +          "session",
        +          "runner"
        +        ],
        +        "type": "string"
        +      },
        +      "state": {
        +        "description": "The session app XCUIApplication state as a live runner reads it; absent with source session.",
        +        "enum": [
        +          "unknown",
        +          "notRunning",
        +          "runningBackgroundSuspended",
        +          "runningBackground",
        +          "runningForeground"
        +        ],
        +        "type": "string"
        +      },
        +      "surface": {
        +        "enum": [
        +          "app",
        +          "frontmost-app",
        +          "desktop",
        +          "menubar"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "platform",
        +      "appName",
        +      "source",
        +      "surface"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "activity": {
        +        "type": "string"
        +      },
        +      "package": {
        +        "type": "string"
        +      },
        +      "platform": {
        +        "const": "android",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "platform",
        +      "package",
        +      "activity"
        +    ],
        +    "type": "object"
        +  }
        +]
  6. 2 tool updatesv0.21.13
    • Changedopen1 field changed
      • removedInput schema / properties / deviceHub
        Removed value: -{
        -  "description": "Use Xcode Device Hub when surfacing Apple simulators.",
        -  "type": "boolean"
        -}
    • Changedscroll1 field changed
      • addedOutput schema / properties / movement
        Added value: +{
        +  "description": "Directional scrolls only: what the owner observed after its gesture. `moved` means the content inside the scroller the swipe ran in differs from the tree the session stored immediately before the gesture; `at-edge` and `unchanged` mean it did not change, with no hidden content left to reveal and with no end-of-content signal to read, respectively; `unobserved` means the pair could not back a claim in either direction — nothing comparable was available (no stored tree, a capture from another lineage, a surface that never came to rest), or every difference sits outside the scroller that was swiped, which a changing status bar does on Android — so the reported distance rests on the gesture plan alone. The field is absent — which is never a claim that nothing moved — on the tiers that verify per pass (`scroll top`/`bottom`, `--until`), on a runtime bound without a capture, on a platform whose scroll dispatches no swipe (the Linux wheel), and where the caller already owns that observation (`--settle`, or a replay with `postGestureStabilization: false`).",
        +  "enum": [
        +    "moved",
        +    "at-edge",
        +    "unchanged",
        +    "unobserved"
        +  ],
        +  "type": "string"
        +}
  7. 5 tool updatesv0.21.12
    • Addedaction-button
    • Changedbatch1 field changed
      • changedInput schema / properties / steps / items / properties / command / enum
        Previous value: -[
        -  "devices",
        -  "capabilities",
        -  "doctor",
        -  "apps",
        -  "boot",
        -  "shutdown",
        -  "appstate",
        -  "perf",
        -  "logs",
        -  "network",
        -  "audio",
        -  "test",
        -  "clipboard",
        -  "keyboard",
        -  "install",
        -  "reinstall",
        -  "push",
        -  "trigger-app-event",
        -  "open",
        -  "close",
        -  "snapshot",
        -  "diff",
        -  "wait",
        -  "alert",
        -  "settings",
        -  "react-native",
        -  "record",
        -  "trace",
        -  "find",
        -  "click",
        -  "fill",
        -  "longpress",
        -  "hover",
        -  "press",
        -  "type",
        -  "get",
        -  "is",
        -  "back",
        -  "gesture",
        -  "home",
        -  "tv-remote",
        -  "orientation",
        -  "scroll",
        -  "swipe",
        -  "focus",
        -  "screenshot",
        -  "app-switcher",
        -  "install-from-source"
        -]New value: +[
        +  "devices",
        +  "capabilities",
        +  "doctor",
        +  "apps",
        +  "boot",
        +  "shutdown",
        +  "appstate",
        +  "perf",
        +  "logs",
        +  "network",
        +  "audio",
        +  "test",
        +  "clipboard",
        +  "keyboard",
        +  "install",
        +  "reinstall",
        +  "push",
        +  "trigger-app-event",
        +  "open",
        +  "close",
        +  "snapshot",
        +  "diff",
        +  "wait",
        +  "alert",
        +  "settings",
        +  "react-native",
        +  "record",
        +  "trace",
        +  "find",
        +  "click",
        +  "fill",
        +  "longpress",
        +  "hover",
        +  "press",
        +  "type",
        +  "get",
        +  "is",
        +  "back",
        +  "gesture",
        +  "home",
        +  "tv-remote",
        +  "orientation",
        +  "fold",
        +  "scroll",
        +  "swipe",
        +  "focus",
        +  "screenshot",
        +  "app-switcher",
        +  "action-button",
        +  "install-from-source"
        +]
    • Addedfold
    • Changedopen1 field changed
      • addedInput schema / properties / waitMs
        Added value: +{
        +  "description": "Block this open for up to n milliseconds (100-120000) while another session holds the device, then fail with DEVICE_IN_USE naming that session. Only session contention is waited for: a device claim held by another workspace is refused at once with its recovery command. A device that never frees, or is taken again while this open waits, costs the full budget, which extends this command's timeout envelope rather than eating into it.",
        +  "maximum": 120000,
        +  "minimum": 100,
        +  "type": "integer"
        +}
    • Changedsettings1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "setting",
        -  "state"
        -]New value: +[
        +  "setting"
        +]
  8. 9 tool updatesv0.21.2
    • Changedback1 field changed
      • addedOutput schema / properties / settle / properties / surfaceChange
        Added value: +{
        +  "description": "Present when an in-place system surface (web sign-in or Apple Pay sheet) was presented over the app, or left it.",
        +  "properties": {
        +    "disclosure": {
        +      "description": "Agent-facing sentence explaining the surface transition.",
        +      "type": "string"
        +    },
        +    "from": {
        +      "description": "Surface the pre-action baseline described: a host bundle id, or app.",
        +      "type": "string"
        +    },
        +    "to": {
        +      "description": "Surface the post-action capture describes: a host bundle id, or app.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "from",
        +    "to",
        +    "disclosure"
        +  ],
        +  "type": "object"
        +}
    • Changedclick3 fields changed
      • changedOutput schema / properties / evidence / properties / changedFromBefore / description
        Previous value: -"Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure."New value: +"Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure. With surfaceChange present, no digest comparison is made: it reports that surface transition."
      • addedOutput schema / properties / evidence / properties / surfaceChange
        Added value: +{
        +  "description": "Present when an in-place system surface (web sign-in or Apple Pay sheet) was presented over the app, or left it.",
        +  "properties": {
        +    "disclosure": {
        +      "description": "Agent-facing sentence explaining the surface transition.",
        +      "type": "string"
        +    },
        +    "from": {
        +      "description": "Surface the pre-action baseline described: a host bundle id, or app.",
        +      "type": "string"
        +    },
        +    "to": {
        +      "description": "Surface the post-action capture describes: a host bundle id, or app.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "from",
        +    "to",
        +    "disclosure"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / settle / properties / surfaceChange
        Added value: +{
        +  "description": "Present when an in-place system surface (web sign-in or Apple Pay sheet) was presented over the app, or left it.",
        +  "properties": {
        +    "disclosure": {
        +      "description": "Agent-facing sentence explaining the surface transition.",
        +      "type": "string"
        +    },
        +    "from": {
        +      "description": "Surface the pre-action baseline described: a host bundle id, or app.",
        +      "type": "string"
        +    },
        +    "to": {
        +      "description": "Surface the post-action capture describes: a host bundle id, or app.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "from",
        +    "to",
        +    "disclosure"
        +  ],
        +  "type": "object"
        +}
    • Changedfill1 field changed
      • changedOutput schema / oneOf
        Previous value: -[
        -  {
        -    "not": {
        -      "properties": {},
        -      "required": [
        -        "verification"
        -      ],
        -      "type": "object"
        -    },
        -    "properties": {
        -      "cost": {
        -        "properties": {
        -          "nodeCount": {
        -            "description": "Number of nodes in the original node tree when the response carries one.",
        -            "type": "number"
        -          },
        -          "runnerRoundTrips": {
        -            "description": "Number of real runner round-trips made while serving the request.",
        -            "type": "number"
        -          },
        -          "wallClockMs": {
        -            "description": "Total wall-clock time for the request in milliseconds.",
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "wallClockMs",
        -          "runnerRoundTrips"
        -        ],
        -        "type": "object"
        -      },
        -      "delayMs": {
        -        "description": "Delay between typed characters in milliseconds.",
        -        "type": "number"
        -      },
        -      "evidence": {
        -        "properties": {
        -          "changedFromBefore": {
        -            "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.",
        -            "type": "boolean"
        -          },
        -          "digest": {
        -            "description": "Order-independent digest of the post-action node multiset.",
        -            "type": "string"
        -          },
        -          "foregroundApp": {
        -            "description": "Foreground app bundle id or name, when the capture carries it.",
        -            "type": "string"
        -          },
        -          "interactiveNodeCount": {
        -            "description": "Subset of nodeCount the platform reports as hittable.",
        -            "type": "number"
        -          },
        -          "nodeCount": {
        -            "description": "Node count in the post-action interactive-only capture.",
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "nodeCount",
        -          "interactiveNodeCount",
        -          "digest",
        -          "changedFromBefore"
        -        ],
        -        "type": "object"
        -      },
        -      "hint": {
        -        "type": "string"
        -      },
        -      "maestroFallbackReason": {
        -        "const": "non-hittable-coordinate",
        -        "type": "string"
        -      },
        -      "maestroNonHittableCoordinateFallbackAllowed": {
        -        "description": "Whether the direct iOS Maestro coordinate fallback was allowed for this selector.",
        -        "type": "boolean"
        -      },
        -      "maestroNonHittableCoordinateFallbackUsed": {
        -        "description": "Whether the direct iOS Maestro coordinate fallback was actually used.",
        -        "type": "boolean"
        -      },
        -      "message": {
        -        "type": "string"
        -      },
        -      "ref": {
        -        "description": "Snapshot ref without the @ prefix when the target was an @ref.",
        -        "type": "string"
        -      },
        -      "refLabel": {
        -        "type": "string"
        -      },
        -      "referenceHeight": {
        -        "description": "Reference frame height for visualizing the interaction point.",
        -        "type": "number"
        -      },
        -      "referenceWidth": {
        -        "description": "Reference frame width for visualizing the interaction point.",
        -        "type": "number"
        -      },
        -      "resolution": {
        -        "description": "Pre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path.",
        -        "oneOf": [
        -          {
        -            "properties": {
        -              "kind": {
        -                "const": "unique",
        -                "type": "string"
        -              },
        -              "phase": {
        -                "const": "pre-action",
        -                "type": "string"
        -              },
        -              "source": {
        -                "const": "runtime",
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "source",
        -              "phase",
        -              "kind"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "properties": {
        -              "alternatives": {
        -                "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.",
        -                "items": {
        -                  "properties": {
        -                    "diagnosticRef": {
        -                      "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        -                      "type": "string"
        -                    },
        -                    "label": {
        -                      "description": "UTF-8 truncated to 256 bytes.",
        -                      "type": "string"
        -                    },
        -                    "role": {
        -                      "description": "UTF-8 truncated to 256 bytes.",
        -                      "type": "string"
        -                    }
        -                  },
        -                  "required": [
        -                    "diagnosticRef"
        -                  ],
        -                  "type": "object"
        -                },
        -                "type": "array"
        -              },
        -              "kind": {
        -                "const": "disambiguated",
        -                "type": "string"
        -              },
        -              "matchCount": {
        -                "description": "Total matches resolveSelectorChain found before disambiguation.",
        -                "type": "number"
        -              },
        -              "phase": {
        -                "const": "pre-action",
        -                "type": "string"
        -              },
        -              "source": {
        -                "const": "runtime",
        -                "type": "string"
        -              },
        -              "tiebreak": {
        -                "description": "The comparison that decided the winner.",
        -                "enum": [
        -                  "visible",
        -                  "deepest",
        -                  "smallest-area",
        -                  "structural-equivalence"
        -                ],
        -                "type": "string"
        -              },
        -              "winnerDiagnostic": {
        -                "properties": {
        -                  "diagnosticRef": {
        -                    "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        -                    "type": "string"
        -                  },
        -                  "label": {
        -                    "description": "UTF-8 truncated to 256 bytes.",
        -                    "type": "string"
        -                  },
        -                  "role": {
        -                    "description": "UTF-8 truncated to 256 bytes.",
        -                    "type": "string"
        -                  }
        -                },
        -                "required": [
        -                  "diagnosticRef"
        -                ],
        -                "type": "object"
        -              }
        -            },
        -            "required": [
        -              "source",
        -              "phase",
        -              "kind",
        -              "matchCount",
        -              "winnerDiagnostic",
        -              "tiebreak"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "properties": {
        -              "kind": {
        -                "const": "exact",
        -                "type": "string"
        -              },
        -              "phase": {
        -                "const": "pre-action",
        -                "type": "string"
        -              },
        -              "source": {
        -                "const": "ref",
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "source",
        -              "phase",
        -              "kind"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "properties": {
        -              "kind": {
        -                "const": "label-fallback",
        -                "type": "string"
        -              },
        -              "phase": {
        -                "const": "pre-action",
        -                "type": "string"
        -              },
        -              "source": {
        -                "const": "ref",
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "source",
        -              "phase",
        -              "kind"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "properties": {
        -              "kind": {
        -                "const": "not-observed",
        -                "type": "string"
        -              },
        -              "source": {
        -                "const": "direct-ios",
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "source",
        -              "kind"
        -            ],
        -            "type": "object"
        -          }
        -        ],
        -        "type": "object"
        -      },
        -      "selector": {
        -        "description": "Selector expression when the target was a selector.",
        -        "type": "string"
        -      },
        -      "selectorChain": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "settle": {
        -        "properties": {
        -          "captures": {
        -            "type": "number"
        -          },
        -          "diff": {
        -            "description": "Settled diff vs the pre-action tree (changed lines only).",
        -            "properties": {
        -              "lines": {
        -                "items": {
        -                  "properties": {
        -                    "kind": {
        -                      "enum": [
        -                        "added",
        -                        "removed"
        -                      ],
        -                      "type": "string"
        -                    },
        -                    "ref": {
        -                      "description": "Plain ref body (e12) for added lines.",
        -                      "type": "string"
        -                    },
        -                    "text": {
        -                      "type": "string"
        -                    }
        -                  },
        -                  "required": [
        -                    "kind",
        -                    "text"
        -                  ],
        -                  "type": "object"
        -                },
        -                "type": "array"
        -              },
        -              "summary": {
        -                "properties": {
        -                  "additions": {
        -                    "type": "number"
        -                  },
        -                  "removals": {
        -                    "type": "number"
        -                  },
        -                  "unchanged": {
        -                    "type": "number"
        -                  }
        -                },
        -                "required": [
        -                  "additions",
        -                  "removals",
        -                  "unchanged"
        -                ],
        -                "type": "object"
        -              },
        -              "truncated": {
        -                "description": "Lines were capped to the response bound.",
        -                "type": "boolean"
        -              }
        -            },
        -            "required": [
        -              "summary",
        -              "lines"
        -            ],
        -            "type": "object"
        -          },
        -          "hint": {
        -            "type": "string"
        -          },
        -          "quietMs": {
        -            "type": "number"
        -          },
        -          "refs": {
        -            "items": {
        -              "properties": {
        -                "ref": {
        -                  "description": "Plain ref body (e12) minted from the stored settled tree.",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "ref"
        -              ],
        -              "type": "object"
        -            },
        -            "type": "array"
        -          },
        -          "refsGeneration": {
        -            "description": "Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.",
        -            "type": "number"
        -          },
        -          "settled": {
        -            "description": "Whether the UI held the quiet window before the deadline. false is advisory, not failure.",
        -            "type": "boolean"
        -          },
        -          "tail": {
        -            "description": "Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).",
        -            "items": {
        -              "properties": {
        -                "label": {
        -                  "type": "string"
        -                },
        -                "ref": {
        -                  "description": "Plain ref body (e12) minted from the stored settled tree.",
        -                  "type": "string"
        -                },
        -                "role": {
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "ref",
        -                "role"
        -              ],
        -              "type": "object"
        -            },
        -            "type": "array"
        -          },
        -          "tailTruncated": {
        -            "description": "Present (true) when tail candidates exceeded the response cap.",
        -            "type": "boolean"
        -          },
        -          "timeoutMs": {
        -            "type": "number"
        -          },
        -          "waitedMs": {
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "settled",
        -          "waitedMs",
        -          "captures",
        -          "quietMs",
        -          "timeoutMs"
        -        ],
        -        "type": "object"
        -      },
        -      "targetHittable": {
        -        "type": "boolean"
        -      },
        -      "targetKind": {
        -        "description": "Resolved interaction target kind.",
        -        "enum": [
        -          "point",
        -          "ref",
        -          "selector"
        -        ],
        -        "type": "string"
        -      },
        -      "text": {
        -        "description": "Text submitted to the field.",
        -        "type": "string"
        -      },
        -      "warning": {
        -        "type": "string"
        -      },
        -      "x": {
        -        "description": "Resolved interaction x coordinate when available.",
        -        "type": "number"
        -      },
        -      "y": {
        -        "description": "Resolved interaction y coordinate when available.",
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "targetKind",
        -      "text"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "after": {
        -        "description": "Raw target text captured after the fill.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "before": {
        -        "description": "Raw target text captured before the fill.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "cost": {
        -        "properties": {
        -          "nodeCount": {
        -            "description": "Number of nodes in the original node tree when the response carries one.",
        -            "type": "number"
        -          },
        -          "runnerRoundTrips": {
        -            "description": "Number of real runner round-trips made while serving the request.",
        -            "type": "number"
        -          },
        -          "wallClockMs": {
        -            "description": "Total wall-clock time for the request in milliseconds.",
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "wallClockMs",
        -          "runnerRoundTrips"
        -        ],
        -        "type": "object"
        -      },
        -      "delayMs": {
        -        "description": "Delay between typed characters in milliseconds.",
        -        "type": "number"
        -      },
        -      "evidence": {
        -        "properties": {
        -          "changedFromBefore": {
        -            "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.",
        -            "type": "boolean"
        -          },
        -          "digest": {
        -            "description": "Order-independent digest of the post-action node multiset.",
        -            "type": "string"
        -          },
        -          "foregroundApp": {
        -            "description": "Foreground app bundle id or name, when the capture carries it.",
        -            "type": "string"
        -          },
        -          "interactiveNodeCount": {
        -            "description": "Subset of nodeCount the platform reports as hittable.",
        -            "type": "number"
        -          },
        -          "nodeCount": {
        -            "description": "Node count in the post-action interactive-only capture.",
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "nodeCount",
        -          "interactiveNodeCount",
        -          "digest",
        -          "changedFromBefore"
        -        ],
        -        "type": "object"
        -      },
        -      "hint": {
        -        "type": "string"
        -      },
        -      "maestroFallbackReason": {
        -        "const": "non-hittable-coordinate",
        -        "type": "string"
        -      },
        -      "maestroNonHittableCoordinateFallbackAllowed": {
        -        "description": "Whether the direct iOS Maestro coordinate fallback was allowed for this selector.",
        -        "type": "boolean"
        -      },
        -      "maestroNonHittableCoordinateFallbackUsed": {
        -        "description": "Whether the direct iOS Maestro coordinate fallback was actually used.",
        -        "type": "boolean"
        -      },
        -      "message": {
        -        "type": "string"
        -      },
        -      "ref": {
        -        "description": "Snapshot ref without the @ prefix when the target was an @ref.",
        -        "type": "string"
        -      },
        -      "refLabel": {
        -        "type": "string"
        -      },
        -      "referenceHeight": {
        -        "description": "Reference frame height for visualizing the interaction point.",
        -        "type": "number"
        -      },
        -      "referenceWidth": {
        -        "description": "Reference frame width for visualizing the interaction point.",
        -        "type": "number"
        -      },
        -      "requested": {
        -        "description": "Literal text requested by the fill command.",
        -        "type": "string"
        -      },
        -      "resolution": {
        -        "description": "Pre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path.",
        -        "oneOf": [
        -          {
        -            "properties": {
        -              "kind": {
        -                "const": "unique",
        -                "type": "string"
        -              },
        -              "phase": {
        -                "const": "pre-action",
        -                "type": "string"
        -              },
        -              "source": {
        -                "const": "runtime",
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "source",
        -              "phase",
        -              "kind"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "properties": {
        -              "alternatives": {
        -                "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.",
        -                "items": {
        -                  "properties": {
        -                    "diagnosticRef": {
        -                      "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        -                      "type": "string"
        -                    },
        -                    "label": {
        -                      "description": "UTF-8 truncated to 256 bytes.",
        -                      "type": "string"
        -                    },
        -                    "role": {
        -                      "description": "UTF-8 truncated to 256 bytes.",
        -                      "type": "string"
        -                    }
        -                  },
        -                  "required": [
        -                    "diagnosticRef"
        -                  ],
        -                  "type": "object"
        -                },
        -                "type": "array"
        -              },
        -              "kind": {
        -                "const": "disambiguated",
        -                "type": "string"
        -              },
        -              "matchCount": {
        -                "description": "Total matches resolveSelectorChain found before disambiguation.",
        -                "type": "number"
        -              },
        -              "phase": {
        -                "const": "pre-action",
        -                "type": "string"
        -              },
        -              "source": {
        -                "const": "runtime",
        -                "type": "string"
        -              },
        -              "tiebreak": {
        -                "description": "The comparison that decided the winner.",
        -                "enum": [
        -                  "visible",
        -                  "deepest",
        -                  "smallest-area",
        -                  "structural-equivalence"
        -                ],
        -                "type": "string"
        -              },
        -              "winnerDiagnostic": {
        -                "properties": {
        -                  "diagnosticRef": {
        -                    "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        -                    "type": "string"
        -                  },
        -                  "label": {
        -                    "description": "UTF-8 truncated to 256 bytes.",
        -                    "type": "string"
        -                  },
        -                  "role": {
        -                    "description": "UTF-8 truncated to 256 bytes.",
        -                    "type": "string"
        -                  }
        -                },
        -                "required": [
        -                  "diagnosticRef"
        -                ],
        -                "type": "object"
        -              }
        -            },
        -            "required": [
        -              "source",
        -              "phase",
        -              "kind",
        -              "matchCount",
        -              "winnerDiagnostic",
        -              "tiebreak"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "properties": {
        -              "kind": {
        -                "const": "exact",
        -                "type": "string"
        -              },
        -              "phase": {
        -                "const": "pre-action",
        -                "type": "string"
        -              },
        -              "source": {
        -                "const": "ref",
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "source",
        -              "phase",
        -              "kind"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "properties": {
        -              "kind": {
        -                "const": "label-fallback",
        -                "type": "string"
        -              },
        -              "phase": {
        -                "const": "pre-action",
        -                "type": "string"
        -              },
        -              "source": {
        -                "const": "ref",
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "source",
        -              "phase",
        -              "kind"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "properties": {
        -              "kind": {
        -                "const": "not-observed",
        -                "type": "string"
        -              },
        -              "source": {
        -                "const": "direct-ios",
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "source",
        -              "kind"
        -            ],
        -            "type": "object"
        -          }
        -        ],
        -        "type": "object"
        -      },
        -      "selector": {
        -        "description": "Selector expression when the target was a selector.",
        -        "type": "string"
        -      },
        -      "selectorChain": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "settle": {
        -        "properties": {
        -          "captures": {
        -            "type": "number"
        -          },
        -          "diff": {
        -            "description": "Settled diff vs the pre-action tree (changed lines only).",
        -            "properties": {
        -              "lines": {
        -                "items": {
        -                  "properties": {
        -                    "kind": {
        -                      "enum": [
        -                        "added",
        -                        "removed"
        -                      ],
        -                      "type": "string"
        -                    },
        -                    "ref": {
        -                      "description": "Plain ref body (e12) for added lines.",
        -                      "type": "string"
        -                    },
        -                    "text": {
        -                      "type": "string"
        -                    }
        -                  },
        -                  "required": [
        -                    "kind",
        -                    "text"
        -                  ],
        -                  "type": "object"
        -                },
        -                "type": "array"
        -              },
        -              "summary": {
        -                "properties": {
        -                  "additions": {
        -                    "type": "number"
        -                  },
        -                  "removals": {
        -                    "type": "number"
        -                  },
        -                  "unchanged": {
        -                    "type": "number"
        -                  }
        -                },
        -                "required": [
        -                  "additions",
        -                  "removals",
        -                  "unchanged"
        -                ],
        -                "type": "object"
        -              },
        -              "truncated": {
        -                "description": "Lines were capped to the response bound.",
        -                "type": "boolean"
        -              }
        -            },
        -            "required": [
        -              "summary",
        -              "lines"
        -            ],
        -            "type": "object"
        -          },
        -          "hint": {
        -            "type": "string"
        -          },
        -          "quietMs": {
        -            "type": "number"
        -          },
        -          "refs": {
        -            "items": {
        -              "properties": {
        -                "ref": {
        -                  "description": "Plain ref body (e12) minted from the stored settled tree.",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "ref"
        -              ],
        -              "type": "object"
        -            },
        -            "type": "array"
        -          },
        -          "refsGeneration": {
        -            "description": "Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.",
        -            "type": "number"
        -          },
        -          "settled": {
        -            "description": "Whether the UI held the quiet window before the deadline. false is advisory, not failure.",
        -            "type": "boolean"
        -          },
        -          "tail": {
        -            "description": "Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).",
        -            "items": {
        -              "properties": {
        -                "label": {
        -                  "type": "string"
        -                },
        -                "ref": {
        -                  "description": "Plain ref body (e12) minted from the stored settled tree.",
        -                  "type": "string"
        -                },
        -                "role": {
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "ref",
        -                "role"
        -              ],
        -              "type": "object"
        -            },
        -            "type": "array"
        -          },
        -          "tailTruncated": {
        -            "description": "Present (true) when tail candidates exceeded the response cap.",
        -            "type": "boolean"
        -          },
        -          "timeoutMs": {
        -            "type": "number"
        -          },
        -          "waitedMs": {
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "settled",
        -          "waitedMs",
        -          "captures",
        -          "quietMs",
        -          "timeoutMs"
        -        ],
        -        "type": "object"
        -      },
        -      "target": {
        -        "description": "Target identity captured before fill and matched after fill.",
        -        "properties": {
        -          "className": {
        -            "description": "Android class name of the exact field that changed.",
        -            "type": [
        -              "string",
        -              "null"
        -            ]
        -          },
        -          "packageName": {
        -            "description": "Android package name that owns the exact field.",
        -            "type": [
        -              "string",
        -              "null"
        -            ]
        -          },
        -          "rect": {
        -            "description": "Screen-space rectangle of the exact field that changed.",
        -            "properties": {
        -              "height": {
        -                "type": "number"
        -              },
        -              "width": {
        -                "type": "number"
        -              },
        -              "x": {
        -                "type": "number"
        -              },
        -              "y": {
        -                "type": "number"
        -              }
        -            },
        -            "required": [
        -              "x",
        -              "y",
        -              "width",
        -              "height"
        -            ],
        -            "type": "object"
        -          },
        -          "resourceId": {
        -            "description": "Android resource id of the exact field that changed.",
        -            "type": [
        -              "string",
        -              "null"
        -            ]
        -          }
        -        },
        -        "required": [
        -          "resourceId",
        -          "className",
        -          "packageName",
        -          "rect"
        -        ],
        -        "type": "object"
        -      },
        -      "targetHittable": {
        -        "type": "boolean"
        -      },
        -      "targetKind": {
        -        "description": "Resolved interaction target kind.",
        -        "enum": [
        -          "point",
        -          "ref",
        -          "selector"
        -        ],
        -        "type": "string"
        -      },
        -      "text": {
        -        "description": "Text submitted to the field.",
        -        "type": "string"
        -      },
        -      "verification": {
        -        "const": "unconfirmed",
        -        "type": "string"
        -      },
        -      "warning": {
        -        "type": "string"
        -      },
        -      "x": {
        -        "description": "Resolved interaction x coordinate when available.",
        -        "type": "number"
        -      },
        -      "y": {
        -        "description": "Resolved interaction y coordinate when available.",
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "targetKind",
        -      "text",
        -      "verification",
        -      "requested",
        -      "before",
        -      "after",
        -      "target"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "properties": {},
        +      "required": [
        +        "verification"
        +      ],
        +      "type": "object"
        +    },
        +    "properties": {
        +      "cost": {
        +        "properties": {
        +          "nodeCount": {
        +            "description": "Number of nodes in the original node tree when the response carries one.",
        +            "type": "number"
        +          },
        +          "runnerRoundTrips": {
        +            "description": "Number of real runner round-trips made while serving the request.",
        +            "type": "number"
        +          },
        +          "wallClockMs": {
        +            "description": "Total wall-clock time for the request in milliseconds.",
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "wallClockMs",
        +          "runnerRoundTrips"
        +        ],
        +        "type": "object"
        +      },
        +      "delayMs": {
        +        "description": "Delay between typed characters in milliseconds.",
        +        "type": "number"
        +      },
        +      "evidence": {
        +        "properties": {
        +          "changedFromBefore": {
        +            "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure. With surfaceChange present, no digest comparison is made: it reports that surface transition.",
        +            "type": "boolean"
        +          },
        +          "digest": {
        +            "description": "Order-independent digest of the post-action node multiset.",
        +            "type": "string"
        +          },
        +          "foregroundApp": {
        +            "description": "Foreground app bundle id or name, when the capture carries it.",
        +            "type": "string"
        +          },
        +          "interactiveNodeCount": {
        +            "description": "Subset of nodeCount the platform reports as hittable.",
        +            "type": "number"
        +          },
        +          "nodeCount": {
        +            "description": "Node count in the post-action interactive-only capture.",
        +            "type": "number"
        +          },
        +          "surfaceChange": {
        +            "description": "Present when an in-place system surface (web sign-in or Apple Pay sheet) was presented over the app, or left it.",
        +            "properties": {
        +              "disclosure": {
        +                "description": "Agent-facing sentence explaining the surface transition.",
        +                "type": "string"
        +              },
        +              "from": {
        +                "description": "Surface the pre-action baseline described: a host bundle id, or app.",
        +                "type": "string"
        +              },
        +              "to": {
        +                "description": "Surface the post-action capture describes: a host bundle id, or app.",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "from",
        +              "to",
        +              "disclosure"
        +            ],
        +            "type": "object"
        +          }
        +        },
        +        "required": [
        +          "nodeCount",
        +          "interactiveNodeCount",
        +          "digest",
        +          "changedFromBefore"
        +        ],
        +        "type": "object"
        +      },
        +      "hint": {
        +        "type": "string"
        +      },
        +      "maestroFallbackReason": {
        +        "const": "non-hittable-coordinate",
        +        "type": "string"
        +      },
        +      "maestroNonHittableCoordinateFallbackAllowed": {
        +        "description": "Whether the direct iOS Maestro coordinate fallback was allowed for this selector.",
        +        "type": "boolean"
        +      },
        +      "maestroNonHittableCoordinateFallbackUsed": {
        +        "description": "Whether the direct iOS Maestro coordinate fallback was actually used.",
        +        "type": "boolean"
        +      },
        +      "message": {
        +        "type": "string"
        +      },
        +      "ref": {
        +        "description": "Snapshot ref without the @ prefix when the target was an @ref.",
        +        "type": "string"
        +      },
        +      "refLabel": {
        +        "type": "string"
        +      },
        +      "referenceHeight": {
        +        "description": "Reference frame height for visualizing the interaction point.",
        +        "type": "number"
        +      },
        +      "referenceWidth": {
        +        "description": "Reference frame width for visualizing the interaction point.",
        +        "type": "number"
        +      },
        +      "resolution": {
        +        "description": "Pre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path.",
        +        "oneOf": [
        +          {
        +            "properties": {
        +              "kind": {
        +                "const": "unique",
        +                "type": "string"
        +              },
        +              "phase": {
        +                "const": "pre-action",
        +                "type": "string"
        +              },
        +              "source": {
        +                "const": "runtime",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "source",
        +              "phase",
        +              "kind"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "alternatives": {
        +                "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.",
        +                "items": {
        +                  "properties": {
        +                    "diagnosticRef": {
        +                      "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        +                      "type": "string"
        +                    },
        +                    "label": {
        +                      "description": "UTF-8 truncated to 256 bytes.",
        +                      "type": "string"
        +                    },
        +                    "role": {
        +                      "description": "UTF-8 truncated to 256 bytes.",
        +                      "type": "string"
        +                    }
        +                  },
        +                  "required": [
        +                    "diagnosticRef"
        +                  ],
        +                  "type": "object"
        +                },
        +                "type": "array"
        +              },
        +              "kind": {
        +                "const": "disambiguated",
        +                "type": "string"
        +              },
        +              "matchCount": {
        +                "description": "Total matches resolveSelectorChain found before disambiguation.",
        +                "type": "number"
        +              },
        +              "phase": {
        +                "const": "pre-action",
        +                "type": "string"
        +              },
        +              "source": {
        +                "const": "runtime",
        +                "type": "string"
        +              },
        +              "tiebreak": {
        +                "description": "The comparison that decided the winner.",
        +                "enum": [
        +                  "visible",
        +                  "deepest",
        +                  "smallest-area",
        +                  "structural-equivalence"
        +                ],
        +                "type": "string"
        +              },
        +              "winnerDiagnostic": {
        +                "properties": {
        +                  "diagnosticRef": {
        +                    "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        +                    "type": "string"
        +                  },
        +                  "label": {
        +                    "description": "UTF-8 truncated to 256 bytes.",
        +                    "type": "string"
        +                  },
        +                  "role": {
        +                    "description": "UTF-8 truncated to 256 bytes.",
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "diagnosticRef"
        +                ],
        +                "type": "object"
        +              }
        +            },
        +            "required": [
        +              "source",
        +              "phase",
        +              "kind",
        +              "matchCount",
        +              "winnerDiagnostic",
        +              "tiebreak"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "kind": {
        +                "const": "exact",
        +                "type": "string"
        +              },
        +              "phase": {
        +                "const": "pre-action",
        +                "type": "string"
        +              },
        +              "source": {
        +                "const": "ref",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "source",
        +              "phase",
        +              "kind"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "kind": {
        +                "const": "label-fallback",
        +                "type": "string"
        +              },
        +              "phase": {
        +                "const": "pre-action",
        +                "type": "string"
        +              },
        +              "source": {
        +                "const": "ref",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "source",
        +              "phase",
        +              "kind"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "kind": {
        +                "const": "not-observed",
        +                "type": "string"
        +              },
        +              "source": {
        +                "const": "direct-ios",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "source",
        +              "kind"
        +            ],
        +            "type": "object"
        +          }
        +        ],
        +        "type": "object"
        +      },
        +      "selector": {
        +        "description": "Selector expression when the target was a selector.",
        +        "type": "string"
        +      },
        +      "selectorChain": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "settle": {
        +        "properties": {
        +          "captures": {
        +            "type": "number"
        +          },
        +          "diff": {
        +            "description": "Settled diff vs the pre-action tree (changed lines only).",
        +            "properties": {
        +              "lines": {
        +                "items": {
        +                  "properties": {
        +                    "kind": {
        +                      "enum": [
        +                        "added",
        +                        "removed"
        +                      ],
        +                      "type": "string"
        +                    },
        +                    "ref": {
        +                      "description": "Plain ref body (e12) for added lines.",
        +                      "type": "string"
        +                    },
        +                    "text": {
        +                      "type": "string"
        +                    }
        +                  },
        +                  "required": [
        +                    "kind",
        +                    "text"
        +                  ],
        +                  "type": "object"
        +                },
        +                "type": "array"
        +              },
        +              "summary": {
        +                "properties": {
        +                  "additions": {
        +                    "type": "number"
        +                  },
        +                  "removals": {
        +                    "type": "number"
        +                  },
        +                  "unchanged": {
        +                    "type": "number"
        +                  }
        +                },
        +                "required": [
        +                  "additions",
        +                  "removals",
        +                  "unchanged"
        +                ],
        +                "type": "object"
        +              },
        +              "truncated": {
        +                "description": "Lines were capped to the response bound.",
        +                "type": "boolean"
        +              }
        +            },
        +            "required": [
        +              "summary",
        +              "lines"
        +            ],
        +            "type": "object"
        +          },
        +          "hint": {
        +            "type": "string"
        +          },
        +          "quietMs": {
        +            "type": "number"
        +          },
        +          "refs": {
        +            "items": {
        +              "properties": {
        +                "ref": {
        +                  "description": "Plain ref body (e12) minted from the stored settled tree.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "ref"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "refsGeneration": {
        +            "description": "Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.",
        +            "type": "number"
        +          },
        +          "settled": {
        +            "description": "Whether the UI held the quiet window before the deadline. false is advisory, not failure.",
        +            "type": "boolean"
        +          },
        +          "surfaceChange": {
        +            "description": "Present when an in-place system surface (web sign-in or Apple Pay sheet) was presented over the app, or left it.",
        +            "properties": {
        +              "disclosure": {
        +                "description": "Agent-facing sentence explaining the surface transition.",
        +                "type": "string"
        +              },
        +              "from": {
        +                "description": "Surface the pre-action baseline described: a host bundle id, or app.",
        +                "type": "string"
        +              },
        +              "to": {
        +                "description": "Surface the post-action capture describes: a host bundle id, or app.",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "from",
        +              "to",
        +              "disclosure"
        +            ],
        +            "type": "object"
        +          },
        +          "tail": {
        +            "description": "Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).",
        +            "items": {
        +              "properties": {
        +                "label": {
        +                  "type": "string"
        +                },
        +                "ref": {
        +                  "description": "Plain ref body (e12) minted from the stored settled tree.",
        +                  "type": "string"
        +                },
        +                "role": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "ref",
        +                "role"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "tailTruncated": {
        +            "description": "Present (true) when tail candidates exceeded the response cap.",
        +            "type": "boolean"
        +          },
        +          "timeoutMs": {
        +            "type": "number"
        +          },
        +          "waitedMs": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "settled",
        +          "waitedMs",
        +          "captures",
        +          "quietMs",
        +          "timeoutMs"
        +        ],
        +        "type": "object"
        +      },
        +      "targetHittable": {
        +        "type": "boolean"
        +      },
        +      "targetKind": {
        +        "description": "Resolved interaction target kind.",
        +        "enum": [
        +          "point",
        +          "ref",
        +          "selector"
        +        ],
        +        "type": "string"
        +      },
        +      "text": {
        +        "description": "Text submitted to the field.",
        +        "type": "string"
        +      },
        +      "warning": {
        +        "type": "string"
        +      },
        +      "x": {
        +        "description": "Resolved interaction x coordinate when available.",
        +        "type": "number"
        +      },
        +      "y": {
        +        "description": "Resolved interaction y coordinate when available.",
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "targetKind",
        +      "text"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "after": {
        +        "description": "Raw target text captured after the fill.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "before": {
        +        "description": "Raw target text captured before the fill.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "cost": {
        +        "properties": {
        +          "nodeCount": {
        +            "description": "Number of nodes in the original node tree when the response carries one.",
        +            "type": "number"
        +          },
        +          "runnerRoundTrips": {
        +            "description": "Number of real runner round-trips made while serving the request.",
        +            "type": "number"
        +          },
        +          "wallClockMs": {
        +            "description": "Total wall-clock time for the request in milliseconds.",
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "wallClockMs",
        +          "runnerRoundTrips"
        +        ],
        +        "type": "object"
        +      },
        +      "delayMs": {
        +        "description": "Delay between typed characters in milliseconds.",
        +        "type": "number"
        +      },
        +      "evidence": {
        +        "properties": {
        +          "changedFromBefore": {
        +            "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure. With surfaceChange present, no digest comparison is made: it reports that surface transition.",
        +            "type": "boolean"
        +          },
        +          "digest": {
        +            "description": "Order-independent digest of the post-action node multiset.",
        +            "type": "string"
        +          },
        +          "foregroundApp": {
        +            "description": "Foreground app bundle id or name, when the capture carries it.",
        +            "type": "string"
        +          },
        +          "interactiveNodeCount": {
        +            "description": "Subset of nodeCount the platform reports as hittable.",
        +            "type": "number"
        +          },
        +          "nodeCount": {
        +            "description": "Node count in the post-action interactive-only capture.",
        +            "type": "number"
        +          },
        +          "surfaceChange": {
        +            "description": "Present when an in-place system surface (web sign-in or Apple Pay sheet) was presented over the app, or left it.",
        +            "properties": {
        +              "disclosure": {
        +                "description": "Agent-facing sentence explaining the surface transition.",
        +                "type": "string"
        +              },
        +              "from": {
        +                "description": "Surface the pre-action baseline described: a host bundle id, or app.",
        +                "type": "string"
        +              },
        +              "to": {
        +                "description": "Surface the post-action capture describes: a host bundle id, or app.",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "from",
        +              "to",
        +              "disclosure"
        +            ],
        +            "type": "object"
        +          }
        +        },
        +        "required": [
        +          "nodeCount",
        +          "interactiveNodeCount",
        +          "digest",
        +          "changedFromBefore"
        +        ],
        +        "type": "object"
        +      },
        +      "hint": {
        +        "type": "string"
        +      },
        +      "maestroFallbackReason": {
        +        "const": "non-hittable-coordinate",
        +        "type": "string"
        +      },
        +      "maestroNonHittableCoordinateFallbackAllowed": {
        +        "description": "Whether the direct iOS Maestro coordinate fallback was allowed for this selector.",
        +        "type": "boolean"
        +      },
        +      "maestroNonHittableCoordinateFallbackUsed": {
        +        "description": "Whether the direct iOS Maestro coordinate fallback was actually used.",
        +        "type": "boolean"
        +      },
        +      "message": {
        +        "type": "string"
        +      },
        +      "ref": {
        +        "description": "Snapshot ref without the @ prefix when the target was an @ref.",
        +        "type": "string"
        +      },
        +      "refLabel": {
        +        "type": "string"
        +      },
        +      "referenceHeight": {
        +        "description": "Reference frame height for visualizing the interaction point.",
        +        "type": "number"
        +      },
        +      "referenceWidth": {
        +        "description": "Reference frame width for visualizing the interaction point.",
        +        "type": "number"
        +      },
        +      "requested": {
        +        "description": "Literal text requested by the fill command.",
        +        "type": "string"
        +      },
        +      "resolution": {
        +        "description": "Pre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path.",
        +        "oneOf": [
        +          {
        +            "properties": {
        +              "kind": {
        +                "const": "unique",
        +                "type": "string"
        +              },
        +              "phase": {
        +                "const": "pre-action",
        +                "type": "string"
        +              },
        +              "source": {
        +                "const": "runtime",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "source",
        +              "phase",
        +              "kind"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "alternatives": {
        +                "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.",
        +                "items": {
        +                  "properties": {
        +                    "diagnosticRef": {
        +                      "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        +                      "type": "string"
        +                    },
        +                    "label": {
        +                      "description": "UTF-8 truncated to 256 bytes.",
        +                      "type": "string"
        +                    },
        +                    "role": {
        +                      "description": "UTF-8 truncated to 256 bytes.",
        +                      "type": "string"
        +                    }
        +                  },
        +                  "required": [
        +                    "diagnosticRef"
        +                  ],
        +                  "type": "object"
        +                },
        +                "type": "array"
        +              },
        +              "kind": {
        +                "const": "disambiguated",
        +                "type": "string"
        +              },
        +              "matchCount": {
        +                "description": "Total matches resolveSelectorChain found before disambiguation.",
        +                "type": "number"
        +              },
        +              "phase": {
        +                "const": "pre-action",
        +                "type": "string"
        +              },
        +              "source": {
        +                "const": "runtime",
        +                "type": "string"
        +              },
        +              "tiebreak": {
        +                "description": "The comparison that decided the winner.",
        +                "enum": [
        +                  "visible",
        +                  "deepest",
        +                  "smallest-area",
        +                  "structural-equivalence"
        +                ],
        +                "type": "string"
        +              },
        +              "winnerDiagnostic": {
        +                "properties": {
        +                  "diagnosticRef": {
        +                    "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        +                    "type": "string"
        +                  },
        +                  "label": {
        +                    "description": "UTF-8 truncated to 256 bytes.",
        +                    "type": "string"
        +                  },
        +                  "role": {
        +                    "description": "UTF-8 truncated to 256 bytes.",
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "diagnosticRef"
        +                ],
        +                "type": "object"
        +              }
        +            },
        +            "required": [
        +              "source",
        +              "phase",
        +              "kind",
        +              "matchCount",
        +              "winnerDiagnostic",
        +              "tiebreak"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "kind": {
        +                "const": "exact",
        +                "type": "string"
        +              },
        +              "phase": {
        +                "const": "pre-action",
        +                "type": "string"
        +              },
        +              "source": {
        +                "const": "ref",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "source",
        +              "phase",
        +              "kind"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "kind": {
        +                "const": "label-fallback",
        +                "type": "string"
        +              },
        +              "phase": {
        +                "const": "pre-action",
        +                "type": "string"
        +              },
        +              "source": {
        +                "const": "ref",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "source",
        +              "phase",
        +              "kind"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "kind": {
        +                "const": "not-observed",
        +                "type": "string"
        +              },
        +              "source": {
        +                "const": "direct-ios",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "source",
        +              "kind"
        +            ],
        +            "type": "object"
        +          }
        +        ],
        +        "type": "object"
        +      },
        +      "selector": {
        +        "description": "Selector expression when the target was a selector.",
        +        "type": "string"
        +      },
        +      "selectorChain": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "settle": {
        +        "properties": {
        +          "captures": {
        +            "type": "number"
        +          },
        +          "diff": {
        +            "description": "Settled diff vs the pre-action tree (changed lines only).",
        +            "properties": {
        +              "lines": {
        +                "items": {
        +                  "properties": {
        +                    "kind": {
        +                      "enum": [
        +                        "added",
        +                        "removed"
        +                      ],
        +                      "type": "string"
        +                    },
        +                    "ref": {
        +                      "description": "Plain ref body (e12) for added lines.",
        +                      "type": "string"
        +                    },
        +                    "text": {
        +                      "type": "string"
        +                    }
        +                  },
        +                  "required": [
        +                    "kind",
        +                    "text"
        +                  ],
        +                  "type": "object"
        +                },
        +                "type": "array"
        +              },
        +              "summary": {
        +                "properties": {
        +                  "additions": {
        +                    "type": "number"
        +                  },
        +                  "removals": {
        +                    "type": "number"
        +                  },
        +                  "unchanged": {
        +                    "type": "number"
        +                  }
        +                },
        +                "required": [
        +                  "additions",
        +                  "removals",
        +                  "unchanged"
        +                ],
        +                "type": "object"
        +              },
        +              "truncated": {
        +                "description": "Lines were capped to the response bound.",
        +                "type": "boolean"
        +              }
        +            },
        +            "required": [
        +              "summary",
        +              "lines"
        +            ],
        +            "type": "object"
        +          },
        +          "hint": {
        +            "type": "string"
        +          },
        +          "quietMs": {
        +            "type": "number"
        +          },
        +          "refs": {
        +            "items": {
        +              "properties": {
        +                "ref": {
        +                  "description": "Plain ref body (e12) minted from the stored settled tree.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "ref"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "refsGeneration": {
        +            "description": "Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.",
        +            "type": "number"
        +          },
        +          "settled": {
        +            "description": "Whether the UI held the quiet window before the deadline. false is advisory, not failure.",
        +            "type": "boolean"
        +          },
        +          "surfaceChange": {
        +            "description": "Present when an in-place system surface (web sign-in or Apple Pay sheet) was presented over the app, or left it.",
        +            "properties": {
        +              "disclosure": {
        +                "description": "Agent-facing sentence explaining the surface transition.",
        +                "type": "string"
        +              },
        +              "from": {
        +                "description": "Surface the pre-action baseline described: a host bundle id, or app.",
        +                "type": "string"
        +              },
        +              "to": {
        +                "description": "Surface the post-action capture describes: a host bundle id, or app.",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "from",
        +              "to",
        +              "disclosure"
        +            ],
        +            "type": "object"
        +          },
        +          "tail": {
        +            "description": "Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).",
        +            "items": {
        +              "properties": {
        +                "label": {
        +                  "type": "string"
        +                },
        +                "ref": {
        +                  "description": "Plain ref body (e12) minted from the stored settled tree.",
        +                  "type": "string"
        +                },
        +                "role": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "ref",
        +                "role"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "tailTruncated": {
        +            "description": "Present (true) when tail candidates exceeded the response cap.",
        +            "type": "boolean"
        +          },
        +          "timeoutMs": {
        +            "type": "number"
        +          },
        +          "waitedMs": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "settled",
        +          "waitedMs",
        +          "captures",
        +          "quietMs",
        +          "timeoutMs"
        +        ],
        +        "type": "object"
        +      },
        +      "target": {
        +        "description": "Target identity captured before fill and matched after fill.",
        +        "properties": {
        +          "className": {
        +            "description": "Android class name of the exact field that changed.",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "packageName": {
        +            "description": "Android package name that owns the exact field.",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "rect": {
        +            "description": "Screen-space rectangle of the exact field that changed.",
        +            "properties": {
        +              "height": {
        +                "type": "number"
        +              },
        +              "width": {
        +                "type": "number"
        +              },
        +              "x": {
        +                "type": "number"
        +              },
        +              "y": {
        +                "type": "number"
        +              }
        +            },
        +            "required": [
        +              "x",
        +              "y",
        +              "width",
        +              "height"
        +            ],
        +            "type": "object"
        +          },
        +          "resourceId": {
        +            "description": "Android resource id of the exact field that changed.",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          }
        +        },
        +        "required": [
        +          "resourceId",
        +          "className",
        +          "packageName",
        +          "rect"
        +        ],
        +        "type": "object"
        +      },
        +      "targetHittable": {
        +        "type": "boolean"
        +      },
        +      "targetKind": {
        +        "description": "Resolved interaction target kind.",
        +        "enum": [
        +          "point",
        +          "ref",
        +          "selector"
        +        ],
        +        "type": "string"
        +      },
        +      "text": {
        +        "description": "Text submitted to the field.",
        +        "type": "string"
        +      },
        +      "verification": {
        +        "const": "unconfirmed",
        +        "type": "string"
        +      },
        +      "warning": {
        +        "type": "string"
        +      },
        +      "x": {
        +        "description": "Resolved interaction x coordinate when available.",
        +        "type": "number"
        +      },
        +      "y": {
        +        "description": "Resolved interaction y coordinate when available.",
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "targetKind",
        +      "text",
        +      "verification",
        +      "requested",
        +      "before",
        +      "after",
        +      "target"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedhover3 fields changed
      • changedOutput schema / properties / evidence / properties / changedFromBefore / description
        Previous value: -"Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure."New value: +"Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure. With surfaceChange present, no digest comparison is made: it reports that surface transition."
      • addedOutput schema / properties / evidence / properties / surfaceChange
        Added value: +{
        +  "description": "Present when an in-place system surface (web sign-in or Apple Pay sheet) was presented over the app, or left it.",
        +  "properties": {
        +    "disclosure": {
        +      "description": "Agent-facing sentence explaining the surface transition.",
        +      "type": "string"
        +    },
        +    "from": {
        +      "description": "Surface the pre-action baseline described: a host bundle id, or app.",
        +      "type": "string"
        +    },
        +    "to": {
        +      "description": "Surface the post-action capture describes: a host bundle id, or app.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "from",
        +    "to",
        +    "disclosure"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / settle / properties / surfaceChange
        Added value: +{
        +  "description": "Present when an in-place system surface (web sign-in or Apple Pay sheet) was presented over the app, or left it.",
        +  "properties": {
        +    "disclosure": {
        +      "description": "Agent-facing sentence explaining the surface transition.",
        +      "type": "string"
        +    },
        +    "from": {
        +      "description": "Surface the pre-action baseline described: a host bundle id, or app.",
        +      "type": "string"
        +    },
        +    "to": {
        +      "description": "Surface the post-action capture describes: a host bundle id, or app.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "from",
        +    "to",
        +    "disclosure"
        +  ],
        +  "type": "object"
        +}
    • Changedlongpress3 fields changed
      • changedOutput schema / properties / evidence / properties / changedFromBefore / description
        Previous value: -"Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure."New value: +"Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure. With surfaceChange present, no digest comparison is made: it reports that surface transition."
      • addedOutput schema / properties / evidence / properties / surfaceChange
        Added value: +{
        +  "description": "Present when an in-place system surface (web sign-in or Apple Pay sheet) was presented over the app, or left it.",
        +  "properties": {
        +    "disclosure": {
        +      "description": "Agent-facing sentence explaining the surface transition.",
        +      "type": "string"
        +    },
        +    "from": {
        +      "description": "Surface the pre-action baseline described: a host bundle id, or app.",
        +      "type": "string"
        +    },
        +    "to": {
        +      "description": "Surface the post-action capture describes: a host bundle id, or app.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "from",
        +    "to",
        +    "disclosure"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / settle / properties / surfaceChange
        Added value: +{
        +  "description": "Present when an in-place system surface (web sign-in or Apple Pay sheet) was presented over the app, or left it.",
        +  "properties": {
        +    "disclosure": {
        +      "description": "Agent-facing sentence explaining the surface transition.",
        +      "type": "string"
        +    },
        +    "from": {
        +      "description": "Surface the pre-action baseline described: a host bundle id, or app.",
        +      "type": "string"
        +    },
        +    "to": {
        +      "description": "Surface the post-action capture describes: a host bundle id, or app.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "from",
        +    "to",
        +    "disclosure"
        +  ],
        +  "type": "object"
        +}
    • Changedorientation2 fields changed
      • addedOutput schema / properties / confirmed
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / warning
        Added value: +{
        +  "type": "string"
        +}
    • Changedpress3 fields changed
      • changedOutput schema / properties / evidence / properties / changedFromBefore / description
        Previous value: -"Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure."New value: +"Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure. With surfaceChange present, no digest comparison is made: it reports that surface transition."
      • addedOutput schema / properties / evidence / properties / surfaceChange
        Added value: +{
        +  "description": "Present when an in-place system surface (web sign-in or Apple Pay sheet) was presented over the app, or left it.",
        +  "properties": {
        +    "disclosure": {
        +      "description": "Agent-facing sentence explaining the surface transition.",
        +      "type": "string"
        +    },
        +    "from": {
        +      "description": "Surface the pre-action baseline described: a host bundle id, or app.",
        +      "type": "string"
        +    },
        +    "to": {
        +      "description": "Surface the post-action capture describes: a host bundle id, or app.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "from",
        +    "to",
        +    "disclosure"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / settle / properties / surfaceChange
        Added value: +{
        +  "description": "Present when an in-place system surface (web sign-in or Apple Pay sheet) was presented over the app, or left it.",
        +  "properties": {
        +    "disclosure": {
        +      "description": "Agent-facing sentence explaining the surface transition.",
        +      "type": "string"
        +    },
        +    "from": {
        +      "description": "Surface the pre-action baseline described: a host bundle id, or app.",
        +      "type": "string"
        +    },
        +    "to": {
        +      "description": "Surface the post-action capture describes: a host bundle id, or app.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "from",
        +    "to",
        +    "disclosure"
        +  ],
        +  "type": "object"
        +}
    • Changedrecord1 field changed
      • changedOutput schema / oneOf
        Previous value: -[
        -  {
        -    "properties": {
        -      "activeSessionApp": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "outPath": {
        -        "type": "string"
        -      },
        -      "recordOnlySession": {
        -        "type": "boolean"
        -      },
        -      "recording": {
        -        "const": "started",
        -        "type": "string"
        -      },
        -      "recordingBackend": {
        -        "type": "string"
        -      },
        -      "recordingScope": {
        -        "type": "string"
        -      },
        -      "sessionStateDir": {
        -        "type": "string"
        -      },
        -      "showTouches": {
        -        "type": "boolean"
        -      }
        -    },
        -    "required": [
        -      "recording",
        -      "outPath",
        -      "sessionStateDir",
        -      "showTouches"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "activeSessionApp": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "artifacts": {
        -        "items": {
        -          "properties": {
        -            "artifactType": {
        -              "type": "string"
        -            },
        -            "field": {
        -              "type": "string"
        -            },
        -            "fileName": {
        -              "type": "string"
        -            },
        -            "localPath": {
        -              "type": "string"
        -            },
        -            "path": {
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "field"
        -          ],
        -          "type": "object"
        -        },
        -        "type": "array"
        -      },
        -      "chunks": {
        -        "items": {
        -          "additionalProperties": true,
        -          "type": "object"
        -        },
        -        "type": "array"
        -      },
        -      "durationMs": {
        -        "type": "number"
        -      },
        -      "outPath": {
        -        "type": "string"
        -      },
        -      "overlayWarning": {
        -        "type": "string"
        -      },
        -      "recordOnlySession": {
        -        "type": "boolean"
        -      },
        -      "recording": {
        -        "const": "stopped",
        -        "type": "string"
        -      },
        -      "recordingBackend": {
        -        "type": "string"
        -      },
        -      "recordingScope": {
        -        "type": "string"
        -      },
        -      "showTouches": {
        -        "type": "boolean"
        -      },
        -      "telemetryPath": {
        -        "type": "string"
        -      },
        -      "warning": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "recording",
        -      "outPath",
        -      "artifacts",
        -      "durationMs",
        -      "showTouches"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "properties": {
        +      "activeSessionApp": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "outPath": {
        +        "type": "string"
        +      },
        +      "recordOnlySession": {
        +        "type": "boolean"
        +      },
        +      "recording": {
        +        "const": "started",
        +        "type": "string"
        +      },
        +      "recordingBackend": {
        +        "type": "string"
        +      },
        +      "recordingScope": {
        +        "type": "string"
        +      },
        +      "sessionStateDir": {
        +        "type": "string"
        +      },
        +      "showTouches": {
        +        "type": "boolean"
        +      }
        +    },
        +    "required": [
        +      "recording",
        +      "outPath",
        +      "sessionStateDir",
        +      "showTouches"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "activeSessionApp": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "artifacts": {
        +        "items": {
        +          "properties": {
        +            "artifactType": {
        +              "type": "string"
        +            },
        +            "field": {
        +              "type": "string"
        +            },
        +            "fileName": {
        +              "type": "string"
        +            },
        +            "localPath": {
        +              "type": "string"
        +            },
        +            "path": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "field"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "capturedDurationMs": {
        +        "type": "number"
        +      },
        +      "chunks": {
        +        "items": {
        +          "additionalProperties": true,
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "durationMs": {
        +        "type": "number"
        +      },
        +      "nativePathDisposition": {
        +        "description": "What became of the artifact path the recorder writes to: retirable while it still owes a removal, retired once that removal was verified. ADR 0024 reserves pending.",
        +        "enum": [
        +          "pending",
        +          "retirable",
        +          "retired"
        +        ],
        +        "type": "string"
        +      },
        +      "outPath": {
        +        "type": "string"
        +      },
        +      "overlayWarning": {
        +        "type": "string"
        +      },
        +      "recordOnlySession": {
        +        "type": "boolean"
        +      },
        +      "recorder": {
        +        "description": "What the recorder was observed doing when the recording was stopped: confirmed, or lost when the session holding it died. ADR 0024 reserves unconfirmed for the step that gains the probe.",
        +        "enum": [
        +          "confirmed",
        +          "unconfirmed",
        +          "lost"
        +        ],
        +        "type": "string"
        +      },
        +      "recording": {
        +        "const": "stopped",
        +        "type": "string"
        +      },
        +      "recordingBackend": {
        +        "type": "string"
        +      },
        +      "recordingScope": {
        +        "type": "string"
        +      },
        +      "showTouches": {
        +        "type": "boolean"
        +      },
        +      "telemetryPath": {
        +        "type": "string"
        +      },
        +      "warning": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "recording",
        +      "outPath",
        +      "artifacts",
        +      "durationMs",
        +      "showTouches"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedscroll6 fields changed
      • addedInput schema / properties / until
        Added value: +{
        +  "description": "Repeat scroll passes until this selector is visible on screen, then stop. Not valid with the top/bottom edge directions, which carry their own stop condition.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / keyboardAvoided
        Added value: +{
        +  "description": "Present only when an on-screen keyboard forced the swipe into the band above it; the reported pixels were planned against the shorter referenceHeight.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / keyboardMinY
        Added value: +{
        +  "description": "Where the keyboard began, in the same unit as the gesture coordinates. Clipped scrolls only.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / passes / description
        Previous value: -"Edge scrolls only: how many scroll-and-check passes ran."New value: +"Edge and until scrolls only: how many scroll-and-check passes ran."
      • addedOutput schema / properties / settle / properties / surfaceChange
        Added value: +{
        +  "description": "Present when an in-place system surface (web sign-in or Apple Pay sheet) was presented over the app, or left it.",
        +  "properties": {
        +    "disclosure": {
        +      "description": "Agent-facing sentence explaining the surface transition.",
        +      "type": "string"
        +    },
        +    "from": {
        +      "description": "Surface the pre-action baseline described: a host bundle id, or app.",
        +      "type": "string"
        +    },
        +    "to": {
        +      "description": "Surface the post-action capture describes: a host bundle id, or app.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "from",
        +    "to",
        +    "disclosure"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / until
        Added value: +{
        +  "description": "Until scrolls only: the selector the passes stopped on.",
        +  "type": "string"
        +}
  9. 56 tool updatesv0.21.0
    • Changedalert3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedapp-switcher3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedapps3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedappstate3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedartifacts3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedaudio3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedback3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedbatch4 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • addedInput schema / properties / steps / items / properties / input / commandInputFor
        Added value: +"command"
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedboot3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedcapabilities3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedclick3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedclipboard3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedclose3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changeddebug3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changeddevices3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changeddiff3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changeddoctor3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedevents3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedfill4 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / text / description
        Previous value: -"Text to enter into the target."New value: +"Text to enter into the target. Pass \"\" to clear it."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedfind3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedfocus3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedgesture3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedget3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedhome3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedhover3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedinstall3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedinstall-from-source3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedis4 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / predicate / enum
        Previous value: -[
        -  "visible",
        -  "hidden",
        -  "exists",
        -  "editable",
        -  "selected",
        -  "focused",
        -  "text"
        -]New value: +[
        +  "visible",
        +  "hidden",
        +  "exists",
        +  "absent",
        +  "editable",
        +  "selected",
        +  "focused",
        +  "text"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedkeyboard3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedlogs3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedlongpress3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedmetro3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changednetwork3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedopen4 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • addedInput schema / properties / timeoutMs
        Added value: +{
        +  "description": "Startup budget in milliseconds. Bounds the Simulator boot wait, so a never-booted Simulator can finish its first-boot migration; omit for the default startup behavior.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedorientation3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedperf3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedpress3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedpush3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedreact-native3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedrecord3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedreinstall3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedreplay3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedscreenshot4 fields changed
      • addedInput schema / properties / cropOn
        Added value: +{
        +  "description": "Selector expression; the capture is cropped to the frame the selector resolves on the same screen.",
        +  "type": "string"
        +}
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedscroll3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedsession3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedsettings3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedshutdown3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedsnapshot3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedswipe3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedtest3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedtrace3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedtrigger-app-event3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedtv-remote3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedtype3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedviewport3 fields changed
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
    • Changedwait5 fields changed
      • addedInput schema / properties / absent
        Added value: +{
        +  "type": "string"
        +}
      • changedInput schema / properties / device / description
        Previous value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)."
      • changedInput schema / properties / kind / enum
        Previous value: -[
        -  "duration",
        -  "text",
        -  "ref",
        -  "selector",
        -  "stable"
        -]New value: +[
        +  "duration",
        +  "text",
        +  "ref",
        +  "selector",
        +  "absent",
        +  "stable"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector."
      • changedInput schema / properties / udid / description
        Previous value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
  10. 56 tool updatesv0.20.10
    • Changedalert8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedapp-switcher8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedapps8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedappstate8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedartifacts8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedaudio8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedback8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedbatch8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedboot8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedcapabilities8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedclick8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedclipboard8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedclose8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changeddebug8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changeddevices8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changeddiff8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changeddoctor8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedevents8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedfill8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedfind9 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
      • removedOutput schema / properties / settle
        Removed value: -{
        -  "properties": {
        -    "captures": {
        -      "type": "number"
        -    },
        -    "diff": {
        -      "description": "Settled diff vs the pre-action tree (changed lines only).",
        -      "properties": {
        -        "lines": {
        -          "items": {
        -            "properties": {
        -              "kind": {
        -                "enum": [
        -                  "added",
        -                  "removed"
        -                ],
        -                "type": "string"
        -              },
        -              "ref": {
        -                "description": "Plain ref body (e12) for added lines.",
        -                "type": "string"
        -              },
        -              "text": {
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "kind",
        -              "text"
        -            ],
        -            "type": "object"
        -          },
        -          "type": "array"
        -        },
        -        "summary": {
        -          "properties": {
        -            "additions": {
        -              "type": "number"
        -            },
        -            "removals": {
        -              "type": "number"
        -            },
        -            "unchanged": {
        -              "type": "number"
        -            }
        -          },
        -          "required": [
        -            "additions",
        -            "removals",
        -            "unchanged"
        -          ],
        -          "type": "object"
        -        },
        -        "truncated": {
        -          "description": "Lines were capped to the response bound.",
        -          "type": "boolean"
        -        }
        -      },
        -      "required": [
        -        "summary",
        -        "lines"
        -      ],
        -      "type": "object"
        -    },
        -    "hint": {
        -      "type": "string"
        -    },
        -    "quietMs": {
        -      "type": "number"
        -    },
        -    "refs": {
        -      "items": {
        -        "properties": {
        -          "ref": {
        -            "description": "Plain ref body (e12) minted from the stored settled tree.",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "ref"
        -        ],
        -        "type": "object"
        -      },
        -      "type": "array"
        -    },
        -    "refsGeneration": {
        -      "description": "Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.",
        -      "type": "number"
        -    },
        -    "settled": {
        -      "description": "Whether the UI held the quiet window before the deadline. false is advisory, not failure.",
        -      "type": "boolean"
        -    },
        -    "tail": {
        -      "description": "Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).",
        -      "items": {
        -        "properties": {
        -          "label": {
        -            "type": "string"
        -          },
        -          "ref": {
        -            "description": "Plain ref body (e12) minted from the stored settled tree.",
        -            "type": "string"
        -          },
        -          "role": {
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "ref",
        -          "role"
        -        ],
        -        "type": "object"
        -      },
        -      "type": "array"
        -    },
        -    "tailTruncated": {
        -      "description": "Present (true) when tail candidates exceeded the response cap.",
        -      "type": "boolean"
        -    },
        -    "timeoutMs": {
        -      "type": "number"
        -    },
        -    "waitedMs": {
        -      "type": "number"
        -    }
        -  },
        -  "required": [
        -    "settled",
        -    "waitedMs",
        -    "captures",
        -    "quietMs",
        -    "timeoutMs"
        -  ],
        -  "type": "object"
        -}
    • Changedfocus8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedgesture8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedget8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedhome8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedhover8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedinstall8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedinstall-from-source8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedis8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedkeyboard8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedlogs8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedlongpress8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedmetro10 fields changed
      • removedInput schema / properties / bearerToken
        Removed value: -{
        -  "type": "string"
        -}
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / proxyBaseUrl
        Removed value: -{
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changednetwork8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedopen8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedorientation8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedperf10 fields changed
      • changedInput schema / properties / area / enum
        Previous value: -[
        -  "metrics",
        -  "frames",
        -  "memory",
        -  "cpu",
        -  "trace"
        -]New value: +[
        +  "frames",
        +  "memory",
        +  "cpu",
        +  "trace"
        +]
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
      • addedInput schema / required
        Added value: +[
        +  "area"
        +]
    • Changedpress8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedpush8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedreact-native8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedrecord8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedreinstall8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedreplay8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedscreenshot8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedscroll9 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "amount": {
        +      "type": "number"
        +    },
        +    "direction": {
        +      "enum": [
        +        "up",
        +        "down",
        +        "left",
        +        "right"
        +      ],
        +      "type": "string"
        +    },
        +    "durationMs": {
        +      "type": "number"
        +    },
        +    "edge": {
        +      "enum": [
        +        "top",
        +        "bottom"
        +      ],
        +      "type": "string"
        +    },
        +    "message": {
        +      "type": "string"
        +    },
        +    "passes": {
        +      "description": "Edge scrolls only: how many scroll-and-check passes ran.",
        +      "type": "number"
        +    },
        +    "pixels": {
        +      "type": "number"
        +    },
        +    "settle": {
        +      "properties": {
        +        "captures": {
        +          "type": "number"
        +        },
        +        "diff": {
        +          "description": "Settled diff vs the pre-action tree (changed lines only).",
        +          "properties": {
        +            "lines": {
        +              "items": {
        +                "properties": {
        +                  "kind": {
        +                    "enum": [
        +                      "added",
        +                      "removed"
        +                    ],
        +                    "type": "string"
        +                  },
        +                  "ref": {
        +                    "description": "Plain ref body (e12) for added lines.",
        +                    "type": "string"
        +                  },
        +                  "text": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "kind",
        +                  "text"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "summary": {
        +              "properties": {
        +                "additions": {
        +                  "type": "number"
        +                },
        +                "removals": {
        +                  "type": "number"
        +                },
        +                "unchanged": {
        +                  "type": "number"
        +                }
        +              },
        +              "required": [
        +                "additions",
        +                "removals",
        +                "unchanged"
        +              ],
        +              "type": "object"
        +            },
        +            "truncated": {
        +              "description": "Lines were capped to the response bound.",
        +              "type": "boolean"
        +            }
        +          },
        +          "required": [
        +            "summary",
        +            "lines"
        +          ],
        +          "type": "object"
        +        },
        +        "hint": {
        +          "type": "string"
        +        },
        +        "quietMs": {
        +          "type": "number"
        +        },
        +        "refs": {
        +          "items": {
        +            "properties": {
        +              "ref": {
        +                "description": "Plain ref body (e12) minted from the stored settled tree.",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "ref"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "refsGeneration": {
        +          "description": "Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.",
        +          "type": "number"
        +        },
        +        "settled": {
        +          "description": "Whether the UI held the quiet window before the deadline. false is advisory, not failure.",
        +          "type": "boolean"
        +        },
        +        "tail": {
        +          "description": "Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).",
        +          "items": {
        +            "properties": {
        +              "label": {
        +                "type": "string"
        +              },
        +              "ref": {
        +                "description": "Plain ref body (e12) minted from the stored settled tree.",
        +                "type": "string"
        +              },
        +              "role": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "ref",
        +              "role"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "tailTruncated": {
        +          "description": "Present (true) when tail candidates exceeded the response cap.",
        +          "type": "boolean"
        +        },
        +        "timeoutMs": {
        +          "type": "number"
        +        },
        +        "waitedMs": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "settled",
        +        "waitedMs",
        +        "captures",
        +        "quietMs",
        +        "timeoutMs"
        +      ],
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "direction"
        +  ],
        +  "type": "object"
        +}
    • Changedsession8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedsettings8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedshutdown8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedsnapshot8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedswipe8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedtest8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedtrace8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedtrigger-app-event8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedtv-remote8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedtype8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedviewport8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
    • Changedwait8 fields changed
      • removedInput schema / properties / cwd
        Removed value: -{
        -  "description": "Working directory for command execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonAuthToken
        Removed value: -{
        -  "description": "Remote daemon auth token.",
        -  "type": "string"
        -}
      • removedInput schema / properties / daemonBaseUrl
        Removed value: -{
        -  "description": "Remote daemon base URL.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosSimulatorDeviceSet
        Removed value: -{
        -  "description": "iOS simulator device-set path used for device resolution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestDerivedDataPath
        Removed value: -{
        -  "description": "Derived data path for external iOS XCTest runner execution.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestEnvDir
        Removed value: -{
        -  "description": "Writable directory for iOS XCTest runner env overlays.",
        -  "type": "string"
        -}
      • removedInput schema / properties / iosXctestrunFile
        Removed value: -{
        -  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        -  "type": "string"
        -}
      • removedInput schema / properties / stateDir
        Removed value: -{
        -  "description": "Agent-device state directory.",
        -  "type": "string"
        -}
  11. 57 tool updatesv0.20.9
    • Changedalert1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedapp-switcher1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedapps1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedappstate1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedartifacts1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedaudio1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedback1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedbatch2 fields changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / steps / items / properties / command / enum
        Previous value: -[
        -  "devices",
        -  "capabilities",
        -  "doctor",
        -  "apps",
        -  "boot",
        -  "shutdown",
        -  "appstate",
        -  "perf",
        -  "logs",
        -  "network",
        -  "audio",
        -  "test",
        -  "clipboard",
        -  "keyboard",
        -  "install",
        -  "reinstall",
        -  "push",
        -  "trigger-app-event",
        -  "open",
        -  "close",
        -  "snapshot",
        -  "diff",
        -  "wait",
        -  "alert",
        -  "settings",
        -  "react-native",
        -  "record",
        -  "trace",
        -  "find",
        -  "click",
        -  "fill",
        -  "longpress",
        -  "press",
        -  "type",
        -  "get",
        -  "is",
        -  "back",
        -  "gesture",
        -  "home",
        -  "tv-remote",
        -  "orientation",
        -  "scroll",
        -  "swipe",
        -  "focus",
        -  "screenshot",
        -  "app-switcher",
        -  "install-from-source"
        -]New value: +[
        +  "devices",
        +  "capabilities",
        +  "doctor",
        +  "apps",
        +  "boot",
        +  "shutdown",
        +  "appstate",
        +  "perf",
        +  "logs",
        +  "network",
        +  "audio",
        +  "test",
        +  "clipboard",
        +  "keyboard",
        +  "install",
        +  "reinstall",
        +  "push",
        +  "trigger-app-event",
        +  "open",
        +  "close",
        +  "snapshot",
        +  "diff",
        +  "wait",
        +  "alert",
        +  "settings",
        +  "react-native",
        +  "record",
        +  "trace",
        +  "find",
        +  "click",
        +  "fill",
        +  "longpress",
        +  "hover",
        +  "press",
        +  "type",
        +  "get",
        +  "is",
        +  "back",
        +  "gesture",
        +  "home",
        +  "tv-remote",
        +  "orientation",
        +  "scroll",
        +  "swipe",
        +  "focus",
        +  "screenshot",
        +  "app-switcher",
        +  "install-from-source"
        +]
    • Changedboot2 fields changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedOutput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web"
        +]
    • Changedcapabilities1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedclick2 fields changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedOutput schema / properties / resolution / oneOf
        Previous value: -[
        -  {
        -    "properties": {
        -      "kind": {
        -        "const": "unique",
        -        "type": "string"
        -      },
        -      "phase": {
        -        "const": "pre-action",
        -        "type": "string"
        -      },
        -      "source": {
        -        "const": "runtime",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "source",
        -      "phase",
        -      "kind"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "alternatives": {
        -        "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.",
        -        "items": {
        -          "properties": {
        -            "diagnosticRef": {
        -              "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        -              "type": "string"
        -            },
        -            "label": {
        -              "description": "UTF-8 truncated to 256 bytes.",
        -              "type": "string"
        -            },
        -            "role": {
        -              "description": "UTF-8 truncated to 256 bytes.",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "diagnosticRef"
        -          ],
        -          "type": "object"
        -        },
        -        "type": "array"
        -      },
        -      "kind": {
        -        "const": "disambiguated",
        -        "type": "string"
        -      },
        -      "matchCount": {
        -        "description": "Total matches resolveSelectorChain found before disambiguation.",
        -        "type": "number"
        -      },
        -      "phase": {
        -        "const": "pre-action",
        -        "type": "string"
        -      },
        -      "source": {
        -        "const": "runtime",
        -        "type": "string"
        -      },
        -      "tiebreak": {
        -        "description": "The comparison that decided the winner.",
        -        "enum": [
        -          "visible",
        -          "deepest",
        -          "smallest-area"
        -        ],
        -        "type": "string"
        -      },
        -      "winnerDiagnostic": {
        -        "properties": {
        -          "diagnosticRef": {
        -            "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        -            "type": "string"
        -          },
        -          "label": {
        -            "description": "UTF-8 truncated to 256 bytes.",
        -            "type": "string"
        -          },
        -          "role": {
        -            "description": "UTF-8 truncated to 256 bytes.",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "diagnosticRef"
        -        ],
        -        "type": "object"
        -      }
        -    },
        -    "required": [
        -      "source",
        -      "phase",
        -      "kind",
        -      "matchCount",
        -      "winnerDiagnostic",
        -      "tiebreak"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "kind": {
        -        "const": "exact",
        -        "type": "string"
        -      },
        -      "phase": {
        -        "const": "pre-action",
        -        "type": "string"
        -      },
        -      "source": {
        -        "const": "ref",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "source",
        -      "phase",
        -      "kind"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "kind": {
        -        "const": "label-fallback",
        -        "type": "string"
        -      },
        -      "phase": {
        -        "const": "pre-action",
        -        "type": "string"
        -      },
        -      "source": {
        -        "const": "ref",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "source",
        -      "phase",
        -      "kind"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "kind": {
        -        "const": "not-observed",
        -        "type": "string"
        -      },
        -      "source": {
        -        "const": "direct-ios",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "source",
        -      "kind"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "properties": {
        +      "kind": {
        +        "const": "unique",
        +        "type": "string"
        +      },
        +      "phase": {
        +        "const": "pre-action",
        +        "type": "string"
        +      },
        +      "source": {
        +        "const": "runtime",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "source",
        +      "phase",
        +      "kind"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "alternatives": {
        +        "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.",
        +        "items": {
        +          "properties": {
        +            "diagnosticRef": {
        +              "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        +              "type": "string"
        +            },
        +            "label": {
        +              "description": "UTF-8 truncated to 256 bytes.",
        +              "type": "string"
        +            },
        +            "role": {
        +              "description": "UTF-8 truncated to 256 bytes.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "diagnosticRef"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "kind": {
        +        "const": "disambiguated",
        +        "type": "string"
        +      },
        +      "matchCount": {
        +        "description": "Total matches resolveSelectorChain found before disambiguation.",
        +        "type": "number"
        +      },
        +      "phase": {
        +        "const": "pre-action",
        +        "type": "string"
        +      },
        +      "source": {
        +        "const": "runtime",
        +        "type": "string"
        +      },
        +      "tiebreak": {
        +        "description": "The comparison that decided the winner.",
        +        "enum": [
        +          "visible",
        +          "deepest",
        +          "smallest-area",
        +          "structural-equivalence"
        +        ],
        +        "type": "string"
        +      },
        +      "winnerDiagnostic": {
        +        "properties": {
        +          "diagnosticRef": {
        +            "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        +            "type": "string"
        +          },
        +          "label": {
        +            "description": "UTF-8 truncated to 256 bytes.",
        +            "type": "string"
        +          },
        +          "role": {
        +            "description": "UTF-8 truncated to 256 bytes.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "diagnosticRef"
        +        ],
        +        "type": "object"
        +      }
        +    },
        +    "required": [
        +      "source",
        +      "phase",
        +      "kind",
        +      "matchCount",
        +      "winnerDiagnostic",
        +      "tiebreak"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "kind": {
        +        "const": "exact",
        +        "type": "string"
        +      },
        +      "phase": {
        +        "const": "pre-action",
        +        "type": "string"
        +      },
        +      "source": {
        +        "const": "ref",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "source",
        +      "phase",
        +      "kind"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "kind": {
        +        "const": "label-fallback",
        +        "type": "string"
        +      },
        +      "phase": {
        +        "const": "pre-action",
        +        "type": "string"
        +      },
        +      "source": {
        +        "const": "ref",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "source",
        +      "phase",
        +      "kind"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "kind": {
        +        "const": "not-observed",
        +        "type": "string"
        +      },
        +      "source": {
        +        "const": "direct-ios",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "source",
        +      "kind"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedclipboard1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedclose1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changeddebug1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changeddevices2 fields changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedOutput schema / properties / devices / items / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web"
        +]
    • Changeddiff1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changeddoctor1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedevents1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedfill5 fields changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedOutput schema / description
        Added value: +"Fill response. Android may return target-bound unconfirmed evidence when the exact app-owned field changed but formatting prevented raw equality."
      • addedOutput schema / oneOf
        Added value: +[
        +  {
        +    "not": {
        +      "properties": {},
        +      "required": [
        +        "verification"
        +      ],
        +      "type": "object"
        +    },
        +    "properties": {
        +      "cost": {
        +        "properties": {
        +          "nodeCount": {
        +            "description": "Number of nodes in the original node tree when the response carries one.",
        +            "type": "number"
        +          },
        +          "runnerRoundTrips": {
        +            "description": "Number of real runner round-trips made while serving the request.",
        +            "type": "number"
        +          },
        +          "wallClockMs": {
        +            "description": "Total wall-clock time for the request in milliseconds.",
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "wallClockMs",
        +          "runnerRoundTrips"
        +        ],
        +        "type": "object"
        +      },
        +      "delayMs": {
        +        "description": "Delay between typed characters in milliseconds.",
        +        "type": "number"
        +      },
        +      "evidence": {
        +        "properties": {
        +          "changedFromBefore": {
        +            "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.",
        +            "type": "boolean"
        +          },
        +          "digest": {
        +            "description": "Order-independent digest of the post-action node multiset.",
        +            "type": "string"
        +          },
        +          "foregroundApp": {
        +            "description": "Foreground app bundle id or name, when the capture carries it.",
        +            "type": "string"
        +          },
        +          "interactiveNodeCount": {
        +            "description": "Subset of nodeCount the platform reports as hittable.",
        +            "type": "number"
        +          },
        +          "nodeCount": {
        +            "description": "Node count in the post-action interactive-only capture.",
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "nodeCount",
        +          "interactiveNodeCount",
        +          "digest",
        +          "changedFromBefore"
        +        ],
        +        "type": "object"
        +      },
        +      "hint": {
        +        "type": "string"
        +      },
        +      "maestroFallbackReason": {
        +        "const": "non-hittable-coordinate",
        +        "type": "string"
        +      },
        +      "maestroNonHittableCoordinateFallbackAllowed": {
        +        "description": "Whether the direct iOS Maestro coordinate fallback was allowed for this selector.",
        +        "type": "boolean"
        +      },
        +      "maestroNonHittableCoordinateFallbackUsed": {
        +        "description": "Whether the direct iOS Maestro coordinate fallback was actually used.",
        +        "type": "boolean"
        +      },
        +      "message": {
        +        "type": "string"
        +      },
        +      "ref": {
        +        "description": "Snapshot ref without the @ prefix when the target was an @ref.",
        +        "type": "string"
        +      },
        +      "refLabel": {
        +        "type": "string"
        +      },
        +      "referenceHeight": {
        +        "description": "Reference frame height for visualizing the interaction point.",
        +        "type": "number"
        +      },
        +      "referenceWidth": {
        +        "description": "Reference frame width for visualizing the interaction point.",
        +        "type": "number"
        +      },
        +      "resolution": {
        +        "description": "Pre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path.",
        +        "oneOf": [
        +          {
        +            "properties": {
        +              "kind": {
        +                "const": "unique",
        +                "type": "string"
        +              },
        +              "phase": {
        +                "const": "pre-action",
        +                "type": "string"
        +              },
        +              "source": {
        +                "const": "runtime",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "source",
        +              "phase",
        +              "kind"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "alternatives": {
        +                "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.",
        +                "items": {
        +                  "properties": {
        +                    "diagnosticRef": {
        +                      "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        +                      "type": "string"
        +                    },
        +                    "label": {
        +                      "description": "UTF-8 truncated to 256 bytes.",
        +                      "type": "string"
        +                    },
        +                    "role": {
        +                      "description": "UTF-8 truncated to 256 bytes.",
        +                      "type": "string"
        +                    }
        +                  },
        +                  "required": [
        +                    "diagnosticRef"
        +                  ],
        +                  "type": "object"
        +                },
        +                "type": "array"
        +              },
        +              "kind": {
        +                "const": "disambiguated",
        +                "type": "string"
        +              },
        +              "matchCount": {
        +                "description": "Total matches resolveSelectorChain found before disambiguation.",
        +                "type": "number"
        +              },
        +              "phase": {
        +                "const": "pre-action",
        +                "type": "string"
        +              },
        +              "source": {
        +                "const": "runtime",
        +                "type": "string"
        +              },
        +              "tiebreak": {
        +                "description": "The comparison that decided the winner.",
        +                "enum": [
        +                  "visible",
        +                  "deepest",
        +                  "smallest-area",
        +                  "structural-equivalence"
        +                ],
        +                "type": "string"
        +              },
        +              "winnerDiagnostic": {
        +                "properties": {
        +                  "diagnosticRef": {
        +                    "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        +                    "type": "string"
        +                  },
        +                  "label": {
        +                    "description": "UTF-8 truncated to 256 bytes.",
        +                    "type": "string"
        +                  },
        +                  "role": {
        +                    "description": "UTF-8 truncated to 256 bytes.",
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "diagnosticRef"
        +                ],
        +                "type": "object"
        +              }
        +            },
        +            "required": [
        +              "source",
        +              "phase",
        +              "kind",
        +              "matchCount",
        +              "winnerDiagnostic",
        +              "tiebreak"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "kind": {
        +                "const": "exact",
        +                "type": "string"
        +              },
        +              "phase": {
        +                "const": "pre-action",
        +                "type": "string"
        +              },
        +              "source": {
        +                "const": "ref",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "source",
        +              "phase",
        +              "kind"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "kind": {
        +                "const": "label-fallback",
        +                "type": "string"
        +              },
        +              "phase": {
        +                "const": "pre-action",
        +                "type": "string"
        +              },
        +              "source": {
        +                "const": "ref",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "source",
        +              "phase",
        +              "kind"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "kind": {
        +                "const": "not-observed",
        +                "type": "string"
        +              },
        +              "source": {
        +                "const": "direct-ios",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "source",
        +              "kind"
        +            ],
        +            "type": "object"
        +          }
        +        ],
        +        "type": "object"
        +      },
        +      "selector": {
        +        "description": "Selector expression when the target was a selector.",
        +        "type": "string"
        +      },
        +      "selectorChain": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "settle": {
        +        "properties": {
        +          "captures": {
        +            "type": "number"
        +          },
        +          "diff": {
        +            "description": "Settled diff vs the pre-action tree (changed lines only).",
        +            "properties": {
        +              "lines": {
        +                "items": {
        +                  "properties": {
        +                    "kind": {
        +                      "enum": [
        +                        "added",
        +                        "removed"
        +                      ],
        +                      "type": "string"
        +                    },
        +                    "ref": {
        +                      "description": "Plain ref body (e12) for added lines.",
        +                      "type": "string"
        +                    },
        +                    "text": {
        +                      "type": "string"
        +                    }
        +                  },
        +                  "required": [
        +                    "kind",
        +                    "text"
        +                  ],
        +                  "type": "object"
        +                },
        +                "type": "array"
        +              },
        +              "summary": {
        +                "properties": {
        +                  "additions": {
        +                    "type": "number"
        +                  },
        +                  "removals": {
        +                    "type": "number"
        +                  },
        +                  "unchanged": {
        +                    "type": "number"
        +                  }
        +                },
        +                "required": [
        +                  "additions",
        +                  "removals",
        +                  "unchanged"
        +                ],
        +                "type": "object"
        +              },
        +              "truncated": {
        +                "description": "Lines were capped to the response bound.",
        +                "type": "boolean"
        +              }
        +            },
        +            "required": [
        +              "summary",
        +              "lines"
        +            ],
        +            "type": "object"
        +          },
        +          "hint": {
        +            "type": "string"
        +          },
        +          "quietMs": {
        +            "type": "number"
        +          },
        +          "refs": {
        +            "items": {
        +              "properties": {
        +                "ref": {
        +                  "description": "Plain ref body (e12) minted from the stored settled tree.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "ref"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "refsGeneration": {
        +            "description": "Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.",
        +            "type": "number"
        +          },
        +          "settled": {
        +            "description": "Whether the UI held the quiet window before the deadline. false is advisory, not failure.",
        +            "type": "boolean"
        +          },
        +          "tail": {
        +            "description": "Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).",
        +            "items": {
        +              "properties": {
        +                "label": {
        +                  "type": "string"
        +                },
        +                "ref": {
        +                  "description": "Plain ref body (e12) minted from the stored settled tree.",
        +                  "type": "string"
        +                },
        +                "role": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "ref",
        +                "role"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "tailTruncated": {
        +            "description": "Present (true) when tail candidates exceeded the response cap.",
        +            "type": "boolean"
        +          },
        +          "timeoutMs": {
        +            "type": "number"
        +          },
        +          "waitedMs": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "settled",
        +          "waitedMs",
        +          "captures",
        +          "quietMs",
        +          "timeoutMs"
        +        ],
        +        "type": "object"
        +      },
        +      "targetHittable": {
        +        "type": "boolean"
        +      },
        +      "targetKind": {
        +        "description": "Resolved interaction target kind.",
        +        "enum": [
        +          "point",
        +          "ref",
        +          "selector"
        +        ],
        +        "type": "string"
        +      },
        +      "text": {
        +        "description": "Text submitted to the field.",
        +        "type": "string"
        +      },
        +      "warning": {
        +        "type": "string"
        +      },
        +      "x": {
        +        "description": "Resolved interaction x coordinate when available.",
        +        "type": "number"
        +      },
        +      "y": {
        +        "description": "Resolved interaction y coordinate when available.",
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "targetKind",
        +      "text"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "after": {
        +        "description": "Raw target text captured after the fill.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "before": {
        +        "description": "Raw target text captured before the fill.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "cost": {
        +        "properties": {
        +          "nodeCount": {
        +            "description": "Number of nodes in the original node tree when the response carries one.",
        +            "type": "number"
        +          },
        +          "runnerRoundTrips": {
        +            "description": "Number of real runner round-trips made while serving the request.",
        +            "type": "number"
        +          },
        +          "wallClockMs": {
        +            "description": "Total wall-clock time for the request in milliseconds.",
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "wallClockMs",
        +          "runnerRoundTrips"
        +        ],
        +        "type": "object"
        +      },
        +      "delayMs": {
        +        "description": "Delay between typed characters in milliseconds.",
        +        "type": "number"
        +      },
        +      "evidence": {
        +        "properties": {
        +          "changedFromBefore": {
        +            "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.",
        +            "type": "boolean"
        +          },
        +          "digest": {
        +            "description": "Order-independent digest of the post-action node multiset.",
        +            "type": "string"
        +          },
        +          "foregroundApp": {
        +            "description": "Foreground app bundle id or name, when the capture carries it.",
        +            "type": "string"
        +          },
        +          "interactiveNodeCount": {
        +            "description": "Subset of nodeCount the platform reports as hittable.",
        +            "type": "number"
        +          },
        +          "nodeCount": {
        +            "description": "Node count in the post-action interactive-only capture.",
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "nodeCount",
        +          "interactiveNodeCount",
        +          "digest",
        +          "changedFromBefore"
        +        ],
        +        "type": "object"
        +      },
        +      "hint": {
        +        "type": "string"
        +      },
        +      "maestroFallbackReason": {
        +        "const": "non-hittable-coordinate",
        +        "type": "string"
        +      },
        +      "maestroNonHittableCoordinateFallbackAllowed": {
        +        "description": "Whether the direct iOS Maestro coordinate fallback was allowed for this selector.",
        +        "type": "boolean"
        +      },
        +      "maestroNonHittableCoordinateFallbackUsed": {
        +        "description": "Whether the direct iOS Maestro coordinate fallback was actually used.",
        +        "type": "boolean"
        +      },
        +      "message": {
        +        "type": "string"
        +      },
        +      "ref": {
        +        "description": "Snapshot ref without the @ prefix when the target was an @ref.",
        +        "type": "string"
        +      },
        +      "refLabel": {
        +        "type": "string"
        +      },
        +      "referenceHeight": {
        +        "description": "Reference frame height for visualizing the interaction point.",
        +        "type": "number"
        +      },
        +      "referenceWidth": {
        +        "description": "Reference frame width for visualizing the interaction point.",
        +        "type": "number"
        +      },
        +      "requested": {
        +        "description": "Literal text requested by the fill command.",
        +        "type": "string"
        +      },
        +      "resolution": {
        +        "description": "Pre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path.",
        +        "oneOf": [
        +          {
        +            "properties": {
        +              "kind": {
        +                "const": "unique",
        +                "type": "string"
        +              },
        +              "phase": {
        +                "const": "pre-action",
        +                "type": "string"
        +              },
        +              "source": {
        +                "const": "runtime",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "source",
        +              "phase",
        +              "kind"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "alternatives": {
        +                "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.",
        +                "items": {
        +                  "properties": {
        +                    "diagnosticRef": {
        +                      "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        +                      "type": "string"
        +                    },
        +                    "label": {
        +                      "description": "UTF-8 truncated to 256 bytes.",
        +                      "type": "string"
        +                    },
        +                    "role": {
        +                      "description": "UTF-8 truncated to 256 bytes.",
        +                      "type": "string"
        +                    }
        +                  },
        +                  "required": [
        +                    "diagnosticRef"
        +                  ],
        +                  "type": "object"
        +                },
        +                "type": "array"
        +              },
        +              "kind": {
        +                "const": "disambiguated",
        +                "type": "string"
        +              },
        +              "matchCount": {
        +                "description": "Total matches resolveSelectorChain found before disambiguation.",
        +                "type": "number"
        +              },
        +              "phase": {
        +                "const": "pre-action",
        +                "type": "string"
        +              },
        +              "source": {
        +                "const": "runtime",
        +                "type": "string"
        +              },
        +              "tiebreak": {
        +                "description": "The comparison that decided the winner.",
        +                "enum": [
        +                  "visible",
        +                  "deepest",
        +                  "smallest-area",
        +                  "structural-equivalence"
        +                ],
        +                "type": "string"
        +              },
        +              "winnerDiagnostic": {
        +                "properties": {
        +                  "diagnosticRef": {
        +                    "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        +                    "type": "string"
        +                  },
        +                  "label": {
        +                    "description": "UTF-8 truncated to 256 bytes.",
        +                    "type": "string"
        +                  },
        +                  "role": {
        +                    "description": "UTF-8 truncated to 256 bytes.",
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "diagnosticRef"
        +                ],
        +                "type": "object"
        +              }
        +            },
        +            "required": [
        +              "source",
        +              "phase",
        +              "kind",
        +              "matchCount",
        +              "winnerDiagnostic",
        +              "tiebreak"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "kind": {
        +                "const": "exact",
        +                "type": "string"
        +              },
        +              "phase": {
        +                "const": "pre-action",
        +                "type": "string"
        +              },
        +              "source": {
        +                "const": "ref",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "source",
        +              "phase",
        +              "kind"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "kind": {
        +                "const": "label-fallback",
        +                "type": "string"
        +              },
        +              "phase": {
        +                "const": "pre-action",
        +                "type": "string"
        +              },
        +              "source": {
        +                "const": "ref",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "source",
        +              "phase",
        +              "kind"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "properties": {
        +              "kind": {
        +                "const": "not-observed",
        +                "type": "string"
        +              },
        +              "source": {
        +                "const": "direct-ios",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "source",
        +              "kind"
        +            ],
        +            "type": "object"
        +          }
        +        ],
        +        "type": "object"
        +      },
        +      "selector": {
        +        "description": "Selector expression when the target was a selector.",
        +        "type": "string"
        +      },
        +      "selectorChain": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "settle": {
        +        "properties": {
        +          "captures": {
        +            "type": "number"
        +          },
        +          "diff": {
        +            "description": "Settled diff vs the pre-action tree (changed lines only).",
        +            "properties": {
        +              "lines": {
        +                "items": {
        +                  "properties": {
        +                    "kind": {
        +                      "enum": [
        +                        "added",
        +                        "removed"
        +                      ],
        +                      "type": "string"
        +                    },
        +                    "ref": {
        +                      "description": "Plain ref body (e12) for added lines.",
        +                      "type": "string"
        +                    },
        +                    "text": {
        +                      "type": "string"
        +                    }
        +                  },
        +                  "required": [
        +                    "kind",
        +                    "text"
        +                  ],
        +                  "type": "object"
        +                },
        +                "type": "array"
        +              },
        +              "summary": {
        +                "properties": {
        +                  "additions": {
        +                    "type": "number"
        +                  },
        +                  "removals": {
        +                    "type": "number"
        +                  },
        +                  "unchanged": {
        +                    "type": "number"
        +                  }
        +                },
        +                "required": [
        +                  "additions",
        +                  "removals",
        +                  "unchanged"
        +                ],
        +                "type": "object"
        +              },
        +              "truncated": {
        +                "description": "Lines were capped to the response bound.",
        +                "type": "boolean"
        +              }
        +            },
        +            "required": [
        +              "summary",
        +              "lines"
        +            ],
        +            "type": "object"
        +          },
        +          "hint": {
        +            "type": "string"
        +          },
        +          "quietMs": {
        +            "type": "number"
        +          },
        +          "refs": {
        +            "items": {
        +              "properties": {
        +                "ref": {
        +                  "description": "Plain ref body (e12) minted from the stored settled tree.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "ref"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "refsGeneration": {
        +            "description": "Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.",
        +            "type": "number"
        +          },
        +          "settled": {
        +            "description": "Whether the UI held the quiet window before the deadline. false is advisory, not failure.",
        +            "type": "boolean"
        +          },
        +          "tail": {
        +            "description": "Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).",
        +            "items": {
        +              "properties": {
        +                "label": {
        +                  "type": "string"
        +                },
        +                "ref": {
        +                  "description": "Plain ref body (e12) minted from the stored settled tree.",
        +                  "type": "string"
        +                },
        +                "role": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "ref",
        +                "role"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "tailTruncated": {
        +            "description": "Present (true) when tail candidates exceeded the response cap.",
        +            "type": "boolean"
        +          },
        +          "timeoutMs": {
        +            "type": "number"
        +          },
        +          "waitedMs": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "settled",
        +          "waitedMs",
        +          "captures",
        +          "quietMs",
        +          "timeoutMs"
        +        ],
        +        "type": "object"
        +      },
        +      "target": {
        +        "description": "Target identity captured before fill and matched after fill.",
        +        "properties": {
        +          "className": {
        +            "description": "Android class name of the exact field that changed.",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "packageName": {
        +            "description": "Android package name that owns the exact field.",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "rect": {
        +            "description": "Screen-space rectangle of the exact field that changed.",
        +            "properties": {
        +              "height": {
        +                "type": "number"
        +              },
        +              "width": {
        +                "type": "number"
        +              },
        +              "x": {
        +                "type": "number"
        +              },
        +              "y": {
        +                "type": "number"
        +              }
        +            },
        +            "required": [
        +              "x",
        +              "y",
        +              "width",
        +              "height"
        +            ],
        +            "type": "object"
        +          },
        +          "resourceId": {
        +            "description": "Android resource id of the exact field that changed.",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          }
        +        },
        +        "required": [
        +          "resourceId",
        +          "className",
        +          "packageName",
        +          "rect"
        +        ],
        +        "type": "object"
        +      },
        +      "targetHittable": {
        +        "type": "boolean"
        +      },
        +      "targetKind": {
        +        "description": "Resolved interaction target kind.",
        +        "enum": [
        +          "point",
        +          "ref",
        +          "selector"
        +        ],
        +        "type": "string"
        +      },
        +      "text": {
        +        "description": "Text submitted to the field.",
        +        "type": "string"
        +      },
        +      "verification": {
        +        "const": "unconfirmed",
        +        "type": "string"
        +      },
        +      "warning": {
        +        "type": "string"
        +      },
        +      "x": {
        +        "description": "Resolved interaction x coordinate when available.",
        +        "type": "number"
        +      },
        +      "y": {
        +        "description": "Resolved interaction y coordinate when available.",
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "targetKind",
        +      "text",
        +      "verification",
        +      "requested",
        +      "before",
        +      "after",
        +      "target"
        +    ],
        +    "type": "object"
        +  }
        +]
      • removedOutput schema / properties
        Removed value: -{
        -  "cost": {
        -    "properties": {
        -      "nodeCount": {
        -        "description": "Number of nodes in the original node tree when the response carries one.",
        -        "type": "number"
        -      },
        -      "runnerRoundTrips": {
        -        "description": "Number of real runner round-trips made while serving the request.",
        -        "type": "number"
        -      },
        -      "wallClockMs": {
        -        "description": "Total wall-clock time for the request in milliseconds.",
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "wallClockMs",
        -      "runnerRoundTrips"
        -    ],
        -    "type": "object"
        -  },
        -  "delayMs": {
        -    "description": "Delay between typed characters in milliseconds.",
        -    "type": "number"
        -  },
        -  "evidence": {
        -    "properties": {
        -      "changedFromBefore": {
        -        "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.",
        -        "type": "boolean"
        -      },
        -      "digest": {
        -        "description": "Order-independent digest of the post-action node multiset.",
        -        "type": "string"
        -      },
        -      "foregroundApp": {
        -        "description": "Foreground app bundle id or name, when the capture carries it.",
        -        "type": "string"
        -      },
        -      "interactiveNodeCount": {
        -        "description": "Subset of nodeCount the platform reports as hittable.",
        -        "type": "number"
        -      },
        -      "nodeCount": {
        -        "description": "Node count in the post-action interactive-only capture.",
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "nodeCount",
        -      "interactiveNodeCount",
        -      "digest",
        -      "changedFromBefore"
        -    ],
        -    "type": "object"
        -  },
        -  "hint": {
        -    "type": "string"
        -  },
        -  "maestroFallbackReason": {
        -    "const": "non-hittable-coordinate",
        -    "type": "string"
        -  },
        -  "maestroNonHittableCoordinateFallbackAllowed": {
        -    "description": "Whether the direct iOS Maestro coordinate fallback was allowed for this selector.",
        -    "type": "boolean"
        -  },
        -  "maestroNonHittableCoordinateFallbackUsed": {
        -    "description": "Whether the direct iOS Maestro coordinate fallback was actually used.",
        -    "type": "boolean"
        -  },
        -  "message": {
        -    "type": "string"
        -  },
        -  "ref": {
        -    "description": "Snapshot ref without the @ prefix when the target was an @ref.",
        -    "type": "string"
        -  },
        -  "refLabel": {
        -    "type": "string"
        -  },
        -  "referenceHeight": {
        -    "description": "Reference frame height for visualizing the interaction point.",
        -    "type": "number"
        -  },
        -  "referenceWidth": {
        -    "description": "Reference frame width for visualizing the interaction point.",
        -    "type": "number"
        -  },
        -  "resolution": {
        -    "description": "Pre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path.",
        -    "oneOf": [
        -      {
        -        "properties": {
        -          "kind": {
        -            "const": "unique",
        -            "type": "string"
        -          },
        -          "phase": {
        -            "const": "pre-action",
        -            "type": "string"
        -          },
        -          "source": {
        -            "const": "runtime",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "source",
        -          "phase",
        -          "kind"
        -        ],
        -        "type": "object"
        -      },
        -      {
        -        "properties": {
        -          "alternatives": {
        -            "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.",
        -            "items": {
        -              "properties": {
        -                "diagnosticRef": {
        -                  "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        -                  "type": "string"
        -                },
        -                "label": {
        -                  "description": "UTF-8 truncated to 256 bytes.",
        -                  "type": "string"
        -                },
        -                "role": {
        -                  "description": "UTF-8 truncated to 256 bytes.",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "diagnosticRef"
        -              ],
        -              "type": "object"
        -            },
        -            "type": "array"
        -          },
        -          "kind": {
        -            "const": "disambiguated",
        -            "type": "string"
        -          },
        -          "matchCount": {
        -            "description": "Total matches resolveSelectorChain found before disambiguation.",
        -            "type": "number"
        -          },
        -          "phase": {
        -            "const": "pre-action",
        -            "type": "string"
        -          },
        -          "source": {
        -            "const": "runtime",
        -            "type": "string"
        -          },
        -          "tiebreak": {
        -            "description": "The comparison that decided the winner.",
        -            "enum": [
        -              "visible",
        -              "deepest",
        -              "smallest-area"
        -            ],
        -            "type": "string"
        -          },
        -          "winnerDiagnostic": {
        -            "properties": {
        -              "diagnosticRef": {
        -                "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        -                "type": "string"
        -              },
        -              "label": {
        -                "description": "UTF-8 truncated to 256 bytes.",
        -                "type": "string"
        -              },
        -              "role": {
        -                "description": "UTF-8 truncated to 256 bytes.",
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "diagnosticRef"
        -            ],
        -            "type": "object"
        -          }
        -        },
        -        "required": [
        -          "source",
        -          "phase",
        -          "kind",
        -          "matchCount",
        -          "winnerDiagnostic",
        -          "tiebreak"
        -        ],
        -        "type": "object"
        -      },
        -      {
        -        "properties": {
        -          "kind": {
        -            "const": "exact",
        -            "type": "string"
        -          },
        -          "phase": {
        -            "const": "pre-action",
        -            "type": "string"
        -          },
        -          "source": {
        -            "const": "ref",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "source",
        -          "phase",
        -          "kind"
        -        ],
        -        "type": "object"
        -      },
        -      {
        -        "properties": {
        -          "kind": {
        -            "const": "label-fallback",
        -            "type": "string"
        -          },
        -          "phase": {
        -            "const": "pre-action",
        -            "type": "string"
        -          },
        -          "source": {
        -            "const": "ref",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "source",
        -          "phase",
        -          "kind"
        -        ],
        -        "type": "object"
        -      },
        -      {
        -        "properties": {
        -          "kind": {
        -            "const": "not-observed",
        -            "type": "string"
        -          },
        -          "source": {
        -            "const": "direct-ios",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "source",
        -          "kind"
        -        ],
        -        "type": "object"
        -      }
        -    ],
        -    "type": "object"
        -  },
        -  "selector": {
        -    "description": "Selector expression when the target was a selector.",
        -    "type": "string"
        -  },
        -  "selectorChain": {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "settle": {
        -    "properties": {
        -      "captures": {
        -        "type": "number"
        -      },
        -      "diff": {
        -        "description": "Settled diff vs the pre-action tree (changed lines only).",
        -        "properties": {
        -          "lines": {
        -            "items": {
        -              "properties": {
        -                "kind": {
        -                  "enum": [
        -                    "added",
        -                    "removed"
        -                  ],
        -                  "type": "string"
        -                },
        -                "ref": {
        -                  "description": "Plain ref body (e12) for added lines.",
        -                  "type": "string"
        -                },
        -                "text": {
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "kind",
        -                "text"
        -              ],
        -              "type": "object"
        -            },
        -            "type": "array"
        -          },
        -          "summary": {
        -            "properties": {
        -              "additions": {
        -                "type": "number"
        -              },
        -              "removals": {
        -                "type": "number"
        -              },
        -              "unchanged": {
        -                "type": "number"
        -              }
        -            },
        -            "required": [
        -              "additions",
        -              "removals",
        -              "unchanged"
        -            ],
        -            "type": "object"
        -          },
        -          "truncated": {
        -            "description": "Lines were capped to the response bound.",
        -            "type": "boolean"
        -          }
        -        },
        -        "required": [
        -          "summary",
        -          "lines"
        -        ],
        -        "type": "object"
        -      },
        -      "hint": {
        -        "type": "string"
        -      },
        -      "quietMs": {
        -        "type": "number"
        -      },
        -      "refs": {
        -        "items": {
        -          "properties": {
        -            "ref": {
        -              "description": "Plain ref body (e12) minted from the stored settled tree.",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "ref"
        -          ],
        -          "type": "object"
        -        },
        -        "type": "array"
        -      },
        -      "refsGeneration": {
        -        "description": "Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.",
        -        "type": "number"
        -      },
        -      "settled": {
        -        "description": "Whether the UI held the quiet window before the deadline. false is advisory, not failure.",
        -        "type": "boolean"
        -      },
        -      "tail": {
        -        "description": "Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).",
        -        "items": {
        -          "properties": {
        -            "label": {
        -              "type": "string"
        -            },
        -            "ref": {
        -              "description": "Plain ref body (e12) minted from the stored settled tree.",
        -              "type": "string"
        -            },
        -            "role": {
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "ref",
        -            "role"
        -          ],
        -          "type": "object"
        -        },
        -        "type": "array"
        -      },
        -      "tailTruncated": {
        -        "description": "Present (true) when tail candidates exceeded the response cap.",
        -        "type": "boolean"
        -      },
        -      "timeoutMs": {
        -        "type": "number"
        -      },
        -      "waitedMs": {
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "settled",
        -      "waitedMs",
        -      "captures",
        -      "quietMs",
        -      "timeoutMs"
        -    ],
        -    "type": "object"
        -  },
        -  "targetHittable": {
        -    "type": "boolean"
        -  },
        -  "targetKind": {
        -    "description": "Resolved interaction target kind.",
        -    "enum": [
        -      "point",
        -      "ref",
        -      "selector"
        -    ],
        -    "type": "string"
        -  },
        -  "text": {
        -    "description": "Text submitted to the field.",
        -    "type": "string"
        -  },
        -  "warning": {
        -    "type": "string"
        -  },
        -  "x": {
        -    "description": "Resolved interaction x coordinate when available.",
        -    "type": "number"
        -  },
        -  "y": {
        -    "description": "Resolved interaction y coordinate when available.",
        -    "type": "number"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "targetKind",
        -  "text"
        -]
    • Changedfind1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedfocus1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedgesture1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedget1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Addedhelp
    • Changedhome1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Addedhover
    • Changedinstall1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedinstall-from-source1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedis1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedkeyboard2 fields changed
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "status",
        -  "dismiss"
        -]New value: +[
        +  "status",
        +  "dismiss",
        +  "enter",
        +  "return"
        +]
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedlogs1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedlongpress2 fields changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedOutput schema / properties / resolution / oneOf
        Previous value: -[
        -  {
        -    "properties": {
        -      "kind": {
        -        "const": "unique",
        -        "type": "string"
        -      },
        -      "phase": {
        -        "const": "pre-action",
        -        "type": "string"
        -      },
        -      "source": {
        -        "const": "runtime",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "source",
        -      "phase",
        -      "kind"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "alternatives": {
        -        "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.",
        -        "items": {
        -          "properties": {
        -            "diagnosticRef": {
        -              "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        -              "type": "string"
        -            },
        -            "label": {
        -              "description": "UTF-8 truncated to 256 bytes.",
        -              "type": "string"
        -            },
        -            "role": {
        -              "description": "UTF-8 truncated to 256 bytes.",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "diagnosticRef"
        -          ],
        -          "type": "object"
        -        },
        -        "type": "array"
        -      },
        -      "kind": {
        -        "const": "disambiguated",
        -        "type": "string"
        -      },
        -      "matchCount": {
        -        "description": "Total matches resolveSelectorChain found before disambiguation.",
        -        "type": "number"
        -      },
        -      "phase": {
        -        "const": "pre-action",
        -        "type": "string"
        -      },
        -      "source": {
        -        "const": "runtime",
        -        "type": "string"
        -      },
        -      "tiebreak": {
        -        "description": "The comparison that decided the winner.",
        -        "enum": [
        -          "visible",
        -          "deepest",
        -          "smallest-area"
        -        ],
        -        "type": "string"
        -      },
        -      "winnerDiagnostic": {
        -        "properties": {
        -          "diagnosticRef": {
        -            "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        -            "type": "string"
        -          },
        -          "label": {
        -            "description": "UTF-8 truncated to 256 bytes.",
        -            "type": "string"
        -          },
        -          "role": {
        -            "description": "UTF-8 truncated to 256 bytes.",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "diagnosticRef"
        -        ],
        -        "type": "object"
        -      }
        -    },
        -    "required": [
        -      "source",
        -      "phase",
        -      "kind",
        -      "matchCount",
        -      "winnerDiagnostic",
        -      "tiebreak"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "kind": {
        -        "const": "exact",
        -        "type": "string"
        -      },
        -      "phase": {
        -        "const": "pre-action",
        -        "type": "string"
        -      },
        -      "source": {
        -        "const": "ref",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "source",
        -      "phase",
        -      "kind"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "kind": {
        -        "const": "label-fallback",
        -        "type": "string"
        -      },
        -      "phase": {
        -        "const": "pre-action",
        -        "type": "string"
        -      },
        -      "source": {
        -        "const": "ref",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "source",
        -      "phase",
        -      "kind"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "kind": {
        -        "const": "not-observed",
        -        "type": "string"
        -      },
        -      "source": {
        -        "const": "direct-ios",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "source",
        -      "kind"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "properties": {
        +      "kind": {
        +        "const": "unique",
        +        "type": "string"
        +      },
        +      "phase": {
        +        "const": "pre-action",
        +        "type": "string"
        +      },
        +      "source": {
        +        "const": "runtime",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "source",
        +      "phase",
        +      "kind"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "alternatives": {
        +        "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.",
        +        "items": {
        +          "properties": {
        +            "diagnosticRef": {
        +              "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        +              "type": "string"
        +            },
        +            "label": {
        +              "description": "UTF-8 truncated to 256 bytes.",
        +              "type": "string"
        +            },
        +            "role": {
        +              "description": "UTF-8 truncated to 256 bytes.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "diagnosticRef"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "kind": {
        +        "const": "disambiguated",
        +        "type": "string"
        +      },
        +      "matchCount": {
        +        "description": "Total matches resolveSelectorChain found before disambiguation.",
        +        "type": "number"
        +      },
        +      "phase": {
        +        "const": "pre-action",
        +        "type": "string"
        +      },
        +      "source": {
        +        "const": "runtime",
        +        "type": "string"
        +      },
        +      "tiebreak": {
        +        "description": "The comparison that decided the winner.",
        +        "enum": [
        +          "visible",
        +          "deepest",
        +          "smallest-area",
        +          "structural-equivalence"
        +        ],
        +        "type": "string"
        +      },
        +      "winnerDiagnostic": {
        +        "properties": {
        +          "diagnosticRef": {
        +            "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        +            "type": "string"
        +          },
        +          "label": {
        +            "description": "UTF-8 truncated to 256 bytes.",
        +            "type": "string"
        +          },
        +          "role": {
        +            "description": "UTF-8 truncated to 256 bytes.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "diagnosticRef"
        +        ],
        +        "type": "object"
        +      }
        +    },
        +    "required": [
        +      "source",
        +      "phase",
        +      "kind",
        +      "matchCount",
        +      "winnerDiagnostic",
        +      "tiebreak"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "kind": {
        +        "const": "exact",
        +        "type": "string"
        +      },
        +      "phase": {
        +        "const": "pre-action",
        +        "type": "string"
        +      },
        +      "source": {
        +        "const": "ref",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "source",
        +      "phase",
        +      "kind"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "kind": {
        +        "const": "label-fallback",
        +        "type": "string"
        +      },
        +      "phase": {
        +        "const": "pre-action",
        +        "type": "string"
        +      },
        +      "source": {
        +        "const": "ref",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "source",
        +      "phase",
        +      "kind"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "kind": {
        +        "const": "not-observed",
        +        "type": "string"
        +      },
        +      "source": {
        +        "const": "direct-ios",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "source",
        +      "kind"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedmetro1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changednetwork1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedopen2 fields changed
      • changedInput schema / properties / foreground / description
        Previous value: -"[RFC prototype] On a fresh session with no app argument, resolve the target from the sole booted iOS simulator's sole running app and include an initial interactive snapshot in the response. Fails with AMBIGUOUS_MATCH when the environment is not unambiguous (0 or 2+ booted simulators, or no confidently-detectable running app) — never guesses."New value: +"Include an initial interactive snapshot in a fresh open response. With no app argument, discover the sole running app on the sole booted iOS simulator; ambiguous environments fail closed."
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedorientation1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedperf1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedpress2 fields changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedOutput schema / properties / resolution / oneOf
        Previous value: -[
        -  {
        -    "properties": {
        -      "kind": {
        -        "const": "unique",
        -        "type": "string"
        -      },
        -      "phase": {
        -        "const": "pre-action",
        -        "type": "string"
        -      },
        -      "source": {
        -        "const": "runtime",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "source",
        -      "phase",
        -      "kind"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "alternatives": {
        -        "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.",
        -        "items": {
        -          "properties": {
        -            "diagnosticRef": {
        -              "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        -              "type": "string"
        -            },
        -            "label": {
        -              "description": "UTF-8 truncated to 256 bytes.",
        -              "type": "string"
        -            },
        -            "role": {
        -              "description": "UTF-8 truncated to 256 bytes.",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "diagnosticRef"
        -          ],
        -          "type": "object"
        -        },
        -        "type": "array"
        -      },
        -      "kind": {
        -        "const": "disambiguated",
        -        "type": "string"
        -      },
        -      "matchCount": {
        -        "description": "Total matches resolveSelectorChain found before disambiguation.",
        -        "type": "number"
        -      },
        -      "phase": {
        -        "const": "pre-action",
        -        "type": "string"
        -      },
        -      "source": {
        -        "const": "runtime",
        -        "type": "string"
        -      },
        -      "tiebreak": {
        -        "description": "The comparison that decided the winner.",
        -        "enum": [
        -          "visible",
        -          "deepest",
        -          "smallest-area"
        -        ],
        -        "type": "string"
        -      },
        -      "winnerDiagnostic": {
        -        "properties": {
        -          "diagnosticRef": {
        -            "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        -            "type": "string"
        -          },
        -          "label": {
        -            "description": "UTF-8 truncated to 256 bytes.",
        -            "type": "string"
        -          },
        -          "role": {
        -            "description": "UTF-8 truncated to 256 bytes.",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "diagnosticRef"
        -        ],
        -        "type": "object"
        -      }
        -    },
        -    "required": [
        -      "source",
        -      "phase",
        -      "kind",
        -      "matchCount",
        -      "winnerDiagnostic",
        -      "tiebreak"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "kind": {
        -        "const": "exact",
        -        "type": "string"
        -      },
        -      "phase": {
        -        "const": "pre-action",
        -        "type": "string"
        -      },
        -      "source": {
        -        "const": "ref",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "source",
        -      "phase",
        -      "kind"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "kind": {
        -        "const": "label-fallback",
        -        "type": "string"
        -      },
        -      "phase": {
        -        "const": "pre-action",
        -        "type": "string"
        -      },
        -      "source": {
        -        "const": "ref",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "source",
        -      "phase",
        -      "kind"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "kind": {
        -        "const": "not-observed",
        -        "type": "string"
        -      },
        -      "source": {
        -        "const": "direct-ios",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "source",
        -      "kind"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "properties": {
        +      "kind": {
        +        "const": "unique",
        +        "type": "string"
        +      },
        +      "phase": {
        +        "const": "pre-action",
        +        "type": "string"
        +      },
        +      "source": {
        +        "const": "runtime",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "source",
        +      "phase",
        +      "kind"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "alternatives": {
        +        "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.",
        +        "items": {
        +          "properties": {
        +            "diagnosticRef": {
        +              "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        +              "type": "string"
        +            },
        +            "label": {
        +              "description": "UTF-8 truncated to 256 bytes.",
        +              "type": "string"
        +            },
        +            "role": {
        +              "description": "UTF-8 truncated to 256 bytes.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "diagnosticRef"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "kind": {
        +        "const": "disambiguated",
        +        "type": "string"
        +      },
        +      "matchCount": {
        +        "description": "Total matches resolveSelectorChain found before disambiguation.",
        +        "type": "number"
        +      },
        +      "phase": {
        +        "const": "pre-action",
        +        "type": "string"
        +      },
        +      "source": {
        +        "const": "runtime",
        +        "type": "string"
        +      },
        +      "tiebreak": {
        +        "description": "The comparison that decided the winner.",
        +        "enum": [
        +          "visible",
        +          "deepest",
        +          "smallest-area",
        +          "structural-equivalence"
        +        ],
        +        "type": "string"
        +      },
        +      "winnerDiagnostic": {
        +        "properties": {
        +          "diagnosticRef": {
        +            "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        +            "type": "string"
        +          },
        +          "label": {
        +            "description": "UTF-8 truncated to 256 bytes.",
        +            "type": "string"
        +          },
        +          "role": {
        +            "description": "UTF-8 truncated to 256 bytes.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "diagnosticRef"
        +        ],
        +        "type": "object"
        +      }
        +    },
        +    "required": [
        +      "source",
        +      "phase",
        +      "kind",
        +      "matchCount",
        +      "winnerDiagnostic",
        +      "tiebreak"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "kind": {
        +        "const": "exact",
        +        "type": "string"
        +      },
        +      "phase": {
        +        "const": "pre-action",
        +        "type": "string"
        +      },
        +      "source": {
        +        "const": "ref",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "source",
        +      "phase",
        +      "kind"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "kind": {
        +        "const": "label-fallback",
        +        "type": "string"
        +      },
        +      "phase": {
        +        "const": "pre-action",
        +        "type": "string"
        +      },
        +      "source": {
        +        "const": "ref",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "source",
        +      "phase",
        +      "kind"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "kind": {
        +        "const": "not-observed",
        +        "type": "string"
        +      },
        +      "source": {
        +        "const": "direct-ios",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "source",
        +      "kind"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedpush1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedreact-native1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedrecord1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedreinstall1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedreplay1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedscreenshot1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedscroll1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedsession1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedsettings1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedshutdown2 fields changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedOutput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web"
        +]
    • Changedsnapshot1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedswipe1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedtest1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedtrace1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedtrigger-app-event1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedtv-remote1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedtype1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedviewport1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
    • Changedwait1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "vega",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "harmonyos",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
  12. 11 tool updatesv0.20.6
    • Changedapps1 field changed
      • addedInput schema / properties / appsFilter / description
        Added value: +"Restrict the listing to user-installed apps, or include system and OEM apps."
    • Changedback4 fields changed
      • addedInput schema / properties / settle
        Added value: +{
        +  "description": "After the action, wait for the UI to go quiet and return the settled diff vs the pre-action tree in the same response. Best-effort; never fails the action.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / settleQuietMs
        Added value: +{
        +  "description": "Settle: quiet window in milliseconds (default 500).",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / timeoutMs
        Added value: +{
        +  "description": "Settle: wait deadline in milliseconds (default 10000).",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / settle
        Added value: +{
        +  "properties": {
        +    "captures": {
        +      "type": "number"
        +    },
        +    "diff": {
        +      "description": "Settled diff vs the pre-action tree (changed lines only).",
        +      "properties": {
        +        "lines": {
        +          "items": {
        +            "properties": {
        +              "kind": {
        +                "enum": [
        +                  "added",
        +                  "removed"
        +                ],
        +                "type": "string"
        +              },
        +              "ref": {
        +                "description": "Plain ref body (e12) for added lines.",
        +                "type": "string"
        +              },
        +              "text": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "kind",
        +              "text"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "summary": {
        +          "properties": {
        +            "additions": {
        +              "type": "number"
        +            },
        +            "removals": {
        +              "type": "number"
        +            },
        +            "unchanged": {
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "additions",
        +            "removals",
        +            "unchanged"
        +          ],
        +          "type": "object"
        +        },
        +        "truncated": {
        +          "description": "Lines were capped to the response bound.",
        +          "type": "boolean"
        +        }
        +      },
        +      "required": [
        +        "summary",
        +        "lines"
        +      ],
        +      "type": "object"
        +    },
        +    "hint": {
        +      "type": "string"
        +    },
        +    "quietMs": {
        +      "type": "number"
        +    },
        +    "refs": {
        +      "items": {
        +        "properties": {
        +          "ref": {
        +            "description": "Plain ref body (e12) minted from the stored settled tree.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "ref"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "refsGeneration": {
        +      "description": "Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.",
        +      "type": "number"
        +    },
        +    "settled": {
        +      "description": "Whether the UI held the quiet window before the deadline. false is advisory, not failure.",
        +      "type": "boolean"
        +    },
        +    "tail": {
        +      "description": "Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).",
        +      "items": {
        +        "properties": {
        +          "label": {
        +            "type": "string"
        +          },
        +          "ref": {
        +            "description": "Plain ref body (e12) minted from the stored settled tree.",
        +            "type": "string"
        +          },
        +          "role": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "ref",
        +          "role"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "tailTruncated": {
        +      "description": "Present (true) when tail candidates exceeded the response cap.",
        +      "type": "boolean"
        +    },
        +    "timeoutMs": {
        +      "type": "number"
        +    },
        +    "waitedMs": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "settled",
        +    "waitedMs",
        +    "captures",
        +    "quietMs",
        +    "timeoutMs"
        +  ],
        +  "type": "object"
        +}
    • Changedfind2 fields changed
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "click",
        -  "focus",
        -  "exists",
        -  "getText",
        -  "getAttrs",
        -  "wait",
        -  "fill",
        -  "type"
        -]New value: +[
        +  "click",
        +  "focus",
        +  "exists",
        +  "list",
        +  "getText",
        +  "getAttrs",
        +  "wait",
        +  "fill",
        +  "type"
        +]
      • addedOutput schema / properties / matches
        Added value: +{
        +  "description": "Every match for the read-only find list action (#1625): { ref, node } each.",
        +  "items": {
        +    "additionalProperties": true,
        +    "description": "One listed match with its snapshot ref and node.",
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
    • Changedgesture6 fields changed
      • addedInput schema / properties / destination
        Added value: +{
        +  "description": "Drag destination @ref or selector.",
        +  "type": "string"
        +}
      • addedInput schema / properties / destinationHoldMs
        Added value: +{
        +  "description": "Hold before releasing at the destination.",
        +  "maximum": 10000,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedInput schema / properties / kind / enum
        Previous value: -[
        -  "pan",
        -  "fling",
        -  "swipe",
        -  "pinch",
        -  "rotate",
        -  "transform"
        -]New value: +[
        +  "pan",
        +  "fling",
        +  "swipe",
        +  "pinch",
        +  "rotate",
        +  "transform",
        +  "drag"
        +]
      • addedInput schema / properties / moveMs
        Added value: +{
        +  "description": "Drag movement duration.",
        +  "maximum": 10000,
        +  "minimum": 16,
        +  "type": "integer"
        +}
      • addedInput schema / properties / source
        Added value: +{
        +  "description": "Drag source @ref or selector.",
        +  "type": "string"
        +}
      • addedInput schema / properties / sourceHoldMs
        Added value: +{
        +  "description": "Drag activation hold duration.",
        +  "maximum": 10000,
        +  "minimum": 1,
        +  "type": "integer"
        +}
    • Changedopen2 fields changed
      • addedInput schema / properties / foreground
        Added value: +{
        +  "description": "[RFC prototype] On a fresh session with no app argument, resolve the target from the sole booted iOS simulator's sole running app and include an initial interactive snapshot in the response. Fails with AMBIGUOUS_MATCH when the environment is not unambiguous (0 or 2+ booted simulators, or no confidently-detectable running app) — never guesses.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / surface / description
        Added value: +"macOS presentation surface to open: the app itself, the frontmost app, the desktop, or the menu bar."
    • Changedrecord1 field changed
      • removedInput schema / properties / maxSize
        Removed value: -{
        -  "type": "integer"
        -}
    • Changedreplay1 field changed
      • addedInput schema / properties / timeoutMs
        Added value: +{
        +  "description": "Maximum wall-clock duration for the replay request.",
        +  "type": "integer"
        +}
    • Changedscreenshot2 fields changed
      • removedInput schema / properties / maxSize
        Removed value: -{
        -  "type": "integer"
        -}
      • addedInput schema / properties / scale
        Added value: +{
        +  "description": "Screenshot scale factor.",
        +  "maximum": 1,
        +  "minimum": 0.01,
        +  "type": "number"
        +}
    • Changedscroll3 fields changed
      • addedInput schema / properties / settle
        Added value: +{
        +  "description": "After the action, wait for the UI to go quiet and return the settled diff vs the pre-action tree in the same response. Best-effort; never fails the action.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / settleQuietMs
        Added value: +{
        +  "description": "Settle: quiet window in milliseconds (default 500).",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / timeoutMs
        Added value: +{
        +  "description": "Settle: wait deadline in milliseconds (default 10000).",
        +  "minimum": 1,
        +  "type": "integer"
        +}
    • Changedsnapshot1 field changed
      • addedInput schema / properties / customActions
        Added value: +{
        +  "description": "Name the affordances an element merged away (iOS UIAccessibilityCustomAction, React Native accessibilityActions) — a card whose reply/options controls are not separate elements still lists them here. The names are for PLANNING, not invocation: there is no API to trigger them, so reach the affordance through the element detail screen, through the same control exposed as a labeled element elsewhere, or by coordinates from its rect. iOS simulator only; costs one accessibility round trip per merged element.",
        +  "type": "boolean"
        +}
    • Changedtrigger-app-event2 fields changed
      • addedInput schema / properties / event / description
        Added value: +"Name of an app-defined automation or test event the app documents."
      • addedInput schema / properties / payload / description
        Added value: +"Structured payload passed to the event, in the shape the app documents for it."
  13. 1 tool updatev0.20.4
    • Changedreplay1 field changed
      • addedInput schema / properties / keepSession
        Added value: +{
        +  "description": "Leave the session active by suppressing exactly an authored terminal close in native .ad.",
        +  "type": "boolean"
        +}
  14. 56 tool updatesv0.20.2
    • Changedalert3 fields changed
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
    • Changedapp-switcher3 fields changed
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
    • Changedapps3 fields changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "apps": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "apps"
        +  ],
        +  "type": "object"
        +}
    • Changedappstate2 fields changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
    • Changedartifacts2 fields changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
    • Changedaudio2 fields changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
    • Changedback3 fields changed
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
    • Changedbatch3 fields changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
      • changedInput schema / properties / steps / items / properties / command / enum
        Previous value: -[
        -  "devices",
        -  "doctor",
        -  "apps",
        -  "boot",
        -  "shutdown",
        -  "appstate",
        -  "perf",
        -  "logs",
        -  "network",
        -  "audio",
        -  "test",
        -  "clipboard",
        -  "keyboard",
        -  "install",
        -  "reinstall",
        -  "push",
        -  "trigger-app-event",
        -  "open",
        -  "close",
        -  "snapshot",
        -  "diff",
        -  "wait",
        -  "alert",
        -  "settings",
        -  "react-native",
        -  "record",
        -  "trace",
        -  "find",
        -  "click",
        -  "fill",
        -  "longpress",
        -  "press",
        -  "type",
        -  "get",
        -  "is",
        -  "back",
        -  "gesture",
        -  "home",
        -  "rotate",
        -  "scroll",
        -  "swipe",
        -  "focus",
        -  "screenshot",
        -  "app-switcher",
        -  "install-from-source"
        -]New value: +[
        +  "devices",
        +  "capabilities",
        +  "doctor",
        +  "apps",
        +  "boot",
        +  "shutdown",
        +  "appstate",
        +  "perf",
        +  "logs",
        +  "network",
        +  "audio",
        +  "test",
        +  "clipboard",
        +  "keyboard",
        +  "install",
        +  "reinstall",
        +  "push",
        +  "trigger-app-event",
        +  "open",
        +  "close",
        +  "snapshot",
        +  "diff",
        +  "wait",
        +  "alert",
        +  "settings",
        +  "react-native",
        +  "record",
        +  "trace",
        +  "find",
        +  "click",
        +  "fill",
        +  "longpress",
        +  "press",
        +  "type",
        +  "get",
        +  "is",
        +  "back",
        +  "gesture",
        +  "home",
        +  "tv-remote",
        +  "orientation",
        +  "scroll",
        +  "swipe",
        +  "focus",
        +  "screenshot",
        +  "app-switcher",
        +  "install-from-source"
        +]
    • Changedboot3 fields changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
      • changedOutput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web"
        +]
    • Addedcapabilities
    • Changedclick7 fields changed
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
      • addedInput schema / properties / settle
        Added value: +{
        +  "description": "After the action, wait for the UI to go quiet and return the settled diff vs the pre-action tree in the same response. Best-effort; never fails the action.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / settleQuietMs
        Added value: +{
        +  "description": "Settle: quiet window in milliseconds (default 500).",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / timeoutMs
        Added value: +{
        +  "description": "Settle: wait deadline in milliseconds (default 10000).",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "button": {
        +      "enum": [
        +        "secondary",
        +        "middle"
        +      ],
        +      "type": "string"
        +    },
        +    "cost": {
        +      "properties": {
        +        "nodeCount": {
        +          "description": "Number of nodes in the original node tree when the response carries one.",
        +          "type": "number"
        +        },
        +        "runnerRoundTrips": {
        +          "description": "Number of real runner round-trips made while serving the request.",
        +          "type": "number"
        +        },
        +        "wallClockMs": {
        +          "description": "Total wall-clock time for the request in milliseconds.",
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "wallClockMs",
        +        "runnerRoundTrips"
        +      ],
        +      "type": "object"
        +    },
        +    "count": {
        +      "description": "Number of press/click repetitions.",
        +      "type": "number"
        +    },
        +    "doubleTap": {
        +      "description": "Whether the command requested a double-tap action.",
        +      "type": "boolean"
        +    },
        +    "evidence": {
        +      "properties": {
        +        "changedFromBefore": {
        +          "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.",
        +          "type": "boolean"
        +        },
        +        "digest": {
        +          "description": "Order-independent digest of the post-action node multiset.",
        +          "type": "string"
        +        },
        +        "foregroundApp": {
        +          "description": "Foreground app bundle id or name, when the capture carries it.",
        +          "type": "string"
        +        },
        +        "interactiveNodeCount": {
        +          "description": "Subset of nodeCount the platform reports as hittable.",
        +          "type": "number"
        +        },
        +        "nodeCount": {
        +          "description": "Node count in the post-action interactive-only capture.",
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "nodeCount",
        +        "interactiveNodeCount",
        +        "digest",
        +        "changedFromBefore"
        +      ],
        +      "type": "object"
        +    },
        +    "hint": {
        +      "type": "string"
        +    },
        +    "holdMs": {
        +      "description": "Hold duration for each action.",
        +      "type": "number"
        +    },
        +    "intervalMs": {
        +      "description": "Delay between repeated press/click actions.",
        +      "type": "number"
        +    },
        +    "jitterPx": {
        +      "description": "Randomization radius in pixels.",
        +      "type": "number"
        +    },
        +    "maestroFallbackReason": {
        +      "const": "non-hittable-coordinate",
        +      "type": "string"
        +    },
        +    "maestroNonHittableCoordinateFallbackAllowed": {
        +      "description": "Whether the direct iOS Maestro coordinate fallback was allowed for this selector.",
        +      "type": "boolean"
        +    },
        +    "maestroNonHittableCoordinateFallbackUsed": {
        +      "description": "Whether the direct iOS Maestro coordinate fallback was actually used.",
        +      "type": "boolean"
        +    },
        +    "message": {
        +      "type": "string"
        +    },
        +    "ref": {
        +      "description": "Snapshot ref without the @ prefix when the target was an @ref.",
        +      "type": "string"
        +    },
        +    "refLabel": {
        +      "type": "string"
        +    },
        +    "referenceHeight": {
        +      "description": "Reference frame height for visualizing the interaction point.",
        +      "type": "number"
        +    },
        +    "referenceWidth": {
        +      "description": "Reference frame width for visualizing the interaction point.",
        +      "type": "number"
        +    },
        +    "resolution": {
        +      "description": "Pre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path.",
        +      "oneOf": [
        +        {
        +          "properties": {
        +            "kind": {
        +              "const": "unique",
        +              "type": "string"
        +            },
        +            "phase": {
        +              "const": "pre-action",
        +              "type": "string"
        +            },
        +            "source": {
        +              "const": "runtime",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "source",
        +            "phase",
        +            "kind"
        +          ],
        +          "type": "object"
        +        },
        +        {
        +          "properties": {
        +            "alternatives": {
        +              "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.",
        +              "items": {
        +                "properties": {
        +                  "diagnosticRef": {
        +                    "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        +                    "type": "string"
        +                  },
        +                  "label": {
        +                    "description": "UTF-8 truncated to 256 bytes.",
        +                    "type": "string"
        +                  },
        +                  "role": {
        +                    "description": "UTF-8 truncated to 256 bytes.",
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "diagnosticRef"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "kind": {
        +              "const": "disambiguated",
        +              "type": "string"
        +            },
        +            "matchCount": {
        +              "description": "Total matches resolveSelectorChain found before disambiguation.",
        +              "type": "number"
        +            },
        +            "phase": {
        +              "const": "pre-action",
        +              "type": "string"
        +            },
        +            "source": {
        +              "const": "runtime",
        +              "type": "string"
        +            },
        +            "tiebreak": {
        +              "description": "The comparison that decided the winner.",
        +              "enum": [
        +                "visible",
        +                "deepest",
        +                "smallest-area"
        +              ],
        +              "type": "string"
        +            },
        +            "winnerDiagnostic": {
        +              "properties": {
        +                "diagnosticRef": {
        +                  "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        +                  "type": "string"
        +                },
        +                "label": {
        +                  "description": "UTF-8 truncated to 256 bytes.",
        +                  "type": "string"
        +                },
        +                "role": {
        +                  "description": "UTF-8 truncated to 256 bytes.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "diagnosticRef"
        +              ],
        +              "type": "object"
        +            }
        +          },
        +          "required": [
        +            "source",
        +            "phase",
        +            "kind",
        +            "matchCount",
        +            "winnerDiagnostic",
        +            "tiebreak"
        +          ],
        +          "type": "object"
        +        },
        +        {
        +          "properties": {
        +            "kind": {
        +              "const": "exact",
        +              "type": "string"
        +            },
        +            "phase": {
        +              "const": "pre-action",
        +              "type": "string"
        +            },
        +            "source": {
        +              "const": "ref",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "source",
        +            "phase",
        +            "kind"
        +          ],
        +          "type": "object"
        +        },
        +        {
        +          "properties": {
        +            "kind": {
        +              "const": "label-fallback",
        +              "type": "string"
        +            },
        +            "phase": {
        +              "const": "pre-action",
        +              "type": "string"
        +            },
        +            "source": {
        +              "const": "ref",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "source",
        +            "phase",
        +            "kind"
        +          ],
        +          "type": "object"
        +        },
        +        {
        +          "properties": {
        +            "kind": {
        +              "const": "not-observed",
        +              "type": "string"
        +            },
        +            "source": {
        +              "const": "direct-ios",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "source",
        +            "kind"
        +          ],
        +          "type": "object"
        +        }
        +      ],
        +      "type": "object"
        +    },
        +    "selector": {
        +      "description": "Selector expression when the target was a selector.",
        +      "type": "string"
        +    },
        +    "selectorChain": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "settle": {
        +      "properties": {
        +        "captures": {
        +          "type": "number"
        +        },
        +        "diff": {
        +          "description": "Settled diff vs the pre-action tree (changed lines only).",
        +          "properties": {
        +            "lines": {
        +              "items": {
        +                "properties": {
        +                  "kind": {
        +                    "enum": [
        +                      "added",
        +                      "removed"
        +                    ],
        +                    "type": "string"
        +                  },
        +                  "ref": {
        +                    "description": "Plain ref body (e12) for added lines.",
        +                    "type": "string"
        +                  },
        +                  "text": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "kind",
        +                  "text"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "summary": {
        +              "properties": {
        +                "additions": {
        +                  "type": "number"
        +                },
        +                "removals": {
        +                  "type": "number"
        +                },
        +                "unchanged": {
        +                  "type": "number"
        +                }
        +              },
        +              "required": [
        +                "additions",
        +                "removals",
        +                "unchanged"
        +              ],
        +              "type": "object"
        +            },
        +            "truncated": {
        +              "description": "Lines were capped to the response bound.",
        +              "type": "boolean"
        +            }
        +          },
        +          "required": [
        +            "summary",
        +            "lines"
        +          ],
        +          "type": "object"
        +        },
        +        "hint": {
        +          "type": "string"
        +        },
        +        "quietMs": {
        +          "type": "number"
        +        },
        +        "refs": {
        +          "items": {
        +            "properties": {
        +              "ref": {
        +                "description": "Plain ref body (e12) minted from the stored settled tree.",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "ref"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "refsGeneration": {
        +          "description": "Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.",
        +          "type": "number"
        +        },
        +        "settled": {
        +          "description": "Whether the UI held the quiet window before the deadline. false is advisory, not failure.",
        +          "type": "boolean"
        +        },
        +        "tail": {
        +          "description": "Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).",
        +          "items": {
        +            "properties": {
        +              "label": {
        +                "type": "string"
        +              },
        +              "ref": {
        +                "description": "Plain ref body (e12) minted from the stored settled tree.",
        +                "type": "string"
        +              },
        +              "role": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "ref",
        +              "role"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "tailTruncated": {
        +          "description": "Present (true) when tail candidates exceeded the response cap.",
        +          "type": "boolean"
        +        },
        +        "timeoutMs": {
        +          "type": "number"
        +        },
        +        "waitedMs": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "settled",
        +        "waitedMs",
        +        "captures",
        +        "quietMs",
        +        "timeoutMs"
        +      ],
        +      "type": "object"
        +    },
        +    "targetHittable": {
        +      "type": "boolean"
        +    },
        +    "targetKind": {
        +      "description": "Resolved interaction target kind.",
        +      "enum": [
        +        "point",
        +        "ref",
        +        "selector"
        +      ],
        +      "type": "string"
        +    },
        +    "warning": {
        +      "type": "string"
        +    },
        +    "x": {
        +      "description": "Resolved interaction x coordinate when available.",
        +      "type": "number"
        +    },
        +    "y": {
        +      "description": "Resolved interaction y coordinate when available.",
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "targetKind"
        +  ],
        +  "type": "object"
        +}
    • Changedclipboard3 fields changed
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
    • Changedclose4 fields changed
      • addedInput schema / properties / force
        Added value: +{
        +  "description": "Overwrite an existing --save-script target instead of refusing (alias: --overwrite).",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
    • Changeddebug2 fields changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
    • Changeddevices3 fields changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "devices": {
        +      "items": {
        +        "properties": {
        +          "id": {
        +            "type": "string"
        +          },
        +          "kind": {
        +            "enum": [
        +              "simulator",
        +              "emulator",
        +              "device"
        +            ],
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "platform": {
        +            "enum": [
        +              "ios",
        +              "macos",
        +              "android",
        +              "vega",
        +              "linux",
        +              "web"
        +            ],
        +            "type": "string"
        +          },
        +          "target": {
        +            "enum": [
        +              "mobile",
        +              "tv",
        +              "desktop"
        +            ],
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "platform",
        +          "target",
        +          "kind",
        +          "id",
        +          "name"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "devices"
        +  ],
        +  "type": "object"
        +}
    • Changeddiff4 fields changed
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "baselineInitialized": {
        +      "type": "boolean"
        +    },
        +    "lines": {
        +      "items": {
        +        "properties": {
        +          "kind": {
        +            "enum": [
        +              "added",
        +              "removed"
        +            ],
        +            "type": "string"
        +          },
        +          "ref": {
        +            "type": "string"
        +          },
        +          "text": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "kind",
        +          "text"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "mode": {
        +      "const": "snapshot",
        +      "type": "string"
        +    },
        +    "summary": {
        +      "properties": {
        +        "additions": {
        +          "type": "number"
        +        },
        +        "removals": {
        +          "type": "number"
        +        },
        +        "unchanged": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "additions",
        +        "removals",
        +        "unchanged"
        +      ],
        +      "type": "object"
        +    },
        +    "warnings": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "mode",
        +    "baselineInitialized",
        +    "summary",
        +    "lines"
        +  ],
        +  "type": "object"
        +}
    • Changeddoctor3 fields changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "checks": {
        +      "items": {
        +        "properties": {
        +          "command": {
        +            "type": "string"
        +          },
        +          "evidence": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "hint": {
        +            "type": "string"
        +          },
        +          "id": {
        +            "type": "string"
        +          },
        +          "status": {
        +            "enum": [
        +              "pass",
        +              "warn",
        +              "fail",
        +              "info"
        +            ],
        +            "type": "string"
        +          },
        +          "summary": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "status",
        +          "summary"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "kind": {
        +      "enum": [
        +        "auto",
        +        "react-native",
        +        "expo",
        +        "repack"
        +      ],
        +      "type": "string"
        +    },
        +    "metro": {
        +      "properties": {
        +        "host": {
        +          "type": "string"
        +        },
        +        "port": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "host",
        +        "port"
        +      ],
        +      "type": "object"
        +    },
        +    "platform": {
        +      "type": "string"
        +    },
        +    "status": {
        +      "enum": [
        +        "pass",
        +        "warn",
        +        "fail",
        +        "info"
        +      ],
        +      "type": "string"
        +    },
        +    "summary": {
        +      "type": "string"
        +    },
        +    "target": {
        +      "enum": [
        +        "mobile",
        +        "tv",
        +        "desktop"
        +      ],
        +      "type": "string"
        +    },
        +    "targetApp": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status",
        +    "summary",
        +    "kind",
        +    "checks"
        +  ],
        +  "type": "object"
        +}
    • Addedevents
    • Changedfill10 fields changed
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / recordAs
        Added value: +{
        +  "description": "When script recording is armed, send text to the live app but publish it as ${VAR}. Use an uppercase replay variable name such as PASSWORD.",
        +  "type": "string"
        +}
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
      • addedInput schema / properties / settle
        Added value: +{
        +  "description": "After the action, wait for the UI to go quiet and return the settled diff vs the pre-action tree in the same response. Best-effort; never fails the action.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / settleQuietMs
        Added value: +{
        +  "description": "Settle: quiet window in milliseconds (default 500).",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / timeoutMs
        Added value: +{
        +  "description": "Settle: wait deadline in milliseconds (default 10000).",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • removedOutput schema / oneOf
        Removed value: -[
        -  {
        -    "properties": {
        -      "backendResult": {
        -        "additionalProperties": true,
        -        "description": "Raw backend result passthrough.",
        -        "type": "object"
        -      },
        -      "evidence": {
        -        "properties": {
        -          "changedFromBefore": {
        -            "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.",
        -            "type": "boolean"
        -          },
        -          "digest": {
        -            "description": "Order-independent digest of the post-action node multiset.",
        -            "type": "string"
        -          },
        -          "foregroundApp": {
        -            "description": "Foreground app bundle id or name, when the capture carries it.",
        -            "type": "string"
        -          },
        -          "interactiveNodeCount": {
        -            "description": "Subset of nodeCount the platform reports as hittable.",
        -            "type": "number"
        -          },
        -          "nodeCount": {
        -            "description": "Node count in the post-action interactive-only capture.",
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "nodeCount",
        -          "interactiveNodeCount",
        -          "digest",
        -          "changedFromBefore"
        -        ],
        -        "type": "object"
        -      },
        -      "kind": {
        -        "const": "point",
        -        "type": "string"
        -      },
        -      "message": {
        -        "type": "string"
        -      },
        -      "point": {
        -        "properties": {
        -          "x": {
        -            "type": "number"
        -          },
        -          "y": {
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "x",
        -          "y"
        -        ],
        -        "type": "object"
        -      },
        -      "text": {
        -        "description": "Text submitted to the field.",
        -        "type": "string"
        -      },
        -      "warning": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "kind",
        -      "point",
        -      "text"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "backendResult": {
        -        "additionalProperties": true,
        -        "description": "Raw backend result passthrough.",
        -        "type": "object"
        -      },
        -      "evidence": {
        -        "properties": {
        -          "changedFromBefore": {
        -            "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.",
        -            "type": "boolean"
        -          },
        -          "digest": {
        -            "description": "Order-independent digest of the post-action node multiset.",
        -            "type": "string"
        -          },
        -          "foregroundApp": {
        -            "description": "Foreground app bundle id or name, when the capture carries it.",
        -            "type": "string"
        -          },
        -          "interactiveNodeCount": {
        -            "description": "Subset of nodeCount the platform reports as hittable.",
        -            "type": "number"
        -          },
        -          "nodeCount": {
        -            "description": "Node count in the post-action interactive-only capture.",
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "nodeCount",
        -          "interactiveNodeCount",
        -          "digest",
        -          "changedFromBefore"
        -        ],
        -        "type": "object"
        -      },
        -      "hint": {
        -        "type": "string"
        -      },
        -      "kind": {
        -        "const": "ref",
        -        "type": "string"
        -      },
        -      "message": {
        -        "type": "string"
        -      },
        -      "node": {
        -        "description": "Resolved snapshot node for the matched element.",
        -        "properties": {
        -          "appName": {
        -            "type": "string"
        -          },
        -          "bundleId": {
        -            "type": "string"
        -          },
        -          "depth": {
        -            "type": "number"
        -          },
        -          "enabled": {
        -            "type": "boolean"
        -          },
        -          "focused": {
        -            "type": "boolean"
        -          },
        -          "hiddenContentAbove": {
        -            "type": "boolean"
        -          },
        -          "hiddenContentBelow": {
        -            "type": "boolean"
        -          },
        -          "hittable": {
        -            "type": "boolean"
        -          },
        -          "identifier": {
        -            "type": "string"
        -          },
        -          "index": {
        -            "type": "number"
        -          },
        -          "interactionBlocked": {
        -            "enum": [
        -              "covered"
        -            ],
        -            "type": "string"
        -          },
        -          "label": {
        -            "type": "string"
        -          },
        -          "parentIndex": {
        -            "type": "number"
        -          },
        -          "pid": {
        -            "type": "number"
        -          },
        -          "presentationHints": {
        -            "items": {
        -              "type": "string"
        -            },
        -            "type": "array"
        -          },
        -          "rect": {
        -            "properties": {
        -              "height": {
        -                "type": "number"
        -              },
        -              "width": {
        -                "type": "number"
        -              },
        -              "x": {
        -                "type": "number"
        -              },
        -              "y": {
        -                "type": "number"
        -              }
        -            },
        -            "required": [
        -              "x",
        -              "y",
        -              "width",
        -              "height"
        -            ],
        -            "type": "object"
        -          },
        -          "ref": {
        -            "description": "Stable snapshot ref such as e12.",
        -            "type": "string"
        -          },
        -          "role": {
        -            "type": "string"
        -          },
        -          "selected": {
        -            "type": "boolean"
        -          },
        -          "subrole": {
        -            "type": "string"
        -          },
        -          "surface": {
        -            "type": "string"
        -          },
        -          "type": {
        -            "type": "string"
        -          },
        -          "value": {
        -            "type": "string"
        -          },
        -          "visibleToUser": {
        -            "type": "boolean"
        -          },
        -          "windowTitle": {
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "index",
        -          "ref"
        -        ],
        -        "type": "object"
        -      },
        -      "point": {
        -        "properties": {
        -          "x": {
        -            "type": "number"
        -          },
        -          "y": {
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "x",
        -          "y"
        -        ],
        -        "type": "object"
        -      },
        -      "refLabel": {
        -        "type": "string"
        -      },
        -      "selectorChain": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "target": {
        -        "properties": {
        -          "kind": {
        -            "const": "ref",
        -            "type": "string"
        -          },
        -          "ref": {
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "kind",
        -          "ref"
        -        ],
        -        "type": "object"
        -      },
        -      "targetHittable": {
        -        "type": "boolean"
        -      },
        -      "text": {
        -        "description": "Text submitted to the field.",
        -        "type": "string"
        -      },
        -      "warning": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "kind",
        -      "target",
        -      "text"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "backendResult": {
        -        "additionalProperties": true,
        -        "description": "Raw backend result passthrough.",
        -        "type": "object"
        -      },
        -      "evidence": {
        -        "properties": {
        -          "changedFromBefore": {
        -            "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.",
        -            "type": "boolean"
        -          },
        -          "digest": {
        -            "description": "Order-independent digest of the post-action node multiset.",
        -            "type": "string"
        -          },
        -          "foregroundApp": {
        -            "description": "Foreground app bundle id or name, when the capture carries it.",
        -            "type": "string"
        -          },
        -          "interactiveNodeCount": {
        -            "description": "Subset of nodeCount the platform reports as hittable.",
        -            "type": "number"
        -          },
        -          "nodeCount": {
        -            "description": "Node count in the post-action interactive-only capture.",
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "nodeCount",
        -          "interactiveNodeCount",
        -          "digest",
        -          "changedFromBefore"
        -        ],
        -        "type": "object"
        -      },
        -      "hint": {
        -        "type": "string"
        -      },
        -      "kind": {
        -        "const": "selector",
        -        "type": "string"
        -      },
        -      "message": {
        -        "type": "string"
        -      },
        -      "node": {
        -        "description": "Resolved snapshot node for the matched element.",
        -        "properties": {
        -          "appName": {
        -            "type": "string"
        -          },
        -          "bundleId": {
        -            "type": "string"
        -          },
        -          "depth": {
        -            "type": "number"
        -          },
        -          "enabled": {
        -            "type": "boolean"
        -          },
        -          "focused": {
        -            "type": "boolean"
        -          },
        -          "hiddenContentAbove": {
        -            "type": "boolean"
        -          },
        -          "hiddenContentBelow": {
        -            "type": "boolean"
        -          },
        -          "hittable": {
        -            "type": "boolean"
        -          },
        -          "identifier": {
        -            "type": "string"
        -          },
        -          "index": {
        -            "type": "number"
        -          },
        -          "interactionBlocked": {
        -            "enum": [
        -              "covered"
        -            ],
        -            "type": "string"
        -          },
        -          "label": {
        -            "type": "string"
        -          },
        -          "parentIndex": {
        -            "type": "number"
        -          },
        -          "pid": {
        -            "type": "number"
        -          },
        -          "presentationHints": {
        -            "items": {
        -              "type": "string"
        -            },
        -            "type": "array"
        -          },
        -          "rect": {
        -            "properties": {
        -              "height": {
        -                "type": "number"
        -              },
        -              "width": {
        -                "type": "number"
        -              },
        -              "x": {
        -                "type": "number"
        -              },
        -              "y": {
        -                "type": "number"
        -              }
        -            },
        -            "required": [
        -              "x",
        -              "y",
        -              "width",
        -              "height"
        -            ],
        -            "type": "object"
        -          },
        -          "ref": {
        -            "description": "Stable snapshot ref such as e12.",
        -            "type": "string"
        -          },
        -          "role": {
        -            "type": "string"
        -          },
        -          "selected": {
        -            "type": "boolean"
        -          },
        -          "subrole": {
        -            "type": "string"
        -          },
        -          "surface": {
        -            "type": "string"
        -          },
        -          "type": {
        -            "type": "string"
        -          },
        -          "value": {
        -            "type": "string"
        -          },
        -          "visibleToUser": {
        -            "type": "boolean"
        -          },
        -          "windowTitle": {
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "index",
        -          "ref"
        -        ],
        -        "type": "object"
        -      },
        -      "point": {
        -        "properties": {
        -          "x": {
        -            "type": "number"
        -          },
        -          "y": {
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "x",
        -          "y"
        -        ],
        -        "type": "object"
        -      },
        -      "refLabel": {
        -        "type": "string"
        -      },
        -      "selectorChain": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "target": {
        -        "properties": {
        -          "kind": {
        -            "const": "selector",
        -            "type": "string"
        -          },
        -          "selector": {
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "kind",
        -          "selector"
        -        ],
        -        "type": "object"
        -      },
        -      "targetHittable": {
        -        "type": "boolean"
        -      },
        -      "text": {
        -        "description": "Text submitted to the field.",
        -        "type": "string"
        -      },
        -      "warning": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "kind",
        -      "point",
        -      "target",
        -      "node",
        -      "selectorChain",
        -      "text"
        -    ],
        -    "type": "object"
        -  }
        -]
      • addedOutput schema / properties
        Added value: +{
        +  "cost": {
        +    "properties": {
        +      "nodeCount": {
        +        "description": "Number of nodes in the original node tree when the response carries one.",
        +        "type": "number"
        +      },
        +      "runnerRoundTrips": {
        +        "description": "Number of real runner round-trips made while serving the request.",
        +        "type": "number"
        +      },
        +      "wallClockMs": {
        +        "description": "Total wall-clock time for the request in milliseconds.",
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "wallClockMs",
        +      "runnerRoundTrips"
        +    ],
        +    "type": "object"
        +  },
        +  "delayMs": {
        +    "description": "Delay between typed characters in milliseconds.",
        +    "type": "number"
        +  },
        +  "evidence": {
        +    "properties": {
        +      "changedFromBefore": {
        +        "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.",
        +        "type": "boolean"
        +      },
        +      "digest": {
        +        "description": "Order-independent digest of the post-action node multiset.",
        +        "type": "string"
        +      },
        +      "foregroundApp": {
        +        "description": "Foreground app bundle id or name, when the capture carries it.",
        +        "type": "string"
        +      },
        +      "interactiveNodeCount": {
        +        "description": "Subset of nodeCount the platform reports as hittable.",
        +        "type": "number"
        +      },
        +      "nodeCount": {
        +        "description": "Node count in the post-action interactive-only capture.",
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "nodeCount",
        +      "interactiveNodeCount",
        +      "digest",
        +      "changedFromBefore"
        +    ],
        +    "type": "object"
        +  },
        +  "hint": {
        +    "type": "string"
        +  },
        +  "maestroFallbackReason": {
        +    "const": "non-hittable-coordinate",
        +    "type": "string"
        +  },
        +  "maestroNonHittableCoordinateFallbackAllowed": {
        +    "description": "Whether the direct iOS Maestro coordinate fallback was allowed for this selector.",
        +    "type": "boolean"
        +  },
        +  "maestroNonHittableCoordinateFallbackUsed": {
        +    "description": "Whether the direct iOS Maestro coordinate fallback was actually used.",
        +    "type": "boolean"
        +  },
        +  "message": {
        +    "type": "string"
        +  },
        +  "ref": {
        +    "description": "Snapshot ref without the @ prefix when the target was an @ref.",
        +    "type": "string"
        +  },
        +  "refLabel": {
        +    "type": "string"
        +  },
        +  "referenceHeight": {
        +    "description": "Reference frame height for visualizing the interaction point.",
        +    "type": "number"
        +  },
        +  "referenceWidth": {
        +    "description": "Reference frame width for visualizing the interaction point.",
        +    "type": "number"
        +  },
        +  "resolution": {
        +    "description": "Pre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path.",
        +    "oneOf": [
        +      {
        +        "properties": {
        +          "kind": {
        +            "const": "unique",
        +            "type": "string"
        +          },
        +          "phase": {
        +            "const": "pre-action",
        +            "type": "string"
        +          },
        +          "source": {
        +            "const": "runtime",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "source",
        +          "phase",
        +          "kind"
        +        ],
        +        "type": "object"
        +      },
        +      {
        +        "properties": {
        +          "alternatives": {
        +            "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.",
        +            "items": {
        +              "properties": {
        +                "diagnosticRef": {
        +                  "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        +                  "type": "string"
        +                },
        +                "label": {
        +                  "description": "UTF-8 truncated to 256 bytes.",
        +                  "type": "string"
        +                },
        +                "role": {
        +                  "description": "UTF-8 truncated to 256 bytes.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "diagnosticRef"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "kind": {
        +            "const": "disambiguated",
        +            "type": "string"
        +          },
        +          "matchCount": {
        +            "description": "Total matches resolveSelectorChain found before disambiguation.",
        +            "type": "number"
        +          },
        +          "phase": {
        +            "const": "pre-action",
        +            "type": "string"
        +          },
        +          "source": {
        +            "const": "runtime",
        +            "type": "string"
        +          },
        +          "tiebreak": {
        +            "description": "The comparison that decided the winner.",
        +            "enum": [
        +              "visible",
        +              "deepest",
        +              "smallest-area"
        +            ],
        +            "type": "string"
        +          },
        +          "winnerDiagnostic": {
        +            "properties": {
        +              "diagnosticRef": {
        +                "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        +                "type": "string"
        +              },
        +              "label": {
        +                "description": "UTF-8 truncated to 256 bytes.",
        +                "type": "string"
        +              },
        +              "role": {
        +                "description": "UTF-8 truncated to 256 bytes.",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "diagnosticRef"
        +            ],
        +            "type": "object"
        +          }
        +        },
        +        "required": [
        +          "source",
        +          "phase",
        +          "kind",
        +          "matchCount",
        +          "winnerDiagnostic",
        +          "tiebreak"
        +        ],
        +        "type": "object"
        +      },
        +      {
        +        "properties": {
        +          "kind": {
        +            "const": "exact",
        +            "type": "string"
        +          },
        +          "phase": {
        +            "const": "pre-action",
        +            "type": "string"
        +          },
        +          "source": {
        +            "const": "ref",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "source",
        +          "phase",
        +          "kind"
        +        ],
        +        "type": "object"
        +      },
        +      {
        +        "properties": {
        +          "kind": {
        +            "const": "label-fallback",
        +            "type": "string"
        +          },
        +          "phase": {
        +            "const": "pre-action",
        +            "type": "string"
        +          },
        +          "source": {
        +            "const": "ref",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "source",
        +          "phase",
        +          "kind"
        +        ],
        +        "type": "object"
        +      },
        +      {
        +        "properties": {
        +          "kind": {
        +            "const": "not-observed",
        +            "type": "string"
        +          },
        +          "source": {
        +            "const": "direct-ios",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "source",
        +          "kind"
        +        ],
        +        "type": "object"
        +      }
        +    ],
        +    "type": "object"
        +  },
        +  "selector": {
        +    "description": "Selector expression when the target was a selector.",
        +    "type": "string"
        +  },
        +  "selectorChain": {
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  "settle": {
        +    "properties": {
        +      "captures": {
        +        "type": "number"
        +      },
        +      "diff": {
        +        "description": "Settled diff vs the pre-action tree (changed lines only).",
        +        "properties": {
        +          "lines": {
        +            "items": {
        +              "properties": {
        +                "kind": {
        +                  "enum": [
        +                    "added",
        +                    "removed"
        +                  ],
        +                  "type": "string"
        +                },
        +                "ref": {
        +                  "description": "Plain ref body (e12) for added lines.",
        +                  "type": "string"
        +                },
        +                "text": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "kind",
        +                "text"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "summary": {
        +            "properties": {
        +              "additions": {
        +                "type": "number"
        +              },
        +              "removals": {
        +                "type": "number"
        +              },
        +              "unchanged": {
        +                "type": "number"
        +              }
        +            },
        +            "required": [
        +              "additions",
        +              "removals",
        +              "unchanged"
        +            ],
        +            "type": "object"
        +          },
        +          "truncated": {
        +            "description": "Lines were capped to the response bound.",
        +            "type": "boolean"
        +          }
        +        },
        +        "required": [
        +          "summary",
        +          "lines"
        +        ],
        +        "type": "object"
        +      },
        +      "hint": {
        +        "type": "string"
        +      },
        +      "quietMs": {
        +        "type": "number"
        +      },
        +      "refs": {
        +        "items": {
        +          "properties": {
        +            "ref": {
        +              "description": "Plain ref body (e12) minted from the stored settled tree.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "ref"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "refsGeneration": {
        +        "description": "Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.",
        +        "type": "number"
        +      },
        +      "settled": {
        +        "description": "Whether the UI held the quiet window before the deadline. false is advisory, not failure.",
        +        "type": "boolean"
        +      },
        +      "tail": {
        +        "description": "Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).",
        +        "items": {
        +          "properties": {
        +            "label": {
        +              "type": "string"
        +            },
        +            "ref": {
        +              "description": "Plain ref body (e12) minted from the stored settled tree.",
        +              "type": "string"
        +            },
        +            "role": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "ref",
        +            "role"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "tailTruncated": {
        +        "description": "Present (true) when tail candidates exceeded the response cap.",
        +        "type": "boolean"
        +      },
        +      "timeoutMs": {
        +        "type": "number"
        +      },
        +      "waitedMs": {
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "settled",
        +      "waitedMs",
        +      "captures",
        +      "quietMs",
        +      "timeoutMs"
        +    ],
        +    "type": "object"
        +  },
        +  "targetHittable": {
        +    "type": "boolean"
        +  },
        +  "targetKind": {
        +    "description": "Resolved interaction target kind.",
        +    "enum": [
        +      "point",
        +      "ref",
        +      "selector"
        +    ],
        +    "type": "string"
        +  },
        +  "text": {
        +    "description": "Text submitted to the field.",
        +    "type": "string"
        +  },
        +  "warning": {
        +    "type": "string"
        +  },
        +  "x": {
        +    "description": "Resolved interaction x coordinate when available.",
        +    "type": "number"
        +  },
        +  "y": {
        +    "description": "Resolved interaction y coordinate when available.",
        +    "type": "number"
        +  }
        +}
      • addedOutput schema / required
        Added value: +[
        +  "targetKind",
        +  "text"
        +]
    • Changedfind5 fields changed
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / record
        Added value: +{
        +  "description": "Force-record this out-of-band observation into a repair-armed heal (mutually exclusive with noRecord). Authored replay steps are recorded automatically and never need this. On find, valid only for a read-only action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "description": "Daemon response data for the find command.",
        +  "properties": {
        +    "cost": {
        +      "properties": {
        +        "nodeCount": {
        +          "description": "Number of nodes in the original node tree when the response carries one.",
        +          "type": "number"
        +        },
        +        "runnerRoundTrips": {
        +          "description": "Number of real runner round-trips made while serving the request.",
        +          "type": "number"
        +        },
        +        "wallClockMs": {
        +          "description": "Total wall-clock time for the request in milliseconds.",
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "wallClockMs",
        +        "runnerRoundTrips"
        +      ],
        +      "type": "object"
        +    },
        +    "found": {
        +      "description": "Whether a wait/exists/read-only find satisfied its condition.",
        +      "type": "boolean"
        +    },
        +    "locator": {
        +      "description": "Locator kind used for the find action.",
        +      "type": "string"
        +    },
        +    "message": {
        +      "description": "Diagnostic message for mutating find actions.",
        +      "type": "string"
        +    },
        +    "node": {
        +      "additionalProperties": true,
        +      "description": "Snapshot node for find get_attrs/get_text.",
        +      "type": "object"
        +    },
        +    "query": {
        +      "description": "Query argument used for the find action.",
        +      "type": "string"
        +    },
        +    "ref": {
        +      "description": "Snapshot ref without the @ prefix when the find action returns one.",
        +      "type": "string"
        +    },
        +    "refsGeneration": {
        +      "description": "ADR 0014 ref frame epoch for read-only find actions.",
        +      "type": "number"
        +    },
        +    "settle": {
        +      "properties": {
        +        "captures": {
        +          "type": "number"
        +        },
        +        "diff": {
        +          "description": "Settled diff vs the pre-action tree (changed lines only).",
        +          "properties": {
        +            "lines": {
        +              "items": {
        +                "properties": {
        +                  "kind": {
        +                    "enum": [
        +                      "added",
        +                      "removed"
        +                    ],
        +                    "type": "string"
        +                  },
        +                  "ref": {
        +                    "description": "Plain ref body (e12) for added lines.",
        +                    "type": "string"
        +                  },
        +                  "text": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "kind",
        +                  "text"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "summary": {
        +              "properties": {
        +                "additions": {
        +                  "type": "number"
        +                },
        +                "removals": {
        +                  "type": "number"
        +                },
        +                "unchanged": {
        +                  "type": "number"
        +                }
        +              },
        +              "required": [
        +                "additions",
        +                "removals",
        +                "unchanged"
        +              ],
        +              "type": "object"
        +            },
        +            "truncated": {
        +              "description": "Lines were capped to the response bound.",
        +              "type": "boolean"
        +            }
        +          },
        +          "required": [
        +            "summary",
        +            "lines"
        +          ],
        +          "type": "object"
        +        },
        +        "hint": {
        +          "type": "string"
        +        },
        +        "quietMs": {
        +          "type": "number"
        +        },
        +        "refs": {
        +          "items": {
        +            "properties": {
        +              "ref": {
        +                "description": "Plain ref body (e12) minted from the stored settled tree.",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "ref"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "refsGeneration": {
        +          "description": "Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.",
        +          "type": "number"
        +        },
        +        "settled": {
        +          "description": "Whether the UI held the quiet window before the deadline. false is advisory, not failure.",
        +          "type": "boolean"
        +        },
        +        "tail": {
        +          "description": "Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).",
        +          "items": {
        +            "properties": {
        +              "label": {
        +                "type": "string"
        +              },
        +              "ref": {
        +                "description": "Plain ref body (e12) minted from the stored settled tree.",
        +                "type": "string"
        +              },
        +              "role": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "ref",
        +              "role"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "tailTruncated": {
        +          "description": "Present (true) when tail candidates exceeded the response cap.",
        +          "type": "boolean"
        +        },
        +        "timeoutMs": {
        +          "type": "number"
        +        },
        +        "waitedMs": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "settled",
        +        "waitedMs",
        +        "captures",
        +        "quietMs",
        +        "timeoutMs"
        +      ],
        +      "type": "object"
        +    },
        +    "text": {
        +      "description": "Text value returned by find get_text.",
        +      "type": "string"
        +    },
        +    "waitedMs": {
        +      "description": "Milliseconds waited for a read-only find condition.",
        +      "type": "number"
        +    },
        +    "x": {
        +      "description": "Resolved x coordinate for mutating find actions.",
        +      "type": "number"
        +    },
        +    "y": {
        +      "description": "Resolved y coordinate for mutating find actions.",
        +      "type": "number"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedfocus3 fields changed
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
    • Changedgesture8 fields changed
      • changedInput schema / properties / durationMs / description
        Previous value: -"Gesture duration in milliseconds."New value: +"Pan/transform duration."
      • addedInput schema / properties / durationMs / maximum
        Added value: +10000
      • changedInput schema / properties / durationMs / minimum
        Previous value: -0New value: +16
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / pointerCount
        Added value: +{
        +  "description": "Pan touch pointer count (1 or 2).",
        +  "maximum": 2,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
      • removedInput schema / properties / velocity
        Removed value: -{
        -  "description": "Rotate gesture velocity.",
        -  "minimum": 0,
        -  "type": "integer"
        -}
    • Changedget4 fields changed
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / record
        Added value: +{
        +  "description": "Force-record this out-of-band observation into a repair-armed heal (mutually exclusive with noRecord). Authored replay steps are recorded automatically and never need this. On find, valid only for a read-only action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
    • Changedhome3 fields changed
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
    • Changedinstall3 fields changed
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
    • Changedinstall-from-source3 fields changed
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
    • Changedis5 fields changed
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / predicate / enum
        Previous value: -[
        -  "visible",
        -  "hidden",
        -  "exists",
        -  "editable",
        -  "selected",
        -  "text"
        -]New value: +[
        +  "visible",
        +  "hidden",
        +  "exists",
        +  "editable",
        +  "selected",
        +  "focused",
        +  "text"
        +]
      • addedInput schema / properties / record
        Added value: +{
        +  "description": "Force-record this out-of-band observation into a repair-armed heal (mutually exclusive with noRecord). Authored replay steps are recorded automatically and never need this. On find, valid only for a read-only action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
    • Changedkeyboard3 fields changed
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
    • Changedlogs2 fields changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
    • Changedlongpress9 fields changed
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
      • addedInput schema / properties / settle
        Added value: +{
        +  "description": "After the action, wait for the UI to go quiet and return the settled diff vs the pre-action tree in the same response. Best-effort; never fails the action.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / settleQuietMs
        Added value: +{
        +  "description": "Settle: quiet window in milliseconds (default 500).",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / timeoutMs
        Added value: +{
        +  "description": "Settle: wait deadline in milliseconds (default 10000).",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • removedOutput schema / oneOf
        Removed value: -[
        -  {
        -    "properties": {
        -      "backendResult": {
        -        "additionalProperties": true,
        -        "description": "Raw backend result passthrough.",
        -        "type": "object"
        -      },
        -      "durationMs": {
        -        "type": "number"
        -      },
        -      "kind": {
        -        "const": "point",
        -        "type": "string"
        -      },
        -      "message": {
        -        "type": "string"
        -      },
        -      "point": {
        -        "properties": {
        -          "x": {
        -            "type": "number"
        -          },
        -          "y": {
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "x",
        -          "y"
        -        ],
        -        "type": "object"
        -      },
        -      "warning": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "kind",
        -      "point"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "backendResult": {
        -        "additionalProperties": true,
        -        "description": "Raw backend result passthrough.",
        -        "type": "object"
        -      },
        -      "durationMs": {
        -        "type": "number"
        -      },
        -      "hint": {
        -        "type": "string"
        -      },
        -      "kind": {
        -        "const": "ref",
        -        "type": "string"
        -      },
        -      "message": {
        -        "type": "string"
        -      },
        -      "node": {
        -        "description": "Resolved snapshot node for the matched element.",
        -        "properties": {
        -          "appName": {
        -            "type": "string"
        -          },
        -          "bundleId": {
        -            "type": "string"
        -          },
        -          "depth": {
        -            "type": "number"
        -          },
        -          "enabled": {
        -            "type": "boolean"
        -          },
        -          "focused": {
        -            "type": "boolean"
        -          },
        -          "hiddenContentAbove": {
        -            "type": "boolean"
        -          },
        -          "hiddenContentBelow": {
        -            "type": "boolean"
        -          },
        -          "hittable": {
        -            "type": "boolean"
        -          },
        -          "identifier": {
        -            "type": "string"
        -          },
        -          "index": {
        -            "type": "number"
        -          },
        -          "interactionBlocked": {
        -            "enum": [
        -              "covered"
        -            ],
        -            "type": "string"
        -          },
        -          "label": {
        -            "type": "string"
        -          },
        -          "parentIndex": {
        -            "type": "number"
        -          },
        -          "pid": {
        -            "type": "number"
        -          },
        -          "presentationHints": {
        -            "items": {
        -              "type": "string"
        -            },
        -            "type": "array"
        -          },
        -          "rect": {
        -            "properties": {
        -              "height": {
        -                "type": "number"
        -              },
        -              "width": {
        -                "type": "number"
        -              },
        -              "x": {
        -                "type": "number"
        -              },
        -              "y": {
        -                "type": "number"
        -              }
        -            },
        -            "required": [
        -              "x",
        -              "y",
        -              "width",
        -              "height"
        -            ],
        -            "type": "object"
        -          },
        -          "ref": {
        -            "description": "Stable snapshot ref such as e12.",
        -            "type": "string"
        -          },
        -          "role": {
        -            "type": "string"
        -          },
        -          "selected": {
        -            "type": "boolean"
        -          },
        -          "subrole": {
        -            "type": "string"
        -          },
        -          "surface": {
        -            "type": "string"
        -          },
        -          "type": {
        -            "type": "string"
        -          },
        -          "value": {
        -            "type": "string"
        -          },
        -          "visibleToUser": {
        -            "type": "boolean"
        -          },
        -          "windowTitle": {
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "index",
        -          "ref"
        -        ],
        -        "type": "object"
        -      },
        -      "point": {
        -        "properties": {
        -          "x": {
        -            "type": "number"
        -          },
        -          "y": {
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "x",
        -          "y"
        -        ],
        -        "type": "object"
        -      },
        -      "refLabel": {
        -        "type": "string"
        -      },
        -      "selectorChain": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "target": {
        -        "properties": {
        -          "kind": {
        -            "const": "ref",
        -            "type": "string"
        -          },
        -          "ref": {
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "kind",
        -          "ref"
        -        ],
        -        "type": "object"
        -      },
        -      "targetHittable": {
        -        "type": "boolean"
        -      },
        -      "warning": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "kind",
        -      "target"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "backendResult": {
        -        "additionalProperties": true,
        -        "description": "Raw backend result passthrough.",
        -        "type": "object"
        -      },
        -      "durationMs": {
        -        "type": "number"
        -      },
        -      "hint": {
        -        "type": "string"
        -      },
        -      "kind": {
        -        "const": "selector",
        -        "type": "string"
        -      },
        -      "message": {
        -        "type": "string"
        -      },
        -      "node": {
        -        "description": "Resolved snapshot node for the matched element.",
        -        "properties": {
        -          "appName": {
        -            "type": "string"
        -          },
        -          "bundleId": {
        -            "type": "string"
        -          },
        -          "depth": {
        -            "type": "number"
        -          },
        -          "enabled": {
        -            "type": "boolean"
        -          },
        -          "focused": {
        -            "type": "boolean"
        -          },
        -          "hiddenContentAbove": {
        -            "type": "boolean"
        -          },
        -          "hiddenContentBelow": {
        -            "type": "boolean"
        -          },
        -          "hittable": {
        -            "type": "boolean"
        -          },
        -          "identifier": {
        -            "type": "string"
        -          },
        -          "index": {
        -            "type": "number"
        -          },
        -          "interactionBlocked": {
        -            "enum": [
        -              "covered"
        -            ],
        -            "type": "string"
        -          },
        -          "label": {
        -            "type": "string"
        -          },
        -          "parentIndex": {
        -            "type": "number"
        -          },
        -          "pid": {
        -            "type": "number"
        -          },
        -          "presentationHints": {
        -            "items": {
        -              "type": "string"
        -            },
        -            "type": "array"
        -          },
        -          "rect": {
        -            "properties": {
        -              "height": {
        -                "type": "number"
        -              },
        -              "width": {
        -                "type": "number"
        -              },
        -              "x": {
        -                "type": "number"
        -              },
        -              "y": {
        -                "type": "number"
        -              }
        -            },
        -            "required": [
        -              "x",
        -              "y",
        -              "width",
        -              "height"
        -            ],
        -            "type": "object"
        -          },
        -          "ref": {
        -            "description": "Stable snapshot ref such as e12.",
        -            "type": "string"
        -          },
        -          "role": {
        -            "type": "string"
        -          },
        -          "selected": {
        -            "type": "boolean"
        -          },
        -          "subrole": {
        -            "type": "string"
        -          },
        -          "surface": {
        -            "type": "string"
        -          },
        -          "type": {
        -            "type": "string"
        -          },
        -          "value": {
        -            "type": "string"
        -          },
        -          "visibleToUser": {
        -            "type": "boolean"
        -          },
        -          "windowTitle": {
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "index",
        -          "ref"
        -        ],
        -        "type": "object"
        -      },
        -      "point": {
        -        "properties": {
        -          "x": {
        -            "type": "number"
        -          },
        -          "y": {
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "x",
        -          "y"
        -        ],
        -        "type": "object"
        -      },
        -      "refLabel": {
        -        "type": "string"
        -      },
        -      "selectorChain": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "target": {
        -        "properties": {
        -          "kind": {
        -            "const": "selector",
        -            "type": "string"
        -          },
        -          "selector": {
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "kind",
        -          "selector"
        -        ],
        -        "type": "object"
        -      },
        -      "targetHittable": {
        -        "type": "boolean"
        -      },
        -      "warning": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "kind",
        -      "point",
        -      "target",
        -      "node",
        -      "selectorChain"
        -    ],
        -    "type": "object"
        -  }
        -]
      • addedOutput schema / properties
        Added value: +{
        +  "cost": {
        +    "properties": {
        +      "nodeCount": {
        +        "description": "Number of nodes in the original node tree when the response carries one.",
        +        "type": "number"
        +      },
        +      "runnerRoundTrips": {
        +        "description": "Number of real runner round-trips made while serving the request.",
        +        "type": "number"
        +      },
        +      "wallClockMs": {
        +        "description": "Total wall-clock time for the request in milliseconds.",
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "wallClockMs",
        +      "runnerRoundTrips"
        +    ],
        +    "type": "object"
        +  },
        +  "durationMs": {
        +    "type": "number"
        +  },
        +  "evidence": {
        +    "properties": {
        +      "changedFromBefore": {
        +        "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.",
        +        "type": "boolean"
        +      },
        +      "digest": {
        +        "description": "Order-independent digest of the post-action node multiset.",
        +        "type": "string"
        +      },
        +      "foregroundApp": {
        +        "description": "Foreground app bundle id or name, when the capture carries it.",
        +        "type": "string"
        +      },
        +      "interactiveNodeCount": {
        +        "description": "Subset of nodeCount the platform reports as hittable.",
        +        "type": "number"
        +      },
        +      "nodeCount": {
        +        "description": "Node count in the post-action interactive-only capture.",
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "nodeCount",
        +      "interactiveNodeCount",
        +      "digest",
        +      "changedFromBefore"
        +    ],
        +    "type": "object"
        +  },
        +  "gesture": {
        +    "const": "longpress",
        +    "type": "string"
        +  },
        +  "hint": {
        +    "type": "string"
        +  },
        +  "maestroFallbackReason": {
        +    "const": "non-hittable-coordinate",
        +    "type": "string"
        +  },
        +  "maestroNonHittableCoordinateFallbackAllowed": {
        +    "description": "Whether the direct iOS Maestro coordinate fallback was allowed for this selector.",
        +    "type": "boolean"
        +  },
        +  "maestroNonHittableCoordinateFallbackUsed": {
        +    "description": "Whether the direct iOS Maestro coordinate fallback was actually used.",
        +    "type": "boolean"
        +  },
        +  "message": {
        +    "type": "string"
        +  },
        +  "ref": {
        +    "description": "Snapshot ref without the @ prefix when the target was an @ref.",
        +    "type": "string"
        +  },
        +  "refLabel": {
        +    "type": "string"
        +  },
        +  "referenceHeight": {
        +    "description": "Reference frame height for visualizing the interaction point.",
        +    "type": "number"
        +  },
        +  "referenceWidth": {
        +    "description": "Reference frame width for visualizing the interaction point.",
        +    "type": "number"
        +  },
        +  "resolution": {
        +    "description": "Pre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path.",
        +    "oneOf": [
        +      {
        +        "properties": {
        +          "kind": {
        +            "const": "unique",
        +            "type": "string"
        +          },
        +          "phase": {
        +            "const": "pre-action",
        +            "type": "string"
        +          },
        +          "source": {
        +            "const": "runtime",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "source",
        +          "phase",
        +          "kind"
        +        ],
        +        "type": "object"
        +      },
        +      {
        +        "properties": {
        +          "alternatives": {
        +            "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.",
        +            "items": {
        +              "properties": {
        +                "diagnosticRef": {
        +                  "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        +                  "type": "string"
        +                },
        +                "label": {
        +                  "description": "UTF-8 truncated to 256 bytes.",
        +                  "type": "string"
        +                },
        +                "role": {
        +                  "description": "UTF-8 truncated to 256 bytes.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "diagnosticRef"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "kind": {
        +            "const": "disambiguated",
        +            "type": "string"
        +          },
        +          "matchCount": {
        +            "description": "Total matches resolveSelectorChain found before disambiguation.",
        +            "type": "number"
        +          },
        +          "phase": {
        +            "const": "pre-action",
        +            "type": "string"
        +          },
        +          "source": {
        +            "const": "runtime",
        +            "type": "string"
        +          },
        +          "tiebreak": {
        +            "description": "The comparison that decided the winner.",
        +            "enum": [
        +              "visible",
        +              "deepest",
        +              "smallest-area"
        +            ],
        +            "type": "string"
        +          },
        +          "winnerDiagnostic": {
        +            "properties": {
        +              "diagnosticRef": {
        +                "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        +                "type": "string"
        +              },
        +              "label": {
        +                "description": "UTF-8 truncated to 256 bytes.",
        +                "type": "string"
        +              },
        +              "role": {
        +                "description": "UTF-8 truncated to 256 bytes.",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "diagnosticRef"
        +            ],
        +            "type": "object"
        +          }
        +        },
        +        "required": [
        +          "source",
        +          "phase",
        +          "kind",
        +          "matchCount",
        +          "winnerDiagnostic",
        +          "tiebreak"
        +        ],
        +        "type": "object"
        +      },
        +      {
        +        "properties": {
        +          "kind": {
        +            "const": "exact",
        +            "type": "string"
        +          },
        +          "phase": {
        +            "const": "pre-action",
        +            "type": "string"
        +          },
        +          "source": {
        +            "const": "ref",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "source",
        +          "phase",
        +          "kind"
        +        ],
        +        "type": "object"
        +      },
        +      {
        +        "properties": {
        +          "kind": {
        +            "const": "label-fallback",
        +            "type": "string"
        +          },
        +          "phase": {
        +            "const": "pre-action",
        +            "type": "string"
        +          },
        +          "source": {
        +            "const": "ref",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "source",
        +          "phase",
        +          "kind"
        +        ],
        +        "type": "object"
        +      },
        +      {
        +        "properties": {
        +          "kind": {
        +            "const": "not-observed",
        +            "type": "string"
        +          },
        +          "source": {
        +            "const": "direct-ios",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "source",
        +          "kind"
        +        ],
        +        "type": "object"
        +      }
        +    ],
        +    "type": "object"
        +  },
        +  "selector": {
        +    "description": "Selector expression when the target was a selector.",
        +    "type": "string"
        +  },
        +  "selectorChain": {
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  "settle": {
        +    "properties": {
        +      "captures": {
        +        "type": "number"
        +      },
        +      "diff": {
        +        "description": "Settled diff vs the pre-action tree (changed lines only).",
        +        "properties": {
        +          "lines": {
        +            "items": {
        +              "properties": {
        +                "kind": {
        +                  "enum": [
        +                    "added",
        +                    "removed"
        +                  ],
        +                  "type": "string"
        +                },
        +                "ref": {
        +                  "description": "Plain ref body (e12) for added lines.",
        +                  "type": "string"
        +                },
        +                "text": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "kind",
        +                "text"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "summary": {
        +            "properties": {
        +              "additions": {
        +                "type": "number"
        +              },
        +              "removals": {
        +                "type": "number"
        +              },
        +              "unchanged": {
        +                "type": "number"
        +              }
        +            },
        +            "required": [
        +              "additions",
        +              "removals",
        +              "unchanged"
        +            ],
        +            "type": "object"
        +          },
        +          "truncated": {
        +            "description": "Lines were capped to the response bound.",
        +            "type": "boolean"
        +          }
        +        },
        +        "required": [
        +          "summary",
        +          "lines"
        +        ],
        +        "type": "object"
        +      },
        +      "hint": {
        +        "type": "string"
        +      },
        +      "quietMs": {
        +        "type": "number"
        +      },
        +      "refs": {
        +        "items": {
        +          "properties": {
        +            "ref": {
        +              "description": "Plain ref body (e12) minted from the stored settled tree.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "ref"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "refsGeneration": {
        +        "description": "Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.",
        +        "type": "number"
        +      },
        +      "settled": {
        +        "description": "Whether the UI held the quiet window before the deadline. false is advisory, not failure.",
        +        "type": "boolean"
        +      },
        +      "tail": {
        +        "description": "Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).",
        +        "items": {
        +          "properties": {
        +            "label": {
        +              "type": "string"
        +            },
        +            "ref": {
        +              "description": "Plain ref body (e12) minted from the stored settled tree.",
        +              "type": "string"
        +            },
        +            "role": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "ref",
        +            "role"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "tailTruncated": {
        +        "description": "Present (true) when tail candidates exceeded the response cap.",
        +        "type": "boolean"
        +      },
        +      "timeoutMs": {
        +        "type": "number"
        +      },
        +      "waitedMs": {
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "settled",
        +      "waitedMs",
        +      "captures",
        +      "quietMs",
        +      "timeoutMs"
        +    ],
        +    "type": "object"
        +  },
        +  "targetHittable": {
        +    "type": "boolean"
        +  },
        +  "targetKind": {
        +    "description": "Resolved interaction target kind.",
        +    "enum": [
        +      "point",
        +      "ref",
        +      "selector"
        +    ],
        +    "type": "string"
        +  },
        +  "warning": {
        +    "type": "string"
        +  },
        +  "x": {
        +    "description": "Resolved interaction x coordinate when available.",
        +    "type": "number"
        +  },
        +  "y": {
        +    "description": "Resolved interaction y coordinate when available.",
        +    "type": "number"
        +  }
        +}
      • addedOutput schema / required
        Added value: +[
        +  "targetKind"
        +]
    • Changedmetro2 fields changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
    • Changednetwork2 fields changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
    • Changedopen8 fields changed
      • addedInput schema / properties / bundleUrl
        Added value: +{
        +  "description": "Session-scoped bundle URL hint applied to the opened app.",
        +  "type": "string"
        +}
      • addedInput schema / properties / force
        Added value: +{
        +  "description": "Overwrite an existing --save-script target instead of refusing (alias: --overwrite).",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / launchUrl
        Added value: +{
        +  "description": "Session-scoped launch URL hint applied to the opened app.",
        +  "type": "string"
        +}
      • addedInput schema / properties / metroHost
        Added value: +{
        +  "description": "Session-scoped Metro/debug host hint applied to the opened app.",
        +  "type": "string"
        +}
      • addedInput schema / properties / metroPort
        Added value: +{
        +  "description": "Session-scoped Metro/debug port hint applied to the opened app. On an emulator/simulator the host defaults to the loopback alias (Android 10.0.2.2, iOS 127.0.0.1) when --metro-host is omitted; physical devices still require an explicit --metro-host.",
        +  "maximum": 65535,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
      • addedInput schema / properties / testIme
        Added value: +{
        +  "description": "Activate the headless Android test IME for deterministic Unicode text entry (default on for emulators; opt-in on real devices).",
        +  "type": "boolean"
        +}
    • Addedorientation
    • Changedperf3 fields changed
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
    • Changedpress9 fields changed
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
      • addedInput schema / properties / settle
        Added value: +{
        +  "description": "After the action, wait for the UI to go quiet and return the settled diff vs the pre-action tree in the same response. Best-effort; never fails the action.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / settleQuietMs
        Added value: +{
        +  "description": "Settle: quiet window in milliseconds (default 500).",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / timeoutMs
        Added value: +{
        +  "description": "Settle: wait deadline in milliseconds (default 10000).",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • removedOutput schema / oneOf
        Removed value: -[
        -  {
        -    "properties": {
        -      "backendResult": {
        -        "additionalProperties": true,
        -        "description": "Raw backend result passthrough.",
        -        "type": "object"
        -      },
        -      "evidence": {
        -        "properties": {
        -          "changedFromBefore": {
        -            "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.",
        -            "type": "boolean"
        -          },
        -          "digest": {
        -            "description": "Order-independent digest of the post-action node multiset.",
        -            "type": "string"
        -          },
        -          "foregroundApp": {
        -            "description": "Foreground app bundle id or name, when the capture carries it.",
        -            "type": "string"
        -          },
        -          "interactiveNodeCount": {
        -            "description": "Subset of nodeCount the platform reports as hittable.",
        -            "type": "number"
        -          },
        -          "nodeCount": {
        -            "description": "Node count in the post-action interactive-only capture.",
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "nodeCount",
        -          "interactiveNodeCount",
        -          "digest",
        -          "changedFromBefore"
        -        ],
        -        "type": "object"
        -      },
        -      "kind": {
        -        "const": "point",
        -        "type": "string"
        -      },
        -      "message": {
        -        "type": "string"
        -      },
        -      "point": {
        -        "properties": {
        -          "x": {
        -            "type": "number"
        -          },
        -          "y": {
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "x",
        -          "y"
        -        ],
        -        "type": "object"
        -      },
        -      "warning": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "kind",
        -      "point"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "backendResult": {
        -        "additionalProperties": true,
        -        "description": "Raw backend result passthrough.",
        -        "type": "object"
        -      },
        -      "evidence": {
        -        "properties": {
        -          "changedFromBefore": {
        -            "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.",
        -            "type": "boolean"
        -          },
        -          "digest": {
        -            "description": "Order-independent digest of the post-action node multiset.",
        -            "type": "string"
        -          },
        -          "foregroundApp": {
        -            "description": "Foreground app bundle id or name, when the capture carries it.",
        -            "type": "string"
        -          },
        -          "interactiveNodeCount": {
        -            "description": "Subset of nodeCount the platform reports as hittable.",
        -            "type": "number"
        -          },
        -          "nodeCount": {
        -            "description": "Node count in the post-action interactive-only capture.",
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "nodeCount",
        -          "interactiveNodeCount",
        -          "digest",
        -          "changedFromBefore"
        -        ],
        -        "type": "object"
        -      },
        -      "hint": {
        -        "type": "string"
        -      },
        -      "kind": {
        -        "const": "ref",
        -        "type": "string"
        -      },
        -      "message": {
        -        "type": "string"
        -      },
        -      "node": {
        -        "description": "Resolved snapshot node for the matched element.",
        -        "properties": {
        -          "appName": {
        -            "type": "string"
        -          },
        -          "bundleId": {
        -            "type": "string"
        -          },
        -          "depth": {
        -            "type": "number"
        -          },
        -          "enabled": {
        -            "type": "boolean"
        -          },
        -          "focused": {
        -            "type": "boolean"
        -          },
        -          "hiddenContentAbove": {
        -            "type": "boolean"
        -          },
        -          "hiddenContentBelow": {
        -            "type": "boolean"
        -          },
        -          "hittable": {
        -            "type": "boolean"
        -          },
        -          "identifier": {
        -            "type": "string"
        -          },
        -          "index": {
        -            "type": "number"
        -          },
        -          "interactionBlocked": {
        -            "enum": [
        -              "covered"
        -            ],
        -            "type": "string"
        -          },
        -          "label": {
        -            "type": "string"
        -          },
        -          "parentIndex": {
        -            "type": "number"
        -          },
        -          "pid": {
        -            "type": "number"
        -          },
        -          "presentationHints": {
        -            "items": {
        -              "type": "string"
        -            },
        -            "type": "array"
        -          },
        -          "rect": {
        -            "properties": {
        -              "height": {
        -                "type": "number"
        -              },
        -              "width": {
        -                "type": "number"
        -              },
        -              "x": {
        -                "type": "number"
        -              },
        -              "y": {
        -                "type": "number"
        -              }
        -            },
        -            "required": [
        -              "x",
        -              "y",
        -              "width",
        -              "height"
        -            ],
        -            "type": "object"
        -          },
        -          "ref": {
        -            "description": "Stable snapshot ref such as e12.",
        -            "type": "string"
        -          },
        -          "role": {
        -            "type": "string"
        -          },
        -          "selected": {
        -            "type": "boolean"
        -          },
        -          "subrole": {
        -            "type": "string"
        -          },
        -          "surface": {
        -            "type": "string"
        -          },
        -          "type": {
        -            "type": "string"
        -          },
        -          "value": {
        -            "type": "string"
        -          },
        -          "visibleToUser": {
        -            "type": "boolean"
        -          },
        -          "windowTitle": {
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "index",
        -          "ref"
        -        ],
        -        "type": "object"
        -      },
        -      "point": {
        -        "properties": {
        -          "x": {
        -            "type": "number"
        -          },
        -          "y": {
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "x",
        -          "y"
        -        ],
        -        "type": "object"
        -      },
        -      "refLabel": {
        -        "type": "string"
        -      },
        -      "selectorChain": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "target": {
        -        "properties": {
        -          "kind": {
        -            "const": "ref",
        -            "type": "string"
        -          },
        -          "ref": {
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "kind",
        -          "ref"
        -        ],
        -        "type": "object"
        -      },
        -      "targetHittable": {
        -        "type": "boolean"
        -      },
        -      "warning": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "kind",
        -      "target"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "backendResult": {
        -        "additionalProperties": true,
        -        "description": "Raw backend result passthrough.",
        -        "type": "object"
        -      },
        -      "evidence": {
        -        "properties": {
        -          "changedFromBefore": {
        -            "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.",
        -            "type": "boolean"
        -          },
        -          "digest": {
        -            "description": "Order-independent digest of the post-action node multiset.",
        -            "type": "string"
        -          },
        -          "foregroundApp": {
        -            "description": "Foreground app bundle id or name, when the capture carries it.",
        -            "type": "string"
        -          },
        -          "interactiveNodeCount": {
        -            "description": "Subset of nodeCount the platform reports as hittable.",
        -            "type": "number"
        -          },
        -          "nodeCount": {
        -            "description": "Node count in the post-action interactive-only capture.",
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "nodeCount",
        -          "interactiveNodeCount",
        -          "digest",
        -          "changedFromBefore"
        -        ],
        -        "type": "object"
        -      },
        -      "hint": {
        -        "type": "string"
        -      },
        -      "kind": {
        -        "const": "selector",
        -        "type": "string"
        -      },
        -      "message": {
        -        "type": "string"
        -      },
        -      "node": {
        -        "description": "Resolved snapshot node for the matched element.",
        -        "properties": {
        -          "appName": {
        -            "type": "string"
        -          },
        -          "bundleId": {
        -            "type": "string"
        -          },
        -          "depth": {
        -            "type": "number"
        -          },
        -          "enabled": {
        -            "type": "boolean"
        -          },
        -          "focused": {
        -            "type": "boolean"
        -          },
        -          "hiddenContentAbove": {
        -            "type": "boolean"
        -          },
        -          "hiddenContentBelow": {
        -            "type": "boolean"
        -          },
        -          "hittable": {
        -            "type": "boolean"
        -          },
        -          "identifier": {
        -            "type": "string"
        -          },
        -          "index": {
        -            "type": "number"
        -          },
        -          "interactionBlocked": {
        -            "enum": [
        -              "covered"
        -            ],
        -            "type": "string"
        -          },
        -          "label": {
        -            "type": "string"
        -          },
        -          "parentIndex": {
        -            "type": "number"
        -          },
        -          "pid": {
        -            "type": "number"
        -          },
        -          "presentationHints": {
        -            "items": {
        -              "type": "string"
        -            },
        -            "type": "array"
        -          },
        -          "rect": {
        -            "properties": {
        -              "height": {
        -                "type": "number"
        -              },
        -              "width": {
        -                "type": "number"
        -              },
        -              "x": {
        -                "type": "number"
        -              },
        -              "y": {
        -                "type": "number"
        -              }
        -            },
        -            "required": [
        -              "x",
        -              "y",
        -              "width",
        -              "height"
        -            ],
        -            "type": "object"
        -          },
        -          "ref": {
        -            "description": "Stable snapshot ref such as e12.",
        -            "type": "string"
        -          },
        -          "role": {
        -            "type": "string"
        -          },
        -          "selected": {
        -            "type": "boolean"
        -          },
        -          "subrole": {
        -            "type": "string"
        -          },
        -          "surface": {
        -            "type": "string"
        -          },
        -          "type": {
        -            "type": "string"
        -          },
        -          "value": {
        -            "type": "string"
        -          },
        -          "visibleToUser": {
        -            "type": "boolean"
        -          },
        -          "windowTitle": {
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "index",
        -          "ref"
        -        ],
        -        "type": "object"
        -      },
        -      "point": {
        -        "properties": {
        -          "x": {
        -            "type": "number"
        -          },
        -          "y": {
        -            "type": "number"
        -          }
        -        },
        -        "required": [
        -          "x",
        -          "y"
        -        ],
        -        "type": "object"
        -      },
        -      "refLabel": {
        -        "type": "string"
        -      },
        -      "selectorChain": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "target": {
        -        "properties": {
        -          "kind": {
        -            "const": "selector",
        -            "type": "string"
        -          },
        -          "selector": {
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "kind",
        -          "selector"
        -        ],
        -        "type": "object"
        -      },
        -      "targetHittable": {
        -        "type": "boolean"
        -      },
        -      "warning": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "kind",
        -      "point",
        -      "target",
        -      "node",
        -      "selectorChain"
        -    ],
        -    "type": "object"
        -  }
        -]
      • addedOutput schema / properties
        Added value: +{
        +  "button": {
        +    "enum": [
        +      "secondary",
        +      "middle"
        +    ],
        +    "type": "string"
        +  },
        +  "cost": {
        +    "properties": {
        +      "nodeCount": {
        +        "description": "Number of nodes in the original node tree when the response carries one.",
        +        "type": "number"
        +      },
        +      "runnerRoundTrips": {
        +        "description": "Number of real runner round-trips made while serving the request.",
        +        "type": "number"
        +      },
        +      "wallClockMs": {
        +        "description": "Total wall-clock time for the request in milliseconds.",
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "wallClockMs",
        +      "runnerRoundTrips"
        +    ],
        +    "type": "object"
        +  },
        +  "count": {
        +    "description": "Number of press/click repetitions.",
        +    "type": "number"
        +  },
        +  "doubleTap": {
        +    "description": "Whether the command requested a double-tap action.",
        +    "type": "boolean"
        +  },
        +  "evidence": {
        +    "properties": {
        +      "changedFromBefore": {
        +        "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.",
        +        "type": "boolean"
        +      },
        +      "digest": {
        +        "description": "Order-independent digest of the post-action node multiset.",
        +        "type": "string"
        +      },
        +      "foregroundApp": {
        +        "description": "Foreground app bundle id or name, when the capture carries it.",
        +        "type": "string"
        +      },
        +      "interactiveNodeCount": {
        +        "description": "Subset of nodeCount the platform reports as hittable.",
        +        "type": "number"
        +      },
        +      "nodeCount": {
        +        "description": "Node count in the post-action interactive-only capture.",
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "nodeCount",
        +      "interactiveNodeCount",
        +      "digest",
        +      "changedFromBefore"
        +    ],
        +    "type": "object"
        +  },
        +  "hint": {
        +    "type": "string"
        +  },
        +  "holdMs": {
        +    "description": "Hold duration for each action.",
        +    "type": "number"
        +  },
        +  "intervalMs": {
        +    "description": "Delay between repeated press/click actions.",
        +    "type": "number"
        +  },
        +  "jitterPx": {
        +    "description": "Randomization radius in pixels.",
        +    "type": "number"
        +  },
        +  "maestroFallbackReason": {
        +    "const": "non-hittable-coordinate",
        +    "type": "string"
        +  },
        +  "maestroNonHittableCoordinateFallbackAllowed": {
        +    "description": "Whether the direct iOS Maestro coordinate fallback was allowed for this selector.",
        +    "type": "boolean"
        +  },
        +  "maestroNonHittableCoordinateFallbackUsed": {
        +    "description": "Whether the direct iOS Maestro coordinate fallback was actually used.",
        +    "type": "boolean"
        +  },
        +  "message": {
        +    "type": "string"
        +  },
        +  "ref": {
        +    "description": "Snapshot ref without the @ prefix when the target was an @ref.",
        +    "type": "string"
        +  },
        +  "refLabel": {
        +    "type": "string"
        +  },
        +  "referenceHeight": {
        +    "description": "Reference frame height for visualizing the interaction point.",
        +    "type": "number"
        +  },
        +  "referenceWidth": {
        +    "description": "Reference frame width for visualizing the interaction point.",
        +    "type": "number"
        +  },
        +  "resolution": {
        +    "description": "Pre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path.",
        +    "oneOf": [
        +      {
        +        "properties": {
        +          "kind": {
        +            "const": "unique",
        +            "type": "string"
        +          },
        +          "phase": {
        +            "const": "pre-action",
        +            "type": "string"
        +          },
        +          "source": {
        +            "const": "runtime",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "source",
        +          "phase",
        +          "kind"
        +        ],
        +        "type": "object"
        +      },
        +      {
        +        "properties": {
        +          "alternatives": {
        +            "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.",
        +            "items": {
        +              "properties": {
        +                "diagnosticRef": {
        +                  "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        +                  "type": "string"
        +                },
        +                "label": {
        +                  "description": "UTF-8 truncated to 256 bytes.",
        +                  "type": "string"
        +                },
        +                "role": {
        +                  "description": "UTF-8 truncated to 256 bytes.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "diagnosticRef"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "kind": {
        +            "const": "disambiguated",
        +            "type": "string"
        +          },
        +          "matchCount": {
        +            "description": "Total matches resolveSelectorChain found before disambiguation.",
        +            "type": "number"
        +          },
        +          "phase": {
        +            "const": "pre-action",
        +            "type": "string"
        +          },
        +          "source": {
        +            "const": "runtime",
        +            "type": "string"
        +          },
        +          "tiebreak": {
        +            "description": "The comparison that decided the winner.",
        +            "enum": [
        +              "visible",
        +              "deepest",
        +              "smallest-area"
        +            ],
        +            "type": "string"
        +          },
        +          "winnerDiagnostic": {
        +            "properties": {
        +              "diagnosticRef": {
        +                "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.",
        +                "type": "string"
        +              },
        +              "label": {
        +                "description": "UTF-8 truncated to 256 bytes.",
        +                "type": "string"
        +              },
        +              "role": {
        +                "description": "UTF-8 truncated to 256 bytes.",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "diagnosticRef"
        +            ],
        +            "type": "object"
        +          }
        +        },
        +        "required": [
        +          "source",
        +          "phase",
        +          "kind",
        +          "matchCount",
        +          "winnerDiagnostic",
        +          "tiebreak"
        +        ],
        +        "type": "object"
        +      },
        +      {
        +        "properties": {
        +          "kind": {
        +            "const": "exact",
        +            "type": "string"
        +          },
        +          "phase": {
        +            "const": "pre-action",
        +            "type": "string"
        +          },
        +          "source": {
        +            "const": "ref",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "source",
        +          "phase",
        +          "kind"
        +        ],
        +        "type": "object"
        +      },
        +      {
        +        "properties": {
        +          "kind": {
        +            "const": "label-fallback",
        +            "type": "string"
        +          },
        +          "phase": {
        +            "const": "pre-action",
        +            "type": "string"
        +          },
        +          "source": {
        +            "const": "ref",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "source",
        +          "phase",
        +          "kind"
        +        ],
        +        "type": "object"
        +      },
        +      {
        +        "properties": {
        +          "kind": {
        +            "const": "not-observed",
        +            "type": "string"
        +          },
        +          "source": {
        +            "const": "direct-ios",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "source",
        +          "kind"
        +        ],
        +        "type": "object"
        +      }
        +    ],
        +    "type": "object"
        +  },
        +  "selector": {
        +    "description": "Selector expression when the target was a selector.",
        +    "type": "string"
        +  },
        +  "selectorChain": {
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  "settle": {
        +    "properties": {
        +      "captures": {
        +        "type": "number"
        +      },
        +      "diff": {
        +        "description": "Settled diff vs the pre-action tree (changed lines only).",
        +        "properties": {
        +          "lines": {
        +            "items": {
        +              "properties": {
        +                "kind": {
        +                  "enum": [
        +                    "added",
        +                    "removed"
        +                  ],
        +                  "type": "string"
        +                },
        +                "ref": {
        +                  "description": "Plain ref body (e12) for added lines.",
        +                  "type": "string"
        +                },
        +                "text": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "kind",
        +                "text"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "summary": {
        +            "properties": {
        +              "additions": {
        +                "type": "number"
        +              },
        +              "removals": {
        +                "type": "number"
        +              },
        +              "unchanged": {
        +                "type": "number"
        +              }
        +            },
        +            "required": [
        +              "additions",
        +              "removals",
        +              "unchanged"
        +            ],
        +            "type": "object"
        +          },
        +          "truncated": {
        +            "description": "Lines were capped to the response bound.",
        +            "type": "boolean"
        +          }
        +        },
        +        "required": [
        +          "summary",
        +          "lines"
        +        ],
        +        "type": "object"
        +      },
        +      "hint": {
        +        "type": "string"
        +      },
        +      "quietMs": {
        +        "type": "number"
        +      },
        +      "refs": {
        +        "items": {
        +          "properties": {
        +            "ref": {
        +              "description": "Plain ref body (e12) minted from the stored settled tree.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "ref"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "refsGeneration": {
        +        "description": "Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.",
        +        "type": "number"
        +      },
        +      "settled": {
        +        "description": "Whether the UI held the quiet window before the deadline. false is advisory, not failure.",
        +        "type": "boolean"
        +      },
        +      "tail": {
        +        "description": "Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).",
        +        "items": {
        +          "properties": {
        +            "label": {
        +              "type": "string"
        +            },
        +            "ref": {
        +              "description": "Plain ref body (e12) minted from the stored settled tree.",
        +              "type": "string"
        +            },
        +            "role": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "ref",
        +            "role"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "tailTruncated": {
        +        "description": "Present (true) when tail candidates exceeded the response cap.",
        +        "type": "boolean"
        +      },
        +      "timeoutMs": {
        +        "type": "number"
        +      },
        +      "waitedMs": {
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "settled",
        +      "waitedMs",
        +      "captures",
        +      "quietMs",
        +      "timeoutMs"
        +    ],
        +    "type": "object"
        +  },
        +  "targetHittable": {
        +    "type": "boolean"
        +  },
        +  "targetKind": {
        +    "description": "Resolved interaction target kind.",
        +    "enum": [
        +      "point",
        +      "ref",
        +      "selector"
        +    ],
        +    "type": "string"
        +  },
        +  "warning": {
        +    "type": "string"
        +  },
        +  "x": {
        +    "description": "Resolved interaction x coordinate when available.",
        +    "type": "number"
        +  },
        +  "y": {
        +    "description": "Resolved interaction y coordinate when available.",
        +    "type": "number"
        +  }
        +}
      • addedOutput schema / required
        Added value: +[
        +  "targetKind"
        +]
    • Changedpush4 fields changed
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "oneOf": [
        +    {
        +      "properties": {
        +        "bundleId": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "platform": {
        +          "const": "ios",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "platform",
        +        "bundleId",
        +        "message"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "properties": {
        +        "action": {
        +          "type": "string"
        +        },
        +        "extrasCount": {
        +          "type": "number"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "package": {
        +          "type": "string"
        +        },
        +        "platform": {
        +          "const": "android",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "platform",
        +        "package",
        +        "action",
        +        "extrasCount",
        +        "message"
        +      ],
        +      "type": "object"
        +    }
        +  ],
        +  "type": "object"
        +}
    • Changedreact-native3 fields changed
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
    • Changedrecord5 fields changed
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / recordingScope
        Added value: +{
        +  "enum": [
        +    "app",
        +    "device",
        +    "system"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "oneOf": [
        +    {
        +      "properties": {
        +        "activeSessionApp": {
        +          "additionalProperties": true,
        +          "type": "object"
        +        },
        +        "outPath": {
        +          "type": "string"
        +        },
        +        "recordOnlySession": {
        +          "type": "boolean"
        +        },
        +        "recording": {
        +          "const": "started",
        +          "type": "string"
        +        },
        +        "recordingBackend": {
        +          "type": "string"
        +        },
        +        "recordingScope": {
        +          "type": "string"
        +        },
        +        "sessionStateDir": {
        +          "type": "string"
        +        },
        +        "showTouches": {
        +          "type": "boolean"
        +        }
        +      },
        +      "required": [
        +        "recording",
        +        "outPath",
        +        "sessionStateDir",
        +        "showTouches"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "properties": {
        +        "activeSessionApp": {
        +          "additionalProperties": true,
        +          "type": "object"
        +        },
        +        "artifacts": {
        +          "items": {
        +            "properties": {
        +              "artifactType": {
        +                "type": "string"
        +              },
        +              "field": {
        +                "type": "string"
        +              },
        +              "fileName": {
        +                "type": "string"
        +              },
        +              "localPath": {
        +                "type": "string"
        +              },
        +              "path": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "field"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "chunks": {
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "durationMs": {
        +          "type": "number"
        +        },
        +        "outPath": {
        +          "type": "string"
        +        },
        +        "overlayWarning": {
        +          "type": "string"
        +        },
        +        "recordOnlySession": {
        +          "type": "boolean"
        +        },
        +        "recording": {
        +          "const": "stopped",
        +          "type": "string"
        +        },
        +        "recordingBackend": {
        +          "type": "string"
        +        },
        +        "recordingScope": {
        +          "type": "string"
        +        },
        +        "showTouches": {
        +          "type": "boolean"
        +        },
        +        "telemetryPath": {
        +          "type": "string"
        +        },
        +        "warning": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "recording",
        +        "outPath",
        +        "artifacts",
        +        "durationMs",
        +        "showTouches"
        +      ],
        +      "type": "object"
        +    }
        +  ],
        +  "type": "object"
        +}
    • Changedreinstall3 fields changed
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
    • Changedreplay10 fields changed
      • addedInput schema / properties / bundleUrl
        Added value: +{
        +  "description": "Bundle URL hint inherited by replay-opened sessions.",
        +  "type": "string"
        +}
      • addedInput schema / properties / force
        Added value: +{
        +  "type": "boolean"
        +}
      • addedInput schema / properties / metroHost
        Added value: +{
        +  "description": "Metro/debug host hint inherited by replay-opened sessions.",
        +  "type": "string"
        +}
      • addedInput schema / properties / metroPort
        Added value: +{
        +  "description": "Metro/debug port hint inherited by replay-opened sessions.",
        +  "type": "integer"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / resumeFrom
        Added value: +{
        +  "type": "integer"
        +}
      • addedInput schema / properties / resumePlanDigest
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / saveScript
        Added value: +{
        +  "oneOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "string"
        +    }
        +  ]
        +}
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "artifactPaths": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "healed": {
        +      "type": "number"
        +    },
        +    "message": {
        +      "type": "string"
        +    },
        +    "replayed": {
        +      "type": "number"
        +    },
        +    "session": {
        +      "type": "string"
        +    },
        +    "sessionActive": {
        +      "description": "True iff the session is still active — the script had no terminal close.",
        +      "type": "boolean"
        +    },
        +    "snapshotDiagnostics": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "replayed",
        +    "healed",
        +    "session",
        +    "sessionActive",
        +    "artifactPaths",
        +    "message"
        +  ],
        +  "type": "object"
        +}
    • Removedrotate
    • Changedscreenshot4 fields changed
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / pixelDensity
        Added value: +{
        +  "description": "Output screenshot pixel density in pixels per logical point.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
    • Changedscroll3 fields changed
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
    • Changedsession6 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"list shows active sessions; state-dir prints the resolved daemon state directory without contacting the daemon."New value: +"list shows active sessions; state-dir prints the daemon state directory; save-script publishes an armed recording without teardown."
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "list",
        -  "state-dir"
        -]New value: +[
        +  "list",
        +  "state-dir",
        +  "save-script"
        +]
      • addedInput schema / properties / force
        Added value: +{
        +  "description": "Atomically replace an existing save-script target.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / path
        Added value: +{
        +  "description": "Optional .ad output path for save-script.",
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
    • Changedsettings3 fields changed
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
    • Changedshutdown3 fields changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
      • changedOutput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web"
        +]
    • Changedsnapshot4 fields changed
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / record
        Added value: +{
        +  "description": "Force-record this out-of-band observation into a repair-armed heal (mutually exclusive with noRecord). Authored replay steps are recorded automatically and never need this.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
    • Changedswipe6 fields changed
      • addedInput schema / properties / count / maximum
        Added value: +200
      • removedInput schema / properties / durationMs
        Removed value: -{
        -  "description": "Swipe duration in milliseconds.",
        -  "minimum": 0,
        -  "type": "integer"
        -}
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / pauseMs / maximum
        Added value: +10000
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
    • Changedtest6 fields changed
      • addedInput schema / properties / bundleUrl
        Added value: +{
        +  "description": "Bundle URL hint inherited by each test session.",
        +  "type": "string"
        +}
      • addedInput schema / properties / metroHost
        Added value: +{
        +  "description": "Metro/debug host hint inherited by each test session.",
        +  "type": "string"
        +}
      • addedInput schema / properties / metroPort
        Added value: +{
        +  "description": "Metro/debug port hint inherited by each test session.",
        +  "type": "integer"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "durationMs": {
        +      "type": "number"
        +    },
        +    "executed": {
        +      "type": "number"
        +    },
        +    "failed": {
        +      "type": "number"
        +    },
        +    "failures": {
        +      "items": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "notRun": {
        +      "type": "number"
        +    },
        +    "passed": {
        +      "type": "number"
        +    },
        +    "skipped": {
        +      "type": "number"
        +    },
        +    "snapshotDiagnostics": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "tests": {
        +      "items": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "total": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "total",
        +    "executed",
        +    "passed",
        +    "failed",
        +    "skipped",
        +    "notRun",
        +    "durationMs",
        +    "failures",
        +    "tests"
        +  ],
        +  "type": "object"
        +}
    • Changedtrace4 fields changed
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "oneOf": [
        +    {
        +      "properties": {
        +        "outPath": {
        +          "type": "string"
        +        },
        +        "trace": {
        +          "const": "started",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "trace",
        +        "outPath"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "properties": {
        +        "artifacts": {
        +          "items": {
        +            "properties": {
        +              "artifactType": {
        +                "type": "string"
        +              },
        +              "field": {
        +                "type": "string"
        +              },
        +              "fileName": {
        +                "type": "string"
        +              },
        +              "localPath": {
        +                "type": "string"
        +              },
        +              "path": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "field"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "outPath": {
        +          "type": "string"
        +        },
        +        "trace": {
        +          "const": "stopped",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "trace",
        +        "outPath",
        +        "artifacts"
        +      ],
        +      "type": "object"
        +    }
        +  ],
        +  "type": "object"
        +}
    • Changedtrigger-app-event4 fields changed
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "event": {
        +      "type": "string"
        +    },
        +    "eventUrl": {
        +      "type": "string"
        +    },
        +    "message": {
        +      "type": "string"
        +    },
        +    "transport": {
        +      "const": "deep-link",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "event",
        +    "eventUrl",
        +    "transport",
        +    "message"
        +  ],
        +  "type": "object"
        +}
    • Addedtv-remote
    • Changedtype3 fields changed
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
    • Changedviewport3 fields changed
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
    • Changedwait4 fields changed
      • addedInput schema / properties / noRecord
        Added value: +{
        +  "description": "Do not record this action.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "apple",
        -  "android",
        -  "linux",
        -  "web",
        -  "ios",
        -  "macos"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "vega",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • changedInput schema / properties / serial / description
        Previous value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "captures": {
        +      "type": "number"
        +    },
        +    "hint": {
        +      "type": "string"
        +    },
        +    "kind": {
        +      "const": "selector",
        +      "type": "string"
        +    },
        +    "nodeCount": {
        +      "type": "number"
        +    },
        +    "selector": {
        +      "type": "string"
        +    },
        +    "text": {
        +      "type": "string"
        +    },
        +    "waitedMs": {
        +      "type": "number"
        +    },
        +    "warning": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "waitedMs"
        +  ],
        +  "type": "object"
        +}
  15. 52 tool updatesv0.17.11
    • Changedalert3 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedapp-switcher4 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "action": {
        +      "const": "app-switcher",
        +      "type": "string"
        +    },
        +    "message": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "action",
        +    "message"
        +  ],
        +  "type": "object"
        +}
    • Changedapps3 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedappstate4 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "oneOf": [
        +    {
        +      "properties": {
        +        "appBundleId": {
        +          "type": "string"
        +        },
        +        "appName": {
        +          "type": "string"
        +        },
        +        "device_udid": {
        +          "description": "iOS only — the session device UDID.",
        +          "type": "string"
        +        },
        +        "ios_simulator_device_set": {
        +          "description": "iOS only — the simulator set path, or null when unknown.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "platform": {
        +          "enum": [
        +            "ios",
        +            "macos"
        +          ],
        +          "type": "string"
        +        },
        +        "source": {
        +          "const": "session",
        +          "type": "string"
        +        },
        +        "surface": {
        +          "enum": [
        +            "app",
        +            "frontmost-app",
        +            "desktop",
        +            "menubar"
        +          ],
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "platform",
        +        "appName",
        +        "source",
        +        "surface"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "properties": {
        +        "activity": {
        +          "type": "string"
        +        },
        +        "package": {
        +          "type": "string"
        +        },
        +        "platform": {
        +          "const": "android",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "platform",
        +        "package",
        +        "activity"
        +      ],
        +      "type": "object"
        +    }
        +  ],
        +  "type": "object"
        +}
    • Addedartifacts
    • Addedaudio
    • Changedback4 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "action": {
        +      "const": "back",
        +      "type": "string"
        +    },
        +    "message": {
        +      "type": "string"
        +    },
        +    "mode": {
        +      "enum": [
        +        "in-app",
        +        "system"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "action",
        +    "mode",
        +    "message"
        +  ],
        +  "type": "object"
        +}
    • Changedbatch4 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / steps / items / properties / command / enum
        Previous value: -[
        -  "devices",
        -  "boot",
        -  "shutdown",
        -  "apps",
        -  "open",
        -  "close",
        -  "install",
        -  "reinstall",
        -  "install-from-source",
        -  "push",
        -  "trigger-app-event",
        -  "snapshot",
        -  "screenshot",
        -  "diff",
        -  "wait",
        -  "alert",
        -  "settings",
        -  "click",
        -  "press",
        -  "longpress",
        -  "swipe",
        -  "focus",
        -  "type",
        -  "fill",
        -  "scroll",
        -  "get",
        -  "gesture",
        -  "is",
        -  "find",
        -  "perf",
        -  "logs",
        -  "network",
        -  "record",
        -  "trace",
        -  "test",
        -  "appstate",
        -  "back",
        -  "home",
        -  "rotate",
        -  "app-switcher",
        -  "keyboard",
        -  "clipboard",
        -  "react-native"
        -]New value: +[
        +  "devices",
        +  "doctor",
        +  "apps",
        +  "boot",
        +  "shutdown",
        +  "appstate",
        +  "perf",
        +  "logs",
        +  "network",
        +  "audio",
        +  "test",
        +  "clipboard",
        +  "keyboard",
        +  "install",
        +  "reinstall",
        +  "push",
        +  "trigger-app-event",
        +  "open",
        +  "close",
        +  "snapshot",
        +  "diff",
        +  "wait",
        +  "alert",
        +  "settings",
        +  "react-native",
        +  "record",
        +  "trace",
        +  "find",
        +  "click",
        +  "fill",
        +  "longpress",
        +  "press",
        +  "type",
        +  "get",
        +  "is",
        +  "back",
        +  "gesture",
        +  "home",
        +  "rotate",
        +  "scroll",
        +  "swipe",
        +  "focus",
        +  "screenshot",
        +  "app-switcher",
        +  "install-from-source"
        +]
    • Changedboot4 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "booted": {
        +      "const": true,
        +      "type": "boolean"
        +    },
        +    "device": {
        +      "description": "Human-readable device name.",
        +      "type": "string"
        +    },
        +    "id": {
        +      "description": "Stable device id.",
        +      "type": "string"
        +    },
        +    "kind": {
        +      "enum": [
        +        "simulator",
        +        "emulator",
        +        "device"
        +      ],
        +      "type": "string"
        +    },
        +    "platform": {
        +      "enum": [
        +        "apple",
        +        "android",
        +        "linux",
        +        "web"
        +      ],
        +      "type": "string"
        +    },
        +    "target": {
        +      "enum": [
        +        "mobile",
        +        "tv",
        +        "desktop"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "platform",
        +    "target",
        +    "device",
        +    "id",
        +    "kind",
        +    "booted"
        +  ],
        +  "type": "object"
        +}
    • Changedclick4 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / verify
        Added value: +{
        +  "description": "Capture cheap post-action evidence (AX digest, node counts, changedFromBefore) instead of a follow-up snapshot.",
        +  "type": "boolean"
        +}
    • Changedclipboard4 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "oneOf": [
        +    {
        +      "properties": {
        +        "action": {
        +          "const": "read",
        +          "type": "string"
        +        },
        +        "text": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "action",
        +        "text"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "properties": {
        +        "action": {
        +          "const": "write",
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "textLength": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "action",
        +        "textLength",
        +        "message"
        +      ],
        +      "type": "object"
        +    }
        +  ],
        +  "type": "object"
        +}
    • Changedclose3 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changeddebug3 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changeddevices3 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changeddiff3 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Addeddoctor
    • Changedfill5 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / verify
        Added value: +{
        +  "description": "Capture cheap post-action evidence (AX digest, node counts, changedFromBefore) instead of a follow-up snapshot.",
        +  "type": "boolean"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "oneOf": [
        +    {
        +      "properties": {
        +        "backendResult": {
        +          "additionalProperties": true,
        +          "description": "Raw backend result passthrough.",
        +          "type": "object"
        +        },
        +        "evidence": {
        +          "properties": {
        +            "changedFromBefore": {
        +              "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.",
        +              "type": "boolean"
        +            },
        +            "digest": {
        +              "description": "Order-independent digest of the post-action node multiset.",
        +              "type": "string"
        +            },
        +            "foregroundApp": {
        +              "description": "Foreground app bundle id or name, when the capture carries it.",
        +              "type": "string"
        +            },
        +            "interactiveNodeCount": {
        +              "description": "Subset of nodeCount the platform reports as hittable.",
        +              "type": "number"
        +            },
        +            "nodeCount": {
        +              "description": "Node count in the post-action interactive-only capture.",
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "nodeCount",
        +            "interactiveNodeCount",
        +            "digest",
        +            "changedFromBefore"
        +          ],
        +          "type": "object"
        +        },
        +        "kind": {
        +          "const": "point",
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "point": {
        +          "properties": {
        +            "x": {
        +              "type": "number"
        +            },
        +            "y": {
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "x",
        +            "y"
        +          ],
        +          "type": "object"
        +        },
        +        "text": {
        +          "description": "Text submitted to the field.",
        +          "type": "string"
        +        },
        +        "warning": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "kind",
        +        "point",
        +        "text"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "properties": {
        +        "backendResult": {
        +          "additionalProperties": true,
        +          "description": "Raw backend result passthrough.",
        +          "type": "object"
        +        },
        +        "evidence": {
        +          "properties": {
        +            "changedFromBefore": {
        +              "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.",
        +              "type": "boolean"
        +            },
        +            "digest": {
        +              "description": "Order-independent digest of the post-action node multiset.",
        +              "type": "string"
        +            },
        +            "foregroundApp": {
        +              "description": "Foreground app bundle id or name, when the capture carries it.",
        +              "type": "string"
        +            },
        +            "interactiveNodeCount": {
        +              "description": "Subset of nodeCount the platform reports as hittable.",
        +              "type": "number"
        +            },
        +            "nodeCount": {
        +              "description": "Node count in the post-action interactive-only capture.",
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "nodeCount",
        +            "interactiveNodeCount",
        +            "digest",
        +            "changedFromBefore"
        +          ],
        +          "type": "object"
        +        },
        +        "hint": {
        +          "type": "string"
        +        },
        +        "kind": {
        +          "const": "ref",
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "node": {
        +          "description": "Resolved snapshot node for the matched element.",
        +          "properties": {
        +            "appName": {
        +              "type": "string"
        +            },
        +            "bundleId": {
        +              "type": "string"
        +            },
        +            "depth": {
        +              "type": "number"
        +            },
        +            "enabled": {
        +              "type": "boolean"
        +            },
        +            "focused": {
        +              "type": "boolean"
        +            },
        +            "hiddenContentAbove": {
        +              "type": "boolean"
        +            },
        +            "hiddenContentBelow": {
        +              "type": "boolean"
        +            },
        +            "hittable": {
        +              "type": "boolean"
        +            },
        +            "identifier": {
        +              "type": "string"
        +            },
        +            "index": {
        +              "type": "number"
        +            },
        +            "interactionBlocked": {
        +              "enum": [
        +                "covered"
        +              ],
        +              "type": "string"
        +            },
        +            "label": {
        +              "type": "string"
        +            },
        +            "parentIndex": {
        +              "type": "number"
        +            },
        +            "pid": {
        +              "type": "number"
        +            },
        +            "presentationHints": {
        +              "items": {
        +                "type": "string"
        +              },
        +              "type": "array"
        +            },
        +            "rect": {
        +              "properties": {
        +                "height": {
        +                  "type": "number"
        +                },
        +                "width": {
        +                  "type": "number"
        +                },
        +                "x": {
        +                  "type": "number"
        +                },
        +                "y": {
        +                  "type": "number"
        +                }
        +              },
        +              "required": [
        +                "x",
        +                "y",
        +                "width",
        +                "height"
        +              ],
        +              "type": "object"
        +            },
        +            "ref": {
        +              "description": "Stable snapshot ref such as e12.",
        +              "type": "string"
        +            },
        +            "role": {
        +              "type": "string"
        +            },
        +            "selected": {
        +              "type": "boolean"
        +            },
        +            "subrole": {
        +              "type": "string"
        +            },
        +            "surface": {
        +              "type": "string"
        +            },
        +            "type": {
        +              "type": "string"
        +            },
        +            "value": {
        +              "type": "string"
        +            },
        +            "visibleToUser": {
        +              "type": "boolean"
        +            },
        +            "windowTitle": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "index",
        +            "ref"
        +          ],
        +          "type": "object"
        +        },
        +        "point": {
        +          "properties": {
        +            "x": {
        +              "type": "number"
        +            },
        +            "y": {
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "x",
        +            "y"
        +          ],
        +          "type": "object"
        +        },
        +        "refLabel": {
        +          "type": "string"
        +        },
        +        "selectorChain": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "target": {
        +          "properties": {
        +            "kind": {
        +              "const": "ref",
        +              "type": "string"
        +            },
        +            "ref": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "kind",
        +            "ref"
        +          ],
        +          "type": "object"
        +        },
        +        "targetHittable": {
        +          "type": "boolean"
        +        },
        +        "text": {
        +          "description": "Text submitted to the field.",
        +          "type": "string"
        +        },
        +        "warning": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "kind",
        +        "target",
        +        "text"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "properties": {
        +        "backendResult": {
        +          "additionalProperties": true,
        +          "description": "Raw backend result passthrough.",
        +          "type": "object"
        +        },
        +        "evidence": {
        +          "properties": {
        +            "changedFromBefore": {
        +              "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.",
        +              "type": "boolean"
        +            },
        +            "digest": {
        +              "description": "Order-independent digest of the post-action node multiset.",
        +              "type": "string"
        +            },
        +            "foregroundApp": {
        +              "description": "Foreground app bundle id or name, when the capture carries it.",
        +              "type": "string"
        +            },
        +            "interactiveNodeCount": {
        +              "description": "Subset of nodeCount the platform reports as hittable.",
        +              "type": "number"
        +            },
        +            "nodeCount": {
        +              "description": "Node count in the post-action interactive-only capture.",
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "nodeCount",
        +            "interactiveNodeCount",
        +            "digest",
        +            "changedFromBefore"
        +          ],
        +          "type": "object"
        +        },
        +        "hint": {
        +          "type": "string"
        +        },
        +        "kind": {
        +          "const": "selector",
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "node": {
        +          "description": "Resolved snapshot node for the matched element.",
        +          "properties": {
        +            "appName": {
        +              "type": "string"
        +            },
        +            "bundleId": {
        +              "type": "string"
        +            },
        +            "depth": {
        +              "type": "number"
        +            },
        +            "enabled": {
        +              "type": "boolean"
        +            },
        +            "focused": {
        +              "type": "boolean"
        +            },
        +            "hiddenContentAbove": {
        +              "type": "boolean"
        +            },
        +            "hiddenContentBelow": {
        +              "type": "boolean"
        +            },
        +            "hittable": {
        +              "type": "boolean"
        +            },
        +            "identifier": {
        +              "type": "string"
        +            },
        +            "index": {
        +              "type": "number"
        +            },
        +            "interactionBlocked": {
        +              "enum": [
        +                "covered"
        +              ],
        +              "type": "string"
        +            },
        +            "label": {
        +              "type": "string"
        +            },
        +            "parentIndex": {
        +              "type": "number"
        +            },
        +            "pid": {
        +              "type": "number"
        +            },
        +            "presentationHints": {
        +              "items": {
        +                "type": "string"
        +              },
        +              "type": "array"
        +            },
        +            "rect": {
        +              "properties": {
        +                "height": {
        +                  "type": "number"
        +                },
        +                "width": {
        +                  "type": "number"
        +                },
        +                "x": {
        +                  "type": "number"
        +                },
        +                "y": {
        +                  "type": "number"
        +                }
        +              },
        +              "required": [
        +                "x",
        +                "y",
        +                "width",
        +                "height"
        +              ],
        +              "type": "object"
        +            },
        +            "ref": {
        +              "description": "Stable snapshot ref such as e12.",
        +              "type": "string"
        +            },
        +            "role": {
        +              "type": "string"
        +            },
        +            "selected": {
        +              "type": "boolean"
        +            },
        +            "subrole": {
        +              "type": "string"
        +            },
        +            "surface": {
        +              "type": "string"
        +            },
        +            "type": {
        +              "type": "string"
        +            },
        +            "value": {
        +              "type": "string"
        +            },
        +            "visibleToUser": {
        +              "type": "boolean"
        +            },
        +            "windowTitle": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "index",
        +            "ref"
        +          ],
        +          "type": "object"
        +        },
        +        "point": {
        +          "properties": {
        +            "x": {
        +              "type": "number"
        +            },
        +            "y": {
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "x",
        +            "y"
        +          ],
        +          "type": "object"
        +        },
        +        "refLabel": {
        +          "type": "string"
        +        },
        +        "selectorChain": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "target": {
        +          "properties": {
        +            "kind": {
        +              "const": "selector",
        +              "type": "string"
        +            },
        +            "selector": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "kind",
        +            "selector"
        +          ],
        +          "type": "object"
        +        },
        +        "targetHittable": {
        +          "type": "boolean"
        +        },
        +        "text": {
        +          "description": "Text submitted to the field.",
        +          "type": "string"
        +        },
        +        "warning": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "kind",
        +        "point",
        +        "target",
        +        "node",
        +        "selectorChain",
        +        "text"
        +      ],
        +      "type": "object"
        +    }
        +  ],
        +  "type": "object"
        +}
    • Changedfind3 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedfocus3 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedgesture3 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedget3 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedhome4 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "action": {
        +      "const": "home",
        +      "type": "string"
        +    },
        +    "message": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "action",
        +    "message"
        +  ],
        +  "type": "object"
        +}
    • Changedinstall5 fields changed
      • addedInput schema / properties / app / description
        Added value: +"Optional app identifier hint."
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "app",
        -  "appPath"
        -]New value: +[
        +  "appPath"
        +]
    • Changedinstall-from-source3 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedis3 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedkeyboard4 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "action": {
        +      "enum": [
        +        "status",
        +        "dismiss",
        +        "enter"
        +      ],
        +      "type": "string"
        +    },
        +    "attempts": {
        +      "type": "number"
        +    },
        +    "dismissed": {
        +      "type": "boolean"
        +    },
        +    "focusedPackage": {
        +      "type": "string"
        +    },
        +    "focusedResourceId": {
        +      "type": "string"
        +    },
        +    "inputMethodPackage": {
        +      "type": "string"
        +    },
        +    "inputOwner": {
        +      "enum": [
        +        "app",
        +        "ime",
        +        "unknown"
        +      ],
        +      "type": "string"
        +    },
        +    "inputType": {
        +      "type": "string"
        +    },
        +    "message": {
        +      "type": "string"
        +    },
        +    "platform": {
        +      "enum": [
        +        "android",
        +        "ios"
        +      ],
        +      "type": "string"
        +    },
        +    "type": {
        +      "enum": [
        +        "text",
        +        "number",
        +        "email",
        +        "phone",
        +        "password",
        +        "datetime",
        +        "unknown"
        +      ],
        +      "type": "string"
        +    },
        +    "visible": {
        +      "type": "boolean"
        +    },
        +    "wasVisible": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "platform",
        +    "action"
        +  ],
        +  "type": "object"
        +}
    • Changedlogs3 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedlongpress4 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "oneOf": [
        +    {
        +      "properties": {
        +        "backendResult": {
        +          "additionalProperties": true,
        +          "description": "Raw backend result passthrough.",
        +          "type": "object"
        +        },
        +        "durationMs": {
        +          "type": "number"
        +        },
        +        "kind": {
        +          "const": "point",
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "point": {
        +          "properties": {
        +            "x": {
        +              "type": "number"
        +            },
        +            "y": {
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "x",
        +            "y"
        +          ],
        +          "type": "object"
        +        },
        +        "warning": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "kind",
        +        "point"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "properties": {
        +        "backendResult": {
        +          "additionalProperties": true,
        +          "description": "Raw backend result passthrough.",
        +          "type": "object"
        +        },
        +        "durationMs": {
        +          "type": "number"
        +        },
        +        "hint": {
        +          "type": "string"
        +        },
        +        "kind": {
        +          "const": "ref",
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "node": {
        +          "description": "Resolved snapshot node for the matched element.",
        +          "properties": {
        +            "appName": {
        +              "type": "string"
        +            },
        +            "bundleId": {
        +              "type": "string"
        +            },
        +            "depth": {
        +              "type": "number"
        +            },
        +            "enabled": {
        +              "type": "boolean"
        +            },
        +            "focused": {
        +              "type": "boolean"
        +            },
        +            "hiddenContentAbove": {
        +              "type": "boolean"
        +            },
        +            "hiddenContentBelow": {
        +              "type": "boolean"
        +            },
        +            "hittable": {
        +              "type": "boolean"
        +            },
        +            "identifier": {
        +              "type": "string"
        +            },
        +            "index": {
        +              "type": "number"
        +            },
        +            "interactionBlocked": {
        +              "enum": [
        +                "covered"
        +              ],
        +              "type": "string"
        +            },
        +            "label": {
        +              "type": "string"
        +            },
        +            "parentIndex": {
        +              "type": "number"
        +            },
        +            "pid": {
        +              "type": "number"
        +            },
        +            "presentationHints": {
        +              "items": {
        +                "type": "string"
        +              },
        +              "type": "array"
        +            },
        +            "rect": {
        +              "properties": {
        +                "height": {
        +                  "type": "number"
        +                },
        +                "width": {
        +                  "type": "number"
        +                },
        +                "x": {
        +                  "type": "number"
        +                },
        +                "y": {
        +                  "type": "number"
        +                }
        +              },
        +              "required": [
        +                "x",
        +                "y",
        +                "width",
        +                "height"
        +              ],
        +              "type": "object"
        +            },
        +            "ref": {
        +              "description": "Stable snapshot ref such as e12.",
        +              "type": "string"
        +            },
        +            "role": {
        +              "type": "string"
        +            },
        +            "selected": {
        +              "type": "boolean"
        +            },
        +            "subrole": {
        +              "type": "string"
        +            },
        +            "surface": {
        +              "type": "string"
        +            },
        +            "type": {
        +              "type": "string"
        +            },
        +            "value": {
        +              "type": "string"
        +            },
        +            "visibleToUser": {
        +              "type": "boolean"
        +            },
        +            "windowTitle": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "index",
        +            "ref"
        +          ],
        +          "type": "object"
        +        },
        +        "point": {
        +          "properties": {
        +            "x": {
        +              "type": "number"
        +            },
        +            "y": {
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "x",
        +            "y"
        +          ],
        +          "type": "object"
        +        },
        +        "refLabel": {
        +          "type": "string"
        +        },
        +        "selectorChain": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "target": {
        +          "properties": {
        +            "kind": {
        +              "const": "ref",
        +              "type": "string"
        +            },
        +            "ref": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "kind",
        +            "ref"
        +          ],
        +          "type": "object"
        +        },
        +        "targetHittable": {
        +          "type": "boolean"
        +        },
        +        "warning": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "kind",
        +        "target"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "properties": {
        +        "backendResult": {
        +          "additionalProperties": true,
        +          "description": "Raw backend result passthrough.",
        +          "type": "object"
        +        },
        +        "durationMs": {
        +          "type": "number"
        +        },
        +        "hint": {
        +          "type": "string"
        +        },
        +        "kind": {
        +          "const": "selector",
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "node": {
        +          "description": "Resolved snapshot node for the matched element.",
        +          "properties": {
        +            "appName": {
        +              "type": "string"
        +            },
        +            "bundleId": {
        +              "type": "string"
        +            },
        +            "depth": {
        +              "type": "number"
        +            },
        +            "enabled": {
        +              "type": "boolean"
        +            },
        +            "focused": {
        +              "type": "boolean"
        +            },
        +            "hiddenContentAbove": {
        +              "type": "boolean"
        +            },
        +            "hiddenContentBelow": {
        +              "type": "boolean"
        +            },
        +            "hittable": {
        +              "type": "boolean"
        +            },
        +            "identifier": {
        +              "type": "string"
        +            },
        +            "index": {
        +              "type": "number"
        +            },
        +            "interactionBlocked": {
        +              "enum": [
        +                "covered"
        +              ],
        +              "type": "string"
        +            },
        +            "label": {
        +              "type": "string"
        +            },
        +            "parentIndex": {
        +              "type": "number"
        +            },
        +            "pid": {
        +              "type": "number"
        +            },
        +            "presentationHints": {
        +              "items": {
        +                "type": "string"
        +              },
        +              "type": "array"
        +            },
        +            "rect": {
        +              "properties": {
        +                "height": {
        +                  "type": "number"
        +                },
        +                "width": {
        +                  "type": "number"
        +                },
        +                "x": {
        +                  "type": "number"
        +                },
        +                "y": {
        +                  "type": "number"
        +                }
        +              },
        +              "required": [
        +                "x",
        +                "y",
        +                "width",
        +                "height"
        +              ],
        +              "type": "object"
        +            },
        +            "ref": {
        +              "description": "Stable snapshot ref such as e12.",
        +              "type": "string"
        +            },
        +            "role": {
        +              "type": "string"
        +            },
        +            "selected": {
        +              "type": "boolean"
        +            },
        +            "subrole": {
        +              "type": "string"
        +            },
        +            "surface": {
        +              "type": "string"
        +            },
        +            "type": {
        +              "type": "string"
        +            },
        +            "value": {
        +              "type": "string"
        +            },
        +            "visibleToUser": {
        +              "type": "boolean"
        +            },
        +            "windowTitle": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "index",
        +            "ref"
        +          ],
        +          "type": "object"
        +        },
        +        "point": {
        +          "properties": {
        +            "x": {
        +              "type": "number"
        +            },
        +            "y": {
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "x",
        +            "y"
        +          ],
        +          "type": "object"
        +        },
        +        "refLabel": {
        +          "type": "string"
        +        },
        +        "selectorChain": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "target": {
        +          "properties": {
        +            "kind": {
        +              "const": "selector",
        +              "type": "string"
        +            },
        +            "selector": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "kind",
        +            "selector"
        +          ],
        +          "type": "object"
        +        },
        +        "targetHittable": {
        +          "type": "boolean"
        +        },
        +        "warning": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "kind",
        +        "point",
        +        "target",
        +        "node",
        +        "selectorChain"
        +      ],
        +      "type": "object"
        +    }
        +  ],
        +  "type": "object"
        +}
    • Changedmetro3 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changednetwork3 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedopen3 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedperf3 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedpress5 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / verify
        Added value: +{
        +  "description": "Capture cheap post-action evidence (AX digest, node counts, changedFromBefore) instead of a follow-up snapshot.",
        +  "type": "boolean"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "oneOf": [
        +    {
        +      "properties": {
        +        "backendResult": {
        +          "additionalProperties": true,
        +          "description": "Raw backend result passthrough.",
        +          "type": "object"
        +        },
        +        "evidence": {
        +          "properties": {
        +            "changedFromBefore": {
        +              "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.",
        +              "type": "boolean"
        +            },
        +            "digest": {
        +              "description": "Order-independent digest of the post-action node multiset.",
        +              "type": "string"
        +            },
        +            "foregroundApp": {
        +              "description": "Foreground app bundle id or name, when the capture carries it.",
        +              "type": "string"
        +            },
        +            "interactiveNodeCount": {
        +              "description": "Subset of nodeCount the platform reports as hittable.",
        +              "type": "number"
        +            },
        +            "nodeCount": {
        +              "description": "Node count in the post-action interactive-only capture.",
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "nodeCount",
        +            "interactiveNodeCount",
        +            "digest",
        +            "changedFromBefore"
        +          ],
        +          "type": "object"
        +        },
        +        "kind": {
        +          "const": "point",
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "point": {
        +          "properties": {
        +            "x": {
        +              "type": "number"
        +            },
        +            "y": {
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "x",
        +            "y"
        +          ],
        +          "type": "object"
        +        },
        +        "warning": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "kind",
        +        "point"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "properties": {
        +        "backendResult": {
        +          "additionalProperties": true,
        +          "description": "Raw backend result passthrough.",
        +          "type": "object"
        +        },
        +        "evidence": {
        +          "properties": {
        +            "changedFromBefore": {
        +              "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.",
        +              "type": "boolean"
        +            },
        +            "digest": {
        +              "description": "Order-independent digest of the post-action node multiset.",
        +              "type": "string"
        +            },
        +            "foregroundApp": {
        +              "description": "Foreground app bundle id or name, when the capture carries it.",
        +              "type": "string"
        +            },
        +            "interactiveNodeCount": {
        +              "description": "Subset of nodeCount the platform reports as hittable.",
        +              "type": "number"
        +            },
        +            "nodeCount": {
        +              "description": "Node count in the post-action interactive-only capture.",
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "nodeCount",
        +            "interactiveNodeCount",
        +            "digest",
        +            "changedFromBefore"
        +          ],
        +          "type": "object"
        +        },
        +        "hint": {
        +          "type": "string"
        +        },
        +        "kind": {
        +          "const": "ref",
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "node": {
        +          "description": "Resolved snapshot node for the matched element.",
        +          "properties": {
        +            "appName": {
        +              "type": "string"
        +            },
        +            "bundleId": {
        +              "type": "string"
        +            },
        +            "depth": {
        +              "type": "number"
        +            },
        +            "enabled": {
        +              "type": "boolean"
        +            },
        +            "focused": {
        +              "type": "boolean"
        +            },
        +            "hiddenContentAbove": {
        +              "type": "boolean"
        +            },
        +            "hiddenContentBelow": {
        +              "type": "boolean"
        +            },
        +            "hittable": {
        +              "type": "boolean"
        +            },
        +            "identifier": {
        +              "type": "string"
        +            },
        +            "index": {
        +              "type": "number"
        +            },
        +            "interactionBlocked": {
        +              "enum": [
        +                "covered"
        +              ],
        +              "type": "string"
        +            },
        +            "label": {
        +              "type": "string"
        +            },
        +            "parentIndex": {
        +              "type": "number"
        +            },
        +            "pid": {
        +              "type": "number"
        +            },
        +            "presentationHints": {
        +              "items": {
        +                "type": "string"
        +              },
        +              "type": "array"
        +            },
        +            "rect": {
        +              "properties": {
        +                "height": {
        +                  "type": "number"
        +                },
        +                "width": {
        +                  "type": "number"
        +                },
        +                "x": {
        +                  "type": "number"
        +                },
        +                "y": {
        +                  "type": "number"
        +                }
        +              },
        +              "required": [
        +                "x",
        +                "y",
        +                "width",
        +                "height"
        +              ],
        +              "type": "object"
        +            },
        +            "ref": {
        +              "description": "Stable snapshot ref such as e12.",
        +              "type": "string"
        +            },
        +            "role": {
        +              "type": "string"
        +            },
        +            "selected": {
        +              "type": "boolean"
        +            },
        +            "subrole": {
        +              "type": "string"
        +            },
        +            "surface": {
        +              "type": "string"
        +            },
        +            "type": {
        +              "type": "string"
        +            },
        +            "value": {
        +              "type": "string"
        +            },
        +            "visibleToUser": {
        +              "type": "boolean"
        +            },
        +            "windowTitle": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "index",
        +            "ref"
        +          ],
        +          "type": "object"
        +        },
        +        "point": {
        +          "properties": {
        +            "x": {
        +              "type": "number"
        +            },
        +            "y": {
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "x",
        +            "y"
        +          ],
        +          "type": "object"
        +        },
        +        "refLabel": {
        +          "type": "string"
        +        },
        +        "selectorChain": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "target": {
        +          "properties": {
        +            "kind": {
        +              "const": "ref",
        +              "type": "string"
        +            },
        +            "ref": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "kind",
        +            "ref"
        +          ],
        +          "type": "object"
        +        },
        +        "targetHittable": {
        +          "type": "boolean"
        +        },
        +        "warning": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "kind",
        +        "target"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "properties": {
        +        "backendResult": {
        +          "additionalProperties": true,
        +          "description": "Raw backend result passthrough.",
        +          "type": "object"
        +        },
        +        "evidence": {
        +          "properties": {
        +            "changedFromBefore": {
        +              "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.",
        +              "type": "boolean"
        +            },
        +            "digest": {
        +              "description": "Order-independent digest of the post-action node multiset.",
        +              "type": "string"
        +            },
        +            "foregroundApp": {
        +              "description": "Foreground app bundle id or name, when the capture carries it.",
        +              "type": "string"
        +            },
        +            "interactiveNodeCount": {
        +              "description": "Subset of nodeCount the platform reports as hittable.",
        +              "type": "number"
        +            },
        +            "nodeCount": {
        +              "description": "Node count in the post-action interactive-only capture.",
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "nodeCount",
        +            "interactiveNodeCount",
        +            "digest",
        +            "changedFromBefore"
        +          ],
        +          "type": "object"
        +        },
        +        "hint": {
        +          "type": "string"
        +        },
        +        "kind": {
        +          "const": "selector",
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "node": {
        +          "description": "Resolved snapshot node for the matched element.",
        +          "properties": {
        +            "appName": {
        +              "type": "string"
        +            },
        +            "bundleId": {
        +              "type": "string"
        +            },
        +            "depth": {
        +              "type": "number"
        +            },
        +            "enabled": {
        +              "type": "boolean"
        +            },
        +            "focused": {
        +              "type": "boolean"
        +            },
        +            "hiddenContentAbove": {
        +              "type": "boolean"
        +            },
        +            "hiddenContentBelow": {
        +              "type": "boolean"
        +            },
        +            "hittable": {
        +              "type": "boolean"
        +            },
        +            "identifier": {
        +              "type": "string"
        +            },
        +            "index": {
        +              "type": "number"
        +            },
        +            "interactionBlocked": {
        +              "enum": [
        +                "covered"
        +              ],
        +              "type": "string"
        +            },
        +            "label": {
        +              "type": "string"
        +            },
        +            "parentIndex": {
        +              "type": "number"
        +            },
        +            "pid": {
        +              "type": "number"
        +            },
        +            "presentationHints": {
        +              "items": {
        +                "type": "string"
        +              },
        +              "type": "array"
        +            },
        +            "rect": {
        +              "properties": {
        +                "height": {
        +                  "type": "number"
        +                },
        +                "width": {
        +                  "type": "number"
        +                },
        +                "x": {
        +                  "type": "number"
        +                },
        +                "y": {
        +                  "type": "number"
        +                }
        +              },
        +              "required": [
        +                "x",
        +                "y",
        +                "width",
        +                "height"
        +              ],
        +              "type": "object"
        +            },
        +            "ref": {
        +              "description": "Stable snapshot ref such as e12.",
        +              "type": "string"
        +            },
        +            "role": {
        +              "type": "string"
        +            },
        +            "selected": {
        +              "type": "boolean"
        +            },
        +            "subrole": {
        +              "type": "string"
        +            },
        +            "surface": {
        +              "type": "string"
        +            },
        +            "type": {
        +              "type": "string"
        +            },
        +            "value": {
        +              "type": "string"
        +            },
        +            "visibleToUser": {
        +              "type": "boolean"
        +            },
        +            "windowTitle": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "index",
        +            "ref"
        +          ],
        +          "type": "object"
        +        },
        +        "point": {
        +          "properties": {
        +            "x": {
        +              "type": "number"
        +            },
        +            "y": {
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "x",
        +            "y"
        +          ],
        +          "type": "object"
        +        },
        +        "refLabel": {
        +          "type": "string"
        +        },
        +        "selectorChain": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "target": {
        +          "properties": {
        +            "kind": {
        +              "const": "selector",
        +              "type": "string"
        +            },
        +            "selector": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "kind",
        +            "selector"
        +          ],
        +          "type": "object"
        +        },
        +        "targetHittable": {
        +          "type": "boolean"
        +        },
        +        "warning": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "kind",
        +        "point",
        +        "target",
        +        "node",
        +        "selectorChain"
        +      ],
        +      "type": "object"
        +    }
        +  ],
        +  "type": "object"
        +}
    • Changedpush3 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedreact-native3 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedrecord3 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedreinstall3 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedreplay3 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedrotate4 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "action": {
        +      "const": "rotate",
        +      "type": "string"
        +    },
        +    "message": {
        +      "type": "string"
        +    },
        +    "orientation": {
        +      "enum": [
        +        "portrait",
        +        "portrait-upside-down",
        +        "landscape-left",
        +        "landscape-right"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "action",
        +    "orientation",
        +    "message"
        +  ],
        +  "type": "object"
        +}
    • Changedscreenshot4 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / normalizeStatusBar
        Added value: +{
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedscroll3 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedsession3 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedsettings3 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedshutdown4 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "device": {
        +      "description": "Human-readable device name.",
        +      "type": "string"
        +    },
        +    "id": {
        +      "description": "Stable device id.",
        +      "type": "string"
        +    },
        +    "kind": {
        +      "enum": [
        +        "simulator",
        +        "emulator",
        +        "device"
        +      ],
        +      "type": "string"
        +    },
        +    "platform": {
        +      "enum": [
        +        "apple",
        +        "android",
        +        "linux",
        +        "web"
        +      ],
        +      "type": "string"
        +    },
        +    "shutdown": {
        +      "properties": {
        +        "error": {
        +          "additionalProperties": true,
        +          "description": "Normalized error detail when shutdown failed.",
        +          "type": "object"
        +        },
        +        "exitCode": {
        +          "type": "number"
        +        },
        +        "stderr": {
        +          "type": "string"
        +        },
        +        "stdout": {
        +          "type": "string"
        +        },
        +        "success": {
        +          "type": "boolean"
        +        }
        +      },
        +      "required": [
        +        "success",
        +        "exitCode",
        +        "stdout",
        +        "stderr"
        +      ],
        +      "type": "object"
        +    },
        +    "target": {
        +      "enum": [
        +        "mobile",
        +        "tv",
        +        "desktop"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "platform",
        +    "target",
        +    "device",
        +    "id",
        +    "kind",
        +    "shutdown"
        +  ],
        +  "type": "object"
        +}
    • Changedsnapshot3 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedswipe3 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedtest4 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • removedInput schema / properties / reportJunit
        Removed value: -{
        -  "type": "string"
        -}
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedtrace3 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedtrigger-app-event3 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedtype3 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedviewport4 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "height": {
        +      "type": "number"
        +    },
        +    "message": {
        +      "type": "string"
        +    },
        +    "width": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "width",
        +    "height",
        +    "message"
        +  ],
        +  "type": "object"
        +}
    • Changedwait6 fields changed
      • addedInput schema / properties / includeCost
        Added value: +{
        +  "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / kind / enum
        Previous value: -[
        -  "duration",
        -  "text",
        -  "ref",
        -  "selector"
        -]New value: +[
        +  "duration",
        +  "text",
        +  "ref",
        +  "selector",
        +  "stable"
        +]
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "web",
        -  "apple"
        -]New value: +[
        +  "apple",
        +  "android",
        +  "linux",
        +  "web",
        +  "ios",
        +  "macos"
        +]
      • addedInput schema / properties / quietMs
        Added value: +{
        +  "type": "integer"
        +}
      • addedInput schema / properties / responseLevel
        Added value: +{
        +  "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.",
        +  "enum": [
        +    "digest",
        +    "default",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / stable
        Added value: +{
        +  "type": "boolean"
        +}
  16. 2 tool updatesv0.17.9
    • Changedscroll1 field changed
      • addedInput schema / properties / durationMs
        Added value: +{
        +  "description": "Scroll duration in milliseconds when the backend supports pacing.",
        +  "maximum": 10000,
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Addedviewport
  17. 48 tool updatesv0.17.7
    • Changedalert1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedapp-switcher1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedapps1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedappstate1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedback1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedbatch1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedboot1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedclick1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedclipboard1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedclose1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changeddebug1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changeddevices1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changeddiff1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedfill1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedfind1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedfocus1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedgesture1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedget1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedhome1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedinstall1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedinstall-from-source1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedis1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedkeyboard1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedlogs1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedlongpress1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedmetro1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changednetwork1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedopen1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedperf1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedpress1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedpush1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedreact-native1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedrecord4 fields changed
      • addedInput schema / properties / maxSize
        Added value: +{
        +  "type": "integer"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
      • addedInput schema / properties / quality / enum
        Added value: +[
        +  "medium",
        +  "high"
        +]
      • changedInput schema / properties / quality / type
        Previous value: -"integer"New value: +"string"
    • Changedreinstall1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedreplay1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedrotate1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedscreenshot1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedscroll1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedsession1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedsettings1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedshutdown1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedsnapshot1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedswipe1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedtest1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedtrace1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedtrigger-app-event1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedtype1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]
    • Changedwait1 field changed
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "macos",
        -  "android",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "web",
        +  "apple"
        +]

TDQS

B3.3/5.0

Scored across 62 tools

Disambiguation2/5

Several tools target the same primitive: click, press, and the tap kind of gesture are effectively interchangeable, while scroll, swipe, and pan/fling gestures overlap heavily, and get/find/is/snapshot all read or interrogate UI state. Long descriptions add nuance, but an agent still faces genuine misselection risk across these clusters.

Naming Consistency4/5

Names are almost uniformly lowercase, with multiword tools using kebab-case (tv-remote, hardware-button, trigger-app-event, install-from-source), which gives a predictable surface. Minor deviations like 'longpress' and 'appstate' without hyphens and verb/noun mixing (click vs snapshot) keep it from perfect.

Tool Count2/5

62 tools is far beyond a comfortable surface even for a broad mobile-automation domain, and the count is inflated by partly redundant interaction primitives and niche platform tools (telephony, fold, audio, action-button). Each tool has a plausible purpose, but the set needs consolidation.

Completeness5/5

The surface covers the full lifecycle: device discovery/boot/shutdown, app install/uninstall/reinstall, session and app control, rich interaction and inspection, diagnostics (logs, network, perf, debug, trace), recording/replay/testing, and platform-specific capabilities. No obvious dead ends for mobile automation work.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Discovers and manages portable agent capabilities (skills and MCP servers) from configurable collections, providing search, inspection, and local installation via CLI and MCP tools.
    1
    MIT
  • F
    license
    A
    quality
    C
    maintenance
    Exposes Justworx devices to AI agents as MCP tools and resources, backed by the public Developer API. Supports local stdio and hosted remote OAuth operation for controlling device IO, rules, and viewing live state.
    6
    -