# 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 3–5 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](JOURNAL-ARCHIVE.md) (history, never edited). Template: ```markdown ## YYYY-MM-DD — () - **Task:** which BACKLOG item (or QA sweep / bootstrap / escalation) - **Did:** what changed, in 2–4 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 — #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:** **V2** — `nix 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:** **V2** — `nix 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 frontmatter’d 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 24–29 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 PASS** — `nix 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:00–00: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 PASS** — `checks.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 ""`, 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 PASS** — `nix 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:** **V1** — `nix 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:** **V0** — `nix 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:** **V2** — `nix 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 V2** — `checks.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 A–C; 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 installer’s 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:** **V2** — `THEME=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).