dsh-vibe-math 2.2.2 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/AUDIT-CHECKLIST.md +28 -0
  2. package/README.md +98 -1
  3. package/RELEASE-NOTES-2.3.0.md +207 -0
  4. package/audit-formal-sensitivity.mjs +247 -0
  5. package/audit-persona-sensitivity.mjs +249 -0
  6. package/audit-persona-surface.test.mjs +349 -0
  7. package/audit-v5-integrity.mjs +40 -1
  8. package/audit-v5-sensitivity.mjs +77 -6
  9. package/docs/formal-verification.md +321 -0
  10. package/docs/generate_framework_diagram_v5.mjs +22 -16
  11. package/formal-verify-v2.test.mjs +672 -0
  12. package/formal-verify-v3.test.mjs +824 -0
  13. package/formal-verify-v4.test.mjs +603 -0
  14. package/formal-verify-v5.test.mjs +526 -0
  15. package/package.json +15 -2
  16. package/prompt-corpus-persona/persona-corpus.json +32 -0
  17. package/prompt-corpus-persona/persona-corpus.md +674 -0
  18. package/prompt-corpus-v3/formal-verify-v3.json +280 -0
  19. package/prompt-corpus-v3/formal-verify-v3.md +2826 -0
  20. package/prompt-corpus-v5/prompt-corpus-v5.json +75 -9
  21. package/prompt-corpus-v5/prompt-corpus-v5.md +384 -65
  22. package/prompt-v5-integrity.test.mjs +111 -10
  23. package/vibe-math-v2/agent.cordis.yml +40 -2
  24. package/vibe-math-v2/vibe-math-v2.js +627 -19
  25. package/vibe-math-v2//345/256/236/347/216/260/346/226/271/346/241/210.md +145 -1
  26. package/vibe-math-v3/agent.cordis.yml +46 -2
  27. package/vibe-math-v3/vibe-math-v3.js +749 -21
  28. package/vibe-math-v3//345/256/236/347/216/260/346/226/271/346/241/210.md +87 -2
  29. package/vibe-math-v4/agent.cordis.yml +46 -4
  30. package/vibe-math-v4/vibe-math-v4.js +652 -15
  31. package/vibe-math-v4//345/256/236/347/216/260/346/226/271/346/241/210.md +226 -0
  32. package/vibe-math-v5/agent.cordis.yml +41 -5
  33. package/vibe-math-v5/vibe-math-v5.js +562 -9
  34. package/vibe-math-v5//345/256/236/347/216/260/346/226/271/346/241/210.md +108 -4
  35. package/vibe-math-v5//346/236/266/346/236/204/345/233/276.md +57 -0
  36. 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,86 @@ 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
+ **测试**:`formal-verify-v5.test.mjs`(88 断言,fake-Lean 通过 `subprocess` 服务注入,
1117
+ 因此不需要真的装 Lean)+ `audit-v5-sensitivity.mjs` 里 9 个专打形式化的探针;
1118
+ `prompt-v5-integrity.test.mjs` 另有一组用例把 Lean 相关提示词原文写进语料
1119
+ (`lean-work` / `lean-verify` / `lean-fidelity`),供人工复核"忠实性审查"那段的措辞。
1120
+
1121
+
1037
1122
  ---
1038
1123
 
1039
1124
  ## 15. 工具面
@@ -1057,7 +1142,10 @@ Progress/,不要从头再来",**不得**复用 `【入职首轮】` 与"你
1057
1142
  | `vibe_v5_task_get` | `{ task_id }` | 读单个任务(改前必读) |
1058
1143
  | `vibe_v5_task_update` | `{ task_id, expected_revision, action, … }` | CAS 变更任务 |
1059
1144
  | `vibe_v5_hire` | `{ kind:'temp', purpose, initial_task, direction? }` | **雇佣临时工**(院士/研究员) |
1060
- | `vibe_v5_fire` | `{ id, reason }` | **解雇**(雇主/院士/所办) |
1145
+ | `vibe_v5_fire` | `{ id, reason }` | **解雇临时工**(雇主/院士/所办) |
1146
+ | `vibe_v5_members` | `{}` | 编制名册(职位/雇主/状态/方向),供所办与院士速查 |
1147
+ | `vibe_v5_add_researcher` | `{ direction? }` | **仅所办**:增聘一名常驻研究员(成员只能提案,不能直接调用) |
1148
+ | `vibe_v5_remove_researcher` | `{ id }` | **仅所办**:解聘一名常驻研究员 |
1061
1149
  | `vibe_v5_status` | `{}` | 本所现状(编制/任务/会议/验证) |
