dsh-vibe-math 2.2.1 → 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 (38) hide show
  1. package/AUDIT-CHECKLIST.md +48 -2
  2. package/README.md +368 -81
  3. package/RELEASE-NOTES-2.2.2.md +88 -0
  4. package/RELEASE-NOTES-2.3.0.md +207 -0
  5. package/audit-formal-sensitivity.mjs +247 -0
  6. package/audit-persona-sensitivity.mjs +249 -0
  7. package/audit-persona-surface.test.mjs +349 -0
  8. package/audit-v5-integrity.mjs +40 -1
  9. package/audit-v5-sensitivity.mjs +84 -6
  10. package/docs/formal-verification.md +321 -0
  11. package/docs/generate_framework_diagram_v5.mjs +290 -0
  12. package/docs//346/236/266/346/236/204/345/233/276.md +75 -0
  13. package/formal-verify-v2.test.mjs +672 -0
  14. package/formal-verify-v3.test.mjs +824 -0
  15. package/formal-verify-v4.test.mjs +603 -0
  16. package/formal-verify-v5.test.mjs +526 -0
  17. package/package.json +33 -15
  18. package/prompt-corpus-persona/persona-corpus.json +32 -0
  19. package/prompt-corpus-persona/persona-corpus.md +674 -0
  20. package/prompt-corpus-v3/formal-verify-v3.json +280 -0
  21. package/prompt-corpus-v3/formal-verify-v3.md +2826 -0
  22. package/prompt-corpus-v5/prompt-corpus-v5.json +131 -713
  23. package/prompt-corpus-v5/prompt-corpus-v5.md +1828 -5225
  24. package/prompt-v5-integrity.test.mjs +154 -11
  25. package/vibe-math-v2/agent.cordis.yml +40 -2
  26. package/vibe-math-v2/vibe-math-v2.js +627 -19
  27. package/vibe-math-v2//345/256/236/347/216/260/346/226/271/346/241/210.md +145 -1
  28. package/vibe-math-v3/agent.cordis.yml +46 -2
  29. package/vibe-math-v3/vibe-math-v3.js +749 -21
  30. package/vibe-math-v3//345/256/236/347/216/260/346/226/271/346/241/210.md +87 -2
  31. package/vibe-math-v4/agent.cordis.yml +46 -4
  32. package/vibe-math-v4/vibe-math-v4.js +652 -15
  33. package/vibe-math-v4//345/256/236/347/216/260/346/226/271/346/241/210.md +226 -0
  34. package/vibe-math-v5/agent.cordis.yml +41 -5
  35. package/vibe-math-v5/vibe-math-v5.js +572 -9
  36. package/vibe-math-v5//345/256/236/347/216/260/346/226/271/346/241/210.md +122 -4
  37. package/vibe-math-v5//346/236/266/346/236/204/345/233/276.md +426 -0
  38. package//347/244/272/344/276/213/345/233/276//346/241/206/346/236/266/345/233/276-v5.svg +173 -0
@@ -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 人可读镜像
@@ -898,6 +903,20 @@ pass,而该 pass 又立刻唤醒同一个任务所有者 —— 一个未完
898
903
  节流后,⑥ 成为兜底:空闲窗口到期时,**拥有进行中任务的成员收到的是常规工作轮**
899
904
  (其状态块里写着"我的任务"),而不是泛泛的心跳轮。
900
905
 
906
+ **① / ② 的相对顺序不可观测,但"互斥"必须双向成立。** 上面的列表把"进行中的验证"写在
907
+ "进行中的会议"之前,代码里则是先看会议再看验证 —— 这**没有差别**,因为两者**永不同时存在**。
908
+ 关键是这条互斥必须**两个方向都堵住**:
909
+
910
+ - 会议侧:`startMeeting` 在 `hasVerifyInFlight()` 时把会议**暂存**(pendingMeeting);
911
+ - 验证侧:`armNextVerify` 在 `meeting` 非空时**直接返回**,让提议留在队列里,
912
+ 等会议收口后由下一次 `schedulePass` 启动。
913
+
914
+ 只做前一半是不够的:`maybeQueueVerify` **直接**调用 `armNextVerify`(绕过了 `schedulePass`
915
+ 的会议检查),所以成员在会议进行中回执 `propose_verify` 时,第二个共识过程会**真的并发启动**,
916
+ 进而与会议争夺同一批成员、饿死会议的看门狗时钟。
917
+ (这个不对称是在为 v5 画架构图、被迫把"会议与验证互斥"写成明确的不变式之后,
918
+ 拿它去逐条对代码才暴露出来的 —— 见 `../AUDIT-CHECKLIST.md` §3。)
919
+
901
920
  与 v4 的实质差别:v4 靠 `activityTimeoutMs` 心跳**轮询**;v5 的主驱动是 **M1 的一次性活动等待**(DSH 官方机制),心跳降级为兜底,token 消耗显著下降。
