aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-06-20 21:35:59 -0400
committerCraig Jennings <c@cjennings.net>2026-06-20 21:35:59 -0400
commit7cad6c584ce3a1ed5b759550264b9c5858deeb3d (patch)
tree01086c05208d9633f2c6b4c690d685624107dc82
parent613d3705f59eab20a496256e9ed1ab26dc35d116 (diff)
downloaddotemacs-7cad6c584ce3a1ed5b759550264b9c5858deeb3d.tar.gz
dotemacs-7cad6c584ce3a1ed5b759550264b9c5858deeb3d.zip
chore(todo): regrade erc-yank to A, merge popup+messenger, close refactor program
- erc-yank public-gist privacy trap regraded [#B] → [#A], tagged :quick:solo: - merged the unified-popup-policy and messenger-unification tasks into one [#A] task - refactoring program marked DONE (item-8 plan() factory consciously skipped) - stamped LAST_REVIEWED on the reviewed tasks
-rw-r--r--todo.org55
1 files changed, 40 insertions, 15 deletions
diff --git a/todo.org b/todo.org
index 04230abe7..952891b13 100644
--- a/todo.org
+++ b/todo.org
@@ -55,15 +55,15 @@ Tags are additive. For example, a small wrong-behavior fix can be
=:bug:quick:=, and a feature that requires internal restructuring can be
=:feature:refactor:=.
* Emacs Open Work
-** TODO [#B] Codebase refactoring program — remaining batch :refactor:solo:
-Resumes the full-codebase refactoring scan run of 2026-06-20 (8-agent fan-out over
-modules/ + scripts/theme-studio/). The goal: apply every scan finding except the
-won't-do items, one focused refactor per commit. 25 done and pushed across the
-2026-06-20 sessions (see =.ai/sessions/= for the logs); 8 remain, listed below.
-The 5 medium extractions are done (calibredb-epub nov helpers fccf29b0, ai-term
-toggle-off 62fee96b, calendar-sync exception parser 23f405b4, dirvish playlist-target
-a1ca2fb0, custom-case title-case-word 4cc9ca0b); the 2 big single-file and 6
-theme-studio items below remain.
+** DONE [#B] Codebase refactoring program — remaining batch :refactor:solo:
+CLOSED: [2026-06-20 Sat]
+Complete 2026-06-20: all 13 scan findings addressed across the day's sessions (see
+=.ai/sessions/= for the logs). 5 medium extractions + 2 big single-file refactors +
+6 theme-studio items including the browser-gates harness rewrite. The only item not
+done is the item-8 plan() factory, consciously skipped as premature abstraction
+(heterogeneous call sites — see "Remaining — item-8 plan() factory" below).
+The original scan: full-codebase 8-agent fan-out over modules/ + scripts/theme-studio/,
+one focused refactor per commit, won't-do items excluded.
*** Working protocol (apply to every item)
- TDD: write/keep a failing-then-green test; harvest new test seams the refactor opens.
@@ -3560,23 +3560,42 @@ Restart the daemon, open a GUI frame, trigger an encrypted decrypt, confirm =pin
*** TODO [#C] Archive the original L3813 task
After this work lands, mark the original "Finish terminal GPG pinentry configuration" task DONE with a =CLOSED:= stamp and a one-line note pointing at this parent task.
-** TODO [#A] Unified popup placement and dismissal rules :feature:
-All transient popups should follow one set of principles. Placement: when the Emacs frame is wider than tall, the popup rises from the right; when square or taller, from the bottom — settle the aspect-ratio threshold and the pop-out percentage. Dismissal: C-c C-c when there's an accept action, C-c C-k when there's a cancel, otherwise =q= closes the window. This generalizes two existing tasks — ai-term adaptive placement (the aspect-ratio docking) and the messenger window/key unification spec (the C-c C-c / C-c C-k dismissal) — into one config-wide policy. From the roam inbox.
-
-** TODO [#A] Unify Signel and All Messengers into one UX :feature:
+** TODO [#A] Unified popup and messenger UX — placement, dismissal, one library :feature:
:PROPERTIES:
-:LAST_REVIEWED: 2026-06-16
+:LAST_REVIEWED: 2026-06-20
:END:
+Merged 2026-06-20 from the config-wide popup-policy task and the messenger-unification
+task — they're the same policy at two scopes (the messenger windows are the first
+concrete application of the general popup rules). Two parts:
+
+(A) Config-wide popup policy. All transient popups follow one set of principles.
+Placement: when the Emacs frame is wider than tall, the popup rises from the right;
+when square or taller, from the bottom — settle the aspect-ratio threshold and the
+pop-out percentage. Dismissal: C-c C-c when there's an accept action, C-c C-k when
+there's a cancel, otherwise =q= closes the window. Generalizes ai-term adaptive
+placement (the aspect-ratio docking) and the messenger window/key rules below into
+one config-wide policy. From the roam inbox.
+
+(B) Messenger unification (first application of the policy above).
Spec: [[file:docs/specs/messenger-unification-spec.org][messenger-unification-spec.org]] ([[id:4bfc2011-8ffc-4765-8886-91df12141171][by id]], Draft, 2026-06-11; keybinding-alphabet section + smoke-first parity added 2026-06-16). One library (=cj-messenger-lib.el=) gives every messenger the same shape: chat windows rise from the bottom (the signel rule, generalized), C-c C-c confirms, C-c C-k cancels, C-c C-a attaches — dispatched per backend through a registry + minor mode. Signel already conforms (reference backend); telega and slack join in phases 2-3; ERC later. All eight decisions settled 2026-06-11 (cancel closes an idle window; telega's filter-cancel shadow accepted; slack rooms join the bottom rule). Spec held open — Craig has more ideas to fold in before it's marked Ready.
** TODO [#B] agenda sources: roam Projects missing, no existence filtering :bug:solo:
+:PROPERTIES:
+:LAST_REVIEWED: 2026-06-20
+:END:
From the 2026-06 config audit, =modules/org-agenda-config.el=:
- =:182-191= — commentary and docstrings promise org-roam nodes tagged "Project" as agenda sources, but =cj/--org-agenda-scan-files= never scans them, and files added by the roam finalize-hook are wiped on the next =cj/build-org-agenda-list= cache rebuild (≤1h). Add a roam Project pass (mirror =org-refile-config.el:101-109=) or correct the docs.
- =:186,456= — agenda file list built unconditionally (inbox/calendars may not exist on a fresh machine) and =org-agenda-skip-unavailable-files= is unset — the exact interactive-prompt class that once hung the chime daemon. Filter with =file-exists-p= + set the var as backstop.
** TODO [#B] Auto-dim: org headings, links, and tags do not dim in unfocused windows :bug:
+:PROPERTIES:
+:LAST_REVIEWED: 2026-06-20
+:END:
auto-dim-other-buffers-affected-faces (auto-dim-config.el) remaps font-lock and a few org faces to the flat dim face, but not org-level-1..8, org-link, or org-tag, so headings, links (seen in daily-prep.org), and tags like :solo: stay lit when the window loses focus. Decide the dim approach: a flat-dim remap like font-lock (quick) versus dedicated -dim variants surfaced through org-faces / theme-studio (richer, matches the keyword work; Craig flagged org-tags may want the org-faces treatment). Consolidates three roam-inbox captures.
** TODO [#B] "? = curated help menu" convention across modes :feature:
+:PROPERTIES:
+:LAST_REVIEWED: 2026-06-20
+:END:
From the calibredb keybindings work 2026-06-06. The pattern that worked: in a modal/major-mode buffer (calibredb), bind =?= to a curated transient of the frequent workflows, and move the package's own full dispatch to =H=. It fixes the "I can't discover the keys" problem that which-key can't help with (which-key only pops up after a prefix, not for top-level single keys in a mode-map).
Task: survey the modes/modules Craig works in and identify where a =?= -> curated-help-menu (transient) makes sense. Candidates: any major-mode buffer with single-key bindings and no good discovery affordance -- calibredb (done), nov, dirvish, mu4e, ghostel/term, signel, pearl/linear, ELFeed, etc. For each, note whether =?= is free or already a help dispatch, and whether a curated menu (vs the package's own) adds value. Establish it as a convention (and maybe a small helper/macro to define a curated =?= menu consistently).
@@ -3594,10 +3613,16 @@ Ask:
Reference values -- modus-vivendi: refine-changed bg #4a4a00 fg #efef80, changed bg #363300 fg #efef80. modus-operandi: refine-changed bg #fac090 fg #553d00, changed bg #ffdfa9 fg #553d00.
Side-by-side legibility render: [[file:assets/2026-06-07-dupre-diff-face-legibility-compare.png][assets/2026-06-07-dupre-diff-face-legibility-compare.png]].
-** TODO [#B] erc-yank silently publishes >5-line pastes as public gists :bug:
+** TODO [#A] erc-yank silently publishes >5-line pastes as public gists :bug:quick:solo:
+:PROPERTIES:
+:LAST_REVIEWED: 2026-06-20
+:END:
=modules/erc-config.el:345= — C-y in any ERC buffer auto-creates a public gist for anything over 5 lines: clipboard content goes to a public URL with no confirmation, and no executable-find guard for =gist= (errors mid-send if absent). Privacy trap. Add a =yes-or-no-p= gate or drop the package for plain C-y. From the 2026-06 config audit.
** TODO [#B] F7 diff-aware coverage classifies every changed file "not tracked" :bug:solo:
+:PROPERTIES:
+:LAST_REVIEWED: 2026-06-20
+:END:
=modules/coverage-core.el:252= — =cj/--coverage-intersect= joins covered×changed by exact string key, but simplecov.json keys are ABSOLUTE paths while the git-diff parser returns repo-RELATIVE ones — zero matches ever, so working-tree/staged/branch scopes report ":tracked nil" for everything and F7's main feature is inert (whole-project scope works, same-source keys). Unit tests hand-build matching keys so they pass; add one integration test feeding a real undercover report + real diff. Normalize both sides to repo-relative. From the 2026-06 config audit.
** TODO [#B] Fix up test runner :bug: