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>
1.1 KiB
id, title, theme, status, created, date_source, order
| id | title | theme | status | created | date_source | order |
|---|---|---|---|---|---|---|
| files-app/rows-are-still-not-links | Rows are still not links | files-app | open | 2026-08-20 | assumed | 1 |
Rows are still not links. This is the half that did not get done, and it is the original
finding. Both list and grid render <div onDoubleClick> (FileItem.tsx:701,748), and search
results render <div onClick> (FileViewContainer.tsx:187) — the "opaque click" that
docs/navigation-audit.md names. No cmd-click into a new tab, no middle-click, not
link-focusable, and the target lives in a closure rather than the DOM.
It is now much easier than it was: folderHref(path) gives a folder's URL and hrefForPath gives
a full To with the overlay already stripped, so a row becomes
<Link to={hrefForPath(childPath)}> and a file row becomes a link that sets ?view=<name>. The
breadcrumb has done exactly this since before today and is the model.
Watch for: a row is also a click target for SELECTION (single click selects, double opens,
shift/cmd extend). An anchor changes what those gestures mean by default, so the selection
handlers have to keep working and preventDefault where they win.