Skip to content

tooling(pm): re-measure the ratchet-remedy-authority worklist row, and pin the declaration it describes - #15269

Merged
os-steve merged 1 commit into
mainfrom
claude/issue-15201-worklist-row-remedy-authority
Sep 4, 2026
Merged

tooling(pm): re-measure the ratchet-remedy-authority worklist row, and pin the declaration it describes#15269
os-steve merged 1 commit into
mainfrom
claude/issue-15201-worklist-row-remedy-authority

Conversation

@claude

@claude claude Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Fixes #15201

The bare-root worklist row scripts/check-ratchet-remedy-authority.mjs SCRIPTS_DIR scripts
described a walk narrower than the gate performs. PR #15199 widened that gate to read the
scripts root and its pm directory, one level each, and to declare three hints where
the row records two. The row went on stating "no nested script at any depth", its numbers
described the one-directory walk, and nothing reddened — because every pin in this file
asks the TREE, and the recorded two-hint spelling was still perfectly true of the tree.

This is the repair, and it is two things rather than one: the row re-measured, and the
direction that was missing pinned for every DECLARED-NARROWER record.

1. The row, re-measured — both terms on one tree

Measured at a23603ea (this branch's base), never one term refreshed apart from the other,
which the map's own docblock forbids by name:

term recorded before measured now
corpusFiles() admits 183 202 (188 top-level + 14 in pm)
tracked under the bare root 310 324
ratio 59% 62%
hints the gate declares 2 3
shape claim "no nested script at any depth" the pm scripts one level down ARE reached; no other nested directory is walked and no level below either walked one is descended

Corroborated independently by the gate's own verdict line, which counts the same walk:

OK  check-ratchet-remedy-authority: 202 scripts swept (scripts/*.{mjs,mts} + scripts/pm/*.{mjs,mts}); ...

The verdict is unchanged and no authorisation sentence is claimed: this is not a
re-decision on the shrink-only map. What moved is the gate; the record is what went stale.
The gate itself is not edited here — it is correct. Its own stale-corpus note is a
separate card, #15189, and is untouched.

2. The pin that would have SEEN this

SPELLINGS records were pinned LIVE, PRECISE and COMPLETE against the tracked corpus.
None of those three answers moves when a gate widens what it DECLARES, so the record could
drift with the whole battery green — which is exactly what happened.

--self-test now reads each DECLARED-NARROWER row's gate source through the watch-hint
idiom's own parser (auditSource from scripts/check-watch-hint-literal.mjs, so no roster of
declaration names is retyped here) and holds the recorded spelling SET-EQUAL to the array it
finds, at that row's own bare root:

  • recorded within declared — the record cannot claim a hint the gate never spelled.
  • declared within recorded — the record cannot pass over a hint the gate did spell,
    unless the row NAMES it in a new omits field, which is itself re-measured every run: an
    omission the gate stopped declaring reds as loudly as one it started.

Nine records are held that way. One row carries omits: build-skill-docs.ts SKILLS_DIR skills,
whose why already recorded in prose that skills/README.md sits outside any skill directory
and no single spelling of the idiom reaches both. Its verdict, spelling and numbers are
untouched — the field only restates that recorded fact where the pin can read it. omits is
held as SEGMENT ARRAYS for the same reason SPELLINGS is: spelled as a path literal it enters
this file's own hint set, and the self-test that forbids that caught this exact line during
development.

3. Sweep output, diffed against the base

node scripts/pm/bare-root-worklist.mjs on a23603ea against the same command on this branch:
134 lines each, exactly one line differs — the reason text of the row above. All 54
verdicts are identical:

(verdict column: no differences across all 54 rows)

The one changed line, wrapped here for reading:

- RE-DECIDED 2026-09-01 (#13813) from REFUSE-UNSPELLABLE, whose stated reason — "the idiom has 
-   no non-recursive spelling" — was TRUE when written and is FALSE of this tree. It rested on 
-   the deletion-collapse: a glob carrying a literal SUFFIX in the final segment was spliced WITHIN 
-   the segment, so the only non-recursive spelling reduced to a string no tree can hold and 
-   reached nothing. #13448 retired that collapse for exactly this shape — judgedAsPattern routes 
-   it to triggerCovers now — which is the same retired collapse the seventeen rows of 2026-08-26 
-   and the eighteenth of 2026-08-29 were re-decided under, one refinement finer, and this row is 
-   re-decided under that authorisation sentence and no wider one. Both terms re-measured together 
-   on this tree, never refreshed apart: the gate own corpusFiles() walk admits 183 files, against 
-   310 tracked under the bare root (59%). The gate now declares ONE hint per admitted extension 
-   beside SCRIPTS_DIR under the ROOT_DIR_WATCH_HINTS idiom, and the pair is SET-EQUAL to that walk 
-   in both directions — 183 of 183, nothing read left uncovered, nothing covered left unread — 
-   so 100% precise and complete. The coupling described above was, at the time this row was 
-   decided, held only in the gate's own --self-test (which pins the hints against SCRIPTS_DIR and 
-   CORPUS_EXTENSIONS and refuses both the subtree spelling and the brace form its own messages 
-   print), because SPELLINGS held ONE hint per entry and this population needs one per extension 
-   — the same shape as the check:logger-receiver-detach and check:dual-build-cjs-loads rows 
-   above, and the gap #14233 measured and closed: SPELLINGS now holds a LIST of segment arrays, so 
-   the pair is pinned HERE too, LIVE, PRECISE and COMPLETE (183 of 310 tracked files under the 
-   bare root, matching the gate own walk exactly, re-measured 2026-09-01) — the gate's own pin 
-   and this one now independently corroborate the same declaration rather than only one of them 
-   re-measuring it. The consumer is MEASURED, not argued: before this, the derivation placed this 
-   family in the residue undetermined bucket, absent from the matched list a brief prints, and a 
-   PR that ran its whole derived family green locally lost a CI round to this gate. The row STAYS 
-   in the sweep because the bare root is still not covered — no arbitrary file at the top of the 
-   root is reached, and no nested script at any depth — which is what this verdict says and is 
-   correct, not outstanding debt
+ RE-DECIDED 2026-09-01 (#13813) from REFUSE-UNSPELLABLE, whose stated reason — "the idiom has 
+   no non-recursive spelling" — was TRUE when written and is FALSE of this tree. It rested on 
+   the deletion-collapse: a glob carrying a literal SUFFIX in the final segment was spliced WITHIN 
+   the segment, so the only non-recursive spelling reduced to a string no tree can hold and 
+   reached nothing. #13448 retired that collapse for exactly this shape — judgedAsPattern routes 
+   it to triggerCovers now — which is the same retired collapse the seventeen rows of 2026-08-26 
+   and the eighteenth of 2026-08-29 were re-decided under, one refinement finer, and this row was 
+   re-decided under that authorisation sentence and no wider one. RE-MEASURED 2026-09-04 (#15201) 
+   at commit a23603ea — both terms together on one tree and never refreshed apart — because 
+   #15179 widened the WALK under the row: corpusFiles() reads the scripts root AND its pm 
+   directory, one level each, and admits 202 files (188 at the top level, 14 in pm) against 324 
+   tracked under the bare root, 62%. ⛔ The previous reading, 183 of 310, described the 
+   one-directory walk that preceded it and is superseded WHOLE — neither term is carried 
+   forward, which this docblock forbids by name. The gate declares ONE hint per (walked directory, 
+   extension) pair the walk admits, beside SCRIPTS_DIR under the ROOT_DIR_WATCH_HINTS idiom — 
+   three today, the pm mts pair deliberately absent because that directory holds no such file and 
+   a hint reaching nothing is a dead declaration — and the set is SET-EQUAL to that walk in both 
+   directions: 202 of 202, nothing read left uncovered, nothing covered left unread, so 100% 
+   precise and complete. SPELLINGS holds a LIST of segment arrays since #14233, so that set is 
+   pinned HERE too, LIVE, PRECISE and COMPLETE (202 of 324 tracked files under the bare root, 
+   matching the gate own walk exactly) — the same multi-hint shape as the 
+   check:logger-receiver-detach and check:dual-build-cjs-loads rows above. ⚠️ Those pins ask 
+   the TREE, and #15201 is the measurement that they are not sufficient alone: the walk widened, 
+   this row went on describing two hints, and every one of them stayed GREEN because the two-hint 
+   spelling was still true of the tree it was asked about. So the declaration is now pinned from 
+   both sides — the gate own --self-test derives its expected hints from corpusFiles() and holds 
+   its array to them (refusing the subtree spelling and the brace form its own messages print), 
+   while this file reads that same array out of the gate SOURCE and holds the recorded spelling 
+   set-equal to it, so the next widening of that walk reds in both places instead of neither. The 
+   consumer is MEASURED, not argued: before this, the derivation placed this family in the residue 
+   undetermined bucket, absent from the matched list a brief prints, and a PR that ran its whole 
+   derived family green locally lost a CI round to this gate. The row STAYS in the sweep because 
+   the bare root is still not covered — no arbitrary file at the top of the root is reached, no 
+   nested directory other than pm is walked, and no level below either walked directory is 
+   descended — which is what this verdict says and is correct, not outstanding debt. ⚠️ The 
+   scripts one level down in pm ARE reached now: the flat "no nested script at any depth" this row 
+   carried until 2026-09-04 was true of the walk it was written about and false of this one

4. Verification

Self-test verdict line, before (at a23603ea, with the stale row and the widened gate —
this is the drift going undetected):

OK  self-test: 54 live row(s), 46 unreachable as spelled, 46 recorded verdict(s) — none stale, none missing, none contradicted. Each row is one literal in one gate source file: 69 invocation(s) of those literals fold onto them, 15 of them as twins of a row that already existed, and no folded row's invocations disagree about reachability. 20 record(s) carry a spelling and every one of 14 distinct

after (at 1fcb7501):

OK  self-test: 54 live row(s), 46 unreachable as spelled, 46 recorded verdict(s) — none stale, none missing, none contradicted. Each row is one literal in one gate source file: 69 invocation(s) of those literals fold onto them, 15 of them as twins of a row that already existed, and no folded row's invocations disagree about reachability. 20 record(s) carry a spelling and every one of 14 distinct spelling(s) is pinned LIVE, PRECISE and COMPLETE against th

Ablation, from the committed state, restore trap on absolute paths. Two legs, each
proving its mutation reached disk by anchor-line counts and by git hash-object against the
HEAD blob before the run was read. No dist leg: the subject is imported from source by
relative path, so nothing resolves through a package exports field.

  • Leg 1 — point the record back at the stale two-hint spelling. Anchor lines 1 to 0;
    worklist blob 5cace5ac becomes 056e2288. Self-test exits 1 with two failures: the
    tree-facing COMPLETE pin (misses the 14 pm files) and the new declaration pin.
  • Leg 2 — widen the gate's declared array by a fourth hint (scripts/pm/*.mts). Gate blob
    e08d59a6 becomes 356da72d. Self-test exits 1 with exactly one failure, the new pin:
    DRIFT: declared and not recorded [scripts/pm/*.mts], named as omitted [none]. Every
    tree-facing pin stays green, because that hint reaches no file — which is this card's whole
    mechanism, reproduced.
  • Restore after each leg: git checkout HEAD -- ... on absolute paths, both blobs
    byte-identical to their HEAD values again, git diff HEAD empty, and the post-restore
    self-test green.

Gates. The derived family for the changed path was re-derived on this branch rather than
taken from the brief (node scripts/pm/dispatch-gates.mjs --commands, change set read by the
tool itself): 21 commands, all exit 0, including pnpm check:ratchet-remedy-authority,
pnpm check:watch-hint-literal, pnpm check:pm-dispatch-gates and pnpm check:nul-bytes.
Reconciled with --ran: 21 derived famil(ies) accounted for — 21 run, 0 NOT-MEASURED.
Whole-repo pnpm lint through the shared verification lock:
VERDICT command-exit 0 · held the lock 80s · waited 72s. All of it on 1fcb7501, the final
commit of this branch. Also run, since they read this file or its new import edge:
check-comment-mask-adoption, check-undeclared-dep-imports, check-declaration-mirrors — all 0.

No changeset: nothing here is published from any package (scripts/pm/ tooling only), so the
PR carries skip-changeset.

🤖 Generated with Claude Code

Generated by Claude Code


Generated by Claude Code

…d pin the declaration it describes

The `check-ratchet-remedy-authority SCRIPTS_DIR scripts` row recorded a walk
narrower than the gate performs. When that gate's corpus walk widened to a
second directory, the row went on stating "no nested script at any depth",
its numbers described the one-directory walk, and its recorded spelling named
two of the three hints the gate declares.

Both terms are re-measured together on one tree (commit a23603e): 202 files
admitted (188 top-level, 14 under the pm directory) against 324 tracked under
the bare root, and the recorded spelling grows to the three hints the gate
spells, set-equal to that walk in both directions.

Nothing reddened for that drift, and the reason is now closed rather than
noted: every pin in this file asks the TREE, so a gate that WIDENS what it
DECLARES moves no answer any of them read. `--self-test` now reads each
DECLARED-NARROWER row's gate source through the watch-hint idiom's own parser
and holds the recorded spelling set-equal to the array it finds, at that row's
bare root, with a deliberate omission named in `omits` and re-measured every
run. Nine records are held that way.

No other row is re-decided: the full sweep output differs in exactly this
row's stated reason, and all 54 verdicts are unchanged.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/m skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants