fix(lint): the react-prop-deprecated warning states its reason in words, not a tracker number - #20641
Conversation
… not a tracker number The react-prop-deprecated finding message ended by citing a tracker number that no longer resolves. It now says what that decision was: the react tier converges on the metadata-tier vocabulary, so the deprecated spelling keeps working through the deprecation window and is removed after it. The tag, prop and replacedBy interpolations are unchanged, as are the rule id, severity and hint. The sibling-package prose-id baseline shrinks by exactly that one pinned site, regenerated with the gate's own --census-ledger. Claude-Session: https://claude.ai/code/session_014EJ1ED8X4MMrT18BhVx4tx Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift Check1 anchor(s) derived from 1 changed package(s); no hand-written page names any of them, so this run has nothing to list — not a clean bill of health. This check sees only pages that NAME a derived anchor: one that documents this change in prose, or enumerates it in an authoring dialect, names none and stays invisible to it on every run. What this run could not see
Coarse fallback — 4 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin ae7ef0e906bd74c4acd17d618d511739c2168921 && git checkout ae7ef0e906bd74c4acd17d618d511739c2168921
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin f1e921ab8ebfe061baec70b6113dee12b6360b4f 6c463cec86f9888920cc3341103add113c49b99c && git checkout -B drift-repro f1e921ab8ebfe061baec70b6113dee12b6360b4f && git merge --no-ff 6c463cec86f9888920cc3341103add113c49b99c
node scripts/docs-audit/affected-docs.mjs --json f1e921ab8ebfe061baec70b6113dee12b6360b4f |
Contract reviewServed-tier: Read for this record: the card's body and all 11 comments (the stage-2 landing record ① Derived judgmentsAccept set: nothing moves — right. The diff changes one template literal's tail inside the The words are true to the decision's surviving record — right. #11284 answers 404 (the dev's measurement, with #5583 as the 200 control; not re-probed here). The record that stands is the The prose-id ratchet moves in its allowed direction — right. The gate's header rules: growth (measured above pinned) reds; shrink (measured below pinned) reds as STALE with the remedy "regenerate the baseline in this same PR", and "shrink is the landing author's to take, growth is not". This diff is that remedy. Pins: none — confirmed by grep. At the head, Public surface. The rule is dormant today — true, from source. ② Semver level
③ Boundary flagsDev flags in
Check-runs on the head, read once (31): concluded success — Implemented-by: VERDICT: PASS Generated by Claude Code |
Fixes #20597
Clause-②: no
The last stage of #20597, and the card's only author-shown site: the
react-prop-deprecatedfinding message inpackages/lint/src/validate-react-page-props.ts. It ended by citing #11284, which answers 404. Ruling C+D (5749154545) takes author-shown text in form D: the lesson in words, with no number to look up.What changed
Three files, +15 / -2, against base
f29c83db13.packages/lint/src/validate-react-page-props.ts:1198: the message's tail changes. The tag, prop anddep.replacedByinterpolations are byte-identical, and so are the rule id, thewarningseverity and the hint (dep.note). In placeholder spelling (TAG, PROP and REPLACED_BY stand for the three interpolations):TAG prop "PROP" is the deprecated spelling of the metadata-tier "REPLACED_BY" and is removed after the deprecation window (#11284).TAG prop "PROP" is the deprecated spelling of the metadata-tier "REPLACED_BY": the react tier converges on the metadata-tier vocabulary, so this spelling keeps working through the deprecation window and is removed after it.scripts/doc-authoring-prose-id.baseline.json: the#11284pin for this file is removed (one line). The other pin for the same file (#5583) stays. The file was regenerated with the gate's ownnode scripts/check-doc-authoring.mjs --census-ledger, and its diff against the checked-in baseline is exactly that one line..changeset/20597-react-prop-deprecated-message-words.md: one@objectstack/lintpatch.Where the words come from. #11284 answers 404, so its decision was read from the record that survives. The
@objectstack/lintCHANGELOG entry for commit5383fa6records it (maintainer ruling 2026-08-23): the react tier converges on the metadata-tier spelling, deprecate-first. The deprecated spelling stays published and accepted for the whole deprecation window, every use warns, and removal comes after the window. The same deciding commit wrote this message line. TheREACT_PROP_DEPRECATEDdocblock and theReactInteractionProp.deprecateddocblock inpackages/spec/src/ui/react-blocks.tsstill state the same contract. The new sentence says that decision and adds nothing else.Verification record (head
6c463cec86)Premise.
GET /repos/objectstack-ai/objectstack/issues/11284answers 404. The controlissues/5583answers 200.The ratchet moves down by exactly this site.
pnpm check:doc-authoringexits 0. Its sibling-package leg reads 809 pinned sites across 230 files, one fewer than the 810 it read at stage 1 and stage 2. The file count holds, because this file keeps its#5583pin.STALE, listing exactly one pair,packages/lint/src/validate-react-page-props.ts #11284 (1 pinned, 0 measured). The restore was proven by blob equality with HEAD and an emptygit diff HEAD.scripts/ablation-replace.mjs: the old tail was put back over the new baseline (anchor x1 to x0, replacement x0 to x1). The mutated blobf5684f0774equals the base blob. The gate exits 1 withvalidate-react-page-props.ts #11284 (0 pinned, 1 measured)at:1198. The tool proved the restore (blob equals HEAD55de478256,git diff HEADempty).#11284.Pin sweep (whole repo, one round).
git grepfordeprecation window (#11284),removed after the deprecation windowanddeprecated spelling of the metadata-tierat the base finds only the source line itself, so the grep is not blind. At head the first two find nothing.REACT_PROP_DEPRECATED/react-prop-deprecatedappear in the source, the barrel (index.ts), two release-owned CHANGELOGs, andvalidate-react-page-props.test.ts. The test asserts the rule id only: thepastDeprecationfilter, andtoEqual([])at:116and:204. No test, snapshot, doc or skill asserts the message text, so there is no pin to flip, and none was added. Wording is not pinned unless a consumer parses it, and none does. The siblingobjectuicheckout (atb120b66) has 0 hits for the rule id, the fragment and the number.Build, tests, typecheck. All three ran under
scripts/pm/os-verify-lock.sh(slotissue-20597-s3), which printedVERDICT command-exit 0.turbo run build --concurrency=2 --filter=./packages/* --filter=./packages/*/*: 71 successful of 71.pnpm --filter @objectstack/lint exec vitest run --maxWorkers=2: Test Files 115 passed (115), Tests 5379 passed (5379).pnpm --filter @objectstack/lint typecheck: exit 0, andcheck:test-typecheckOK.warningmessage, and nothing parses it.Gates.
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commandsderived 62 commands. All 62 ran with exit 0, and--ranreconciles "62 derived, 62 run, 0 NOT-MEASURED, 0 UNRUN".check:docs-transcript-drift,check:dts-closure,check:dual-build-cjs-loads,check:lean-entry-closure,check:published-filesandcheck:sourcemap-no-sources-content.check:doc-authoringandcheck:issue-citationsare among the 62, and both exit 0 (check:issue-citationsreads "no issue citations added against f29c83d").check-changeset-fixed,check-published-list-mirrors(plus its--self-test),check-dts-references --self-test,check:authz-resolver,check:console-injection,check:engine-double-contract,check:error-code-casing,check:filter-alias-parity,check:i18n-stale-fillandcheck:published-readme-exports. The last one first exited 3 (prerequisite, before the build) and then 0 after the build.Lint, as a proven narrowing.
pnpm exec eslint --no-inline-config --format json packages/lint/src/validate-react-page-props.tsreports 1 file, 0 errors and 0 warnings.isPathIgnoredis false through eslint's API, and the resolved config has noparserOptions.projectorprojectService.eslint.config.mjs:327says type-aware linting is never enabled, so a string edit here cannot move any other file's verdict. The repo-widepnpm lintis CI's to run.Changeset.
files[]shipsdist. The new sentence is indist/index.js,index.cjs,runtime.jsandruntime.cjs, and the olddeprecation window (#11284)is in none of them. The positive controlLikely a typo of a contract prop. Fix it or remove it.is in all four. Hencepatch.Merge. A driver-free
merge-treeof6c463cec86ontoorigin/mainf1e921ab8e, run from a bare shared clone with nomerge.*config, exits 0. The four commitsmaingained since the base touch none of the three paths.No ablation of behaviour is owed, since no behaviour changes. The two gate-arm controls above are the one-time proof that this site is the gate's to see. No test file was left behind.
Acceptance notes
REACT_BLOCKScontract carries 0 props withdeprecated(4 blocks, 37 interactions). The only deprecated spellings there ever were, ListView'sobjectName/viewType, now sit inREACT_RETIRED_OVERLAY_PROPSand reportreact-prop-retired. Soreact-prop-deprecatedcannot fire until a new deprecation is declared. The mechanism is kept, and the new text states its contract. Carrier: none.validate-react-page-props.test.ts(about:32–:36) still says everyobjectNameListView fixture "carries exactly one deprecation warning". The assertions at:116and:204say zero. The claim puts test comments out of this card's scope, so it is untouched. Carrier: none (承接者:无).:458is the hint of theREACT_CHART_AGGREGATE_INVALIDwarning, and one sentence of it beginsobjectstack#5583 ruled that …. spec:ChartAggregateSchema与ChartGroupBySchemaobject 分支转 strictObject —— #5020 parse 接通后的收紧半边(#4001 后续批) #5583 is live (200), so it is not a dead citation and not on this card. It stays pinned in the prose-id baseline with the rest of the ledger's 809 adjudicated sites. Carrier: none.domain:specpackages (84 sites, 21 numbers, 23 files): the ruling C+D stage for this lane (from #20556) #20597's items are done: stage 1 (docs(lint): re-anchor the dead tracker citations in packages/lint/src to the commits that decided them #20612, 22 files), stage 2 (docs(lint): re-anchor the five dead tracker citations in authoring-rules.ts to the commits that decided them #20631,authoring-rules.ts) and this form-D string.Generated by Claude Code