diff --git a/agent/BACKLOG.md b/agent/BACKLOG.md index a53d675..d8d5376 100644 --- a/agent/BACKLOG.md +++ b/agent/BACKLOG.md @@ -247,22 +247,20 @@ job: the `checks.*` VM suite + real toplevel/HM builds on every push *Agents: append here with a one-paragraph pitch (what/why/cost). Do not implement. Bernardo moves accepted items into a tier.* -- **Battery charge-limit as a quick toggle** (Raised by Bernardo, - 2026-07-07). The base already ships: `nomarchy.system.power. - batteryChargeLimit` writes `charge_control_end_threshold` via a - systemd service (+ a udev re-trigger on AC plug), with a "Battery - Limit" control-center entry and a `battery-charge-limit` VM check. - The gap is UX: today it's a *type-a-number* NixOS option that needs a - `sys-rebuild` to change. Bernardo wants a **toggle** for the charging - threshold — i.e. a one-click "conservation mode" (cap ~80% ↔ full - 100%) rather than entering a value. Ideally instant-effect: the - service already `echo`es the threshold to sysfs, so a toggle could - write the live value + persist to `settings.power.batteryChargeLimit` - (night-light `--no-switch` pattern) instead of rebuilding, and - surface it prominently (menu row and/or a Waybar quick action). - Decide: keep the number-entry for the exact cap AND add an on/off - quick toggle, or replace with a fixed-cap toggle. Cost: small — mostly - a menu/writer + making the write instant; the sysfs mechanism exists. +- **Battery charge-limit — make the toggle instant** `[blocked:hw]` + (follow-up to the preset toggle shipped 2026-07-07, iteration #55). + The control-center now has a proper toggle (Off / 80% / 90% / 60% / + Custom…) writing `settings.power.batteryChargeLimit` — but that's a + baked NixOS option, so it only lands on the next `sys-rebuild`. To make + it instant (no rebuild): add a udev rule making + `/sys/class/power_supply/BAT*/charge_control_end_threshold` + group-writable (`MODE`/`GROUP`) so the menu can `echo N >` it live + alongside persisting state (the sysfs oneshot in power.nix still owns + boot + AC-replug re-apply), and/or surface a rofi-menu quick row or a + Waybar action. `[blocked:hw]`: the sysfs write + no-rebuild effect can + only be confirmed on a laptop exposing the threshold. Decide first + whether the small privilege grant (a local user can set the charge cap) + is acceptable. - **Portal/Flatpak camera picker still lists the internal IR sensor** (ROADMAP § Webcam follow-up). The shipped IR-hide is a *WirePlumber diff --git a/agent/HARDWARE-QUEUE.md b/agent/HARDWARE-QUEUE.md index e0bedee..1c26c54 100644 --- a/agent/HARDWARE-QUEUE.md +++ b/agent/HARDWARE-QUEUE.md @@ -222,6 +222,13 @@ QA machine), the **T14s** (webcam case). draining. (Crossing logic VM-verified — this checks the real swaync rendering in a session.) +- [ ] **Battery charge-limit toggle** (iteration #55) — control-center + (menu › System › Control Center › System Toggles › Battery Limit): + the preset picker (Off / 80% / 90% / 60% / Custom…) writes the value + (`nomarchy-theme-sync get settings.power.batteryChargeLimit` reflects + the pick); after a `sys-rebuild` the sysfs + `charge_control_end_threshold` reads it. (UX-only over the already + VM-verified writer — a session sanity pass, not a deep check.) - [ ] **Waybar hides under fullscreen video** (item 30) — after `home-update` + relogin, put a browser video (YouTube) into fullscreen (F): the bar is now *covered* by the video, not drawn diff --git a/agent/JOURNAL.md b/agent/JOURNAL.md index dbe2d44..45c1070 100644 --- a/agent/JOURNAL.md +++ b/agent/JOURNAL.md @@ -17,6 +17,27 @@ Template: --- +## 2026-07-07 — Battery charge-limit quick toggle (iteration #55) +- **Task:** BACKLOG PROPOSED (promoted by Bernardo) — a toggle for the + battery charge threshold. +- **Did:** Replaced the control-center "Battery Limit" raw number-prompt + with a preset toggle picker (Off / 80% recommended / 90% / 60% / + Custom…) writing `settings.power.batteryChargeLimit`. Kept it in the + control-center — that's where the baked, rebuild-valued System Toggles + live (rofi `nomarchy-menu` is the *instant* surface; the CC holds + config values); it's reachable from the menu via System › Control + Center. Base machinery (sysfs oneshot + AC-replug udev in power.nix) + untouched. +- **Verified:** V0 (`bash -n`; `nix flake check --no-build`, green) + V1 + (nomarchy-control-center package builds → the writeShellApplication + shellcheck gate passes). +- **Pending:** instant-effect (no rebuild) refiled in PROPOSED as + `[blocked:hw]` — needs a udev-writable sysfs node, confirmable only on + a laptop with the charge-threshold control. Light session spot-check + queued in HARDWARE-QUEUE. +- **Next suggestion:** item 29 is `[human]`/`[blocked:hw]`; remaining is + item 28 slices or a QA sweep. + ## 2026-07-07 — Waybar overlaps fullscreen video (iteration #54) - **Task:** BACKLOG item 30 — bar drawn on top of a fullscreen YouTube video. - **Did:** `layer: top` → `bottom` in the generated `waybar.nix` and the diff --git a/pkgs/nomarchy-control-center/nomarchy-control-center.sh b/pkgs/nomarchy-control-center/nomarchy-control-center.sh index f048ab0..5e9538b 100644 --- a/pkgs/nomarchy-control-center/nomarchy-control-center.sh +++ b/pkgs/nomarchy-control-center/nomarchy-control-center.sh @@ -167,12 +167,33 @@ function toggles_menu() { sleep 1 ;; "Battery Limit") - limit=$(gum input --prompt "Enter battery charge limit % (or empty for default): " --placeholder "$(get_state settings.power.batteryChargeLimit)") - if [ -n "$limit" ]; then - set_state "settings.power.batteryChargeLimit" "$limit" - else - set_state "settings.power.batteryChargeLimit" "null" - fi + # Conservation-mode toggle: cap charging to spare the battery, + # or Off to charge full. A preset picker (not a raw number) with + # a Custom escape hatch. This is a baked NixOS system option + # (settings.power.batteryChargeLimit → the sysfs oneshot in + # power.nix), so it lands on the next sys-rebuild like the other + # System Toggles. + cur=$(get_state settings.power.batteryChargeLimit) + sel=$(gum choose --header "Battery charge limit (now: ${cur:-default})" \ + "80% (recommended)" "90%" "60%" "Off (charge to 100%)" "Custom…" "Cancel") + case "$sel" in + "80%"*) set_state "settings.power.batteryChargeLimit" "80" + echo "Charge limit set to 80% (requires rebuild)." ;; + "90%") set_state "settings.power.batteryChargeLimit" "90" + echo "Charge limit set to 90% (requires rebuild)." ;; + "60%") set_state "settings.power.batteryChargeLimit" "60" + echo "Charge limit set to 60% (requires rebuild)." ;; + "Off"*) set_state "settings.power.batteryChargeLimit" "null" + echo "Charge limit off — charges to 100% (requires rebuild)." ;; + "Custom…") + limit=$(gum input --prompt "Charge limit % (50–100): " --placeholder "$cur") + if [ -n "$limit" ]; then + set_state "settings.power.batteryChargeLimit" "$limit" + echo "Charge limit set to $limit% (requires rebuild)." + fi ;; + *) : ;; + esac + sleep 1 ;; "Bluetooth") cur=$(get_state "settings.bluetooth.enable")