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, 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 handing the CLI to an agent; help workflow links to the guides for debugging, replay, and profiling, and the installed help always matches the installed version.

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 only valid from 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, selectors, and React Native component trees.

  • 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, 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; HDC and ArkUI uitest on HarmonyOS; Vega CLI/VDA on the Vega Virtual Device; a local helper on macOS; and AT-SPI on Linux.

Support depth varies by target. Newer 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. Inspect ownership without a daemon via agent-device device status, and settle provably dead owners with agent-device device release --stale. The same commands drive hosted devices on BrowserStack, AWS Device Farm, 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

59 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.

ParametersJSON Schema
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

ParametersJSON 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. Inspect again after an unconfirmed action; never assume a timeout means nothing happened. Times out after 90s.

ParametersJSON Schema
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.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 discloses that each iOS XCTest execution 'activates once, then only observes,' that the tool 'Times out after 90s,' and that accept/dismiss change state. This is valuable behavioral context beyond what the schema conveys. It does not describe the return format or error behavior, but the core behavioral traits are transparent.

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 with no redundancy. It front-loads the core purpose, then provides usage guidance, and finally behavioral caveats. Every sentence adds value, and the structure is compact and well-ordered.

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 18 parameters and no output schema, the description covers the essential behavioral aspects: action selection, state changes, timeout behavior, and the execution model. It lacks information about the response format, but given the schema's high coverage and the tool's specific scope, this is a minor gap. It is sufficiently complete for an agent to call the tool 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 89%, so the schema already documents most parameters. The description adds no parameter-specific details beyond the action semantics ('Use get before acting...'), but the schema's enum for action already explains the possible values. Since the schema covers the parameters well, a baseline score of 3 is appropriate; the description does not need to compensate for low 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?

The description clearly states the tool's core function: 'Inspect, wait for, accept, or dismiss a platform alert.' It names the resource (platform alert) and the specific verbs (get, wait, accept, dismiss), making its purpose unambiguous. It distinguishes itself from generic sibling tools like 'get' or 'wait' by being alert-specific, and the action enum is explicit.

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 provides explicit usage guidance: 'Use get before acting when the alert content matters; accept and dismiss change the active alert state.' It also warns about the timeout behavior and advises to 'Inspect again after an unconfirmed action.' This gives clear when-to-use directives for each action and cautions against misinterpretation of timeouts, which is exactly the kind of guidance needed.

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.

ParametersJSON Schema
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

ParametersJSON 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.

appstateA

Show foreground app/activity (Android; iOS answers per command) Times out after 90s.

ParametersJSON Schema
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

ParametersJSON Schema
NameRequiredDescription

No output parameters

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 disclosure burden. It does add non-obvious behavior: the 90-second timeout and the platform-specific Android/iOS split. But it does not clarify what 'iOS answers per command' means in practice, and there is no statement about side effects or prerequisites.

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 the core action front-loaded, followed by two high-value caveats (platform behavior and timeout). Every word earns its place; there is no filler or redundant 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?

The tool has 15 optional parameters and no annotations, but the schema is fully described and an output schema exists, which lowers the burden. The description provides purpose, platform nuance, and a timeout warning. Still, it omits when to use it versus siblings and leaves the ambiguous iOS behavior unexplained, so it is adequate but not 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 parameter semantics baseline is 3. The description adds no parameter-level meaning, but it does not need to because the input schema already documents all 15 parameters clearly and includes enums where relevant.

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: 'Show foreground app/activity'. The platform qualifier (Android; iOS answers per command) adds useful scoping, and the timeout clause is a concrete behavioral detail. This clearly distinguishes it from generic siblings like apps or snapshot, even without naming them.

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 the purpose ('when you need the current foreground app/activity'), and the platform note gives context. However, it never explicitly says when to prefer this over sibling tools like app-switcher, apps, or snapshot, nor does it state any exclusion conditions.

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.

ParametersJSON Schema
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

ParametersJSON 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.

ParametersJSON Schema
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 or aws-device-farm.
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.3/5.0
Behavior3/5

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

No annotations are provided, so the description must carry the full behavioral burden. It discloses a 90-second timeout, which is useful, and the verb 'List' implies a read-only operation. However, it does not mention pagination, response format, or whether structuredContent is included by default. Given the minimal disclosure, this is adequate but not thorough.

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 short—two sentences—and front-loads the purpose. The timeout note is a useful extra detail. There is no wasted wording. While it is terse, it is efficient and not padded, so it earns a high score for conciseness, though it sacrifices completeness.

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 has 17 parameters, no output schema, and no annotations, the description is incomplete. It does not explain what the returned artifacts look like, whether they are structured or textual, or how the many parameters interrelate. The agent must rely entirely on the schema, and the description fails to provide the higher-level context needed to confidently invoke the 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 parameter-specific information beyond the schema, and with 17 parameters it does not attempt to summarize or prioritize them. The schema's detailed descriptions carry the weight, so the description neither helps nor hurts here.

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 ('List') and resource ('daemon or cloud provider artifacts') and scopes it to 'an active or completed session.' This distinguishes it from most siblings, though it doesn't explicitly name an alternative. It is more specific than a tautology and gives the agent a concrete idea of what the tool does.

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 implies usage for sessions, but provides no guidance on when to choose this over sibling tools or when not to use it. There are no exclusions or alternative tool references. The 'active or completed session' context offers a mild cue, but it falls short of explicit direction.

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.

ParametersJSON Schema
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. Times out after 90s; a caller-supplied budget extends it.

ParametersJSON Schema
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).
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

ParametersJSON Schema
NameRequiredDescription
modeYes
actionYes
settleNo
messageYes

TDQS

A3.9/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 behavioral disclosure burden. It mentions timeout (90s) and budget extension, and the settle behavior is described as best-effort. However, it does not disclose what happens on navigation failure, whether the action is reversible, or any side effects. For a navigation tool, this is adequate 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.

Conciseness5/5

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

