Live demo — data resets daily at 03:00 UTC. Nothing you enter is saved. Server UI →

product: maestro audience: test-developer authority: normative

Step Type Cookbook

delay — timed pause

- name: "Stabilisation pause"
  type: delay
  duration: 1.5

mock — simulated step (no hardware)

type: mock IS for development only. MUST NOT be used in production tests.

- name: "Simulated voltage"
  type: mock
  outputs:
    vout: "5.02"
  measurement:
    name: "VOUT"
    target: 5.02
    low_limit: 4.75
    high_limit: 5.25
    unit: "V"

dotnet — .NET runner

- name: "Measure voltage"
  runner: dotnet
  runner_type: net10.0
  assembly: "MyTests.dll"
  class: "MyTests.PowerTests"
  method: "MeasureVoltage"
  parameters:
    channel: "CH1"
    range: "10"
  outputs:
    board_voltage: "{{voltage}}"
  measurement:
    name: "VBOARD"
    value: "{{voltage}}"
    low_limit: 4.75
    high_limit: 5.25
    unit: "V"

For the .NET method signature requirements see sdk/dotnet-sdk.md.

python — Python runner

- name: "Read temperature"
  runner: python
  runner_type: python3.11
  module: "sensors"
  function: "read_temperature"
  parameters:
    sensor_id: "1"
  outputs:
    board_temp: "{{temperature}}"
  measurement:
    name: "BOARD_TEMP"
    value: "{{temperature}}"
    low_limit: 15.0
    high_limit: 45.0
    unit: "degC"

For the Python function signature requirements see sdk/python-sdk.md.

prompt — operator interaction

- name: "Visual Inspection"
  type: prompt
  prompt:
    title: "Solder Joint Check"
    message: |
      Inspect connector J5:
      - All joints clean and shiny
      - No solder bridges
    image: "images/j5-reference.png"
    buttons:
      - name: "PASS"
        action: pass
      - name: "FAIL"
        action: fail
  post_execution_action: terminate-on-fail

Every prompt automatically receives a Cancel button (action: abort) unless the YAML already defines at least one button with action: abort.

Pressing Enter submits using default_button (or the first non-Cancel button when not set).

For prompts that require operator value entry, add an input: block — see ui/prompt-input.md.

sequence — nested YAML

- name: "Init DMM (cross-package)"
  type: sequence
  sequence: "sample-dmm-driver/tests/init.yaml"
  parameters:
    dmm_address: "TCPIP::192.168.1.50::INSTR"
  outputs:
    instrument_serial: "{{dmm_serial}}"

The sequence: field IS a package-relative path. Cross-package sequences reference another installed package by its folder name.

An unhandled error has occurred. Reload 🗙

Rejoining the server...

Rejoin failed... trying again in seconds.

Failed to rejoin.
Please retry or reload the page.

The session has been paused by the server.

Failed to resume the session.
Please retry or reload the page.