<feed xmlns='http://www.w3.org/2005/Atom'>
<title>dotemacs/docs/specs, branch main</title>
<subtitle>My Emacs configuration
</subtitle>
<id>https://git.cjennings.net/dotemacs/atom?h=main</id>
<link rel='self' href='https://git.cjennings.net/dotemacs/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/'/>
<updated>2026-07-31T17:39:27+00:00</updated>
<entry>
<title>fix(prompts): make destructive confirms one keystroke</title>
<updated>2026-07-31T17:39:27+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-31T17:39:27+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=0b93863689038a385fd320440ac0a413ce81c4e1'/>
<id>urn:sha1:0b93863689038a385fd320440ac0a413ce81c4e1</id>
<content type='text'>
I had to kill an Emacs session today over a prompt I could not answer. A
second agent session held the selected window while "Overwrite hiroshi.m3u?
(yes or no)" waited in another frame, so my keystrokes went to a terminal
and the minibuffer stayed empty. Losing unsaved buffers is a far worse
outcome than a mis-keyed confirm.

So cj/confirm-strong becomes cj/confirm-destructive, and instead of binding
use-short-answers to nil for a typed "yes" it reads a single y or n.

Two things I kept:

- No default. Only y and n answer, so a stray RET or space re-prompts
  rather than confirming a shutdown.
- Pending input is discarded before the read. Without that the change would
  have been a bad trade: read-char-choice reads the input queue, so a key
  typed before the prompt painted would confirm instantly, where the old
  typed-"yes" absorbed it harmlessly.

Worth being honest about what this does not fix. One keystroke does not
make a prompt reachable when focus is elsewhere, and C-g is still the
escape. It lowers the cost of the situation rather than preventing it.

Six call sites: shutdown and reboot, shred, playlist overwrite and delete,
and the two file overwrites.
</content>
</entry>
<entry>
<title>refactor(agenda): replace the dedicated frame with a full-frame F8</title>
<updated>2026-07-27T19:19:32+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-27T19:19:32+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=9da363f35b2b9ebc5ffefb41cf092b006c56a695'/>
<id>urn:sha1:9da363f35b2b9ebc5ffefb41cf092b006c56a695</id>
<content type='text'>
- F8 now fills the whole frame instead of three quarters.
- The agenda rebuilds itself on every five-minute wall-clock mark.
- Quitting restores the window layout it took over.
- The dedicated agenda frame and its tests are gone.
- S-&lt;f8&gt; returns to the force-rescan.

The frame bought live shared state. It paid for that with a read-only deny policy, engage-routing and a snapshot failure path. All of it existed only because the agenda shared a process with my working frames. A full-frame F8 needs none of it.

The refresh rebuilds only a visible agenda. It keeps point on its line. The body is guarded, because a signal in a repeating timer resignals every tick.
</content>
</entry>
<entry>
<title>docs(spec): flip keybinding-console-safety DOING to READY</title>
<updated>2026-07-21T12:07:51+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-21T12:07:51+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=ed306961291c49fd3f7c445b3a8ef91d2708da2c'/>
<id>urn:sha1:ed306961291c49fd3f7c445b3a8ef91d2708da2c</id>
<content type='text'>
The DOING came from a legacy status retrofit with no build tasks ever decomposed, and the primary work has not started: the key-translation layer is still live and the M-S- bindings are still global. READY is the honest state, design settled and awaiting decomposition.
</content>
</entry>
<entry>
<title>fix(agenda): spawn the agenda frame tiled, not compositor-fullscreen</title>
<updated>2026-07-20T20:38:23+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-20T20:38:23+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=1ccd7bddf55c41202afe316e70fa01059e1bcbbb'/>
<id>urn:sha1:1ccd7bddf55c41202afe316e70fa01059e1bcbbb</id>
<content type='text'>
I dropped (fullscreen . fullboth) from the spawned frame so a tiling WM places it side by side with the working frame. "Fullscreen" was the wrong word for the intent: a normal frame at its full tiled position, not one covering the whole output. The engage-routing and focus logic are unchanged and matter more now, since a task opens in the adjacent working pane.
</content>
</entry>
<entry>
<title>feat(agenda): add S-&lt;f8&gt; dedicated fullscreen agenda frame</title>
<updated>2026-07-20T19:23:38+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-20T19:23:38+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=404590623599398f120cd73d44ad235271c3b5bd'/>
<id>urn:sha1:404590623599398f120cd73d44ad235271c3b5bd</id>
<content type='text'>
I added a standing agenda surface in its own fullscreen frame of the daemon, placeable on its own workspace while the working frames stay untouched. S-&lt;f8&gt; spawns, raises, or closes it. The force-rescan moves to C-M-&lt;f8&gt;.

It shows a today-anchored seven-day view and refreshes every five minutes through org-agenda-redo, so the now-line and synced events stay current without re-scanning the file list. A default-deny minor mode keeps it read-only: only navigation, the engage keys (routed to the working frame), and the frame's own controls are allowed. A failed redo falls back to the last-good snapshot with cloned markers, so the frame is never blank or unrestricted.

I made it a frame of the daemon rather than a second process, so it shares the live state (calendar-sync, edits, the now-line). There's no startup auto-open, and the Hyprland-managed-window variant is a vNext once this proves out.
</content>
</entry>
<entry>
<title>docs(spec): redesign org-agenda spec to a fullscreen frame, mark READY</title>
<updated>2026-07-20T14:54:43+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-20T14:54:43+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=ab16633846d5a656de1f0c114334a06fca326a0a'/>
<id>urn:sha1:ab16633846d5a656de1f0c114334a06fca326a0a</id>
<content type='text'>
Craig redirected the right-side dock to a dedicated fullscreen frame of the daemon. I resolved all 8 decisions, reworked the design, alternatives, phases, and acceptance criteria to match, and flipped DRAFT to READY on the spec-review gate. One non-blocking finding: the frame view needs its own custom-command entry.
</content>
</entry>
<entry>
<title>docs: fix broken file: links in theme-studio and ai-kb specs</title>
<updated>2026-07-20T12:25:31+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-20T12:25:31+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=955f92ba7e159d0b70cbb279507e9c4e44eda1d2'/>
<id>urn:sha1:955f92ba7e159d0b70cbb279507e9c4e44eda1d2</id>
<content type='text'>
</content>
</entry>
<entry>
<title>feat: add workflow font profiles</title>
<updated>2026-07-20T02:10:40+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-20T02:10:40+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=18bcd567d1e7770b4e28c43eeefbf81696e2f4a3'/>
<id>urn:sha1:18bcd567d1e7770b4e28c43eeefbf81696e2f4a3</id>
<content type='text'>
I replaced the mixed Fontaine presets with seven named profiles that persist across restarts. The mode line, echo area, and minibuffer stay in Berkeley Mono.

Nov applies the shared Reading profile inside each EPUB buffer without changing the global selection.
</content>
</entry>
<entry>
<title>docs: add org-agenda dock-mode spec (draft)</title>
<updated>2026-07-18T15:32:18+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-18T15:32:18+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=410d885d88e12016a76ecbcedbe7ea69b734fa9b'/>
<id>urn:sha1:410d885d88e12016a76ecbcedbe7ea69b734fa9b</id>
<content type='text'>
A right-side full-height agenda dock: side-window display ignoring the 0.75 below-selected rule, a dock-scoped 5-min redo, and jump-to-task that opens in the working window. Four design decisions stay open (dock width, composite view shape, focus-on-open, auto-open default).
</content>
</entry>
<entry>
<title>refactor(signal): retire the in-Emacs signel client to the archive</title>
<updated>2026-07-14T06:12:21+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-14T06:12:21+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=a9736bcf1f1d683656d7222bdda26c1a7ef73986'/>
<id>urn:sha1:a9736bcf1f1d683656d7222bdda26c1a7ef73986</id>
<content type='text'>
Agents drive Signal via signal-cli and signal-mcp, so the interactive client earns no keep. I moved signal-config.el and its seven test files to archive/ per the pasture convention, dropped the require from init.el, removed the dashboard's Signal launcher (row sizes now 5 4 3 2, tests updated), and unregistered the C-; M prefix from the running daemon. The ~/code/signel fork repo is untouched. The spec record stays IMPLEMENTED with a retirement history line, and the messenger-unification draft carries a premise-shift note.
</content>
</entry>
</feed>
