dsh-vibe-math 2.1.0 → 2.2.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.
- package/README.md +15 -2
- package/RELEASE-NOTES-2.2.0.md +266 -0
- package/audit-v5-integrity.mjs +343 -0
- package/audit-v5-sensitivity.mjs +306 -0
- package/e2e-v5-round2.test.mjs +521 -0
- package/package.json +10 -2
- package/prompt-corpus-v5/prompt-corpus-v5.json +561 -0
- package/prompt-corpus-v5/prompt-corpus-v5.md +3804 -0
- package/prompt-v5-integrity.test.mjs +942 -0
- package/selfdrive-v5.mjs +470 -0
- package/vibe-math-v5/vibe-math-v5.js +377 -140
- package/vibe-math-v5//345/256/236/347/216/260/346/226/271/346/241/210.md +159 -3
|
@@ -748,11 +748,53 @@ VibeMath/Projects/<project>/Institutes/<institute>/
|
|
|
748
748
|
| 原语 | 语义 | 框架行为 |
|
|
749
749
|
|---|---|---|
|
|
750
750
|
| `vibe_v5_say { text }` | **群聊**(默认) | 扇出:对每位在册成员各投递一条 `【研究所·群聊】<你的代号>:<text>` |
|
|
751
|
-
| `vibe_v5_say { to, text }` | 私信 | 只投递给 `to
|
|
752
|
-
| `vibe_v5_say { to:'voters', text }` | 只给有表决权者 |
|
|
751
|
+
| `vibe_v5_say { to, text }` | 私信 | 只投递给 `to`,署名发送者,框头 `【研究所·私信 from <发送者>】` |
|
|
752
|
+
| `vibe_v5_say { to:'voters', text }` | 只给有表决权者 | 只投给有表决权者,框头 `【研究所·致全体表决者 from <发送者>】`。**不得**降级成"私信"框头:那会让收件人以为自己被单独点名 |
|
|
753
753
|
|
|
754
754
|
投递走 M2 的邮箱纪律:**先持久化再投递**;`'queued'` 不重发;按目标串行;失败者保留队列等下次唤醒。
|
|
755
755
|
|
|
756
|
+
**框头必须反映真实来源(代词化正确性)**,这是本框架的硬要求:
|
|
757
|
+
|
|
758
|
+
| 消息 kind | 框头 | 规则 |
|
|
759
|
+
|---|---|---|
|
|
760
|
+
| `chat` | `【研究所·群聊】<from>:…` | 来自必须是真的发言人 |
|
|
761
|
+
| `dm` | `【研究所·私信 from <from>】` | 同上 |
|
|
762
|
+
| `voters` | `【研究所·致全体表决者 from <from>】` | 会议提议、临时工参考意见、反对分派都走这条 |
|
|
763
|
+
| `office` | `【所办通知】` | 外部/所办 |
|
|
764
|
+
| `assign` | `【院士分派】` 或 **`【所办分派】`** | **按 `from` 判定**:所办分派绝不能伪装成院士分派 |
|
|
765
|
+
| `nudge` | `【督办 from <from>】`,正文区分"院士督办/所办督办" | 督办是**督导**,不是分派,不能复用 `assign` 的框头 |
|
|
766
|
+
| `notice` | `【框架提示】` | 框架发给单个成员的反馈(见 §11.5) |
|
|
767
|
+
|
|
768
|
+
**身份一律推导、绝不猜测**:任何"这是谁在说话"的判定都必须由 `exec.agent` 的会话关系推出——
|
|
769
|
+
是该所成员子会话就取该成员;是会话根代理(所办/人)就取 `office`;两者都不是就返回"无成员"。
|
|
770
|
+
**禁止**用"本会话最近唤醒过的成员"当兜底:那会让所办自己的分派被解析成某个研究员并被
|
|
771
|
+
`V5_NOT_ACADEMICIAN` 拒绝,也会让署名张冠李戴。(v2.2.0 实测缺陷)
|
|
772
|
+
|
|
773
|
+
### 11.5 框架反馈的投递(不许被自己挡掉)
|
|
774
|
+
|
|
775
|
+
框架需要把"你这一轮的动作没生效"告诉成员,例如:认领不存在的任务、`task_update` 版本过期、
|
|
776
|
+
`verdict` 不是 0–1 的数值、提议验证/开会未受理。**这些反馈必须真的送达到该成员。**
|
|
777
|
+
|
|
778
|
+
- 发送者必须是框架自己(`from: 'framework'`,框头 `【框架提示】`),**不能**写成"该成员发给该成员"——
|
|
779
|
+
`say()` 会以 `V5_SELF_MESSAGE` 拒绝自收自发的消息,反馈就永远送不到(实测缺陷:两条反馈通道
|
|
780
|
+
长期静默失效)。
|
|
781
|
+
- 反馈属于**紧急邮件**(`kind !== 'chat'`),会在该成员下一次被唤醒时立即随提示词送达。
|
|
782
|
+
|
|
783
|
+
### 11.6 邮箱只投递一次
|
|
784
|
+
|
|
785
|
+
一次唤醒的提示词里,**同一条消息只能出现一次**。实现上必须**先 ack 邮件、再构造本轮提示词**:
|
|
786
|
+
|
|
787
|
+
```
|
|
788
|
+
pending = pendingFor(member) // ① 取待投递
|
|
789
|
+
inbox = composeInbox(pending) // ② 组成框头块
|
|
790
|
+
ackPending(pending) // ③ 先销账
|
|
791
|
+
base = normalPrompt(member) // ④ 再构造(此时 pendingFor 已为空)
|
|
792
|
+
prompt = inbox + base
|
|
793
|
+
```
|
|
794
|
+
|
|
795
|
+
若顺序反了,`normalPrompt` 内嵌的状态块会再次列出同一批消息,成员会在同一条提示词里**读到两遍**
|
|
796
|
+
(实测缺陷)。因此 §11.2 的合批与状态块的 `[新到的消息/通知]` 是**同一条链路**,不能各自投递。
|
|
797
|
+
|
|
756
798
|
### 11.2 合批(吸取 v4 §27/§28"邮箱被长链饿死"的教训)
|
|
757
799
|
|
|
758
800
|
朴素的"每条群聊都唤醒所有人"会造成消息风暴与上下文爆炸。v5 采用**摘要合批**:
|
|
@@ -849,6 +891,13 @@ ctx.on('subagent/start', info => { const a = agents.get(info.id); if (a) liveAge
|
|
|
849
891
|
(只促成、不指派)
|
|
850
892
|
```
|
|
851
893
|
|
|
894
|
+
**④ 必须按 `activityTimeoutMs` 节流。** 指名唤醒(③)不受节流,新消息永远即时送达;
|
|
895
|
+
但"推一把自己的任务"必须**至少间隔一个空闲窗口**。否则:每一轮回复都会驱动一次调度
|
|
896
|
+
pass,而该 pass 又立刻唤醒同一个任务所有者 —— 一个未完成任务就变成
|
|
897
|
+
"唤醒 → 回合 → 唤醒"的无界链,任何参数都拦不住、暂停也插不进去,token 会无节制燃烧。
|
|
898
|
+
节流后,⑥ 成为兜底:空闲窗口到期时,**拥有进行中任务的成员收到的是常规工作轮**
|
|
899
|
+
(其状态块里写着"我的任务"),而不是泛泛的心跳轮。
|
|
900
|
+
|
|
852
901
|
与 v4 的实质差别:v4 靠 `activityTimeoutMs` 心跳**轮询**;v5 的主驱动是 **M1 的一次性活动等待**(DSH 官方机制),心跳降级为兜底,token 消耗显著下降。
|
|
853
902
|
|
|
854
903
|
**永不永久停死**(v4 §25 的血泪教训):任何一次唤醒失败都必须**重新武装**调度(`armHeartbeat()`);`scheduleNext` 心跳分支失败后不得无条件 `return`。
|
|
@@ -885,6 +934,92 @@ vibe_v5_resume:
|
|
|
885
934
|
|
|
886
935
|
因为状态来自日志投影,"跨进程"与"同进程 abort 后 resume"**走同一条代码路径**——v4 曾为此写了 `needRespawn`、`processEpoch`、`autoDone` 拒绝复活等一堆特判(§17/§18/§27-T24),v5 由架构消除。
|
|
887
936
|
|
|
937
|
+
### 14.5 提示词分配的正确性(身份 / 编制 / 交互不变式)
|
|
938
|
+
|
|
939
|
+
> **为什么单列一节**:2026-09 的实地测试发现,一个 123 条断言、15 个灵敏度探针全部通过的 v5,
|
|
940
|
+
> 在实际运行时**每个成员收到的提示词都写错了身份**——r-3 的入职提示里写着"你是 r-2",院士拿到的
|
|
941
|
+
> 是"你是 ?(常驻研究员)… 有表决权者 0 人"。原因是状态块从一个可变的"最近唤醒的成员"全局变量
|
|
942
|
+
> 取名,而创建路径又在该变量被赋值**之前**就构造了提示词。
|
|
943
|
+
> 这件事的教训是:**成员读到的文字本身就是产品**,必须有断言直接检查它。
|
|
944
|
+
|
|
945
|
+
#### 14.5.1 身份必须显式传递,绝不从全局推断
|
|
946
|
+
|
|
947
|
+
- 每个提示词构造函数都接收**它所描述的那个成员**(`normalPrompt(member)`、`verifyPrompt(member, vs)`…),
|
|
948
|
+
状态块 `briefBlock(member)` 直接用它。
|
|
949
|
+
- `briefBlock` 对"没给成员"**显式失败**(`V5_INTERNAL`),而不是退回"猜一个"。
|
|
950
|
+
猜测正是本缺陷的成因;显式失败至少能被测试立刻抓住。
|
|
951
|
+
- 禁止在提示词里使用 `currentMember` / `activeMembers()[0]` 之类的兜底。
|
|
952
|
+
(`currentMember` 只保留给"工具调用者"的兜底推断,且已在 §11.1 收紧。)
|
|
953
|
+
|
|
954
|
+
#### 14.5.2 编制必须**先落盘、后构造提示词**
|
|
955
|
+
|
|
956
|
+
成员在被写进编制之前不能被描述。因此 `spawnMember` 的顺序是**硬性**的:
|
|
957
|
+
|
|
958
|
+
```
|
|
959
|
+
① 把成员以 phase='active' 提交进投影(此时它已在 activeMembers() 里)
|
|
960
|
+
② 置 busy,禁止调度器唤醒半成品
|
|
961
|
+
③ 构造 persona 与入职提示词(二者都从 activeMembers() 取编制、m、有表决权者数)
|
|
962
|
+
④ 创建它的资料库目录、写编制镜像
|
|
963
|
+
⑤ 最后才 startContinuable
|
|
964
|
+
```
|
|
965
|
+
|
|
966
|
+
顺序反了会出现三个具体错报:入职成员**看不到自己在册**、`m` 与"有表决权者 N 人"按**加入前**的编制算、
|
|
967
|
+
章程里"你入职时的在册编制"漏掉自己。
|
|
968
|
+
|
|
969
|
+
**由此可验证的期望值**(4 名创始成员,`quorumCap=3`):
|
|
970
|
+
|
|
971
|
+
| 成员 | `[状态]` | `[在册]` | m | 有表决权者 |
|
|
972
|
+
|---|---|---|---|---|
|
|
973
|
+
| acad | 你是 acad(院士)|轮次 1 | acad | 1 | 1 |
|
|
974
|
+
| r-1 | 你是 r-1(常驻研究员)|轮次 1 | acad、r-1 | 2 | 2 |
|
|
975
|
+
| r-2 | 你是 r-2(常驻研究员)|轮次 1 | acad、r-1、r-2 | 3 | 3 |
|
|
976
|
+
| r-3 | 你是 r-3(常驻研究员)|轮次 1 | acad、r-1、r-2、r-3 | 3 | 4 |
|
|
977
|
+
|
|
978
|
+
#### 14.5.3 章程快照冻结在入职时
|
|
979
|
+
|
|
980
|
+
章程(persona)里写着"你入职时的在册编制",因此它必须是一次**入职快照**:首次创建时生成,
|
|
981
|
+
`resume` 重建会话时**原样复用**(`member.persona`),不得按恢复时的编制重写——否则那句话就变成假的。
|
|
982
|
+
编制的权威来源始终是每轮状态块(提示词里已明确写出这一条),并在章程 §五 注明 m 也可能随编制变化。
|
|
983
|
+
|
|
984
|
+
#### 14.5.4 重建 ≠ 入职
|
|
985
|
+
|
|
986
|
+
`resume` 重建子会话时,提示词必须框为 `【会话重建 —— <职位> <代号>】`,并明确"先读回你自己的
|
|
987
|
+
Progress/,不要从头再来",**不得**复用 `【入职首轮】` 与"你刚刚加入本所"。
|
|
988
|
+
|
|
989
|
+
#### 14.5.5 章程必须与真实编制一致
|
|
990
|
+
|
|
991
|
+
- 名册段落里的领头人必须是**实际在册的院士代号**,不得硬编码 `acad`;
|
|
992
|
+
- 当所办以 `academician:false` 建所时,章程**不得**声称存在院士,也不得要求成员"向院士汇报"
|
|
993
|
+
或承诺"院士可以给你派活";此时组织段落改为"全体有表决权者共同商议";
|
|
994
|
+
- 章程里出现的 m 是入职时的值,并已注明以状态块为准。
|
|
995
|
+
|
|
996
|
+
#### 14.5.6 未就位者必须可见
|
|
997
|
+
|
|
998
|
+
`briefBlock` 除 `[在册]` 外还要输出 `[未就位] <代号>(failed)`,把 provisioning 失败、
|
|
999
|
+
被标记 failed 的成员暴露给全所。静默略去会让整所不知道编制少了人。
|
|
1000
|
+
|
|
1001
|
+
#### 14.5.7 一次提示词只投递一条消息
|
|
1002
|
+
|
|
1003
|
+
见 §11.6。**先 ack、后构造**。
|
|
1004
|
+
|
|
1005
|
+
#### 14.5.8 提示词完整性的测试基线(**本框架的强制交付物**)
|
|
1006
|
+
|
|
1007
|
+
1. **提示词语料**:`prompt-v5-integrity.test.mjs` 在每次运行时把**框架真正发出的每一条提示词原文**
|
|
1008
|
+
写入 `prompt-corpus-v5/prompt-corpus-v5.md` 与 `.json`(工作区路径统一替换为 `<WS>` 以保证可 diff)。
|
|
1009
|
+
语料必须覆盖:入职(含临时工)、会话重建、常规轮、心跳轮、表决(初评 + 辩论)、会议、会议提议、
|
|
1010
|
+
各类收件框头(群聊/私信/致表决者/所办/院士分派/所办分派/督办/框架提示)、失败就位。
|
|
1011
|
+
**这是人工复核提示词正确性的入口**,不要求读者去翻会话日志。
|
|
1012
|
+
2. **逐条断言**每一条提示词:
|
|
1013
|
+
- `[状态]` 里的身份 = 提示词实际发给的成员 = 表头里的身份 = 随行人设指向的资料库路径;
|
|
1014
|
+
- `[在册]` 必含读者自身,且与提交流程一致;`有表决权者 N 人` 与 `[在册]` 中的表决者数一致;
|
|
1015
|
+
`m = min(quorumCap, N)`;
|
|
1016
|
+
- 表头轮次 = 状态块轮次;不存在 `?` / `undefined` / `NaN` / `[object Object]`;
|
|
1017
|
+
- 同一条消息不在一次提示词里出现两次,且一次提示词只有一个收件箱块。
|
|
1018
|
+
3. **回执契约**:被框架接受的所有字段(含 `reject_assign`、`task_done`、`input`)都必须在
|
|
1019
|
+
`replySpec` 里出现,且按职位裁剪(临时工没有表决/雇佣字段,非院士没有 `assign`/`prioritize`)。
|
|
1020
|
+
4. **每条提示词不变式都要有灵敏度探针**:`audit-v5-sensitivity.mjs` 中每个"提示词/交互"探针
|
|
1021
|
+
必须能让上述套件变红;探针若始终为绿,说明该不变式其实没被测到。
|
|
1022
|
+
|
|
888
1023
|
---
|
|
889
1024
|
|
|
890
1025
|
## 15. 工具面
|
|
@@ -939,7 +1074,28 @@ vibe_v5_resume:
|
|
|
939
1074
|
|
|
940
1075
|
### 15.3 错误码(照搬 M7 风格)
|
|
941
1076
|
|
|
942
|
-
`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
|
|
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`(框架内部不变式被破坏——例如"要生成某成员的状态块却没有给出该成员";**宁可显式失败,也绝不猜身份**)。
|
|
1078
|
+
|
|
1079
|
+
### 15.4 每轮回执契约(`replySpec`)
|
|
1080
|
+
|
|
1081
|
+
每轮提示词末尾都附一份 JSON 契约。**凡框架实际处理的字段,必须在此出现**,否则该通道对成员
|
|
1082
|
+
不可发现(成员根本不知道可以反对分派、可以直接报任务完成、可以在会议轮填 `input`)。
|
|
1083
|
+
按职位裁剪:
|
|
1084
|
+
|
|
1085
|
+
| 字段 | 院士 | 常驻研究员 | 临时工 | 说明 |
|
|
1086
|
+
|---|---|---|---|---|
|
|
1087
|
+
| `say` / `progress` / `record` | ✓ | ✓ | ✓ | 发言 / 进展 / 入库 |
|
|
1088
|
+
| `propose_verify` | ✓ | ✓ | ✓ | 临时工可提议,但无表决权 |
|
|
1089
|
+
| `verdict` | ✓ | ✓ | ✗ | 临时工的条目须注明"填了也记为无表决权" |
|
|
1090
|
+
| `propose_meeting` | ✓ | ✓ | ✓ | 仅提议 |
|
|
1091
|
+
| `convene_meeting` / `assign` / `prioritize` / `nudge` | ✓ | ✗ | ✗ | 院士的组织职权 |
|
|
1092
|
+
| `task_create` / `task_claim` / `task_done` / `task_update` | ✓ | ✓ | ✓ | 任务板 |
|
|
1093
|
+
| `reject_assign` | ✓ | ✓ | ✓ | **对分派的异议**:理由被广播给全体表决者 |
|
|
1094
|
+
| `input` | ✓ | ✓ | ✓ | 会议/辩论轮的发言正文 |
|
|
1095
|
+
| `hire` / `fire` | ✓ | ✓ | ✗ | 临时工不能雇佣他人 |
|
|
1096
|
+
| `vote_solved` / `solved` / `contextPct` / `compacted` | ✓ | ✓ | ✓ | 停止表决与上下文记账 |
|
|
1097
|
+
|
|
1098
|
+
框架对**未生效**的动作必须回一条 `【框架提示】`(§11.5),不得静默丢弃。
|
|
943
1099
|
|
|
944
1100
|
---
|
|
945
1101
|
|