Files
Nomarchy/agent/HARDWARE-QUEUE.md
Bernardo Magri 1d8c1a4314
All checks were successful
Check / eval (push) Successful in 3m1s
feat(home): add satty for screenshot annotation
Added satty (Wayland-native screenshot annotation tool) and integrated it with the Capture flow.
Wired `$mod SHIFT, Print` to slurp a region and open satty.
Added "Annotate region" to the rofi Capture menu (Tools > Capture).
Added satty's configuration via home-manager to inject the active theme's palette colors into its UI.

Verified: V1 (flake check --no-build, home activation package build).
Pending: V3 hardware/visual check for the satty UI (queued in HARDWARE-QUEUE.md).
2026-07-08 21:49:06 +01:00

22 KiB
Raw Blame History

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 unplugsudo 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.

  • 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).

  • 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.

  • 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.

  • 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.

  • Screenshot annotation (satty) (iteration #73) — after home-update: hit SUPER+SHIFT+Print (or Tools ▸ Capture ▸ Annotate region) → a region select (slurp) appears, then the satty UI opens in fullscreen with the screenshot loaded. Check that the UI draws on the current theme palette (tools colored properly) and hitting save places the screenshot in ~/Pictures/Screenshots/ while hitting copy places it in the clipboard.

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.
  • Fingerprintfprintd-enroll + (opt-in PAM) login/sudo.

Latitude 5410 only

  • 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.
  • 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.