dsh-vibe-math 2.3.0 → 2.3.2
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/AUDIT-CHECKLIST.md +78 -3
- package/README.md +33 -2
- package/RELEASE-NOTES-2.3.1.md +134 -0
- package/RELEASE-NOTES-2.3.2.md +145 -0
- package/audit-formal-sensitivity.mjs +134 -39
- package/audit-prompt-invariants.mjs +414 -0
- package/audit-spec-traceability.mjs +173 -0
- package/audit-v5-integrity.mjs +5 -3
- package/docs/formal-verification.md +122 -19
- package/docs/generate_framework_diagram_v5.mjs +2 -1
- package/docs/test-timing.md +101 -0
- package/formal-verify-v2.test.mjs +526 -7
- package/formal-verify-v3.test.mjs +389 -10
- package/formal-verify-v4.test.mjs +462 -4
- package/formal-verify-v5.test.mjs +163 -4
- package/installer.js +3 -1
- package/package.json +12 -2
- package/prompt-corpus-persona/persona-corpus.json +2 -2
- package/prompt-corpus-persona/persona-corpus.md +6 -2
- package/prompt-corpus-v2/formal-verify-v2.json +484 -0
- package/prompt-corpus-v2/formal-verify-v2.md +5239 -0
- package/prompt-corpus-v3/formal-verify-v3.json +274 -100
- package/prompt-corpus-v3/formal-verify-v3.md +2057 -335
- package/prompt-corpus-v4/formal-verify-v4.json +89 -0
- package/prompt-corpus-v4/formal-verify-v4.md +283 -0
- package/prompt-corpus-v5/prompt-corpus-v5.json +186 -219
- package/prompt-corpus-v5/prompt-corpus-v5.md +485 -700
- package/prompt-v5-integrity.test.mjs +1272 -1085
- package/run-tests.mjs +118 -0
- package/vibe-math-v2/vibe-math-v2.js +341 -45
- package/vibe-math-v2//345/256/236/347/216/260/346/226/271/346/241/210.md +129 -8
- package/vibe-math-v3/vibe-math-v3.js +162 -36
- package/vibe-math-v3//345/256/236/347/216/260/346/226/271/346/241/210.md +21 -3
- package/vibe-math-v4/vibe-math-v4.js +201 -30
- package/vibe-math-v4//345/256/236/347/216/260/346/226/271/346/241/210.md +54 -2
- package/vibe-math-v5/agent.cordis.yml +6 -2
- package/vibe-math-v5/vibe-math-v5.js +133 -28
- package/vibe-math-v5//345/256/236/347/216/260/346/226/271/346/241/210.md +55 -5
- package/vibe-math-v5//346/236/266/346/236/204/345/233/276.md +16 -2
- package//347/244/272/344/276/213/345/233/276//346/241/206/346/236/266/345/233/276-v5.svg +6 -5
package/AUDIT-CHECKLIST.md
CHANGED
|
@@ -100,9 +100,71 @@
|
|
|
100
100
|
而 v2/v3/v4 的 persona 从未列出它们(只有 v5 列了),v4 的 `vibe_v4_set` 参数表也漏了
|
|
101
101
|
`formalVerify`/`leanCommand`/`leanArgs`/`leanTimeoutMs`——当时**所有既有套件全绿**。
|
|
102
102
|
|
|
103
|
-
|
|
103
|
+
### 1.7 语义映射:把"事实"映射成"字段值"时不能张冠李戴
|
|
104
|
+
|
|
105
|
+
§1.6 查的是"名字/路径/参数有没有写对";这一节查**语义有没有写反**。它比漏写更危险:提示词读起来
|
|
106
|
+
通顺、完整,而套件往往只断言"包含某句话"就能全绿。
|
|
107
|
+
|
|
108
|
+
- [ ] 每一个"发现 X 就投 Y"的映射是否**语义正确**?**真实事故**:Lean 形式化与命题原文不一致时,
|
|
109
|
+
提示词要求"投 0"——而 0 的含义是"**命题为假**"。于是"形式化写错了"被记成"命题被证伪",
|
|
110
|
+
在布尔一致规则下直接被写进 `Verified/` 标注**假**:用来求真更严格的机制,反而**伪造出
|
|
111
|
+
一个错误的否定结论**。现在改为独立一档 `defect`(撤回证明 + 进待办 + 不定论)。
|
|
112
|
+
- [ ] **反向情形**的指令是否也在?("只有独立于该证据也能确定时才可否决"这类边界必须写出来,
|
|
113
|
+
否则代理只会照字面把"证据不合格"当成"结论为假"。)
|
|
114
|
+
- [ ] 提示词承诺的**框架行为**是否真的实现了?**真实事故**:v2 的提示词让代理"在回执的 `formal`
|
|
115
|
+
字段写明难度判断",但回执契约里没有这个字段、框架也从不解析它——代理的判断**静默消失**,
|
|
116
|
+
而套件只断言"那句话存在",177 条断言全绿却守着一个**死通道**。
|
|
117
|
+
- [ ] 提示词承诺的**强度档位**是否与实现一致?(`encourage` 档没有门禁,就**不能**声称
|
|
118
|
+
"框架会搁置本次裁定";只改文字不改机制 = 骗代理。)
|
|
119
|
+
- [ ] 每个档位(`off` / `encourage` / `require`)的注入文本是否**各自**被人读过?只读一个档位等于没读
|
|
120
|
+
——首版 `require` 档的门禁措辞从未进入任何语料。
|
|
121
|
+
|
|
122
|
+
### 1.8 四套同构:任何语义修正必须**四套同步**
|
|
123
|
+
|
|
124
|
+
v2/v3/v4/v5 是**同构实现**(同一份契约、四份独立代码,刻意零共享)。这带来一个特有的缺陷类别:
|
|
125
|
+
**修正只落到一套**。真实事故(2.3.1 → 2.3.2):
|
|
126
|
+
|
|
127
|
+
- `defect` 的"`encourage` 档不得声称框架会强制搁置"这条修正只改了 v5,另外三套仍无条件宣称
|
|
128
|
+
"本次裁定**不定论**"——承诺了 `encourage` 档根本无法强制的行为;
|
|
129
|
+
- "撤回归档证明"在 v5 是**删除 → 校验真的没了 → 否则覆盖撤回说明**,另外三套只做尽力删除
|
|
130
|
+
(两套静默吞掉失败、一套不校验)——宿主删不掉时,已撤回的证明仍留在 `Verified/Lean/<id>.lean`
|
|
131
|
+
这个"大家找证明"的位置;
|
|
132
|
+
- `formal` 回执通道在 v2/v3 有 `formalOn()` 守卫,v4/v5 没有——`off` 档可被残留回执写入状态。
|
|
133
|
+
|
|
134
|
+
所以:
|
|
104
135
|
|
|
105
|
-
|
|
136
|
+
- [ ] 任何语义/措辞修正,**逐一核对四套**(含各自的 `实现方案.md`、persona、语料与断言);
|
|
137
|
+
- [ ] 参数、工具名、字段名、路径、错误码这类**表面**已有静态守卫
|
|
138
|
+
(`audit-persona-surface` / `audit-spec-traceability` / `audit-prompt-invariants`);
|
|
139
|
+
但**语义**(承诺强度、失败回退、边界条件)没有静态守卫,必须靠"把四套**渲染后的提示词/行为**
|
|
140
|
+
并排对照"来查——随包语料就是为这个准备的;
|
|
141
|
+
- [ ] 用**同一份输入**驱动四套,比较**可观测结果**(记录落库、文件是否撤回、门禁是否放行),
|
|
142
|
+
而不是比较代码长得像不像。
|
|
143
|
+
|
|
144
|
+
### 1.9 工具参数 schema:文档写了 ≠ 工具收得下
|
|
145
|
+
|
|
146
|
+
§1.6 查的是"persona 里有没有写",这一节查**工具的参数 schema 收不收得下**。本仓库所有工具 schema 都由
|
|
147
|
+
`objParams` 收口,并以 `additionalProperties:false` **关闭**:schema 没列出的键会被任何遵守 schema 的
|
|
148
|
+
provider **直接拒绝**。于是"提示词/规格/状态表都写着这个参数"完全可以在**功能根本打不开**的同时全绿。
|
|
149
|
+
|
|
150
|
+
- [ ] 每个"可调参数"是否同时出现在:**设置工具的参数 schema**、发现面(`vibe_math_setup` 返回的
|
|
151
|
+
`PARAM_SCHEMA` / v4·v5 的 status 参数表)、`<vibe root>/*setting.json` 模板、以及 persona 参数表?
|
|
152
|
+
**真实事故(2.3.2 D1)**:v3 的四个 Lean 参数写进了 persona、规格与状态行,却**从未写进
|
|
153
|
+
`vibe_math_set_params` 的 schema**;所有套件全绿(套件直接调 handler、绕过 schema),而用户
|
|
154
|
+
**永远无法开启这个功能**。
|
|
155
|
+
- [ ] schema **声明的**每个键,参数层是否**真的接收**?(v2/v3 的闸门是 `DEFAULT_PARAMS` 的键集、
|
|
156
|
+
v4 是 `k in params`、v5 是 `normalizeParams` 的类型列表。)声明而不接收 = 调用返回 `{ok:true}`、
|
|
157
|
+
什么都不发生——最容易被读成"设置成功"的静默失效。
|
|
158
|
+
- [ ] 同一工具被**注册两次**(v2/v3 各有"会话 handler 表"与"真实 `tools.register`"两份定义)时,
|
|
159
|
+
两份 schema 是否**逐键一致**?漂移会让其中一条路径上的功能不可达。
|
|
160
|
+
- [ ] 新增/修改任何参数后,跑 `node audit-prompt-invariants.mjs`(I13/I14)与
|
|
161
|
+
`node audit-prompt-invariants.mjs --self-probe`(证明这两条不变式**真的会变红**)。
|
|
162
|
+
|
|
163
|
+
> **守卫为什么必须是"可被证伪的"**:I13/I14 用 `--self-probe` 在内存里注入真实缺陷形状
|
|
164
|
+
> (v3 少一个 Lean 参数 / v4 多一个参数层不接收的键 / v5 的 `normalizeParams` 少一项),
|
|
165
|
+
> 要求对应不变式**变红**,并要求**未变异的对照跑仍为绿**。没有对照的探针会把"脚本坏了"当成"守住了"。
|
|
166
|
+
|
|
167
|
+
---
|
|
106
168
|
|
|
107
169
|
### 2.1 逐条断言,而不是抽查
|
|
108
170
|
|
|
@@ -129,6 +191,11 @@
|
|
|
129
191
|
- 机器可读(JSON)+ 人可读(Markdown);
|
|
130
192
|
- 覆盖全部交互类型(入职、重建、常规轮、心跳、表决初评/辩论、会议、提议、各类框头、框架提示、失败);
|
|
131
193
|
- 把工作区路径归一化(如 `<WS>`),使语料**确定性、可 diff**;
|
|
194
|
+
- **归一化必须大小写与分隔符无关**:Windows 下 `os.tmpdir()` 可能给出与插件渲染路径**不同大小写**
|
|
195
|
+
的同一目录,`split(WS)` 会漏掉全局根(如 `<VibeMath 根>/Formal/Lib`)的绝对路径——语料因此
|
|
196
|
+
**每次运行都变**(临时目录名一变就 diff 一大片)并**泄露本机路径**。真实事故,已修;
|
|
197
|
+
- **时间戳也要归一化**:提示词表头自带 `### YYYY-MM-DD hh:mm:ss|<成员>`,不归一化就**逐次都变**,
|
|
198
|
+
diff 完全失去意义(真实事故:v5 语料里 54 处时间戳)。判据很简单——**连续跑两次,哈希必须相同**;
|
|
132
199
|
- **随包发布**,作为人工复核提示词正确性的入口——复核者不必去翻会话日志。
|
|
133
200
|
|
|
134
201
|
### 2.5 每个不变式都要有灵敏度探针
|
|
@@ -144,6 +211,10 @@
|
|
|
144
211
|
这类变异不能做探针——它会让审计误报"盲点"。
|
|
145
212
|
- [ ] 探针**不得引入语法错误**:语法错误导致的非零退出同样是"假红"。
|
|
146
213
|
每条变异都应能被 `node --check` 通过。
|
|
214
|
+
- [ ] 变异必须替换锚点的**全部**出现:`String.prototype.replace` 只替换第一处。同一份契约常在
|
|
215
|
+
两处发出(例如 v5 的回执契约同时出现在 `replySpec` 与表决提示词里),只改一处时套件
|
|
216
|
+
**合理地保持绿色**——那是**假盲点**,比漏测更误导(会让人去"修"一个本来就是对的不变式)。
|
|
217
|
+
锚点声明了几次出现,就要替换几次;脚本应对此显式断言。
|
|
147
218
|
- [ ] 守 **persona 静态面**的套件也要有探针,且该套件必须支持"指向副本"的环境变量
|
|
148
219
|
(`audit-persona-surface.test.mjs` 的 `PERSONA_ROOT`):探针变异的是**副本**,
|
|
149
220
|
套件不读这个变量就永远在跑原始文件、恒为绿(同 §2.5 第二条)。
|
|
@@ -178,7 +249,11 @@
|
|
|
178
249
|
- [ ] 需求可追溯:方案里列出的工具名、参数名、理念条目,代码里是否都存在。
|
|
179
250
|
- [ ] 失败路径:看门狗、幂等、崩溃恢复、降级后端、配额、越权。
|
|
180
251
|
- [ ] 全量回归:**所有**历史套件,且逐个检查退出码(不要用管道截断输出,
|
|
181
|
-
管道会吞掉退出码或造成 EPIPE
|
|
252
|
+
管道会吞掉退出码或造成 EPIPE)。**用 `node run-tests.mjs` 并行跑**(并发 = min(4, 核数)),
|
|
253
|
+
它会打印每项耗时、wall/sum、加速比与最慢几项——**先看时间再决定策略**,基线见
|
|
254
|
+
[`docs/test-timing.md`](docs/test-timing.md)。若某个套件远慢于基线,先查它是否在等一个
|
|
255
|
+
**永远不会发生的条件**(真实事故:v2 套件 186 s,主因是一次 `tick(1100)` 嵌在
|
|
256
|
+
"从不提前退出"的 16 次循环里)。
|
|
182
257
|
- [ ] 发布产物自证:不是"publish 退出 0"就算完成——要从 registry 取回 tarball,
|
|
183
258
|
核对 shasum、逐字节比对插件、确认修复标记存在、并在**已发布包内**跑一遍套件。
|
|
184
259
|
|
package/README.md
CHANGED
|
@@ -247,7 +247,7 @@ flowchart TB
|
|
|
247
247
|
|
|
248
248
|
| 取值 | 含义 |
|
|
249
249
|
|---|---|
|
|
250
|
-
| **`'off'`(默认)** | **不额外进行任何要求。**
|
|
250
|
+
| **`'off'`(默认)** | **不额外进行任何要求。** 成员提示词里不出现任何 Lean 内容,不写入任何形式化状态,验证流程与门禁完全不变(是**真正的无操作**,有断言与探针守着)。三个工具仍注册可用(主动调用照常工作);主代理的 persona **始终**写着这三个工具与四个参数——否则这个开关就不可发现、"off" 也就无从打开 |
|
|
251
251
|
| `'encourage'` | **鼓励但不强制**:验证时先判断该对象的**实现难度**,能在可接受工作量内形式化就优先做;一旦 Lean 通过,审查重心转为**忠实性**。平时工作也鼓励把常用/可能复用的对象、假设、新定义随手形式化归档。**不设门禁** |
|
|
252
252
|
| `'require'` | **强制**:真/假结论必须满足「**Lean 已通过**」或「**显式记录了阻塞原因**」,否则本次裁定**不生效**——记为未定论(原因 `formal-required`)、写入「形式化待办」、群聊公告,对象留库待形式化后重新提议 |
|
|
253
253
|
|
|
@@ -255,6 +255,33 @@ flowchart TB
|
|
|
255
255
|
> 但决定必须说出来、可审计**,不允许静默跳过。相关参数还有 `leanCommand`(默认 `lean`)、
|
|
256
256
|
> `leanArgs`(配合 `lake env lean`)、`leanTimeoutMs`(默认 120s)。
|
|
257
257
|
|
|
258
|
+
### ⚠️ 忠实性缺陷 ≠ 命题为假(重要)
|
|
259
|
+
|
|
260
|
+
Lean 通过只保证"这段代码过了内核",**不保证它说的就是命题想说的**。所以当表决者逐条核对后
|
|
261
|
+
发现 Lean 代码与命题原文不一致(写窄了 / 写宽了 / 换了对象 / 漏了条件)时:
|
|
262
|
+
|
|
263
|
+
- **不得投 0**。投 0 的含义是"**该命题为假**";一个写错的形式化会让框架把"形式化不合格"
|
|
264
|
+
记成"命题被证伪",在 v5 的全 0 一致规则下甚至会把命题写进 `Verified/` 标注**假**——
|
|
265
|
+
用来求真的机制反而**伪造出一个错误的否定结论**。
|
|
266
|
+
- 正确做法:给一个严格介于 0 与 1 之间的值(记为弃权)+ 用回执
|
|
267
|
+
`formal:{decision:'defect', note:'<具体偏差>'}` 记录偏差。框架随即**撤回这条证明的「已通过」状态**
|
|
268
|
+
(降级为 `attempted`;`Verified/Lean/<id>.lean` **删除**,宿主删不掉时改写为"已撤回"说明,
|
|
269
|
+
绝不把一个已撤回的证明留在大家找证明的位置;写入「形式化待办」),`require` 档下
|
|
270
|
+
**本次裁定不定论**(`encourage` 档没有门禁,不得声称框架会强制搁置——那里靠表决者弃权阻止定论);
|
|
271
|
+
修正形式化并重新跑通后再投票。
|
|
272
|
+
- 只有表决者**独立于这份 Lean 代码**也能确定命题为假(并能给出独立理由)时才投 0。
|
|
273
|
+
|
|
274
|
+
> **回执通道**(不调用 Lean 工具的成员也能留下判断,`require` 档下必须留):
|
|
275
|
+
> `"formal": {"target":"<对象id>", "decision":"used|blocked|defect", "file":"Formal/<对象id>.lean", "note":"难度判断/阻塞原因/具体偏差"}`。
|
|
276
|
+
> `decision='blocked'`/`'defect'` 时 **`note` 必填**(缺则整条拒绝);`used` 只把对象记为 `attempted`;
|
|
277
|
+
> `off` 档下这个通道**失效**(否则 `off` 就不是真正的无操作了)。
|
|
278
|
+
|
|
279
|
+
> 注入提示词的另外三条硬要求(契约 §6):工具名一律**全称**(`<prefix>lean_archive` 不是
|
|
280
|
+
> `lean_archive`——缩写不是注册名,代理照抄会调用一个不存在的工具);归档可复用定义/引理**前先跑通**,
|
|
281
|
+
> 跑不通不许进库;**工具链缺失**(`LEAN_NOT_FOUND` 解析不到可执行文件 / `NO_SUBPROCESS` 宿主没有
|
|
282
|
+
> subprocess 服务)时把代码写下来归档并在 `note` 写明"宿主无 Lean 工具链"——这算显式阻塞原因,
|
|
283
|
+
> 门禁据此放行,不会因为装不了 Lean 而卡死。
|
|
284
|
+
|
|
258
285
|
### 归档:形式化代码放哪里
|
|
259
286
|
|
|
260
287
|
```
|
|
@@ -784,10 +811,14 @@ v5 的完整架构(含成员生命周期、一轮时序、共识状态机、
|
|
|
784
811
|
- **v4(常驻自组织)**:[`vibe-math-v4/实现方案.md`](vibe-math-v4/实现方案.md)
|
|
785
812
|
- **v5(研究所体系)**:[`vibe-math-v5/实现方案.md`](vibe-math-v5/实现方案.md)(文字规格)· [`vibe-math-v5/架构图.md`](vibe-math-v5/架构图.md)(全套架构图)
|
|
786
813
|
- **v5 提示词与交互语料**:[`prompt-corpus-v5/prompt-corpus-v5.md`](prompt-corpus-v5/prompt-corpus-v5.md)(框架真正发出的每一条提示词原文,可直接人工复核身份/编制/交互署名是否正确)
|
|
814
|
+
- **四套 Lean 提示词语料**:[`prompt-corpus-v2/formal-verify-v2.md`](prompt-corpus-v2/formal-verify-v2.md) · [`prompt-corpus-v3/formal-verify-v3.md`](prompt-corpus-v3/formal-verify-v3.md) · [`prompt-corpus-v4/formal-verify-v4.md`](prompt-corpus-v4/formal-verify-v4.md)(各自覆盖 off / encourage / **require** / 忠实性分支 / 工作轮 / 回执契约;工作区归一化为 `<WS>`、VibeMath 根为 `<VIBEMATH>`)
|
|
787
815
|
- **四个预设的 persona 原文**:[`prompt-corpus-persona/persona-corpus.md`](prompt-corpus-persona/persona-corpus.md)(主代理实际收到的提示词:有哪些工具、哪些参数、哪些斜杠子命令;由 `audit-persona-surface.test.mjs` 生成,随包发布)
|
|
788
816
|
- **Lean 形式化验证(四架构共用契约)**:[`docs/formal-verification.md`](docs/formal-verification.md)
|
|
817
|
+
- **测试耗时基线与并行跑法**:[`docs/test-timing.md`](docs/test-timing.md)(`node run-tests.mjs` 并行跑全部套件 ≈1.9 min;探针脚本 ≈2.6 min;每个 runner 都会打印耗时/加速比供下次选策略)
|
|
789
818
|
- **静态提示词面一致性(persona ↔ 工具注册表 ↔ 斜杠命令 hint/usage)**:[`audit-persona-surface.test.mjs`](audit-persona-surface.test.mjs)(197 条断言,并生成 [`prompt-corpus-persona/persona-corpus.md`](prompt-corpus-persona/persona-corpus.md) 供人工复核)+ [`audit-persona-sensitivity.mjs`](audit-persona-sensitivity.mjs)(11 条灵敏度探针)——守"注册的工具必须在 persona 里出现 / persona 里的名字必须真的注册 / `prefix` 与 `text` 两块逐行一致 / hint、usage、实际分支三处必须一致"
|
|
790
|
-
- **全面检查必查清单**:[`AUDIT-CHECKLIST.md`](AUDIT-CHECKLIST.md)
|
|
819
|
+
- **全面检查必查清单**:[`AUDIT-CHECKLIST.md`](AUDIT-CHECKLIST.md)(本仓库的强制审计流程;§1.9 专门查"工具参数 schema 收不收得下")
|
|
820
|
+
- **提示词/交互不变式(四套一起,可一键复核)**:[`audit-prompt-invariants.mjs`](audit-prompt-invariants.mjs)(145 条断言)——把"历史上真实发生过的提示词/工具面缺陷类别"逐条编码成静态不变式(缩写工具名、把忠实性缺陷投成 0、`defect` 只写在提示词里没实现、回执契约缺 `defect`、无 note 放行、字段名错、`off` 档回执仍能写状态、语料不确定、探针缺失、**工具的封闭 schema 收不下它自己文档里的参数**、**schema 声明了参数层却静默丢弃的键**)。加 `--self-probe` 会在内存里注入这些缺陷形状,要求对应不变式**变红**、未变异的对照跑**仍为绿**(5/5)
|
|
821
|
+
- **规格 ↔ 代码可追溯(四套一起)**:[`audit-spec-traceability.mjs`](audit-spec-traceability.mjs)(91 条断言)——`实现方案.md`/README 里承诺的工具必须真的注册;四个 Lean 参数必须同时被文档与代码接受
|
|
791
822
|
|
|
792
823
|
---
|
|
793
824
|
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# dsh-vibe-math 2.3.1 — 提示词与交互修复:忠实性缺陷不再被记成"命题为假"
|
|
2
|
+
|
|
3
|
+
> 上一版:2.3.0(四个架构新增 Lean 形式化验证)。本版是**审计驱动的修复版**:
|
|
4
|
+
> 2.3.0 的功能是对的,但**代理读到的文字**与**回执通道**里有几处会造成错误结论的缺陷。
|
|
5
|
+
> 发布前对"运行时注入的 Lean 提示词 + 回执通道 + 语料"做了一次专项审计,本版修掉全部发现。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 0. 最严重的一条:形式化写错了 ≠ 命题为假
|
|
10
|
+
|
|
11
|
+
2.3.0 的忠实性分支写的是:
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
▸ 因此请把 verdict 用在**忠实性**上:一致 → 1;发现任何偏离 → 0(或按不确定度给中间值并说明)。
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
当 Lean 代码写的不是命题想说的(把条件写窄了 / 写宽了 / 换了对象 / 漏了条件)时,这条指令让表决者
|
|
18
|
+
投 **0**——而 0 的含义是"**该命题为假**"。于是:
|
|
19
|
+
|
|
20
|
+
- 框架把"形式化不合格"记成"命题被证伪";
|
|
21
|
+
- 在 v5 的**全 0 一致**规则(或 v4 的全组一致规则)下,一个写错的形式化会把命题
|
|
22
|
+
**写进 `Verified/` 并标注「假」**;
|
|
23
|
+
- 也就是说,**为了求真更严格而引入的机制,反而伪造出一个错误的否定结论**。
|
|
24
|
+
|
|
25
|
+
本版把它改成独立的一档 `defect`(契约 §4.1):
|
|
26
|
+
|
|
27
|
+
| | 2.3.0 | 2.3.1 |
|
|
28
|
+
|---|---|---|
|
|
29
|
+
| 发现忠实性偏差 | 投 0(= 命题为假) | **不得投 0**:给严格介于 0 与 1 之间的值(记为弃权)+ 回执 `formal:{decision:'defect', note:'<具体偏差>'}` |
|
|
30
|
+
| 框架动作 | 按"假"参与定论 | **撤回「已通过」**:降级 `attempted`、清空 `proof`、撤回归档证明、写入「形式化待办」、公告 |
|
|
31
|
+
| `require` 档 | 门禁已放行(`passed`) | 门禁**重新拦住**:本次裁定**不定论**,修正形式化并重新跑通后再投票 |
|
|
32
|
+
| 什么时候才能投 0 | 发现偏差就投 | **只有独立于这份 Lean 代码也能确定命题为假**(并给出独立理由)时 |
|
|
33
|
+
|
|
34
|
+
> `encourage` 档没有门禁:框架仍然撤回证明并记入待办,但**不在提示词里承诺一个它无法强制的
|
|
35
|
+
> "不定论"**——那里靠表决者按指令给出的弃权使表决得不出布尔一致结论。(这条区分本身也是审计发现的:
|
|
36
|
+
> 首版草稿在两种档位下都声称"本次裁定不定论",而 `encourage` 档根本没有门禁。)
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 1. 本版修掉的缺陷(按严重度)
|
|
41
|
+
|
|
42
|
+
| # | 缺陷 | 影响 | 落点 |
|
|
43
|
+
|---|---|---|---|
|
|
44
|
+
| 1 | **v2 的 `formal` 回执通道是死代码**:提示词让代理"在回执的 formal 字段写明难度判断",但 v2 的两份验证回执契约里**没有**这个字段,框架也**从不解析**它 | 代理写下的难度判断**静默消失**;`require` 档下代理以为记录了阻塞,门禁却一直拦着 | 补齐 `formalJsonField` / `formalReplyNote` / `absorbFormalFromReply`,并接进初评 + 辩论两条路径 |
|
|
45
|
+
| 2 | **忠实性缺陷被判成"命题为假"**(四个架构) | 可能伪造出错误的否定结论(见 §0) | 新增 `defect` 档(四套) |
|
|
46
|
+
| 3 | **字段名写错**:v2/v3 的 Lean 段说"并据此给出 verdict",但这两套的回执字段是 `Result` | 代理回 `{"verdict":…}` 时**那一票被静默丢弃**(默认 0.5) | 忠实性分支改写为 `Result`(v3 还补上了缺失的"偏差怎么映射"指引) |
|
|
47
|
+
| 4 | **缩写工具名**:注入文本里出现 `lean_lib` / `lean_archive`(v2/v3/v5,**包括工具自己返回的 `hint`**) | 照抄的代理调用一个**不存在的工具** | 全部改为注册名全称 `<prefix>lean_*` |
|
|
48
|
+
| 5 | **没有"归档前先跑通"的要求** | 不编译的定义/引理会污染跨项目复用库 | 提示词明确:`run=true` 或先 `lean_run`,跑不通不许入库 |
|
|
49
|
+
| 6 | **工具链缺失没有出路** | 宿主没装 Lean 时,`require` 档代理可能反复空转 | 提示词明确:`LEAN_NOT_FOUND` 时把代码归档并在 `note` 写明"宿主无 Lean 工具链",算显式阻塞原因 |
|
|
50
|
+
| 7 | **语料不是确定性产物**:v5 的路径归一化在 Windows 下因**大小写**差异(`split(WS)` 匹配不上)漏掉了 VibeMath 根的绝对路径,且提示词表头自带 `### YYYY-MM-DD hh:mm:ss|<成员>` **时间戳** | 随包语料每跑一次都变(上一次提交里的语料改动就纯粹来自临时目录改名)、泄露本机路径、diff 失去意义 | `scrub` 改为大小写/分隔符无关,并把时间戳归一化为 `<TIME>`——现在**逐字节稳定**(已实测两次运行的 SHA256 相同) |
|
|
51
|
+
| 8 | **v2/v4 没有 Lean 提示词语料;`require` 档文本不在任何语料里** | 复核者只能翻源码;门禁那段话从没被人读过 | 四套各自新增 `prompt-corpus-vN/`,覆盖 off/encourage/**require**/忠实性/工作轮/回执契约 |
|
|
52
|
+
| 9 | **v2 套件的回执断言只查措辞**("提示词里有那句话") | 177 条断言全绿却守着一个**死通道** | 改为**行为断言**:把带 `formal` 的回执真的喂给框架,断言记录落库 |
|
|
53
|
+
| 10 | 套件里"占位垃圾"扫描用了裸 `\bundefined\b` | 把 v2 explorer 提示词里合法的英文 "no undefined symbols" 误报为垃圾 | 改为只匹配**数据位**的垃圾(`: undefined` / `"undefined"` / `undefined,` …) |
|
|
54
|
+
|
|
55
|
+
> 第 1、9 条是同一件事的两面:**提示词说了、框架没做、测试只查措辞**——这类缺陷在任何只断言
|
|
56
|
+
> "包含某些关键词"的套件里都是隐形的(`AUDIT-CHECKLIST.md` §2.2 早就点过名)。
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## 2. 契约与文档同步
|
|
61
|
+
|
|
62
|
+
- `docs/formal-verification.md`:新增 **§4.1 `defect`**(含状态迁移与"唯一可以投 0 的情形")、
|
|
63
|
+
§6 顶部新增 **5 条提示词硬要求**、§6.1 忠实性分支改写、§6.3 回执契约加 `defect` 与"必须真的被解析",
|
|
64
|
+
§10 新增测试要求 8–11(行为断言 / 忠实性语义断言 / 每架构语料 + 归一化 / 提示词探针)。
|
|
65
|
+
- `README.md`:Lean 章节新增「⚠️ 忠实性缺陷 ≠ 命题为假」,并把三条硬要求写进正文。
|
|
66
|
+
- 各 `实现方案.md`:v2 / v3 / v4 / v5 都补了 `defect` 语义、工具名全称、归档前跑通、工具链缺失出路,
|
|
67
|
+
以及各自的断言数与语料说明。
|
|
68
|
+
- `AUDIT-CHECKLIST.md` §1.6 静态提示词面 + §2.5 探针纪律:本版新增的 16 条**提示词探针**正是按它执行。
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## 3. 测试与探针(本版实测)
|
|
73
|
+
|
|
74
|
+
| 套件 | 2.3.0 | 2.3.1 |
|
|
75
|
+
|---|---|---|
|
|
76
|
+
| `formal-verify-v2.test.mjs` | 177 | **261**(含 `defect` 双向 id 降级、回执通道行为断言、语料 89 条) |
|
|
77
|
+
| `formal-verify-v3.test.mjs` | 189 | **247** |
|
|
78
|
+
| `formal-verify-v4.test.mjs` | 144 | **226** |
|
|
79
|
+
| `formal-verify-v5.test.mjs` | 88 | **120** |
|
|
80
|
+
| `prompt-v5-integrity.test.mjs` | 563 | **588**(语料 70 条 / 27 类,新增 `lean-require`、`lean-after-defect`) |
|
|
81
|
+
| `audit-formal-sensitivity.mjs` | 33 探针 | **49 探针**(新增 16 条提示词探针:删掉"不要投 0"、把工具名换成缩写、删掉 `require` 门禁措辞、把回执契约里的 `defect` 去掉——四套各 4 条) |
|
|
82
|
+
| `audit-persona-sensitivity.mjs` | 11 探针 | 11 探针(不变,全红) |
|
|
83
|
+
| `audit-persona-surface.test.mjs` | 197 断言 | 197 断言(persona 未改,仍全绿) |
|
|
84
|
+
|
|
85
|
+
四套现在都**自带**随包发布的人工复核语料:
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
prompt-corpus-v2/formal-verify-v2.{json,md} # 89 条
|
|
89
|
+
prompt-corpus-v3/formal-verify-v3.{json,md}
|
|
90
|
+
prompt-corpus-v4/formal-verify-v4.{json,md}
|
|
91
|
+
prompt-corpus-v5/prompt-corpus-v5.md # 70 条 / 27 类
|
|
92
|
+
prompt-corpus-persona/persona-corpus.md # 四个预设的 persona 原文
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
语料里的工作区路径归一化为 `<WS>`、VibeMath 根归一化为 `<VIBEMATH>`,可 diff、不含本机路径。
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## 3.5 测试执行提速:并行 runner + 耗时反馈(本版新增)
|
|
100
|
+
|
|
101
|
+
这轮顺带做了一次"测试脚本自己有多慢"的审计,结论是**时间几乎全花在等待上,而不是在测东西**:
|
|
102
|
+
|
|
103
|
+
| | 优化前 | 优化后 | 手段 |
|
|
104
|
+
|---|---|---|---|
|
|
105
|
+
| 探针脚本 `audit-formal-sensitivity.mjs`(49 条) | **38 min**(串行) | **2.6 min**(wall 154.6 s,sum 612 s,**x3.96**) | ① 探针并行(并发 4,每个探针独立变异副本 + 独立语料目录,互不干扰);② 修掉 v2 套件的 186 s(见下) |
|
|
106
|
+
| 全量回归(23 个套件) | ≈ 5.5 min(串行) | **1.9 min**(wall 114.4 s,sum 219.4 s,**x1.92**) | 新增 **`run-tests.mjs`**:并行跑全部套件并打印每项耗时、wall/sum、加速比、最慢几项 |
|
|
107
|
+
| `formal-verify-v2.test.mjs` 单套件 | **186 s** | **≈32 s** | 两处根因:① 插件用 `setInterval(...,1000)` 轮询调度器,套件每次 `tick()` 都得等满 1 秒——套件现在**只把 `setInterval` 快进到 25 ms**(自己的 `sleep` 用 `setTimeout`,不受影响;插件内部"该不该 tick"仍按真实 200 ms 下限判断,**生产代码零改动**);② `verifyWithDebate` 的 16 次循环**从不提前退出**(判据 `autoDone` 之类的条件永远不会发生),每次调用白烧 ~21 s——现在按"连续 3 轮没有新 followup"提前退出。断言数不变(261) |
|
|
108
|
+
| `e2e-v4-fixes.test.mjs` | 105 s | 101 s | 12 个轮询循环加了"安静即停"(原判据 `autoDone‖running===false` 对活着的 run 永不成立)。**再往下压就要砍采样深度**:9 个慢用例(T13/T19/T22/T23/T25/T27/T2/T9/T20)是在观察"多轮之后某指令**没有**泄漏/重复",轮数就是它们的不变式本体 |
|
|
109
|
+
|
|
110
|
+
**耗时基线写进了 [`docs/test-timing.md`](docs/test-timing.md)**:单套件耗时表、并行安全性(语料目录必须
|
|
111
|
+
逐实例隔离)、以及"按目的选最小代价组合"的策略表。两个 runner 每次都会打印耗时与加速比——
|
|
112
|
+
**下次跑之前先看这几行**,再决定并发数、要不要 `--only`、以及某个变慢的套件是不是又在等一个
|
|
113
|
+
永远不会发生的条件。
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## 4. 兼容性与迁移
|
|
118
|
+
|
|
119
|
+
无破坏性变更,**不需要迁移**:
|
|
120
|
+
|
|
121
|
+
- 默认仍是 `formalVerify: 'off'`(真正的无操作),行为与 2.3.0 逐字节一致;
|
|
122
|
+
- `defect` 是**新增**的回执取值;已有代理若仍回 `"decision":"used"|"blocked"` 一切照旧;
|
|
123
|
+
- 提示词里的工具名由缩写改为全称,只会让**照抄的调用**从失败变为成功;
|
|
124
|
+
- 归档路径、门禁位置、三个工具、四个参数**都没有变**。
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## 5. 升级
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
npm i dsh-vibe-math@latest
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
升级后重启 DSH:未被手动改过的 preset 文件会自动更新;语言/提示词层面的变化在新会话生效。
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# dsh-vibe-math 2.3.2 — 四套深度审计:三处高危门禁缺陷 + 撤回语义统一 + 语料确定性
|
|
2
|
+
|
|
3
|
+
> 上一版:2.3.1。本版是**审计驱动**的修复版:对 v2/v3/v4/v5 各做了一轮逐架构深度审计
|
|
4
|
+
> (插件 + 套件 + 实现方案 + persona + 语料),并做了四个架构之间的**横向对照**。
|
|
5
|
+
> 无破坏性变更,默认仍为 `formalVerify: 'off'`。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 0. 三处高危缺陷(都会让"严格验证"失效或不可用)
|
|
10
|
+
|
|
11
|
+
| # | 架构 | 缺陷 | 后果 |
|
|
12
|
+
|---|---|---|---|
|
|
13
|
+
| 1 | **v3** | 四个 Lean 参数**根本没写进 `vibe_math_set_params` 的参数 schema**(该 schema 是 `additionalProperties:false`) | 遵守 schema 的 provider **拒绝这个调用** → 用户**永远无法开启**这个功能;而套件全绿,因为它直接调 handler、**绕过 schema** |
|
|
14
|
+
| 2 | **v2** | `require` 门禁**只读自己那一侧的 id**(`formalOf(rId)`),而代理用**对象 id** 归档、别名同步只更新**已存在**的键 | "归档了 passed、验证侧还没有记录"时门禁**永远搁置**;搁置本身又写下 `rId='none'`,于是**每轮重开一次辩论、对象永远无法定论**、其它对象被饿死 |
|
|
15
|
+
| 3 | **v4** | `formalSetRun` 硬编码 `status:'attempted'`,**把已验证对象的 `passed` 抹掉**(与自己的注释、规格、v2/v5 都矛盾) | 一次随手 `lean_run` 就让对象丢掉"已形式化":投票提示词**丢掉忠实性分支**,`require` 档对**已有绿色归档证明**的对象重新关门 |
|
|
16
|
+
|
|
17
|
+
另有一处**门禁旁路**(v2):`settleVerdict` 的「判断命题」转移在 v=0 时直接写
|
|
18
|
+
`布尔估计=0`/`已验证`/`优先级 never` 并压入 `正确概率:1` 条目,**完全不看门禁**——一个未形式化的
|
|
19
|
+
命题被侧面判为**假**且永久退出调度。已改为先过门禁。
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 1. 撤回语义统一:**删除 → 复核 → 覆盖撤回说明**
|
|
24
|
+
|
|
25
|
+
2.3.1 只在 v5 做对了。本轮把同一语义推广到四套:撤回归档证明时
|
|
26
|
+
|
|
27
|
+
1. 先删(`subprocess` 可用时);
|
|
28
|
+
2. **用 fs 复核文件真的没了**;
|
|
29
|
+
3. 仍在(宿主没有 `subprocess`、shell 静默失败、权限问题)→ **就地覆盖为撤回说明**
|
|
30
|
+
(`-- 已撤回(<时间>):该形式化被认定与命题原文不一致。` + 指向保留的工作文件);
|
|
31
|
+
4. 公告**如实说明**发生了哪一种(删除 / 覆盖 / ⚠ 两者都失败,请不要把它当作该对象的证明)。
|
|
32
|
+
|
|
33
|
+
此外修掉了两处静默漏洞:v2 只从两个 id 收集 `proof`(别名归档的证明留在盘上);v2/v3/v4 用
|
|
34
|
+
`removeFile` 尽力删除且吞掉结果。
|
|
35
|
+
|
|
36
|
+
**同一类问题还有一处**:`lean_archive kind='proof'` 在**这次跑红**时曾保留 `prev.proof`
|
|
37
|
+
(而工作文件已被新代码覆盖)→ `Formal/Index.md` 会同时显示"attempted/fail"与一条**不再成立的**
|
|
38
|
+
`Verified/Lean/…`,忠实性提示词还会打印这个路径。四套统一为"`proof` 只属于 `passed`",并在跑红时
|
|
39
|
+
撤回旧的归档证明(v4 另外把"随手 `lean_run` 不许降级 passed"补回)。
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 2. 提示词/交互修复(逐条都有断言与探针)
|
|
44
|
+
|
|
45
|
+
| 修复 | 说明 |
|
|
46
|
+
|---|---|
|
|
47
|
+
| **按档位承诺**(四套) | 忠实性分支曾**无条件**宣称"本次裁定**不定论**",而只有 `require` 有门禁。现在 require 保留该承诺,encourage 明确写"**本档没有门禁**:请务必给弃权值,以保证本轮无法得出一致结论";defect 公告、TODO/Index 措辞同样按档位分叉 |
|
|
48
|
+
| **无工具链出路点名两个错误码**(四套) | 只写 `LEAN_NOT_FOUND` 时,遇到 `NO_SUBPROCESS`(宿主没有 subprocess 服务)的代理会当成未知失败而重试;现在两个都点出 |
|
|
49
|
+
| **失败提示要可执行**(v3) | `LEAN_NOT_FOUND`/`NO_SUBPROCESS`/`LEAN_SPAWN_FAILED` 没有编译器输出,却提示"按上面的编译器输出修复" → 改为按失败码给不同的出路 |
|
|
50
|
+
| **活动日志里的工具名**(v4) | 代理可读的日志里写着缩写 `lean_run` → 改为注册名 `vibe_v4_lean_run`;注入文本扫描现在也覆盖 `State/session.json` 的 `activityLog` |
|
|
51
|
+
| **路径指向真实位置**(v2) | 工作轮把可复用引理指向项目内的 `Formal/Proved/`——那是**不存在**的路径(全局库在项目树之外)→ 改为 `<VibeMath 根>/Formal/Proved/` |
|
|
52
|
+
| **红灯不许声称可复用**(v2) | `kind='def'/'lemma'` 跑红时工具返回值仍写"已并入全局可复用库,可直接 import 复用" |
|
|
53
|
+
| **`vibe_math_setup` 重复参数**(v3) | `plannerPersona` 出现两行 |
|
|
54
|
+
| **规格里的幽灵工具**(v4,由我的新审计发现) | `实现方案.md` 把 `vibe_v4_propose_verify(targetId)` 写成工具,而 v4 **没有**这个工具(真机制是回执字段 `propose_verify`) |
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## 3. 语料确定性(契约 §10 要求"逐字节可 diff")
|
|
59
|
+
|
|
60
|
+
- **v5**:语料每跑一次都变。根因有三层:心跳/会议唤醒依赖**真实时钟**与异步顺序;捕捉心跳时
|
|
61
|
+
"最闲成员"随时间抖动;写入端**只按 kind 排序**,同 kind 内仍随 drain 顺序变化。
|
|
62
|
+
修法:套件加**虚拟时钟**(`ctx.timeout` 接虚拟队列、`sleep(n)` 推进虚拟时间)+心跳在
|
|
63
|
+
**单成员研究所**内捕捉+写入端**全序排序**(kind → owner → prompt)。
|
|
64
|
+
结果:**连跑 6 次哈希全同**,且套件 **7–9 s → 1.7 s**。
|
|
65
|
+
- **v3**:20 条 `planner:*` 条目带随机 plan id 与 epoch 时间戳 → scrub 归一化 + 断言。
|
|
66
|
+
- **v2/v4**:本已稳定;v4 的语料在套件运行中重生成并验证两次哈希一致。
|
|
67
|
+
- 五份语料(四个预设 + persona)现在都通过我的确定性检查(无绝对路径、无时间戳、可重复)。
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## 4. 新增的常驻守卫(随包发布,可一键复核)
|
|
72
|
+
|
|
73
|
+
| 脚本 | 作用 |
|
|
74
|
+
|---|---|
|
|
75
|
+
| `audit-prompt-invariants.mjs` | 把历次**真实发生过的提示词/工具面缺陷类别**编码成四套 × 31 条静态不变式(缩写工具名 / "偏离→0" / `defect` 规则缺失或未实现 / 回执契约缺 `defect` / 无 note 放行 / 字段名错 / `off` 档回执未被门禁 / 语料不确定或缺档位 / 探针缺失 / 按档位承诺 / **封闭的 schema 收不下自己文档里的参数** / **schema 声明了、参数层却静默丢弃的键**)。**当前 145/0**,并带 `--self-probe`:在内存里注入这些缺陷形状,要求对应不变式**变红**、未变异的对照跑**仍为绿**(5/5) |
|
|
76
|
+
| `audit-spec-traceability.mjs` | 规格/README 承诺的工具必须真的注册(**能识别"文档里说它不存在"的否定语境**);四个 Lean 参数必须同时被文档与代码接受;契约 §7 的 `terminate()`;契约 §8 的**门禁收口点无旁路**(调用图检查)。**当前 91/0** |
|
|
77
|
+
| `run-tests.mjs` | 并行跑全部套件,打印每项耗时/加速比/最慢几项(本轮又修了 `--only x` 空格形式被静默忽略、`--json` 混入人类输出两个 bug) |
|
|
78
|
+
| `docs/test-timing.md` | 耗时基线 + 并行安全规则 + 虚拟时钟的适用条件(若套件用 `Date.now()` 做超时判据又用 `setInterval` 轮询,冻结时钟会让判据永不超时,必须连轮询定时器一起虚拟化) |
|
|
79
|
+
|
|
80
|
+
### 4.1 新增「工具参数 schema」守卫:文档写了 ≠ 工具收得下
|
|
81
|
+
|
|
82
|
+
本轮最贵的一处缺陷(v3 开不了档)暴露出一整类**既有测试全都盲**的漏洞:四个预设的工具 schema 都由
|
|
83
|
+
`objParams` 以 `additionalProperties:false` **关闭**,因此 schema 没列出的键会被任何遵守 schema 的
|
|
84
|
+
provider **直接拒绝**——可提示词/规格/状态行可以全都在说这个参数,套件也可以全绿(套件直接调 handler、
|
|
85
|
+
绕过 schema)。现在这层有了三重守卫:
|
|
86
|
+
|
|
87
|
+
1. 四套各自的 `formal-verify-vN.test.mjs` 直接检查**真实注册的** schema 对象:schema 必须仍是封闭的、
|
|
88
|
+
必须声明 `formalVerify`/`leanCommand`/`leanArgs`/`leanTimeoutMs`、`formalVerify` 的 enum 必须恰好是
|
|
89
|
+
三档(**已用探针证明**:把 v3 真实注册那一份里的 `leanArgs` 去掉,套件立刻变红);
|
|
90
|
+
2. `audit-prompt-invariants.mjs` 的 I13:**每一处** set 工具定义(v2/v3 有"会话 handler 表"与
|
|
91
|
+
"真实注册"两份)都必须声明这四个参数,且每一份 `objParams` 都必须关闭 schema;
|
|
92
|
+
3. 同脚本的 I14:schema **声明的每个键**都必须被参数层真正接收(v2/v3 的闸门是 `DEFAULT_PARAMS` 键集、
|
|
93
|
+
v4 是 `k in params`、v5 是 `normalizeParams` 的类型列表)——声明而不接收 = 调用返回 `{ok:true}`
|
|
94
|
+
而什么都不发生,是最容易被读成"设置成功"的静默失效。
|
|
95
|
+
|
|
96
|
+
`AUDIT-CHECKLIST.md` 新增 **§1.8「四套同构:任何语义修正必须四套同步」**——本轮三处高危里有两处正是
|
|
97
|
+
"改了一套、另三套没改"或"四套共用同一写法而没人横向对照"造成的。
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## 5. 测试与探针(实测)
|
|
102
|
+
|
|
103
|
+
| 套件 | 2.3.1 | 2.3.2 |
|
|
104
|
+
|---|---|---|
|
|
105
|
+
| `formal-verify-v2.test.mjs` | 261 | **319** |
|
|
106
|
+
| `formal-verify-v3.test.mjs` | 247 | **283** |
|
|
107
|
+
| `formal-verify-v4.test.mjs` | 226 | **269** |
|
|
108
|
+
| `formal-verify-v5.test.mjs` | 120 | **145** |
|
|
109
|
+
| `prompt-v5-integrity.test.mjs` | 588 | **506**(语料去重:心跳只记 1 条)+ 虚拟时钟 |
|
|
110
|
+
| `e2e-v4-fixes.test.mjs` | 120 | 120(**修掉并行下的抖动**:T21 的会议看门狗 80 ms 在 CPU 争用下提前放弃会议) |
|
|
111
|
+
|
|
112
|
+
- 全量回归:**连续 3 次并行跑,23/23 全绿**(wall ≈111 s,最新一次实测 wall 111.5 s / sum 221.5 s / x1.99,
|
|
113
|
+
关键路径 `e2e-v4-fixes` 98.1 s);
|
|
114
|
+
- `audit-formal-sensitivity.mjs`:**49 条探针全部按预期变红,0 问题**;
|
|
115
|
+
- `audit-prompt-invariants.mjs`:**145/0**,`--self-probe` **5/5**;`audit-spec-traceability.mjs` **91/0**;
|
|
116
|
+
- `audit-persona-sensitivity.mjs`:11/11 变红;`audit-persona-surface.test.mjs` 197/0;
|
|
117
|
+
- `audit-v5-integrity.mjs` clean;四套 `audit-registration.mjs` 无重复/无缺失;
|
|
118
|
+
- 新增两条 **schema 级探针**:把 v3 真实注册的 schema 里 `leanArgs` 去掉 → v3 套件变红(已实测);
|
|
119
|
+
在 v4/v5 里造一个"声明但不接收"的参数 → `audit-prompt-invariants.mjs` 变红(已实测)。
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## 6. 仍然存疑、需要人决定的政策问题(不是 bug,故未擅自改)
|
|
124
|
+
|
|
125
|
+
1. **跑红的 `kind='proof'` 是否应撤销旧证明**:本轮按"`proof` 只属于 `passed`"(契约 §4)统一四套;
|
|
126
|
+
若你认为"随手一次失败不该抹掉已证结论",应改**契约**而不是改代码。
|
|
127
|
+
2. **`off` 档"主动调用工具"算不算无操作**:契约 §2 明确工具仍可用,但那会写 `Formal/Index.md`/状态/公告;
|
|
128
|
+
四个审计都把它记为 policy call,现已在规格里澄清"off 约束的是**框架自身**,主动调用是显式行为"。
|
|
129
|
+
3. **`used` 回执的语义**:契约状态表字面写"→ attempted",而四套实现都**保留** `passed`/`blocked`
|
|
130
|
+
(否则每条"我用了它"的回执都会把 passed 打回 attempted 并重新关门)。建议改契约字面。
|
|
131
|
+
4. **v2 的 id 解析歧义(真实可达)**:`formalObjectIdOf` 把"对象 id 本身以 `-sN/-pfN/-rfN` 结尾"的
|
|
132
|
+
rId 解析错(`r-p-s1 → p`):这类命题的提示词/卡片会引用**另一个对象**的证明、门禁会被那个对象的
|
|
133
|
+
`passed` 放行。正确修法是**在记录里落权威 `objectId`**,但这要先把契约定下来。
|
|
134
|
+
5. **只剩"被门禁搁置"的对象时**:调度器会空转(不会卡死、不会误判终止)——契约没写这种局面该终止还是空转。
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## 7. 升级
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
npm i dsh-vibe-math@latest
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
无迁移:新参数默认 `off`,四套既有行为与 `off` 一致。升级后重启 DSH;未被手动改过的 preset 文件
|
|
145
|
+
会自动更新。
|