From bfb32e094850e096aa38947d3f830e8fa857d30f Mon Sep 17 00:00:00 2001 From: vansin Date: Thu, 13 Aug 2026 09:38:00 +0800 Subject: [PATCH 1/4] =?UTF-8?q?docs:=20=E8=8B=B1=E6=96=87=20troubleshootin?= =?UTF-8?q?g=20=E8=A1=A5=E4=B8=8A=20latest=20=E4=BF=A1=E9=81=93=E8=AD=A6?= =?UTF-8?q?=E5=91=8A;=E6=9B=B4=E6=AD=A3=20RELEASE-SOP=20=E9=87=8C=E4=B8=80?= =?UTF-8?q?=E5=8F=A5=E7=8E=B0=E5=9C=A8=E4=B8=8D=E6=88=90=E7=AB=8B=E7=9A=84?= =?UTF-8?q?=E8=AF=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 1. 英文页把「现在时」写成了「历史」 中文 troubleshooting 有(#773 加的): 🔴 latest 线(当前 2.2.21)还没有这道 preflight —— 那里仍是裸崩 spawn bunx ENOENT + Node 堆栈。所以下面这个字样对 latest 用户是现在时,不是历史。 英文页**一次都没提 latest**,而且写的是: `spawn bunx ENOENT` is the **pre-#235** behaviour — the string is kept in this heading so people arriving from older versions still find this section. 「pre-#235」「people arriving from older versions」都在告诉英文读者:这是历史。 **但 npm i -g 默认装的就是 latest**,对他们是现在时。getting-started 和 clean-server 的 zh/en 都对齐了,只有 troubleshooting 漏了 —— 这是我 #773 的遗漏。 ## 2. RELEASE-SOP 有一句现在不成立的话 原文(R367 那段)结尾:「现在 **没有 docs 还 pin npm 版本号**了。」 今天实测不成立:docs-site 下 7 个文件、13 行钉着当前版本号。 但要分清两类,否则会误删: - R367 清掉的是**安装命令里的版本 pin**(npm i -g pkg@2.1.7 那种)—— 那类确实清干净了; - 剩下的是**限定信道的行为断言**(「在 latest 2.2.21 上你会看到裸崩」)—— 这类**去掉版本号就失去意义**,不该清,但**一发版就立刻变假**, 而且是危险的假:会告诉用户一道已经存在的安全 preflight 不存在。 所以把那句话改准,并列出逐次发版必须重新核对的 7 个文件位置。 核对方法写明不是 grep 而是真机装。 ## 证据 干净容器(node:22 + @sleep2agi/agent-network@latest,不装 bun): anet v2.2.21 anet hub start → syscall: 'spawn bunx' code: 'ENOENT' spawnargs: [ '--bun', '@sleep2agi/commhub-server@0.8.8' ] + Node.js v22.23.2 堆栈 与文档写的「latest 裸崩」逐字相符,所以这些断言**今天全部成立** —— 发版后就不一定。 另核:anet.sh 线上内容与 origin/main 的 docs-site 一致(npm i -g bun 与 bun.sh/install 各出现 1 次,与源码同),快速开始页 33 条命令的动词在 latest 2.2.21 的 --help 里全部存在,且 bun 安装步骤排在 anet hub start 之前。 这三项**没有发现缺陷**。 --- docs-site/docs/en/troubleshooting.md | 6 +++++- docs/RELEASE-SOP.md | 24 +++++++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/docs-site/docs/en/troubleshooting.md b/docs-site/docs/en/troubleshooting.md index d91e316d4..0795dc1fb 100644 --- a/docs-site/docs/en/troubleshooting.md +++ b/docs-site/docs/en/troubleshooting.md @@ -32,7 +32,11 @@ The **preview** channel (`2.3.0-preview.x`) refuses before launch with a clear m ❌ anet hub start requires the Bun runtime (commhub-server is bun-only …) ``` -and exit with code 1. `spawn bunx ENOENT` is the **pre-[#235](https://github.com/sleep2agi/agent-network/issues/235)** behaviour — the string is kept in this heading so people arriving from older versions still find this section. +and exit with code 1. + +🔴 **The `latest` channel (currently `2.2.21`) does not have that preflight yet** — there you still get a bare `Error: spawn bunx ENOENT` plus a Node stack trace. `npm i -g @sleep2agi/agent-network` installs `latest`, so for most readers the string below is **present tense, not history**. + +`spawn bunx ENOENT` is what [#235](https://github.com/sleep2agi/agent-network/issues/235) removed **on preview**; the string is kept in this heading so people arriving from older versions — and everyone still on `latest` — find this section. Agent Network CLI requires Node.js ≥ 22.13, and the Hub requires Bun ≥ 1.2: diff --git a/docs/RELEASE-SOP.md b/docs/RELEASE-SOP.md index 6596320a6..b1ee4e490 100644 --- a/docs/RELEASE-SOP.md +++ b/docs/RELEASE-SOP.md @@ -28,7 +28,29 @@ R212/R213/R215/R225/R251/R253 chain 已经把 `docs-site/docs/guide/runtimes.md` 未来加新 doc 时**不要再写硬版本号**(reviewer 拦截,rationale:每 release drift 一次维护负担,让 doc 引导用户去 npm 包页查最新 latest 比 doc 自己钉死可靠)。 -~~例外(保留快照):sdk-deep-dive.md L14 用 `agent-node@2.3.1-preview.0` 做 snapshot pin~~ —— **R367 (2026-05-14) 已取消该例外**:[`docs-site/docs/guide/sdk-deep-dive.md` L14](https://github.com/sleep2agi/agent-network/blob/main/docs-site/docs/guide/sdk-deep-dive.md#L14) 的 `cli.ts:NNN` 行号引用改成「对照 GitHub `main` 校准」(不再 pin 具体 preview 版本),跟其余 doc 一致。现在 **没有 docs 还 pin npm 版本号**了。 +~~例外(保留快照):sdk-deep-dive.md L14 用 `agent-node@2.3.1-preview.0` 做 snapshot pin~~ —— **R367 (2026-05-14) 已取消该例外**:[`docs-site/docs/guide/sdk-deep-dive.md` L14](https://github.com/sleep2agi/agent-network/blob/main/docs-site/docs/guide/sdk-deep-dive.md#L14) 的 `cli.ts:NNN` 行号引用改成「对照 GitHub `main` 校准」(不再 pin 具体 preview 版本),跟其余 doc 一致。现在 **没有 docs 还在安装命令里 pin npm 版本号**了。 + +> 🔴 **但「没有任何 doc 提版本号」是错的,别照这句话跳过检查。** +> 有一类版本号是**故意**留着的:限定信道的**行为断言** ——「在 latest `2.2.21` 上 +> 你会看到裸崩,在 preview 上会被 preflight 拦下」。这类断言**去掉版本号就失去意义**, +> 所以 R367 没有、也不该把它们清掉。代价是:**latest 或 preview 一发布,它们立刻变成假的**, +> 而且是危险的那种假 —— 会告诉用户一道已经存在的安全 preflight 不存在。 +> +> 逐次发版必须重新核对的位置(2026-08-13 实测,共 7 个文件): +> +> | 文件 | 行 | 断言 | +> |---|---|---| +> | `docs-site/docs/guide/getting-started.md` | 19–20 | latest `2.2.21` 裸崩 / preview `2.3.0-preview.x` 被拦 | +> | `docs-site/docs/en/guide/getting-started.md` | 19–20 | 同上(英文) | +> | `docs-site/docs/deploy/clean-server.md` | 21–22 | 同上 | +> | `docs-site/docs/en/deploy/clean-server.md` | 21–22 | 同上(英文) | +> | `docs-site/docs/troubleshooting.md` | 29、37 | preview 有 preflight / latest 没有 | +> | `docs-site/docs/en/troubleshooting.md` | 29、37 | 同上(英文) | +> | `docs-site/docs/guide/versioning.md` + `en/` 对应 | 11 | `anet -v` 顶行示例 `anet v2.2.21` | +> +> 核对方法不是 grep,是**真机装**:`npm i -g @sleep2agi/agent-network@latest` 进干净容器, +> 不装 bun 跑一次 `anet hub start`,看它到底裸崩还是被拦。今天实测 `2.2.21` 仍是裸崩 +> (`syscall: 'spawn bunx'`, `code: 'ENOENT'`),所以上述断言现在全部成立 —— 发版后就不一定了。 ::: ### B. Frozen snapshots(永不动) From 3928368861dd6c177143f5815fc7d4cd2beb1200 Mon Sep 17 00:00:00 2001 From: vansin Date: Thu, 13 Aug 2026 16:23:16 +0800 Subject: [PATCH 2/4] =?UTF-8?q?docs(RELEASE-SOP):=20=E4=B8=80=E6=AC=A1?= =?UTF-8?q?=E6=8E=A2=E9=92=88=E4=B8=8D=E8=83=BD=E6=9B=BF=E6=89=80=E6=9C=89?= =?UTF-8?q?=E6=96=AD=E8=A8=80;=E5=88=86=E6=AF=8D=E6=98=AF=208=20=E4=B8=AA?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E4=B8=8D=E6=98=AF=207=20=E4=B8=AA=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 审查(通信狗 advisory,MAJOR)两条,都成立: ① 分母数错:表里最后一行把 zh/en 的 versioning 合成一行,按路径应为 8。 分母数错会漏核 —— 已拆成两行,并写明「8 行 = 8 个文件,不要合并数」。 ② 证据越权(更要紧):我在文末用一次「latest 2.2.21 + 无 bun + anet hub start」的探针,宣称「上述断言现在全部成立」。 那次探针只证明了 ENOENT/preflight 这一族。它从没跑过 `anet -v`, 而 versioning 那条断言正是关于 `anet -v` 顶行输出的;安装命令里的 版本 pin 同样没验。一次运行只能证明它实际执行过的那条路径。 改成按断言分列核法并逐行标注状态:第一行「已实测」,另两行明确 「未实测」。同时钉上当前 preview 坐标(0.9.0-preview.29),并说明它 每次发版都变、重核以 npm dist-tag 为准。 这与本 PR 要修的是同一类:原文把 latest 的现状写成了历史(时态错), 我在修它时把一次探针的结论扩到了整张表(范围错)—— 都是陈述超出了 证据实际覆盖的范围。 --- docs/RELEASE-SOP.md | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/docs/RELEASE-SOP.md b/docs/RELEASE-SOP.md index b1ee4e490..003506ed1 100644 --- a/docs/RELEASE-SOP.md +++ b/docs/RELEASE-SOP.md @@ -36,7 +36,8 @@ R212/R213/R215/R225/R251/R253 chain 已经把 `docs-site/docs/guide/runtimes.md` > 所以 R367 没有、也不该把它们清掉。代价是:**latest 或 preview 一发布,它们立刻变成假的**, > 而且是危险的那种假 —— 会告诉用户一道已经存在的安全 preflight 不存在。 > -> 逐次发版必须重新核对的位置(2026-08-13 实测,共 7 个文件): +> 逐次发版必须重新核对的位置(**8 个路径**,下表 8 行 = 8 个文件 —— +> 不要把 zh/en 合成一行数,分母数错会漏核): > > | 文件 | 行 | 断言 | > |---|---|---| @@ -46,11 +47,22 @@ R212/R213/R215/R225/R251/R253 chain 已经把 `docs-site/docs/guide/runtimes.md` > | `docs-site/docs/en/deploy/clean-server.md` | 21–22 | 同上(英文) | > | `docs-site/docs/troubleshooting.md` | 29、37 | preview 有 preflight / latest 没有 | > | `docs-site/docs/en/troubleshooting.md` | 29、37 | 同上(英文) | -> | `docs-site/docs/guide/versioning.md` + `en/` 对应 | 11 | `anet -v` 顶行示例 `anet v2.2.21` | +> | `docs-site/docs/guide/versioning.md` | 11 | `anet -v` 顶行示例 `anet v2.2.21` | +> | `docs-site/docs/en/guide/versioning.md` | 11 | 同上(英文) | > -> 核对方法不是 grep,是**真机装**:`npm i -g @sleep2agi/agent-network@latest` 进干净容器, -> 不装 bun 跑一次 `anet hub start`,看它到底裸崩还是被拦。今天实测 `2.2.21` 仍是裸崩 -> (`syscall: 'spawn bunx'`, `code: 'ENOENT'`),所以上述断言现在全部成立 —— 发版后就不一定了。 +> **核对方法不是 grep,是真机装。但不同断言要各跑各的 —— 一次探针不能替所有:** +> +> | 断言 | 核法 | 2026-08-13 状态 | +> |---|---|---| +> | latest 裸崩 / preview 被 preflight 拦 | 干净容器装对应通道、**不装 bun**,跑 `anet hub start` | **已实测**:latest `2.2.21` 仍裸崩(`syscall: 'spawn bunx'`, `code: 'ENOENT'`);preview 被拦 | +> | `anet -v` 顶行示例 | 装 latest 后跑 **`anet -v`**,比对顶行 | **未实测** | +> | 安装命令里的版本 pin | 比对 npm dist-tag 与文中命令 | **未实测** | +> +> 🔴 **那次探针只证明了第一行。** 把它当成「整张表都成立」是证据越权 —— +> **一次运行只能证明它实际执行过的那条路径。** +> +> 当前坐标(便于下次比对):latest `2.2.21`、preview `0.9.0-preview.29`(commhub-server)。 +> preview 版本每次发版都变,重核时以 npm dist-tag 实际值为准,别照抄这里。 ::: ### B. Frozen snapshots(永不动) From 0456a731d5746cd72cf1c95fc355c37702431b93 Mon Sep 17 00:00:00 2001 From: vansin Date: Thu, 13 Aug 2026 16:33:48 +0800 Subject: [PATCH 3/4] =?UTF-8?q?docs(RELEASE-SOP):=20=E5=88=86=E6=AF=8D=208?= =?UTF-8?q?=20=E2=86=92=2012;=E5=9D=90=E6=A0=87=E8=AE=B0=E9=94=99=E4=BA=86?= =?UTF-8?q?=E5=8C=85;=E8=A1=A5=E4=B8=8A=E5=AE=9E=E6=B5=8B=E8=AF=81?= =?UTF-8?q?=E6=8D=AE=E5=88=B6=E5=93=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 三条审查意见,都成立: ① 清单仍不完整。全仓还有四页有现在时信道断言: docs-site/docs/{,en/}guide/windows.md:102(跨盘 anet --version 崩溃是哪个通道的现状) docs-site/docs/{,en/}guide/dashboard.md:313/328(anet -v 应显示 2.3.0-preview.N, preview 不自动 promote) 已加进表,分母 8 → 12。并写明这张表的分母被修正过两次(7→8→12), 加新信道断言时要同时加进表 —— 否则下一个人照着一份"看起来完整"的清单 去核,漏掉的那几页永远不会被发现。 ② 坐标记错了包。被核的 preflight 实现在 agent-network/bin/cli.ts,而我钉的是 commhub-server 的 dist-tag。下次比对会比错对象。已改成两行分列,并写明 哪个是本表断言的坐标、哪个不是。 ③ 「已实测」没有证据制品。补 docs/tests/report-latest-channel-preflight.txt: 复现命令(含为什么必须 --network none)、两个通道的原始输出、退出码, 以及明确写出它不覆盖 anet -v 与安装命令 pin 这两条。 这是同一张表的分母第三次被修正。前两次我都以为补完了。 --- docs/RELEASE-SOP.md | 23 +++++++-- .../tests/report-latest-channel-preflight.txt | 48 +++++++++++++++++++ 2 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 docs/tests/report-latest-channel-preflight.txt diff --git a/docs/RELEASE-SOP.md b/docs/RELEASE-SOP.md index 003506ed1..d0f55ae94 100644 --- a/docs/RELEASE-SOP.md +++ b/docs/RELEASE-SOP.md @@ -36,8 +36,10 @@ R212/R213/R215/R225/R251/R253 chain 已经把 `docs-site/docs/guide/runtimes.md` > 所以 R367 没有、也不该把它们清掉。代价是:**latest 或 preview 一发布,它们立刻变成假的**, > 而且是危险的那种假 —— 会告诉用户一道已经存在的安全 preflight 不存在。 > -> 逐次发版必须重新核对的位置(**8 个路径**,下表 8 行 = 8 个文件 —— -> 不要把 zh/en 合成一行数,分母数错会漏核): +> 逐次发版必须重新核对的位置(**12 个路径**,下表 12 行 = 12 个文件 —— +> 不要把 zh/en 合成一行数,分母数错会漏核。 +> 这张表的分母被修正过两次:7 → 8 → 12。**加新的信道断言时,同时把它加进这张表**, +> 否则下一个人照着一份"看起来完整"的清单去核,漏掉的那几页永远不会被发现): > > | 文件 | 行 | 断言 | > |---|---|---| @@ -49,6 +51,10 @@ R212/R213/R215/R225/R251/R253 chain 已经把 `docs-site/docs/guide/runtimes.md` > | `docs-site/docs/en/troubleshooting.md` | 29、37 | 同上(英文) | > | `docs-site/docs/guide/versioning.md` | 11 | `anet -v` 顶行示例 `anet v2.2.21` | > | `docs-site/docs/en/guide/versioning.md` | 11 | 同上(英文) | +> | `docs-site/docs/guide/windows.md` | 102 | 跨盘 `anet --version` 崩溃是哪个通道的现状 | +> | `docs-site/docs/en/guide/windows.md` | 102 | 同上(英文) | +> | `docs-site/docs/guide/dashboard.md` | 313、328 | `anet -v` 应显示 `2.3.0-preview.N` / preview 不自动 promote | +> | `docs-site/docs/en/guide/dashboard.md` | 314、329 | 同上(英文) | > > **核对方法不是 grep,是真机装。但不同断言要各跑各的 —— 一次探针不能替所有:** > @@ -61,8 +67,19 @@ R212/R213/R215/R225/R251/R253 chain 已经把 `docs-site/docs/guide/runtimes.md` > 🔴 **那次探针只证明了第一行。** 把它当成「整张表都成立」是证据越权 —— > **一次运行只能证明它实际执行过的那条路径。** > -> 当前坐标(便于下次比对):latest `2.2.21`、preview `0.9.0-preview.29`(commhub-server)。 +> 当前坐标(便于下次比对)—— **注意是哪个包**: +> +> | 包 | latest | preview | 为什么是它 | +> |---|---|---|---| +> | `@sleep2agi/agent-network` | `2.2.21` | `2.3.0-preview.39` | **preflight 实现在 `agent-network/bin/cli.ts`,上表断言核的就是它** | +> | `@sleep2agi/commhub-server` | `0.8.8` | `0.9.0-preview.29` | 只在 preflight 通过之后才相关,**不是上表断言的坐标** | +> +> 我第一版在这里记的是 commhub-server 的版本 —— **记错了包**。被核的是 CLI 的 +> preflight,却钉了 server 的 dist-tag,下次比对会比错对象。 > preview 版本每次发版都变,重核时以 npm dist-tag 实际值为准,别照抄这里。 +> +> 上表第一行的实测证据:`docs/tests/report-latest-channel-preflight.txt` +> (含复现命令、两个通道的原始输出、以及它**不覆盖**哪两条断言)。 ::: ### B. Frozen snapshots(永不动) diff --git a/docs/tests/report-latest-channel-preflight.txt b/docs/tests/report-latest-channel-preflight.txt new file mode 100644 index 000000000..dc8f27b3c --- /dev/null +++ b/docs/tests/report-latest-channel-preflight.txt @@ -0,0 +1,48 @@ +# report — latest/preview 首启 preflight 信道核对 + +Date: 2026-08-13 (Asia/Shanghai) +Scope: 只覆盖「无 Bun 时 `anet hub start` 的表现」这一条断言。 + 不覆盖 `anet -v` 顶行示例,也不覆盖安装命令里的版本 pin。 + +## 复现命令(干净容器,装完断网跑) + + docker build -t probe - <<'EOF' + FROM node:22-bookworm-slim + RUN npm i -g @sleep2agi/agent-network@latest + EOF + docker run --rm --network none probe sh -c 'anet hub start; echo exit=$?' + +`--network none` 是刻意的:探针默认目标是生产 hub,不断网会短路成 +`already running`,被测分支根本不执行(本仓记录过这个坑)。 + +## latest → 2.2.21 + + Starting CommHub Server on port 9200 (bind 127.0.0.1)... + node:events:497 + throw er; // Unhandled 'error' event + Error: spawn bunx ENOENT + at ChildProcess._handle.onexit (node:internal/child_process:285:19) + errno: -2, code: 'ENOENT', syscall: 'spawn bunx', path: 'bunx' + exit=1 + +## 同一容器 preview → 2.3.0-preview.39 + + ❌ anet hub start requires the Bun runtime (commhub-server is bun-only — + uses Bun.serve + bun:sqlite, no Node fallback). + exit=1 + +## 两条通道退出码相同,都是 1 + +差别不在退出码,纯在可读性。脚本包装(`|| exit`)两边行为一致。 + +## 坐标 + + @sleep2agi/agent-network latest 2.2.21 preview 2.3.0-preview.39 + (preflight 实现在 agent-network/bin/cli.ts;commhub-server 的版本 + 只在 preflight 通过之后才相关,不是本条断言的坐标) + +## 边界 + +- 容器刻意无 bun。装了 bun 的机器不会走到这个分支 —— 这不是 + 「所有 latest 用户都会崩」,是「没有 bun 的新机器上会」; +- `--network none` 保证不接触外部服务,同时意味着未验证联网场景。 From e28ecaf21917972001dc6247bb4089b40659ce60 Mon Sep 17 00:00:00 2001 From: vansin Date: Thu, 13 Aug 2026 17:57:09 +0800 Subject: [PATCH 4/4] =?UTF-8?q?docs(RELEASE-SOP):=20=E4=B8=A4=E6=9D=A1?= =?UTF-8?q?=E3=80=8C=E6=9C=AA=E5=AE=9E=E6=B5=8B=E3=80=8D=E9=83=BD=E6=B6=88?= =?UTF-8?q?=E6=8E=89=E4=BA=86=20=E2=80=94=E2=80=94=20=E4=B8=80=E6=9D=A1?= =?UTF-8?q?=E7=9C=9F=E8=B7=91=E4=BA=86,=E4=B8=80=E6=9D=A1=E6=9C=AC?= =?UTF-8?q?=E5=B0=B1=E4=B8=8D=E9=80=82=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 上一版我把表里两行标成「未实测」就交付了。这轮去消它们,两条都不难: ① `anet -v` 顶行示例 —— 真跑了。干净容器 npm i -g @sleep2agi/agent-network@latest 之后 `anet -v` 顶行输出 `anet v2.2.21`,与 versioning.md 的断言一致。 (断网运行,探针镜像用完即删。) ② 安装命令里的版本 pin —— 不适用。getting-started(中英)与 clean-server 里的 安装命令全是裸 `npm i -g @sleep2agi/`,一个都不钉版本,与 RELEASE-SOP 自己那句「现在没有 docs 还在安装命令里 pin 版本号」一致。 这一行改为负向不变量:每次发版确认「没有新出现钉版本的安装命令」。 顺带在正文里记一笔:标注不确定性是诚实的,但当那个不确定性两分钟就能消除 时,标注会变成不去消除它的借口。 --- docs/RELEASE-SOP.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/RELEASE-SOP.md b/docs/RELEASE-SOP.md index d0f55ae94..6ead25bbe 100644 --- a/docs/RELEASE-SOP.md +++ b/docs/RELEASE-SOP.md @@ -61,11 +61,14 @@ R212/R213/R215/R225/R251/R253 chain 已经把 `docs-site/docs/guide/runtimes.md` > | 断言 | 核法 | 2026-08-13 状态 | > |---|---|---| > | latest 裸崩 / preview 被 preflight 拦 | 干净容器装对应通道、**不装 bun**,跑 `anet hub start` | **已实测**:latest `2.2.21` 仍裸崩(`syscall: 'spawn bunx'`, `code: 'ENOENT'`);preview 被拦 | -> | `anet -v` 顶行示例 | 装 latest 后跑 **`anet -v`**,比对顶行 | **未实测** | -> | 安装命令里的版本 pin | 比对 npm dist-tag 与文中命令 | **未实测** | +> | `anet -v` 顶行示例 | 装 latest 后跑 **`anet -v`**,比对顶行 | **已实测**:干净容器装 latest 后 `anet -v` 顶行正是 `anet v2.2.21`,与 `versioning.md` 一致 | +> | 安装命令里的版本 pin | 比对 npm dist-tag 与文中命令 | **不适用**:上表各页的安装命令全是裸 `npm i -g @sleep2agi/`,一个都不钉版本。这一行保留为**负向不变量** —— 每次发版确认「没有新出现钉版本的安装命令」 | > -> 🔴 **那次探针只证明了第一行。** 把它当成「整张表都成立」是证据越权 —— +> 🔴 **原来那次探针只证明了第一行**,把它当成「整张表都成立」是证据越权 —— > **一次运行只能证明它实际执行过的那条路径。** +> 后来我把第二行也真跑了(另起一个干净容器跑 `anet -v`),第三行查完是不适用。 +> **记一笔:我一度把这两行标成「未实测」就交付了。标注不确定性是诚实的, +> 但当那个不确定性两分钟就能消除时,标注会变成不去消除它的借口。** > > 当前坐标(便于下次比对)—— **注意是哪个包**: >