diff options
| author | Craig Jennings <c@cjennings.net> | 2026-06-15 23:44:58 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-06-15 23:44:58 -0500 |
| commit | 6363552d57d6cb8af32e3468c04992abf099a06d (patch) | |
| tree | f3850bcf86375b6d22eec139182837dfc514ea5d | |
| parent | abfec5f0179096a69e54a4a8d60306f6f0b97b22 (diff) | |
| download | dotemacs-6363552d57d6cb8af32e3468c04992abf099a06d.tar.gz dotemacs-6363552d57d6cb8af32e3468c04992abf099a06d.zip | |
chore(todo): park remaining :next: tasks as VERIFY with next-steps
deploy-wip (mechanism), calendar-sync x2 (need .ics fixture), org-roam refile (measurement-first), dashboard icons (font approach), transcription (focused pass), music faces (theme-side colours), music tests (audit session), alphabetize + sort-newest (focused studio pass), compact-contrast (clarify intent), fullscreen-terminal (confirm gesture). Each carries what I need or the plan.
| -rw-r--r-- | todo.org | 36 |
1 files changed, 24 insertions, 12 deletions
@@ -44,12 +44,14 @@ 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 [#A] theme-studio: deploy-wip button on the browser page :feature:studio:next: +** VERIFY [#A] theme-studio: deploy-wip button on the browser page :feature:studio:next: +Needs from Craig: a mechanism choice before I build it. The page is served from file://, so a button can't run make directly. Two options: (a) a tiny localhost helper the page POSTs to (it runs make deploy-wip), or (b) the page writes a watched trigger file that a small daemon/timer picks up. Pick (a) or (b) and I'll implement + test it. Add a button on the theme-studio page that runs the make deploy-wip target locally (build WIP.json into the theme, live-reload the daemon). The page is served from file://, so the browser can't run make directly. Needs a local bridge: a tiny localhost helper the button POSTs to, or a watched trigger file the page writes. Pick the mechanism before building. From the roam inbox 2026-06-15. ** VERIFY [#A] theme-studio: cannot reassign fg color :bug:studio:next: Needs from Craig: the exact repro (palette JSON + click sequence, or a quick screen capture). I traced it and couldn't reproduce from the code: updateColor (the "update selected" path) already excludes the selected entry from its uniqueness check (j!==i), and the fg/bg chips are selectable — paletteChip wires d.onclick -> selectColor(i), with the lock only blocking removal, not selection. The "already exists" wording is addColor's message, which is only reached via applyEdit when selectedIdx is null (i.e. no chip selected). So the trigger is a state I can't see statically — selection getting lost before "update", or a second entry already named "fg". With the precise steps I can pin it; I won't guess-patch the palette-update path on an [#A] bug since a wrong fix there corrupts themes. Selecting the fg tile, changing its value, and clicking update errors that an fg already exists instead of updating it. The update path treats a reassign as an add. From the roam inbox. -** TODO [#A] calendar-sync drops final occurrences, resurrects cancelled meetings :bug:solo:next: +** VERIFY [#A] calendar-sync drops final occurrences, resurrects cancelled meetings :bug:solo:next: +Needs from Craig: a real .ics fixture (or two) that reproduces both symptoms — a recurring event missing its final occurrence, and a cancelled meeting that reappears. This is RFC-5545 recurrence handling (RRULE/UNTIL/EXDATE/STATUS:CANCELLED); I won't guess-patch the parser without a failing case to test against. Drop a sanitized .ics and I'll write the characterization test + fix. :PROPERTIES: :LAST_REVIEWED: 2026-06-13 :END: @@ -75,7 +77,8 @@ All transient popups should follow one set of principles. Placement: when the Em =modules/mail-config.el:217-220= — the cmail context (primary account) sets only drafts/sent, so D falls back to default "/trash" which doesn't exist under ~/.mail (=/cmail/Trash= does); and NO context sets =mu4e-refile-folder=, so r targets nonexistent "/archive" everywhere. Accepting mu4e's offer to create the maildir strands mail in a directory mbsync never syncs — messages silently vanish from the server's view. Add =mu4e-trash-folder= to cmail + per-context =mu4e-refile-folder=. From the 2026-06 config audit. Fixed 2026-06-13: cmail gets =mu4e-trash-folder= "/cmail/Trash"; refile is a per-message function (=cj/mu4e--refile-folder=) instead of a per-context string — mu4e context :vars are sticky, so a per-context refile leaks one account's archive folder into another. cmail → "/cmail/Archive"; gmail/dmail signal a =user-error= rather than move mail into an unsynced phantom folder (Craig chose the fail-safe over syncing [Gmail]/All Mail — the All Mail option means a multi-GB pull + cross-folder duplicates; revisit if local Gmail archiving is wanted). Applies on next mu4e open; pure dispatch helper covered by tests. -** TODO [#B] theme-studio: sort newest colors near the top :feature:studio:next: +** VERIFY [#B] theme-studio: sort newest colors near the top :feature:studio:next: +Deferred from the no-approvals batch (no blocker, needs a focused studio session). Plan: the palette + gallery order comes from columnsFromPalette / sortColumns / paletteOptionList; newest entries currently sort low. Add a recency signal (palette insertion order) and surface recent columns near the front. Risk: the column sort is pinned by several browser gates (#sorttest etc.), so it needs careful test updates — which is why I held it rather than rush it here. Newly added colors currently land after the ground layer (bg/fg), low in the order. Surface them near the first entry instead, in both the palette color list and the gallery/dropdown, since the most recently added colors are usually the ones being worked on. From the roam inbox 2026-06-15. ** TODO [#B] agenda sources: roam Projects missing, no existence filtering :bug:solo: From the 2026-06 config audit, =modules/org-agenda-config.el=: @@ -416,7 +419,8 @@ Expected outcome: ** TODO [#B] Auto-dim: org headings, links, and tags do not dim in unfocused windows :bug: 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] calendar-sync robustness: atomic writes, curl --fail, zero-event false errors :bug:solo:next: +** VERIFY [#B] calendar-sync robustness: atomic writes, curl --fail, zero-event false errors :bug:solo:next: +Deferred, pairs with the calendar-sync recurrence VERIFY above. The mechanical parts (write to a temp file + rename, add curl --fail, guard the zero-event case) are doable, but any calendar-sync change needs verification against a real .ics feed to avoid masking a genuine empty/failed sync. Do this together with the recurrence fix once you provide a fixture / confirm the live feed. From the 2026-06 config audit, =modules/calendar-sync.el=: - =:1309= — agenda file written via =with-temp-file= directly on the target (truncate-in-place); org-agenda/chime reading mid-write sees a partial calendar, hourly. Write temp + =rename-file= (atomic same-fs). Same for =--save-state= :258. - =:1284= — curl runs without =--fail=: an HTTP 404/500 error page exits 0 and the HTML proceeds into conversion. @@ -2421,7 +2425,8 @@ configuration (=text-config=, =diff-config=, =ledger-config=, =games-config=, =mu4e-org-contacts-setup=, =telega-config=, =httpd-config=, =org-agenda-config-debug=). -** TODO [#B] org-roam :config triggers the 15-20s refile scan synchronously at first idle :bug:solo:next: +** VERIFY [#B] org-roam :config triggers the 15-20s refile scan synchronously at first idle :bug:solo:next: +Needs from Craig: this is measurement-first (perf), not a blind fix — it's the same bottleneck as the "optimize org-capture target building" debug task. Run /debug with debug-profiling to measure what actually costs the 15-20s (file count? regex? agenda rebuild?), then fix from the data. I won't restructure the refile/agenda scan without a profile. Say "let's debug it" and I'll profile + fix. =modules/org-roam-config.el:78-79= — org-roam is =:defer 1=, so its :config calls =cj/build-org-refile-targets= at 1s idle, BEFORE the 5s background timer (=org-refile-config.el:144-151=); on a cold cache the 30k-file scan runs inline and freezes Emacs at first idle. Drop the call — org-roam is loaded long before the 5s timer fires. Likely a player in the filed org-capture 15-20s perf task (=[#B] Optimize org-capture target building performance=) — check both together. From the 2026-06 config audit. ** DONE [#B] Scratch buffer background a shade lighter than default :feature:next: @@ -2434,7 +2439,8 @@ Needs from Craig: can't be done standalone. I tried deleting elpa/gptel-0.9.8.5 2026-06-15: tried deleting =elpa/gptel-0.9.8.5= standalone. The fork loaded correctly and gptel-magit still worked via use-package =:commands= autoloads, BUT package activation then printed "Unable to activate package gptel-magit / Required package gptel-0.9.8 unavailable" on every startup and test run (gptel-magit declares gptel as a package dependency that no longer resolves). Reverted. This can't be done standalone — it must be paired with the gptel-magit dependency fix (drop gptel-magit's package dep, or repackage the fork into .localrepo as gptel). Do it together with the gptel-magit investigation task. -** TODO [#B] theme-studio: dashboard preview icons missing, list items unthemed :bug:studio:next: +** VERIFY [#B] theme-studio: dashboard preview icons missing, list items unthemed :bug:studio:next: +Needs from Craig: an approach decision on the icon half. The navigator nerd-glyphs show as mojibake because the browser has no nerd font — fixing it means shipping/@font-face-ing a Symbols Nerd Font web font into the studio page (a real asset + licensing call), or substituting plain glyphs in the preview. The "list items unthemed" half is a separate studio-CSS fix I can do, but I'd rather settle the font approach and do both together. Tell me: embed the nerd font, or use substitute glyphs? Found while theme-testing the live dashboard against the preview. - The navigator icons don't render in the preview at all, showing as mojibake. The nerd-font glyphs have no font fallback in the browser. - No way to set the color of the project, bookmark, and recent-files list items. The preview renders those entries as plain unstyled text, and the dashboard app exposes no editable face for them. @@ -2498,7 +2504,8 @@ This may be cancelled if the extra distinction makes the generator harder to und :END: Package faces model =inherit= explicitly, but UI faces currently expose only fg/bg/style fields in the table and generated theme output. Before implementing UI-face inheritance, write and review a small spec that defines: which UI faces get an inherit selector, how own defaults from =emacs-default-faces.json= appear versus effective inherited values, how export/import stores cleared vs inherited vs explicit values, how preview resolution follows UI inherit chains, and what browser gates prove the behavior. This touches the UI model, generated defaults, export format, preview rendering, and reset semantics, so it should not be slipped in as a refactor. -** TODO [#B] transcription: stderr never reaches the log, video transcripts stranded in /tmp :bug:solo:next: +** VERIFY [#B] transcription: stderr never reaches the log, video transcripts stranded in /tmp :bug:solo:next: +Deferred from the batch (no blocker; needs a focused pass with live verification). Plan: (1) transcription-config.el:210 — make-process :stderr with a file path creates a buffer, not a file; route stderr into the process buffer and write the captured text out in the sentinel, then drop the leaked buffer. (2) :370-374 — derive the txt/log base from the VIDEO path, not the temp mp3's /tmp path, so transcripts land alongside the source. The path-derivation half is cleanly unit-testable; the stderr half needs a real transcription run to verify, which is why I held it for a focused session rather than the batch. From the 2026-06 config audit, =modules/transcription-config.el=: - =:210= — =make-process :stderr= with a file PATH creates a BUFFER named like the path (verified by probe); the "Errored. Logs in <file>" notification points at a log without the error text, and the hidden stderr buffer leaks per transcription. Route stderr into the process buffer or write it out in the sentinel. - =:370-374= — video path derives txt/log from the temp mp3's /tmp path; the transcript lands in /tmp and dies on reboot, contradicting the "alongside the source" docstring. Pass the video's path as the output base. @@ -2804,11 +2811,13 @@ From the 2026-06 config audit, =modules/ai-conversations.el=: ** TODO [#C] cj/gptel-switch-backend reintroduces the string-model crash :bug:quick:solo: =modules/ai-config.el:272= — =(setq gptel-model model)= with the raw completing-read STRING — the documented wrong-type-argument-symbolp modeline hang (CLAUDE.md gotcha), reachable from C-; a B today. =cj/gptel-change-model= (C-; a m) already does backend+model switching and interns correctly. Intern here, or delete switch-backend and keep one command. From the 2026-06 config audit. -** TODO [#C] theme-studio: alphabetize the assignment view list below the package divider :feature:quick:solo:studio:next: +** VERIFY [#C] theme-studio: alphabetize the assignment view list below the package divider :feature:quick:solo:studio:next: +Deferred from the batch (no blocker, needs a focused studio pass). Plan: sort the package-faces entries alphabetically below the divider in the assignment view dropdown/list. Localized to the view-list build; held only to keep the batch from sprawling. Sort the assignment view list alphabetically anywhere below the divider for the package views. From the roam inbox 2026-06-15. ** TODO [#C] theme-studio: calibre package doesn't color properly :bug:studio: The calibre package preview has no elements to theme in the search list, and coloring switches to the string color on mismatched quotes. Investigate, then record a diagnosis and solution in this task before fixing. From the roam inbox 2026-06-15. -** TODO [#C] music: extract faces for music config :refactor:quick:solo:next: +** VERIFY [#C] music: extract faces for music config :refactor:quick:solo:next: +Needs from Craig: this is theme-side work, not a config edit — the music-config faces were already stripped (2026-06-14), so "extracting" them means DEFINING them in the theme (theme-studio JSON / build-theme) for playlist name, status, the per-button on/off pair, per-key symbol+text, and other labels. That needs the actual color choices and which theme(s) to add them to. Give me the palette intent (or say "pick sensible defaults in WIP") and I'll add the face definitions. Pull the music-config faces out to the theme (the config no longer defines faces directly): playlist name, status (paused, etc.), two mode colors per "button" (on vs off), a per-key symbol+text color, and a color for all other labels. Pairs with the 2026-06-14 face-stripping work (music-config faces were removed there and are currently undefined until the theme defines them). From the roam inbox 2026-06-15. ** TODO [#C] music: show song information in the modeline :feature: Show basic song information in the modeline, with streaming-source support too. Write a spec for this one first. From the roam inbox 2026-06-15. @@ -2822,7 +2831,8 @@ Increase the palette's maximum span count to 5, for a smoother, slower transitio *** CANCELLED which control caps below 5 — current maxes are all 8 CLOSED: [2026-06-15 Mon 22:52] On review the per-column span control, the ground span control, and regenColumn all already cap at 8 (well above 5), so there's no sub-5 limit to raise. Either 5 is already reachable, or the intended control is a different one (e.g. the generator emits base-only columns — spanCount is hardcoded 0 in palette-generator-ui.js). Need Craig to point at the control he's hitting. -** TODO [#C] theme-studio: compact the contrast column to a number :solo:quick:studio:next: +** VERIFY [#C] theme-studio: compact the contrast column to a number :solo:quick:studio:next: +Needs from Craig: clarify "colored like the current text." The contrast cell is crHtml in app.js — today it shows "N.N PASS/FAIL" colored by rating. Do you want (a) the number colored by its pass/fail rating (green/gray/red) with the verdict word dropped, or (b) the number colored in the face's own foreground (a legibility preview)? I'll do whichever; I won't guess on the aesthetic. Represent contrast as a colored number colored like the current text. The word "passed" is unnecessary ** TODO [#C] Build an Org-native API workspace :feature:test: :PROPERTIES: @@ -4042,7 +4052,8 @@ used to handle. Per-module fixups for ledger, AUCTeX, eshell, mu4e compose, and the three =prog-*= modules. See the design doc for the full translation table, migration steps, tests, and risks. -** TODO [#C] music-config option-combination audit + tests :test:next: +** VERIFY [#C] music-config option-combination audit + tests :test:next: +Deferred from the batch — this is a sizable test-writing audit (pairwise option combinations + new ERT coverage for music-config), better as its own focused /add-tests or /pairwise-tests session than crammed into a bug-fix sweep. No blocker; say the word and I'll run /pairwise-tests over the option space. :PROPERTIES: :LAST_REVIEWED: 2026-06-06 :END: @@ -4142,7 +4153,8 @@ Evaluate against these projects' languages: elisp (edebug already works), Python Do this after the F-key rework ticket ships so F5 is the only hole left. -** TODO [#C] Pull a fullscreen terminal window away with C-; b + arrow :feature:next: +** VERIFY [#C] Pull a fullscreen terminal window away with C-; b + arrow :feature:next: +Needs from Craig: confirm the intended behavior. When a terminal fills the frame, C-; b + arrow should "pull a window away" — split off a new window in the arrow's direction and move focus there? Or pop the terminal out and restore the prior layout? The C-; b window family exists (resize lives there); I need the exact gesture + target before wiring it. When a terminal fills the frame, =C-; b= then a right or down arrow should shrink the window from that edge, reducing its width or height so another buffer can share the screen without leaving the terminal. Relates to the ai-term adaptive placement and unified-popup tasks. From the roam inbox. ** VERIFY [#C] Remove unused system-power keybindings :refactor:quick:next: |
