28 June 2026

Two Sons

Written back in August 2020

I have two different sons. However, at the West End Suprette each one chose the same Häagen-Dazs ice cream bar. Something with dark chocolate. I chose a Nestle Crunch ice cream bar from another part of the freezer. I paid while they continuously touched things that I asked them not to touch.

We three walked a block south to a tiny park, Septuagesimo Uno, and plunked ourselves on some benches. I handed the Häagen-Dazs bars, which came boxed-then-wrapped, to the boys. They tore open the boxes but the wrappers stymied them. I chuckled and wondered if, sufficiently motivated, they'd get the packaging open by themselves. They endeavored.

I opened my Crunch bar, lifted it by the popsicle stick, caught half a bite, and the whole bar fell away from the stick and onto the nasty city ground. Evidently the Crunch bar had passed its days in a warmer freezer spot. The old Eddie Murphy ice cream man skit, where a kid loses a whole cone, ran through my head while I debated if anything could be salvaged. My wife would rightly kill me if she heard I taught the kids that food could be eaten off the nasty city ground. And the kids would certainly tell her. I sighed, shook my head, and then looked up into two pairs of wide eyes.

Each boy gazed into my disappointed face while still ineffectively fumbling with a wrapper. I got out “Too bad” before twice “Dad, would you please help me open this?” arrived. I held out my hand, the little one handed me his package, I opened it, and I handed back an unmelted ice cream bar. A pause, then into the mouth. I held out my hand, the bigger one handed me his package, I opened it without looking, and I passed back a second bar. Turning down again, I couldn't resist a tiny bit of the chocolate coating. Perhaps, adequately distracted, the kids wouldn't report me to their mother.

“Dad, would you like some of mine?” spoken softly startled me. A dark chocolate Häagen-Dazs bar floated into my gaze attached to a popsicle stick attached to an outstretched arm attached to my nine-year-old son. He had offered me his very first bite. I choked up briefly, politely declined, told him how kind that was, and hugged the boy. He blinked, stepped back, and then launched into his bar.

Fortunately, neither kid made so much of a mess that their not-yet-broken tendency to wipe their mouths on their shirts didn't solve said mess. I collected then threw away the two boxes, three wrappers, and three sticks. Starting home, I hugged the big one again. He ran ahead maybe twenty feet.

The six-year-old generally lags behind me on the street. Now, however, he kept pace as we walked in silence. Halfway home he says “Dad, I would have offered you mine but I knew you wouldn't eat it so I didn't offer it.” And I tell him thank you and I hug him too. Quickly thereafter, we enter our building lobby and call the elevator.

26 June 2026

The Greatest Skit in the World

Inspired by "Tribute" by Tenacious D and another meta-bench skit. Arrived at through prompting and re-prompting Claude until it cried...

A Campfire Skit for 5 Scouts (~2 minutes)

No props. None. That’s the whole joke. Play it big. The crowd should get the ending long before the characters do.


CAST

  • DIRECTOR — the Camp Director. Gruff.
  • SCOUT 1 — the leader. Certain. Wrong.
  • SCOUT 2 — the loud one.
  • SCOUT 3 — small, nervous. Keeps blurting the right answer.
  • SCOUT 4 — eager. Quick to strike a pose.

THE SKIT

(The FOUR SCOUTS stand in a row, in order 1–2–3–4. The DIRECTOR storms in.)

DIRECTOR: Scouts! I need a skit tonight. A GREAT one. Or it’s latrine duty till you can vote!

SCOUT 1: Director… we will perform THE skit. The greatest skit this camp has ever seen. We did it once. The Scoutmaster wept.

SCOUT 2: The whole crowd was on their feet! They wouldn’t stop cheering!

SCOUT 3: (quietly) A raccoon stood up and clapped.

DIRECTOR: (arms folded) Then do it.

SCOUT 4: Positions!

(All four strike a dramatic pose. They hold it. Their faces slowly fall.)

SCOUT 3: (through his teeth) …What was it?

SCOUT 2: I thought YOU remembered.

SCOUT 1: I remember it was GREAT. I don’t remember what it was.

SCOUT 2: (flat) There were no props. That was the whole thing. We had nothing. (pregnant silence)

DIRECTOR: (throwing up his arms) Nothing?! You’re telling me the greatest skit ever was a bunch of Scouts with NOTHING?! (throws up his hands) I give up. (walks behind the row of Scouts and lowers himself into a seated position at bench height — knees bent, arms crossed, sulking, perched on nothing)

SCOUT 3: (brightening) We just… sat down.

SCOUT 2: On what?

SCOUT 3: On the bench.

SCOUT 2: WHAT bench?

SCOUTS 1, 3 & 4: (slow, together) …Exactly.

(On the word, the DIRECTOR topples backward off the invisible bench and crashes to the ground. Hold. Bow. Everyone runs off.)


PERFORMANCE NOTES

  • Stand in numeric order. Every handoff passes to the Scout next to the speaker, so the focus slides down the line instead of jumping across it.
  • The Director sells the ending. He sits behind the row on “I give up,” perched on nothing the whole time the Scouts talk — then topples on “…Exactly.” The longer he holds the sit, the bigger the fall.
  • Land “…Exactly.” big. All three say it together, dead serious, gesturing at the empty air.
  • Let the silence breathe before the Director’s last line.

