BenchPilot gives humans, CI jobs and AI coding agents one stateful interface to real embedded targets: power them, flash them, observe them, diagnose them and validate behavior.
The product loop is intentionally narrow —
Not a CANoe clone: CAN/CAN FD, DBC, ISO-TP, UDS and DoIP are added when they complete this loop — not for their own sake.
A coding agent can edit and build firmware, but a real ECU is surrounded by fragmented tools with device-centric primitives and independent state. BenchPilot adds the ECU-centric layer:
The caller asks for the radar target and a semantic operation — flash, wait_boot, wait_signal, assert_current, capture_failure_window — instead of forcing a language model to consume unbounded raw serial/CAN streams.
benchpilotd is the resident process. CLI, MCP and GUI clients must not open hardware independently.
The foundation transport is HTTP JSON bound to loopback only; benchpilotd refuses non-loopback binding until an authenticated remote-bench transport exists.
Semantic, bounded operations designed so a language model verifies behavior instead of parsing raw streams.