The debug probe your agent drives

probe0 emulates a whole embedded system in software and hands it to your agent over MCP. Snapshot a running board, fork it a thousand ways, and read back why each branch died.

Boards and buses we target

ESP32STM32nRF52RP2040Cortex-MRISC-VI²CSPIUARTCANZephyrESP-IDF
The problem

Firmware iterates in weeks. Web iterates in seconds.

Coding agents are good at web because the feedback loop is free and instant. They fall apart on firmware because the loop needs a human wiring a board to a debugger. It isn't a knowledge gap. They just can't see the hardware.

  1. Week 0

    Design the PCB

    Route it, send it to fab, wait.

  2. Week 4

    It hardfaults

    Board lands. Flash it. It dies in driver init.

  3. Week 4+

    It won't reproduce

    One sensor value, one microsecond, gone.

  4. Week 8

    Spin a revision

    Guess, respin, wait again. Repeat.

2–6 wks

Every hardware iteration, before a single line of firmware gets validated.

#1

Hardware dependency ranks as the biggest blocker to continuous delivery in embedded.

arXiv, Embedded DevOps: A Survey

0

Boards an agent can touch today without a human holding the debugger.

How it works

Five primitives human simulators don’t have

Existing simulators are session-shaped. The core object is a running sim that a person watches, with a machine interface bolted on afterwards. In probe0 the core object is an immutable state snapshot plus a transition. That difference is architectural, and it's why forking costs us almost nothing and costs them a rewrite.

Fork

Forkable machine state. Git for silicon.

Snapshot the whole system at cycle N: registers, RAM, flash, peripheral state, in-flight bus transactions. Then fork it N ways. Each branch runs independently from an identical start, so debugging stops being linear guess-and-check and becomes parallel tree search.

Fleet

Boards on demand

Sub-second cold start, no persistent VM, no license server. An agent asks for a thousand boards for twenty seconds, then they're gone.

Trace

Structured causal traces

A typed object carrying a cause chain and a minimal reproduction the agent can replay directly.

Models

Datasheet to peripheral model

No library covers every part, so the library generates itself. Every model a user builds improves it for everyone.

Determinism

Determinism as a verifier

Same input, same cycle count, same result. Reproducible CI, replayable failures, and a check you can point at in review.

What comes back

Agents can’t read a serial log. Give them the cause.

A failure comes back as a typed object: what broke, the chain of events that produced it, a minimal reproduction, and the registers worth reading next. Scroll to walk the chain.

  1. An assertion fails

    A typed failure carrying the expression that blew up and the line it blew up on.

    imu_ready @ drivers/imu.c:212

  2. The bus said no

    At t=1.204 an I²C read to 0x68 came back NACK. First observable symptom.

  3. The peripheral was asleep

    The BMI270 model was in SUSPEND, so it was never going to answer.

  4. A register was never written

    Register 0x7D, the wake command, was never issued to the device.

  5. The init path skipped a call

    bmi270_wake() gets branched around whenever BOOT_FAST=1. That is the root cause.

  6. And how to reproduce it

    The trace carries the fork handle and the mutation, so replay is a single call.

    fork cycle_88231 · set BOOT_FAST=1

get_trace(run_id)
{
  "failure": { "type": "assert",
               "expr": "imu_ready",
               "loc": "drivers/imu.c:212" },
  "cause_chain": [
    { "t": 1.204, "event": "i2c1_read",
      "result": "NACK", "addr": "0x68" },
    { "reason": "BMI270 model in SUSPEND state" },
    { "reason": "register 0x7D never written" },
    { "reason": "init skipped bmi270_wake()
                  when BOOT_FAST=1" }
  ],
  "minimal_repro": { "fork": "cycle_88231",
                    "set": { "BOOT_FAST": 1 } },
  "suggested_inspect": ["0x7D", "PWR_CTRL"]
}
Interface

No GUI. Ever.

An MCP server and one static CLI binary. Wire it into Claude Code, Cursor, Codex, or your own harness. Every session carries a sim-second budget and a fork ceiling, because an agent should never be able to burn unbounded compute.

snapshot(label?)

Capture full machine state, return a handle

fork(handle, n, mutations[])

Branch N futures from one snapshot

replay(run_id)

Deterministic re-run of a prior execution

get_trace(run_id)

Structured causal failure object

boot(firmware, platform)

Load a binary and start the emulation

run(cycles?, until?)

Advance execution

step(n)

Single-step instructions

read_reg(name)

Read a CPU or peripheral register

write_mem(addr, bytes)

Write guest memory

inject_i2c(bus, addr, data)

Push bus traffic into the system

inject_sensor(model, value)

Set a peripheral model's reported value

list_peripherals()

Enumerate the emulated system

fuzz(param, range, n)

Sweep a parameter across N forks

generate_model(datasheet_pdf)

Datasheet to behavioral peripheral model

Try it

One snapshot. Every mutation at once.

Serial debugging walks one path and backtracks. Fork search walks all of them at once and reports only the branches that diverged.

Click the grid to fork every live branch.

Every node is an independent machine state descended from the same cycle. A faulted branch stops there. A real agent pulls its trace and forks again from the last good state.

Live branch, still executing
Hardfaulted, trace captured

4 machine states at depth 1.

Fidelity

Where the emulation gives out

Every emulator has a fidelity gap. Most vendors leave you to find theirs on a bench at 2am. We run identical firmware on emulated and real silicon, diff the register traces, and publish the divergence, so you know which bug classes probe0 is accountable for before you trust it with one of yours.

Catches
  • Driver bringup and init-sequence bugs
  • Peripheral state machines stuck in the wrong mode
  • Bus protocol errors: I²C NACKs, SPI framing, CAN arbitration
  • Interrupt ordering and reentrancy faults
  • Regressions, bisected automatically across machine state
Does not catch
  • Analog behavior and signal integrity
  • EMI and power-rail brownouts
  • Sub-microsecond races on real silicon
  • Thermal behavior
  • Certification sign-off. DO-178C and ISO 26262 need HIL.

Bring the bug that won’t reproduce

Early access is small and hands-on. We want the failure you have already burned two board spins on.

  1. 01A board we support
  2. 02A failure you can describe
  3. 03Thirty minutes to wire it up

Join the waitlist