You have ~700 custom tools and several graveyard/half-life/sprawl monitors, but nothing closes the loop by asking *why* a tool died. This writes a one-paragraph eulogy for each newly-dead tool — what it was for, what replaced it, what pattern it reveals — and delivers a weekly batch to the tablet as a stylus-answerable card, turning tool decay into a reflection practice instead of a cleanup chore.
Create ~/bin/tool-eulogy-loop (bash, ~80 lines). Weekly systemd timer. 1) Read the death list from existing tool-half-life + tool-graveyard-reaper output (dead = no invocation in 60d per their state files in ~/.local/state/). 2) Diff against ~/.local/state/tool-eulogy/seen.txt to get newly-dead tools. 3) For each, gather: `git log --diff-filter=A -1 -- bin/
**What it does**
- Finds tools that died since last run (half-life ledger `DEAD`/`ORPHAN` entries first; falls back to 60-day-idle + zero shell-history hits).
- Pulls each tool's birth commit, header comment, and any successor note from `tool-succession-*.md`.
- Asks Haiku for a ≤60-word eulogy plus ONE Socratic question about the building impulse.
- Renders a ruled, stylus-answerable PDF into `~/Tablet/pondercards/`, so `stylus-reply-router` can pick up the handwritten answers.
- Appends names to `seen.txt` so nothing is eulogized twice.
**Files created**
- `~/bin/tool-eulogy-loop` (95 lines, executable)
- `~/bin/tool-eulogy-render.py` (PDF renderer, executable)
- `~/bin/tool-eulogy-loop.test.sh` — 7 assertions
- `~/bin/tests/test_tool-eulogy-render.py` — 2 tests
- `~/.config/systemd/user/tool-eulogy-loop.{service,timer}` — Sundays 06:30, `Persistent=true`, memory-capped
**Proof it works**
- 9/9 tests pass (idempotency, live-tool exclusion, ledger honoring, empty-LLM fallback).
- Real run produced `~/Tablet/pondercards/tool-eulogy-2026-08-15.pdf` with genuine eulogies for 5 dead `async-loop-*` tools, each naming its successor and a real pattern ("dedicated monitors consolidate into the system they audit"). Timer enabled, next fire tomorrow 06:32.
**One thing to know:** the plan called for `llmq`, but its runner allowlist is unresolved here, so it uses `claude -p --model haiku` (same path `pondercard-generate` already uses). Swap