Skip to content

build(deps): pnpm 升级至 12.2.1 并阻断嵌套 install 覆写根 lockfile; - #1116

Merged
ThreeFish-AI merged 2 commits into
feature/1.x.xfrom
ThreeFish-AI/pnpm-upgrade-12-2-1
Sep 1, 2026
Merged

build(deps): pnpm 升级至 12.2.1 并阻断嵌套 install 覆写根 lockfile;#1116
ThreeFish-AI merged 2 commits into
feature/1.x.xfrom
ThreeFish-AI/pnpm-upgrade-12-2-1

Conversation

@ThreeFish-AI

Copy link
Copy Markdown
Owner

背景

  • 本次变更要解决的问题:pnpm 12.2.1 已发布,但 npm 的 latest dist-tag 仍指向 11.25.0(12.x 只挂在 latest-12/next-12),即上游尚未推为默认。本次为知情抢升。升级过程中发现 v12 引入了一个会破坏数据的回归:嵌套 Remotion 工程执行 pnpm install --ignore-workspace 会静默覆写仓库根 pnpm-lock.yaml,故升级与修复必须原子交付。
  • 关联上下文ISSUE-175(本次完整取证与复现);与 ISSUE-076(v10→v11)构成升级序列;ISSUE-166「不为消音改动跨集冻结文件」的裁决在本次继续生效。

核心变更

  • 升级:根 package.json#packageManagerpnpm@12.2.1。注意 integrity 需 hex 而非 registry 返回的 base64,两者仅差 -/. 分隔符;换算方法已先用 11.25.0 反向复算命中仓库原值后才落笔。CI 的 setup-pnpm-{ui,wiki} 用不带 version 的 pnpm/action-setup@v4,自动继承,无需改动。
  • lockfile(+101 行,必要而非可选):v12 新增 packageManagerDependencies,把 pnpm 自身与 8 个平台的 @pnpm/exe.* 原生二进制记进 lockfile,落盘为多文档 YAML(doc1 为新增文档,doc2 与升级前逐字节一致,无依赖重解析)。旧 lockfile 上 --frozen-lockfile 会硬失败,CI/Docker 会当场红。
  • 回归修复:8 集 + 骨架模板各加 video/pnpm-workspace.yamlpackages: []),把每个嵌套工程钉成独立 workspace 根。已登记进 skeleton.tomlfrozen 清单受漂移门执法(受门 17→18 文件);scaffold.pyrglob 全量复制,新集自动继承。
  • 消除第二事实源:两个 Dockerfile 的 corepack prepare pnpm@latestcorepack installnpm latestpackageManager 是两条独立漂移的轨道,升级后立即分叉。
  • pre-commitcheck-yaml 仅豁免 pnpm-lock.yaml 这份机器产物(exclude),全局开 --allow-multiple-documents,手写 YAML 的单文档约束保持不变。

风险与回滚

  • 主要风险:① latest 未切换意味着 12.x 仍处高频修复期(6 天内 4 个版本);② v12 每次 install 新增 supply-chain policy 校验(根 workspace 1264 entries ≈ 43s 固定开销);③ 本地 Docker 仅验证了 arm64,amd64 待 CI 覆盖。
  • 回滚方式已实测,回滚是干净的 —— pnpm 11.25.0 能正常读并原样保留 v12 写入的多文档 lockfile(frozen 与非 frozen 均不剥离),属前向兼容的惰性忽略。故回滚只需把 package.json#packageManager 改回 11.25.0 一处,lockfile 可留可回。

验证证据

  • 单元测试pnpm test 1152 passed(ui 998 / wiki 109 / cognizes-ui 28+10 skipped / agents-chat-core 17);pipeline/tests 261 项全绿
  • 集成测试pnpm -r typecheck 0 error;pnpm build 三个 Next 应用全部编译并生成静态页;verify_skeleton.py --strict 未登记漂移 0 处。
  • E2E/Workflow:两个 Docker 镜像本地构建成功(frontend 493MB / wiki 24.6MB),corepack install 正确解析到 12.2.1、--frozen-lockfile 通过。
  • 关键证据(隔离夹具复现,非推断):v12 下嵌套 install 使根 lockfile 由 128 行/overrides=1 劣化为 123 行/overrides=0,嵌套工程自身 lockfile 不生成;v11 对照组根 lockfile 逐字节不变 ⇒ 确证 v12 独有回归。给嵌套工程补 packageManager pin 无效,自带 pnpm-workspace.yaml 是唯一有效解。修复后真实仓库实测:带/不带 --ignore-workspace 根 lockfile 均零变更
  • 副作用观察globalShims 新默认({node,deno,bun:true})零副作用 —— 未生成任何全局 shim,node 仍首位命中 nvm。

影响范围

  • 前端:无业务代码改动;ui / wiki / cognizes-ui 依赖解析结果不变(lockfile doc2 逐字节一致)。
  • 后端:无。
  • GitHub Actions / 文档:Actions 无需改动(版本经 packageManager 单一事实源自动继承);Docker 两个 Dockerfile 的 deps 阶段调整;.pre-commit-config.yaml 定向豁免;文档新增 ISSUE-175 并同步 pipeline/README.md 的隔离契约描述。

