fix(devx): classify the tree-measurement claims under scripts/ instead of sweeping them - #19220
Merged
os-try-charles merged 1 commit intoSep 20, 2026
Conversation
…d of sweeping them Three kinds of sentence live under one phrase and take different repairs: a citation of a past measurement (anchored, stays true), a claim whose failure direction is named (loud when it moves), and a bare magnitude in the present tense (decays in silence). Only the third is a defect. Adds scripts/pm/measurement-claim-triage.mjs: it re-derives the population rather than recording its size, applies T1-T3 mechanically, records the T4 judgement (level or relation) per site, and carries controls in BOTH directions. Repairs the five sites judged kind 3 -- one by pointing at the gate that prints the value, four by pinning the reading to the commit that recorded it and saying out loud that the figure is deliberately not refreshed. Co-Authored-By: Claude <noreply@anthropic.com>
Contributor
📓 Docs Drift CheckNothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs. What this run could not see
Coarse fallback — 0 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
This was referenced Sep 20, 2026
os-try-charles
marked this pull request as ready for review
September 20, 2026 01:05
os-try-charles
deleted the
claude/issue-17797-measured-on-this-tree-classifier
branch
September 20, 2026 01:34
This was referenced Sep 20, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #17797
The deliverable is a classifier, not a sweep. Three kinds of sentence live under one
phrase and take different repairs, and only one of them is a defect.
⭐ The card's own headline number had decayed — which is the card's best self-evidence
The card states that
scripts/pm/dispatch-gates.mjs"alone carries 40 sentencescontaining
measured on this tree". Re-measured at0046a41b4, 2026-09-20T00:30Z, withthe card's own case-sensitive probe: 14, of which 3 carry a revision by the card's
own rev probe. A card about bare magnitudes decaying in silence had its own bare magnitude
decay by 65% before anyone read it. ⛔ The
40is not carried anywhere in this PR.1. The declared population — which files, which phrase forms
All readings below are mine, taken at⚠️ Every one of them decays; the tool added here re-derives them.
0046a41b4(this branch's merge base),2026-09-20T00:30Z.
measured on this tree, case-sensitive, overscripts/measured on this tree,re-measured on this tree,measured against this treein its own words and this PR does not contradict it.
Three findings about the population itself, each of which says a phrase probe is not a
population:
that carry the phrase in some spelling. The gap is not rounding.
line break in five files, so no
grepof it lists them at all:scripts/check-examples-live-imports.mjs,scripts/check-parse-guard.mjs,scripts/check-self-test-wired.mjs,scripts/eslint-fatal-guard.mjs,scripts/i18n-bundle-surface.mjs. The tool reads sentences, so it holds them.size in the present tense. A population defined by the phrase would have reported the
tree clean at the one site everybody already agreed was broken — so the population is
declared in two forms, FORM A (the phrase) and FORM B (declared sites the phrase cannot
reach, currently the hand-written-corpus size in
scripts/docs-audit/README.md).2. The classifier
scripts/pm/measurement-claim-triage.mjs:It records no number about its own population — the scope line it prints is the number,
re-derived on the tree it runs against. That is the durable half of the fix: the reason the
card's
40went stale is that it was written down instead of re-derivable.Four tests, applied in that order. Each can only move a hit out of the residue, and each
prints the cue that moved it, so every verdict is auditable against the sentence.
condition? (
before this gate was written,at the commit that took it,an earlier revision,with the reservation removed,was auditing) ⇒ KIND 1.⛔ A bare card number is deliberately not an anchor:
#NNNNoccurs in every kind ofsentence here, and admitting it would clear the residue by matching everything.
(a zero whose falsifier is spelled out is the commonest), a pointer at the instrument that
reprints the value, or a live assertion that reds on drift. ⇒ KIND 2.
because kind 2 is defined on one.
is the error the card exists to prevent.
T4 — level or relation — is a judgement and no regex decides it. Does a reader act on
the magnitude's level, or on a relation (a ratio, an ordering, an existence claim, a set
equality) that the level's drift survives? A level is kind 3; a relation is an
ILLUSTRATION, and rewriting it buys nothing. T4 is recorded per site in the tool's
TRIAGEtable with its reason, and a REVIEW hit with no row prints UNTRIAGED and reds the self-test.
⛔ Every
TRIAGErow is keyed by an excerpt, never by a line number — the card cited itsown known instance at
:493and it was at:555by the time anyone read it.The window, and a bug worth recording
The first build read a fixed ±6-line block and cleared the one site everybody had agreed
was broken: six lines above it an unrelated sentence cites a revision, and a block window
handed that anchor to a claim that has none. T2 and T3 now read the sentence; T1 also
sees the sentence before (a narrative frame leads), T3 also the sentence after (a named
failure direction trails — the card's own kind-2 exemplar spells the zero in one sentence
and names its falsifier in the next); ⛔ T2 sees neither. That control is pinned in the
self-test.
3. ⭐ Controls, both directions
node scripts/pm/measurement-claim-triage.mjs --self-test→ green, six controls:scripts/check-tier-file-adoption.mjs("Measured on this tree atd03c3c96d6…")KIND-1scripts/docs-audit/affected-docs.mjs("zero commands declarestatic topic…" + "The failure direction if that ever changes …")KIND-2scripts/check-skill-compatibility-version.mjs("the refusal is pinned in the self-test …")KIND-2scripts/docs-audit/README.md(pre-repair text)REVIEWscripts/docs-audit/README.md(post-repair text)KIND-2REVIEWEach control carries a liveness key that must still be present in the file it was quoted
from (and the pre-repair one carries an
absentkey instead — if that sentence comes back,so has the defect). ⛔ A control quoting a sentence the tree no longer holds passes in
silence, which is the failure this whole PR is about. The self-test also reds on a dead
cue: every cue must still match something in the population or the controls — nine that
matched nothing were deleted rather than left as decoration.
4. The kind-3 hits and their repairs
Five, judged out of a pre-repair review residue of 27. After the repairs the tool reports
87 claim(s) over 48 file(s) — KIND-1 35 · KIND-2 11 · NO-FIGURE 19 · REVIEW 22, and all 22survivors are recorded ILLUSTRATION. ⛔ No fresh bare number is written anywhere in this diff.
Repaired by pointing at the live instrument (#16200's preferred shape):
scripts/docs-audit/README.md— "the anchor derivation reads the same 178-page corpusthe old one did". Present tense, and wrong today:
pnpm check:docs-audit-scopeprinted195 hand-written doc(s)at 2026-09-20T00:11:30Z, my own reading. Repaired to name thecorpus without sizing it and to send the reader to that gate, and it says out loud that
the figure is deliberately absent.
Repaired by pinning the reading to the commit that recorded it — the historical figure
does work a live reading cannot (it justifies a decision taken at that moment) and no gate
reprints it. Each carries a deliberately-absent note, so the next author does not helpfully
restore a present-tense figure:
scripts/check-pnpm-filter-targets.mjs— thescripts/**declaration-honesty ratio, nowMeasured at 52a41b72e (2026-08-23). The counts move with every file added underscripts/; the SHARE is what the paragraph argues.scripts/check-published-files.mjs— the same shape over the whole publishable workspace,now
Measured at 52a41b72e (2026-08-23).scripts/check-skill-compatibility-version.mjs— the four precision ratios deciding whichroots are declared, now
measured at f29e89717 (2026-08-22), with a pointer toscripts/pm/bare-root-worklist.mjs, which carries this gate's package-root rows withtheir own dates.
scripts/check-slot-lookup-ratchet.mjs—46s, the worst-ageing kind of figure: awall-clock reading is a reading of one box as much as of one tree, so it decays without
the tree moving at all. Now
Measured at 46s when this was recorded (99ca6623f, 2026-08-19), with the order (seconds against a CI round) left as the load-bearing claim.Each repair's excerpt is recorded
REPAIREDinTRIAGE, and the self-test reds if itreturns to the population.
⛔ What the classifier deliberately did NOT touch
The 22 remaining REVIEW hits are recorded
ILLUSTRATIONwith a reason each. Two worth naming,because they are the shape a sweep would have destroyed:
scripts/docs-audit/README.mdlines carrying178in the historical narrative — the cardpredicted these were kind 1 and judging each one agrees. Two more, at the
--allbackstopand the cost note, already point at
check-audit-scope.mjsin the same sentence andclassify
KIND-2mechanically: already repaired in [finding] the docs-audit union-read prose hard-codes the anchor lag as "532 keys" in two places — measured 604 four days later #16200's shape, so ⛔ this PR leavesthem exactly as they are.
scripts/check-dispatcher-error-vocabulary.mjs's per-glob member counts: kind 2, notkind 3 — the docblock names what would falsify them and
PUBLISHED_SOURCE_FACE_FLOORplus the per-glob presence pin red in that direction.
⛔ Two files are outside the file surface, for two independent reasons
scripts/pm/dispatch-gates.mjsandscripts/pm/check-widening-tells.mjsare not editedhere, and both reasons are carried as data in the tool's
EXCLUDEDtable so every runprints them rather than leaving them in prose:
dispatch-gates.mjsis being edited by open PRs ci: publish the platform checklist status pages to the repository wiki on a schedule #19162 andrevert(spec): take back the declaration-text snapshot, restore the 27 signature hashes #19024;
check-widening-tells.mjsby fix(pm): check-widening-tells reads the member’s PRIOR schema — a bound inside a previously-z.unknown() bag is not a new key #19153 and revert(spec): take back the declaration-text snapshot, restore the 27 signature hashes #19024. Editing underneaththem is a conflict, not duplicated work.
scripts/pm/dispatch-gates.mjsis enormousand its
--self-testexceeds the agent container's foreground cap (recorded on [finding]dispatch-gates.mjs --self-testasserts an empty child stderr too, so it reds under--use-env-proxyexactly as #15234 did #17765),so the card required whoever took this to say how they verified a change to that file
or scope it out and say so. This is the saying-so.
⇒ The residue those two hold is un-swept, and the tool's scope line says so on every run
instead of reading as complete.
Also untouched, and reported rather than edited:
.claude/**,skills/**,docs/adr/**,AGENTS.md,CLAUDE.md(governed surfaces) and #16200's three carriers, settled by #17795.Verification
Derived with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackat
60f9b648a— 6 paths, 722 changed lines. 35 derived families, 35 run, all exit 0;reconciled with
--ran:35 derived famil(ies) accounted for — 35 run, 0 UNRUN.node scripts/pm/measurement-claim-triage.mjs --self-test→✓ controls hold in BOTH directions (6 controls, 27 recorded judgements).pnpm check:pm-dispatch-gates→✓ dispatch-gates self-test: 1866 cases pass,593.2s on this box,
VERDICT command-exit 0, run detached underscripts/pm/os-verify-lock.sh(held 594s, waited 0s), 2026-09-20T00:23:16Z–00:33:10Z.content/docs/qa/platform-readings.md:432records 430–450s; thiscontainer reads well above that band, and this run is one more point in it.
npx eslint --no-inline-config --format jsonover the five changed
.mjsfiles at60f9b648a→ 5 files linted, 0 errors, 0warnings (counts read from the JSON reporter). The narrowing excludes nothing:
eslint.config.mjsenables type-aware linting for no configuration in this repo (noparserOptions.project, no typed rules), so this diff cannot move the verdict on a fileit does not touch. The repo-wide
eslint .run is CI's.pnpm check:published-readme-exportsandpnpm check:dts-closureboth exited 3, PREREQUISITE NOT MET (46 packages'
dist/not built). Neither is inthe derived family; both are artifact-roster families whose roster sits under
scripts/,run here only because silence there is not evidence. This diff changes no package source,
so neither could be moved by it. ⛔ Recorded as not measured, not as a pass.
private: trueand no package'sfiles[]names the repo-rootscripts/tree, so nothing published moves. Labelledskip-changeset.Acceptance notes (out of scope, noted and not filed)
scripts/pm/dispatch-gates.mjsholds 42 of the 121 phrase occurrences (all spellings) andis un-swept here for the two reasons above. Carrier: the PR that next touches that file
— ci: publish the platform checklist status pages to the repository wiki on a schedule #19162 or revert(spec): take back the declaration-text snapshot, restore the 27 signature hashes #19024. Worth a card of its own once they land; the tool classifies it the
moment its
EXCLUDEDrow is removed.scripts/pm/check-widening-tells.mjsholds 5, same disposition. Carrier: fix(pm): check-widening-tells reads the member’s PRIOR schema — a bound inside a previously-z.unknown() bag is not a new key #19153 /revert(spec): take back the declaration-text snapshot, restore the 27 signature hashes #19024.
package.jsonscript and a workflow step both sit outsidethis card's file surface, so
--self-testis run by hand and its controls watch nothing ontheir own. The docblock says so out loud. ⛔ Do not read a green run here as CI coverage.
Carrier: none today — it needs a seat that owns the root manifest and the lint
workflow. Raised as an open question in the report rather than filed, because wiring it is
a decision about CI cost, not a defect.
Generated by Claude Code