test(scripts): doc-version-claims 扫描面加上 skills/,四处脚手架字面量入锚 (#4981) - #5084
Merged
Conversation
SCAN_ROOTS 一直只有 content/docs 与 packages/*/README.md。skills/objectui/** 是 agent 在生成项目前读的那一面,18 个 markdown 文件里的版本字面量从未被 任何门禁读过:check-skills-paths.mjs 走同一棵树但判路径,check-doc-links.mjs 根本没有 skills 行,scripts/ 里读版本的只有本文件一个。 扩面后在 6098ecd 上实测命中 12 条 claim,逐条入册: - 4 条化石(#4981 的内容 PR 修):typescript ^5.0.0、vite ^6.0.0、 @vitejs/plugin-react ^4.0.0、lucide-react ^0.400.0。 - 1 条 stale(另开 #5081):i18n.md 把 label 规则归给 @objectstack/spec v4, 仓内 33 处声明都是 ^17.0.0 —— 13 个 major,与 #3708 修掉的那条同形。 - 其余为 AGENTS.md 镜像下来的能力下限与读者自有的范围,按类记账。 入锚判据(两种页面,分别说明,见文件头新增小节): - plugin-development.md 的骨架就是 #3855 那个形状(@object-ui/plugin-my-widget、 四个 workspace:* 依赖、vite build),lucide-react 走 skeletonDep;锚实测 16/19 个 plugin 清单一致 ^1.31.0(全仓 23 处一致)。卡面估的是 9 个 —— 9 会掉到「至少 10 个声明」的下限之下、只能记账不能校验,所以这个数必须实测。 - project-setup.md 教的是独立应用(依赖全是 latest),不是 in-workspace 插件。 三条仍然入锚,理由是实测的仓内唯一性而不是「它是插件」:typescript 40/40、 vite 29/29、@vitejs/plugin-react 27/27,plugin 清单只是这个全仓一致集的子集。 两者若将来分叉该怎么办,写进了文件头与断言的红字里。 - react / tailwindcss / @tailwindcss/vite 不入锚,判据写在文件头:仓内要么 只有精确 pin(react 19.2.8,与页面的 caret 不是同一种陈述),要么一处声明 都没有(@tailwindcss/vite,本仓走 @tailwindcss/postcss)。 Co-authored-by: Claude <noreply@anthropic.com>
上一版写成「33 manifests declare ^17.0.0」。实测 33 是**声明处**数 (20 dependencies + 12 devDependencies + 1 peerDependencies),分布在 31 个 清单里。门禁文件里的数字是给下一个读者当证据用的,含糊的计数会让复核走偏。 Co-authored-by: Claude <noreply@anthropic.com>
Collaborator
Author
|
PM 验收:ACCEPT(待前置)—— 保持 draft,PR #5080 合入转绿后再三件套(session 实物核验:merge-base 验收判定(按报告与分支实读):
Blocked-by: PR #5080(人合车道)。其合入后本 PR 应转绿;PM 届时复核终态再转 ready + auto-merge。若维护者在 #5080 上取 lucide-react 删行(B),本 PR 对应条目一并删除后再走流程。 Generated by Claude Code |
This was referenced Aug 17, 2026
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.
Fixes #4981
Blocked-by: #5080 (内容半,人合车道)
本 PR 不含 PR #5080 的 diff(独立自
origin/main@6098ecd08)。PR #5080 合入前请勿挂 auto-merge —— 本 PR 的 CI 会在不含它的 main 上跑,预期红,见下方「反向验证 ①」。洞
SCAN_ROOTS一直是两条:content/docs与packages/*/README.md。skills/objectui/**那 18 个 markdown 是 agent 在生成项目前读的面,从来没有任何门禁读过它们的版本字面量:check-skills-paths.mjs走同一棵树但判路径,check-doc-links.mjs连skills行都没有,grep 完scripts/之后读版本的只有这一个文件。受害面的差别是这条卡的要点 ——content/docs的化石让一个人构建失败,脚手架指南的化石每次生成都被复制进用户仓库一遍。扩面后实测(6098ecd):命中 12 条,不是 4 条
卡面列了 4 条,扫描面实际命中 12 条,全部逐条入册(棘轮要求每条字面量都有条目):
SKILL.md:97的React 18+/TypeScript 5.0+unanchored—— 从 AGENTS.md 第 2 节逐字镜像下来的能力下限,同troubleshooting.md既有条目;只改 skills 这一份会让两份 agent 面文本脱同步i18n.md:117,162把 label 规则归给@objectstack/specv4,仓内 33 处声明全是^17.0.0stale—— 13 个 major,与 #3708 修掉的那条同形。另开 #5081,不在本卡内改(修法是「改成 v17」还是「删掉版本限定语」,是另一个判断)react ^19.0.0、`react ^18.0.0入锚判据:两种页面,分开说(这是本 PR 最需要复核的一段)
分诊评论把「三条现成锚」派给
project-setup.md、把lucide-react留给KNOWN_CLAIMS,并援引卡面「standalone 指南 vs in-workspace 锚集」的告诫。实测把这个分配反过来了,我按证据实施并在此报告:①
lucide-react反而是最干净的入锚对象。plugin-development.md的那个package.json块正是 #3855 描述的形状:块名@object-ui/plugin-my-widget,四个@object-ui依赖全是workspace:*,构建脚本vite build—— 这样拼写的清单只在这个 workspace 里解析得开,所以那个范围是本仓的,不是读者的。锚实测 16/19 个 plugin 清单声明lucide-react且 16 个全是^1.31.0(全仓 23 处一致)。skeletonDep既有的「至少 10 个声明」下限之下 —— 那样这条只能记账、不能校验。这个数必须实测,否则会因为一个过时的读数把一条本可入锚的行降级。这也是那条下限的价值:它用计数决定条目的类,所以计数不能靠引用。② 卡面的告诫落在
project-setup.md上,那正是分诊要入锚的三条。 那个块不是插件:依赖全是"latest",整页没有一处 workspace 协议,是独立应用。这三条仍然入锚,但理由换成了实测的仓内唯一性,而不是「它是插件」:声明这三个依赖的清单中,typescript40/40^6.0.3、vite29/29^8.2.1、@vitejs/plugin-react27/27^6.0.5(仓根、apps/console、examples/console-starter与 plugin 包一致),断言读的 plugin 集是这个全仓一致集的真子集。所以钉住的是「本仓对这个依赖只有一个范围」,不是「plugin 包的私有选择」。残留风险照直写进了文件头和断言红字:若将来 plugin 包搬到一个不该推荐给独立消费者的工具链,这条断言会把那一页判红,而那不是那一页的缺陷。届时的答案是把这三条改类、或给它们自己的锚集(
apps/console+examples/*starter,今天只有 3–4 个声明者,过不了现有下限),而不是把它们降成sample—— 那个类正是让三个 major 的漂移在content/docs/guide/plugins.md里躺了几个月的原因。③ 不入锚的判据(写进文件头):一条字面量可入锚,当且仅当本仓对该依赖只陈述一个范围,且文档那一行是同一种陈述。
react过不了后半条 —— 本仓精确 pin19.2.8(为测试解析确定性),页面给的是消费者的 caret 范围,「文档必须写 19.2.8」是把坏建议机械化。@tailwindcss/vite过不了前半条 —— 本仓零处声明它(走@tailwindcss/postcss),没有可比对的东西。反向验证(预判先写,读数如下)
预判:① 扩面后的门禁在未修的 main 树上必须恰好红那 4 行;② 本地并入 PR #5080 后必须全绿。
① 未修树(本分支原样,
skills/仍是化石)—— 4 行命中,但红的是 3 个测试而不是 2 个,其中一个和我的预判不一样,如实报告:records every version literal)红,恰好 4 行,不多不少:no entry may outlive the claim it excuses)红,同样 4 条,从另一侧报同一批事实 —— 我的条目按修好之后的值做 key,在未修树上「不在树里」。absent会被跳过,棘轮是唯一报告者」。比对循环确实一个 failure 都没产出(这半对了),但断言里的空转下限红了 —— 我把stated.length的下限从 3 提到了 7(修好后的实测值),未修树上只有既有的 3 条能解析出行:② 本地并入 PR #5080 后(
git merge --no-commit --no-ff,验证后git merge --abort,未进 commit):同一棵合并树上跑整个 scripts 套件也全绿(证明扩面没有波及别的门禁):
CI 预期
本 PR 的 CI 在不含 #5080 的 main 上跑,
doc-version-claims会红在上面那 3 个测试上 —— 这是预期红,不是回归。⛔ 没有把KNOWN_CLAIMS写成化石值来换绿:那会让门禁把化石祝福成正确值,正是这张卡要修的东西。#5080 合入后本 PR 转绿,届时再转 ready。其它验证
pnpm run type-check:scripts(tsconfig.scripts.json,覆盖被改文件)→ 无输出即通过pnpm exec turbo run type-check --concurrency=2→Tasks: 81 successful, 81 totalpnpm exec eslint scripts/__tests__/doc-version-claims.test.ts→ 无输出node scripts/check-control-bytes.mjs→ OK(4520 个文件);改动文件grep -naP控制字节自扫无命中一处顺手更正
ClaimKind的restatement注释写着「最大的一类(13 of 21)」—— 本 PR 之前实际已是 14/23,加了 11 条之后是 14/34。只改了这个括号里的数,没动那句话的论断(restatement 仍是最大的一类)。Generated by Claude Code