aboutsummaryrefslogtreecommitdiff
path: root/todo.org
diff options
context:
space:
mode:
Diffstat (limited to 'todo.org')
-rw-r--r--todo.org208
1 files changed, 14 insertions, 194 deletions
diff --git a/todo.org b/todo.org
index 3f0dd5f..48819eb 100644
--- a/todo.org
+++ b/todo.org
@@ -3294,6 +3294,20 @@ Verified rather than assumed: =~/.telega/telega-server.log= carries zero =tdat_p
Re-graded =[#C]= → =[#D]= per the bug matrix. There is no defect to fix here; it is a watch item with a named tell, and the severity × frequency read is cosmetic (host coredump noise on a metric we own) × rare edge case → P4 → =[#D]=. It stays on the list only so the tell isn't lost.
The maintenance console's coredump metric flagged telega-server on ratio (8 coredumps) and velox (18). Root cause was a version skew: the Dockerized =zevlg/telega-server:latest= is frozen at the 2026-06-05 build while the installed elisp lagged at 20260513, so the newer server's plist parser choked on the older elisp's output. .emacs.d fixed it by upgrading telega to 20260706 on both machines (docker kept, =docker pull= is a no-op against the frozen image). Host-coredump pollution should stop. If zevlg later pushes a =:latest= that outruns the installed elisp, the skew and the coredumps recur — the tell is a fresh =tdat_plist_value:500= assertion in =~/.telega/telega-server.log=. The durable escape is a host-native pinned TDLib build, at the cost of an AUR source build.
+** TODO [#B] Proton static WireGuard profiles pass no traffic :chore:network:
+:PROPERTIES:
+:LAST_REVIEWED: 2026-09-09
+:END:
+wg-US-CA-144, wg-US-TX-714 and wg-NL-781 (all on wgpvpn) complete a WireGuard handshake and answer ICMP at 10.2.0.1, then forward nothing: no DNS on any transport, no HTTPS payload, no IPv6. The same account over the Proton CLI works, so the static configs are what Proton stopped honoring (the shape of an expired certificate on the profile). Diagnosed 2026-09-01.
+
+The net doctor now names these as a dead tunnel and brings them down (dotfiles f56fd1a), which gets the machine back online but doesn't restore the tunnels. Two ways out: re-download the WireGuard configs from the Proton dashboard and re-import them (nmcli connection import type wireguard file ...), or drop the static profiles and use the Proton CLI only. Needs the Proton account, so not solo.
+
+** TODO [#C] Declined dot-link-restore branch untested :test:network:dotfiles:solo:quick:
+:PROPERTIES:
+:LAST_REVIEWED: 2026-09-09
+:END:
+repair_tunnel_dot_off (dotfiles net/src/net/repair.py) puts a tunnel link back to its DoT mode when turning DoT off didn't bring names back, and the evidence says "put back to <mode>" only when that restore succeeded. The restore-declined branch has no direct test. Give fake-resolvectl a second failure switch (FAKE_RESOLVECTL_DOT_RESTORE_FAIL) so the wording can be asserted absent as well as present. Follow-up from the f56fd1a review.
+
* Archsetup Resolved
** DONE [#A] Reseat velox input-cover ribbon — phantom power button :bug:velox:hardware:
CLOSED: [2026-08-26 Wed] DEADLINE: <2026-08-26 Wed>
@@ -3539,47 +3553,6 @@ carry a date and Craig's return date isn't known yet — date it and raise it to
Workaround in the meantime: Bluetooth mouse, already in use.
-** DONE [#A] Idle commits silently drop the screen-lock wrapper :bug:hyprland:dotfiles:security:
-CLOSED: [2026-08-04 Tue] DEADLINE: <2026-07-29 Wed>
-:PROPERTIES:
-:CREATED: [2026-07-29 Wed]
-:LAST_REVIEWED: 2026-07-29
-:END:
-Caught live 2026-07-29 05:30, seconds after it happened, while verifying that Craig's watch-stage change had landed.
-
-=idle.py= renders the *whole* hypridle.conf, including a hardcoded =GENERAL= block. That block said =lock_cmd = pidof hyprlock || hyprlock=. The live config said =|| screen-lock=. So every idle-stage commit through the panel rewrote =lock_cmd= and dropped the wrapper out of the chain.
-
-The wrapper is not incidental. It carries the flock duplicate guard (the fix for the 2026-07-27 unrecoverable wedge), the crash-relaunch watchdog, and the relaunch log. Parking one stage removed all three in a single write, and nothing said so.
-
-=tests/settings/test_settings.py:562= asserted the bare =|| hyprlock= form, so the suite *enforced* the regression. That is why 3845 tests stayed green through a day of work on exactly this subsystem. A test can pin the bug as readily as the fix.
-
-The false-negative this sets up is worth naming: with the wrapper gone the relaunch log stops receiving entries, and an empty log reads as "the problem is fixed" when it means "the instrument was removed". The =screen-lock= header already warns that an empty file is not proof; this is the mechanism that would have produced one.
-
-Fixed by dotfiles =ab059fb= (2026-07-29 05:59). Verified 2026-08-04 against the tree rather than the commit message: =idle.py:47= renders =lock_cmd = pidof hyprlock || screen-lock || hyprlock=, the live =hypridle.conf= matches, and =test_settings.py= now asserts the wrapper is in the chain plus a second test for the bare-hyprlock fallback. The test that used to pin the bug now pins the fix.
-
-The evidence that matters is the one this task named: =~/.local/var/log/screen-lock.log= is *receiving entries*, so the instrument is present. An empty log was the false negative to fear, and it did not happen.
-
-FIXED here, TDD, in the working tree pending commit:
-- =idle.py= =GENERAL= now names =screen-lock=, with a comment saying why the line is load-bearing.
-- The test now pins the wrapper form. Red first against the old template.
-- Live config rewritten through the panel's own path and hypridle restarted; =lock_cmd= confirmed back to =screen-lock=, one hypridle running.
-
-Grading: Critical severity (=write_conf= truncates, so any hypridle key the renderer does not model is silently deleted rather than preserved — that is configuration data loss, and the =lock_cmd= case proved it happens in the field) x some users sometimes (only when an idle stage is committed, which is rare) = P2 = [#B].
-
-An earlier draft graded this [#A] on a "security carve-out". That was wrong: disarming the guard is an availability problem, not a leak, and the carve-out is for privacy, security, compliance and safety. The severity band is what carries the weight here, and silent deletion of configuration is the =Critical= band's data-loss case.
-
-Two further fixes came out of an independent review of the first one:
-
-- *Fail-open restored.* =pidof hyprlock || screen-lock= made the wrapper the end of the chain, and =screen-lock= is a stow symlink in =~/.local/bin=, not a system binary. An unstowed tree, or a hypridle started without =~/.local/bin= on PATH, resolves it to 127 — so the screen would never lock *at all*. That is worse than the duplicate client the wrapper prevents. The chain now ends =|| hyprlock=, matching the wrapper's own fail-open discipline.
-- *The file now says it is generated.* Three comment lines at the top of the rendered output name the renderer and warn that edits are overwritten. The absence of that header is how the divergence survived unnoticed.
-
-Still open, and why this stays a task rather than closing with the fixes: the header warns, but nothing *prevents* the next divergence, and the exposure is wider than =lock_cmd= alone. The review enumerated it:
-
-- =before_sleep_cmd= and =after_sleep_cmd= sit in the same hardcoded block, at identical risk.
-- Every stage command is hardcoded in =_stage_commands= (brightness level, lock, watch, dpms, suspend), same one-way overwrite.
-- =write_conf= *truncates* rather than merges, so any hypridle key the renderer does not know about (=ignore_dbus_inhibit=, =ignore_systemd_inhibit=, =inhibit_sleep=, =on-lock=, =on-unlock=) is deleted rather than preserved. That is the largest hole: a key nobody has added yet would vanish the first time a stage is parked.
-
-Options: have the renderer preserve the existing general block and unknown keys instead of emitting its own, or accept the template as the single source and move every hypridle setting into the panel. A design call for Craig, and the truncation half is the part that will bite next.
** DONE [#C] hypridle.conf is generated per-machine but tracked :refactor:dotfiles:
CLOSED: [2026-08-14 Fri]
:PROPERTIES:
@@ -3642,159 +3615,6 @@ ratio and absent on velox; full evidence and rationale in
Scope: installer step + rule file + tests per existing shapes, and apply both
live to velox over tailscale (daily-driver sync — neither exists there today).
-** DONE [#A] Comet KVM setup for truenas :feature:infra:truenas:
-CLOSED: [2026-08-08 Sat]
-:PROPERTIES:
-:CREATED: [2026-07-27 Mon]
-:LAST_REVIEWED: 2026-07-27
-:END:
-Resolved: Craig wired up and configured the Comet himself, confirmed working
-2026-08-08. The ATX power-board follow-up (hard power-cycle for a truly wedged
-box) remains unfiled — raise it if the next outage shows the KVM alone isn't
-enough.
-Wire up the GL.iNet Comet (GL-RM1) IP KVM against truenas. It was bought 2026-01-14 for exactly this job and its KB node still reads "Arrived, not yet set up."
-
-Why now: truenas went dark 2026-07-24 and stayed unreachable. Diagnosis from ratio on 2026-07-27 — no tailnet contact for 3 days, 100% packet loss on 192.168.86.5, ARP entry FAILED (nothing answers ARP for the address, so the NIC is down at layer 2), every service port closed, while the gateway and a dozen other LAN hosts stayed reachable. Wake-on-LAN to 70:85:c2:db:9d:94 drew no response. With no console and no out-of-band power control there was no remote remedy at all, so recovery needed hands on the box. The Comet closes exactly that gap: BIOS/UEFI console, Wake-on-LAN, and browser access over its native Tailscale integration.
-
-Not :solo: — the physical cabling is Craig's, and the Tailscale enrollment needs his account.
-
-Steps, from the KB node ([[id:67bc5994-a763-48e2-926f-4ac0d1bad3db][GL.iNet Comet (GL-RM1) - KVM]]):
-1. HDMI from truenas video out to the Comet's HD IN.
-2. USB-A-to-USB-C from the Comet to a truenas USB port (keyboard/mouse emulation).
-3. Ethernet to the network.
-4. Power via USB-C (5V/2A).
-5. Reach the web interface and enroll it in Tailscale, so it's usable when the LAN side of truenas is the thing that's broken.
-
-Then verify while truenas is healthy, rather than discovering the gaps during the next outage: confirm the console shows POST and the BIOS, that keyboard input reaches the box, and that Wake-on-LAN from the Comet actually powers it on. Enable WOL in the truenas BIOS if that last check fails — this outage never established whether it was on.
-
-Worth considering as a follow-up: the ATX power board accessory gives hard power-cycle control for a truly wedged box, which the KVM alone can't do.
-** DONE [#A] Review post-archsetup laptop setup steps (velox 2026-04-10)
-CLOSED: [2026-08-08 Sat]
-:PROPERTIES:
-:LAST_REVIEWED: 2026-08-08
-:END:
-Closed at the 2026-08-08 session: every open item got its automate-vs-document
-call and the work landed the same night (tests green, committed). Residual:
-velox itself still needs the new tlp.d radio line and a dotfiles pull — folded
-into the [#A] sleep/suspend task, which works the same files on velox anyway.
-Items discovered during velox setup that needed manual intervention after archsetup.
-Decide which should be automated in archsetup vs documented as post-install steps.
-
-*** 2026-08-08 Sat @ 04:43:42 -0500 Automated radio enable via TLP (rfkill boot soft-block)
-Root cause sharpened during triage: archsetup masks systemd-rfkill on laptops
-(it fights TLP), so nothing restored radio state at boot — the "unblock once
-should stick" premise was wrong under the mask. Fix in the TLP custom conf:
-=DEVICES_TO_ENABLE_ON_STARTUP="bluetooth wifi"=, the TLP-native mechanism.
-configure_tlp_power parametrized for tests; covered by
-tests/installer-steps/test_configure_tlp_power.py.
-
-*** 2026-07-04 Sat @ 11:48:24 -0500 Automated /efi restrictive mount permissions in fstab generation
-archsetup:2827-2836 now rewrites the /efi fstab line to =fmask=0177,dmask=0077= (idempotent), so fresh installs no longer land the world-accessible =fmask=0022,dmask=0022= default. Confirmed via the 2026-07-04 task audit. (Original velox note: default vfat mount had =fmask=0022,dmask=0022=, hand-fixed to restrictive; bootctl warned about a world-accessible random-seed file.)
-
-*** 2026-08-08 Sat @ 04:43:42 -0500 Automated tmp.mount mask for ZFS /tmp
-New mask_tmp_mount_for_zfs, called from configure_snapshots' ZFS branch:
-masks tmp.mount only when the pool actually carries a dataset mounted at
-/tmp (exact match), silent no-op without zfs or without the dataset. Covered
-by tests/installer-steps/test_mask_tmp_mount_for_zfs.py; the orchestrator
-dispatch pin updated.
-
-*** 2026-08-08 Sat @ 04:43:42 -0500 Automated CPU microcode install by vendor
-New install_cpu_microcode, first in boot_ux so grub-mkconfig and mkinitcpio's
-microcode hook both see the installed /boot/<vendor>-ucode.img: vendor_id from
-/proc/cpuinfo → intel-ucode / amd-ucode, error_warn on unknown vendor.
-Covered by tests/installer-steps/test_install_cpu_microcode.py; boot_ux
-sequence pin updated.
-
-*** 2026-07-04 Sat @ 11:48:24 -0500 Automated syncthing user-service enable in archsetup
-archsetup:2263-2271 now installs syncthing and enables the user service (via symlink), so fresh installs no longer leave it installed-but-disabled. Confirmed via the 2026-07-04 task audit. (Original velox note: package installed but service not enabled; hand-fixed with =systemctl enable --now syncthing@cjennings=.)
-
-*** 2026-08-08 Sat @ 04:43:42 -0500 Closed the awww-daemon crash watch — no recurrence
-The April boot crash never recurred across four months of daily use on both
-machines (and the wallpaper stack has since been reworked). Reopen as its own
-bug with fresh evidence if it ever comes back.
-
-*** 2026-08-08 Sat @ 04:43:42 -0500 Automated touchpad device detection in the pointer scripts
-The scripts were already in stowed dotfiles with binds — the open half was the
-hardcoded Framework device name. Both touchpad-auto and toggle-touchpad now
-auto-detect the touchpad (first pointer named *touchpad*, pixa fallback) and
-derive the internal-pointer exclusion set from the detected name, so they
-agree on any machine. Test seams added (--detect / --has-external-mouse);
-tests/touchpad-auto/ new, toggle-touchpad suite still green. Dotfiles commit;
-velox picks it up on its next pull.
-
-*** 2026-08-08 Sat @ 04:43:42 -0500 Documented bluetooth pairing in the post-install checklist
-Inherently interactive, so it can't ride the installer. Documented in the new
-[[file:docs/post-install-checklist.org][docs/post-install-checklist.org]] along
-with the Proton Bridge steps — the standing home for manual post-install work.
-Consider: document as post-install step. No automation possible.
-
-*** 2026-05-26 Tue @ 13:32:31 -0500 pocketbook install concern moot — pulled from publication, folded in-tree
-Resolved by removing pocketbook from archsetup's provisioning entirely. It's nowhere near ready, so the github mirror + cjennings.net repo were deleted and the project was folded into the archsetup tree at =pocketbook/=. Dropped the =gtk4-layer-shell= dep + =pip_install= from =archsetup= and the clone from =scripts/post-install.sh=. No fresh install pulls pocketbook now, so "not installed on velox" no longer applies. Re-wiring the install is tracked in the new pocketbook development backlog.
-
-*** TODO Review: Tailscale needs login after install
-~tailscaled~ service was enabled but needed ~tailscale up~ for interactive auth.
-Old machine entry needed cleanup in admin console.
-Consider: document as post-install step.
-
-*** TODO Review: docs/ directories need manual sync from existing machine
-docs/ dirs (gitignored) for ~/code and ~/projects repos needed scp/rsync from ratio.
-Same for ~/.emacs.d/docs/. Not in git, so not available after clone.
-Consider: document as post-install step or create a sync script.
-** DONE [#C] Waybar modules run together — need subtle separators :bug:dotfiles:waybar:
-CLOSED: [2026-08-08 Sat]
-Closed at the 2026-08-08 task review: Craig confirms the separator work landed
-a while back and the bar reads correctly now.
-Craig misreads where one module ends and the next begins — the wind (weather) value runs straight into the date with no visual stop, so he reads the wind figure as the start of the date. Add a light, subtle separator or spacing between adjacent Waybar modules.
-Grading: Minor severity (legibility, nothing broken) x frequent (every glance at the bar) = P3 = [#C].
-Not fully :solo: — needs Craig's eye on the result (separator style is a taste call, plus a live visual check). Prior work added a date-facing divider (dotfiles 103cccb); evidently not enough, so revisit the whole inter-module treatment rather than just the weather/date seam. From .emacs.d handoff 2026-07-20-1114 (roam capture; waybar is archsetup-owned per the dotfiles standing rule).
-** CANCELLED [#C] Add a whole-display dim mode :feature:hyprland:
-CLOSED: [2026-08-08 Sat]
-Killed at the 2026-08-08 task review: the July auto-dim work covers the actual
-need; no separate dim-everything mode wanted.
-Extend auto-dim with an explicit “dim everything” setting for bright
-non-dark-mode contexts, with a security/usability review of its scope.
-** DONE [#C] Fix install errors surfaced by the 2026-05-11 VM test run
-CLOSED: [2026-08-08 Sat]
-:PROPERTIES:
-:LAST_REVIEWED: 2026-07-06
-:END:
-Closed at the 2026-08-08 task review: every archsetup-attributable error was
-fixed and verified (fontconfig, dconf x2, emacs-stow, AUR exit-0 logging at
-the root); the residual four reproduce unchanged and are diagnosed
-environment/non-critical, with two 2026-06-28 full runs attributing zero
-issues to archsetup. Residual thread: confirm the firewall nf_tables pair on
-bare metal at the next real install — no container task needed to carry it.
-*** 2026-06-28 Sun @ 13:29:29 -0400 Audit reconcile: 2026-06-28 btrfs+zfs runs reproduce the same residual set
-Newer full runs landed since the 2026-06-11 reconcile below: the 2026-06-25 zfs run (Testinfra 96/0) and the 2026-06-28 btrfs+zfs runs (97/0, "zero attributed issues"). The residual four were NOT fixed and reproduce unchanged: =enabling firewall= (archsetup:1496-1498, carries a VM-kernel note), =enabling gamemode for user= (archsetup:2221, non-critical), and =tidaler (AUR)=. Zero archsetup-attributed Testinfra issues across both profiles confirms these are environment / non-critical, not archsetup bugs. Bare-metal confirmation of the firewall pair is still the open thread.
-
-*** 2026-06-15 Mon @ 23:53:21 -0500 Audit reconcile: latest VM run (2026-06-11) confirms the surviving error set
-The most recent VM run (=test-results/20260611-113904/=) carries four error-summary entries: =enabling firewall= + =verifying firewall is active= (the iptables/nf_tables "Could not fetch rule set generation id" pair, still unconfirmed on bare metal), =enabling gamemode for user= (non-critical), and =tidaler (AUR)=. The earlier fontconfig/dconf fixes held — none reappear. So the count is down from the 7→6 anchor below to four, all of them the known-residual items already itemized.
-Errors logged during the VM install. Status as of the 2026-05-11 18:36 run (=test-results/20260511-183643/archsetup-output.log=) after the =48c9439= fontconfig/dconf fix: 7 → 6.
-- refreshing font cache — RESOLVED in =48c9439= (now installs =fontconfig= before calling =fc-cache=).
-- configuring GTK file chooser — RESOLVED in =ecab29f= (switched to a system-wide dconf db at =/etc/dconf/db/site.d/=; needs no session bus during install).
-- configuring GNOME interface settings in dconf — RESOLVED in =ecab29f= (same fix as the GTK file chooser above).
-- enabling firewall — exit 1: =iptables v1.8.13 (nf_tables): Could not fetch rule set generation id: Invalid argument=. Still present in the 18:36 run; likely a VM-kernel/nf_tables artifact — confirm on bare metal before treating as an archsetup bug.
-- verifying firewall is active — exit 1 (follow-on from the firewall-enable error).
-- enabling gamemode for user — exit 1 → step "gaming" FAILED — non-critical.
-- tidaler (AUR) — logged in the error summary with exit code 0 (odd; logging quirk or transient AUR build noise?).
-Also seen in the 18:36 run's log-diff (post-install systemd noise, probably VM-environment): =pam_systemd … CreateSession failed= / =logind: Failed to start session scope … Permission denied=, and =Failed to start Proton VPN Daemon= (no VPN config in the test VM).
-
-*** 2026-05-19 Tue @ 13:18:56 -0500 Fixed AUR exit-0 logging bug at the root
-Root cause was in =retry_install=: =last_exit_code=$?= ran AFTER =if eval ...; then return 0; fi=. Bash defines an if-compound's exit status as zero when no condition tested true, so a failing eval's exit code got overwritten with 0 before reaching =error_warn=. Fix in =8221c54=: capture =$?= from =eval= directly into a local var, then compare against the captured value in the if. VM-verified in =test-results/20260519-115318/=: =mkinitcpio-firmware (AUR)= and =tidaler (AUR)= now report =error code: 1= (yay's actual exit) instead of the misleading =error code: 0=. The same packages still appear in the summary because yay returns non-zero when sub-deps fail to build (e.g. =aic94xx-firmware=), but the codes are accurate now. If the underlying sub-dep failures stay noisy, that's a separate concern — open a new task.
-
-*** 2026-05-16 Sat @ 09:00:41 -0500 AI Response: Surfaced the expanded AUR-exit-0 pattern
-2026-05-16 07:40 VM run passed (52/0/5) with the same warning profile as the 2026-05-11 18:36 run. Error count went 7 → 13: 5 fixed/unchanged, +5 new AUR-exit-0 entries (broadens the existing tidaler item into the dedicated =[#B]= subtask above), +1 genuinely new error in =setting up emacs configuration files= (=git pull= ran in =~/.emacs.d= which existed from stow but had no =.git=). Patched =archsetup:1932-1945= with a three-branch check: clone if missing/empty, pull if =.git= exists, =git init=/=fetch=/=checkout= in place if the dir came from stow.
-
-*** 2026-05-19 Tue @ 01:25:26 -0500 Verified the b9907c7 emacs-stow fix end-to-end
-=make test= 21:44 → 22:29 (42 min), =test-results/20260518-214516/=. 52/0/5, =ArchSetup Exit Code: 0=. The third-branch path fired correctly — install log =archsetup-2026-05-18-21-45-46.log:14358-14365= shows =From https://git.cjennings.net/dotemacs= → =[new branch] main -> origin/main= → =Reset branch 'main'= → =branch 'main' set up to track 'origin/main'=. No exit-128, no =fatal: not a git repository=. Error Summary down to 7 (was 13 on 2026-05-16); the emacs entry is gone. AUR exit-0 logging triggered for 2 packages this run (mkinitcpio-firmware, tidaler) vs 6 on 2026-05-16 — same bug class, fewer triggers, still tracked under =[#B] AUR exit-0 logged as error=. Issue Attribution: 1 ARCHSETUP entry (Proton VPN Daemon failed — known VM-no-VPN-config artifact). Cleanup ran clean via the normal path.
-** CANCELLED [#C] Review current tool pain points annually
-CLOSED: [2026-08-08 Sat]
-:PROPERTIES:
-:LAST_REVIEWED: 2026-07-06
-:END:
-Killed at the 2026-08-08 task review: an undated annual intention that never
-fired — pain points get surfaced organically as they bite.
-Once-yearly systematic inventory of known deficiencies and friction points in current toolset
** CANCELLED [#B] agent-text relay reports success for a message that went nowhere :bug:
CLOSED: [2026-08-19 Wed]
:PROPERTIES: