OpenMHS

Reports

What has been built, what was run, and what the results were. Every result on this page comes from simulators or simulated peers. Nothing here is a physical-hardware result.

Project status

ItemValue
Version0.1.0, pre-alpha. No release published yet.
Specificationv0.1 draft; may change incompatibly before 1.0
MilestonesM0 to M9 done (M7 to M9 pending review). M10 built, not published. M11+ planned.
LanguagesRust (gateway, engine, adapters), Python (SDK, Python adapters, examples, tools)
InterfacesMCP over stdio, local JSON-RPC API, CLI, Python SDK
PlatformsWindows 11 and Linux (Ubuntu) tested; macOS arm64 configured in CI; macOS x86_64 untested
Physical hardwareNot yet tested by the project
MaintainerMaintainer-led; see GOVERNANCE.md
LicenseApache-2.0

M10: release readiness

Status: built and verified locally on Windows; not releasable until the blockers below are cleared. No release, PyPI upload or documentation site has been published. Source: M10 test report.

DeliverableVerified byState
README rewrite with quickstartQuickstart run from a release binary in PowerShelldone
Release binaries (cargo-dist, four targets)Windows zip built, checksum matched, demo and quickstart ran from itWindows only Linux and macOS never built
Python packagesdist and wheel built, twine check, installed in a clean venv, smoke testnot uploaded
Documentation site (mdBook)Built: 80 pages, 2247 links checked offline, 0 errorsnot deployed
Adapter registrycheck_registry.py, 23 testsdone
Generated compatibility matrixGenerated from committed reports; checked in CIdone
Governance and community filesCONTRIBUTING, SECURITY, SUPPORT, CODE_OF_CONDUCT, GOVERNANCE, issue and PR templates, RFC templatedone
Demo recordingTerminal SVG and transcript from a real runvideo not rendered
Installation guideWindows steps run; Linux and macOS steps writtenpartly tested

Gate results on Windows

StepResult
cargo fmt, cargo clippy -D warnings, cargo deny checkpass
cargo test --workspacepass 354 tests, 0 failed, 67 test binaries
Schema, registry, matrix and release-version checkspass 78 schema documents, 11 registry entries, 9 reports
Python SDK tests and tool testspass
Documentation build with link checkpass 0 broken links

Release blockers

  1. Nothing has run on Linux or macOS. Only the Windows build was made.
  2. CI has not run on the M10 work. Two new CI jobs have never executed.
  3. Owner actions: private vulnerability reporting, code-of-conduct contact, PyPI trusted publisher, GitHub Pages, repository settings.
  4. The demo video is not rendered.
  5. The openmhs name on PyPI was free on 2026-10-25; that can change.
  6. crates.io is blocked: openmhs-types embeds files from spec/, which a published crate cannot reach.

Compatibility matrix

Generated by tools/gen_matrix.py from the adapter registry and the conformance reports committed in conformance/reports/. CI fails if it is stale. Source: docs/compatibility.md.

Simulation is not physical validation. Every row was tested against a simulator; no row is "physically validated". A level is not a safety certification.
AdapterProtocolCategoryEvidenceLevel reachedChecksResult
openmhs.httpHTTPofficialIntegration-tested (simulated peer)L3 (declares L2)46 pass, 0 fail, 4 n/aPass
openmhs.modbusModbus TCPofficialIntegration-tested (simulated peer)L3 (declares L2)78 pass, 0 fail, 6 n/aPass
openmhs.mqttMQTTofficialIntegration-tested (simulated peer)L3 (declares L2)56 pass, 0 fail, 4 n/aPass
openmhs.scpiSCPIofficialIntegration-tested (simulated peer)L3 (declares L2)73 pass, 0 fail, 6 n/aPass
openmhs.py.psu-simotherofficialSimulatedL3 (declares L3)66 pass, 0 fail, 6 n/aPass
openmhs.sim.axisbuilt-inofficialSimulatedL3 (declares L3)51 pass, 0 fail, 4 n/aPass
openmhs.sim.psubuilt-inofficialSimulatedL3 (declares L3)66 pass, 0 fail, 6 n/aPass
openmhs.sim.thermobuilt-inofficialSimulatedL1 (declares L1)19 pass, 0 fail, 6 n/aPass
openmhs.py.octoprintHTTPexperimentalIntegration-tested (simulated peer)L1 (declares L1)34 pass, 0 fail, 6 n/aPass
openmhs.py.opcuaOPC UAexperimentalNot verifiednone on file (declares L1)-Not verified
openmhs.py.ros2ROS 2experimentalNot verifiednone on file (declares L1)-Not verified

All reports: OpenMHS 0.1.0, Windows x86_64, 2026-10-24. Every report's source is "simulator".

Experiments: OctoPrint and ESP32

Experiment 01: read-only OctoPrint adapter

A read-only adapter for OctoPrint, the 3D-printer server, tested against a real OctoPrint 1.11.8 driving its Virtual Printer plugin. Simulated peer only; no physical printer. Full report.

CheckResult
Adapter5 capabilities, 2 request paths, GET only, standard library only
Adapter testspass 42 run, 41 passed, 1 skipped (abstract base), 0 failed
ConformancePASS L1 reached, declared L1, 34 pass, 0 fail, 0 untested
End-to-end demo11 steps, exit 0, 17 requests, all GET

What the real OctoPrint showed that its documentation did not: right after the printer connects, temperature fields are missing and then null before real numbers; an unplugged printer is a 409 on one endpoint but a 200 on another. The adapter now reports these honestly instead of serving a stale or malformed value.

Experiment 02: ESP32 over MQTT, in QEMU

Real ESP-IDF firmware for an ESP32 node, run in Espressif's QEMU beside a real Mosquitto broker, driven through the stock MQTT adapter with state-changing commands. Simulated only; no physical ESP32. Full report.

SituationGateway resultWhat the node did
Turn the LED on, with a grantVERIFIED acknowledged, read back trueApplied and published state
Pulse twice (no readback declared)UNVERIFIABLE device says applied; not confirmedCounter 0 to 2
No grantDENIED nothing sentReceived nothing (0 messages)
Pulse count 11 (range 1 to 10)DENIED out of rangeReceived nothing
Node frozen, writeUNKNOWN_OUTCOME timeout, not retriedApplied it after being released
Same command, reconciled laterRECONCILED_APPLIED readback matchesLED on
Node powered off, actionUNKNOWN_OUTCOME sent once, never retriedNothing applied late
Broker stoppedReads disconnected; command FAILED not sentReconnected by itself

Tests: 18 passed of 18. Demo: 10 steps, audit chain verified (53 records). The key finding: a node that stops answering may still apply the command later. That is exactly what UNKNOWN_OUTCOME is for, and why the gateway never retries: a retried pulse would have run twice.

Guided demo, step by step

Command: openmhs demo. A real gateway with three simulated devices (sim.thermo-01, sim.psu-01, sim.axis-01), driven over its API. Result: every step behaved as expected.

#What happensResult
1Gateway starts with three simulated devices, loopback onlyok
2Operator issues a token for agent:demook
3Agent asks for 5 V with no grantsDENIED policy.denied.no_grant
4Agent tries to grant itself accessrefused only operators change policy
5Operator grants read, power output, homing, and approval-gated movesok
6Agent reads the temperatureGOOD fresh, timestamped, audited
7Agent asks for 48 V on a 0 to 12 V supplyDENIED command.value.out_of_range
8Agent sends a bare 5 with no unitDENIED command.value.type_mismatch
9Agent jumps from 0 V to 5 V (limit 2 V per second)DENIED command.slew_exceeded
10Agent ramps 2 V, 4 V, 5 V, one second apartVERIFIED each by readback
11Agent retries 5 V with the same idempotency keyok original command returned, not run again
12Supply telemetry goes stale; agent asks for 6 VDENIED command.state.stale
13Agent homes the axisVERIFIED
14Agent requests a hazardous move to 120 mmAWAITING_APPROVAL nothing moved
15Agent tries to approve its own moverefused agents cannot approve
16Operator approves; preconditions re-checked; carriage movesVERIFIED readback 120 mm
17Supply applies 7 V but the acknowledgement is lost (3 s deadline)UNKNOWN_OUTCOME not failed, not retried
18Fault clears; agent reconciles by reading the deviceRECONCILED_APPLIED readback 7 V
19Supply adapter crashes while handling 6 VUNKNOWN_OUTCOME, then RECONCILED_NOT_APPLIED readback still 7 V; gateway kept serving
20Operator verifies the audit logok 89 records, hash chain intact

Recorded on 26 October 2026 on Windows 11 with Rust 1.99.1, from the latest main (openmhs 0.1.0).

Simulator conformance

Command: openmhs conformance, with all five faults injected (link_down, no_response, lost_ack, garbled, refuse). Same run, same date as the demo.

DeviceDeclaredReachedPassFailUntestedN/ATimeResult
sim.thermo-01 sensorL1L1190060.03 sPASS
sim.psu-01 power supplyL3L36600617.6 sPASS
sim.axis-01 linear stageL3L35100413.8 sPASS

The temperature sensor is read-only, so L1 is its correct ceiling.

Agent replanning run

Command: python examples/agent-loop/mock_agent.py. A scripted agent connects over MCP, with no model and no API key.

TaskWhat the gateway saidWhat the agent didEnd
Set the supply to 5 VRefused: slew limit. Suggested steps of at most 2 V, one second apart, with readback between.Ramped 2 V, 4 V, 5 V, checking each step firstVERIFIED 5 V
Set the supply to 15 VRefused: outside 0 to 12 V. Advised not to exceed the range to compensate.Did not retry; reported to the humanDENIED as expected
Home the linear stageRefused: no grantAsked the human for permissionDENIED as expected

Final setpoint 5 V; audit chain valid with 50 records. All tasks ended as expected. (Recorded 25 October 2026.)

Known limitations

The single list is docs/limitations.md. The main points:

Roadmap

#MilestoneStatus
M0Research, positioning, naming, decision recordsdone
M1Specification v0.1: schemas, lifecycle, units, errors, authorization, example devicesdone
M2Core engine, journal with crash recovery, audit, adapter trait, virtual power supplydone
M3Gateway, local API, CLI, three virtual devices, demo, CI on three systemsdone
M4MCP server, Python SDK, replanning agent exampledone
M5Conformance suite, adapter scaffolding, adapter author guidedone
M6Protocol adapters: Modbus TCP, MQTT, SCPI, HTTPdone
M7Out-of-process adapter host, Python adapter SDK, OPC UA and ROS 2, verified TLSdone pending review
M8Identity and trust: scoped credentials, approval records, signed manifests, threat modeldone pending review
M9Capability graph, leases, plans with twin preflight, stop lane, L3 conformancedone pending review
M10Release readiness: binaries, PyPI, docs site, adapter registry, compatibility matrix, governancebuilt nothing published; see blockers
M11+Advanced track, design documents first: WASM-sandboxed adapters, OpenTelemetry, remote and federated gateways, fleets, assisted adapter generation, hardware-in-the-loop rigs, OPC UA, ros2_control and SiLA 2 bridges, device attestationplanned

Source: docs/roadmap.md, docs/IMPLEMENTATION_STATUS.md and CHANGELOG.md.