Skip to content

finding: preview / trial 是 EnvironmentType 的一等成员,但 NODE_ENV_TO_DISCOVERY_ENVIRONMENT 没有条目 —— 靠 ?? 'development' 兜底,折叠方向没被声明 #6287

Description

@qq9340100

范围外发现,记录于 #6243 sweep 的 #5676 一项(为两个环境枚举补双向交叉引用 + 子集 pin)实施过程。不夹带修复 —— #5676 的既定边界是「docs 交叉引用 + 子集 pin,⛔ 明确不改契约」,而这条要动的是映射表本身,属另一处判断。

事实(origin/main @ 2598216 实读)

packages/spec/src/api/discovery.zod.ts:320-328:

const NODE_ENV_TO_DISCOVERY_ENVIRONMENT: Readonly<Record<string, DiscoveryEnvironment>> = {
  production: 'production',
  prod: 'production',
  sandbox: 'sandbox',
  staging: 'sandbox',
  development: 'development',
  dev: 'development',
  test: 'development',
};

EnvironmentTypeSchema(cloud/environment.zod.ts)的七个成员里,previewtrial 在这张表上没有条目resolveDiscoveryEnvironment 的末行是

return NODE_ENV_TO_DISCOVERY_ENVIRONMENT[raw.trim().toLowerCase()] ?? 'development';

所以这两个值折叠到 development —— 但是走兜底,不是走一条被写下来的决定。表上其余五个 EnvironmentType 成员(production / sandbox / development / test / staging)都有显式条目。

危害程度:低,故只登记不排期

previewtrial 都是非生产环境,development 也是,所以 discovery 面要回答的那个粗粒度问题(「我是不是在跟生产说话」)今天答得是对的 —— 这不是 #5673 点名的那个危险方向(把生产错报成非生产)。真正的问题是形式上的:

  1. 同一张表里两种机制。 五个成员的折叠是声明,两个成员的折叠是兜底的副作用。读表的人(两个 discovery 生产者都在线上返回 schema 未声明的顶层字段(scoping / features / endpoints),且 REST 形状永远无法通过 DiscoverySchema #4828 的注释明说这张表就是给后来者读的)会以为表是全的。
  2. 下一次给 EnvironmentTypeSchema 加桶时没有提示。 加一个成员不会让任何门变红,它会静静落进 development —— 而如果那个新桶是生产侧的(比如某种 production_replica),这就是 NODE_ENV 未设置时 /discovery 广播 environment=development,而 os start 默认 NODE_ENV=production、CLI doctor 也按 production 解析 #5673 的危险方向了。兜底的存在正是让这一类新增不响。

与既有单的关系(已逐一核过,均非重复)

建议的修法(供分诊参考,未实施)

最小改动是给 preview / trial 补两条显式条目(值仍是 development,行为零变化),再加一条测试断言每个 EnvironmentTypeSchema 成员在表上都有条目 —— 这样折叠方向从兜底变成声明,而下一个新桶会在测试里被问一次「它折向哪」。⛔ 不建议删掉 ?? 'development' 兜底:它服务的是任意 operator 提供的字符串(不只是 EnvironmentType 成员),那个职责是真的。

未加标签、未认领,交发现分诊轮定级。

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