Some checks failed
Check / eval (push) Has been cancelled
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).
620 lines
38 KiB
Markdown
620 lines
38 KiB
Markdown
# 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 title> (<commit sha, or "no commit">)
|
||
- **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 — #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:** **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 "<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 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).
|
||
|