Skip to content

sys_setting.scope 声明了 runtime 选项,但 spec 枚举与 SettingsService 都不认它 #6036

Description

@hotlong

观察类发现,#5888 取证途中顺带测到,不在该 issue 的申报文件面内,故单独登记不随 PR #6031 修改。

事实(origin/main @ dd98cba)

packages/platform-objects/src/system/sys-setting.object.ts:127scope 字段声明了四个选项:

{ label: 'Global',  value: 'global'  },
{ label: 'Tenant',  value: 'tenant'  },
{ label: 'User',    value: 'user'    },
{ label: 'Runtime', value: 'runtime' },

但另外两处只认三个:

  • packages/spec/src/system/settings-manifest.zod.ts:132
    export const SpecifierScopeSchema = z.enum(['global', 'tenant', 'user']);
  • SettingsService 全包对 'runtime' 零命中
    (grep -rn "'runtime'" packages/services/service-settings/src/ = 0)。
    get() 的 cascade 只走 env → global → tenant → user → default;
    setMany() 的 scope 取自 reg.scopes.get(key),而它来自 manifest,
    值域就是上面那个三元枚举 —— 没有任何代码路径能写出一行 scope='runtime'

同一文件顶部的注释也只列了五层 resolution order,不含 runtime。

为什么按 observation-class 登记(finding,不带 pm:queue)

今天没有用户能撞到:sys_settingapiMethods 只有 ['get', 'list'],
Setup 里那张栅格是 diagnostic-only,写入一律走 /api/settings/:namespace,
所以这个选项既写不进去也读不出来 —— 它是休眠的声明,不是活的缺陷。

登记而不是放过,是因为它正好是 ADR-0049「declared ≠ enforced」那一类:
一个声明出来、没有任何实现兑现的值域,后来者读 object 定义时会当成平台支持
第四层 scope。#5888 那页文档写「六层 cascade、含 runtime 层」,很可能就是
从这里(或同一个早期设想)抄下去的 —— 已在 PR #6031 中按五层改正。

两种可能的处置(交 PM 分诊,不预判)

  1. 选项从未落地 ⇒ 删掉 { label: 'Runtime', value: 'runtime' },让 object 的
    值域与 SpecifierScopeSchema 一致(两边本就该是同一个真相);
  2. 确有 runtime-scope 的产品意图 ⇒ 那它缺的是实现,应按 enforce-or-remove
    单独立项,而不是继续以裸声明的形式挂在 object 上。

个人倾向 1:创业阶段聚焦原则下,一个零消费者、零写入路径的值域没有业务拉力。

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions