Skip to content

tooling(pm): re-count the ADR-0087 manifests deferral to six rows across two source files - #15164

Merged
os-steve merged 1 commit into
mainfrom
claude/issue-15128-adr0087-deferral-count
Sep 4, 2026
Merged

tooling(pm): re-count the ADR-0087 manifests deferral to six rows across two source files#15164
os-steve merged 1 commit into
mainfrom
claude/issue-15128-adr0087-deferral-count

Conversation

@claude

@claude claude Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Fixes #15128

One clause of one why: in scripts/pm/bare-root-worklist.mjs moves: the recorded deferral on the scripts/check-adr-0087-registration.mjs PACKAGE_ROOTS packages row priced itself at a figure the tree stopped matching when the derivation grew a second key. The verdict, the spelling, the row key and both population figures (74 of 5275, 74 of 74) are untouched — the pins re-measure those.

1. The measurement

At the merge base 4283b72a1, counting rows of the recorded TRIAGE that carry a manifests spelling (packages manifests / apps manifests / examples manifests), grouped by gate SOURCE FILE:

TRIAGE rows total: 46  (lines 400..851)
manifests-spelling rows: 6 across 2 source file(s)
  scripts/check-adr-0087-registration.mjs  (3 rows)
    - scripts/check-adr-0087-registration.mjs PACKAGE_ROOTS packages  ->  spelling: packages manifests
    - scripts/check-adr-0087-registration.mjs PACKAGE_ROOTS apps      ->  spelling: apps manifests
    - scripts/check-adr-0087-registration.mjs PACKAGE_ROOTS examples  ->  spelling: examples manifests
  scripts/check-skill-compatibility-version.mjs  (3 rows)
    - scripts/check-skill-compatibility-version.mjs PACKAGE_ROOTS packages  ->  spelling: packages manifests
    - scripts/check-skill-compatibility-version.mjs PACKAGE_ROOTS apps      ->  spelling: apps manifests
    - scripts/check-skill-compatibility-version.mjs PACKAGE_ROOTS examples  ->  spelling: examples manifests

Six rows across two source files — the card's post-fold reading, confirmed by measurement rather than inherited. The row total, 46, agrees with the --self-test line's own "46 recorded verdict(s)", which is what makes the instrument checkable.

Why the recorded figure said nine across three

The same instrument run against the pre-fold tree (8f68e508^) reports 15 rows across 3 keys, and the three keys name what the old figure was really counting:

manifests-spelling rows: 15 across 3 source file(s)
  check:changeset-gate-self-tests                 (3 rows)
  check:skill-compatibility                       (3 rows)
  scripts/check-adr-0087-registration.mjs         (9 rows)   [the --self-test and two --base invocation twins]

So the 2026-08-26 figure counted CI invocation names, three of them at three roots each. package.json:121 settles that it never was a third gate:

"check:changeset-gate-self-tests": "node scripts/check-empty-changeset.mjs --self-test && node scripts/check-adr-0087-registration.mjs --self-test && node scripts/check-changeset-no-major.mjs --self-test",

check:changeset-gate-self-tests runs this very script. PR #15127 keyed the table on the gate source file and folded the invocation twins away, which is what made the two visibly one.

2. The clause

Before (verbatim, the quoted target of the card):

      + 'spelling is live and reaches 74 of 74, 100% precise and complete. Deferred: nine rows '
      + 'across three gates share this one population shape and no consumer has asked for any of '
      + 'them, so declaring here is a nine-edit expansion ahead of demand',

After:

      + 'spelling is live and reaches 74 of 74, 100% precise and complete. Deferred: six rows '
      + 'across two source files share this one population shape and no consumer has asked for '
      + 'any of them, so declaring here is a six-edit expansion ahead of demand — RE-COUNTED '
      + '2026-09-04. The "nine rows across three gates" this replaces counted CI invocation '
      + 'names, not source files: check:changeset-gate-self-tests runs THIS script --self-test, '
      + 'so it never was a third gate, and #15127 keying this table on the gate source file is '
      + 'what made that visible: the six are three roots each under this gate and its '
      + 'check-skill-compatibility-version.mjs sibling',

The deferral itself is not re-decided: the sense is preserved (N rows across M source files share the population shape, no consumer has asked, so declaring here is an N-edit expansion ahead of demand), now dated and with the provenance of the superseded figure recorded so the next reader does not re-inflate it. Continuation lines stay inside the neighbouring rows' width convention (56–97 columns; neighbours run 95–102).

3. Self-test identical before and after

