build(deps): pnpm 升级至 12.2.1 并阻断嵌套 install 覆写根 lockfile; - #1116
Merged
Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
背景
latestdist-tag 仍指向 11.25.0(12.x 只挂在latest-12/next-12),即上游尚未推为默认。本次为知情抢升。升级过程中发现 v12 引入了一个会破坏数据的回归:嵌套 Remotion 工程执行pnpm install --ignore-workspace会静默覆写仓库根pnpm-lock.yaml,故升级与修复必须原子交付。核心变更
package.json#packageManager→pnpm@12.2.1。注意 integrity 需 hex 而非 registry 返回的 base64,两者仅差-/.分隔符;换算方法已先用 11.25.0 反向复算命中仓库原值后才落笔。CI 的setup-pnpm-{ui,wiki}用不带 version 的pnpm/action-setup@v4,自动继承,无需改动。packageManagerDependencies,把 pnpm 自身与 8 个平台的@pnpm/exe.*原生二进制记进 lockfile,落盘为多文档 YAML(doc1 为新增文档,doc2 与升级前逐字节一致,无依赖重解析)。旧 lockfile 上--frozen-lockfile会硬失败,CI/Docker 会当场红。video/pnpm-workspace.yaml(packages: []),把每个嵌套工程钉成独立 workspace 根。已登记进skeleton.toml的frozen清单受漂移门执法(受门 17→18 文件);scaffold.py用rglob全量复制,新集自动继承。corepack prepare pnpm@latest→corepack install。npm latest与packageManager是两条独立漂移的轨道,升级后立即分叉。check-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 覆盖。package.json#packageManager改回 11.25.0 一处,lockfile 可留可回。验证证据
pnpm test1152 passed(ui 998 / wiki 109 / cognizes-ui 28+10 skipped / agents-chat-core 17);pipeline/tests261 项全绿。pnpm -r typecheck0 error;pnpm build三个 Next 应用全部编译并生成静态页;verify_skeleton.py --strict未登记漂移 0 处。corepack install正确解析到 12.2.1、--frozen-lockfile通过。128 行/overrides=1劣化为123 行/overrides=0,嵌套工程自身 lockfile 不生成;v11 对照组根 lockfile 逐字节不变 ⇒ 确证 v12 独有回归。给嵌套工程补packageManagerpin 无效,自带pnpm-workspace.yaml是唯一有效解。修复后真实仓库实测:带/不带--ignore-workspace根 lockfile 均零变更。globalShims新默认({node,deno,bun:true})零副作用 —— 未生成任何全局 shim,node仍首位命中 nvm。影响范围
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-tags的latest切到 12.x 后再考虑跟进 12.x 补丁版本;在此之前不建议继续追版。travel-agent-ui(同为解耦独立安装)尚未按 ISSUE-175 体检,下次触碰前须先备份根 lockfile。