Files
Nomarchy/agent/JOURNAL.md
Bernardo Magri 523e44bbf8
Some checks failed
Check / eval (push) Has been cancelled
docs(hardware): install-tested hall of fame (#85)
HARDWARE.md §9 lists T14s Gen 4 + Latitude 5410/5310 with DMI/profile
notes and a "send your DMI line" PR invite. Split dock life #84 into
#86 clamshell + #87 dock audio (stable new IDs).

Verified: V0 (docs/backlog only).
2026-07-11 10:28:52 +01:00

38 KiB
Raw Blame History

Journal — append-only iteration log

One entry per iteration, newest first. This is the loop's short-term memory: the next session reads the last 35 entries to orient. Keep an entry under ~15 lines; durable lessons go to MEMORY.md, not here. When this file grows past ~25 entries, rotate the tail to JOURNAL-ARCHIVE.md (history, never edited).

Template:

## YYYY-MM-DD — <task title> (<commit sha, or "no commit">)
- **Task:** which BACKLOG item (or QA sweep / bootstrap / escalation)
- **Did:** what changed, in 24 lines
- **Verified:** tier reached (V0/V1/V2) + the actual commands/checks run
- **Pending:** V3 queued? follow-ups filed? anything [stuck]?
- **Next suggestion:** what the following iteration should probably take

2026-07-11 — #85 hardware hall of fame + split #84

  • Task: NEXT #85 docs hall of fame; #84 was [big] → split.
  • Did: HARDWARE.md §9 install-tested table (T14s Gen 4 AMD, Latitude 5410/5310) + DMI PR invite; renumbered following sections. #84 → #86 clamshell + #87 dock audio. VISION/ROADMAP; closed #85.
  • Verified: V0 (docs only).
  • Pending:
  • Next suggestion: #86 clamshell or #87 dock audio (both product).

2026-07-11 — #83 doctor first-boot pre-activate flag

  • Task: NEXT #83 — doctor points at failed installer HM pre-activate.
  • Did: doctor row: if /var/log/nomarchy-hm-preactivate.log is present and no Home Manager generation exists → ✖ + home-manager switch --flake ~/.nomarchy -b bak. Skip/ok otherwise. Extended checks.doctor (fail arm + recovered gen). Closed #83.
  • Verified: V2 — checks.doctor green (fail arm + recovered gen); local smoke with NOMARCHY_HM_PREACTIVATE_LOG / empty HOME.
  • Pending:
  • Next suggestion: #85 docs hall of fame (cheap) or split #84 dock.

2026-07-11 — #82 generation readability

  • Task: NEXT #82 — plain-language “what changed last rebuild”.
  • Did: pkgs/nomarchy-what-changed (nvd → “N added, M removed, K updated”); wired into lifecycle post-nomarchy-rebuild / nomarchy-home (full nvd + notify toast); System What changed? (toast + floating full report). checks.what-changed with NOMARCHY_NVD fixture. Closed #82.
  • Verified: V2 — checks.what-changed green; local smoke on real HM gens (“Desktop: 1 added, 1 removed”) + fixture counts.
  • Pending:
  • Next suggestion: #83 doctor pre-activate fail flag or #85 docs.

2026-07-11 — #81 first-boot welcome toast

  • Task: NEXT #81 — dismissible “you're set” card (VISION § B).
  • Did: pkgs/nomarchy-first-boot + user oneshot (modules/home/first-boot.nix): notify once with SUPER+M/T/? + Network
    • Doctor pointers; marker settings.firstBootShown via theme-sync --no-switch (in-checkout state). Skip live hostname. Option nomarchy.firstBootWelcome.enable (default on). checks.first-boot. ROADMAP/VISION/README; closed #81.
  • Verified: V2nix flake check --no-build; checks.first-boot green (toast + marker + silent re-run + live skip); local shim smoke; downstream-template-home carries the user unit.
  • Pending: V3 — real swaync rendering on first installed login (toast body is pure text; not queued unless it misbehaves).
  • Next suggestion: #82 generation readability or #85 docs hall of fame.

2026-07-11 — #80 doctor battery health readout

  • Task: NEXT #80 — battery health in nomarchy-doctor (VISION § C).
  • Did: Doctor row: cycle_count + retained capacity (charge_full/design or energy_*) as % of design; system batteries only; soft warn <70% design; skip when attrs absent. NOMARCHY_POWER_SUPPLY_ROOT for the VM fixture. Extended checks.doctor (fake BAT0 + Device-scope MOUSE0 ignore). HARDWARE §10, ROADMAP ✓, VISION ✓; closed #80.
  • Verified: V2nix flake check --no-build; checks.doctor green; local smoke on real BAT0 (342 cycles, 81% via energy_*) + fixture.
  • Pending: Power-menu surface left optional/out of scope (doctor is the product surface for report-only health).
  • Next suggestion: #81 first-boot welcome card (highest product ROI) or #85 docs-only hall of fame.

2026-07-11 — Triage: VISION-gap PROPOSED → NEXT #80#85 (Bernardo)

  • Task: Bernardo promoted five of the six fresh VISION-gap pitches (all but the wallpapers split, which stays LATER).
  • Did: NEXT gains #80 battery health readout, #81 first-boot welcome card, #82 generation readability, #83 doctor pre-activate fail flag, #84 dock life polish [big], #85 hardware hall of fame. PROPOSED placeholder left. No implementation started (explicit instruction).
  • Verified: V0 (backlog only).
  • Pending:
  • Next suggestion: #80 (smallest) or #81 (highest product ROI); #84 must be split first.

2026-07-11 — Quick wins: exit-node locations + geo tooltip

  • Task: BACKLOG LATER "VPN exit-node richer display" + a geo-mode tooltip nit from the previous iteration (human asked for quick wins).
  • Did: Tailscale Exit node picker rows now "hostname — Country City", sliced by the header's fixed-width column offsets (COUNTRY/CITY are multi-word; never field-split), locationless nodes stay bare, pick strips back to hostname at the first space. Nightlight Waybar tooltip says "follows your location" in geo mode. Queue's VPN entry updated.
  • Verified: V1 — awk proven against a fabricated 3-case fixture (Mullvad 1-word + multi-word city + bare node); flake check exit 0; downstream-template-home builds (writeShellScriptBin syntax-gates both scripts). Real tailscale output is V3 (existing VPN queue entry).
  • Pending: V3 VPN menu live paths (extended, not new).
  • Next suggestion: wallpapers artifact split (LATER, decided).

2026-07-11 — Night-light geo mode (lat/long → wlsunset)

  • Task: BACKLOG LATER "Night-light geo mode" (human-picked).
  • Did: nomarchy.nightlight.latitude/.longitude (both set = geo mode): services.wlsunset (location-computed sunrise/sunset, .temperature → night temp) replaces hyprsunset; the toggle script's unit= and the live-state ExecCondition follow via one unit let-binding. Template example lines, README row, ROADMAP ✓. New checks.nightlight-geo: pure-eval asserts on the rendered units (coords + temp in ExecStart, ExecCondition present, hyprsunset off). Declarative-only (no menu writer — coords are machine config like keyboard layout).
  • Verified: V1 — nix flake check --no-build exit 0 (evals the new asserts + option-docs); built downstream-template-home (default hyprsunset path unregressed) + the check drv. Caught en route: HM renders ExecStart as a list (toString needed in eval asserts).
  • Pending: V3 queued (HARDWARE-QUEUE § Any machine): visible warm shift at location night + toggle/persistence on the swapped unit.
  • Next suggestion: wallpapers artifact split (LATER, decided).

2026-07-11 — Sync-sweep rule + grooming + zram user docs (human-requested)

  • Task: Bernardo: groom stale items and codify the check so they don't recur; close the zram user-doc gap.
  • Did: LOOP.md §5 gains step 4 Sync sweep (grep item/feature across agent/+docs/ on ship; prune recorded [x] queue entries) + an AGENTS.md rule line. Applied it: BACKLOG PROPOSED pruned (auto-theme pitch was stale — shipped as #79; shipped/promoted placeholders removed; v1.0 pointer rewritten; FUTURE promoted-stub dropped). HARDWARE-QUEUE pruned 29 checked [x] entries (363→~250 lines), dangling refs reworded, prune rule in header. README §3 now documents the zram default + hibernation out-of-the-box + MIGRATION pointer.
  • Verified: V0 (docs/meta only) — grep sweep for dangling refs clean.
  • Pending: night-light geo mode next (same session).
  • Next suggestion: wallpapers artifact split (LATER, decided).

2026-07-11 — Vendor-neutral agent docs restructure (human-requested)

  • Task: Bernardo: de-vendor the agent instructions (multi-model repo), clean stale files, better docs/agent/.claude structure.
  • Did: New root AGENTS.md entry (CLAUDE.md → symlink). Skill bodies moved to agent/: VERIFICATION.md (enforcement, ex-nomarchy skill), DELEGATION.md (tiers light/standard/frontier + scout/runner contracts + fan-out; consolidates CLAUDE.md table + LOOP §economy + skill §6.5), THEME-DESIGN.md (ex-theme skill, now with frontmatterd shim). .claude/ is a thin adapter (shims route into agent/). Maps updated (agent/, docs/, README tree). Stale: .gitignore old_distro entry dropped; local result*/pycache removed. JOURNAL rotated (29 kept, 120 → JOURNAL-ARCHIVE.md).
  • Verified: V0 — nix flake check --no-build exit 0 with the symlink tracked; vendor-name grep clean outside DELEGATION's mapping table.
  • Pending: nothing; other harnesses add their own adapter row when used.
  • Next suggestion: #76/#79 remain [blocked:hw]; otherwise groom PROPOSED.

2026-07-11 — #76 checks.hibernate-swapfile (VM-verify the swapfile+offset)

  • Task: Bernardo — push #76's swapfile-resume residual into a VM (like the auto-theme sunset trick).
  • Did: Tried a full runtime-swapfile hibernate→resume test; it hit a bounded, definitive CanHibernate=no — systemd won't hibernate to a swap that isn't declared in the boot config, and a runtime-computed resume_offset can't reach the boot cmdline (the genuine chicken-and-egg). First cut also had an unbounded wait_for_shutdown that hung → killed it, bounded the wait in a thread (180s) + a CanHibernate pre-check, which is what surfaced the clean verdict. Pivoted checks.hibernate-swapfile to what a VM can prove deterministically and the partition test can't: the installer swapfile build + offset — NOCOW mkswapfile, file-type swapon, valid map-swapfile -r offset accepted by /sys/power/resume_offset, zram above it. (Device fix: /dev/vdb once useNixStoreImage was dropped.)
  • Verified: V2 PASS (fresh build, exit 0). BACKLOG/ROADMAP updated; #76 residual narrowed to the literal encrypted power-cycle (dev box runs it).
  • Lesson: the sunset-trick spirit applies but not always the full cycle — when systemd/kernel gates the behaviour (CanHibernate), verify the construction deterministically and leave only the physical cycle to HW. Always bound wait_for_shutdown (no timeout param → thread + join).
  • Next suggestion: #76/#79 both [blocked:hw]; QA / PROPOSED otherwise.

2026-07-11 — Code-review fixes (parallel review of the session batch)

  • Task: Bernardo asked for parallel work; spawned a fresh-eyes opus review of 2055842..HEAD (static). It found the batch sound — 2 real LOW edge bugs, 1 false positive, 1 cosmetic.
  • Did: (1) cmd_auto — inverted sunrise/sunset (sunrise > sunset) went perpetually day; replaced the not between shortcut with a real wrap-around mins >= sunrise or mins < sunset, so a cross-midnight day window switches both ways. (2) rofi.nix autotheme HH:MM guard tightened [0-2][0-9][01][0-9]|2[0-3] so 2429 are rejected. Dismissed the breeze finding (papirus DOES ship breeze/breeze-dark — verified) and the cosmetic doctor-RAM one.
  • Verified: py_compile; boundary truth-table (normal + wrap-around); HH:MM case table (23:00/19:59/20:00 accept, 24/25/30:00 reject); auto --which normal-case unchanged; menu bash -n; flake check green. Normal case unchanged so checks.auto-theme still holds.
  • Pending: hibernate-swapfile VM test still running (uncommitted flake.nix).
  • Next suggestion: land hibernate-swapfile once its VM test returns.

2026-07-10 — #79 V2: checks.auto-theme (simulated sunset) — was mis-framed V3

  • Task: Bernardo challenged the "V3 real-session" framing — a simulated sunset IS VM-testable. He's right; I'd conflated "needs a real desktop" with "needs the generic home-manager switch."
  • Did: Added checks.auto-theme runNixOSTest: installs nomarchy-theme-sync, points NOMARCHY_DEFAULT_THEMES at presets, stubs the switch via NOMARCHY_REBUILD (a marker), configures the pair+schedule, then walks the VM clock 19:55→20:05→20:06→next-day 07:30 asserting slug goes summer-day → night (1 rebuild) → night (idempotent, still 1) → day (2). The self-gating I relied on: presets via env, wallpaper/notify no-op headless, run_switch honors NOMARCHY_REBUILD + waybar nudge is check=False.
  • Verified: V2 PASSnix build .#checks…auto-theme fresh, exit 0. Dropped #79's [blocked:hw]; it's done (V2). Updated ROADMAP.
  • Lesson: don't default "timer/session feature" to V3 — stub only the generic step (the real HM switch, covered elsewhere) and simulate the rest (clock) headlessly. Only the literal timer-fires-on-OnCalendar is on-HW, and its schedule is systemd-analyze-validated.
  • Next suggestion: NEXT head #76 [blocked:hw]; else QA / PROPOSED.

2026-07-10 — #79 slice 3: Look & Feel Auto theme menu (#79 complete)

  • Task: BACKLOG #79 slice 3 — the menu; completes the feature.
  • Did: rofi.nix — "Auto theme (on/off)" row in Look & Feel + an autotheme) submenu: toggle, pick day/night (from nomarchy-theme-sync list), set sunrise/sunset (HH:MM input, validated). Enable writes the flag + defaults the summer pair --no-switch, then exec auto --force — one rebuild installs the timer AND applies the right theme. Disable is instant --no-switch (auto self-gates; the lingering timer no-ops). Day/night/times are live --no-switch.
  • Verified: V1 — HM generation builds (writeShellScriptBin bash -n on nomarchy-menu passes) + bash -n on the built menu. Logic test (stubbed rofi/theme-sync/notify): selecting "Auto theme (off)" runs exactly set day summer-day, set night summer-night, set enable true (all --no-switch), then auto --force — the intended one-rebuild path. Disable path is static-clear (set false --no-switch, no auto); a stateful-stub dynamic test would loop (stub doesn't reflect the flip). V0 flake check green. #79 collapsed to [blocked:hw] (all 3 slices done; only live-session switch remains, needs a Nomarchy machine).
  • Pending: V3 real-session (timer switches day↔night across sunset).
  • Next suggestion: NEXT head #76/#79 both [blocked:hw]; QA/PROPOSED.

2026-07-10 — #79 slice 2: auto-theme systemd timer

  • Task: BACKLOG #79 slice 2 — the timer/hook.
  • Did: modules/home/autotheme.nix (imported in home default.nix): systemd.user.{service,timer}.nomarchy-auto-theme, install gated on config.nomarchy.settings.autoTheme.enable or false (state-driven, like updates.nix gates on its enable). Service runs nomarchy-theme-sync auto with a PATH for home-manager; timer OnStartupSec=1min + OnCalendar=*:0/15 + Persistent. Chose periodic over exact sunrise/sunset timers — robust to suspend/DST, and auto is idempotent so ticks are cheap (rebuild only at the transition).
  • Verified: V1 — real-config eval (state temp-enabled, restored): settings.autoTheme.enable→true, timer OnCalendar=*:0/15, service ExecStart=… nomarchy-theme-sync auto; disabled→no units (isolation eval condition=false). systemd-analyze calendar '*:0/15' valid. V0 flake check green. (Gotcha: a new .nix file is invisible to the flake until git add — flake eval only sees tracked files.)
  • Pending: live timer→home-manager switch on a real Nomarchy session (needs a Nomarchy machine, like #76). Slice 3 (menu) next.
  • Next suggestion: #79 slice 3 — Look & Feel Auto theme menu.

2026-07-10 — #79 slice 1: auto time-of-day theme CLI primitive

  • Task: Split BACKLOG #79 (VISION § D, [big]) into 3 slices (CLI / timer / menu); took slice 1.
  • Did: nomarchy-theme-sync auto — reads settings.autoTheme.{enable,day,night,sunrise,sunset}, computes day/night by the local clock, and applies the matching preset only if different (idempotent → the slice-2 timer won't rebuild needlessly). --which prints the decision without switching; --force/--no-switch too. Factored cmd_apply's core into apply_named so auto reuses the exact same one engine (GOALS: no second pipeline).
  • Verified: V1 package builds; functional tests on the built bin against scratch state: wide-day→day slug, 00:0000:01 window→night, disabled→no-op, missing day/night→die, auto --no-switch writes state, re-run→"already on" no-op, plain apply still writes (refactor intact). V0 py_compile + flake check + checks.theme-sync-validate green.
  • Pending: slices 2 (systemd sunrise/sunset timers + login apply, V2) and 3 (Look & Feel menu) remain under #79.
  • Next suggestion: #79 slice 2 — the timer/hook (V2 runNixOSTest).

2026-07-10 — #78 Omarchy migrant doc (docs/OMARCHY.md)

  • Task: BACKLOG #78 (promoted from PROPOSED) — Omarchy→Nomarchy one-pager (VISION § F).
  • Did: New docs/OMARCHY.md: leads with the config-model shift (imperative dotfiles → declarative flake + menu, rollback via generations), then install (ISO/nomarchy-install or MIGRATION.md), a familiar-bindings table, theming (SUPER+T/nomarchy-theme-sync), packages (home.packages / nix shell, no AUR), update+rollback (nomarchy-pull/-rebuild/-home, boot-menu generations, nomarchy-doctor). Added to docs/README.md map + VISION § F ✓.
  • Verified: V0 (docs). Grounded Nomarchy side in code: pulled real binds from keybinds.nix; confirmed all 7 cited commands, the nsearch alias, and the named slugs (gruvbox/rose-pine/nord) exist. Kept Omarchy-side claims to known facts (Arch, dotfiles, pacman/AUR).
  • Pending: none.
  • Next suggestion: NEXT head #76 [blocked:hw]; last open PROPOSED is auto time-of-day theme pair (§D, [big] — needs splitting).

2026-07-10 — #77 doctor hibernate/sleep section (V2 PASS)

  • Task: BACKLOG #77 (promoted from PROPOSED by Bernardo) — read-only hibernate section in nomarchy-doctor (VISION § C, #76 follow-on).
  • Did: Added a hibernate/sleep row group to nomarchy-doctor.sh: resume device on cmdline (+ resume_offset for a swapfile), disk swap ≥ RAM, zram active, previous-boot suspend/hibernate error. Self-gates (skip on swap=0); only ok/warn/skip → never fails the sheet. Added hibernate to the checks.doctor probe list.
  • Verified: V2 PASSchecks.doctor VM test green (fresh build, exit 0; asserts the hibernate row renders + healthy run still 0). V1 — ran on this box's real LUKS+@swap layout: all three ok rows render (resume set, swap 34G ≥ RAM, zram 16G) and the sheet reaches its verdict. V0 bash -n + flake check.
  • Gotcha (fixed + MEMORY): the doctor runs set -euo pipefail; my first cut aborted before the verdict because a no-match grep inside $(…) and a cond && action both trip set -e. Fixed with || true / || echo 0 and an if. First VM run caught it (exit 1, no verdict) — the test earned its keep.
  • Pending: none — fully agent-verifiable (read-only checks, no V3).
  • Next suggestion: NEXT head is #76 [blocked:hw]; remaining PROPOSED (Omarchy doc §F, auto time-of-day theme §D) await triage.

2026-07-10 — QA sweep (clean) + VISION-gap pass → 3 PROPOSED

  • Task: Bernardo — QA/drift sweep, then a VISION-gap pass with proposals.
  • Did (sweep): Fanned out two subagents (Bernardo OK'd spawning for efficiency): nomarchy-runner ran the deterministic checks + bash -n/ py_compile (all PASS; the 4 "needs-args" scripts pass via their flake derivations); nomarchy-scout hunted fuzzy drift (dead code, stale refs, TODOs, changed-area contradictions, count/version) — all clean. Spot-checked scout's count claim myself: 24 theme JSONs / 24 previews / README "24 presets" — consistent. Eval sweep green. No fixes needed.
  • Did (VISION): Verified candidate gaps against the tree before proposing (killed two false gaps — nomarchy-rebuild/home already tail logs
    • point at doctor on failure = §A shipped; nvd diff = §B covered; System Firmware menu already exists). Filed 3 PROPOSED (verified open): doctor hibernate/sleep section (§C, top Day-2 pick, #76 follow-on), Omarchy migrant one-pager (§F), auto time-of-day theme pair (§D, [big]).
  • Verified: V0 (agent-notes/docs only). Sweep evidence above.
  • Pending: none. Proposals await Bernardo's triage into a tier.
  • Next suggestion: if a PROPOSED is promoted, the doctor hibernate section is the cleanest next build; else NEXT #76 stays [blocked:hw].

2026-07-10 — Icon overrides: user-facing docs (OVERRIDES.md)

  • Task: Bernardo asked whether the session's features need user docs.
  • Did: Hibernation already covered (README swapfile line, MIGRATION.md runbook, discoverable Power-menu row) — no gap. Icons had one: the only doc was the template comment. Added an "Icon pack" subsection to docs/OVERRIDES.md § Appearance — nomarchy-theme-sync set icons "<name>", the known-packs table, the ~1 GiB/opt-in rationale, and that the choice is sticky across apply (presets carry no icon field; verified deep_merge).
  • Verified: command path confirmed (cmd_set writes any dotted key; icons is a schema key). Built all 4 packs and listed real theme dirs to fix the examples — caught Qogir using capital Qogir-Dark/Light (lowercase would silently fall back to hicolor). Docs-only (V0).
  • Pending: none.
  • Next suggestion: NEXT #76 [blocked:hw]; LATER/QA-sweep next.

2026-07-10 — Icon themes: opt-in cross-pack overrides (no default bloat)

  • Task: LATER "per-theme icon overrides / more icon packs". Recon found papirus is already ~1 GiB and ships only Papirus/Dark/Light (no free variety); real variety needs extra packs at ~hundreds of MB each. Bernardo chose the opt-in, no-default-bloat shape (over shipping packs).
  • Did: theme.nix resolves nomarchy.theme.iconThemePackage from a small iconPacks registry (papirus·tela·qogir·reversal·numix, by name prefix). Default themes name Papirus-* → resolves to the plain papirus derivation (no symlinkJoin, identical closure); only a theme naming another pack's set symlinkJoins that one pack in. stylix.nix uses it (mkDefault). Opt-in note in templates/downstream/home.nix; ROADMAP § Icon themes updated (incl. the deliberate no-default-packs decision).
  • Verified: V1 — HM activationPackage builds (exit 0). Eval proofs: default iconThemePackage = plain papirus-icon-theme-* (zero delta); with icons="Tela-dark"nomarchy-icon-themes symlinkJoin (papirus+tela) and name flows, without building tela. All 5 pack attrs exist in the pinned nixpkgs. template-sot + option-docs + flake check green.
  • Pending: none. No default visual change (identical papirus), so no screenshot needed; the opt-in render is the downstream user's to see.
  • Next suggestion: NEXT still #76 [blocked:hw]; LATER/QA-sweep next.

2026-07-10 — #76 slice 3: hibernate VM test (V2 PASS) → #76 agent-complete

  • Task: BACKLOG #76 slice 3 — the mandatory V2 hibernate test + V3 queue.
  • Did: Added checks.hibernate (flake.nix), modeled on nixpkgs' hibernate.nix but wired to Nomarchy's #76 risk: imports oom.nix (zram default-on), disk swap at lower priority + explicit boot.resumeDevice, systemd-initrd. Test drives hibernate→power-off→resume→crash: ramfs marker survives resume, a crash-boot loses it (real resume, not a survivor), and asserts zram@100 + disk-swap<100 so the image lands on disk not volatile zram. Queued the V3 laptop steps (real LUKS+@swap+offset resume + no-swap notify) in HARDWARE-QUEUE. Collapsed #76 to a [blocked:hw] stub; design record → ROADMAP § "Hibernation + zram by default".
  • Verified: V2 PASSnix build .#checks.x86_64-linux.hibernate built the driver fresh and exited 0 (all assertions held). nix flake check --no-build green.
  • Pending: only V3 (dev box / laptop) — #76's last check; close on PASS.
  • Next suggestion: #76 is now blocked:hw; NEXT head falls to LATER/ PROPOSED triage or a QA sweep — pick per LOOP.md orientation next session.

2026-07-10 — #76 slice 2: Hibernate notify-on-failure

  • Task: BACKLOG #76 remaining slice 2 — per the settled "keep row, notify on failure" call.
  • Did: modules/home/rofi.nix power menu Hibernate arm now runs systemctl hibernate 2>/dev/null || notify-send "Hibernate" "…see docs/MIGRATION.md". On success the call blocks until resume, so the notify only fires on a genuine failure (e.g. swap=0 no-swap machine). Row stays unconditional (no hiding).
  • Verified: V1nix build …homeConfigurations.nomarchy.activationPackage green (rebuilds nomarchy-menu.drv; writeShellScriptBin runs bash -n at build). Control-flow proof on the arm extracted from the built script: failing systemctl → notify fires; succeeding → no notify. nix flake check --no-build green.
  • Pending: slice 3 = the V2 hibernate→resume VM test + V3 laptop (Hibernate→power off→resume on the LUKS+@swap machine; plus confirm the no-swap notify surfaces in a real session). Both remain open on #76.
  • Next suggestion: slice 3 — add a checks.* hibernate VM test (as far as QEMU allows) and queue the V3 laptop steps in HARDWARE-QUEUE.

2026-07-10 — #76 slice 1: MIGRATION.md hibernation runbook

  • Task: BACKLOG #76 remaining slice 1 — docs runbook for enabling hibernation on an existing machine (per the settled "docs not tool" call).
  • Did: Added § "Enabling hibernation on an existing machine (no reinstall)" to docs/MIGRATION.md: create @swap subvol (subvolid=5) + mkswapfile (NOCOW), read map-swapfile -r offset, wire fileSystems."/swap" + swapDevices + resumeDevice + resume_offset into system.nix. Flagged the mount as required on the hand-edit path (installer gets it from disko-gen hardware-config). Notes zram-priority reservation, no-LUKS variant, swap=0 opt-out. Worked example = this dev machine.
  • Verified: V0 — read-only commands run live against this machine's real LUKS(cryptroot)+btrfs(@)+/swap/swapfile layout (RAM 31G, fsuuid, findmnt SOURCE, mkswapfile flags, zram@100 vs swapfile@-1 confirms the design intent). nix flake check --no-build green.
  • Pending: slice 2 — Hibernate row notify-on-failure (V1/V2); then the V2 hibernate VM test + V3 laptop.
  • Next suggestion: slice 2 (menu notify-on-failure).

2026-07-10 — #76 hibernation design calls (no commit yet → this bookkeeping)

  • Task: BACKLOG #76 design slice — Bernardo made the open calls.
  • Did: Recon showed the hibernation half is already built for new installs (installer defaults swap=RAM hibernation-ready @swap swapfile; patch-template.py writes swapDevices/resumeDevice/resume_offset; Power menu Hibernate row + LUKS/hyprlock handling exist). Settled 3 calls: (1) swap sizing = exactly RAM (no change); (2) migration = docs runbook in MIGRATION.md, not a tool; (3) no-swap Hibernate = keep row, notify on failure. Folded into BACKLOG #76 (design ✓, re-sliced remaining: MIGRATION.md runbook + notify-on-failure menu) and Decisions.
  • Verified: V0nix flake check --no-build green (docs-only).
  • Pending: two remaining slices below; V2 hibernate VM test + V3 laptop.
  • Next suggestion: slice 1 — docs/MIGRATION.md hibernation-enable runbook (V0), then slice 2 — Hibernate notify-on-failure (V1/V2).

2026-07-10 — #76 zram slice: compressed-RAM swap default

  • Task: BACKLOG #76 ([big]) — split; took the low-risk zram-default slice.
  • Did: zramSwap on by default in modules/nixos/oom.nix (zstd, 50% RAM, priority 100) as the memory-pressure layer before earlyoom, following the earlyoom mkDefault precedent (no toggle). High priority keeps day-to-day paging in zram so a disk swapfile stays reserved for #76's hibernate image. Added checks.zram-swap runNixOSTest (imports oom.nix). Split #76 in BACKLOG → remainder is the hibernation half (swapfile/resume/installer).
  • Verified: V2nix build .#checks…zram-swap PASS: /dev/zram0 active in /proc/swaps, [zstd] comp_algorithm, priority 100. V1 full distro toplevel builds. V0 flake check --no-build green.
  • Pending: hibernation half of #76 still open (needs hibernate→resume VM test + V3 laptop). No V3 for zram (under-load tuning is secondary).
  • Next suggestion: #76 hibernation half — design default swapSize + the resume/installer wiring; it's the boot-critical, V2-hibernate + V3 part.

2026-07-10 — #41 hardware-confirmed: OpenFile portal floats (V3 close)

  • Task: BACKLOG #41 — final on-hardware confirmation (Bernardo reported PASS).
  • Did: #41 already out of NEXT + portal rule shipped (hyprland.nix xdg-desktop-portal-gtk float/center). Bernardo verified the GTK OpenFile file-picker floats on real hardware; dropped the "OpenFile not re-probed / optional residual" caveats in HARDWARE-QUEUE — #41 fully closed.
  • Verified: V3 (Bernardo, Latitude). No code change. Bookkeeping only; QA-sweep guards run green this session: nix flake check --no-build, option-docs/template-sot/theme-sync-validate builds, contrast 24×7.
  • Pending: none for #41. NEXT head is #76 (hibernation + zram, [big]).
  • Next suggestion: split #76 — take the low-risk zram-default slice (V2-testable headlessly) before the boot-critical hibernate/resume work.

2026-07-10 — Close #41 GTK portal float rule

  • Task: BACKLOG #41 residual (GTK file-chooser portal class).
  • Did: Added float+center for xdg-desktop-portal-gtk / .xdg-desktop-portal-gtk-wrapped (desktop + libexec name from package). Polkit already PASS on Latitude. Removed #41 from NEXT; only #20 remains.
  • Verified: V0 windowrule-syntax check path unchanged; class from package xdg-desktop-portal-gtk.desktop / community configs. SoftGL still cannot materialize portal dialogs.
  • Pending: optional hardware spot-check OpenFile floats (HARDWARE-QUEUE).
  • Next suggestion: #20 is [human] only — or LATER/PROPOSED triage.

2026-07-10 — Product calls: charge live, identity, btop, NVIDIA skip

  • Task: Bernardo decisions on remaining PROPOSED.
  • Did: (1) Instant charge-limit: udev GROUP=users on threshold, menu/powermgmt live sysfs + state, oneshot reads live theme-state + AC re-apply. (2) Look & Feel already had Theme/wallpaper/night light; added Reset wallpaper (auto). (3) NVIDIA first-class deferred past v1 (HARDWARE.md). (4) Identity retunes: white L-steps, lumon subtext, hackerman surface+UI warn/bad, matte-black subtext, miasma bad. (5) Hand btop.theme for 9 identity/whole-swap slugs from palette map.
  • Verified: V0 contrast 24×7; V1 battery-charge-limit VM (udev restart). V3 live charge write on real laptop (HARDWARE-QUEUE).
  • Next suggestion: only #20/#41 blocked, or Decisions.

2026-07-10 — Summer pair polish + status CSS + preview recapture

  • Task: finish agent-able PROPOSED theme leftovers.
  • Did: summer-day/night — JSON hierarchy (night subtext/muted/overlay ladder; day overlay≠muted); waybar CSS tokens track JSON roles; font 13px both; day battery 25/10; VPN pill + full status states (.recording/.available/.on/.activated/battery warn). Recaptured executive-slate + neon-glass preview.png via theme-shot desktop (480×270). Closed those PROPOSED lines.
  • Verified: V0 contrast 24×7 + wholeswap; V2 theme-shot summer-day/night/executive-slate/neon-glass — viewed bar crops + previews. Identity taste retunes stay PROPOSED.
  • Next suggestion: only blocked NEXT (#20/#41) or product Decisions.

2026-07-10 — #74 matrix flags + #75 V2 install (default arm)

  • Task: NEXT #74 unattended matrix · #75 SoT V2 install after ISO.
  • Did: NOMARCHY_TEST_SWAP_GB / NOMARCHY_TEST_NO_LUKS drive tools/test-install.sh go.sh + first-boot LUKS skip; nixpkgs OVMF fallback. Full offline install V2 (SWAP=2 LUKS) after live ISO rebuild with starter packages — first-boot themed Boreal, no red banner. Closed #74/#75. Other matrix arms scripted (not full-ISO re-run).
  • Verified: V2 — install powered off ~460s; first-boot.png viewed (/tmp/nomarchy-vm-75/first-boot.png): themed wallpaper + waybar (logo, clock, modules), doctor glyph, no autogen banner.
  • Next suggestion: NEXT only #20 [human] + #41 [blocked:hw].

2026-07-10 — Loop batch land #64#73 (parallel worktrees)

  • Task: agent-actionable NEXT #64#73 via worktree agents; land on main.
  • Did: #64 MIGRATION snapshots · #65 real-uid chown · #66 theme-state fail-closed reader · #67/#68 theme fidelity+ANSI · #69/#70 audit+import tools · #71 IR portal docs · #72 template-sot check · #73 MOTD/first-boot fingerprint+doctor tips. Agents did not push; parent cherry-picked (stripped agent BACKLOG races). Closed #64#73.
  • Verified: V0/V1 — theme-contrast 24×7 pass; template-sot green; bash -n install; flake check --no-build green.
  • Next suggestion: #74 unattended matrix + #75 V2 install (KVM).

2026-07-10 — Promote agent-actionable PROPOSED → NEXT #64#75

  • Task: Bernardo: bump non-hw/non-human PROPOSED categories 1+2.
  • Did: #64 MIGRATION snapshots · #65 installer chown · #66 mkFlake theme-state errors · #67 theme fidelity nits · #68 #52 residual ANSI · #69 audit identity exemptions · #70 import-pipeline hierarchy · #71 IR portal docs (a) · #72 template SoT CI · #73 hardware hints residual · #74 unattended install matrix · #75 SoT V2 install. Breadcrumbs in PROPOSED; actionable items sit above #20/#41 in NEXT.
  • Verified: V0 (backlog only).
  • Next suggestion: queue head #64 (docs) or batch #67/#68 themes.

2026-07-10 — PROPOSED cleanup (stale exam residue)

  • Task: Bernardo: clean stale PROPOSED items after A/B/C + #52 ship.
  • Did: Rewrote PROPOSED to open work only — dropped #52 shipped high-ROI bullets, neon-glass quarantine, empty/shipped installer audit sections, template seed drift (keys already present), soft gaps fixed by #50, and “no action” kanagawa/boreal notes. Kept product day-2, installer follow-ups, theme polish residuals, tooling.
  • Verified: V0 (backlog hygiene); spot-checked template keys, latte/mocha #52 fixes, usbutils, package exports.
  • Next suggestion: triage the lean PROPOSED list or HARDWARE-QUEUE.

2026-07-10 — Pending closeout: #14, #57 V2, #41 slice

  • Task: pending V2/CI/float leftovers after A/B/C batch.
  • Did: #14 closed — first scheduled lock bump landed 8fded63 (2026-07-06 Mon 05:20 UTC) as nomarchy-bump / chore(lock): scheduled upstream bump (Actions token push works). #57 V2checks.live-install-entry asserts live HM gen has nomarchy-install.desktop (Name/Terminal/Exec) + installer bin + Tools menu gate in nomarchy-menu. #41 slice — float/center rules for hyprpolkitagent + pinentry-qt from package app-id strings; tools/capture-float-classes.nix harness (softGL empty clients); residual GTK portal stays NEXT #41 [blocked:hw]. HARDWARE-QUEUE float confirm steps added.
  • Verified: V2 live-install-entry green; windowrule-syntax green. SoftGL class capture inconclusive (empty clients). V3 float confirm
    • fingerprint/#60 still HARDWARE-QUEUE. #20 still [human].
  • Next suggestion: Bernardo: #20 KVM runner, or HARDWARE-QUEUE pass.

2026-07-10 — #55 fingerprint menu + #56 human rebuild errors

  • Task: NEXT #55 (System Fingerprint) + #56 (rebuild failure UX).
  • Did: #55 — System row self-gated on fprintd-list; enroll/list/verify/ delete-all terminal flows; Use for login writes settings.fingerprint.pam (hardware.nix default from stateFile); HARDWARE.md §5 + HARDWARE-QUEUE V3 enroll. #56 — sys-update / sys-rebuild / home-update tee last 40 lines + nomarchy-doctor pointer; theme-sync run_switch notify/die text. Closed #55/#56.
  • Verified: V1 — HM template rebuild (menu + theme-sync); option-docs green; failure-footer shell smoke. V3 pending: real fingerprint enroll (queue). V2 pending: forced bad sys-rebuild in VM (footer text pure/logic covered).
  • Next suggestion: queue was AC; remaining NEXT is blocked items (#14/#20/#41) or PROPOSED triage.

2026-07-10 — #58 nomarchy-detect-hw CLI

  • Task: NEXT #58 — post-install re-probe package (HARDWARE.md §8).
  • Did: pkgs/nomarchy-detect-hw wrapping installers hardware-db; human report + snippets + --raw protocol; overlay + systemPackages; HARDWARE.md §8 updated. Closed #58.
  • Verified: V1 — package builds; ran on this AMD laptop: correct MODULE/NOMARCHY lines (amd cpu/gpu, laptop, ssd, fingerprint, IR cam, NPU) and printable system.nix snippets.
  • Next suggestion: #55 fingerprint menu or #56 human rebuild errors.

2026-07-10 — #57 live Install Nomarchy affordance

  • Task: NEXT #57 — durable live-ISO install surface (not only toast).
  • Did: xdg.desktopEntries.nomarchy-install (Terminal=true) on live HM; Tools Install Nomarchy self-gated on command -v nomarchy-install; welcome toast wording updated. Closed #57.
  • Verified: V1 — live config eval exposes entry name/exec; downstream-template-home rebuilds with menu gate. V2 pending: ISO rebuild + smoke that the .desktop appears in the session.
  • Next suggestion: #58 nomarchy-detect-hw CLI.

2026-07-10 — #63 generated Waybar logo + powermenu

  • Task: NEXT #63 — reverse parity: generated bar lacked whole-swap logo → menu and power icon → power menu.
  • Did: custom/nomarchy (left, Nomarchy.ttf U+F000) + custom/powermenu (right, U+F011 → nomarchy-menu power) in generated settings/style. Fixed Nix \uf000 pitfall (no \u escapes — use literal UTF-8). Whole-swaps already had both; no JSON/CSS edits. Closed #63.
  • Verified: V2THEME=tokyo-night theme-shot: left monogram N, right power glyph, accent styling; config modules-left/right correct. Crop paths under /tmp/theme-shot-tn2-*.png.
  • Next suggestion: product path #55 fingerprint menu (or #57 live install).