902
921
 
903
922
  **永不永久停死**(v4 §25 的血泪教训):任何一次唤醒失败都必须**重新武装**调度(`armHeartbeat()`);`scheduleNext` 心跳分支失败后不得无条件 `return`。
@@ -1020,6 +1039,86 @@ Progress/,不要从头再来",**不得**复用 `【入职首轮】` 与"你
1020
1039
  4. **每条提示词不变式都要有灵敏度探针**:`audit-v5-sensitivity.mjs` 中每个"提示词/交互"探针
1021
1040
  必须能让上述套件变红;探针若始终为绿,说明该不变式其实没被测到。
1022
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
+
1023
1122
  ---
1024
1123
 
1025
1124
  ## 15. 工具面
@@ -1043,7 +1142,10 @@ Progress/,不要从头再来",**不得**复用 `【入职首轮】` 与"你
1043
1142
  | `vibe_v5_task_get` | `{ task_id }` | 读单个任务(改前必读) |
1044
1143
  | `vibe_v5_task_update` | `{ task_id, expected_revision, action, … }` | CAS 变更任务 |
1045
1144
  | `vibe_v5_hire` | `{ kind:'temp', purpose, initial_task, direction? }` | **雇佣临时工**(院士/研究员) |
1046
- | `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 }` | **仅所办**:解聘一名常驻研究员 |
1047
1149
  | `vibe_v5_status` | `{}` | 本所现状(编制/任务/会议/验证) |
1048
1150
 
1049
1151
  **院士专用工具**(注册在同一作用域,handler 内做职权校验;非院士调用返回 `V5_NOT_ACADEMICIAN`):
@@ -1055,6 +1157,14 @@ Progress/,不要从头再来",**不得**复用 `【入职首轮】` 与"你
1055
1157
  | `vibe_v5_prioritize` | `{ order:[{task_id, priority}], why }` | **设定全所优先级**与路线取舍(L3) |
1056
1158
  | `vibe_v5_nudge` | `{ to, why, next_step? }` | **点名督办**:唤醒某成员并给出具体下一步(L5) |
1057
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
+
1058
1168
  > 这四项工具是"以院士为中心"的机制落点。它们**只影响工作安排,绝不影响求真**——院士无法借此让任何对象进入 `Verified/`。
1059
1169
 
1060
1170
  ### 15.2 仅所办/人可用
@@ -1067,14 +1177,18 @@ Progress/,不要从头再来",**不得**复用 `【入职首轮】` 与"你
1067
1177
  | `vibe_v5_pause / vibe_v5_resume / vibe_v5_stop` | 暂停 / 恢复 / 终止 |
1068
1178
  | `vibe_v5_message { to\|all, content }` | 以所办身份留言 |
1069
1179
  | `vibe_v5_meeting { agenda, kind }` | 召集会议 |
1070
- | `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` | **仅所办**:增聘 / 解聘**常驻研究员**(成员只能提案) |
1071
1183
  | `vibe_v5_report` | 生成人读汇报(编制/进展/共识/待决) |
1072
1184
 
1073
- 外加 `/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`。
1074
1186
 
1075
1187
  ### 15.3 错误码(照搬 M7 风格)
1076
1188
 
1077
- `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`。
1078
1192
 
1079
1193
  ### 15.4 每轮回执契约(`replySpec`)
1080
1194
 
@@ -1120,6 +1234,10 @@ Progress/,不要从头再来",**不得**复用 `【入职首轮】` 与"你
1120
1234
  | `chatDigestMs` | `45000` | 群聊摘要合批时间窗 |