1062
1150
 
1063
1151
  **院士专用工具**(注册在同一作用域,handler 内做职权校验;非院士调用返回 `V5_NOT_ACADEMICIAN`):
@@ -1069,6 +1157,14 @@ Progress/,不要从头再来",**不得**复用 `【入职首轮】` 与"你
1069
1157
  | `vibe_v5_prioritize` | `{ order:[{task_id, priority}], why }` | **设定全所优先级**与路线取舍(L3) |
1070
1158
  | `vibe_v5_nudge` | `{ to, why, next_step? }` | **点名督办**:唤醒某成员并给出具体下一步(L5) |
1071
1159
 
1160
+ **Lean 形式化验证工具**(全员可用,无条件注册;见 [`../docs/formal-verification.md`](../docs/formal-verification.md) 与 §14.6):
1161
+
1162
+ | 工具 | 参数 | 说明 |
1163
+ |---|---|---|
1164
+ | `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` 就把这次运行记到该对象上 |
1165
+ | `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` 必填) |
1166
+ | `vibe_v5_lean_lib` | `{ refresh? }` | **重建并返回**三处索引(本所 `Formal/Index.md`、全局 `Lib/Index.md`、`Proved/Index.md`)与逐对象形式化状态;写新定义前先查重、直接复用 |
1167
+
1072
1168
  > 这四项工具是"以院士为中心"的机制落点。它们**只影响工作安排,绝不影响求真**——院士无法借此让任何对象进入 `Verified/`。
1073
1169
 
1074
1170
  ### 15.2 仅所办/人可用
@@ -1081,14 +1177,18 @@ Progress/,不要从头再来",**不得**复用 `【入职首轮】` 与"你
1081
1177
  | `vibe_v5_pause / vibe_v5_resume / vibe_v5_stop` | 暂停 / 恢复 / 终止 |
1082
1178
  | `vibe_v5_message { to\|all, content }` | 以所办身份留言 |
1083
1179
  | `vibe_v5_meeting { agenda, kind }` | 召集会议 |
1084
- | `vibe_v5_hire / vibe_v5_fire` | 代持雇佣/解雇(用于增聘常驻研究员) |
1180
+ | `vibe_v5_members` | 编制名册(职位/雇主/状态/方向) |
1181
+ | `vibe_v5_hire / vibe_v5_fire` | 雇佣 / 解雇**临时工** |
1182
+ | `vibe_v5_add_researcher / vibe_v5_remove_researcher` | **仅所办**:增聘 / 解聘**常驻研究员**(成员只能提案) |
1085
1183
  | `vibe_v5_report` | 生成人读汇报(编制/进展/共识/待决) |
1086
1184
 
1087
- 外加 `/v5` 斜杠命令:`configure | start | resume | pause | stop | status | report | meeting | members | hire | fire | set`。
1185
+ 外加 `/v5` 斜杠命令:`configure | start | resume | pause | stop | status | report | members | message | meeting | hire | fire | add | remove | set`。
1088
1186
 
1089
1187
  ### 15.3 错误码(照搬 M7 风格)
