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 |
|---|---|---|---|---|---|---|
| plugin-ecosystem/a-plugin-install-is-not-pinned-so-a-review | A plugin install is not pinned, so a review would bind a repository rather than code | plugin-ecosystem | open | 2026-08-04 | stated | 1 |
A plugin install is not pinned, so a review would bind a repository rather than code.
fetch.ts:70 is git clone --depth 1 <source> — no ref — so it takes whatever the default branch
points at when the install runs. A plugin reviewed at commit X installs at whatever was pushed
since, and --depth 1 leaves no history to compare against.
This is the shape of the npm attack already documented in CLAUDE.md (2026-08-04), and the same
shape as the Chrome Web Store's real failures — not bad extensions passing review, but good ones
sold or compromised and then pushing an update to users who had already accepted them.
Fix: a reviewedCommit on the catalogue entry, checkout detached at that SHA, and verify
rev-parse HEAD matches or refuse. The verification is the part that matters. An update then
becomes "a new reviewed SHA exists" — a catalogue change rather than something the author triggers.