Features
lager pythonautomatically reserves the box while it runs. Every run acquires the box lock at start and releases it on exit,Ctrl+C, crash, or kill, with a server-side TTL + heartbeat reap as the backstop. Lock identity is CI-aware, so parallel CI matrix jobs queue against a shared box instead of colliding: collisions fail fast on a dev machine and wait (up toLAGER_LOCK_WAIT) in CI.--detachholds an eternal lock you release withlager boxes unlock. The box-mutating admin commands —lager install,uninstall,update,install-wheel— also hold the lock across their destructive steps so a concurrent test is never killed mid-run. Tune or disable viaLAGER_AUTO_LOCK_DISABLE,LAGER_LOCK_WAIT,LAGER_LOCK_TTL,LAGER_LOCK_HEARTBEAT, andLAGER_LOCK_HOLDER.- Explicit
lager boxes lockreservations are never disturbed by any auto-locking command — they keep their no-expiry semantics on new and old box servers alike.
Bug Fixes
- The supply TUI now works on slow instruments (e.g. Keithley 2281S). Previously its live readout could stay stuck at
00.000with repeated “Hardware service unreachable” errors and timed-out commands. The box-side monitor now reads the full display state in a single call per update and paces itself to the instrument, so readings populate and commands respond promptly — even when the instrument is shared with the battery simulator. - TUI error messages now say what actually failed (a timeout, a refused connection, or a device error) instead of an empty message, and a reachable box with a failed supply/battery session points you at the instrument (check it is on and shows in
lager instruments) instead of suggesting an outdated box image. lager battery <net> tuiwith a non-battery net now exits with an error code instead of reporting failure but exiting successfully.
Improvements
- Pinned
textualandpython-socketioto compatible ranges so a freshpip install lager-clican’t pull in a newer, breaking version of either library. Existing installs are unaffected.