Two sentences with zero fluff. The first sentence states the purpose and modes, the second adds usage and timeout behavior. Information is front-loaded and every clause earns its place. Ideal conciseness.

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 has 20 parameters but 95% schema coverage and an output schema, the description covers the essential behavioral aspects: the two modes, timeout, and settle behavior. It doesn't explain return values (output schema handles that) or list all parameters (schema does). It is complete for an agent to call it correctly, though it could briefly mention what happens when no mode is specified (defaults are not stated).

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 most parameters are already documented. The description adds meaningful context for the 'mode' parameter (in-app vs system) and clarifies the settle option ('wait for the UI to go quiet and return the settled diff'). This goes beyond the schema and helps the agent understand parameter purpose and interaction.

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 function: navigating back in-app or through system navigation. It names the resource (navigation) and the two modes (in-app vs system), which distinguishes the two distinct behaviors. However, it does not explicitly differentiate from sibling navigation tools like app-switcher or home, though the context is clear.

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 explicit guidance on when to use each mode: 'Use in-app for the app navigation stack and system when the platform back behavior is required.' This is actionable and clarifies the primary decision. It does not mention alternatives or exclusion cases, but the mode selection is well-covered.

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

batchC

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

ParametersJSON Schema
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

C2.3/5.0
Behavior2/5

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

Only discloses a 90s timeout. With no annotations provided, the description carries the full burden of behavioral disclosure. It doesn't mention whether steps run sequentially, what happens on failure, whether output is aggregated, or any error handling behavior. The timeout is useful but insufficient.

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

Conciseness2/5

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

The description is extremely short (two sentences), but this is under-specification rather than conciseness. The only substantive information is the timeout; the rest is generic and doesn't justify its place. A more useful description would explain the steps structure and batching semantics.

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

Completeness1/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, nested steps object, many command options), the description is severely inadequate. It doesn't explain that each step uses a command name and input matching the corresponding MCP tool schema, the maxSteps limit, or the onError policy. An agent would have to infer all usage details from the schema, which is insufficient for effective 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 coverage is 100%, so all parameters are documented in the schema. The description adds no parameter-specific information beyond what the schema provides. Baseline of 3 is appropriate since the schema handles parameter documentation.

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

Purpose3/5

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

States a clear verb ('Execute multiple commands') and resource ('daemon request'), but does not differentiate from the many sibling command tools. It doesn't explain that this is a batch wrapper for individual commands, nor mention the steps array. The purpose is identifiable but lacks specificity to distinguish it from alternatives.

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 calling individual command tools separately. It doesn't mention performance benefits, batching use cases, or when not to use it. The description provides no context for selection among siblings.

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.

ParametersJSON Schema
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.
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

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

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description must carry the behavioral transparency burden. It usefully discloses a 90-second timeout and the selection mechanism. It does not describe side effects, idempotency, whether boot waits for readiness, or failure behavior beyond timing, so it provides only partial behavioral context.

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 terse sentences front-load the core action, then clarify device selection and add the timeout. Every sentence contributes operational information, no repetition of schema content, and no irrelevant details.

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?

With all 16 parameters described in the schema and an output schema available, the description correctly avoids restating parameter details. It supplies the missing context: device resolution approach, follow-up readiness, and 90-second timeout. Minor gaps remain around whether boot is asynchronous and how an already-booted device is handled, but the definition is adequate for selecting and invoking the tool correctly.

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 schema already documents all 16 parameters, so the baseline is 3. The description adds value by clarifying that no device name is passed directly and that the target is resolved via the device-selection inputs. This helps an agent understand how to populate selector parameters correctly rather than looking for a 'name' field.

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 clear action ('Boot or prepare') with a specific resource ('selected device or simulator') and the intended outcome ('so later commands can target it'). This distinguishes it from device-management siblings like shutdown or devices by focusing on bringing the device into a usable state.

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 clearly implies when to use it: before later commands that target the device. It also advises that the device is chosen through device-selection inputs, not by naming it directly. However, it does not explicitly state when not to use it or mention sibling alternatives such as shutdown or open.

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.

ParametersJSON Schema
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; use settle or verify to confirm the result without a follow-up snapshot. Times out after 90s; a caller-supplied budget extends it.

ParametersJSON Schema
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.
jitterPxNoRandomization radius in pixels.
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).
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

ParametersJSON 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
jitterPxNoRandomization radius in pixels.
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/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 it delivers: it explicitly warns 'This can change app state', recommends settle or verify to confirm results, and discloses the 90s timeout plus caller-budget extension. It omits some behavioral aspects such as the default action-recording implied by the noRecord parameter, but the core mutation warning and timeout are clearly stated.

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 with zero filler; the action and targeting modes are front-loaded, followed by the state-change warning and timeout. Every sentence contributes distinct 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?

For a 29-parameter tool with no annotations, the description covers the essential operational facts: what it acts on, how to choose a target, how to confirm the result, and the timeout. An output schema exists, so return values need no description, and the schema itself documents all parameters; the main residual gap is sibling differentiation.

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 already has a rich description, so the baseline of 3 applies. The description adds only the preference ordering among target kinds (ref/selector before coordinates), which is useful but minor relative to 29 parameters.

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 three targeting mechanisms (snapshot ref, selector, coordinates), going well beyond the tautological tool name. However, it does not explicitly differentiate from similarly-scoped siblings like press, longpress, and gesture, so it falls just short of full 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?

Gives actionable when-to-use rules: prefer a ref or selector after a snapshot, and reserve coordinates for when semantic targeting is unavailable. It also prescribes settle/verify as the confirmation path instead of a follow-up snapshot. There is no explicit routing versus sibling input tools (press, gesture, longpress), but the targeting-mode guidance is genuinely operational.

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.

ParametersJSON Schema
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

ParametersJSON 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. Times out after 90s.

ParametersJSON Schema
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

A3.6/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. It discloses a 90s timeout and the distinction from shutdown, but omits side effects (e.g., whether unsaved data is lost), error handling, or what happens when the app is not running. For a close operation this is a significant gap in transparency.

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 redundancy. The first sentence states the core action, the second adds a usage caveat and a timeout. Information is front-loaded and every sentence earns its place.

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?

Despite high schema coverage, the description does not mention output or return values (no output schema exists), error behavior, or how to select an app (by name, bundle ID, etc.). With 20 parameters and no output schema, the description leaves an agent uncertain about what happens after the call, making it 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 all parameters. The description adds no parameter-specific meaning beyond what is in the schema, which is acceptable given the high coverage. Baseline of 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 clearly states the tool closes a named app, or the active session app when omitted. It explicitly contrasts with shutdown, distinguishing this tool from the sibling 'shutdown' tool. The verb-resource pair is specific and 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?

