From 841ee432d60dcf97030a9ffa4d45f19bc4d00211 Mon Sep 17 00:00:00 2001 From: funman300 Date: Sun, 10 May 2026 17:54:44 -0700 Subject: [PATCH] docs: implementation plan for power-profile fan-trigger Co-Authored-By: Claude Opus 4.7 (1M context) --- .../2026-05-11-power-profile-fan-trigger.md | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 docs/superpowers/plans/2026-05-11-power-profile-fan-trigger.md diff --git a/docs/superpowers/plans/2026-05-11-power-profile-fan-trigger.md b/docs/superpowers/plans/2026-05-11-power-profile-fan-trigger.md new file mode 100644 index 0000000..5cd63b5 --- /dev/null +++ b/docs/superpowers/plans/2026-05-11-power-profile-fan-trigger.md @@ -0,0 +1,104 @@ +# Power-Profile → Fan-Profile Sync Trigger Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Make `scripts/power-profile.sh --menu` instantly trigger `scripts/fan-profile.sh` to re-evaluate (so fan auto mode applies the new mapping in under a second instead of waiting for the next 5 s waybar poll). + +**Architecture:** One-line change. Chain `pkill -RTMIN+9 waybar` (the fan widget's signal) onto the existing `pkill -RTMIN+8 waybar` after `powerprofilesctl set` succeeds. Reuses the existing single-source-of-truth mapping in `fan-profile.sh::map_profile_to_strategy` — no new logic, no new files. + +**Tech Stack:** bash, waybar (`signal:` mechanism), `powerprofilesctl`, `pkill -RTMIN+N`. + +**Spec:** `docs/superpowers/specs/2026-05-11-power-profile-fan-trigger-design.md` + +**Verification model:** Bash syntax check covers static correctness; end-to-end behaviour requires a live waybar + active power profile change (controller verifies after merge). One task only. + +--- + +## File Structure + +| File | Change | +|---|---| +| `scripts/power-profile.sh` | One line modified (line 13): chain `&& pkill -RTMIN+9 waybar` onto the existing `&&`-chained command. | + +No new files. No other files touched. + +--- + +## Task 1: Add fan-widget signal to power-profile menu handler + +After this task, picking a power profile from the wofi menu fires both the power-widget refresh signal (RTMIN+8) and the fan-widget refresh signal (RTMIN+9). The fan widget's existing handler (in `fan-profile.sh`) checks the auto-mode sentinel and applies the mapped fw-fanctrl strategy if appropriate. + +**Files:** +- Modify: `scripts/power-profile.sh` (line 13) + +- [ ] **Step 1: Make the one-line change** + +Find line 13 in `scripts/power-profile.sh`: + +```bash + [ -n "$CHOICE" ] && powerprofilesctl set "$CHOICE" && pkill -RTMIN+8 waybar +``` + +Replace with: + +```bash + [ -n "$CHOICE" ] && powerprofilesctl set "$CHOICE" && pkill -RTMIN+8 waybar && pkill -RTMIN+9 waybar +``` + +The only change: append ` && pkill -RTMIN+9 waybar` to the end of the existing chain. Indentation, surrounding lines, and the `if`/`exit` block remain untouched. + +- [ ] **Step 2: Syntax-check the script** + +```bash +bash -n scripts/power-profile.sh && echo "syntax ok" +``` + +Expected: `syntax ok` and exit 0. + +- [ ] **Step 3: Confirm both signals appear in the chain** + +```bash +grep -n "pkill -RTMIN" scripts/power-profile.sh +``` + +Expected output (one line, both signals present): +``` +13: [ -n "$CHOICE" ] && powerprofilesctl set "$CHOICE" && pkill -RTMIN+8 waybar && pkill -RTMIN+9 waybar +``` + +- [ ] **Step 4: Confirm the status-emit branch is unchanged** + +```bash +sed -n '17,27p' scripts/power-profile.sh +``` + +Expected: shows the `CURRENT=$(powerprofilesctl get)` block, `case "$CURRENT" in ... esac`, and `printf` JSON line — all byte-identical to before this commit. + +- [ ] **Step 5: End-to-end smoke test (controller — subagent skip)** + +Subagents have no display; skip this step. The controller will: + +```bash +# Confirm both waybar signals are wired up correctly +powerprofilesctl get # note current profile +~/.local/bin/power-profile --menu # pick a different profile in wofi +powerprofilesctl get # confirm it changed +fw-fanctrl print | grep '^Strategy:' # if fan auto is on, this should match the mapped strategy within ~1 s +``` + +If fan auto is off (`~/.local/state/fan-profile-auto` does not exist), `fw-fanctrl` strategy stays unchanged — that's the correct behaviour for Option C. + +- [ ] **Step 6: Commit** + +```bash +git add scripts/power-profile.sh +git commit -m "power-profile: signal fan widget on profile change" +``` + +--- + +## Final verification (controller, post-merge) + +- [ ] With fan auto on: change power profile via the wofi menu → fan strategy follows within ~1 s (`fw-fanctrl print | grep ^Strategy:` shows the mapped value). +- [ ] With fan auto off: change power profile via the wofi menu → fan strategy unchanged (`fw-fanctrl print | grep ^Strategy:` shows the previously-set manual value). +- [ ] If `powerprofilesctl set` fails (simulate by stubbing `powerprofilesctl` in `PATH` to return exit 1), neither pkill fires — `journalctl --user -u waybar` shows no spurious refreshes.