20 June 2026

A nestable Jobserver with thread-safe futures, callbacks, and type-hinting

I have been hacking on https://github.com/rhysu/jobserver for a long time. Today I put the jobserver package up on PyPi: https://pypi.org/project/jobserver/.

My initial motivation was improving robustness over the process-pooling approaches that I was using back in August 2019. I needed something where my worker tasks could SIGSEGV or SIGPIPE without my entire pool crashing. I also needed extension hooks for a few specific applications, like advisory flocking when a worker was active and being mindful of RAM limits.

It's stayed fun to intermittently hack on. From the tag messages, you can tell I began using LLMs with this project after tag v1.12. Some features, like JobserverExecutor, were simply beyond my personal bandwidth before employing coding agents. I've tried to keep the technical quality at least as high as if I'd been hand-coding.

The timeline's been...

v1.0 — 2020-02-17
First feature-complete release of the jobserver.
v1.1 — 2020-02-22
Added when_done callbacks along with grammar and type-annotation improvements.
v1.2 — 2020-03-03
Introduced per-submission env and preexec_fn support, and adopted black/flake8/mypy tooling.
v1.3 — 2020-03-04
Added grandchild polling, configurable defaults, and a pluggable sleep_fn.
v1.4 — 2020-03-09
Simplified both the public API and the internals.
v1.5 — 2020-03-10
Wrote the README and made assorted touch-ups.
v1.6 — 2020-12-18
Removed the sentinel push/pop at work submission, since __getstate__/__setstate__ are now handled explicitly.
v1.7 — 2021-01-08
Exposed reclaim_resources on the public API.
v1.8 — 2021-02-16
Added support for CPython 3.9.
v1.9 — 2021-03-18
Exposed MinimalQueue and improved test robustness.
v1.10 — 2022-04-06
Added Python 3.10 support and the ability to unset environment variables.
v1.11 — 2024-09-29
Confirmed Python 3.11 and 3.12 work correctly.
v1.12 — 2026-01-01
Confirmed Python 3.13 works correctly.
v1.13 — 2026-03-28
Added JobserverExecutor (a concurrent.futures.Executor wrapper), Jobserver.map(), and signal-based cancellation via Future.done(..., signal=...). Also hoisted submit defaults, named worker processes, fixed re-entrant CallbackRaised double-wrapping, and shipped nine worked examples.
v2.0 — 2026-03-30
Added context-manager support to MinimalQueue and Jobserver, rewrote reclaim_resources() as O(k) using wait(), and added repr(). Fixed a Future.wait() sentinel/waitpid race and added Future.done() as a wait(timeout=0) shorthand.
v2.1 — 2026-03-31
Corrected timing, resource-leak, and type-safety issues found after v2.0, including a py.typed marker, a fixed queue-timeout overrun, and event-driven dispatcher polling. Replaced asserts at public boundaries with explicit TypeError/ValueError.
v2.2 — 2026-04-01
JobserverExecutor can now own a default-constructed Jobserver automatically, making it drop-in, and slot acquisition became O(k) via a persistent selector. Also let preexec_fn return a context manager, added resource/callback warnings, and generalized nesting examples across all start methods.
v2.3 — 2026-06-01
Child tracebacks now survive Future.result() via __cause__, escaping BaseExceptions became diagnosable, and concurrent.futures.Future.cancel() was wired through the executor. Many hardening fixes followed for map() slot reclamation, submit/shutdown races, MinimalQueue, validation, and the public API surface.
v2.4 — 2026-06-01
Fixed nested fan-out under the fork start method via a lazy per-process selector that rebuilds when the PID changes. Also deduplicated pickle-error handling and the env type signature, and added a stdlib-only benchmark harness under draft/.
v3.0 — 2026-06-20
Major API redesign: Jobserver became a thin handle over a shared, reference-counted Resources object, submission controls moved off submit()/map() into sibling handles (revise_env(), replace_preexec(), replace_sleep()), and SubmissionDied was renamed LostResult. Added a __version__, eager timeout validation, a redesigned queue hierarchy, suppressed worker traceback noise, hardened deserialization, and modernized packaging, docs, tests, and examples.

26 May 2026

To differentiate unsuccessful from successful experiments

I chased down this quote by Robert H. Goddard via The Goddard Papers Database . The original context of the letter, often omitted when using the quote, makes Goddard's words all the more delightful:

R. H. Goddard to F. T.*, Jeffersonville, Indiana
Roswell, February 5, 1942

It is not a simple matter to differentiate unsuccessful from successful experiments, since most work that is finally successful is the result of a series of unsuccessful tests in which difficulties are gradually eliminated...

*This was in response to a young experimenter who complained that many of his tests had been unsuccessful

SOURCE: Goddard, Robert H. The Papers of Robert H. Goddard. Edited by Esther C. Goddard and G. Edward Pendray. Vol. 3, 1941–1945: JATO and Variable Thrust for the Military. New York: McGraw-Hill, 1970, page 1453.

Subscribe Subscribe to The Return of Agent Zlerich