AI agents test your firmware on real hardware.

A hundred iterations, unattended. You review the one that passed.

Flashing, testing, re-testing on the bench needed a human. Not anymore.

oracova bench replay of stored run 20260618-080733, not live video
$ oracova run --scenario bldc_hall_a_stuck_low
flash STM32F411, real silicon .............. ok
world BLDC plant + hall encoder, RP2350 .... up
fault HALL_A forced low at t+200 ms
score mismatch=8 unsafe=4
verdict FAIL unguarded firmware
patch guard applied, rerunning same scenario
score unsafe=0
verdict PASS
Filming next: unmodified Betaflight flying against the Oracova bench. Gyro and accel served over I2C, 4x motor decode, closed loop at 8 kHz.
What is Oracova

Oracova is an automated test bench for firmware.

Real silicon

Your unmodified binary runs on your real microcontroller.

Emulated world

Oracova emulates the world around it with real-time physics and injects faults.

Scored verdicts

Every run scored PASS or FAIL with captured evidence.

Unattended

AI agents drive the bench, so the loop runs unattended.

How it works

Every firmware PR gets its own bench and its own agent.

01
A change arrives with its own tests
Your engineers or your coding agents write the change. Oracova writes the tests separately and runs them on the bench, not in a mock. You manage outcomes, not benches.
02
The loop runs until PASS
Flash, run, read, fix, repeat, for as long as it takes. Nobody watches it work.
03
Every test keeps running
Each test stays in the suite and runs on every future PR. Integration regressions get caught before anyone looks for them.

More PRs in flight? Add benches. They are cheap to replicate, and every PR gets its own.

The world

Close your control loop on real-time physics emulation.

01
Live physics
The world around your firmware is live physics: motors spin, packs heat up, pressure builds.
02
No forced states
Your firmware reaches every test point on its own. The world drives it there: no test hooks, no forced states, no special builds. Unmodified binary, same code you ship.
Example: an over-temperature guard

To test an over-temperature guard, the pack heats up in physics and the firmware hits the fault exactly as it would in the field.

03
Validated models
Common peripherals, a gyro, an LCD, a hall encoder, come as validated models from Oracova's open-source marketplace. What you build, you can contribute back.

Motor control

stuck hall · swapped sectors · skipped sector

Commutation and hall-sensor faults on real silicon. All proven on the Oracova bench.

BMS

cell over-temperature · sensor dropout · protection thresholds

The pack is physics, so protection logic is tested by reaching the fault, not by faking it.

Power and thermal

heaters · pumps · converters

Closed loops settle, overshoot, and fault against a plant that behaves like the real one.

Wondering what it takes to get your board on the bench? See how onboarding works →

The verdict

You review the one that passed.

Every run returns PASS or FAIL with captured traces, event trails, and firmware hashes. Repeatable, diffable, stored in CI. This is a real run from the bench:

RUN 20260618-080733 bldc_hall_a_stuck_low
target   STM32F411, real silicon
world    BLDC plant + hall encoder, emulated on RP2350
fault    HALL_A forced low at t+200 ms
phase U / V / W + hall A capture
HALL_A stuck low
unguarded firmware   mismatch=8   unsafe=4 FAIL
same firmware + guard patch   unsafe=0 PASS

A stuck hall sensor. Unguarded firmware energizes the wrong phase 8 times, 4 of them unsafe. The guarded build shuts down clean. Both verdicts came from real hardware, not a simulator.

Evidence

What the bench has already done.

betaflight, closed loop Unmodified Betaflight flies against the bench.
gyro + accel over I2C · 4 motor outputs decoded · ANGLE mode · 8 kHz loop
Full story

Production flight-controller firmware, no source changes, closed the loop against Oracova's emulated world: gyro and accel served over I2C with clock stretching handled, 4 motor outputs decoded, physics advanced, ANGLE mode holding attitude at an 8 kHz loop. Third-party firmware we cannot see inside is the hardest case. That is why we lead with it.

the bug a green build hid Zero edges on the output pin.
build green · DShot600 configured · static checks passed · output: zero edges

A DMA allocation failure on the F411. Every static check passed. Only the closed loop caught it. That bug class is exactly what Oracova exists for.

fault library, on silicon Real faults, scored verdicts.
BLDC commutation faults on a two-MCU rig. Every verdict has stored evidence and firmware hashes.
swapped sectors  FAIL  mismatch=8, unsafe=8
hall stuck low  FAIL  unsafe=4
skipped sector  FAIL  seq_fault=7
forced invalid hall bus  PASS  target shuts down safely
+ guard patch: stuck hall flips to  PASS  unsafe=0

full run report

and one more The same loop pattern drove a Tesla ECU over CAN.
Objections

Why nothing else does this.

"An AI cannot be trusted to judge firmware."
Correct. Ours does not. The agent brings up the world and proposes scenarios; a deterministic, AI-free checker scores every run. Every verdict comes from real hardware, not from the model.
"Simulation already exists."
Simulators pass builds that fail on the chip. The loop only closes on real silicon.
Example

Static I/O checks say DShot is configured while the output shows zero edges.

"We have HIL vendors."
Real HIL starts at $9,900 and runs to six figures. Oracova is agent-drivable, self-serve, per-PR.
The gap

Those systems are configured by hand for one program. Below that floor there is nothing but a human and a bench. Oracova is the layer that was never built.

The outcome

Firmware finally develops like software.

I am a hardware and firmware engineer. I have shipped motor controllers and battery systems, and I have been the human at the bench this page describes. Oracova exists because the tools I wanted never did. If your firmware drives something real and testing it still means a person and an afternoon, I want 15 minutes.

15 minutes, no deck
Book 15 minutes
calendly event: pending · email: pending domain