@@ -17147,6 +17147,58 @@ const step18: MigrationStep = {
1714717147 + 'authoring-path save (zero such documents were measured to exist); on refusal the '
1714817148 + 'author re-gates by record state or moves the gate to an app surface.',
1714917149 },
17150+ // #20592 — the D3 record of the accept-set narrowing the CLI's JSX page gate
17151+ // takes on when its console-manifest fallback becomes reachable (#19922): a
17152+ // project with no `sdui.manifest.json` of its own has its `kind:'html'` pages
17153+ // checked against the manifest `@objectstack/console` ships, which does not
17154+ // declare `div`. The vocabulary is ruling A on #20112 (record 5852014527): an
17155+ // html page may author the intrinsic tags its renderer registers, the published
17156+ // manifest declares that set, and `div` stays deprecated in favour of `box` —
17157+ // the console's own html compile refuses it too since objectui#10808. No D2
17158+ // conversion and no tombstone: the tag sits inside an authored JSX string, which
17159+ // no conversion rewrites and no schema key can tombstone, so this entry is the
17160+ // migration channel beside the changeset's FROM → TO table.
17161+ {
17162+ id: 'ui-html-page-div-refused',
17163+ // No backticks and no pipes in `surface` — build-upgrade-guide.ts renders it
17164+ // inside a code span.
17165+ surface:
17166+ "kind:'html' page source (and its deprecated kind:'jsx' alias) in a project with no "
17167+ + 'sdui.manifest.json of its own — the div tag, and any other tag or prop the SDUI '
17168+ + 'component manifest shipped in @objectstack/console does not declare',
17169+ replacement:
17170+ '`box` for a plain wrapper — the one drop-in swap: the same element, your `className` '
17171+ + 'verbatim, the same children, and no layout of its own. Reach for `card`, `flex`, '
17172+ + '`container`, `stack` or `grid` only where you want their layout. For any other tag or '
17173+ + 'prop the command names, a component and prop the manifest declares; the file is '
17174+ + '`dist/sdui.manifest.json` inside `@objectstack/console`.',
17175+ reason:
17176+ 'An html page\'s source is a JSX string, not a keyed document: `objectstack migrate meta` '
17177+ + 'rewrites stored metadata by key and cannot rewrite a tag inside authored source, so the '
17178+ + 'move is by hand, and which wrapper keeps a page\'s layout is the author\'s call. '
17179+ + '`objectstack validate`, `objectstack compile` (which `dev` and `start` run first) and '
17180+ + '`objectstack lint` check that source against an SDUI component manifest: the '
17181+ + '`sdui.manifest.json` in the directory the command runs in, then the copy '
17182+ + '`@objectstack/console` ships. The second lookup asked for a file the console package '
17183+ + 'does not export, so it always failed, and a project without its own manifest had its '
17184+ + 'html pages checked at parse level only — syntax and structure, never which components '
17185+ + 'and props they use. It now reaches the shipped copy. That manifest declares the html '
17186+ + 'tier\'s intrinsic tags but not `div`: the maintainer ruled (2026-09-27) that an html page '
17187+ + 'may author the intrinsic tags its renderer registers and that the published manifest '
17188+ + 'declares that set, while `div` stays deprecated in favour of `box`, and the console\'s '
17189+ + 'own html-page compile refuses `div` the same way. A `div` in such a page, which used to '
17190+ + 'pass unchecked, now fails the command with `jsx-forbidden-tag` and '
17191+ + '`jsx-unknown-component`. A project that keeps its own `sdui.manifest.json` is checked '
17192+ + 'against that file, as before.',
17193+ acceptanceCriteria:
17194+ '`objectstack validate` reports no `jsx-forbidden-tag`, `jsx-unknown-component` or '
17195+ + '`jsx-unknown-prop` finding on any `kind:\'html\'` page and prints no '
17196+ + '`sdui/jsx-parse-level-only` notice — that notice means the component check did not run, '
17197+ + 'so a clean result beside it proves nothing; `objectstack compile` and `objectstack lint` '
17198+ + 'agree. No html page source authors `div`, and in the console each rewritten page renders '
17199+ + 'with no compile error. The platform\'s own reference is the showcase app\'s three html '
17200+ + 'pages, which author their wrappers as `box` and pass with zero findings.',
17201+ },
1715017202 // The sibling axis of `ui-list-view-grouping-field-padded-refused` (#17360),
1715117203 // which scoped this one out by name. Same defect, same refusal, one difference
1715217204 // that changes the author's options: `kanban.groupByField` is REQUIRED, so a
0 commit comments