dsh-vibe-math 2.3.12 → 2.3.14

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 (49) hide show
  1. package/README.md +17 -13
  2. package/cordis.patch.yml +1 -1
  3. package/{AUDIT-CHECKLIST.md → docs/AUDIT-CHECKLIST.md} +323 -304
  4. package/docs/COMPAT-AUDIT-ROUND2.md +325 -0
  5. package/docs/generate_framework_diagram_v2.py +114 -0
  6. package/docs/generate_framework_diagram_v3.py +127 -0
  7. package/{RELEASE-NOTES-2.1.0.md → docs/release-notes/RELEASE-NOTES-2.1.0.md} +143 -143
  8. package/{RELEASE-NOTES-2.2.0.md → docs/release-notes/RELEASE-NOTES-2.2.0.md} +266 -266
  9. package/{RELEASE-NOTES-2.2.1.md → docs/release-notes/RELEASE-NOTES-2.2.1.md} +43 -43
  10. package/{RELEASE-NOTES-2.2.2.md → docs/release-notes/RELEASE-NOTES-2.2.2.md} +88 -88
  11. package/{RELEASE-NOTES-2.3.0.md → docs/release-notes/RELEASE-NOTES-2.3.0.md} +207 -207
  12. package/{RELEASE-NOTES-2.3.1.md → docs/release-notes/RELEASE-NOTES-2.3.1.md} +134 -134
  13. package/{RELEASE-NOTES-2.3.10.md → docs/release-notes/RELEASE-NOTES-2.3.10.md} +105 -105
  14. package/{RELEASE-NOTES-2.3.11.md → docs/release-notes/RELEASE-NOTES-2.3.11.md} +57 -57
  15. package/{RELEASE-NOTES-2.3.12.md → docs/release-notes/RELEASE-NOTES-2.3.12.md} +80 -80
  16. package/docs/release-notes/RELEASE-NOTES-2.3.13.md +137 -0
  17. package/docs/release-notes/RELEASE-NOTES-2.3.14.md +83 -0
  18. package/{RELEASE-NOTES-2.3.2.md → docs/release-notes/RELEASE-NOTES-2.3.2.md} +145 -145
  19. package/{RELEASE-NOTES-2.3.3.md → docs/release-notes/RELEASE-NOTES-2.3.3.md} +115 -115
  20. package/{RELEASE-NOTES-2.3.4.md → docs/release-notes/RELEASE-NOTES-2.3.4.md} +69 -69
  21. package/{RELEASE-NOTES-2.3.5.md → docs/release-notes/RELEASE-NOTES-2.3.5.md} +63 -63
  22. package/{RELEASE-NOTES-2.3.6.md → docs/release-notes/RELEASE-NOTES-2.3.6.md} +66 -66
  23. package/{RELEASE-NOTES-2.3.7.md → docs/release-notes/RELEASE-NOTES-2.3.7.md} +59 -59
  24. package/{RELEASE-NOTES-2.3.8.md → docs/release-notes/RELEASE-NOTES-2.3.8.md} +45 -45
  25. package/{RELEASE-NOTES-2.3.9.md → docs/release-notes/RELEASE-NOTES-2.3.9.md} +70 -70
  26. package/docs/test-timing.md +19 -18
  27. package/installer.js +115 -41
  28. package/package.json +43 -37
  29. package/{audit-formal-sensitivity.mjs → tests/audit-formal-sensitivity.mjs} +342 -342
  30. package/{audit-installer-compat.test.mjs → tests/audit-installer-compat.test.mjs} +136 -136
  31. package/tests/audit-installer-policy.test.mjs +261 -0
  32. package/{audit-persona-sensitivity.mjs → tests/audit-persona-sensitivity.mjs} +249 -249
  33. package/{audit-persona-surface.test.mjs → tests/audit-persona-surface.test.mjs} +349 -349
  34. package/{audit-prompt-invariants.mjs → tests/audit-prompt-invariants.mjs} +508 -508
  35. package/{audit-spec-traceability.mjs → tests/audit-spec-traceability.mjs} +193 -193
  36. package/{audit-v5-integrity.mjs → tests/audit-v5-integrity.mjs} +448 -448
  37. package/{audit-v5-sensitivity.mjs → tests/audit-v5-sensitivity.mjs} +384 -384
  38. package/{e2e-v5-round2.test.mjs → tests/e2e-v5-round2.test.mjs} +521 -521
  39. package/{formal-verify-v2.test.mjs → tests/formal-verify-v2.test.mjs} +1315 -1315
  40. package/{formal-verify-v3.test.mjs → tests/formal-verify-v3.test.mjs} +1257 -1257
  41. package/{formal-verify-v4.test.mjs → tests/formal-verify-v4.test.mjs} +1082 -1082
  42. package/{formal-verify-v5.test.mjs → tests/formal-verify-v5.test.mjs} +708 -708
  43. package/{prompt-v5-integrity.test.mjs → tests/prompt-v5-integrity.test.mjs} +3 -3
  44. package/{run-tests.mjs → tests/run-tests.mjs} +121 -118
  45. package/{selfdrive-v5.mjs → tests/selfdrive-v5.mjs} +470 -470
  46. package/vibe-math-v4//345/256/236/347/216/260/346/226/271/346/241/210.md +1 -1
  47. package/vibe-math-v5//345/256/236/347/216/260/346/226/271/346/241/210.md +1 -1
  48. package/vibe-math-v5//346/236/266/346/236/204/345/233/276.md +1 -1
  49. /package/{RELEASE-NOTES-2.0.22.md → docs/release-notes/RELEASE-NOTES-2.0.22.md} +0 -0
@@ -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
+ 其余三套预设与上一版逐字节相同。
@@ -1,59 +1,59 @@
1
- # dsh-vibe-math 2.3.7 — 权威锚点必须自洽:手改过的状态文件不得劫持 id 映射
2
-
3
- > 上一版:2.3.6。本版是 round 8:把 2.3.6 新引入的"记录里持久化权威 `objectId`"这条机制**自己**审一遍。
4
- > 无破坏性变更,默认仍为 `formalVerify: 'off'`。
5
-
6
- ---
7
-
8
- ## 1. 2.3.6 引入的新机制里有一个可被污染的锚点
9
-
10
- 2.3.6 让 `formalObjectIdOf` 在任务表不可用时读记录里的 `objectId`(跨 resume 生效)。但**状态文件是
11
- 可编辑的**(`VibeMath_State/formal.json`,仓库里本来就有"文件被改坏也要能继续"的守卫测试):
12
-
13
- - 如果某条记录的 `objectId` 自己就是 **r 形**(`r-pX`),那么"验证 id → 对象 id"会映射到**它自己**;
14
- - 于是 `putFormalBothIds('r-pX', …)` 认为"两侧就是同一个 id",**只写验证侧**,对象侧仍然 `passed`
15
- —— 又回到"成对关系只做一半"的静默错位(门禁/卡片/提示词各读一侧)。
16
-
17
- **触发路径**(实测):**工作轮回执**(explorer/solver 的回执同样带 `formal` 字段)在**没有验证任务**
18
- 在内存里时走到"读记录锚点"这条兜底路径。以手改过的状态文件复现:修前该用例的断言变红
19
- (对象侧不降级),修后全绿。
20
-
21
- ## 2. 修法:锚点必须**自洽**才可用
22
-
23
- - `formalObjectIdOf` 读记录锚点时,要求 `formalObjectIdOfIsOwner(v)` 为真 —— 即该值**不以 `r-` 开头**、
24
- 不可能再被解析成别的 id;
25
- - 写入锚点的两处(`syncVerificationTarget`、`putFormalBothIds`)同样只在**确实是对象 id** 时写入,
26
- 不给未来留下污染源。
27
-
28
- > 说明(如实记录):写入侧的两道守卫**目前无法用用例证明其必要性**——现有写入者手里的值都来自
29
- > `formalObjectIdOf`,本身就不会是 r 形(我一度写了一个"归档写在 rId 上会污染锚点"的用例,实测发现它
30
- > **恒真**,已删除并换成下面这个真正敏感的用例)。因此这两道守卫按**纵深防御**保留并如此标注;
31
- > 真正被证明有效的是**读取侧**的守卫。
32
-
33
- ## 3. 新增断言(`formal-verify-v2.test.mjs` 第 14d 节,+5 条)
34
-
35
- - 状态文件里的 `r-pX` 记录带 `objectId: 'r-pX'`(手改出来的 r 形锚点),对象 `pX` 是 `passed`;
36
- - 一个**工作轮回执**(没有验证任务,因此走记录锚点这条路径)点名 `r-pX` 报 `defect`;
37
- - 断言:**对象侧必须被降级**(锚点被拒绝而不是被信任)、验证侧同样降级。
38
-
39
- **灵敏度实测**(`_oneoff/probe-v2-anchor-guard.mjs`):把读取侧的守卫去掉 → 该用例立刻变红
40
- (`exit=1`,失败断言正是这一条),装回 → 全绿。即这条守卫是**承重**的,不是摆设。
41
-
42
- ## 4. 验收(实测)
43
-
44
- | 项 | 2.3.6 | 2.3.7 |
45
- |---|---|---|
46
- | `formal-verify-v2.test.mjs` | 348 | **353** |
47
- | 读取侧守卫探针 | — | **红/绿各一次,符合预期** |
48
- | 全量并行回归 | 23/23 | 23/23 |
49
- | 49 条 formal 探针 | 全红 | 全红 |
50
- | 四套语料确定性 | 字节稳定 | 字节稳定 |
51
- | closing verification | 18/18 | 18/18 |
52
-
53
- ## 5. 升级
54
-
55
- ```
56
- npm i dsh-vibe-math@latest
57
- ```
58
-
59
- 无迁移。本版只改 v2 的锚点校验与断言;`off` 档行为不变,其余三套预设与上一版逐字节相同。
1
+ # dsh-vibe-math 2.3.7 — 权威锚点必须自洽:手改过的状态文件不得劫持 id 映射
2
+
3
+ > 上一版:2.3.6。本版是 round 8:把 2.3.6 新引入的"记录里持久化权威 `objectId`"这条机制**自己**审一遍。
4
+ > 无破坏性变更,默认仍为 `formalVerify: 'off'`。
5
+
6
+ ---
7
+
8
+ ## 1. 2.3.6 引入的新机制里有一个可被污染的锚点
9
+
10
+ 2.3.6 让 `formalObjectIdOf` 在任务表不可用时读记录里的 `objectId`(跨 resume 生效)。但**状态文件是
11
+ 可编辑的**(`VibeMath_State/formal.json`,仓库里本来就有"文件被改坏也要能继续"的守卫测试):
12
+
13
+ - 如果某条记录的 `objectId` 自己就是 **r 形**(`r-pX`),那么"验证 id → 对象 id"会映射到**它自己**;
14
+ - 于是 `putFormalBothIds('r-pX', …)` 认为"两侧就是同一个 id",**只写验证侧**,对象侧仍然 `passed`
15
+ —— 又回到"成对关系只做一半"的静默错位(门禁/卡片/提示词各读一侧)。
16
+
17
+ **触发路径**(实测):**工作轮回执**(explorer/solver 的回执同样带 `formal` 字段)在**没有验证任务**
18
+ 在内存里时走到"读记录锚点"这条兜底路径。以手改过的状态文件复现:修前该用例的断言变红
19
+ (对象侧不降级),修后全绿。
20
+
21
+ ## 2. 修法:锚点必须**自洽**才可用
22
+
23
+ - `formalObjectIdOf` 读记录锚点时,要求 `formalObjectIdOfIsOwner(v)` 为真 —— 即该值**不以 `r-` 开头**、
24
+ 不可能再被解析成别的 id;
25
+ - 写入锚点的两处(`syncVerificationTarget`、`putFormalBothIds`)同样只在**确实是对象 id** 时写入,
26
+ 不给未来留下污染源。
27
+
28
+ > 说明(如实记录):写入侧的两道守卫**目前无法用用例证明其必要性**——现有写入者手里的值都来自
29
+ > `formalObjectIdOf`,本身就不会是 r 形(我一度写了一个"归档写在 rId 上会污染锚点"的用例,实测发现它
30
+ > **恒真**,已删除并换成下面这个真正敏感的用例)。因此这两道守卫按**纵深防御**保留并如此标注;
31
+ > 真正被证明有效的是**读取侧**的守卫。
32
+
33
+ ## 3. 新增断言(`formal-verify-v2.test.mjs` 第 14d 节,+5 条)
34
+
35
+ - 状态文件里的 `r-pX` 记录带 `objectId: 'r-pX'`(手改出来的 r 形锚点),对象 `pX` 是 `passed`;
36
+ - 一个**工作轮回执**(没有验证任务,因此走记录锚点这条路径)点名 `r-pX` 报 `defect`;
37
+ - 断言:**对象侧必须被降级**(锚点被拒绝而不是被信任)、验证侧同样降级。
38
+
39
+ **灵敏度实测**(`_oneoff/probe-v2-anchor-guard.mjs`):把读取侧的守卫去掉 → 该用例立刻变红
40
+ (`exit=1`,失败断言正是这一条),装回 → 全绿。即这条守卫是**承重**的,不是摆设。
41
+
42
+ ## 4. 验收(实测)
43
+
44
+ | 项 | 2.3.6 | 2.3.7 |
45
+ |---|---|---|
46
+ | `formal-verify-v2.test.mjs` | 348 | **353** |
47
+ | 读取侧守卫探针 | — | **红/绿各一次,符合预期** |
48
+ | 全量并行回归 | 23/23 | 23/23 |
49
+ | 49 条 formal 探针 | 全红 | 全红 |
50
+ | 四套语料确定性 | 字节稳定 | 字节稳定 |
51
+ | closing verification | 18/18 | 18/18 |
52
+
53
+ ## 5. 升级
54
+
55
+ ```
56
+ npm i dsh-vibe-math@latest
57
+ ```
58
+
59
+ 无迁移。本版只改 v2 的锚点校验与断言;`off` 档行为不变,其余三套预设与上一版逐字节相同。
@@ -1,45 +1,45 @@
1
- # dsh-vibe-math 2.3.8 — 把 round 7/8 的结论写进契约与审计清单(文档版)
2
-
3
- > 上一版:2.3.7。本版**只改文档**(无代码、无预设字节变化):把 2.3.6/2.3.7 发现的边界与规则写进
4
- > 共享契约与强制审计流程,免得下一轮审计重新把它当"新问题"或按另一种方式改。
5
-
6
- ---
7
-
8
- ## 1. 契约 §4:补两条边界
9
-
10
- - **记录与归档文件同生共死(框架侧),但外部文件操作不会自动改记录**:框架撤回证明时记录降级与文件
11
- 撤回是**同一次操作**;反过来,**外部**删掉 `Verified/Lean/<id>.lean` **不会**自动把记录降级——
12
- `passed` 是状态文件里的权威状态,门禁查询是只读的,不会在每次取记录时做文件存在性探测(那会把门禁
13
- 变成 fs I/O,并在网络盘/权限异常时引入新的失败模式)。人工动过文件后请一并修正记录或重新归档。
14
- - **v2 的 id 映射同理**:记录里持久化的 `objectId` 是权威锚点,但必须**自洽**(不以 `r-` 开头)才被
15
- 采纳,否则回退到后缀解析——状态文件可编辑,里面的"权威值"要先校验。
16
-
17
- ## 2. `AUDIT-CHECKLIST` §1.10:补一条检查项
18
-
19
- > **从用户可编辑的状态文件里读出来的"权威值"是否先做了自洽校验?**
20
- > 真实事故(2.3.7):某条记录的 `objectId` 被写成 r 形时,"验证 id → 对象 id"映射到它自己,
21
- > "两套 id 一起写"退化成只写验证侧、对象侧仍是 `passed`。
22
-
23
- (§1.10 是 2.3.6 新增的章节「id 映射不许猜」,本版把它与 2.3.7 的教训合并成完整检查项。)
24
-
25
- ## 3. v2 实现方案 §9.3:同步自洽条件
26
-
27
- `formalObjectIdOf` 的权威度顺序里,第 ② 级(记录里的 `objectId`)补上"读出时要求自洽"的条件。
28
-
29
- ## 4. 验收
30
-
31
- | 项 | 结果 |
32
- |---|---|
33
- | 代码/预设字节变化 | **无**(四套 `.js` 与 2.3.7 逐字节相同) |
34
- | 全量并行回归 | 23/23 |
35
- | 静态守卫 | invariants 157/0(self-probe 5/5)、traceability 94/0、v5-integrity clean |
36
- | 四套语料确定性 | 字节稳定 |
37
- | closing verification | 18/18 |
38
-
39
- ## 5. 升级
40
-
41
- ```
42
- npm i dsh-vibe-math@latest
43
- ```
44
-
45
- 无迁移、无行为变更。
1
+ # dsh-vibe-math 2.3.8 — 把 round 7/8 的结论写进契约与审计清单(文档版)
2
+
3
+ > 上一版:2.3.7。本版**只改文档**(无代码、无预设字节变化):把 2.3.6/2.3.7 发现的边界与规则写进
4
+ > 共享契约与强制审计流程,免得下一轮审计重新把它当"新问题"或按另一种方式改。
5
+
6
+ ---
7
+
8
+ ## 1. 契约 §4:补两条边界
9
+
10
+ - **记录与归档文件同生共死(框架侧),但外部文件操作不会自动改记录**:框架撤回证明时记录降级与文件
11
+ 撤回是**同一次操作**;反过来,**外部**删掉 `Verified/Lean/<id>.lean` **不会**自动把记录降级——
12
+ `passed` 是状态文件里的权威状态,门禁查询是只读的,不会在每次取记录时做文件存在性探测(那会把门禁
13
+ 变成 fs I/O,并在网络盘/权限异常时引入新的失败模式)。人工动过文件后请一并修正记录或重新归档。
14
+ - **v2 的 id 映射同理**:记录里持久化的 `objectId` 是权威锚点,但必须**自洽**(不以 `r-` 开头)才被
15
+ 采纳,否则回退到后缀解析——状态文件可编辑,里面的"权威值"要先校验。
16
+
17
+ ## 2. `AUDIT-CHECKLIST` §1.10:补一条检查项
18
+
19
+ > **从用户可编辑的状态文件里读出来的"权威值"是否先做了自洽校验?**
20
+ > 真实事故(2.3.7):某条记录的 `objectId` 被写成 r 形时,"验证 id → 对象 id"映射到它自己,
21
+ > "两套 id 一起写"退化成只写验证侧、对象侧仍是 `passed`。
22
+
23
+ (§1.10 是 2.3.6 新增的章节「id 映射不许猜」,本版把它与 2.3.7 的教训合并成完整检查项。)
24
+
25
+ ## 3. v2 实现方案 §9.3:同步自洽条件
26
+
27
+ `formalObjectIdOf` 的权威度顺序里,第 ② 级(记录里的 `objectId`)补上"读出时要求自洽"的条件。
28
+
29
+ ## 4. 验收
30
+
31
+ | 项 | 结果 |
32
+ |---|---|
33
+ | 代码/预设字节变化 | **无**(四套 `.js` 与 2.3.7 逐字节相同) |
34
+ | 全量并行回归 | 23/23 |
35
+ | 静态守卫 | invariants 157/0(self-probe 5/5)、traceability 94/0、v5-integrity clean |
36
+ | 四套语料确定性 | 字节稳定 |
37
+ | closing verification | 18/18 |
38
+
39
+ ## 5. 升级
40
+
41
+ ```
42
+ npm i dsh-vibe-math@latest
43
+ ```
44
+
45
+ 无迁移、无行为变更。