Files
Michał Pierzchała 1f8fdd0b5d fix: preserve Maestro clickable-first ordering (#1917)
* fix: preserve Maestro clickable-first ordering

* test: cover Android Maestro clickable-first path

* fix: keep Maestro fixture Android-only

* fix: reveal Android Maestro targets in smoke scenario

* fix: quote Maestro smoke assertion text

* fix: retain Android Maestro clickability evidence
2026-08-21 08:48:36 +02:00

1148 lines
26 KiB
JSON

{
"schemaVersion": 2,
"generatedBy": "scripts/maestro-conformance/regenerate.mjs",
"upstream": {
"project": "mobile-dev-inc/Maestro",
"version": "2.5.1",
"tag": "v2.5.1",
"commit": "a4c7c95f5ba1884858f7e35efa6b8e0165db9448",
"artifacts": [
{
"coordinate": "dev.mobile:maestro-orchestra:2.5.1",
"role": "Layer 1 YAML parser (YamlCommandReader) and Layer 2 retry/erase constants (Orchestra).",
"sha256": "bbd8e5e35e3c706c6d4760bb1026162474b171155a5fa76f6de1360ab3705468"
},
{
"coordinate": "dev.mobile:maestro-orchestra-models:2.5.1",
"role": "Command model classes and parser-observed defaults (Layer 2 model defaults).",
"sha256": "0c147f7dff3704e1e04cb728339f2637a6086c234d7984c1434536680f6749ee"
},
{
"coordinate": "dev.mobile:maestro-client:2.5.1",
"role": "Layer 2 driver constants (Maestro.SCREENSHOT_DIFF_THRESHOLD/ANIMATION_TIMEOUT_MS, IOSDriver.SCREEN_SETTLE_TIMEOUT_MS).",
"sha256": "a6b8c63c0858e8e256752f617fd27b35b0be48e78d367f9cbdffa735a6fcc991"
}
]
},
"layer": 2,
"description": "Upstream Maestro semantic vectors. Generated by the JVM harness; do not hand-edit.",
"constants": [
{
"id": "retryMaxRetries",
"symbol": "maestro.orchestra.Orchestra#MAX_RETRIES_ALLOWED",
"note": "Upper bound Orchestra clamps a retry block's maxRetries to (coerceAtMost).",
"value": 3
},
{
"id": "maxEraseCharacters",
"symbol": "maestro.orchestra.Orchestra#MAX_ERASE_CHARACTERS",
"note": "Upper bound on eraseText character count.",
"value": 50
},
{
"id": "animationWaitThreshold",
"symbol": "maestro.Maestro#SCREENSHOT_DIFF_THRESHOLD",
"note": "Screenshot-diff threshold (romankh3 0-100 scale) for waitForAnimationToEnd stability.",
"value": 0.005
},
{
"id": "animationWaitTimeoutMs",
"symbol": "maestro.Maestro#ANIMATION_TIMEOUT_MS",
"note": "Default waitForAnimationToEnd timeout.",
"value": 15000
},
{
"id": "iosScreenSettleTimeoutMs",
"symbol": "maestro.drivers.IOSDriver#SCREEN_SETTLE_TIMEOUT_MS",
"note": "Upstream iOS pre-tap static-screen gate; agent-device intentionally omits it (expected divergence).",
"value": 3000
}
],
"modelDefaults": [
{
"id": "swipeDurationMs",
"flow": "- swipe:\n direction: LEFT",
"accessor": "SwipeCommand.duration",
"value": 400
}
],
"treeVectors": [
{
"id": "containsChild-direct-only",
"operation": "intersect(id=card, containsChild(id=direct))",
"selector": {
"id": "card",
"containsChild": {
"id": "direct"
}
},
"nodes": [
{
"key": "card",
"identifier": "card",
"rect": {
"x": 0,
"y": 0,
"width": 40,
"height": 30
}
},
{
"key": "direct",
"parentKey": "card",
"identifier": "direct",
"rect": {
"x": 0,
"y": 0,
"width": 40,
"height": 30
}
},
{
"key": "nested-parent",
"parentKey": "card",
"identifier": "nested-parent",
"rect": {
"x": 0,
"y": 0,
"width": 40,
"height": 30
}
},
{
"key": "nested",
"parentKey": "nested-parent",
"identifier": "nested",
"rect": {
"x": 0,
"y": 0,
"width": 40,
"height": 30
}
},
{
"key": "outside",
"identifier": "outside",
"rect": {
"x": 0,
"y": 0,
"width": 40,
"height": 30
}
},
{
"key": "direct-outside",
"parentKey": "outside",
"identifier": "direct-outside",
"rect": {
"x": 0,
"y": 0,
"width": 40,
"height": 30
}
}
],
"matches": ["card"],
"selected": "card"
},
{
"id": "containsDescendants-any-depth",
"operation": "intersect(id=card, containsDescendants(id=nested))",
"selector": {
"id": "card",
"containsDescendants": [
{
"id": "nested"
}
]
},
"nodes": [
{
"key": "card",
"identifier": "card",
"rect": {
"x": 0,
"y": 0,
"width": 40,
"height": 30
}
},
{
"key": "direct",
"parentKey": "card",
"identifier": "direct",
"rect": {
"x": 0,
"y": 0,
"width": 40,
"height": 30
}
},
{
"key": "nested-parent",
"parentKey": "card",
"identifier": "nested-parent",
"rect": {
"x": 0,
"y": 0,
"width": 40,
"height": 30
}
},
{
"key": "nested",
"parentKey": "nested-parent",
"identifier": "nested",
"rect": {
"x": 0,
"y": 0,
"width": 40,
"height": 30
}
}
],
"matches": ["card"],
"selected": "card"
},
{
"id": "containsDescendants-all-clauses",
"operation": "intersect(id=card, containsDescendants(id=title, text=Badge))",
"selector": {
"id": "card",
"containsDescendants": [
{
"id": "title"
},
{
"text": "Badge"
}
]
},
"nodes": [
{
"key": "complete-card",
"identifier": "card",
"rect": {
"x": 0,
"y": 0,
"width": 40,
"height": 30
}
},
{
"key": "title",
"parentKey": "complete-card",
"identifier": "title",
"label": "Title",
"rect": {
"x": 0,
"y": 0,
"width": 40,
"height": 30
}
},
{
"key": "badge",
"parentKey": "complete-card",
"identifier": "badge",
"label": "Badge",
"rect": {
"x": 0,
"y": 0,
"width": 40,
"height": 30
}
},
{
"key": "badge-icon",
"parentKey": "badge",
"identifier": "badge-icon",
"rect": {
"x": 0,
"y": 0,
"width": 40,
"height": 30
}
},
{
"key": "partial-card",
"identifier": "card",
"rect": {
"x": 0,
"y": 0,
"width": 40,
"height": 30
}
},
{
"key": "title-2",
"parentKey": "partial-card",
"identifier": "title",
"label": "Title",
"rect": {
"x": 0,
"y": 0,
"width": 40,
"height": 30
}
}
],
"matches": ["complete-card"],
"selected": "complete-card"
},
{
"id": "clickable-first-tristate-stable",
"operation": "compose(intersect(id=candidate), clickableFirst()) preserves true/false/absent groups",
"selector": {
"id": "candidate"
},
"nodes": [
{
"key": "false-first",
"identifier": "candidate",
"rect": {
"x": 0,
"y": 0,
"width": 40,
"height": 30
},
"clickable": false
},
{
"key": "true-first",
"identifier": "candidate",
"rect": {
"x": 0,
"y": 0,
"width": 40,
"height": 30
},
"clickable": true
},
{
"key": "absent",
"identifier": "candidate",
"rect": {
"x": 0,
"y": 0,
"width": 40,
"height": 30
}
},
{
"key": "true-second",
"identifier": "candidate",
"rect": {
"x": 0,
"y": 0,
"width": 40,
"height": 30
},
"clickable": true
},
{
"key": "false-second",
"identifier": "candidate",
"rect": {
"x": 0,
"y": 0,
"width": 40,
"height": 30
},
"clickable": false
}
],
"matches": ["false-first", "true-first", "absent", "true-second", "false-second"],
"selected": "true-first",
"clickableFirstMatches": [
"true-first",
"true-second",
"false-first",
"false-second",
"absent"
]
},
{
"id": "clickable-first-index-bypass",
"operation": "compose(intersect(id=candidate), index=0) keeps y/x ordering and bypasses clickableFirst",
"selector": {
"id": "candidate",
"index": 0
},
"nodes": [
{
"key": "clickable-later",
"identifier": "candidate",
"rect": {
"x": 0,
"y": 200,
"width": 40,
"height": 30
},
"clickable": true
},
{
"key": "nonclickable-top",
"identifier": "candidate",
"rect": {
"x": 10,
"y": 20,
"width": 40,
"height": 30
},
"clickable": false
}
],
"matches": ["clickable-later", "nonclickable-top"],
"selected": "nonclickable-top"
},
{
"id": "nested-tree-relations",
"operation": "intersect(id=card, containsChild(intersect(id=panel, containsChild(id=title), containsDescendants(id=icon))))",
"selector": {
"id": "card",
"containsChild": {
"id": "panel",
"containsChild": {
"id": "title"
},
"containsDescendants": [
{
"id": "icon"
}
]
}
},
"nodes": [
{
"key": "card",
"identifier": "card",
"rect": {
"x": 0,
"y": 0,
"width": 40,
"height": 30
}
},
{
"key": "panel",
"parentKey": "card",
"identifier": "panel",
"rect": {
"x": 0,
"y": 0,
"width": 40,
"height": 30
}
},
{
"key": "title",
"parentKey": "panel",
"identifier": "title",
"rect": {
"x": 0,
"y": 0,
"width": 40,
"height": 30
}
},
{
"key": "panel-icon-wrapper",
"parentKey": "panel",
"identifier": "panel-icon-wrapper",
"rect": {
"x": 0,
"y": 0,
"width": 40,
"height": 30
}
},
{
"key": "icon",
"parentKey": "panel-icon-wrapper",
"identifier": "icon",
"rect": {
"x": 0,
"y": 0,
"width": 40,
"height": 30
}
},
{
"key": "unrelated",
"parentKey": "card",
"identifier": "unrelated",
"rect": {
"x": 0,
"y": 0,
"width": 40,
"height": 30
}
},
{
"key": "card-missing-nested",
"identifier": "card",
"rect": {
"x": 0,
"y": 0,
"width": 40,
"height": 30
}
},
{
"key": "panel-missing",
"parentKey": "card-missing-nested",
"identifier": "panel",
"rect": {
"x": 0,
"y": 0,
"width": 40,
"height": 30
}
},
{
"key": "title",
"parentKey": "panel-missing",
"identifier": "title",
"rect": {
"x": 0,
"y": 0,
"width": 40,
"height": 30
}
}
],
"matches": ["card"],
"selected": "card"
},
{
"id": "tree-composition-index-yx",
"operation": "compose(intersect(id=card, containsChild(id=title), containsDescendants(id=icon)), index=0)",
"selector": {
"id": "card",
"index": 0,
"containsChild": {
"id": "title"
},
"containsDescendants": [
{
"id": "icon"
}
]
},
"nodes": [
{
"key": "card-low-x",
"identifier": "card",
"rect": {
"x": 0,
"y": 220,
"width": 40,
"height": 30
}
},
{
"key": "title-low-x",
"parentKey": "card-low-x",
"identifier": "title",
"rect": {
"x": 8,
"y": 228,
"width": 40,
"height": 30
}
},
{
"key": "icon-low-x",
"parentKey": "card-low-x",
"identifier": "icon",
"rect": {
"x": 8,
"y": 260,
"width": 40,
"height": 30
}
},
{
"key": "card-high-x",
"identifier": "card",
"rect": {
"x": 160,
"y": 80,
"width": 40,
"height": 30
}
},
{
"key": "title-high-x",
"parentKey": "card-high-x",
"identifier": "title",
"rect": {
"x": 168,
"y": 88,
"width": 40,
"height": 30
}
},
{
"key": "icon-high-x",
"parentKey": "card-high-x",
"identifier": "icon",
"rect": {
"x": 168,
"y": 120,
"width": 40,
"height": 30
}
}
],
"matches": ["card-low-x", "card-high-x"],
"selected": "card-high-x"
},
{
"id": "position-below-strict-top-left",
"operation": "intersect(id=candidate, below(id=anchor))",
"selector": {
"id": "candidate",
"below": {
"id": "anchor"
}
},
"nodes": [
{
"key": "candidate-above",
"identifier": "candidate",
"rect": {
"x": 0,
"y": 40,
"width": 40,
"height": 30
}
},
{
"key": "candidate-equal",
"identifier": "candidate",
"rect": {
"x": 0,
"y": 100,
"width": 40,
"height": 30
}
},
{
"key": "candidate-below",
"identifier": "candidate",
"rect": {
"x": 0,
"y": 160,
"width": 40,
"height": 30
}
},
{
"key": "anchor",
"identifier": "anchor",
"rect": {
"x": 0,
"y": 100,
"width": 40,
"height": 30
}
}
],
"matches": ["candidate-below"],
"selected": "candidate-below"
},
{
"id": "position-above-strict-top-left",
"operation": "intersect(id=candidate, above(id=anchor))",
"selector": {
"id": "candidate",
"above": {
"id": "anchor"
}
},
"nodes": [
{
"key": "candidate-above",
"identifier": "candidate",
"rect": {
"x": 0,
"y": 40,
"width": 40,
"height": 30
}
},
{
"key": "candidate-equal",
"identifier": "candidate",
"rect": {
"x": 0,
"y": 100,
"width": 40,
"height": 30
}
},
{
"key": "candidate-below",
"identifier": "candidate",
"rect": {
"x": 0,
"y": 160,
"width": 40,
"height": 30
}
},
{
"key": "anchor",
"identifier": "anchor",
"rect": {
"x": 0,
"y": 100,
"width": 40,
"height": 30
}
}
],
"matches": ["candidate-above"],
"selected": "candidate-above"
},
{
"id": "position-left-right-strict-top-left",
"operation": "leftOf/rightOf use strict candidate-vs-anchor bounds.x",
"selector": {
"id": "candidate",
"leftOf": {
"id": "anchor"
}
},
"nodes": [
{
"key": "left",
"identifier": "candidate",
"rect": {
"x": 20,
"y": 0,
"width": 40,
"height": 30
}
},
{
"key": "equal",
"identifier": "candidate",
"rect": {
"x": 100,
"y": 0,
"width": 40,
"height": 30
}
},
{
"key": "right",
"identifier": "candidate",
"rect": {
"x": 180,
"y": 0,
"width": 40,
"height": 30
}
},
{
"key": "anchor",
"identifier": "anchor",
"rect": {
"x": 100,
"y": 0,
"width": 40,
"height": 30
}
}
],
"matches": ["left"],
"selected": "left"
},
{
"id": "position-right-strict-top-left",
"operation": "intersect(id=candidate, rightOf(id=anchor))",
"selector": {
"id": "candidate",
"rightOf": {
"id": "anchor"
}
},
"nodes": [
{
"key": "left",
"identifier": "candidate",
"rect": {
"x": 20,
"y": 0,
"width": 40,
"height": 30
}
},
{
"key": "equal",
"identifier": "candidate",
"rect": {
"x": 100,
"y": 0,
"width": 40,
"height": 30
}
},
{
"key": "right",
"identifier": "candidate",
"rect": {
"x": 180,
"y": 0,
"width": 40,
"height": 30
}
},
{
"key": "anchor",
"identifier": "anchor",
"rect": {
"x": 100,
"y": 0,
"width": 40,
"height": 30
}
}
],
"matches": ["right"],
"selected": "right"
},
{
"id": "position-multiple-anchors-distance-intermediate",
"operation": "intersect(id=candidate, below(id=anchor)); relativeTo pair order is intermediate",
"selector": {
"id": "candidate",
"below": {
"id": "anchor"
}
},
"nodes": [
{
"key": "far-candidate",
"identifier": "candidate",
"rect": {
"x": 300,
"y": 240,
"width": 40,
"height": 30
}
},
{
"key": "near-candidate",
"identifier": "candidate",
"rect": {
"x": 40,
"y": 140,
"width": 40,
"height": 30
}
},
{
"key": "near-anchor",
"identifier": "anchor",
"rect": {
"x": 40,
"y": 40,
"width": 40,
"height": 30
}
},
{
"key": "far-anchor",
"identifier": "anchor",
"rect": {
"x": 300,
"y": 40,
"width": 40,
"height": 30
}
}
],
"matches": ["far-candidate", "near-candidate"],
"selected": "far-candidate",
"intermediateRelation": "below",
"intermediate": ["near-candidate", "far-candidate", "near-candidate", "far-candidate"]
},
{
"id": "position-unusable-bounds",
"operation": "intersect(id=candidate, below(id=anchor)) excludes missing bounds",
"selector": {
"id": "candidate",
"below": {
"id": "anchor"
}
},
"nodes": [
{
"key": "candidate-missing",
"identifier": "candidate"
},
{
"key": "candidate-valid",
"identifier": "candidate",
"rect": {
"x": 0,
"y": 200,
"width": 40,
"height": 30
}
},
{
"key": "anchor-missing",
"identifier": "anchor"
},
{
"key": "anchor-valid",
"identifier": "anchor",
"rect": {
"x": 0,
"y": 100,
"width": 40,
"height": 30
}
}
],
"matches": ["candidate-valid"],
"selected": "candidate-valid"
},
{
"id": "position-odd-center-integer-distance",
"operation": "relativeTo uses Bounds.center integer division and Point.distance Float",
"selector": {
"id": "candidate",
"below": {
"id": "anchor"
}
},
"nodes": [
{
"key": "candidate-odd",
"identifier": "candidate",
"rect": {
"x": 1,
"y": 1,
"width": 1,
"height": 1
}
},
{
"key": "candidate-even",
"identifier": "candidate",
"rect": {
"x": 0,
"y": 2,
"width": 0,
"height": 0
}
},
{
"key": "anchor",
"identifier": "anchor",
"rect": {
"x": 0,
"y": 0,
"width": 0,
"height": 0
}
}
],
"matches": ["candidate-odd", "candidate-even"],
"selected": "candidate-odd",
"intermediateRelation": "below",
"intermediate": ["candidate-odd", "candidate-even"]
},
{
"id": "position-zero-size-finite-bounds",
"operation": "intersect(id=candidate, below(id=anchor)) keeps zero-sized finite bounds",
"selector": {
"id": "candidate",
"below": {
"id": "anchor"
}
},
"nodes": [
{
"key": "candidate-positive",
"identifier": "candidate",
"rect": {
"x": 20,
"y": 180,
"width": 40,
"height": 30
}
},
{
"key": "candidate-zero",
"identifier": "candidate",
"rect": {
"x": 10,
"y": 200,
"width": 0,
"height": 0
}
},
{
"key": "anchor-zero",
"identifier": "anchor",
"rect": {
"x": 10,
"y": 100,
"width": 0,
"height": 0
}
}
],
"matches": ["candidate-positive", "candidate-zero"],
"selected": "candidate-positive"
},
{
"id": "position-composed-intersection-index",
"operation": "compose(intersect(id=candidate, below(id=lower), above(id=upper)), index=0)",
"selector": {
"id": "candidate",
"index": 0,
"below": {
"id": "upper"
},
"above": {
"id": "lower"
}
},
"nodes": [
{
"key": "candidate-low",
"identifier": "candidate",
"rect": {
"x": 0,
"y": 200,
"width": 40,
"height": 30
}
},
{
"key": "candidate-high",
"identifier": "candidate",
"rect": {
"x": 100,
"y": 120,
"width": 40,
"height": 30
}
},
{
"key": "lower",
"identifier": "lower",
"rect": {
"x": 0,
"y": 300,
"width": 40,
"height": 30
}
},
{
"key": "upper",
"identifier": "upper",
"rect": {
"x": 0,
"y": 80,
"width": 40,
"height": 30
}
}
],
"matches": ["candidate-low", "candidate-high"],
"selected": "candidate-high"
},
{
"id": "nested-tree-position-relation",
"operation": "intersect(id=card, containsChild(below(id=caption)))",
"selector": {
"id": "card",
"containsChild": {
"id": "field",
"below": {
"id": "caption"
}
}
},
"nodes": [
{
"key": "card",
"identifier": "card",
"rect": {
"x": 0,
"y": 0,
"width": 40,
"height": 30
}
},
{
"key": "caption",
"parentKey": "card",
"identifier": "caption",
"rect": {
"x": 20,
"y": 40,
"width": 40,
"height": 30
}
},
{
"key": "field",
"parentKey": "card",
"identifier": "field",
"rect": {
"x": 20,
"y": 120,
"width": 40,
"height": 30
}
},
{
"key": "bad-card",
"identifier": "card",
"rect": {
"x": 0,
"y": 0,
"width": 40,
"height": 30
}
},
{
"key": "bad-field",
"parentKey": "bad-card",
"identifier": "field",
"rect": {
"x": 20,
"y": 20,
"width": 40,
"height": 30
}
},
{
"key": "bad-caption",
"parentKey": "bad-card",
"identifier": "caption",
"rect": {
"x": 20,
"y": 80,
"width": 40,
"height": 30
}
}
],
"matches": ["card"],
"selected": "card"
}
],
"contentHash": "7061897332fd8ae7c6af126af620dfaf875ebfaa3c3f13df87dee638c4c41bb7"
}