dsh-vibe-math 2.2.2 → 2.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AUDIT-CHECKLIST.md +61 -3
- package/README.md +119 -1
- package/RELEASE-NOTES-2.3.0.md +207 -0
- package/RELEASE-NOTES-2.3.1.md +134 -0
- package/audit-formal-sensitivity.mjs +333 -0
- package/audit-persona-sensitivity.mjs +249 -0
- package/audit-persona-surface.test.mjs +349 -0
- package/audit-v5-integrity.mjs +43 -2
- package/audit-v5-sensitivity.mjs +77 -6
- package/docs/formal-verification.md +401 -0
- package/docs/generate_framework_diagram_v5.mjs +22 -16
- package/docs/test-timing.md +79 -0
- package/formal-verify-v2.test.mjs +951 -0
- package/formal-verify-v3.test.mjs +1031 -0
- package/formal-verify-v4.test.mjs +882 -0
- package/formal-verify-v5.test.mjs +598 -0
- package/package.json +22 -2
- package/prompt-corpus-persona/persona-corpus.json +32 -0
- package/prompt-corpus-persona/persona-corpus.md +674 -0
- package/prompt-corpus-v2/formal-verify-v2.json +394 -0
- package/prompt-corpus-v2/formal-verify-v2.md +4250 -0
- package/prompt-corpus-v3/formal-verify-v3.json +382 -0
- package/prompt-corpus-v3/formal-verify-v3.md +3843 -0
- package/prompt-corpus-v4/formal-verify-v4.json +84 -0
- package/prompt-corpus-v4/formal-verify-v4.md +255 -0
- package/prompt-corpus-v5/prompt-corpus-v5.json +109 -5
- package/prompt-corpus-v5/prompt-corpus-v5.md +653 -109
- package/prompt-v5-integrity.test.mjs +1158 -984
- package/run-tests.mjs +99 -0
- package/vibe-math-v2/agent.cordis.yml +40 -2
- package/vibe-math-v2/vibe-math-v2.js +811 -21
- package/vibe-math-v2//345/256/236/347/216/260/346/226/271/346/241/210.md +218 -1
- package/vibe-math-v3/agent.cordis.yml +46 -2
- package/vibe-math-v3/vibe-math-v3.js +810 -21
- package/vibe-math-v3//345/256/236/347/216/260/346/226/271/346/241/210.md +104 -2
- package/vibe-math-v4/agent.cordis.yml +46 -4
- package/vibe-math-v4/vibe-math-v4.js +744 -15
- package/vibe-math-v4//345/256/236/347/216/260/346/226/271/346/241/210.md +255 -0
- package/vibe-math-v5/agent.cordis.yml +41 -5
- package/vibe-math-v5/vibe-math-v5.js +621 -9
- package/vibe-math-v5//345/256/236/347/216/260/346/226/271/346/241/210.md +131 -4
- package/vibe-math-v5//346/236/266/346/236/204/345/233/276.md +57 -0
- package//347/244/272/344/276/213/345/233/276//346/241/206/346/236/266/345/233/276-v5.svg +51 -46
|
@@ -577,8 +577,13 @@ interface Member {
|
|
|
577
577
|
'vibe5/delivered' { version:1, instituteId, messageId, targetId }
|
|
578
578
|
'vibe5/meeting' { version:1, instituteId, index } // 会议索引
|
|
579
579
|
'vibe5/verdict' { version:1, instituteId, targetKey, record }
|
|
580
|
+
'vibe5/formal' { version:1, instituteId, target, record, todo }
|
|
581
|
+
// 对象的形式化记录 + 形式化待办
|
|
582
|
+
// (见 §14.6;与 verdict 同级的权威状态)
|
|
580
583
|
```
|
|
581
584
|
|
|
585
|
+
共 **12 类**事件。`vibe5/queue`(验证队列)、`vibe5/counters`(代号与编号)与 `vibe5/progress`(进展心跳)各占一类。
|
|
586
|
+
|
|
582
587
|
**折叠纪律(吸取官方教训)**:官方在遇到非法事件时会 `state.failure = ...` **永久闩锁**,此后任何读取都抛错。v5 **不闩锁**:非法事件被**跳过并计入 `diagnostics`**,状态继续前进。理由——研究所的可用性优先于对日志的洁癖,且事件由我们自己的代码产生,非法即代码缺陷,应由测试而非运行时闩锁来发现。
|
|
583
588
|
|
|
584
589
|
### 8.4 人可读镜像
|
|
@@ -1034,6 +1039,109 @@ Progress/,不要从头再来",**不得**复用 `【入职首轮】` 与"你
|
|
|
1034
1039
|
4. **每条提示词不变式都要有灵敏度探针**:`audit-v5-sensitivity.mjs` 中每个"提示词/交互"探针
|
|
1035
1040
|
必须能让上述套件变红;探针若始终为绿,说明该不变式其实没被测到。
|
|
1036
1041
|
|
|
1042
|
+
#### 14.5.9 静态提示词面:persona ↔ 注册表 ↔ 命令 hint(本次新增的审计维度)
|
|
1043
|
+
|
|
1044
|
+
§14.5.1–14.5.8 守着**运行时逐条发出的**提示词。还有一层此前**没有审计维度**:`agent.cordis.yml`
|
|
1045
|
+
的 persona 行本身——它是主代理收到的**唯一**一份"有哪些工具、能调哪些参数、`/v5` 有哪些子命令"的清单;
|
|
1046
|
+
而所有 e2e 套件都直接 `apply(ctx)`、**从不加载 YAML**,因此对这一层完全盲。加入 Lean 形式化时,
|
|
1047
|
+
四个架构里被发现的实际缺陷:
|
|
1048
|
+
|
|
1049
|
+
| 缺陷 | 后果 |
|
|
1050
|
+
|---|---|
|
|
1051
|
+
| v5:persona 从未列出 `vibe_v5_add_researcher` / `vibe_v5_remove_researcher`(仅所办的增删常驻),却同时声称"所办握有增聘常驻的权力" | 权力存在但工具不可发现 |
|
|
1052
|
+
| v5:persona 的 `/v5` 子命令列表漏了 `add` / `remove`(处理器实现了、`hint` 也列了) | 人读 prompt 与人读 hint 不一致 |
|
|
1053
|
+
| v5:`prefix` 与 `text` 两个块文字**漂移**(同一句一边 `are`、一边 `is`) | 旧宿主读 `text`、新宿主读 `prefix`,同一版本对不同宿主呈现不同文字 |
|
|
1054
|
+
| (跨架构)v2/v3/v4 的 persona 从未列出三个 `*_lean_*` 工具(它们**无条件注册**;只有 v5 列了) | 主代理不知道能力存在 |
|
|
1055
|
+
| (跨架构)v4 的 `vibe_v4_set` 参数表漏了 `formalVerify`/`leanCommand`/`leanArgs`/`leanTimeoutMs` | 开关不可发现 |
|
|
1056
|
+
| (跨架构)v4 的 `usage` 串长期列着不存在的 `message` 子命令 | 告诉用户一个会失败的子命令 |
|
|
1057
|
+
|
|
1058
|
+
现在由 `audit-persona-surface.test.mjs`(仓库根,197 条断言)把这一层变成硬约束:
|
|
1059
|
+
|
|
1060
|
+
1. **双向工具一致性**:注册的每个工具必须在 persona 的 `prefix` 与 `text` 两块里出现
|
|
1061
|
+
("未文档化"用**显式快照**表示——新增工具必须主动改快照,或在 persona 里写清;
|
|
1062
|
+
快照里那些是 `(member)` / `(academician)` 专用工具);
|
|
1063
|
+
反向:persona 里出现的每个 `vibe_*` 名字必须真的注册(抓改名/拼错/幽灵工具,`name*` 通配允许);
|
|
1064
|
+
2. `prefix` 与 `text` **逐行一致,只允许第 0 行不同**;
|
|
1065
|
+
3. Lean 面在两个块里齐全:三个工具名 + 四个参数名 + 三个档位名逐字 + 忠实性语义 + 三条路径;
|
|
1066
|
+
4. **斜杠命令三处表面一致**:`hint` ⊆ 实际分支、实际分支 ⊆ `hint`(`hint` 用 `...` 表示非穷举时除外)、
|
|
1067
|
+
失败 `usage` 串与分支集合**完全相等**、persona 的 `/vN` 列表与 `hint` 一致。
|
|
1068
|
+
(v4 的 `usage` 曾长期列着一个不存在的 `message` 子命令——与 v4 §23 修过的 `/v4 set` 同类复发。)
|
|
1069
|
+
5. 与共享契约 `docs/formal-verification.md` 交叉核对。
|
|
1070
|
+
|
|
1071
|
+
`audit-persona-sensitivity.mjs`(11 条探针)用变异副本证明上述断言真的会变红,并遵守 §2.5 的四条
|
|
1072
|
+
防假绿纪律:开跑前先确认**未变异**副本经由 `PERSONA_ROOT` 为绿、变异损坏 YAML 块结构判 SETUP-FAIL、
|
|
1073
|
+
`.js` 变异副本先过 `node --check`、锚点出现次数不符判 SETUP-FAIL。
|
|
1074
|
+
套件每次运行还**确定性重写**随包发布的人工复核语料 `prompt-corpus-persona/persona-corpus.{md,json}`
|
|
1075
|
+
(四个预设的 persona 原文 + 注册工具数 + 斜杠 hint 一览;跑在变异副本上时不写,避免污染语料)。
|
|
1076
|
+
`AUDIT-CHECKLIST.md` §1.6 已把这一类列为每次全面检查的必查项。
|
|
1077
|
+
|
|
1078
|
+
### 14.6 Lean 形式化验证(`formalVerify`)
|
|
1079
|
+
|
|
1080
|
+
完整契约见 [`../docs/formal-verification.md`](../docs/formal-verification.md)(四个架构共用)。v5 侧的要点:
|
|
1081
|
+
|
|
1082
|
+
**为什么要它**:m 票一致是**共识**,不是**证明**——它排除不了共同误解。形式化把"我认为"换成
|
|
1083
|
+
"内核已核对",于是**审查对象发生变化**:
|
|
1084
|
+
|
|
1085
|
+
| | 原验证工作 | 形式化通过后的验证工作 |
|
|
1086
|
+
|---|---|---|
|
|
1087
|
+
| 审查对象 | 命题本身(推导是否正确) | **忠实性**:Lean 代码里的定义/对象/条件/假设/结论是否与命题原文一致 |
|
|
1088
|
+
| 结论强度 | 共识(可能共同出错) | 严格(内核已检查),前提是忠实性成立 |
|
|
1089
|
+
| 副产品 | 无 | 可复用的 Lean 定义 / 引理库 |
|
|
1090
|
+
|
|
1091
|
+
**三档**:
|
|
1092
|
+
|
|
1093
|
+
- `off`(默认)——提示词里不出现任何 Lean 内容,验证流程与门禁完全不变(`off` 是**真正的无操作**,
|
|
1094
|
+
这是测试第 1 条断言);三个 Lean 工具仍然注册(注册是静态的),只是框架不告诉成员它们存在。
|
|
1095
|
+
- `encourage`——验证提示词给出"按实现难度决定是否形式化"的要求与工具/路径;
|
|
1096
|
+
常规轮与心跳轮给出"顺手形式化可复用对象"的要求;**不设门禁**。
|
|
1097
|
+
- `require`——同样的提示词(语气为必须),**加门禁**:真/假结论必须
|
|
1098
|
+
`formal.status ∈ {passed, blocked}`,否则本次裁定**不生效**:记为 `undecided`
|
|
1099
|
+
(原因 `formal-required`)、写 `Formal/TODO.md`、群聊公告、不写 `Verified/` 卡片,
|
|
1100
|
+
对象留在原库、可形式化后重新提议。`blocked` 就是"根据实现难度决定不做"的落点——
|
|
1101
|
+
决定权在代理,但**决定必须显式、可审计**(`note` 必填),不允许静默跳过。
|
|
1102
|
+
|
|
1103
|
+
**状态**:逐对象的形式化记录存在**投影**里(新事件类型 `vibe5/formal`,见 §8.3),
|
|
1104
|
+
因此它和 `verdicts` 一样:零 token 成本、随会话日志 checkpoint、跨进程恢复后仍在。
|
|
1105
|
+
`status().formal` / `report()` 的「Lean 形式化」小节是所办审计"我们到底拿到了严格证明,
|
|
1106
|
+
还是只有共识"的入口。
|
|
1107
|
+
|
|
1108
|
+
**路径**:本所工作文件 `Formal/<对象id>.lean`;**归档证明 `Verified/Lean/<对象id>.lean`**
|
|
1109
|
+
(与定论卡片同处 `Verified/`,一眼可见);可复用定义与已证引理放**跨项目**的
|
|
1110
|
+
`<VibeMath根>/Formal/{Lib,Proved}/`(因此 Lean 路径守卫的边界是 **VibeMath 根**,
|
|
1111
|
+
而不是研究所根——爬出研究所但仍在 VibeMath 内是合法的,这正是全局库所在)。
|
|
1112
|
+
|
|
1113
|
+
**门禁位置**:`continueVerifyRound` 里"判定为真/假 → `closeVerify`"这**唯一**收口点
|
|
1114
|
+
(`finalizeUndecided` 不受影响)。门禁不通过时调用 `deferForFormal`。
|
|
1115
|
+
|
|
1116
|
+
**忠实性缺陷(`decision='defect'`,契约 §4.1)**:`passed` 只保证"这段代码过了内核",
|
|
1117
|
+
**不保证它说的就是命题想说的**。首版提示词写的是"发现偏离 → 0"——那会让框架把
|
|
1118
|
+
"形式化写错了"记成"**命题为假**",在全 0 一致规则下直接把命题写进 `Verified/` 标注假,
|
|
1119
|
+
等于用求真更严格的机制**伪造出一个错误的否定结论**。现在:
|
|
1120
|
+
|
|
1121
|
+
- 表决者发现偏差时**不得投 0**,要给严格介于 0 与 1 之间的值(记为弃权)并用回执
|
|
1122
|
+
`formal:{decision:'defect', note:'<具体偏差>'}` 记录;
|
|
1123
|
+
- `recordFidelityDefect` 把该对象**降级为 `attempted`**、清空 `proof`、撤回
|
|
1124
|
+
`Verified/Lean/<id>.lean`(`subprocess` 可删则删,否则用"已撤回"说明覆盖,见
|
|
1125
|
+
`removeArchivedProof`)、写入 `Formal/TODO.md` 并群聊公告;
|
|
1126
|
+
- `require` 档下这次裁定**不定论**,对象进「形式化待办」,修正形式化并重新跑通后再投票;
|
|
1127
|
+
- 只有表决者**独立于这份 Lean 代码**也能确定命题为假时才投 0。
|
|
1128
|
+
|
|
1129
|
+
**提示词硬要求(契约 §6,四套一致)**:注入文本里的工具名**一律全称**
|
|
1130
|
+
(`vibe_v5_lean_*`;缩写 `lean_archive` 不是注册名,代理照抄就调用了一个不存在的工具);
|
|
1131
|
+
归档可复用定义/引理**前先跑通**(`run=true` 或先 `lean_run`),跑不通不许入库;
|
|
1132
|
+
**工具链缺失**(`LEAN_NOT_FOUND`)时把代码归档并在 `note` 写明"宿主无 Lean 工具链"——
|
|
1133
|
+
这算显式阻塞原因,门禁可以据此放行,代理不会因为装不了 Lean 而卡死。
|
|
1134
|
+
|
|
1135
|
+
**测试**:`formal-verify-v5.test.mjs`(117 断言,含 `defect` 的端到端路径:降级 + 撤回归档证明 +
|
|
1136
|
+
进待办 + `require` 档不定论;以及"注入文本不得出现缩写工具名"),fake-Lean 通过 `subprocess`
|
|
1137
|
+
服务注入,因此不需要真的装 Lean;`audit-v5-sensitivity.mjs` 里 9 个专打形式化的探针;
|
|
1138
|
+
`prompt-v5-integrity.test.mjs`(588 断言)把 Lean 相关提示词原文写进语料
|
|
1139
|
+
(`lean-work` / `lean-verify` / `lean-fidelity` / **`lean-require`** / **`lean-after-defect`**,
|
|
1140
|
+
共 70 条提示词),供人工复核"忠实性审查"那段与缺陷撤回后的状态;语料把工作区路径
|
|
1141
|
+
**大小写无关**地归一化为 `<WS>`(首版因 Windows 路径大小写差异漏掉了 VibeMath 根的绝对路径,
|
|
1142
|
+
语料因此不确定且泄露本机路径——已修)。
|
|
1143
|
+
|
|
1144
|
+
|
|
1037
1145
|
---
|
|
1038
1146
|
|
|
1039
1147
|
## 15. 工具面
|
|
@@ -1057,7 +1165,10 @@ Progress/,不要从头再来",**不得**复用 `【入职首轮】` 与"你
|
|
|
1057
1165
|
| `vibe_v5_task_get` | `{ task_id }` | 读单个任务(改前必读) |
|
|
1058
1166
|
| `vibe_v5_task_update` | `{ task_id, expected_revision, action, … }` | CAS 变更任务 |
|
|
1059
1167
|
| `vibe_v5_hire` | `{ kind:'temp', purpose, initial_task, direction? }` | **雇佣临时工**(院士/研究员) |
|
|
1060
|
-
| `vibe_v5_fire` | `{ id, reason }` |
|
|
1168
|
+
| `vibe_v5_fire` | `{ id, reason }` | **解雇临时工**(雇主/院士/所办) |
|
|
1169
|
+
| `vibe_v5_members` | `{}` | 编制名册(职位/雇主/状态/方向),供所办与院士速查 |
|
|
1170
|
+
| `vibe_v5_add_researcher` | `{ direction? }` | **仅所办**:增聘一名常驻研究员(成员只能提案,不能直接调用) |
|
|
1171
|
+
| `vibe_v5_remove_researcher` | `{ id }` | **仅所办**:解聘一名常驻研究员 |
|
|
1061
1172
|
| `vibe_v5_status` | `{}` | 本所现状(编制/任务/会议/验证) |
|
|
1062
1173
|
|
|
1063
1174
|
**院士专用工具**(注册在同一作用域,handler 内做职权校验;非院士调用返回 `V5_NOT_ACADEMICIAN`):
|
|
@@ -1069,6 +1180,14 @@ Progress/,不要从头再来",**不得**复用 `【入职首轮】` 与"你
|
|
|
1069
1180
|
| `vibe_v5_prioritize` | `{ order:[{task_id, priority}], why }` | **设定全所优先级**与路线取舍(L3) |
|
|
1070
1181
|
| `vibe_v5_nudge` | `{ to, why, next_step? }` | **点名督办**:唤醒某成员并给出具体下一步(L5) |
|
|
1071
1182
|
|
|
1183
|
+
**Lean 形式化验证工具**(全员可用,无条件注册;见 [`../docs/formal-verification.md`](../docs/formal-verification.md) 与 §14.6):
|
|
1184
|
+
|
|
1185
|
+
| 工具 | 参数 | 说明 |
|
|
1186
|
+
|---|---|---|
|
|
1187
|
+
| `vibe_v5_lean_run` | `{ file, target?, timeout_ms? }` | 在 `subprocess` 服务上执行 Lean,返回 `{ok, exitCode, ms, command, stdout, stderr}`。绝不抛异常:缺工具链 → `LEAN_NOT_FOUND`,超时 → `LEAN_TIMEOUT`,路径越界 → `V5_INVALID_ARGUMENT`。给了 `target` 就把这次运行记到该对象上 |
|
|
1188
|
+
| `vibe_v5_lean_archive` | `{ kind, name?, target?, content?, from?, note?, run? }` | `kind='def'/'lemma'` → 归档到**全局** `VibeMath/Formal/{Lib,Proved}/`;`kind='proof'` → 写 `Formal/<target>.lean`,运行通过则同时写 **`Verified/Lean/<target>.lean`** 并把对象标为 `passed`;`kind='blocked'` → 记录显式难度判断/阻塞原因(`note` 必填) |
|
|
1189
|
+
| `vibe_v5_lean_lib` | `{ refresh? }` | **重建并返回**三处索引(本所 `Formal/Index.md`、全局 `Lib/Index.md`、`Proved/Index.md`)与逐对象形式化状态;写新定义前先查重、直接复用 |
|
|
1190
|
+
|
|
1072
1191
|
> 这四项工具是"以院士为中心"的机制落点。它们**只影响工作安排,绝不影响求真**——院士无法借此让任何对象进入 `Verified/`。
|
|
1073
1192
|
|
|
1074
1193
|
### 15.2 仅所办/人可用
|
|
@@ -1081,14 +1200,18 @@ Progress/,不要从头再来",**不得**复用 `【入职首轮】` 与"你
|
|
|
1081
1200
|
| `vibe_v5_pause / vibe_v5_resume / vibe_v5_stop` | 暂停 / 恢复 / 终止 |
|
|
1082
1201
|
| `vibe_v5_message { to\|all, content }` | 以所办身份留言 |
|
|
1083
1202
|
| `vibe_v5_meeting { agenda, kind }` | 召集会议 |
|
|
1084
|
-
| `
|
|
1203
|
+
| `vibe_v5_members` | 编制名册(职位/雇主/状态/方向) |
|
|
1204
|
+
| `vibe_v5_hire / vibe_v5_fire` | 雇佣 / 解雇**临时工** |
|
|
1205
|
+
| `vibe_v5_add_researcher / vibe_v5_remove_researcher` | **仅所办**:增聘 / 解聘**常驻研究员**(成员只能提案) |
|
|
1085
1206
|
| `vibe_v5_report` | 生成人读汇报(编制/进展/共识/待决) |
|
|
1086
1207
|
|
|
1087
|
-
外加 `/v5` 斜杠命令:`configure | start | resume | pause | stop | status | report |
|
|
1208
|
+
外加 `/v5` 斜杠命令:`configure | start | resume | pause | stop | status | report | members | message | meeting | hire | fire | add | remove | set`。
|
|
1088
1209
|
|
|
1089
1210
|
### 15.3 错误码(照搬 M7 风格)
|
|
1090
1211
|
|
|
1091
|
-
`V5_INVALID_ARGUMENT`(参数缺失或非法,含"入库必须写明价值程度/动机用途计划/概率")、`V5_WRITE_FAILED`(库文件写入失败)、`V5_LEAD_REQUIRED`(职权不足)、`V5_NOT_ACADEMICIAN`(非院士调用院士专用工具)、`V5_NOT_MEMBER`、`V5_MEMBER_NOT_FOUND`、`V5_MEMBER_NAME_TAKEN`、`V5_MEMBER_LIMIT`、`V5_INVALID_MEMBER_NAME`、`V5_PROVISIONING_CONFLICT`、`V5_SELF_MESSAGE`、`V5_MAILBOX_FULL`、`V5_MESSAGE_TOO_LARGE`、`V5_INVALID_TIMEOUT`、`V5_WAIT_ABORTED`、`V5_TASK_LIMIT`、`V5_TASK_NOT_FOUND`、`V5_TASK_STALE_REVISION`、`V5_TASK_DELETED`、`V5_TASK_UNAUTHORIZED`、`V5_TASK_ALREADY_CLAIMED`、`V5_TASK_BLOCKED`、`V5_TASK_INVALID_TRANSITION`、`V5_TASK_HAS_DEPENDENTS`、`V5_TASK_DEPENDENCY_CYCLE`、`V5_NOT_VOTER`(临时工投票)、`V5_INVALID_VERDICT`、`V5_INSTITUTE_STATE`、`V5_INVALID_WRITE_SCOPE`、`V5_INTERNAL`(框架内部不变式被破坏——例如"要生成某成员的状态块却没有给出该成员";**宁可显式失败,也绝不猜身份**)。
|
|
1212
|
+
`V5_INVALID_ARGUMENT`(参数缺失或非法,含"入库必须写明价值程度/动机用途计划/概率")、`V5_WRITE_FAILED`(库文件写入失败)、`V5_NOT_FOUND`(要执行的 Lean 文件不存在)、`V5_LEAD_REQUIRED`(职权不足)、`V5_NOT_ACADEMICIAN`(非院士调用院士专用工具)、`V5_NOT_MEMBER`、`V5_MEMBER_NOT_FOUND`、`V5_MEMBER_NAME_TAKEN`、`V5_MEMBER_LIMIT`、`V5_INVALID_MEMBER_NAME`、`V5_PROVISIONING_CONFLICT`、`V5_SELF_MESSAGE`、`V5_MAILBOX_FULL`、`V5_MESSAGE_TOO_LARGE`、`V5_INVALID_TIMEOUT`、`V5_WAIT_ABORTED`、`V5_TASK_LIMIT`、`V5_TASK_NOT_FOUND`、`V5_TASK_STALE_REVISION`、`V5_TASK_DELETED`、`V5_TASK_UNAUTHORIZED`、`V5_TASK_ALREADY_CLAIMED`、`V5_TASK_BLOCKED`、`V5_TASK_INVALID_TRANSITION`、`V5_TASK_HAS_DEPENDENTS`、`V5_TASK_DEPENDENCY_CYCLE`、`V5_NOT_VOTER`(临时工投票)、`V5_INVALID_VERDICT`、`V5_INSTITUTE_STATE`、`V5_INVALID_WRITE_SCOPE`、`V5_INTERNAL`(框架内部不变式被破坏——例如"要生成某成员的状态块却没有给出该成员";**宁可显式失败,也绝不猜身份**)。
|
|
1213
|
+
|
|
1214
|
+
Lean 工具另外会返回**非错误码**的失败原因(都属于"可读结果"而非异常):`NO_SUBPROCESS`(宿主没有 subprocess 服务)、`LEAN_NOT_FOUND`(解析不到 `leanCommand`)、`LEAN_SPAWN_FAILED`、`LEAN_RUN_FAILED`、`LEAN_FAILED`(编译器非零退出)、`LEAN_TIMEOUT`。
|
|
1092
1215
|
|
|
1093
1216
|
### 15.4 每轮回执契约(`replySpec`)
|
|
1094
1217
|
|
|
@@ -1134,6 +1257,10 @@ Progress/,不要从头再来",**不得**复用 `【入职首轮】` 与"你
|
|
|
1134
1257
|
| `chatDigestMs` | `45000` | 群聊摘要合批时间窗 |
|
|
1135
1258
|
| `chatDigestMax` | `12` | 摘要合批条数上限 |
|
|
1136
1259
|
| `meetingKeepEvery` | `5` | 每积累 N 个新产物自动发起一次同步会议 |
|
|
1260
|
+
| `formalVerify` | `'off'` | **Lean 形式化验证开关**(§14.6):`'off'` 不额外要求(默认)|`'encourage'` 鼓励(按实现难度自行决定,做了就归档)|`'require'` 强制(真/假定论前必须有 Lean 通过或显式阻塞记录,否则记为未定论并进入形式化待办)。非法值一律回退 `'off'`——**绝不回退到更强的模式** |
|
|
1261
|
+
| `leanCommand` | `'lean'` | 要执行的 Lean 可执行文件(例:`'lake'`) |
|
|
1262
|
+
| `leanArgs` | `[]` | 插在文件名之前的附加参数(例:`['env','lean']` 配合 `lakeCommand='lake'`) |
|
|
1263
|
+
| `leanTimeoutMs` | `120000` | 单次 Lean 运行的上限(<1000 会被抬到 1000) |
|
|
1137
1264
|
| `provider` / `model` | `''` | 空 = 成员继承主代理路由 |
|
|
1138
1265
|
| `toolAllow` / `toolDeny` | `[]` | 成员工具权限(空 = 全继承)。⚠ 空 `allow:[]` 会拒绝一切工具 |
|
|
1139
1266
|
| `tempToolAllow` / `tempToolDeny` | `[]` | 临时工的工具权限(比常驻更窄;空 = 继承全部)。⚠ 空 `allow:[]` 会拒绝一切工具 |
|
|
@@ -161,6 +161,57 @@ stateDiagram-v2
|
|
|
161
161
|
**判定规则(`judgeVerdict`)**:任何一张反向布尔票都**阻塞**定论 —— 少数派无法靠别人弃权
|
|
162
162
|
把结论推过去。`quorumMode: "all-unanimous"` 可切回 v4 的"全体有表决权者一致"口径。
|
|
163
163
|
|
|
164
|
+
### 4.1 Lean 形式化验证(可调参数 `formalVerify`)
|
|
165
|
+
|
|
166
|
+
完整契约见 [`../docs/formal-verification.md`](../docs/formal-verification.md)。**它改变的不是"更严格一点",
|
|
167
|
+
而是审查对象本身**:m 票一致是**共识**(排除不了共同误解),Lean 通过是**机器核对**,
|
|
168
|
+
于是剩下的唯一不确定项缩小为"Lean 代码是否忠实于命题原文"。
|
|
169
|
+
|
|
170
|
+
```mermaid
|
|
171
|
+
stateDiagram-v2
|
|
172
|
+
direction LR
|
|
173
|
+
[*] --> none : 对象被记录 / 被提议验证
|
|
174
|
+
none --> attempted : lean_run 跑了但未通过(记录编译器输出)
|
|
175
|
+
none --> attempted : 回执 formal.decision='used'
|
|
176
|
+
attempted --> passed : lean_archive kind='proof' 且该文件运行 exit 0
|
|
177
|
+
attempted --> blocked : lean_archive kind='blocked'(note 必填)
|
|
178
|
+
none --> blocked : 同上
|
|
179
|
+
passed --> [*] : 归档到 Verified/Lean/<id>.lean
|
|
180
|
+
blocked --> [*] : 记入 Formal/Index.md 的难度判断列
|
|
181
|
+
|
|
182
|
+
note right of passed
|
|
183
|
+
验证提示词随之切换为
|
|
184
|
+
「你不需要重新检查推导,
|
|
185
|
+
任务是忠实性审查」
|
|
186
|
+
end note
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
```mermaid
|
|
190
|
+
flowchart TB
|
|
191
|
+
A["全票一致判真 / 判假"] --> B{"formalVerify 模式"}
|
|
192
|
+
B -->|"off"| OK["照常写 Verified/ 卡片"]
|
|
193
|
+
B -->|"encourage"| OK
|
|
194
|
+
B -->|"require"| C{"formal.status ∈ {passed, blocked}?"}
|
|
195
|
+
C -->|"是"| OK2["照常写卡片,并在卡片上记 - 形式化: …"]
|
|
196
|
+
C -->|"否"| D["★ 本次裁定不生效:记为 undecided<br/>原因 formal-required|写 Formal/TODO.md<br/>群聊公告|不写 Verified/ 卡片"]
|
|
197
|
+
D --> E["完成形式化(kind='proof')或记录阻塞(kind='blocked')后重新提议验证"]
|
|
198
|
+
E --> A
|
|
199
|
+
|
|
200
|
+
style D fill:#fdeef0,stroke:#b3202c,stroke-width:2px
|
|
201
|
+
style OK2 fill:#eef7f1,stroke:#1f7a52
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
**三档**:`off`(默认,**真正的无操作**)|`encourage`(按实现难度自行决定,不设门禁)|
|
|
205
|
+
`require`(真/假结论必须先有 Lean 通过或**显式、可审计**的阻塞记录)。
|
|
206
|
+
|
|
207
|
+
**"根据实现难度决定不做"是被允许的,但必须说出来**:`blocked` 记录要求 `note` 非空 ——
|
|
208
|
+
决定权在代理,静默跳过不行。
|
|
209
|
+
|
|
210
|
+
**路径**:工作文件 `Formal/<对象id>.lean`|**归档证明 `Verified/Lean/<对象id>.lean`**(与定论卡片同处
|
|
211
|
+
`Verified/`)|可复用定义 `<VibeMath根>/Formal/Lib/`|已证引理 `<VibeMath根>/Formal/Proved/`。
|
|
212
|
+
跨项目复用是这套设计的核心收益,因此 Lean 路径守卫的边界是 **VibeMath 根**而不是研究所根
|
|
213
|
+
(爬出研究所但仍在 VibeMath 内是合法的,那正是全局库所在)。
|
|
214
|
+
|
|
164
215
|
---
|
|
165
216
|
|
|
166
217
|
## 5. 会议流程(与验证互斥)
|
|
@@ -364,6 +415,12 @@ flowchart LR
|
|
|
364
415
|
| 临时工无表决权、不能雇佣 | 同上 |
|
|
365
416
|
| 只有院士/所办能分派、定优先级、督办 | 同上 |
|
|
366
417
|
| 会议与验证互斥(双向) | `prompt-v5-integrity.test.mjs` |
|
|
418
|
+
| `formalVerify` 默认 `off` 是**真正的无操作**;非法值只回退到 `off` | `formal-verify-v5.test.mjs` |
|
|
419
|
+
| Lean 通过后,审查对象切换为**忠实性**("你不需要重新检查推导") | `formal-verify-v5.test.mjs` |
|
|
420
|
+
| `require` 模式:无形式化记录的真/假结论被记为未定论 + 形式化待办,不写 `Verified/` | `formal-verify-v5.test.mjs` |
|
|
421
|
+
| 「因难度决定不做形式化」必须显式记录原因(`note` 非空) | `formal-verify-v5.test.mjs` |
|
|
422
|
+
| 命题的证明归档到 `Verified/Lean/<id>.lean`;可复用定义归档到**跨项目** `Formal/Lib/` | `formal-verify-v5.test.mjs` |
|
|
423
|
+
| Lean 路径守卫按词法归一 `..`(字符串前缀检查会被穿越绕过) | `formal-verify-v5.test.mjs` |
|
|
367
424
|
| 解雇是真实的(释放子会话、收回任务) | `selfdrive-v5.mjs` |
|
|
368
425
|
| 跨进程恢复不丢研究所 | `e2e-v5-round2.test.mjs` |
|
|
369
426
|
| 每条不变式都有能让套件变红的探针 | `audit-v5-sensitivity.mjs` + [`../AUDIT-CHECKLIST.md`](../AUDIT-CHECKLIST.md) |
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1720
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1720 1204" width="1720" height="1204" role="img" aria-label="Vibe Math V5 研究所架构图">
|
|
3
3
|
<defs>
|
|
4
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
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>
|
|
@@ -7,7 +7,7 @@
|
|
|
7
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
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
9
|
</defs>
|
|
10
|
-
<rect width="1720" height="
|
|
10
|
+
<rect width="1720" height="1204" fill="#ffffff"/>
|
|
11
11
|
<g font-family="'Microsoft YaHei','PingFang SC','Hiragino Sans GB','Noto Sans CJK SC','Source Han Sans SC',sans-serif">
|
|
12
12
|
<text x="860" y="40" font-size="27" font-weight="700" fill="#10202e" text-anchor="middle">Vibe Math V5 —— 研究所体系</text>
|
|
13
13
|
<text x="860" y="67" font-size="13" font-weight="400" fill="#5d7788" text-anchor="middle">框架只是媒介:中继消息 · 沉淀产物 · 计数表决 · 管理上下文。它绝不指派任务 —— 组织与分派是所内院士的职责</text>
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
<text x="1431" y="482.2" font-size="13" font-weight="700" fill="#10202e" text-anchor="middle">临时工 t-3</text>
|
|
71
71
|
<text x="1431" y="499.2" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">由 r-3 雇入 · 可读/可想/可发言/可写自己的库</text>
|
|
72
72
|
<text x="576" y="536" font-size="10.5" font-weight="400" fill="#5d7788" text-anchor="start">所内组织动作(分派 · 优先级 · 督办 · 会议 · 用人)由院士发起,不是框架行为 —— 框架只负责送达</text>
|
|
73
|
-
<rect x="226" y="566" width="1454" height="
|
|
73
|
+
<rect x="226" y="566" width="1454" height="382" rx="14" fill="#eaf3fd" stroke="#0b6fb8" stroke-width="2"/>
|
|
74
74
|
<text x="244" y="593" font-size="15" font-weight="700" fill="#084d80">框架 vibe-v5 —— 只是媒介(middleware):中继 · 沉淀 · 计数 · 调度</text>
|
|
75
75
|
<text x="244" y="613" font-size="12" fill="#5d7788">每轮发「状态块 + 本轮问句」(规章在 persona 里,不进对话);成员回一个 JSON:say / progress / record / verdict / task_* / hire / fire / reject_assign / input / vote_solved</text>
|
|
76
76
|
<rect x="248" y="620" width="455.3333333333333" height="78" rx="10" fill="#ffffff" stroke="#0b6fb8" stroke-width="1.6"/>
|
|
@@ -103,34 +103,39 @@
|
|
|
103
103
|
<text x="1430.3333333333333" y="743.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">院士/研究员可雇自己的临时工</text>
|
|
104
104
|
<text x="1430.3333333333333" y="759.8" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">雇主或院士可真实解雇(释放子会话)</text>
|
|
105
105
|
<text x="1430.3333333333333" y="776.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">代号永不复用 · 按人/全所双配额</text>
|
|
106
|
-
<rect x="248" y="796" width="1410" height="
|
|
107
|
-
<text x="953" y="
|
|
108
|
-
<
|
|
109
|
-
<text x="
|
|
110
|
-
<text x="
|
|
111
|
-
<rect x="
|
|
112
|
-
<text x="
|
|
113
|
-
<
|
|
114
|
-
<text x="
|
|
115
|
-
<text x="
|
|
116
|
-
<
|
|
117
|
-
<text x="242" y="
|
|
118
|
-
<
|
|
119
|
-
<text x="
|
|
120
|
-
<text x="
|
|
121
|
-
<text x="
|
|
122
|
-
<text x="
|
|
123
|
-
<
|
|
124
|
-
<text x="621" y="
|
|
125
|
-
<
|
|
126
|
-
<text x="
|
|
127
|
-
<text x="
|
|
128
|
-
<
|
|
129
|
-
<text x="
|
|
130
|
-
<
|
|
131
|
-
<text x="
|
|
132
|
-
<text x="
|
|
133
|
-
<
|
|
106
|
+
<rect x="248" y="796" width="1410" height="76" rx="10" fill="#ffffff" stroke="#b3202c" stroke-width="1.6"/>
|
|
107
|
+
<text x="953" y="813.8" font-size="12.5" font-weight="700" fill="#10202e" text-anchor="middle">Lean 形式化验证(可调参数 formalVerify = off / encourage / require)</text>
|
|
108
|
+
<text x="953" y="830.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">encourage:验证时按实现难度决定是否形式化;require:真/假结论必须先有「Lean 通过」或显式阻塞记录</text>
|
|
109
|
+
<text x="953" y="846.8" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">★ 一旦 Lean 通过,审查对象就变了:不再是「推导对不对」,而是「Lean 的定义/对象/条件/假设/结论是否忠实于命题原文」</text>
|
|
110
|
+
<text x="953" y="863.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">归档:证明 → Verified/Lean/<对象>.lean|可复用定义 → VibeMath/Formal/Lib/|已证引理 → VibeMath/Formal/Proved/</text>
|
|
111
|
+
<rect x="248" y="880" width="1410" height="38" rx="10" fill="#ffffff" stroke="#0b6fb8" stroke-width="1.6"/>
|
|
112
|
+
<text x="953" y="903.1" font-size="11.5" font-weight="700" fill="#10202e" text-anchor="middle">调度器优先级:进行中的会议或验证(二者互斥,永不同时)→ 队列中的验证 → 暂存会议 → 已认领/被分派的在办任务(按 activityTimeoutMs 节流)→ 加急邮件 → 群聊摘要 → 停滞自动开会 → 兜底心跳</text>
|
|
113
|
+
<rect x="40" y="964" width="790" height="196" rx="14" fill="#eef7f1" stroke="#1f7a52" stroke-width="2"/>
|
|
114
|
+
<text x="58" y="991" font-size="15" font-weight="700" fill="#125a3c">状态权威源:会话日志的 host-only 投影单元(键 vibeMathV5)</text>
|
|
115
|
+
<text x="58" y="1011" font-size="12" fill="#5d7788">副作用只是往会话日志追加事件 —— 不进模型上下文(零 token 成本),checkpoint / restore 交给 DSH</text>
|
|
116
|
+
<rect x="62" y="1020" width="360" height="124" rx="10" fill="#ffffff" stroke="#1f7a52" stroke-width="1.6"/>
|
|
117
|
+
<text x="242" y="1046.3" font-size="12" font-weight="700" fill="#10202e" text-anchor="middle">applyV5Event(纯折叠,只此一份)</text>
|
|
118
|
+
<text x="242" y="1062.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">11 类事件:institute / member / task /</text>
|
|
119
|
+
<text x="242" y="1078.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">message / delivered / meeting / debate /</text>
|
|
120
|
+
<text x="242" y="1094.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">verdict / queue / counters / progress</text>
|
|
121
|
+
<text x="242" y="1110.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">未知或损坏事件 → 跳过并记入 diagnostics:</text>
|
|
122
|
+
<text x="242" y="1126.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">可用性优先,绝不因一条坏事件卡死全场</text>
|
|
123
|
+
<rect x="434" y="1020" width="374" height="124" rx="10" fill="#ffffff" stroke="#1f7a52" stroke-width="1.6"/>
|
|
124
|
+
<text x="621" y="1046.3" font-size="12" font-weight="700" fill="#10202e" text-anchor="middle">checkpoint / restore / resume</text>
|
|
125
|
+
<text x="621" y="1062.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">投影随会话日志一起 checkpoint;restore</text>
|
|
126
|
+
<text x="621" y="1078.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">时从快照 + 日志尾部重新折叠 → 跨进程与</text>
|
|
127
|
+
<text x="621" y="1094.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">同进程恢复走同一条代码路径</text>
|
|
128
|
+
<text x="621" y="1110.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">回退:宿主无 sessionProjections 时改用</text>
|
|
129
|
+
<text x="621" y="1126.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">加固 JSON:State/<institute>.v5state.json</text>
|
|
130
|
+
<rect x="852" y="964" width="828" height="196" rx="14" fill="#eef7f1" stroke="#1f7a52" stroke-width="2"/>
|
|
131
|
+
<text x="870" y="991" font-size="15" font-weight="700" fill="#125a3c">文件面:人可读产物(投影之外的一切都只是镜像)</text>
|
|
132
|
+
<text x="870" y="1011" font-size="12" fill="#5d7788">共识的权威在投影;文件是工作区与可读产物,手工改坏不会破坏研究所</text>
|
|
133
|
+
<rect x="874" y="1020" width="784" height="124" rx="10" fill="#ffffff" stroke="#1f7a52" stroke-width="1.6"/>
|
|
134
|
+
<text x="1266" y="1055.1" font-size="11.5" font-weight="700" fill="#10202e" text-anchor="middle">Members/<id>/Progress|Propos|Methods|Subproblems/</text>
|
|
135
|
+
<text x="1266" y="1070.6" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">只有本人可写,人人可读(跨读被鼓励)</text>
|
|
136
|
+
<text x="1266" y="1086.1" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">Shared/Chat/*.md · Shared/Meetings/<mt-id>.md · Shared/Debates/<obj>.md</text>
|
|
137
|
+
<text x="1266" y="1101.6" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">Shared/TaskBoard.md · Institutes.md(编制镜像)· State/README.md(说明此处非权威)</text>
|
|
138
|
+
<text x="1266" y="1117.1" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">Problems/<id>.md(原问题)· Problems/conclusion.md(结题)· Verified/<类型>/<id>.md(定论,只读)</text>
|
|
134
139
|
<path d="M 127 290 L 127 700 L 226 700" fill="none" stroke="#5b4bb8" stroke-width="2" marker-start="url(#bothHuman)" marker-end="url(#bothHuman)"/>
|
|
135
140
|
<text x="127" y="336" font-size="12" font-weight="700" fill="#5b4bb8" text-anchor="middle" paint-order="stroke" stroke="#ffffff" stroke-width="4" stroke-linejoin="round">工具面</text>
|
|
136
141
|
<text x="127" y="356" font-size="11" font-weight="400" fill="#5b4bb8" text-anchor="middle" paint-order="stroke" stroke="#ffffff" stroke-width="4" stroke-linejoin="round">vibe_v5_*</text>
|
|
@@ -149,20 +154,20 @@
|
|
|
149
154
|
<text x="980" y="559" 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>
|
|
150
155
|
<line x1="556" y1="400" x2="578" y2="400" stroke="#b26a00" stroke-width="1.8" stroke-dasharray="7 5" marker-start="url(#bothHouse)" marker-end="url(#bothHouse)"/>
|
|
151
156
|
<line x1="556" y1="430" x2="578" y2="430" stroke="#b26a00" stroke-width="1.8" stroke-dasharray="7 5" marker-start="url(#bothHouse)" marker-end="url(#bothHouse)"/>
|
|
152
|
-
<line x1="400" y1="
|
|
153
|
-
<text x="392" y="
|
|
154
|
-
<line x1="1280" y1="
|
|
155
|
-
<text x="1288" y="
|
|
156
|
-
<text x="52" y="
|
|
157
|
-
<rect x="108" y="
|
|
158
|
-
<text x="129" y="
|
|
159
|
-
<rect x="438" y="
|
|
160
|
-
<text x="459" y="
|
|
161
|
-
<rect x="768" y="
|
|
162
|
-
<text x="789" y="
|
|
163
|
-
<rect x="1098" y="
|
|
164
|
-
<text x="1119" y="
|
|
165
|
-
<rect x="1428" y="
|
|
166
|
-
<text x="1449" y="
|
|
157
|
+
<line x1="400" y1="940" x2="400" y2="964" stroke="#1f7a52" stroke-width="2" marker-start="url(#bothData)" marker-end="url(#bothData)"/>
|
|
158
|
+
<text x="392" y="956" font-size="10.5" font-weight="400" fill="#1f7a52" text-anchor="end" paint-order="stroke" stroke="#ffffff" stroke-width="4" stroke-linejoin="round">append / fold / stateOf</text>
|
|
159
|
+
<line x1="1280" y1="940" x2="1280" y2="964" stroke="#1f7a52" stroke-width="2" marker-start="url(#bothData)" marker-end="url(#bothData)"/>
|
|
160
|
+
<text x="1288" y="956" font-size="10.5" font-weight="400" fill="#1f7a52" text-anchor="start" paint-order="stroke" stroke="#ffffff" stroke-width="4" stroke-linejoin="round">读写产物</text>
|
|
161
|
+
<text x="52" y="1186" font-size="12" font-weight="700" fill="#10202e" text-anchor="start">图例</text>
|
|
162
|
+
<rect x="108" y="1175" width="14" height="14" rx="3" fill="#ffffff" stroke="#5b4bb8" stroke-width="2"/>
|
|
163
|
+
<text x="129" y="1187" font-size="11" font-weight="400" fill="#2c4557" text-anchor="start">所办 / 人(外部接口,不研究不投票)</text>
|
|
164
|
+
<rect x="438" y="1175" width="14" height="14" rx="3" fill="#ffffff" stroke="#b26a00" stroke-width="2"/>
|
|
165
|
+
<text x="459" y="1187" font-size="11" font-weight="400" fill="#2c4557" text-anchor="start">所内成员与所内组织(虚线 = 不由框架执行)</text>
|
|
166
|
+
<rect x="768" y="1175" width="14" height="14" rx="3" fill="#ffffff" stroke="#0b6fb8" stroke-width="2"/>
|
|
167
|
+
<text x="789" y="1187" font-size="11" font-weight="400" fill="#2c4557" text-anchor="start">框架(中继 / 沉淀 / 计数 / 调度)</text>
|
|
168
|
+
<rect x="1098" y="1175" width="14" height="14" rx="3" fill="#ffffff" stroke="#1f7a52" stroke-width="2"/>
|
|
169
|
+
<text x="1119" y="1187" font-size="11" font-weight="400" fill="#2c4557" text-anchor="start">状态与产物</text>
|
|
170
|
+
<rect x="1428" y="1175" width="14" height="14" rx="3" fill="#ffffff" stroke="#b3202c" stroke-width="2"/>
|
|
171
|
+
<text x="1449" y="1187" font-size="11" font-weight="400" fill="#2c4557" text-anchor="start">求真门槛 / Lean 形式化(可调)</text>
|
|
167
172
|
</g>
|
|
168
173
|
</svg>
|