aboutsummaryrefslogtreecommitdiff
path: root/todo.org
diff options
context:
space:
mode:
Diffstat (limited to 'todo.org')
-rw-r--r--todo.org72
1 files changed, 47 insertions, 25 deletions
diff --git a/todo.org b/todo.org
index 85214eb3c..2dca2c56f 100644
--- a/todo.org
+++ b/todo.org
@@ -705,20 +705,29 @@ Reference values -- modus-vivendi: refine-changed bg #4a4a00 fg #efef80, changed
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] org-capture popup leaks f12 / f10 / f11 / ai-term keys :bug:
+:PROPERTIES:
+:LAST_REVIEWED: 2026-06-29
+:END:
While the org-capture popup is open, the global F-keys (the =f12= term, =f10= / =f11=, the ai-term family) still fire and pop a terminal over the capture. Disable those keys for the duration of the capture popup if there's a clean way. Research first and report; if it's too invasive, defer or cancel rather than force it. From the roam inbox 2026-06-24.
** TODO [#B] VAMP — extract music-config into a standalone player :feature:refactor:
:PROPERTIES:
-:LAST_REVIEWED: 2026-06-21
+:LAST_REVIEWED: 2026-06-29
:END:
Build VAMP ("VAMP Audio Music Player"), a standalone, publishable Emacs music player at =~/code/vamp= — derived from a maintained subset of EMMS, depending on the EMMS package not at all, with MPV and mpd behind a generalized adapter API. =.emacs.d= keeps thin glue (=vamp-config.el=: keybindings, paths, dashboard); archsetup owns OS wiring (Super+/ launcher, m3u MIME). Models the =linear-config= → =pearl= migration.
Brainstorm complete 2026-06-22 — validated design at [[file:docs/design/vamp-music-player.org][docs/design/vamp-music-player.org]]. It builds on the prior EMMS-removal work ([[file:docs/specs/music-config-without-emms-spec.org][spec]] + [[file:docs/design/music-config-without-emms-review.org][2026-05-15 review]]), confirming its B1/B2/B4/S3 decisions and pivoting four things (publishable-now, two adapters + generalized API, VAMP name, desktop integration).
-Next: (1) revise the spec to the new direction; (2) spike the risky assumptions (mpd dumb-single-file-player contract; m3u =.desktop= on Hyprland); (3) =/start-work= against the revised spec — pure-helper extraction (review Migration Plan step 1) is the safe first phase. Priority [#C] is a placeholder pending Craig's call.
+Next: (1) revise the spec to the new direction; (2) spike the risky assumptions (mpd dumb-single-file-player contract; m3u =.desktop= on Hyprland); (3) =/start-work= against the revised spec — pure-helper extraction (review Migration Plan step 1) is the safe first phase.
** TODO [#C] nov: sepia reading view (dark bg, tan/sepia text) :feature:
+:PROPERTIES:
+:LAST_REVIEWED: 2026-06-29
+:END:
A sepia setting for =nov-mode=: keep a dark background, render the letters in a tan/sepia color. nov defines no faces of its own and leans on shr, so the path is buffer-local face-remapping (=face-remap-add-relative= on =default= / =shr-text= / =variable-pitch=) in a nov-mode hook, toggled per a sepia preference. Overlaps the "epub/nov reading color" note under "Route hardcoded theme colors through the theme" (the removed =#E8DCC0= sepia plus "needs a themeable reading face") — reconcile with that themeable-face direction. From the roam inbox.
** TODO [#C] pdf-view: epdfinfo crashes loading some PDFs (large IA scans) :bug:
+:PROPERTIES:
+:LAST_REVIEWED: 2026-06-29
+:END:
=epdfinfo server quit. restart y/n?= when opening certain PDFs, so pdf-view-mode never engages and the file lands in the wrong mode. Reproduced with =~/sync/books/Karl Jaspers/Karl Jaspers_ Basic Philosophical Writings _ Selections (49298)/Karl Jaspers_ Basic Philosophical Writings - Karl Jaspers.pdf= (576-page, 31MB Internet Archive scan).
Diagnosis: the PDF is structurally valid (=qpdf --check= clean; =pdfinfo= reads it) and poppler renders its pages (=pdftoppm= pages 1 and 300 succeed), so it isn't corruption or a poppler-render crash. epdfinfo crashes loading the document, likely on the tagged-PDF structure / metadata stream the IA scan carries (=Tagged: yes=, =Metadata Stream: yes=), a known epdfinfo trouble class. =auto-mode-alist= maps =.pdf= -> =pdf-view-mode= correctly, so-long is off, and there's no large-file prompt (=large-file-warning-threshold= nil).
Fix options (Craig to choose): (1) re-save the file to strip what crashes epdfinfo (=mutool clean= / ghostscript / =qpdf --replace-input=), keeping a backup -- fixes this file, recurs on the next bad scan; (2) graceful fallback in =pdf-config.el= -- when epdfinfo dies on a PDF, open it in zathura (already bound to =z=) instead of the dead pdf-view buffer, robust for the whole class; (3) both. From the roam inbox.
@@ -2420,7 +2429,7 @@ configuration (=text-config=, =diff-config=, =ledger-config=,
** TODO [#C] Unified popup and messenger UX — placement, dismissal, one library :feature:
:PROPERTIES:
-:LAST_REVIEWED: 2026-06-20
+:LAST_REVIEWED: 2026-06-29
: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
@@ -2439,12 +2448,12 @@ Spec: [[file:docs/specs/messenger-unification-spec.org][messenger-unification-sp
** TODO [#C] Auto-dim: org headings, links, and tags do not dim in unfocused windows :bug:
:PROPERTIES:
-:LAST_REVIEWED: 2026-06-20
+:LAST_REVIEWED: 2026-06-29
: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 [#C] "? = curated help menu" convention across modes :feature:
:PROPERTIES:
-:LAST_REVIEWED: 2026-06-20
+:LAST_REVIEWED: 2026-06-29
: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).
@@ -2452,7 +2461,7 @@ Task: survey the modes/modules Craig works in and identify where a =?= -> curate
** TODO [#C] Fix up test runner :feature:refactor:
:PROPERTIES:
-:LAST_REVIEWED: 2026-06-21
+:LAST_REVIEWED: 2026-06-29
:END:
*** 2026-05-16 Sat @ 11:15:51 -0500 Ideas
**** Current State
@@ -2956,24 +2965,28 @@ Tie this into the existing coverage work:
** TODO [#C] Keymap consolidation — resolve decisions, run Phase 1-2 :feature:refactor:
:PROPERTIES:
-:LAST_REVIEWED: 2026-06-13
+:LAST_REVIEWED: 2026-06-29
:END:
Spec: [[id:540bf06b-16b8-46c6-b459-c40d1b9c795d][keybinding-console-safety-spec-doing.org]]. Phase 0 (revert 4a1ecf64) is done and pushed. Decisions D1-D5 are open TODOs in the spec; D2/D4/D5 gate the primary work (Phase 1 prune via Appendix D, Phase 2 consolidate + retire the translation block), while D1/D3 (the console-safe prefix) gate only the optional Phase 3 and can stay open indefinitely. Resolve D2/D4/D5, then run Phase 1-2. Appendix D is the keybinding pruning checklist. Add a =#+TODO: TODO | DONE SUPERSEDED CANCELLED= header line to the spec if adopting those decision keywords (rulesets convention update, 2026-06-12).
** TODO [#C] Ledger-config audit + guardrail UX :feature:
+:PROPERTIES:
+:LAST_REVIEWED: 2026-06-29
+:END:
Now that =modules/ledger-config.el= is wired (6ec857ae), audit it thoroughly — correctness first, then especially the data-entry UX. Goal (Craig): a workflow with enough guardrails that it's hard to make a costly mistake in a financial file. Audit surface: clean-on-save behavior (does =ledger-mode-clean-buffer= ever reorder/rewrite in a surprising way; is the demoted-error swallow hiding real problems), flycheck-ledger coverage (unbalanced transactions, bad account names) and whether it surfaces clearly, reconcile safety, the report set, company-ledger account/payee completion as a typo guard, and any add-transaction entry flow. Identify gaps, then design the guardrails (validation on save, completion to prevent account-name drift, a confirm before destructive reconcile, etc.). The correctness/gap audit can run solo; the UX guardrail choices need Craig's preferences, so not tagged :solo:. Priority [#C] is a placeholder — bump if ledger becomes active daily use.
-** TODO [#C] ai-term multi-LLM support — Claude / Codex / ollama :feature:
+** CANCELLED [#C] ai-term multi-LLM support — Claude / Codex / ollama :feature:
+CLOSED: [2026-06-29 Mon]
Allow creating an ai-term that launches any of Claude, Codex, or a local LLM via ollama, switchable at session start. From rulesets/Craig via the roam inbox. Spec note: =inbox/PROCESSED-2026-06-23-2123-from-rulesets-ai-term-multi-llm-support-from-craig.org=.
** TODO [#C] ai-term: multi-backend (Claude / Codex / local ollama) :feature:
:PROPERTIES:
-:LAST_REVIEWED: 2026-06-22
+:LAST_REVIEWED: 2026-06-29
:END:
Allow creating an ai-term backed by any of Claude, Codex, or a local LLM via ollama, with the backend chosen seamlessly at the start of the session. ai-term currently assumes Claude; generalize the launch path so the agent backend is a selectable parameter and switching between them at session start is frictionless. Routed here from the rulesets roam-inbox item "multiple agent source improvements" (its bullet 3 asked to send emacs this note); the item's other bullets — naming the agent so non-Claude agents aren't called "Claude", and tightening workflow wording for Codex's more literal reading — stay with rulesets.
** TODO [#C] Migrate tests off mocking primitives (native-comp robustness) :test:refactor:solo:
:PROPERTIES:
-:LAST_REVIEWED: 2026-06-21
+:LAST_REVIEWED: 2026-06-29
:END:
Long-term test-quality work surfaced by re-enabling native-comp (2026-06-20). When a test redefines a C primitive or a native-compiled function (=cl-letf=/=fset=/=advice-add=), native-comp routes native callers through a trampoline, which interacts badly with mocks in three ways: trampoline-build failure under =--batch=, silent mock-bypass (native callers ignore the redefinition), and arity mismatch (the trampoline calls the mock with the primitive's max arity).
@@ -2985,17 +2998,17 @@ Full mechanism, the three failure modes, the research (Emacs bug#51140, bug#6188
** TODO [#C] buffer-differs save prompt: 4-way yes/no/diff/cancel :feature:next:
:PROPERTIES:
-:LAST_REVIEWED: 2026-06-21
+:LAST_REVIEWED: 2026-06-29
:END:
The "buffer differs from file" confirmation currently gives only yes/no. Craig wants a 4-way choice with explicit consequences: yes (be explicit it overwrites), no (be explicit it discards this action and continues), diff (show a graphical difftastic diff, then return to this prompt), cancel (stop the action, leave the buffer untouched). Needs the exact prompt identified first (which save/overwrite path raises "buffer differs") and a design for the diff-then-return loop. difftastic + cj/diff-buffer-with-file infrastructure already exist. From the roam inbox 2026-06-16.
** TODO [#C] emacs: tag tasks by module name for sorting :refactor:studio:
:PROPERTIES:
-:LAST_REVIEWED: 2026-06-21
+:LAST_REVIEWED: 2026-06-29
:END:
Replace topic tagging with single-word module tags: :studio: for everything under scripts/theme-studio/, module-named tags elsewhere, :multi: for cross-area work. Drop bug/enhancement-style tags since work should be chosen on other bases. This changes the current six-tag convention, so update the priority-scheme section to document it, rewrite the task-audit workflow to reconcile tasks against the module scheme, then run the audit. Queue for end of session. From the roam inbox.
** TODO [#C] Build debug-profiling.el module :feature:solo:
:PROPERTIES:
-:LAST_REVIEWED: 2026-06-21
+:LAST_REVIEWED: 2026-06-29
:END:
Reusable profiling infrastructure for targeted slow-command investigation. Consolidates scattered profiler bindings (currently in =modules/config-utilities.el=) and adds two pure-helper-backed entry points: "profile next command" and "time region or sexp." Designed via =/brainstorm= 2026-04-26.
@@ -3006,13 +3019,13 @@ Implement via =/start-work= against the design — branch =feat/debug-profiling=
** TODO [#C] Evaluate jamescherti essential-emacs-packages list :quick:solo:
:PROPERTIES:
-:LAST_REVIEWED: 2026-06-21
+:LAST_REVIEWED: 2026-06-29
:END:
Review [[https://www.jamescherti.com/essential-emacs-packages/][James Cherti's essential Emacs packages]] for anything worth installing. Cross-check each candidate against what is already in the config (=modules/= + =init.el=), skip the ones already present, and shortlist the genuinely new ones with a one-line rationale. Future-installation research, not a commitment to install.
** TODO [#C] Extend F2 "preview" convention across modes :feature:
:PROPERTIES:
-:LAST_REVIEWED: 2026-06-21
+:LAST_REVIEWED: 2026-06-29
:END:
F2 is the universal preview key. Currently bound only in markdown-mode (markdown-preview, in =modules/markdown-config.el=). Org-reveal lives on =C-; o R= via =cj/org-map=, not F2. Extend F2 to other modes where a "preview" action is natural:
@@ -3026,24 +3039,24 @@ Keep the binding mode-local so F2 stays available as a global candidate where no
** TODO [#C] Gold text in auto-dimmed buffers :bug:
:PROPERTIES:
-:LAST_REVIEWED: 2026-06-21
+:LAST_REVIEWED: 2026-06-29
:END:
Some auto-dimmed document buffers render text in gold; source unknown. Likely a face-remapping or overlay interaction with the theme. Blocked on the face/font diagnostic tool above for diagnosis. From the roam inbox.
** TODO [#C] Google Contacts ↔ org-contacts sync investigation :feature:
:PROPERTIES:
-:LAST_REVIEWED: 2026-06-21
+:LAST_REVIEWED: 2026-06-29
:END:
From the 2026-06-11 brainstorm. Goal: keep [[file:~/sync/org/contacts.org][contacts.org]] (real org-contacts: PROPERTIES drawers, mu4e completion, org-roam links) in sync with Google Contacts. Google side is solid — official People API (OAuth2, incremental syncToken) or CardDAV; no ToS risk. The hard parts are local: (1) identity — entries have no UID, so two-way needs a GOOGLE_ID property per entry plus a one-time fuzzy reconciliation of the two populated datasets (name/email/phone matching); (2) field mapping — space-separated multi-email in one property, free-text body notes, inconsistent phone formats (normalization decision); (3) conflict policy. First decision gates the rest: one-way Google→org read model (simple) vs true two-way. Candidate architectures: vdirsyncer (proven two-way engine w/ Google support; build only the vCard↔org translation, evaluate org-vcard fidelity) vs a direct People API script with sync state in org properties. Output: recommendation doc in docs/design/ naming direction + the normalization/conflict decisions for Craig. Not :solo: — the one-way-vs-two-way call and normalization policy are Craig's.
** TODO [#C] Google Voice in Emacs — SMS + dialer investigation :feature:
:PROPERTIES:
-:LAST_REVIEWED: 2026-06-21
+:LAST_REVIEWED: 2026-06-29
:END:
From the 2026-06-11 messenger-unification brainstorm. Google Voice has no official API; the viable routes ride the Matrix bridge ecosystem's reverse engineering (mautrix-gvoice). Research pass to establish the 2026 state of play: (1) is mautrix-gvoice healthy and what does its auth flow look like now; (2) any better-maintained alternative (CLI/daemon) for the signel-pattern architecture (external daemon + JSON-RPC + thin Emacs chat client); (3) does call initiation (ring-linked-phone-then-connect, Emacs as dialer) survive in the current protocol — two-way audio in Emacs is out of scope (WebRTC); (4) ToS/account-flag risk assessment for Craig's account. Output: a recommendation doc in docs/design/ naming the architecture (signel-pattern daemon vs Matrix bridge + ement.el) or a no-go with reasons. If go, GV becomes a registered backend under the messenger-unification convention (see the [#B] task below).
** TODO [#C] Org-noter custom workflow — fix and finish :feature:bug:
:PROPERTIES:
-:LAST_REVIEWED: 2026-06-21
+:LAST_REVIEWED: 2026-06-29
:END:
Continue debugging and testing the custom org-noter workflow from 2025-11-21 session.
@@ -3092,7 +3105,7 @@ The core functionality is implemented but needs debugging before it's production
** TODO [#C] Pick and wire a debug backend for F5 :feature:
:PROPERTIES:
-:LAST_REVIEWED: 2026-06-21
+:LAST_REVIEWED: 2026-06-29
:END:
#+begin_src emacs-lisp
@@ -3116,7 +3129,7 @@ Do this after the F-key rework ticket ships so F5 is the only hole left.
** TODO [#C] Review and rebind M-S- keybindings :refactor:
:PROPERTIES:
-:LAST_REVIEWED: 2026-06-21
+:LAST_REVIEWED: 2026-06-29
:END:
Changed from M-uppercase to M-S-lowercase for terminal compatibility.
@@ -3782,6 +3795,9 @@ Restart the daemon, open a GUI frame, trigger an encrypted decrypt, confirm =pin
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.
** DOING [#C] google-keep in-editor integration — build, module-to-package :feature:
+:PROPERTIES:
+:LAST_REVIEWED: 2026-06-29
+:END:
v1 (read-only) implemented and tested (Phases 1-3): the gkeepapi Python bridge (=scripts/google-keep/keep-bridge.py=, 12 tests), the elisp core + =cj/keep-refresh= renderer with atomic writes and async make-process (=modules/google-keep-config.el=, 15 ERT tests), un-orphaned under a =C-c k= prefix, graceful warning when gkeepapi/token/auth is missing. The pure JSON-to-org core is kept extractable per the spec. Live fetch needs the one-time gkeepapi + master-token setup — see "Google Keep v1 live setup and first fetch" under Manual testing and validation.
Next: v2 (read-write — create/edit back to Keep, with a staleness guard) per the spec, the immediate follow-on once the live read is confirmed. Later: list/checkbox rendering, package extraction.
Spec: [[file:docs/specs/google-keep-emacs-integration-spec.org][google-keep-emacs-integration-spec.org]] (Ready, 2 review rounds; all five decisions resolved 2026-06-25).
@@ -4099,9 +4115,15 @@ Three small reveal.js improvements; collected into one task because each on its
Treesitter grammars are downloaded by =treesit-auto= on first use and live outside the localrepo. For true offline reproducibility, cache the grammars next to the localrepo (a =.localrepo/treesitter/= tier, or a separate mirror script). Cross-linked from =docs/design/localrepo.org=.
** TODO [#C] Webm previews not rendering in dirvish :bug:solo:
+:PROPERTIES:
+:LAST_REVIEWED: 2026-06-29
+:END:
Dirvish computes a valid MD5-hashed cache path and =ffmpegthumbnailer= thumbnails the webm fine by hand, but dirvish's async cache generation never lands the jpg, so no preview shows. Root-cause the async step: trace the =(cache . CMD)= recipe dispatch and sentinel (=dirvish-shell-preview-proc-s=, =dirvish--make-proc=) to find why the generated jpg is never written or displayed.
-** TODO [#C] Completion category for the mu4e attachment picker :feature:solo:
+** TODO [#C] Completion category for the mu4e attachment picker :feature:solo:quick:
+:PROPERTIES:
+:LAST_REVIEWED: 2026-06-29
+:END:
The Save-attachment picker (=mu4e-attachments.el=) has bare candidates worth a category. Add a custom category plus a table annotation-function showing each attachment's MIME type and size; confirm the mu4e part-plist keys first. Helper =cj/completion-table-annotated= is in =system-lib=.
** TODO [#D] Claude Code unterminated-color bleed (upstream)
@@ -5006,9 +5028,9 @@ Reproduce:
Next step: check the installed gptel version (=(assq 'gptel package-alist)= or =M-x package-list-packages=), update gptel to >= 0.9.8, then re-evaluate gptel-magit activation. If gptel was pinned/held on velox, reconcile the pin against the gptel-magit dependency.
-** TODO [#C] Build an Org-native API workspace :feature:test:
+** TODO [#D] Build an Org-native API workspace :feature:test:
:PROPERTIES:
-:LAST_REVIEWED: 2026-06-21
+:LAST_REVIEWED: 2026-06-29
:END:
Moved to Someday/Maybe on 2026-06-23 when gptel was archived. This
@@ -5354,7 +5376,7 @@ First pass can skip or mark as unsupported:
* Emacs Resolved
** TODO [#C] Color dashboard navigator independently of list items :feature:ux:
:PROPERTIES:
-:LAST_REVIEWED: 2026-06-21
+:LAST_REVIEWED: 2026-06-29
:END:
The dashboard navigator (icons + labels) and the recentf/project/bookmark list items are both painted by =dashboard-items-face=: the navigator gets a =dashboard-items-face= overlay, and overlays beat text properties, so the per-button =dashboard-navigator= face is inert. To color the navigator independently of the items, override where that overlay is applied — advise or redefine =dashboard-insert-navigator=, or strip/replace the overlay's face.
Triggered by: 2026-05-22 dashboard color work (L105).