Full example
[rig] — root section
Rig identifier. Used in the cloud dashboard, agent hello message, and as the TOML filename convention. Letters, numbers, hyphens (e.g.
bench_01, orin-bench-prod).Hardware platform name. Informational only — used in dashboard display. Examples:
orin_nx, s32g, rcar_s4, virtual, custom.TOML schema version. Always
"1.0" for current releases.Top-level backend hint.
"virtual" enables virtual backends for all interfaces. "hardware" requires each interface to specify its own backend.[rig.can.<name>] — CAN interfaces
Each [rig.can.<name>] section defines one CAN interface. The <name> key (e.g. powertrain, chassis) is used in rig.can routing — it is never referenced from test code.
OS interface name (e.g.
can0, can1, PCAN_USBBUS1).Nominal bitrate in bits/second. Common values:
125000, 250000, 500000, 1000000.Enable CAN-FD mode. Set to
true for CAN-FD buses. Requires an FD-capable adapter and backend.Multiple CAN interfaces
You can define as many CAN interfaces as your rig has:[rig.ethernet.<name>] — Ethernet interfaces
Used for DoIP and SOME/IP communication.
OS interface name (e.g.
eth0, eth1).Local IP address to bind to. For DoIP targets on a dedicated link:
169.254.0.1 (link-local).[rig.power.<name>] — Power rails
Initial power state when the rig connects.
"on" or "off".GPIO pin number for
gpio_relay backend.Serial port for
bench_psu backend (e.g. /dev/ttyUSB0).Instrument model for
bench_psu backend (e.g. keysight_e3631a).[rig.gpio] — GPIO pins
GPIO pins are declared as inline tables under [rig.gpio]:
GPIO pin number (BCM numbering on Raspberry Pi; board-specific elsewhere).
"in" or "out".Initial state for output pins. Ignored for input pins.
GPIO backend. Options:
virtual_gpio, rpi_gpio. See Backends.[rig.ecus.<name>] — ECU definitions
Each ECU has a logical address and a transport. The framework uses this to route UDS commands and manage power lifecycle.
Human-readable ECU name (e.g.
Engine_ECU, Orin_NX). Shown in dashboard and reports.UDS logical address (hex notation allowed:
0x0001).Transport for UDS.
"doip" or "can_isotp".Key of the
[rig.ethernet.<name>] interface to use for DoIP. Required when transport = "doip".Key of the
[rig.can.<name>] interface to use for ISO-TP. Required when transport = "can_isotp".Key of a
[rig.power.<name>] rail. If set, rig.ecu.power_on() and rig.ecu.power_off() control this rail.Seconds to wait for the ECU to become responsive after power-on. Platform-specific values belong here — never in test code (Rule R6). Example: virtual ECU
0.1, Nvidia Orin 8.0.[rig.definitions] — DBC files
Path to the CAN DBC file. Relative to the directory containing the TOML file.
Path to the Ethernet (SOME/IP) DBC/descriptor file.
The key names
can_dbc and eth_dbc are also used by crucihil analyze to infer the interface type of each signal corpus. Use these exact key names.[rig.cloud] — Cloud connection (optional)
HTTP(S) base URL of the CruciHiL control plane.
One-time token used for agent self-registration on first boot. The agent exchanges this for a permanent API key and stores it in
~/.crucihil/credentials.toml. Once registered, this field is no longer needed.Virtual rig (no hardware)
The virtual rig uses in-process simulated backends for all interfaces. Use it for CI and local development.Configuration validation
CruciHiL validates the TOML with Pydantic at rig initialization — before any test runs. Schema errors produce aConfigurationError that marks the run as BLOCKED (not FAIL). This means a config typo never appears as a firmware regression.
You can validate a TOML without running any tests:
See also
- Rig Backends — backend options for each interface type
crucihil init— interactive wizard to create a rig TOMLcrucihil discover— AI-assisted TOML generation