Skip to content

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.

Capability gap close-out (8-spec wave, May 2026)

  • galois Python SDK (new repo). Typed Edge / Cloud / Instrument / Stream / Sweep / Waveform object model wrapping galois.edge.v1.EdgeDaemonService 1:1. NumPy auto-decoding for VectorData. Sync and parallel AsyncEdge surfaces. Cloud-routed access via Cloud.connect(backend_url, token).edge(name). Edge.connect(auth_token=...) carries the daemon’s INBOUND_AUTH_TOKEN.
  • Multi-stream WebSocket protocol. Up to 32 named streams per socket, identified by caller-supplied stream_id. Per-instrument asyncio.Lock prevents SCPI races between poll ticks and command frames. Acquisition mode holds an instrument exclusively across all sockets via a global _acquiring_instruments set.
  • gRPC bearer-token auth (INBOUND_AUTH_TOKEN). Optional Python interceptor in grpc_server.py that requires authorization: Bearer <token> on every RPC except Ping. Empty config = disabled, network is the boundary. setup persists 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 (via tailscale status --json side channel), registration_token_format (warns if not glc_…). galois-edge doctor now runs 13 checks.
  • Auto-attached PyVISA proxy. When a profile matches, pyvisa-galois swaps 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. attempts resets after a clean session ends. Auth migrates from ?token=… URL query string to Authorization: Bearer … header. Malformed-frame guard. Optional hello_ack handshake behind the relay_hello_ack build tag. New WebSocket Relay reference page.
  • Env-var reconciliation. RESCAN_INTERVAL_SEC is the canonical name (Python no longer reads the wrong SCAN_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_VARS allow-list derived from internal/config/config.go fieldMapping, with a CI drift test.
  • Windows MSI installer. installer/galois-edge.wxs resolves the ServiceInstall conflict by delegating to the Go binary’s install / uninstall subcommands (mirroring Linux). config.env is NeverOverwrite. GALOIS_TOKEN MSI property invokes galois-edge setup post-install. Tray autorun under HKLM by default; TRAY_AUTORUN=user opts into HKCU. Code-signing pipeline pinned to azure/trusted-signing-action@1d365fec…, gated on SIGNING_TENANT_ID so PRs don’t fail without secrets.

Knowledge ingestion

  • New galois-edge claude command 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 from BACKEND_URL) that maintains a persistent connection to the cloud so the backend can dispatch commands even when direct gRPC dial fails.
  • tsnet.DialContext and tsnet.HTTPClient are 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 dbc2galois script converts vendor DBC files into Galois CAN profiles. CAN frames have first-class CANCommandConfig / CANSignalConfig schema entries (message_id, direction, signals, dlc, payload).
  • GenericCANDriver and CANBusManager. Profiles can declare interfaces: - type: can plus a bus: can0.
  • Modbus driver framework — YAML-interpreted, cross-platform, with ConnectModbusInstrument and DisconnectInstrument RPCs 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 an SDKExecutor that importlib-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.

First public tag. Includes:

  • Go supervisor that spawns and supervises a frozen Python instrument engine.
  • gRPC service galois.edge.v1.EdgeDaemonService with 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-edge CLI: start, status, setup, configure, install, uninstall, doctor, version.
  • The proto package is galois.edge.v1. Field additions are backwards-compatible. There is no v2 yet; if breaking changes become necessary, the policy intent is to move them to a parallel v2 rather than break v1 callers.
  • 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 VERSION directory). Mixing versions across the supervisor/engine boundary is unsupported.