Provides a clear condition for when to use shutdown instead of close ('Use shutdown only when the selected simulator or emulator should also stop'). However, it does not offer broader guidance on when to prefer close over other app-management tools, nor does it state when not to use it. The guidance is present but narrow.

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 profiles. Times out after 90s.

ParametersJSON Schema
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

A4.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 of behavioral disclosure. It adds the useful 90-second timeout and the narrow-scope behavior, but it does not disclose side effects, output behavior, or failure modes beyond that. Some meaningful behavioral context is present, but not enough for a tool 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?

The description is three sentences with no filler. It front-loads the core purpose, then provides sibling routing, and ends with the timeout constraint. Every sentence contributes information an agent needs.

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 tool with no annotations and no output schema, the description is relatively complete: it clarifies purpose, sibling boundaries, and a key operational limit. It leaves some details such as output path defaults or multi-dSYM matching behavior to the schema, but the schema picks up most of that burden.

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 nearly all parameters. The description adds the key conceptual detail that dSYM matching is done by UUID, which helps make sense of dsym and searchPath, but it does not need to add more and does not go beyond that.

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: 'Symbolicate Apple crash artifacts with matching dSYM UUIDs.' It clearly distinguishes this tool from sibling tools by stating the debug namespace is intentionally narrow and naming what each sibling should be used for.

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 explicitly routes an agent to alternatives: '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 profiles.' This makes the selection boundary between debug and neighboring tools explicit.

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.

ParametersJSON Schema
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

ParametersJSON 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.

diffA

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.

ParametersJSON Schema
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

ParametersJSON Schema
NameRequiredDescription
modeYes
linesYes
summaryYes
warningsNo
baselineInitializedYes

TDQS

A3.7/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 a 90-second timeout, which is useful, but does not state whether the operation is read-only, what prerequisites exist (e.g., prior artifacts), or the nature of side effects. Limited 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?

Two sentences with zero filler. The primary purpose is front-loaded, and the mode-specific guidance is presented immediately. Every sentence earns its place.

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 22 parameters and an output schema, this description is too sparse. It does not explain how to supply the artifacts being compared (there is no obvious parameter for a baseline or target), nor what the output looks like. An agent would struggle to construct a valid call beyond the required kind parameter.

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?

The description implies two kinds ('snapshot' and 'screenshot'), but the schema constrains kind to only 'snapshot', creating a direct inconsistency that could mislead an agent. The description adds no meaning for the other parameters (out, raw, depth, scope, etc.) beyond their schema descriptions, and does not clarify how to specify the two artifacts to compare.

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 verb (compare), the resource (accessibility snapshots or screenshots), and the purpose (identify UI changes). It also distinguishes between the two modes (snapshot for semantic tree changes, screenshot for pixel differences), which sets it apart from sibling tools like snapshot and screenshot.

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 when to use snapshot comparisons vs screenshot comparisons, giving context for selecting the right mode. However, it does not mention when to avoid this tool or recommend alternative sibling tools, though the internal mode distinction is helpful.

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.

ParametersJSON Schema
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

ParametersJSON 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.

ParametersJSON Schema
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. 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.

ParametersJSON Schema
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).
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

ParametersJSON Schema
NameRequiredDescription

No output parameters

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 transparency burden. It discloses clear-on-empty behavior, recordAs secret handling, and the 90s timeout. It does not mention response shape, side effects beyond replacing text, prerequisites such as focus, or which parameter represents the 'caller-supplied budget' that extends 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 only three sentences, front-loads the core action, and every sentence earns its place. It avoids repeating schema field details and stays focused on high-value behavioral 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?

For a complex 26-parameter tool with an output schema, the description covers the essential operational points: what it acts on, how to target it, how to clear it, how to handle secrets, and timeout behavior. The main gap is the lack of an explicit contrast with `type`, but that is a minor omission given the rich schema and sibling context.

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 already documents all 26 parameters at 100% coverage, so the baseline is 3. The description adds useful semantics for target selection modes, empty text meaning, recordAs for sensitive data, and timeout behavior, going beyond what the schema literally states.

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 opens with a specific verb and resource: 'Replace text in a UI input' and names three targeting modes: snapshot ref, selector, and coordinates. It clearly separates filling from a generic click/hover, but it does not explicitly distinguish this tool from the sibling `type`, so differentiation is left mostly to inference.

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 provides real guidance: prefer refs or selectors after a snapshot, use recordAs for sensitive text, and note the 90s timeout. However, it never states when to prefer `fill` over the sibling `type` or another alternative, so the when-to-use guidance is useful but not explicit about tool selection.

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

findC

Find by text/label/value/role/id and run action Times out after 90s.

ParametersJSON Schema
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

ParametersJSON 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

C2.5/5.0
Behavior2/5

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

No annotations are present, so the description carries the full burden. It discloses a 90-second timeout, which is useful, but does not describe side effects (e.g., destructive actions), behavior when no element is found, or whether the action is read-only or mutating. This is a significant gap for a tool that can run click, fill, and type actions.

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 a single sentence, which is concise and front-loaded with the main purpose. However, it lacks any structure or breakdown of the action and locator options, and the timeout note is appended without context.

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

Completeness1/5

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

Given the tool's complexity (26 parameters, no annotations, output schema present but not described), the description is grossly inadequate. It does not explain the action list, locator semantics, device targeting, or any of the boolean flags. An agent would have to rely almost entirely on the schema, which itself is incomplete at 65% coverage. This is far from a minimum viable description for such a feature-rich tool.

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 65%, so many parameters are described in the schema. The description adds meaning for the locator concept (text/label/value/role/id), but does not explain the action enum, flags like raw/last/first, or device selection parameters. It adds only marginal value beyond the schema for a tool with 26 parameters.

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 purpose: find by text/label/value/role/id and run an action. This distinguishes it from siblings like click or get, which are single-purpose. It does not explicitly name an alternative, 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 Guidelines2/5

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

No guidance is given on when to use this tool versus alternatives such as click, fill, or get. It does not mention prerequisites, exclusions, or scenarios where a simpler tool would be more appropriate.

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.

ParametersJSON Schema
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) into the closed, half-open, or open pose, or follow timestamped angle keyframes, by sending a simulator HID hinge event, then read the hinge angle back from CoreDevice to confirm it. A pose change moves the app to a different panel with a different point size, so 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-only; 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.

ParametersJSON Schema
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

