Skip to content

[finding] shadcn 声明式补丁:sheet / sidebar 两族的锚点从未被「作用到 upstream」验证过 —— #4976 的同一盲区,目前休眠 #4996

Description

@yinlianghui

在做 #4976(PR #4995)时旁落的观察。当前休眠 —— 三族补丁今天都能正常作用到真实 upstream,没有用户会碰到;记下来是因为它是 #4976 那个失效族的同一个盲区,而 #4976 已经证明这个盲区能让一个死补丁在测试全绿的情况下活四个月。

事实

scripts/shadcn-local-patches.mjs 声明了四族补丁。scripts/__tests__/shadcn-local-patches.test.tsapplyLocalPatches 的调用面是:

有「作用到 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 不便宜 —— 需不需要为它破例、或者改用别的等价判据,值得单独判一下。

备注

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repopm:queuetooling

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions