Industrial & OT
Valid credentials.
Catastrophic command.
Denied on physics.
The dangerous failure in operational technology isn't always an intruder — it's a valid, authenticated write with a physically impossible value: a 100-fold lye setpoint, a 400% output, a reversed valve. Kirra decodes the actual control write on the wire and denies on magnitude, regardless of whose credentials carried it — and records the refusal in a ledger a regulator can verify.
Kirra's founder holds licensed operating experience on public water-treatment control systems — the exact class of infrastructure this addresses. About the company
docs/protocol_adapters.mdsrc/protocol_adapter.rscrates/kirra-industrial
Native protocol awareness
It reads the wire, not a wrapper
Kirra decodes each control write by its configured type — because the frame on the wire carries width at best, never type — then bounds the decoded value. A write that can't be faithfully decoded is refused, never fabricated. Envelopes are configuration; a high-assurance strict mode denies any write to a target with no configured bound.
| Protocol | What Kirra bounds | Configuration | Status |
|---|---|---|---|
| DNP3 | Analog Output (g41) control writes — Operate / Direct_Operate setpoints | KIRRA_DNP3_ANALOG_OUTPUT_ENVELOPE | LIVE |
| CANopen | SDO expedited-download setpoints, decoded by the OD entry's type (i8…f32) | KIRRA_CANOPEN_SDO_BOUNDS · _STRICT_BOUNDS | LIVE |
| EtherNet/IP (CIP) | Set_Attribute_Single writes, decoded by the attribute's data type | KIRRA_CIP_ATTR_BOUNDS · _STRICT_BOUNDS | LIVE |
| Modbus / OPC-UA | Event mapping into the fleet posture engine | protocol_adapter.rs | LIVE |
CLAUDE.mdcrates/kirra-industrial
Env-var names are the repository's own; each maps a target (node/index/attribute) to a
typed min:max range. Unconfigured targets are posture-only; strict mode makes them deny-by-default.
Why OT teams trust it
Fail-closed, auditable, adversary-tested
Deny on physics, not identity
The envelope check is on the decoded magnitude. A compromised-but-authenticated workstation, an insider, or a fat-fingered setpoint are all refused by the same rule — the one thing they have in common is a physically out-of-range value.
A record regulators can verify
Every denied setpoint lands in a SHA-256 hash-chained ledger with the decoded value that was refused — tamper-evident, shippable off-box to WORM storage, and independently re-verifiable. The DNP3 deny path is mandatory-audited by test.
src/audit_shipper.rssrc/bin/kirra_verifier_service/dnp3_mandatory_audit_tests.rs
Hostile inputs are fuzzed
The decoders face malformed frames continuously — the DNP3 analog-setpoint decoder is one of four standing fuzz targets, run on every push and deep-fuzzed weekly. An undecodable payload is refused, never interpreted.
fuzz/fuzz_targets/dnp3_analog_setpoint.rs.github/workflows/fuzz-deep-weekly.yml
Posture across the plant
Assets form a dependency fabric: a faulted upstream asset degrades what depends on it, and industrial events feed the same fleet-posture engine that gates every command class across the site.
Sits in front of what you run
Kirra is a governor, not a replacement PLC or SCADA. It bounds the control write between the issuing layer and the actuator — your existing automation stays; it simply gains a physics-aware veto it can't talk its way past.
Standards-aligned, honestly
The safety case maps to IEC 61508 SIL 3 and the run-time-assurance patterns OT regulators recognize — drafted in the open, versioned with the code. Independent assessment has not yet been performed, and we say so.
READ THE SOURCE
Bound the setpoint. Keep the plant.
Bring us your protocol, your targets, and your physical limits — we'll show you where Kirra's envelope sits in your control path today, and where it's roadmap.