ParametersJSON Schema
NameRequiredDescription
poseYes
actionYes
screenNo
messageYes
hingeAngleDegreesYesHinge angle CoreDevice read back after the pose settled.

TDQS

A4.5/5.0
Behavior5/5

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

With no annotations, the description carries full behavioral burden and does so thoroughly: it explains the underlying HID event, post-command coordinate staleness requiring re-snapshot, simulator prerequisites, specific error behavior (UNSUPPORTED_OPERATION with unsupported-device-scope), and the 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.

Conciseness5/5

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

The description is dense but every sentence earns its place: core action, side-effect warning, compatibility constraints, error condition, and timeout. It front-loads the command's purpose and consequences.

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 complex tool with 18 parameters and no annotations, the description covers prerequisites, side effects, failure modes, and timeout behavior. An output schema exists, so omitting return-value details is acceptable.

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 every parameter. The description adds some context around pose and keyframes but does not provide additional parameter-level semantics beyond what the schema details.

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: it folds or unfolds the foldable iPhone simulator into a pose or follows keyframes. It also clearly distinguishes the mechanism (HID hinge event, CoreDevice confirmation) and is not a tautology.

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 clearly states simulator-only usage, required SDK, and that Device Hub/Accessibility permissions are not required. It also warns against non-default simulator sets and instructs to run against the default set, but it does not explicitly name alternative tools.

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

gestureC

Perform a structured pan, fling, swipe, pinch, rotate, transform, or drag gesture. Select the gesture kind, then provide only the inputs that apply to that kind. Times out after 90s.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYesGesture variant.
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
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).
moveMsNoDrag movement duration.
originNoGesture origin point.
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.
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

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 must carry full burden. It discloses a 90s timeout, which is a useful behavioral trait. However, it does not mention side effects, whether it is read-only or destructive, or any other behaviors. The term 'structured' is vague and does not clarify what the tool does beyond performing the gesture. It does not mention recording or device targeting. Given the lack of annotations, this is insufficient.

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 single sentence that states the purpose and a usage rule, plus a timeout. It is concise and front-loads the purpose. However, it could be structured to list the kinds more clearly. Still, it is appropriately sized.

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 31 parameters and 7 gesture kinds, the description is extremely sparse. It does not explain which parameters apply to which gesture kind, nor does it describe the output. With no output schema, the description should clarify what the tool returns, but it does not. The schema has parameter descriptions, but they are not enough to understand the gesture-specific requirements. The description is far from complete 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 100%, so the baseline is 3. The description adds the rule to provide only inputs that apply to the selected kind, which gives a generic guideline. It does not add specific parameter details beyond what the schema provides. It adds minimal value.

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 it performs a structured gesture of various types (pan, fling, swipe, pinch, rotate, transform, drag). However, it does not differentiate from sibling tools like the dedicated 'swipe' tool, which could confuse an agent about which tool to use. The purpose is explicit but sibling differentiation is weak.

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 says to select the gesture kind and provide only applicable inputs, but it does not specify when to use this tool versus alternatives like swipe or scroll. No exclusions or context about scenarios are given. It offers minimal guidance on usage.

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.

ParametersJSON Schema
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.

helpA

Usage guides. No topic: the full workflow 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.

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

TDQS

A4.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. It discloses the core behavior: omitting topic returns the full workflow card, a listed topic returns its guide, and a tool name returns its complete flag reference. It does not detail output formatting or invalid-topic behavior, but the behavioral surface of a help tool is well 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?

Two sentences carry all essential information and are front-loaded with the core purpose. The long second sentence is dense but each clause adds a distinct rule, and the guidance is structured logically from current behavior to exclusions.

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?

Even without an output schema, the description explains return types for all invocation forms: workflow card, guide, or flag reference. The single parameter's usage and omission behavior are fully covered, and the usage caveats complete the picture for an agent deciding when to call this tool.

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 schema already covers topic with 'Guide topic or tool name; omit for the card,' but the description adds significant meaning by enumerating all valid guide topics and clarifying the tool-name path. This goes beyond the schema's brief description and helps the agent form correct invocations.

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 identifies the tool as a usage guide dispatcher: 'Usage guides' plus a precise mapping of topic values to guides, the workflow card, or a tool's flag reference. It is immediately distinguishable from the sibling command tools because it is the meta/help tool, not an operational command.

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 when-to-use and when-not-to-use guidance: 'For specialized work or an unclear command shape only; not a startup step, not needed after an error that carries a hint.' It also explains the no-topic case and the alternate form for tool-name flag references, leaving no ambiguity about selection.

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.

ParametersJSON Schema
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

ParametersJSON 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.

ParametersJSON Schema
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).
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

ParametersJSON 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.2/5.0
Behavior4/5

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

With no annotations present, the description carries a heavy burden and does a solid job: it discloses that the action does not press, that it is web-only, that it times out after 90 seconds, and that a caller-supplied budget can extend it. It also ties 'settle' to observing what hover revealed, adding behavioral context beyond the raw schema. It does not explain the response contents, but an output schema exists.

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 earning its place: action/purpose, platform restriction, and behavioral notes about settle and timeout. The most important information is front-loaded, and there is no filler or repetition.

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 schema is rich with 22 parameters and an output schema, so the description can focus on behavior, which it does. It covers core semantics, platform applicability, timeout, and the settle flow. The one gap is the ambiguous 'caller-supplied budget' – no parameter in the schema directly corresponds to it, which makes it unclear how an agent would extend the timeout.

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 the baseline is 3. The description adds little beyond what the schema already documents: 'by snapshot ref, selector, or coordinates' mirrors the target oneOf, and the 'Use settle' note adds purpose to that parameter but no new syntax. The cryptic 'caller-supplied budget' is not mapped to a schema property, which slightly dilutes the 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 opens with a specific verb and resource: 'Move the pointer over a UI target' and enumerates the three targeting modes: snapshot ref, selector, or coordinates. It explicitly says 'without pressing', which distinguishes it from sibling press/click/longpress tools, and it states the intended purpose: revealing hover-gated UI like row toolbars or menus.

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: use hover to reveal hover-gated UI, and gives an explicit when-not: 'Web only; touch platforms have no hover state.' It does not name an alternative tool like click or press, but 'without pressing' implies the boundary, so the guidance is clear though not exhaustive.

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.

ParametersJSON Schema
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.

ParametersJSON Schema
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.

ParametersJSON Schema
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.

ParametersJSON Schema
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

ParametersJSON 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.

ParametersJSON Schema
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.

longpressA

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.

ParametersJSON Schema
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).
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

ParametersJSON 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

A4.2/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 mention the timeout behavior and the option to extend it, and it states the action's purpose. However, it does not disclose potential side effects, reversibility, or what happens on failure. Given the absence of annotations, this is a moderate level of transparency; it covers the key timeout trait but omits other behavioral details.

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, front-loaded with the core purpose and targeting methods. Every clause adds value: the target specification, the purpose, the durationMs guidance, and the timeout note. There is no fluff 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?

The tool is complex with 23 parameters and an output schema, so the description need not repeat return details. It covers the essential purpose, targeting options, and timeout behavior. It could have added more context about when to prefer this over a regular press, but that is a minor gap given the tool's name and the sibling set. Overall, the description provides sufficient context for an agent to call the tool correctly in most scenarios.

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 already documents all 23 parameters with 100% coverage, so the baseline is 3. The description adds meaningful context by explicitly naming the three targeting methods (snapshot ref, selector, coordinates) that map to the target parameter's oneOf variants, and by highlighting durationMs as the parameter controlling hold duration. This goes beyond simply restating schema fields.

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 (hold a UI target) with specific targeting methods (snapshot ref, selector, or coordinates) and its purpose (open a context menu or other hold gesture). This distinguishes it from siblings like click or swipe by emphasizing the hold aspect, making its purpose 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?

The description gives practical usage guidance: it tells the caller to set durationMs when the default is unsuitable and mentions the 210s timeout and the ability to extend it via a caller-supplied budget. However, it does not explicitly compare longpress with alternatives such as press or hover, nor does it state conditions when another tool would be more appropriate. The provided guidance is useful but not exhaustive.

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.

ParametersJSON Schema
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.

ParametersJSON Schema
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. Metro and debug runtime hints given here are recorded as the session's dev-server binding, so a later reload reuses them; a fresh open without them clears any binding left by a previous same-name session. Times out after 90s; a caller-supplied budget extends it.

ParametersJSON Schema
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.
launchUrlNoSession-scoped launch URL hint applied to the opened app.
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.
launchConsoleNoLaunch console mode.
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 behavioral disclosure burden. It discloses that open may boot the device, that Metro/debug hints are persisted as the session dev-server binding, that a fresh open without them clears a prior binding, and that the command times out after 90s unless a caller-supplied budget extends it.

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 four sentences with no filler: purpose, target input guidance, binding behavior, and timeout. It front-loads the core action and each subsequent sentence adds distinct, useful 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?

For a 33-parameter tool with no annotations and no output schema, the description gives a solid high-level map: booting, target selection, session binding lifecycle, and timeout behavior. Platform-specific selectors and individual parameter semantics are covered by the unusually rich input schema, though a sentence about the response shape would make it fully complete.

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 97%, so the baseline is 3, but the description adds cross-parameter meaning: app/url are grouped as foreground target selectors, Metro/debug runtime hints are tied to session binding lifecycle, and caller-supplied budget is linked to the timeout behavior. These groupings are not obvious from the individual parameter descriptions alone.

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: boot when needed, then open an app, deep link, or URL in a session, and it clarifies that the result becomes the foreground automation target. This clearly distinguishes it from siblings like boot and apps rather than merely restating the tool name.

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 clear context by explaining that open is the path to making an app or URL the foreground automation target, and it notes that the tool will boot the selected device when needed. It does not explicitly name alternatives or provide when-not conditions, but the intended use is unambiguous.

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 Times out after 90s.

ParametersJSON Schema
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

ParametersJSON Schema
NameRequiredDescription
actionYes
messageYes
warningNo
confirmedNo
orientationYes

TDQS

A3.8/5.0
Behavior4/5

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

There are no annotations, so the description carries full behavioral disclosure. It discloses one important behavioral trait: the operation times out after 90 secondsaber. It does not mention whether the orientation change is authoritative, destructive, or requires a previously booted device, but the timeout is a meaningful operational constraint for an agent choosing whether to invoke it.

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 only two short sentences and gets straight to the point. The timeout warning is useful operational context, though the sentence break after 'Android' without punctuation makes the 'Times out after 90s' clause slightly awkward but still understandable.

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 17 parameters ranges from platform selectors to recording and response formatting, an agent needs guidance on which parameters matter for setting orientation. The description does not specify that `orientation` is the only required parameter or mention common combinations like `platform` with `udid`/`serial`, so the context is adequate but not 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?

The schema already describes 94% of the parameters, including the key `orientation` enum values. The description adds no new parameter-level meaning beyond pointing at the operation itself, which matches the baseline expected when schema coverage is high.

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 uses a specific verb ('Set') and resource ('device orientation') and names the supported platforms (iOS and Android). This clearly distinguishes it from the broad set of sibling device-control tools such as rotate-less equivalents like click, swipe, and scroll, none of which match this 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?

The description implies when to use the tool: whenever a device orientation needs to be changed on iOS or Android. However, it provides no explicit guidance about when not to use it, nor any comparison to alternative tools or note that orientation is a mobile-specific operation, leaving some interpretation to the agent.

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.

ParametersJSON Schema
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. Times out after 90s; a caller-supplied budget extends it.

ParametersJSON Schema
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.
jitterPxNoRandomization radius in pixels.
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).
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

ParametersJSON 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
jitterPxNoRandomization radius in pixels.
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.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 of behavioral disclosure. It does that by revealing the interaction (short-press), the supported target forms, and a concrete timeout behavior: 90s default, extendable by a caller-supplied budget. It does not discuss side effects on UI state or device prerequisites, but the core runtime behavior is disclosed.

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 tight sentences: action and target forms first, alternative routing second, timeout/budget last. Every clause earns its place and there is no repetition of schema details.

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 tool with no annotations, the description does not try to enumerate parameters but gives the essentials needed for selection and safe invocation: what it acts on, the main alternative, and the time limit. It slightly undersells the breadth of the action, but the rich schema and output schema cover most invocation details.

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 every parameter. The description's mention of ref/selector/coordinates maps to the target oneOf but adds little beyond it; no new meaning is added for count, settle, verify, or the many optional fields. 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 and resource, 'Short-press a UI target,' and explicitly names the three target forms: snapshot ref, selector, or coordinates. It also distinguishes the tool from longpress, so an agent can tell it apart from its closest sibling 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 explicitly states when not to use this tool and names the alternative: 'Use longpress instead when the target requires a context-menu or hold gesture.' The timeout/budget sentence also gives operational guidance about how long the call may take.

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.

