aboutsummaryrefslogtreecommitdiff
path: root/docs/specs/2026-07-03-instrument-console-panels-spec.org
diff options
context:
space:
mode:
Diffstat (limited to 'docs/specs/2026-07-03-instrument-console-panels-spec.org')
-rw-r--r--docs/specs/2026-07-03-instrument-console-panels-spec.org174
1 files changed, 174 insertions, 0 deletions
diff --git a/docs/specs/2026-07-03-instrument-console-panels-spec.org b/docs/specs/2026-07-03-instrument-console-panels-spec.org
new file mode 100644
index 0000000..2c80aa9
--- /dev/null
+++ b/docs/specs/2026-07-03-instrument-console-panels-spec.org
@@ -0,0 +1,174 @@
+#+TITLE: Instrument-console rebuild — net + bluetooth panels
+#+DATE: 2026-07-03
+#+TODO: TODO | DONE
+#+TODO: DRAFT READY DOING | IMPLEMENTED SUPERSEDED CANCELLED
+
+* IMPLEMENTED Instrument-console rebuild — net + bluetooth panels
+:PROPERTIES:
+:ID: ac23e996-a51a-466b-ad80-2faff46447bf
+:END:
+- 2026-07-04 Sat @ 12:36:56 -0500 — retrofitted by spec-sort; status set to IMPLEMENTED (reason: Panel rebuild shipped (dotfiles e993c3f); build task DONE.)
+
+* IMPLEMENTED Status
+:PROPERTIES:
+:ID: e73877f5-4f5b-4f81-b946-dbaa6145e0d5
+:END:
+- 2026-07-03 Fri @ 17:35 -0400 :: Post-impl increment (stays IMPLEMENTED): added
+ a manual rescan/scan ⟳ affordance to both panels — net NETWORKS header
+ (drives manage.rescan) and bt NEARBY header (drives on_scan / pair-mode
+ discovery), with the approved "all" busy style (Gtk.Spinner throbber + a
+ GLib breathe on "scanning…" + a one-shot list fade; no CSS keyframes exist in
+ this GTK setup). Prototype: archsetup docs/prototypes/2026-07-03-net-panel-rescan-prototype.html. Code shipped
+ UNCOMMITTED into the dotfiles repo from an archsetup session (cross-project);
+ handoff at ~/.dotfiles/inbox/2026-07-03-1733-from-archsetup-rescan-handoff.org.
+ Verified: net 584 + bt 223 unit OK, both AT-SPI smokes green (⟳ present);
+ live busy-animation feel pending Craig's eyeball.
+- 2026-07-03 Fri @ 06:49 -0400 :: DOING → IMPLEMENTED: all six phases shipped
+ (net GTK-free layer 81ec9c3, net view 800ef60; bt GTK-free layer 5318b34, bt
+ view 66f03d9; phase-6 dead-code removal f4e688e). Both panels are single-screen
+ instrument consoles, verified live on velox — 46 suites + full make test green,
+ both AT-SPI smokes green end to end, render matching the approved prototype. The
+ three folded tasks (network panel redesign, bt switch placement + title, bt
+ rename devices) closed with the build.
+- 2026-07-03 Fri @ 02:07 -0400 :: DRAFT → READY → DOING in one stroke: Craig
+ approved the design through five interactive prototype iterations and
+ authorized the no-approvals speedrun ("let's build them now... go"). The
+ review gate was the live prototype session itself.
+- 2026-07-03 Fri @ 02:07 -0400 :: Created (DRAFT) from the prototype session.
+
+* Metadata
+
+| Field | Value |
+|---------------------+------------------------------------------------------------|
+| Status | implemented |
+|---------------------+------------------------------------------------------------|
+| Owner | Craig Jennings |
+|---------------------+------------------------------------------------------------|
+| Repos | dotfiles (net/, bluetooth/, themes), archsetup |
+|---------------------+------------------------------------------------------------|
+| Normative reference | [[file:../prototypes/2026-07-03-instrument-console-panels-prototype.html][docs/prototypes/2026-07-03-instrument-console-panels-prototype.html]] |
+|---------------------+------------------------------------------------------------|
+
+* Summary
+
+Rebuild both GTK layer-shell panels (net, bluetooth) from the tabbed layout
+to the instrument-console design: one screen, no tabs, a faceplate with a
+state word + badges + radio switch + close, engraved section labels, lamp
+rows that act on click, dial meters under the console keys, and a doctor
+that does it all. The interactive prototype =panel-console-v3.html= is the
+normative design reference — when this spec and the prototype disagree on a
+visual or interaction, the prototype wins.
+
+* Decisions (all resolved — Craig, prototype session 2026-07-02/03)
+
+- Replace the tabbed panels outright. No fallback flag; git history is the
+ rollback. Net panel first, bluetooth second.
+- Advanced repair tiers leave the panel entirely. DOCTOR runs the full
+ diagnose → classify → lightest-repair → re-verify escalation (the engine
+ already does this). The surgical tiers stay CLI-only (=net repair ...=).
+- Faceplate (both panels): state lamp + state word, badges, unit label
+ (NET·01 / BT·01), radio switch (wifi radio / bt adapter power), close ✕.
+ Badges: TUNNEL (gold, net), AIRPLANE (gold, both), LOW BATT (red, bt).
+- Sections in order — net: CHANNEL, NETWORKS (+ hidden action), TUNNELS,
+ CONSOLE (DOCTOR / SPEED TEST keys), meters, output. bt: ADAPTER (with
+ clickable =discoverable= chip), PAIRED, NEARBY (+ scanning note), CONSOLE
+ (DOCTOR / SCAN), battery gauges, output.
+- Section row budgets, half-row peek, internal scroll (thin slate
+ scrollbar): NETWORKS 5.5 rows, TUNNELS 4.5, PAIRED 5.5, NEARBY 4.5.
+ In-range networks sort active-first then strongest-signal-first. Counts on
+ the engraved headers ("networks · 12 in range", "tunnels · 1 up of 9",
+ "paired · 3", "nearby · 12"). The panel silhouette never grows with list
+ length; only the output well is variable and it caps at ~170px.
+- Lamp-row grammar: green = live/connected, gold = available/actionable,
+ off = down/stored, red = failed; busy = pulsing gold during transitions.
+ Rows act on click (tunnels toggle, networks join, paired devices
+ connect/disconnect toggle, nearby devices pair).
+- Arm-first for anything disruptive or destructive, 3s auto-disarm:
+ - forget (network or bt device): hover reveals ✕; first click arms the
+ row terracotta ("forget? click ✕ again"), second fires. No dialog.
+ - disconnect (active network): click the active row; first click arms in
+ GOLD ("disconnect? click again") — disruptive, not destructive — second
+ fires.
+- Meters (net): two dials, RX·DOWN / TX·UP, gold needles, mode tag top-left
+ (LIVE green / TEST gold), HOLD tag top-right. Idle: live link throughput.
+ Speed test: cards flash gold, needles sweep the measured rate, then PIN
+ the final value with HOLD; clicking a held meter releases it to LIVE.
+ Scale 0–100 Mbps, auto-relabel to 0–1000 when a reading exceeds 100.
+ Dial top inset ~13px so the corner tags never touch the arc.
+- Speed test output well gets ONLY: location line ("location: <city> by
+ <sponsor>"), ping (+jitter), final line, conditioned tip(s). The rates
+ live in the meters, not the text.
+- Battery gauges (bt): same dial chrome; one per connected device (two
+ slots; empty slot dim "NO DEVICE"/"ADAPTER OFF"); needle+value red under
+ 15% and the LOW BATT faceplate badge lights.
+- Output well: doctor streams the checks with their narration lines
+ (viewmodel.STEP_NARRATION) and repair steps in gold; verdict line closes
+ (olive for pass/fixed). A dismiss ✕ appears in the well's corner whenever
+ it has content. Both panels.
+- WiFi radio switch: =nmcli radio wifi on|off=. Off empties NETWORKS to one
+ dim "wifi radio off" row, drops the connection, kills tailscale rows'
+ reachability; on rejoins the last network (NM autoconnect does this for
+ real). Airplane mode is system-level (Super+Shift+A owns it): both panels
+ reflect it (state word AIRPLANE, gold badge, switches down); a switch
+ flipped under airplane refuses with a toast naming the exit. A routed
+ ethernet link keeps the net panel ONLINE through airplane mode.
+- Ethernet: presence-based row pinned atop NETWORKS when a cable is up
+ ("enp… · active · wired · 1.0 Gbps" / "wired · standby"); CHANNEL swaps
+ the signal ladder for "wired · <speed> full-duplex" when routed; clicking
+ the row toggles route ownership via device disconnect/connect.
+- Pairing (bt): nearby row click → busy → passkey-confirm dialog (large
+ gold digits) → device moves to PAIRED and connects. SCAN key refreshes
+ with a "scanning…" note on the header.
+- Rename (bt): hover ✎ on a paired row → dialog prefilled → bluez
+ =set-alias= (closes the filed rename task).
+- Tooltips: any ellipsized row label carries its full text as the tooltip.
+- Dialogs (join / hidden SSID / passkey / rename) keep the in-panel dupre
+ dialog style (gold border, dark well inputs, gold caret).
+- Close: ✕ on the faceplate + Esc (already shipped; keep).
+- Folded tasks: "Network panel redesign", "Bluetooth panel: switch placement
+ + panel title", "Bluetooth panel: rename devices" — all close with this
+ build's phases.
+
+* Engine gaps (small, close during phases)
+
+- radio verb: =nmcli radio wifi on|off= helper (manage or sysio) + tests.
+- hidden-SSID join: =manage.add= grows a hidden flag
+ (=802-11-wireless.hidden yes=).
+- ethernet: device rows from =nmcli dev= (type ethernet) + disconnect/
+ connect verbs (device-level; =net down --iface= already disconnects).
+- bt rename: btctl =set-alias= one-shot verb + verify-after read.
+- bt battery: already exposed (indicator uses it).
+- speedtest meters: =run_speedtest_stream= on_update already ticks (pty).
+- link speed for wired channel line: =ethtool=-free read from
+ =/sys/class/net/<dev>/speed=.
+
+* Implementation phases
+
+1. [X] Spec + task wiring (this file; todo.org parent task with :SPEC_ID:).
+2. [X] Net GTK-free layer (TDD): viewmodel row composers for the console
+ sections (network rows sorted+counted, tunnel rows, channel facts,
+ faceplate state word derivation, meter scale logic, arm state machines
+ for forget/disconnect), PanelModel restructure (sections, no tabs).
+ Engine gaps: radio verb, hidden join, ethernet rows, wired link speed.
+3. [X] Net view rebuild: gui.py single-page console built in Python
+ (faceplate, engraved scrolled sections, console keys, cairo dial meters
+ with mode/hold tags, output well + dismiss), panel.css additions
+ (engrave, lamps, dial, badges, arm tints). AT-SPI smoke + driver
+ rewritten for the console layout. Shipped with phase 4 (dotfiles
+ 800ef60): a view-only intermediate is a broken panel (rows and switches
+ that do nothing), so view + interactions landed together.
+4. [X] Net interactions: join/hidden/forget (arm terracotta)/disconnect
+ (arm gold)/radio switch/ethernet toggle/doctor stream/speed-test-drives-
+ meters, toasts. Verified live on velox (DOCTOR streams, SPEED TEST sweeps
+ both dials then HOLD). Shipped in dotfiles 800ef60 with phase 3.
+5. [X] Bluetooth panel: same treatment end to end (faceplate + power
+ switch, adapter chip, paired/nearby lamp rows, pair passkey flow,
+ rename via set-alias, forget arm, battery gauges + LOW BATT, DOCTOR /
+ SCAN keys, output). bt smoke rewritten. Shipped in two commits mirroring
+ net: dotfiles 5318b34 (GTK-free layer + engine gaps) and 66f03d9 (view +
+ interactions + smoke). rename lands on the bluez Alias via busctl
+ (set-alias has no MAC-addressed one-shot); verified live on velox (smoke
+ green end to end, screenshot matches the prototype).
+6. [X] Live verification both panels on velox + all suites + smokes green;
+ summary of findings written to file; folded tasks closed; dead code
+ removed; session context finalized.