@@ -11871,11 +11871,12 @@ const step18: MigrationStep = {
1187111871 // was `z.array(z.any())` while the other carrier, a relationship field's
1187211872 // `inlineColumns`, has been the strict `InlineGridColumnSchema` since #9227; the
1187311873 // carrier now REFERENCES that schema, so both carriers are judged by one
11874- // contract. D3 only, deliberately: the one mechanical respelling the family
11875- // had (`field` → `name`, conversion `field-column-lists-canonicalized`) is
11876- // already retired from the load path, and every other refused shape is a
11877- // judgment only the author can make. A stored view whose column fails is
11878- // refused with the column schema's own prescription, never stripped.
11874+ // contract. The one mechanical respelling, `field` → `name`, is the D2
11875+ // conversion `form-view-subform-columns-canonicalized` (the respelling
11876+ // `field-column-lists-canonicalized` makes on `inlineColumns`); every other
11877+ // refused shape is a judgment only the author can make. A view saved with a
11878+ // failing column is refused with the column schema's own prescription, and a
11879+ // stored row carrying one is diagnosed at rehydration; neither is stripped.
1187911880 {
1188011881 id: 'form-view-subform-columns-closed',
1188111882 surface: 'view.form.subforms[].columns[] and view.formViews.<key>.subforms[].columns[] — the '
@@ -11892,10 +11893,12 @@ const step18: MigrationStep = {
1189211893 + '(option B, `scale` retired from the currency type) and the remedy ruled on 2026-09-24 '
1189311894 + '(option 乙 — a currency\'s ISO 4217 minor unit decides its display) — published green here. '
1189411895 + 'The carrier now references the column schema, so every rule it holds applies here too, with '
11895- + 'its own prescription. NOT mechanically converted: the `field` → `name` respelling this family '
11896- + 'had is already retired from the load path, and which column an unknown key or a mixed '
11897- + '`field`/`name` entry meant is the author\'s call — a conversion that dropped the key would '
11898- + 'accept on every load what the parse now refuses. Population measured at the change, on '
11896+ + 'its own prescription. Only the `field` spelling is converted mechanically — by the conversion '
11897+ + '`form-view-subform-columns-canonicalized`, which rewrites stored rows and assembled artifacts '
11898+ + 'and lists the edit under `os migrate meta`, while an author writing `field` meets the refusal. '
11899+ + 'Which column an unknown key or a mixed `field`/`name` entry meant is the author\'s call — a '
11900+ + 'conversion that dropped the key would accept on every load what the parse now refuses. '
11901+ + 'Population measured at the change, on '
1189911902 + 'origin/main cb4c31dd52: zero authored `subforms` in the repository (the showcase derives its '
1190011903 + 'master-detail grids from the data model instead), against one authored `inlineColumns` block '
1190111904 + 'as the control. Deployed metadata NOT MEASURED.',
@@ -12308,7 +12311,9 @@ const step18: MigrationStep = {
1230812311 id: 'inline-grid-column-currency-scale-refused',
1230912312 surface: 'object.fields.<name>.inlineColumns[].scale on an inline grid column that declares '
1231012313 + '`type: \'currency\'` — any declared value, `scale: 0` included, computed or not. `scale` on a '
12311- + '`number` column, and on a column that declares no `type`, is untouched',
12314+ + '`number` column is untouched. A column that declares no `type` is judged as the type it '
12315+ + 'renders as: over a `currency` field of the child object it is entry '
12316+ + '`inline-grid-column-identity-only-currency-scale-refused`',
1231212317 replacement: 'no `scale` on a currency inline grid column. DELETE the key — that is the whole '
1231312318 + 'migration: a currency amount\'s decimal places are its currency\'s, not a column setting. The '
1231412319 + 'currency\'s ISO 4217 minor unit decides how the cell displays the amount and the width a '
@@ -12327,19 +12332,23 @@ const step18: MigrationStep = {
1232712332 + 'every load, which is the grace window the ruling refused; the refusal names the key and its '
1232812333 + 'one-line fix instead. The same change rewords the column\'s `prefix` description: it replaces '
1232912334 + 'the resolved currency\'s symbol and has no default (the grid no longer falls back to a fixed '
12330- + 'yen sign). Reach: only a DECLARED column `type` is judged — a column that declares none takes '
12331- + 'its type from the child field when the console hydrates it, which the column schema cannot '
12332- + 'see. Population measured at the change, on origin/main 1c8b320a89: one authored '
12333- + '`inlineColumns` block in the tree (the showcase invoice, seven identity-only columns, none '
12334- + 'declaring `type` or `scale`), no platform object, skill, documentation example or JSON fixture '
12335- + 'declaring an inline grid column at all, and one test fixture carrying `scale: 2` on a currency '
12336- + 'column, re-judged in the same change. Deployed metadata NOT MEASURED.',
12335+ + 'yen sign). Reach: the column schema judges only a DECLARED column `type` — a column that '
12336+ + 'declares none takes its type from the child field when the console hydrates it, which the '
12337+ + 'schema cannot see; `defineStack` judges that column instead (entry '
12338+ + '`inline-grid-column-identity-only-currency-scale-refused`). Population measured at the '
12339+ + 'change, on origin/main 1c8b320a89: one authored `inlineColumns` block in the tree (the '
12340+ + 'showcase invoice, seven identity-only columns, none declaring `type` or `scale`), no platform '
12341+ + 'object, skill, documentation example or JSON fixture declaring an inline grid column at all, '
12342+ + 'and one test fixture carrying `scale: 2` on a currency column, re-judged in the same change. '
12343+ + 'Deployed metadata NOT MEASURED.',
1233712344 acceptanceCriteria:
1233812345 'Every field in the stack parses: an `ObjectSchema` parse and `objectstack validate` report no '
1233912346 + 'issue on an `inlineColumns[].scale` path of a column declaring `type: \'currency\'`. A '
1234012347 + 'currency column that carried `scale` no longer declares it, and a diff of the column shows '
12341- + 'that one line deleted and no key added. `number` columns, and columns declaring no `type`, '
12342- + 'keep their `scale`; a column\'s `prefix` is still accepted on a currency column.',
12348+ + 'that one line deleted and no key added. `number` columns keep their `scale`, and so does a '
12349+ + 'column declaring no `type` unless it names a `currency` field of the child object (entry '
12350+ + '`inline-grid-column-identity-only-currency-scale-refused`); a column\'s `prefix` is still '
12351+ + 'accepted on a currency column.',
1234312352 },
1234412353 // #20901 — the reach of `inline-grid-column-currency-scale-refused`, extended to
1234512354 // the column that declares no `type`. The column schema judges only a DECLARED
0 commit comments