Observation-class, filed unassigned. Found while fixing #6756 (PR #6854), which had to decide the verb for one tombstone's os migrate meta sentence and discovered the corpus disagrees with itself.
The observation
retiredKey() prescriptions close with a sentence telling the author what os migrate meta --from 16 will do. Two idioms are in use for the same underlying behaviour:
Measured on main @ c32944d6, git grep -oh "os migrate meta --from 1[0-9]\[^']*" -- packages/spec/src`:
| phrasing |
sites |
to rewrite it automatically. |
32 |
to rewrite existing sources automatically. |
6 |
to remove it. |
4 |
to remove it automatically. |
2 |
(rewrites … variants) |
~10 |
The remove spellings live in data/datasource.zod.ts:89,97,101,108 and ui/component.zod.ts:770,781.
Why it may matter
For a conversion that strips the key, "rewrite it" is readable two ways: "the tool rewrites your source files" (true) or "the tool rewrites this key into something" (false — the value is deleted). An author who reads the second way expects their block to be converted, and it is not.
Two adjacent specimens in one object literal, both pure strips, both currently saying "rewrite":
packages/spec/src/ui/dashboard.zod.ts:591-600 — widgets[].responsive. Conversion dashboard-widget-responsive-removed (conversions/registry.ts:2302) calls stripKeys(w, ['responsive'], …) at :2314.
packages/spec/src/ui/dashboard.zod.ts:620-628 — widgets[].aria. Conversion dashboard-widget-action-aria-removed (:2373) calls stripKeys(w, ['actionUrl','actionType','actionIcon','aria'], …) at :2390; the fixture after (:2416-2421) shows the widget with all four keys gone.
PR #6854 changed the second one to to remove it automatically. (in-corpus phrasing, not new) because #6756's dispatch asked specifically whether the sentence describes what the conversion really does. It deliberately did not sweep the first — that is a different key and out of that issue's scope — which leaves those two neighbours currently inconsistent. That inconsistency is the concrete trigger for this filing.
Not asserting a defect
This is filed as finding, not pm:queue, on purpose. I did not audit which of the ~40 "rewrite" sites sit over strip conversions versus genuine rewrites — that classification is the actual work, and it may well conclude "rewrite" is the intended house term for "the tool rewrites your sources", in which case the right fix is the opposite sweep (normalise the 6 remove sites to rewrite) or a note in shared/retired-key.ts fixing the term. Either way the corpus should pick one.
shared/retired-key.ts:27-32 is the reason it is worth a look at all: that string "IS the migration doc for anyone who hits it", so its verb is contract rather than prose — the same argument #6630 and #6756 were graded on.
Suggested direction (non-binding)
- Decide the term in
shared/retired-key.ts's docblock (it currently gives no guidance on this sentence).
- Sweep to it, mechanically. Acceptance-neutral in every case —
retiredKey() returns z.never({ error: () =\> guidance }).optional() regardless of the string.
- Regenerate
content/docs/references/** + docs/protocol-upgrade-guide.md, both of which re-emit these strings.
Dedup
Searched before filing: is:open "migrate meta" rewrite strip tombstone verb and is:open "rewrite it automatically" — both return only #6756 itself. #6630 (retryDelayMs, fixed) and #6756 (this PR) are about which surfaces a prescription names, not the migrate verb.
Observation-class, filed unassigned. Found while fixing #6756 (PR #6854), which had to decide the verb for one tombstone's
os migrate metasentence and discovered the corpus disagrees with itself.The observation
retiredKey()prescriptions close with a sentence telling the author whatos migrate meta --from 16will do. Two idioms are in use for the same underlying behaviour:Measured on
main@c32944d6,git grep -oh "os migrate meta --from 1[0-9]\[^']*" -- packages/spec/src`:to rewrite it automatically.to rewrite existing sources automatically.to remove it.to remove it automatically.rewrites …variants)The
removespellings live indata/datasource.zod.ts:89,97,101,108andui/component.zod.ts:770,781.Why it may matter
For a conversion that strips the key, "rewrite it" is readable two ways: "the tool rewrites your source files" (true) or "the tool rewrites this key into something" (false — the value is deleted). An author who reads the second way expects their block to be converted, and it is not.
Two adjacent specimens in one object literal, both pure strips, both currently saying "rewrite":
packages/spec/src/ui/dashboard.zod.ts:591-600—widgets[].responsive. Conversiondashboard-widget-responsive-removed(conversions/registry.ts:2302) callsstripKeys(w, ['responsive'], …)at:2314.packages/spec/src/ui/dashboard.zod.ts:620-628—widgets[].aria. Conversiondashboard-widget-action-aria-removed(:2373) callsstripKeys(w, ['actionUrl','actionType','actionIcon','aria'], …)at:2390; the fixtureafter(:2416-2421) shows the widget with all four keys gone.PR #6854 changed the second one to
to remove it automatically.(in-corpus phrasing, not new) because #6756's dispatch asked specifically whether the sentence describes what the conversion really does. It deliberately did not sweep the first — that is a different key and out of that issue's scope — which leaves those two neighbours currently inconsistent. That inconsistency is the concrete trigger for this filing.Not asserting a defect
This is filed as
finding, notpm:queue, on purpose. I did not audit which of the ~40 "rewrite" sites sit over strip conversions versus genuine rewrites — that classification is the actual work, and it may well conclude "rewrite" is the intended house term for "the tool rewrites your sources", in which case the right fix is the opposite sweep (normalise the 6removesites torewrite) or a note inshared/retired-key.tsfixing the term. Either way the corpus should pick one.shared/retired-key.ts:27-32is the reason it is worth a look at all: that string "IS the migration doc for anyone who hits it", so its verb is contract rather than prose — the same argument #6630 and #6756 were graded on.Suggested direction (non-binding)
shared/retired-key.ts's docblock (it currently gives no guidance on this sentence).retiredKey()returnsz.never({ error: () =\> guidance }).optional()regardless of the string.content/docs/references/**+docs/protocol-upgrade-guide.md, both of which re-emit these strings.Dedup
Searched before filing:
is:open "migrate meta" rewrite strip tombstone verbandis:open "rewrite it automatically"— both return only #6756 itself. #6630 (retryDelayMs, fixed) and #6756 (this PR) are about which surfaces a prescription names, not the migrate verb.