Skip to content

NODE_ENV 未设置时 /discovery 广播 environment=development,而 os start 默认 NODE_ENV=production、CLI doctor 也按 production 解析 #5673

Closed

Description

@os-zhuang

发现于 #4828 的实施(界外发现,查重无命中故新开;未认领)。

现象

同一个「未设置 NODE_ENV」的事实,仓里有两套相反的默认:

位置 未设置 NODE_ENV 时的解读
packages/cli/src/commands/ 的 doctorNodeEnv() production(见 doctor-env-provenance.test.ts:expect(doctorNodeEnv({})).toBe('production'))
seed-loader.ts 的 resolveSeedEnvFromNodeEnv() undefined —— 显式表示「宿主没说自己在哪」,由调用方决定含义
discovery 生产者 development(#4828 之前是 getEnv('NODE_ENV', 'development') 直塞,之后是同一默认经映射)

seed-loader.ts 的注释还写着 os start 会把 NODE_ENV 默认成 production。

为什么值得单开

environment 是机器可读面上的字段,客户端拿它回答「我在不在生产环境」。一个忘记设 NODE_ENV 的生产部署,/discovery 会宣称 development —— 这个方向的错报正是危险的那个方向(客户端可能因此不显示生产警示、放宽破坏性操作的确认)。

#4828 的映射函数刻意保留了这个既有默认,没有顺手改:改默认是行为变更,会影响所有本地开发流程(本地开发通常不设 NODE_ENV,一改就全都变成 production),不属于该单裁定范围。所以那里只保证「识别不了的拼法绝不宣称 production」,没有解决「未设置时该信谁」。

可能的处置(需要维护者定)

  1. 三处统一到 production(最保守的安全默认),代价是本地开发不设 NODE_ENV 时 discovery 会说 production;
  2. 三处统一到「未知」这个显式状态 —— 但 DiscoverySchema.environment 是必填枚举,没有「未知」成员,需要先改契约;
  3. 维持现状,但把差异写进文档,并要求生产部署显式设置 NODE_ENV(可以加一条 doctor 检查)。

第 2 条会改动公开契约形状,故不猜。

参考:#4828(discovery 面的枚举映射),Prime Directive #9(NODE_ENV 是第三方边界上的既有例外)。

Activity

  1. added
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    domain:cliRetired 2026-10-22, alias of domain:server (cli surface); in-flight cards keep it until they land
    on Aug 5, 2026
  2. os-zhuang commented on Aug 5, 2026

    @os-zhuang
    ContributorAuthor

    分诊:决策类(needs-user-decision)+ 预挂 domain:cli。

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  3. added
    pm:queueReady for the PM dispatch loop
    and removed
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    on Aug 6, 2026
  4. baozhoutao commented on Aug 6, 2026

    @baozhoutao
    Contributor

    维护者裁定(2026-08-06,经 cli 车道 PM session_01DWUR56YsttL5sTF72Q75TQ 誊写):方案 1 —— 三处统一到 production(保守安全默认),并入方案 3 的 doctor 半边;方案 2(契约加「未知」成员)否,不动 DiscoverySchema.environment 枚举。

    实施口径:

    标签:摘 needs-user-decision → pm:queue(domain:cli 已在),归 cli 车道排程(runtime 半边排 #5085 → #5613 之后,doctor 半边与 cli 包串行序协调)。


    Generated by Claude Code

  5. self-assigned this
    on Aug 6, 2026
  6. baozhoutao commented on Aug 6, 2026

    @baozhoutao
    Contributor

    认领:PM 循环第 4 轮(cli 车道)
    会话:session_01DWUR56YsttL5sTF72Q75TQ
    分支:claude/issue-5673-node-env-unified-production
    Worktree:objectstack-issue-5673
    域:domain:cli
    文件面:packages/runtime/src/http-dispatcher.ts(discovery 生产者默认)+ packages/cli/src/commands/doctor.ts(新检查)+ 对应测试 + changeset(+ 如需,本地 dev 脚本显式 NODE_ENV=development 及文档一处);⛔ 不动 packages/metadata-protocol/seed-loader.ts(engine-core 域,对照面;若实施证明必须改它才能统一,停手报告)

    执行依据:维护者 2026-08-06 已拍方案 1 + doctor(裁决评论在本 thread):三处统一 production 保守安全默认,doctor 新增「NODE_ENV 未设,已按 production 处理」提示,⛔ 不改 DiscoverySchema.environment 枚举(方案 2 否)。串行注记:#5429(同落 doctor.ts)押后至本单落地;churn:PR #5819(已入队)动过 environment-variables.mdx 与 serve.ts,合 main 后再动文档;#4828 已落地,discovery 生产者文件撞面约束已消。


    Generated by Claude Code

  7. removed their assignment
    on Aug 6, 2026
  8. baozhoutao commented on Aug 6, 2026

    @baozhoutao
    Contributor

    认领解除(cli 车道 PM,session_01DWUR56YsttL5sTF72Q75TQ,2026-08-06 07:4xZ):06:5xZ 派发的 dev 被维护者手动中止(宿主明确回报,零推送、无远端分支),配合车道收尾指示,摘 assignee 与 pm:dispatched,回 pm:queue。裁决不受影响:维护者已拍「方案 1 + doctor」(本 thread 04:0xZ 裁决评论),下次派发直接按裁决 + 07:0xZ 认领评论的执行注记执行,无需重新分析;唯一需刷新的是 churn 基线(#5819/#5821 已合入,environment-variables.mdx 与 serve.ts 以合并后现状为准)。


    Generated by Claude Code

  9. self-assigned this
    on Aug 6, 2026
  10. baozhoutao commented on Aug 6, 2026

    @baozhoutao
    Contributor

    恢复认领 + 重派:PM 循环第 6 轮(cli 车道)
    会话:session_01DWUR56YsttL5sTF72Q75TQ
    分支:claude/issue-5673-node-env-unified-production(不变)
    Worktree:objectstack-issue-5673(本会话容器,dev 自建)
    域:domain:cli;文件面同 07:0xZ 认领评论(runtime http-dispatcher 的 discovery 默认 + cli doctor 新检查 + 测试 + changeset;⛔ seed-loader/spec 不动)

    07:4xZ 中止门已随维护者「继续循环」示意解除。执行依据不变:裁决「方案 1 + doctor」。churn 刷新:以最新 origin/main(d9cac6019)为准——#5895 刚动过 packages/runtime/src/domains/meta.ts(与本单 http-dispatcher.ts 不相交)、#5863 加了 check:dev-prereqs(与 dev 脚本影响面盘点相关,如实纳入)、#5819 动过 environment-variables.mdx(触该文档以现状为准)。


    Generated by Claude Code

  11. baozhoutao commented on Aug 6, 2026

    @baozhoutao
    Contributor

    验收:ACCEPT(cli 车道 PM,session_01DWUR56YsttL5sTF72Q75TQ,2026-08-06 13:1xZ)→ PR #5951

    转 ready + 挂 auto-merge,两读数跟到 MERGED;落地后 doctor.ts 与 runtime 解锁,接续派 #5429 + #5613 并批。


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

domain:cliRetired 2026-10-22, alias of domain:server (cli surface); in-flight cards keep it until they landpm:dispatchedDispatched to a dev agent by /pm-dispatchpm:queueReady for the PM dispatch loop

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions