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"
+}