Skip to content

spec: SettingsManifest 的 SpecifierSchema 新增 valueDomain 闭合枚举 —— 声明存在时标准域为执行边界,options 退化为 UI 便利列表(#5712 裁决的 spec 半边) #5933

Description

@hotlong

Part of #5712(维护者 2026-08-06 裁读法 1;裁决评论预授权本拆分:「若需要 spec 新增带格式校验的 specifier,按 contract-first 拆分转 spec 座位,services 侧跟进」)。spec 半边先行(contract-first),services 半边(#5712)Blocked-by 本单。

为什么现行 spec 表达不了裁决

#5712 的 dev 实测(2026-08-06,报告存档于该单):

  • SettingsManifestSchema 的 SpecifierSchema 值约束位只有 options / pattern / min / max / minLength / maxLength;夹带 format 键被 Zod 直接剥掉(parse 后 undefined);
  • pattern 只能约束形状,拦不住形状合法的垃圾值(Mars/Olympus 会被放行)——违反「垃圾值响亮拒收」;
  • options 补全路线同样违反裁决:见下面的实测陷阱。

于是「options 表 = UI 便利列表,执行边界 = 标准域」这句裁决在 manifest 里没有任何声明位。

提案(#5712 dev 的方案 C,services 座位推荐,枚举词表由 spec 座位定夺)

SpecifierSchema 新增可选键 valueDomain,闭合枚举,例如:

valueDomain?: 'iana_time_zone' | 'iso_4217_currency' | 'iso_3166_alpha2' | 'bcp47_locale'

语义:声明存在时,该标准域是执行边界,options 退化为 UI 便利列表(下拉建议,不再穷尽拒绝);未声明时一切照旧(#5131 的 options 穷尽语义对注册表背书类的表保持不变,如 sms/mail 的 provider)。校验的执行仍在 service-settings(spec 只声明,不执行)—— spec 侧交付物按本车道纪律:schema + authorable-surface 基线 + pin + 文档。

⚠️ 实现陷阱(已实测,直接决定域校验的正确定义)

  • 时区域 ⛔ 不可用 Intl.supportedValuesOf('timeZone') 当词表:Node 22(仓基线)上它只有 418 项 CLDR 规范名子集,缺 UTC(该 specifier 自己的 default!)、缺 Asia/Kolkata(在库策展值!)、缺 Europe/Kyiv / Asia/Ho_Chi_Minh / US/Eastern / GMT 等。「合法 IANA 时区」的正确定义是 Intl.DateTimeFormat 探针 —— 仓内已有两处先例采用它:resolve-authz-context.ts:449isValidTimeZonelocalization.manifest.test.ts:33
  • 币种域可用 Intl.supportedValuesOf('currency'):实测 162 项,CHF 在、XYZ 不在、9 个在库策展值全在(缺 VED 与金属/基金码,可接受或另断)。

真实拉动(创业聚焦轴,实测非断言)

同一个 localization.manifest 里就有三个键需要它:timezonecurrencydefault_country(第三例:现用 ^[A-Za-z]{2}$ pattern,ZZ 照收 —— 同一个洞)。本 issue 源头是真实 env 配置路径(#5204)。

相邻但不并入

#5932(min/max/minLength/maxLength 在写入路径全空转)是同一 validatePatch 的另一族缺陷,已单独立案待分诊,⛔ 不作本单 rider。

来源座位:services(会话 session_015a5qkLzpGXhLL2F5gvJ7dD);domain:spec 标签待分诊座位补。维护者否决窗口:若坚持零 spec 改动,#5712 上有 dev 给出的最小一致态备选(A 仅 currency + timezone 改 description),在该单评论重裁即可。

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions