Skip to main content

Synopsis

Description

crucihil verify answers the question “would this suite actually catch a regression?” It runs the suite once as a baseline, then once per mutation — the simulated DUT is broken on purpose — and scores every test against every mutation it should catch. A test that stays green while the behavior it claims to verify is broken is vacuous, and this command finds it. Works on native CruciHiL suites and — via --framework — on existing pytest and Robot Framework suites, unchanged.

Outcomes

Each (test, mutation) pair gets one of three outcomes:
blockedfail is itself a verification criterion. A test that goes blocked under a mutation is not catching the regression — it is misreporting a firmware defect as a rig-health issue. That is scored wrong_reason, not caught.
Only baseline-passing tests are verifiable. Tests that fail, error, or block in the baseline run are listed under ⚠ Not verifiable (failed baseline) and excluded from scoring.

Mutation kinds

The mutation plan is derived from the suite and (optionally) the contract, priority-ordered, and capped by --max-runs. Every planned run is one full-suite execution under one mutation. DUT outputs come from the contract when --contract is given; otherwise they are inferred from the messages the suite simulates (sim.start steps) plus every asserted signal’s message.

Options

path
required
Path to the YAML suite manifest — or a pytest/Robot test tree when --framework is given. Short form: -s.
path
required
Path to the rig TOML config. Short form: -r.
string
Verify an existing pytest or Robot Framework suite unchanged (pytest | robot) — strength report with zero rewrites. If --suite points at a wrapper manifest with a non-crucihil framework: field, this is auto-detected.
path
Contract artifact (contracts/<component>.json, produced by crucihil author or crucihil analyze) — sharpens the mutation plan with the component’s real outputs.
integer
default:"20"
Cap on mutation runs, priority-ordered (dead-DUT first — cheapest, strongest signal).
path
Write the full strength report JSON to this path.
boolean
default:"false"
Push the strength report to the cloud as a verification run — the dashboard’s run detail shows the tests × mutations matrix. Requires CRUCIHIL_BASE_URL and CRUCIHIL_API_KEY environment variables.

Exit codes

Example output

When every planned mutation is caught:

Verifying existing pytest / Robot suites

Existing test bases get a strength report with zero rewrites — point --suite at the test tree and name the framework:
Foreign suites are scored by exactly the same rules as native ones — the planner feeds the same (signal, timeout) pairs and per-test relevance map into the same mutation tiers. A wrapper manifest generated by crucihil author --framework needs no flag at all — the framework: field in the YAML is detected automatically:
Passing a directory as --suite without --framework is an error (exit 2) — CruciHiL cannot tell which executor to use for a bare test tree.

Syncing to the dashboard

--sync pushes the strength report to the cloud as a verification run:
The dashboard’s run detail page renders the tests × mutations matrix for the synced run.

Examples

Native suite

Sharpen the plan with a contract; save and sync the report

Existing pytest suite, capped at 10 mutation runs

See also