CruciHiL is the Python-first Hardware-in-the-Loop testing platform for AV, robotics, and automotive firmware teams. Write a test once — it runs against simulation today and real hardware tomorrow, and mutation verification proves it actually fails when your firmware breaks.
Legacy HiL toolchains tell you your tests passed. CruciHiL tells you whether they would fail when it matters — and gets you there without rewriting anything.
crucihil verify breaks the simulated DUT on purpose — dead device, stuck outputs, latency violations, injected faults — and scores every test: did it catch the breakage, or stay green? No other HiL tool does this.
The exact same test file runs against a virtual simulation or real hardware. Switch from virtual.toml to orin.toml — the test never mentions hardware.
A pytest plugin and a Robot Framework library run your current test base through CruciHiL unchanged — rig fixture injected, results synced, and mutation verification works on those suites too.
crucihil run --framework pytest --suite legacy/crucihil author reads your component source, extracts its signal contract, generates a suite, gates it on a baseline run, then mutation-verifies and regenerates weak tests. Broken output never reaches disk.
Plain async Python with full IDE support — no proprietary scripting languages. Runs headless, emits JUnit XML, and drops into GitHub Actions, GitLab CI, or Jenkins with one command.
async def test_engine_startup(rig: Rig)18 MCP tools connect Claude, GPT, or any MCP client directly to runs, results, signal traces, and rig state. Bring your own key — ask what broke and get the root cause with evidence.
describe_failure(run_id) → root causeOne pipeline from first test to gated releases. No MATLAB, no proprietary scripting, no $50K licenses.
Write plain async Python against the injected Rig — or point crucihil author at your component source and get a generated suite.
The virtual rig runs in-process — no hardware, no CAN adapters. Full DBC-driven bus simulation catches logic bugs before day one.
Mutation verification breaks the DUT on purpose and proves every test fails when the behavior it claims to check is broken.
Swap the TOML. The test file is unchanged — the CAN backend switches from virtual to SocketCAN or PEAK. Same assertions, real signals.
Headless runs emit JUnit XML for any CI system; the agent streams results to the dashboard, where the run history and strength matrix live.
Most test suites have never been tested. CruciHiL scores yours against deliberately broken firmware behavior — this is real crucihil verify output, not marketing art.
The simulated DUT is broken on purpose — dead DUT (output messages stop), stuck outputs (a signal freezes), latency violations (responses arrive too late), and every declared fault from your suite metadata. Each test is then scored:
Weak tests don't stop at a report: crucihil author --verify feeds the mutation evidence back into generation and regenerates them. And it works on existing pytest and Robot suites with zero rewrites — point --framework pytest at your legacy tree and get its strength report.
Three adoption tiers, lowest friction first. No forced migration — your pytest and Robot Framework suites run through CruciHiL unchanged.
Point at the JUnit XML or Robot output.xml your current runner already produces. History, trends, and AI querying work before any rig integration — re-imports never duplicate.
The pytest plugin injects the rig fixture into your existing tests; the Robot library adds rig keywords. Same files, now with simulation, hardware parity, and cloud results.
Mutation verification is framework-agnostic: get a strength report for your legacy suite with zero rewrites, and find out which of those green tests would actually catch a regression.
Live WebSocket streaming from the agent to your browser. Every run, every signal, every failure — in real time.
CAN dropout, assertion after recovery — 17 lines of Python, works on virtual and real hardware.
Develop and verify against simulation, then swap the TOML to real adapters. Custom protocols are declared as data — a wire-format YAML the built-in codec interprets, never generated code.
[rig.uds] diagnostics[rig.udp] datagram transportbackend = "myorg.rig_io_board" — any class implementing the transport ABC loads via TOMLTest code only ever touches Layer 2. Hardware details live in TOML config, never in test code.
The open source core is free forever on your own infrastructure — with no rig limits. The hosted cloud starts free and grows per rig.
Run the entire stack on your own infrastructure. It's your hardware — we don't meter it.
The managed cloud control plane — no infrastructure to run. One rig on us.
Cloud-managed, priced per rig. We run the infra so your team focuses on tests.
For teams with procurement, security review, or on-premise requirements.
Self-hosted deployments never enforce rig quotas — the open source core has no limits on your own server.