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
parent ec9a9a8892
commit ad8ebcaa71
4 changed files with 33 additions and 15 deletions
+5 -5
View File
@@ -45,12 +45,12 @@ you left.
## Hardware ## Hardware
| Part | What was used | Notes | | Part | What was used | Status |
| --- | --- | --- | | --- | --- | --- |
| Display host | LattePanda (Atom x5-Z8350, 1.9 GB) | Debian 11, i3 on X11 | | Display host | LattePanda (Atom x5-Z8350, 1.9 GB), Debian 11, i3 on X11 | in daily use |
| Display host | Dell Wyse 3040 (Atom x5-Z8350, 2 GB) | ~$35 used; 8/16 GB eMMC, DP out | | Display host | Dell Wyse 3040 (Atom x5-Z8350, 2 GB), 8/16 GB eMMC, DP out | not yet tried |
| Panel | GeeekPi 9" 1280x720 3U touchscreen | ILITEK USB touch | | Panel | GeeekPi 9" 1280x720 3U touchscreen, ILITEK USB touch | in daily use |
| Mounting | [`cad/`](cad) — 19" rack adapter | 3D-print or laser-cut aluminium | | Mounting | [`cad/`](cad) — 19" rack adapter | printed and in the rack |
Any Linux box with a USB or DSI touchscreen will do. It is deliberately modest Any Linux box with a USB or DSI touchscreen will do. It is deliberately modest
hardware: the whole point is a display that idles at a few watts. hardware: the whole point is a display that idles at a few watts.
+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 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. 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.
+6 -3
View File
@@ -1,8 +1,11 @@
# socktop-swipe v2 — release plan # socktop-swipe v2 — release plan
Status: **implemented**, 2026-09-09. Milestones 1-7 are done on branch `v2-rust`; Status: **implemented and in service**, 2026-09-09. Milestones 1-7 done on branch
milestone 8 (the Wyse 3040 validation) is the remaining acceptance gate. Where the `v2-rust` (PR #1); the LattePanda rack display has been running v2 since, and
built thing differs from this plan, `notes/DESIGN.md` is authoritative. passed a physical swipe test and a cold boot. Milestone 8, the Wyse 3040 install
following only the README, is the remaining acceptance gate.
Where the built thing differs from this plan, `notes/DESIGN.md` is authoritative.
v1 is three POSIX shell scripts driving lisgd and tmux. It works and is running on v1 is three POSIX shell scripts driving lisgd and tmux. It works and is running on
the rack display today, but it hard-codes a single linear carousel of socktop hosts, the rack display today, but it hard-codes a single linear carousel of socktop hosts,
+6 -7
View File
@@ -12,13 +12,12 @@
Build there: 108 s, peak 1.1 GB of 1.9 GB, 103 MB target dir. Build there: 108 s, peak 1.1 GB of 1.9 GB, 103 MB target dir.
- [ ] Remove the v1 leftovers in `/usr/local/bin` on the LattePanda -- needs root: - [ ] Remove the v1 leftovers in `/usr/local/bin` on the LattePanda -- needs root:
`sudo rm -f /usr/local/bin/socktop-rack /usr/local/bin/socktop-swipe /usr/local/bin/socktop-gestures /usr/local/etc/socktop-swipe.env` `sudo rm -f /usr/local/bin/socktop-rack /usr/local/bin/socktop-swipe /usr/local/bin/socktop-gestures /usr/local/etc/socktop-swipe.env`
- [ ] **Physically swipe-test the LattePanda.** Everything was verified over the - [x] **Physically swipe-tested 2026-09-09** -- and it found a real bug the unit
control socket; the evdev path itself has only unit tests. Nobody has put a tests could not: every swipe classified as up-to-down, because a contact's
finger on the panel against v2 yet. start position was captured from the X event alone and recorded Y as zero.
- [ ] **Cold-boot test the LattePanda.** lightdm autologin fires at seat start, so Fixed, with protocol-B decoding tests. QA passed on the retest.
an `i3-msg exit` drops to the greeter instead of restarting the session -- - [x] **Cold boot verified 2026-09-09.** Autologin, i3, and `socktop-swipe run`
it does not exercise the boot path, and on a keyboard-less wall display it all come up unattended.
strands the box. Test with a real reboot, not a logout.
- [ ] Add the tested-hardware table to the README once the Wyse is done. - [ ] Add the tested-hardware table to the README once the Wyse is done.
- [ ] Decide on the position indicator (`indicator: true`). Implemented; keep or - [ ] Decide on the position indicator (`indicator: true`). Implemented; keep or
cut based on whether it actually helps on the wall. cut based on whether it actually helps on the wall.