node scripts/pm/bare-root-worklist.mjs --self-test, exit 0 at both ends, and the two captured outputs are byte-identical (md5 94ed35d51da9eb1ed13ba126439e7f10 for each; cmp -s reports no difference):

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 the tracked corpus in hintCovers' own terms. The recogniser is proven to speak and to discriminate (a separator-carrying and a dotted root are both refused as already visible), the constant-name restriction is proven to restrict, and neither the triage keys nor this file declare any population of their own. 14 CENSUS row(s) (#14695) are well-formed, disjoint from TRIAGE, contribute no hint of their own, and share one base commit.

The row count, the verdict count and the fold figures do not move, as the card required — only prose inside one why: does.

4. Gates

All runs below are on the pushed head 637ef250 (git rev-parse --short HEAD from the verification run; no commit landed after it). Every exit code was captured before any pipe; each line is the gate's own verdict.

The family was re-derived from the worktree after the commit with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands (no paths passed). Its provenance line reads gate list derived from the tree of 'objectstack-ai/objectstack' at commit 637ef250, change set 1 path(s) vs merge base 4283b72a1. The derived list is identical to the dispatch list — 20 commands, nothing added, nothing dropped.

gate exit verdict line
node scripts/check-ci-filter-parity.mjs 0 OK: all 143 declared cross-package glob(s) (99 unique) are covered by core or crosspkg, every crosspkg entry still covers one, and the test job's if: still names both filters.
node scripts/check-closing-keyword-parity.mjs 0 check-closing-keyword-parity: OK (3 parsers agree on all 9 keywords and both measured separators; sweep found 5 file(s) carrying the grammar across 8245 tracked file(s), all registered).
node scripts/check-closing-keyword-parity.mjs --self-test 0 ✓ check-closing-keyword-parity --self-test: 24 assertions, 5 mutations of the shipped parsers each driven to red.
node scripts/check-comment-mask-corpus.mjs 0 ✓ comment-mask corpus sweep [scripts/js-comment-mask.mjs]: 5858 files, 0 disagree, 0 unparseable, 53.0s (comparator self-test: 12 cases pass).
node scripts/check-self-test-wired.mjs 0 ✓ check-self-test-wired: every one of the 166 script(s) CI runs that ship a --self-test has that self-test run by CI.
node scripts/check-self-test-wired.mjs --self-test 0 check-self-test-wired --self-test: 4 live ledger row(s) verified, plus the comment mask, the right boundary, alias resolution and both audit directions — 7 declared batteries, 50 cases registered, every battery at or above its pinned floor.
node scripts/check-whole-set-label-write.mjs 0 ✓ check-whole-set-label-write: 0 violations — 258 file(s) over 3 root(s) · 11 raw mention(s) · 11 in comments/prose (cleared) · 0 in EXECUTABLE content (judged) · 160 uses: pin(s) over 18 distinct action(s) judged · 0 allowlist entr(ies)
node scripts/check-whole-set-label-write.mjs --self-test 0 ✓ check-whole-set-label-write --self-test: all cases pass (24 fixture trees + 5 refusals + 1 allowlist hatch)
node scripts/pm/bare-root-worklist.mjs --self-test 0 quoted in full in section 3
pnpm check:agent-test-spelling 0 ✓ check-agent-test-spelling: 0 violations — 438 file(s) · 5916 bare -- token(s) · 1406 launcher-rooted run(s) · 9 separator(s) JUDGED · 5 vitest-backed script name(s) derived from 81 manifest(s)
pnpm check:bash32-floor 0 census: 24 by .sh extension, 2 by shebang alone; 19 constructs checked, floor bash 3.2.
pnpm check:cli-command-ids 0 ✓ check-cli-command-ids: 324 command-id literal(s) across 114 file(s) outside packages/cli all resolve to a real command path (73 ids derived; 3 declared fixture exemptions, 0 baselined violation(s) listed above).
pnpm check:cross-package-test-inputs 0 OK: 26 package(s) read outside themselves, all declared, and turbo.json hashes every declared glob.
pnpm check:entry-guard 0 ✓ check:entry-guard: 207 scripts/ file(s) — every entry guard goes through invoked-as.mjs; 153 export bindings, 153 of them inert on import (0 known-unsafe, ⛔ SHRINK-ONLY).
pnpm check:nul-bytes 0 check-nul-bytes: OK (scanned 8238 text file(s) -- 8238 tracked, 0 untracked-not-ignored; skipped 7 binary; no raw ASCII control bytes).
pnpm check:parse-guard 0 ✓ check:parse-guard: 206 scripts/ file(s) — every TypeScript parse goes through ts-parse.mjs.
pnpm check:pm-dispatch-gates 0 ✓ dispatch-gates self-test: 1343 cases pass.
pnpm check:pnpm-filter-targets 0 ✓ check:pnpm-filter-targets: 142/181 --filter occurrence(s) across 33 file(s) resolve against 79 workspace package(s); 39 not judged (2 foreign, 17 interpolated, 20 path); 50 more in comments or step labels and 59 in this rule's own files, counted and not judged.
pnpm check:refd-timer-probe 0 OK check-refd-timer-probe: 5853 source file(s) swept; the process-global timer probe is read in packages/qa/refd-timer-testkit/src/index.ts and nowhere else.
pnpm check:watch-hint-literal 0 ✓ check-watch-hint-literal: 48 declaration(s) across 4 rostered name(s) -- ROOT_DIR_WATCH_HINTS 32, ROOT_FILE_WATCH_HINTS 9, ROOT_WATCH_HINTS 2, DECLARED_WATCH_HINTS 5 -- every one an array of quoted literals inside its own statement, every rostered name non-empty, and no unrostered spelling of the idiom in the tree.

