aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-07-02 15:18:20 -0400
committerCraig Jennings <c@cjennings.net>2026-07-02 15:18:20 -0400
commitd8d8c532798cb8be59ca84407022233afa2b79bb (patch)
tree78be20d3f22c8f4b6d8a260a22f49dfa6c19cee3
parent1dd2f2d0e34c651e2c360e247fd1ce2fc4cba098 (diff)
downloadarchsetup-d8d8c532798cb8be59ca84407022233afa2b79bb.tar.gz
archsetup-d8d8c532798cb8be59ca84407022233afa2b79bb.zip
feat(bluetooth): retire blueman, assert the swap in VM tests
I dropped blueman from the desktop_environment bluetooth loop (bluez + bluez-utils stay) and added the VM assertions: bluetooth stack installed, blueman absent as the retirement regression guard. No new sudoers rule was needed for bt-priv, since the existing blanket grant already covers systemctl restart bluetooth.
-rwxr-xr-xarchsetup3
-rw-r--r--docs/design/2026-07-02-bluetooth-panel-spec.org18
-rw-r--r--scripts/testing/tests/test_packages.py16
-rw-r--r--todo.org4
4 files changed, 38 insertions, 3 deletions
diff --git a/archsetup b/archsetup
index d1c0b3d..cb0c14b 100755
--- a/archsetup
+++ b/archsetup
@@ -2135,7 +2135,8 @@ desktop_environment() {
# Bluetooth Devices
action="Bluetooth System" && display "subtitle" "$action"
- for software in bluez bluez-utils blueman; do
+ # blueman retired 2026-07-02: the dotfiles bt panel + bar module replace it
+ for software in bluez bluez-utils; do
pacman_install "$software"
done
pacman_install solaar # Logitech device manager
diff --git a/docs/design/2026-07-02-bluetooth-panel-spec.org b/docs/design/2026-07-02-bluetooth-panel-spec.org
index 90b4bf7..89872f5 100644
--- a/docs/design/2026-07-02-bluetooth-panel-spec.org
+++ b/docs/design/2026-07-02-bluetooth-panel-spec.org
@@ -363,6 +363,24 @@ Non-blocking; it's the donor default made explicit.
* Review and iteration history
+** 2026-07-02 Thu @ 15:16:51 -0400 — Claude Code (archsetup) — phase 4 builder
+- *What changed or was recommended:* Phase 4 shipped. Dotfiles =2a026b1=:
+ the stowed =bt-priv= shim (one verb, verified against the fake-systemctl)
+ and the sxhkd =Super+Shift+B= bind repointed from blueman-manager to
+ =st -e bluetoothctl= (terminal fallback per the retirement decision — the
+ panel is Wayland-only). archsetup: blueman dropped from the
+ =desktop_environment= package loop; VM assertions added (bluez/bluez-utils
+ present, blueman absent). blueman also removed live from velox.
+- *Why:* Build order per the DOING decomposition. The spec's "sudoers rule"
+ item resolved as net-priv's did: archsetup already grants the primary
+ user blanket =NOPASSWD: ALL= (archsetup:1089), so a narrow bt-priv rule
+ would be dead config — no new sudoers needed, and phase 5's "sudoers
+ placed" is satisfied by the existing grant.
+- *Artifacts:* dotfiles =hyprland/.local/bin/bt-priv=,
+ =common/.config/sxhkd/sxhkdrc=; archsetup =archsetup= (bluetooth loop),
+ =scripts/testing/tests/test_packages.py=; dated phase 4 entry under the
+ todo.org parent.
+
** 2026-07-02 Thu @ 15:06:00 -0400 — Claude Code (archsetup) — phase 3 builder
- *What changed or was recommended:* Phase 3 shipped (dotfiles =e372de3=):
the =custom/bluetooth= bar module (state-following glyph, low-battery red
diff --git a/scripts/testing/tests/test_packages.py b/scripts/testing/tests/test_packages.py
index f237088..f0d8ff2 100644
--- a/scripts/testing/tests/test_packages.py
+++ b/scripts/testing/tests/test_packages.py
@@ -58,3 +58,19 @@ def test_git_installed(host):
@pytest.mark.parametrize("tool", DEV_TOOLS)
def test_dev_tool_present(host, tool):
assert host.exists(tool), "dev tool %s missing from PATH" % tool
+
+
+BLUETOOTH_STACK = ["bluez", "bluez-utils"]
+
+
+@pytest.mark.attribution("archsetup")
+@pytest.mark.parametrize("pkg", BLUETOOTH_STACK)
+def test_bluetooth_stack_installed(host, pkg):
+ assert host.package(pkg).is_installed
+
+
+@pytest.mark.attribution("archsetup")
+def test_blueman_not_installed(host):
+ # blueman was retired 2026-07-02 in favor of the dotfiles bt panel;
+ # its reappearance means the desktop_environment step regressed.
+ assert not host.package("blueman").is_installed
diff --git a/todo.org b/todo.org
index a50e4f8..d25aa5c 100644
--- a/todo.org
+++ b/todo.org
@@ -554,8 +554,8 @@ Cloned the net panel's shape over the phase 1 engine: GTK-free PanelModel + view
*** 2026-07-02 Thu @ 15:06:00 -0400 Shipped phase 3 — the bar module + blueman retirement (dotfiles e372de3)
=custom/bluetooth= over the engine: waybar-bt shim + =bt/indicator.py= (state-following glyph — slashed off/blocked/absent, plain dim idle, connected mark white; low-battery <15% adds a red pango percentage to the glyph; tooltip = connected devices with battery + Super+Shift+B hint). Signal 10; the panel pokes =pkill -RTMIN+10 -x waybar= after each status reload. Blueman retired from the Hyprland session: exec-once + both windowrules removed, applet killed live; waybar relaunched on the runtime config and the module verified on the bar (connected glyph, blueman tray icon gone). Theme drift guard caught that themes/*/waybar.css edits must mirror into the live =waybar/style.css= — all three updated. 43 suites green. ALSO closed this pass: the deferred phase 2 visual batch (bt AT-SPI smoke green after fixing its Connect/Disconnect state-following assertion — c1a8219; net smoke green on the factored css; both panels eyeballed correct in dupre). Left for phase 4: package removal (blueman out of archsetup), sxhkdrc's dwm blueman-manager binding decision rides that pass.
-*** TODO Phase 4 — bt-priv + sudoers + packages (archsetup) :feature:
-One-verb bt-priv helper + NOPASSWD sudoers rule cloning net-priv's pattern; package-list swap (blueman out, bluez-utils stays); VM test assertions.
+*** 2026-07-02 Thu @ 15:16:51 -0400 Shipped phase 4 — bt-priv shim, blueman out, VM assertions
+Dotfiles =2a026b1=: the stowed =bt-priv= shim over the phase-2 =bt.priv= module (one verb, =restart-bluetooth=; verified end-to-end against the symlinked fake-systemctl — rc 0 with =BT_SUDO= empty, rc 2 on bad verb/usage; hand-linked into =~/.local/bin=), and the sxhkd =Super+Shift+B= bind repointed from the retired blueman-manager to =st -e bluetoothctl= (the decided terminal fallback — the GTK panel is Wayland-only, and the bt CLI is hyprland-tier so dwm never gets it). 43 dotfiles suites green. archsetup: blueman dropped from the =desktop_environment= bluetooth loop (bluez + bluez-utils stay, solaar untouched); VM assertions added to =test_packages.py= (bluez/bluez-utils installed, blueman NOT installed as the retirement regression guard — collected 15, exercised on the next VM run since VM tests run committed code); =bash -n= + =py_compile= + =make test-unit= green. SUDOERS: no new rule needed, same conclusion as net-priv (2026-07-01 entry) — archsetup:1089 grants the primary user blanket =NOPASSWD: ALL=, which covers =systemctl restart bluetooth=; a narrow bt-priv rule would be dead config under the blanket grant, so phase 5's "sudoers placed" item is satisfied by the existing grant. LIVE: blueman package removed from velox (=pacman -Rns=, decision "drop it outright, both machines"); ratio needs the same + the bt-priv hand-link on its trip list.
*** TODO Phase 5 — install defaults (archsetup) :feature:
Keybind/config defaults so a fresh install lands the panel wired: waybar module present, bind set, sudoers placed.