docs(devx): check-react-page-adapter-contract names its class by shape, not by the records spelling, and re-anchors its citation (#15599) - #15770
Conversation
…tions `check-react-page-adapter-contract`'s header keyed the union-normalizer class on the `records` spelling, which is the minority limb: the class is the SHAPE `Array.isArray(x) ? x : x.<limb>` on a `find()` result, and both `records` and `data` limbs are populous (some blocks carry both). Records that, with the counts re-measured on this base and the band across readings disclosed, so the numbers are not the next stale literal. Also repoints the two stale cross-file line citations in the same header to the repo's own anchor grammar: `packages/client/src/index.ts:310` (the declaration moved to `:392`, then `:390`, inside one day) becomes `packages/client/src/index.ts#PaginatedResult`, and `client-sdk.mdx:659` (the sample is at `:808`) becomes a file-level anchor. Header-only. No detector or population change: the gate's verdict and `--self-test` output are byte-identical before and after. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
The de-lining paragraph quoted `client-sdk.mdx`'s current line as evidence of drift, which would have made this edit add the very thing it removes: a live cross-file line number nothing derives. The historical numbers stay as a dated rot record and now say so. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
|
ACCEPT — PR #15770 (head Header-only, as ruled: the class is named by SHAPE with both limbs measured on the base (142 blocks: 71 Ruling on the open question: A — keep the symbol anchor Measured by this seat: non-comment diff 0 lines; plain output and Channel note recorded, not penalised: REST Flip + arm when both required jobs report success on Generated by Claude Code |
|
Flipped ready + auto-merge enabled (07:24Z, Generated by Claude Code |
Fixes #15599
Header-only edit on
scripts/check-react-page-adapter-contract.mjs. Nothing thisgate does changes: no detector, no population, no verdict. #15094 ruled the
population stays (option D), and that fence is honoured literally — the proof is
below.
1. The class is named by SHAPE, not by the
recordsspellingThe header's three worked instances are all spelled
.records, and the header(and the card family's titles) inherited that spelling as if it named the class.
It does not. The class is a union normalizer —
Array.isArray(x) ? x : x.LIMBapplied to afind()result — and the limb itreads is
recordsin some members anddatain others, with some memberscarrying both. A reader who greps
recordssees a fraction of the class andconcludes it is a fraction of its real size.
2. The counts, re-measured on the branch base — and why they are a BAND
Re-derived on
66e68adc6(this branch's base) from the #15094 census's prosedefinition of its detector C, over the roots the census names (
packages/**+examples/**, source extensions, excludingnode_modules/dist/.cache/.turbo/coverage/build/.next). The harness is a throwaway; it isNOT committed, exactly as the census's was not.
Method (the reading quoted in the header). On comment-, string-, template-
and regex-literal-masked source (offsets preserved), every
Array.isArray(EXPR)whose root identifier
IDis also read as.recordsor.data— through anoptional TS cast, never across a statement or block boundary — inside the
innermost brace-balanced enclosing block, or inside
EXPRitself.recordsdataFiles scanned: 5,694 — the same number the census reports, so the population
is the same population.
These differ from the card's numbers, and the PR carries mine. The census
(report
5547410463, atca46f8f12) read 104 blocks: 41records, 57data,6 both. Its harness was never committed, so the definition had to be re-derived
from prose — and four defensible readings of "the same brace-balanced enclosing
block" gave 69 / 116 / 142 / 164 blocks on ONE tree:
The 142 reading is the one quoted because it is the only one that reproduces
all four members the census names by path:
packages/verify/src/rls.ts,packages/rest/src/import-runner.ts,packages/cli/src/utils/secret-reference-union.ts, andpackages/plugins/plugin-auth/src/phone-sms-texts.ts. Its precision is not1.0 — spot-checking found at least one false positive
(
packages/objectql/src/engine.ts, whereArray.isArray(manifest.objectExtensions)shares a block with an unrelated
manifest.data), consistent with the census'sown measured 0.857 on the narrow route.
reader to re-derive rather than trust the literal — the census report's own
warning (⛔ "do not close a stale-citation card by adding two more" stale
literals). What every reading agrees on is the load-bearing half: both limbs
are populous, so the spelling cannot be the signal. Note the majority limb
flips between the narrowest reading and every wider one, which is itself the
argument for keying on shape.
3. The citation: de-lined to the repo's own anchor grammar
packages/client/src/index.ts:310→packages/client/src/index.ts#PaginatedResult.The card's triage recommended de-lining over repointing, and the rot record
justifies it: the citation read
:310when written, the #15094 census found thedeclaration at
:392, triage read:390the same day. On this basegrep -n 'PaginatedResult' packages/client/src/index.tsreports the declarationat
:390— a cross-file line citation that moved twice inside one day.Does a gate admit an anchor in a
scripts/header? No — checked, notassumed.
check-adr-symbol-anchors.mjsregisters exactly one corpus,defineCorpus({ id: 'adr', docRoots: [ADR_DIR], docPattern: /\.md$/ })withADR_DIR = 'docs/adr';grep -rn defineCorpus scripts/finds no otherregistration. So
scripts/**is outside every symbol-anchor corpus, and nothingresolves this anchor for you.
That is an argument about checking, not about spelling. The form used is the
repo's own authoritative grammar,
scripts/symbol-anchors.mjs#ANCHOR_GRAMMAR,whose last entry ends with this sentence, verbatim:
(that entry leads with a placeholder path —
DIR/FILE.ts:4901with theangle-bracket placeholders spelled as words here, since GitHub's body sanitizer
eats them; the same sentence appears again in that file's own prose header.)
A symbol name stays checkable by grep where a number does not, and the anchor is
forward-compatible the day a
scripts/**corpus is registered. The header statesall of this beside the citation, including that nothing resolves it today.
anchors in
scripts/" was the current line number with a fragility note. ThisPR de-lines instead, following the card's own alternative and triage's ⭐
recommendation, because a repointed number is the same defect with a fresher
value — triage's words: ⛔ "Repointing
:310→:390closes this card for abouta day." Say the word and I will carry the number instead.
A second stale citation in the same sentence, fixed in the same edit
Three lines below, the same bullet cited
content/docs/api/client-sdk.mdx:659for the
data?.records.map(...)sample. It is stale too:grep -n 'records.map' content/docs/api/client-sdk.mdxputs it at:808;:659is now inside an unrelatedVALIDATION_FAILEDerror-handling block. It isnow a file-level anchor,
content/docs/api/client-sdk.mdx, with the code textalready quoted beside it (which is what makes it greppable).
This is the bounded in-place exemption, declared rather than slipped in: same
defect class as the card's, mechanically correct form pinned by the repo's own
anchor grammar, same file, no other claim on it, and no new verification surface
— all four conditions hold, so it is named here with its evidence rather than
filed as a card nobody would dispatch.
4. Proof the gate is byte-identical (⛔ no detector or population change)
Captured before the edit and again after, exit codes taken before any pipe:
The two verdict lines, unchanged:
The diff is comments only. The dispatch's non-comment probe
prints nothing — 0 bytes.
5. Gates — all 29 derived commands run at HEAD
0b6f4bd1dDerived with
node scripts/pm/dispatch-gates.mjs --changed --commands --repo objectstack-ai/objectstack(exit 0; the tool took the change set from git itself, 1 path). Every command
run, exit code captured before any pipe:
node packages/lint/scripts/check-reference-carrier-shape.mjsnode packages/lint/scripts/check-reference-carrier-shape.mjs --self-testnode scripts/check-ci-filter-parity.mjsnode scripts/check-closing-keyword-parity.mjsnode scripts/check-closing-keyword-parity.mjs --self-testnode scripts/check-comment-mask-corpus.mjsnode scripts/check-declaration-mirrors.mjsnode scripts/check-declaration-mirrors.mjs --self-testnode scripts/check-self-test-wired.mjsnode scripts/check-self-test-wired.mjs --self-testnode scripts/check-self-test-workflow-commands.mjsnode scripts/check-self-test-workflow-commands.mjs --self-testnode scripts/check-whole-set-label-write.mjsnode scripts/check-whole-set-label-write.mjs --self-testnode scripts/pm/bare-root-worklist.mjs --self-testpnpm check:agent-test-spellingpnpm check:bash32-floorpnpm check:cli-command-idspnpm check:cross-package-test-inputspnpm check:driver-memory-censuspnpm check:entry-guardpnpm check:nul-bytespnpm check:parse-guardpnpm check:pm-dispatch-gatespnpm check:pnpm-filter-targetspnpm check:ratchet-remedy-authoritypnpm check:react-page-adapter-contractpnpm check:refd-timer-probepnpm check:watch-hint-literalnode scripts/pm/check-governed-merges.mjs --test scripts/check-react-page-adapter-contract.mjs,run on the final file list, exit 0:
⊘ NOT MEASURED, by name
22 of 29 exit 0. The other 7 never entered a gate body: six exit 3 with
their own words,
PREREQUISITE NOT MET, and one exits 1 onERR_MODULE_NOT_FOUNDat import time. This worktree has nonode_modules, sothese are neither failures nor clearances — CI measures them:
node packages/lint/scripts/check-reference-carrier-shape.mjs— ⊘ NOT MEASURED: PREREQUISITE NOT MET — the dependencytypescriptis not installednode packages/lint/scripts/check-reference-carrier-shape.mjs --self-test— ⊘ NOT MEASURED: PREREQUISITE NOT MET — the dependencytypescriptis not installednode scripts/check-ci-filter-parity.mjs— ⊘ NOT MEASURED: PREREQUISITE NOT MET — the dependencyyamlis not installednode scripts/check-closing-keyword-parity.mjs— ⊘ NOT MEASURED: PREREQUISITE NOT MET — the dependencyyamlis not installednode scripts/check-closing-keyword-parity.mjs --self-test— ⊘ NOT MEASURED: PREREQUISITE NOT MET — the dependencyyamlis not installednode scripts/check-comment-mask-corpus.mjs— ⊘ NOT MEASURED: ERR_MODULE_NOT_FOUND —@typescript-eslint/parser(never entered the gate body)pnpm check:driver-memory-census— ⊘ NOT MEASURED: PREREQUISITE NOT MET — the dependencytypescriptis not installedPlus the three families
dispatch-gatesitself reports as taking a value fromthe workflow (no value outside a CI run):
check-cross-package-test-inputs.mjs --union-into "$RUNNER_TEMP/…",check-shard-attestation.mjs --sharda matrix variable, andcheck-test-completeness.mjs "$RUNNER_TEMP/test-core.log".6. Filed, not fixed here
#15765 — no symbol-anchor corpus covers
scripts/**, so the 27 cross-filepath:NNNcitations across 14scripts/**/*.mjsfiles rot unchecked. Thiscard's two are the worked example; the general repair is a
defineCorpuscallplus a migration, and it needs a measurement this card does not owe (whether the
extractor reads
//comment blocks cleanly). Filed bare withfinding,no assignee.
7. Changeset
skip-changeset. AGENTS.md, Post-Task Checklist §3: ⛔ "neverskip-changeset:that label is for a diff that publishes nothing from any released package." This
diff is comment lines in one repo-root tooling script under
scripts/, which nopackage publishes.
8. Channel switch, declared
REST writes are unavailable in this seat.
POST /repos/objectstack-ai/objectstack/issueswas refused before it left the box (tool-policy denial, not a GitHub status), while
repo-scoped REST reads answer 200 all session and
git pushworks. The GitHubsearch endpoint answers 403 with its own words:
This GitHub API path is not available: sessions are bound to their configured repositories.So this PR, thereport comment and #15765 were written through MCP, and the one dedup search
before filing #15765 was a single targeted
search_issues. MCP call count forthe whole run is in the
os-dev-reportcomment on #15599.🤖 Generated with Claude Code
https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
Generated by Claude Code