Uh oh!
There was an error while loading. Please reload this page.
Ratchet AGENTS.md's published spellings list to the detector's constant - #11908
Ratchet AGENTS.md's published spellings list to the detector's constant#11908os-steve wants to merge 2 commits into
Conversation
…tant `scripts/check-cross-package-test-inputs.mjs` is a source scan: a path spelling it does not know produces no flag, so a test whose reads escape its package goes undeclared silently. That is why its recognised set is published in AGENTS.md rather than left in the implementation -- and nothing compared the two copies. The mirror drifted three times (#10163, #10854, and this one). Twice the stale line was the stated REASON FOR A PROHIBITION, so a rotting mirror does not merely misinform: it launders an obsolete rule into a live one. And one claim was already false BEFORE the PR that supposedly staled it, so a lag-only check would not have caught it either. Adds `scripts/check-published-list-mirrors.mjs`, which asserts line-for-line EQUALITY between a declared constant and the block a document publishes: - equality, not containment -- a comment-only drift is invisible to containment, and the comments are where the prohibitions live; - the block is located by heading + fence, never by line number (this card was filed against `AGENTS.md:96-106`; the block sat at `:92-104` three days later); - every unreadable state REFUSES: renamed heading, duplicate heading, re-tagged fence, unterminated fence, empty block, two candidate fences, and a constant that is missing, renamed, empty or not a string list; - it can only ever go RED. AGENTS.md is governed, human-merge-only, so the gate never repairs -- it prints the exact block to paste. Stated in its header. Repairs the published block in the same change: it was short by 13 of the constant's 24 lines, including the two `findUp` ANCHOR seeds PR #10852 added, and the lead-in prose named only two of the three seed kinds. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015ahemw8RcTgqtxrj15PEZx
Two standing rulings on AGENTS.md govern what a mirror may put there, and a byte-identical copy of the whole constant breaks one of them outright: - the shrink-only line ceiling (`check-skill-line-ratchet`), and - "operative text carries lessons self-contained ... numbers go" (maintainer ruling 2026-08-12, `check-skill-id-lint`). The constant is the text of a CLI failure box: spellings (code, each with the comment that annotates it) plus free-standing NOTE PARAGRAPHS set off by blank entries, two of which carry issue-ID citations. Publishing all 24 lines put those citations into the instruction surface and check:pm-skill-id-lint went red -- the gate meant to keep the document honest would have broken the document's own prose standard. So the mirror judges a projection with no judgement in it: an entry is PUBLISHED unless it is blank, or it is a comment line that no published entry directly precedes. A comment continuing a spelling travels with that spelling; a note paragraph standing alone stays in the failure box. Every spelling is code, so no spelling can hide from it. 24 entries project to 17 published lines, zero issue-ID citations, and the published block grows 11 -> 17: the two `findUp` anchor seeds, the ⛔ manifest prohibition that qualifies them, and the `-> repo root` annotation. A self-test case now pins the citation property against the live constant, so an issue number added to a spelling line goes red HERE, naming the ruling, instead of landing in AGENTS.md. check:pm-skill-id-lint: 22 file(s) clean. check:pm-skill-ratchet is red by 8 lines (969 vs 961) and needs a maintainer ruling -- see the PR body. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015ahemw8RcTgqtxrj15PEZx
os-steve
commented
Aug 25, 2026
ACCEPT on the implementation; the ceiling is escalated, not decided here. Verified against the branch and current What I confirmedGoverned discipline held. The CEILINGS map is untouched — structurally, not by assertion. The diff is 4 files ( "It can only ever go RED" — I checked this rather than taking it. A raw grep for Structural location, confirmed in code ( The drift premise re-measured on current
The detector moved by one while this sat in review, which sharpens the card rather than weakening it. The control makes the zero a reading. On your branch The zero-headroom measurement, re-derived independently. I did not re-run your greedy rewrap; I measured the raw line widths of the five paragraphs against the 90-column target: The projection is pinned against the live constant, not against a fixture (
|
Fixes#10855
⛔ GOVERNED SURFACE — draft only. This PR edits
AGENTS.md, which is human-merge-only(
scripts/pm/check-governed-merges.mjs). It stays a draft, it is never flipped ready,never armed for auto-merge, never queued. @os-zhuang merges it.
AGENTS.mdline ceiling. See "The ask" below.
check:pm-skill-ratchetis red until that is answered.What was wrong
scripts/check-cross-package-test-inputs.mjsis a source scan: a path spelling it doesnot know produces no flag, so a test whose reads escape its package goes undeclared
silently. That is why its recognised set is published in
AGENTS.mdrather than leftin the implementation — and nothing compared the two copies. Measured on
1a47a5368:findUpoccurrences in the detectorfindUpmentions inAGENTS.md__dirnameinAGENTS.md(a spelling that IS published)The control makes that zero a reading rather than a dead grep. The published block was
short by the two
findUpanchor seeds and the ⛔ prohibition that qualifies them.The card's line reference had already rotted: it names
AGENTS.md:96-106; the block satat
:92-104three days later. The gate therefore locates the block structurally — byits heading and fence — and never by line number.
The gate
scripts/check-published-list-mirrors.mjs, wired into lint.yml beside its closestsibling,
--self-testfirst (37 cases).is a spelling authors are told is recognised while the scanner is blind to it — the
original defect with a published byline, and the "wrong on arrival" case the card names.
Containment cannot see it, and cannot see a comment-only drift either.
The constant is the text of a CLI failure box: spellings (code, each with the comment
annotating it) plus free-standing NOTE PARAGRAPHS set off by blank entries. An entry is
PUBLISHED unless it is blank, or it is a comment line that no published entry directly
precedes. Every spelling is code, so no spelling can hide from it.
⭐ This is not a convenience. Publishing all 24 entries verbatim put the note paragraphs'
issue-ID citations into
AGENTS.mdandcheck:pm-skill-id-lintwent red — the gatemeant to keep the document honest would have broken the document's own prose standard
(maintainer ruling 2026-08-12). A self-test case now pins that property against the live
constant, so an issue number added to a spelling line goes red in this gate, naming the
ruling, instead of landing in the instruction surface.
fence, unterminated fence, empty block, two candidate fences, and — on the code side — a
constant that is missing, renamed, empty, or not a string list.
AGENTS.mdis governed, so the gate never repairs; itprints the exact block to paste. Stated in its own header, and in
AGENTS.mditself, sothe next reader does not discover it at review time.
Non-vacuity — 8 ablations, each proven on disk and restored under a trap
Every leg: mutate → prove it landed (sha change + anchor count) →
node --checkthemutant where it is JS → run the gate → restore → prove the sha is back. Run against the
final gate, not an earlier draft.
Two earlier legs were voided by their own proof step rather than reported: one whose
mutation did not land (sha unchanged) and one whose marker was a substring of the mutant.
Both were re-run with corrected anchors.
The ask — the
AGENTS.mdline ceiling, 961 → 969AGENTS.mdsits at its ceiling with zero headroom, so any honest correction of thismirror crosses it. This PR takes it to 969 (+8):
findUpanchor seeds (one broken across two lines)-> repo rootannotationPer the ratchet's own doctrine the cost should be paid in place. Measured, the way the
map's only previous raise was measured — greedy rewrap at 90 columns, per paragraph, over
the whole section:
So it cannot be paid in place without deleting content. The CEILINGS map records that
raising needs a maintainer ruling quoted in the raising PR; its one previous raise
(958 → 961) is recorded that way. ⛔ I have no such ruling and have not touched the map.
Options, for @os-zhuang to pick:
raise is. Rationale: the mirror is now mechanically enforced, so this is a one-time
truthful re-sync of a copy that had drifted three times, not the start of a trend — the
gate makes every later line cost visible at the moment it is incurred.
it as a CI red instead of reading about it in the file.
means deleting content, and the surrounding prose is load-bearing.
retires the drift class outright).
publishing — an agent reading
AGENTS.mdwould have to run a tool to learn thespellings — so I do not recommend it without a deliberate reversal of that sentence.
The one-line follow-up once a ruling exists:
['AGENTS.md', 961]→['AGENTS.md', 969]in
scripts/pm/check-skill-line-ratchet.mjs, with the ruling quoted verbatim beside it.Verification
22312aa9e. 27 of 29 derived gate families green, derived withnode scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack(never a hand-builtpath list).
pnpm lint— the whole repo,eslint . --no-inline-config— green in 51s.Two reds, both named:
check:pm-skill-ratchet— the ceiling above. This is the ask, not an oversight.check:type-check-debt— environmental, not from this diff: it refuses to--re-measurewithout the workspace build closure on disk ("56 workspace dependenc(ies) ... have no
built type entry point"), which lint.yml builds before that step. This diff contains no
TypeScript at all.
check:pm-skill-id-lint: 22 file(s) clean.check:cross-package-test-inputs: 109self-test cases, 16 packages read outside themselves, all declared.
Co-tenancy
PR #11829 also edits
AGENTS.mdand is also a governed draft in the same reviewer'squeue. Regions are disjoint — theirs is a single line at
:191, mine is the section at:78-135— so both can land in either order. If this branch goes dirty I will mergeorigin/mainin and keep both edits; ⛔ never a rebase or a force-push on a governed file.No changeset: this diff publishes nothing (scripts, workflow, and the instruction file).
Generated by Claude Code
Generated by Claude Code