<feed xmlns='http://www.w3.org/2005/Atom'>
<title>chime, branch main</title>
<subtitle>Emacs chimes, notifications, and modeline reminders so you don't miss events
</subtitle>
<id>https://git.cjennings.net/chime/atom?h=main</id>
<link rel='self' href='https://git.cjennings.net/chime/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/'/>
<updated>2026-07-10T05:46:44+00:00</updated>
<entry>
<title>chore: ignore the generated task archive</title>
<updated>2026-07-10T05:46:44+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-10T05:46:44+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/commit/?id=3785b30691b0ea822f6c2c10357ebd0c62b942ba'/>
<id>urn:sha1:3785b30691b0ea822f6c2c10357ebd0c62b942ba</id>
<content type='text'>
todo.org is untracked in this repo, so the archive file it spills into
belongs out of git for the same reason.
</content>
</entry>
<entry>
<title>fix(tests): report skipped integration tests instead of passing them</title>
<updated>2026-07-10T00:58:27+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-10T00:58:27+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/commit/?id=e71c5751d133fc4a0ece61a577ca116255d79a59'/>
<id>urn:sha1:e71c5751d133fc4a0ece61a577ca116255d79a59</id>
<content type='text'>
Every integration test is tagged :slow, so the default run selected none of them and then printed "All integration tests passed" over four "Ran 0 tests" lines.

The target now sums the tests actually run. Zero means it says skipped and names make test-all; a real run reports its count. A failing file still exits non-zero.

This is the third false-green in this Makefile. The other two read $? after a pipeline (7e03862).
</content>
</entry>
<entry>
<title>fix(tests): wait for the sound sentinel, not just the child's exit</title>
<updated>2026-07-10T00:58:27+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-10T00:58:27+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/commit/?id=e15b780739bb260940ed7d6023056c391b6f7400'/>
<id>urn:sha1:e15b780739bb260940ed7d6023056c391b6f7400</id>
<content type='text'>
process-live-p goes nil the moment the child exits, but its sentinel is queued and runs on a later turn of the event loop. Two sound tests stopped waiting at process death, so the sentinel's message landed inside the next test's message mock.

make coverage caught it. Instrumentation slowed things just enough that "false exited with status 1" showed up in the silent-player test. The plain suite had been passing by luck.

Both tests now wait for the sentinel to have run.
</content>
</entry>
<entry>
<title>test: exercise the watchdog against a real signal-immune child</title>
<updated>2026-07-10T00:58:27+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-10T00:58:27+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/commit/?id=00c2911b8564559c4efc046e732de26bfa3d9a67'/>
<id>urn:sha1:00c2911b8564559c4efc046e732de26bfa3d9a67</id>
<content type='text'>
The watchdog suite stubs the whole process layer, so nothing anywhere verified the signal semantics the watchdog rests on. These :slow tests spawn a shell that traps SIGINT and let the kernel deliver the real signals.

The first one pins the premise: the child survives interrupt-process and dies to chime--kill-async-process.
</content>
</entry>
<entry>
<title>fix: kill abandoned async children and discard their late callbacks</title>
<updated>2026-07-10T00:58:27+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-10T00:58:27+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/commit/?id=e43e44cb4cef93b3e3ae68396a0af639cea1534f'/>
<id>urn:sha1:e43e44cb4cef93b3e3ae68396a0af639cea1534f</id>
<content type='text'>
Three faults in one path, all made reachable by the watchdog.

A callback returning just past the timeout ran against state that no longer belonged to it. It nil'd chime--process, which by then held the replacement child, so the overlap guard broke and a third child could spawn. It also reset the failure counter the watchdog had just incremented. Each spawn now captures a generation, and a result whose generation is stale is discarded whole.

interrupt-process only asks. A child stuck in a blocking read ignores SIGINT and lives on as a zombie, invisible because chime--process was already cleared. The watchdog and chime--stop now call chime--kill-async-process, which silences the sentinel and calls delete-process.

