aboutsummaryrefslogtreecommitdiff
path: root/todo.org
Commit message (Collapse)AuthorAgeFilesLines
* chore(todo): re-stamp task-review batch, tag two quick tasksCraig Jennings68 min.1-6/+15
| | | | Daily task-review pass over the seven oldest-unreviewed tasks: all kept as-is and re-stamped to 2026-06-05. Tagged the TTY C-; keymap task :solo:quick: and the Slack popup task :quick:.
* chore(todo): file slack-popup and ghostel selection-color tasksCraig Jennings5 hours1-0/+6
|
* feat(term): replace vterm with ghostel as the terminal engineCraig Jennings10 hours1-12/+89
| | | | | | | | I swapped the terminal engine from vterm to ghostel (libghostty-vt) everywhere. term-config replaces vterm-config (the F12 terminal, the C-; x menu, tmux history capture), and ai-term replaces ai-vterm (the F9 Claude-agent launcher). ghostel renders the agent TUI without vterm's flicker under heavy streaming, and one engine now covers every terminal workflow. Two behavior changes fall out of the swap. F9 launches in a terminal frame now: ghostel renders in TTY frames, so the old GUI-only guard is gone. Terminal windows no longer dim when unfocused: ghostel resolves its palette into the native module per-terminal, so there's no per-window color hook to dim through the way vterm had. auto-dim drops its vterm color-advice path, the dashboard Terminal button launches ghostel, and the vterm and vterm-toggle packages are removed. The tmux pane-history and copy-mode machinery carried over unchanged. It keys on the pty tty, which ghostel exposes.
* chore(todo): restore orphaned heading, file TTY keymap taskCraig Jennings44 hours1-1/+13
| | | | | | I restored the heading "Color dashboard navigator independently of list items" above its PROPERTIES drawer. The 2026-06-02 archive cleanup dropped the heading, which orphaned the drawer and body into the preceding DONE task and tripped org-lint's obsolete-properties-drawer check. org-lint is clean again. I also filed "TTY-accessible personal C-; keymap" [#B]: C-; is GUI-only, so the whole custom prefix family is unreachable in a terminal. The task records the single-point fix in keybindings.el and the candidate TTY-safe mirror prefixes.
* chore(todo): drop keybinding-display.md item from pearl follow-upsCraig Jennings3 days1-1/+0
|
* chore(todo): archive resolved tasks and file pearl follow-upsCraig Jennings3 days1-41/+47
| | | | Move the f9 toggle, completing-read prompts, and GPG pinentry subtrees into Resolved, and file the pearl vanilla-config dogfooding follow-ups surfaced by the cross-project handoff.
* feat(ui): name the operation in completing-read promptsCraig Jennings3 days1-1/+16
| | | | | | | | A picker prompt is the last thing shown before a command commits, so a bare noun leaves a mis-keyed command ambiguous. Hitting C-f8 (project agenda) instead of C-f9 (AI-vterm picker) gave the same "Project:" prompt with no signal which one was about to run. Reworded 17 prompts across 8 modules so each names the operation rather than just the thing being chosen: "Project:" becomes "Show agenda for project:", "F6:" becomes "Run tests:", the dwim-shell sub-prompts gain their context (checksum algorithm, PDF compression quality, text-to-speech voice, run dwim-shell command), the two contact pickers split into "Find contact:" and "Insert contact email:", and the dirvish ediff, org finalize, and custom-comments length/box-style prompts get the same treatment. I audited all ~124 completing-read / read-* call sites; the rest already named their operation and were left alone. These are prompt-string changes only, no logic touched.
* chore(todo): reconcile stale tasks and re-stamp the reviewed batchCraig Jennings3 days1-13/+22
| | | | | | | | | | Audit reconciliation: - EAT consolidation: moved DOING back to TODO — the eval matrix has no recorded run since the 2026-05-26 direction note, so it isn't active work. - Finish terminal GPG pinentry: CANCELLED as a duplicate. The "Terminal GPG pinentry Completion" task is canonical; its audit already found the terminal-pinentry branch gone, so the work restarts from main and is tracked there. - M-F9 close: added a note that it's still a bug, distinct from the F9 toggle collapse — close should leave the surrounding layout intact, and cj/--ai-vterm-close-buffer still deletes the window. - De-linked the coverage-v1 cross-reference, which pointed at a session file that was never archived. Review: re-stamped LAST_REVIEWED on the seven oldest-unreviewed tasks (debug-profiling, org-noter, API workspace, Company-to-Corfu, F2 preview, TRAMP/dirvish, F-key Completion), all kept as-is.
* fix(ai-vterm): make F9 a faithful toggle of the agent splitCraig Jennings3 days1-0/+3
| | | | | | | | | | | | F9 toggle-off used quit-restore-window to dismiss the agent. With several agents alive sharing one slot, switching among them (C-F9) reuses the window via set-window-buffer, which leaves the window's quit-restore parameter pointing at the first agent shown. Once stale, quit-restore-window falls back to switch-to-prev-buffer and surfaces a different agent instead of removing the window, so F9 appeared to "show another agent" rather than hide the split. Toggle-off now collapses the split with delete-window, which is independent of the slot's buffer history, so the working buffer reclaims the frame. Geometry is captured first so the next toggle-on re-splits at the same width. Toggle-on reopens the exact agent that was hidden (new cj/--ai-vterm-last-hidden-buffer), falling back to the most-recent agent only when that buffer has been killed. Hide-then-show is now a faithful round trip, not a jump to whichever agent is most-recent in buffer-list. Sole-window toggle-off returns to the most-recent non-agent buffer instead of other-buffer, which could land on another agent. I updated the two reuse-edge-window tests that asserted the old restore-displaced-into-a-kept-slot behavior to match the new always-collapse behavior.
* chore(todo): task-review hygiene passCraig Jennings4 days1-7/+13
| | | | I stamped LAST_REVIEWED on the seven oldest-unreviewed tasks and tagged the gptel-magit velox bug and the Signal dashboard task as quick.
* feat(ai-vterm): gate the F9 launcher to GUI framesCraig Jennings5 days1-0/+8
| | | | | | AI-vterm launches a graphical vterm side window, so F9 / C-F9 / M-F9 now decline with a message in a terminal frame instead of opening a vterm. The guard checks the current frame at command time rather than at load. That matters under the daemon, which serves GUI and terminal frames both with display-graphic-p nil at load, so a load-time gate would have disabled the launcher in its GUI frames too. Routed the three window-behavior tests through a GUI-frame stub, since a batch run is itself a terminal frame.
* docs(todo): file gptel-magit activation bug on veloxCraig Jennings5 days1-0/+10
| | | | | velox's gptel is below the 0.9.8 that gptel-magit requires, so the package fails to activate at startup. Captures the repro and the version-check fix.
* docs(todo): add Signal-to-dashboard taskCraig Jennings5 days1-0/+1
|
* docs(todo): close chat-buffer placement + exit-keys taskCraig Jennings9 days1-6/+2
| | | | I folded the "Chat buffer placement + exit keys" task into a dated event-log entry under the DOING Signal parent. The work landed in dotemacs 998e9c7a (bottom-30 docking via display-buffer-alist plus tests) and signel-fork df02d79 (pop-to-buffer + signel--cancel-input + C-c C-k binding).
* docs: reshape todo backlog and add buttercup evaluationCraig Jennings9 days1-248/+371
| | | | | | | | | | | | Walked the open-task backlog twice tonight. The first pass was a content audit (is each task still factually accurate?). The second was a relevance/priority review. Together they surfaced enough drift to be worth landing as one batch rather than dribbling into the next session. The audit filed three new completion-task parents, each with an audit-finding body and child-task recommendations: F-key Completion (roughly 75% shipped per evidence), Terminal GPG pinentry Completion (no trace of the prior branch on this machine, treat as fresh), and Localrepo Documentation (build is shipped, docs land in three artifacts, four gap-fix tasks spin out as siblings). Headline-indicators-wrap and Buttercup closed DONE, Rework-dev-F-keys cancelled as superseded. Manual Testing and Validation became its own top-level task with the 10 misfiled verify children moved in. Walk started tonight (tests 1 and 2 verified, two signel bugs surfaced and fixed in the same session), deferred to 2026-05-29 for the message-sending tests. The Buttercup eval doc captures the rubric I came to during the brainstorm: adopt the moment a project crosses the "test reader is no longer the test author at write-time" threshold. ERT stays the right default until then. None of my projects have crossed yet. Lint pass resolved all 21 org-lint follow-ups inline rather than letting them accumulate in a hidden inbox: 5 wrong-prefix design-doc links (../docs/design/X.org should have been docs/design/X.org), 4 file:line bare references wrapped in code formatting, 1 timestamp moved out of org-link brackets, 1 nested src block converted to begin_example, the wttrin diagnostic's stale link replaced with a note about where the surviving record lives, 8 markdown-bold patterns converted to org italics, 2 verbatim ** TODO references trimmed so the linter stops misreading them as headings.
* chore(todo): tag deferred Signal follow-ups :no-sync:Craig Jennings9 days1-2/+2
| | | | The wrap-up's sync-child-priority pass bumped two intentionally-deprioritized children of the Signal parent: the [#C] handle-error leak and the [#D] groups vNext. Both are deliberate. The leak is bounded by the stop/start clrhash and the groups task is explicitly post-1:1-stability, so I tagged them :no-sync: to stick at their chosen priorities across future wrap-ups.
* docs(todo): split signel manual-verify into discrete checkable tasksCraig Jennings9 days1-14/+55
| | | | | | The earlier checklist was one sub-header with all the steps in a single bullet list, which means a partial walk-through can't be marked done piece by piece. Per the manual-testing convention, one sub-header per scenario is the format that lets a failing step promote cleanly to its own bug. I split the original entry into 9 sub-headers, one per scenario, each with a "What we're verifying" line, the exact key chords or commands, and a single Expected outcome. The set covers connect, picker opens with names, send-a-message, Note-to-Self via the direct command (the spec's D3 critical check), Note-to-Self via the pinned picker entry, the clobber-fix survival test, dashboard, stop, and refresh.
* docs(todo): add manual-verification checklist for the signel ↵Craig Jennings9 days1-0/+15
| | | | | | | | initiate-message workflow I shipped the picker, daemon guard, cache, keymap, and clobber fix as unit-tested code (commits 4daf2328 here, 4740d97 and 5ec56c0 in the signel fork). The unit tests cover branches and contracts but can't exercise a real signal-cli daemon against a linked phone. This checklist captures the live verification I'll walk through on my next restart of Emacs. Each step lists the exact command or key, the expected observable outcome, and (implicitly) the failure signal: any deviation gets logged under the failing step and promoted to a TODO bug, per the verification convention.
* feat(signal): initiate-message workflow (picker, guard, cache, keymap)Craig Jennings9 days1-8/+8
| | | | | | | | | | | | | | | | | | | | I built pieces 2-7 of the initiate-message workflow from docs/design/signal-client.org and added tests covering the fork's clobber-fix (commit 5ec56c0 over there). The picker is the user-facing change: a single key opens a name-based completing-read for any contact, with "Note to Self" pinned first. The picker stack from the bottom up: cj/signel--ensure-started is the daemon guard. With a live process it's a no-op. With signel-account set but no process it calls signel-start and pre-warms the contact cache. With signel-account nil it user-errors naming the remedy. Pre-warming on start means the picker feels instant on first use. cj/signel--fetch-contacts issues a listContacts RPC through the new request-callback contract (signel--send-rpc with a success-callback). The callback runs the result through the verified cj/signal--parse-contacts and stores the (LABEL . RECIPIENT) alist in cj/signel--contact-cache, a cj-owned variable kept separate from signel's receive-time contact-map. An empty result populates the cache as nil, distinct from an RPC failure (which never invokes the callback so the prior cache survives). cj/signel-refresh-contacts is the user-facing command that clears and refetches. cj/signel-message is the picker. Warm cache opens completing-read immediately. Cold cache kicks off a fetch and accept-process-outputs up to cj/signel-fetch-timeout seconds (3s default), then user-errors if the daemon hasn't responded so a wedged process can't hang Emacs. The candidate list pins "Note to Self" first (resolves to signel-account) with a display-sort metadata function that preserves the given order rather than alphabetizing. cj/signel-message-self skips the picker and goes straight to signel-account. cj/signel-connect is the friendly verb on the prefix key. cj/signel-prefix-map binds m / s / d / q / SPC and attaches under C-; M via with-eval-after-load keybindings so the binding survives load-order. l stays unbound for the future link command. 15 new ERT tests cover the ensure-started branches, the fetch + cache contract (issued, populated, empty), refresh-contacts, the picker's four scenarios (warm-cache contact, warm-cache Note to Self, cold-cache resolves in time, cold-cache timeout), message-self, and the keymap bindings. Plus 4 new tests in tests/test-signel-input-preservation.el for the fork's clobber fix: pending-input captures typed text and returns nil when empty; both signel--insert-msg and signel--insert-system-msg redraw the prompt without clobbering "halfwritten". todo.org closes three tasks as dated event-log entries: the contact picker, the input clobber, and the use-package wiring.
* test(signel): cover the JSON-RPC success-result dispatch contractCraig Jennings9 days1-1/+4
| | | | | | | | | | | | | | | | | | The fork commit (4740d97 in the signel fork) added a request-callback table, extended signel--send-rpc with an optional success-callback, and routed result responses through signel--dispatch. These tests lock that contract from the consuming project so a future fork change can't silently break the picker that will read listContacts through it. Five tests, Normal / Boundary / Error categories plus a reconnect-invalidation case: - result-invokes-callback (Normal): a result response with a registered id fires the callback with the value and removes the handler. - send-rpc-registers-success-callback (Normal): passing a success callback stores it under the returned id. - unknown-id-is-noop (Boundary): a result with no registered id is silent — no receive or error handler fires, map stays empty. - error-cleans-up-handler (Error): an error response removes the handler without firing the callback, so a retry starts clean. - stop-clears-handler-map: signel-stop empties the map, so a restart can't replay stale callbacks waiting on responses that will never arrive. The dispatch tests synthesize JSON alists directly. No live process is needed. The send-rpc test stubs get-process and process-send-string so it doesn't need a running signal-cli. Refactor audit on signel.el surfaced one unrelated pre-existing smell I'm not fixing here: signel--handle-error reads from signel--request-buffer-map but never remhashes, so error responses leak request-id → buffer-name entries. Filed as a separate [#C] follow-up under the Signal parent task; the maps clear on stop/start so the impact is bounded to a single live session. todo.org: the dispatch task flips to DOING (the fork commit is in, the test contract is locked) and gets the leak follow-up appended.
* docs(signel): harden initiate-message spec to ReadyCraig Jennings9 days1-0/+6
| | | | | | | | | | | | | | | | I wrote an initiate-message workflow spec on top of the existing Signal client design doc, covering the keymap, name-based picker, message-to-self, and the whole flow. A follow-up review caught three blockers I'd hand-waved: signel had no JSON-RPC success-result dispatch path (so cj/signel--fetch-contacts couldn't actually receive listContacts results), D4's "auto-connect when linked" didn't define what "linked" meant or how process death surfaced, and the contact cache had no ownership or invalidation story. I verified the central one against the fork. signel--dispatch handles only "receive" and error responses, so success results were dropped. Then I folded all three into an Architecture additions subsection: a request-callback table keyed by JSON-RPC id with cleanup on success/error/reconnect, a cj/signel--ensure-started contract with branches for live process / account-set / account-nil, and a cj-owned cj/signel--contact-cache separate from signel's receive-time map. A second review pass caught the remaining sync/async boundary. completing-read is synchronous and the fetch is async. I resolved it with pre-warm on connect plus a bounded accept-process-output fallback for cold caches, so the warm case feels instant and a dead daemon can't hang Emacs. The follow-up re-review then converged to Ready-with-caveats and surfaced one concrete code finding I'd missed: the #2 input-clobber fix has to cover both signel--insert-msg AND signel--insert-system-msg, since both delete from the prompt line through point-max. The pieces-to-build entry and the prompt-preservation regression test now name both paths. A few smaller tightenings landed in the same pass. The listContacts assumption is now a researched fact (verified on 94 contacts), the two open questions on account source and fork remote are marked decided (defcustom in the gitignored local config, local checkout with no remote for now), and a forward-flag in the scope summary names the four notification details to spec before that later slice starts. docs/design/signal-client-review.org carries the review as the closure record. todo.org gets two tasks: a [#B] for the JSON-RPC success-result dispatch (the first build step), and a [#D] for groups in the picker as a vNext after the 1:1 flow is stable. Spec is Ready. Implementation order is pinned to the Pieces-to-build list. RPC dispatch first, then the guard, then fetch/cache, then the picker and keymap, then the clobber fix.
* docs(todo): track the Signal client fork and log the headline-indicator bugCraig Jennings10 days1-25/+56
| | | | | | | | I reshaped the Signal client task into a parent with child issues (contact picker, notify behavior, the upstream input-clobber bug, link command, wiring) and recorded the fork decision and the linking milestone as dated entries. I also filed the headline-indicator wrap bug: the org-tidy dot and the fold ellipsis spill to a second row on property-drawer headings that are folded, because the tag right-align reserve is too small once the heading runs long. The right-align fix itself is intact, so this is a follow-on, not a regression. The cleanup passes archived the finished daily-prep task and synced three child priority cookies up to their parents.
* docs(todo): close shipped tasks and record research findingsCraig Jennings10 days1-17/+29
| | | | I closed the daily-prep keybinding task (shipped in 8e5efcab) and rewrote the popper-config removal into a dated log entry (1cca84c5). I also recorded the researched Signal-client candidates and the Claude-Code-in-eat findings against their tasks, and folded the "no remote install" constraint into the TRAMP task.
* docs(todo): update task state, tags, and tag alignmentCraig Jennings10 days1-84/+124
| | | | | | Close the window-placement and tag-alignment work that shipped (Slack, mu4e, dupre tags and the right-align feature), and queue the open follow-ups: the EAT consolidation, the ai-vterm/mu4e/Slack window tickets, and a Signal-client task. Record the researched Signal-client candidates and the Claude-Code-in-eat findings against their tasks, log the decision to remove the disabled popper-config, and fold the "no remote install" constraint into the TRAMP task. Fix the two invalid org tags (no-sync, which has a hyphen org rejects, so it read as title text) to nosync, and tag the previously untagged GPTel and Signal tasks. Realign every heading's tags to a single space to match org-tags-column 0, which reverts stale column-77 padding that had drifted in.
* docs(todo): archive the byte-compile-paths and latex-config tasks to ResolvedCraig Jennings11 days1-18/+16
|
* docs(todo): close the user-constants filesystem-init epicCraig Jennings11 days1-35/+29
|
* docs(todo): close font-config, eshell, customize-warning, and webclipper ↵Craig Jennings11 days1-38/+52
| | | | hardening tasks
* docs(todo): tag babel-confirm, health-check, module-ownership, and strapdown ↵Craig Jennings11 days1-4/+4
| | | | tasks :discuss:
* docs(todo): close mousetrap keymap cache and formatter argv tasksCraig Jennings11 days1-19/+23
|
* docs(todo): log external-tool guards across Org export/publishing modulesCraig Jennings11 days1-12/+19
|
* docs(todo): log prog-lisp smoke coverage and the prog-general/prog-training ↵Craig Jennings11 days1-12/+16
| | | | dispositions
* docs(todo): log mu4e org-contacts completion coverage under hardeningCraig Jennings11 days1-9/+11
|
* docs(todo): log font-config smoke coverage; route popper smoke test to its ↵Craig Jennings11 days1-8/+20
| | | | decision task
* docs(todo): log system-defaults settings smoke tests under hardeningCraig Jennings11 days1-14/+13
|
* docs(todo): close the latex-config WIP taskCraig Jennings11 days1-1/+4
| | | | I investigated the inherited "WIP need to fix" comment. The module compiles and works, company-auctex is tracked under the corfu migration, and the one real defect (non-idempotent PDF-viewer selection) is fixed in b007a9b8. Closed with a note on what I found.
* docs(todo): close the byte-compile-paths task and drop the prog-shell taskCraig Jennings11 days1-8/+3
| | | | The byte-compile load-paths task shipped as the make compile-file target, so I closed it DONE with a note on what landed and where the parallel hook fix went. I dropped the prog-shell config-home task — it isn't worth tracking as its own item.
* docs(todo): close shipped tasks and refile completed sub-tasksCraig Jennings11 days1-19/+44
| | | | | | I marked the tasks that shipped as DONE: the ai-vterm third-split fix, projectile open-todo in the other window, the elfeed-config byte-compile-safe tests, the org TODO-keyword color theming, and the manual cj/org-finalize-task verification. The load-graph spec and the elfeed-config header annotation are level-4 sub-tasks, so they become dated event-log entries rather than DONE keywords. I also reformatted a few headings, bumped the dashboard over-scroll task to [#D], and filed a task to make the standalone byte-compile load paths match module dependencies.
* refactor(load-graph): route C-; registration through the keymap APICraig Jennings12 days1-11/+3
| | | | | | Migrated all 31 cj/custom-keymap registration sites across 24 modules from direct (keymap-set cj/custom-keymap ...) calls to cj/register-prefix-map and cj/register-command. Consumers no longer reference cj/custom-keymap directly, so keybindings.el is the sole owner of the C-; prefix and modules reach it only through the API (each already requires keybindings from Phase 2). Behavior-preserving: I dumped every C-; binding before and after the migration and they're identical: 279 bindings, each resolving to the same command. The which-key label blocks are untouched, since they use string key descriptions and never assumed the keymap existed. I byte-compiled all 24 files (no new free-variable warnings, because the cj/custom-keymap references are gone), and make test, validate-modules, and an init load all pass.
* feat(keybindings): add cj/custom-keymap registration APICraig Jennings12 days1-1/+1
| | | | | | Phase 3 of the load-graph project. cj/register-prefix-map and cj/register-command bind a prefix map or command under the C-; prefix and register the which-key label once which-key loads. Feature modules will route their registration through these instead of mutating cj/custom-keymap directly, so keybindings.el stays the sole owner of the prefix and modules stop assuming the keymap already exists at load. Adds test-init-keymap-registration.el covering prefix-map and command resolution, the optional label, and invalid-key rejection. No modules are migrated yet; that follows in batches.
* refactor(load-graph): make hidden module dependencies explicitCraig Jennings12 days1-15/+4
| | | | | | | | | | | | | Phase 2 of the load-graph project. I fixed the seven hidden dependencies the classification surfaced, so each module declares what it uses instead of relying on init order. - system-defaults now requires host-environment and user-constants at runtime. They were eval-when-compile only, but env-bsd-p and user-home-dir are read at load, so the compiled module couldn't load standalone. - custom-buffer-file, dev-fkeys, calendar-sync, and video-audio-recording require keybindings and drop their (when (boundp 'cj/custom-keymap) ...) shims. The shim silently dropped the C-; binding when the module loaded before keybindings. The explicit require makes the dependency real. - flycheck-config and mail-config require keybindings for their cj/custom-keymap bindings (a use-package :map and a direct keymap-set). - Removed a dead eval-when-compile (defvar cj/custom-keymap) in transcription-config; nothing there used the variable. No init.el load-order change. keybindings and the foundation modules already load before these, so the requires are no-ops at startup and only fix standalone and test loading. I verified each fix with a fresh emacs --batch (require 'X), then swept all modules standalone: every one loads or fails only with a clear missing-package message. Full make test, make validate-modules, and an init smoke all pass. Module headers and the inventory's hidden-dependency section are updated to mark the seven resolved.
* docs(todo): close module-classification task, split out elfeed-configCraig Jennings12 days1-16/+4
| | | | Rewrote the classify-modules child as a dated log entry now that 101 of 102 modules carry load-graph headers. Pulled the lone deferral — annotating elfeed-config — into its own task, blocked on the elfeed test-byte-compile fix.
* docs(load-graph): classify domain, integration, and optional modulesCraig Jennings12 days1-0/+3
| | | | | | | | | | Eighth classification batch: 17 domain/integration/optional modules — ai-config, ai-vterm, browser-config, calendar-sync, calibredb-epub-config, chrono-tools, dirvish-config, dwim-shell-config, erc-config, eshell-config, eww-config, flyspell-and-abbrev, games-config, gloss-config, httpd-config, jumper, latex-config. I annotated each header, added a Batch 8 table to the inventory, and extended the validation allowlist. 82 of 102 modules are now classified. Almost all are eager only by init order and become command/hook/mode-loaded. calendar-sync stays eager when its .local.el is present. One new hidden dependency: calendar-sync guards its C-; g registration with a boundp shim and doesn't require keybindings, so the binding drops standalone. I deferred elfeed-config rather than annotate it. Its header edit triggers byte-compilation, and the existing tests only pass when the module loads as interpreted source — the compiled cj/elfeed-process-entries inlines an elfeed struct accessor the stubs can't intercept, and the batch test environment has no elfeed package to build real structs. It needs its tests rewritten first, recorded in the inventory and a new todo task. Also made the header allowlist scoping test durable: it used games-config (now classified) as its unclassified example; switched to a sentinel name plus a duplicate-entry guard.
* docs(init): retire stale module comments and track follow-upsCraig Jennings12 days1-1/+7
| | | | Three init.el requires carried vague comments: latex-config "WIP need to fix", prog-shell "combine elsewhere", and a "Modules In Test" banner. I replaced them with descriptive comments and moved the real follow-up work into todo.org tasks: investigate the latex-config state, and decide whether prog-shell config folds into prog-general. I also marked the module-classification task DOING.
* docs(todo): close coverage backlog after assessing the sub-60% clusterload-graph-classify-startCraig Jennings12 days1-19/+13
| | | | Read each remaining sub-60% module to separate real untested logic from interactive/config glue. Filled the three genuine gaps (markdown-html, media-utils select-media-player, elfeed helpers — committed separately). The rest — flyspell, dashboard, ai-quick-ask — already have their pure logic tested with Normal/Boundary/Error; their low percentages come entirely from interactive commands. prog-general, restclient, vc-config, quick-video-capture are config/interactive-only with no pure logic to cover. Backlog cleared: every module's testable logic is covered; residual low % is code the testing rules say not to chase.
* docs(todo): refresh stale coverage backlog against a clean runCraig Jennings12 days1-318/+18
| | | | The per-module percentages in the coverage audit were stale — this session's test-writing covered most of the listed modules (prog-python 0%->100%, hugo-config 17.7%->91.7%, undead-buffers 5.7%->85.7%, and selection-framework / keyboard-compat / system-utils / system-defaults / ui-navigation / prog-go now ~100%). Re-measured against a clean make-coverage run and replaced the ~75 stale entries with current numbers for only the modules genuinely below ~60%. Modules in the 60-80% band are adequately covered and dropped. vc-config and quick-video-capture are flagged config/interactive-only (their pure logic is tested; the uncovered lines are use-package/interactive glue), so they're recorded as no-action rather than chased.
* docs(todo): log the third solo-hardening batch (move-branch, keymaps, ↵Craig Jennings12 days1-64/+10
| | | | export, elfeed/eww, capture tests)
* docs(todo): log the second solo-hardening batch (webclip, qvc timers, dir ↵Craig Jennings12 days1-50/+11
| | | | scans, vc cache, region scope)
* docs(todo): log the org-drill, git-clone, and video-capture hardeningCraig Jennings12 days1-33/+7
|
* docs(dwim-shell): record accepted 7z password-on-argv tradeoffCraig Jennings12 days1-8/+3
| | | | 7-Zip 26.01 reads the encryption password only from its controlling TTY, not stdin or a file — a piped password silently becomes an empty one — so it has to go on argv and is briefly visible in the process list. Rather than switch off the .7z format to gpg-wrapped tar, the exposure is accepted: single-user workstation, short-lived process, password already kept out of shell history by the mode-600 temp file. Documented the evaluated tradeoff in both encrypt/decrypt docstrings so it's visible at the call site.
* docs(todo): log the defensive restart/shutdown hardeningCraig Jennings12 days1-15/+3
|