All checks were successful
Check / eval (push) Successful in 2m59s
Item 28 color-only accessibility sweep. Swept every Waybar status indicator for shape/glyph redundancy: all already carry non-color distinction (updates shows a count + self-hides; vpn/doctor/nightlight/ recording self-gate; battery/idle/muted are glyph-distinct) except the swaync notification module — its `inhibited-*` states reused the normal bells (/), so an app-inhibited (suppressed) state was distinguished from a normal one by color alone. Route every suppressed state (DND + inhibited) to the bell-off glyph + @muted, so "notifications are off right now" reads by SHAPE. Applied to the generated bar and all four whole-swaps (summer-day/night use their own bell-off glyph; executive-slate/boreal use ) — parity rule. Reuses the glyph DND already ships, so no new codepoint / tofu risk. Verified: V0 (flake check --no-build; 4 jsoncs valid JSON) + V1 (built homeConfigurations.nomarchy.activationPackage — the built config has inhibited-* = U+F009B and style.css routes .inhibited-* → @muted). V3 pending: live inhibited-state render with an app holding an inhibitor (HARDWARE-QUEUE). MEMORY gains the "status is never color-only" invariant. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
341 lines
22 KiB
Markdown
341 lines
22 KiB
Markdown
# Hardware queue — V3 checks only a human can run
|
||
|
||
Everything shipped at V1/V2 whose final verification needs real hardware.
|
||
Agents **append** (newest at the bottom of a section) with exact steps;
|
||
Bernardo runs them and either checks off (`[x]` + date + verdict) or files
|
||
the failure as a NOW bug in BACKLOG.md. Machines: the **AMD dev box**
|
||
(Ryzen AI laptop: AMD + fingerprint + NPU), the **Latitude 5410** (Intel
|
||
QA machine), the **T14s** (webcam case).
|
||
|
||
## Any machine (dev box is fine)
|
||
- [ ] **Battery charge limit re-apply on unplug** — `sudo nixos-rebuild
|
||
switch` with `power.batteryChargeLimit = 80`, physically unplug/replug
|
||
AC, confirm `charge_control_end_threshold` re-reads 80. (udev trigger
|
||
already VM-verified.)
|
||
- [ ] **SSH_AUTH_SOCK for GUI clients** — after relogin, launch a GUI git
|
||
client (or `rofi`-launched terminal-less app) and confirm it reaches
|
||
gpg-agent's SSH socket without an interactive shell parent.
|
||
- [ ] **Notification inhibited-state glyph** (item 28 color-only sweep,
|
||
iteration #69) — have an app hold a notification inhibitor (e.g. run
|
||
a fullscreen video, or `busctl --user call org.freedesktop.Notifications
|
||
… Inhibit`); the Waybar bell must switch to the muted **bell-off**
|
||
(same glyph as DND), NOT the normal bell /. Then release it → the
|
||
bell returns. Repeat on a whole-swap bar (summer-day/night use their
|
||
own bell-off glyph, executive-slate/boreal use ). The glyph itself
|
||
already renders (DND uses it); this only confirms swaync emits the
|
||
`inhibited-*` class and the bar routes it.
|
||
- [x] **Night-light full cycle** — first menu enable rebuilds + hyprsunset
|
||
starts; later toggles are instant (no rebuild); an *off* survives
|
||
reboot (ExecCondition); stopping hyprsunset restores gamma.
|
||
— 2026-07-04 Bernardo: PASS enable/disable on hardware
|
||
(off-survives-reboot + gamma-restore not explicitly checked).
|
||
- [x] **Auto-timezone** — enable from the menu; confirm geoclue finds the
|
||
zone, `/etc/localtime` updates, and the Waybar clock refreshes
|
||
(SIGUSR2 watcher) — also after a manual `timedatectl set-timezone`.
|
||
— 2026-07-04 Bernardo: PASS — enabled from the menu, `timedatectl`
|
||
shows Europe/London (the manual set-timezone re-trigger wasn't
|
||
exercised).
|
||
- [ ] **Keyboard layout cycle bind** — with a comma layout (e.g.
|
||
`nomarchy.keyboard.layout = "us,de"`), SUPER+SHIFT+K cycles the
|
||
focused keyboard's layout, the Waybar `` indicator follows, and
|
||
the row shows in the SUPER+? cheatsheet. — 2026-07-04 attempt:
|
||
no comma layout was configured, so the bind wasn't rendered (the
|
||
gate working as designed, not a failure) — retest after setting a
|
||
comma layout + rebuild + relogin. The SUPER+? no-op found en
|
||
route IS a real bug → BACKLOG item 26 (fix shipped — see the
|
||
dedicated SUPER+? entry below).
|
||
- [ ] **SUPER+? opens the cheatsheet** (item 32 re-fix — supersedes the
|
||
item 26 attempt) — the bind is now `$mod SHIFT, slash` (the BASE
|
||
keysym: Hyprland 0.55 resolves the sym with Shift consumed, so the
|
||
old `question` keysym never matched while Shift was down — same
|
||
pattern as the working `$mod SHIFT, 1` workspace binds). After
|
||
`home-update` + relogin (or `hyprctl reload`), SUPER+? must open the
|
||
keybindings cheatsheet, whose row still reads `SUPER + ?` (not
|
||
`SUPER + SHIFT + ?`).
|
||
- [ ] **swaync readable on summer-day** (item 25 fix) — on summer-day
|
||
after `home-update`: `notify-send "title" "body text"` shows
|
||
readable body text; open the control centre (SUPER+N), hover a
|
||
notification row and check the Clear button — all text legible
|
||
(body/buttons now @text on tinted chips, not subtext/surface).
|
||
- [ ] **Bar + rofi legible on flexoki-light** (item 27 fix) — switch to
|
||
flexoki-light: every Waybar module readable (window title, tray
|
||
row, dimmed inactive workspaces / muted volume visible-but-dim),
|
||
rofi inputbar/alternate rows show text. Spot-check one dark theme
|
||
(e.g. tokyo-night) for no visual regression in the same spots.
|
||
- [ ] **Stub-bar themes got the generated bar** (item 28, 90a5104) —
|
||
switch to catppuccin, lumon, nord and retro-82: each now shows
|
||
the generated styled bar in its own palette (workspace pill,
|
||
padded right cluster) instead of the old raw default Waybar.
|
||
Their rofi menus should look unchanged.
|
||
- [ ] **Back-audit spot-check** (item 24) — the keybinds cheatsheet
|
||
(SUPER+? / root menu › Keybindings) now ends in ↩ Back and
|
||
returns to the root picker; spot a couple of submenus (Display,
|
||
VPN › Tailscale) still Back correctly after the audit pass.
|
||
- [ ] **Network menu has no blank rows** (item 22 fix, needs Wi-Fi) —
|
||
after `home-update`, open Tools › Network: no empty separator
|
||
rows between the ethernet/wifi/VPN sections (compact = True).
|
||
KNOWN RESIDUAL: if exactly one nameless wifi row remains showing
|
||
only security+bars, that's a hidden-SSID AP — config can't filter
|
||
it; report it and the follow-up is a small source patch skipping
|
||
empty-name APs in create_ap_list.
|
||
- [ ] **Keyboard hotplug picker (re-verify after in-flake graduation)** —
|
||
plug an external keyboard post-login, pick a layout in rofi, confirm
|
||
it applies per-device only, persists in `settings.keyboard.devices`,
|
||
and graduates into a `device{}` block on the next rebuild.
|
||
- [x] **Snapshots restore/rollback** — ⚠ PRECONDITION: update to main ≥
|
||
a47aa3a and RELOGIN first (the polkit agent starts with the session).
|
||
Bernardo's 2026-07-04 Latitude findings 5/6 ("btrfs-assistant still
|
||
crashes", "menu snapshots shows nothing") match the PRE-fix behavior
|
||
exactly: no agent → pkexec fails silently (= menu does nothing), and
|
||
a direct unprivileged run crashes (= the libbtrfsutil bug). If either
|
||
still reproduces ON THE FIXED BUILD after relogin, reopen BACKLOG
|
||
item 4 as [stuck]. Then: `nomarchy-menu snapshot` now opens
|
||
the **btrfs-assistant GUI**: a *themed* polkit prompt must appear
|
||
(hyprpolkitagent — first on-hardware outing) and the GUI must open
|
||
as root. Also exercise the fzf fallback in a terminal
|
||
(`sudo nomarchy-snapshots`): browse/diff, restore a file
|
||
(`undochange`), and a root-config rollback behind the typed-`yes`
|
||
gate. Bonus check: any other pkexec flow now prompts instead of
|
||
silently failing. — 2026-07-04 Bernardo: PASS on the fixed build —
|
||
polkit prompt appears, GUI opens as root, fzf fallback works.
|
||
Restore/rollback not exercised → residual item below.
|
||
- [ ] **Snapshots restore + rollback exercise** (residual from the item
|
||
above — the GUI/polkit half passed 2026-07-04): in
|
||
`sudo nomarchy-snapshots`, restore a single file (`undochange`)
|
||
and walk a root-config rollback up to (or through) the
|
||
typed-`yes` gate.
|
||
- [ ] **Caffeine toggle (item 13 slice)** — click in the bar → turns
|
||
(warm tint on the generated bar) and hypridle must NOT lock /
|
||
blank while it's on (wait past the 5-min lock); click again
|
||
releases. Also present on both summer bars now.
|
||
- [ ] **Screen recording (item 12)** — Tools › Capture: Record region
|
||
(slurp) and Record screen produce a playable .mp4 in
|
||
~/Videos/Recordings; the red ⏺ REC appears in the bar instantly
|
||
and CLICKING IT stops + notifies the path; the + audio variants
|
||
carry sound. While recording, the Capture menu offers only
|
||
"■ Stop recording". On the AMD box wl-screenrec (VAAPI) should
|
||
do the work; if it dies at start the wf-recorder fallback kicks
|
||
in silently — check the notification says which. Summer bars
|
||
have the same ⏺ (parity).
|
||
- [ ] **Doctor (item 10)** — menu › System › Doctor opens the sheet in
|
||
a terminal; `nomarchy-doctor` over SSH shows the same minus user
|
||
units. On a healthy machine everything is ✔/– (dev-box run
|
||
2026-07-04 correctly flagged a genuinely failed user unit).
|
||
- [ ] **Rollback menu (item 9b)** — after a couple of theme changes,
|
||
menu › System › Rollback: recent desktop generations listed
|
||
(newest marked current); picking an older one opens a terminal,
|
||
activates it, and the theme visibly reverts; picking the newer one
|
||
again rolls forward. The two System rows: Snapshots opens the
|
||
snapshot flow, "boot an older generation (how)" fires an
|
||
instruction notification.
|
||
- [ ] **Open-a-file smoke (viewers + mime defaults, item 8)** — after
|
||
`home-update`: from yazi/Thunar, open a PDF (→ zathura, themed to
|
||
the palette), an image (→ imv, NOT GIMP), a video (→ mpv);
|
||
`xdg-open .` on a directory → Thunar. With no browser installed,
|
||
clicking a link must still fall through to *something sane* (the
|
||
firefox.desktop entries are inert); if you've uncommented a
|
||
browser, links go there.
|
||
- [ ] **Update awareness** — with `nomarchy.updates.enable`, let the timer
|
||
fire (or start the unit): indicator appears only when inputs are
|
||
behind, notification only on count growth, click opens the upgrade
|
||
flow.
|
||
- [ ] **VPN menu live paths** — import a real WireGuard `.conf` and an
|
||
`.ovpn` via System → VPN, toggle up/down (● / ○ state), and the
|
||
Tailscale block: up/down + exit-node without sudo (operator grant).
|
||
- [ ] **Printer menu** — with `nomarchy.services.printing`, System →
|
||
Printers opens system-config-printer; add a printer, test page.
|
||
- [ ] **GRUB UEFI ISO theme render** — boot the ISO on UEFI hardware:
|
||
composed splash background, palette menu in the lower third, accent
|
||
timeout bar.
|
||
- [ ] **Visual theme pass** — live ISO: all six identity themes (bars) +
|
||
the four authored rofi `.rasi` (nord/retro-82/lumon/kanagawa) look
|
||
right, not just parse.
|
||
- [x] **Auto-commit on a real machine** — System › Auto-commit toggles on
|
||
(row shows state, notification fires); a theme apply from SUPER+T then
|
||
shows a `nomarchy: apply theme …` commit in `~/.nomarchy` (`git log`);
|
||
unrelated dirty files in the checkout stay uncommitted; toggle off is
|
||
itself the last commit. Also: the "Auto timezone (on/off)" row label
|
||
now reflects the real state (the `= true` comparison fix).
|
||
— 2026-07-04 Bernardo: PASS — theme changes committed and the
|
||
toggle self-committed.
|
||
- [ ] **Display profiles, slice a (item 15)** — declare two
|
||
`nomarchy.displayProfiles` (e.g. docked disables eDP-1 + arranges
|
||
the externals; undocked re-enables it), `home-update`, then:
|
||
System › Display › Profiles lists them (● marks active); applying
|
||
is instant (no rebuild) and survives a relogin (the baked
|
||
overlay); "Base layout" restores; a menu resolution pick made
|
||
earlier must NOT re-enable a profile-disabled panel after the
|
||
next rebuild.
|
||
- [ ] **Display profiles workspace pins, slice c (item 15)** — give the
|
||
docked profile `workspaces = { "1" = "<ext>"; "9" = "eDP-1"; }`:
|
||
applying the profile moves open workspaces 1/9 to those outputs
|
||
immediately, new visits land there too, and the pins survive a
|
||
relogin (baked `workspace` rules). Switching to a profile without
|
||
pins leaves workspaces where they are (stale session pins are
|
||
expected until reload/rebuild — noted in the applier).
|
||
- [ ] **Display profiles auto-switch, slice b (item 15)** — same setup,
|
||
then menu › Profiles › Auto-switch on: plugging the dock/monitor
|
||
applies the matching profile within ~3s (toast names it);
|
||
unplugging switches back; Auto-switch off stops that; with two
|
||
profiles naming the same outputs, no flapping (ties do nothing).
|
||
- [ ] **P2 retunes eyeball (item 28b)** — spot-check on top of the P1
|
||
entry below: gruvbox/nord/lumon/everforest/retro-82/white dimmed
|
||
text (inactive workspaces, muted volume) now visible-but-dim;
|
||
latte + rose-pine(dawn) + summer-day warn/battery tint reads on
|
||
the light bases; flexoki-light statuses are the deeper canonical
|
||
600s; latte selected-row/alt-accent pink darker. Anything that
|
||
lost its "dim" feel → reopen 28b.
|
||
- [ ] **Retuned palettes eyeball (item 28b P1)** — switch through
|
||
summer-day, flexoki-light, kanagawa, miasma: chips/menus/toasts
|
||
now draw on a *raised* surface (summer-day's was slate-on-cream,
|
||
kanagawa's near-black, miasma's pure black), secondary text
|
||
(tooltips, fastfetch labels) is visible on summer-day +
|
||
flexoki-light, kanagawa floats are lighter than the bg (upstream
|
||
sumiInk4). Anything that reads worse than before → reopen 28b.
|
||
- [ ] **Clock zone tooltip (LATER item)** — hover the bar clock: the
|
||
tooltip's first line shows the zone ("BST (UTC+0100)") above the
|
||
calendar, on the generated AND summer bars; with auto-timezone
|
||
on, a zone change updates it (the SIGUSR2 reload).
|
||
- [ ] **Doctor bar tripwire (LATER item)** — with everything healthy
|
||
the bar shows nothing; `systemctl --user start doomed`-style
|
||
induced failure → within ~5 min a red appears (tooltip lists
|
||
the ✖ lines), clicking opens the sheet in a terminal;
|
||
reset-failed → it disappears on the next poll. Also visible on
|
||
both summer bars.
|
||
- [ ] **OCR region (LATER item)** — Tools › Capture › "OCR region →
|
||
clipboard": select a region with visible text → toast reports
|
||
the word count and `wl-paste` yields the text; Esc in slurp
|
||
cancels silently; a text-free region toasts "No text recognized"
|
||
without clobbering the clipboard.
|
||
- [ ] **Look & Feel submenu (item 19)** — root menu: "Look & Feel"
|
||
(replacing Theme, root still six rows) → Theme grid opens, Next
|
||
wallpaper cycles instantly, Night light toggles (and is GONE
|
||
from System). SUPER+T / SUPER+SHIFT+T direct binds unchanged.
|
||
- [ ] **Launch-or-focus (item 17)** — uncomment the template's
|
||
`nomarchy.launchOrFocus` firefox example (with firefox
|
||
installed), `home-update` + reload: SUPER+B launches firefox
|
||
when closed, FOCUSES the existing window when open (also from
|
||
another workspace); with firefox removed the bind fires a
|
||
"not installed" toast; the row shows under SUPER+?.
|
||
- [ ] **Themed greeter + console (item 16)** — after `sys-rebuild` +
|
||
logout: tuigreet renders in theme colors (dark container, accent
|
||
border, themed prompt/time) and a raw tty (CTRL+ALT+F2) shows the
|
||
theme's ANSI palette; on a LUKS machine the passphrase prompt
|
||
follows too. Then switch theme + `sys-rebuild` + logout → the
|
||
greeter follows the new palette. (tuigreet can't run under the
|
||
VM harness — see MEMORY.md — so rendering is hardware-tier.)
|
||
- [ ] **Color picker (item 13, final slice)** — SUPER+CTRL+P (or Tools ›
|
||
Color picker): hyprpicker's zoom loupe appears; click a pixel →
|
||
toast shows the hex and `wl-paste` yields it; Esc cancels with no
|
||
toast. Row present in the SUPER+? cheatsheet.
|
||
- [ ] **Low-battery toasts (item 13 slice)** — on battery, drain past
|
||
25%: one "Battery low" toast; past 10%: a critical "Battery
|
||
critical" toast that stays up until dismissed (swaync); plug in,
|
||
drain again → it re-notifies; no repeat toasts while it just keeps
|
||
draining. (Crossing logic VM-verified — this checks the real
|
||
swaync rendering in a session.)
|
||
|
||
- [ ] **Battery charge-limit toggle** (iteration #55) — control-center
|
||
(menu › System › Control Center › System Toggles › Battery Limit):
|
||
the preset picker (Off / 80% / 90% / 60% / Custom…) writes the value
|
||
(`nomarchy-theme-sync get settings.power.batteryChargeLimit` reflects
|
||
the pick); after a `sys-rebuild` the sysfs
|
||
`charge_control_end_threshold` reads it. (UX-only over the already
|
||
VM-verified writer — a session sanity pass, not a deep check.)
|
||
- [ ] **Waybar hides under fullscreen video** (item 30) — after
|
||
`home-update` + relogin, put a browser video (YouTube) into
|
||
fullscreen (F): the bar is now *covered* by the video, not drawn
|
||
on top; exit fullscreen → the bar returns. Normal tiling
|
||
unchanged (the bar still reserves its space). Accepted trade-off
|
||
of `layer: bottom`: a floating window dragged over the top strip
|
||
can now overlap the bar — confirm that's the only regression.
|
||
- [ ] **Battery limit in rofi System** (iteration #64, item 36a) — after
|
||
`home-update`: menu › System shows a "Battery limit" row (this laptop
|
||
exposes the threshold node); picking a preset (80/90/60/Off/Custom)
|
||
writes it (`nomarchy-theme-sync get settings.power.batteryChargeLimit`
|
||
reflects the pick) and after a `sys-rebuild` the sysfs
|
||
`charge_control_end_threshold` matches. The gum control-center no
|
||
longer lists Battery Limit (moved, not duplicated).
|
||
- [ ] **Config dialogs float** (iteration #63, item 41 cut) — after
|
||
`home-update` + relogin: open Bluetooth (blueman-manager) and, if
|
||
printing is on, System ▸ Printers (system-config-printer) — each
|
||
opens floating + centered, not tiled. If either still tiles, run
|
||
`hyprctl clients` while it's open, read the real `class`, and fix the
|
||
regex. While there, capture the polkit prompt's and a GTK file
|
||
dialog's class for the next 41 slice.
|
||
- [ ] **Right-click volume → floating mixer** (iteration #62, item 35) —
|
||
after `home-update` + relogin: right-click the Waybar volume module
|
||
opens pwvucontrol as a floating, centered window (not tiled);
|
||
left-click still mutes. Verify across a whole-swap theme too
|
||
(summer/boreal/executive-slate) since the jsoncs got the same wiring.
|
||
- [ ] **Window focus on arrows** (iteration #61) — after `home-update` +
|
||
relogin: SUPER+←/→/↑/↓ move focus between tiled windows; SUPER+H/J/K/L
|
||
no longer move focus; SUPER+? cheatsheet shows the arrow glyphs.
|
||
- [ ] **Audio opens in Amberol** (iteration #60, item 37) — after
|
||
`home-update`: double-click an mp3/flac/ogg (or `xdg-open song.mp3`)
|
||
→ it opens in Amberol, not mpv; video files still open in mpv.
|
||
(`xdg-mime query default audio/mpeg` → io.bassi.Amberol.desktop.)
|
||
- [ ] **Capture-to-file keybinds** (iteration #59, item 38) — after
|
||
`home-update` + relogin: SHIFT+Print prompts a region select then
|
||
saves a PNG under ~/Pictures/Screenshots (toast shows the path);
|
||
CTRL+Print saves the whole screen the same way; bare Print still
|
||
copies a region to the clipboard. Both new rows appear in SUPER+?.
|
||
Also (iteration #66): Tools ▸ Capture now shows the matching dim key
|
||
hint on the Region → clipboard / Region → file / Full screen → file
|
||
rows (Print / SHIFT + Print / CTRL + Print) — pango renders, no raw
|
||
`<span>` leaks.
|
||
- [ ] **rofi menu polish** (iteration #58, item 39 + #56/#57 34/40) —
|
||
after `home-update`: (a) menu › System › Power profile shows a
|
||
colored icon per profile (performance/balanced/power-saver), not
|
||
just text — icons *render* (not blank); (b) every submenu's ↩ Back
|
||
shows a single arrow, no double; (c) on this single-monitor box,
|
||
System › Display → pick a resolution → Back returns to System
|
||
(not back into the same resolution list).
|
||
- [ ] **Combined power menu** (iteration #67, item 36b) — after
|
||
`home-update` + relogin: clicking EITHER the Waybar battery icon OR
|
||
the power-profile icon opens one "Power" menu listing Profile: rows
|
||
+ Charge limit: rows; picking a profile calls `powerprofilesctl set`
|
||
(verify `powerprofilesctl get` changes), picking a charge preset
|
||
writes `settings.power.batteryChargeLimit` (applies next rebuild).
|
||
The prompt shows the current profile + limit. System ▸ Power profile
|
||
/ Battery limit still work directly; the whole-swap bars (summer-day/
|
||
night, executive-slate, boreal) behave the same and their shutdown
|
||
power-button (if present) still opens the lock/logout menu.
|
||
|
||
- [ ] **Calendar on the clock click** (iteration #68, item 42) — after
|
||
`home-update` + relogin: left-click the Waybar date/clock → calcurse
|
||
opens in a **floating, centered** ghostty window (~60×65% of screen),
|
||
showing the month calendar; closing calcurse (`q`) closes the window.
|
||
The `--class=com.nomarchy.calendar` must match the windowrule (if it
|
||
tiles, run `hyprctl clients` while open and check the real app-id).
|
||
Hover the clock → tooltip shows the long date + zone + month grid.
|
||
Same on a whole-swap bar (summer/boreal/executive-slate). If calcurse
|
||
was removed from home.packages, the click toasts "calcurse isn't
|
||
installed" instead of doing nothing.
|
||
|
||
## AMD dev box only
|
||
- [ ] **AMD runtime bits** — VA-API (`vainfo` → radeonsi), amd-pstate EPP
|
||
active and PPD switching governors; opt-ins: ROCm (`rocminfo`, a GPU
|
||
PyTorch/Ollama smoke) and the XDNA NPU driver loading.
|
||
- [ ] **Fingerprint** — `fprintd-enroll` + (opt-in PAM) login/sudo.
|
||
|
||
## Latitude 5410 only
|
||
- [x] **Waybar theme-switch resilience** (finding #1 re-test, needs main ≥
|
||
the supervisor commit + relogin) — switch themes repeatedly (incl.
|
||
summer-day/night whole-swaps): the bar restarts cleanly each time;
|
||
if anything kills it, it's back within ~a second. `pgrep -f
|
||
nomarchy-waybar` shows the supervisor. — 2026-07-04 Bernardo:
|
||
PASS — theme switches clean; pkill respawn so fast the bar never
|
||
visibly disappears.
|
||
- [x] **Media keys + gestures** (from dccceb4) — volume/brightness keys
|
||
drive the OSD; touchpad gestures work. — 2026-07-04 Bernardo:
|
||
PASS, volume/brightness keys and touchpad gestures all working.
|
||
- [ ] **v1 QA batch on-hardware pass** (583708d batch was QEMU-verified) —
|
||
general smoke before the next `main → v1` promotion.
|
||
|
||
## T14s only
|
||
- [ ] **Webcam IR-hide end-to-end on Nomarchy** — installer detects the
|
||
RGB+IR pair, bakes `hardware.camera.hideIrSensor`; `wpctl status`
|
||
shows one colour source; an app picker lists one camera; Howdy-style
|
||
direct `/dev/video2` reads still work.
|