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.
Files changed (106) hide show
  1. package/LICENSE +21 -21
  2. package/README.en.md +682 -682
  3. package/README.md +683 -683
  4. package/docs/AUDIT-CHECKLIST.md +758 -744
  5. package/docs/COMPAT-AUDIT-ROUND2.md +351 -351
  6. package/docs/COMPAT-AUDIT-ROUND3.md +154 -154
  7. package/docs/audit-methodology.md +93 -0
  8. package/docs/final-paper.md +172 -172
  9. package/docs/formal-verification.md +613 -588
  10. package/docs/generate_framework_diagram_v2.py +114 -114
  11. package/docs/generate_framework_diagram_v3.py +127 -127
  12. package/docs/math-computation.md +195 -194
  13. package/docs/release-notes/README.en.md +2 -0
  14. package/docs/release-notes/README.md +2 -0
  15. package/docs/release-notes/RELEASE-NOTES-2.0.22.md +112 -112
  16. package/docs/release-notes/RELEASE-NOTES-2.1.0.md +143 -143
  17. package/docs/release-notes/RELEASE-NOTES-2.2.0.md +266 -266
  18. package/docs/release-notes/RELEASE-NOTES-2.2.1.md +43 -43
  19. package/docs/release-notes/RELEASE-NOTES-2.2.2.md +88 -88
  20. package/docs/release-notes/RELEASE-NOTES-2.3.0.md +207 -207
  21. package/docs/release-notes/RELEASE-NOTES-2.3.1.md +134 -134
  22. package/docs/release-notes/RELEASE-NOTES-2.3.10.md +105 -105
  23. package/docs/release-notes/RELEASE-NOTES-2.3.11.md +57 -57
  24. package/docs/release-notes/RELEASE-NOTES-2.3.12.md +80 -80
  25. package/docs/release-notes/RELEASE-NOTES-2.3.2.md +145 -145
  26. package/docs/release-notes/RELEASE-NOTES-2.3.3.md +115 -115
  27. package/docs/release-notes/RELEASE-NOTES-2.3.4.md +69 -69
  28. package/docs/release-notes/RELEASE-NOTES-2.3.5.md +63 -63
  29. package/docs/release-notes/RELEASE-NOTES-2.3.6.md +66 -66
  30. package/docs/release-notes/RELEASE-NOTES-2.3.7.md +59 -59
  31. package/docs/release-notes/RELEASE-NOTES-2.3.8.md +45 -45
  32. package/docs/release-notes/RELEASE-NOTES-2.3.9.md +70 -70
  33. package/docs/release-notes/RELEASE-NOTES-2.8.0.en.md +65 -0
  34. package/docs/release-notes/RELEASE-NOTES-2.8.0.md +65 -0
  35. package/docs/release-notes/RELEASE-NOTES-2.8.1.en.md +49 -0
  36. package/docs/release-notes/RELEASE-NOTES-2.8.1.md +49 -0
  37. package/docs/release-playbook.md +111 -0
  38. package/docs/slv-playbook.md +117 -0
  39. package/docs/test-timing.md +158 -157
  40. package/docs//346/236/266/346/236/204/345/233/276.md +77 -77
  41. package/installer.js +792 -792
  42. package/package.json +18 -3
  43. package/prompt-corpus-v2/formal-verify-v2.json +2 -2
  44. package/prompt-corpus-v2/formal-verify-v2.md +4 -0
  45. package/prompt-corpus-v3/formal-verify-v3.json +7 -7
  46. package/prompt-corpus-v3/formal-verify-v3.md +14 -0
  47. package/prompt-corpus-v5/prompt-corpus-v5.json +61 -61
  48. package/prompt-corpus-v5/prompt-corpus-v5.md +122 -0
  49. package/scripts/clean-temp.mjs +234 -0
  50. package/scripts/release-check.mjs +181 -0
  51. package/tests/audit-engine-faces.mjs +298 -0
  52. package/tests/audit-formal-sensitivity.mjs +345 -342
  53. package/tests/audit-installer-compat.test.mjs +256 -256
  54. package/tests/audit-math-computation-sensitivity.mjs +1 -1
  55. package/tests/audit-persona-sensitivity.mjs +323 -323
  56. package/tests/audit-persona-surface.test.mjs +431 -431
  57. package/tests/audit-prompt-duplication.mutants.mjs +3 -2
  58. package/tests/audit-prompt-invariants.mjs +589 -546
  59. package/tests/audit-registration.mjs +78 -78
  60. package/tests/audit-spec-traceability.mjs +193 -193
  61. package/tests/audit-status-report-fields.mjs +172 -172
  62. package/tests/audit-v5-integrity.mjs +795 -795
  63. package/tests/audit-v5-sensitivity.mjs +433 -432
  64. package/tests/e2e-v5-round2.test.mjs +2453 -2426
  65. package/tests/formal-verify-v2.test.mjs +1806 -1800
  66. package/tests/formal-verify-v3.test.mjs +1757 -1750
  67. package/tests/formal-verify-v4.test.mjs +2114 -2106
  68. package/tests/formal-verify-v5.test.mjs +774 -767
  69. package/tests/math-computation-discovery.mutants.mjs +3 -3
  70. package/tests/math-computation-shared.test.mjs +122 -5
  71. package/tests/math-computation-v2.test.mjs +14 -2
  72. package/tests/math-computation-v3.test.mjs +14 -2
  73. package/tests/math-computation-v4.test.mjs +739 -739
  74. package/tests/prompt-v5-integrity.test.mjs +1291 -1291
  75. package/tests/release-check.mutants.mjs +78 -0
  76. package/tests/run-tests.mjs +393 -332
  77. package/tests/selfdrive-v5.mjs +560 -560
  78. package/tests/temp-hygiene.mutants.mjs +80 -0
  79. package/tests/v2-fix-probes.mutants.mjs +4 -0
  80. package/tests/v2-fix-probes.test.mjs +1034 -1033
  81. package/tests/v2v3-interrupt.mutants.mjs +111 -0
  82. package/tests/v3-fix-probes.mutants.mjs +99 -95
  83. package/tests/v3-fix-probes.test.mjs +891 -890
  84. package/tests/v4-final-paper.mutants.mjs +116 -0
  85. package/tests/v4-final-paper.test.mjs +628 -0
  86. package/tests/v5-institute-fixes.mutants.mjs +218 -190
  87. package/vibe-math-v2/agent.cordis.yml +376 -376
  88. package/vibe-math-v2/math-computation.js +17 -15
  89. package/vibe-math-v2/preset.yml +2 -2
  90. package/vibe-math-v2/v2/347/232/204/351/242/235/345/244/226/350/246/201/346/261/202.txt +21 -21
  91. package/vibe-math-v2/vibe-math-v2.js +5078 -5011
  92. package/vibe-math-v2//345/256/236/347/216/260/346/226/271/346/241/210.md +486 -486
  93. package/vibe-math-v3/agent.cordis.yml +420 -420
  94. package/vibe-math-v3/math-computation.js +17 -15
  95. package/vibe-math-v3/preset.yml +2 -2
  96. package/vibe-math-v3/vibe-math-v3.js +6215 -6149
  97. package/vibe-math-v3//345/256/236/347/216/260/346/226/271/346/241/210.md +649 -649
  98. package/vibe-math-v4/agent.cordis.yml +438 -438
  99. package/vibe-math-v4/math-computation.js +17 -15
  100. package/vibe-math-v4/preset.yml +2 -2
  101. package/vibe-math-v4/vibe-math-v4.js +4520 -4422
  102. package/vibe-math-v4//345/256/236/347/216/260/346/226/271/346/241/210.md +1015 -1015
  103. package/vibe-math-v5/math-computation.js +17 -15
  104. package/vibe-math-v5/vibe-math-v5.js +93 -11
  105. package/vibe-math-v5//345/256/236/347/216/260/346/226/271/346/241/210.md +1728 -1728
  106. package/vibe-math-v5//346/236/266/346/236/204/345/233/276.md +693 -693
@@ -1,112 +1,112 @@
1
- # v2.0.22 — 兼容性修复与数据安全加固
2
-
3
- > 目标宿主:**DSH 0.1.5-rc.2**(`dsh.testedVersion`)。`minVersion` 仍为 `0.1.2-rc.1`。
4
- > 本版**无破坏性改动**,升级路径与以往一致(`dsh plugin update dsh-vibe-math` 后重启 DSH)。
5
- > 三套预设(v2 / v3 / v4)**都要更新**。
6
- >
7
- > 本版包含自 v2.0.21 以来的全部改动:**① DSH 0.1.5-rc.2 兼容性修复**(下文第一部分)与
8
- > **② 上一轮深度审计修复**(本文件末尾「附:v2.0.21 之后的审计修复」)。
9
-
10
- ## ⚠️ 升级前请先读这一条(可能影响你的数据)
11
-
12
- **v2.0.21 及更早存在一个数据丢失缺陷**:当项目里的 JSON 状态文件被外部损坏(手工编辑出错、磁盘写入中断、编辑器崩溃等)时,插件会把"无法解析"误当成"文件不存在",随后用空数据把它覆盖掉 —— 表现为**问题清单/命题库/运行状态被静默清空**。
13
-
14
- 本版修好了这个缺陷,但**它无法恢复已经被清空的历史数据**。如果你曾遇到过"知识库内容无故消失",请注意:
15
-
16
- - 该缺陷的影响面:v2 的 `qs/qs.json`、`Propos/*.json`、`Verified/*.json`;v3/v4 的 `State/*.json`。
17
- - 修复后的行为:一旦检测到"文件存在但无法解析",插件会**打印告警并拒绝覆盖该文件**,等你修复或删除它。
18
- - 因此升级后如果看到 `exists but is not parseable JSON — REFUSING to overwrite it` 之类的日志,说明该文件本来就是坏的:请先修好或重命名它,插件才会继续写入。
19
-
20
- ## 修复清单
21
-
22
- ### 兼容性(针对 DSH 0.1.5-rc.2)
23
-
24
- | 项 | 问题 | 影响 |
25
- |---|---|---|
26
- | **工具权限过滤器被宿主拒绝** | v2/v3 的权限名表硬编码了 `web`/`fetch`(**从来不是工具名**),且 `bash` 在 Windows 上因预设 `disabled: process.platform==='win32'` 未注册。宿主 `tools.restrict()` 对未注册名**直接抛错**,而过滤器是在建立子代理时应用的 | **想收紧网络/脚本权限时(`solverAllowNetwork:false` / `solverAllowScripts:false`)子代理永远起不来**,调度卡住。已改为按本平台真实注册名,并加"只保留宿主确认合法的名字"的带守卫重试;过滤后若为空则**拒绝派发**(宁可这一轮不派,也不越权) |
27
- | **v4 的真实 `/compact` 是死代码** | `realCompact()` 在 `subagent/end` 里查 `agents.get(childId)`,但宿主时序是「先 `handle.dispose()` → 子代理移出注册表 → 之后才 emit `subagent/end`」,查询**必然** 返回 undefined | 真实压缩**从未执行**,上下文只靠模型自报占比。已改为在 `subagent/start` 捕获活 Agent 引用(`WeakRef` 持有,end 处理后释放) |
28
- | **预设 realm 配置不生效** | compaction 隔离组的用途(DSH 自带 `standard` 预设注释原话)是"让预设决定自己的 agent 是否/如何压缩",但插件行在 realm 之外,取到的是**宿主根**实例 | 插件代常驻发起的压缩用的是宿主配置,与常驻自压的实例不一致。已改为经**子代理自身 `agent.ctx`** 解析,两条路径落到同一实例 |
29
- | **可选服务在 `apply()` 同步快照** | `subprocess`/`sandboxPolicy`/`compaction` 在挂载时一次性读取,受挂载顺序影响会永久为 `undefined` | `runShell` 静默失效、`ensureDirs()` 不再建目录(仅被 `fs.writeText` 自动建父目录掩盖)。已改为**惰性读取** |
30
- | **v4 注册未纳入 `ctx.effect`** | `tools.register`/`commands.register` 的 disposer 被丢弃 | 预设卸载/HMR 后注册不回收、重复挂载会撞名。已与 v2/v3 一致地纳入 `ctx.effect` |
31
- | **安装器自检漏检三个服务** | 原先只查 `fs.resolve` 外形 | 现在把 `subprocess`/`sandboxPolicy`/`compaction` 也纳入自检,并区分**必需**(缺失即告警)与**可选降级**(只提示降级、不影响挂载) |
32
-
33
- ### 数据安全 / 正确性
34
-
35
- | 项 | 问题 |
36
- |---|---|
37
- | **损坏 JSON 被静默覆盖**(见上"升级前请先读") | 三套预设均已加"读取时记录 + 写入时拒写"守卫;v4 另在写前惰性检查磁盘内容,覆盖"只 configure/start、从未 `loadAll`"的路径 |
38
- | **沙箱围栏根静默改变** | `getPolicy()` 的 `resolve({})` 回退会把围栏根换成宿主配置的 workspace(不一定是本会话 cwd),且异常被静默吞掉。现在首次触发即打印可见告警 |
39
- | **fail-closed 自纠** | 上一条"重试"若把过滤器全部名字都过滤掉,原实现会删掉过滤器继续派发(等于放开全部权限)。已改为拒绝派发 |
40
-
41
- ### 文档
42
-
43
- - README 修正:`push` 汇报走的是 `subagents.sendMessage(...)`,**不是** `rootAgent.followup()`(`followup` 只是 `Agent` 对象方法,不是 `subagents` 服务方法)。
44
- - 补全宿主服务清单(`tools.restrict`、`agents.get`、可选 `compaction`)与 2026 兼容性修复要点。
45
- - 设计文档(v4 `实现方案.md`)更新:记录真实 `/compact` 的原缺陷与修法。
46
-
47
- ## 验证
48
-
49
- 本版在 DSH **0.1.5-rc.2** 上实跑:
50
-
51
- ```
52
- e2e-business 18 / e2e-regression 14 / e2e-multisession 25 / e2e-v3 100 / e2e-v4-fixes 120
53
- e2e-v3-roundtrip 12 / e2e-d9-d13 7 / audit-path-consistency 18
54
- audit-settings-roundtrip 12 / audit-round1-regressions 7 / audit-round6-persistence 8
55
- verify-fixes 11 → 原有 380 项断言全绿
56
-
57
- audit-f1-compact-fix 6 (mock 忠实复现宿主"先 teardown 再 emit",断言真实压缩被调用)
58
- audit-f2-filter-fix 36 (用宿主自身拒绝谓词 × 本部署真实注册名)
59
- audit-corrupt-file-guard 6 (损坏文件不被覆盖;三版本各做敏感性验证)
60
- audit-fuzz-helpers 1654 calls (单参纯函数 × 19 类恶意输入,0 抛异常)
61
- e2e-f1-agent-detach CONFIRMED (驱动真实 AgentRegistry 复现宿主时序)
62
-
63
- 真宿主检查:3 discovered / 0 broken / 57 rows / 0 failing
64
- 隔离 DSH_HOME 安装器全链路:通过(真实 ~/.dsh 未被触碰)
65
- ```
66
-
67
- 其中 F-1/F-2/F-9 三个修复都做了**敏感性验证**:把代码改回缺陷版本后,对应测试确实会失败 —— 证明这些测试不是空洞通过。
68
-
69
- ## 已知边界(沿用,未在本版改动)
70
-
71
- - `ensureDirs()` 依赖外部 `powershell`(Windows)/`sh`(其他平台),且返回值在调用点未被检查;兜底是 `fs.writeText` 自动创建父目录。
72
- - v2/v3 的 tick 定时器用 Realm 全局 `setInterval`(在 `ctx.effect` 内且正确清理)而非宿主的 `ctx.interval`,仅为风格问题。
73
- - v4 的 `claim_write`/`release_write` 仍是占位(常驻专属目录天然无写冲突)。
74
- - `FIX-REPORT-2026.md` 第四节约 20 条历史审计编号(v4 D1/D2/D3/D7、v3 D17/D18/M14/M2 等)**未逐条验证**,不属本次兼容性范围。
75
-
76
- ## 详细审计报告
77
-
78
- 仓库内 `COMPAT-AUDIT-ROUND2.md`(含逐条证据与行号、与上一轮 `COMPAT-AUDIT-0.1.5-rc.2.md` 的差异修正)。
79
-
80
- ---
81
-
82
- ## 附:v2.0.21 之后的审计修复(同版本发布,非本部分兼容性范围)
83
-
84
- 以下为 v2.0.21 之后、随本版一同发布的上一轮深度审计修复。详细证据见仓库 `FIX-REPORT-2026.md`。
85
-
86
- **宿主兼容性(persona schema)**
87
- - 三套预设的 `persona` 行从仅 `text:` 改为 **`prefix`(正文)+ `suffix`(cwd 句)+ 保留 `text`**:DSH ≥ 0.1.3-alpha.2 起 `prefix` 为必填,而 ≤ 0.1.2 只认 `text`;schemastery 容忍未知键,故一行同时兼容两代。**未修前,本项目在 DSH 0.1.5-rc.2 上完全无法挂载。**
88
-
89
- **v2**
90
- - **收敛闸门**:「判断命题」的收口路径让命题**永不收敛**,每 tick 重开辩论并饿死其它工作。
91
- - **fail-closed**:工具过滤器失败时不再删掉过滤器重试(那会静默放开网络/脚本权限)。
92
- - **平台 shell**:按平台选择解释器(原先硬编码 `powershell`,非 Windows 静默失效)。
93
- - **参数下界**:整数字段补下界(如 `maxParallelThreshold:0` 会导致永不派发)。
94
- - **设置模板合法化**:写出的模板含 `"mode": undefined` 等非法 JSON,导致插件自己回读失败、**用户参数静默丢失**。
95
-
96
- **v3**
97
- - **卡片无损往返**:往返会销毁代理产出(`经验与教训`、方法卡`改进历史`、应用记录`问题/方向`)。
98
- - **路径消毒与单一来源**:原先写用 `idSafe`、读用原始 id,导致**读写路径不一致**(路径穿越)。
99
- - **重派生计数**:`explorerRetries` 只增不减(重置点是死代码),3 次后**永久无法重派生**。
100
- - **停摆判定**:人工计划待批时被判「停摆」,approve 后计划**永不执行**。
101
- - **gate 单点设置**:gate 被无条件覆盖产生幽灵 pending 决策,会被 `auto` **重放副作用**。
102
-
103
- **v4**
104
- - **`maxParallel` 下界钳制**:`0` 会使闸门失效 → **无限并发**。
105
- - **平台 shell**:同 v2。
106
-
107
- **缺陷分类(D9 / D13 / D21 等)**
108
- - `activeCount` 手写累加器漂移 → 闸门恒真、**永不派发**,而 status 仍报 running。
109
- - `scheduler.gate` 粘滞 → 调度**永久卡死**且重启带病。
110
-
111
- > 本部分改动均带有回归测试。原有测试套件在本版发布前实跑全绿(见上「验证」)。
112
-
1
+ # v2.0.22 — 兼容性修复与数据安全加固
2
+
3
+ > 目标宿主:**DSH 0.1.5-rc.2**(`dsh.testedVersion`)。`minVersion` 仍为 `0.1.2-rc.1`。
4
+ > 本版**无破坏性改动**,升级路径与以往一致(`dsh plugin update dsh-vibe-math` 后重启 DSH)。
5
+ > 三套预设(v2 / v3 / v4)**都要更新**。
6
+ >
7
+ > 本版包含自 v2.0.21 以来的全部改动:**① DSH 0.1.5-rc.2 兼容性修复**(下文第一部分)与
8
+ > **② 上一轮深度审计修复**(本文件末尾「附:v2.0.21 之后的审计修复」)。
9
+
10
+ ## ⚠️ 升级前请先读这一条(可能影响你的数据)
11
+
12
+ **v2.0.21 及更早存在一个数据丢失缺陷**:当项目里的 JSON 状态文件被外部损坏(手工编辑出错、磁盘写入中断、编辑器崩溃等)时,插件会把"无法解析"误当成"文件不存在",随后用空数据把它覆盖掉 —— 表现为**问题清单/命题库/运行状态被静默清空**。
13
+
14
+ 本版修好了这个缺陷,但**它无法恢复已经被清空的历史数据**。如果你曾遇到过"知识库内容无故消失",请注意:
15
+
16
+ - 该缺陷的影响面:v2 的 `qs/qs.json`、`Propos/*.json`、`Verified/*.json`;v3/v4 的 `State/*.json`。
17
+ - 修复后的行为:一旦检测到"文件存在但无法解析",插件会**打印告警并拒绝覆盖该文件**,等你修复或删除它。
18
+ - 因此升级后如果看到 `exists but is not parseable JSON — REFUSING to overwrite it` 之类的日志,说明该文件本来就是坏的:请先修好或重命名它,插件才会继续写入。
19
+
20
+ ## 修复清单
21
+
22
+ ### 兼容性(针对 DSH 0.1.5-rc.2)
23
+
24
+ | 项 | 问题 | 影响 |
25
+ |---|---|---|
26
+ | **工具权限过滤器被宿主拒绝** | v2/v3 的权限名表硬编码了 `web`/`fetch`(**从来不是工具名**),且 `bash` 在 Windows 上因预设 `disabled: process.platform==='win32'` 未注册。宿主 `tools.restrict()` 对未注册名**直接抛错**,而过滤器是在建立子代理时应用的 | **想收紧网络/脚本权限时(`solverAllowNetwork:false` / `solverAllowScripts:false`)子代理永远起不来**,调度卡住。已改为按本平台真实注册名,并加"只保留宿主确认合法的名字"的带守卫重试;过滤后若为空则**拒绝派发**(宁可这一轮不派,也不越权) |
27
+ | **v4 的真实 `/compact` 是死代码** | `realCompact()` 在 `subagent/end` 里查 `agents.get(childId)`,但宿主时序是「先 `handle.dispose()` → 子代理移出注册表 → 之后才 emit `subagent/end`」,查询**必然** 返回 undefined | 真实压缩**从未执行**,上下文只靠模型自报占比。已改为在 `subagent/start` 捕获活 Agent 引用(`WeakRef` 持有,end 处理后释放) |
28
+ | **预设 realm 配置不生效** | compaction 隔离组的用途(DSH 自带 `standard` 预设注释原话)是"让预设决定自己的 agent 是否/如何压缩",但插件行在 realm 之外,取到的是**宿主根**实例 | 插件代常驻发起的压缩用的是宿主配置,与常驻自压的实例不一致。已改为经**子代理自身 `agent.ctx`** 解析,两条路径落到同一实例 |
29
+ | **可选服务在 `apply()` 同步快照** | `subprocess`/`sandboxPolicy`/`compaction` 在挂载时一次性读取,受挂载顺序影响会永久为 `undefined` | `runShell` 静默失效、`ensureDirs()` 不再建目录(仅被 `fs.writeText` 自动建父目录掩盖)。已改为**惰性读取** |
30
+ | **v4 注册未纳入 `ctx.effect`** | `tools.register`/`commands.register` 的 disposer 被丢弃 | 预设卸载/HMR 后注册不回收、重复挂载会撞名。已与 v2/v3 一致地纳入 `ctx.effect` |
31
+ | **安装器自检漏检三个服务** | 原先只查 `fs.resolve` 外形 | 现在把 `subprocess`/`sandboxPolicy`/`compaction` 也纳入自检,并区分**必需**(缺失即告警)与**可选降级**(只提示降级、不影响挂载) |
32
+
33
+ ### 数据安全 / 正确性
34
+
35
+ | 项 | 问题 |
36
+ |---|---|
37
+ | **损坏 JSON 被静默覆盖**(见上"升级前请先读") | 三套预设均已加"读取时记录 + 写入时拒写"守卫;v4 另在写前惰性检查磁盘内容,覆盖"只 configure/start、从未 `loadAll`"的路径 |
38
+ | **沙箱围栏根静默改变** | `getPolicy()` 的 `resolve({})` 回退会把围栏根换成宿主配置的 workspace(不一定是本会话 cwd),且异常被静默吞掉。现在首次触发即打印可见告警 |
39
+ | **fail-closed 自纠** | 上一条"重试"若把过滤器全部名字都过滤掉,原实现会删掉过滤器继续派发(等于放开全部权限)。已改为拒绝派发 |
40
+
41
+ ### 文档
42
+
43
+ - README 修正:`push` 汇报走的是 `subagents.sendMessage(...)`,**不是** `rootAgent.followup()`(`followup` 只是 `Agent` 对象方法,不是 `subagents` 服务方法)。
44
+ - 补全宿主服务清单(`tools.restrict`、`agents.get`、可选 `compaction`)与 2026 兼容性修复要点。
45
+ - 设计文档(v4 `实现方案.md`)更新:记录真实 `/compact` 的原缺陷与修法。
46
+
47
+ ## 验证
48
+
49
+ 本版在 DSH **0.1.5-rc.2** 上实跑:
50
+
51
+ ```
52
+ e2e-business 18 / e2e-regression 14 / e2e-multisession 25 / e2e-v3 100 / e2e-v4-fixes 120
53
+ e2e-v3-roundtrip 12 / e2e-d9-d13 7 / audit-path-consistency 18
54
+ audit-settings-roundtrip 12 / audit-round1-regressions 7 / audit-round6-persistence 8
55
+ verify-fixes 11 → 原有 380 项断言全绿
56
+
57
+ audit-f1-compact-fix 6 (mock 忠实复现宿主"先 teardown 再 emit",断言真实压缩被调用)
58
+ audit-f2-filter-fix 36 (用宿主自身拒绝谓词 × 本部署真实注册名)
59
+ audit-corrupt-file-guard 6 (损坏文件不被覆盖;三版本各做敏感性验证)
60
+ audit-fuzz-helpers 1654 calls (单参纯函数 × 19 类恶意输入,0 抛异常)
61
+ e2e-f1-agent-detach CONFIRMED (驱动真实 AgentRegistry 复现宿主时序)
62
+
63
+ 真宿主检查:3 discovered / 0 broken / 57 rows / 0 failing
64
+ 隔离 DSH_HOME 安装器全链路:通过(真实 ~/.dsh 未被触碰)
65
+ ```
66
+
67
+ 其中 F-1/F-2/F-9 三个修复都做了**敏感性验证**:把代码改回缺陷版本后,对应测试确实会失败 —— 证明这些测试不是空洞通过。
68
+
69
+ ## 已知边界(沿用,未在本版改动)
70
+
71
+ - `ensureDirs()` 依赖外部 `powershell`(Windows)/`sh`(其他平台),且返回值在调用点未被检查;兜底是 `fs.writeText` 自动创建父目录。
72
+ - v2/v3 的 tick 定时器用 Realm 全局 `setInterval`(在 `ctx.effect` 内且正确清理)而非宿主的 `ctx.interval`,仅为风格问题。
73
+ - v4 的 `claim_write`/`release_write` 仍是占位(常驻专属目录天然无写冲突)。
74
+ - `FIX-REPORT-2026.md` 第四节约 20 条历史审计编号(v4 D1/D2/D3/D7、v3 D17/D18/M14/M2 等)**未逐条验证**,不属本次兼容性范围。
75
+
76
+ ## 详细审计报告
77
+
78
+ 仓库内 `COMPAT-AUDIT-ROUND2.md`(含逐条证据与行号、与上一轮 `COMPAT-AUDIT-0.1.5-rc.2.md` 的差异修正)。
79
+
80
+ ---
81
+
82
+ ## 附:v2.0.21 之后的审计修复(同版本发布,非本部分兼容性范围)
83
+
84
+ 以下为 v2.0.21 之后、随本版一同发布的上一轮深度审计修复。详细证据见仓库 `FIX-REPORT-2026.md`。
85
+
86
+ **宿主兼容性(persona schema)**
87
+ - 三套预设的 `persona` 行从仅 `text:` 改为 **`prefix`(正文)+ `suffix`(cwd 句)+ 保留 `text`**:DSH ≥ 0.1.3-alpha.2 起 `prefix` 为必填,而 ≤ 0.1.2 只认 `text`;schemastery 容忍未知键,故一行同时兼容两代。**未修前,本项目在 DSH 0.1.5-rc.2 上完全无法挂载。**
88
+
89
+ **v2**
90
+ - **收敛闸门**:「判断命题」的收口路径让命题**永不收敛**,每 tick 重开辩论并饿死其它工作。
91
+ - **fail-closed**:工具过滤器失败时不再删掉过滤器重试(那会静默放开网络/脚本权限)。
92
+ - **平台 shell**:按平台选择解释器(原先硬编码 `powershell`,非 Windows 静默失效)。
93
+ - **参数下界**:整数字段补下界(如 `maxParallelThreshold:0` 会导致永不派发)。
94
+ - **设置模板合法化**:写出的模板含 `"mode": undefined` 等非法 JSON,导致插件自己回读失败、**用户参数静默丢失**。
95
+
96
+ **v3**
97
+ - **卡片无损往返**:往返会销毁代理产出(`经验与教训`、方法卡`改进历史`、应用记录`问题/方向`)。
98
+ - **路径消毒与单一来源**:原先写用 `idSafe`、读用原始 id,导致**读写路径不一致**(路径穿越)。
99
+ - **重派生计数**:`explorerRetries` 只增不减(重置点是死代码),3 次后**永久无法重派生**。
100
+ - **停摆判定**:人工计划待批时被判「停摆」,approve 后计划**永不执行**。
101
+ - **gate 单点设置**:gate 被无条件覆盖产生幽灵 pending 决策,会被 `auto` **重放副作用**。
102
+
103
+ **v4**
104
+ - **`maxParallel` 下界钳制**:`0` 会使闸门失效 → **无限并发**。
105
+ - **平台 shell**:同 v2。
106
+
107
+ **缺陷分类(D9 / D13 / D21 等)**
108
+ - `activeCount` 手写累加器漂移 → 闸门恒真、**永不派发**,而 status 仍报 running。
109
+ - `scheduler.gate` 粘滞 → 调度**永久卡死**且重启带病。
110
+
111
+ > 本部分改动均带有回归测试。原有测试套件在本版发布前实跑全绿(见上「验证」)。
112
+
@@ -1,143 +1,143 @@
1
- # dsh-vibe-math 2.1.0 —— 新增 V5「研究所体系」
2
-
3
- 本版在原有 v2 / v3 / v4 三套预设之外,新增**第五代架构 `vibe-math-v5`:研究所体系**。
4
- 安装本包后,预设选择器里会出现**四个**预设。
5
-
6
- ---
7
-
8
- ## 一、V5 是什么
9
-
10
- 一座**自组织的研究所**,靠"说话"解决问题:
11
-
12
- | 职位 | 代号 | 职权 |
13
- |---|---|---|
14
- | **院士**(领头人) | `acad` | **组织与协调中心**:建立全所视图、把问题拆解成任务并**分派**、设定优先级、召集并主持会议、督导进度与催办停滞、调配临时工、对外汇报。**一票与他人等重,不能单方面定论。** |
15
- | **常驻研究员** | `r-<n>` | 有表决权;**可自主雇佣/解雇自己的临时工**;向院士汇报并接受其组织与分派。 |
16
- | **临时工** | `t-<n>` | 为特定任务临时雇入;可读、可想、可发言、可写自己的成果库、可认领或被分派任务;**没有表决权**。 |
17
- | 所办(对外接口) | —— | 就是主助手:**不参与研究、不投票**。只负责汇报、转达人的指令,并代持平台要求的创建权。 |
18
-
19
- **框架只是媒介**:中继群聊与私信、召集会议、记成果库、统计共识、管理上下文与断点。
20
- 它**从不指派任务**——指派者是院士,一个和研究员一样受表决规则约束的成员。
21
-
22
- ## 二、求真规则(V5 的核心变更)
23
-
24
- 一个对象要进入 `Verified/`,必须**同时**满足:
25
-
26
- 1. 至少有 **m = min(`quorumCap`, 有表决权人数)** 名有表决权者(院士 + 常驻研究员)投出**布尔概率值**;
27
- 2. 这些票**全部**是 `1`(绝对为真)或**全部**是 `0`(绝对为假)。
28
-
29
- - 票是 `[0,1]` 的数值:`1` = 断言为真,`0` = 断言为假;
30
- - **严格介于 0 与 1 之间 = 弃权/存疑**:不计入 m,但计入"全组平均概率";
31
- - **任何一张反向的布尔票都会阻塞定论**——所以少数派无法靠别人弃权把结论推过去;
32
- - 未达门槛 → 对象**留在原库**并附全组平均概率与完整辩论录,**不强行裁决**;
33
- - 表决两段式:先【独立初评】(彼此不可见),未定论再【公开辩论】(互相可见后重新投票),
34
- 轮次上限 `verdictMaxRounds`(默认 3)。
35
-
36
- > 与 v4 的差别:v4 要求**全体常驻一致**;v5 改为**至少 m 名一致**(`quorumMode: "all-unanimous"`
37
- > 可切回 v4 口径)。默认 `quorumCap = 3`。
38
-
39
- ## 三、V5 的其他能力
40
-
41
- - **群聊 / 私信 / 会议**:成员在群聊里说话、可私信、可提议开会;院士可直接召开并设定议程。
42
- 会议纪要落到 `Shared/Meetings/<id>.md`,辩论录落到 `Shared/Debates/<target>.md`。
43
- - **任务板**:`task-<n>` + **revision 比较交换**(拿过期副本改会被拒绝)+ **依赖 DAG**
44
- (缺依赖/重复/成环都会被拒)+ 优先级 + 院士分派(须写明**理由**与**验收标准**)。
45
- - **成果库**:每人独立目录 `Members/<id>/{Progress,Propos,Methods,Subproblems}/`,
46
- **只写自己、可读他人**。入库必须写明 **价值程度 / 动机用途计划 / 概率估计**(缺一不可)。
47
- 章程里对 `Progress/` 给出了完整定义与**用途说明**(思考痕迹、压缩后恢复状态的主要依据、
48
- 院士统筹全所的输入、失败与死路同样值得记)。
49
- - **雇佣 / 解雇**:院士与常驻研究员**都能**雇佣临时工;解雇是**真实**的——
50
- 中断其当前回合、`drainContinuableChildren` **释放其常驻身份**、**收回其未完成任务**、
51
- 丢弃其邮箱、标记除名;**代号永不复用**。
52
- - **上下文**:达阈值自动压缩(真实 `/compact`,缺失 `compaction` 服务时回退到自述浓缩)。
53
- 章程写在成员 `persona` 里,**压缩后依然生效**——不需要 v4 那套"压缩后重申规则"的补丁。
54
- - **断点续跑**:状态存在**会话日志的 host-only 投影单元**里(键 `vibeMathV5`),
55
- 由 DSH 负责 checkpoint 与恢复;若宿主没有 `sessionProjections`,回退到加固 JSON 状态文件。
56
-
57
- ## 四、快速上手
58
-
59
- ```
60
- vibe_v5_configure { project?, institute?, problem?, params? } # 先配置,不启动
61
- vibe_v5_start { problem?, researcherCount?, academician?, seedDirections? }
62
- vibe_v5_report / vibe_v5_status # 汇报 / 状态
63
- vibe_v5_message { to|all, content } # 人以所办身份留言
64
- vibe_v5_meeting { agenda, kind } # 召集会议
65
- vibe_v5_members / vibe_v5_hire / vibe_v5_fire / vibe_v5_set
66
- ```
67
- 斜杠命令:`/v5 configure|start|resume|pause|stop|status|report|members|message|meeting|hire|fire|add|remove|set`
68
-
69
- **主助手(所办)是 hands-off 的**:`vibe_v5_start` 之后请保持被动,只在用户明确要求或
70
- 研究所明显僵死时介入,且只做"促成",不做"决定"。
71
-
72
- ## 五、重要边界(请知悉)
73
-
74
- - **试验性架构**:v5 是新增的第五代实现,与 v2/v3/v4 并存、互不影响;三个旧预设行为未变。
75
- - **一所一会话**:一个会话承载一座研究所;要另建一座请开新会话(`configure` 会拒绝在运行中
76
- 切换项目/所名,以免状态分裂到两棵树)。
77
- - **解雇是逻辑除名 + 真实释放**:DSH 的 roster 没有"删除",v5 用
78
- `drainContinuableChildren` 真实释放常驻身份并**永不再向其投递**;其档案留在所史里。
79
- - **编制变更需所办批准**:成员(含院士)只能**提议**增聘/解聘**常驻研究员**;
80
- 临时工的雇佣/解雇才是成员自主权。
81
- - **m 随人数浮动**:`m = min(quorumCap, 在册有表决权者数)`。若在册人数少于 `quorumCap`,
82
- m 会随之下降(这是 `min{3, 人数}` 的定义所决定的);若你希望"人少就不能定论",
83
- 请把 `quorumCap` 调高(例如固定为 3 并保持 ≥3 名研究员在册)。
84
- - **不引入任何 npm 实验包**:v5 是 preset 内的单个 `.js` 文件,不依赖 DSH 的实验性
85
- agent-team 包,因此不需要 pnpm、不改 profile、不需要额外重启。
86
- - **`State/` 只是人读镜像**:权威状态在会话日志投影里,请勿手改 `State/` 下的文件。
87
-
88
- ## 六、验证
89
-
90
- - `selfdrive-v5.mjs`:**70 条断言全绿**。用 mock host + **mock 投影注册表**(忠实复现
91
- `register` / 事件即时折叠 / `stateOf`)驱动真实插件,覆盖建所、章程注入、群聊扇出、
92
- 私信、临时工权限、m 票门限(m−1 不进 / 1 与 0 混合不进 / m 票全 1 才进)、弃权不计 m、
93
- 任务板 CAS 与依赖成环、院士分派与越权拒绝、真实解雇(中断+释放+任务回收+代号不复用)、
94
- 会议互斥与暂存、全体一致才结题等。
95
- - `e2e-v5-round2.test.mjs`:**53 条断言全绿**,专攻第一套未覆盖的行为路径 ——
96
- **加固 JSON 回落后端**、**模拟进程重启**(新宿主 + 新后端读回持久状态并 resume 重建)、
97
- 重复 `subagent/end` 幂等、雇佣配额(每人上限 / 全所上限)、`quorumMode: all-unanimous`、
98
- **名册缩减时 m 重算**、`vibe_v5_wait`(区间校验 / 无人在跑快捷返回 / 被真实活动唤醒)、
99
- `read_library`(跨读他人库)、id 消毒抗路径穿越、运行中 configure 守卫、
100
- **看门狗放弃卡死验证**、**会议在验证后面暂存并随后真正召开**、
101
- **压缩指令只在该出现时出现且不重复**、**会话日志回放复现研究所状态**。
102
- - `audit-v5-sensitivity.mjs`:**15 个敏感性探针全部命中**(故意破坏 m 门限、弃权计数、
103
- 冲突阻塞、临时工表决权、院士分派门禁、建所回合登记、群聊扇出、辩论轮推进条件、
104
- 真实释放、全体一致结题、回落后端加载、解决票再评估、提议确定性启动、begin 互斥、
105
- 会议锁重武装 —— 每一条都能让测试变红),证明测试不是空转。
106
- - `audit-v5-integrity.mjs`:静态自检 6 类(未定义调用 / `params` 键 / 会话 API 面 /
107
- 错误码与文档漂移 / 遗留标记 / 组合行可解析),输出 clean。
108
- - 无回归:`selfdrive-v4` 21/21、`e2e-v4-fixes` 120/120、`e2e-v3` 100/100、
109
- `e2e-multisession` 25/25、`e2e-business` 18/18、`e2e-regression`、`e2e-v3-roundtrip`、
110
- `e2e-d9-d13` 及全部历史审计套件均通过;`e2e-installer-test` 通过并发现
111
- `vibe-math-v5 (broken=no, persona schema OK)`。
112
- - 宿主契约已实测:`sessionProjections` 的 host-only 单元可注册、事件即时折叠、
113
- **不进模型历史**、`checkpoint()` 携带、`restore()` 重折、`hydrate()` 可装载。
114
- - **真实挂载校验**:把 preset 装进本机 preset root 后用 `agentPresets` 实测 ——
115
- roster 发现 `vibe-math-v5(user)`、`broken=no`,**`standingKeyFor('vibe-math-v5')`
116
- 返回 MOUNTED OK**(该调用会拒绝"包无法解析""配置非法""某行从未激活""服务被发布到进程全局
117
- realm"四类失败),且 v5 插件行 `enabled=true`。
118
-
119
- ### 第二轮审计修复的真实缺陷(9 处)
120
-
121
- 第二轮针对**第一套测试从未触及的路径**做审计,发现并修复:
122
-
123
- | # | 缺陷 | 后果 | 修复 |
124
- |---|---|---|---|
125
- | 1 | **回落后端从不加载已持久化的状态**(`state()` 不触发 `load()`) | 无 `sessionProjections` 的宿主上,**进程重启即丢失整座研究所**,`resume` 报 "no active member to resume" | 新增 `ready()`,在所有读状态的入口(工具、命令、`subagent/end`)先 `await` 加载 |
126
- | 2 | 回落后端把状态写到 `VibeMath/State/` 而非研究所目录下的 `State/` | 与文档/人读镜像描述不一致,多研究所会互相覆盖 | 改为按 `instRoot()/State/<institute>.v5state.json` 动态解析路径 |
127
- | 3 | **`checkSolved()` 只在会议收尾时被调用** | 一致票落在会议收尾之后(迟到回复 / 普通轮携带 `vote_solved`)会被记录却**永不被读取**——全所一致同意却停不下来 | 每次记录解决票后立即评估停止条件 |
128
- | 4 | **提议只"踢一下调度器"** | 若已有调度 pass 在途且已过 arm 点,提议会滞留在队列里直到下一轮 trampoline | 提议后**直接 `armNextVerify()`** 确定性启动 |
129
- | 5 | `beginVerify` 不互斥 | 两个调用者可在任一发布裁决记录前都通过检查,**同一对象被启动两次** | 新增 `beginLock` 独占 |
130
- | 6 | `continueMeetingRound` 在 `finalizeLock` 被占用时直接返回 | 没有任何东西重新驱动它,会议可能停住 | 退出前 `armHeartbeat()` |
131
- | 7 | **`vibe_v5_set` 改了 `activityTimeoutMs` 但已武装的心跳仍用旧延迟** | 调参不立即生效(调小后要等旧的长延迟走完) | `setParams` 后立即驱动一次调度 |
132
- | 8 | **软压缩指令只在 `normal` 轮注入** | 只收到心跳 CHECKPOINT 的成员即使上下文 100% 也**永不压缩** | 改为 `normal` 与 `checkpoint` 都注入(`meeting`/`verify` 仍排除) |
133
- | 9 | 唤醒成功路径不再武装心跳 | 若宿主丢弃投递或子代理消失,**调度器会永久冻结**(v4 §25 同类故障) | 每次唤醒后都武装一次安全心跳(各分支先查 `busy`,不会重复唤醒) |
134
-
135
- 另新增 `status().debug`(调度 pass 计数、trampoline 跳过次数、arm/begin 计数),
136
- 便于今后在真实 run 上定位这类"提议未启动"的问题。
137
-
138
- ## 七、兼容性
139
-
140
- - `dsh.testedVersion: 0.1.5-rc.2`(v5 的宿主契约均取自该版本的运行时实测)。
141
- - v5 需要 `subagents` / `agents` / `tools` / `commands` / `fs`(必需)与
142
- `sessions` / `sessionProjections` / `subprocess` / `sandboxPolicy` / `compaction`(可选);
143
- 安装器自检会在启动时报告缺失项。可选服务缺失只会**降级**,不影响挂载。
1
+ # dsh-vibe-math 2.1.0 —— 新增 V5「研究所体系」
2
+
3
+ 本版在原有 v2 / v3 / v4 三套预设之外,新增**第五代架构 `vibe-math-v5`:研究所体系**。
4
+ 安装本包后,预设选择器里会出现**四个**预设。
5
+
6
+ ---
7
+
8
+ ## 一、V5 是什么
9
+
10
+ 一座**自组织的研究所**,靠"说话"解决问题:
11
+
12
+ | 职位 | 代号 | 职权 |
13
+ |---|---|---|
14
+ | **院士**(领头人) | `acad` | **组织与协调中心**:建立全所视图、把问题拆解成任务并**分派**、设定优先级、召集并主持会议、督导进度与催办停滞、调配临时工、对外汇报。**一票与他人等重,不能单方面定论。** |
15
+ | **常驻研究员** | `r-<n>` | 有表决权;**可自主雇佣/解雇自己的临时工**;向院士汇报并接受其组织与分派。 |
16
+ | **临时工** | `t-<n>` | 为特定任务临时雇入;可读、可想、可发言、可写自己的成果库、可认领或被分派任务;**没有表决权**。 |
17
+ | 所办(对外接口) | —— | 就是主助手:**不参与研究、不投票**。只负责汇报、转达人的指令,并代持平台要求的创建权。 |
18
+
19
+ **框架只是媒介**:中继群聊与私信、召集会议、记成果库、统计共识、管理上下文与断点。
20
+ 它**从不指派任务**——指派者是院士,一个和研究员一样受表决规则约束的成员。
21
+
22
+ ## 二、求真规则(V5 的核心变更)
23
+
24
+ 一个对象要进入 `Verified/`,必须**同时**满足:
25
+
26
+ 1. 至少有 **m = min(`quorumCap`, 有表决权人数)** 名有表决权者(院士 + 常驻研究员)投出**布尔概率值**;
27
+ 2. 这些票**全部**是 `1`(绝对为真)或**全部**是 `0`(绝对为假)。
28
+
29
+ - 票是 `[0,1]` 的数值:`1` = 断言为真,`0` = 断言为假;
30
+ - **严格介于 0 与 1 之间 = 弃权/存疑**:不计入 m,但计入"全组平均概率";
31
+ - **任何一张反向的布尔票都会阻塞定论**——所以少数派无法靠别人弃权把结论推过去;
32
+ - 未达门槛 → 对象**留在原库**并附全组平均概率与完整辩论录,**不强行裁决**;
33
+ - 表决两段式:先【独立初评】(彼此不可见),未定论再【公开辩论】(互相可见后重新投票),
34
+ 轮次上限 `verdictMaxRounds`(默认 3)。
35
+
36
+ > 与 v4 的差别:v4 要求**全体常驻一致**;v5 改为**至少 m 名一致**(`quorumMode: "all-unanimous"`
37
+ > 可切回 v4 口径)。默认 `quorumCap = 3`。
38
+
39
+ ## 三、V5 的其他能力
40
+
41
+ - **群聊 / 私信 / 会议**:成员在群聊里说话、可私信、可提议开会;院士可直接召开并设定议程。
42
+ 会议纪要落到 `Shared/Meetings/<id>.md`,辩论录落到 `Shared/Debates/<target>.md`。
43
+ - **任务板**:`task-<n>` + **revision 比较交换**(拿过期副本改会被拒绝)+ **依赖 DAG**
44
+ (缺依赖/重复/成环都会被拒)+ 优先级 + 院士分派(须写明**理由**与**验收标准**)。
45
+ - **成果库**:每人独立目录 `Members/<id>/{Progress,Propos,Methods,Subproblems}/`,
46
+ **只写自己、可读他人**。入库必须写明 **价值程度 / 动机用途计划 / 概率估计**(缺一不可)。
47
+ 章程里对 `Progress/` 给出了完整定义与**用途说明**(思考痕迹、压缩后恢复状态的主要依据、
48
+ 院士统筹全所的输入、失败与死路同样值得记)。
49
+ - **雇佣 / 解雇**:院士与常驻研究员**都能**雇佣临时工;解雇是**真实**的——
50
+ 中断其当前回合、`drainContinuableChildren` **释放其常驻身份**、**收回其未完成任务**、
51
+ 丢弃其邮箱、标记除名;**代号永不复用**。
52
+ - **上下文**:达阈值自动压缩(真实 `/compact`,缺失 `compaction` 服务时回退到自述浓缩)。
53
+ 章程写在成员 `persona` 里,**压缩后依然生效**——不需要 v4 那套"压缩后重申规则"的补丁。
54
+ - **断点续跑**:状态存在**会话日志的 host-only 投影单元**里(键 `vibeMathV5`),
55
+ 由 DSH 负责 checkpoint 与恢复;若宿主没有 `sessionProjections`,回退到加固 JSON 状态文件。
56
+
57
+ ## 四、快速上手
58
+
59
+ ```
60
+ vibe_v5_configure { project?, institute?, problem?, params? } # 先配置,不启动
61
+ vibe_v5_start { problem?, researcherCount?, academician?, seedDirections? }
62
+ vibe_v5_report / vibe_v5_status # 汇报 / 状态
63
+ vibe_v5_message { to|all, content } # 人以所办身份留言
64
+ vibe_v5_meeting { agenda, kind } # 召集会议
65
+ vibe_v5_members / vibe_v5_hire / vibe_v5_fire / vibe_v5_set
66
+ ```
67
+ 斜杠命令:`/v5 configure|start|resume|pause|stop|status|report|members|message|meeting|hire|fire|add|remove|set`
68
+
69
+ **主助手(所办)是 hands-off 的**:`vibe_v5_start` 之后请保持被动,只在用户明确要求或
70
+ 研究所明显僵死时介入,且只做"促成",不做"决定"。
71
+
72
+ ## 五、重要边界(请知悉)
73
+
74
+ - **试验性架构**:v5 是新增的第五代实现,与 v2/v3/v4 并存、互不影响;三个旧预设行为未变。
75
+ - **一所一会话**:一个会话承载一座研究所;要另建一座请开新会话(`configure` 会拒绝在运行中
76
+ 切换项目/所名,以免状态分裂到两棵树)。
77
+ - **解雇是逻辑除名 + 真实释放**:DSH 的 roster 没有"删除",v5 用
78
+ `drainContinuableChildren` 真实释放常驻身份并**永不再向其投递**;其档案留在所史里。
79
+ - **编制变更需所办批准**:成员(含院士)只能**提议**增聘/解聘**常驻研究员**;
80
+ 临时工的雇佣/解雇才是成员自主权。
81
+ - **m 随人数浮动**:`m = min(quorumCap, 在册有表决权者数)`。若在册人数少于 `quorumCap`,
82
+ m 会随之下降(这是 `min{3, 人数}` 的定义所决定的);若你希望"人少就不能定论",
83
+ 请把 `quorumCap` 调高(例如固定为 3 并保持 ≥3 名研究员在册)。
84
+ - **不引入任何 npm 实验包**:v5 是 preset 内的单个 `.js` 文件,不依赖 DSH 的实验性
85
+ agent-team 包,因此不需要 pnpm、不改 profile、不需要额外重启。
86
+ - **`State/` 只是人读镜像**:权威状态在会话日志投影里,请勿手改 `State/` 下的文件。
87
+
88
+ ## 六、验证
89
+
90
+ - `selfdrive-v5.mjs`:**70 条断言全绿**。用 mock host + **mock 投影注册表**(忠实复现
91
+ `register` / 事件即时折叠 / `stateOf`)驱动真实插件,覆盖建所、章程注入、群聊扇出、
92
+ 私信、临时工权限、m 票门限(m−1 不进 / 1 与 0 混合不进 / m 票全 1 才进)、弃权不计 m、
93
+ 任务板 CAS 与依赖成环、院士分派与越权拒绝、真实解雇(中断+释放+任务回收+代号不复用)、
94
+ 会议互斥与暂存、全体一致才结题等。
95
+ - `e2e-v5-round2.test.mjs`:**53 条断言全绿**,专攻第一套未覆盖的行为路径 ——
96
+ **加固 JSON 回落后端**、**模拟进程重启**(新宿主 + 新后端读回持久状态并 resume 重建)、
97
+ 重复 `subagent/end` 幂等、雇佣配额(每人上限 / 全所上限)、`quorumMode: all-unanimous`、
98
+ **名册缩减时 m 重算**、`vibe_v5_wait`(区间校验 / 无人在跑快捷返回 / 被真实活动唤醒)、
99
+ `read_library`(跨读他人库)、id 消毒抗路径穿越、运行中 configure 守卫、
100
+ **看门狗放弃卡死验证**、**会议在验证后面暂存并随后真正召开**、
101
+ **压缩指令只在该出现时出现且不重复**、**会话日志回放复现研究所状态**。
102
+ - `audit-v5-sensitivity.mjs`:**15 个敏感性探针全部命中**(故意破坏 m 门限、弃权计数、
103
+ 冲突阻塞、临时工表决权、院士分派门禁、建所回合登记、群聊扇出、辩论轮推进条件、
104
+ 真实释放、全体一致结题、回落后端加载、解决票再评估、提议确定性启动、begin 互斥、
105
+ 会议锁重武装 —— 每一条都能让测试变红),证明测试不是空转。
106
+ - `audit-v5-integrity.mjs`:静态自检 6 类(未定义调用 / `params` 键 / 会话 API 面 /
107
+ 错误码与文档漂移 / 遗留标记 / 组合行可解析),输出 clean。
108
+ - 无回归:`selfdrive-v4` 21/21、`e2e-v4-fixes` 120/120、`e2e-v3` 100/100、
109
+ `e2e-multisession` 25/25、`e2e-business` 18/18、`e2e-regression`、`e2e-v3-roundtrip`、
110
+ `e2e-d9-d13` 及全部历史审计套件均通过;`e2e-installer-test` 通过并发现
111
+ `vibe-math-v5 (broken=no, persona schema OK)`。
112
+ - 宿主契约已实测:`sessionProjections` 的 host-only 单元可注册、事件即时折叠、
113
+ **不进模型历史**、`checkpoint()` 携带、`restore()` 重折、`hydrate()` 可装载。
114
+ - **真实挂载校验**:把 preset 装进本机 preset root 后用 `agentPresets` 实测 ——
115
+ roster 发现 `vibe-math-v5(user)`、`broken=no`,**`standingKeyFor('vibe-math-v5')`
116
+ 返回 MOUNTED OK**(该调用会拒绝"包无法解析""配置非法""某行从未激活""服务被发布到进程全局
117
+ realm"四类失败),且 v5 插件行 `enabled=true`。
118
+
119
+ ### 第二轮审计修复的真实缺陷(9 处)
120
+
121
+ 第二轮针对**第一套测试从未触及的路径**做审计,发现并修复:
122
+
123
+ | # | 缺陷 | 后果 | 修复 |
124
+ |---|---|---|---|
125
+ | 1 | **回落后端从不加载已持久化的状态**(`state()` 不触发 `load()`) | 无 `sessionProjections` 的宿主上,**进程重启即丢失整座研究所**,`resume` 报 "no active member to resume" | 新增 `ready()`,在所有读状态的入口(工具、命令、`subagent/end`)先 `await` 加载 |
126
+ | 2 | 回落后端把状态写到 `VibeMath/State/` 而非研究所目录下的 `State/` | 与文档/人读镜像描述不一致,多研究所会互相覆盖 | 改为按 `instRoot()/State/<institute>.v5state.json` 动态解析路径 |
127
+ | 3 | **`checkSolved()` 只在会议收尾时被调用** | 一致票落在会议收尾之后(迟到回复 / 普通轮携带 `vote_solved`)会被记录却**永不被读取**——全所一致同意却停不下来 | 每次记录解决票后立即评估停止条件 |
128
+ | 4 | **提议只"踢一下调度器"** | 若已有调度 pass 在途且已过 arm 点,提议会滞留在队列里直到下一轮 trampoline | 提议后**直接 `armNextVerify()`** 确定性启动 |
129
+ | 5 | `beginVerify` 不互斥 | 两个调用者可在任一发布裁决记录前都通过检查,**同一对象被启动两次** | 新增 `beginLock` 独占 |
130
+ | 6 | `continueMeetingRound` 在 `finalizeLock` 被占用时直接返回 | 没有任何东西重新驱动它,会议可能停住 | 退出前 `armHeartbeat()` |
131
+ | 7 | **`vibe_v5_set` 改了 `activityTimeoutMs` 但已武装的心跳仍用旧延迟** | 调参不立即生效(调小后要等旧的长延迟走完) | `setParams` 后立即驱动一次调度 |
132
+ | 8 | **软压缩指令只在 `normal` 轮注入** | 只收到心跳 CHECKPOINT 的成员即使上下文 100% 也**永不压缩** | 改为 `normal` 与 `checkpoint` 都注入(`meeting`/`verify` 仍排除) |
133
+ | 9 | 唤醒成功路径不再武装心跳 | 若宿主丢弃投递或子代理消失,**调度器会永久冻结**(v4 §25 同类故障) | 每次唤醒后都武装一次安全心跳(各分支先查 `busy`,不会重复唤醒) |
134
+
135
+ 另新增 `status().debug`(调度 pass 计数、trampoline 跳过次数、arm/begin 计数),
136
+ 便于今后在真实 run 上定位这类"提议未启动"的问题。
137
+
138
+ ## 七、兼容性
139
+
140
+ - `dsh.testedVersion: 0.1.5-rc.2`(v5 的宿主契约均取自该版本的运行时实测)。
141
+ - v5 需要 `subagents` / `agents` / `tools` / `commands` / `fs`(必需)与
142
+ `sessions` / `sessionProjections` / `subprocess` / `sandboxPolicy` / `compaction`(可选);
143
+ 安装器自检会在启动时报告缺失项。可选服务缺失只会**降级**,不影响挂载。