Uh oh!
There was an error while loading. Please reload this page.
test(cli,create-plugin): 两处生成器锚规则改累积报全部漂移,前置与漂移分开 (#4974) - #4993
Conversation
`packages/cli` 的 `sources every range from this repo instead of inventing one` 与 `packages/create-plugin` 的 `sources every devDependency range from this repo instead of inventing them` 都在 `for` 循环里逐名 `expect`。`expect` 失败即抛,所以一次只报第一个 不匹配的名字,而表是插入序遍历的 —— 被报的是「谁排在前面」,不是「谁更严重」。 代价兑现过两次:#4098 有五个同窗 bump 藏在第一个后面;#4968 里 `lucide-react` 排在 `postcss`/`react`/`tailwindcss`/`typescript`/`vite` 之前,遮住后面六个名字的判定, 只能另写脚本才敢说这批到底漂了几处。跨包那半更贵:create-plugin 那处当时在 `main` 上也是红的,但按包边界扫 cli 时没有任何东西报它,落地后仍要第二轮。 两处都改成两趟: - 前置断言(锚必须能解析:名字至少被一个生成器声明、`root` 锚在根清单里、仓内区间 必须一致)保持首败即抛,并且整趟跑在任何区间比对之前 —— 前置败时不产出任何漂移行, 不与漂移串扰。锚不可解析时也没有可累积的期望值。 - 漂移断言累积后一次报空集,逐条带生成器、名字、实得区间与应得区间。 顺带把两张锚表的文档块补上「范围规则只判本表内的名字、完备性规则要求生成清单的键集 恰好等于本表」这一对互补关系 —— 两条规则分居两个 `it`,读任一处都看不到另一处。 Co-authored-by: Claude <noreply@anthropic.com>
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
yinlianghui
commented
Aug 17, 2026
PM 验收 ✅ ACCEPT(#4974,批次 20) 实物核验(merge-base CI 亲读:20/20 check runs completed,零失败(两项 path-filter skipped 计绿)。 反向验证读数:核心验收成立且旧形态的遮蔽被直接测量 —— 同一个三处同窗漂移变异,新形态一轮全报 5 行,base 版旧形态只报 2 条、typescript 三份清单一字不报。②b(前置名次在后 + 漂移名次在前)是 dev 自加的半边,证明了「分开」若仍交错会把仓内分裂整条藏住 —— 比卡面要求更强的形态有实测必要性支撑,deviation 记账成立。基线未 rebase 但用 串台警报的 PM 核实:main 上 undraft + auto-merge(squash)。 Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Fixes#4974
现象与根因
全仓两个「生成器模板区间 = 仓内区间」的 ratchet 规则,都在
for循环里逐名expect:packages/cli/src/__tests__/app-generator.test.ts—sources every range from this repo instead of inventing one(DEPENDENCY_ANCHORS,22 个名字 × 三份生成清单)packages/create-plugin/src/__tests__/templates.test.ts—sources every devDependency range from this repo instead of inventing them(DEV_DEPENDENCY_ANCHORS,8 个名字)expect失败即抛,表又是插入序遍历的,所以一轮只报第一个不匹配的名字,而被报的是「谁排在前面」,不是「谁更严重」。这条代价兑现过两次:#4098 有五个同窗 bump 藏在第一个后面;#4968 里lucide-react排在postcss/react/tailwindcss/typescript/vite之前,遮住后面六个名字的判定 —— 当时只能另写脚本把两张表全量算一遍,才敢说这批 dependabot 到底漂了几处。改法:两趟,前置与漂移分开
两处都拆成两趟(卡面要点 1):
root锚必须在根清单里」「仓内区间必须一致」都是关于仓库状态的前提,保持首败即抛;并且整趟跑在任何区间比对之前。锚不可解析时本来也没有可累积的期望值,更重要的是:前置败时不产出任何漂移行,不会让读者以为模板错了(见反向验证 ②)。顺带把两张锚表的文档块补上那对互补关系(卡面末段):范围规则只判本表内的名字,完备性规则要求生成清单的键集恰好等于本表 —— 两条规则分居两个
it,读任一处都看不到另一处。反向验证(方向先预判,后跑;commit 后变异,
git checkout还原)① 同时漂多处(核心验收,复刻 #4968 形状) —— 把 cli 侧
lucide-react改回^1.29.0、typescript改回^5.9.3(排位在 lucide 之后,正是旧形态下被遮的那一类),create-plugin 侧@testing-library/jest-dom改回^7.0.0。预判「一轮全报」,实测新形态一次运行给出:同一变异下把两个测试文件换回 base sha 的旧版本(源码变异不动),旧形态实测:
——
typescript的三份清单一个字都没报。这就是「一轮修一个」的直接测量。② 前置破坏 → 只红前置、不红漂移,两半都跑了:
DEPENDENCY_ANCHORS删掉typescript一行。预判「完备性红、漂移绿」,实测1 failed | 40 passed:红的只有keeps all three generated dependency maps under one anchor table(报文点名多出的typescript),漂移那条绿 —— 该名字退出判定面,不产出任何漂移行,也不冒充漂移。lucide-react改成^1.30.0(制造仓内分裂,表内第 15 位),同时让@tailwindcss/postcss(第 10 位)漂。预判「新形态只报前置」,实测新形态报文只有in-repo manifests disagree on lucide-react: {…} — settle on one range first,没有一条 postcss 漂移行;旧形态同一变异只报routed manifest's @tailwindcss/postcss must match its in-repo range: expected '^4.1.18' to be '^4.3.3',仓内分裂完全不可见 —— 照旧形态报文去改模板,改完会再撞上「锚本身有歧义」,正是卡面担心的串扰误导。③ 单漂对照(报文可读性等价) —— 只漂
lucide-react。新形态routed manifest's lucide-react: ^1.29.0 must match its in-repo range, ^1.31.0;旧形态routed manifest's lucide-react must match its in-repo range: expected '^1.29.0' to be '^1.31.0'。名字、锚来源、实得、期望四项齐全,信息量未减,只是从 vitest 的Object.is差异挪进报文的一行。刻意没动的一处
同文件的
writes a manifest whose @object-ui ranges name this CLI version也是逐名expect(9 个平台包,末尾另有一条 lucide 断言)。没改,理由是它判的是同一批事实:那 9 个区间同出一源(CLI 自身版本),而 lucide 那条与本 PR 改过的累积规则重合 —— 任何一处漂移都会被上面那条断言完整列出,所以此处遮蔽不增加修复轮数。它的另一个问题(取仓内区间的任意一员而不断言一致性)已单独立卡 #4991,不并入本 PR。测试
另对改动的三个文件做了一次控制字符自扫(超出该门扫描面的那些码位),零命中。changeset 为测试-only 的空 frontmatter 声明,照
.changeset/app-shell-props-block-4808.md先例。Generated by Claude Code