|
| 1 | +--- |
| 2 | +'@objectstack/spec': patch |
| 3 | +--- |
| 4 | + |
| 5 | +The `translation-validation-messages-removed` migration text names the object-scoped bundle key, not just the authored literal |
| 6 | + |
| 7 | +`validationMessages` was retired in 17.0.0 (#4667). The ADR-0087 conversion that |
| 8 | +migrates it told an author to author the message on the rule |
| 9 | +(`object.validations[].message`) and stopped there. Since 17.3.0 (#14381, |
| 10 | +#14253) that message has a translation route — |
| 11 | +`objects.<object_name>._validations.<rule_name>.message`, resolved on the write |
| 12 | +path — and the sibling prescription ten metres away in the same package |
| 13 | +(`TRANSLATION_KEY_GUIDANCE.validationMessages`, the text the strict door |
| 14 | +returns) already names it. |
| 15 | + |
| 16 | +⛔ Nothing the old text said was false, and none of it is deleted. The defect is |
| 17 | +**silence**: this is the *migration* text, read by exactly the population that |
| 18 | +authored the retired key — the authors who wanted their rule messages |
| 19 | +translated — and it steered them to a plain authored literal without mentioning |
| 20 | +that the bundle key now exists. The literal advice stays; the route is added |
| 21 | +after it. |
| 22 | + |
| 23 | +**Two texts in the file carried the narrow prescription, not one.** The |
| 24 | +conversion's `summary` is the one the card named; the docblock above it asserted |
| 25 | +that rule messages are *"not translated through a group"*, which would have sat |
| 26 | +directly above the corrected summary. Both are completed. The docblock keeps its |
| 27 | +17.0.0 sentence — still true of the retired key — and says what 17.3.0 changed, |
| 28 | +including why the object-scoped group is not `validationMessages` returning (the |
| 29 | +retired one was keyed by rule name at the top level, could not tell two objects' |
| 30 | +rules apart, and had no reader). |
| 31 | + |
| 32 | +**This is shipped, which is why it carries a changeset rather than |
| 33 | +`skip-changeset`.** `packages/spec/src/conversions/registry.ts` is not a |
| 34 | +`.zod.ts`, so it is not shipped as source — but two published paths move, |
| 35 | +measured on the built tree rather than reasoned about: |
| 36 | + |
| 37 | +- `dist` is in `files[]`, and the new sentence is emitted into six built files |
| 38 | + (`dist/index.js` / `.mjs`, `dist/shared/index.js` / `.mjs`, |
| 39 | + `dist/browser/index.js` / `.mjs`); a negative control string scored 0 on the |
| 40 | + same tree. An author running `os migrate meta --from 16` reads the changed |
| 41 | + notice out of that runtime string. |
| 42 | +- `spec-changes.json` is itself listed in `files[]`, and it carries the summary |
| 43 | + twice. It is generated (`gen:spec-changes`), and `check:generated` caught it |
| 44 | + stale — the conversion registry feeds two generated artifacts, not one. |
| 45 | + |
| 46 | +`docs/protocol-upgrade-guide.md` is the third, regenerated with |
| 47 | +`gen:upgrade-guide` and verified by `check:upgrade-guide`; all three are |
| 48 | +regenerated, never hand-edited. |
| 49 | + |
| 50 | +⛔ No behaviour changes. The conversion id, its `apply`, its accept set and its |
| 51 | +fixture are untouched; no authorable key is added or removed. |
0 commit comments