dsh-vibe-math 2.3.12 → 2.3.13
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/README.md +17 -13
- package/{AUDIT-CHECKLIST.md → docs/AUDIT-CHECKLIST.md} +323 -304
- package/docs/COMPAT-AUDIT-ROUND2.md +325 -0
- package/docs/generate_framework_diagram_v2.py +114 -0
- package/docs/generate_framework_diagram_v3.py +127 -0
- package/{RELEASE-NOTES-2.1.0.md → docs/release-notes/RELEASE-NOTES-2.1.0.md} +143 -143
- package/{RELEASE-NOTES-2.2.0.md → docs/release-notes/RELEASE-NOTES-2.2.0.md} +266 -266
- package/{RELEASE-NOTES-2.2.1.md → docs/release-notes/RELEASE-NOTES-2.2.1.md} +43 -43
- package/{RELEASE-NOTES-2.2.2.md → docs/release-notes/RELEASE-NOTES-2.2.2.md} +88 -88
- package/{RELEASE-NOTES-2.3.0.md → docs/release-notes/RELEASE-NOTES-2.3.0.md} +207 -207
- package/{RELEASE-NOTES-2.3.1.md → docs/release-notes/RELEASE-NOTES-2.3.1.md} +134 -134
- package/{RELEASE-NOTES-2.3.10.md → docs/release-notes/RELEASE-NOTES-2.3.10.md} +105 -105
- package/{RELEASE-NOTES-2.3.11.md → docs/release-notes/RELEASE-NOTES-2.3.11.md} +57 -57
- package/{RELEASE-NOTES-2.3.12.md → docs/release-notes/RELEASE-NOTES-2.3.12.md} +80 -80
- package/docs/release-notes/RELEASE-NOTES-2.3.13.md +137 -0
- package/{RELEASE-NOTES-2.3.2.md → docs/release-notes/RELEASE-NOTES-2.3.2.md} +145 -145
- package/{RELEASE-NOTES-2.3.3.md → docs/release-notes/RELEASE-NOTES-2.3.3.md} +115 -115
- package/{RELEASE-NOTES-2.3.4.md → docs/release-notes/RELEASE-NOTES-2.3.4.md} +69 -69
- package/{RELEASE-NOTES-2.3.5.md → docs/release-notes/RELEASE-NOTES-2.3.5.md} +63 -63
- package/{RELEASE-NOTES-2.3.6.md → docs/release-notes/RELEASE-NOTES-2.3.6.md} +66 -66
- package/{RELEASE-NOTES-2.3.7.md → docs/release-notes/RELEASE-NOTES-2.3.7.md} +59 -59
- package/{RELEASE-NOTES-2.3.8.md → docs/release-notes/RELEASE-NOTES-2.3.8.md} +45 -45
- package/{RELEASE-NOTES-2.3.9.md → docs/release-notes/RELEASE-NOTES-2.3.9.md} +70 -70
- package/docs/test-timing.md +18 -17
- package/installer.js +105 -41
- package/package.json +42 -37
- package/{audit-formal-sensitivity.mjs → tests/audit-formal-sensitivity.mjs} +342 -342
- package/{audit-installer-compat.test.mjs → tests/audit-installer-compat.test.mjs} +136 -136
- package/tests/audit-installer-policy.test.mjs +245 -0
- package/{audit-persona-sensitivity.mjs → tests/audit-persona-sensitivity.mjs} +249 -249
- package/{audit-persona-surface.test.mjs → tests/audit-persona-surface.test.mjs} +349 -349
- package/{audit-prompt-invariants.mjs → tests/audit-prompt-invariants.mjs} +508 -508
- package/{audit-spec-traceability.mjs → tests/audit-spec-traceability.mjs} +193 -193
- package/{audit-v5-integrity.mjs → tests/audit-v5-integrity.mjs} +448 -448
- package/{audit-v5-sensitivity.mjs → tests/audit-v5-sensitivity.mjs} +384 -384
- package/{e2e-v5-round2.test.mjs → tests/e2e-v5-round2.test.mjs} +521 -521
- package/{formal-verify-v2.test.mjs → tests/formal-verify-v2.test.mjs} +1315 -1315
- package/{formal-verify-v3.test.mjs → tests/formal-verify-v3.test.mjs} +1257 -1257
- package/{formal-verify-v4.test.mjs → tests/formal-verify-v4.test.mjs} +1082 -1082
- package/{formal-verify-v5.test.mjs → tests/formal-verify-v5.test.mjs} +708 -708
- package/{prompt-v5-integrity.test.mjs → tests/prompt-v5-integrity.test.mjs} +3 -3
- package/{run-tests.mjs → tests/run-tests.mjs} +121 -118
- package/{selfdrive-v5.mjs → tests/selfdrive-v5.mjs} +470 -470
- package/vibe-math-v4//345/256/236/347/216/260/346/226/271/346/241/210.md +1 -1
- package/vibe-math-v5//345/256/236/347/216/260/346/226/271/346/241/210.md +1 -1
- package/vibe-math-v5//346/236/266/346/236/204/345/233/276.md +1 -1
- /package/{RELEASE-NOTES-2.0.22.md → docs/release-notes/RELEASE-NOTES-2.0.22.md} +0 -0
|
@@ -1,115 +1,115 @@
|
|
|
1
|
-
# dsh-vibe-math 2.3.3 — 确认轮审计:`used` 回执曾撤销已成立的证明(v2)+ 契约字面纠错 + 守卫自身加固
|
|
2
|
-
|
|
3
|
-
> 上一版:2.3.2。本版是 2.3.2 之后的**确认轮**(round 3)结果:重新审计本轮改动过的每一处
|
|
4
|
-
> (四套插件、四套套件、共享契约、审计脚本自身),又抓到一处**真实缺陷**、一处**契约与实现字面
|
|
5
|
-
> 相反**、以及一处**守卫自身的脆弱点**。无破坏性变更,默认仍为 `formalVerify: 'off'`。
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## 1. 真实缺陷:一次 `used` 回执会**撤销已成立的证明**(只有 v2)
|
|
10
|
-
|
|
11
|
-
`formal.decision='used'` 的语义是"这一轮碰了形式化 / 写了一份草稿"。契约 §4 里**只有 `defect`
|
|
12
|
-
能撤销证明**,因为撤销意味着审查对象从"忠实性"退回"推导是否正确"、`require` 档对一份**已经跑通的
|
|
13
|
-
归档证明重新关门**。
|
|
14
|
-
|
|
15
|
-
| 架构 | `used` 回执对已有 `passed`/`blocked` 的处理(修复前) |
|
|
16
|
-
|---|---|
|
|
17
|
-
| v3 / v4 / v5 | 保留 `passed`(v3 只保留 passed,`blocked` 会被打回 attempted——见 §2) |
|
|
18
|
-
| **v2** | **无条件写 `status:'attempted'`** —— 而降级发生在**两个 id 空间**上,`proof` 指针还留着,记录自相矛盾 |
|
|
19
|
-
|
|
20
|
-
后果链(实测):对象已 `passed` → 表决者回一句"我这轮又写了遍草稿" → 记录降级为 `attempted`、
|
|
21
|
-
`status.formal.objects` 里不再是 `passed` → 后续审查提示词**丢掉忠实性分支** → `require` 档对一份
|
|
22
|
-
跑通的证明**重新关门**、对象被丢进「形式化待办」。
|
|
23
|
-
|
|
24
|
-
> 这正是 2.3.2 修过的 v4 `formalSetRun` 缺陷的**同一类**("随手一次动作把 passed 抹掉"),
|
|
25
|
-
> 只是长在另一条路径(回执通道)上,而且**只长在一套里**——`AUDIT-CHECKLIST §1.8`(四套同构)
|
|
26
|
-
> 记的就是这种形态。
|
|
27
|
-
|
|
28
|
-
**修复**:v2 的 `used` 分支改为先看**两套 id 空间**的状态(对象侧自己的记录 + `formalGateRecord` 的合并
|
|
29
|
-
视图),取其中**最强**的一个(`passed` > `blocked` > `attempted`):只有两侧都还没尝试过才写 `attempted`,
|
|
30
|
-
否则保留原状态并在活动日志里说明保留了哪一个。四套现在**同构**(v3 另外补上 `blocked` 的保留,见 §2)。
|
|
31
|
-
|
|
32
|
-
## 2. 同一类的第二处:v3 的 `used` 只保留 `passed`,会把 `blocked` 打回 attempted
|
|
33
|
-
|
|
34
|
-
`blocked` 是**门禁已放行**的记录(契约 §4/§8)。v3 的条件写成 `prev.status === 'passed' ? 'passed' : 'attempted'`:
|
|
35
|
-
一个已经用"显式阻塞原因"打开门禁的对象,被一句 `used` 回执打回 `attempted`,门禁**重新关上**。
|
|
36
|
-
已改为 `passed`/`blocked` 都保留(与 v2/v4/v5 一致)。
|
|
37
|
-
|
|
38
|
-
## 3. 契约字面与实现相反(三处)
|
|
39
|
-
|
|
40
|
-
`docs/formal-verification.md` §4 的迁移表是四套的规范来源,但它有两行写错了(代码是对的):
|
|
41
|
-
|
|
42
|
-
| 行 | 原字面 | 现字面 |
|
|
43
|
-
|---|---|---|
|
|
44
|
-
| `formal:{decision:'used'}` | → `attempted` | → `attempted`;**若已是 `passed`/`blocked` 则保持原状**(撤销只有 `defect` 一条路) |
|
|
45
|
-
| `lean_run` 成功/失败 | → `attempted` | 同样**不降级**已成立的 `passed`/`blocked` |
|
|
46
|
-
| (新增)`lean_archive{kind:'proof'}` + **运行失败** | 未写 | → `attempted`、清空 `proof`、并**撤回**旧的归档证明(工作文件刚被覆盖,旧证明不再对应任何代码) |
|
|
47
|
-
|
|
48
|
-
四套的 `实现方案.md` 与 v5 规格里的对应句子同步改正。规范文档写反最危险的地方在于:**下一次修改是
|
|
49
|
-
照它写的**(2.3.2 修好 `used` 之后,如果只读契约就会把修复改回去)。
|
|
50
|
-
|
|
51
|
-
## 4. 守卫自身的脆弱点:注释扫描器不认正则字面量
|
|
52
|
-
|
|
53
|
-
`audit-prompt-invariants.mjs` 的 I1/I13/I14 都建立在"先把注释抹掉、再检查剩下的代码"之上。四个预设里
|
|
54
|
-
都有 `/[\\/:*?"<>|\u0000-\u001f]+/` —— **字符类里含一个双引号**。原扫描器把那个引号当成字符串开头,
|
|
55
|
-
此后整个文件的词法状态就是错的。实测差异:
|
|
56
|
-
|
|
57
|
-
| 预设 | 两种扫描器**逐行不同**的行数 | 典型后果 |
|
|
58
|
-
|---|---|---|
|
|
59
|
-
| v2 | 190 行 | 真实代码行(如 `const abs = …`)被当成注释**抹掉** → 真缺陷可能被漏看 |
|
|
60
|
-
| v3 | 159 行 | 同上 |
|
|
61
|
-
| v4 | 14 行 | 注释被当成代码 → 反模式写进注释就会**误报** |
|
|
62
|
-
| v5 | 121 行 | 同上 |
|
|
63
|
-
|
|
64
|
-
本轮给扫描器加了**正则字面量**支持(含字符类 `[...]`、转义、结尾 flags),并把"守卫的守卫"写成
|
|
65
|
-
**X5–X7 三条自检**(放进 `audit-prompt-invariants.mjs`,任何一次运行都会执行):正则里的引号不得吞掉
|
|
66
|
-
后面的注释、字符串里的 `//`(URL)不得被当成注释、转义斜杠不得提前结束正则,且三者都必须保持行结构。
|
|
67
|
-
实测修复前 X5 变红、修复后全绿。
|
|
68
|
-
|
|
69
|
-
## 5. 本轮新增的行为断言(四套同构,+42 条;另 +6 不变式 / +3 可追溯)
|
|
70
|
-
|
|
71
|
-
| 断言(四套各一份) | 说明 |
|
|
72
|
-
|---|---|
|
|
73
|
-
| `used` 回执**不得**降级已 `passed` 对象 | 记录与 `proof` 指针都保留;v2 修复前**实测变红**(`got attempted`),修复后全绿 |
|
|
74
|
-
| `used` 回执**不得**把 `blocked` 打回 `attempted`(门禁不得被重新关上) | v3 修复前变红 |
|
|
75
|
-
| 一次普通 `lean_run`(带 `target`)**不得**降级 `passed` | 此前只有 v4 套件有这条断言,现四套齐备 |
|
|
76
|
-
| `used` 之后 `require` 门禁**仍然放行** | v2:把该轮驱动到一致为真,断言**没有**产生 `formal-required` 待办 |
|
|
77
|
-
| 真实注册的 schema 必须仍是封闭的、且四个 Lean 参数齐全(2.3.2 的守卫) | 四套各 7 条 |
|
|
78
|
-
|
|
79
|
-
## 5.1 并行回归暴露的**测试脆弱性**(也一并修掉)
|
|
80
|
-
|
|
81
|
-
4 路并行回归第二次跑时 `e2e-v4-fixes` **崩了**(exit 1,只跑了 2 个用例就中止);单独跑 3 次全绿
|
|
82
|
-
(120/120)。形态:驱动循环"安静即停"在框架把卡片落盘**之前**退出 → `assert(existsSync(card))`
|
|
83
|
-
只记录失败**不抛** → 紧随其后的 `readFileSync(card)` 抛 `ENOENT` → **未捕获异常让整个套件中止,
|
|
84
|
-
后面 12 个用例的断言全部丢失**。
|
|
85
|
-
|
|
86
|
-
修法(两条一起):该套件新增 `readArtifact(p, ms=3000)`(先等产物、再防御性读),并把六处"断言后立刻
|
|
87
|
-
读产物"改成"先等产物 → 再断言 → 防御性读"。效果:慢机器上产物晚到 3 秒也能通过;真没写出来则是
|
|
88
|
-
**一条干净的断言失败**,不再吞掉后续用例。这条已写进 `AUDIT-CHECKLIST` §4(连同"发布元数据交给
|
|
89
|
-
序列化器、不要用字符串替换手写 `package.json`"——本轮就这么写出过一次非法 JSON)。
|
|
90
|
-
|
|
91
|
-
## 6. 验收(实测)
|
|
92
|
-
|
|
93
|
-
| 套件 / 脚本 | 2.3.2 | 2.3.3 |
|
|
94
|
-
|---|---|---|
|
|
95
|
-
| `formal-verify-v2.test.mjs` | 319 | **334** |
|
|
96
|
-
| `formal-verify-v3.test.mjs` | 283 | **294** |
|
|
97
|
-
| `formal-verify-v4.test.mjs` | 269 | **277** |
|
|
98
|
-
| `formal-verify-v5.test.mjs` | 145 | **153** |
|
|
99
|
-
| `audit-prompt-invariants.mjs` | 145 | **151**(+ X5–X7 扫描器自检及其行结构断言) |
|
|
100
|
-
| `audit-spec-traceability.mjs` | 91 | **94**(契约 §4 三行的字面校验) |
|
|
101
|
-
| `audit-prompt-invariants.mjs --self-probe` | 5/5 | **5/5** |
|
|
102
|
-
| `prompt-v5-integrity.test.mjs` | 506 | 506(语料字节稳定) |
|
|
103
|
-
| `audit-persona-surface.test.mjs` | 197 | 197 |
|
|
104
|
-
|
|
105
|
-
- 全量并行回归 23/23 全绿;49 条 formal 探针全红;四套语料(v2/v3/v4/v5 + persona)连续两次哈希一致;
|
|
106
|
-
- closing verification:**18/18 阶段通过**。
|
|
107
|
-
|
|
108
|
-
## 7. 升级
|
|
109
|
-
|
|
110
|
-
```
|
|
111
|
-
npm i dsh-vibe-math@latest
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
无迁移。新参数默认 `off`,四套在 `off` 档的行为与 2.3.2 完全一致;本版改动只影响
|
|
115
|
-
`formalVerify` 非 `off` 时的记账语义(且都是"少撤销、不误关门"方向)。
|
|
1
|
+
# dsh-vibe-math 2.3.3 — 确认轮审计:`used` 回执曾撤销已成立的证明(v2)+ 契约字面纠错 + 守卫自身加固
|
|
2
|
+
|
|
3
|
+
> 上一版:2.3.2。本版是 2.3.2 之后的**确认轮**(round 3)结果:重新审计本轮改动过的每一处
|
|
4
|
+
> (四套插件、四套套件、共享契约、审计脚本自身),又抓到一处**真实缺陷**、一处**契约与实现字面
|
|
5
|
+
> 相反**、以及一处**守卫自身的脆弱点**。无破坏性变更,默认仍为 `formalVerify: 'off'`。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. 真实缺陷:一次 `used` 回执会**撤销已成立的证明**(只有 v2)
|
|
10
|
+
|
|
11
|
+
`formal.decision='used'` 的语义是"这一轮碰了形式化 / 写了一份草稿"。契约 §4 里**只有 `defect`
|
|
12
|
+
能撤销证明**,因为撤销意味着审查对象从"忠实性"退回"推导是否正确"、`require` 档对一份**已经跑通的
|
|
13
|
+
归档证明重新关门**。
|
|
14
|
+
|
|
15
|
+
| 架构 | `used` 回执对已有 `passed`/`blocked` 的处理(修复前) |
|
|
16
|
+
|---|---|
|
|
17
|
+
| v3 / v4 / v5 | 保留 `passed`(v3 只保留 passed,`blocked` 会被打回 attempted——见 §2) |
|
|
18
|
+
| **v2** | **无条件写 `status:'attempted'`** —— 而降级发生在**两个 id 空间**上,`proof` 指针还留着,记录自相矛盾 |
|
|
19
|
+
|
|
20
|
+
后果链(实测):对象已 `passed` → 表决者回一句"我这轮又写了遍草稿" → 记录降级为 `attempted`、
|
|
21
|
+
`status.formal.objects` 里不再是 `passed` → 后续审查提示词**丢掉忠实性分支** → `require` 档对一份
|
|
22
|
+
跑通的证明**重新关门**、对象被丢进「形式化待办」。
|
|
23
|
+
|
|
24
|
+
> 这正是 2.3.2 修过的 v4 `formalSetRun` 缺陷的**同一类**("随手一次动作把 passed 抹掉"),
|
|
25
|
+
> 只是长在另一条路径(回执通道)上,而且**只长在一套里**——`AUDIT-CHECKLIST §1.8`(四套同构)
|
|
26
|
+
> 记的就是这种形态。
|
|
27
|
+
|
|
28
|
+
**修复**:v2 的 `used` 分支改为先看**两套 id 空间**的状态(对象侧自己的记录 + `formalGateRecord` 的合并
|
|
29
|
+
视图),取其中**最强**的一个(`passed` > `blocked` > `attempted`):只有两侧都还没尝试过才写 `attempted`,
|
|
30
|
+
否则保留原状态并在活动日志里说明保留了哪一个。四套现在**同构**(v3 另外补上 `blocked` 的保留,见 §2)。
|
|
31
|
+
|
|
32
|
+
## 2. 同一类的第二处:v3 的 `used` 只保留 `passed`,会把 `blocked` 打回 attempted
|
|
33
|
+
|
|
34
|
+
`blocked` 是**门禁已放行**的记录(契约 §4/§8)。v3 的条件写成 `prev.status === 'passed' ? 'passed' : 'attempted'`:
|
|
35
|
+
一个已经用"显式阻塞原因"打开门禁的对象,被一句 `used` 回执打回 `attempted`,门禁**重新关上**。
|
|
36
|
+
已改为 `passed`/`blocked` 都保留(与 v2/v4/v5 一致)。
|
|
37
|
+
|
|
38
|
+
## 3. 契约字面与实现相反(三处)
|
|
39
|
+
|
|
40
|
+
`docs/formal-verification.md` §4 的迁移表是四套的规范来源,但它有两行写错了(代码是对的):
|
|
41
|
+
|
|
42
|
+
| 行 | 原字面 | 现字面 |
|
|
43
|
+
|---|---|---|
|
|
44
|
+
| `formal:{decision:'used'}` | → `attempted` | → `attempted`;**若已是 `passed`/`blocked` 则保持原状**(撤销只有 `defect` 一条路) |
|
|
45
|
+
| `lean_run` 成功/失败 | → `attempted` | 同样**不降级**已成立的 `passed`/`blocked` |
|
|
46
|
+
| (新增)`lean_archive{kind:'proof'}` + **运行失败** | 未写 | → `attempted`、清空 `proof`、并**撤回**旧的归档证明(工作文件刚被覆盖,旧证明不再对应任何代码) |
|
|
47
|
+
|
|
48
|
+
四套的 `实现方案.md` 与 v5 规格里的对应句子同步改正。规范文档写反最危险的地方在于:**下一次修改是
|
|
49
|
+
照它写的**(2.3.2 修好 `used` 之后,如果只读契约就会把修复改回去)。
|
|
50
|
+
|
|
51
|
+
## 4. 守卫自身的脆弱点:注释扫描器不认正则字面量
|
|
52
|
+
|
|
53
|
+
`audit-prompt-invariants.mjs` 的 I1/I13/I14 都建立在"先把注释抹掉、再检查剩下的代码"之上。四个预设里
|
|
54
|
+
都有 `/[\\/:*?"<>|\u0000-\u001f]+/` —— **字符类里含一个双引号**。原扫描器把那个引号当成字符串开头,
|
|
55
|
+
此后整个文件的词法状态就是错的。实测差异:
|
|
56
|
+
|
|
57
|
+
| 预设 | 两种扫描器**逐行不同**的行数 | 典型后果 |
|
|
58
|
+
|---|---|---|
|
|
59
|
+
| v2 | 190 行 | 真实代码行(如 `const abs = …`)被当成注释**抹掉** → 真缺陷可能被漏看 |
|
|
60
|
+
| v3 | 159 行 | 同上 |
|
|
61
|
+
| v4 | 14 行 | 注释被当成代码 → 反模式写进注释就会**误报** |
|
|
62
|
+
| v5 | 121 行 | 同上 |
|
|
63
|
+
|
|
64
|
+
本轮给扫描器加了**正则字面量**支持(含字符类 `[...]`、转义、结尾 flags),并把"守卫的守卫"写成
|
|
65
|
+
**X5–X7 三条自检**(放进 `audit-prompt-invariants.mjs`,任何一次运行都会执行):正则里的引号不得吞掉
|
|
66
|
+
后面的注释、字符串里的 `//`(URL)不得被当成注释、转义斜杠不得提前结束正则,且三者都必须保持行结构。
|
|
67
|
+
实测修复前 X5 变红、修复后全绿。
|
|
68
|
+
|
|
69
|
+
## 5. 本轮新增的行为断言(四套同构,+42 条;另 +6 不变式 / +3 可追溯)
|
|
70
|
+
|
|
71
|
+
| 断言(四套各一份) | 说明 |
|
|
72
|
+
|---|---|
|
|
73
|
+
| `used` 回执**不得**降级已 `passed` 对象 | 记录与 `proof` 指针都保留;v2 修复前**实测变红**(`got attempted`),修复后全绿 |
|
|
74
|
+
| `used` 回执**不得**把 `blocked` 打回 `attempted`(门禁不得被重新关上) | v3 修复前变红 |
|
|
75
|
+
| 一次普通 `lean_run`(带 `target`)**不得**降级 `passed` | 此前只有 v4 套件有这条断言,现四套齐备 |
|
|
76
|
+
| `used` 之后 `require` 门禁**仍然放行** | v2:把该轮驱动到一致为真,断言**没有**产生 `formal-required` 待办 |
|
|
77
|
+
| 真实注册的 schema 必须仍是封闭的、且四个 Lean 参数齐全(2.3.2 的守卫) | 四套各 7 条 |
|
|
78
|
+
|
|
79
|
+
## 5.1 并行回归暴露的**测试脆弱性**(也一并修掉)
|
|
80
|
+
|
|
81
|
+
4 路并行回归第二次跑时 `e2e-v4-fixes` **崩了**(exit 1,只跑了 2 个用例就中止);单独跑 3 次全绿
|
|
82
|
+
(120/120)。形态:驱动循环"安静即停"在框架把卡片落盘**之前**退出 → `assert(existsSync(card))`
|
|
83
|
+
只记录失败**不抛** → 紧随其后的 `readFileSync(card)` 抛 `ENOENT` → **未捕获异常让整个套件中止,
|
|
84
|
+
后面 12 个用例的断言全部丢失**。
|
|
85
|
+
|
|
86
|
+
修法(两条一起):该套件新增 `readArtifact(p, ms=3000)`(先等产物、再防御性读),并把六处"断言后立刻
|
|
87
|
+
读产物"改成"先等产物 → 再断言 → 防御性读"。效果:慢机器上产物晚到 3 秒也能通过;真没写出来则是
|
|
88
|
+
**一条干净的断言失败**,不再吞掉后续用例。这条已写进 `AUDIT-CHECKLIST` §4(连同"发布元数据交给
|
|
89
|
+
序列化器、不要用字符串替换手写 `package.json`"——本轮就这么写出过一次非法 JSON)。
|
|
90
|
+
|
|
91
|
+
## 6. 验收(实测)
|
|
92
|
+
|
|
93
|
+
| 套件 / 脚本 | 2.3.2 | 2.3.3 |
|
|
94
|
+
|---|---|---|
|
|
95
|
+
| `formal-verify-v2.test.mjs` | 319 | **334** |
|
|
96
|
+
| `formal-verify-v3.test.mjs` | 283 | **294** |
|
|
97
|
+
| `formal-verify-v4.test.mjs` | 269 | **277** |
|
|
98
|
+
| `formal-verify-v5.test.mjs` | 145 | **153** |
|
|
99
|
+
| `audit-prompt-invariants.mjs` | 145 | **151**(+ X5–X7 扫描器自检及其行结构断言) |
|
|
100
|
+
| `audit-spec-traceability.mjs` | 91 | **94**(契约 §4 三行的字面校验) |
|
|
101
|
+
| `audit-prompt-invariants.mjs --self-probe` | 5/5 | **5/5** |
|
|
102
|
+
| `prompt-v5-integrity.test.mjs` | 506 | 506(语料字节稳定) |
|
|
103
|
+
| `audit-persona-surface.test.mjs` | 197 | 197 |
|
|
104
|
+
|
|
105
|
+
- 全量并行回归 23/23 全绿;49 条 formal 探针全红;四套语料(v2/v3/v4/v5 + persona)连续两次哈希一致;
|
|
106
|
+
- closing verification:**18/18 阶段通过**。
|
|
107
|
+
|
|
108
|
+
## 7. 升级
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
npm i dsh-vibe-math@latest
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
无迁移。新参数默认 `off`,四套在 `off` 档的行为与 2.3.2 完全一致;本版改动只影响
|
|
115
|
+
`formalVerify` 非 `off` 时的记账语义(且都是"少撤销、不误关门"方向)。
|
|
@@ -1,69 +1,69 @@
|
|
|
1
|
-
# dsh-vibe-math 2.3.4 — 审计守卫的最后一处盲区:正则字面量的**关键字规则** + 解析级扫描器判据
|
|
2
|
-
|
|
3
|
-
> 上一版:2.3.3。本版是 round 4:**只审"上一轮改动过的东西"**——2.3.3 修好的注释扫描器(它是
|
|
4
|
-
> I1/I13/I14 三条不变式的地基)与它新增的 X5–X7 自检。无破坏性变更,默认仍为 `formalVerify: 'off'`。
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## 1. 扫描器还剩一个盲区:`return /…/ ` 被当成除法
|
|
9
|
-
|
|
10
|
-
2.3.3 给扫描器加了正则字面量支持,但"这个 `/` 是正则还是除法"的判据**只看前一个字符**:
|
|
11
|
-
|
|
12
|
-
```js
|
|
13
|
-
if (c === '/' && /[(,=:[!&|?{};+\-*%~^<>]|^$/.test(prev)) → 正则
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
于是**关键字后面**的正则会被读成除法——而 v3 源码里真有这种写法:
|
|
17
|
-
|
|
18
|
-
| 位置 | 代码 |
|
|
19
|
-
|---|---|
|
|
20
|
-
| v3 L2813 | `return /^\s*import\s+/.test(l)` |
|
|
21
|
-
| v3 L2856 | `return /\n$/.test(out) ? out : out + '\n'` |
|
|
22
|
-
|
|
23
|
-
这两处恰好字符类里没有引号,所以**今天**还没坏;但只要有人在 `return /…/` 的正则里写一个引号
|
|
24
|
-
(例如 `return /["']/.test(s)`),扫描器就会把那个引号当成字符串开头,此后整个文件的词法状态都是错的
|
|
25
|
-
——**又回到 2.3.2 修掉的那个坑**(真代码被当注释抹掉 → 真缺陷可能被漏看;注释被当代码 → 误报)。
|
|
26
|
-
这是"守卫自己的守卫"里最后一块没盖住的地方。
|
|
27
|
-
|
|
28
|
-
**修复**:判据从"前一个字符"升级为"前一个**记号**":除运算符/开括号之外,`return` / `typeof` /
|
|
29
|
-
`case` / `delete` / `void` / `instanceof` / `in` / `of` / `yield` / `await` / `new` / `do` / `else`
|
|
30
|
-
之后也按正则解析;标识符、`)`、`]` 之后仍按除法。
|
|
31
|
-
|
|
32
|
-
## 2. 新增**解析级**判据 X8 / X8b(并实测其灵敏度)
|
|
33
|
-
|
|
34
|
-
静态自检(X5–X7)只覆盖我想到的构造;这一版加了一条**不依赖我列举**的强判据:
|
|
35
|
-
|
|
36
|
-
- **X8**:把四套源码各自"抹掉注释"之后,输出**必须仍能被 `node --check` 解析**。扫描器一旦把代码
|
|
37
|
-
读错(正则当除法、引号当字符串开头),产物往往直接语法错误。
|
|
38
|
-
- **X8b**:一个专门针对关键字规则的夹具(`return /["']/.test(l)` + 紧随其后的注释)。
|
|
39
|
-
|
|
40
|
-
灵敏度是**实测**的,不是假设的:
|
|
41
|
-
|
|
42
|
-
| 扫描器版本 | X8(四套源码可解析) | X8b 夹具 |
|
|
43
|
-
|---|---|---|
|
|
44
|
-
| 2.3.2(完全不认正则) | **四个预设全部 SyntaxError**(红) | 红 |
|
|
45
|
-
| 2.3.3(认正则、无关键字规则) | 绿(那两处 `return /…/ ` 里没有引号) | **红**:紧随其后的注释没被抹掉(`comment-blanked=false`) |
|
|
46
|
-
| 2.3.4(当前) | 绿 | 绿 |
|
|
47
|
-
|
|
48
|
-
——即:X8 守住大回退,X8b 守住这个窄口子;**2.3.3 的扫描器会被 X8b 判红**,说明这条判据不是摆设。
|
|
49
|
-
不变式 151 → **157**。
|
|
50
|
-
|
|
51
|
-
## 3. 验收(实测)
|
|
52
|
-
|
|
53
|
-
| 套件 / 脚本 | 2.3.3 | 2.3.4 |
|
|
54
|
-
|---|---|---|
|
|
55
|
-
| `audit-prompt-invariants.mjs` | 151 | **157**(+X8 ×4、+X8b ×2) |
|
|
56
|
-
| `audit-prompt-invariants.mjs --self-probe` | 5/5 | **5/5** |
|
|
57
|
-
| `audit-spec-traceability.mjs` | 94 | 94 |
|
|
58
|
-
| `formal-verify-v2/v3/v4/v5` | 334 / 294 / 277 / 153 | 不变(本版未动插件) |
|
|
59
|
-
| `prompt-v5-integrity.test.mjs` | 506 | 不变 |
|
|
60
|
-
| 全量并行回归 | 23/23 | **23/23** |
|
|
61
|
-
| 49 条 formal 探针 | 全红 | 全红 |
|
|
62
|
-
|
|
63
|
-
## 4. 升级
|
|
64
|
-
|
|
65
|
-
```
|
|
66
|
-
npm i dsh-vibe-math@latest
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
无迁移,无行为变更(本版只改随包发布的审计脚本与文档;四套预设的字节与 2.3.3 相同)。
|
|
1
|
+
# dsh-vibe-math 2.3.4 — 审计守卫的最后一处盲区:正则字面量的**关键字规则** + 解析级扫描器判据
|
|
2
|
+
|
|
3
|
+
> 上一版:2.3.3。本版是 round 4:**只审"上一轮改动过的东西"**——2.3.3 修好的注释扫描器(它是
|
|
4
|
+
> I1/I13/I14 三条不变式的地基)与它新增的 X5–X7 自检。无破坏性变更,默认仍为 `formalVerify: 'off'`。
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 1. 扫描器还剩一个盲区:`return /…/ ` 被当成除法
|
|
9
|
+
|
|
10
|
+
2.3.3 给扫描器加了正则字面量支持,但"这个 `/` 是正则还是除法"的判据**只看前一个字符**:
|
|
11
|
+
|
|
12
|
+
```js
|
|
13
|
+
if (c === '/' && /[(,=:[!&|?{};+\-*%~^<>]|^$/.test(prev)) → 正则
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
于是**关键字后面**的正则会被读成除法——而 v3 源码里真有这种写法:
|
|
17
|
+
|
|
18
|
+
| 位置 | 代码 |
|
|
19
|
+
|---|---|
|
|
20
|
+
| v3 L2813 | `return /^\s*import\s+/.test(l)` |
|
|
21
|
+
| v3 L2856 | `return /\n$/.test(out) ? out : out + '\n'` |
|
|
22
|
+
|
|
23
|
+
这两处恰好字符类里没有引号,所以**今天**还没坏;但只要有人在 `return /…/` 的正则里写一个引号
|
|
24
|
+
(例如 `return /["']/.test(s)`),扫描器就会把那个引号当成字符串开头,此后整个文件的词法状态都是错的
|
|
25
|
+
——**又回到 2.3.2 修掉的那个坑**(真代码被当注释抹掉 → 真缺陷可能被漏看;注释被当代码 → 误报)。
|
|
26
|
+
这是"守卫自己的守卫"里最后一块没盖住的地方。
|
|
27
|
+
|
|
28
|
+
**修复**:判据从"前一个字符"升级为"前一个**记号**":除运算符/开括号之外,`return` / `typeof` /
|
|
29
|
+
`case` / `delete` / `void` / `instanceof` / `in` / `of` / `yield` / `await` / `new` / `do` / `else`
|
|
30
|
+
之后也按正则解析;标识符、`)`、`]` 之后仍按除法。
|
|
31
|
+
|
|
32
|
+
## 2. 新增**解析级**判据 X8 / X8b(并实测其灵敏度)
|
|
33
|
+
|
|
34
|
+
静态自检(X5–X7)只覆盖我想到的构造;这一版加了一条**不依赖我列举**的强判据:
|
|
35
|
+
|
|
36
|
+
- **X8**:把四套源码各自"抹掉注释"之后,输出**必须仍能被 `node --check` 解析**。扫描器一旦把代码
|
|
37
|
+
读错(正则当除法、引号当字符串开头),产物往往直接语法错误。
|
|
38
|
+
- **X8b**:一个专门针对关键字规则的夹具(`return /["']/.test(l)` + 紧随其后的注释)。
|
|
39
|
+
|
|
40
|
+
灵敏度是**实测**的,不是假设的:
|
|
41
|
+
|
|
42
|
+
| 扫描器版本 | X8(四套源码可解析) | X8b 夹具 |
|
|
43
|
+
|---|---|---|
|
|
44
|
+
| 2.3.2(完全不认正则) | **四个预设全部 SyntaxError**(红) | 红 |
|
|
45
|
+
| 2.3.3(认正则、无关键字规则) | 绿(那两处 `return /…/ ` 里没有引号) | **红**:紧随其后的注释没被抹掉(`comment-blanked=false`) |
|
|
46
|
+
| 2.3.4(当前) | 绿 | 绿 |
|
|
47
|
+
|
|
48
|
+
——即:X8 守住大回退,X8b 守住这个窄口子;**2.3.3 的扫描器会被 X8b 判红**,说明这条判据不是摆设。
|
|
49
|
+
不变式 151 → **157**。
|
|
50
|
+
|
|
51
|
+
## 3. 验收(实测)
|
|
52
|
+
|
|
53
|
+
| 套件 / 脚本 | 2.3.3 | 2.3.4 |
|
|
54
|
+
|---|---|---|
|
|
55
|
+
| `audit-prompt-invariants.mjs` | 151 | **157**(+X8 ×4、+X8b ×2) |
|
|
56
|
+
| `audit-prompt-invariants.mjs --self-probe` | 5/5 | **5/5** |
|
|
57
|
+
| `audit-spec-traceability.mjs` | 94 | 94 |
|
|
58
|
+
| `formal-verify-v2/v3/v4/v5` | 334 / 294 / 277 / 153 | 不变(本版未动插件) |
|
|
59
|
+
| `prompt-v5-integrity.test.mjs` | 506 | 不变 |
|
|
60
|
+
| 全量并行回归 | 23/23 | **23/23** |
|
|
61
|
+
| 49 条 formal 探针 | 全红 | 全红 |
|
|
62
|
+
|
|
63
|
+
## 4. 升级
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
npm i dsh-vibe-math@latest
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
无迁移,无行为变更(本版只改随包发布的审计脚本与文档;四套预设的字节与 2.3.3 相同)。
|
|
@@ -1,63 +1,63 @@
|
|
|
1
|
-
# dsh-vibe-math 2.3.5 — 同一类扫描器缺陷也在 `audit-v5-integrity.mjs` 里(潜在盲区)+ 解析级自检
|
|
2
|
-
|
|
3
|
-
> 上一版:2.3.4。本版是 round 5:把"注释/字符串扫描器"这一类**追到所有自带扫描器的脚本**上。
|
|
4
|
-
> 无破坏性变更,默认仍为 `formalVerify: 'off'`,四套预设字节未变。
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## 1. 同一类的第二处:v5 完整性审计的扫描器
|
|
9
|
-
|
|
10
|
-
`audit-v5-integrity.mjs`(静态自检:调用了但未定义的函数 / 未声明的 `params.X` 读取 / 会话 API 上
|
|
11
|
-
不存在的方法 / 遗留开发标记)在扫描前会先把注释与字符串抹掉——而它的 `stripNoise()` **完全不认正则
|
|
12
|
-
字面量**,v5 源码里恰好有一个字符类带双引号的 sanitize 正则:
|
|
13
|
-
|
|
14
|
-
```js
|
|
15
|
-
.replace(/[\\/:*?"<>|\u0000-\u001f]+/g, '-')
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
那个 `"` 被当成字符串开头。**实测**(旧 vs 新逐行比对,v5 共 4365 行):
|
|
19
|
-
|
|
20
|
-
| 指标 | 旧扫描器 | 新扫描器 |
|
|
21
|
-
|---|---|---|
|
|
22
|
-
| 与正确扫描结果不一致的行 | **30 行**(都是含"字符类里有引号"的正则的行) | 0 |
|
|
23
|
-
| 抹除后的文本能否 `node --check` 解析 | **不能**(SyntaxError) | 能 |
|
|
24
|
-
| 漏掉的调用名 / `params.*` 读取 / `s.*()` 方法 | **本次为 0**(该行其余标识符仍在文本里) | — |
|
|
25
|
-
|
|
26
|
-
也就是说:**这是潜在盲区而非已发生的漏检**——只要某个被检查的调用/参数读取**恰好只出现在这种行上**,
|
|
27
|
-
它就会完全隐形。审计脚本自己都"读不对文件"是比漏一条规则更根本的问题。
|
|
28
|
-
|
|
29
|
-
**修复**:`stripNoise()` 升级为与 `audit-prompt-invariants.mjs` 同一套词法处理(正则字面量 + 字符类 +
|
|
30
|
-
转义 + flags + **关键字规则**),正则与字符串统一替换为值占位符。
|
|
31
|
-
|
|
32
|
-
> **我自己也在这条上翻过一次车**:第一版测量用"文件里下一个引号"估算被吞掉的区域,得出"402 行 /
|
|
33
|
-
> 18 KB / 20 个函数"的结论;但那台扫描器**遇到换行就结束字符串**,真实影响只有 30 行。发布前用
|
|
34
|
-
> 逐行比对复核才发现,代码注释与下面的记录都已按实测改正。(教训:**先量准,再下结论**。)
|
|
35
|
-
|
|
36
|
-
## 2. 新增解析级自检(并实测其灵敏度)
|
|
37
|
-
|
|
38
|
-
`audit-v5-integrity.mjs` 现在每次都自检它脚下的扫描器:
|
|
39
|
-
|
|
40
|
-
1. 抹除后的 v5 源码**必须仍能被 `node --check` 解析**;
|
|
41
|
-
2. 一个"引号在字符类里的正则 + 紧随其后的注释"夹具必须完好(引号不得吞掉注释、必须留下值占位符)。
|
|
42
|
-
|
|
43
|
-
**灵敏度实测**:把旧的 `stripNoise()` 放回去,审计立刻报
|
|
44
|
-
`stripNoise() corrupted the source it scans … every identifier check below is unreliable`(exit 1),
|
|
45
|
-
换回新版则 clean。39 条 v5 灵敏度探针仍然全红(0 盲点)。
|
|
46
|
-
|
|
47
|
-
## 3. 验收(实测)
|
|
48
|
-
|
|
49
|
-
| 项 | 2.3.4 | 2.3.5 |
|
|
50
|
-
|---|---|---|
|
|
51
|
-
| `audit-v5-integrity.mjs` | clean(但扫描器会读错 30 行) | **clean + `scanner self-check: stripped output parses=true; quoted-class fixture=true`** |
|
|
52
|
-
| `audit-v5-sensitivity.mjs` | 39/39 全红 | 39/39 全红 |
|
|
53
|
-
| `audit-prompt-invariants.mjs` | 157 | 157 |
|
|
54
|
-
| 四套 formal 套件 | 334 / 294 / 277 / 153 | 不变(本版未动插件) |
|
|
55
|
-
| 全量并行回归 | 23/23 | 23/23 |
|
|
56
|
-
|
|
57
|
-
## 4. 升级
|
|
58
|
-
|
|
59
|
-
```
|
|
60
|
-
npm i dsh-vibe-math@latest
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
无迁移、无行为变更(本版只改随包发布的审计脚本与文档)。
|
|
1
|
+
# dsh-vibe-math 2.3.5 — 同一类扫描器缺陷也在 `audit-v5-integrity.mjs` 里(潜在盲区)+ 解析级自检
|
|
2
|
+
|
|
3
|
+
> 上一版:2.3.4。本版是 round 5:把"注释/字符串扫描器"这一类**追到所有自带扫描器的脚本**上。
|
|
4
|
+
> 无破坏性变更,默认仍为 `formalVerify: 'off'`,四套预设字节未变。
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 1. 同一类的第二处:v5 完整性审计的扫描器
|
|
9
|
+
|
|
10
|
+
`audit-v5-integrity.mjs`(静态自检:调用了但未定义的函数 / 未声明的 `params.X` 读取 / 会话 API 上
|
|
11
|
+
不存在的方法 / 遗留开发标记)在扫描前会先把注释与字符串抹掉——而它的 `stripNoise()` **完全不认正则
|
|
12
|
+
字面量**,v5 源码里恰好有一个字符类带双引号的 sanitize 正则:
|
|
13
|
+
|
|
14
|
+
```js
|
|
15
|
+
.replace(/[\\/:*?"<>|\u0000-\u001f]+/g, '-')
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
那个 `"` 被当成字符串开头。**实测**(旧 vs 新逐行比对,v5 共 4365 行):
|
|
19
|
+
|
|
20
|
+
| 指标 | 旧扫描器 | 新扫描器 |
|
|
21
|
+
|---|---|---|
|
|
22
|
+
| 与正确扫描结果不一致的行 | **30 行**(都是含"字符类里有引号"的正则的行) | 0 |
|
|
23
|
+
| 抹除后的文本能否 `node --check` 解析 | **不能**(SyntaxError) | 能 |
|
|
24
|
+
| 漏掉的调用名 / `params.*` 读取 / `s.*()` 方法 | **本次为 0**(该行其余标识符仍在文本里) | — |
|
|
25
|
+
|
|
26
|
+
也就是说:**这是潜在盲区而非已发生的漏检**——只要某个被检查的调用/参数读取**恰好只出现在这种行上**,
|
|
27
|
+
它就会完全隐形。审计脚本自己都"读不对文件"是比漏一条规则更根本的问题。
|
|
28
|
+
|
|
29
|
+
**修复**:`stripNoise()` 升级为与 `audit-prompt-invariants.mjs` 同一套词法处理(正则字面量 + 字符类 +
|
|
30
|
+
转义 + flags + **关键字规则**),正则与字符串统一替换为值占位符。
|
|
31
|
+
|
|
32
|
+
> **我自己也在这条上翻过一次车**:第一版测量用"文件里下一个引号"估算被吞掉的区域,得出"402 行 /
|
|
33
|
+
> 18 KB / 20 个函数"的结论;但那台扫描器**遇到换行就结束字符串**,真实影响只有 30 行。发布前用
|
|
34
|
+
> 逐行比对复核才发现,代码注释与下面的记录都已按实测改正。(教训:**先量准,再下结论**。)
|
|
35
|
+
|
|
36
|
+
## 2. 新增解析级自检(并实测其灵敏度)
|
|
37
|
+
|
|
38
|
+
`audit-v5-integrity.mjs` 现在每次都自检它脚下的扫描器:
|
|
39
|
+
|
|
40
|
+
1. 抹除后的 v5 源码**必须仍能被 `node --check` 解析**;
|
|
41
|
+
2. 一个"引号在字符类里的正则 + 紧随其后的注释"夹具必须完好(引号不得吞掉注释、必须留下值占位符)。
|
|
42
|
+
|
|
43
|
+
**灵敏度实测**:把旧的 `stripNoise()` 放回去,审计立刻报
|
|
44
|
+
`stripNoise() corrupted the source it scans … every identifier check below is unreliable`(exit 1),
|
|
45
|
+
换回新版则 clean。39 条 v5 灵敏度探针仍然全红(0 盲点)。
|
|
46
|
+
|
|
47
|
+
## 3. 验收(实测)
|
|
48
|
+
|
|
49
|
+
| 项 | 2.3.4 | 2.3.5 |
|
|
50
|
+
|---|---|---|
|
|
51
|
+
| `audit-v5-integrity.mjs` | clean(但扫描器会读错 30 行) | **clean + `scanner self-check: stripped output parses=true; quoted-class fixture=true`** |
|
|
52
|
+
| `audit-v5-sensitivity.mjs` | 39/39 全红 | 39/39 全红 |
|
|
53
|
+
| `audit-prompt-invariants.mjs` | 157 | 157 |
|
|
54
|
+
| 四套 formal 套件 | 334 / 294 / 277 / 153 | 不变(本版未动插件) |
|
|
55
|
+
| 全量并行回归 | 23/23 | 23/23 |
|
|
56
|
+
|
|
57
|
+
## 4. 升级
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
npm i dsh-vibe-math@latest
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
无迁移、无行为变更(本版只改随包发布的审计脚本与文档)。
|
|
@@ -1,66 +1,66 @@
|
|
|
1
|
-
# dsh-vibe-math 2.3.6 — v2 的 id 解析歧义:一句 `defect` 会撤回**另一个对象**的证明
|
|
2
|
-
|
|
3
|
-
> 上一版:2.3.5。本版修的是 2.3.2 审计里记录为"存疑、需契约决策"的那条 —— round 7 把它做成可复现的
|
|
4
|
-
> 用例后确认:**不是理论问题,是真实可达的数据破坏**。无破坏性变更,默认仍为 `formalVerify: 'off'`。
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## 1. 缺陷:`formalObjectIdOf` 无条件剥离 `-sN` / `-pfN` / `-rfN` 后缀
|
|
9
|
-
|
|
10
|
-
v2 有两套 id:归档/索引/卡片用**对象 id**(`pAmb`),验证记录以 **rId**(`r-pAmb`、`r-q1-s0`、
|
|
11
|
-
`r-pAmb-pf1`)为键。二者靠**唯一一处**映射 `formalObjectIdOf` 互相转换:
|
|
12
|
-
|
|
13
|
-
```js
|
|
14
|
-
const m = /^r-(.+?)(?:-(?:s\d+|pf\d+|rf\d+))?$/.exec(t) // ← 无条件剥离后缀
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
问题在于**对象 id 本身就可能以 `-s1` 结尾**:命题 `pAmb-s1` 的验证 id 是 `r-pAmb-s1`,映射结果是
|
|
18
|
-
`pAmb` —— **另一个对象**。后果不是"少一条记录",而是**张冠李戴**。先用断言复现(修前 6 条红):
|
|
19
|
-
|
|
20
|
-
| 现象(修前) | 说明 |
|
|
21
|
-
|---|---|
|
|
22
|
-
| 忠实性提示词打印 `Verified/Lean/pAmb.lean` | 把**邻居的证明路径**给表决者看,而那证明属于另一个命题 |
|
|
23
|
-
| `formal:{target:'r-pAmb-s1', decision:'defect'}` 把 `pAmb` 降级为 `attempted` | 缺陷记到了邻居头上 |
|
|
24
|
-
| **`Verified/Lean/pAmb.lean` 被撤回** | 一句关于 A 的回执**删掉了 B 的归档证明**(不可逆) |
|
|
25
|
-
| `pAmb-s1` 仍然是 `passed`,TODO 里没有它 | 真正有问题的对象毫发无损 |
|
|
26
|
-
|
|
27
|
-
## 2. 修复:按**权威度**取来源,而不是猜后缀
|
|
28
|
-
|
|
29
|
-
新的 `formalObjectIdOf` 依次尝试:
|
|
30
|
-
|
|
31
|
-
1. **验证任务自己的所有者** —— `tasks['verify:'+rId].r.pId | r.qid`:框架生成 rId 时就知道对象是谁;
|
|
32
|
-
2. **记录里的 `objectId`** —— 由 `syncVerificationTarget` 与 `putFormalBothIds` 在**手里确实有对象 id**
|
|
33
|
-
时写入(这两个函数本来就是被"对象 id"调用的),因此**跨 resume**、任务表尚未重建时也正确;
|
|
34
|
-
3. 只有两者都不可用时,才回退到字符串后缀解析(保留对历史/野生 rId 的兼容)。
|
|
35
|
-
|
|
36
|
-
v3/v4/v5 **不受影响**:它们没有第二套 id 空间,验证直接以对象 id 为键(已核对:`formalId` / `formalOf`
|
|
37
|
-
只做 `idSafe`,不做后缀解析)。
|
|
38
|
-
|
|
39
|
-
## 3. 新增断言(`formal-verify-v2.test.mjs` 第 14c 节,+14 条)
|
|
40
|
-
|
|
41
|
-
- 两个对象 `pAmb`(无后缀)与 `pAmb-s1`(id 本身以 `-s1` 结尾)各有自己的通过证明;
|
|
42
|
-
- 对 `r-pAmb-s1` 的**忠实性提示词必须指向 `pAmb-s1` 自己的证明**(不是邻居的);
|
|
43
|
-
- 一句 `defect` 必须降级 `pAmb-s1`、撤回**它自己**的证明、TODO 里写它;
|
|
44
|
-
- 邻居 `pAmb` 必须仍是 `passed`、**它的归档证明文件必须分毫未动**;
|
|
45
|
-
- 验证记录里必须写着权威所有者 `objectId: 'pAmb-s1'`,邻居记录不得有伪造的所有者标记。
|
|
46
|
-
|
|
47
|
-
修前实测:**6 条断言变红**(含"邻居的证明被撤回");修后 348/0 全绿。
|
|
48
|
-
|
|
49
|
-
## 4. 验收(实测)
|
|
50
|
-
|
|
51
|
-
| 项 | 2.3.5 | 2.3.6 |
|
|
52
|
-
|---|---|---|
|
|
53
|
-
| `formal-verify-v2.test.mjs` | 334 | **348** |
|
|
54
|
-
| 全量并行回归 | 23/23 | 23/23 |
|
|
55
|
-
| 49 条 formal 探针 | 全红 | 全红 |
|
|
56
|
-
| 四套语料确定性 | 字节稳定 | 字节稳定 |
|
|
57
|
-
| closing verification | 18/18 | 18/18 |
|
|
58
|
-
|
|
59
|
-
## 5. 升级
|
|
60
|
-
|
|
61
|
-
```
|
|
62
|
-
npm i dsh-vibe-math@latest
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
无迁移。本版只改 v2 的 id 解析(多两级权威来源)与 v2 规格/断言;`off` 档行为不变,
|
|
66
|
-
其余三套预设与上一版逐字节相同。
|
|
1
|
+
# dsh-vibe-math 2.3.6 — v2 的 id 解析歧义:一句 `defect` 会撤回**另一个对象**的证明
|
|
2
|
+
|
|
3
|
+
> 上一版:2.3.5。本版修的是 2.3.2 审计里记录为"存疑、需契约决策"的那条 —— round 7 把它做成可复现的
|
|
4
|
+
> 用例后确认:**不是理论问题,是真实可达的数据破坏**。无破坏性变更,默认仍为 `formalVerify: 'off'`。
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 1. 缺陷:`formalObjectIdOf` 无条件剥离 `-sN` / `-pfN` / `-rfN` 后缀
|
|
9
|
+
|
|
10
|
+
v2 有两套 id:归档/索引/卡片用**对象 id**(`pAmb`),验证记录以 **rId**(`r-pAmb`、`r-q1-s0`、
|
|
11
|
+
`r-pAmb-pf1`)为键。二者靠**唯一一处**映射 `formalObjectIdOf` 互相转换:
|
|
12
|
+
|
|
13
|
+
```js
|
|
14
|
+
const m = /^r-(.+?)(?:-(?:s\d+|pf\d+|rf\d+))?$/.exec(t) // ← 无条件剥离后缀
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
问题在于**对象 id 本身就可能以 `-s1` 结尾**:命题 `pAmb-s1` 的验证 id 是 `r-pAmb-s1`,映射结果是
|
|
18
|
+
`pAmb` —— **另一个对象**。后果不是"少一条记录",而是**张冠李戴**。先用断言复现(修前 6 条红):
|
|
19
|
+
|
|
20
|
+
| 现象(修前) | 说明 |
|
|
21
|
+
|---|---|
|
|
22
|
+
| 忠实性提示词打印 `Verified/Lean/pAmb.lean` | 把**邻居的证明路径**给表决者看,而那证明属于另一个命题 |
|
|
23
|
+
| `formal:{target:'r-pAmb-s1', decision:'defect'}` 把 `pAmb` 降级为 `attempted` | 缺陷记到了邻居头上 |
|
|
24
|
+
| **`Verified/Lean/pAmb.lean` 被撤回** | 一句关于 A 的回执**删掉了 B 的归档证明**(不可逆) |
|
|
25
|
+
| `pAmb-s1` 仍然是 `passed`,TODO 里没有它 | 真正有问题的对象毫发无损 |
|
|
26
|
+
|
|
27
|
+
## 2. 修复:按**权威度**取来源,而不是猜后缀
|
|
28
|
+
|
|
29
|
+
新的 `formalObjectIdOf` 依次尝试:
|
|
30
|
+
|
|
31
|
+
1. **验证任务自己的所有者** —— `tasks['verify:'+rId].r.pId | r.qid`:框架生成 rId 时就知道对象是谁;
|
|
32
|
+
2. **记录里的 `objectId`** —— 由 `syncVerificationTarget` 与 `putFormalBothIds` 在**手里确实有对象 id**
|
|
33
|
+
时写入(这两个函数本来就是被"对象 id"调用的),因此**跨 resume**、任务表尚未重建时也正确;
|
|
34
|
+
3. 只有两者都不可用时,才回退到字符串后缀解析(保留对历史/野生 rId 的兼容)。
|
|
35
|
+
|
|
36
|
+
v3/v4/v5 **不受影响**:它们没有第二套 id 空间,验证直接以对象 id 为键(已核对:`formalId` / `formalOf`
|
|
37
|
+
只做 `idSafe`,不做后缀解析)。
|
|
38
|
+
|
|
39
|
+
## 3. 新增断言(`formal-verify-v2.test.mjs` 第 14c 节,+14 条)
|
|
40
|
+
|
|
41
|
+
- 两个对象 `pAmb`(无后缀)与 `pAmb-s1`(id 本身以 `-s1` 结尾)各有自己的通过证明;
|
|
42
|
+
- 对 `r-pAmb-s1` 的**忠实性提示词必须指向 `pAmb-s1` 自己的证明**(不是邻居的);
|
|
43
|
+
- 一句 `defect` 必须降级 `pAmb-s1`、撤回**它自己**的证明、TODO 里写它;
|
|
44
|
+
- 邻居 `pAmb` 必须仍是 `passed`、**它的归档证明文件必须分毫未动**;
|
|
45
|
+
- 验证记录里必须写着权威所有者 `objectId: 'pAmb-s1'`,邻居记录不得有伪造的所有者标记。
|
|
46
|
+
|
|
47
|
+
修前实测:**6 条断言变红**(含"邻居的证明被撤回");修后 348/0 全绿。
|
|
48
|
+
|
|
49
|
+
## 4. 验收(实测)
|
|
50
|
+
|
|
51
|
+
| 项 | 2.3.5 | 2.3.6 |
|
|
52
|
+
|---|---|---|
|
|
53
|
+
| `formal-verify-v2.test.mjs` | 334 | **348** |
|
|
54
|
+
| 全量并行回归 | 23/23 | 23/23 |
|
|
55
|
+
| 49 条 formal 探针 | 全红 | 全红 |
|
|
56
|
+
| 四套语料确定性 | 字节稳定 | 字节稳定 |
|
|
57
|
+
| closing verification | 18/18 | 18/18 |
|
|
58
|
+
|
|
59
|
+
## 5. 升级
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
npm i dsh-vibe-math@latest
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
无迁移。本版只改 v2 的 id 解析(多两级权威来源)与 v2 规格/断言;`off` 档行为不变,
|
|
66
|
+
其余三套预设与上一版逐字节相同。
|