Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

观察记录:release-metadata 发布期生成器已死(两仓零引用),PR #3688 删掉最后痕迹后该机制在全仓归零 —— 若重建须取真值而非入散文 #3692

Closed as not planned

Description

@yinlianghui

观察类记录,非当前用户会踩到的缺陷,不入 pm:queue。记录于 #3645 / PR #3688 期间,把测量留档以免后来者重新发明这台漂移机器。

测量(对 origin/main 复核,切点 9961df297)

标记行 release-metadata:v3.3.0(HTML 注释形式)曾由某个发布期生成器写入 35 个包 README,在每个 README 末尾生成一段 §Compatibility 块。该生成器已不存在:

# objectui
$ git grep -l "release-metadata"
→ 仅命中 35 个 packages/*/README.md 自身
→ scripts/ 、.github/ 、其余全仓:零引用

# objectstack
$ git grep -l "release-metadata"
→ 全仓零命中

即:没有任何工具会再生成、覆盖或校验这个块。

一条正交证据:标记与它界定的块已经解耦

packages/app-shell/README.md 的标记行孤悬在第 616 行,而它本该界定的 §Compatibility 在第 774 行 —— 相隔 158 行,中间被后来的编辑插进了 ## Command palette (⌘K) 等整章内容。

一个活着的生成器要么重新锚定标记、要么整块覆盖,不会容忍标记漂到离目标 158 行之外。这是"生成器已死"独立于 git grep 的第二个证据。

同族证据还有两条,都说明这块早已退化成手工文本:

  • packages/types/README.md 的 spec 行被手改成过 ^15.1.1(其余 34 个是 ^3.3.0)—— 即「35 个逐字相同」并不成立;
  • packages/cli/README.md 有完整的同款 §Compatibility 块但没有标记行,且标点风格不同(- **Node.js** ≥ 18 而非 - **Node.js:** ≥ 18)—— 像是更早一版生成器的产物,或手抄。

冻结代价(已由 PR #3688 清除)

块被冻结在 v3.3.0,仓库走到了 17.x,于是六行全部失真 —— 不止 #3645 正文指出的两行:

README 宣称 实际
@objectstack/spec ^3.3.0 27 个包锁 ^17.0.0-rc.5,零个锁 ^3.3.0
@objectstack/client ^3.3.0 全仓只有 data-objectstack 一个包依赖它(其余是幽灵行)
Node.js ≥ 18 根 engines.node 为 ">=22"
TypeScript ≥ 5.0 全仓 39 处声明均为 ^6.0.3
Tailwind CSS ≥ 3.4 实为 ^4.3.3 / ^4.2.1
React 18.x or 19.x 与 peerDependencies 手抄不同步(见 #3690)

给未来的约束(本记录的要点)

PR #3688 删掉最后痕迹后,release-metadata 在 objectui 全仓命中归零。若将来要重建发布期元数据注入,请遵守本次得到的两条:

  1. 取真值,不入散文。 版本号写进 README 正文的那一刻就保证了漂移 —— 这块用六行、跨十几个大版本证明了一次。要么从 package.json(engines / peerDependencies / dependencies)在发布时取值生成,要么根本不写,让读者去看 npm 页上的 engines 与 peerDependencies(包管理器会在安装期强制它们,散文不会)。
  2. 逐包裁剪,不要全包统一模板。 上一版给 35 个包都印了 @objectstack/client,而实际只有 1 个包依赖它;Tailwind CSS ≥ 3.4 (for packages with UI) 里那个括号,本身就是模板在承认自己不逐包为真。

关联


Generated by Claude Code

Activity

  1. claude commented on Aug 7, 2026

    @claude
    Contributor

    Findings triage — verdict: CLOSE (not planned). The record is preserved here and stays searchable; the maintainer can reopen and this grading does not wait on approval.

    Why closed rather than held: there is no actionable half, now or on any trigger. The mechanism is at zero — release-metadata has no producer, no consumer and no validator in either repo, and PR #3688 removed the last 35 traces — so nothing can regress, drift further, or come due. What the card actually contains is two design constraints addressed to a rebuild that may never be proposed, and finding is a held state waiting for a verdict, not an archive shelf. Holding it would mean carrying an issue with no restart condition that could ever legally fire, which is the exact state the label discipline forbids.

    The measurement is good work and is not being discarded — it is why the close is the right shape rather than a quiet drop. Restated so it survives in the closing record:

    1. Take real values, do not write prose. Version literals in README bodies guarantee drift; this block proved it six lines deep across a dozen majors (^3.3.0 spec pins vs. 27 packages on ^17.0.0-rc.5; Node ≥ 18 vs. root engines.node: ">=22"; TS ≥ 5.0 vs. 39 declarations of ^6.0.3; Tailwind ≥ 3.4 vs. ^4.3.3/^4.2.1). Generate from package.json (engines / peerDependencies / dependencies) at publish time, or write nothing and let npm show engines and peerDependencies — the package manager enforces those at install, prose never does.
    2. Trim per package; no uniform template. The dead generator printed @objectstack/client into 35 READMEs when exactly one package depends on it, and the parenthetical in Tailwind CSS ≥ 3.4 (for packages with UI) is the template conceding it is not per-package true.

    The orthogonal evidence is worth keeping too, because it is the transferable part: a marker line 158 lines away from the §Compatibility block it delimits (packages/app-shell/README.md:616 vs :774) is proof of a dead generator independent of git grep — a live one re-anchors or overwrites wholesale. Same for the two divergence samples (packages/types/README.md hand-edited to ^15.1.1; packages/cli/README.md carrying the block with no marker and different punctuation), which falsify the "35 identical copies" assumption on their own.

    The live half of this family is elsewhere and stays open — this close does not drop it:

    Anyone proposing a publish-time metadata generator should read this issue first — that is what closing it costs, and it is nothing.

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions