diff options
| author | Craig Jennings <c@cjennings.net> | 2026-07-02 13:31:48 -0400 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-07-02 13:31:48 -0400 |
| commit | 7091f3472be5d09fcf01a539f2ca1c8d88d618d1 (patch) | |
| tree | d88bd8928579a6ddd50ef7df310a54b779333bf0 | |
| parent | 33adcc2147e816417d06dfcfd1f076af28c73d77 (diff) | |
| download | archsetup-7091f3472be5d09fcf01a539f2ca1c8d88d618d1.tar.gz archsetup-7091f3472be5d09fcf01a539f2ca1c8d88d618d1.zip | |
docs(spec): bluetooth phase 1 shipped, pw-dump ground truth noted, css factoring moved to phase 2
| -rw-r--r-- | docs/design/2026-07-02-bluetooth-panel-spec.org | 20 | ||||
| -rw-r--r-- | todo.org | 6 |
2 files changed, 22 insertions, 4 deletions
diff --git a/docs/design/2026-07-02-bluetooth-panel-spec.org b/docs/design/2026-07-02-bluetooth-panel-spec.org index 3ada112..a6b60ae 100644 --- a/docs/design/2026-07-02-bluetooth-panel-spec.org +++ b/docs/design/2026-07-02-bluetooth-panel-spec.org @@ -223,7 +223,10 @@ The doctor chain, in order, each an evidence row: sink/source, or the card stuck in HSP/HFP when A2DP is expected: evidence names the active profile and offers the repair inline — "Switch to A2DP" drives =wpctl set-profile <card> <index>= (profile - inventory from =wpctl status=/=inspect=), verifies the sink came back + inventory from =pw-dump= — ground truth 2026-07-02: wpctl can't + enumerate a card's profiles, and the card's =bluez5.profile= prop + reads "off" mid-stream; the card's Profile param and the sink node's + =api.bluez5.profile= are authoritative), verifies the sink came back in the expected profile, and reports fixed or no-change. In v1 per Craig (2026-07-02): this failure mode has bitten repeatedly, so it gets the one-click fix, not just a diagnosis. Connected audio-device @@ -360,6 +363,21 @@ Non-blocking; it's the donor default made explicit. * Review and iteration history +** 2026-07-02 Thu @ 13:31:00 -0400 — Claude Code (archsetup) — phase 1 builder +- *What changed or was recommended:* Phase 1 shipped (dotfiles =eb2230f=): + the =bt= engine package, 101 tests over fakes, live-verified read-only + on velox. Two spec corrections from ground truth: profile inventory + comes from =pw-dump= (wpctl can't enumerate profiles), and the active + profile reads from the card's Profile param / sink's + =api.bluez5.profile= (the card's =bluez5.profile= prop is unreliable). + The shared-css factoring moved into phase 2 — net's css is an inline + string in its =gui.py=, so extracting it belongs with the first second + consumer rather than as a standalone poke at the working net panel. +- *Why:* Build order per the DOING decomposition; corrections keep the + spec honest for the phase 2 implementer. +- *Artifacts:* dotfiles =bluetooth/src/bt/=, =tests/bt/=, the stowed + =bt= shim; dated phase 1 entry under the todo.org parent. + ** 2026-07-02 Thu @ 13:10:00 -0400 — Claude Code (archsetup) — reviewer + responder - *What changed or was recommended:* Ran the spec-review gate: passed. All four decisions were already DONE (cookie added to the heading); @@ -545,11 +545,11 @@ Spec: [[file:docs/design/2026-07-02-bluetooth-panel-spec.org]] (DOING — review A bluetooth panel driving a CLI underneath (bluetoothctl one-shot verbs), consistent in look and feel with the net panel (GTK4 + layer-shell + Blueprint, humble-object presenter, verify-everything). Minimalistic interface, full functionality, plus a diagnostics/troubleshooting section mirroring the net panel's Diagnostics tab. Bar module glyph opens it. Craig's ask (2026-07-02): follow UX/UI best practices; where the net panel's patterns conflict with best practices, file a net-panel bug task rather than clone the flaw. -*** TODO Phase 1 — engine bt package (dotfiles) :feature: -Adapter/device/scan probes over fake-bluetoothctl, status + doctor chain (rfkill, service, powered, reachability, audio profile probe + A2DP switch repair over fake-wpctl) — pure TDD, no GTK. =bt status= and =bt doctor= work from a terminal. Factor the shared dupre css asset if the settings panel hasn't already. +*** 2026-07-02 Thu @ 13:30:42 -0400 Shipped phase 1 — the bt engine package (dotfiles eb2230f) +=bluetooth/src/bt/= mirrors the net engine's layout: btctl parsing boundary (show/devices/info, connect-error classifier), sysio rfkill/airplane, audio module over pw-dump/wpctl (HSP probe + A2DP switch repair with verify-after), redacted eventlog, six repair tiers, and the doctor chain (adapter → rfkill → service → powered → devices → audio profile) with safe auto-repairs behind =--fix= (never auto-connects; airplane blocks are named, not fought). 101 tests over fake binaries; 42 suites green (=make test= glob auto-discovered =tests/bt/= — gate check verified). Live read-only on velox: =bt status= + =bt doctor= read the real adapter/devices/audio graph; =~/.local/bin/bt= hand-linked (no restow under running Hyprland). Ground truth vs spec: profile inventory needs =pw-dump= (wpctl can't enumerate), and the card's =bluez5.profile= prop is unreliable — sink node's =api.bluez5.profile= is authoritative. Deferred INTO phase 2: the shared dupre css factoring (net's css is an inline string in =gui.py=, not an asset — factoring it without the bt-panel consumer just risks the working net panel). *** TODO Phase 2 — panel (dotfiles) :feature: -PanelModel presenter + Blueprint pages (Devices with Paired/Nearby, Diagnostics), worker-thread wiring, pairing-dialog pty state machine, bt-panel toggle wrapper, AT-SPI smoke. Super+Shift+B rebind. +PanelModel presenter + Blueprint pages (Devices with Paired/Nearby, Diagnostics), worker-thread wiring, pairing-dialog pty state machine, bt-panel toggle wrapper, AT-SPI smoke. Super+Shift+B rebind. Carries the shared dupre css factoring deferred from phase 1 (extract net's inline =_CSS= to the common asset, point both panels at it). *** TODO Phase 3 — bar module custom/bluetooth (dotfiles) :feature: Glyph states, tooltip with battery + keybind hints, low-battery surface, refresh signal, waybar config + suite coverage; blueman retirement per the decision. |
