Interfaces and Tools
The IsolaRail control plane combines device firmware, a local daemon, a CLI, and the Web app. The current owner-facing entrypoint is the isolarail CLI; isolarail-devd is the local service and should not require ordinary users to manage it manually.
Layering
The default path is isolarail automatically finding or starting isolarail-devd serve. isolarail-devd web is explicit and only for browser development or same-origin Web hosting.
Naming and identity
These names are owned by docs/specs/pw97u-control-plane-alignment/SPEC.md. Web, CLI, README, and diagnostics should not invent alternate product names.
USB JSONL
Firmware exposes core operations over USB Serial/JTAG JSONL:
infoports.getport.power_setport.replugwifi.getwifi.setwifi.clearreboot
The info response must include device identity, MAC, firmware name, version, and uptime. The companion uses those fields for identity checks so flashing and control commands are not sent to an unrelated board.
port.power_set and port.replug only accept port1..port4; historical USB-A, USB-C, and route models are not current control-plane IDs.
HTTP / LAN
The target device-side HTTP v1 surface includes:
GET /api/v1/healthGET /api/v1/infoGET /api/v1/portsGET /api/v1/ports/{portId}POST /api/v1/ports/{portId}/powerPOST /api/v1/ports/{portId}/actions/replugGET /api/v1/wifiPOST /api/v1/reboot
Device HTTP v1 is not an account or cloud-auth surface. Wi-Fi writes still require a USB-backed device path.
Seeing the device on LAN does not authorize Wi-Fi credential writes.
isolarail-devd modes
isolarail-devd has two modes:
serve: default native IPC daemon for local CLI/desktop paths.web: explicit localhost Web companion for browser development and same-origin Web hosting.
Do not treat localhost HTTP as the default daemon transport. The Web runtime must not scan localhost ports; usable origins must come from same-origin bootstrap or explicit DEVD_ORIGINS.
Ordinary users should not need to start the daemon first; the CLI connects to an existing instance or starts serve.
CLI selectors
The CLI separates temporary devices from saved hardware:
--device <device-id>: currently connected temporary USB target.--hardware <saved-id>: saved hardware profile.
Wi-Fi write and clear operations require --device or USB-backed --hardware. --url and Wi-Fi/LAN saved hardware stay read-only.
Common commands
Read-only checks:
Device actions:
Diagnostics:
State-changing commands should run sequentially. The companion enforces mutual exclusion for the same serial path, so overlapping requests can legitimately return device busy.
Diagnostics export
just diagnostics-export should aggregate:
statusportswifi- recent Local USB serial session traces
- daemon-observed identity and selector information
The goal is to reproduce what state one board was in, not just capture the last error line.
Web app boundary
The Web app arbitrates three channels:
- Wi-Fi / LAN
- Web Serial
- Local USB bridge
It does not scan localhost, does not point users at implicit port discovery, and does not bypass isolarail-devd identity checks.
Web runtime arbitration:
- Wi-Fi / LAN, Web Serial, and Local USB bridge may all be available.
- The same device must not appear as duplicates just because channels differ.
- Last successful channel wins; if it fails, promote another available channel.
- unsupported, busy, offline, and USB-only states must show clear next actions.
References
README.mddocs/specs/pw97u-control-plane-alignment/SPEC.mddocs/specs/q9d7h-cli-devd-flash-migration/SPEC.md