Upgrade Notes
-
The robot-arm scan now writes only to a port that identifies as a Dexarm.
Before, the scan opened every
/dev/ttyUSB*and/dev/ttyACM*node. It wrote a G-code handshake to each one. Now it reads each node’s USB vendor and product ID. It writes only to0483:5740. An arm that reports a different ID will not appear inlager instruments. To restore the wider scan, setLAGER_ARM_PROBE=forcein the Lager Box container environment. That setting drops the identity check alone. Every other guard stays active. -
Seven range checks in the instrument mappers now reject bad values. Each
check carried inverted bounds, so no value satisfied it. The check rejected
nothing. Seven settings are affected:
- the UART trigger data width
- the I2C trigger address width
- the I2C data byte width
- the SPI trigger data width
- the UART and SPI bus data widths
- the Keithley battery state-of-charge
-
secure_box_firewall.shreports what it configured, not what it achieved. A successful run ended with[OK] External access blocked for Lager services. It now ends with[OK] Host firewall configured for Lager services. It adds a note that states the limit and points to the Security Model section ofSECURITY.md. The script writes the same rules as before. Update any automation that matches the old text.
Bug Fixes
-
lager sshrefused boxes that a plainsshreached. When~/.ssh/lager_boxexists,lager sshpasses it with-i. That flag replaces ssh’s default identity list instead of adding to it. ssh’s own defaults —id_rsa,id_ecdsa,id_ed25519and their-skvariants — were no longer offered. A box that authorizes one of those keys, and notlager_box, answeredPermission denied (publickey). A plainssh user@boxstill worked. A stale or never-installedlager_boxkey therefore lockedlager sshout of every box the user set up withssh-copy-id.lager sshnow nameslager_boxfirst, then each default identity file present, in ssh’s own order. Your~/.ssh/configidentities and agent keys stay on offer. With nolager_boxkey, the command passes no-iat all. -
A
lager uartsession received the textM105from a scan it did not ask for. The device under test echoed it and answeredError: Unknown command: M105.M105is the G-code handshake that finds a Dexarm robot arm. The scan wrote it to every serial port outside an exclusion set. That set had three gaps. It listed only hardware the scan recognizes, so it missed any unlisted USB-serial chip. It read one interface per adapter, so it left the other channels of a multi-channel FTDI adapter open. It never consulted saved nets. The scan also opened each port without an exclusive lock. It therefore opened through the lock a live session held. The scan now writes only to a port that identifies as a Dexarm. It excludes every channel of every known adapter. It excludes every port a saved UART net owns. It opens each port with an exclusive lock.GET /instruments/listis the only trigger, and it runs a full scan on every request. These writes arrived from a request that another terminal made. -
An attached Dexarm did not appear in
lager instruments. The arm answered the handshake and the scan then discarded it. Two faults caused this. The scan read the USB serial number withudevadm info, which needs the udev runtime database. A container without/run/udevmounted has no such database, soudevadmreturned no serial. The scan now reads the serial number from sysfs. The scan also waited 10 milliseconds and then read whatever had arrived. The arm answers more slowly than that, so the read returned nothing. The scan now waits for the reply, up to the port’s one-second timeout. -
GET /instruments/listnow records the client that asked. The scan runs on every request and caches nothing. This line identifies the caller behind any given write.
Improvements
tools/check_coverage_counts.pynames a missing pytest plugin instead of reporting the test suite as failed.- The bench watchdog reads its thresholds from one place. A workflow copy can no longer drift from the tool that consumes it.
Known Limitations
LAGER_ARM_PROBE=forcedrops the identity check. The scan then writes a G-code handshake to every serial port it can open. Ports that saved nets own stay excluded. Ports another process holds stay excluded. Use this setting to diagnose a missing arm, and unset it afterward.