1090
1188
 
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`(框架内部不变式被破坏——例如"要生成某成员的状态块却没有给出该成员";**宁可显式失败,也绝不猜身份**)。
1189
+ `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`(框架内部不变式被破坏——例如"要生成某成员的状态块却没有给出该成员";**宁可显式失败,也绝不猜身份**)。
1190
+
1191
+ Lean 工具另外会返回**非错误码**的失败原因(都属于"可读结果"而非异常):`NO_SUBPROCESS`(宿主没有 subprocess 服务)、`LEAN_NOT_FOUND`(解析不到 `leanCommand`)、`LEAN_SPAWN_FAILED`、`LEAN_RUN_FAILED`、`LEAN_FAILED`(编译器非零退出)、`LEAN_TIMEOUT`。
1092
1192
 
1093
1193
  ### 15.4 每轮回执契约(`replySpec`)
1094
1194
 
@@ -1134,6 +1234,10 @@ Progress/,不要从头再来",**不得**复用 `【入职首轮】` 与"你
1134
1234
  | `chatDigestMs` | `45000` | 群聊摘要合批时间窗 |
1135
1235
  | `chatDigestMax` | `12` | 摘要合批条数上限 |
1136
1236
  | `meetingKeepEvery` | `5` | 每积累 N 个新产物自动发起一次同步会议 |
1237
+ | `formalVerify` | `'off'` | **Lean 形式化验证开关**(§14.6):`'off'` 不额外要求(默认)|`'encourage'` 鼓励(按实现难度自行决定,做了就归档)|`'require'` 强制(真/假定论前必须有 Lean 通过或显式阻塞记录,否则记为未定论并进入形式化待办)。非法值一律回退 `'off'`——**绝不回退到更强的模式** |
1238
+ | `leanCommand` | `'lean'` | 要执行的 Lean 可执行文件(例:`'lake'`) |
1239
+ | `leanArgs` | `[]` | 插在文件名之前的附加参数(例:`['env','lean']` 配合 `lakeCommand='lake'`) |
1240
+ | `leanTimeoutMs` | `120000` | 单次 Lean 运行的上限(<1000 会被抬到 1000) |
1137
1241
  | `provider` / `model` | `''` | 空 = 成员继承主代理路由 |
1138
1242
  | `toolAllow` / `toolDeny` | `[]` | 成员工具权限(空 = 全继承)。⚠ 空 `allow:[]` 会拒绝一切工具 |
1139
1243
  | `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/&lt;id&gt;.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 1116" width="1720" height="1116" role="img" aria-label="Vibe Math V5 研究所架构图">
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="1116" fill="#ffffff"/>
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="286" rx="14" fill="#eaf3fd" stroke="#0b6fb8" stroke-width="2"/>
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="38" rx="10" fill="#ffffff" stroke="#0b6fb8" stroke-width="1.6"/>
107
- <text x="953" y="819.1" font-size="11.5" font-weight="700" fill="#10202e" text-anchor="middle">调度器优先级:进行中的会议或验证(二者互斥,永不同时)→ 队列中的验证 → 暂存会议 → 已认领/被分派的在办任务(按 activityTimeoutMs 节流)→ 加急邮件 → 群聊摘要 → 停滞自动开会 → 兜底心跳</text>
108
- <rect x="40" y="876" width="790" height="196" rx="14" fill="#eef7f1" stroke="#1f7a52" stroke-width="2"/>
109
- <text x="58" y="903" font-size="15" font-weight="700" fill="#125a3c">状态权威源:会话日志的 host-only 投影单元(键 vibeMathV5)</text>
110
- <text x="58" y="923" font-size="12" fill="#5d7788">副作用只是往会话日志追加事件 —— 不进模型上下文(零 token 成本),checkpoint / restore 交给 DSH</text>
111
- <rect x="62" y="932" width="360" height="124" rx="10" fill="#ffffff" stroke="#1f7a52" stroke-width="1.6"/>
112
- <text x="242" y="958.3" font-size="12" font-weight="700" fill="#10202e" text-anchor="middle">applyV5Event(纯折叠,只此一份)</text>
113
- <text x="242" y="974.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">11 类事件:institute / member / task /</text>
114
- <text x="242" y="990.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">message / delivered / meeting / debate /</text>
115
- <text x="242" y="1006.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">verdict / queue / counters / progress</text>
116
- <text x="242" y="1022.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">未知或损坏事件 → 跳过并记入 diagnostics:</text>
117
- <text x="242" y="1038.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">可用性优先,绝不因一条坏事件卡死全场</text>
118
- <rect x="434" y="932" width="374" height="124" rx="10" fill="#ffffff" stroke="#1f7a52" stroke-width="1.6"/>
119
- <text x="621" y="958.3" font-size="12" font-weight="700" fill="#10202e" text-anchor="middle">checkpoint / restore / resume</text>
120
- <text x="621" y="974.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">投影随会话日志一起 checkpoint;restore</text>
121
- <text x="621" y="990.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">时从快照 + 日志尾部重新折叠 → 跨进程与</text>
122
- <text x="621" y="1006.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">同进程恢复走同一条代码路径</text>
123
- <text x="621" y="1022.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">回退:宿主无 sessionProjections 时改用</text>
124
- <text x="621" y="1038.3" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">加固 JSON:State/&lt;institute&gt;.v5state.json</text>
125
- <rect x="852" y="876" width="828" height="196" rx="14" fill="#eef7f1" stroke="#1f7a52" stroke-width="2"/>
126
- <text x="870" y="903" font-size="15" font-weight="700" fill="#125a3c">文件面:人可读产物(投影之外的一切都只是镜像)</text>
127
- <text x="870" y="923" font-size="12" fill="#5d7788">共识的权威在投影;文件是工作区与可读产物,手工改坏不会破坏研究所</text>
128
- <rect x="874" y="932" width="784" height="124" rx="10" fill="#ffffff" stroke="#1f7a52" stroke-width="1.6"/>
129
- <text x="1266" y="967.1" font-size="11.5" font-weight="700" fill="#10202e" text-anchor="middle">Members/&lt;id&gt;/Progress|Propos|Methods|Subproblems/</text>
130
- <text x="1266" y="982.6" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">只有本人可写,人人可读(跨读被鼓励)</text>
131
- <text x="1266" y="998.1" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">Shared/Chat/*.md · Shared/Meetings/&lt;mt-id&gt;.md · Shared/Debates/&lt;obj&gt;.md</text>
132
- <text x="1266" y="1013.6" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">Shared/TaskBoard.md · Institutes.md(编制镜像)· State/README.md(说明此处非权威)</text>
133
- <text x="1266" y="1029.1" font-size="10.5" font-weight="400" fill="#2c4557" text-anchor="middle">Problems/&lt;id&gt;.md(原问题)· Problems/conclusion.md(结题)· Verified/&lt;类型&gt;/&lt;id&gt;.md(定论,只读)</text>
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/&lt;对象&gt;.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/&lt;institute&gt;.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/&lt;id&gt;/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/&lt;mt-id&gt;.md · Shared/Debates/&lt;obj&gt;.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/&lt;id&gt;.md(原问题)· Problems/conclusion.md(结题)· Verified/&lt;类型&gt;/&lt;id&gt;.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="852" x2="400" y2="876" stroke="#1f7a52" stroke-width="2" marker-start="url(#bothData)" marker-end="url(#bothData)"/>
153
- <text x="392" y="868" 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>
154
- <line x1="1280" y1="852" x2="1280" y2="876" stroke="#1f7a52" stroke-width="2" marker-start="url(#bothData)" marker-end="url(#bothData)"/>
155
- <text x="1288" y="868" font-size="10.5" font-weight="400" fill="#1f7a52" text-anchor="start" paint-order="stroke" stroke="#ffffff" stroke-width="4" stroke-linejoin="round">读写产物</text>
156
- <text x="52" y="1098" font-size="12" font-weight="700" fill="#10202e" text-anchor="start">图例</text>
157
- <rect x="108" y="1087" width="14" height="14" rx="3" fill="#ffffff" stroke="#5b4bb8" stroke-width="2"/>
158
- <text x="129" y="1099" font-size="11" font-weight="400" fill="#2c4557" text-anchor="start">所办 / 人(外部接口,不研究不投票)</text>
159
- <rect x="438" y="1087" width="14" height="14" rx="3" fill="#ffffff" stroke="#b26a00" stroke-width="2"/>
160
- <text x="459" y="1099" font-size="11" font-weight="400" fill="#2c4557" text-anchor="start">所内成员与所内组织(虚线 = 不由框架执行)</text>
161
- <rect x="768" y="1087" width="14" height="14" rx="3" fill="#ffffff" stroke="#0b6fb8" stroke-width="2"/>
162
- <text x="789" y="1099" font-size="11" font-weight="400" fill="#2c4557" text-anchor="start">框架(中继 / 沉淀 / 计数 / 调度)</text>
163
- <rect x="1098" y="1087" width="14" height="14" rx="3" fill="#ffffff" stroke="#1f7a52" stroke-width="2"/>
164
- <text x="1119" y="1099" font-size="11" font-weight="400" fill="#2c4557" text-anchor="start">状态与产物</text>
165
- <rect x="1428" y="1087" width="14" height="14" rx="3" fill="#ffffff" stroke="#b3202c" stroke-width="2"/>
166
- <text x="1449" y="1099" font-size="11" font-weight="400" fill="#2c4557" text-anchor="start">求真门槛(唯一定论规则)</text>
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>