Commit c6b37cd
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
- .changeset
- packages/lint/src
- scripts
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1195 | 1195 | | |
1196 | 1196 | | |
1197 | 1197 | | |
1198 | | - | |
| 1198 | + | |
1199 | 1199 | | |
1200 | 1200 | | |
1201 | 1201 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
287 | 287 | | |
288 | 288 | | |
289 | 289 | | |
290 | | - | |
291 | 290 | | |
292 | 291 | | |
293 | 292 | | |
| |||
0 commit comments