Skip to content

[skill] 新 worktree 里第一次验证之前必须先 build 依赖闭包 —— AGENTS.md §9 的陈旧产物陷阱当日连咬三个 dev(假红 + 假绿两个方向) #6371

Description

@os-zhuang

来自 domain:drivers 车道 2026-08-07 当日的三次真实失误,值得写进 os-dev / pm-dispatch 的验证纪律。unassigned,交 devx 车道分诊。与 #6218 是同一族陷阱(「看起来验证过、实际对被测风险失明」),但成因不同、处方也不同,故分开立单。

事实:同一天,三个不同的 dev,三次

表现
#5962 新 worktree 首次验证时 rest 侧 15 个包报红 —— 非代码问题
#6210 同族(该单还另外踩了 #6218 的 filter 方向问题,两者叠加)
#6203 三个来回都在追一个不存在的红

三次的共同形状:git worktree add 之后 pnpm install,然后直接typecheck / test。新 worktree 里跨包依赖的 dist/*.d.ts 要么不存在、要么是陈旧的,于是 tsc 读到的不是本次改动后的类型。

为什么这个陷阱特别贵

两个方向都会骗人,而且骗法不对称:

本车道当日就有一个正面案例说明该怎么办:#6212 批 A+E 的 PR 明确点名「driver-sqlite-wasm 读的是 driver-sql 重建后的 dist/*.d.ts」,先 build 再 typecheck,并且用一次「临时塞一个类型不认的键、证明它会红」的反向验证坐实了自己确实读到了新 d.ts —— 而不是假绿。这就是该有的形状。

建议条款(不代裁决)

  1. 新 worktree 的第一条验证命令永远是 build,不是 typecheck。 pnpm install 之后、任何 typecheck / test 之前,先把被改包的依赖闭包 build 起来。
  2. 跨包类型改动(签名收窄、导出类型变更、契约收紧)必须给出「确实读到了新 d.ts」的证据,不能只贴一个绿。最省事的证据形式就是一次故意的反向验证:临时塞一个新类型不认的键,确认它会红,然后还原。
  3. 「下游包 typecheck 绿」这句话,在没有第 2 条的情况下不构成消费半径已清扫的证据 —— 与 [skill] 消费半径扫描必须用 --filter '...pkg'(前缀)而非 'pkg...'(后缀)—— 方向扫反会让「全绿」毫无意义(#6210 实测) #6218 第 3 条同源:局部绿只能用来加速迭代,不能用来下结论。
  4. 建议把第 1 条直接写进 os-dev 的派工模板与 AGENTS.md §9 的可执行清单里。本车道的 PM 已在当日后续派工里手动加了这一条,三次失误之后没有再复发 —— 但那是靠 PM 每次手写记得,不是靠制度,所以立此单。

#6218 的关系

两者都属「验证动作看起来做了、实际对被测风险失明」,但:

一个 PR 可以同时踩中两个(#6210 就是),且两者叠加后的症状会互相掩盖:方向扫反 + 产物陈旧,得到的「25 个包全绿」既不相关也不新鲜。

关联:#6218(同族,方向)、#6144(同族,拒收用例恒绿)、AGENTS.md §9、#6212 批 A+E(正面案例)。

会话:session_01WyvqvKMG6asi9aXjKE6xtx(PM 侧观察,未认领)

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions