Skip to content

docs(changelog): RFC-014 那条的源码引用钉到当时的提交(现在指向一个 15 行文件的第 253 行) - #834

Open
vansin wants to merge 1 commit into
mainfrom
docs/changelog-pin-historical-sha
Open

docs(changelog): RFC-014 那条的源码引用钉到当时的提交(现在指向一个 15 行文件的第 253 行)#834
vansin wants to merge 1 commit into
mainfrom
docs/changelog-pin-historical-sha

Conversation

@vansin

@vansin vansin commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

#831确定失效的那两处(唯一与判据无关、可 100% 断定坏掉的两条)。

问题

中英 changelog 都指向 blob/main/server/src/index.ts#L253

$ git show origin/main:server/src/index.ts | wc -l
15

#438index.ts 改成了 15 行的 run-entry shim(「All real code lives in ./server.ts」),所以这个链接指到一个不含任何逻辑的文件末尾之外 238 行

改法:钉当时的提交,不是更新行号

改为 blob/22ed1886/server/src/index.ts#L253

写之前先验了它指得到(这正是 #831 要说的事,不能自己再造一个坏指针):

22ed1886 的 index.ts 行数 = 1623        → #L253 有效
:253 = if (typeof row?.disk_avail_gb === "number" && row.disk_avail_gb < 1) …
:253-326 区间 disk_*_gb 命中 = 6

正是这条 changelog 描述的内容(disk 三字段 + alert)。而 22ed1886 的提交信息里自己就写着 verify server/src/index.ts:253-326 —— 当时确实在那里。

为什么是「换 ref」而不是「换行号」

病因不是行号漂了,是 ref 选错了。

changelog 条目描述的是一个冻结的历史时刻,却指向会移动的 main。这样的链接必然烂,而且无声地烂。换成当时的 SHA 之后,它永远成立。

这与参考页(api/rest.md 等)的修法相反:那边该改钉符号,因为它描述的是「现在的行为」;changelog 描述的是「当时发生了什么」,该钉当时的 commit

把两者混为一谈会修错 —— 给 changelog 更新行号,下次重构又坏。

范围

只动两个 changelog 文件各一行,#810 无文件重叠(那条动的是 api/rest.md)。#831 里其余那批(72 处判为漂,集中在 tools.ts / api/rest.md)不在本 PR,它们属于「改钉符号」那一类,且会与 #810 冲突,应在 #810 收口后一并处理。

changelog 中英两处都指向 blob/main/server/src/index.ts#L253。这个链接
现在指到一个只有 15 行的文件的第 253 行 —— 因为 #438 把 index.ts 改成了
run-entry shim,真实代码搬到了 server.ts:

  // Run-entry shim (#438 corrective).
  // All real code lives in ./server.ts …

改钉 22ed188(写这条 changelog 的那次提交)。核过:那时 index.ts 有
1623 行,:253 正是这条 changelog 描述的 disk 告警逻辑
(disk_avail_gb < 1 → red),:253-326 区间里 disk_*_gb 出现 6 次。

病因不是"行号漂了",是 ref 选错了:changelog 条目描述的是一个冻结的
历史时刻,却指向会移动的 main —— 这样的链接必然烂,而且是无声地烂。
换成当时的 SHA 之后,它永远成立。

这与参考页(api/rest.md 等)的修法不同:那边该改钉符号,因为它描述的是
"现在的行为";changelog 描述的是"当时发生了什么",该钉当时的 commit。
把两者混为一谈会修错 —— 给 changelog 更新行号,下次重构又坏。

详见 #831
@vansin

vansin commented Aug 13, 2026

Copy link
Copy Markdown
Contributor Author

@codex review

本 PR 至今无审查记录。(开 PR 未必触发,#833 上实测显式 @ 是有效的。)

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Breezy!

Reviewed commit: 6910903604

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@vansin

vansin commented Aug 13, 2026

Copy link
Copy Markdown
Contributor Author

@codex review

本 PR 至今零审查记录(自动审查器只在开 PR / 草稿转就绪 / 显式 @ 时触发,push 不触发)。这是第二次请求。

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Swish!

Reviewed commit: 6910903604

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@vansin

vansin commented Aug 13, 2026

Copy link
Copy Markdown
Contributor Author

提醒:这个 PR 与 #843(文档行号 pin 的下限门)有一处硬耦合

我在 #843 里加了 docs/doc-source-pins-baseline.txt,记录已知失效的行号 pin,语义是只许缩小:某条对应的引用从文档里消失了,门会要求把它从基线里删掉,不删就红。

这个 PR 恰好会让基线里的条目消失:

  • index.ts#L253 重锚到不可变 SHA 22ed1886(门按设计跳过钉了 SHA 的引用,所以它不再算「present」)

所以合并顺序上有一个动作项:

我在 #845 的树上模拟跑过,完整输出贴在 #843 的这条评论

不做的话,表现是「一个只改文档的 PR 把 CI 弄红了」,而红的原因看起来跟它毫无关系 —— 这条提醒的价值就在这里。

vansin pushed a commit that referenced this pull request Aug 13, 2026
上一轮我在 #843/#810/#834 上贴了一条跨 PR 耦合提醒:那两个 PR 一合,基线里
对应的条目会变 stale,门就红在「请从基线里删掉」。提醒是散文,执行的人还是
得自己去数该删哪几条 —— 把一个机械操作交给了记忆力。

这一轮把它变成一条命令:

  python3 scripts/check-doc-source-pins.py . --write-baseline

🔴 这个开关离「一键把门变绿」只差一个条件判断,所以它**只许缩小**:
   重算若会引入基线里没有的条目(= 出现了新的失效 pin),它拒绝写并退出非零。
   新失效该做的是把链接改对,不是追认进基线。

L7 两个方向都断言,不只测它能用:
  ① 干净树:不改写,报「基线已经是最新的」,且文件字节未动
  ② 注入一个新失效 pin:必须拒绝(rc≠0),且**确认基线没被写**
     —— 只断言"它红了"不够,要断言"它红了而且没写"
  ③ 造一个「引用消失」场景(把某条 pin 的引用改钉不可变 SHA):
     必须删对、条数变小、表头注释保留、门随后转绿

顺带在门红的提示里直接给出这条命令,不让人再去翻文档。

验证(容器内,--network none):
  [L7] ① 干净树:不改写,报「已是最新」
       MUTATION_RED write-baseline-refuses-new-failure rc=1
       ③ 引用消失时删对了(5 → 4),表头保留,门转绿
       复原后回绿 ✓
  RESULT: PASS  退出码 0

一处说明:这个改动逻辑上属于 #843 的脚本,但落在链尾(#845)。理由是 #843#844#845 是一条依赖链,改在链首要把两级重新合并重跑一遍;而三个 PR 是按序
合进 main 的,落在链尾到达 main 的时间相同。写在这里免得有人以为放错了地方。
@vansin

vansin commented Aug 13, 2026

Copy link
Copy Markdown
Contributor Author

补充上一条提醒:现在不用手工数该删哪几条了 —— 合并后跑 python3 scripts/check-doc-source-pins.py . --write-baseline 即可,它只许缩小(出现新失效会拒绝写)。实现与断言见 #843 的这条评论

@vansin vansin left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

结论:改对了,建议合并。下面是我逐条核过的证据,外加一处同类漏网(不挡这次合并)

前提属实

origin/mainserver/src/index.ts 只有 15 行 —— #438 之后它变成了 run-entry shim
(process.env.COMMHUB_SERVER = "1" + 动态 import ./server.js)。所以 #L253 确实是死指针。

新 pin 精准

  • 22ed1886 可达,且 origin/main 的祖先(git merge-base --is-ancestor 通过),
    所以 GitHub 上这个 blob 链接不会 404 —— 我实打了一次:HTTP 200
  • 该 SHA 日期 2026-05-17,与这条 v0.10.2 changelog 同期。
  • 该 SHA 上 server/src/index.ts1623 行,253-258 实际内容:
253:  if (typeof row?.disk_avail_gb === "number" && row.disk_avail_gb < 1) alerts.push(...)
254:  if (alerts.length > 0) return { level: "red", alerts };
256:  if (pct !== null && pct >= 60) alerts.push(`cpu ${pct}%`);
257:  if (typeof row?.mem_avail_gb === "number" && row.mem_avail_gb < 1) alerts.push(...)
258:  if (typeof row?.disk_avail_gb === "number" && row.disk_avail_gb < 5) alerts.push(...)

和正文那句「alert_leveldisk < 1GB critical / < 5GB warn 触发」逐字对得上。

顺带一提,22ed1886 自己的提交信息里就写着
verify server/src/index.ts:253-326 —— 选的正是当时那次改动的提交,溯源很干净。

范围也是对的

我把两份 changelog 里所有 blob/main/…#L<n> 都抽出来,按「main 上该文件的行数 vs 引用行号」判死活:

✓ agent-network/bin/cli.ts L61   (共 13399 行)
✓ agent-network/bin/cli.ts L2589 (共 13399 行)
❌ server/src/index.ts L253      (只有 15 行)

越界的就这一条,这个 PR 修的正是它,没有漏。


🔴 同类漏网:两条「在范围内但已经指错」的引用(建议后续单开,不挡这次)

「行号在范围内」不等于「指对了」。上面那两条 cli.ts 引用都在 changelog 同一行(713 行),
main 的行号钉,现在都已经静默漂移:

changelog 声称 origin/main 上第几行真的是它 该行号现在实际是什么
cli.ts:61 = PINNED_SERVER_VERSION 791 (const PINNED_SERVER_VERSION = "0.9.0-preview.29";) } from "../src/opencode-preset";
cli.ts:2589 = bunx --bun @sleep2agi/commhub-server@… 5765 (const serverArgs = ["--bun", ...]) anet opencode auth-login <n> --provider <anthropic|openai> 的帮助文本

这两条和本 PR 修的是同一种失效,只是因为没越界所以看上去还活着 —— 越界那条会被一眼看出来,
这两条不会。同一段落里三条引用、三条都坏了,只是坏法不同。

改法和本 PR 一致:钉到当时的提交(而不是 main)。
另外 PINNED_SERVER_VERSION 那条正文说「仍 hardcode 0.8.0」,而 main 上现在是
0.9.0-preview.29 —— 那是历史记录、本就该定格在当时,这也正是钉 SHA 的理由。

@vansin

vansin commented Aug 15, 2026

Copy link
Copy Markdown
Contributor Author

钉到哪个 commit,是查出来的,不是猜的(fix/850-out-of-range-index-pins @ 1bcf9c71)

本 issue 说的那条:changelog 第 661 行讲
/api/server/:host/health 带 disk 三字段 + alert_level 加 disk < 1GB critical」,
链接却是 blob/main/server/src/index.ts#L253,而 main 上那个文件只有 16 行

第一步:它是什么时候被掏空的

7fa3ad35  2026-07-29  2538 行   ← 最后一次它还有代码
59ac5eaa  2026-07-29    11 行   ← #438「显式启动函数 startHub()」把它掏空
dd502f9f  2026-08-10    15 行
(现在 16 行)

🔴 第二步:但不能直接钉 7fa3ad3

那是我第一反应 —— "钉到掏空之前那一刻"。去看了那个 commit 的第 253 行:

sql += ` AND ${column} = ?${params.length + 1}`;      // ← 250
params.push(scope.networkId);
} else if (scope.networkIds) {                         // ← 253 附近全是 SQL scope 过滤

是 SQL scope 过滤,和 changelog 说的 disk/health 毫无关系。
行号落在文件范围内,不等于内容对得上。 这正是本 issue 家族(#850)反复出现的那一类。

第三步:按内容找

git log -S 'disk_avail_min' -- server/src/index.ts 找那段代码是哪次进来的:

e575cc62  2026-05-16  1596 行  feat(server): add server health and agent detail endpoints
  第 253 行: if (typeof row?.disk_avail_gb === "number" && row.disk_avail_gb < 1)
               alerts.push(`disk ${row.disk_avail_gb}G…

与 changelog 的措辞逐字对应(alert_level / disk < 1GB critical)。
e575cc62,中英两份 changelog 各一处。

顺带修掉 6 处同类(它们连"越界"都不是)

docs-site/docs/{,en/}guide/{architecture,dashboard}.md 里 6 处
blob/main/server/src/index.ts —— 不带行号,所以解析得到、任何链接检查器都全绿,
指向的却是那个 16 行空壳。已改指 server.ts;锚文本里写着 index.ts 的一并改
(只改目标会造出"文字与目标矛盾",而那正是我本轮前一条 commit 刚修掉的形态)。

验证

仍指 blob/main/server/src/index.ts 的 md:0 处
新写的 ANCHOR-TARGET 门:OK(359 个 .md,无锚文本/目标不一致)

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants