Skip to content

docs(changelog): v0.10.1 那两条 cli.ts 引用钉到当时的提交(行号在范围内但已经指错) - #851

Merged
vansin merged 2 commits into
mainfrom
docs/pin-inrange-changelog-refs
Aug 17, 2026
Merged

docs(changelog): v0.10.1 那两条 cli.ts 引用钉到当时的提交(行号在范围内但已经指错)#851
vansin merged 2 commits into
mainfrom
docs/pin-inrange-changelog-refs

Conversation

@vansin

@vansin vansin commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

#850

改了什么

changelog.mden/changelog.md 第 713 行(v0.10.1 那条)的两条源码引用,从 blob/main
改成钉在 3a387204。ZH + EN 各一行,共 +2/-2。

为什么这两条抓不到

它们没有越界#834 修的那条(server/src/index.ts#L253 指向一个 15 行文件)一眼可见;
这两条行号都在 13399 行的文件范围内,看上去还活着,实际早就漂了:

changelog 声称 origin/main 上它真在第几行 那个行号现在实际是什么
cli.ts:61 = PINNED_SERVER_VERSION 791 } from "../src/opencode-preset";
cli.ts:2589 = bunx commhub-server 启动点 5765 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 精确命中:

4d240241:  L61 = const PINNED_SERVER_VERSION = "0.8.2";
3a387204:  L61 = const PINNED_SERVER_VERSION = "0.8.0";     ← 父提交
两者 L2589 均为 const serverArgs = ["--bun", `@sleep2agi/commhub-server@${PINNED_SERVER_VERSION}`];

选父提交 3a387204,因为正文描述的是修复前的状态 ——「仍 hardcode 0.8.0
「实际 bunx --bun @sleep2agi/commhub-server@0.8.0 启服务」。钉 4d240241 会让读者点进去看到
0.8.2,和这句话对不上。

3a387204origin/main 的祖先(git merge-base --is-ancestor 通过),blob 链接实打 HTTP 200

🔴 顺带量了一下这类问题的规模(本 PR 不改,超出 #850 范围)

docs/ 下按 blob/maincli.ts 行号的引用共 15 条。其中锚文本里带了符号名、
因而可以机器判定的有 11 条:

漂移 11 条,仍然对的 0 条

例如:

  • architecture.mdcli.ts:228 loadProfile」→ main L228 是 // Minimal WebSocket JSON-RPC thread creator...
  • architecture.mdcli.ts:1644 ensureMcpJson」→ main L1644 是 minor: Number.parseInt(match[2], 10),
  • node-lifecycle.mdcli.ts:2629-2631 renameCommand」→ main L2629 是 const resolved = resolveNodeRef(ref);
  • design-auth-network.mdcli.ts:28 adminUtokPath」→ main L28 是 removeMarker as removeCopresenceMarker,

复现:

git fetch origin main
git show origin/main:agent-network/bin/cli.ts | sed -n '228p;1644p;2629p;28p'
grep -rn 'blob/main/agent-network/bin/cli\.ts#L' --include=*.md docs/

一条一条手改不解决问题 —— 下次 cli.ts 一动又全漂了。这正是 #843
(scripts/check-doc-source-pins.py)那道门要挡的东西,它还没合。
建议 #850 保持开着,等那道门落地后按它的输出批量处理,别在这个 PR 里扩范围。

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 都精确命中,但 3a387204d24024 的父提交,
  它的 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。

vansin commented Aug 13, 2026

Copy link
Copy Markdown
Contributor Author

独立窄审(通信牛会话,只读)结论:CLEAN,无 BLOCKER / MAJOR / MINOR。

我没有采信 PR 正文的结论,按远端 head e545e2bc7af3227effb141e630f7baf7c6bd508e 独立核了:

  • delta 恰好 2 个文档文件、各改 1 行;中英文同步,git diff --check 通过;
  • 3a387204 在仓库中可解析且为 origin/main 祖先;
  • git show 3a387204:agent-network/bin/cli.ts:第 61 行确为 PINNED_SERVER_VERSION = "0.8.0",第 2589 行确由该常量构造 @sleep2agi/commhub-server@${PINNED_SERVER_VERSION}
  • 对照修复提交 4d240241,同一常量已变为 0.8.2,调用形状保持一致;
  • 因此 changelog 叙述的是 v0.10.1 当时状态,改用历史提交锚比浮动 main 正确;
  • 对 current main 的虚拟 merge无冲突;无产品、CI、测试或部署改动。

边界:这是 docs-only 历史引用复核,不证明当年发布制品本身可从该 SHA 位级复现。未 approve、未 merge、未 deploy。

@vansin

vansin commented Aug 13, 2026

Copy link
Copy Markdown
Contributor Author

结论:前提、钉法、范围三项我都独立核过,建议合并。无阻塞项

此前只有一条 bot 评论。我没看正文那张表,自己从 origin/main 重算。

一、前提属实:两条都漂了,而且没越界所以看不出来

origin/main : agent-network/bin/cli.ts
  L61   → } from "../src/opencode-preset";
  L2589 →   anet opencode auth-login <n> --provider <anthropic|openai>

PINNED_SERVER_VERSION 真实在 791(和 5764)

两个行号都落在文件范围内、都指着一行正常代码 —— 这正是最难发现的那一类
对比 #834 修的那条(server/src/index.ts#L253 指向一个 15 行文件),那种一眼可见;
这两条不跑一次对照根本看不出来。

二、钉 3a387204 是对的,我逐字核了两个候选提交

3a387204:  L61   const PINNED_SERVER_VERSION = "0.8.0";       ← 有 bug 的那一版
           L2589 const serverArgs = ["--bun", `@sleep2agi/commhub-server@${PINNED…

4d240241:  L61   const PINNED_SERVER_VERSION = "0.8.2";       ← 修完的那一版
           L2589 (同上,行号也精确)

两个提交上 L61/L2589 都精确命中,所以"钉哪个"是个真选择,不是碰巧。

这条 changelog 的措辞是「跨 v0.9.x + v0.10.0 promote 漏 bump,仍 hardcode 0.8.0」——
它描述的是故障状态。点进去应该看到 0.8.0,而不是修完的 0.8.2
所以钉 3a387204(故障版)而不是 4d240241(修复版)是对的,正文给的理由成立。

三、范围完整,没有"改一半"

我最近在别处踩过「标题写得像全覆盖、实际只改了一半」的坑,所以这条特意数了:

changelog.md      main 上 blob/main 的 cli.ts 引用 2 条 → 改后 0 条,已钉 commit 2 条
en/changelog.md   同上

恰好 2 条、全部处理、零残留。 而且两条在同一行(713),所以 +1/-1 每文件是对的,
不是漏改。

再往外扩一层,changelog 里所有 blob/main 带行号的引用只剩 1 条:
server/src/index.ts#L253 —— 那条正是 #834 在修的(它钉到 22ed1886)。
我把两个 PR 合起来验了:

main ← #834 ← #851     无冲突(两者分别改 658 行与 713 行)
合并后 changelog.md / en/changelog.md:
  blob/main 带行号引用  0 条
  已钉 commit 的引用    3 条

#834 + #851 合起来,changelog 的行号漂移面就归零了。 两个 PR 互不冲突,顺序无所谓。

四、没有发现需要改的地方

  • 只动 changelog 的历史条目,不动任何行为描述 —— 历史条目钉历史提交是正解,
    因为那一行描述的事实属于那个时刻,跟着 main 走必然越漂越远;
  • ZH / EN 两版同步改,没有只改一边;
  • 没有顺手扩大范围(这是它能干净的原因)。

(只读:临时 worktree 用完即 git worktree remove;所有行号取自 origin/main 与两个历史提交对象,
未改本 PR、未 approve、未 merge。)

@vansin

vansin commented Aug 17, 2026

Copy link
Copy Markdown
Contributor Author

核过了,。这一处的两个行号我实跑对了。

钉到 3a387204 之后,两条引用都精确命中

$ git show 3a387204:agent-network/bin/cli.ts   (该提交下 7203 行)
  L61:   const PINNED_SERVER_VERSION = "0.8.0";
  L2589: const serverArgs = ["--bun", `@sleep2agi/commhub-server@${PINNED_SERVER_VERSION}`];

逐字对上 changelog 那段话说的东西 —— L61 就是那个漏 bump 的常量,L2589 就是用它拼 bunx 参数的地方。

main 上同样两行现在是

  main L61:   } from "../src/opencode-preset";
  main L2589: }

cli.ts 从 7203 行长到了 13753 行一个 import 语句和一个孤零零的右花括号 —— 这就是改之前那两个链接点开会看到的东西。

🔴 这里有一个和 #857 不同的判断,值得说清楚:

#857 那批指向当前代码,所以正确的修法是换成符号锚点(跟着代码走)。
本 PR 这两条在 changelog 里,描述的是 v0.10.1 当时的状态 —— 那段话本身是历史记录,不该跟着 main 漂。钉提交是对的,换符号锚点反而错:PINNED_SERVER_VERSION = "0.8.0" 这个事实只在那个提交上成立,今天的 cli.ts 里它已经不是 0.8.0 了。

同一类症状(行号 pin 失效),两种正确修法,取决于那句话说的是「现在」还是「当时」。

一个附带确认

3a387204 在仓里存在(2026-05-17 的一次 docs 提交),不是一个编出来的 SHA

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>
vansin pushed a commit that referenced this pull request Aug 17, 2026
#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>
@vansin
vansin merged commit 5a330a0 into main Aug 17, 2026
8 checks passed
vansin pushed a commit that referenced this pull request Aug 17, 2026
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>
vansin pushed a commit that referenced this pull request Aug 17, 2026
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>
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