revyl test create --from-file my-test.yaml).
Every block uses an explicit type: field plus a step_description: payload. The shape is uniform across all step types, which keeps the schema parser-friendly and round-trippable through the editor and CLI.
Schema
open_app step.
Example
Block Types
type: value | Purpose | Additional fields |
|---|---|---|
instructions | A single user action (tap, type, swipe) | — |
validation | Assert something is visible or true | — |
extraction | Read a value from the screen into a variable | variable_name |
manual | Framework-level action (wait, navigate, set_location, …) | step_type + step-specific |
if | Conditional branch | condition, then, optional else |
while | Loop while condition holds | condition, body |
code_execution | Run a registered script | script_name (or inline code_execution_runtime) |
module_import | Insert a reusable module’s blocks | module_id |
step_description: field — required for all types.
Manual Steps
Themanual block runs framework-level actions. The step_type field picks which one:
Control Flow
Modules
Reusable groups of blocks live in modules. Import one by UUID:revyl module list (CLI) to find module IDs, or revyl module insert <name> to print a ready-to-paste snippet.
Variables
Variables use Mustache-style{{name}} syntax. They can be defined up front, extracted at runtime, or pulled from org-level globals via {{global.name}}.
Validation
The CLI validates YAML before it ever runs:revyl test create --from-file and revyl test push. It checks: required fields, valid block types, valid manual step_type values, platform values, and variable definitions before use.
Authoring tests for AI agents? The full LLM-facing schema (with best
practices and step-generation guidance) lives in the CLI repo at
internal/schema/yaml_test_schema.go.