From d8d8c532798cb8be59ca84407022233afa2b79bb Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Thu, 2 Jul 2026 15:18:20 -0400 Subject: 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. --- archsetup | 3 ++- docs/design/2026-07-02-bluetooth-panel-spec.org | 18 ++++++++++++++++++ scripts/testing/tests/test_packages.py | 16 ++++++++++++++++ todo.org | 4 ++-- 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. -- cgit v1.2.3