PRE-FLIGHT LINTER FOR HIL TEST BENCHES

Lint the bench
before you power it.

StandGuard reads your hardware-in-the-loop bench configuration and flags the wiring, voltage, interlock, and sampling mistakes that destroy devices under test and silently invalidate campaigns — before current flows.

20 checks 8 failure categories JSON in → verdict out runs fully offline
Early access for verification teams · activates fully offline
// first 100 licenses: $99/yr, locked for life — waitlist order
standguard — bench_rigA.json
01 / THE FAILURE MODE

The most expensive bench bugs are typed, not soldered.

Industry literature on hardware-in-the-loop testing is blunt: preparing a test configuration often takes longer than executing it. One transposed pin or an amplitude over the rail turns that preparation into scrap hardware and data nobody can sign off on. These are the six mistakes StandGuard catches before they reach the bench.

FM-01pin.conflict Two signals allocated to the same physical pin — a stimulus shorted into a measurement line. destroys hardware
FM-02stimulus.overdrive A sequence step driving 14 V into a channel rated for 12 V. One keystroke over the rail. destroys hardware
FM-03interlock.missing A 24 V+ power or drive channel with no e-stop loop defined. Nothing cuts it when a run goes wrong. destroys hardware
FM-04timing.nyquist Sampling a 400 Hz signal at 700 Hz. The data looks fine. It is aliased. Weeks of campaign — void. invalidates data
FM-05sequence.reference A test step pointing at a channel that was renamed last revision. The bench halts mid-campaign — or worse, doesn't. blocks campaign
FM-06timing.budget Steps that sum past the campaign window, discovered when the bench times out at hour eleven. blocks campaign
02 / THE CHECKS

Twenty checks. Eight categories. One verdict.

Every rule in the corpus comes from a failure mode that has actually burned a bench. The linter is one auditable Python file — your safety officer can read the entire rule engine in a sitting.

03 / HOW IT RUNS

It drops into the bench you already have.

Anything that can emit JSON can be linted, and the exit code is the gate. No platform to adopt and nothing leaves your network — the linter is one file you can read before you run.

STEP 01
Export the config
Describe channels, interlocks, and sequences as one JSON document — by hand or straight out of your bench tooling.
$ standguard.py example > bench.json
STEP 02
Lint it
Every finding carries severity, rule ID, and the exact config location — human-readable on the bench, JSON for your pipeline.
$ standguard.py lint bench.json --strict
STEP 03
Gate on the verdict
Exit 0 means acceptable. Exit 1 means do not apply power. Wire it into CI or the bench interlock checklist itself.
exit 1 → BENCH UNSAFE TO POWER
see what a bench config actually looks like
{
  "bench": { "name": "rig-A-avionics", "campaign_window_s": 3600 },
  "channels": [
    { "name": "bus_power", "pin": "P1.3", "kind": "power",
      "voltage_v": 28.0, "max_voltage_v": 32.0, "max_current_a": 10.0,
      "interlock": "estop_loop_1" },
    { "name": "actuator_cmd", "pin": "P2.1", "kind": "analog_out",
      "voltage_v": 10.0, "max_voltage_v": 12.0 },
    { "name": "imu_spi", "pin": "SPI0", "kind": "digital",
      "sample_rate_hz": 1000, "max_signal_freq_hz": 400 }
  ],
  "interlocks": [
    { "name": "estop_loop_1", "type": "hardware_estop", "cuts": ["bus_power"] }
  ],
  "sequences": [
    { "name": "bit_sequence", "steps": [
      { "action": "energize", "channel": "bus_power", "duration_s": 5 },
      { "action": "stimulate", "channel": "actuator_cmd",
        "amplitude_v": 9.5, "duration_s": 30 }
    ] }
  ]
}

Known limits, because you would ask: POSIX only today (Windows via com0com is on the roadmap); JSON only, deliberately — one parser, no YAML edge cases; rules are checks, not proofs. StandGuard will not tell you the bench measures the right thing. It tells you the config won't hurt it.

04 / THE VERDICT

Go / no-go, in one line.

No score to interpret, no dashboard to check. StandGuard ends every run the way a pre-flight checklist ends: with a call.

WHEN IT FINDS SOMETHING
5 errors —
BENCH UNSAFE TO POWER
exit code 1 · pipeline blocked · hardware spared
CHECKS RUN: 20FAILED: 5
WHEN IT DOESN'T
0 errors —
bench config acceptable
exit code 0 · clear to power · campaign proceeds
CHECKS RUN: 20FAILED: 0
05 / LICENSE

Expense it. Skip the procurement process.

Priced to sit under corporate card thresholds — a receipt, not an approval chain. Every license covers unlimited benches, includes the full 20-check corpus, CI gating, and activates fully offline. There is no enterprise tier, because there is no sales team to call.

Evaluationfree / no account
Lint your current bench config free. If it finds nothing, it cost you five minutes.
$0NO SIGNUP
Soloone engineer / year
One engineer, unlimited benches, every check, CI gating, offline activation. Receipts your finance team won't blink at.
$149PER YEAR
Teamup to 10 engineers / year
Everything in Solo for the whole bench crew. Honor-system seat count — still self-serve, still under most card limits.
$449PER YEAR
// Early access: the first 100 licenses are $99/yr (Solo), locked for life. The waitlist gets them in order.
06 / QUESTIONS FROM THE BENCH

Asked by engineers
who have burned hardware.

Does StandGuard need network access?

No. It is one auditable file with zero dependencies. JSON in, verdict out, and it runs fully offline — the linter never leaves your network. Every license activates offline too; there is no server to phone home, on any tier.

We already peer-review bench configs. Why a linter?

For the same reason code review never replaced the compiler. Reviews drift — at 11 pm before a campaign, on the third rewire of the week, the checklist stops being read. StandGuard runs the same 20 checks the same way every time, and it never gets tired, rushed, or embarrassed to ask.

What does a check actually look like?

Each failure mode is encoded as a small, readable rule in the open spec — voltage limits, interlock coverage, sampling aliasing, pin-map conflicts. The corpus is public and MIT-licensed at github.com/HanchoPOW/standguard-spec. If you have a failure mode we don't cover, that's a contribution, not a feature request.

What happens when it flags something?

A non-zero exit code and a JSON verdict naming the rule, the channel, and the fix. That means it drops straight into CI: your pipeline can refuse to power the rig until the config is clean — the same gate you already trust for firmware.

Can I just put this on a company card?

That's the design. Solo is $149/yr — under the no-approval threshold at most companies, the same category as a book or a dev tool subscription. You get a receipt by email, not a procurement ticket. There's no enterprise tier and no "contact sales" button, because there's no sales team to contact — the person who wrote the checks answers the email.

Does my bench configuration get uploaded anywhere?

Never. Evaluation runs on your machine against your config file. The only thing this site stores is the email you put in the form above — and that lives in our waitlist, nowhere else.

06 / CLEAR TO POWER

Your next config review
takes five minutes.

Join the early-access list for verification teams. First rule packs ship for avionics power rigs and actuator benches — bring your own failure modes and we'll encode them.

No cloud account. No telemetry. The linter never leaves your network.
PRE-FLIGHT SEQUENCE
EXIT