Repo-wide ESLint

Run in full, not narrowed, through the shared verify lock:

os-verify-lock: ACQUIRED after 0s — running: pnpm lint
os-verify-lock: VERDICT command-exit 0 · held the lock 69s (1m09s) · waited 0s · ⚠ SHARED-BOX SECONDS

Roster gates run beyond the derived list

The derivation scores artifact-roster families silent for every card and warns that where the roster sits under a directory one of your paths is in, "the silence is not evidence in EITHER direction". My path is scripts/pm/, so those were run rather than read as cleared:

gate exit verdict line
pnpm check:pm-label-desc-cap 0 ✓ check:pm-label-desc-cap: 23 label descriptions in scripts/pm/ensure-pm-labels.sh, all ≤100 characters (longest: 100, repo:objectui).
pnpm check:pm-governed-prose 0 ✓ check-governed-prose: 2 instruction surface(s) name all 5 registered governed surfaces (docs/adr/** · .claude/** · skills/** · AGENTS.md · CLAUDE.md) and claim no others.
pnpm check:pm-skill-ratchet 0 ✓ check-skill-line-ratchet: declared cross-file moves: 1, total ceilings down 1 line.
node scripts/check-published-list-mirrors.mjs 0 OK: 1 published list mirror(s) match their constants line for line.
node scripts/check-published-list-mirrors.mjs --self-test 0 All 37 self-test cases passed.

5. Notes for review

  • No changeset. scripts/pm/** publishes nothing from any package, so skip-changeset is applied on this PR rather than a .changeset/*.md file being written.
  • File surface held. One file, one row's why:, 8 insertions and 3 deletions. scripts/pm/dispatch-gates.mjs is untouched — parallel flight [finding] dispatch-gates --ran has an explained bucket for CI-measured and pending families but not for the value-bearing class, so a recorded one reads as extra #15115 owns that file and the two diffs are disjoint.
  • Adjacent row left alone. scripts/check-i18n-coverage.mjs PACKAGES_DIR packages carries its own, unrelated "three gates reach this same population" sentence at line 745; it is about the shared findExtractConfigs walk, is not this card's clause, and was not touched.
  • Shallow checkout. This container's clone is shallow (git rev-parse --is-shallow-repository reports true). The pre-fold comparison reaches 8f68e508^, which is present, so the provenance above is read from real objects rather than inferred.
  • Control bytes. grep -naP over the edited file for the ASCII control range returns nothing, beyond check:nul-bytes being green.

Generated by Claude Code

…oss two source files

The `why:` on the `scripts/check-adr-0087-registration.mjs PACKAGE_ROOTS
packages` row priced its deferral at "nine rows across three gates". That
figure counted CI invocation names rather than gate source files, and the tree
has not matched it since the derivation grew a second key: #15127 keyed this
table on the gate source file and folded the invocation twins away.

Measured at the merge base, six rows in the recorded triage carry a manifests
spelling — three roots each under `scripts/check-adr-0087-registration.mjs` and
`scripts/check-skill-compatibility-version.mjs`. Two source files, not three
gates: `check:changeset-gate-self-tests` runs
`check-adr-0087-registration.mjs --self-test`, so it never was a third gate.

Only prose inside that one `why:` moves. The verdict, the spelling, the row key
and both population figures (74 of 5275, 74 of 74) are untouched — the pins
re-measure those — and `node scripts/pm/bare-root-worklist.mjs --self-test`
prints a byte-identical verdict line before and after the change.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
@claude claude Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 4, 2026
@github-actions github-actions Bot added the size/s label Sep 4, 2026
@os-steve
os-steve marked this pull request as ready for review September 4, 2026 04:57
@os-steve
os-steve enabled auto-merge September 4, 2026 04:57
@os-steve
os-steve added this pull request to the merge queue Sep 4, 2026
Merged via the queue into main with commit 3bd90d4 Sep 4, 2026
36 checks passed
@os-steve
os-steve deleted the claude/issue-15128-adr0087-deferral-count branch September 4, 2026 05:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

2 participants