1121
1235
  | `chatDigestMax` | `12` | 摘要合批条数上限 |
1122
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) |
1123
1241
  | `provider` / `model` | `''` | 空 = 成员继承主代理路由 |
1124
1242
  | `toolAllow` / `toolDeny` | `[]` | 成员工具权限(空 = 全继承)。⚠ 空 `allow:[]` 会拒绝一切工具 |
1125
1243
  | `tempToolAllow` / `tempToolDeny` | `[]` | 临时工的工具权限(比常驻更窄;空 = 继承全部)。⚠ 空 `allow:[]` 会拒绝一切工具 |
@@ -0,0 +1,426 @@
1
+ # Vibe Math V5 架构图
2
+
3
+ > 本文件是 v5 的图源(GitHub 上 Mermaid 会**原生渲染**)。总览大图另有一张生成好的
4
+ > **SVG**:[`../示例图/框架图-v5.svg`](../示例图/框架图-v5.svg),由
5
+ > [`../docs/generate_framework_diagram_v5.mjs`](../docs/generate_framework_diagram_v5.mjs) 生成
6
+ > (零依赖,`node docs/generate_framework_diagram_v5.mjs`)。
7
+ > 文字规格见 [`实现方案.md`](实现方案.md)。
8
+
9
+ **一句话**:v5 = **一个所办**(对外接口,不研究不投票)+ **一所研究所**(院士 / 常驻研究员 / 临时工)
10
+ + **一个只做媒介的框架**(中继 · 沉淀 · 计数 · 调度)。
11
+
12
+ ---
13
+
14
+ ## 1. 总览:三层 + 两个面
15
+
16
+ ```mermaid
17
+ flowchart TB
18
+ subgraph L0["👤 所办(会话根代理 / 人)—— 对外接口"]
19
+ OFF["自然语言接口 + 汇报者<br/>不研究 · 不投票<br/>只汇报、转达人的指令<br/>代持平台要求的一次性创建权"]
20
+ end
21
+
22
+ subgraph L1["🏛️ 研究所(所内自治:编制、组织与分派都在成员之间完成)"]
23
+ ACAD["院士 acad<br/>领头人 · 组织与协调中心<br/>L1 全所视图 / L2 分派 / L3 优先级<br/>L4 主持会议 / L5 督导 / L6 调人 / L7 对外"]
24
+ RES["常驻研究员 r-n(有表决权)<br/>continuable 持久会话 · 自主方向<br/>可自主雇佣/解雇自己的临时工"]
25
+ TMP["临时工 t-n(无表决权)<br/>为特定任务临时雇入<br/>可读/可想/可发言/可写自己的库"]
26
+ end
27
+
28
+ subgraph L2["⚙️ 框架 vibe-v5 —— 只是媒介"]
29
+ MSG["消息中继(持久邮箱)<br/>群聊 / 私信 / 致全体表决者<br/>所办通知 / 分派 / 督办 / 框架提示"]
30
+ MTG["会议 / 辩论<br/>议程 · 名册对账 · 随机发言序<br/>与验证互斥 · 看门狗"]
31
+ TASK["任务板(CAS + DAG)<br/>版本号比较交换 · 依赖环检测"]
32
+ VOTE["m 票共识验证<br/>独立初评 → 公开辩论"]
33
+ CTX["上下文与活性<br/>阈值压缩 · 免轮询活动等待 · 心跳"]
34
+ STAFF["编制与雇佣<br/>真实解雇(释放子会话)"]
35
+ SCHED["调度器<br/>优先级 + 并发闸 maxParallel"]
36
+ end
37
+
38
+ subgraph L3["💾 状态与产物"]
39
+ PROJ["会话日志的 host-only 投影单元<br/>键 vibeMathV5<br/>11 类事件 · 纯折叠 applyV5Event"]
40
+ FS["人可读产物<br/>Members/&lt;id&gt;/* · Shared/* · Verified/ · Problems/"]
41
+ end
42
+
43
+ RULE{{"求真门槛<br/>布尔一致 且 布尔票 ≥ m = min(quorumCap, 有表决权人数)<br/>否则留库 + 平均概率 + 辩论录"}}
44
+
45
+ OFF -->|"vibe_v5_* 工具 / /v5 命令"| SCHED
46
+ SCHED -->|"status / report(自然语言汇报)"| OFF
47
+ SCHED -->|"每轮提示词:状态块 + 本轮问句"| ACAD
48
+ SCHED -->|"每轮提示词:状态块 + 本轮问句"| RES
49
+ SCHED -->|"每轮提示词:状态块 + 本轮问句"| TMP
50
+ ACAD -->|"JSON 回执"| SCHED
51
+ RES -->|"JSON 回执"| SCHED
52
+ TMP -->|"JSON 回执"| SCHED
53
+ ACAD -.->|"所内组织:分派 / 优先级 / 督办(虚线 = 不由框架执行)"| RES
54
+ ACAD -.->|"调配"| TMP
55
+ MSG --- SCHED
56
+ MTG --- SCHED
57
+ TASK --- SCHED
58
+ VOTE --- SCHED
59
+ CTX --- SCHED
60
+ STAFF --- SCHED
61
+ SCHED <-->|"append 事件 / 折叠读状态"| PROJ
62
+ SCHED <-->|"读写产物"| FS
63
+ VOTE --> RULE
64
+ RULE -->|"定论"| FS
65
+
66
+ classDef human fill:#f1eefc,stroke:#5b4bb8,stroke-width:1.5px,color:#2b2359
67
+ classDef house fill:#fdf5e2,stroke:#b26a00,stroke-width:1.5px,color:#6b4200
68
+ classDef frame fill:#eaf3fd,stroke:#0b6fb8,stroke-width:1.5px,color:#084d80
69
+ classDef data fill:#eef7f1,stroke:#1f7a52,stroke-width:1.5px,color:#125a3c
70
+ classDef gate fill:#fdeef0,stroke:#b3202c,stroke-width:2px,color:#7d1620
71
+ class OFF human
72
+ class ACAD,RES,TMP house
73
+ class MSG,MTG,TASK,VOTE,CTX,STAFF,SCHED frame
74
+ class PROJ,FS data
75
+ class RULE gate
76
+ ```
77
+
78
+ ---
79
+
80
+ ## 2. 成员生命周期
81
+
82
+ ```mermaid
83
+ stateDiagram-v2
84
+ direction LR
85
+ [*] --> provisioning : newMember(分配代号,代号永不复用)
86
+ provisioning --> active : spawnMember 成功<br/>先落盘编制、再构造入职提示词
87
+ provisioning --> failed : startContinuable 抛错
88
+ active --> active : 一轮结束(subagent/end)→ 回执 → 调度
89
+ active --> dismissed : fire(真实释放子会话 + 收回任务 + 丢弃邮件)
90
+ dismissed --> [*]
91
+ failed --> [*] : 在 [未就位] 里对全所可见
92
+
93
+ note right of active
94
+ 每轮:框架发「状态块 + 本轮问句」,
95
+ 成员回一个 JSON(say/progress/record/
96
+ verdict/task_*/hire/fire/reject_assign/…)
97
+ end note
98
+ note right of dismissed
99
+ 未完成的任务自动释放回板;
100
+ 代号永不复用,重新雇佣会得到新代号
101
+ end note
102
+ ```
103
+
104
+ ---
105
+
106
+ ## 3. 一轮唤醒的时序(唯一的推进驱动)
107
+
108
+ ```mermaid
109
+ sequenceDiagram
110
+ autonumber
111
+ participant S as 调度器(框架代码)
112
+ participant M as 成员(continuable 子会话)
113
+ participant L as 会话日志投影(vibeMathV5)
114
+
115
+ S->>S: schedulePass:按优先级挑一个成员
116
+ S->>S: 先 ack 收件箱,再构造本轮提示词
117
+ S->>M: 【轮次】+ 状态块(编制/m/我的任务/新消息)+ 回执契约
118
+ M->>M: 读同事的库 · 推导 · 写自己的 Progress/ 与卡片
119
+ M-->>S: subagent/end + 单个 JSON 回执
120
+ S->>L: append 事件(message / progress / verdict / …)
121
+ S->>S: handleReply:发言 / 入库 / 任务 / 提议 / 投票 / 雇佣
122
+ S->>S: 记 contextPct;必要时发压缩指令
123
+ S->>S: scheduleNext()(蹦床:同一时刻只有一个调度 pass)
124
+ ```
125
+
126
+ > 关键点:**成员的一轮结束是唯一的推进驱动**。没有轮询;`vibe_v5_wait` 是一次性活动等待,
127
+ > 心跳只是最后的兜底,且每次唤醒后**永远重新武装**,所以调度器不会永久冻结。
128
+
129
+ ---
130
+
131
+ ## 4. 共识验证状态机(m 票布尔一致)
132
+
133
+ ```mermaid
134
+ stateDiagram-v2
135
+ [*] --> queued : 任何成员 propose_verify
136
+ queued --> initial : armNextVerify(会议进行中则排队等待)
137
+ initial --> debate : 所有表决者都答完<br/>但未定论且轮次 < verdictMaxRounds
138
+ debate --> debate : 重新投票(history 存上一轮)
139
+ initial --> true_ : 布尔票 ≥ m 且全为 1
140
+ initial --> false_ : 布尔票 ≥ m 且全为 0
141
+ debate --> true_
142
+ debate --> false_
143
+ initial --> undecided : 轮次用尽,或布尔票不足 m,或出现 1 与 0 分歧
144
+ debate --> undecided
145
+ true_ --> [*] : 写 Verified/卡 + 改写来源卡 + 辩论录
146
+ false_ --> [*] : 同上(结论为假)
147
+ undecided --> [*] : 留原库 + 全组平均概率 + 完整辩论录(不强行裁决)
148
+
149
+ note right of initial
150
+ 票是 [0,1] 的数值:
151
+ 恰好 1 = 断言为真;恰好 0 = 断言为假;
152
+ 严格介于两者 = 弃权/存疑
153
+ (不计入 m,但计入平均)
154
+ end note
155
+ note left of undecided
156
+ 看门狗:超过 2×activityTimeoutMs
157
+ 没有新票 → 放弃该验证并回到自组织
158
+ end note
159
+ ```
160
+
161
+ **判定规则(`judgeVerdict`)**:任何一张反向布尔票都**阻塞**定论 —— 少数派无法靠别人弃权
162
+ 把结论推过去。`quorumMode: "all-unanimous"` 可切回 v4 的"全体有表决权者一致"口径。
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
+
215
+ ---
216
+
217
+ ## 5. 会议流程(与验证互斥)
218
+
219
+ ```mermaid
220
+ flowchart TB
221
+ A["任何人 vibe_v5_meeting"] --> B{"院士或所办?"}
222
+ B -->|"否(含临时工)"| C["只能提议:框架转呈全体表决者<br/>署名 = 真实提议人"]
223
+ B -->|"是"| D{"已有验证进行中?"}
224
+ D -->|"是"| E["暂存 pendingMeeting<br/>(只保留第一条,后到者不覆盖)"]
225
+ D -->|"否"| F["真正召开:写纪要头 + 公告群聊"]
226
+ E -->|"验证清空后"| F
227
+ F --> G["按随机顺序逐个唤醒发言<br/>每人看到此前已发言者的意见"]
228
+ G --> H{"全部在册成员都发言了?"}
229
+ H -->|"否"| I["继续收集(跳过仍在忙的人)<br/>看门狗:2×activityTimeoutMs 无新发言 → 放弃"]
230
+ I --> H
231
+ H -->|"是"| J["收口:汇总表决 / 讨论结论<br/>检查是否全体认为已解决"]
232
+ J --> K["暂存会议补开(若有)"]
233
+ ```
234
+
235
+ **互斥的双向保证**(v2.2.2 起对称):
236
+ - `startMeeting`:验证进行中 → **会议暂存**;
237
+ - `armNextVerify`:会议进行中 → **验证排队**(此前只做了前一半,成员在会上提议验证会真的
238
+ 并发启动第二个共识过程,进而饿死会议的看门狗时钟)。
239
+
240
+ ---
241
+
242
+ ## 6. 调度优先级(`schedulePass`)
243
+
244
+ ```mermaid
245
+ flowchart TB
246
+ S["一轮结束 / 提议 / 定时器到期 → scheduleNext()(蹦床:只有一个 pass 在跑)"] --> P1
247
+ P1{"有进行中的会议?"} -->|"是"| M["continueMeetingRound()<br/>缺人则继续问;齐了就收口"]
248
+ P1 -->|"否"| P2{"有进行中的验证?"}
249
+ P2 -->|"是"| V["continueVerifyRound()<br/>缺票则继续问;齐了就裁定"]
250
+ P2 -->|"否"| P3["armNextVerify():启动队列里的下一个验证"]
251
+ P3 --> P4{"有暂存会议?"}
252
+ P4 -->|"是"| P5["beginMeeting()"]
253
+ P4 -->|"否"| P6["按 maxParallel 填并发预算:<br/>① 已认领/被分派的在办任务(按 activityTimeoutMs 节流)<br/>② 加急邮件(私信/分派/督办/框架提示)<br/>③ 到期群聊摘要"]
254
+ P6 --> P7{"本所停滞超过 stallAutoMeetingMs<br/>且无人在跑?"}
255
+ P7 -->|"是"| P8["自动召集一次同步会议(只促成,不指派)"]
256
+ P7 -->|"否"| P9{"最久未动者已空闲 ≥ activityTimeoutMs?"}
257
+ P9 -->|"是"| P10["推一把:有在办任务 → 常规工作轮;否则 → 心跳轮"]
258
+ P9 -->|"否"| P11["armDigest() + armHeartbeat()"]
259
+ ```
260
+
261
+ ---
262
+
263
+ ## 7. 状态:纯折叠 + 双后端
264
+
265
+ ```mermaid
266
+ flowchart LR
267
+ subgraph EV["11 类事件"]
268
+ E["institute · member · task · message · delivered ·<br/>meeting · debate · verdict · queue · counters · progress"]
269
+ end
270
+ EV --> FOLD["applyV5Event(纯函数折叠,只此一份)"]
271
+ FOLD --> ST["V5State<br/>{ institutes, order, diagnostics }"]
272
+ ST --> R1["读:stateOf(session, 'vibeMathV5')"]
273
+ ST --> R2["未知/损坏事件 → 跳过 + 记入 diagnostics<br/>(可用性优先,绝不因一条坏事件卡死全场)"]
274
+
275
+ subgraph B1["主后端(宿主有 sessionProjections)"]
276
+ P1["事件只追加进会话日志<br/>不进模型上下文 = 零 token 成本"]
277
+ P2["checkpoint 由 DSH 负责;restore 时<br/>从快照 + 日志尾部重新折叠"]
278
+ end
279
+ subgraph B2["回退后端(宿主没有该服务)"]
280
+ F1["加固 JSON:State/&lt;institute&gt;.v5state.json<br/>同一份折叠 · 串行写 · 写前必 load"]
281
+ end
282
+ R1 --> B1
283
+ R1 --> B2
284
+
285
+ style FOLD fill:#eaf3fd,stroke:#0b6fb8
286
+ style P1 fill:#eef7f1,stroke:#1f7a52
287
+ style P2 fill:#eef7f1,stroke:#1f7a52
288
+ style F1 fill:#fdf5e2,stroke:#b26a00
289
+ ```
290
+
291
+ **为什么用投影**:v4 的 `State/*.json` 直写带来"损坏静默覆盖 / 并发丢写 / 跨进程陈旧快照"一整类问题。
292
+ v5 的副作用只是往会话日志追加事件,跨进程与同进程恢复**走同一条代码路径**。
293
+
294
+ ---
295
+
296
+ ## 8. 提示词是怎么构成的(成员读到的文字 = 产品)
297
+
298
+ ```mermaid
299
+ flowchart LR
300
+ subgraph P["人设 persona(入职时冻结,随会话持久化,压缩后依然有效)"]
301
+ CH["公共规章(十节)<br/>编制与同事 · 通用规章 · 资料库与 progress<br/>组织与协调 · 表决规则 · 每轮节奏<br/>雇佣解雇 · 任务板 · 上下文纪律 · 停止条件"]
302
+ end
303
+ subgraph R["每轮提示词(临时,短)"]
304
+ ST["状态块<br/>&#91;状态&#93; 你是 &lt;代号&gt;(职位)|轮次|m|表决者数<br/>&#91;在册&#93; … &#91;未就位&#93; …<br/>&#91;任务板&#93; … &#91;新到的消息/通知&#93; …"]
305
+ ASK["本轮问句(常规 / 心跳 / 会议 / 表决)<br/>+ 收件箱(先 ack 再构造,绝不重复投递)"]
306
+ SPEC["回执契约(按职位裁剪)<br/>say / progress / record / propose_verify / verdict<br/>propose_meeting / task_* / reject_assign / input<br/>hire / fire / vote_solved / solved / contextPct / compacted"]
307
+ end
308
+ P --> MEM["成员(子会话)"]
309
+ R --> MEM
310
+ MEM --> OUT["单个 JSON 回执"]
311
+
312
+ style CH fill:#fdf5e2,stroke:#b26a00
313
+ style ST fill:#eaf3fd,stroke:#0b6fb8
314
+ style ASK fill:#eaf3fd,stroke:#0b6fb8
315
+ style SPEC fill:#eaf3fd,stroke:#0b6fb8
316
+ ```
317
+
318
+ **身份不变式(有测试与语料保证)**:
319
+
320
+ - 提示词里的身份 = 这条提示词**实际发给的成员**;题头、`[状态]`、人设资料库路径三者必须一致;
321
+ - 成员**先落盘进编制、再构造**它的入职提示词(否则会漏掉自己、并按加入前的编制算 m);
322
+ - 章程快照**冻结在入职时**(它写着"你入职时的在册编制"),重建会话时原样复用;
323
+ - 会话重建框为 `【会话重建】`,**不**自称"刚入职";
324
+ - 领袖叙事跟随真实编制:没有院士时,章程不得声称存在院士或承诺其派活;
325
+ - 框头按**真实来源**标注(所办分派 ≠ 院士分派;督办 ≠ 分派;致全体表决者 ≠ 私信);
326
+ - 框架反馈有独立发送者(`【框架提示】`),且**一次提示词只投递一条消息**。
327
+
328
+ ---
329
+
330
+ ## 9. 任务板(compare-and-set + DAG)
331
+
332
+ ```mermaid
333
+ flowchart LR
334
+ A["task_create<br/>subject / description / blocked_by / write_scopes / priority"] --> B["pending"]
335
+ B -->|"task_claim(全部依赖已完成才可认领)"| C["in_progress"]
336
+ C -->|"complete"| D["completed"]
337
+ C -->|"release"| B
338
+ D -->|"reopen"| B
339
+ B -->|"delete(有依赖者则拒绝)"| E["deleted"]
340
+ C -->|"reassign(仅院士/所办)"| C
341
+ F["任何修改都要带 expected_revision<br/>版本不符 → V5_TASK_STALE_REVISION"] -.-> A
342
+ G["owner 被解雇 → releaseTasksOf 自动收回"] -.-> B
343
+
344
+ style B fill:#eaf3fd,stroke:#0b6fb8
345
+ style C fill:#fdf5e2,stroke:#b26a00
346
+ style D fill:#eef7f1,stroke:#1f7a52
347
+ ```
348
+
349
+ ---
350
+
351
+ ## 10. 职权矩阵
352
+
353
+ | 动作 | 院士 | 常驻研究员 | 临时工 | 所办 |
354
+ |---|---|---|---|---|
355
+ | 发言 / 私信 / 致全体表决者 | ✅ | ✅ | ✅ | ✅(所办通知) |
356
+ | 写自己的成果库 / 认领任务 | ✅ | ✅ | ✅ | ❌(不是成员) |
357
+ | **表决**(进 `Verified/`) | ✅ 一票 | ✅ 一票 | ❌ | ❌ |
358
+ | 提议验证 / 提议开会 | ✅ | ✅ | ✅ | ✅(可直接召开) |
359
+ | **直接召开会议** | ✅ | ❌(只能提议) | ❌ | ✅ |
360
+ | **分派任务**(`vibe_v5_assign`) | ✅ | ❌ | ❌ | ✅ |
361
+ | 设定优先级(`vibe_v5_prioritize`) | ✅ | ❌ | ❌ | ✅ |
362
+ | 督导(`vibe_v5_nudge`) | ✅ | ❌ | ❌ | ✅ |
363
+ | **雇佣临时工** | ✅ | ✅(自己的) | ❌ | ✅ |
364
+ | **解雇临时工** | ✅(任何) | ✅(自己雇的) | ❌ | ✅ |
365
+ | 增聘 / 解聘**常驻研究员** | ❌(建议) | ❌(建议) | ❌ | ✅ |
366
+ | 暂停 / 恢复 / 停止 / 调参 | ❌ | ❌ | ❌ | ✅ |
367
+
368
+ > **分派不改变真假**:院士能分派工作、定优先级,但不能让任何断言因此变正确 ——
369
+ > 对象进 `Verified/` 仍然只能靠 m 票布尔一致。
370
+
371
+ ---
372
+
373
+ ## 11. 目录结构与制品
374
+
375
+ ```text
376
+ <会话工作区>/VibeMath/Projects/<项目>/Institutes/<研究所>/
377
+ ├─ Institutes.md # 编制镜像(人读快照,勿手改)
378
+ ├─ Problems/<id>.md # 原问题
379
+ ├─ Problems/conclusion.md # 结题记录(全体有表决权者一致认为已解决时生成)
380
+ ├─ Members/<代号>/
381
+ │ ├─ Progress/progress.md # 研究日志(叙述体,可追加;压缩后恢复状态的主要依据)
382
+ │ ├─ Propos/<id>.md # 命题
383
+ │ ├─ Methods/<id>.md # 方法 / 理论 / 工具
384
+ │ └─ Subproblems/<id>.md # 子问题
385
+ ├─ Shared/
386
+ │ ├─ Chat/<日期>.md # 群聊记录
387
+ │ ├─ Meetings/<mt-id>.md # 会议纪要(含表决小节)
388
+ │ ├─ Debates/<对象>.md # 辩论录(各轮票与理由 + 平均概率)
389
+ │ ├─ TaskBoard.md # 任务板镜像
390
+ │ └─ State-of-institute.md # 各成员对"是否已解决"的判断快照
391
+ ├─ Verified/<类型>/<id>.md # 定论(只读;只有它能被当作已确立)
392
+ └─ State/
393
+ ├─ README.md # 说明"权威状态在会话日志投影里,不是这里"
394
+ └─ <研究所>.v5state.json # 仅当宿主缺 sessionProjections 时的回退权威源
395
+ ```
396
+
397
+ **可信分层**:只有 `Verified/` 与标注"已验证·真/假"的卡片**绝对可信**;
398
+ `Progress/`、`Methods/`、未定论命题、他人推测都只是**经验参考**,引用时必须注明"未验证"。
399
+
400
+ ---
401
+
402
+ ## 12. 不变式速查(这些都有测试守着)
403
+
404
+ | 不变式 | 由谁保证 |
405
+ |---|---|
406
+ | 提示词身份 = 收件人;题头/状态块/人设三者一致 | `prompt-v5-integrity.test.mjs`(逐条断言 + 语料) |
407
+ | 成员先落盘进编制、再构造入职提示词 | 同上 |
408
+ | 章程冻结在入职时;重建会话自称"重建" | 同上 |
409
+ | 无院士时不出现任何院士叙事 | 同上 |
410
+ | 框头署名 = 真实来源 | 同上 |
411
+ | 一次提示词不重复投递同一条消息 | 同上 |
412
+ | 回执契约涵盖框架真正处理的每个字段 | 同上 |
413
+ | 只有 ≥ m 张一致的布尔票才能定论 | `selfdrive-v5.mjs` / `e2e-v5-round2.test.mjs` |
414
+ | 反向布尔票阻塞结论 | 同上 |
415
+ | 临时工无表决权、不能雇佣 | 同上 |
416
+ | 只有院士/所办能分派、定优先级、督办 | 同上 |
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` |
424
+ | 解雇是真实的(释放子会话、收回任务) | `selfdrive-v5.mjs` |
425
+ | 跨进程恢复不丢研究所 | `e2e-v5-round2.test.mjs` |
426
+ | 每条不变式都有能让套件变红的探针 | `audit-v5-sensitivity.mjs` + [`../AUDIT-CHECKLIST.md`](../AUDIT-CHECKLIST.md) |