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:创业阶段聚焦原则下,一个零消费者、零写入路径的值域没有业务拉力。

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