dsh-vibe-math 2.3.8 → 2.3.10
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 +35 -4
- package/RELEASE-NOTES-2.3.10.md +105 -0
- package/RELEASE-NOTES-2.3.9.md +70 -0
- package/audit-market-metadata.test.mjs +139 -0
- package/docs/generate_framework_diagram_v4.mjs +299 -0
- package/docs/generate_framework_diagram_v5.mjs +1 -1
- package/package.json +14 -4
- package/screenshots.json +6 -0
- package//347/244/272/344/276/213/345/233/276//346/241/206/346/236/266/345/233/276-v4.svg +187 -0
package/README.md
CHANGED
|
@@ -22,9 +22,10 @@
|
|
|
22
22
|
|
|
23
23
|
> 静态架构图;完整流程说明见 [docs/架构图.md](docs/架构图.md)(v2 详解)与
|
|
24
24
|
> [vibe-math-v5/架构图.md](vibe-math-v5/架构图.md)(v5 全套细节图);
|
|
25
|
-
> 可编辑生成脚本:[v2](docs/generate_framework_diagram_v2.py) / [v3](docs/generate_framework_diagram_v3.py)
|
|
26
|
-
> [v4](docs/generate_framework_diagram_v4.
|
|
27
|
-
>
|
|
25
|
+
> 可编辑生成脚本:[v2](docs/generate_framework_diagram_v2.py) / [v3](docs/generate_framework_diagram_v3.py)(matplotlib → PNG)、
|
|
26
|
+
> [v4](docs/generate_framework_diagram_v4.mjs) / [v5](docs/generate_framework_diagram_v5.mjs)
|
|
27
|
+
> (零依赖 Node → **SVG**,`node docs/generate_framework_diagram_v4.mjs`)。
|
|
28
|
+
> v4 起改用 SVG:纯文本、diff 友好、任意缩放不糊;需要 PNG 时用无头浏览器截图(命令见生成脚本头部)。
|
|
28
29
|
|
|
29
30
|
### Vibe Math V2(概率驱动 · JSON 数据层)✅ 主推
|
|
30
31
|
|
|
@@ -40,7 +41,10 @@
|
|
|
40
41
|
|
|
41
42
|
### Vibe Math V4(常驻自组织合作研究)🧪 实验性
|
|
42
43
|
|
|
43
|
-

|
|
45
|
+
|
|
46
|
+
> 上面这张 SVG 由零依赖脚本生成:`node docs/generate_framework_diagram_v4.mjs`(纯 Node、无 Python/matplotlib 依赖;
|
|
47
|
+
> 生成时会估算文字宽度,任何一行溢出容器都会告警并以退出码 1 结束)。
|
|
44
48
|
|
|
45
49
|
**一句话流水线**:起始产生 N 个**常驻子代理**(continuable,持久上下文)先各自头脑风暴、产出初始见解/方向 → 此后**所有任务安排由它们互相留言 + 集体开会自主决定**(框架只做消息总线/会议/任务板/产物沉淀,**绝不分配任务**);每个常驻把有价值的产物按**价值程度 / 动机用途计划 / 自身概率估计**沉淀到**自己**的 `Progress/<id>/`、`Propos/<id>/`、`Methods/<id>/`、`Subproblems/<id>/` 库,并**可互相阅读**;验证由它们**自行商议**发起,**仅当全体常驻一致(真或假)**才写入 `Verified/`,否则留库附概率;常驻上下文量达阈值(默认 66%)自动 `/compact`;**仅当全体一致认为原问题已解决**才停止;可随时人工干预/增开/关闭常驻,支持断点续跑。
|
|
46
50
|
|
|
@@ -860,6 +864,33 @@ v5 的完整架构(含成员生命周期、一轮时序、共识状态机、
|
|
|
860
864
|
|
|
861
865
|
---
|
|
862
866
|
|
|
867
|
+
## 🏪 插件市场(dsh-market / awesome-dsh-plugin)里的展示
|
|
868
|
+
|
|
869
|
+
本包已被 [dsh-market](https://github.com/dsh-market/dsh-market)(DSH 内置插件市场)与
|
|
870
|
+
[awesome-dsh-plugin](https://github.com/awesome-dsh-plugin/awesome-dsh-plugin)(同一份目录数据的来源)收录,
|
|
871
|
+
条目文件是 `data/plugins/ChongCyrus__Vibe-Mathematics.yml`。**市场读的元数据有两处,都在本仓库/本包内,
|
|
872
|
+
改它们不需要去提 PR**:
|
|
873
|
+
|
|
874
|
+
| 你要改什么 | 放在哪里 | 什么时候生效 |
|
|
875
|
+
|---|---|---|
|
|
876
|
+
| **卡片/详情页的展示图**(AppStore 式轮播,1–8 张) | 仓库根目录的 [`screenshots.json`](screenshots.json)(`package.json` 旁边):相对路径(不得越出仓库、不得以 `/` 开头)或 GitHub 托管的 https 绝对地址;**必须是存在的文件** | 目录的**夜间构建**自动抓取——推自己的仓库即可,不用提 PR、不用等维护者 |
|
|
877
|
+
| **声明的 DSH 版本依赖**(卡片上的"兼容 / 不兼容 / 未声明") | `package.json` 的 **`engines.dsh`**(顶层优先)或 **`dsh.engines.dsh`**;有 `@deepseek-ai/dsh*` 的 `peerDependencies` 时它们会被**一起**求交 | 市场从**已发布的 npm manifest** 读取并缓存(TTL 24h)——发一个新版本,最多一天后卡片更新 |
|
|
878
|
+
| 条目文字 / 分类 | 目录仓库里的那个 YAML(**改它才需要 PR**,且只能改自己那一条) | PR 合并后自动重建站点 |
|
|
879
|
+
|
|
880
|
+
> ⚠️ **预发布版本的坑**(目录的 contributing 指南专门警告过):node-semver 只有在范围里**某个比较符与宿主版本
|
|
881
|
+
> 的 `major.minor.patch` 完全相同、且自身带预发布标签**时,才让那个预发布版本满足范围。像 `>=0.1.2-rc.1 <0.2.0`
|
|
882
|
+
> 这种"看起来够宽"的写法**匹配不到** `0.1.5-rc.2`。本包因此写成显式分支
|
|
883
|
+
> `>=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`
|
|
884
|
+
> (已用 semver 7.8.5 在默认与 `includePrerelease` 两种语义下逐版本核对:`0.1.2-alpha.4` … `0.1.5-rc.2` 全通过,
|
|
885
|
+
> `0.1.1-*` / `0.2.0-rc.1` / `0.2.0` / `1.0.0` 全拒绝)。
|
|
886
|
+
|
|
887
|
+
[`audit-market-metadata.test.mjs`](audit-market-metadata.test.mjs) 把这两处钉住(随包发布、进并行回归):
|
|
888
|
+
两处 DSH 声明必须存在且一致、必须覆盖 `dsh.compatibility` 里所有标记 `compatible` 的版本、必须带显式上限;
|
|
889
|
+
`screenshots.json` 必须是 1–8 张**真实存在**的图片(历史遗留条目曾指向已删除的 `框架图-v1.png`,
|
|
890
|
+
首图被静默丢弃——这类腐烂现在会被测试直接判红),README 里的每张图也必须存在。
|
|
891
|
+
|
|
892
|
+
---
|
|
893
|
+
|
|
863
894
|
## 📄 License
|
|
864
895
|
|
|
865
896
|
MIT
|
|
@@ -0,0 +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
|
+
无迁移;四套预设与上一版逐字节相同。
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# dsh-vibe-math 2.3.9 — v4 架构图重绘为 SVG(零依赖生成器 + README 展示)
|
|
2
|
+
|
|
3
|
+
> 上一版:2.3.8。本版把 v4 的架构图从"matplotlib 生成的位图"换成**零依赖 Node 生成的 SVG**,
|
|
4
|
+
> 与 v5 同一套版式语言,并把它纳入随包发布(README 里的图在 GitHub 与 npm 上都能正常显示)。
|
|
5
|
+
> 无代码行为变更,四套预设字节未变。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. 为什么换
|
|
10
|
+
|
|
11
|
+
| | 旧(`框架图-v4.png` + `generate_framework_diagram_v4.py`) | 新(`框架图-v4.svg` + `generate_framework_diagram_v4.mjs`) |
|
|
12
|
+
|---|---|---|
|
|
13
|
+
| 生成方式 | Python + matplotlib | **纯 Node,零依赖**(本仓库运行时自带 Node) |
|
|
14
|
+
| 产物 | 位图,缩放糊、无法 diff | 纯文本 SVG,任意缩放、可评审、diff 友好 |
|
|
15
|
+
| 信息量 | 5 个方框 + 若干小字 | 分带:定论门槛 / 常驻层 / 框架六面 / 数据面 / 哲学红线 + 图例 |
|
|
16
|
+
| 版式校验 | 无(只能靠眼睛) | 生成时**估算文字宽度**,任何一行溢出容器即 WARN + 退出码 1 |
|
|
17
|
+
| 随包发布 | 否(npm 上 README 图裂) | **是**(`files` 收录,GitHub 与 npm 均可显示) |
|
|
18
|
+
|
|
19
|
+
旧文件已删除(需要时可从 git 历史取);`README.md` 的图源链接与说明同步更新,
|
|
20
|
+
`docs/generate_framework_diagram_v5.mjs` 头部注释里的"v2/v3/v4 用 matplotlib"也改成"v2/v3"。
|
|
21
|
+
|
|
22
|
+
## 2. 新图覆盖的内容(全部与实现逐项核对过)
|
|
23
|
+
|
|
24
|
+
- **定论门槛**:全体一致为真(全 1)/ 一致为假(全 0)→ 写入 `Verified/`;
|
|
25
|
+
**没有** forced / flat / 近共识收口;分歧 → 公开辩论重评;仍未全票 → 留库 + 平均概率 + 辩论录。
|
|
26
|
+
- **常驻层**:`continuable` 持久会话、独立上下文、自主方向、只写自己的库 / 跨读他人库(只读)、
|
|
27
|
+
唤醒 = `subagents.sendMessage`、一轮 = 一次完整思考;起始 brainstorm 产出各自方向;全票"已解决"才停。
|
|
28
|
+
- **框架六面**(逐条对齐代码/规格):
|
|
29
|
+
- 消息总线·邮件箱:`vibe_v4_message(to|all)` → 入目标邮箱 → 空闲则唤醒;常驻之间不直接互调;
|
|
30
|
+
- 会议 / 辩论:`vibe_v4_meeting(agenda)` → 全体发言 → `Shared/meetings/<id>.md` → 广播结论;
|
|
31
|
+
看门狗防死锁;与验证**互斥**(排队,不抢占);
|
|
32
|
+
- 任务板(只搬运):提议/认领写在回执里 → `Shared/taskboard.md`;框架不决定谁做什么;
|
|
33
|
+
- 共识验证(全票):回执字段 `propose_verify` → FIFO 排队 → 独立初评(互不可见)→ 公开辩论重评
|
|
34
|
+
(最多 `verdictMaxRounds` 轮,默认 3);
|
|
35
|
+
- 上下文 / compact:`contextPct ≥ compactThreshold`(默认 66)触发 DSH `/compact`,
|
|
36
|
+
`compactAfterRounds` 默认 8,压缩后重申核心规则;
|
|
37
|
+
- 活性 / 并发 / 恢复:`activityTimeoutMs` 心跳、`maxParallel` 并发闸、停滞 `stallAutoMeetingMs`
|
|
38
|
+
(默认 6 min)自动开会、`resume` 用 `residents.json` + `progress.md` 重种化。
|
|
39
|
+
- **回执字段**(**按代码里真正的解析字段列**,不是照抄记忆):
|
|
40
|
+
`summary / solved / input / vote / propose_verify / propose_task / claim_task / task_done / voteSolved / formal / contextPct`。
|
|
41
|
+
(核对时发现我第一版图里写了 `reject_assign` 与 `vote_solved` —— 前者是 **v5** 的字段、后者是拼错的
|
|
42
|
+
驼峰名,v4 实际是 `voteSolved`;已改正。)
|
|
43
|
+
- **数据面**(真实路径核对过):
|
|
44
|
+
`Progress/<r-id>/progress.md`、`Propos/<r-id>/<p-id>.md`、`Methods/<r-id>/<m-id>.md`、
|
|
45
|
+
`Subproblems/<r-id>/<s-id>.md`(每条记录必填 价值程度 / 动机用途计划 / 自身概率估计);
|
|
46
|
+
`Shared/meetings|debates`、`Shared/taskboard.md`、`Shared/meetings/brainstorm.md`、
|
|
47
|
+
`Verified/命题|问题/<id>.md`、`Problems/<id>.md`;
|
|
48
|
+
`State/residents.json`、`mailboxes.json`、`taskboard.json`、`decisions.json`、`session.json`、
|
|
49
|
+
`settings.json`、`formal.json`;`fileOwner` 写锁 / `projectLock` / `processEpoch` / `abort → resume`。
|
|
50
|
+
- **哲学红线**:框架绝不指派 / 定论必须全体一致 / 只有 `Verified/` 绝对可信 / 常驻不直接互调 /
|
|
51
|
+
人工干预不改变自组织。
|
|
52
|
+
|
|
53
|
+
## 3. 验收
|
|
54
|
+
|
|
55
|
+
| 项 | 结果 |
|
|
56
|
+
|---|---|
|
|
57
|
+
| 生成器 | `node docs/generate_framework_diagram_v4.mjs` → `示例图/框架图-v4.svg`(23501 字节),**0 条溢出告警** |
|
|
58
|
+
| 渲染校验 | 无头 Chrome 截图 1760×1300 逐带人工核对(无重叠、无截断;左侧控制通道不穿过常驻) |
|
|
59
|
+
| 全量并行回归 | 23/23 |
|
|
60
|
+
| 静态守卫 | invariants 157/0(self-probe 5/5)、traceability 94/0、v5-integrity clean、persona-surface 197/0 |
|
|
61
|
+
| closing verification | 18/18(含"包内所有声明文件存在") |
|
|
62
|
+
| 发布产物自证 | registry 取回 tarball 比对 sha1 + 包内跑随包套件(见发布记录) |
|
|
63
|
+
|
|
64
|
+
## 4. 升级
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
npm i dsh-vibe-math@latest
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
无迁移。README 里的 v4 图现在读 `示例图/框架图-v4.svg`。
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
// ============================================================================================
|
|
2
|
+
// MARKET METADATA AUDIT — the two things a storefront reads about this plugin, kept from rotting.
|
|
3
|
+
//
|
|
4
|
+
// A storefront (dsh-market / awesome-dsh-plugin, and the sites built from the same catalog) reads
|
|
5
|
+
// exactly two declaration surfaces from THIS repository:
|
|
6
|
+
//
|
|
7
|
+
// 1. the DSH version requirement — from the **published npm manifest**:
|
|
8
|
+
// · `engines.dsh` (top-level; wins when both are present), or
|
|
9
|
+
// · `dsh.engines.dsh`
|
|
10
|
+
// plus every `peerDependencies` entry named `@deepseek-ai/dsh*` (all declarations are
|
|
11
|
+
// conjunctive). It is evaluated with semver + `includePrerelease: true`, and every one of them
|
|
12
|
+
// is compared to the running host version to show "compatible / incompatible / unknown" on the
|
|
13
|
+
// card. `awesome-dsh-plugin/contributing.md` documents the trap this file guards against:
|
|
14
|
+
// a range without an explicit prerelease comparator on the matching `major.minor.patch` tuple
|
|
15
|
+
// silently excludes that tuple's prereleases, so a "broad" range fails to match real hosts.
|
|
16
|
+
// 2. the screenshots — from `screenshots.json` **next to package.json** in this repository
|
|
17
|
+
// (1–8 images; relative paths must stay inside the repo, absolute URLs must be https on GitHub
|
|
18
|
+
// hosting). The catalog's nightly build fetches it; a path that 404s is silently dropped, which
|
|
19
|
+
// is exactly how the legacy entry for this repo ended up pointing at a deleted `框架图-v1.png`.
|
|
20
|
+
//
|
|
21
|
+
// Run: node audit-market-metadata.test.mjs (part of `node run-tests.mjs`)
|
|
22
|
+
// ============================================================================================
|
|
23
|
+
import { readFileSync, existsSync } from 'node:fs'
|
|
24
|
+
import { fileURLToPath } from 'node:url'
|
|
25
|
+
import { join, dirname } from 'node:path'
|
|
26
|
+
|
|
27
|
+
const HERE = fileURLToPath(new URL('./', import.meta.url))
|
|
28
|
+
let passed = 0, failed = 0
|
|
29
|
+
const failures = []
|
|
30
|
+
const ok = (cond, label, detail) => {
|
|
31
|
+
if (cond) { passed++; console.log(' ok ' + label); return true }
|
|
32
|
+
failed++; failures.push(label + (detail ? ' — ' + detail : ''))
|
|
33
|
+
console.error(' FAIL ' + label + (detail ? ' — ' + detail : ''))
|
|
34
|
+
return false
|
|
35
|
+
}
|
|
36
|
+
const read = (rel) => (existsSync(join(HERE, rel)) ? readFileSync(join(HERE, rel), 'utf8') : null)
|
|
37
|
+
|
|
38
|
+
const pkg = JSON.parse(read('package.json'))
|
|
39
|
+
|
|
40
|
+
// ---------------------------------------------------------------------------------------------
|
|
41
|
+
// 0. the listing preconditions the catalog's CI checks first
|
|
42
|
+
// ---------------------------------------------------------------------------------------------
|
|
43
|
+
ok(!!(pkg.dsh && pkg.dsh.bundle && pkg.dsh.bundle.patch), 'dsh.bundle.patch is declared (what makes the repo listable and installable)',
|
|
44
|
+
'contributing.md: declaring only dsh.client is the most common rejection')
|
|
45
|
+
ok(existsSync(join(HERE, String((pkg.dsh.bundle || {}).patch || 'cordis.patch.yml'))), 'the bundle patch file exists next to package.json')
|
|
46
|
+
|
|
47
|
+
// ---------------------------------------------------------------------------------------------
|
|
48
|
+
// 1. the DSH requirement declaration
|
|
49
|
+
// ---------------------------------------------------------------------------------------------
|
|
50
|
+
// The exact chain in package.json, verified against semver 7.8.5 (npm's bundled copy) BOTH with and
|
|
51
|
+
// without `includePrerelease` — it admits exactly the releases in `dsh.compatibility.dshReleases`
|
|
52
|
+
// (0.1.2-alpha.4 … 0.1.5-rc.2) and rejects 0.1.1-*, 0.2.0-rc.1, 0.2.0 and 1.0.0. Re-verify with:
|
|
53
|
+
// node -e "const s=require('C:/…/npm/node_modules/semver');console.log(s.satisfies('0.1.5-rc.2', RANGE, {includePrerelease:true}))"
|
|
54
|
+
// An exact-match assertion is deliberate: any edit to the range must be re-verified by hand, because
|
|
55
|
+
// a plausible-looking range is precisely how hosts get a wrong verdict on the card.
|
|
56
|
+
const EXPECTED = '>=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'
|
|
57
|
+
const engineDsh = pkg.engines && pkg.engines.dsh
|
|
58
|
+
const dshEnginesDsh = pkg.dsh && pkg.dsh.engines && pkg.dsh.engines.dsh
|
|
59
|
+
ok(typeof engineDsh === 'string', 'engines.dsh is declared (the position dsh-market reads)', JSON.stringify(engineDsh))
|
|
60
|
+
ok(typeof dshEnginesDsh === 'string', 'dsh.engines.dsh is declared (the ecosystem shape, read when engines.dsh is absent)', JSON.stringify(dshEnginesDsh))
|
|
61
|
+
ok(engineDsh === EXPECTED && dshEnginesDsh === EXPECTED,
|
|
62
|
+
'both declarations carry the VERIFIED range (they must agree: the market takes top-level, other tools take dsh.engines.dsh)',
|
|
63
|
+
'engines.dsh=' + JSON.stringify(engineDsh) + ' dsh.engines.dsh=' + JSON.stringify(dshEnginesDsh))
|
|
64
|
+
ok(typeof engineDsh === 'string' && engineDsh.length <= 256, 'the declaration fits the market\'s 256-char range limit (' + String(engineDsh || '').length + ')')
|
|
65
|
+
|
|
66
|
+
// Every release we claim in our own compatibility matrix must be covered by the range: for each
|
|
67
|
+
// prerelease tuple, the chain needs a comparator on that exact tuple carrying a prerelease tag —
|
|
68
|
+
// the rule node-semver applies, and the one contributing.md warns about. This is what keeps the
|
|
69
|
+
// declaration and the matrix from drifting apart (git history: the matrix grows, the range forgets).
|
|
70
|
+
{
|
|
71
|
+
const matrix = Object.entries((pkg.dsh.compatibility || {}).dshReleases || {})
|
|
72
|
+
.filter(([, v]) => v === 'compatible')
|
|
73
|
+
.map(([ver]) => ver)
|
|
74
|
+
ok(matrix.length > 0, 'the package still records a compatibility matrix (' + matrix.length + ' releases)')
|
|
75
|
+
const missing = matrix.filter((ver) => !engineDsh.includes(ver.replace(/^(\d+\.\d+\.\d+)/, '$1')) && !new RegExp('(?:>=|<)\\s*' + ver.replace(/\./g, '\\.')).test(engineDsh))
|
|
76
|
+
// a version is covered when the chain names a comparator whose tuple matches it
|
|
77
|
+
const uncovered = matrix.filter((ver) => {
|
|
78
|
+
const tuple = ver.split('-')[0]
|
|
79
|
+
return !new RegExp('(?:>=|<)\\s*' + tuple.replace(/\./g, '\\.')).test(engineDsh)
|
|
80
|
+
})
|
|
81
|
+
ok(uncovered.length === 0, 'every release marked compatible in dsh.compatibility is covered by engines.dsh',
|
|
82
|
+
'uncovered: ' + uncovered.join(', ') + (missing.length ? '' : ''))
|
|
83
|
+
const ceil = /<0\.2\.0-0/.test(engineDsh)
|
|
84
|
+
ok(ceil, 'the range ends with an explicit prerelease-aware ceiling (<0.2.0-0): a future major host is not silently claimed compatible')
|
|
85
|
+
// no @deepseek-ai peers is a *deliberate* state for this bundle: the presets depend on host
|
|
86
|
+
// SERVICES, not on npm packages. If one is ever added, the market will AND it with the engine
|
|
87
|
+
// declaration, so it must be a prerelease-aware range too.
|
|
88
|
+
const peers = Object.keys(pkg.peerDependencies || {}).filter((n) => n.startsWith('@deepseek-ai/'))
|
|
89
|
+
ok(peers.length === 0, 'no @deepseek-ai peerDependencies are declared (the presets use host services, not packages)', peers.join(', '))
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// ---------------------------------------------------------------------------------------------
|
|
93
|
+
// 2. screenshots.json (the carousel the market shows, and the card image)
|
|
94
|
+
// ---------------------------------------------------------------------------------------------
|
|
95
|
+
{
|
|
96
|
+
const raw = read('screenshots.json')
|
|
97
|
+
if (ok(raw !== null, 'screenshots.json exists next to package.json (the market reads it from the repo, not from npm)')) {
|
|
98
|
+
let doc = null
|
|
99
|
+
try { doc = JSON.parse(raw) } catch (e) { ok(false, 'screenshots.json parses as JSON', String(e.message)) }
|
|
100
|
+
const list = Array.isArray(doc) ? doc : (doc && Array.isArray(doc.screenshots) ? doc.screenshots : null)
|
|
101
|
+
ok(Array.isArray(list), 'screenshots.json is an array (or {screenshots:[…]})')
|
|
102
|
+
if (Array.isArray(list)) {
|
|
103
|
+
ok(list.length >= 1 && list.length <= 8, 'it declares 1–8 images (' + list.length + ')')
|
|
104
|
+
const GH_HOSTS = new Set(['raw.githubusercontent.com', 'user-images.githubusercontent.com', 'camo.githubusercontent.com', 'github.com'])
|
|
105
|
+
const bad = []
|
|
106
|
+
for (const item of list) {
|
|
107
|
+
if (typeof item !== 'string' || item.trim() === '') { bad.push(JSON.stringify(item) + ' (not a non-empty string)'); continue }
|
|
108
|
+
if (/^https?:\/\//i.test(item)) {
|
|
109
|
+
let host = null
|
|
110
|
+
try { host = new URL(item).hostname } catch (e) { /* left null */ }
|
|
111
|
+
if (!(host && GH_HOSTS.has(host) && item.startsWith('https://'))) bad.push(item + ' (absolute URLs must be https on GitHub hosting)')
|
|
112
|
+
continue
|
|
113
|
+
}
|
|
114
|
+
if (item.startsWith('/') || item.split('/').includes('..')) { bad.push(item + ' (relative paths must stay inside the repo: no leading /, no ..)'); continue }
|
|
115
|
+
// The rot this guards: the legacy catalog entry pointed at a deleted PNG and the carousel
|
|
116
|
+
// silently lost its first image. A declared path that does not exist is a broken listing.
|
|
117
|
+
if (!existsSync(join(HERE, item))) bad.push(item + ' (declared but missing from the repository)')
|
|
118
|
+
}
|
|
119
|
+
ok(bad.length === 0, 'every declared image is a usable, existing path', bad.join(' | '))
|
|
120
|
+
const pngs = list.filter((s) => typeof s === 'string' && /\.png$/i.test(s)).length
|
|
121
|
+
ok(pngs === list.length, 'every declared image is a raster PNG (the market carousel is AppStore-style; the README keeps the scalable SVGs)', list.filter((s) => !/\.png$/i.test(String(s))).join(', '))
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// ---------------------------------------------------------------------------------------------
|
|
127
|
+
// 3. the README must not point at diagrams that no longer exist (the same rot, other surface)
|
|
128
|
+
// ---------------------------------------------------------------------------------------------
|
|
129
|
+
{
|
|
130
|
+
const readme = read('README.md') || ''
|
|
131
|
+
const refs = [...readme.matchAll(/!\[[^\]]*\]\(([^)]+)\)/g)].map((m) => m[1])
|
|
132
|
+
const missing = refs.filter((p) => !/^https?:/i.test(p) && !existsSync(join(HERE, p)))
|
|
133
|
+
ok(refs.length > 0 && missing.length === 0, 'every image the README shows exists in the repository (' + refs.length + ' images)', missing.join(', '))
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
console.log('')
|
|
137
|
+
console.log('=== MARKET METADATA: ' + passed + ' passed, ' + failed + ' failed ===')
|
|
138
|
+
if (failed) { for (const f of failures) console.error(' - ' + f); process.exit(1) }
|
|
139
|
+
console.log('ALL GREEN')
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// Vibe Math V4 架构图生成器(零依赖,纯 Node)
|
|
3
|
+
//
|
|
4
|
+
// node docs/generate_framework_diagram_v4.mjs
|
|
5
|
+
// → 写出 示例图/框架图-v4.svg
|
|
6
|
+
//
|
|
7
|
+
// 与 v5 同一套版式语言(band / card / 图例 / 溢出告警),只是内容换成 v4 的真实机制:
|
|
8
|
+
// · 常驻层:continuable 持久子代理,独立上下文,自主方向;
|
|
9
|
+
// · 框架层:只是媒介 —— 中继留言、沉淀产物、计数表决、管理上下文,**绝不指派任务**;
|
|
10
|
+
// · 数据面:每人一个专属库(本人可写 / 他人只读)+ Shared/ 协作产物 + Verified/ 定论;
|
|
11
|
+
// · 门槛:**全体常驻一致**(全 1 或全 0)才进 Verified/,没有 forced / flat / 近共识收口;
|
|
12
|
+
// · Lean 形式化:formalVerify = off / encourage / require(passed 后审查对象变成"忠实性")。
|
|
13
|
+
//
|
|
14
|
+
// 需要 PNG 时用浏览器打开 SVG 另存,或无头浏览器截图:
|
|
15
|
+
// msedge --headless=new --window-size=1760,1300 --screenshot=框架图-v4.png 框架图-v4.svg
|
|
16
|
+
//
|
|
17
|
+
// 版式约定(改布局时请遵守):
|
|
18
|
+
// · 每个 band 的标题在 y+27、副标题在 y+47,**内容从 y+56 开始**;
|
|
19
|
+
// · 左侧 x=40..218 是「人 / 助手」控制面通道,主内容从 x=230 开始 —— 工具面箭头不穿过成员;
|
|
20
|
+
// · 生成时估算文字宽度,超出容器的行会打印 WARN 并以退出码 1 结束。
|
|
21
|
+
// ============================================================
|
|
22
|
+
import { mkdirSync, writeFileSync } from 'node:fs'
|
|
23
|
+
import { dirname, join } from 'node:path'
|
|
24
|
+
import { fileURLToPath } from 'node:url'
|
|
25
|
+
|
|
26
|
+
const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..')
|
|
27
|
+
const OUT = join(ROOT, '示例图', '框架图-v4.svg')
|
|
28
|
+
|
|
29
|
+
const W = 1720, H = 1260
|
|
30
|
+
const FONT = "'Microsoft YaHei','PingFang SC','Hiragino Sans GB','Noto Sans CJK SC','Source Han Sans SC',sans-serif"
|
|
31
|
+
const MONO = "'Cascadia Mono','Consolas','SFMono-Regular',monospace"
|
|
32
|
+
|
|
33
|
+
const C = {
|
|
34
|
+
ink: '#10202e', ink2: '#2c4557', mute: '#5d7788',
|
|
35
|
+
frame: '#0b6fb8', frameBg: '#eaf3fd',
|
|
36
|
+
house: '#b26a00', houseBg: '#fdf5e2',
|
|
37
|
+
data: '#1f7a52', dataBg: '#eef7f1',
|
|
38
|
+
gate: '#b3202c', gateBg: '#fdeef0',
|
|
39
|
+
human: '#5b4bb8', humanBg: '#f1eefc',
|
|
40
|
+
line: '#7d93a3',
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// 几何:左侧控制通道 40..218;主内容 230..1680
|
|
44
|
+
const FULL_L = 40, FULL_R = 1680
|
|
45
|
+
const MAIN_L = 230, MAIN_R = 1680
|
|
46
|
+
const IN_L = MAIN_L + 22, IN_R = MAIN_R - 22 // 252 .. 1658
|
|
47
|
+
|
|
48
|
+
const warnings = []
|
|
49
|
+
const esc = (s) => String(s).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')
|
|
50
|
+
const textWidth = (s, fs) => [...String(s)].reduce((n, ch) => n + (/[\u2e80-\u9fff\uff00-\uffef]/.test(ch) ? 1 : 0.56), 0) * fs
|
|
51
|
+
const fits = (s, fs, limit, where) => {
|
|
52
|
+
const w = textWidth(s, fs)
|
|
53
|
+
if (w > limit) warnings.push(`${where}: 文字宽 ${w.toFixed(0)} > 可用 ${limit.toFixed(0)} — ${String(s).slice(0, 42)}…`)
|
|
54
|
+
return w
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const out = []
|
|
58
|
+
const push = (s) => out.push(s)
|
|
59
|
+
|
|
60
|
+
function band(x, y, w, h, title, sub, { fill, stroke, titleFill = C.ink } = {}) {
|
|
61
|
+
push(`<rect x="${x}" y="${y}" width="${w}" height="${h}" rx="14" fill="${fill}" stroke="${stroke}" stroke-width="2"/>`)
|
|
62
|
+
fits(title, 15, w - 36, 'band title')
|
|
63
|
+
push(`<text x="${x + 18}" y="${y + 27}" font-size="15" font-weight="700" fill="${titleFill}">${esc(title)}</text>`)
|
|
64
|
+
if (sub) {
|
|
65
|
+
fits(sub, 12, w - 36, 'band sub')
|
|
66
|
+
push(`<text x="${x + 18}" y="${y + 47}" font-size="12" fill="${C.mute}">${esc(sub)}</text>`)
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function card(x, y, w, h, lines, { fill = '#ffffff', stroke = C.frame, fs = 13, sfs = 11, titleFill = C.ink } = {}) {
|
|
71
|
+
push(`<rect x="${x}" y="${y}" width="${w}" height="${h}" rx="10" fill="${fill}" stroke="${stroke}" stroke-width="1.6"/>`)
|
|
72
|
+
const cx = x + w / 2
|
|
73
|
+
const lead = fs + 4
|
|
74
|
+
const total = (lines.length - 1) * lead
|
|
75
|
+
if (total + fs > h) warnings.push(`card@${x},${y}: ${lines.length} 行需要高 ${(total + fs).toFixed(0)} > 容器 ${h}`)
|
|
76
|
+
let ty = y + h / 2 - total / 2 + fs * 0.36
|
|
77
|
+
lines.forEach((ln, i) => {
|
|
78
|
+
const size = i === 0 ? fs : sfs
|
|
79
|
+
fits(ln, size, w - 16, `card line@${x},${y}`)
|
|
80
|
+
push(`<text x="${cx}" y="${ty.toFixed(1)}" font-size="${size}" font-weight="${i === 0 ? 700 : 400}" `
|
|
81
|
+
+ `fill="${i === 0 ? titleFill : C.ink2}" text-anchor="middle">${esc(ln)}</text>`)
|
|
82
|
+
ty += lead
|
|
83
|
+
})
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function plain(x, y, text, { size = 12, fill = C.ink2, anchor = 'start', weight = 400, mono = false, limit = null, where = 'plain', halo = false } = {}) {
|
|
87
|
+
if (limit) fits(text, size, limit, where)
|
|
88
|
+
push(`<text x="${x}" y="${y}" font-size="${size}" font-weight="${weight}" fill="${fill}" text-anchor="${anchor}"`
|
|
89
|
+
+ (halo ? ' paint-order="stroke" stroke="#ffffff" stroke-width="4" stroke-linejoin="round"' : '')
|
|
90
|
+
+ (mono ? ` font-family="${MONO}"` : '') + `>${esc(text)}</text>`)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function arrow(x1, y1, x2, y2, { color = C.line, dashed = false, both = true, width = 1.6, marker = 'both' } = {}) {
|
|
94
|
+
push(`<line x1="${x1}" y1="${y1}" x2="${x2}" y2="${y2}" stroke="${color}" stroke-width="${width}" `
|
|
95
|
+
+ (dashed ? 'stroke-dasharray="7 5" ' : '')
|
|
96
|
+
+ (both ? `marker-start="url(#${marker})" ` : '') + `marker-end="url(#${marker})"/>`)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function polyline(points, { color = C.human, width = 2, dashed = false, marker = 'bothHuman' } = {}) {
|
|
100
|
+
const d = points.map((p, i) => (i ? 'L' : 'M') + ' ' + p[0] + ' ' + p[1]).join(' ')
|
|
101
|
+
push(`<path d="${d}" fill="none" stroke="${color}" stroke-width="${width}" `
|
|
102
|
+
+ (dashed ? 'stroke-dasharray="7 5" ' : '') + `marker-start="url(#${marker})" marker-end="url(#${marker})"/>`)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// ---------- document ----------
|
|
106
|
+
push('<?xml version="1.0" encoding="UTF-8"?>')
|
|
107
|
+
push(`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${W} ${H}" width="${W}" height="${H}" role="img" aria-label="Vibe Math V4 常驻自组织架构图">`)
|
|
108
|
+
push(`<defs>
|
|
109
|
+
<marker id="both" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M 0 0 L 10 5 L 0 10 z" fill="${C.line}"/></marker>
|
|
110
|
+
<marker id="bothHuman" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M 0 0 L 10 5 L 0 10 z" fill="${C.human}"/></marker>
|
|
111
|
+
<marker id="bothFrame" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M 0 0 L 10 5 L 0 10 z" fill="${C.frame}"/></marker>
|
|
112
|
+
<marker id="bothData" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M 0 0 L 10 5 L 0 10 z" fill="${C.data}"/></marker>
|
|
113
|
+
<marker id="bothHouse" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M 0 0 L 10 5 L 0 10 z" fill="${C.house}"/></marker>
|
|
114
|
+
<marker id="bothGate" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M 0 0 L 10 5 L 0 10 z" fill="${C.gate}"/></marker>
|
|
115
|
+
</defs>`)
|
|
116
|
+
push(`<rect width="${W}" height="${H}" fill="#ffffff"/>`)
|
|
117
|
+
push(`<g font-family="${FONT}">`)
|
|
118
|
+
|
|
119
|
+
// ---- 标题 ----
|
|
120
|
+
plain(W / 2, 40, 'Vibe Math V4 —— 常驻自组织合作研究', { size: 27, fill: C.ink, anchor: 'middle', weight: 700 })
|
|
121
|
+
plain(W / 2, 67, '框架只是媒介:中继留言 · 沉淀产物 · 计数表决 · 管理上下文。它绝不分配任务 —— 分工由常驻之间留言与开会决定',
|
|
122
|
+
{ size: 13, fill: C.mute, anchor: 'middle', limit: W - 80, where: 'subtitle' })
|
|
123
|
+
|
|
124
|
+
// ---- 定论门槛 ----
|
|
125
|
+
band(FULL_L, 84, FULL_R - FULL_L, 92, '定论门槛 —— 唯一让对象进入 Verified/ 的规则',
|
|
126
|
+
'全体常驻一致为真(全 1)或一致为假(全 0) · 没有任何 forced / flat / 近共识自动收口 —— 强分歧不得被强行判真',
|
|
127
|
+
{ fill: C.gateBg, stroke: C.gate, titleFill: C.gate })
|
|
128
|
+
card(62, 140, 506, 28, ['全体一致为真 → 写入 Verified/命题|问题/<id>.md,回写来源库状态 = 已验证·真'], { stroke: C.gate, fs: 11.5 })
|
|
129
|
+
card(588, 140, 506, 28, ['全体一致为假 → 同样写入 Verified/(结论 = 假),来源库状态 = 已验证·假'], { stroke: C.gate, fs: 11.5 })
|
|
130
|
+
card(1114, 140, 524, 28, ['出现分歧 → 公开辩论重评;仍未全票 → 留库 + 全组平均概率 + 完整辩论录'], { stroke: C.gate, fs: 11.5 })
|
|
131
|
+
|
|
132
|
+
// ---- 常驻层 ----
|
|
133
|
+
band(MAIN_L, 188, MAIN_R - MAIN_L, 150, '常驻层(所内自治)—— 编制、方向与分工都在常驻之间完成,框架永不指派',
|
|
134
|
+
'起始 brainstorm 产出各自方向 · 此后持续工作直到"全体认为已解决"(会议全票同意) · 可增开 / 关闭常驻',
|
|
135
|
+
{ fill: C.houseBg, stroke: C.house, titleFill: '#8a5200' })
|
|
136
|
+
{
|
|
137
|
+
const cw = (IN_R - IN_L - 3 * 18) / 4
|
|
138
|
+
const residents = [
|
|
139
|
+
['常驻 r-1', 'continuable 持久会话', '独立上下文 · 自主方向', '只写自己的库', '跨读他人的库(只读)'],
|
|
140
|
+
['常驻 r-2', 'continuable 持久会话', '独立上下文 · 自主方向', '只写自己的库', '跨读他人的库(只读)'],
|
|
141
|
+
['常驻 r-3', 'continuable 持久会话', '独立上下文 · 自主方向', '只写自己的库', '跨读他人的库(只读)'],
|
|
142
|
+
['… r-N', 'add_member / remove_member', 'residentCount 默认 4', '唤醒 = sendMessage', '一轮 = 一次完整思考'],
|
|
143
|
+
]
|
|
144
|
+
residents.forEach((lines, i) => card(IN_L + i * (cw + 18), 246, cw, 88, lines, { stroke: C.house, fs: 13, sfs: 10.5 }))
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// ---- 人 / 助手(左侧控制通道)----
|
|
148
|
+
card(FULL_L + 2, 188, 176, 150, [
|
|
149
|
+
'人 / 助手',
|
|
150
|
+
'会话根代理 = 接口',
|
|
151
|
+
'configure → start',
|
|
152
|
+
'message / meeting',
|
|
153
|
+
'add_member / remove_member',
|
|
154
|
+
'pause / resume / abort',
|
|
155
|
+
'set 调参(立即生效)',
|
|
156
|
+
], { stroke: C.human, fs: 12, sfs: 10 })
|
|
157
|
+
|
|
158
|
+
// ---- 框架 ----
|
|
159
|
+
band(MAIN_L, 400, MAIN_R - MAIN_L, 384, '框架 vibe-v4 —— 只是媒介(middleware):中继 · 沉淀 · 计数 · 调度',
|
|
160
|
+
'每轮发「状态块 + 本轮问句」;常驻回一个 JSON:summary / solved / input / vote / propose_verify / propose_task / claim_task / task_done / voteSolved / formal / contextPct',
|
|
161
|
+
{ fill: C.frameBg, stroke: C.frame, titleFill: '#084d80' })
|
|
162
|
+
const chips = [
|
|
163
|
+
['消息总线 · 邮件箱', 'vibe_v4_message(to|all) → 入目标邮箱', '空闲则 sendMessage 唤醒;常驻之间不直接互调', '全靠框架 relay(模拟收件箱)· 支持广播'],
|
|
164
|
+
['会议 / 辩论', 'vibe_v4_meeting(agenda) → 全体发言', '写 Shared/meetings/<id>.md 并广播结论', '看门狗防死锁 · 与验证互斥(排队,不抢占)'],
|
|
165
|
+
['任务板(只搬运)', '提议 / 认领写在回执里 → Shared/taskboard.md', '认领后被唤醒;框架不决定谁做什么', 'open 任务在空闲时常驻的唤醒顺序里优先'],
|
|
166
|
+
['共识验证(全票)', '回执字段 propose_verify → FIFO 排队', '独立初评(互不可见)→ 公开辩论重评', '最多 verdictMaxRounds 轮(默认 3);全票同向才入 Verified/'],
|
|
167
|
+
['上下文 / compact', 'contextPct ≥ compactThreshold(默认 66)', '触发 DSH /compact;压缩后重申核心规则', 'compactAfterRounds 默认 8;人设与哲学不丢'],
|
|
168
|
+
['活性 / 并发 / 恢复', 'activityTimeoutMs 心跳 · maxParallel 并发闸', '停滞 stallAutoMeetingMs(默认 6 min)自动开会', 'resume 用 residents.json + progress.md 重种化'],
|
|
169
|
+
]
|
|
170
|
+
const ccw = (IN_R - IN_L - 2 * 22) / 3
|
|
171
|
+
chips.forEach((c, i) => {
|
|
172
|
+
card(IN_L + (i % 3) * (ccw + 22), i < 3 ? 462 : 548, ccw, 76, c, { stroke: C.frame, fs: 12.5, sfs: 10.5 })
|
|
173
|
+
})
|
|
174
|
+
card(IN_L, 636, IN_R - IN_L, 84, [
|
|
175
|
+
'Lean 形式化验证(可调参数 formalVerify = off / encourage / require)· 工具 vibe_v4_lean_run / _archive / _lib',
|
|
176
|
+
'encourage:按实现难度自行决定是否形式化;require:真/假结论必须先有「Lean 通过」或显式阻塞记录,否则记为未定论',
|
|
177
|
+
'★ 一旦 Lean 通过,审查对象就变了:不再是「推导对不对」,而是「Lean 的定义/对象/条件/假设/结论是否忠实于命题原文」',
|
|
178
|
+
'★ 忠实性缺陷(decision=defect)≠ 命题为假:撤回「已通过」+ 撤回归档证明 + 进「形式化待办」,绝不记成 0/假',
|
|
179
|
+
], { stroke: C.gate, fs: 12, sfs: 10.5 })
|
|
180
|
+
card(IN_L, 732, IN_R - IN_L, 40, [
|
|
181
|
+
'subagent/end 之后框架按序推进:① 邮箱非空 → 唤醒非忙收件人 ② open 任务 → 唤醒提议人/认领人 ③ 待验证提议 → 开会 ④ 否则心跳:唤醒最久未活跃者并给它开会',
|
|
182
|
+
], { stroke: C.frame, fs: 11 })
|
|
183
|
+
|
|
184
|
+
// ---- 数据面 ----
|
|
185
|
+
const dw = (MAIN_R - MAIN_L - 2 * 20) / 3
|
|
186
|
+
band(MAIN_L, 816, dw, 250, '常驻专属库(每人一个目录)',
|
|
187
|
+
'本人可写 · 他人只读(跨读被鼓励)—— 直接经 fs 写入,框架只登记',
|
|
188
|
+
{ fill: C.dataBg, stroke: C.data, titleFill: '#125a3c' })
|
|
189
|
+
card(IN_L, 872, dw - 44, 176, [
|
|
190
|
+
'Progress/<r-id>/progress.md',
|
|
191
|
+
'本人持续进展(追加式,断点续跑靠它重种化)',
|
|
192
|
+
'',
|
|
193
|
+
'Propos/<r-id>/<p-id>.md 命题',
|
|
194
|
+
'Methods/<r-id>/<m-id>.md 理论 / 方法 / 工具',
|
|
195
|
+
'Subproblems/<r-id>/<s-id>.md 子问题',
|
|
196
|
+
'',
|
|
197
|
+
'每条记录必填:价值程度 / 动机用途计划 / 自身概率估计',
|
|
198
|
+
], { stroke: C.data, fs: 11.5, sfs: 10.5 })
|
|
199
|
+
|
|
200
|
+
const B2 = MAIN_L + dw + 20
|
|
201
|
+
band(B2, 816, dw, 250, '共享与定论(VibeMath/Projects/<project>/)',
|
|
202
|
+
'Shared/ 是协作产物;Verified/ 是唯一定论,写入后只读',
|
|
203
|
+
{ fill: C.dataBg, stroke: C.data, titleFill: '#125a3c' })
|
|
204
|
+
card(B2 + 22, 872, dw - 44, 176, [
|
|
205
|
+
'Shared/meetings/<id>.md 会议录 + 结论',
|
|
206
|
+
'Shared/debates/<target>.md 辩论录(初评 + 重评)',
|
|
207
|
+
'Shared/taskboard.md 任务板(提议 / 认领)',
|
|
208
|
+
'Shared/meetings/brainstorm.md 起始头脑风暴',
|
|
209
|
+
'',
|
|
210
|
+
'Verified/命题/<id>.md (或 问题/、方法→可信断言)',
|
|
211
|
+
'Problems/<id>.md 原问题陈述',
|
|
212
|
+
'未全票 → 留在来源库 + 平均概率 + 辩论录',
|
|
213
|
+
], { stroke: C.data, fs: 11.5, sfs: 10.5 })
|
|
214
|
+
|
|
215
|
+
const B3 = B2 + dw + 20
|
|
216
|
+
band(B3, 816, MAIN_R - B3, 250, '状态 / 隔离 / 恢复',
|
|
217
|
+
'框架自己的状态:注册表、邮件箱、锁、进程纪元',
|
|
218
|
+
{ fill: C.dataBg, stroke: C.data, titleFill: '#125a3c' })
|
|
219
|
+
card(B3 + 22, 872, MAIN_R - B3 - 44, 176, [
|
|
220
|
+
'State/residents.json 常驻注册表',
|
|
221
|
+
'State/mailboxes.json 邮件箱(谁还没读)',
|
|
222
|
+
'State/taskboard.json 任务板机器态',
|
|
223
|
+
'State/decisions.json 关键决策留痕',
|
|
224
|
+
'State/session.json 活动日志(人可读)',
|
|
225
|
+
'State/settings.json 参数(set 立即生效)',
|
|
226
|
+
'State/formal.json Lean 形式化记录(非 off 档)',
|
|
227
|
+
'fileOwner 写锁 · projectLock · processEpoch · abort→resume',
|
|
228
|
+
], { stroke: C.data, fs: 11.5, sfs: 10.5 })
|
|
229
|
+
|
|
230
|
+
// ---- 哲学红线 ----
|
|
231
|
+
band(MAIN_L, 1102, MAIN_R - MAIN_L, 118, '哲学红线(不可协商)',
|
|
232
|
+
'这五条是设计本体,不是实现细节;改它们等于换一个架构',
|
|
233
|
+
{ fill: C.gateBg, stroke: C.gate, titleFill: C.gate })
|
|
234
|
+
{
|
|
235
|
+
const red = [
|
|
236
|
+
['框架绝不指派任务', '方向 / 分工 / 谁做什么', '只能由常驻留言与开会决定'],
|
|
237
|
+
['定论必须全体一致', '没有 forced / flat / 近共识收口', '强分歧只能留在库里'],
|
|
238
|
+
['只有 Verified/ 绝对可信', '其余(方法库未验证断言等)', '只作经验参考'],
|
|
239
|
+
['常驻不直接互调', '留言一律经框架 relay', '(模拟收件箱,先落盘再投递)'],
|
|
240
|
+
['人工干预不改变自组织', '留言 / 开会 / 增删成员都可用', '但"之后怎么做"仍由常驻决定'],
|
|
241
|
+
]
|
|
242
|
+
const rw = (IN_R - IN_L - 4 * 16) / 5
|
|
243
|
+
red.forEach((lines, i) => card(IN_L + i * (rw + 16), 1158, rw, 56, lines, { stroke: C.gate, fs: 11.5, sfs: 10 }))
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// ---- 连线:人 / 助手 ↔ 框架(左侧通道,不穿过常驻)----
|
|
247
|
+
const CHX = 129
|
|
248
|
+
polyline([[CHX, 338], [CHX, 470], [MAIN_L, 470]], { color: C.human, width: 2 })
|
|
249
|
+
plain(CHX, 384, '工具面', { fill: C.human, anchor: 'middle', size: 12, weight: 700, halo: true })
|
|
250
|
+
plain(CHX, 404, 'vibe_v4_*', { fill: C.human, anchor: 'middle', size: 11, halo: true })
|
|
251
|
+
plain(CHX, 422, '/v4 命令', { fill: C.human, anchor: 'middle', size: 11, halo: true })
|
|
252
|
+
plain(CHX, 446, '↓', { fill: C.human, anchor: 'middle', size: 13, weight: 700, halo: true })
|
|
253
|
+
plain(CHX, 506, '汇报', { fill: C.human, anchor: 'middle', size: 12, weight: 700, halo: true })
|
|
254
|
+
plain(CHX, 526, 'status', { fill: C.human, anchor: 'middle', size: 11, halo: true })
|
|
255
|
+
plain(CHX, 544, 'report', { fill: C.human, anchor: 'middle', size: 11, halo: true })
|
|
256
|
+
plain(CHX, 572, '↑', { fill: C.human, anchor: 'middle', size: 13, weight: 700, halo: true })
|
|
257
|
+
|
|
258
|
+
// ---- 连线:常驻 ↔ 框架(提示词 / 回执)----
|
|
259
|
+
arrow(600, 338, 600, 400, { color: C.frame, marker: 'bothFrame', width: 2 })
|
|
260
|
+
arrow(1360, 338, 1360, 400, { color: C.frame, marker: 'bothFrame', width: 2 })
|
|
261
|
+
plain(980, 366, '↑ 每轮提示词(状态块 + 本轮问句) ↓ 单个 JSON 回执',
|
|
262
|
+
{ fill: C.frame, anchor: 'middle', size: 10.5, limit: 700, where: 'prompt label', halo: true })
|
|
263
|
+
plain(980, 386, 'say / progress / record_* / propose_verify / verdict / vote_solved / input / reject_assign / task_done',
|
|
264
|
+
{ fill: C.mute, anchor: 'middle', size: 9.5, limit: 760, where: 'prompt fields', halo: true })
|
|
265
|
+
|
|
266
|
+
// ---- 连线:框架 ↔ 数据面 ----
|
|
267
|
+
arrow(560, 784, 560, 816, { color: C.data, marker: 'bothData', width: 2 })
|
|
268
|
+
plain(552, 806, '沉淀 / 记录 / 唤醒', { fill: C.data, anchor: 'end', size: 10.5, halo: true })
|
|
269
|
+
arrow(1180, 784, 1180, 816, { color: C.gate, marker: 'bothGate', width: 2, dashed: true })
|
|
270
|
+
plain(1188, 806, '未全票 → 留库附概率(虚线)', { fill: C.gate, anchor: 'start', size: 10.5, halo: true })
|
|
271
|
+
|
|
272
|
+
// ---- 图例 ----
|
|
273
|
+
plain(52, 1246, '图例', { size: 12, fill: C.ink, weight: 700 })
|
|
274
|
+
const legend = [
|
|
275
|
+
[C.human, '人 / 助手(外部接口,不研究不投票)'],
|
|
276
|
+
[C.house, '常驻子代理(有表决权 · 自主方向)'],
|
|
277
|
+
[C.frame, '框架(中继 / 沉淀 / 计数 / 调度)'],
|
|
278
|
+
[C.data, '产物与状态(常驻专属库 / Shared / State)'],
|
|
279
|
+
[C.gate, '定论门槛 / Lean 形式化(可调)'],
|
|
280
|
+
]
|
|
281
|
+
legend.forEach(([col, txt], i) => {
|
|
282
|
+
const x = 108 + i * 330
|
|
283
|
+
push(`<rect x="${x}" y="1235" width="14" height="14" rx="3" fill="#ffffff" stroke="${col}" stroke-width="2"/>`)
|
|
284
|
+
plain(x + 21, 1247, txt, { size: 11, fill: C.ink2, limit: 305, where: 'legend' })
|
|
285
|
+
})
|
|
286
|
+
|
|
287
|
+
push('</g>')
|
|
288
|
+
push('</svg>')
|
|
289
|
+
|
|
290
|
+
mkdirSync(dirname(OUT), { recursive: true })
|
|
291
|
+
const svg = out.join('\n')
|
|
292
|
+
writeFileSync(OUT, svg, 'utf8')
|
|
293
|
+
console.log('saved ' + OUT + ' (' + svg.length + ' bytes)')
|
|
294
|
+
if (warnings.length) {
|
|
295
|
+
console.error('\n布局告警(文字可能溢出容器):')
|
|
296
|
+
for (const w of warnings) console.error(' WARN ' + w)
|
|
297
|
+
process.exit(1)
|
|
298
|
+
}
|
|
299
|
+
console.log('layout: no overflow warnings')
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
// node docs/generate_framework_diagram_v5.mjs
|
|
5
5
|
// → 写出 示例图/框架图-v5.svg
|
|
6
6
|
//
|
|
7
|
-
// v2/v3
|
|
7
|
+
// v2/v3 用 matplotlib 脚本生成 PNG;v4/v5 用 Node 直接生成 **SVG**:
|
|
8
8
|
// · 本仓库的运行时就包含 Node,不需要额外装 Python / matplotlib;
|
|
9
9
|
// · SVG 是纯文本,diff 友好、可评审、任意缩放不糊。
|
|
10
10
|
// 需要 PNG 时用浏览器打开 SVG 另存,或用无头浏览器截图:
|
package/package.json
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-vibe-math",
|
|
3
3
|
"description": "Multi-agent mathematical problem-solving & verification frameworks for DeepSeek Harness — FOUR agent presets in one install: vibe-math-v2 (probability-driven: qs.json + Propos knowledge base + explorer→solver→review/debate verdict), vibe-math-v3 (THIRD-generation, recommended: paper-style Markdown knowledge base with Problems/Progress/Propos/Methods/Verified + planner-agent scheduling that decides the next N actions + universal theory/method invention library + agents write their own Markdown directly via a per-file write lock), and vibe-math-v4 (FOURTH-generation: persistent self-organizing resident subagents that message & meet to decide all tasks, verify only by unanimous consensus, /compact at a context threshold, and stop only when all agree the problem is solved), and vibe-math-v5 (FIFTH-generation research institute: an academician as the organizational centre who decomposes and ASSIGNS work and chairs meetings; permanent researchers who hold the vote and may hire/fire their own temp workers; temp workers with no vote; a group chat and meetings; a durable per-recipient mailbox; a compare-and-set task DAG; and a boolean m-vote consensus rule where an object enters Verified/ only when at least m voting members agree AND every one of them returns exactly 1 or exactly 0). Installing this bundle auto-installs all four presets (v1 was removed at v2.0.0).",
|
|
4
|
-
"version": "2.3.
|
|
4
|
+
"version": "2.3.10",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
7
|
-
"node": "^22.19.0 || >=24.0.0"
|
|
7
|
+
"node": "^22.19.0 || >=24.0.0",
|
|
8
|
+
"dsh": ">=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"
|
|
8
9
|
},
|
|
9
10
|
"main": "installer.js",
|
|
10
11
|
"exports": {
|
|
@@ -44,6 +45,8 @@
|
|
|
44
45
|
"RELEASE-NOTES-2.3.6.md",
|
|
45
46
|
"RELEASE-NOTES-2.3.7.md",
|
|
46
47
|
"RELEASE-NOTES-2.3.8.md",
|
|
48
|
+
"RELEASE-NOTES-2.3.9.md",
|
|
49
|
+
"RELEASE-NOTES-2.3.10.md",
|
|
47
50
|
"selfdrive-v5.mjs",
|
|
48
51
|
"示例图/框架图-v5.svg",
|
|
49
52
|
"docs/架构图.md",
|
|
@@ -77,7 +80,11 @@
|
|
|
77
80
|
"vibe-math-v5/实现方案.md",
|
|
78
81
|
"vibe-math-v5/agent.cordis.yml",
|
|
79
82
|
"vibe-math-v5/preset.yml",
|
|
80
|
-
"vibe-math-v5/vibe-math-v5.js"
|
|
83
|
+
"vibe-math-v5/vibe-math-v5.js",
|
|
84
|
+
"docs/generate_framework_diagram_v4.mjs",
|
|
85
|
+
"示例图/框架图-v4.svg",
|
|
86
|
+
"screenshots.json",
|
|
87
|
+
"audit-market-metadata.test.mjs"
|
|
81
88
|
],
|
|
82
89
|
"license": "MIT",
|
|
83
90
|
"keywords": [
|
|
@@ -107,7 +114,7 @@
|
|
|
107
114
|
},
|
|
108
115
|
"minVersion": "0.1.2-rc.1",
|
|
109
116
|
"testedVersion": "0.1.5-rc.2",
|
|
110
|
-
"compatNote": "v2.3.8 是纯文档版(无代码、无预设字节变化):把 round 7/8 的结论写进共享契约与强制审计流程,免得下一轮审计重新把它当新问题或按另一种方式改 —— ① docs/formal-verification.md §4 补两条边界:记录与归档文件在框架侧\"同生共死\",但**外部**删除 Verified/Lean/<id>.lean 不会自动降级记录(passed 是状态文件里的权威状态,门禁查询只读、不做文件存在性探测),人工动过文件后请一并修正记录或重新归档;v2 的 id 映射同理,记录里持久化的 objectId 必须**自洽**(不以 r- 开头)才被采纳。② AUDIT-CHECKLIST §1.10 补一条检查项「从用户可编辑的状态文件里读出来的『权威值』是否先做了自洽校验」,并写入 2.3.7 的真实事故。③ v2 实现方案 §9.3 同步该自洽条件。v2.3.7 是 round 8:把 2.3.6 新引入的「记录里持久化权威 objectId」这条机制自己审一遍。2.3.6 让 formalObjectIdOf 在任务表不可用时读记录里的 objectId(跨 resume 生效),但状态文件是可编辑的(VibeMath_State/formal.json,仓库里本来就有\"文件被改坏也要能继续\"的守卫测试):若某条记录的 objectId 自己就是 r 形(r-pX),\"验证 id → 对象 id\"就会映射到它自己,于是 putFormalBothIds 认为两侧是同一个 id、只写验证侧,对象侧仍然 passed —— 又回到\"成对关系只做一半\"的静默错位。触发路径已实测:工作轮回执(explorer/solver 回执同样带 formal)在没有验证任务在内存时走\"读记录锚点\"这条兜底路径。修复:读取锚点与写入锚点都要求\"锚点自洽\"(formalObjectIdOfIsOwner:不以 r- 开头、不可能再被解析成别的 id)。写入侧的两道守卫目前无法用用例证明必要性(现有写入者手里的值都来自 formalObjectIdOf,本身不会是 r 形;我一度写的\"归档写在 rId 上会污染锚点\"的用例实测恒真,已删除),因此按纵深防御保留并如此标注;真正被证明有效的是读取侧守卫。新增 5 条断言(formal-verify-v2 第 14d 节):手改出的 r 形锚点 + 工作轮回执点名 r-pX 报 defect → 对象侧必须被降级(锚点被拒绝而不是被信任)、验证侧同样降级。灵敏度实测(_oneoff/probe-v2-anchor-guard.mjs):去掉读取侧守卫 → 该用例立刻变红,装回 → 全绿。套件 348 → 353。v2.3.6 修复 2.3.2 审计中记录为「存疑、需契约决策」的那条 id 解析歧义 —— round 7 先把它做成可复现用例,确认不是理论问题而是真实可达的数据破坏:v2 有两套 id(对象 id 与验证 rId),二者靠唯一一处 formalObjectIdOf 转换,而它无条件剥离 -sN/-pfN/-rfN 后缀;但对象 id 本身就可能以 -s1 结尾(命题 pAmb-s1 的验证 id 是 r-pAmb-s1),映射于是得到 pAmb —— 另一个对象。实测(修前 6 条断言变红):忠实性提示词打印的是邻居 pAmb 的证明路径;一句 formal:{target:「r-pAmb-s1」,decision:「defect」} 会把 pAmb 降级为 attempted,并**撤回 Verified/Lean/pAmb.lean**(一句关于 A 的回执删掉 B 的归档证明,不可逆);而真正有问题的 pAmb-s1 仍然是 passed、TODO 里也没有它。修复:formalObjectIdOf 改为按权威度取来源 —— ① 验证任务自己的所有者(tasks[verify:+rId].r.pId|qid,框架生成 rId 时就知道对象是谁);② 记录里的 objectId(由 syncVerificationTarget 与 putFormalBothIds 在手里确实有对象 id 时写入,因此跨 resume、任务表尚未重建时也正确);③ 只有两者都不可用时才回退到字符串后缀解析。v3/v4/v5 不受影响(没有第二套 id 空间,验证直接以对象 id 为键,已核对 formalId/formalOf 只做 idSafe)。新增 14 条行为断言(formal-verify-v2 第 14c 节):两个同前缀对象各自有自己的证明;对 r-pAmb-s1 的忠实性提示词必须指向它自己的证明;defect 必须降级并撤回它自己的证明、TODO 写它;邻居 pAmb 必须仍是 passed 且其归档证明文件分毫未动;验证记录里必须写着权威所有者 objectId。套件 334 → 348。v2.3.5 是 round 5:把\"注释/字符串扫描器\"这一类缺陷追到所有自带扫描器的脚本上。audit-v5-integrity.mjs(静态自检:调用了但未定义的函数 / 未声明的 params.X 读取 / 会话 API 上不存在的方法 / 遗留开发标记)的 stripNoise() 完全不认正则字面量,而 v5 源码里有一个字符类带双引号的 sanitize 正则,那个引号被当成字符串开头。实测(旧 vs 新逐行比对,v5 共 4365 行):30 行不一致(都是含\"字符类里有引号\"的正则的行),抹除后的文本无法通过 node --check;本次没有任何调用名 / params.* 读取 / s.*() 方法被漏掉,所以是潜在盲区而非已发生的漏检 —— 但只要某个被检查的标识符恰好只出现在这种行上就会完全隐形。现把 stripNoise() 升级为与 audit-prompt-invariants.mjs 同一套词法处理(正则字面量 + 字符类 + 转义 + flags + 关键字规则),正则与字符串统一替换为值占位符;并给该审计加上解析级自检:抹除后的 v5 源码必须仍能被 node --check 解析,且\"引号在字符类里的正则 + 紧随其后的注释\"夹具必须完好。灵敏度实测:把旧扫描器放回去,审计立刻报 stripNoise() corrupted the source it scans(exit 1),换回新版则 clean;39 条 v5 灵敏度探针仍全红。(过程教训:第一版测量用\"文件里下一个引号\"估算受影响区域,得出\"402 行 / 20 个函数\"的错误结论;该扫描器遇到换行即结束字符串,真实影响是 30 行。发布前逐行复核才发现并改正 —— 先量准再下结论。)v2.3.4 是 round 4:只审上一轮改动过的东西(2.3.3 修好的注释扫描器 —— 它是 I1/I13/I14 三条不变式的地基 —— 与它新增的 X5–X7 自检)。扫描器还剩一个盲区:判据\"这个斜杠是正则还是除法\"只看前一个字符,于是关键字后面的正则被读成除法 —— 而 v3 源码里真有 return /^\\s*import\\s+/.test(l) 与 return /\\n$/.test(out) 两处;这两处字符类里恰好没有引号所以今天还没坏,但只要有人在 return /…/ 的正则里写一个引号(如 return /[\"']/.test(s)),扫描器就会把那个引号当成字符串开头、此后整个文件词法状态都是错的,又回到 2.3.2 修掉的坑。现把判据从\"前一个字符\"升级为\"前一个记号\":除运算符/开括号外,return/typeof/case/delete/void/instanceof/in/of/yield/await/new/do/else 之后也按正则解析,标识符、右括号、右方括号之后仍按除法。并新增解析级判据 X8/X8b:X8 要求四套源码\"抹掉注释\"之后的产物仍能被 node --check 解析(扫描器读错代码时产物往往直接语法错误);X8b 是专测关键字规则的夹具(return /[\"']/.test(l) + 紧随其后的注释)。灵敏度已实测:2.3.2 的扫描器让四个预设全部 SyntaxError(X8 红),2.3.3 的扫描器 X8 绿但 X8b 红(紧随其后的注释没被抹掉),当前版本两者皆绿 —— 即 X8 守住大回退、X8b 守住这个窄口子,2.3.3 的扫描器会被 X8b 判红。不变式 151 → 157。本版只改随包发布的审计脚本与文档,四套预设字节未变。依赖宿主提供的 subagents/agents/tools/commands/fs 服务与 @deepseek-ai/dsh-* 插件行;可选 subprocess/sandboxPolicy/compaction。persona 行同时携带 prefix 与 text 两个键,以兼容 0.1.3-alpha.2 的 schema 更名(prefix 必填)与 0.1.2 及更早的 text 键。已在 dsh-v0.1.5-rc.2(@deepseek-ai/dsh-persona 0.1.5-rc.2)上逐行校验全部预设行并通过(v2/v3/v4;v1 已于 v2.0.0 移除)。注意:DSH 0.1.2 起 subagents.startContinuable 的 agentOptions/toolFilter 需要宿主 provider 声明对应 capability(spawn/fork 进程内 provider 均支持),安装器启动时会做能力自检并在旧版宿主上告警。2026 兼容性修复:v2/v3 工具权限名表原先硬编码 web/fetch/bash(未注册名会使 tools.restrict() 抛错、子代理无法建立),现按真实注册名并加带守卫的重试;v4 真实 /compact 原先在 subagent/end 里查 agents.get()(该事件触发时子代理已移出注册表,属死代码),现改为在 subagent/start 捕获 Agent 引用;三套预设的可选服务改为惰性读取,不再在 apply() 快照;v4 的 tools/commands 注册补入 ctx.effect;安装器自检新增 subprocess/sandboxPolicy/compaction。v2.1.0 新增 v5 研究所体系:状态存于宿主 host-only 会话投影单元(键 vibeMathV5),因此自检新增 sessionProjections/sessions(均为可选;缺失时 v5 回退到加固 JSON 状态文件)。v5 不依赖任何 npm 实验包,纯 preset 内单文件实现。v2.3.3 是 2.3.2 之后的确认轮(重新审计改动过的每一处:四套插件、四套套件、共享契约,以及审计脚本自身),修掉一处真实缺陷与两处同类/字面问题:① v2 的 formal.decision=used 回执**无条件**把记录写成 attempted —— 一句「这一轮碰了形式化」会把已经 passed 的对象在两个 id 空间上一起降级,而 proof 指针仍留着(记录自相矛盾),后果是后续审查提示词丢掉忠实性分支、require 档对一份已跑通的归档证明重新关门并把对象丢进形式化待办;现改为先取合并后的记录状态(formalGateRecord,两套 id 都认),passed/blocked 一律保留,只有从未尝试起步才写 attempted(与 v4 的 formalSetRun 缺陷同类,只是长在回执通道上且只长在一套里)。② v3 的 used 分支只保留 passed(prev.status === passed ? passed : attempted),会把 blocked 打回 attempted —— blocked 本身就是「门禁已放行」的记录,一句 used 就把门禁重新关上;现两者都保留,四套同构。③ 共享契约 docs/formal-verification.md §4 迁移表有两行与实现相反(used 行与两行 lean_run 都写成「→ attempted」),而规范文档写反最危险之处是下一次修改会照它写(2.3.2 修好 v2 后若只读契约就会把修复改回去);现已改正为「已是 passed/blocked 则保持原状」,并补上「lean_archive kind=proof 但运行失败 → attempted + 清空 proof + 撤回旧归档证明」这一行,四套实现方案与 v5 规格同步,audit-spec-traceability 增加 3 条字面校验(91 → 94)。④ 审计脚本自身的守卫加固:audit-prompt-invariants.mjs 的注释扫描器此前不认正则字面量,而四套源码都含一个「字符类里带双引号」的 sanitize 正则字面量,旧扫描器把那个引号当成字符串开头、此后整个文件词法状态都是错的(实测新旧逐行比对:v2 190 行 / v3 159 行 / v4 14 行 / v5 121 行不同,典型后果是真实代码行被当注释抹掉 → 真缺陷可能被 I1/I13/I14 漏看);现在扫描器支持正则字面量(字符类/转义/flags)并新增 X5–X7 三条自检(正则里的引号不得吞掉注释、字符串里的 // 必须保留、转义斜杠不得提前结束正则,且都保持行结构),修复前 X5 会变红。⑤ 行为断言补齐四套同构(此前只有 v4 断言「普通 run 不降级 passed」):四套各新增 used 回执不得降级已 passed 对象、不得把 blocked 打回 attempted、普通 lean_run 不得降级 passed,v2 还断言「used 之后 require 门禁仍放行(把该轮驱动到一致为真不会产生 formal-required 待办)」;本轮是先用断言复现(v2 修复前实测三条变红:got attempted),再修复。套件断言 v2 334 / v3 294 / v4 277 / v5 153 / prompt-v5-integrity 506,audit-prompt-invariants 151/0(--self-probe 5/5),audit-spec-traceability 94/0。v2.3.2 是对四个架构各做一轮深度审计 + 横向同构对照后的修复版(无破坏性变更,默认仍为 off),修掉三处会让「严格验证」失效或不可用的高危缺陷:① v3 的四个 Lean 参数从未写进 vibe_math_set_params 的参数 schema(该 schema 是 additionalProperties:false,遵守 schema 的 provider 会拒绝这个调用)→ 用户永远无法开启该功能,而套件全绿(它直接调 handler、绕过 schema);② v2 的 require 门禁只读验证侧自己的 id,而代理用对象 id 归档、别名同步只更新已存在的键 → 「归档了 passed、验证侧还没有记录」时门禁永远搁置,搁置本身又写下 rId=none,于是每轮重开一次辩论、对象永远无法定论并饿死其它对象;③ v4 的 formalSetRun 硬编码 status=attempted,把已验证对象的 passed 抹掉(与注释、规格、v2/v5 都矛盾)→ 一次随手 lean_run 就让对象丢掉「已形式化」,忠实性分支消失、require 档对已有绿色证明的对象重新关门。另修 v2 的一处门禁旁路(settleVerdict 的「判断命题」转移在 v=0 时直接写 布尔估计=0/已验证/优先级 never 并压入 正确概率:1 条目,完全不看门禁)。撤回语义按 v5 的正确做法统一四套:撤回归档证明时先删、再用 fs 复核文件真的没了、仍在则就地覆盖为撤回说明,并如实公告是哪一种(含两者都失败的告警);lean_archive kind=proof 跑红时不再保留 prev.proof(proof 只属于 passed)并撤回旧的归档证明。提示词/交互修复:忠实性分支改为按档位承诺(只有 require 有门禁,encourage 明确写「本档没有门禁:请务必给弃权值」);无 Lean 工具链的出路同时点名 LEAN_NOT_FOUND 与 NO_SUBPROCESS;v3 的失败提示不再让人去看并不存在的编译器输出;v4 活动日志里的缩写工具名改为注册名(并纳入注入文本扫描);v2 的工作轮不再把可复用引理指向项目内不存在的 Formal/Proved/;v2 的 kind=def/lemma 跑红不再声称可复用;v3 setup 的重复 plannerPersona 去重;v4 规格里的幽灵工具 vibe_v4_propose_verify 修正为回执字段。语料确定性:v5 语料此前的非确定有三层根因(心跳/会议依赖真实时钟与异步顺序、最闲成员抖动、写入端只按 kind 排序),现由套件虚拟时钟 + 单成员研究所内捕捉心跳 + 写入端全序排序(kind→owner→prompt)修复,连跑 6 次字节一致且套件 7–9 s → 1.7 s;v3 的 20 条 planner:* 随机 plan id 与 epoch 时间戳一并 scrub。新增两个随包发布的常驻守卫:audit-prompt-invariants.mjs(四套 × 26 条静态不变式 + 3 条跨套检查,把历次真实发生过的提示词缺陷类别编码住,当前 121/0)与 audit-spec-traceability.mjs(规格/README 承诺的工具必须真的注册,能识别「文档里说它不存在」的否定语境;四个 Lean 参数必须同时被文档与代码接受;契约 §7 的 terminate();契约 §8 的门禁收口点无旁路,当前 91/0),以及 run-tests.mjs(并行跑全部套件并打印耗时/加速比/最慢项,修掉 --only x 空格形式被静默忽略与 --json 混入人类输出两个 bug)。AUDIT-CHECKLIST.md 新增 §1.8「四套同构:任何语义修正必须四套同步」——本轮三处高危里有两处正是改一套或四套同写法却无人横向对照造成的。本轮最贵的一处缺陷还暴露出一整类既有测试全都盲的漏洞:四个预设的工具 schema 都由 objParams 以 additionalProperties:false 关闭,schema 没列出的键会被遵守 schema 的 provider 直接拒绝,而提示词/规格/状态行可以全都在说这个参数、套件也可以全绿(套件直接调 handler、绕过 schema)——因此新增三重守卫:① 四套各自的 formal-verify-vN 套件现在直接检查**真实注册的** schema 对象(封闭性 + 四个 Lean 参数 + formalVerify 的 enum 恰好三档,已用探针证明:去掉 v3 真实注册那份的 leanArgs 立刻变红);② audit-prompt-invariants.mjs 新增 I13(每一处 set 工具定义都必须声明这四个参数,且每一份 objParams 都必须关闭 schema);③ 新增 I14(schema 声明的每个键都必须被参数层真正接收:v2/v3 的闸门是 DEFAULT_PARAMS 键集、v4 是 k in params、v5 是 normalizeParams 的类型列表——声明而不接收 = 调用返回 ok:true 却什么都不发生)。该脚本同时新增 --self-probe:在内存里注入这些缺陷形状,要求对应不变式变红、未变异的对照跑仍为绿(5/5),现为 145 条不变式。套件断言 v2 319 / v3 283 / v4 269 / v5 145 / prompt-v5-integrity 506,e2e-v4-fixes 修掉并行下的抖动(T21 会议看门狗 80 ms 在 CPU 争用下提前放弃会议);全量并行回归连续 3 次 23/23 全绿(最新实测 wall 111.5 s / sum 221.5 s / x1.99)。v2.3.1 是审计驱动的提示词/交互修复版(无破坏性变更,默认仍为 off):① 忠实性缺陷不再被记成「命题为假」——新增回执取值 decision='defect'(表决者发现 Lean 代码与命题原文不一致时不得投 0,给中间值并记录具体偏差;框架随即把该对象降级为 attempted、清空 proof、撤回归档证明 Verified/Lean/<id>.lean、写入 Formal/TODO.md,require 档下本次裁定不定论),encourage 档不承诺它无法强制的搁置;② 修复 v2 的 formal 回执通道是死代码(提示词要求写进回执、契约里却没有该字段、框架也从不解析)——补齐 formalJsonField/formalReplyNote/absorbFormalFromReply 并接进初评与辩论两条路径,套件改为行为断言而非措辞断言;③ 修复 v2/v3 忠实性分支的字段名错误(写成 verdict,真实字段是 Result,会导致该票被静默丢弃);④ 注入文本里的工具名一律改为注册名全称(v2/v3/v5 原先出现 lean_lib/lean_archive 缩写,含工具自身返回的 hint);⑤ 新增「归档可复用定义/引理前先跑通」与「宿主无 Lean 工具链(LEAN_NOT_FOUND)时把代码归档并在 note 写明,算显式阻塞原因」两条硬要求;⑥ 四套各自新增随包发布的人工复核语料 prompt-corpus-vN/(覆盖 off/encourage/require/忠实性/工作轮/回执契约),并修复 v5 语料路径归一化在 Windows 大小写差异下漏掉 VibeMath 根绝对路径、导致语料不确定且泄露本机路径的问题;⑦ 新增 16 条提示词灵敏度探针(删掉「不要投 0」、工具名换缩写、删掉 require 门禁措辞、回执契约去掉 defect,各四套),全套件断言 v2 261 / v3 247 / v4 226 / v5 120 / prompt-v5-integrity 588。v2.3.0 为四个架构新增可调控的 Lean 形式化验证(参数 formalVerify = off/encourage/require,默认 off):验证时按实现难度决定是否用 Lean 形式化(写代码+执行),一旦通过则审查对象从「推导是否正确」变成「Lean 的定义/对象/条件/假设/结论是否忠实于命题原文」;形式化代码归档为命题的证明(Verified/Lean/<id>.lean),可复用定义与已证引理归档到跨项目的 VibeMath/Formal/{Lib,Proved}/。require 档带门禁:真/假结论必须先有 Lean 通过或显式阻塞记录,否则记为未定论并进入形式化待办。共用契约 docs/formal-verification.md,四套各带 formal-verify-vN 套件(v2 177 / v3 189 / v4 144 / v5 88 断言)与 audit-formal-sensitivity.mjs 探针。同一次审计还发现并修复了一整类**静态提示词面**缺陷(persona ↔ 工具注册表,既有套件全部盲):v2/v3/v4 的 persona 从未列出无条件注册的三个 *_lean_* 工具,v4 的 vibe_v4_set 参数表漏了 formalVerify/leanCommand/leanArgs/leanTimeoutMs,v3 漏了 setup/save_settings/template,v4 漏了 vibe_v4_prompts,v5 漏了增删常驻研究员的工具、且 prefix 与 text 两个块存在文字漂移;现由 audit-persona-surface.test.mjs(197 断言:双向一致性 + 未文档化工具显式快照 + prefix/text 逐行一致 + 斜杠命令 hint/usage/实际分支三处一致 + Lean 参数/档位/路径,并生成随包发布的 prompt-corpus-persona/ 人读语料)与 audit-persona-sensitivity.mjs(11 条探针,含「未变异副本必须为绿」的对照)守护,AUDIT-CHECKLIST.md 新增 §1.6。v2.2.2 新增 v5 架构图(示例图/框架图-v5.svg + docs/generate_framework_diagram_v5.mjs 零依赖 Node 生成器 + vibe-math-v5/架构图.md 全套 Mermaid 细节图),并修复在绘制架构图时暴露的真实缺陷:会议进行中提出的验证会并发启动(会议与验证的互斥此前只做了单向),现改为排队。v2.2.1 把「全面检查必查清单」(AUDIT-CHECKLIST.md) 作为随包强制流程发布,提示词/交互正确性列为第一优先审计维度。v2.2.0 修复实测发现的提示词身份错乱:状态块改为显式接收它所描述的成员,创建成员时先落盘进编制再构造入职提示词,章程快照冻结在入职时,重建会话不再自称“刚入职”,所办调用不再被误判成某位研究员,框架反馈改为独立发送者投递,一次提示词不再重复投递同一条消息,并新增 prompt-v5-integrity 提示词完整性套件 + 可人工复核的提示词语料(随包发布)。",
|
|
117
|
+
"compatNote": "v2.3.10 补上插件市场(dsh-market / awesome-dsh-plugin 目录)读取的两处声明,并给它们加了防退化守卫:① DSH 版本依赖 —— 市场从**已发布的 npm manifest** 读 `engines.dsh`(顶层优先)或 `dsh.engines.dsh`,与 `@deepseek-ai/dsh*` 的 peerDependencies(若有)一起按\"各自都必须满足\"求交,再用 semver + includePrerelease:true 与宿主版本比较、在卡片上显示兼容性;本包此前只有自用的 dsh.minVersion/testedVersion(市场不读),因此卡片一直显示\"未声明\"。现两处都声明 `>=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`:用显式预发布分支覆盖我们真正验证过的每个 tuple(0.1.2 / 0.1.3+0.1.4 / 0.1.5),并带 <0.2.0-0 上限,使默认语义与 includePrerelease 语义下判定一致(已用 semver 7.8.5 逐版本实测:0.1.2-alpha.4…0.1.5-rc.2 全通过,0.1.1-*、0.2.0-rc.1、0.2.0、1.0.0 全拒绝)。② 展示图 —— 市场从**仓库里的 screenshots.json**(package.json 旁边)读 1–8 张图,作者自己推仓即可生效、无需 PR;本包此前没有该文件,于是吃到目录里的历史遗留条目(指向已删除的 框架图-v1.png,首图 404 被静默丢弃)。现新增 screenshots.json(v5/v4/v3/v2 四张架构图,前两张由新的零依赖 SVG 渲染为 1:1 PNG),旧遗留键会被目录的清理脚本自动移除。③ 新增随包发布的守卫 audit-market-metadata.test.mjs(进并行回归):断言 dsh.bundle.patch 存在、两处 DSH 声明存在且等于经验证的链、链覆盖 dsh.compatibility 里所有标记 compatible 的版本、带显式上限、screenshots.json 为 1–8 张且每个路径**真实存在**(正是历史遗留条目烂掉的那一类)、README 里的每张图都存在。v2.3.9 把 v4 架构图从 matplotlib 位图换成零依赖 Node 生成的 SVG(示例图/框架图-v4.svg,生成器 docs/generate_framework_diagram_v4.mjs 随包发布),与 v5 同一套版式语言:分带呈现定论门槛(全体一致为真/为假才入 Verified/,没有 forced/flat/近共识收口)、常驻层(continuable 持久会话、只写自己的库、跨读他人库)、框架六面(消息总线邮件箱、会议辩论与验证互斥、任务板只搬运、全票共识验证、上下文 compact、活性并发恢复)、数据面(真实路径:Progress/Propos/Methods/Subproblems、Shared/、Verified/、State/*.json 与锁/进程纪元)与哲学红线,并附图例;生成时会估算文字宽度,任何一行溢出容器即告警并以退出码 1 结束。旧文件 docs/generate_framework_diagram_v4.py 与 示例图/框架图-v4.png 已删除(git 历史可查),README 图源改为 SVG 且该 SVG 已随包发布(npm 上不再图裂)。绘图时逐项核对了实现,顺手改正了初版图里的两处字段错误(reject_assign 是 v5 的字段、vote_solved 应为 voteSolved)与一处不存在的路径(Shared/decisions.md → 实际是 State/decisions.json)。无代码行为变更,四套预设字节未变。v2.3.8 是纯文档版(无代码、无预设字节变化):把 round 7/8 的结论写进共享契约与强制审计流程,免得下一轮审计重新把它当新问题或按另一种方式改 —— ① docs/formal-verification.md §4 补两条边界:记录与归档文件在框架侧\"同生共死\",但**外部**删除 Verified/Lean/<id>.lean 不会自动降级记录(passed 是状态文件里的权威状态,门禁查询只读、不做文件存在性探测),人工动过文件后请一并修正记录或重新归档;v2 的 id 映射同理,记录里持久化的 objectId 必须**自洽**(不以 r- 开头)才被采纳。② AUDIT-CHECKLIST §1.10 补一条检查项「从用户可编辑的状态文件里读出来的『权威值』是否先做了自洽校验」,并写入 2.3.7 的真实事故。③ v2 实现方案 §9.3 同步该自洽条件。v2.3.7 是 round 8:把 2.3.6 新引入的「记录里持久化权威 objectId」这条机制自己审一遍。2.3.6 让 formalObjectIdOf 在任务表不可用时读记录里的 objectId(跨 resume 生效),但状态文件是可编辑的(VibeMath_State/formal.json,仓库里本来就有\"文件被改坏也要能继续\"的守卫测试):若某条记录的 objectId 自己就是 r 形(r-pX),\"验证 id → 对象 id\"就会映射到它自己,于是 putFormalBothIds 认为两侧是同一个 id、只写验证侧,对象侧仍然 passed —— 又回到\"成对关系只做一半\"的静默错位。触发路径已实测:工作轮回执(explorer/solver 回执同样带 formal)在没有验证任务在内存时走\"读记录锚点\"这条兜底路径。修复:读取锚点与写入锚点都要求\"锚点自洽\"(formalObjectIdOfIsOwner:不以 r- 开头、不可能再被解析成别的 id)。写入侧的两道守卫目前无法用用例证明必要性(现有写入者手里的值都来自 formalObjectIdOf,本身不会是 r 形;我一度写的\"归档写在 rId 上会污染锚点\"的用例实测恒真,已删除),因此按纵深防御保留并如此标注;真正被证明有效的是读取侧守卫。新增 5 条断言(formal-verify-v2 第 14d 节):手改出的 r 形锚点 + 工作轮回执点名 r-pX 报 defect → 对象侧必须被降级(锚点被拒绝而不是被信任)、验证侧同样降级。灵敏度实测(_oneoff/probe-v2-anchor-guard.mjs):去掉读取侧守卫 → 该用例立刻变红,装回 → 全绿。套件 348 → 353。v2.3.6 修复 2.3.2 审计中记录为「存疑、需契约决策」的那条 id 解析歧义 —— round 7 先把它做成可复现用例,确认不是理论问题而是真实可达的数据破坏:v2 有两套 id(对象 id 与验证 rId),二者靠唯一一处 formalObjectIdOf 转换,而它无条件剥离 -sN/-pfN/-rfN 后缀;但对象 id 本身就可能以 -s1 结尾(命题 pAmb-s1 的验证 id 是 r-pAmb-s1),映射于是得到 pAmb —— 另一个对象。实测(修前 6 条断言变红):忠实性提示词打印的是邻居 pAmb 的证明路径;一句 formal:{target:「r-pAmb-s1」,decision:「defect」} 会把 pAmb 降级为 attempted,并**撤回 Verified/Lean/pAmb.lean**(一句关于 A 的回执删掉 B 的归档证明,不可逆);而真正有问题的 pAmb-s1 仍然是 passed、TODO 里也没有它。修复:formalObjectIdOf 改为按权威度取来源 —— ① 验证任务自己的所有者(tasks[verify:+rId].r.pId|qid,框架生成 rId 时就知道对象是谁);② 记录里的 objectId(由 syncVerificationTarget 与 putFormalBothIds 在手里确实有对象 id 时写入,因此跨 resume、任务表尚未重建时也正确);③ 只有两者都不可用时才回退到字符串后缀解析。v3/v4/v5 不受影响(没有第二套 id 空间,验证直接以对象 id 为键,已核对 formalId/formalOf 只做 idSafe)。新增 14 条行为断言(formal-verify-v2 第 14c 节):两个同前缀对象各自有自己的证明;对 r-pAmb-s1 的忠实性提示词必须指向它自己的证明;defect 必须降级并撤回它自己的证明、TODO 写它;邻居 pAmb 必须仍是 passed 且其归档证明文件分毫未动;验证记录里必须写着权威所有者 objectId。套件 334 → 348。v2.3.5 是 round 5:把\"注释/字符串扫描器\"这一类缺陷追到所有自带扫描器的脚本上。audit-v5-integrity.mjs(静态自检:调用了但未定义的函数 / 未声明的 params.X 读取 / 会话 API 上不存在的方法 / 遗留开发标记)的 stripNoise() 完全不认正则字面量,而 v5 源码里有一个字符类带双引号的 sanitize 正则,那个引号被当成字符串开头。实测(旧 vs 新逐行比对,v5 共 4365 行):30 行不一致(都是含\"字符类里有引号\"的正则的行),抹除后的文本无法通过 node --check;本次没有任何调用名 / params.* 读取 / s.*() 方法被漏掉,所以是潜在盲区而非已发生的漏检 —— 但只要某个被检查的标识符恰好只出现在这种行上就会完全隐形。现把 stripNoise() 升级为与 audit-prompt-invariants.mjs 同一套词法处理(正则字面量 + 字符类 + 转义 + flags + 关键字规则),正则与字符串统一替换为值占位符;并给该审计加上解析级自检:抹除后的 v5 源码必须仍能被 node --check 解析,且\"引号在字符类里的正则 + 紧随其后的注释\"夹具必须完好。灵敏度实测:把旧扫描器放回去,审计立刻报 stripNoise() corrupted the source it scans(exit 1),换回新版则 clean;39 条 v5 灵敏度探针仍全红。(过程教训:第一版测量用\"文件里下一个引号\"估算受影响区域,得出\"402 行 / 20 个函数\"的错误结论;该扫描器遇到换行即结束字符串,真实影响是 30 行。发布前逐行复核才发现并改正 —— 先量准再下结论。)v2.3.4 是 round 4:只审上一轮改动过的东西(2.3.3 修好的注释扫描器 —— 它是 I1/I13/I14 三条不变式的地基 —— 与它新增的 X5–X7 自检)。扫描器还剩一个盲区:判据\"这个斜杠是正则还是除法\"只看前一个字符,于是关键字后面的正则被读成除法 —— 而 v3 源码里真有 return /^\\s*import\\s+/.test(l) 与 return /\\n$/.test(out) 两处;这两处字符类里恰好没有引号所以今天还没坏,但只要有人在 return /…/ 的正则里写一个引号(如 return /[\"']/.test(s)),扫描器就会把那个引号当成字符串开头、此后整个文件词法状态都是错的,又回到 2.3.2 修掉的坑。现把判据从\"前一个字符\"升级为\"前一个记号\":除运算符/开括号外,return/typeof/case/delete/void/instanceof/in/of/yield/await/new/do/else 之后也按正则解析,标识符、右括号、右方括号之后仍按除法。并新增解析级判据 X8/X8b:X8 要求四套源码\"抹掉注释\"之后的产物仍能被 node --check 解析(扫描器读错代码时产物往往直接语法错误);X8b 是专测关键字规则的夹具(return /[\"']/.test(l) + 紧随其后的注释)。灵敏度已实测:2.3.2 的扫描器让四个预设全部 SyntaxError(X8 红),2.3.3 的扫描器 X8 绿但 X8b 红(紧随其后的注释没被抹掉),当前版本两者皆绿 —— 即 X8 守住大回退、X8b 守住这个窄口子,2.3.3 的扫描器会被 X8b 判红。不变式 151 → 157。本版只改随包发布的审计脚本与文档,四套预设字节未变。依赖宿主提供的 subagents/agents/tools/commands/fs 服务与 @deepseek-ai/dsh-* 插件行;可选 subprocess/sandboxPolicy/compaction。persona 行同时携带 prefix 与 text 两个键,以兼容 0.1.3-alpha.2 的 schema 更名(prefix 必填)与 0.1.2 及更早的 text 键。已在 dsh-v0.1.5-rc.2(@deepseek-ai/dsh-persona 0.1.5-rc.2)上逐行校验全部预设行并通过(v2/v3/v4;v1 已于 v2.0.0 移除)。注意:DSH 0.1.2 起 subagents.startContinuable 的 agentOptions/toolFilter 需要宿主 provider 声明对应 capability(spawn/fork 进程内 provider 均支持),安装器启动时会做能力自检并在旧版宿主上告警。2026 兼容性修复:v2/v3 工具权限名表原先硬编码 web/fetch/bash(未注册名会使 tools.restrict() 抛错、子代理无法建立),现按真实注册名并加带守卫的重试;v4 真实 /compact 原先在 subagent/end 里查 agents.get()(该事件触发时子代理已移出注册表,属死代码),现改为在 subagent/start 捕获 Agent 引用;三套预设的可选服务改为惰性读取,不再在 apply() 快照;v4 的 tools/commands 注册补入 ctx.effect;安装器自检新增 subprocess/sandboxPolicy/compaction。v2.1.0 新增 v5 研究所体系:状态存于宿主 host-only 会话投影单元(键 vibeMathV5),因此自检新增 sessionProjections/sessions(均为可选;缺失时 v5 回退到加固 JSON 状态文件)。v5 不依赖任何 npm 实验包,纯 preset 内单文件实现。v2.3.3 是 2.3.2 之后的确认轮(重新审计改动过的每一处:四套插件、四套套件、共享契约,以及审计脚本自身),修掉一处真实缺陷与两处同类/字面问题:① v2 的 formal.decision=used 回执**无条件**把记录写成 attempted —— 一句「这一轮碰了形式化」会把已经 passed 的对象在两个 id 空间上一起降级,而 proof 指针仍留着(记录自相矛盾),后果是后续审查提示词丢掉忠实性分支、require 档对一份已跑通的归档证明重新关门并把对象丢进形式化待办;现改为先取合并后的记录状态(formalGateRecord,两套 id 都认),passed/blocked 一律保留,只有从未尝试起步才写 attempted(与 v4 的 formalSetRun 缺陷同类,只是长在回执通道上且只长在一套里)。② v3 的 used 分支只保留 passed(prev.status === passed ? passed : attempted),会把 blocked 打回 attempted —— blocked 本身就是「门禁已放行」的记录,一句 used 就把门禁重新关上;现两者都保留,四套同构。③ 共享契约 docs/formal-verification.md §4 迁移表有两行与实现相反(used 行与两行 lean_run 都写成「→ attempted」),而规范文档写反最危险之处是下一次修改会照它写(2.3.2 修好 v2 后若只读契约就会把修复改回去);现已改正为「已是 passed/blocked 则保持原状」,并补上「lean_archive kind=proof 但运行失败 → attempted + 清空 proof + 撤回旧归档证明」这一行,四套实现方案与 v5 规格同步,audit-spec-traceability 增加 3 条字面校验(91 → 94)。④ 审计脚本自身的守卫加固:audit-prompt-invariants.mjs 的注释扫描器此前不认正则字面量,而四套源码都含一个「字符类里带双引号」的 sanitize 正则字面量,旧扫描器把那个引号当成字符串开头、此后整个文件词法状态都是错的(实测新旧逐行比对:v2 190 行 / v3 159 行 / v4 14 行 / v5 121 行不同,典型后果是真实代码行被当注释抹掉 → 真缺陷可能被 I1/I13/I14 漏看);现在扫描器支持正则字面量(字符类/转义/flags)并新增 X5–X7 三条自检(正则里的引号不得吞掉注释、字符串里的 // 必须保留、转义斜杠不得提前结束正则,且都保持行结构),修复前 X5 会变红。⑤ 行为断言补齐四套同构(此前只有 v4 断言「普通 run 不降级 passed」):四套各新增 used 回执不得降级已 passed 对象、不得把 blocked 打回 attempted、普通 lean_run 不得降级 passed,v2 还断言「used 之后 require 门禁仍放行(把该轮驱动到一致为真不会产生 formal-required 待办)」;本轮是先用断言复现(v2 修复前实测三条变红:got attempted),再修复。套件断言 v2 334 / v3 294 / v4 277 / v5 153 / prompt-v5-integrity 506,audit-prompt-invariants 151/0(--self-probe 5/5),audit-spec-traceability 94/0。v2.3.2 是对四个架构各做一轮深度审计 + 横向同构对照后的修复版(无破坏性变更,默认仍为 off),修掉三处会让「严格验证」失效或不可用的高危缺陷:① v3 的四个 Lean 参数从未写进 vibe_math_set_params 的参数 schema(该 schema 是 additionalProperties:false,遵守 schema 的 provider 会拒绝这个调用)→ 用户永远无法开启该功能,而套件全绿(它直接调 handler、绕过 schema);② v2 的 require 门禁只读验证侧自己的 id,而代理用对象 id 归档、别名同步只更新已存在的键 → 「归档了 passed、验证侧还没有记录」时门禁永远搁置,搁置本身又写下 rId=none,于是每轮重开一次辩论、对象永远无法定论并饿死其它对象;③ v4 的 formalSetRun 硬编码 status=attempted,把已验证对象的 passed 抹掉(与注释、规格、v2/v5 都矛盾)→ 一次随手 lean_run 就让对象丢掉「已形式化」,忠实性分支消失、require 档对已有绿色证明的对象重新关门。另修 v2 的一处门禁旁路(settleVerdict 的「判断命题」转移在 v=0 时直接写 布尔估计=0/已验证/优先级 never 并压入 正确概率:1 条目,完全不看门禁)。撤回语义按 v5 的正确做法统一四套:撤回归档证明时先删、再用 fs 复核文件真的没了、仍在则就地覆盖为撤回说明,并如实公告是哪一种(含两者都失败的告警);lean_archive kind=proof 跑红时不再保留 prev.proof(proof 只属于 passed)并撤回旧的归档证明。提示词/交互修复:忠实性分支改为按档位承诺(只有 require 有门禁,encourage 明确写「本档没有门禁:请务必给弃权值」);无 Lean 工具链的出路同时点名 LEAN_NOT_FOUND 与 NO_SUBPROCESS;v3 的失败提示不再让人去看并不存在的编译器输出;v4 活动日志里的缩写工具名改为注册名(并纳入注入文本扫描);v2 的工作轮不再把可复用引理指向项目内不存在的 Formal/Proved/;v2 的 kind=def/lemma 跑红不再声称可复用;v3 setup 的重复 plannerPersona 去重;v4 规格里的幽灵工具 vibe_v4_propose_verify 修正为回执字段。语料确定性:v5 语料此前的非确定有三层根因(心跳/会议依赖真实时钟与异步顺序、最闲成员抖动、写入端只按 kind 排序),现由套件虚拟时钟 + 单成员研究所内捕捉心跳 + 写入端全序排序(kind→owner→prompt)修复,连跑 6 次字节一致且套件 7–9 s → 1.7 s;v3 的 20 条 planner:* 随机 plan id 与 epoch 时间戳一并 scrub。新增两个随包发布的常驻守卫:audit-prompt-invariants.mjs(四套 × 26 条静态不变式 + 3 条跨套检查,把历次真实发生过的提示词缺陷类别编码住,当前 121/0)与 audit-spec-traceability.mjs(规格/README 承诺的工具必须真的注册,能识别「文档里说它不存在」的否定语境;四个 Lean 参数必须同时被文档与代码接受;契约 §7 的 terminate();契约 §8 的门禁收口点无旁路,当前 91/0),以及 run-tests.mjs(并行跑全部套件并打印耗时/加速比/最慢项,修掉 --only x 空格形式被静默忽略与 --json 混入人类输出两个 bug)。AUDIT-CHECKLIST.md 新增 §1.8「四套同构:任何语义修正必须四套同步」——本轮三处高危里有两处正是改一套或四套同写法却无人横向对照造成的。本轮最贵的一处缺陷还暴露出一整类既有测试全都盲的漏洞:四个预设的工具 schema 都由 objParams 以 additionalProperties:false 关闭,schema 没列出的键会被遵守 schema 的 provider 直接拒绝,而提示词/规格/状态行可以全都在说这个参数、套件也可以全绿(套件直接调 handler、绕过 schema)——因此新增三重守卫:① 四套各自的 formal-verify-vN 套件现在直接检查**真实注册的** schema 对象(封闭性 + 四个 Lean 参数 + formalVerify 的 enum 恰好三档,已用探针证明:去掉 v3 真实注册那份的 leanArgs 立刻变红);② audit-prompt-invariants.mjs 新增 I13(每一处 set 工具定义都必须声明这四个参数,且每一份 objParams 都必须关闭 schema);③ 新增 I14(schema 声明的每个键都必须被参数层真正接收:v2/v3 的闸门是 DEFAULT_PARAMS 键集、v4 是 k in params、v5 是 normalizeParams 的类型列表——声明而不接收 = 调用返回 ok:true 却什么都不发生)。该脚本同时新增 --self-probe:在内存里注入这些缺陷形状,要求对应不变式变红、未变异的对照跑仍为绿(5/5),现为 145 条不变式。套件断言 v2 319 / v3 283 / v4 269 / v5 145 / prompt-v5-integrity 506,e2e-v4-fixes 修掉并行下的抖动(T21 会议看门狗 80 ms 在 CPU 争用下提前放弃会议);全量并行回归连续 3 次 23/23 全绿(最新实测 wall 111.5 s / sum 221.5 s / x1.99)。v2.3.1 是审计驱动的提示词/交互修复版(无破坏性变更,默认仍为 off):① 忠实性缺陷不再被记成「命题为假」——新增回执取值 decision='defect'(表决者发现 Lean 代码与命题原文不一致时不得投 0,给中间值并记录具体偏差;框架随即把该对象降级为 attempted、清空 proof、撤回归档证明 Verified/Lean/<id>.lean、写入 Formal/TODO.md,require 档下本次裁定不定论),encourage 档不承诺它无法强制的搁置;② 修复 v2 的 formal 回执通道是死代码(提示词要求写进回执、契约里却没有该字段、框架也从不解析)——补齐 formalJsonField/formalReplyNote/absorbFormalFromReply 并接进初评与辩论两条路径,套件改为行为断言而非措辞断言;③ 修复 v2/v3 忠实性分支的字段名错误(写成 verdict,真实字段是 Result,会导致该票被静默丢弃);④ 注入文本里的工具名一律改为注册名全称(v2/v3/v5 原先出现 lean_lib/lean_archive 缩写,含工具自身返回的 hint);⑤ 新增「归档可复用定义/引理前先跑通」与「宿主无 Lean 工具链(LEAN_NOT_FOUND)时把代码归档并在 note 写明,算显式阻塞原因」两条硬要求;⑥ 四套各自新增随包发布的人工复核语料 prompt-corpus-vN/(覆盖 off/encourage/require/忠实性/工作轮/回执契约),并修复 v5 语料路径归一化在 Windows 大小写差异下漏掉 VibeMath 根绝对路径、导致语料不确定且泄露本机路径的问题;⑦ 新增 16 条提示词灵敏度探针(删掉「不要投 0」、工具名换缩写、删掉 require 门禁措辞、回执契约去掉 defect,各四套),全套件断言 v2 261 / v3 247 / v4 226 / v5 120 / prompt-v5-integrity 588。v2.3.0 为四个架构新增可调控的 Lean 形式化验证(参数 formalVerify = off/encourage/require,默认 off):验证时按实现难度决定是否用 Lean 形式化(写代码+执行),一旦通过则审查对象从「推导是否正确」变成「Lean 的定义/对象/条件/假设/结论是否忠实于命题原文」;形式化代码归档为命题的证明(Verified/Lean/<id>.lean),可复用定义与已证引理归档到跨项目的 VibeMath/Formal/{Lib,Proved}/。require 档带门禁:真/假结论必须先有 Lean 通过或显式阻塞记录,否则记为未定论并进入形式化待办。共用契约 docs/formal-verification.md,四套各带 formal-verify-vN 套件(v2 177 / v3 189 / v4 144 / v5 88 断言)与 audit-formal-sensitivity.mjs 探针。同一次审计还发现并修复了一整类**静态提示词面**缺陷(persona ↔ 工具注册表,既有套件全部盲):v2/v3/v4 的 persona 从未列出无条件注册的三个 *_lean_* 工具,v4 的 vibe_v4_set 参数表漏了 formalVerify/leanCommand/leanArgs/leanTimeoutMs,v3 漏了 setup/save_settings/template,v4 漏了 vibe_v4_prompts,v5 漏了增删常驻研究员的工具、且 prefix 与 text 两个块存在文字漂移;现由 audit-persona-surface.test.mjs(197 断言:双向一致性 + 未文档化工具显式快照 + prefix/text 逐行一致 + 斜杠命令 hint/usage/实际分支三处一致 + Lean 参数/档位/路径,并生成随包发布的 prompt-corpus-persona/ 人读语料)与 audit-persona-sensitivity.mjs(11 条探针,含「未变异副本必须为绿」的对照)守护,AUDIT-CHECKLIST.md 新增 §1.6。v2.2.2 新增 v5 架构图(示例图/框架图-v5.svg + docs/generate_framework_diagram_v5.mjs 零依赖 Node 生成器 + vibe-math-v5/架构图.md 全套 Mermaid 细节图),并修复在绘制架构图时暴露的真实缺陷:会议进行中提出的验证会并发启动(会议与验证的互斥此前只做了单向),现改为排队。v2.2.1 把「全面检查必查清单」(AUDIT-CHECKLIST.md) 作为随包强制流程发布,提示词/交互正确性列为第一优先审计维度。v2.2.0 修复实测发现的提示词身份错乱:状态块改为显式接收它所描述的成员,创建成员时先落盘进编制再构造入职提示词,章程快照冻结在入职时,重建会话不再自称“刚入职”,所办调用不再被误判成某位研究员,框架反馈改为独立发送者投递,一次提示词不再重复投递同一条消息,并新增 prompt-v5-integrity 提示词完整性套件 + 可人工复核的提示词语料(随包发布)。",
|
|
111
118
|
"compatibility": {
|
|
112
119
|
"dshReleases": {
|
|
113
120
|
"0.1.2-alpha.4": "compatible",
|
|
@@ -119,6 +126,9 @@
|
|
|
119
126
|
"0.1.5-rc.1": "compatible",
|
|
120
127
|
"0.1.5-rc.2": "compatible"
|
|
121
128
|
}
|
|
129
|
+
},
|
|
130
|
+
"engines": {
|
|
131
|
+
"dsh": ">=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"
|
|
122
132
|
}
|
|
123
133
|
}
|
|
124
134
|
}
|
package/screenshots.json
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1720 1260" width="1720" height="1260" role="img" aria-label="Vibe Math V4 常驻自组织架构图">
|
|
3
|
+
<defs>
|
|
4
|
+
<marker id="both" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M 0 0 L 10 5 L 0 10 z" fill="#7d93a3"/></marker>
|
|
5
|
+
<marker id="bothHuman" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M 0 0 L 10 5 L 0 10 z" fill="#5b4bb8"/></marker>
|
|
6
|
+
<marker id="bothFrame" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M 0 0 L 10 5 L 0 10 z" fill="#0b6fb8"/></marker>
|
|
7
|
+
<marker id="bothData" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M 0 0 L 10 5 L 0 10 z" fill="#1f7a52"/></marker>
|
|
8
|
+
<marker id="bothHouse" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M 0 0 L 10 5 L 0 10 z" fill="#b26a00"/></marker>
|
|
9
|
+
<marker id="bothGate" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M 0 0 L 10 5 L 0 10 z" fill="#b3202c"/></marker>
|
|
10
|
+
</defs>
|
|
11
|
+
<rect width="1720" height="1260" fill="#ffffff"/>
|
|
12
|
+
<g font-family="'Microsoft YaHei','PingFang SC','Hiragino Sans GB','Noto Sans CJK SC','Source Han Sans SC',sans-serif">
|
|
13
|
+
<text x="860" y="40" font-size="27" font-weight="700" fill="#10202e" text-anchor="middle">Vibe Math V4 —— 常驻自组织合作研究</text>
|
|
14
|
+
<text x="860" y="67" font-size="13" font-weight="400" fill="#5d7788" text-anchor="middle">框架只是媒介:中继留言 · 沉淀产物 · 计数表决 · 管理上下文。它绝不分配任务 —— 分工由常驻之间留言与开会决定</text>
|
|
15
|
+
<rect x="40" y="84" width="1640" height="92" rx="14" fill="#fdeef0" stroke="#b3202c" stroke-width="2"/>
|
|
16
|
+
<text x="58" y="111" font-size="15" font-weight="700" fill="#b3202c">定论门槛 —— 唯一让对象进入 Verified/ 的规则</text>
|
|
17
|
+
<text x="58" y="131" font-size="12" fill="#5d7788">全体常驻一致为真(全 1)或一致为假(全 0) · 没有任何 forced / flat / 近共识自动收口 —— 强分歧不得被强行判真</text>
|
|
18
|
+
<rect x="62" y="140" width="506" height="28" rx="10" fill="#ffffff" stroke="#b3202c" stroke-width="1.6"/>
|
|
19
|
+
<text x="315" y="158.1" font-size="11.5" font-weight="700" fill="#10202e" text-anchor="middle">全体一致为真 → 写入 Verified/命题|问题/<id>.md,回写来源库状态 = 已验证·真</text>
|
|
20
|
+
<rect x="588" y="140" width="506" height="28" rx="10" fill="#ffffff" stroke="#b3202c" stroke-width="1.6"/>
|
|
21
|
+
<text x="841" y="158.1" font-size="11.5" font-weight="700" fill="#10202e" text-anchor="middle">全体一致为假 → 同样写入 Verified/(结论 = 假),来源库状态 = 已验证·假</text>
|
|
22
|
+
<rect x="1114" y="140" width="524" height="28" rx="10" fill="#ffffff" stroke="#b3202c" stroke-width="1.6"/>
|
|
23
|
+
<text x="1376" y="158.1" font-size="11.5" font-weight="700" fill="#10202e" text-anchor="middle">出现分歧 → 公开辩论重评;仍未全票 → 留库 + 全组平均概率 + 完整辩论录</text>
|
|
24
|
+
<rect x="230" y="188" width="1450" height="150" rx="14" fill="#fdf5e2" stroke="#b26a00" stroke-width="2"/>
|
|
25
|
+
<text x="248" y="215" font-size="15" font-weight="700" fill="#8a5200">常驻层(所内自治)—— 编制、方向与分工都在常驻之间完成,框架永不指派</text>
|
|
26
|
+
<text x="248" y="235" font-size="12" fill="#5d7788">起始 brainstorm 产出各自方向 · 此后持续工作直到"全体认为已解决"(会议全票同意) · 可增开 / 关闭常驻</text>
|
|
27
|
+
<rect x="252" y="246" width="338" height="88" rx="10" fill="#ffffff" stroke="#b26a00" stroke-width="1.6"/>
|
|
28
|
+
<text x="421" y="260.7" font-size="13" font-weight="700" fill="#10202e" text-anchor="middle">常驻 r-1</text>
|
|
29
|
+
<text x="421" y="277.7" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">continuable 持久会话</text>
|
|
30
|
+
<text x="421" y="294.7" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">独立上下文 · 自主方向</text>
|
|
31
|
+
<text x="421" y="311.7" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">只写自己的库</text>
|
|
32
|
+
<text x="421" y="328.7" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">跨读他人的库(只读)</text>
|
|
33
|
+
<rect x="608" y="246" width="338" height="88" rx="10" fill="#ffffff" stroke="#b26a00" stroke-width="1.6"/>
|
|
34
|
+
<text x="777" y="260.7" font-size="13" font-weight="700" fill="#10202e" text-anchor="middle">常驻 r-2</text>
|
|
35
|
+
<text x="777" y="277.7" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">continuable 持久会话</text>
|
|
36
|
+
<text x="777" y="294.7" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">独立上下文 · 自主方向</text>
|
|
37
|
+
<text x="777" y="311.7" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">只写自己的库</text>
|
|
38
|
+
<text x="777" y="328.7" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">跨读他人的库(只读)</text>
|
|
39
|
+
<rect x="964" y="246" width="338" height="88" rx="10" fill="#ffffff" stroke="#b26a00" stroke-width="1.6"/>
|
|
40
|
+
<text x="1133" y="260.7" font-size="13" font-weight="700" fill="#10202e" text-anchor="middle">常驻 r-3</text>
|
|
41
|
+
<text x="1133" y="277.7" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">continuable 持久会话</text>
|
|
42
|
+
<text x="1133" y="294.7" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">独立上下文 · 自主方向</text>
|
|
43
|
+
<text x="1133" y="311.7" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">只写自己的库</text>
|
|
44
|
+
<text x="1133" y="328.7" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">跨读他人的库(只读)</text>
|
|
45
|
+
<rect x="1320" y="246" width="338" height="88" rx="10" fill="#ffffff" stroke="#b26a00" stroke-width="1.6"/>
|
|
46
|
+
<text x="1489" y="260.7" font-size="13" font-weight="700" fill="#10202e" text-anchor="middle">… r-N</text>
|
|
47
|
+
<text x="1489" y="277.7" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">add_member / remove_member</text>
|
|
48
|
+
<text x="1489" y="294.7" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">residentCount 默认 4</text>
|
|
49
|
+
<text x="1489" y="311.7" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">唤醒 = sendMessage</text>
|
|
50
|
+
<text x="1489" y="328.7" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">一轮 = 一次完整思考</text>
|
|
51
|
+
<rect x="42" y="188" width="176" height="150" rx="10" fill="#ffffff" stroke="#5b4bb8" stroke-width="1.6"/>
|
|
52
|
+
<text x="130" y="219.3" font-size="12" font-weight="700" fill="#10202e" text-anchor="middle">人 / 助手</text>
|
|
53
|
+
<text x="130" y="235.3" font-size="10" font-weight="400" fill="#2c4557" text-anchor="middle">会话根代理 = 接口</text>
|
|
54
|
+
<text x="130" y="251.3" font-size="10" font-weight="400" fill="#2c4557" text-anchor="middle">configure → start</text>
|
|
55
|
+
<text x="130" y="267.3" font-size="10" font-weight="400" fill="#2c4557" text-anchor="middle">message / meeting</text>
|
|
56
|
+
<text x="130" y="283.3" font-size="10" font-weight="400" fill="#2c4557" text-anchor="middle">add_member / remove_member</text>
|
|
57
|
+
<text x="130" y="299.3" font-size="10" font-weight="400" fill="#2c4557" text-anchor="middle">pause / resume / abort</text>
|
|
58
|
+
<text x="130" y="315.3" font-size="10" font-weight="400" fill="#2c4557" text-anchor="middle">set 调参(立即生效)</text>
|
|
59
|
+
<rect x="230" y="400" width="1450" height="384" rx="14" fill="#eaf3fd" stroke="#0b6fb8" stroke-width="2"/>
|
|
60
|
+
<text x="248" y="427" font-size="15" font-weight="700" fill="#084d80">框架 vibe-v4 —— 只是媒介(middleware):中继 · 沉淀 · 计数 · 调度</text>
|
|
61
|
+
<text x="248" y="447" font-size="12" fill="#5d7788">每轮发「状态块 + 本轮问句」;常驻回一个 JSON:summary / solved / input / vote / propose_verify / propose_task / claim_task / task_done / voteSolved / formal / contextPct</text>
|
|
62
|
+
<rect x="252" y="462" width="454" height="76" rx="10" fill="#ffffff" stroke="#0b6fb8" stroke-width="1.6"/>
|
|
63
|
+
<text x="479" y="479.8" font-size="12.5" font-weight="700" fill="#10202e" text-anchor="middle">消息总线 · 邮件箱</text>
|
|
64
|
+
<text x="479" y="496.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">vibe_v4_message(to|all) → 入目标邮箱</text>
|
|
65
|
+
<text x="479" y="512.8" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">空闲则 sendMessage 唤醒;常驻之间不直接互调</text>
|
|
66
|
+
<text x="479" y="529.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">全靠框架 relay(模拟收件箱)· 支持广播</text>
|
|
67
|
+
<rect x="728" y="462" width="454" height="76" rx="10" fill="#ffffff" stroke="#0b6fb8" stroke-width="1.6"/>
|
|
68
|
+
<text x="955" y="479.8" font-size="12.5" font-weight="700" fill="#10202e" text-anchor="middle">会议 / 辩论</text>
|
|
69
|
+
<text x="955" y="496.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">vibe_v4_meeting(agenda) → 全体发言</text>
|
|
70
|
+
<text x="955" y="512.8" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">写 Shared/meetings/<id>.md 并广播结论</text>
|
|
71
|
+
<text x="955" y="529.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">看门狗防死锁 · 与验证互斥(排队,不抢占)</text>
|
|
72
|
+
<rect x="1204" y="462" width="454" height="76" rx="10" fill="#ffffff" stroke="#0b6fb8" stroke-width="1.6"/>
|
|
73
|
+
<text x="1431" y="479.8" font-size="12.5" font-weight="700" fill="#10202e" text-anchor="middle">任务板(只搬运)</text>
|
|
74
|
+
<text x="1431" y="496.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">提议 / 认领写在回执里 → Shared/taskboard.md</text>
|
|
75
|
+
<text x="1431" y="512.8" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">认领后被唤醒;框架不决定谁做什么</text>
|
|
76
|
+
<text x="1431" y="529.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">open 任务在空闲时常驻的唤醒顺序里优先</text>
|
|
77
|
+
<rect x="252" y="548" width="454" height="76" rx="10" fill="#ffffff" stroke="#0b6fb8" stroke-width="1.6"/>
|
|
78
|
+
<text x="479" y="565.8" font-size="12.5" font-weight="700" fill="#10202e" text-anchor="middle">共识验证(全票)</text>
|
|
79
|
+
<text x="479" y="582.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">回执字段 propose_verify → FIFO 排队</text>
|
|
80
|
+
<text x="479" y="598.8" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">独立初评(互不可见)→ 公开辩论重评</text>
|
|
81
|
+
<text x="479" y="615.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">最多 verdictMaxRounds 轮(默认 3);全票同向才入 Verified/</text>
|
|
82
|
+
<rect x="728" y="548" width="454" height="76" rx="10" fill="#ffffff" stroke="#0b6fb8" stroke-width="1.6"/>
|
|
83
|
+
<text x="955" y="565.8" font-size="12.5" font-weight="700" fill="#10202e" text-anchor="middle">上下文 / compact</text>
|
|
84
|
+
<text x="955" y="582.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">contextPct ≥ compactThreshold(默认 66)</text>
|
|
85
|
+
<text x="955" y="598.8" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">触发 DSH /compact;压缩后重申核心规则</text>
|
|
86
|
+
<text x="955" y="615.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">compactAfterRounds 默认 8;人设与哲学不丢</text>
|
|
87
|
+
<rect x="1204" y="548" width="454" height="76" rx="10" fill="#ffffff" stroke="#0b6fb8" stroke-width="1.6"/>
|
|
88
|
+
<text x="1431" y="565.8" font-size="12.5" font-weight="700" fill="#10202e" text-anchor="middle">活性 / 并发 / 恢复</text>
|
|
89
|
+
<text x="1431" y="582.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">activityTimeoutMs 心跳 · maxParallel 并发闸</text>
|
|
90
|
+
<text x="1431" y="598.8" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">停滞 stallAutoMeetingMs(默认 6 min)自动开会</text>
|
|
91
|
+
<text x="1431" y="615.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">resume 用 residents.json + progress.md 重种化</text>
|
|
92
|
+
<rect x="252" y="636" width="1406" height="84" rx="10" fill="#ffffff" stroke="#b3202c" stroke-width="1.6"/>
|
|
93
|
+
<text x="955" y="658.3" font-size="12" font-weight="700" fill="#10202e" text-anchor="middle">Lean 形式化验证(可调参数 formalVerify = off / encourage / require)· 工具 vibe_v4_lean_run / _archive / _lib</text>
|
|
94
|
+
<text x="955" y="674.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">encourage:按实现难度自行决定是否形式化;require:真/假结论必须先有「Lean 通过」或显式阻塞记录,否则记为未定论</text>
|
|
95
|
+
<text x="955" y="690.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">★ 一旦 Lean 通过,审查对象就变了:不再是「推导对不对」,而是「Lean 的定义/对象/条件/假设/结论是否忠实于命题原文」</text>
|
|
96
|
+
<text x="955" y="706.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">★ 忠实性缺陷(decision=defect)≠ 命题为假:撤回「已通过」+ 撤回归档证明 + 进「形式化待办」,绝不记成 0/假</text>
|
|
97
|
+
<rect x="252" y="732" width="1406" height="40" rx="10" fill="#ffffff" stroke="#0b6fb8" stroke-width="1.6"/>
|
|
98
|
+
<text x="955" y="756.0" font-size="11" font-weight="700" fill="#10202e" text-anchor="middle">subagent/end 之后框架按序推进:① 邮箱非空 → 唤醒非忙收件人 ② open 任务 → 唤醒提议人/认领人 ③ 待验证提议 → 开会 ④ 否则心跳:唤醒最久未活跃者并给它开会</text>
|
|
99
|
+
<rect x="230" y="816" width="470" height="250" rx="14" fill="#eef7f1" stroke="#1f7a52" stroke-width="2"/>
|
|
100
|
+
<text x="248" y="843" font-size="15" font-weight="700" fill="#125a3c">常驻专属库(每人一个目录)</text>
|
|
101
|
+
<text x="248" y="863" font-size="12" fill="#5d7788">本人可写 · 他人只读(跨读被鼓励)—— 直接经 fs 写入,框架只登记</text>
|
|
102
|
+
<rect x="252" y="872" width="426" height="176" rx="10" fill="#ffffff" stroke="#1f7a52" stroke-width="1.6"/>
|
|
103
|
+
<text x="465" y="909.9" font-size="11.5" font-weight="700" fill="#10202e" text-anchor="middle">Progress/<r-id>/progress.md</text>
|
|
104
|
+
<text x="465" y="925.4" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">本人持续进展(追加式,断点续跑靠它重种化)</text>
|
|
105
|
+
<text x="465" y="940.9" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle"></text>
|
|
106
|
+
<text x="465" y="956.4" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">Propos/<r-id>/<p-id>.md 命题</text>
|
|
107
|
+
<text x="465" y="971.9" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">Methods/<r-id>/<m-id>.md 理论 / 方法 / 工具</text>
|
|
108
|
+
<text x="465" y="987.4" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">Subproblems/<r-id>/<s-id>.md 子问题</text>
|
|
109
|
+
<text x="465" y="1002.9" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle"></text>
|
|
110
|
+
<text x="465" y="1018.4" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">每条记录必填:价值程度 / 动机用途计划 / 自身概率估计</text>
|
|
111
|
+
<rect x="720" y="816" width="470" height="250" rx="14" fill="#eef7f1" stroke="#1f7a52" stroke-width="2"/>
|
|
112
|
+
<text x="738" y="843" font-size="15" font-weight="700" fill="#125a3c">共享与定论(VibeMath/Projects/<project>/)</text>
|
|
113
|
+
<text x="738" y="863" font-size="12" fill="#5d7788">Shared/ 是协作产物;Verified/ 是唯一定论,写入后只读</text>
|
|
114
|
+
<rect x="742" y="872" width="426" height="176" rx="10" fill="#ffffff" stroke="#1f7a52" stroke-width="1.6"/>
|
|
115
|
+
<text x="955" y="909.9" font-size="11.5" font-weight="700" fill="#10202e" text-anchor="middle">Shared/meetings/<id>.md 会议录 + 结论</text>
|
|
116
|
+
<text x="955" y="925.4" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">Shared/debates/<target>.md 辩论录(初评 + 重评)</text>
|
|
117
|
+
<text x="955" y="940.9" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">Shared/taskboard.md 任务板(提议 / 认领)</text>
|
|
118
|
+
<text x="955" y="956.4" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">Shared/meetings/brainstorm.md 起始头脑风暴</text>
|
|
119
|
+
<text x="955" y="971.9" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle"></text>
|
|
120
|
+
<text x="955" y="987.4" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">Verified/命题/<id>.md (或 问题/、方法→可信断言)</text>
|
|
121
|
+
<text x="955" y="1002.9" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">Problems/<id>.md 原问题陈述</text>
|
|
122
|
+
<text x="955" y="1018.4" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">未全票 → 留在来源库 + 平均概率 + 辩论录</text>
|
|
123
|
+
<rect x="1210" y="816" width="470" height="250" rx="14" fill="#eef7f1" stroke="#1f7a52" stroke-width="2"/>
|
|
124
|
+
<text x="1228" y="843" font-size="15" font-weight="700" fill="#125a3c">状态 / 隔离 / 恢复</text>
|
|
125
|
+
<text x="1228" y="863" font-size="12" fill="#5d7788">框架自己的状态:注册表、邮件箱、锁、进程纪元</text>
|
|
126
|
+
<rect x="1232" y="872" width="426" height="176" rx="10" fill="#ffffff" stroke="#1f7a52" stroke-width="1.6"/>
|
|
127
|
+
<text x="1445" y="909.9" font-size="11.5" font-weight="700" fill="#10202e" text-anchor="middle">State/residents.json 常驻注册表</text>
|
|
128
|
+
<text x="1445" y="925.4" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">State/mailboxes.json 邮件箱(谁还没读)</text>
|
|
129
|
+
<text x="1445" y="940.9" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">State/taskboard.json 任务板机器态</text>
|
|
130
|
+
<text x="1445" y="956.4" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">State/decisions.json 关键决策留痕</text>
|
|
131
|
+
<text x="1445" y="971.9" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">State/session.json 活动日志(人可读)</text>
|
|
132
|
+
<text x="1445" y="987.4" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">State/settings.json 参数(set 立即生效)</text>
|
|
133
|
+
<text x="1445" y="1002.9" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">State/formal.json Lean 形式化记录(非 off 档)</text>
|
|
134
|
+
<text x="1445" y="1018.4" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">fileOwner 写锁 · projectLock · processEpoch · abort→resume</text>
|
|
135
|
+
<rect x="230" y="1102" width="1450" height="118" rx="14" fill="#fdeef0" stroke="#b3202c" stroke-width="2"/>
|
|
136
|
+
<text x="248" y="1129" font-size="15" font-weight="700" fill="#b3202c">哲学红线(不可协商)</text>
|
|
137
|
+
<text x="248" y="1149" font-size="12" fill="#5d7788">这五条是设计本体,不是实现细节;改它们等于换一个架构</text>
|
|
138
|
+
<rect x="252" y="1158" width="268.4" height="56" rx="10" fill="#ffffff" stroke="#b3202c" stroke-width="1.6"/>
|
|
139
|
+
<text x="386.2" y="1174.6" font-size="11.5" font-weight="700" fill="#10202e" text-anchor="middle">框架绝不指派任务</text>
|
|
140
|
+
<text x="386.2" y="1190.1" font-size="10" font-weight="400" fill="#2c4557" text-anchor="middle">方向 / 分工 / 谁做什么</text>
|
|
141
|
+
<text x="386.2" y="1205.6" font-size="10" font-weight="400" fill="#2c4557" text-anchor="middle">只能由常驻留言与开会决定</text>
|
|
142
|
+
<rect x="536.4" y="1158" width="268.4" height="56" rx="10" fill="#ffffff" stroke="#b3202c" stroke-width="1.6"/>
|
|
143
|
+
<text x="670.5999999999999" y="1174.6" font-size="11.5" font-weight="700" fill="#10202e" text-anchor="middle">定论必须全体一致</text>
|
|
144
|
+
<text x="670.5999999999999" y="1190.1" font-size="10" font-weight="400" fill="#2c4557" text-anchor="middle">没有 forced / flat / 近共识收口</text>
|
|
145
|
+
<text x="670.5999999999999" y="1205.6" font-size="10" font-weight="400" fill="#2c4557" text-anchor="middle">强分歧只能留在库里</text>
|
|
146
|
+
<rect x="820.8" y="1158" width="268.4" height="56" rx="10" fill="#ffffff" stroke="#b3202c" stroke-width="1.6"/>
|
|
147
|
+
<text x="955" y="1174.6" font-size="11.5" font-weight="700" fill="#10202e" text-anchor="middle">只有 Verified/ 绝对可信</text>
|
|
148
|
+
<text x="955" y="1190.1" font-size="10" font-weight="400" fill="#2c4557" text-anchor="middle">其余(方法库未验证断言等)</text>
|
|
149
|
+
<text x="955" y="1205.6" font-size="10" font-weight="400" fill="#2c4557" text-anchor="middle">只作经验参考</text>
|
|
150
|
+
<rect x="1105.1999999999998" y="1158" width="268.4" height="56" rx="10" fill="#ffffff" stroke="#b3202c" stroke-width="1.6"/>
|
|
151
|
+
<text x="1239.3999999999999" y="1174.6" font-size="11.5" font-weight="700" fill="#10202e" text-anchor="middle">常驻不直接互调</text>
|
|
152
|
+
<text x="1239.3999999999999" y="1190.1" font-size="10" font-weight="400" fill="#2c4557" text-anchor="middle">留言一律经框架 relay</text>
|
|
153
|
+
<text x="1239.3999999999999" y="1205.6" font-size="10" font-weight="400" fill="#2c4557" text-anchor="middle">(模拟收件箱,先落盘再投递)</text>
|
|
154
|
+
<rect x="1389.6" y="1158" width="268.4" height="56" rx="10" fill="#ffffff" stroke="#b3202c" stroke-width="1.6"/>
|
|
155
|
+
<text x="1523.8" y="1174.6" font-size="11.5" font-weight="700" fill="#10202e" text-anchor="middle">人工干预不改变自组织</text>
|
|
156
|
+
<text x="1523.8" y="1190.1" font-size="10" font-weight="400" fill="#2c4557" text-anchor="middle">留言 / 开会 / 增删成员都可用</text>
|
|
157
|
+
<text x="1523.8" y="1205.6" font-size="10" font-weight="400" fill="#2c4557" text-anchor="middle">但"之后怎么做"仍由常驻决定</text>
|
|
158
|
+
<path d="M 129 338 L 129 470 L 230 470" fill="none" stroke="#5b4bb8" stroke-width="2" marker-start="url(#bothHuman)" marker-end="url(#bothHuman)"/>
|
|
159
|
+
<text x="129" y="384" font-size="12" font-weight="700" fill="#5b4bb8" text-anchor="middle" paint-order="stroke" stroke="#ffffff" stroke-width="4" stroke-linejoin="round">工具面</text>
|
|
160
|
+
<text x="129" y="404" font-size="11" font-weight="400" fill="#5b4bb8" text-anchor="middle" paint-order="stroke" stroke="#ffffff" stroke-width="4" stroke-linejoin="round">vibe_v4_*</text>
|
|
161
|
+
<text x="129" y="422" font-size="11" font-weight="400" fill="#5b4bb8" text-anchor="middle" paint-order="stroke" stroke="#ffffff" stroke-width="4" stroke-linejoin="round">/v4 命令</text>
|
|
162
|
+
<text x="129" y="446" font-size="13" font-weight="700" fill="#5b4bb8" text-anchor="middle" paint-order="stroke" stroke="#ffffff" stroke-width="4" stroke-linejoin="round">↓</text>
|
|
163
|
+
<text x="129" y="506" font-size="12" font-weight="700" fill="#5b4bb8" text-anchor="middle" paint-order="stroke" stroke="#ffffff" stroke-width="4" stroke-linejoin="round">汇报</text>
|
|
164
|
+
<text x="129" y="526" font-size="11" font-weight="400" fill="#5b4bb8" text-anchor="middle" paint-order="stroke" stroke="#ffffff" stroke-width="4" stroke-linejoin="round">status</text>
|
|
165
|
+
<text x="129" y="544" font-size="11" font-weight="400" fill="#5b4bb8" text-anchor="middle" paint-order="stroke" stroke="#ffffff" stroke-width="4" stroke-linejoin="round">report</text>
|
|
166
|
+
<text x="129" y="572" font-size="13" font-weight="700" fill="#5b4bb8" text-anchor="middle" paint-order="stroke" stroke="#ffffff" stroke-width="4" stroke-linejoin="round">↑</text>
|
|
167
|
+
<line x1="600" y1="338" x2="600" y2="400" stroke="#0b6fb8" stroke-width="2" marker-start="url(#bothFrame)" marker-end="url(#bothFrame)"/>
|
|
168
|
+
<line x1="1360" y1="338" x2="1360" y2="400" stroke="#0b6fb8" stroke-width="2" marker-start="url(#bothFrame)" marker-end="url(#bothFrame)"/>
|
|
169
|
+
<text x="980" y="366" font-size="10.5" font-weight="400" fill="#0b6fb8" text-anchor="middle" paint-order="stroke" stroke="#ffffff" stroke-width="4" stroke-linejoin="round">↑ 每轮提示词(状态块 + 本轮问句) ↓ 单个 JSON 回执</text>
|
|
170
|
+
<text x="980" y="386" font-size="9.5" font-weight="400" fill="#5d7788" text-anchor="middle" paint-order="stroke" stroke="#ffffff" stroke-width="4" stroke-linejoin="round">say / progress / record_* / propose_verify / verdict / vote_solved / input / reject_assign / task_done</text>
|
|
171
|
+
<line x1="560" y1="784" x2="560" y2="816" stroke="#1f7a52" stroke-width="2" marker-start="url(#bothData)" marker-end="url(#bothData)"/>
|
|
172
|
+
<text x="552" y="806" font-size="10.5" font-weight="400" fill="#1f7a52" text-anchor="end" paint-order="stroke" stroke="#ffffff" stroke-width="4" stroke-linejoin="round">沉淀 / 记录 / 唤醒</text>
|
|
173
|
+
<line x1="1180" y1="784" x2="1180" y2="816" stroke="#b3202c" stroke-width="2" stroke-dasharray="7 5" marker-start="url(#bothGate)" marker-end="url(#bothGate)"/>
|
|
174
|
+
<text x="1188" y="806" font-size="10.5" font-weight="400" fill="#b3202c" text-anchor="start" paint-order="stroke" stroke="#ffffff" stroke-width="4" stroke-linejoin="round">未全票 → 留库附概率(虚线)</text>
|
|
175
|
+
<text x="52" y="1246" font-size="12" font-weight="700" fill="#10202e" text-anchor="start">图例</text>
|
|
176
|
+
<rect x="108" y="1235" width="14" height="14" rx="3" fill="#ffffff" stroke="#5b4bb8" stroke-width="2"/>
|
|
177
|
+
<text x="129" y="1247" font-size="11" font-weight="400" fill="#2c4557" text-anchor="start">人 / 助手(外部接口,不研究不投票)</text>
|
|
178
|
+
<rect x="438" y="1235" width="14" height="14" rx="3" fill="#ffffff" stroke="#b26a00" stroke-width="2"/>
|
|
179
|
+
<text x="459" y="1247" font-size="11" font-weight="400" fill="#2c4557" text-anchor="start">常驻子代理(有表决权 · 自主方向)</text>
|
|
180
|
+
<rect x="768" y="1235" width="14" height="14" rx="3" fill="#ffffff" stroke="#0b6fb8" stroke-width="2"/>
|
|
181
|
+
<text x="789" y="1247" font-size="11" font-weight="400" fill="#2c4557" text-anchor="start">框架(中继 / 沉淀 / 计数 / 调度)</text>
|
|
182
|
+
<rect x="1098" y="1235" width="14" height="14" rx="3" fill="#ffffff" stroke="#1f7a52" stroke-width="2"/>
|
|
183
|
+
<text x="1119" y="1247" font-size="11" font-weight="400" fill="#2c4557" text-anchor="start">产物与状态(常驻专属库 / Shared / State)</text>
|
|
184
|
+
<rect x="1428" y="1235" width="14" height="14" rx="3" fill="#ffffff" stroke="#b3202c" stroke-width="2"/>
|
|
185
|
+
<text x="1449" y="1247" font-size="11" font-weight="400" fill="#2c4557" text-anchor="start">定论门槛 / Lean 形式化(可调)</text>
|
|
186
|
+
</g>
|
|
187
|
+
</svg>
|