ParametersJSON Schema
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

ParametersJSON 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.

ParametersJSON Schema
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.

ParametersJSON Schema
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

ParametersJSON 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.

ParametersJSON Schema
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.

replayB

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.

ParametersJSON Schema
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.
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.
timeoutMsNoMaximum wall-clock duration for the replay request.
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

ParametersJSON Schema
NameRequiredDescription
healedYes
messageYes
sessionYes
replayedYes
artifactPathsYes
sessionActiveYesTrue iff the session is still active — the script had no terminal close.
snapshotDiagnosticsNo

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 must carry the full burden of behavioral disclosure. It does disclose two important behaviors: a script without a terminal close leaves its session active, and it times out after 90 seconds unless a budget is provided. However, it omits many other behavioral aspects such as side effects, error handling, or device interactions, which are relevant for a 29-parameter tool. It adds some transparency but is 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.

Conciseness5/5

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

The description is three concise sentences that state the core purpose first, then a key behavioral nuance, and finally a timeout constraint. There is no fluff; 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?

For a tool with 29 parameters, the description is quite sparse. It covers the core action and two behaviors but gives no guidance on typical usage, which parameters are essential beyond the required path, or how the replay interacts with devices or sessions. The presence of an output schema covers return values, but the description lacks sufficient context to fully guide an agent on how to use this complex tool correctly.

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 description coverage is 69%, which is moderate. The description adds almost no parameter-level meaning; the only hint is 'a caller-supplied budget extends it,' which could map to timeoutMs but is not explicit. For a tool with 29 parameters, the description does not help disambiguate which parameters matter for typical use, and it does not compensate for the 31% of parameters without schema 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?

The description states a specific action (run) on a specific resource (a recorded automation script), and adds compatibility with Maestro YAML flows, making the purpose unambiguous. The verb and resource are clear, and the tool's role among siblings (e.g., record, test) is inferable from the name and description.

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 replay versus alternatives like test or record, and provides no exclusions or conditions. It only states what the tool does, leaving the agent to infer usage from the name alone, which is insufficient for a complex tool with many siblings.

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.

ParametersJSON Schema
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.

ParametersJSON Schema
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
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).
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

ParametersJSON 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.7/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, and it excels. It details the movement reporting (moved, at-edge, unchanged, unobserved), the specific refusal codes (scroll_keyboard_occludes_surface, scroll_no_progress), the conditions under which the movement field is absent, the effect of amount (finger-path fraction up to 0.8), and the timeout behavior. This is exemplary transparency for a complex 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?

The description is dense but every sentence earns its place. It is front-loaded with the core purpose, then progressively covers usage, edge cases, reporting, and timeout. There is no fluff or repetition; each clause introduces a distinct behavioral fact. The structure is logical and scannable, making it easy for an agent to extract the key constraints.

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 tool's complexity (24 parameters, multiple directions, until logic, movement reporting, and refusal conditions), the description is remarkably complete. It covers the main behavior, the 'until' loop, the amount semantics, keyboard interaction, movement field presence/absence, and timeout. The output schema exists separately, so return-value details are not required here. An agent has all the information needed to call this tool correctly and anticipate its failure modes.

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 96%, so the schema already documents most parameters. The description adds genuine value beyond the schema by explaining the semantics of 'amount' as a finger-path fraction with a 0.8 cap (schema only says 'Platform scroll amount') and by clarifying the interaction between keyboard visibility and the swipe band. It also explains the movement field which is not in the input schema. This exceeds the baseline for high coverage, so a 4 is warranted.

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 precise verb and resource: 'Scroll in a direction, or toward the top/bottom edge of scrollable content.' It immediately distinguishes the tool from siblings like swipe or gesture by focusing on scrollable content and the top/bottom edge concept. The 'until' clause further clarifies a specific use case (reaching an off-screen target) that sets it apart from a naive scroll-and-check loop.

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 guidance on when to use 'until' ('to reach an off-screen target in one command rather than a scroll-and-check loop') and notes behavioral caveats like keyboard occlusion and the refusal conditions. It does not explicitly name alternative tools (e.g., swipe, gesture) or state when not to use scroll, but the context is strong enough for an agent to infer appropriate usage. The absence of explicit exclusions keeps it from a 5.

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.

ParametersJSON Schema
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.

settingsB

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
appNo
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

B3.1/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 that this is a read/change tool and that platform support varies, plus a 90s timeout. However, it does not mention side effects of changes, reversibility, permission implications, or what the 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.

Conciseness4/5

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

The description is compact and front-loaded: the action and resource are in the first sentence, and the timeout and platform caveat are added without fluff. It is appropriately short even though it leaves semantic gaps.

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 23 parameters, no annotations, and no output schema, this description is too thin. It does not explain what setting values are recognizable, how mode/state/permission combine, or what successful output looks like, so an agent could not reliably invoke it for a specific setting.

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 70%, so the schema does some work, but the required `setting` parameter has no description, and `mode`, `state`, and `permission` are also undocumented. The description adds high-level categories such as animation scales and app permissions, but not the exact accepted values or interactions.

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 uses a specific verb and resource: 'Read or change supported operating-system settings, animation scales, appearance, or app permissions'. It clearly identifies what the tool operates on and is distinguishable from the listed siblings, though it does not explicitly name an alternative.

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 on when to use this tool versus alternatives such as get, set-like operations, or other device controls. The caveat that 'platform support varies' is useful but does not explain selection criteria or exclusions.

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.

ParametersJSON Schema
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

ParametersJSON 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.

snapshotA

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.

ParametersJSON Schema
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.
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

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 behavioral disclosure burden. It usefully discloses the 90s timeout and that a caller-supplied budget extends it, and implies a read-only capture. However, it does not explain recording side effects given the record/noRecord parameters, how the session baseline is created, or what 'caller-supplied budget' maps to in 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?

