The plan is data, not code
A test becomes a plan: schedules and rules, checked before it runs. benchd loads every module completely, with no clock involved, then sends one start(t0). The bench records; the client judges, so old runs can be judged again.
Wired-OR trigger bus
Cross-module reactions in hardware. The compiler picks the line; the host assigns ownership and checks for stuck lines at arm time.
spec.yaml→ daemon→ client→ MCP tools→ waveforms
One spec, everything derived
A module class is one YAML file. Commands, client attributes, MCP tools and viewer waveforms all come from it. Guard tests keep the engine free of class names.
Agents get grants, not root
Signals bound at request time, risk classes (observe, stimulate, fault, power), action budgets and expiry, tied to the lease of the person who approved them.
MCU≡sim
Virtual bench from day one
The real firmware library runs as simulated modules on a shared timebase with a simulated trigger backplane. CI and demos work before the hardware does.
Open module spec
Pinout, protocol, EEPROM format and reference firmware are open. Third-party cards load at runtime from their own spec.
REQ-12test_brownoutrun 4f2aPASS
Traceable by default
Every run stores its plan, its events as Parquet and a manifest with a comparable key. Requirements map to tests and runs on the coverage page and in JUnit, and any run exports to VCD for GTKWave or Surfer.