Next Best Action

  • 合并后negentropy-docker-validate(本 PR 触及 docker/** 会自动触发 4 镜像 × 2 架构构建),补上本地未覆盖的 amd64 一侧。
  • npm view pnpm dist-tagslatest 切到 12.x 后再考虑跟进 12.x 补丁版本;在此之前不建议继续追版。
  • travel-agent-ui(同为解耦独立安装)尚未按 ISSUE-175 体检,下次触碰前须先备份根 lockfile。

pnpm 12.2.1 已发布但 npm `latest` dist-tag 仍指向 11.25.0,本次为知情抢升。
升级过程暴露一个会破坏数据的 v12 回归,故与修复一并原子提交。

升级
- 根 package.json#packageManager → pnpm@12.2.1。integrity 需 hex 而非 registry
  的 base64,换算方法先用 11.25.0 反向复算命中仓库原值后才落笔。
- pnpm-lock.yaml +101 行:v12 新增 packageManagerDependencies(多文档 YAML,
  doc2 逐字节未变,无依赖重解析)。旧 lockfile 上 --frozen-lockfile 会硬失败,
  故这段变更是升级的必要组成而非副产品。
- docker/{frontend,wiki}/Dockerfile 的 `corepack prepare pnpm@latest` 收敛为
  `corepack install`,消除与 packageManager 并存的第二事实源。
- pre-commit check-yaml 只豁免 pnpm-lock.yaml(多文档机器产物),手写 YAML 的
  单文档约束保持不变,已做反向正控。

回归修复
- 嵌套 Remotion 工程跑 `pnpm install --ignore-workspace` 时,pnpm 12 仍沿
  packageManager 向上锚定到仓库根,用本集解析结果覆写根 pnpm-lock.yaml
  (overrides 全丢)且当场不报错,故障延后到 Docker 才以
  ERR_PNPM_LOCKFILE_CONFIG_MISMATCH 现形。v11 对照组无此行为。
- 修复:8 集 + 骨架模板各加 video/pnpm-workspace.yaml(packages: []),钉为独立
  workspace 根;已登记进 skeleton.toml frozen 清单受漂移门执法(17→18 文件)。
  给嵌套工程补 packageManager pin 无效,此为唯一有效解。

验证
- pnpm -r typecheck 0 error;pnpm test 1152 passed;pnpm build 三个 Next 应用全绿
- 两个 Docker 镜像本地构建成功(frontend 493MB / wiki 24.6MB)
- pipeline/tests 261 项全绿;verify_skeleton --strict 未登记漂移 0 处
- 嵌套 install 实测根 lockfile 零变更;globalShims 新默认零副作用
- 回滚实测:pnpm 11 可正常读并保留 v12 多文档 lockfile,回滚只需改回 package.json

取证与复现详见 docs/.agents/issue.md ISSUE-175。

🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
评审收口,两处均为 ISSUE-175 变更的文档侧遗留:

1. frozen 计数与 SSOT 对齐(14 → 15)。新增 video/pnpm-workspace.yaml 使
   skeleton.toml 的 frozen 清单增至 15 条,但三处散文未同步;scaffold.py 的
   计数由清单动态派生(len(skel['classes']['frozen'])),运行时打印 15 而
   文档写 14,且无测试或漂移门覆盖这些散文数字。改 pipeline/README.md 两处
   与 skills/06 一处。skeleton.toml:50 的「14 个」是带日期的历史实测记录
   (2026-08 两系列 4 集观测),非当前计数声明,保持原样。

2. travel-agent-ui 从「尚未验证」升级为实测结论。完整 5 member 夹具复现表明
   风险形态与最初推断不同:根 pnpm-workspace.yaml 内注教的裸 pnpm install
   不覆写根 lockfile(仅装到仓库根、子目录不生成 node_modules,示例跑不起来
   但无数据损失);真正覆写的是 --ignore-workspace——实测根 lockfile
   12991 → 12705 行、overrides 归零。故危险路径是「发现裸 install 没装到
   子目录 → 照 8 集习惯补 --ignore-workspace」。该目录连 .npmrc 都没有,
   三重隔离一条不具备,是本仓唯一还敞着的同款入口;修复方案照搬本次即可,
   因不属 pnpm 升级的必要变更而未纳入。

另:评审中曾判定「新增 pnpm-workspace.yaml 使嵌套 install 退出码由 0 变 1、
影响 pipeline.py render 控制流」,经 pnpm 11 基线复测推翻——升级前该命令
即为 EXIT=1(ERR_PNPM_IGNORED_BUILDS),属 ISSUE-076/166 既存噪声,本次
未引入回归,故不作改动。

验证:verify_skeleton 未登记漂移 0 处;pipeline/tests 261 项全绿;
pre-commit 对三份改动文件全通过。

🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
@ThreeFish-AI
ThreeFish-AI merged commit c9f8d70 into feature/1.x.x Sep 1, 2026
19 checks passed
@ThreeFish-AI
ThreeFish-AI deleted the ThreeFish-AI/pnpm-upgrade-12-2-1 branch September 2, 2026 03:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant