<feed xmlns='http://www.w3.org/2005/Atom'>
<title>dotemacs/docs, 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-08-25T12:30:04+00:00</updated>
<entry>
<title>fix(telega): build the server image locally to meet tdlib 1.8.66</title>
<updated>2026-08-25T12:30:04+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-08-25T12:30:04+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=91fbac722e83cd108a295542a3c88de66d209fe8'/>
<id>urn:sha1:91fbac722e83cd108a295542a3c88de66d209fe8</id>
<content type='text'>
MELPA's 2026-08-18 telega raised telega-tdlib-min-version to 1.8.66. The pinned upstream image ships 1.8.64, so telega killed its own server on every launch. Upstream's only 1.8.66 image won't start: it's missing libglycin (zevlg/telega.el#596).

docker/telega-server/Dockerfile derives from that upstream image, pinned by digest, and adds the one missing package. make telega-image builds it as cj/telega-server:1.8.66-glycin, cj/telega-docker-image defaults to that tag, and a test holds the two equal. cj/telega now refuses to launch with a make telega-image hint when the image isn't built, since docker would otherwise try to pull a local-only tag from the registry. setup-telega.sh points at the make target instead of M-x telega-server-build.

I chose the local build over pinning the telega package back to 20260706.2147. The derived image satisfies both machines' floors. package.el can't pin a version and MELPA serves only its latest build, so nothing would enforce the package pin. When #596 is fixed upstream the pin returns to a registry digest and the Dockerfile goes.
</content>
</entry>
<entry>
<title>docs: record the telega docker pin and tdlib version mismatch</title>
<updated>2026-08-25T00:43:05+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-08-25T00:43:05+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=ac1d034d09dd37305e84d08438fef268ed8173bc'/>
<id>urn:sha1:ac1d034d09dd37305e84d08438fef268ed8173bc</id>
<content type='text'>
MELPA's 2026-08-18 telega build raised telega-tdlib-min-version to 1.8.66. The pinned zevlg/telega-server image ships 1.8.64, so telega kills its own server on every launch and nothing reports it.

The note carries the measurements and why the armed death alert wasn't seen, which is still unmeasured. It also records why zevlg/telega-server:latest isn't a fix (zevlg/telega.el#596: missing libglycin), the derived image I verified, and the pinning decision I haven't made yet.
</content>
</entry>
<entry>
<title>docs: record how the ambience audio was built</title>
<updated>2026-08-06T16:50:47+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-08-06T16:50:47+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=36c737f45efc4f9459a7923d62ccf2cf5bf2686a'/>
<id>urn:sha1:36c737f45efc4f9459a7923d62ccf2cf5bf2686a</id>
<content type='text'>
- Keeps the stream-copy loop technique and its measurements.
- Notes the amix normalize=0 trap that silently discards the mix ratio.
- Records the loop-period arithmetic behind the crossfade.
- Explains why the openly-licensed set sounds better but its rain is wrong.

The audio itself stays untracked.

Claude-Session: https://claude.ai/code/session_01WpQhUr9mNrXss3HiaN6G2s
</content>
</entry>
<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>
</feed>
