Files
Nomarchy/agent/HARDWARE-QUEUE.md
Bernardo Magri 60c6f14c08
All checks were successful
Check / eval (push) Successful in 2m54s
feat(rofi): battery charge-limit toggle in the System menu
Add a `batterylimit` nomarchy-menu subcommand — a preset picker
(80/90/60/Off/Custom…) that writes settings.power.batteryChargeLimit via
theme-sync (--no-switch; lands on the next sys-rebuild, power.nix's oneshot
applies it). Surfaced as a first-class System row, self-gated on the
charge_control_end_threshold sysfs node like Power profile.

Moved out of the gum control-center (removed its Battery Limit case +
choose entry) so the toggle lives in one place — the rofi menu Bernardo
actually uses, per his request.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-07 22:50:26 +01:00

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

  • 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 26 fix) — 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+?.

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

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.