观察类记录,非当前用户会踩到的缺陷,不入 pm:queue。记录于 #3689(修 content/docs/utilities/cli.mdx 兼容表)期间。
事实
#3689 正文自己点破了这个洞:
content/docs 是 scripts/check-doc-links.mjs 的第 1 个扫描根,但该门禁只校验链接可达性,不校验版本事实,所以不会被任何现有门禁发现。
那一族失真(@objectstack/spec ^3.3.0、Node ≥ 18)现在已经清完:PR #3688 删掉 36 个包 README 的生成块,#3689 的 PR 处置了站点文档侧最后一处。清到零了,但守不住这个零。
测量:现有门禁没有一条看版本字面量
scripts/ 下的门禁全清单,逐条核过它们的判据:
| 门禁 |
判据 |
看版本字面量? |
check-doc-links.mjs |
链接可达性(7 个扫描根,含 content/docs 与 packages/*/README.md) |
❌ |
check-control-bytes.mjs |
控制字节 |
❌ |
check-i18n-call-site-keys.mjs / check-i18n-en-drift.mjs |
i18n key / 英文文案漂移 |
❌ |
check-spec-symbol-derivation.mjs |
spec 符号派生 |
❌ |
check-lint-coverage.mjs / check-type-check-coverage.mjs |
脚本覆盖面 |
❌ |
check-changeset-fixed.mjs / check-changeset-no-major.mjs |
changeset 形状 |
❌ |
即:content/docs 与 packages/*/README.md 这两个面上,任何人写一句 "requires Node ≥ 18" 或 "@objectstack/spec ^3.3.0",今天都是全绿通过。这两个面上一次被写脏,代价是 36 个 README + 1 个站点页面冻结在一个跨了十几个大版本的版本号上。
仓内已有同形状的门禁先例
这不是要发明新机制:check-i18n-en-drift.mjs + scripts/i18n-en-drift-baseline.json 已经是「基线化漂移门禁」的成熟形状 —— 基线记录当前状态,新增的漂移变红。版本字面量门禁可以是同一形状,基线为零。
关键设计约束(这条不是一行 grep 就完事的原因)
门禁必须能区分「当前宣称」与「历史叙述」,否则会误伤正确的内容:
content/docs/guide/release-notes.md:41 —— Bump every @object-ui/* dependency to ^3.3.0,是 v3.3.0 那次升级动作的记录;
- 同文件
:58 —— | Node.js | ≥ 18 |,在 ## v3.3.0 — 2026-04-17 标题下的 ### Compatibility Matrix 里,是那一次发布当时的兼容矩阵。
两处都是正确的历史记录,#3689 已明确判定不改,#3689 的 PR 也一行未动。一刀切禁掉版本字面量会把它们判红。可行的切法之一:按「是否落在版本号标题(## vX.Y.Z)的小节内」豁免 —— 但这属于实现取舍,留给分诊与实现者定,我不在这里替它拍板。
定级
按纪律不自评。倾向观察类:今天全仓该类宣称为零,读者当下踩不到,这条记的是回归风险而非现存缺陷。
已搜重
version drift docs gate、check-doc-links version fact content/docs、scripts/check-doc-links.mjs、版本号 散文 漂移 四组关键字搜过开放 issue:仅命中 #3689 自身与 #3692,无重复。
与 #3692 相邻但不同:#3692 记的是「release-metadata 发布期生成器已死,若将来重建须取真值而非入散文」—— 约束对象是一个不存在的生成器;本条记的是「今天没有任何东西阻止一次手写把版本号重新写进文档散文」—— 约束对象是人和 agent 的日常编辑。故单列而非在 #3692 下追评。
关联
Generated by Claude Code
观察类记录,非当前用户会踩到的缺陷,不入
pm:queue。记录于 #3689(修content/docs/utilities/cli.mdx兼容表)期间。事实
#3689 正文自己点破了这个洞:
那一族失真(
@objectstack/spec^3.3.0、Node ≥ 18)现在已经清完:PR #3688 删掉 36 个包 README 的生成块,#3689 的 PR 处置了站点文档侧最后一处。清到零了,但守不住这个零。测量:现有门禁没有一条看版本字面量
scripts/下的门禁全清单,逐条核过它们的判据:check-doc-links.mjscontent/docs与packages/*/README.md)check-control-bytes.mjscheck-i18n-call-site-keys.mjs/check-i18n-en-drift.mjscheck-spec-symbol-derivation.mjscheck-lint-coverage.mjs/check-type-check-coverage.mjscheck-changeset-fixed.mjs/check-changeset-no-major.mjs即:
content/docs与packages/*/README.md这两个面上,任何人写一句 "requires Node ≥ 18" 或 "@objectstack/spec^3.3.0",今天都是全绿通过。这两个面上一次被写脏,代价是 36 个 README + 1 个站点页面冻结在一个跨了十几个大版本的版本号上。仓内已有同形状的门禁先例
这不是要发明新机制:
check-i18n-en-drift.mjs+scripts/i18n-en-drift-baseline.json已经是「基线化漂移门禁」的成熟形状 —— 基线记录当前状态,新增的漂移变红。版本字面量门禁可以是同一形状,基线为零。关键设计约束(这条不是一行 grep 就完事的原因)
门禁必须能区分「当前宣称」与「历史叙述」,否则会误伤正确的内容:
content/docs/guide/release-notes.md:41——Bump every @object-ui/* dependency to ^3.3.0,是 v3.3.0 那次升级动作的记录;:58——| Node.js | ≥ 18 |,在## v3.3.0 — 2026-04-17标题下的### Compatibility Matrix里,是那一次发布当时的兼容矩阵。两处都是正确的历史记录,#3689 已明确判定不改,#3689 的 PR 也一行未动。一刀切禁掉版本字面量会把它们判红。可行的切法之一:按「是否落在版本号标题(
## vX.Y.Z)的小节内」豁免 —— 但这属于实现取舍,留给分诊与实现者定,我不在这里替它拍板。定级
按纪律不自评。倾向观察类:今天全仓该类宣称为零,读者当下踩不到,这条记的是回归风险而非现存缺陷。
已搜重
version drift docs gate、check-doc-links version fact content/docs、scripts/check-doc-links.mjs、版本号 散文 漂移四组关键字搜过开放 issue:仅命中 #3689 自身与 #3692,无重复。与 #3692 相邻但不同:#3692 记的是「release-metadata 发布期生成器已死,若将来重建须取真值而非入散文」—— 约束对象是一个不存在的生成器;本条记的是「今天没有任何东西阻止一次手写把版本号重新写进文档散文」—— 约束对象是人和 agent 的日常编辑。故单列而非在 #3692 下追评。
关联
@objectstack/spec^3.3.0,实际全仓锁 ^17.0.0-rc.5;部分包还列了自己并不依赖的@objectstack/client#3645 / PR docs(packages): 退役 36 个包 README 里已死的 release-metadata §Compatibility 生成块 #3688 —— 包 README 侧的清理。@objectstack/spec^3.3.0(实为 ^17.0.0-rc.5)与 Node ≥ 18(根 engines 为 ">=22") #3689 —— 站点文档侧的清理(本条的发现语境)。Generated by Claude Code