# Backlog — the prioritized task queue

**This is the only executable work list for agents.** Product themes and
v1.0 intent live in [`docs/VISION.md`](../docs/VISION.md); design history
in [`docs/ROADMAP.md`](../docs/ROADMAP.md); map in
[`docs/README.md`](../docs/README.md) and [`agent/README.md`](README.md).

**Rules:**
- Agents take the topmost actionable item (see LOOP.md). Finished items
  are **deleted** here — the journal + git log are the record; durable
  design notes get a ✓-entry in docs/ROADMAP.md (and/or a note in VISION)
  if worth keeping.
- Item numbers are **stable IDs** — never renumbered or reused. A gap in
  the sequence means shipped (or dropped) work; new items take the next
  free number regardless of tier.
- Tags: `[blocked:hw]` needs real hardware (see HARDWARE-QUEUE.md) ·
  `[human]` needs Bernardo · `[stuck]` two failed attempts, needs help ·
  `[big]` must be split before starting.
- Agents may append to **PROPOSED** and **Decisions** freely (include
  `VISION § …` or `ROADMAP § …` when relevant); only Bernardo moves items
  *out* of PROPOSED into the tiers.

---

## NOW

*(empty — NEXT's top item is the queue head)*

## NEXT

### 20. KVM runner → VM suite in CI `[human]`
The remaining stretch of the CI item — checks-on-push is live and
**green** (run #58; runner = gitea/act_runner docker, eval tier).
Register a second runner on a host with `/dev/kvm` + nix (host-mode
label `nix-kvm`), then an agent uncomments the workflow's `vm-checks`
job: the `checks.*` VM suite + real toplevel/HM builds on every push
that later upgrades the bump gate from eval-only to the full suite.

### 41. Floating-window audit — residual GTK portal class `[blocked:hw]`
(Raised by Bernardo, 2026-07-07 — item 11.) Conservative cut + 2026-07-10
slice shipped: mixer, blueman, system-config-printer, calendar,
**hyprpolkitagent** + **pinentry-qt** (classes from package app-id
strings; softGL capture harness could not materialize dialogs).
**Still open:** GTK file-chooser portal (`xdg-desktop-portal-gtk`) —
class not discoverable headlessly. On hardware: open a portal file
picker, `hyprctl clients`, append float/center rules if needed; confirm
polkit/pinentry/blueman actually float.

## LATER

- **Wallpapers artifact split** (ROADMAP § Faster switches — decided,
  deferred): pinned `Nomarchy-wallpapers` input so a state write stops
  re-copying 86 MB. Follow-on: pre-built theme variants if switches are
  still slow after.
- **Installer round 2** (ROADMAP § Installer): multi-disk BTRFS RAID,
  impermanence, BIOS/legacy boot.
- **Boot-from-snapshot**: a systemd-boot equivalent of grub-btrfs.
- **Night-light geo mode**: lat/long auto sunset/sunrise (means wlsunset).
- **Per-theme icon overrides** / more icon packs (ROADMAP § Icon themes).
- **MIPI/IPU software-ISP camera** support (no-UVC machines).
- **VPN exit-node richer display** (country/city) (optional).
- **NixOS release bump → v2** `[human]`: deliberate, hand-edited, never
  automated; the previous attempt was discarded (2026-06-22) over a
  Hyprland OOM blocker — see MEMORY.md before retrying (NOW#3 should
  also soften that blocker class).

## PROPOSED (agent suggestions — await human triage)

*Agents: append here with a one-paragraph pitch (what/why/cost). Do not
implement. Bernardo moves accepted items into a tier.*

*Open work only. Shipped exam/A–C items (#47–#63, #14, #52 theme
high-ROI, etc.) live in the journal + ROADMAP — not here.*

### Product / day-2

- **Battery charge-limit — make the toggle instant** `[blocked:hw]`
  Menu/CC write `settings.power.batteryChargeLimit` but need a rebuild.
  Instant path: udev group-writable `charge_control_end_threshold` on
  system batteries + live `echo` alongside state persist. Decide first
  whether a local user may set the charge cap. Cost: medium; hw confirm.

_(Portal/Flatpak IR camera → **#71** docs (a); (b)/(c) still need T14s.)_

_(Post-install hardware hints residual → **#73**.)_

- **Look & Feel submenu** (ROADMAP optional) — night-light, wallpaper
  cycle, blur/gaps with Theme; root stays six entries. Product call.

- **NVIDIA first-class options** `[big]` `[blocked:hw]` — thin
  `nomarchy.hardware.nvidia.*` only with hybrid maintainer + queue.
  Prefer shipped #59 commented guidance until then.

### Installer / template

_(Installer ↔ template SoT CI → **#72**; V2 install → **#75**.)_
_(Installer chown flake dir → **#65**.)_
_(MIGRATION.md snapshot layout → **#64**.)_
_(Unattended-install test matrix → **#74**.)_
_(Friendlier mkFlake theme-state errors → **#66**.)_

### Theme polish

_(#52 residual ANSI → **#68**.)_
_(Fidelity / hierarchy nits → **#67**.)_
_(Import pipeline hierarchy → **#70**.)_
_(audit-theme-design identity exemptions → **#69**.)_

- **summer-day / summer-night pair polish** — waybar CSS vs JSON dual
  SoT; night `subtext`=`muted`=`overlay`; day/night font + battery
  threshold + VPN pill drift. Pick JSON as SoT (or document EF split).
  Cost: CSS/JSON; V3.

- **summer-\* CSS status module states** — missing `.on` / `.available`
  / `.recording` polish vs boreal/generated. Cost: CSS; V3.

- **theme preview recapture nicety** — executive-slate + neon-glass
  previews are bare desktop+bar, not the floating-terminal composition
  of the other 21; optional identity `btop.theme`s. Cost: asset/V3.

- **Identity optional taste retunes** — white / lumon / hackerman /
  matte-black / miasma hierarchy or status L-steps only (no traffic-light
  forced on identity themes). Product call per theme.

### v1.0 pointer

See **VISION**. Remaining PROPOSED: charge-limit instant, Look & Feel,
NVIDIA first-class, summer-* / preview / identity taste polish.


## Decisions `[human]`

Open calls only Bernardo can make; agents add options/evidence but never
decide.

- **Formatter adoption:** repo deliberately has none; `nixfmt-rfc-style`
  would flatten the aligned hand-formatting of ~33 files. Adopt or
  declare never?
- **Docs site vs Markdown-in-repo** (from the docs-review item).

- **zram swap:** faster under pressure and pairs with NOW#3, but it
  interacts with the hibernation-swapfile story (resume device/priority
  ordering) — adopt, adopt-with-hibernation-guard, or skip?
- **Default browser:** the template comments Firefox out. The shipped
  mime defaults (item 8, done) point `text/html`/http(s) at
  `firefox.desktop` as *inert* entries — they activate the moment
  Firefox is installed and are skipped otherwise, so the remaining call
  is only: ship a browser active in the suite, or stay
  browserless-by-default?

- **Default power backend — PPD vs TLP:** (raised by Bernardo 2026-07-08:
  would TLP be more power-efficient, and should it be the default?)
  TLP does get more *idle* battery life, but only from device-level knobs
  PPD deliberately omits — PCIe ASPM, disk/NVMe link PM, USB autosuspend,
  runtime PM — which are the same knobs behind NVMe/USB flakiness that
  pillar 1 (rock-stable, never fight your machine) guards against.
  **Evidence (2026-07-08):** no credible hard-watt benchmarks exist — TLP's
  own maintainer declines to quote any ("measure on your hardware") and says
  PPD's power-saver gives *similar* savings under load; TLP's edge is
  idle-only (linrunner.de/tlp/faq/ppd.html — PPD covers a *subset* of TLP,
  "no settings to reduce consumption when the CPU is idle"). Our sibling
  distro **Omarchy** ran this exact experiment — a "replace Power Profiles
  with TLP for battery" guide — and the author **reverted to PPD** ("more
  headaches and weird issues"); Omarchy shipped PPD auto-switching instead
  (basecamp/omarchy#3907). PPD 3.4.0 now does AC/battery auto-switching,
  closing part of TLP's UX gap. **Cost of TLP-default:** TLP has no live
  D-Bus profile API, so the `powermgmt` menu + Waybar profile indicator +
  low-battery auto power-saver (all `powerprofilesctl`) would need a rework —
  it's not a one-line backend swap. **Agent rec (evidence, not a decision):
  keep PPD default;** chase battery via targeted low-risk tweaks (PCIe ASPM
  policy, battery-side EPP, the charge *start* threshold, PPD auto-switching)
  and keep TLP the documented one-line opt-in it already is
  (`nomarchy.system.power.backend = "tlp"`). Options: (i) status quo +
  targeted tweaks [rec]; (ii) TLP default (reworks the profile UX);
  (iii) nothing.
