Skip to content

v4.1.0 — gaps found in a project flow back to the baseline

Choose a tag to compare

@andygeiss andygeiss released this 25 Aug 18:36
· 61 commits to main since this release

The corpus could learn from projects and had no way to hear about it. Every rule in this repository was written by looking at the repository. Two things only a project can show — a decision the checklist has no section for, and a rule naming a dependency the standard library has since absorbed — were visible exactly once, to whoever hit them, and died with the task. Both now have somewhere to go, and neither needed a new document.

Project → baseline. SKILL.md Handing the work back gains one bullet: a baseline gap goes on the next-steps list. Two kinds count and nothing else — the checklist had no section and you settled it by inventing rather than by matching the surrounding code, or a baseline rule names a dependency stdlib now covers. Name it as a step and leave it: never edit the baseline as a side effect of project work. The bar is the whole design, because this rule's failure mode is noise rather than silence. A reflect-on-your-work rule with a soft trigger fires on every task and is skimmed past by the third one; both signals here are facts the agent already holds when it finishes, so neither costs a survey. "This looked reusable" is named and excluded.

Release → baseline. README.md Maintenance protocol gains Ask what the release absorbed: at every Go major (Feb/Aug), read the notes for what moved into the standard library, not only for what changed. A capability landing in stdlib usually moves a row out of Approved third-party dependencies in stack/go.md and into Modern stdlib choices, and rewrites the pattern that prescribed it in the same commit. A dependency whose justification has expired is a live defect against core value 1, and only two things go looking for one.

Absorption is a rewrite, not a retirement, and that had to be said where retirement is decided. A pattern whose dependency moves into stdlib still has something to say — the mechanism changes and the document stays. Only a pattern that existed solely to cover the gap meets signal 1. Without that paragraph, Retiring a pattern reads as a licence to delete a document the day Go absorbs its dependency, which is the moment its rules are most likely to be got wrong.

The rule was tested by looking for a gap, not by reading it. Inbound webhooks — the HMAC, the replay window, the raw body read before parsing — are genuinely uncovered by this corpus. CSV downloads look uncovered and are not: they are boxes under Taking a file from a user. The false guess is the point of the bar.

Nine defects over ten passes, plus two caught while writing the record, and the interesting ones were arithmetic. The first draft of the budget entry said none of the six patterns the 2026-08-18 raise bought had ever landed — one had, 9c0be4a, on the day the number moved. The same paragraph called 125 tokens per pattern a rate; the trigger sections measured since cost 61, 179 and 201, so it is an average nobody pays. Two more were off by a single token, because make tokens divides the whole path's bytes once while per-file deltas each round down. Every one came from carrying a number over from a draft instead of re-deriving it — the failure Waived budgets already names.

A judgement the record demanded is made out loud, and it is not a comfortable one. A third path this entry missed recorded that SKILL.md and VERSIONS.md sit inside both the floor and the change path with no per-document budget over either. This release grew SKILL.md by 116, the second such edit, and 380 in total since the raise — nearly half the 763 tokens it bought, in the one place no budget looks. Only 179 of it was ever a new pattern. The change path now stands at 7,939 of 8,000: 61 tokens, less than any trigger section ever measured. What would make these numbers wrong names the branch — trim, do not raise — and which trim, or the shape budget instead, is a decision that comes before the next pattern rather than with it.

One defect was found and deliberately not fixed. "Nothing else qualifies" could be read as scoping out Waivers and conflicts, which separately tells an agent an unresolvable rule collision is a defect in the baseline. The two have different mechanisms and different timing, and the clause that would join them costs about 15 of the last 61 tokens on the most-paid path. Spending the end of a budget to pre-empt a misreading, in the release that says the budget is spent, is the wrong trade. It is written down instead.

Gate closed before the tag. Reference 6239e4e tagged v4.1.0, pinning 99a94e0; GOTOOLCHAIN=go1.26.7 ./verify.sh exit 0 over 76 gates, and make ci green on that commit. SPEC.md was the only file that moved there, and that is the finding: both rules govern what an agent reports and what a maintainer does on the 90-day cycle, so neither is a property a repository can gate. A rules change the reference cannot gate is exactly the kind that gets tagged on a reading, so it was run rather than reasoned about.