Skip to main content

Top-level schema

PathTypeRequiredNotes
$objectYesScenario root
$.metaobjectYesScenario metadata
$.configobjectYesRuntime defaults
$.stepsarrayYesMust be a non-empty list
$.assertionsarrayNoDefaults to empty list when omitted or null
$.outputobjectNoOutput preferences
Allowed top-level fields are exactly:
  • meta
  • config
  • steps
  • assertions
  • output
Any other top-level field is an error.

meta

Allowed fields:
PathTypeRequiredNotes
$.meta.namestringYesScenario name
$.meta.versionstringYesScenario version
$.meta.platformstringYesMust be ios or android
$.meta.tagsarrayNoFree-form tags

config

Allowed fields:
PathTypeRequiredNotes
$.config.timeoutMsnumberNoPer-step timeout threshold
$.config.seednumberNoMissing seed triggers a warning
$.config.artifactsDirstringNoDefault report output directory

steps[]

Each step must be an object with these fields:
PathTypeRequiredNotes
$.steps[i].idstringYesStep identifier
$.steps[i].commandstringYesOne of the supported commands
$.steps[i].argsobjectYesCommand-specific arguments
Supported commands:
  • tap
  • navigate
  • act
  • scroll
  • screenshot
  • wait
  • source

Step argument rules

tap

Valid forms:
{ "target": "Increment" }
{ "x": 0.5, "y": 0.8, "normalized": true }
Rules:
  • cannot mix target with x or y
  • if using coordinates, both x and y are required
  • if present, normalized must be boolean
Required field inside args:
  • to

act

Validation only checks that args is present. Runtime support is narrower than schema support. The runtime currently accepts:
  • name=type with target and value
  • name=back

scroll

Required field inside args:
  • direction with value up or down
Optional field inside args:
  • percent
Rules:
  • direction is required
  • direction must be up or down
  • if present, percent must be a number between 1 and 100

screenshot

No hard schema requirement beyond args, but missing label triggers a warning because it reduces determinism.

wait

Required field inside args:
  • ms

source

No additional schema requirement beyond args.

assertions[]

Each assertion must be an object with these fields:
PathTypeRequiredNotes
$.assertions[i].idstringYesAssertion identifier
$.assertions[i].typestringYesRuntime only supports visible
$.assertions[i].targetstringYesSelector string
Important detail: unsupported assertion types pass schema validation but fail during execution.

output

Allowed fields:
PathTypeRequiredNotes
$.output.reportanyNoAccepted as a field name, but not interpreted by the current report writer

Full example

{
  "meta": {
    "name": "empty-app-counter",
    "version": "1",
    "platform": "android",
    "tags": ["smoke", "counter"]
  },
  "config": {
    "timeoutMs": 15000,
    "seed": 42,
    "artifactsDir": "./artifacts"
  },
  "steps": [
    { "id": "s1", "command": "screenshot", "args": { "label": "counter-initial" } },
    { "id": "s2", "command": "wait", "args": { "ms": 2000 } },
    { "id": "s3", "command": "source", "args": { "label": "counter-initial-ui" } },
    { "id": "s4", "command": "tap", "args": { "target": "Increment" } },
    { "id": "s5", "command": "wait", "args": { "ms": 500 } },
    { "id": "s6", "command": "source", "args": { "label": "counter-after-increment-ui" } },
    { "id": "s7", "command": "screenshot", "args": { "label": "counter-after-increment" } }
  ],
  "assertions": [],
  "output": {
    "report": ["summary", "json", "junit", "html"]
  }
}