Skip to content

Commit c6b37cd

Browse files
fix(lint): the react-prop-deprecated warning states its reason in words, not a tracker number (#20641)
Fixes #20597 Clause-②: no The last stage of #20597, and the card's only author-shown site: the `react-prop-deprecated` finding message in `packages/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 and `dep.replacedBy` interpolations are byte-identical, and so are the rule id, the `warning` severity and the hint (`dep.note`). In placeholder spelling (TAG, PROP and REPLACED_BY stand for the three interpolations): - before: `TAG prop "PROP" is the deprecated spelling of the metadata-tier "REPLACED_BY" and is removed after the deprecation window (#11284).` - after: `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 `#11284` pin for this file is removed (one line). The other pin for the same file (`#5583`) stays. The file was regenerated with the gate's own `node 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/lint` `patch`. **Where the words come from.** #11284 answers 404, so its decision was read from the record that survives. The `@objectstack/lint` CHANGELOG entry for commit `5383fa6` records 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. The `REACT_PROP_DEPRECATED` docblock and the `ReactInteractionProp.deprecated` docblock in `packages/spec/src/ui/react-blocks.ts` still state the same contract. The new sentence says that decision and adds nothing else. ## Verification record (head `6c463cec86`) **Premise.** `GET /repos//issues/11284` answers 404. The control `issues/5583` answers 200. **The ratchet moves down by exactly this site.** - `pnpm check:doc-authoring` exits 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 `#5583` pin. - Stale-arm control, working-tree only, restored after: the base baseline over the new message gives exit 1, `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 empty `git diff HEAD`. - Growth-arm control, through `scripts/ablation-replace.mjs`: the old tail was put back over the new baseline (anchor x1 to x0, replacement x0 to x1). The mutated blob `f5684f0774` equals the base blob. The gate exits 1 with `validate-react-page-props.ts #11284 (0 pinned, 1 measured)` at `:1198`. The tool proved the restore (blob equals HEAD `55de478256`, `git diff HEAD` empty). - No tracker number is added. The only number on a changed line is the removed `#11284`. **Pin sweep (whole repo, one round).** - `git grep` for `deprecation window (#11284)`, `removed after the deprecation window` and `deprecated spelling of the metadata-tier` at 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-deprecated` appear in the source, the barrel (`index.ts`), two release-owned CHANGELOGs, and `validate-react-page-props.test.ts`. The test asserts the rule id only: the `pastDeprecation` filter, and `toEqual([])` at `:116` and `: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 sibling `objectui` checkout (at `b120b66`) 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` (slot `issue-20597-s3`), which printed `VERDICT 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, and `check:test-typecheck` OK. - No consumer sweep is owed. No export, type or rule id moves. The only change is the text of one `warning` message, and nothing parses it. **Gates.** - `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands` derived 62 commands. All 62 ran with exit 0, and `--ran` reconciles "62 derived, 62 run, 0 NOT-MEASURED, 0 UNRUN". - The six build-reading gates ran after the build: `check:docs-transcript-drift`, `check:dts-closure`, `check:dual-build-cjs-loads`, `check:lean-entry-closure`, `check:published-files` and `check:sourcemap-no-sources-content`. - `check:doc-authoring` and `check:issue-citations` are among the 62, and both exit 0 (`check:issue-citations` reads "no issue citations added against f29c83d"). - These roster families keep their roster in a directory this diff touches, so they ran too, all exit 0: `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-fill` and `check: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.ts` reports 1 file, 0 errors and 0 warnings. `isPathIgnored` is false through eslint's API, and the resolved config has no `parserOptions.project` or `projectService`. `eslint.config.mjs:327` says type-aware linting is never enabled, so a string edit here cannot move any other file's verdict. The repo-wide `pnpm lint` is CI's to run. **Changeset.** `files[]` ships `dist`. The new sentence is in `dist/index.js`, `index.cjs`, `runtime.js` and `runtime.cjs`, and the old `deprecation window (#11284)` is in none of them. The positive control `Likely a typo of a contract prop. Fix it or remove it.` is in all four. Hence `patch`. **Merge.** A driver-free `merge-tree` of `6c463cec86` onto `origin/main` `f1e921ab8e`, run from a bare shared clone with no `merge.*` config, exits 0. The four commits `main` gained 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 - **The message is dormant today (noted, not filed).** The built `REACT_BLOCKS` contract carries 0 props with `deprecated` (4 blocks, 37 interactions). The only deprecated spellings there ever were, ListView's `objectName` / `viewType`, now sit in `REACT_RETIRED_OVERLAY_PROPS` and report `react-prop-retired`. So `react-prop-deprecated` cannot fire until a new deprecation is declared. The mechanism is kept, and the new text states its contract. Carrier: none. - **Stale test comment (noted, not filed).** The header comment of `validate-react-page-props.test.ts` (about `:32`–`:36`) still says every `objectName` ListView fixture "carries exactly one deprecation warning". The assertions at `:116` and `:204` say zero. The claim puts test comments out of this card's scope, so it is untouched. Carrier: none (承接者:无). - **The same file's other author-shown id (noted, not filed).** `:458` is the hint of the `REACT_CHART_AGGREGATE_INVALID` warning, and one sentence of it begins `objectstack#5583 ruled that …`. #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. - With this PR, all of #20597's items are done: stage 1 (#20612, 22 files), stage 2 (#20631, `authoring-rules.ts`) and this form-D string. --- _Generated by [Claude Code](https://claude.ai/code/session_014EJ1ED8X4MMrT18BhVx4tx)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent 0cb72cf commit c6b37cd

3 files changed

Lines changed: 15 additions & 2 deletions

File tree

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
---
2+
'@objectstack/lint': patch
3+
---
4+
5+
The `react-prop-deprecated` warning states its reason in words instead of citing a tracker number
6+
7+
The finding `validateReactPageProps` reports for a react-page prop written in a
8+
deprecated react-tier spelling used to end by pointing the author at an issue
9+
number that no longer resolves. It now says what that decision was, in the
10+
sentence being read: the react tier converges on the metadata-tier vocabulary,
11+
so the deprecated spelling keeps working through the deprecation window and is
12+
removed after it. The block tag, the prop and the canonical metadata-tier
13+
spelling it names are unchanged, and so are the rule id, the `warning`
14+
severity, the hint and every other finding.

‎packages/lint/src/validate-react-page-props.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1195,7 +1195,7 @@ export function validateReactPageProps(stack: AnyRec): ReactPropFinding[] {
11951195
severity: 'warning',
11961196
rule: REACT_PROP_DEPRECATED,
11971197
where, path,
1198-
message: `<${tag}> prop "${u}" is the deprecated spelling of the metadata-tier "${dep.replacedBy}" and is removed after the deprecation window (#11284).`,
1198+
message: `<${tag}> prop "${u}" is the deprecated spelling of the metadata-tier "${dep.replacedBy}": the react tier converges on the metadata-tier vocabulary, so this spelling keeps working through the deprecation window and is removed after it.`,
11991199
hint: dep.note,
12001200
});
12011201
}

‎scripts/doc-authoring-prose-id.baseline.json‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,6 @@
287287
"#7696": 1
288288
},
289289
"packages/lint/src/validate-react-page-props.ts": {
290-
"#11284": 1,
291290
"#5583": 1
292291
},
293292
"packages/lint/src/validate-readonly-flow-writes.ts": {

0 commit comments

Comments
 (0)