aboutsummaryrefslogtreecommitdiff
path: root/todo.org
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-07-11 04:32:31 -0500
committerCraig Jennings <c@cjennings.net>2026-07-11 04:32:31 -0500
commitb3734c449c5efbad2e56c7810fc35f0e218e28da (patch)
treea2cc75e575a890008a48fe027d79fa52bed7f097 /todo.org
parentba7faec39eefcb483eaa4cfedd2c86f73f9aa527 (diff)
downloadarchsetup-b3734c449c5efbad2e56c7810fc35f0e218e28da.tar.gz
archsetup-b3734c449c5efbad2e56c7810fc35f0e218e28da.zip
chore: record net nm-masked verdict + first panelkit consumer
Diffstat (limited to 'todo.org')
-rw-r--r--todo.org8
1 files changed, 6 insertions, 2 deletions
diff --git a/todo.org b/todo.org
index 0dd6f57..13c51ae 100644
--- a/todo.org
+++ b/todo.org
@@ -33,8 +33,12 @@ Split out of the 2026-07-11 net-doctor-expansion spec review: that spec's new ri
Build the [[file:docs/specs/2026-07-11-net-doctor-expansion-spec.org][net doctor expansion]] (DOING). Adds the control-plane cluster (rival-manager / nm-masked / keyfile-perms) and a sharper auth verdict to the shipped net doctor (=~/.dotfiles/net/=). Archsetup owns the dotfiles work end to end — edit, test, commit, and push in =~/.dotfiles=, then drop an inbox note. Phases 1-2 are gated on the shared cross-panel run-time privilege model, which doesn't exist yet; Phase 0 builds now.
*** 2026-07-11 Sat @ 02:47:47 -0500 Built the read-only control-plane probe
New module =net/src/net/control_plane.py= plus =diag.py= wiring, on dotfiles main (=21ca3ff=, pushed). =net diagnose= now carries a =control_plane= key in its envelope with three read-only signals: NetworkManager state (masked/failed/stopped/active, finer than the plain =is-active= the ladder used), any rival manager active alongside NM (dhcpcd, systemd-networkd, iwd via =systemctl is-active=), and the active profile's keyfile permissions (=stat= under an env-overridable =NET_NM_CONNECTIONS= root, default =/etc/NetworkManager/system-connections=). Detection only: no classifier change, no new step, no bearing on =overall=. Surfaced via =net diag --json=. The masked/failed read also runs in the nmcli-down early-return path, or a masked NM would short-circuit before the probe. Every read bounded through =cmd.run='s timeout; degrades to unknown / no-rival / None on an unreadable tool or unstattable file, so a probe that can't see never invents a fault. As a normal user the real 0700 root:root dir is unstattable, so the keyfile signal reads unknown (readable only under root, e.g. the doctor's privileged path). 21 new tests, full =make test= green; =/review-code= approved (two Minor items, both Phase 1 concerns already tracked in the spec: link-scoping the rivals and guarding the keyfile path in the chmod fix). Inbox note sent to dotfiles.
-*** TODO [#C] Phase 1 — control-plane verdicts + privilege model
-Blocked on the shared cross-panel run-time privilege model. =classify= gains =rival-manager=/=nm-masked=/=keyfile-perms= (all =fixable=), ordered ahead of the generic not-running rule, with the masked check reachable in the NM-down early-return path. Fixes register as =VERBS= + =ACTIONS= (=disable-rival=/=unmask-nm=/=chmod-keyfile=), each narrowly scoped. Hard gate: must not land before the Confirm floor exists, or =net doctor --fix= runs root ops via passwordless sudo ungated. Live verification needs a real rival/masked/bad-keyfile state (a VM or a deliberately-broken host), so not solo.
+*** DOING [#C] Phase 1 — control-plane verdicts + privilege model
+Unblocked now that panelkit ships. =classify= gains =rival-manager=/=nm-masked=/=keyfile-perms= (all =fixable=), ordered ahead of the generic not-running rule, with the masked check reachable in the NM-down early-return path. Fixes register as =VERBS= + =ACTIONS= (=disable-rival=/=unmask-nm=/=chmod-keyfile=), each narrowly scoped. Live verification needs a real rival/masked/bad-keyfile state (a VM or a deliberately-broken host), so not solo.
+**** 2026-07-11 Sat @ 04:32:06 -0500 nm-masked verdict shipped + first panelkit integration
+On dotfiles main (=d73eba6=, pushed). The clean, unambiguous verdict of the three, done first to prove the panelkit-in-net rails: =classify= reads =control_plane.nm_state=; on =masked= it returns a fixable =unmask-nm= verdict (=remedy_class="privileged"=) ahead of the generic nm-service rule (=nm-restart= can't start a masked unit). New priv verb =unmask-nm= (=systemctl unmask NetworkManager=), =repair_unmask_nm= (unmask → start → verify), narration entry. The doctor resolves a privileged verdict through =panelkit.resolve()= before running: can't-elevate (GUI, no passwordless, no tty) degrades to the manual guide instead of attempting; existing tiers (no remedy_class) run unchanged. The =net= shim + test add =panelkit/src= to sys.path. Design call shipped (flagged for Craig): CLI =net doctor --fix= is the deliberate act satisfying the Confirm floor, so no CLI prompt added; panelkit contributes the run/prompt/guide degradation on the CLI; the GUI arm-press stays its confirm (panel wiring pending). 765 net tests + 65 suites green, review-code clean. Inbox note sent.
+**** TODO rival-manager + keyfile-perms verdicts (same rails)
+Held for Craig's read on two judgment calls the VM would validate: (1) verdict PRECEDENCE — a rival/bad-keyfile can coexist with a healthy link, so these must gate on an actual failure (=overall != ok= / a failing link/service) and not preempt a more-specific verdict (rfkill, auth); masked didn't have this problem. (2) whether to build the VM scenario now (Craig's pending question). =disable-rival <unit>= (=systemctl disable --now=, rival allowlist) and =chmod-keyfile=/=chown-keyfile= (600 + root, path-validated under system-connections) are straightforward; the classifier ordering is the open call.
*** TODO [#C] Phase 2 — sharpened auth verdict
Auth-reason classifier reading profile key-mgmt (=manage.py=) + scanned SECURITY (=nmcli.py=): SAE / hidden / enterprise / generic. SAE and hidden become =fixable= profile-modify (Confirm-tier); the rest stay =needs-user-action= with a cause-named message. Pairwise over (reason × profile-state). The classify logic is agent-buildable with fakes; the live profile-modify fix needs a real WPA3/hidden network to verify, so that part is manual.
*** TODO [#C] Phase 3 — flip the net spec to IMPLEMENTED