Skip to content

objectui: MetadataLayered.overlayScope 词表与 spec 漂移(注释声称 organization/environment/package,生产者只发 org/env),LayeredDiff 把该原值当徽标直出 #4982

Description

@yinlianghui

发现于 #4016(Studio layered 读迁到 GET /meta/:type/:name/layers)的前提测量。不在那个 PR 内修复 —— 超出该卡范围,按 Prime Directive #10 立卡,未认领。

事实(逐条 file:line)

  1. 消费侧类型过宽 + 注释错误 —— packages/data-objectstack/src/metadata-client.ts,MetadataLayered.overlayScope 声明为 string | null,紧邻注释写的是 “Overlay scope (organization | environment | package | null)”。
  2. 生产者(objectui 今天解析到的 GA 包) —— @objectstack/spec@17.0.0GetMetaItemLayeredResponseSchema:overlayScope: z.enum(['org','env']).nullable(),.describe() 明确 “org for a tenant overlay, env for an environment-level one. null exactly when overlay is null”。
  3. 生产者实现(framework origin/main e4e5c6e3c) —— packages/metadata-protocol/src/protocol.ts:6083 声明 overlayScope: 'org' | 'env' | null;6212 / 6222 两处赋值只有 'org' / 'env'

也就是说注释里那三个拼法一个都不是生产者会发的值,package 这个 scope 在这个字段上根本不存在。类型是 string,所以类型检查对此毫无意见。

用户可见后果

packages/app-shell/src/views/metadata-admin/LayeredDiff.tsx:196 把该值原样当 overlay 层徽标渲染:

{layered.overlayScope ?? translateConsoleValue('layer', 'set', locale)}

同组件另外三个层标签(189 / 200 / 207,artifact / none / merged)全部过 translateConsoleValue。而 CONSOLE_VALUE_ZH.layer(packages/app-shell/src/views/metadata-admin/i18n.ts:4125)只有 artifact / none / merged / set / overlay,没有 org / env

于是同一个徽标的语言取决于有没有 overlay:有 overlay 的条目在 zh-CN 下显示裸英文 org / env,没有 overlay 的条目(走 ?? 右支)才显示「已设」。

建议(交维护者定,不预设)

  • 词表从 spec 派生(读 z.enum 的 options)而不是在消费侧复述,overlayScope 收窄成 'org' | 'env' | null;
  • CONSOLE_VALUE_ZH.layerorg / env。注意 translateConsoleValue 目前只对 zh 生效、其余语言恒返回原值 —— 那是它的现有设计,是否扩到十个语言包是另一个决定,别顺手改。

未打 finding 标签:zh-CN 管理员今天打开任一有 overlay 的元数据编辑页就看得到裸值,属具体缺陷,定级交 PM triage。

Metadata

Metadata

Assignees

Labels

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions