在做 #4976(PR #4995)时旁落的观察。当前休眠 —— 三族补丁今天都能正常作用到真实 upstream,没有用户会碰到;记下来是因为它是 #4976 那个失效族的同一个盲区,而 #4976 已经证明这个盲区能让一个死补丁在测试全绿的情况下活四个月。
事实
scripts/shadcn-local-patches.mjs 声明了四族补丁。scripts/__tests__/shadcn-local-patches.test.ts 里 applyLocalPatches 的调用面是:
| 族 | 有「作用到 upstream fixture」的覆盖吗 |
|---|
slider(4 条) | 有 —— PR #4995 之后是 registry 逐字节 fixture + 逐字节往返断言 |
dialog(2 条) | 有,但 fixture 是手写节选(UPSTREAM_DIALOG,注释自称 "a faithful excerpt") |
sheet(2 条) | 没有。只断言了 id 与盘上 marker |
sidebar(2 条) | 没有。只断言了 id 与盘上 marker |
sheet / sidebar 的锚点因此只被两件事支撑着:盘上 marker 在(patchedComponents() 那个循环),以及每周一次的联网 pnpm shadcn:check。前者与锚点能不能对上 upstream 完全无关 —— 这正是 #4976 的机制:marker 齐全、verifyLocalPatches 返回 []、测试全绿,而锚点钉的是一行本地编辑,从未匹配过任何 registry 响应。
为什么判它休眠
用 shadcn-ui/ui 仓内逐字节签入的 registry JSON(apps/v4/public/r/styles/default/*.json,HEAD 8a7701ec27eb9cb8e0377db769fbe6d744113c52)实测四族:
sheet applied 2 failed []
dialog applied 2 failed []
sidebar applied 2 failed []
slider applied 3 failed ["slider-thumb-aria-delivery:0"] ← #4976,已由 PR #4995 修掉
也就是说 sheet/sidebar 的锚点现在是对的,只是这件事没有任何仓内断言在守;#4976 那次周检也只报了 slider 一个组件。所以是「未被覆盖的正确」,不是「已经坏了」。
建议的修法
把 PR #4995 给 slider 加的那条断言推广开:把声明的补丁作用在 registry 逐字节内容上,结果必须逐字节等于我们发布的那个文件。从本地文件臆造的锚点无法满足它,所以它是能离线判死这一族的判据。每族需要一份 registry 逐字节 fixture(连同 URL / 仓内路径 / HEAD sha / content sha256 的 provenance 注释),然后 it.each(patchedComponents()) 化,顺带让「加了新族但忘了给 fixture」也变红。
sidebar 会额外贵一点:它的 upstream 文件很大(周检里 24 local line(s)),整份 fixture 不便宜 —— 需不需要为它破例、或者改用别的等价判据,值得单独判一下。
备注
在做 #4976(PR #4995)时旁落的观察。当前休眠 —— 三族补丁今天都能正常作用到真实 upstream,没有用户会碰到;记下来是因为它是 #4976 那个失效族的同一个盲区,而 #4976 已经证明这个盲区能让一个死补丁在测试全绿的情况下活四个月。
事实
scripts/shadcn-local-patches.mjs声明了四族补丁。scripts/__tests__/shadcn-local-patches.test.ts里applyLocalPatches的调用面是:slider(4 条)dialog(2 条)UPSTREAM_DIALOG,注释自称 "a faithful excerpt")sheet(2 条)sidebar(2 条)sheet/sidebar的锚点因此只被两件事支撑着:盘上 marker 在(patchedComponents()那个循环),以及每周一次的联网pnpm shadcn:check。前者与锚点能不能对上 upstream 完全无关 —— 这正是 #4976 的机制:marker 齐全、verifyLocalPatches返回[]、测试全绿,而锚点钉的是一行本地编辑,从未匹配过任何 registry 响应。为什么判它休眠
用 shadcn-ui/ui 仓内逐字节签入的 registry JSON(
apps/v4/public/r/styles/default/*.json,HEAD8a7701ec27eb9cb8e0377db769fbe6d744113c52)实测四族:也就是说
sheet/sidebar的锚点现在是对的,只是这件事没有任何仓内断言在守;#4976 那次周检也只报了 slider 一个组件。所以是「未被覆盖的正确」,不是「已经坏了」。建议的修法
把 PR #4995 给 slider 加的那条断言推广开:把声明的补丁作用在 registry 逐字节内容上,结果必须逐字节等于我们发布的那个文件。从本地文件臆造的锚点无法满足它,所以它是能离线判死这一族的判据。每族需要一份 registry 逐字节 fixture(连同 URL / 仓内路径 / HEAD sha / content sha256 的 provenance 注释),然后
it.each(patchedComponents())化,顺带让「加了新族但忘了给 fixture」也变红。sidebar会额外贵一点:它的 upstream 文件很大(周检里 24 local line(s)),整份 fixture 不便宜 —— 需不需要为它破例、或者改用别的等价判据,值得单独判一下。备注
Blocked-by:PR fix(scripts): 把 slider 交付补丁的锚点重定到 upstream 实际提供的那一行 (#4976) #4995 合入前后都能独立做,只是合入后可以直接照抄那条断言的写法。pm:queue—— 观察类,交 PM 分诊定级。