Changelog
This page summarises notable changes across galois-edge. Per-release artifacts and SHA-256 checksums live at releases.galoislabs.ai. For the full commit history, see the GitHub repository.
Unreleased (post-v0.1)
Section titled “Unreleased (post-v0.1)”Capability gap close-out (8-spec wave, May 2026)
galoisPython SDK (new repo). TypedEdge/Cloud/Instrument/Stream/Sweep/Waveformobject model wrappinggalois.edge.v1.EdgeDaemonService1:1. NumPy auto-decoding forVectorData. Sync and parallelAsyncEdgesurfaces. Cloud-routed access viaCloud.connect(backend_url, token).edge(name).Edge.connect(auth_token=...)carries the daemon’sINBOUND_AUTH_TOKEN.- Multi-stream WebSocket protocol. Up to 32 named streams per socket, identified by caller-supplied
stream_id. Per-instrumentasyncio.Lockprevents SCPI races between poll ticks andcommandframes. Acquisition mode holds an instrument exclusively across all sockets via a global_acquiring_instrumentsset. - gRPC bearer-token auth (
INBOUND_AUTH_TOKEN). Optional Python interceptor ingrpc_server.pythat requiresauthorization: Bearer <token>on every RPC exceptPing. Empty config = disabled, network is the boundary.setuppersists the token from the cloud’s registration response. - Five new doctor checks.
config_writable,udev_rules_installed(Linux),service_unit_installed(per-platform: systemctl on Linux, SCM on Windows),tailnet_connected(viatailscale status --jsonside channel),registration_token_format(warns if notglc_…).galois-edge doctornow runs 13 checks. - Auto-attached PyVISA proxy. When a profile matches,
pyvisa-galoisswaps the resource’s__class__to a one-off subclass that forwards unknown attribute lookups to the typed proxy.smu.set_voltage(voltage=1.5)works directly on the resource; PyVISA’s own methods always win on name collision. Backward-compat:rm.visalib.get_proxy(handle)still resolves. - Relay client hardening. Bails (no retry) on WebSocket close codes
4401/4403/4426/1008.attemptsresets after a clean session ends. Auth migrates from?token=…URL query string toAuthorization: Bearer …header. Malformed-frame guard. Optionalhello_ackhandshake behind therelay_hello_ackbuild tag. New WebSocket Relay reference page. - Env-var reconciliation.
RESCAN_INTERVAL_SECis the canonical name (Python no longer reads the wrongSCAN_INTERVAL_S); the legacy name is accepted with a deprecation warning for one minor release. New unknown-var startup guard catches typos before they silently take no effect._KNOWN_GALOIS_VARSallow-list derived frominternal/config/config.gofieldMapping, with a CI drift test. - Windows MSI installer.
installer/galois-edge.wxsresolves theServiceInstallconflict by delegating to the Go binary’sinstall/uninstallsubcommands (mirroring Linux).config.envisNeverOverwrite.GALOIS_TOKENMSI property invokesgalois-edge setuppost-install. Tray autorun underHKLMby default;TRAY_AUTORUN=useropts intoHKCU. Code-signing pipeline pinned toazure/trusted-signing-action@1d365fec…, gated onSIGNING_TENANT_IDso PRs don’t fail without secrets.
Knowledge ingestion
- New
galois-edge claudecommand tree (enable,disable,status,backfill) for opt-in Claude Code transcript ingestion. Subjects are keyed off a per-machine install ID so identity survives hostname changes. - Peer-authenticated control endpoint with on-disk cache, size cap, and optional credential pre-redactor.
- UUID-anchored hook resume — interrupted ingestions resume from the last consistent transcript anchor instead of byte offsets.
Networking
- WebSocket relay client (
RELAY_URL, derived automatically fromBACKEND_URL) that maintains a persistent connection to the cloud so the backend can dispatch commands even when direct gRPC dial fails. tsnet.DialContextandtsnet.HTTPClientare now exposed for daemon subsystems that need to talk to the cloud over the tailnet.
Profiles
- Property-command setters now fall back to the getter template when placeholders remain unresolved, fixing a class of read-via-write footguns.
- Streamable annotations on Quantifi laser power, wavelength, and switch channel-state commands.
- 26 new Quantifi Photonics SCPI profiles, plus a synthetic simulation engine for demos under
contrib/simulation/.
CAN bus / Modbus / SDK profiles
- New
dbc2galoisscript converts vendor DBC files into Galois CAN profiles. CAN frames have first-classCANCommandConfig/CANSignalConfigschema entries (message_id,direction,signals,dlc,payload). GenericCANDriverandCANBusManager. Profiles can declareinterfaces: - type: canplus abus: can0.- Modbus driver framework — YAML-interpreted, cross-platform, with
ConnectModbusInstrumentandDisconnectInstrumentRPCs and an SDM120 energy-meter profile. - DPS-150 sweep commands and a pin-labeled Digilent Analog Discovery profile (42 commands across all DWF subsystems).
- Windows system-tray application and a Windows build pipeline producing MSI artifacts.
Driver-deployment RPCs
DeployProfile,RemoveProfile,ListProfiles— push YAML drivers to the daemon at runtime without restarting.- SDK instrument support:
sdk:block in profiles plus anSDKExecutorthatimportlib-loads vendor packages on demand. First wrappers added for instruments without SCPI APIs. - 42 instrument profiles converted from open-source Labber drivers (MIT).
Discovery & USB
- Trickle scanner: discovery work is spread over time rather than blocking startup.
- USB hotplug monitor for plug/unplug events without polling.
- Auto-detection of the frozen engine binary next to the supervisor.
v0.1.0 — Initial release
Section titled “v0.1.0 — Initial release”First public tag. Includes:
- Go supervisor that spawns and supervises a frozen Python instrument engine.
- gRPC service
galois.edge.v1.EdgeDaemonServicewith the core RPC set:SendCommand,ListInstruments,ScanInstruments,ExecuteCommand,ExecuteSequence,StreamMeasurement,GetStatus,Ping,RegisterEdge,Heartbeat. - Embedded Tailscale node (
tsnet) for cloud connectivity. - Bidirectional TCP proxy from the tailnet/0.0.0.0 to the localhost-only Python ports.
- One-shot installer (
install.sh) for Linux with udev rules for the major instrument vendors. - ~70 bundled YAML profiles across DMMs, oscilloscopes, sourcemeters, signal generators, network analyzers, and lock-in amplifiers.
galois-edgeCLI:start,status,setup,configure,install,uninstall,doctor,version.
Compatibility policy
Section titled “Compatibility policy”- The proto package is
galois.edge.v1. Field additions are backwards-compatible. There is nov2yet; if breaking changes become necessary, the policy intent is to move them to a parallelv2rather than breakv1callers. - Config keys are append-only — new keys ship with safe defaults; deprecated keys remain honoured for at least one minor release with a warning.
- The Go supervisor and the Python engine ship as a matched pair under one release version (separate binaries, one
VERSIONdirectory). Mixing versions across the supervisor/engine boundary is unsupported.