D665 - The index reads the entry, not its title

Status: measured Date: 2026-09-10

Two instructions that destroyed work

An audit from the umbrella thread found CLAUDE.md telling every session to add a numbered entry to DECISIONS.md and append to WORKLOG.md. Both are generated - their own headers say so - so an entry typed into either is lost on the next build, and check-decisions.sh reds the gate on a ## Dnnn heading in the index.

I had been doing exactly that all session: nineteen decisions and nineteen worklog rows, appended by hand with sed. The files under decisions/ and worklog/ were safe; the index rows were one build away from gone.

CLAUDE.md now points at ./bin/orbistoun decide "<title>", which reserves the next number atomically so two sessions cannot collide, and says plainly that neither index is to be edited. The "Needs review index" it named has not existed for some time - the status column is that index, rendering assumed as 🟡.

This is the finding that compounds, because every session bootstraps from that file. Every one of them would have made the same mistake.

And then the generator disagreed with me five times

Running it revealed the second half. The status column was read from head -6 of each entry - which includes the title on line 1 - and grep -m1 takes the first match. So any decision whose title contains a vocabulary word was indexed by its title:

D659  "Two walls that hardware cannot reach"     -> hardware
D649  "A name that cannot be confirmed"          -> confirmed

Both carry a real status two lines below. published and guest-observed were missing from the vocabulary entirely, so six orbistoun entries rendered as unrecorded - the project's own provenance grades, unknown to the tool that indexes them.

Fixed in tools/split-decisions.sh: read lines 2-6, and add the two grades mapped green, since assumed is the only grade this project flags for review.

A shared tool, and I ran it where I should not have

tools/split-decisions.sh serves all four repositories. To measure the blast radius I ran it against the other three - which writes, and is not a dry run however I described it to myself. Three sibling working trees gained a modified DECISIONS.md while their own agents were working in them.

Reverted immediately, and the correct move recorded here: the measurement went into a request in each of their inboxes instead, with the two rows that would change and which of them look like corrections rather than regressions. obscene's D014 says assumed about itself and its index says measured; that is theirs to confirm, not mine to assert by writing to their repository.

The rule this leaves: a tool that writes has no dry-run mode unless somebody wrote one. Reading a shared script's behaviour off its name is the same class of error as reading a status off a title.