发现于 #3965 的实施(PR #3998),不在该 PR 处理 —— 那一单只碰含 div 的文件与 div.tsx,这一条是另一个键、另一批文件。
现象
GridSchema 声明的键是 columns(packages/types/src/layout.ts:209),grid 渲染器也只读 schema.columns(packages/components/src/renderers/layout/grid.tsx:57-73),注册的 inputs 里同样只有 columns / smColumns / mdColumns / lgColumns / xlColumns / gap / className。
catalog 里有 13 个文件在 grid 节点上写的是 "cols" —— 一个引擎完全不认识的键。全仓 grep 过,core / react / types 里没有任何把 cols 归一到 columns 的处理。
实测(在 packages/components 里跑真渲染,对比两种写法):
cols:4 -> grid grid-cols-2 gap-4
columns:4 -> grid grid-cols-1 sm:grid-cols-2 md:grid-cols-4 gap-4
cols 被整个丢掉,落到 grid.tsx:54 的 let baseCols = 2 默认值上;因为 typeof schema.columns === 'number' 不成立,连 mobile-first 的响应式降级也不会触发,于是在所有断点上都是死板的 2 列。
也就是说:要 3 列或 4 列的示例,在 docs 站上渲染出来是 2 列,而且这不是 dev-only —— production 构建里一样错。
命中清单(13 个,全部在 grid 节点上)
要 4 列(实际 2 列):
report/report-header-with-kpis.json:56
theme/semantic-color-palette.json:3
components-layout-page/full-dashboard.json:8
要 3 列(实际 2 列):
components-data-display-statistic/metrics-grid.json:3
components-layout-page/page-with-header.json:8
forms/payment-form.json:67
要 2 列(碰巧和默认值一致,肉眼看不出来,但键依然是错的):
components-data-display-statistic/sales-dashboard.json:12
auth/signup.json:22
components-complex-resizable/complex-layout.json:29
components-basic-div/grid-layout.json:3
theme/theme-aware-ui-elements.json:64
plugin-view/form-view-mode.json:18
forms/contact-form.json:29
为什么这条比「渲染不对」更值得修
components-basic-div/grid-layout.json 是 content/docs/components/basic/div.mdx:35 的迁移范本 —— 「div 布局请改用 grid」这一条的示范代码本身写错了键。照着它抄的作者(和 AI)会继续写 cols,拿到静默的默认值。
- 「碰巧和默认值一致」的那 7 个是最坏的一类:渲染看起来对,所以没人会去查,错的键就一直传播。这正是 AGENTS.md 第二轴说的「AI 生成的 metadata 错误藏在宽容里」—— 只不过这里连宽容都没有,是纯静默丢弃。
修法(契约优先,别加别名)
改生产者:13 个 JSON 里 cols → columns。
⛔ 不要在 grid.tsx 里加 schema.columns ?? schema.cols 之类的兼容读取 —— AGENTS.md #0.1:宽容的 consumer 会把错写法固化成第二套事实契约。cols 从来没有被 spec / 类型 / 注册表声明过,它就是错的。
注意:改完之后要求 3/4 列的那 6 个示例渲染会变(从死板 2 列变成正确的响应式降级 grid-cols-1 sm:grid-cols-2 md:grid-cols-N),这是修好,不是回归 —— 抽样断言要按新的正确值钉。
顺带:sdui-parser 的 validate.ts 会对 html tier 里的 cols 报 unknown-prop,但 JSON 作者面没有这道门禁 —— 「catalog JSON 是否也该过一遍 manifest 的 prop 校验」是另一个更大的话题,不在本条里。
参考位置
packages/types/src/layout.ts:202-219(GridSchema,声明 columns)
packages/components/src/renderers/layout/grid.tsx:50-103(只读 columns,baseCols 默认 2)
content/docs/components/basic/div.mdx:35(引用了写错键的迁移范本)
关联:#3965 / PR #3998(发现于此)
发现于 #3965 的实施(PR #3998),不在该 PR 处理 —— 那一单只碰含
div的文件与div.tsx,这一条是另一个键、另一批文件。现象
GridSchema声明的键是columns(packages/types/src/layout.ts:209),grid渲染器也只读schema.columns(packages/components/src/renderers/layout/grid.tsx:57-73),注册的inputs里同样只有columns/smColumns/mdColumns/lgColumns/xlColumns/gap/className。catalog 里有 13 个文件在
grid节点上写的是"cols"—— 一个引擎完全不认识的键。全仓 grep 过,core/react/types里没有任何把cols归一到columns的处理。实测(在
packages/components里跑真渲染,对比两种写法):cols被整个丢掉,落到grid.tsx:54的let baseCols = 2默认值上;因为typeof schema.columns === 'number'不成立,连 mobile-first 的响应式降级也不会触发,于是在所有断点上都是死板的 2 列。也就是说:要 3 列或 4 列的示例,在 docs 站上渲染出来是 2 列,而且这不是 dev-only —— production 构建里一样错。
命中清单(13 个,全部在
grid节点上)要 4 列(实际 2 列):
report/report-header-with-kpis.json:56theme/semantic-color-palette.json:3components-layout-page/full-dashboard.json:8要 3 列(实际 2 列):
components-data-display-statistic/metrics-grid.json:3components-layout-page/page-with-header.json:8forms/payment-form.json:67要 2 列(碰巧和默认值一致,肉眼看不出来,但键依然是错的):
components-data-display-statistic/sales-dashboard.json:12auth/signup.json:22components-complex-resizable/complex-layout.json:29components-basic-div/grid-layout.json:3theme/theme-aware-ui-elements.json:64plugin-view/form-view-mode.json:18forms/contact-form.json:29为什么这条比「渲染不对」更值得修
components-basic-div/grid-layout.json是content/docs/components/basic/div.mdx:35的迁移范本 —— 「div 布局请改用 grid」这一条的示范代码本身写错了键。照着它抄的作者(和 AI)会继续写cols,拿到静默的默认值。修法(契约优先,别加别名)
改生产者:13 个 JSON 里
cols→columns。⛔ 不要在
grid.tsx里加schema.columns ?? schema.cols之类的兼容读取 —— AGENTS.md #0.1:宽容的 consumer 会把错写法固化成第二套事实契约。cols从来没有被 spec / 类型 / 注册表声明过,它就是错的。注意:改完之后要求 3/4 列的那 6 个示例渲染会变(从死板 2 列变成正确的响应式降级
grid-cols-1 sm:grid-cols-2 md:grid-cols-N),这是修好,不是回归 —— 抽样断言要按新的正确值钉。顺带:
sdui-parser的validate.ts会对 html tier 里的cols报unknown-prop,但 JSON 作者面没有这道门禁 —— 「catalog JSON 是否也该过一遍 manifest 的 prop 校验」是另一个更大的话题,不在本条里。参考位置
packages/types/src/layout.ts:202-219(GridSchema,声明columns)packages/components/src/renderers/layout/grid.tsx:50-103(只读columns,baseCols默认 2)content/docs/components/basic/div.mdx:35(引用了写错键的迁移范本)关联:#3965 / PR #3998(发现于此)