todo: one file per item, grouped by theme, with a generated index

TODO.md had reached 1050 lines and 72 open items across 28 sections, read mostly
on a phone. It is now a directory: todo/<theme>/<item>.md, one card per file, with
frontmatter carrying id, status, created date and order, and the prose body copied
across verbatim. TODO.md becomes a generated index (bun run todo:index).

Dates: where an item's prose stated one it is used; otherwise its old section's;
otherwise 2026-08-20, floored at the day before the split rather than invented.
date_source records which.

Shaped for a two-way Kanban board, filed as todo/tooling — a card is a file, id is
the identity, frontmatter is the machine's half and the body is the owner's.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-21 05:42:39 +00:00
co-authored by Claude Fable 5
parent 8fa560df1b
commit 6071ded175
124 changed files with 2240 additions and 1043 deletions
+14
View File
@@ -0,0 +1,14 @@
---
theme: agent-delivery
heading: "Speaking into a session from the backend"
kind: theme
---
**Correction, 2026-08-21: the door exists, and three entries in this file said it did not.** The claim
that `pushTurn` has exactly one caller (the chat websocket) is **stale**. `api/chat/nudger.ts:102` calls
`startClaudeTurn({ ws: null, … })` — a turn started server-side, with no browser attached, into a live
session. Whoever is watching the chat sees it arrive the same way they would see a turn typed in another
tab. `startNudger()` is wired at `server.tsx:182` and ticks once a minute against a `nudges` table.
So **both** "missing" pieces are built: a recurring trigger, and a way to put a prompt into a running
session. What remains is narrower, and worth doing.
@@ -0,0 +1,22 @@
---
id: agent-delivery/generalise-it-deliver-a-turn-to-a-named
title: "Generalise it: deliver a turn to a named session, from anywhere in the backend"
theme: agent-delivery
status: open
created: 2026-08-21
date_source: stated
order: 1
---
**Generalise it: deliver a turn to a named session, from anywhere in the backend.** Wanted
2026-08-21 — "ideal" is the owner's word for it. Today the only server-side caller is the nudger,
and delivery is welded to its schedule: a row in `nudges`, one per (user, session), a fixed
message, a tick. What the dispatcher, the file watchers and Command HQ all want instead is a plain
verb — *here is some text, deliver it to session X* — with the schedule, if any, belonging to the
caller.
Two things already established and worth not re-deriving. The nudger's `checkSafe` holds three
refusals — not live, live but generating, another live session in the same directory — and the
comments above it carry why each one is there. And "not live" is the case that differs by caller:
the nudger refuses (nudging a dead session would CREATE an agent, which is not what nudge means),
while a dispatcher handing over five todos does want it created.
@@ -0,0 +1,15 @@
---
id: agent-delivery/the-cost-of-resuming-grows-with-the-transcript
title: "The cost of resuming grows with the transcript"
theme: agent-delivery
status: open
created: 2026-08-21
date_source: stated
order: 2
---
**The cost of resuming grows with the transcript.** Raised 2026-08-21 by the owner as a challenge
worth taking rather than a limitation to live with. Every resume re-reads the whole conversation as
input tokens, so a long-lived commander costs more per note than it did in week one, for identical
work. Measurable today rather than theoretical: `command_hq_turns` already records input tokens and
USD per turn, so the curve can be plotted before anyone argues about a fix.