Features
-
Every hardware-interacting command now takes the Lager Box lock, not just
lager pythonand the admin commands. Toggling a GPIO, driving a supply, flashing over SWD or opening a UART could previously collide with a running test or another operator with nothing to stop it, which is the most common source of unexplained failures on a shared bench. Measurement (gpi,gpo,adc,dac,thermocouple,watt,energy,scope,logic), communication (spi,i2c,uart,wifi,ble,blufi,usb,router), power (supply,battery,eload,solar) and development (debug,arm,webcam) all acquire a short-lived lock as they resolve the Lager Box, and release it when the command exits — including when it exits with an error. Read-only paths are deliberately untouched:lager supply --box Xwith no subcommand,lager boxes list, and the bare net listings still resolve without locking, so inspecting a bench never blocks anyone. Each lock carries a 30-minute expiry refreshed by a heartbeat, so a process that is killed outright cannot strand the bench. SetLAGER_AUTO_LOCK_DISABLE=1to opt out. -
lager update --pullfetches a pre-built Lager Box container image instead of building it on the Lager Box. Release tags are published to GitHub Container Registry, and the client resolves the tag to an immutable digest, pulls that digest pinned to the Lager Box’s own architecture, and verifies the image reports the version that was asked for before using it. Any miss at any step — a branch target, an unpublished tag, an unreachable registry, a mismatched image — falls back to the local build that has always run. It is opt-in for this release: pass--pull, or setLAGER_BOX_IMAGE_PULL=1.--no-pullnever pulls.
Bug Fixes
-
lager logic <NET> enable,disable,start,start-singleandstopdid nothing, and reported success doing it. The command validated the net as a logic net and then asked the Lager Box for an analog one, which matched nothing — so the worker returned without touching the instrument, printed no output, and exited zero. Confirmed against a Rigol MSO logic net. All five now resolve the net they were given. - A Lager Box whose Docker lacks the buildx plugin can now be updated. The BuildKit pre-flight rejected such a Lager Box before doing anything else, which was correct when every update built the image locally and wrong once a pre-built image could be pulled instead — a Lager Box that cannot build is precisely the one a pre-built image exists for. The pre-flight now runs only on the path that actually builds.

