dsh-vibe-math 2.7.3 → 2.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.en.md +682 -682
- package/README.md +683 -683
- package/docs/AUDIT-CHECKLIST.md +758 -744
- package/docs/COMPAT-AUDIT-ROUND2.md +351 -351
- package/docs/COMPAT-AUDIT-ROUND3.md +154 -154
- package/docs/audit-methodology.md +93 -0
- package/docs/final-paper.md +172 -172
- package/docs/formal-verification.md +613 -588
- package/docs/generate_framework_diagram_v2.py +114 -114
- package/docs/generate_framework_diagram_v3.py +127 -127
- package/docs/math-computation.md +195 -194
- package/docs/release-notes/README.en.md +2 -0
- package/docs/release-notes/README.md +2 -0
- package/docs/release-notes/RELEASE-NOTES-2.0.22.md +112 -112
- package/docs/release-notes/RELEASE-NOTES-2.1.0.md +143 -143
- package/docs/release-notes/RELEASE-NOTES-2.2.0.md +266 -266
- package/docs/release-notes/RELEASE-NOTES-2.2.1.md +43 -43
- package/docs/release-notes/RELEASE-NOTES-2.2.2.md +88 -88
- package/docs/release-notes/RELEASE-NOTES-2.3.0.md +207 -207
- package/docs/release-notes/RELEASE-NOTES-2.3.1.md +134 -134
- package/docs/release-notes/RELEASE-NOTES-2.3.10.md +105 -105
- package/docs/release-notes/RELEASE-NOTES-2.3.11.md +57 -57
- package/docs/release-notes/RELEASE-NOTES-2.3.12.md +80 -80
- package/docs/release-notes/RELEASE-NOTES-2.3.2.md +145 -145
- package/docs/release-notes/RELEASE-NOTES-2.3.3.md +115 -115
- package/docs/release-notes/RELEASE-NOTES-2.3.4.md +69 -69
- package/docs/release-notes/RELEASE-NOTES-2.3.5.md +63 -63
- package/docs/release-notes/RELEASE-NOTES-2.3.6.md +66 -66
- package/docs/release-notes/RELEASE-NOTES-2.3.7.md +59 -59
- package/docs/release-notes/RELEASE-NOTES-2.3.8.md +45 -45
- package/docs/release-notes/RELEASE-NOTES-2.3.9.md +70 -70
- package/docs/release-notes/RELEASE-NOTES-2.8.0.en.md +65 -0
- package/docs/release-notes/RELEASE-NOTES-2.8.0.md +65 -0
- package/docs/release-notes/RELEASE-NOTES-2.8.1.en.md +49 -0
- package/docs/release-notes/RELEASE-NOTES-2.8.1.md +49 -0
- package/docs/release-playbook.md +111 -0
- package/docs/slv-playbook.md +117 -0
- package/docs/test-timing.md +158 -157
- package/docs//346/236/266/346/236/204/345/233/276.md +77 -77
- package/installer.js +792 -792
- package/package.json +18 -3
- package/prompt-corpus-v2/formal-verify-v2.json +2 -2
- package/prompt-corpus-v2/formal-verify-v2.md +4 -0
- package/prompt-corpus-v3/formal-verify-v3.json +7 -7
- package/prompt-corpus-v3/formal-verify-v3.md +14 -0
- package/prompt-corpus-v5/prompt-corpus-v5.json +61 -61
- package/prompt-corpus-v5/prompt-corpus-v5.md +122 -0
- package/scripts/clean-temp.mjs +234 -0
- package/scripts/release-check.mjs +181 -0
- package/tests/audit-engine-faces.mjs +298 -0
- package/tests/audit-formal-sensitivity.mjs +345 -342
- package/tests/audit-installer-compat.test.mjs +256 -256
- package/tests/audit-math-computation-sensitivity.mjs +1 -1
- package/tests/audit-persona-sensitivity.mjs +323 -323
- package/tests/audit-persona-surface.test.mjs +431 -431
- package/tests/audit-prompt-duplication.mutants.mjs +3 -2
- package/tests/audit-prompt-invariants.mjs +589 -546
- package/tests/audit-registration.mjs +78 -78
- package/tests/audit-spec-traceability.mjs +193 -193
- package/tests/audit-status-report-fields.mjs +172 -172
- package/tests/audit-v5-integrity.mjs +795 -795
- package/tests/audit-v5-sensitivity.mjs +433 -432
- package/tests/e2e-v5-round2.test.mjs +2453 -2426
- package/tests/formal-verify-v2.test.mjs +1806 -1800
- package/tests/formal-verify-v3.test.mjs +1757 -1750
- package/tests/formal-verify-v4.test.mjs +2114 -2106
- package/tests/formal-verify-v5.test.mjs +774 -767
- package/tests/math-computation-discovery.mutants.mjs +3 -3
- package/tests/math-computation-shared.test.mjs +122 -5
- package/tests/math-computation-v2.test.mjs +14 -2
- package/tests/math-computation-v3.test.mjs +14 -2
- package/tests/math-computation-v4.test.mjs +739 -739
- package/tests/prompt-v5-integrity.test.mjs +1291 -1291
- package/tests/release-check.mutants.mjs +78 -0
- package/tests/run-tests.mjs +393 -332
- package/tests/selfdrive-v5.mjs +560 -560
- package/tests/temp-hygiene.mutants.mjs +80 -0
- package/tests/v2-fix-probes.mutants.mjs +4 -0
- package/tests/v2-fix-probes.test.mjs +1034 -1033
- package/tests/v2v3-interrupt.mutants.mjs +111 -0
- package/tests/v3-fix-probes.mutants.mjs +99 -95
- package/tests/v3-fix-probes.test.mjs +891 -890
- package/tests/v4-final-paper.mutants.mjs +116 -0
- package/tests/v4-final-paper.test.mjs +628 -0
- package/tests/v5-institute-fixes.mutants.mjs +218 -190
- package/vibe-math-v2/agent.cordis.yml +376 -376
- package/vibe-math-v2/math-computation.js +17 -15
- package/vibe-math-v2/preset.yml +2 -2
- package/vibe-math-v2/v2/347/232/204/351/242/235/345/244/226/350/246/201/346/261/202.txt +21 -21
- package/vibe-math-v2/vibe-math-v2.js +5078 -5011
- package/vibe-math-v2//345/256/236/347/216/260/346/226/271/346/241/210.md +486 -486
- package/vibe-math-v3/agent.cordis.yml +420 -420
- package/vibe-math-v3/math-computation.js +17 -15
- package/vibe-math-v3/preset.yml +2 -2
- package/vibe-math-v3/vibe-math-v3.js +6215 -6149
- package/vibe-math-v3//345/256/236/347/216/260/346/226/271/346/241/210.md +649 -649
- package/vibe-math-v4/agent.cordis.yml +438 -438
- package/vibe-math-v4/math-computation.js +17 -15
- package/vibe-math-v4/preset.yml +2 -2
- package/vibe-math-v4/vibe-math-v4.js +4520 -4422
- package/vibe-math-v4//345/256/236/347/216/260/346/226/271/346/241/210.md +1015 -1015
- package/vibe-math-v5/math-computation.js +17 -15
- package/vibe-math-v5/vibe-math-v5.js +93 -11
- package/vibe-math-v5//345/256/236/347/216/260/346/226/271/346/241/210.md +1728 -1728
- package/vibe-math-v5//346/236/266/346/236/204/345/233/276.md +693 -693
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# 发布手册:从版本一致性到 npm 与 GitHub Release
|
|
2
|
+
|
|
3
|
+
> 本文件记录**实际执行过**的发布流程(以 2.7.3 为例),供下一次发布照做。
|
|
4
|
+
> 面向读者:维护者。命令都可直接复制;标注"需核对"的地方不要跳。
|
|
5
|
+
> 权威守卫:`tests/audit-market-metadata.test.mjs`(市场元数据与随包清单)。
|
|
6
|
+
|
|
7
|
+
## 0. 发布前的一次性判断
|
|
8
|
+
|
|
9
|
+
先确定**版本类型**(补丁 / 功能)与**版本号**,再动任何文件。定了就不再改——版本一致性检查遍布多处,中途改号会到处漏。
|
|
10
|
+
|
|
11
|
+
## 1. 版本一致性:三处必须同时改
|
|
12
|
+
|
|
13
|
+
| 位置 | 字段 | 检查者 |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| `package.json` | `version` | 全部守卫的基准 |
|
|
16
|
+
| `package-lock.json` | **顶层 `version`** 与 **`packages[""].version`** | `tests/audit-market-metadata.test.mjs` 断言顶层与 `package.json` 一致(历史上曾漂移) |
|
|
17
|
+
| 发布说明 | `docs/release-notes/RELEASE-NOTES-<版本>.md` 与 `.en.md` | 市场守卫断言"覆盖当前版本(两种语言)" |
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
node -e "const p=require('./package.json'),l=require('./package-lock.json');console.log(p.version,l.version,l.packages[''].version)"
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
- **两份发布说明都必须写**,且**都要登记**在 `package.json#files`(守卫会检查"当前版本的两份都在清单里")。
|
|
24
|
+
- 发布说明结构由 `docs/release-notes/TEMPLATE.md` 规定:**10 个章节、中英同序**,无内容的章节保留标题写 `无。` / `None.`;每条修复/变更要点名**钉住它的守卫**。
|
|
25
|
+
|
|
26
|
+
## 2. 清单与市场字段
|
|
27
|
+
|
|
28
|
+
- `package.json#files`:新增的随包文件(**包括**两份发布说明与新文档)都要登记;发布后要用 tarball 复核"声明了但缺失 = 0"。
|
|
29
|
+
- `dsh.compatNote`:**用户可见的清单文本**,必须提到**当前版本号**(历史上曾在改版本后仍描述上一版)。
|
|
30
|
+
- 以下字段**只应保持"已验证范围"**,发布时不要顺手改:
|
|
31
|
+
- `engines.dsh`(顶层,市场读它)与 `dsh.engines.dsh`(生态形状)——两者必须**逐字一致**;
|
|
32
|
+
- 每个 `@deepseek-ai/*` 的 `peerDependencies`:与 `engines.dsh` **同范围**,且 `peerDependenciesMeta` 里标记为 **optional**;
|
|
33
|
+
- `dsh.compatibility` 里标为 `compatible` 的每个版本都必须被 `engines.dsh` 的链**覆盖**;
|
|
34
|
+
- `screenshots.json` 与 README 里的图片引用(市场读取仓库里的 `screenshots.json`,**不从 npm 读**;README 不得指向已不存在的图)。
|
|
35
|
+
- 若某次发布确实要动兼容范围,先改**单一来源**再让两条声明一致,并同步更新市场数据。
|
|
36
|
+
|
|
37
|
+
## 3. 提交前:门禁与派生计数
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
node tests/run-tests.mjs # 必须全绿:TOTAL <n> PASS <n> FAIL 0
|
|
41
|
+
node scripts/update-doc-counts.mjs # 让文档里的派生计数收敛
|
|
42
|
+
node scripts/update-doc-counts.mjs --check # 退出 0 = 已收敛
|
|
43
|
+
node scripts/release-check.mjs # 版本三处一致/两份说明与章节顺序/files[] 登记/
|
|
44
|
+
# tarball 声明缺失=0/开发专用文件不随包/包内无 CRLF
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
- **`scripts/release-check.mjs` 是本手册的可执行化部分**:把 §1/§2/§6 的逐项核对做成一条命令(含一次真实
|
|
48
|
+
`npm pack` 与解包扫描)。发布前它必须退出 0;`--skip-pack` 只做静态检查,`--registry` 在发布后比对线上
|
|
49
|
+
`dist.shasum` 与本地 tarball 的字节一致性,`--self-test` 自证判据不是空转(配 `tests/release-check.mutants.mjs`
|
|
50
|
+
的 4 条单点变异,全部按名变红)。
|
|
51
|
+
|
|
52
|
+
- 任何**新增作业**(新套件/新变异族/新 `--self-probe` 变体)都会改变派生计数:先跑 updater,再跑门禁,否则文档计数守卫会按设计变红。
|
|
53
|
+
- **派生工件随源改动一起提交**:改了预设源/规范后,`cordis.patch.yml` 与随包语料等派生文件必须在**同一个提交**里重新生成(生成器脚本以仓库为准),不要拆成两个提交。
|
|
54
|
+
- 改动了文档/计数后**再跑一次** `--check`,确保最后一次改动也收敛。
|
|
55
|
+
|
|
56
|
+
## 4. 提交、打标签、推送
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
git add <path-exact 文件...> # 逐路径精确暂存,避免带入无关改动
|
|
60
|
+
git commit -m "<版本号>:<一句话要点>"
|
|
61
|
+
git tag -a v<版本> -m "<版本> <要点>" # 注解标签
|
|
62
|
+
git push origin <branch> --follow-tags
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
- 提交信息写**用户可见的变化**,不要写内部工作词汇。
|
|
66
|
+
- 打标签前确认工作区干净、门禁刚跑过且全绿。
|
|
67
|
+
|
|
68
|
+
## 5. 发布到 npm
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
npm publish # 按 package.json 的 version 发布
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
- **`gh release create` 是独立的一步**,不是 `npm publish` 的一部分:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
gh release create v<版本> --title "v<版本>" --latest --verify-tag \
|
|
78
|
+
--notes-file <双语说明或生成的双语文档>
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
- `--verify-tag`:标签不存在就拒绝,避免对着错误的提交发版。
|
|
82
|
+
- `--latest`:标记为最新发布。
|
|
83
|
+
|
|
84
|
+
## 6. 发布后核对(必做)
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
npm view dsh-vibe-math version dist-tags.latest dist.shasum
|
|
88
|
+
npm pack --dry-run # 或 npm pack 后解开,核对清单
|
|
89
|
+
node scripts/release-check.mjs --registry # 一条命令做完下面 1–4 项(含线上 shasum 与本地 tarball 的比对)
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
逐项确认:
|
|
93
|
+
|
|
94
|
+
1. **registry** 上的 `version` 与 `dist-tags.latest` 都是本次版本,`dist.shasum` 与本地 tarball 一致;
|
|
95
|
+
2. **tarball 内容 vs `package.json#files`**:声明了但缺失的文件数为 **0**;
|
|
96
|
+
3. 两份发布说明(中/英)**都在 tarball 里**;
|
|
97
|
+
4. 只应在仓库里存在的守卫/开发文件**不在** tarball 里;
|
|
98
|
+
5. 全新安装冒烟:在一个空目录里装该 tarball/从 registry 装,确认插件可被宿主加载;
|
|
99
|
+
6. **npm 传播延迟**:刚发布后 registry 可能短暂读到旧元数据,等一会儿重查,不要据此判定失败。
|
|
100
|
+
|
|
101
|
+
## 7. 已知陷阱(都真实遇到)
|
|
102
|
+
|
|
103
|
+
- **`gh` 的 JSON 输出没有 `isLatest` 字段**(本机 `gh` 版本):判断"是否为最新发布"要看 **`--latest` 是否被接受**或直接看 Release 页面,别去解析不存在的字段。
|
|
104
|
+
- **`core.autocrlf=true`**:会让某个随包文件在 tarball 里以 **CRLF** 出现(内容等价、字节不同)。若要求 tarball **逐字节可复现**,在下次发布前加 `.gitattributes` 固定行尾(例如 `* text=auto eol=lf` 并对二进制显式 `-text`),并在发布后按第 6 节重新核对 shasum。
|
|
105
|
+
- **发布说明里的历史数字不要改**:冻结的历史发布说明是记录,**不得**为了"看起来一致"去改写(live 文档的计数扫描会**按名豁免**它们)。
|
|
106
|
+
- **别在发布提交里顺手改版本范围**:`engines.dsh` / peer / `screenshots.json` 的变动会改变市场兼容判定,应作为独立、可复核的改动。
|
|
107
|
+
|
|
108
|
+
## 8. 回滚与补救
|
|
109
|
+
|
|
110
|
+
- 已发布版本**不要**覆盖重发同名版本;发现问题就发**下一个补丁版**,并在发布说明里写清影响与修复。
|
|
111
|
+
- 若标签/Release 打错:删 Release 与标签后重打(`gh release delete` / `git push --delete origin <tag>`),**不要**移动已发布的语义。
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# 脚本化真机验证(SLV)手册
|
|
2
|
+
|
|
3
|
+
> 目的:在**真实 DSH** 上、用**脚本**(不是 GUI)建一个指定 `agentPreset` 的会话并驱动若干回合,拿到可引用的转录证据。
|
|
4
|
+
> 面向读者:维护者/复核者。命令与字段名均来自实测。
|
|
5
|
+
> **铁律**:**上限或超时都不是通过**——它们是**非结果(NON-RESULT)**,必须如实记录,绝不写成 PASS。
|
|
6
|
+
|
|
7
|
+
## 1. 隔离:绝不碰用户自己的 profile
|
|
8
|
+
|
|
9
|
+
```powershell
|
|
10
|
+
# 1) 克隆一份 profile(不要用用户正在用的那份)
|
|
11
|
+
Copy-Item -Recurse -Force "$HOME\.dsh\profiles\web" "$HOME\.dsh\profiles\<clone>"
|
|
12
|
+
# 2) 改克隆里 package.json 的 name,避免与用户 profile 混淆
|
|
13
|
+
# 3) 从【纯 ASCII】的临时 cwd 启动,独立端口 + --no-open
|
|
14
|
+
New-Item -ItemType Directory -Force -Path "$env:TEMP\slv-ws"
|
|
15
|
+
dsh --profile <clone> --port <自有端口> --no-open
|
|
16
|
+
# 等价写法(需要指定 DSH 入口时):node <dsh>/lib/bin.js --profile <clone> --port <自有端口> --no-open
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
- **`--no-open`**:不弹 GUI;stdout 会打印一行 `dsh web: http://127.0.0.1:<端口>/?token=<TOKEN>` ⇒ **从这里取 `token=`**。
|
|
20
|
+
- **`--port`**:必须是你自己的端口,别占用用户实例的端口。
|
|
21
|
+
- **cwd 必须是纯 ASCII**:非 ASCII 工作区会在宿主侧变成乱码并报 `ENOENT`(编码问题,不是宿主缺陷)。
|
|
22
|
+
- 认证(实测):`GET /?token=<TOKEN>` ⇒ **303 + `Set-Cookie: dsh-auth-…`**;随后带 cookie 调 `/api/*` 返回 200,不带 cookie 返回 **401**。
|
|
23
|
+
- RPC 信封(逐字):`POST /api/<endpoint>`,正文 `{"type":"client-request","rpcId":"<唯一>","method":"<与 endpoint 同名>","payload":{"args":{…}}}`;**`payload` 必须恰好是 `{"args":{…}}`**(传 `{}` 或 `{"args":[]}` 会被拒)。
|
|
24
|
+
- **profile 补丁是顶层序列**:`cordis.patch.yml` 首个非注释行以 `-` 开头,因此追加行**必须从第 0 列开始**;用 2 空格缩进会得到 `YAMLException: bad indentation of a sequence entry`。
|
|
25
|
+
|
|
26
|
+
## 2. 模拟声明:必须留可检索证据
|
|
27
|
+
|
|
28
|
+
在**根会话的第一条 user message** 里明示这是一次模拟,例如:
|
|
29
|
+
|
|
30
|
+
> 本次运行是一次**模拟测试**(协议与端到端验证),**不是**真实研究任务。请按规范正常协作:快速尝试各功能逻辑,产出可验证的产物,并在完成后**按正确流程收敛收口**。
|
|
31
|
+
|
|
32
|
+
**断言方式(不许只"声称")**:
|
|
33
|
+
|
|
34
|
+
1. 在**运行产物** `transcript.jsonl` 里 grep **用户原句 `这是一次模拟`**;
|
|
35
|
+
2. 该命中必须落在 **`user/message` 事件**里(不是系统提示、不是回显);
|
|
36
|
+
3. 报告要写**该事件的 `seq` + 文件行号**(实测形态:`{"sink":"user/message","seq":8,…}`)。
|
|
37
|
+
|
|
38
|
+
> 提醒:短语是**用户原句**,比对时按 UTF-8 字节比对最稳(可以先取该句的 hex,再在产物里定位)。
|
|
39
|
+
|
|
40
|
+
**模拟/取反的铁律:必须拒绝新代码能走的每条路径。** 当你用"模拟一个条件不成立"来证明分支行为时(例如把某个环境变量清空、把某个根目录设为不可达、把某个解析器替换为会失败的桩),必须**逐一否认新代码可能达成该条件的每一条路径**——否则"未触发"只是**你的模拟没覆盖到**,不是代码没走那条路。可操作的判定:
|
|
41
|
+
- 先**枚举**新代码为满足该条件可以尝试的**全部**入口(环境变量/已知安装根/PATH/配置项/回退链的每一环),再**逐个**否认;
|
|
42
|
+
- 断言里要出现**"未选到任何候选"**这类**否定性证据**(例如 `exe === null`/`tried.length === N`/`result === 'not-detected'`),而不只是"结果符合预期";
|
|
43
|
+
- 若某条路径**无法否认**(本机就存在),那就把该点写成**实测边界**(§5),不要声称已覆盖。
|
|
44
|
+
|
|
45
|
+
## 3. 驱动 CLI(23 个开关)
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
--profile --port --cwd --ws --preset --task --task-file
|
|
49
|
+
--steer --steer-after --cancel --cancel-after --timeout --max-tokens
|
|
50
|
+
--quiet --out --jsonl --follow --follow-stream --follow-members
|
|
51
|
+
--allow-probe-patch --token --session --resume
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
- 常用组合:`--port <端口> --token <TOKEN> --preset vibe-math-v4 --task-file <任务> --jsonl <产物.jsonl> [--follow-stream] [--follow-members]`。
|
|
55
|
+
- **`--steer-after`** 是中途注入/中继通道:用它在运行中追加指令(例如模拟声明或中途 steer),**不要**为此另开一个会话。
|
|
56
|
+
- `--timeout` 与 `--max-tokens` **每次都要设**(见 §4)。
|
|
57
|
+
|
|
58
|
+
## 4. 预算与上限
|
|
59
|
+
|
|
60
|
+
> **这些是"一次 SLV 实验"的上限,不是"干活的人"的预算。** 它们约束的是**要被测量的那次真机运行**(一次 run 的 token/墙钟),**绝不能**被当作代理/会话的自我预算,**更不能**成为"停止、缩减或推迟验证"的理由。工作安排只有四类真实阻塞(门禁红未定位/规格歧义/需用户拍板/队友窗口确实装不下,后者由 Lead 接手)。
|
|
61
|
+
|
|
62
|
+
- **总预算 ≤ 2.5 M tokens**;分项上限:最小 `configure`+`status` **≤ 50 k**;v5 启动 + 1 轮 **≤ 250 k**;v4 启动 + 1 轮 **≤ 900 k**;2 名常驻的会议 **≤ 600 k**。
|
|
63
|
+
- **成本量级(实测)**:最小 `configure`+`status` ≈ **8 s**;v4 启动 + 1 轮 ≈ **100 s / 732,888 tokens**;v5 ≈ **21–25 s / ≈150 k**;2 名常驻会议 ≈ **64 s / 473 k** ⇒ 一律用**受管后台作业**跑,不要让前台阻塞。
|
|
64
|
+
- 到达任何上限(tokens/墙钟)⇒ 记为 **NON-RESULT**,不要写成通过;先记录、再**单跑复现**,仍红才按真回归处理。
|
|
65
|
+
|
|
66
|
+
## 5. 能建立什么、不能建立什么
|
|
67
|
+
|
|
68
|
+
**能**(在本机可达范围内):
|
|
69
|
+
|
|
70
|
+
- 多预设流程的**落位**:工具确实被注册并返回真实结果(例如 `vibe_v4_configure` / `vibe_v4_status` 的真实返回),而不是假设;
|
|
71
|
+
- 研究所/邮箱路径、会议(首位发言可观测;**后位发言需要 ≥2 名常驻**)、论文/归档的启动路径;
|
|
72
|
+
- `math_computation` 的 `probe`/`run`(本机 Python 在 PATH;R 走已知安装目录)。
|
|
73
|
+
|
|
74
|
+
**不能**:
|
|
75
|
+
|
|
76
|
+
- **没有任何引擎**(Octave/Julia/MATLAB/Maple/Wolfram 等)⇒ 这些面只能核对**诚实文本**:`configured`(配置启用)与 `absent[]`(每项带 `why`),这是**部分替代**,不是执行验证;
|
|
77
|
+
- **单客户端** ⇒ 并发要靠两个克隆 + 两个端口模拟,否则如实声明超出范围;
|
|
78
|
+
- **有界运行只能建立"落位与可观测性"**,**不能**建立"收敛/收口"结论——收敛结论必须来自随包套件。
|
|
79
|
+
|
|
80
|
+
## 6. 中止触发与处置
|
|
81
|
+
|
|
82
|
+
| 触发 | 处置 |
|
|
83
|
+
|---|---|
|
|
84
|
+
| 模拟声明没落地 | 立即中止,记为**证据失败**(不是产品通过) |
|
|
85
|
+
| 触到 token/墙钟上限 | 记为 **NON-RESULT**;需要时缩小规模(更少成员/更短任务)重跑 |
|
|
86
|
+
| 出现产品缺陷迹象 | 先**单跑复现**;复现成功 ⇒ 当真回归处理并附转录行号 |
|
|
87
|
+
| 明显是宿主限制 | 记为**诚实边界**(写清限制与观测点);**不得**写成产品通过 |
|
|
88
|
+
|
|
89
|
+
## 7. 产物、报告与清理
|
|
90
|
+
|
|
91
|
+
**产物(可引用)**:`transcript.jsonl`、`run.log`、任务文本、提取脚本、**本次运行自己的 sessionId 清单**。
|
|
92
|
+
|
|
93
|
+
**报告**(写进仓库外的工作记录)应包含:逐步证据(命令 + 退出码 + 关键输出行 + 转录行号)、模拟声明的 `seq` 与行号、逐条收敛判据的结论、**非 SLV 项的实测结果**、**诚实边界清单**(未验证/无法验证的项)。
|
|
94
|
+
|
|
95
|
+
**清理(只限自己)**:
|
|
96
|
+
|
|
97
|
+
- 只删**自己**的会话目录:`~/.dsh/sessions/<escaped-cwd>/<sessionId>/`;
|
|
98
|
+
- 只删**文件名包含自己 sessionId** 的投影缓存条目(`…/session_projcache/sessions/<sessionId>.json`);
|
|
99
|
+
- 只删**自己克隆的 profile** 与**自己起的服务/端口**;
|
|
100
|
+
- **绝不**按时间窗(例如"最近 20 分钟 mtime")批量删除——历史上这样做误删了不属于本次运行的投影缓存条目;删除数量要与预期**逐个对齐**并回报。
|
|
101
|
+
|
|
102
|
+
## 8. 最后:这次运行"证明了什么"
|
|
103
|
+
|
|
104
|
+
写结论时把"我们看到的"与"它支持的结论"分开:
|
|
105
|
+
|
|
106
|
+
- **观测**:转录里出现了什么(带 seq/行号)、工具返回了什么;
|
|
107
|
+
- **支持**:这些观测支持**落位与可观测性**;
|
|
108
|
+
- **不支持**:不能据此声称收敛、性能、或未安装引擎的行为;
|
|
109
|
+
- **非结果**:被上限/超时终止的运行,逐条列出并说明原因。
|
|
110
|
+
|
|
111
|
+
## 9. 本阶段教训(都可复核,且都已写进守卫/文档)
|
|
112
|
+
|
|
113
|
+
1. **关键词计数不是站点清单。** 用 `LaTeX|TeX` 之类的关键词在源码里数命中,得到的往往是**参数描述、注释与检测代码**,而不是"代理真正会读到的提示词"。要改提示词,先列出**构建提示词的函数**(`function .*[Pp]rompt`/`*PromptBlock`),再逐个精读。
|
|
114
|
+
2. **守卫必须逐分支验证"真的能变红"。** 一个写成"**任一**语言/任一条件满足即可"的检查,会在两种变体都存在时**悄悄失去判别力**(删掉其中一条,另一条仍然满足 ⇒ 变异**空转**)。正确做法:**按实际形态逐项断言**(例如按每个预设真正使用的语言),并让每条单点变异都**按名**变红。
|
|
115
|
+
3. **"单跑绿"不等于"门禁绿"。** 门禁并行跑几十个作业,**负载**会让依赖固定迭代上限/空闲退出的用例在**断言所等事件发生之前**就结束(实测:`e2e-v4-fixes` 的 T1/T19/T23/T26、`selfdrive-v4` 均单跑全绿、门禁偶发红)。排查顺序:**读失败原文 → 单跑复现 → 再看并行负载**;修复不要靠"把等待时间加长"(那会把"快速错答"换成"慢速超时",代价更大)。
|
|
116
|
+
4. **stdout 是机器通道。** `tests/run-tests.mjs --counts/--json` 的 stdout 会被 `scripts/update-doc-counts.mjs` 直接 `JSON.parse`;任何日志/提示写到 stdout 都会让计数刷新崩掉(实测 `SyntaxError: Unexpected token 'r'`)⇒ **日志一律走 stderr**。
|
|
117
|
+
5. **被杀死的作业不会自清。** 被超时 SIGKILL 的套件无法执行 `finally`,其临时目录会永久残留(实测 `%TEMP%` 顶层 24 万项、其中我们 24.5 万项)⇒ 由 `scripts/clean-temp.mjs` 在门禁启动时清扫陈旧目录,并**优先使用更宽裕的盘**(`D:\_tmp`)。
|
package/docs/test-timing.md
CHANGED
|
@@ -1,157 +1,158 @@
|
|
|
1
|
-
# 测试与脚本耗时基线(决定每次跑什么、怎么跑)
|
|
2
|
-
|
|
3
|
-
> **为什么要写下来**:这套仓库的测试耗时极不均匀(一个套件 100 s,大多数不到 2 s;探针脚本要
|
|
4
|
-
> 把同一套件跑十几遍)。不看数据就会犯两种错:要么每次都全量顺序跑(浪费 30 分钟),要么为了
|
|
5
|
-
> 省时间去砍测例(降低覆盖)。**先看基线,再选策略**;每次跑完把实测时间跟本表对一下,偏差大
|
|
6
|
-
> 就更新本表。
|
|
7
|
-
|
|
8
|
-
## 1. 怎么跑(并行是默认)
|
|
9
|
-
|
|
10
|
-
```bash
|
|
11
|
-
node tests/run-tests.mjs # 全部套件 + 全部探针(tests/ 下每个 .mjs),并行(并发 = min(4, CPU 核数);命令都从**仓库根**执行)
|
|
12
|
-
node tests/run-tests.mjs --only formal # 只跑名字含 formal 的项(套件与探针一起筛)
|
|
13
|
-
node tests/run-tests.mjs --concurrency=6 # 手动指定并发
|
|
14
|
-
node tests/run-tests.mjs --json # 机器可读汇总(含 skippedNeedsArgs / devCheckout)
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
`run-tests.mjs` 的收集规则(Round B 起):`tests/` 下**每个** `.mjs` 都会被跑——
|
|
18
|
-
|
|
19
|
-
- `*.test.mjs` 是**套件**;其余 `.mjs` 是**探针/审计**(灵敏度变异、注册面、自驱动守卫);
|
|
20
|
-
- 只有登记在 runner 的 `NEEDS_ARGS` 里的脚本才会被跳过(当前只有 `audit-tool-exec.mjs`:它必须带
|
|
21
|
-
`<preset-js> <tool-name>` 才能跑)。跳过项**每次运行都会打印出来**;在开发检出(存在 `.git`)里
|
|
22
|
-
该登记失效会**直接报错退出**,所以改名不可能悄悄把一条守卫踢出发布门禁;
|
|
23
|
-
- 需要参数的变体登记在 `VARIANTS`:`audit-registration.mjs` 四个预设各跑一次(裸跑只查 v3)、
|
|
24
|
-
`audit-prompt-invariants.mjs --self-probe`、以及 `audit-v3-registration-parity.mjs --self-probe`
|
|
25
|
-
(这条**成功 = 退出码 1**:它注入真实变异并要求守卫变红,runner 用 `expectExit` 表达)。
|
|
26
|
-
|
|
27
|
-
### 1.1 随包发布 vs 仅仓库(`npm pack --dry-run --json`)
|
|
28
|
-
|
|
29
|
-
`package.json` 的 `files` 只发 `tests/` 的一个**子集**(发布物共 **119** 个文件,其中 `tests/` **23** 项),
|
|
30
|
-
所以安装用户跑 `node tests/run-tests.mjs` 得到的是子集的结果——runner 会把缺失的跳过项打印出来,
|
|
31
|
-
不会静默少跑:
|
|
32
|
-
|
|
33
|
-
- **随包(23 项)**:`run-tests.mjs`、`audit-formal-sensitivity.mjs`、`audit-persona-sensitivity.mjs`、
|
|
34
|
-
`audit-prompt-invariants.mjs`、`audit-spec-traceability.mjs`、`audit-v5-integrity.mjs`、
|
|
35
|
-
`audit-v5-sensitivity.mjs`、`selfdrive-v5.mjs`、`audit-math-computation-parity.mjs`、
|
|
36
|
-
`audit-math-computation-contract.mjs`、`audit-math-computation-sensitivity.mjs`、
|
|
37
|
-
`helpers/math-computation-fake-seam.mjs`;套件 **11** 个:`audit-installer-compat`、
|
|
38
|
-
`audit-installer-policy`、`audit-persona-surface`、`audit-preset-rows`、`e2e-v5-round2`、
|
|
39
|
-
`formal-verify-v2`、`formal-verify-v3`、`formal-verify-v4`、`formal-verify-v5`、`prompt-v5-integrity`、
|
|
40
|
-
`math-computation-shared`。
|
|
41
|
-
- **仅仓库(不发)**:其余 **27** 个套件(v2/v3/v4 的 e2e、`selfdrive-v3`/`v4`、v2/v3 修复探针、
|
|
42
|
-
`math-computation-v2|v3|v4|v5`、`audit-fuzz-helpers` 之外的若干 `audit-*`……)与 7 个脚本(`audit-fuzz-helpers`、
|
|
43
|
-
`audit-registration`、`audit-roundtrip-idempotence`、`audit-tool-exec`、
|
|
44
|
-
`audit-v3-registration-parity`、`selfdrive-v3`、`selfdrive-v4`)。
|
|
45
|
-
- 因此**完整门禁只能在开发检出里跑**;发布物里的子集是"用户可自查"的一部分,不是全部证据。
|
|
46
|
-
(`audit-fuzz-helpers.mjs` 在 2.3.13 时曾随包发布;现在不在 `files` 里。)
|
|
47
|
-
|
|
48
|
-
## 2. 基线(本机:4 核 / Windows,实测)
|
|
49
|
-
|
|
50
|
-
> **最后一次复核:`167b52d`**。表中"串行/并行"是**该次复核**的实测值:套件行在**重测前**视为"上次复核值",引用前请重测或写明复核点;**变异族行**一律引用族自己打印的 `TOTAL WALL TIME` 行(不估算、不跨运行拼接)。这与 §1.1/runner 计数由 `--counts` 派生的口径一致。
|
|
51
|
-
|
|
52
|
-
| 脚本 | 串行(sum) | 并行(wall) | 实测输出 |
|
|
53
|
-
|---|---|---|---|
|
|
54
|
-
| `tests/run-tests.mjs`(**
|
|
55
|
-
| `tests/audit-formal-sensitivity.mjs`(49 探针,自带并发 4;v2 12 / v3 12 / v4 12 / v5 13) | ≈ 1035 s | **260.7 s**(实测,x3.97) | 关键路径 = v2/v3 的 `require` 探针(各 ≈75 s);全 49 条按预期变红、0 问题 |
|
|
56
|
-
| `tests/audit-v5-sensitivity.mjs`(39 探针,串行) | ≈ 101 s | — | 每条 = 一次被测套件重跑 |
|
|
57
|
-
| `tests/audit-persona-sensitivity.mjs`(16 探针) | ≈ 4.4 s | — | 本身很快,不需要并行 |
|
|
58
|
-
| `tests/audit-prompt-invariants.mjs`(157 条) | ≈ 1.9 s | — | 静态 |
|
|
59
|
-
| `tests/audit-prompt-invariants.mjs --self-probe`(5 探针) | ≈ 7.4 s | — | 每个探针 = 一次自我重跑 |
|
|
60
|
-
| `tests/audit-spec-traceability.mjs`(94 条) | ≈ 0.2 s | — | 静态 |
|
|
61
|
-
| `tests/audit-v5-integrity.mjs` | ≈ 0.6 s | — | 静态审计(含扫描器自检) |
|
|
62
|
-
| `tests/audit-registration.mjs`(4 个预设各一次) | ≈ 1.0 s | — | 裸跑只查 v3,所以 runner 跑四个变体 |
|
|
63
|
-
| `tests/audit-v3-registration-parity.mjs`(+ `--self-probe`) | ≈ 0.3 s | — | 自探针**成功 = exit 1**(变异后守卫必须变红) |
|
|
64
|
-
| `tests/prompt-v5-integrity.test.mjs` | ≈ 2.2 s | — | 虚拟时钟下生成 v5 语料(语料字节稳定;**stdout 里的会议成员顺序仍是运行间随机的**,只有落盘语料是逐字节确定的) |
|
|
65
|
-
| `tests/e2e-v5-round2.test.mjs` | **≈ 16.3 s**(`167b52d` 实测,ALL GREEN;**断言条数不写在这里** —— 它随轮次变化,跑一次即知) | — | v5 e2e:邮箱/唤醒、轮次计数(§[47] 失败唤醒仍 pending、§[51] 重建后仍 `轮次 2`)、预置快照不被覆盖、命名研究所、失败轮次等;**早先此处记 ≈3.2 s 是旧口径**,正文小节也已随轮次更新 |
|
|
66
|
-
| `tests/
|
|
67
|
-
| `tests/
|
|
68
|
-
| `tests/
|
|
69
|
-
| `tests/
|
|
70
|
-
| `tests/v2-
|
|
71
|
-
| `tests/v2-
|
|
72
|
-
| `tests/
|
|
73
|
-
| `tests/math-computation-
|
|
74
|
-
| `tests/math-computation-
|
|
75
|
-
| `tests/math-computation-
|
|
76
|
-
| `tests/math-computation-
|
|
77
|
-
| `tests/
|
|
78
|
-
| `tests/audit-math-computation-
|
|
79
|
-
| `tests/audit-math-computation-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
>
|
|
83
|
-
>
|
|
84
|
-
>
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
| `
|
|
92
|
-
| `
|
|
93
|
-
| `e2e-
|
|
94
|
-
| `
|
|
95
|
-
| `
|
|
96
|
-
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
>
|
|
100
|
-
>
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
>
|
|
125
|
-
>
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
"
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
- `audit-
|
|
141
|
-
- `audit-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
|
151
|
-
|
|
|
152
|
-
|
|
|
153
|
-
|
|
|
154
|
-
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
1
|
+
# 测试与脚本耗时基线(决定每次跑什么、怎么跑)
|
|
2
|
+
|
|
3
|
+
> **为什么要写下来**:这套仓库的测试耗时极不均匀(一个套件 100 s,大多数不到 2 s;探针脚本要
|
|
4
|
+
> 把同一套件跑十几遍)。不看数据就会犯两种错:要么每次都全量顺序跑(浪费 30 分钟),要么为了
|
|
5
|
+
> 省时间去砍测例(降低覆盖)。**先看基线,再选策略**;每次跑完把实测时间跟本表对一下,偏差大
|
|
6
|
+
> 就更新本表。
|
|
7
|
+
|
|
8
|
+
## 1. 怎么跑(并行是默认)
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
node tests/run-tests.mjs # 全部套件 + 全部探针(tests/ 下每个 .mjs),并行(并发 = min(4, CPU 核数);命令都从**仓库根**执行)
|
|
12
|
+
node tests/run-tests.mjs --only formal # 只跑名字含 formal 的项(套件与探针一起筛)
|
|
13
|
+
node tests/run-tests.mjs --concurrency=6 # 手动指定并发
|
|
14
|
+
node tests/run-tests.mjs --json # 机器可读汇总(含 skippedNeedsArgs / devCheckout)
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
`run-tests.mjs` 的收集规则(Round B 起):`tests/` 下**每个** `.mjs` 都会被跑——
|
|
18
|
+
|
|
19
|
+
- `*.test.mjs` 是**套件**;其余 `.mjs` 是**探针/审计**(灵敏度变异、注册面、自驱动守卫);
|
|
20
|
+
- 只有登记在 runner 的 `NEEDS_ARGS` 里的脚本才会被跳过(当前只有 `audit-tool-exec.mjs`:它必须带
|
|
21
|
+
`<preset-js> <tool-name>` 才能跑)。跳过项**每次运行都会打印出来**;在开发检出(存在 `.git`)里
|
|
22
|
+
该登记失效会**直接报错退出**,所以改名不可能悄悄把一条守卫踢出发布门禁;
|
|
23
|
+
- 需要参数的变体登记在 `VARIANTS`:`audit-registration.mjs` 四个预设各跑一次(裸跑只查 v3)、
|
|
24
|
+
`audit-prompt-invariants.mjs --self-probe`、以及 `audit-v3-registration-parity.mjs --self-probe`
|
|
25
|
+
(这条**成功 = 退出码 1**:它注入真实变异并要求守卫变红,runner 用 `expectExit` 表达)。
|
|
26
|
+
|
|
27
|
+
### 1.1 随包发布 vs 仅仓库(`npm pack --dry-run --json`)
|
|
28
|
+
|
|
29
|
+
`package.json` 的 `files` 只发 `tests/` 的一个**子集**(发布物共 **119** 个文件,其中 `tests/` **23** 项),
|
|
30
|
+
所以安装用户跑 `node tests/run-tests.mjs` 得到的是子集的结果——runner 会把缺失的跳过项打印出来,
|
|
31
|
+
不会静默少跑:
|
|
32
|
+
|
|
33
|
+
- **随包(23 项)**:`run-tests.mjs`、`audit-formal-sensitivity.mjs`、`audit-persona-sensitivity.mjs`、
|
|
34
|
+
`audit-prompt-invariants.mjs`、`audit-spec-traceability.mjs`、`audit-v5-integrity.mjs`、
|
|
35
|
+
`audit-v5-sensitivity.mjs`、`selfdrive-v5.mjs`、`audit-math-computation-parity.mjs`、
|
|
36
|
+
`audit-math-computation-contract.mjs`、`audit-math-computation-sensitivity.mjs`、
|
|
37
|
+
`helpers/math-computation-fake-seam.mjs`;套件 **11** 个:`audit-installer-compat`、
|
|
38
|
+
`audit-installer-policy`、`audit-persona-surface`、`audit-preset-rows`、`e2e-v5-round2`、
|
|
39
|
+
`formal-verify-v2`、`formal-verify-v3`、`formal-verify-v4`、`formal-verify-v5`、`prompt-v5-integrity`、
|
|
40
|
+
`math-computation-shared`。
|
|
41
|
+
- **仅仓库(不发)**:其余 **27** 个套件(v2/v3/v4 的 e2e、`selfdrive-v3`/`v4`、v2/v3 修复探针、
|
|
42
|
+
`math-computation-v2|v3|v4|v5`、`audit-fuzz-helpers` 之外的若干 `audit-*`……)与 7 个脚本(`audit-fuzz-helpers`、
|
|
43
|
+
`audit-registration`、`audit-roundtrip-idempotence`、`audit-tool-exec`、
|
|
44
|
+
`audit-v3-registration-parity`、`selfdrive-v3`、`selfdrive-v4`)。
|
|
45
|
+
- 因此**完整门禁只能在开发检出里跑**;发布物里的子集是"用户可自查"的一部分,不是全部证据。
|
|
46
|
+
(`audit-fuzz-helpers.mjs` 在 2.3.13 时曾随包发布;现在不在 `files` 里。)
|
|
47
|
+
|
|
48
|
+
## 2. 基线(本机:4 核 / Windows,实测)
|
|
49
|
+
|
|
50
|
+
> **最后一次复核:`167b52d`**。表中"串行/并行"是**该次复核**的实测值:套件行在**重测前**视为"上次复核值",引用前请重测或写明复核点;**变异族行**一律引用族自己打印的 `TOTAL WALL TIME` 行(不估算、不跨运行拼接)。这与 §1.1/runner 计数由 `--counts` 派生的口径一致。
|
|
51
|
+
|
|
52
|
+
| 脚本 | 串行(sum) | 并行(wall) | 实测输出 |
|
|
53
|
+
|---|---|---|---|
|
|
54
|
+
| `tests/run-tests.mjs`(**106 项作业**(job count)= 44 套件 + 62 探针/变体;**由 `--counts` 派生**) | ≈ 424 s(历史基线) | **≈ 121 s**(历史基线;当前实测墙钟 ≈ 200 s,并发 4) | `TOTAL 106 PASS 106 FAIL 0 (suites 44 · probes 62)`;实测 `wall 120.7s · sum 424.2s`,关键路径 = `e2e-v4-fixes`(≈ 98 s) |
|
|
55
|
+
| `tests/audit-formal-sensitivity.mjs`(49 探针,自带并发 4;v2 12 / v3 12 / v4 12 / v5 13) | ≈ 1035 s | **260.7 s**(实测,x3.97) | 关键路径 = v2/v3 的 `require` 探针(各 ≈75 s);全 49 条按预期变红、0 问题 |
|
|
56
|
+
| `tests/audit-v5-sensitivity.mjs`(39 探针,串行) | ≈ 101 s | — | 每条 = 一次被测套件重跑 |
|
|
57
|
+
| `tests/audit-persona-sensitivity.mjs`(16 探针) | ≈ 4.4 s | — | 本身很快,不需要并行 |
|
|
58
|
+
| `tests/audit-prompt-invariants.mjs`(157 条) | ≈ 1.9 s | — | 静态 |
|
|
59
|
+
| `tests/audit-prompt-invariants.mjs --self-probe`(5 探针) | ≈ 7.4 s | — | 每个探针 = 一次自我重跑 |
|
|
60
|
+
| `tests/audit-spec-traceability.mjs`(94 条) | ≈ 0.2 s | — | 静态 |
|
|
61
|
+
| `tests/audit-v5-integrity.mjs` | ≈ 0.6 s | — | 静态审计(含扫描器自检) |
|
|
62
|
+
| `tests/audit-registration.mjs`(4 个预设各一次) | ≈ 1.0 s | — | 裸跑只查 v3,所以 runner 跑四个变体 |
|
|
63
|
+
| `tests/audit-v3-registration-parity.mjs`(+ `--self-probe`) | ≈ 0.3 s | — | 自探针**成功 = exit 1**(变异后守卫必须变红) |
|
|
64
|
+
| `tests/prompt-v5-integrity.test.mjs` | ≈ 2.2 s | — | 虚拟时钟下生成 v5 语料(语料字节稳定;**stdout 里的会议成员顺序仍是运行间随机的**,只有落盘语料是逐字节确定的) |
|
|
65
|
+
| `tests/e2e-v5-round2.test.mjs` | **≈ 16.3 s**(`167b52d` 实测,ALL GREEN;**断言条数不写在这里** —— 它随轮次变化,跑一次即知) | — | v5 e2e:邮箱/唤醒、轮次计数(§[47] 失败唤醒仍 pending、§[51] 重建后仍 `轮次 2`)、预置快照不被覆盖、命名研究所、失败轮次等;**早先此处记 ≈3.2 s 是旧口径**,正文小节也已随轮次更新 |
|
|
66
|
+
| `tests/audit-engine-faces.mjs`(**环境感知**:存在才跑,缺席 SKIP) | — | **≈ 15 s**(本机三面齐全:Lean 真编译 + 数值真跑 + LaTeX 起点) | 引擎缺席时打印 `SKIP: no <engine> on this machine (<reason>)`,**不判红**;三面齐全时 13/0/0 |
|
|
67
|
+
| `tests/v5-institute-fixes.mutants.mjs`(**变异族**) | — | **族自报 `TOTAL WALL TIME` ≈300 s**(本轮 298959 ms;复核方 299649 / 295216 ms —— ~1.5% 机器差异,**不要合成单点数字**) | 11/11 族具名变红、`hangs=[]`、`skipped=[]`、`ALL MUTANTS RED AS REQUIRED`;900 s 覆盖(见 `docs/AUDIT-CHECKLIST.md` 的跑测超时行) |
|
|
68
|
+
| `tests/host-failure-paths.test.mjs` | ≈ 6.3 s | — | 真实宿主的失败路径(`kind:'error'`、`/v4 set` 键校验、失败轮次不算进展) |
|
|
69
|
+
| `tests/v4-mailbox-stall.test.mjs` | ≈ 7.1 s | — | `sendMessage` 拒绝后必须重投并唤醒(control + treatment 各一个 host) |
|
|
70
|
+
| `tests/v2-fix-probes.test.mjs` | ≈ 8.6 s | — | v2 的 flat 等权均值 / ≥2 名验证者 / runShell 失败分支(26 条) |
|
|
71
|
+
| `tests/v2-path-escape.test.mjs` | ≈ 2.2 s | — | 验证日志路径逃逸(7 条) |
|
|
72
|
+
| `tests/v2-tool-cap.test.mjs` | ≈ 0.4 s | — | 能力表来自真实组合、*MaxToolCalls 只是提示(10 条) |
|
|
73
|
+
| `tests/math-computation-v2.test.mjs` | ≈ 1.7 s | — | v2 接线:六参数/双注册层/回执/归档→编辑→重跑/跨会话隔离(含 mutant 说明在文件头) |
|
|
74
|
+
| `tests/math-computation-v3.test.mjs` | ≈ 1.7 s | — | v3 同上(dual-layer + `TOOL_DESC` 描述 parity) |
|
|
75
|
+
| `tests/math-computation-v4.test.mjs` | ≈ 2.5 s | — | v4:每会话一个模块实例 + 隔离断言 + `vibe_v4_set` 闭集 + 单点注册 |
|
|
76
|
+
| `tests/math-computation-v5.test.mjs` | ≈ 1.4 s | — | v5:闭集 `vibe_v5_set`、研究所根回执、会话隔离(7 个 mutant) |
|
|
77
|
+
| `tests/math-computation-shared.test.mjs` | ≈ 0.1 s | — | 共享模块契约(参数/失败码/argv/回执/归档/并发/override/路径守卫),走假 subprocess seam |
|
|
78
|
+
| `tests/audit-math-computation-parity.mjs` | ≈ 0.1 s | — | 四份副本字节一致 + canonical 一致 + 两条安装线 + 描述符不变式(44 条) |
|
|
79
|
+
| `tests/audit-math-computation-contract.mjs` | ≈ 0.2 s | — | 跨预设接线(含 set-schema **属性级**检查与 defaults 漂移检查) |
|
|
80
|
+
| `tests/audit-math-computation-sensitivity.mjs` | ≈ 25 s | — | 21 个模块级变异,每条都要求具名断言变红(控制组必须绿) |
|
|
81
|
+
|
|
82
|
+
> 上表 `run-tests` 的 `≈424 s / ≈121 s` 两列是 **当时的门禁规模**(44 个套件、21 个探针/变体) 时的实测(2026 年 math_computation
|
|
83
|
+
> P1/P2a + 审计修复轮之后)。`audit-formal-sensitivity`(49 探针,实测 wall 260.7 s)与 `e2e-v4-fixes`(≈ 98 s)
|
|
84
|
+
> 是两条最长的独立路径;两者都不在 `run-tests` 的默认集合里时,整轮 wall 由 `e2e-v4-fixes` 决定。
|
|
85
|
+
> 数字**形状**(`TOTAL <n> … suites <s> · probes <p>`;具体值以 runner 每次运行的输出为准,本文件**不复述**)——本文件里出现的每个 `TOTAL <n>` 都由 `tests/audit-readme-counts.mjs` 与 `--counts` 对账(历史数字只出现在冻结的 `docs/release-notes/**` 里,按名排除)。
|
|
86
|
+
|
|
87
|
+
单套件耗时(并行时的关键路径按此排序):
|
|
88
|
+
|
|
89
|
+
| 套件 | 耗时 | 备注 |
|
|
90
|
+
|---|---|---|
|
|
91
|
+
| `e2e-v4-fixes.test.mjs` | **≈ 104 s** | 9 个用例是**轮次采样**型(如 T13 采样 400 轮、T19/T25 多轮);时间 ≈ 轮数 × 框架自身的 40 ms 计时粒度 |
|
|
92
|
+
| `formal-verify-v2.test.mjs` | **≈ 43 s** | 曾为 186 s:见 §3 |
|
|
93
|
+
| `e2e-v3.test.mjs` | ≈ 21 s | |
|
|
94
|
+
| `e2e-regression.test.mjs` | ≈ 14 s | |
|
|
95
|
+
| `formal-verify-v3.test.mjs` | ≈ 13 s | |
|
|
96
|
+
| `e2e-business.test.mjs` / `e2e-d9-d13.test.mjs` | ≈ 13 s | |
|
|
97
|
+
| 其余套件 | ≤ 10 s | 其中绝大多数 < 2 s |
|
|
98
|
+
|
|
99
|
+
> 优化前:全量回归 ≈ 5.5 min(串行,`formal-verify-v2` 单独 186 s);
|
|
100
|
+
> 探针脚本 ≈ **38 min**(49 条串行,其中 12 条 × `formal-verify-v2` 162 s)。
|
|
101
|
+
> 现在:**一套 `node tests/run-tests.mjs` ≈ 3.5 min 覆盖套件 + 探针**(探针单独跑仍是 ≈2.6 min)。
|
|
102
|
+
|
|
103
|
+
## 3. 已经做过的优化(别再重复踩)
|
|
104
|
+
|
|
105
|
+
1. **v2 套件 186 s → 32 s**(5.8×,断言数不变 261):
|
|
106
|
+
- 插件用 `setInterval(..., 1000)` 轮询调度器,套件的每次 `tick()` 都得等满 1 秒;
|
|
107
|
+
套件现在**只把 `setInterval` 快进到 25 ms**(自己的 `sleep` 用 `setTimeout`,不受影响),
|
|
108
|
+
插件内部"该不该 tick"仍按真实 200 ms 下限判断,**生产代码零改动**;
|
|
109
|
+
- `verifyWithDebate` 的 16 次循环**从不提前退出**(判据是 `autoDone` 之类永远不会发生的条件),
|
|
110
|
+
于是每次调用都烧满 16×1.3 s ≈ 21 s。现在按"连续 3 轮没有新 followup"提前退出。
|
|
111
|
+
2. **v4-fixes 的 12 个轮询循环加了"安静即停"**(105 s → 98 s):原判据
|
|
112
|
+
`autoDone || running===false` 对活着的 run 永远不成立,循环只是空转;
|
|
113
|
+
现在连续 100 次无待答 followup 就停(`V4_IDLE_POLLS` 可调)。
|
|
114
|
+
**再往下压就要砍采样深度了**——那 9 个慢用例(T13/T19/T22/T23/T25/T27/T2/T9/T20)是在
|
|
115
|
+
观察"多轮之后某个指令**没有**泄漏/重复",轮数是它们的不变式本体,不要再动。
|
|
116
|
+
3. **两个 runner 并行**(Round A):探针 38 min → 2.6 min(sum 612 s,wall 154.6 s,x3.96);
|
|
117
|
+
全量回归 5.5 min → 1.9 min(sum 221.5 s,wall 111.5 s,x1.99)。
|
|
118
|
+
4. **虚拟时钟**(`prompt-v5-integrity.test.mjs`):v5 研究所由 `ctx.timeout` + `Date.now()`
|
|
119
|
+
驱动,真实时钟下"哪个成员被心跳/会议唤醒"取决于负载与毫秒差 → **随包语料每跑一次都变**(无法 diff,
|
|
120
|
+
真实缺陷会被淹没)。套件现在把 `ctx.timeout` 接到**虚拟时钟**、`sleep(n)` 推进虚拟时间:
|
|
121
|
+
套件 **7–9 s → 1.7 s**,且语料连续 6 次运行**字节一致**。语料写入端另加**全序排序**
|
|
122
|
+
(kind → owner → prompt),使文件成为"记录集合"的纯函数——只按 kind 排序时,同 kind 内仍会随
|
|
123
|
+
异步 drain 顺序变化(真实事故:两条会议提示词顺序互换)。
|
|
124
|
+
> 想给别的套件套用同一手法前请注意:若套件的等待助手用 `Date.now()` 做**超时判据**、又用
|
|
125
|
+
> `setInterval` 轮询(例如 `e2e-v4-fixes.test.mjs` 的 `waitFor`),冻结时钟会让判据永不超时;
|
|
126
|
+
> 那种情况必须连**轮询定时器**一起虚拟化,不能只改 `sleep`。
|
|
127
|
+
5. **语料里的随机 id 也要归一化**(Round B,`formal-verify-v4.test.mjs`):v4 的
|
|
128
|
+
`propose_task` 用 `Math.random` 造 `t-<8 位 hex>`,语料把 `[YOU CLAIMED TASK t-…]` 逐字写盘,
|
|
129
|
+
于是**每次跑测试都会改写随包语料**(`git status` 永远有 `prompt-corpus-v4/*`,且违反
|
|
130
|
+
`AUDIT-CHECKLIST` §2.4"连续两次哈希相同")。`scrub()` 现在把它归一化成 `<TASKID>`,并断言
|
|
131
|
+
"语料里既没有裸 id、也真的有 `<TASKID>`"。连续两次运行哈希相同(`d3381886…` / `e6c4e445…`)。
|
|
132
|
+
|
|
133
|
+
## 4. 并行安全(为什么可以并发)
|
|
134
|
+
|
|
135
|
+
- 每个套件/探针都自建 `mkdtempSync` 工作区,互不共享状态;
|
|
136
|
+
- **会写语料的套件必须给不同的语料目录**:`V2_CORPUS_DIR` / `V3_CORPUS_DIR` / `V4_CORPUS_DIR` /
|
|
137
|
+
`V5_CORPUS_DIR`。探针 runner 为**每个探针**分配独立目录,否则同一套件的并发实例会互相覆盖语料;
|
|
138
|
+
- `audit-v5-sensitivity.mjs` 现在**自己**把 `V5_CORPUS_DIR` 指向临时目录:被变异的插件绝不能把
|
|
139
|
+
自己的提示词倒进随包语料;
|
|
140
|
+
- `audit-persona-sensitivity.mjs` 用 `PERSONA_ROOT` 指向变异副本,且在覆盖模式下**不写**语料;
|
|
141
|
+
- `audit-formal-sensitivity.mjs` 同样给每个探针独立的 `V{2,3,4,5}_CORPUS_DIR`;
|
|
142
|
+
- `audit-prompt-invariants.mjs --self-probe` 用 `PROMPT_INVARIANTS_MUTATE`(JSON `[rel, from, to]`)
|
|
143
|
+
在**内存里**变异一个文件并自我重跑,**不碰磁盘**,因此可与任何东西并发;
|
|
144
|
+
变异串里不要用 NUL 分隔(环境变量不允许 NUL 字节)。
|
|
145
|
+
|
|
146
|
+
## 5. 策略建议(按目的选最小代价的组合)
|
|
147
|
+
|
|
148
|
+
| 目的 | 跑什么 | 预期 |
|
|
149
|
+
|---|---|---|
|
|
150
|
+
| 改了某个架构的插件 | `node tests/run-tests.mjs --only <vN>` + `node tests/audit-formal-sensitivity.mjs --only=vN` | 30 s – 3.5 min |
|
|
151
|
+
| 改了提示词/人设 | `node tests/run-tests.mjs --only persona --only prompt` + `node tests/audit-persona-sensitivity.mjs` | ≈ 20 s |
|
|
152
|
+
| **改了任何工具的参数 schema / 参数处理** | `node tests/run-tests.mjs --only audit-prompt-invariants --only formal` | ≈ 60 s(v2 套件占大头) |
|
|
153
|
+
| 改了 `tests/` 下的 runner/守卫 | `node tests/run-tests.mjs`(**必须**:它现在同时跑套件与探针,任何一条守卫变红都会让门禁失败) | **≈ 3.5 min** |
|
|
154
|
+
| 只想快速看提示词/文档有没有漂移 | `node tests/audit-prompt-invariants.mjs && node tests/audit-spec-traceability.mjs` | **< 3 s** |
|
|
155
|
+
| 只想知道"快不快" | `node tests/run-tests.mjs --json` | 读 `wallSeconds` / `slowest` |
|
|
156
|
+
|
|
157
|
+
**每次跑完都要看那几行 timing**:如果某个套件突然比基线慢很多,先怀疑新增的固定等待,
|
|
158
|
+
再怀疑它是否在等一个永远不会发生的条件(这正是 v2 套件 186 s 的成因)。
|