Skip to content

objectstack build / validate 从不按 PageSchema 解析页面元数据:ADR-0089 D3a 早就该拒绝的键一路通过,#4001 的「三个示例应用 validate 全过」对 page 面是空证 #5000

Description

@xuyushun441-sys

#4001 批 13 的 ADR-0087 示例应用验证步骤拆出(发现)。做阴性对照时撞到的:对照本身没能变红。

问题

objectstack buildobjectstack validate 不会page 元数据按 PageSchema 解析。一个 PageComponentSchema 自 ADR-0089 D3a 起就是 .strict() 拒绝的键,原样通过两条命令,并被写进产物

复现(origin/main + #4001 批 13 分支,2026-08-03)

examples/app-showcase/src/ui/pages/styling-gallery.page.ts 的一个页面组件上加一个键:

{
  id: 'styling_root', type: 'flex',
  responsiveStyles: { large: { display: 'flex' } },
  aKeyPageComponentHasRejectedSinceADR0089: 1,   // 加这一行
  ...
}

结果:

pnpm -s build     → exit 0(无任何相关报错)
pnpm -s validate  → exit 0(无任何相关报错)

而同一份组件走元数据类型注册表这条门是拒绝的:

getMetadataTypeSchema('page')!.safeParse(page)
// REJECTED — Unrecognized key(s) on this view/page schema:
//            `aKeyPageComponentHasRejectedSinceADR0089`

也就是说 PageSchema 的严格性在 MetadataManager.validate / GET /api/v1/meta / Studio 表单那条路上是生效的,唯独 CLI 的 build/validate 不走它

为什么这条值得单独记

  1. 它让 未知键静默剥离仍是全仓默认:把 #3405 的 strict 收紧从一个 schema 推广到整个可授权面(ADR-0078 完整性闸门) #4001 的零破坏证据在 page 面上是空的。 这场战役每一批的验收里都有一条「app-showcase / app-crm / app-todo 三个示例应用 validate 全过」(feat(spec): reject unknown keys on an action param instead of stripping them (#3405) #3746 起就是这么写的)。对 object / flow / field 那些类型这条证据是实的;对 page恒为真,因为那条路根本不解析。批 13 收紧 ResponsiveConfigSchema / ResponsiveStylesSchema 时,阴性对照(把 responsiveStyles.large 改成 .lg)在 validate 上没变红 —— 只有在按槽位溯源解析产物的探针上、以及在 getMetadataTypeSchema('page') 这条真门上才变红。后两者是批 13 实际采用的证据。

  2. 产物会把坏值带下去。 上面那次注入之后 dist/objectstack.json 里确实带着未声明的键(587.8 KB 的 showcase 产物,build 打印 41 条 author-time warning,没有一条与之相关)。

  3. 这是 Prime Directive chore: version packages #10 的形状 —— 一条被当作闸门引用的命令,在这个类型上并不闸。

建议方向(未定,需维护者判)

无论选哪条,#4001 后续批次(ui/component.zod.ts 还有 29 个站点,view.zod.ts 还有 20 个)在写「三个示例应用 validate 全过」之前应该知道这条,否则会重复地把空证当成实证。

相关

按 AGENTS.md Prime Directive #10 归档,未指派。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions