docs: record the LattePanda deployment and the traps it turned up

The rack display has been running v2 since today and passed a physical swipe
test and a cold boot, so the hardware table now says what is actually in
service and what is merely intended: the Wyse 3040 has not been tried yet and
should not read as though it has.

notes/HARDWARE-NOTES.md gains the two traps that cost the most time during the
deployment, both of which will recur:

lightdm autologin fires when a seat starts, not after a logout, so `i3-msg
exit` does not test the autostart -- it strands a keyboard-less wall display at
a greeter that nobody standing at the rack can get past. Only a real reboot
tests the boot path.

And `ssh host 'sudo ...'` allocates no TTY, so sudo has nowhere to prompt and
fails; chaining the rest of the recovery behind `&&` then swallows it silently.
Use `ssh -t`, and `;` for steps that must run regardless.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
jasonwitty
2026-09-09 14:03:30 -07:00
co-authored by Claude Opus 5
parent ec9a9a8892
commit ad8ebcaa71
4 changed files with 33 additions and 15 deletions
+16
View File
@@ -103,3 +103,19 @@ adapter for the panel; roughly 3-4 W idle, 101x101x28 mm, VESA holes.
The eMMC is why the installer checks free space before starting a build: a Rust
toolchain plus a target directory is around 1.8 GB.
## Never log out of a keyboard-less wall display
lightdm autologin fires when a **seat starts**, not after a logout. `i3-msg exit`
therefore drops the display to the greeter and leaves it there — and the rack
panel has no keyboard, so nobody can log back in at the machine. Recovering it
needs `sudo systemctl restart lightdm` or a reboot, and the LattePanda has no
passwordless sudo.
So: **`i3-msg exit` does not test the autostart, it only strands the box.** The
only honest test of the boot path is an actual reboot.
Related trap when handing over a root command: `ssh host 'sudo …'` allocates no
TTY, so sudo has nowhere to prompt and fails. Use `ssh -t`. Chaining with `&&`
then swallows the rest of the line, which is how a recovery command silently did
nothing at all. Use `;` for recovery steps that must run regardless.