The description is short, front-loaded with the primary action, and each sentence contributes useful information such as returned refs, diff usage, and timeout behavior. It loses a point because the 'or compare it with the previous session baseline' phrasing is dense and ambiguous rather than crisply structured.

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 a 24-parameter tool with no annotations and no output schema. The description covers the main purpose and timeout, but it does not explain the shape of the returned refs, what 'previous session baseline' means, or how the various selectors and recording options fit, leaving an agent without enough context to fully anticipate the response or side effects.

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 79%, so most parameters are already documented in the input schema. The description adds only general context about returned refs, diff usage, and timeout extension; it does not clarify the remaining undocumented parameters or explicitly connect 'caller-supplied budget' to timeoutMs, so its marginal semantic contribution is limited.

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 opens with a concrete verb and object: 'Capture the accessibility tree', and clarifies that the returned refs support subsequent semantic interactions. It is slightly ambiguous because 'or compare it with the previous session baseline' and 'the diff option' suggest snapshot itself may perform comparisons, while diff is a separate sibling 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?

The description gives practical guidance: use the returned refs for later semantic interactions and use the diff option to verify UI changes. This helps an agent choose snapshot as the prerequisite for semantic interaction and points to diff as the comparison alternative, though it does not explicitly say when not to use snapshot.

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.

ParametersJSON Schema
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.

testC

Run one or more replay scripts as a serial test suite Streams progress; no fixed client timeout.

ParametersJSON Schema
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.
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

ParametersJSON Schema
NameRequiredDescription
testsYes
totalYes
failedYes
notRunYes
passedYes
skippedYes
executedYes
failuresYes
durationMsYes
snapshotDiagnosticsNo

TDQS

C2.5/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 discloses 'no fixed client timeout' and mentions streaming progress, but it fails to explain side effects, permissions, failure behavior, or what happens to artifacts. This is minimal disclosure for a test runner.

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 concise but awkwardly phrased; 'Streams progress' reads as a fragment and lacks clarity. It front-loads the core action but could be more intelligible and structured.

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

Completeness1/5

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

For a tool with 30 parameters and a complex serial execution model, the description is grossly incomplete. It does not explain the meaning of 'serial test suite', how paths are used, the operational context, or how it differs from replay. The output schema exists, but behavioral and usage context is missing.

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?

The description adds no parameter-specific information beyond what the schema provides. With schema coverage at 60%, many parameters lack descriptions, and the description does not compensate. It only vaguely references 'replay scripts', which aligns with the 'paths' parameter but nothing else.

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 action ('Run') and resource ('one or more replay scripts') and indicates a serial test suite, which distinguishes it from the 'replay' sibling. However, the phrasing 'Streams progress' is ambiguous and no explicit comparison to alternatives is given.

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 provided on when to use this tool versus alternatives like 'replay'. The phrase 'serial test suite' implies batch usage, but it never explicitly says to use 'replay' for a single script or mentions any prerequisites or exclusions.

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. Use the same artifact path for the matching start and stop requests when an explicit path is required. Times out after 90s.

ParametersJSON Schema
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

ParametersJSON 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 provided, the description carries the behavioral disclosure burden. It discloses that the tool returns the artifact when capture ends, that matching start/stop requests must use the same path when required, and that the operation times out after 90 seconds. It stops short of covering side effects or permission requirements, but the disclosed behaviors are concrete and 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?

The description is three sentences with no filler. The core action is front-loaded, the path-pairing constraint is stated clearly, and the timeout is a concise operational detail. 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 an 18-parameter tool with an output schema and high parameter-level description coverage, the description covers the essential lifecycle: start or stop, artifact return, path matching, and timeout. It does not explain when to prefer this over siblings, but the output schema and parameter descriptions carry much of the remaining context.

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 at 89%, so the schema already documents most parameters. The description adds meaningful semantics for the under-documented 'path' parameter by explaining that the same artifact path must be used for matching start and stop requests. This lifts it above 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 uses a specific verb and resource: start/stop trace-log capture and return the artifact. It clearly identifies the tool's function without relying on the name 'trace' as a tautology, but it does not explicitly distinguish itself from sibling tools like record, logs, or perf.

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 operational guidance for pairing start and stop requests with the same artifact path, but it gives no explicit guidance about when to choose this tool over alternatives. There is no mention of scenarios, exclusions, or comparison with sibling tools.

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.

ParametersJSON Schema
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

ParametersJSON 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 or D-pad button on Android TV, tvOS, or Vega OS. Choose the button and optional hold duration through the input fields. The aliases ok, center, and enter all map to select. Times out after 90s.

ParametersJSON Schema
NameRequiredDescriptionDefault
udidNoApple device or simulator UDID; the selector that pins one device when several share a name.
debugNoEnable debug diagnostics.
runIdNoLease run identifier.
buttonYes
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

