docs(changelog): v0.10.1 那两条 cli.ts 引用钉到当时的提交(行号在范围内但已经指错) - #851
Conversation
changelog:713 的两条引用按 blob/main 钉行号,现在都已经指错了 —— 因为没有越界, 所以 #834 那种「文件行数 vs 引用行号」的判据抓不到它们。 cli.ts:61 声称是 PINNED_SERVER_VERSION → main 上真实在 791 行, 61 行现在是 } from "../src/opencode-preset"; cli.ts:2589 声称是 bunx commhub-server 启动点 → 真实在 5765 行, 2589 行现在是 opencode auth-login 的帮助文本 钉到 3a38720(2026-05-17),不是修复提交 4d24024,理由: 两个提交上 L61 / L2589 都精确命中,但 3a38720 是 4d24024 的父提交, 它的 PINNED_SERVER_VERSION 值是 "0.8.0" —— 正是正文描述的那个 bug 状态 (「仍 hardcode 0.8.0」「实际 bunx --bun @sleep2agi/commhub-server@0.8.0」)。 钉修复后那次会让链接显示 0.8.2,和正文对不上。 3a38720 是 origin/main 的祖先,blob 链接实打 HTTP 200。
|
独立窄审(通信牛会话,只读)结论:CLEAN,无 BLOCKER / MAJOR / MINOR。 我没有采信 PR 正文的结论,按远端 head
边界:这是 docs-only 历史引用复核,不证明当年发布制品本身可从该 SHA 位级复现。未 approve、未 merge、未 deploy。 |
结论:前提、钉法、范围三项我都独立核过,建议合并。无阻塞项此前只有一条 bot 评论。我没看正文那张表,自己从 一、前提属实:两条都漂了,而且没越界所以看不出来两个行号都落在文件范围内、都指着一行正常代码 —— 这正是最难发现的那一类。 二、钉
|
|
核过了,合。这一处的两个行号我实跑对了。 钉到
|
main 上已经动过这两行,方向和本 PR **不同**: main: 链接改成 blob/main/…(不带 #L),行号退回正文「(当时在 61 行)」 #851: 链接钉到当时的提交 blob/3a387204/…#L61 两个都成立,但各解决了一半: - main 那版**链接永远打得开**,但点开是今天 13753 行的 cli.ts —— 第 61 行现在 是一句 import,读者拿不到那句话说的东西; - #851 那版**点开就是** `const PINNED_SERVER_VERSION = "0.8.0";`,但链接文字 还是裸的 `cli.ts:2589`,不说明那处是干什么的。 取并集:**URL 用 #851 的提交钉法,链接文字用 main 的描述性写法**,并在正文里 写清「钉在当时的提交 3a38720,第 61 行」。 实跑核过(该提交下 cli.ts 共 7203 行): L61 const PINNED_SERVER_VERSION = "0.8.0"; L2589 const serverArgs = ["--bun", `@sleep2agi/commhub-server@${PINNED_SERVER_VERSION}`]; 对照 main 上同样两行:L61 是 `} from "../src/opencode-preset";`,L2589 是 `}`。 🔴 顺带记一条判断:同样是「行号 pin 失效」,#857 那批指向**当前**代码,正确修法是 换符号锚点(跟着代码走);本 PR 这两条在 **changelog** 里,描述的是当时的状态, 正确修法是**钉提交**。`PINNED_SERVER_VERSION = "0.8.0"` 这个事实只在那个提交上 成立 —— 换符号锚点反而会指向一个今天已经不是 0.8.0 的常量。 **症状一样,修法取决于那句话说的是「现在」还是「当时」。** 合并后跑过: check-docs-integrity.py no problems(6 个 changelog 的 main 行锚点 = 0) check-doc-symbol-anchors.py 21/21 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
和 #851 同一形状:main 上已经动过这一行,方向不同。 main: 链接改成 blob/main/…(不带 #L),正文写「(当时在 253-258 行;行号已漂,按当时的符号名搜)」 #834: 链接钉到当时的提交 blob/22ed1886/…#L253 取 #834。理由不是风格偏好,是 main 那版**给出的做法今天做不到**: $ git show origin/main:server/src/index.ts | wc -l 16 `server/src/index.ts` 此后被拆开了,main 上只剩 **16 行**。所以: - 「按当时的符号名搜」—— 搜不到,那段逻辑已经不在这个文件里; - 原链接的 `#L253` 指向一个 16 行文件的第 253 行,GitHub 静默显示文件顶部。 而钉到 22ed188 之后(该提交下 1624 行)点开就是那两条阈值本身: L253 if (typeof row?.disk_avail_gb === "number" && row.disk_avail_gb < 1) alerts.push(…) L258 if (typeof row?.disk_avail_gb === "number" && row.disk_avail_gb < 5) alerts.push(…) 和 changelog 那句「`disk < 1GB critical / < 5GB warn`」严丝合缝。 ## 🔴 顺手修一个 main 上的语言泄漏 main 那次改动把中文括注写进了**英文** changelog: …triggers ([`server/src/index.ts`](…)(当时在 253-258 行;行号已漂,按当时的符号名搜)). 全量扫过 `docs-site/docs/en/**`:这种中文括注**一共 2 处,全在 changelog.md**。 另一处是 `PINNED_SERVER_VERSION` 那行,由 #851 的合并一并修掉。**两处覆盖完,无残留。** 合并后跑过: check-docs-integrity.py no problems check-doc-symbol-anchors.py 21/21 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
CI 第二轮红在:
FAIL: 预期 18 个唯一 pin,实际 15
**这道断言就是设计成「变了要人确认」的**(run.sh 里原注释写着)。所以我去确认了,
而不是把它改宽。
变化来自今晚合的两个 PR —— 三条引用**钉了提交**,于是从 `unique_pins` 挪进了
`pins_on_immutable_ref`:
agent-network/bin/cli.ts#L61 -> 2 个文件(中/英 changelog) #851
agent-network/bin/cli.ts#L2589 -> 2 个文件 #851
server/src/index.ts#L253 -> 2 个文件 #834
正好 3 条,18 − 3 = 15;`pins_on_immutable_ref=6` = 3 × 2,对得上。
🔴 另外两个数**一个都没动**:`occ` 仍 35(钉提交不减少「出现次数」,只改引用形式),
`files` 仍 106。**只有一个数变了,而且变的原因能逐条指名** —— 如果三个数一起变,
那才是该怀疑扫漏的信号。
把这段推导写进 run.sh 的注释里,下一个人不用重新推一遍。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
CI 第三轮红在:
FAIL: ① 钉 SHA 的引用没有被单独计数:pins_on_immutable_ref=7
L5① 注入**一条**钉 SHA 的引用,然后断言 `pins_on_immutable_ref=1`。
🔴 这条断言的意图是「注入的那一条被单独计数了」,但它写成了绝对值 ——
**只有在仓里原本一条钉 SHA 的引用都没有时才等价。** 写下它的时候确实是 0,
所以它当时是对的,而且输出和一个真正正确的断言**逐字相同**。
今晚仓里多了 6 条(#851 的 `cli.ts#L61` / `#L2589` 各 ×2 语言,#834 的
`server/src/index.ts#L253` ×2),注入第 7 条,写死的 1 就红了 ——
**而红它的正是「有人按这道门建议的做法,把会漂的行号 pin 钉成了提交」,
也就是这道门自己想促成的进展。**
改成先量基线再断言恰好 +1:
base_imm=$(… pins_on_immutable_ref …) # 注入前
…注入…
after_imm 必须 == base_imm + 1
本机实测:`base=6 → after=7 rc=0`,与期望一致;victim 文件 `cmp` 还原确认。
同类提醒写进注释:**一个「只有在某个背景事实恰好为 0 时才成立」的断言,
和一个正确的断言,在当时的输出上完全一样。**
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
修 #850。
改了什么
changelog.md与en/changelog.md第 713 行(v0.10.1 那条)的两条源码引用,从blob/main改成钉在
3a387204。ZH + EN 各一行,共 +2/-2。为什么这两条抓不到
它们没有越界。#834 修的那条(
server/src/index.ts#L253指向一个 15 行文件)一眼可见;这两条行号都在 13399 行的文件范围内,看上去还活着,实际早就漂了:
origin/main上它真在第几行cli.ts:61=PINNED_SERVER_VERSION} from "../src/opencode-preset";cli.ts:2589=bunx commhub-server启动点anet opencode auth-login的帮助文本为什么钉
3a387204而不是修复提交4d240241这条 changelog 是 v0.10.1 hotfix(2026-05-17)的条目,
4d240241就是那次修复(
PINNED_SERVER_VERSION bump 0.8.0 → 0.8.2)。两个提交上L61/L2589都精确命中:选父提交
3a387204,因为正文描述的是修复前的状态 ——「仍 hardcode0.8.0」「实际
bunx --bun @sleep2agi/commhub-server@0.8.0启服务」。钉4d240241会让读者点进去看到0.8.2,和这句话对不上。3a387204是origin/main的祖先(git merge-base --is-ancestor通过),blob 链接实打HTTP 200。🔴 顺带量了一下这类问题的规模(本 PR 不改,超出 #850 范围)
docs/下按blob/main钉cli.ts行号的引用共 15 条。其中锚文本里带了符号名、因而可以机器判定的有 11 条:
例如:
architecture.md「cli.ts:228 loadProfile」→ main L228 是// Minimal WebSocket JSON-RPC thread creator...architecture.md「cli.ts:1644 ensureMcpJson」→ main L1644 是minor: Number.parseInt(match[2], 10),node-lifecycle.md「cli.ts:2629-2631 renameCommand」→ main L2629 是const resolved = resolveNodeRef(ref);design-auth-network.md「cli.ts:28 adminUtokPath」→ main L28 是removeMarker as removeCopresenceMarker,复现:
一条一条手改不解决问题 —— 下次
cli.ts一动又全漂了。这正是 #843(
scripts/check-doc-source-pins.py)那道门要挡的东西,它还没合。建议 #850 保持开着,等那道门落地后按它的输出批量处理,别在这个 PR 里扩范围。