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,134 +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 文件会自动更新;语言/提示词层面的变化在新会话生效。
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`](../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 文件会自动更新;语言/提示词层面的变化在新会话生效。
@@ -1,105 +1,105 @@
1
- # dsh-vibe-math 2.3.10 — 插件市场展示图 + DSH 版本依赖声明(并加防退化守卫)
2
-
3
- > 上一版:2.3.9。本版只做两件事:让 [dsh-market](https://github.com/dsh-market/dsh-market) /
4
- > [awesome-dsh-plugin](https://github.com/awesome-dsh-plugin/awesome-dsh-plugin) 目录里的本插件条目
5
- > **有展示图**、**有 DSH 版本依赖声明**,并把这两处声明用测试钉住。无预设/行为变更。
6
-
7
- ---
8
-
9
- ## 1. 这两处元数据分别从哪里读(先把机制说清楚)
10
-
11
- 市场目录的条目文件是 `data/plugins/ChongCyrus__Vibe-Mathematics.yml`(改条目文字/分类**才**需要 PR),
12
- 但**展示图与版本依赖都不在那个 YAML 里**:
13
-
14
- | 读什么 | 来源 | 生效方式 |
15
- |---|---|---|
16
- | 展示图(卡片图 + 详情页 AppStore 式轮播,1–8 张) | **本仓库根目录的 `screenshots.json`**(`package.json` 旁边),路径相对该文件、不得越出仓库、不得以 `/` 开头;也接受 GitHub 托管的 https 绝对地址 | 目录的**夜间构建**抓取——推自己的仓库即可,**无需 PR** |
17
- | DSH 版本依赖(卡片上的兼容性) | **已发布的 npm manifest**:`engines.dsh`(顶层优先)或 `dsh.engines.dsh`,外加 `@deepseek-ai/dsh*` 的 `peerDependencies`(若有,全部**求交**);用 semver + `includePrerelease:true` 与宿主版本比较 | 发一个新版本;市场缓存 **TTL 24h** |
18
-
19
- 本版之前的状态:`screenshots.json` **不存在** → 市场吃到目录里 `data/screenshots.json` 的历史遗留条目,
20
- 而它指向的 `示例图/框架图-v1.png` **早已删除**(首图 404,被静默丢弃);`engines.dsh` / `dsh.engines.dsh`
21
- **都没有**(本包只有自用的 `dsh.minVersion` / `testedVersion` / `compatibility`,市场不读)→ 卡片长期显示
22
- "未声明"。
23
-
24
- ## 2. 展示图:新增 `screenshots.json`
25
-
26
- ```json
27
- [
28
- "示例图/框架图-v5.png",
29
- "示例图/框架图-v4.png",
30
- "示例图/框架图-v3.png",
31
- "示例图/框架图-v2.png"
32
- ]
33
- ```
34
-
35
- - 顺序即轮播顺序,第一张是卡片图;**全是仓库里真实存在的 PNG**(旧条目就是死在"路径指向已删除文件"上)。
36
- - `框架图-v5.png` / `框架图-v4.png` 是本版新增的 **1:1 光栅图**(1720×1204 / 1720×1260,由对应 SVG 用无头 Chrome
37
- 渲染:`_oneoff/render-market-pngs.mjs`)——README 继续用可缩放的 SVG,市场用光栅图最稳。
38
- - 市场是"AppStore 式"展示,因此**不用** `实际使用示例-长截图.png`(实测 **1072×22094**,比例完全不适合轮播)。
39
- - 旧遗留键(指向 v1/v2 的 `data/screenshots.json`)会在目录构建时被清理脚本自动移除——**不要去那边加键**。
40
-
41
- ## 3. 版本依赖:声明 `engines.dsh` + `dsh.engines.dsh`
42
-
43
- ```
44
- >=0.1.2-alpha.4 <0.1.3-0 || >=0.1.3-alpha.2 <0.1.5-0 || >=0.1.5-alpha.1 <0.2.0-0
45
- ```
46
-
47
- 为什么不是一句 `>=0.1.2-rc.1 <0.2.0`?目录的 contributing 指南专门警告过这个坑:node-semver 只有当范围里
48
- **某个比较符与宿主版本的 `major.minor.patch` 完全相同、且自身带预发布标签**时,才放行该预发布版本——
49
- `>=0.1.2-rc.1 <0.2.0` **匹配不到** `0.1.5-rc.2`(本包实测支持且一直在用的宿主版本),卡片上会显示成不兼容。
50
- 上面的显式分支给每个 tuple 都配了预发布比较符,并保留 `<0.2.0-0` 上限。
51
-
52
- **实测核对**(semver **7.8.5**,npm 自带的那份,默认语义与 `includePrerelease:true` 两种都跑):
53
-
54
- | 版本 | 本包声明 | `>=0.1.2-alpha.4`(仅下限) | `>=0.1.2-alpha.4 <0.2.0-0` |
55
- |---|---|---|---|
56
- | 0.1.2-alpha.4 / alpha.5 / rc.1 | ✅ / ✅ | ✅ / ✅ | ✅ / ✅ |
57
- | 0.1.3-alpha.2 | ✅ / ✅ | ❌ / ✅ | ❌ / ✅ |
58
- | 0.1.5-alpha.1 / alpha.2 / rc.1 / **rc.2** | ✅ / ✅ | ❌ / ✅ | ❌ / ✅ |
59
- | 0.1.1-rc.1、0.2.0-rc.1、0.2.0、1.0.0 | ❌ / ❌ | 部分 ✅ | 部分 ✅ |
60
-
61
- (左=默认语义,右=includePrerelease。只有本包的写法在**两种语义下判定一致**,且与
62
- `dsh.compatibility.dshReleases` 宣称的兼容面完全吻合。)
63
-
64
- 同时声明**两处**:顶层 `engines.dsh`(市场优先读它)与 `dsh.engines.dsh`(生态里更常见的写法,也是
65
- `@linxin666/dsh-web-all`、`zhengjy01/dsh-updater` 等的写法;市场在顶层缺失时才读它)。两处取值相同,
66
- 求交后结论一致。本包**没有** `@deepseek-ai/*` 的 peerDependencies——四套预设依赖的是宿主**服务**而不是 npm 包,
67
- 这一点由守卫断言钉住(将来若加,必须同样写成预发布感知的范围)。
68
-
69
- `dsh.minVersion` / `testedVersion` / `compatibility.dshReleases` **保留**:它们是本包安装器自检与文档用的,
70
- 市场不读它们。
71
-
72
- ## 4. 新增守卫:`audit-market-metadata.test.mjs`(随包发布,进并行回归)
73
-
74
- 16 条断言:`dsh.bundle.patch` 存在(目录 CI 的第一道门槛);两处 DSH 声明存在、相等、≤256 字符(市场的范围长度
75
- 上限)、等于**经实测验证**的那条链;链覆盖 `dsh.compatibility` 里所有标记 `compatible` 的版本;链带显式上限;
76
- 无 `@deepseek-ai` peer;`screenshots.json` 是 1–8 张、路径合规且**文件真实存在**、全是 PNG;README 里每张图都存在。
77
-
78
- **灵敏度实测**(`_oneoff/probe-market-guard.mjs`):删掉 `engines.dsh` / 把截图指回已删除的 `框架图-v1.png` /
79
- 放 9 张 / 用 `../` 越出仓库 / 漂移范围链——**五种缺陷形状全部被判红**,且未变异的对照跑仍为绿。
80
-
81
- ## 5. 验收
82
-
83
- | 项 | 结果 |
84
- |---|---|
85
- | `audit-market-metadata.test.mjs` | **16/0**(+5 个灵敏度探针) |
86
- | 静态守卫 | invariants 157/0(self-probe 5/5)、traceability 94/0、v5-integrity clean、persona-surface 197/0 |
87
- | 全量并行回归 | 24/24(新增本套件) |
88
- | closing verification | 18/18 |
89
- | 发布产物自证 | registry tarball sha1 与本地 `npm pack`/`dist.shasum` 一致 + 包内跑全部随包套件 |
90
-
91
- ## 6. 生效时间(重要)
92
-
93
- - **展示图**:推送到本仓库后,等 awesome-dsh-plugin 的**夜间构建**重新抓取(它读 `raw.githubusercontent.com`
94
- 上本仓库 HEAD 的 `screenshots.json`),随后 dsh-market / 两个站点都会更新。
95
- - **版本依赖**:本版发布后,市场从 npm 读 manifest 并缓存 —— 最长 **24h** 后卡片显示新声明;期间重启 DSH 或
96
- 等缓存过期即可看到。
97
- - **无需**为这两件事去目录仓库提 PR;但**条目文字**(描述/分类)仍在那边的 YAML 里,改它才需要 PR。
98
-
99
- ## 7. 升级
100
-
101
- ```
102
- npm i dsh-vibe-math@latest
103
- ```
104
-
105
- 无迁移;四套预设与上一版逐字节相同。
1
+ # dsh-vibe-math 2.3.10 — 插件市场展示图 + DSH 版本依赖声明(并加防退化守卫)
2
+
3
+ > 上一版:2.3.9。本版只做两件事:让 [dsh-market](https://github.com/dsh-market/dsh-market) /
4
+ > [awesome-dsh-plugin](https://github.com/awesome-dsh-plugin/awesome-dsh-plugin) 目录里的本插件条目
5
+ > **有展示图**、**有 DSH 版本依赖声明**,并把这两处声明用测试钉住。无预设/行为变更。
6
+
7
+ ---
8
+
9
+ ## 1. 这两处元数据分别从哪里读(先把机制说清楚)
10
+
11
+ 市场目录的条目文件是 `data/plugins/ChongCyrus__Vibe-Mathematics.yml`(改条目文字/分类**才**需要 PR),
12
+ 但**展示图与版本依赖都不在那个 YAML 里**:
13
+
14
+ | 读什么 | 来源 | 生效方式 |
15
+ |---|---|---|
16
+ | 展示图(卡片图 + 详情页 AppStore 式轮播,1–8 张) | **本仓库根目录的 `screenshots.json`**(`package.json` 旁边),路径相对该文件、不得越出仓库、不得以 `/` 开头;也接受 GitHub 托管的 https 绝对地址 | 目录的**夜间构建**抓取——推自己的仓库即可,**无需 PR** |
17
+ | DSH 版本依赖(卡片上的兼容性) | **已发布的 npm manifest**:`engines.dsh`(顶层优先)或 `dsh.engines.dsh`,外加 `@deepseek-ai/dsh*` 的 `peerDependencies`(若有,全部**求交**);用 semver + `includePrerelease:true` 与宿主版本比较 | 发一个新版本;市场缓存 **TTL 24h** |
18
+
19
+ 本版之前的状态:`screenshots.json` **不存在** → 市场吃到目录里 `data/screenshots.json` 的历史遗留条目,
20
+ 而它指向的 `示例图/框架图-v1.png` **早已删除**(首图 404,被静默丢弃);`engines.dsh` / `dsh.engines.dsh`
21
+ **都没有**(本包只有自用的 `dsh.minVersion` / `testedVersion` / `compatibility`,市场不读)→ 卡片长期显示
22
+ "未声明"。
23
+
24
+ ## 2. 展示图:新增 `screenshots.json`
25
+
26
+ ```json
27
+ [
28
+ "示例图/框架图-v5.png",
29
+ "示例图/框架图-v4.png",
30
+ "示例图/框架图-v3.png",
31
+ "示例图/框架图-v2.png"
32
+ ]
33
+ ```
34
+
35
+ - 顺序即轮播顺序,第一张是卡片图;**全是仓库里真实存在的 PNG**(旧条目就是死在"路径指向已删除文件"上)。
36
+ - `框架图-v5.png` / `框架图-v4.png` 是本版新增的 **1:1 光栅图**(1720×1204 / 1720×1260,由对应 SVG 用无头 Chrome
37
+ 渲染:`_oneoff/render-market-pngs.mjs`)——README 继续用可缩放的 SVG,市场用光栅图最稳。
38
+ - 市场是"AppStore 式"展示,因此**不用** `实际使用示例-长截图.png`(实测 **1072×22094**,比例完全不适合轮播)。
39
+ - 旧遗留键(指向 v1/v2 的 `data/screenshots.json`)会在目录构建时被清理脚本自动移除——**不要去那边加键**。
40
+
41
+ ## 3. 版本依赖:声明 `engines.dsh` + `dsh.engines.dsh`
42
+
43
+ ```
44
+ >=0.1.2-alpha.4 <0.1.3-0 || >=0.1.3-alpha.2 <0.1.5-0 || >=0.1.5-alpha.1 <0.2.0-0
45
+ ```
46
+
47
+ 为什么不是一句 `>=0.1.2-rc.1 <0.2.0`?目录的 contributing 指南专门警告过这个坑:node-semver 只有当范围里
48
+ **某个比较符与宿主版本的 `major.minor.patch` 完全相同、且自身带预发布标签**时,才放行该预发布版本——
49
+ `>=0.1.2-rc.1 <0.2.0` **匹配不到** `0.1.5-rc.2`(本包实测支持且一直在用的宿主版本),卡片上会显示成不兼容。
50
+ 上面的显式分支给每个 tuple 都配了预发布比较符,并保留 `<0.2.0-0` 上限。
51
+
52
+ **实测核对**(semver **7.8.5**,npm 自带的那份,默认语义与 `includePrerelease:true` 两种都跑):
53
+
54
+ | 版本 | 本包声明 | `>=0.1.2-alpha.4`(仅下限) | `>=0.1.2-alpha.4 <0.2.0-0` |
55
+ |---|---|---|---|
56
+ | 0.1.2-alpha.4 / alpha.5 / rc.1 | ✅ / ✅ | ✅ / ✅ | ✅ / ✅ |
57
+ | 0.1.3-alpha.2 | ✅ / ✅ | ❌ / ✅ | ❌ / ✅ |
58
+ | 0.1.5-alpha.1 / alpha.2 / rc.1 / **rc.2** | ✅ / ✅ | ❌ / ✅ | ❌ / ✅ |
59
+ | 0.1.1-rc.1、0.2.0-rc.1、0.2.0、1.0.0 | ❌ / ❌ | 部分 ✅ | 部分 ✅ |
60
+
61
+ (左=默认语义,右=includePrerelease。只有本包的写法在**两种语义下判定一致**,且与
62
+ `dsh.compatibility.dshReleases` 宣称的兼容面完全吻合。)
63
+
64
+ 同时声明**两处**:顶层 `engines.dsh`(市场优先读它)与 `dsh.engines.dsh`(生态里更常见的写法,也是
65
+ `@linxin666/dsh-web-all`、`zhengjy01/dsh-updater` 等的写法;市场在顶层缺失时才读它)。两处取值相同,
66
+ 求交后结论一致。本包**没有** `@deepseek-ai/*` 的 peerDependencies——四套预设依赖的是宿主**服务**而不是 npm 包,
67
+ 这一点由守卫断言钉住(将来若加,必须同样写成预发布感知的范围)。
68
+
69
+ `dsh.minVersion` / `testedVersion` / `compatibility.dshReleases` **保留**:它们是本包安装器自检与文档用的,
70
+ 市场不读它们。
71
+
72
+ ## 4. 新增守卫:`audit-market-metadata.test.mjs`(随包发布,进并行回归)
73
+
74
+ 16 条断言:`dsh.bundle.patch` 存在(目录 CI 的第一道门槛);两处 DSH 声明存在、相等、≤256 字符(市场的范围长度
75
+ 上限)、等于**经实测验证**的那条链;链覆盖 `dsh.compatibility` 里所有标记 `compatible` 的版本;链带显式上限;
76
+ 无 `@deepseek-ai` peer;`screenshots.json` 是 1–8 张、路径合规且**文件真实存在**、全是 PNG;README 里每张图都存在。
77
+
78
+ **灵敏度实测**(`_oneoff/probe-market-guard.mjs`):删掉 `engines.dsh` / 把截图指回已删除的 `框架图-v1.png` /
79
+ 放 9 张 / 用 `../` 越出仓库 / 漂移范围链——**五种缺陷形状全部被判红**,且未变异的对照跑仍为绿。
80
+
81
+ ## 5. 验收
82
+
83
+ | 项 | 结果 |
84
+ |---|---|
85
+ | `audit-market-metadata.test.mjs` | **16/0**(+5 个灵敏度探针) |
86
+ | 静态守卫 | invariants 157/0(self-probe 5/5)、traceability 94/0、v5-integrity clean、persona-surface 197/0 |
87
+ | 全量并行回归 | 24/24(新增本套件) |
88
+ | closing verification | 18/18 |
89
+ | 发布产物自证 | registry tarball sha1 与本地 `npm pack`/`dist.shasum` 一致 + 包内跑全部随包套件 |
90
+
91
+ ## 6. 生效时间(重要)
92
+
93
+ - **展示图**:推送到本仓库后,等 awesome-dsh-plugin 的**夜间构建**重新抓取(它读 `raw.githubusercontent.com`
94
+ 上本仓库 HEAD 的 `screenshots.json`),随后 dsh-market / 两个站点都会更新。
95
+ - **版本依赖**:本版发布后,市场从 npm 读 manifest 并缓存 —— 最长 **24h** 后卡片显示新声明;期间重启 DSH 或
96
+ 等缓存过期即可看到。
97
+ - **无需**为这两件事去目录仓库提 PR;但**条目文字**(描述/分类)仍在那边的 YAML 里,改它才需要 PR。
98
+
99
+ ## 7. 升级
100
+
101
+ ```
102
+ npm i dsh-vibe-math@latest
103
+ ```
104
+
105
+ 无迁移;四套预设与上一版逐字节相同。
@@ -1,57 +1,57 @@
1
- # dsh-vibe-math 2.3.11 — 修正 2.3.10 的打包错误:市场守卫是**仓库级**的,不该随包发布
2
-
3
- > 上一版:2.3.10。本版只修一处**打包/验证契约**错误,不改任何声明内容。四套预设字节未变。
4
-
5
- ---
6
-
7
- ## 1. 事故
8
-
9
- 2.3.10 新增的 `audit-market-metadata.test.mjs` 被列进了 `package.json` 的 `files`,于是它随包发布。
10
- 但它是**仓库级**守卫:它校验的是"`screenshots.json` 里的截图、README 里的图片**在仓库里真实存在**"——
11
- 而这些 PNG 是目录从 GitHub 抓取的**仓库产物**,**不在 npm tarball 里**。结果在解包出来的包里跑它必然失败:
12
-
13
- ```
14
- FAIL every declared image is a usable, existing path
15
- — 示例图/框架图-v5.png (declared but missing from the repository) | …
16
- FAIL every image the README shows exists in the repository (8 images)
17
- — 示例图/框架图-v2.png, 示例图/框架图-v3.png, 示例图/实际使用示例-长截图.png
18
- ```
19
-
20
- 发布产物自证因此判红(这正是它的职责:**不是"publish 退出 0 就算完成"**)。
21
-
22
- ## 2. 修法:纠正打包契约,而不是放宽断言
23
-
24
- - 该套件**从 `files` 里移除**——它由检出目录里的 `run-tests.mjs` / `final-verify.mjs`(24 套件)执行,
25
- 那里断言全开;
26
- - 套件自己新增两条断言把这条契约钉住:
27
- 1. **它不得出现在 `package.json` `files` 里**(有人再放进去,检出目录里的测试会**先**红,
28
- 而不是等到发布自证才发现);
29
- 2. `screenshots.json` **必须**随包发布(它向安装者说明市场合约,值得让用户看到)。
30
- - 发布验证器也补上一条"不许出现"的检查(正向标记无法表达"文件不存在"):
31
- `MUST_NOT_SHIP = ["audit-market-metadata.test.mjs"]`,并打印确认它确实不在 tarball 里。
32
-
33
- 守卫现为 **18 条断言**(原 16 + 上述 2 条),检出目录里全绿;五种缺陷形状的灵敏度探针不受影响。
34
-
35
- ## 3. 2.3.10 的市场改动仍然有效(内容未变)
36
-
37
- - 展示图:[`screenshots.json`](screenshots.json) → v5 / v4 / v3 / v2 四张真实存在的 PNG(目录夜间构建抓取,无需 PR);
38
- - DSH 版本依赖:`engines.dsh` 与 `dsh.engines.dsh` 都是
39
- `>=0.1.2-alpha.4 <0.1.3-0 || >=0.1.3-alpha.2 <0.1.5-0 || >=0.1.5-alpha.1 <0.2.0-0`(市场从已发布 manifest 读,TTL 24h);
40
- - README 的「插件市场里的展示」一节不变。
41
-
42
- ## 4. 验收
43
-
44
- | 项 | 2.3.10 | 2.3.11 |
45
- |---|---|---|
46
- | `audit-market-metadata.test.mjs`(检出目录) | 16/0 | **18/0** |
47
- | 发布产物自证 | **失败**(包内跑该守卫) | **通过**(7 个随包套件全绿 + 确认该守卫不在 tarball 里) |
48
- | 全量并行回归 | 24/24 | 24/24 |
49
- | closing verification | 18/18 | 18/18 |
50
-
51
- ## 5. 升级
52
-
53
- ```
54
- npm i dsh-vibe-math@latest
55
- ```
56
-
57
- 无迁移;`off` 档行为与预设字节均未变。
1
+ # dsh-vibe-math 2.3.11 — 修正 2.3.10 的打包错误:市场守卫是**仓库级**的,不该随包发布
2
+
3
+ > 上一版:2.3.10。本版只修一处**打包/验证契约**错误,不改任何声明内容。四套预设字节未变。
4
+
5
+ ---
6
+
7
+ ## 1. 事故
8
+
9
+ 2.3.10 新增的 `audit-market-metadata.test.mjs` 被列进了 `package.json` 的 `files`,于是它随包发布。
10
+ 但它是**仓库级**守卫:它校验的是"`screenshots.json` 里的截图、README 里的图片**在仓库里真实存在**"——
11
+ 而这些 PNG 是目录从 GitHub 抓取的**仓库产物**,**不在 npm tarball 里**。结果在解包出来的包里跑它必然失败:
12
+
13
+ ```
14
+ FAIL every declared image is a usable, existing path
15
+ — 示例图/框架图-v5.png (declared but missing from the repository) | …
16
+ FAIL every image the README shows exists in the repository (8 images)
17
+ — 示例图/框架图-v2.png, 示例图/框架图-v3.png, 示例图/实际使用示例-长截图.png
18
+ ```
19
+
20
+ 发布产物自证因此判红(这正是它的职责:**不是"publish 退出 0 就算完成"**)。
21
+
22
+ ## 2. 修法:纠正打包契约,而不是放宽断言
23
+
24
+ - 该套件**从 `files` 里移除**——它由检出目录里的 `run-tests.mjs` / `final-verify.mjs`(24 套件)执行,
25
+ 那里断言全开;
26
+ - 套件自己新增两条断言把这条契约钉住:
27
+ 1. **它不得出现在 `package.json` `files` 里**(有人再放进去,检出目录里的测试会**先**红,
28
+ 而不是等到发布自证才发现);
29
+ 2. `screenshots.json` **必须**随包发布(它向安装者说明市场合约,值得让用户看到)。
30
+ - 发布验证器也补上一条"不许出现"的检查(正向标记无法表达"文件不存在"):
31
+ `MUST_NOT_SHIP = ["audit-market-metadata.test.mjs"]`,并打印确认它确实不在 tarball 里。
32
+
33
+ 守卫现为 **18 条断言**(原 16 + 上述 2 条),检出目录里全绿;五种缺陷形状的灵敏度探针不受影响。
34
+
35
+ ## 3. 2.3.10 的市场改动仍然有效(内容未变)
36
+
37
+ - 展示图:[`screenshots.json`](../../screenshots.json) → v5 / v4 / v3 / v2 四张真实存在的 PNG(目录夜间构建抓取,无需 PR);
38
+ - DSH 版本依赖:`engines.dsh` 与 `dsh.engines.dsh` 都是
39
+ `>=0.1.2-alpha.4 <0.1.3-0 || >=0.1.3-alpha.2 <0.1.5-0 || >=0.1.5-alpha.1 <0.2.0-0`(市场从已发布 manifest 读,TTL 24h);
40
+ - README 的「插件市场里的展示」一节不变。
41
+
42
+ ## 4. 验收
43
+
44
+ | 项 | 2.3.10 | 2.3.11 |
45
+ |---|---|---|
46
+ | `audit-market-metadata.test.mjs`(检出目录) | 16/0 | **18/0** |
47
+ | 发布产物自证 | **失败**(包内跑该守卫) | **通过**(7 个随包套件全绿 + 确认该守卫不在 tarball 里) |
48
+ | 全量并行回归 | 24/24 | 24/24 |
49
+ | closing verification | 18/18 | 18/18 |
50
+
51
+ ## 5. 升级
52
+
53
+ ```
54
+ npm i dsh-vibe-math@latest
55
+ ```
56
+
57
+ 无迁移;`off` 档行为与预设字节均未变。