ParametersJSON Schema
NameRequiredDescription
actionYes
buttonYes
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 provided, the description carries the full behavioral burden. It discloses the timeout (90s), alias mapping (ok/center/enter → select), and the distinction between press and long-press via hold duration. This goes beyond a basic mutation hint, though it could additionally explain platform-specific duration behavior (already covered in 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 compact sentences each earn their place: the first defines the action and scope, the second points to the input fields, and the third provides essential behavioral facts (aliases and timeout). No filler or repetition of schema details.

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 18 parameters, the description cannot cover everything, but the schema covers 94% of parameters and an output schema exists. The description supplies the core operational context: action, platforms, aliases, and timeout. It does not mention device-resolution prerequisites, but those are documented in the schema selectors, so the description is sufficiently complete.

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 (94%), so the baseline is 3. The description adds value beyond the schema by explaining that ok, center, and enter are aliases for select, which is not in the button enum description. It also frames durationMs as 'hold duration' in context, reinforcing the parameter's purpose.

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 ('press or long-press') with a clear resource ('TV remote or D-pad button') and scopes it to specific platforms ('Android TV, tvOS, or Vega OS'). It also distinguishes itself from generic press/longpress siblings by focusing on TV remote controls and D-pad buttons.

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: use this tool when operating TV remote or D-pad buttons on Android TV, tvOS, or Vega OS. It does not explicitly say when to use an alternative like press or longpress, but the platform and button-type scoping makes the intended usage reasonably clear without needing exclusions.

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.

ParametersJSON Schema
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.

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.

ParametersJSON Schema
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

ParametersJSON 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.

ParametersJSON Schema
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

ParametersJSON 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. 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"
        +}
  2. 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"
        +]
  3. 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"
        +}
  4. 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."
  5. 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"
        -}
  6. 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"
        +]
  7. 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."
  8. 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"
        +}
  9. 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"
        +}
  10. 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"
        +}
  11. 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
  12. 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"
        +]
  13. 48 tool updatesv0.17.6
    • Changedalert5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedapp-switcher5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedapps5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedappstate5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedback5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedbatch6 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
      • changedInput schema / properties / steps / items / properties / command / enum
        Previous value: -[
        -  "devices",
        -  "boot",
        -  "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",
        +  "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"
        +]
    • Changedboot5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedclick5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedclipboard5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedclose5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Addeddebug
    • Changeddevices5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changeddiff6 fields changed
      • removedInput schema / properties / compact
        Removed value: -{
        -  "type": "boolean"
        -}
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedfill5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedfind5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedfocus5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedgesture5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedget5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedhome5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedinstall5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedinstall-from-source5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedis5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedkeyboard5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedlogs5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedlongpress5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedmetro5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changednetwork5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedopen6 fields changed
      • addedInput schema / properties / deviceHub
        Added value: +{
        +  "description": "Use Xcode Device Hub when surfacing Apple simulators.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedperf12 fields changed
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "sample"
        -]New value: +[
        +  "sample",
        +  "snapshot",
        +  "start",
        +  "stop",
        +  "report"
        +]
      • changedInput schema / properties / area / enum
        Previous value: -[
        -  "metrics",
        -  "frames"
        -]New value: +[
        +  "metrics",
        +  "frames",
        +  "memory",
        +  "cpu",
        +  "trace"
        +]
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / kind
        Added value: +{
        +  "enum": [
        +    "xctrace",
        +    "simpleperf",
        +    "perfetto",
        +    "android-hprof",
        +    "memgraph"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / out
        Added value: +{
        +  "description": "Output artifact path.",
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
      • addedInput schema / properties / subject
        Added value: +{
        +  "enum": [
        +    "profile"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / template
        Added value: +{
        +  "description": "xctrace template name, for example Time Profiler.",
        +  "type": "string"
        +}
      • addedInput schema / properties / tracePath
        Added value: +{
        +  "description": "Existing .trace path to report, defaults to the latest session trace.",
        +  "type": "string"
        +}
    • Changedpress5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedpush5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedreact-native5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedrecord5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedreinstall5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedreplay5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedrotate5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedscreenshot5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedscroll5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedsession7 fields changed
      • addedInput schema / properties / action / description
        Added value: +"list shows active sessions; state-dir prints the resolved daemon state directory without contacting the daemon."
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "list"
        -]New value: +[
        +  "list",
        +  "state-dir"
        +]
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedsettings5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Addedshutdown
    • Changedsnapshot6 fields changed
      • removedInput schema / properties / compact
        Removed value: -{
        -  "type": "boolean"
        -}
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedswipe5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedtest5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedtrace5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedtrigger-app-event5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedtype5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
    • Changedwait5 fields changed
      • addedInput schema / properties / iosXctestDerivedDataPath
        Added value: +{
        +  "description": "Derived data path for external iOS XCTest runner execution.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestEnvDir
        Added value: +{
        +  "description": "Writable directory for iOS XCTest runner env overlays.",
        +  "type": "string"
        +}
      • addedInput schema / properties / iosXctestrunFile
        Added value: +{
        +  "description": "Externally built iOS XCTest runner .xctestrun artifact path.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mcpOutputFormat
        Added value: +{
        +  "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.",
        +  "enum": [
        +    "optimized",
        +    "json"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / platform / enum
        Previous value: -[
        -  "ios",
        -  "android",
        -  "macos",
        -  "linux",
        -  "apple"
        -]New value: +[
        +  "ios",
        +  "macos",
        +  "android",
        +  "linux",
        +  "apple"
        +]
  14. 2 tool updatesv0.17.1
    • Changedperf2 fields changed
      • addedInput schema / properties / action
        Added value: +{
        +  "enum": [
        +    "sample"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / area
        Added value: +{
        +  "enum": [
        +    "metrics",
        +    "frames"
        +  ],
        +  "type": "string"
        +}
    • Changedtest3 fields changed
      • addedInput schema / properties / recordVideo
        Added value: +{
        +  "type": "boolean"
        +}
      • addedInput schema / properties / shardAll
        Added value: +{
        +  "type": "integer"
        +}
      • addedInput schema / properties / shardSplit
        Added value: +{
        +  "type": "integer"
        +}
  15. 46 tool updatesv0.16.9
    • First observedalert
    • First observedapp-switcher
    • First observedapps
    • First observedappstate
    • First observedback
    • First observedbatch
    • First observedboot
    • First observedclick
    • First observedclipboard
    • First observedclose
    • First observeddevices
    • First observeddiff
    • First observedfill
    • First observedfind
    • First observedfocus
    • First observedgesture
    • First observedget
    • First observedhome
    • First observedinstall
    • First observedinstall-from-source
    • First observedis
    • First observedkeyboard
    • First observedlogs
    • First observedlongpress
    • First observedmetro
    • First observednetwork
    • First observedopen
    • First observedperf
    • First observedpress
    • First observedpush
    • First observedreact-native
    • First observedrecord
    • First observedreinstall
    • First observedreplay
    • First observedrotate
    • First observedscreenshot
    • First observedscroll
    • First observedsession
    • First observedsettings
    • First observedsnapshot
    • First observedswipe
    • First observedtest
    • First observedtrace
    • First observedtrigger-app-event
    • First observedtype
    • First observedwait

TDQS

B3.2/5.0

Scored across 59 tools

Disambiguation3/5

Several tools overlap: click and press appear to perform the same tap action, gesture includes swipe, and diff duplicates snapshot's diff option. That said, most tools have distinct purposes and descriptions clarify some pairs.

Naming Consistency3/5

Names are all lowercase and mostly readable, but there is no consistent convention: some are verbs (click, scroll, open), some nouns (snapshot, apps), and some hyphenated compounds (tv-remote, action-button). 'is' stands out as a peculiar name.

Tool Count3/5

59 tools is a large surface, but the server covers many platforms (iOS, Android, TV, foldables, web, React Native) and many interaction categories. However, the count is at the high end and could be reduced by merging overlapping commands.

Completeness4/5

The tool set covers the core device automation lifecycle well: device selection, app install/open/close, UI interaction, observation, scripted replay, and diagnostics. Gaps include uninstall and some advanced device controls, but agents can accomplish most tasks without workarounds.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    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
    -