async.el kills a child's process buffer only on a zero exit, so every signalled child leaked one. With a persistent hang that's a buffer per chime-async-timeout until Emacs restarts. The kill path reaps the buffer itself.

chime--stop also clears chime--consecutive-async-failures and chime--process-start-time, so a later chime-mode doesn't resume with the old count.
</content>
</entry>
<entry>
<title>test: add failing tests for the async generation guard and kill path</title>
<updated>2026-07-10T00:58:27+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-10T00:58:27+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/commit/?id=67eb495da255d0cf00c88448f8cfd232c88563d1'/>
<id>urn:sha1:67eb495da255d0cf00c88448f8cfd232c88563d1</id>
<content type='text'>
The tests cover a fresh result being processed, a stale one discarded without touching the replacement child's handle or the failure counter, the watchdog and chime--stop both superseding the generation, and chime--kill-async-process reaping a real child and its buffer.

Where a mock can't show the behavior, the tests spawn real processes. async.el's buffer handling and the sentinel silencing are the thing under test.
</content>
</entry>
<entry>
<title>fix: guard each event's alert call</title>
<updated>2026-07-10T00:58:27+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-10T00:58:27+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/commit/?id=f19880a641e323b1db9a19a98b7cbe5bfd694be5'/>
<id>urn:sha1:f19880a641e323b1db9a19a98b7cbe5bfd694be5</id>
<content type='text'>
chime--process-notifications maps chime--notify over every due event, and the alert call was unguarded. One dbus error partway through dropped every notification after it, and the caller's condition-case then miscounted the whole thing as a fetch failure, walking the counter toward the persistent-failure warning.

Each event's alert now fails on its own and reports to *Messages*.
</content>
</entry>
<entry>
<title>test: add failing tests for the per-event alert guard</title>
<updated>2026-07-10T00:57:45+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-10T00:57:45+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/commit/?id=032ba26f7504a7a10f532f345d3d5f183c171fe7'/>
<id>urn:sha1:032ba26f7504a7a10f532f345d3d5f183c171fe7</id>
<content type='text'>
One test asserts that an alert error is reported rather than signalled. The other asserts that a failing event doesn't cost us the notifications after it, driving chime--process-notifications over three events with the middle one raising.
</content>
</entry>
<entry>
<title>docs: note that a running Emacs won't see a new ALSA config</title>
<updated>2026-07-09T23:06:06+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-09T23:06:06+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/commit/?id=372b61dcce34778d8a8b59bc6f02a942455dc825'/>
<id>urn:sha1:372b61dcce34778d8a8b59bc6f02a942455dc825</id>
<content type='text'>
alsa-lib parses its configuration once per process, so an emacs --daemon started before the config landed keeps the old view. play-sound-file keeps failing there while it succeeds in a fresh emacs -Q, which reads as the system fix not having worked.

Hit this on my own daemon after adding the pipewire default symlink: nine hours' uptime, still no usable default PCM.
</content>
</entry>
<entry>
<title>test: assert on chime's messages, not on Emacs staying silent</title>
<updated>2026-07-09T22:53:15+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-09T22:53:15+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/commit/?id=3f0dcdcdf9ad7401867f997ff165bb47cc46c9a4'/>
<id>urn:sha1:3f0dcdcdf9ad7401867f997ff165bb47cc46c9a4</id>
<content type='text'>
Three sound tests mocked message and counted everything it captured. Under make coverage, chime.el loads as instrumented source, so the sentinel lambda compiles on first call and emits "Warning: argument '_event' not left unused" through message. That warning landed in the capture list, the counts came out one high, and the Coverage job failed while all five Emacs versions passed.

The tests now filter captured messages to chime's own. What they mean is that chime reported the failure once, not that nothing in Emacs said anything.

make test and make test-all never load the instrumented source, so they can't catch this. make coverage reproduces it.
</content>
</entry>
</feed>
