Uh oh!
There was an error while loading. Please reload this page.
docs(tests): correct four stale claims about what check:cross-package-test-inputs recognises - #10561
Conversation
…-test-inputs recognises The gate resolves four directory-naming seed spellings plus the walked-file form, not "exactly two". `import.meta.dirname` and `dirname(import.meta.filename)` arrived with #9763 and the walked `import.meta.url` seed with #8995; both extensions updated RECOGNISED_PATH_SPELLINGS, which the gate prints, and neither swept for the count restated in prose elsewhere. Corrected, pointing at RECOGNISED_PATH_SPELLINGS as the single source instead of restating a number that drifts: - managed-extension-fields.test.ts: the seed count, plus two more stale claims measured on this tree — it is no longer the ONLY escaping read the gate sees in plugin-auth (#10161 made rate-limit-storage-isolation.test.ts visible), and that file no longer walks up from process.cwd(). The note also promised a stale-declaration failure that no longer fires: reseeding this file from process.cwd() now leaves the gate GREEN, with packages/**/*.object.ts declared and held by nothing. - managed-api-method-affordance-sweep.test.ts: the same seed count. Its stale-declaration consequence IS still real and is now cited from the measurement (that file is platform-objects' only escaping test; the ablation exits 1 naming the package). - check-type-check-coverage.mjs: the same claim in a TEST_DEBT note, the worst-placed instance since an author reads it while choosing a seed. - serve-multi-node-cap-advisory.pin.test.ts (not named in the card): stale in the opposite direction — it claimed the gate cannot follow a new URL() seed or a resolve() nested into the read. It follows both. The instruction to keep the whole path in one literal stands, for the reason that is actually true: only the flat literal collector needs that spelling. Comments and one note string only — no test code, no type surface. The gate's own repoRelativeLiterals roster for all three test files is unchanged from origin/main, so no declaration and no turbo.json input moves. Part of #10163 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DdCnBGcHeufjrq7drTD3wt
📓 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. |
os-zhuang
commented
Aug 21, 2026
PM review — ⭐ accepted. The card under-counted in both directions, and the two ablations disagreeing is the finding.⭐ You established what the gate does before touching what anyone says about itFrom its source ( ⭐ The census went past the card in two directions at onceThe card said three files with one stale claim each. Measured: four files, and one of the three carried three stale claims. ⭐ And the fourth — not in the card — is stale in the OPPOSITE direction. ⭐⭐ The two ablations disagreeing is the part I would have gotten wrongSame mutation (seed →
⇒ The prose was wrong in one place and right in the other, and only ablating each site separately could tell them apart. A single ablation would have produced a confident, half-wrong rewrite. ⭐ Citing the measurement in the corrected note rather than re-asserting the claim is what stops the next reader inheriting it. What else I checked
⭐ #10565 is the root, and you found it by looking upstream
⇒ The three files did not drift independently; they were copied from a comment that was already wrong. ⛔ Correctly not touched — CI still finishing on this PR; flipping ready and arming once green. Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Fixes: #10163
Four files told authors something false about
check:cross-package-test-inputs. The cardcounted three; the sweep found a fourth, plus two further stale claims inside one of the
three. Every correction below is measured against the detector on
ceb33a9f12, neveragainst the card.
What the gate actually does today
Measured three ways — its source (
pathExpression()/RECOGNISED_PATH_SPELLINGS), its--self-test(60 cases, all green), and a probe calling its exportedescapingBindings()with negative controls:
dirname(fileURLToPath(import.meta.url))(and thepath./url.prefixed forms)__dirnameimport.meta.dirnamedirname(import.meta.filename)import.meta.url/import.meta.filename, walked athereDepth + 1new URL('<rel>', import.meta.url), bare or underfileURLToPathprocess.cwd(), a template-literal path, a bare relative literalFour directory-naming seeds, not two —
import.meta.dirnameanddirname(import.meta.filename)arrived with #9763, the walked-file spelling with #8995,and neither extension swept for the count restated in prose elsewhere.
Per the card's own conclusion and triage's direction A, the corrections name no count.
They point at
RECOGNISED_PATH_SPELLINGS— the list the gate prints verbatim in itsfailure text and AGENTS.md mirrors — because that list cannot go stale silently while a
number copied into a comment can.
The census, with a numerator
22 files name the gate (
cross-package-test-inputs/CROSS_PACKAGE_TEST_INPUTS,tracked files,
dist/node_modulesexcluded). Positive control: that expression finds allthree files the card named. Every one was read; 4 carried a stale behavioural claim, and
one of those carried three.
Also checked and accurate today, so deliberately untouched:
AGENTS.md(its mirroralready lists every spelling),
rate-limit-storage-isolation.test.ts(process.cwd()isgenuinely unresolved — negative control above; and #10029 owns that file),
protocol.read-verb-canonical-fold.test.ts,spec-subpath-alias-coverage.pin.test.ts,validate-page-field-bindings.ts,stdio-data-bridge.exposure.test.ts,authz-conformance.test.ts,check-examples-live-imports.mjs,check-error-status-conformance.mjs,check-ratchet-remedy-authority.mjs,partition-test-shards.mjs,sync-template-versions.mjs,dispatch-gates.mjs, plusci.yml,lint.yml,package.jsonandturbo.json.The corrected claims
1.
packages/plugins/plugin-auth/src/managed-extension-fields.test.ts— three stale claims__dirnameis one of the spellings it resolves,and the set is
RECOGNISED_PATH_SPELLINGS, widened twice since the note was written.--list-escapesnames two files for plugin-auth today. What stays true is narrower and iswhat the note now says: this file is the only escaping read in the package that reaches an
object file anywhere in the tree, so it alone holds the
packages/**object glob(
rate-limit-storage-isolation.test.ts's roster is the two consumer directories).findUpwalk fromprocess.cwd()thatrate-limit-storage-isolation.test.tsandmember-role-canonical.test.tsuse" →rate-limit-storage-isolation.test.tsseeds from__dirnamesince fix(tests): make plugin-auth's rate-limit isolation radius visible to the gate and hashed by turbo #10161. Onlymember-role-canonical.test.tsstill walks.The consequence the note promised is also gone, and the note now says so. Ablation on
ceb33a9f12: reseed this file fromprocess.cwd()and the gate stays GREEN (exit 0) —--list-escapessimply drops the file whilepackages/**/*.object.tssits declared andheld by nothing. The old prose promised a stale-declaration failure; that fired only while
this was the package's sole escaping test.
2.
packages/platform-objects/src/managed-api-method-affordance-sweep.test.tsSame "exactly two seeds" sentence, corrected the same way. Its stale-declaration
consequence is still real and is now cited from a measurement rather than asserted:
the same ablation here exits 1 with "@objectstack/platform-objects declares a
cross-package input radius, but no test in it reads outside the package any more" — this
file is that package's only escaping test.
3.
scripts/check-type-check-coverage.mjs(TEST_DEBT note for@objectstack/plugin-auth)"is one of the two seeds check:cross-package-test-inputs recognises" → "is a seed
spelling check:cross-package-test-inputs resolves", pointing at the published list. This
is the worst-placed of the three: it is text an author reads while choosing a seed, and it
under-reported their options.
4.
packages/cli/src/commands/serve-multi-node-cap-advisory.pin.test.ts— not in the cardStale in the opposite direction, which is why nothing caught it: it claimed the gate
cannot follow "a
new URL('…', import.meta.url)seed, or aresolve()nested straightinto the
readFileSynccall". It follows both — both are onRECOGNISED_PATH_SPELLINGS,both are pinned by
--self-test, and both produce the escape flag in the probe.The file's instruction to keep the whole repo-relative path in one literal is still right,
for a different reason, and that reason is now what the note gives: the flat literal
collector sees a path only inside one quoted string starting at a top-level directory.
Measured — the current spelling is collected, the two ascent-relative alternatives are not,
so those reach the radius roster only through the resolver's reconstruction. The spellings
that genuinely produce no flag are named instead: a template-literal path, a
findUpwalkfrom
process.cwd(), segments arriving from a variable.Not done here, deliberately
scripts/check-cross-package-test-inputs.mjsis not touched (open PR docs(plugin-audit): document theos serveopt-in, and rule out a config-derived audit options helper #10450). Its ownheader comments say "the two seeds" four times (
:660,:673,:679,:695) — at:660and:679four directory seeds now sit below the phrase. That is where the copiesin the three files came from, and it needs a follow-up on that PR's file, not a rider here.
a declared glob can survive with nothing holding it once its package has a second escaping
test — the check-cross-package-test-inputs' literal collector cannot see split-segment or ascent-relative paths, so four declared radii are held by prose alone #9763 "prose was holding the radius" failure mode one level up. Reporting it,
not implementing it, since the change belongs in the file docs(plugin-audit): document the
os serveopt-in, and rule out a config-derived audit options helper #10450 already edits.findUpseed, socheck:cross-package-test-inputscannot see the radius and turbo does not hash it #10029 /rate-limit-storage-isolation.test.tsis untouched. Its claims measuredaccurate; the card is open and undispatched.
Verification
Comment-and-string only: no test code, no type surface, no runtime behaviour. The flat
literal collector's roster for all three edited test files is byte-identical to
origin/main(checked with the gate's own exportedrepoRelativeLiterals, added: none,dropped: none) — so no declaration and no
turbo.jsoninput moves.Gate union re-derived with
node scripts/pm/dispatch-gates.mjs(no path arguments) againstthe committed diff, then run on
c41a088b31— every verdict below is the line the gateitself printed, with each exit status captured before any pipe:
Two declared narrowings, so they are read as narrowings and not as coverage:
check:type-check-debt --re-measurewas not run. It needs the whole workspace closurebuilt, and another agent was already queued on the shared verification lock. It cannot move
here: stripping comments from the three edited
.tsfiles leaves them byte-identical toorigin/main, and the instrument was proved in both directions (injecting one realstatement into a control file flips it to CODE CHANGED, removing it flips it back). The
.mjsedit is onenote:string; noerrors:count is touched. CI runs it regardless.scripts/pm/check-half-states.mjs(full run) exits 3 — "PREREQUISITE NOT MET — the tokenin the environment is not a valid GitHub credential". A container limitation, not a verdict
on this diff; the
--self-testform thatlint.ymlinvokes ascheck:pm-half-statesisgreen above.
Generated by Claude Code
Generated by Claude Code