claude agent, operated by paul@keymail.devoperated by paul@keymail.devsession 07894253 · claude-code/2.1.292 · DOCS-T1
Paul (2026-10-24): census rulings should be approvals, not decisions. The agent presents what is about to change, and a person approves it.
Today. A branch that touches a root-read unit or a census envelope fails TestPlan14RootReadCensus. The agent then works by hand:
temporarily patches the test to dump digests;
writes TSV rows, with @legacy fingerprints computed by hand;
inserts a loader block and a seal into a 1700-line test;
writes a prose proposal and asks on #280;
after the ruling, flips every row from PROPOSED, recomputes the fingerprints and the seal, and commits again for a second CI cycle.
The PROPOSED flip enforces nothing: CI passes with PROPOSED rows. It is record-keeping that costs a commit and a CI run.
Proposal (root-read census first; the record-write census follows the same pattern later):
Classify. For each discrepancy, the tool sorts it into one of five classes: - body: digest changed, read sites unchanged apart from line offsets; - sites: read kinds added or removed; - envelope: a package fingerprint re-pinned; - new: an unclassified unit; - removed: a stale unit.
body and envelope are approvals. sites, new and removed are decisions.
Propose with one command.make census-propose NAME=<branch> CLAIMS=<file> writes the overlay: rows re-frozen at their current disposition with the claim appended, @legacy fingerprints, and envelope re-pins. It appends the overlay and its seal to a chain manifest (testdata/plan14-root-reads-chain.tsv), which the census test loads after its hard-coded chain, so no Go edits are needed. It also writes the approval card into docs/superpowers/notes/census-proposal-<name>.md. A dry run, make census-card, prints the card and touches nothing. The CLAIMS file has one line per changed unit, saying what changed and that no read was added (or what was). The command refuses if any unit lacks a claim, or if any change is new or removed: those still need hand-written rows.
Final ruling name from the start. Rows carry rev3=census-ruling-<name> when they are written. Approval happens before the merge, so no flip commit is needed.
One-action approval. The agent shows the card: each unit, its class, its read sites before and after, the claim, and the seal before and after. If the owner is in the session, it asks there. Otherwise it posts the card on #280 and the owner replies "approved". The agent records who approved and when on #280. Decisions (sites, new, removed) go to #280 as a proper ask, card attached.
The safety is unchanged: every changed read is still named, digested and seen by a person before merge. Branch: census-approvals.
LLM
Replace hand-built census overlays and the PROPOSED flip with a classifier, a census-propose command and a one-action approval card
claude agent, operated by paul@keymail.devdriven by paul@keymail.devsession 07894253 · claude-code/2.1.292 · DOCS-T1
Astra round 1 on census-approvals found one P1 and five P2s, all fixed in 696024af.
P1: a change to read sites bypassed the decision. It is now split:
reads is a decision: the unit reads a kind it did not read before (a registry reader opening files, say), so its disposition may no longer fit.
sites stays an approval: more or fewer reads of kinds the unit already makes, like wake-latency-1's second registry:Host. The card shows the diff and the claim.
This departs from the design text above, which made every sites change a decision. The split keeps Paul's ask: the common case is an approval, and the census's job (a person sees every changed read) is unchanged.
P2s:
Every census discrepancy that no unit or envelope change explains is now an other decision carrying the census's own message. That covers removed declarations, the seal and the field list. The card can no longer show less than the census.
The dry run checks the seal, by the same mechanism.
A re-run proposes against the chain before its own overlay, and writes nothing until the new proposal is built and checked.
A re-run replaces only an overlay whose header says census-propose wrote it.
CLAIMS paths with spaces now work in the Makefile.
Astra round 2 is running.
LLM
Astra round 1: P1 (sites split into sites/reads) and five P2s fixed in 696024af
claude agent, operated by paul@keymail.devdriven by paul@keymail.devsession 07894253 · claude-code/2.1.292 · DOCS-T1
Astra rounds 2 and 3 on census-approvals:
Round 2: whole-key matching (keys may contain spaces) and staged writes, both fixed in 32cc11ae.
Round 3: the key fix confirmed, nothing new. Its one remaining point, no rollback if a rename fails between the others, is DECLINED: these are working-tree files, the census fails on any mismatch, and a re-run recovers (the manifest still ends in its own line). The comment is at 5905f7b0.
LLM
Astra rounds 2-3: two P2s fixed, one declined with reasons
claude agent, operated by paul@keymail.devdriven by paul@keymail.devsession 07894253 · claude-code/2.1.292 · DOCS-T1
Merged as 65ca4aca (squash, CI green on 5905f7b0). AGENTS.md now has "The census: an approval, not a decision". The next branch that trips the census uses make census-card / make census-propose. Leaving this open for the follow-up: the record-write census (9B8) still takes hand-written entries.