dsh-vibe-math 2.4.1 → 2.5.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 (42) hide show
  1. package/README.en.md +14 -14
  2. package/README.md +15 -14
  3. package/cordis.patch.yml +33 -10
  4. package/docs/AUDIT-CHECKLIST.md +25 -6
  5. package/docs/COMPAT-AUDIT-ROUND3.md +16 -1
  6. package/docs/release-notes/RELEASE-NOTES-2.5.0.md +173 -0
  7. package/docs/test-timing.md +73 -40
  8. package/installer.js +225 -45
  9. package/package.json +3 -2
  10. package/preset-declaration.js +38 -7
  11. package/prompt-corpus-persona/persona-corpus.json +9 -9
  12. package/prompt-corpus-persona/persona-corpus.md +67 -21
  13. package/prompt-corpus-v2/formal-verify-v2.json +116 -92
  14. package/prompt-corpus-v2/formal-verify-v2.md +240 -93
  15. package/prompt-corpus-v3/formal-verify-v3.json +81 -81
  16. package/prompt-corpus-v3/formal-verify-v3.md +288 -1111
  17. package/prompt-corpus-v4/formal-verify-v4.json +38 -8
  18. package/prompt-corpus-v4/formal-verify-v4.md +157 -25
  19. package/prompt-corpus-v5/prompt-corpus-v5.json +17 -17
  20. package/prompt-corpus-v5/prompt-corpus-v5.md +32 -26
  21. package/tests/audit-installer-compat.test.mjs +70 -4
  22. package/tests/audit-installer-policy.test.mjs +229 -4
  23. package/tests/audit-persona-sensitivity.mjs +11 -4
  24. package/tests/audit-persona-surface.test.mjs +5 -1
  25. package/tests/audit-v5-sensitivity.mjs +47 -6
  26. package/tests/e2e-v5-round2.test.mjs +354 -0
  27. package/tests/formal-verify-v2.test.mjs +54 -2
  28. package/tests/formal-verify-v3.test.mjs +63 -2
  29. package/tests/formal-verify-v4.test.mjs +120 -4
  30. package/tests/run-tests.mjs +104 -23
  31. package/vibe-math-v2/agent.cordis.yml +6 -0
  32. package/vibe-math-v2/vibe-math-v2.js +503 -99
  33. package/vibe-math-v2//345/256/236/347/216/260/346/226/271/346/241/210.md +20 -4
  34. package/vibe-math-v3/agent.cordis.yml +26 -10
  35. package/vibe-math-v3/vibe-math-v3.js +555 -175
  36. package/vibe-math-v3//345/256/236/347/216/260/346/226/271/346/241/210.md +3 -3
  37. package/vibe-math-v4/agent.cordis.yml +26 -6
  38. package/vibe-math-v4/vibe-math-v4.js +404 -51
  39. package/vibe-math-v4//345/256/236/347/216/260/346/226/271/346/241/210.md +91 -9
  40. package/vibe-math-v5/agent.cordis.yml +8 -4
  41. package/vibe-math-v5/vibe-math-v5.js +513 -105
  42. package/vibe-math-v5//345/256/236/347/216/260/346/226/271/346/241/210.md +73 -40
@@ -216,7 +216,7 @@ VibeMath/Projects/<project>/
216
216
  ## 进度
217
217
  ```
218
218
 
219
- **共享写锁**:仅对 `Shared/*`、`Problems/<id>.md`、`Verified/*` 使用 `vibe_v4_claim_write/release_write`(进程级 fileOwner,同 v3);各常驻目录内天然无冲突。
219
+ **共享写锁(未实现,描述已如实)**:v4 **没有**写锁。常驻只写自己的库(`Progress/Propos/Methods/Subproblems/<自己>/`),共享文件(`Shared/`、`State/`、`Verified/`)由框架独占写且按文件串行化(`writeJson`),所以并发的重叠写者不在设计里。`vibe_v4_claim_write`/`vibe_v4_release_write` 仍然注册(保持模型可见的工具面稳定),但**描述已改为 "NOT IMPLEMENTED"** 并回显 key、返回 `locked:false`——旧描述 "Reserved: shared-file write lock" 会让按 v3 经验调用的模型以为拿到了锁(见 §32)。
220
220
 
221
221
  ---
222
222
 
@@ -263,7 +263,7 @@ VibeMath/Projects/<project>/
263
263
  | `tools.register`(会话内所有代理可用,`exec.agent` 路由) | 常驻可直接调用 `vibe_v4_*` 与 `fs` |
264
264
  | `commands.register` | `/v4` slash 控制命令 |
265
265
  | `contextPct` + DSH `/compact` | 上下文占比达 66% 自动压缩(精确触发点实现时确认) |
266
- | `claimWrite/releaseWrite` + 项目锁(复用 v3 模式) | 共享文件写锁 + 会话项目锁 |
266
+ | `claimWrite/releaseWrite` + 项目锁(复用 v3 模式) | 共享文件写锁(**设计稿;最终未实现**——工具仍在但描述为 "NOT IMPLEMENTED",见 §7/§32)+ 会话项目锁 |
267
267
 
268
268
  ---
269
269
 
@@ -271,7 +271,7 @@ VibeMath/Projects/<project>/
271
271
 
272
272
  - **P0 脚手架**:`vibe-math-v4/`(`agent.cordis.yml`、`preset.yml`、`vibe-math-v4.js`);`installer.js` 增加 v4 安装/能力自检;`package.json files` 增加 v4;README 增 V4 小节。
273
273
  - **P1 常驻生命周期**:brainstorm→spawn N(各带方向)→track→wake→(`subagent/end`)→compact→resume;brainstormPhase 只产出初始方向并持久。
274
- - **P2 消息总线 + 邮件箱 + 跨读**:`send_message`/mailbox/唤醒;他人库只读工具;写锁。
274
+ - **P2 消息总线 + 邮件箱 + 跨读**:`send_message`/mailbox/唤醒;他人库只读工具;写锁(**设计稿;最终未实现**,见 §7/§32)。
275
275
  - **P3 会议 + 任务板 + 决策**:`meeting`/taskboard/decisions;分工涌现。
276
276
  - **P4 产物沉淀**:`record_proposition/method/subproblem` + `publish_progress`(价值/动机/概率必填校验)。
277
277
  - **P5 共识验证**:`propose_verify` + 独立初评 + 公开辩论 + 全票闭环;`Verified/` 生成与来源库回写。
@@ -287,7 +287,7 @@ VibeMath/Projects/<project>/
287
287
  | 全员等待、无人行动(僵死) | §9 活性机制(mailbox→taskboard→verify提案→心跳会议)兜底 |
288
288
  | 共识永达不成 | 对象留库附概率,不阻塞其它工作;不强行裁决 |
289
289
  | 上下文 blow-up | compact 阈值 + 每轮只带"梗概+新输入";会议/辩论录按需截断 |
290
- | 共享文件并发 | 写锁;各常驻专属文件无锁 |
290
+ | 共享文件并发 | **设计稿:写锁**(最终未实现——共享文件由框架独占写并按文件串行化,见 §7/§32);各常驻专属文件无锁 |
291
291
  | 常驻崩溃/退出 | `subagent/end` 异常置 `idle`;`resume` 重建 |
292
292
  | 常驻误用工具 | 默认继承会话工具;可用 `toolFilter` 收权为 `fs` + `vibe_v4_*` + 只读库工具 |
293
293
  | 多项目并发 | 各项目 `State/`+`Shared/` 隔离;`projectLock` 防两会话跑同一项目 |
@@ -321,7 +321,7 @@ VibeMath/Projects/<project>/
321
321
  6. 常驻上下文达 66%(可调)自动 `/compact`。
322
322
  7. 允许助手/人工中途干预(留言/提要求/开会/增开关闭常驻)。
323
323
  8. 仅当全体常驻一致认为原问题已解决才停止调度。
324
- 9. 支持断点续跑、多会话/多项目隔离、共享文件写锁 + 常驻专属文件隔离。
324
+ 9. 支持断点续跑、多会话/多项目隔离、共享文件写锁(**设计稿;最终未实现**,见 §7/§32)+ 常驻专属文件隔离。
325
325
 
326
326
  ---
327
327
 
@@ -361,7 +361,7 @@ VibeMath/Projects/<project>/
361
361
  | **`message(all)` 广播是空壳** | `to==='all'` 只返回一句 `broadcast: ...` 但什么都不投递。 | 新增 `broadcast()`:对每个常驻 `postMessage`(空闲唤醒/忙则入信箱),返回"投递到 N 个常驻"。 |
362
362
  | **`addMember` 出现 id 碰撞** | `newResident` 用 `'r-'+(residents.size+1)`;移除某常驻后再增开会用与现存常驻重复的 id。 | 改用会话级单调 `residentSeq`(`start()` 时清零),增开永不复用旧 id。 |
363
363
 
364
- > **未改(保留为已知边界)**:`maxParallel`/`activityTimeoutMs` 目前为声明参数但未实际限流/门控(保持"常驻持续推进"的收敛行为,未做心跳超时门控以免阻塞自组织推进);`claim_write`/`release_write` 仍为占位(常驻专属目录内天然无写冲突,共享文件由框架独占写);真实 DSH `/compact` API 见 §19(**2026 已修**:原 `agents.get` 查询为死代码,改为 `subagent/start` 捕获引用)。
364
+ > **未改(保留为已知边界)**:`maxParallel`/`activityTimeoutMs` 目前为声明参数但未实际限流/门控(保持"常驻持续推进"的收敛行为,未做心跳超时门控以免阻塞自组织推进);`claim_write`/`release_write` 仍为占位(常驻专属目录内天然无写冲突,共享文件由框架独占写),**它们的描述已在 §32 改为 "NOT IMPLEMENTED"**;真实 DSH `/compact` API 见 §19(**2026 已修**:原 `agents.get` 查询为死代码,改为 `subagent/start` 捕获引用;**§32 再修**:捕获点曾因 `childOwner` 未就位而恒早退)。
365
365
 
366
366
  ---
367
367
 
@@ -381,7 +381,7 @@ VibeMath/Projects/<project>/
381
381
 
382
382
  > 测试:`selfdrive-v4.mjs` 21/21(新增 B1 参数可见性断言);新增 `e2e-v4-fixes.test.mjs` 8/8(每项修复用独立 mock 宿主驱动:A1 非全票写回、A2 方法标 `类型: 方法`、A3 同进程 abort→resume 重建、B2 记录命题自动开会)。
383
383
 
384
- > **已知边界(未改)**:`maxParallel`/`activityTimeoutMs` 仍未实际限流/心跳门控(避免破坏"持续推进→收敛");`claim_write`/`release_write` 仍未落地为真锁;真实 DSH `/compact` API 已接通(见 §19,2026 修复:改为 `subagent/start` 捕获 Agent 引用)。
384
+ > **已知边界(未改)**:`maxParallel`/`activityTimeoutMs` 仍未实际限流/心跳门控(避免破坏"持续推进→收敛");`claim_write`/`release_write` 仍未落地为真锁,**但描述已改为如实(§32)**;真实 DSH `/compact` API 已接通(见 §19,2026 修复:改为 `subagent/start` 捕获 Agent 引用;§32 再修捕获时机)。
385
385
 
386
386
  ---
387
387
 
@@ -400,7 +400,7 @@ VibeMath/Projects/<project>/
400
400
  ### 真实 DSH `/compact`
401
401
  找到了 DSH 真实压缩服务:**`ctx.compaction`**(`@deepseek-ai/dsh-compaction` 的 `CompactionEngine`,`agent.cordis.yml` 已加载 compaction-basic)。v4 现在对每个常驻做**真实压缩**:
402
402
 
403
- - 在 `subagent/start` 时用 `ctx.agents.get(info.id)` 捕获该常驻**当时仍然注册**的 Agent 引用,存进 `liveAgents`(`childId → WeakRef<Agent>`);`onResidentEnd`(常驻空闲)里取回它,再调 `ctx.compaction.compactIfNeeded(agent, 'pressure', signal)`。
403
+ - 在 `subagent/start` 时用 `ctx.agents.get(info.id)` 捕获该常驻**当时仍然注册**的 Agent 引用,存进 `liveAgents`(`childId → WeakRef<Agent>`);`onResidentEnd`(常驻空闲)里取回它,再调 `ctx.compaction.compactNow(agent, signal)`(旧宿主无 `compactNow` 时退回 `compactIfNeeded(agent,'pressure',signal)`)。
404
404
  - `compactIfNeeded` 用 `ctx.tokenMeter` **真实测量**该常驻会话 token 量,超过其模型上下文窗口阈值时把旧历史折叠成总结节点——真正的 `/compact` 效果(而非仅"注入浓缩指令+记账复位")。
405
405
  - 成功后复位 `roundsSinceCompact/needCompact` 并记 `logActivity`。**若宿主未提供 `ctx.compaction`(或模型未配 `contextWindow`)则静默回退**到现有"自述指令"等效层。
406
406
 
@@ -414,7 +414,22 @@ VibeMath/Projects/<project>/
414
414
  >
415
415
  > `subagent/end` 触发时子代理**已被移出注册表**,`agents.get()` 必然 `undefined`,函数在 `if(!agent || !agent.session) return` 处直接返回。**修法**即上面的"start 时捕获引用";引用在 end 处理完成后由 `forgetAgent` 释放,用 `WeakRef` 保证即使漏掉释放也只是延迟回收、不会长期钉住 Agent。
416
416
  > 可执行证明:`e2e-f1-agent-detach.test.mjs`(驱动真实 `AgentRegistry` 复现时序);回归测试:`audit-f1-compact-fix.test.mjs`(mock 忠实复现"先 teardown 再 emit",断言 `compactIfNeeded` **确实被调用**)。
417
- > `claim_write`/`release_write` 仍保留为占位(常驻专属目录无写冲突)。
417
+ >
418
+ > **⚠️ 2026-09 再修(F2:上面那个修法本身也是死代码)**:`subagent/start` 由宿主在 `startContinuable`
419
+ > 的 **await 之内同步发出**(`dsh-subagent/lib/index.js:279` 的 `emit('subagent/start', identity)`,以及
420
+ > `:1116` 的 `observer.start(handle.agent)` → `:306`),而 `spawnResident` 只能在它 resolve 之后才
421
+ > `childOwner.set(started.childId, …)`——所以旧监听器里的 `childOwner.get(info.id)` **永远 undefined**,
422
+ > `rememberAgent` 从未被调用,`liveAgents` 全程为空,`realCompact` 依旧在
423
+ > `if(!agent || !agent.session) return` 早退。而 `SubagentRunInfo` 只带 `runId/provider/id/local`
424
+ > (**没有 label**),所以那一刻**无法**从载荷判断归属。
425
+ >
426
+ > 修法(归属判定反过来做):`subagent/start` 监听器把当时的活 Agent **按载荷里的 child id 暂存**到本会话
427
+ > (`stashStartAgent`,上限 64 条),`spawnResident` 在 `startContinuable` resolve、拿到
428
+ > `started.childId` 的**那一刻领取**这份暂存(`claimStartAgent` → `rememberAgent`)——此时归属是精确的;
429
+ > `ownsChild`(编制 / 排队常驻的 childId / 在途 spawn 的 label)只作为"载荷里就带得出归属"的乐观路径。
430
+ > 可执行证明:`_oneoff/probe-v4-liveagent.mjs`(mock 在 `startContinuable` 内发 start、teardown 后才发
431
+ > end、child id 不透明;绿 = `compactNow` 真的被调用)。
432
+ > `claim_write`/`release_write` 仍保留为占位(常驻专属目录无写冲突),描述见 §7 与 §32。
418
433
 
419
434
  ---
420
435
 
@@ -919,6 +934,73 @@ Lean 这一批改动同时做了一次**静态提示词面**审计(`audit-pers
919
934
  | **活动日志里用缩写工具名** | `'… lean_run …'`(不是注册名;host 会把活动日志念给团队) | 改为 `vibe_v4_lean_run`;注入文本扫描面扩到 `State/session.json` 的 `activityLog` |
920
935
  | **`实现方案.md` 写了不存在的工具** | §5 表格里的 `vibe_v4_propose_verify(targetId)` 从未注册(验证对象靠回执字段 `propose_verify`),照着文档找工具会扑空 | 表格改回真实机制(回执字段 → FIFO 排队) |
921
936
 
937
+ ---
938
+
939
+ ## 32. 第四轮全面审计(v4 单独,2.4.1 → 本轮):调度停摆 / 死代码 / 语义与文档
940
+
941
+ 来源:`_oneoff/audit-241-v4.md`(F1–F18,P0/P1/P2)+ `_oneoff/audit-241-prompts.md` 的 v4 项(M2/M4/M5/L5/L6)。
942
+ 每处都只改被指出的行为,**不改动审计未提的行为**。
943
+
944
+ ### 32.1 收敛类(P0)
945
+
946
+ | 问题 | 症状 | 修复 |
947
+ |---|---|---|
948
+ | **F1 失败的邮箱唤醒让调度器永久停摆** | `wakeResident` 开头 `clearHeartbeat()`;`postMessage` 的**即时投递**路径不检查它的返回值、`scheduleNext` 的邮箱分支 `if(delivered) return` 也在没有心跳时返回 ⇒ 一次 `sendMessage` 被拒(`subagent/delivery-unavailable`、子代理 Activation 已关闭、持久化瞬时失败)之后:没有唤醒、没有在途回合、没有计时器——**没有任何事件能再驱动调度**,团队永久停住而邮箱里还压着消息 | 两条路径分别补:`postMessage` 即时投递失败时 `armHeartbeat()`;`scheduleNext` 的邮箱分支改为 `if(delivered) return` 后**落到尾部**(未投递成功时由尾部/上限分支重新武装) |
949
+ | **F2 真实 `/compact` 是死代码** | 宿主在 `startContinuable` 的 await 内**同步**发 `subagent/start`,而 `childOwner.set` 在其 resolve 之后,且载荷里没有 label ⇒ 旧监听器 `childOwner.get(info.id)` 恒 undefined,`liveAgents` 全程为空,`realCompact` 恒早退;README 与 §19 宣称的"上下文达阈值自动 `/compact`"从未发生 | 归属判定反过来做:监听器按载荷 child id **暂存**活 Agent,`spawnResident` 在 resolve 拿到 `started.childId` 时**领取**并 `rememberAgent`(此时归属精确);`ownsChild` 只作乐观路径 |
950
+ | **F3 投票契约无法收敛** | 提示词把 `verdict` 说成 0–1 概率,**示范例子却是 0.9**;而代码要求 `Number(prob)===1` 才算票 ⇒ 谨慎但确信的组永远凑不出全票,轮数耗尽后对象被永久停在库里 | 契约写明:**只有恰好 1 / 恰好 0 算表决**;严格介于 0 与 1 之间是**弃权**(= 概率估计);本轮无人全票时**不停**,把全组**平均概率**写回卡片 `- 概率:`;范例改为 `"verdict":1`(代码路径不变,仍在 `finalizeVerify` 里取均值回写) |
951
+ | **F4 弃权者在会议停会表决里静默出局** | `votes` 只收 boolean(`null` 被过滤),`votes.every(v=>v===true)` 于是把"3 真 + 1 弃权"读成全体一致并**停止整个 run**;`finalizeVerify` 早就写对了,停会表决只做了一半 | 与 `finalizeVerify` 对齐:`every(iv=>iv.voteSolved===true)` —— 每位发言者都必须显式投 `true`;会议提示同步写明这条绝对票规则 |
952
+ | **F5 `artifactCount % meetingKeepEvery` 在推荐工作流下不可达** | 计数口径只有 `record_*` 三个便捷工具,而提示词明确说它们**可选、推荐直接用 fs 写自己的文件** ⇒ 按推荐方式工作的团队永远不会触发"每 N 个新产物自动同步会议",只剩停滞看门狗那条时间路径 | 新增 `countArtifacts()`(扫描 `Propos/Methods/Subproblems/*/*.md`)与 `syncArtifactCount()`;计数基数 `artifactBaseline` 在 `start()` 与 `scheduleNext` 里重置/刷新,自动同步会议改为在 `maybeArtifactSyncMeeting()` 里判定,**两个触发点**(`bumpArtifacts` 与 `scheduleNext`)共用,并用 `lastSyncMeetingAt` 防止同一个倍数重复触发。文档承诺不再被删,而是被实现 |
953
+
954
+ ### 32.2 状态与记账(P1)
955
+
956
+ | 问题 | 症状 | 修复 |
957
+ |---|---|---|
958
+ | **F6 `/v4` 失败仍报 `kind:'success'`** | 每一条分支(未知 id 的 remove、未配置问题的 start、运行中的 configure、被拒的 add、畸形 message、未知子命令)都返回 `success` | 按 dispatch 自身结果返回 `kind: failed?'error':'success'`(与 v2/v3 一致) |
959
+ | **F7 `postmark` 把任意轮的 summary 当压缩回执** | 会议/验证轮的回复只要带 `summary` 就会清 `needCompact`、把 `roundsSinceCompact` 归零、把 `contextPct` 压到 ≤25——**没有任何压缩发生**,软压缩触发点因此永远够不到阈值 | `postmark(r,parsed,kind)`:软压缩回执**只在普通研究轮**(`kind==='normal'`)被接受;`parsed.compacted===true` 在任何轮都仍然算数(那是常驻显式声明) |
960
+ | **F8 同进程 pause→resume 被误判为跨进程** | `persistedEpoch` 只在 `loadAll` 里被写、从不回同步 ⇒ 与本进程 `processEpoch` 比较恒不等 ⇒ 每次 resume 都清空全部 childId、**重开所有常驻并丢弃 busy**,而旧子代理仍在跑(迟到 end 必然发生,注释警告的正是这个) | 同进程加载后 `persistedEpoch=processEpoch`(`paused` 本就假定"同进程保留子代理") |
961
+ | **F9 会议/验证在途态不持久化** | 崩在共识中途 ⇒ 已收集的 3/4 票与半数发言**全丢**(`Shared/debates|meetings/<id>.md` 只在 finalize 时写,部分辩论连盘上都没有),`pendingVerify` 队列里的提议也一起蒸发 | `State/session.json` 增加 `meetingState/verifyState/pendingVerify/pendingMeeting/artifactBaseline`;`loadAll` 恢复,`resume()` 紧接着刷新两个看门狗时钟 |
962
+ | **F10 未投递的回合也计数** | `r.rounds+=1; r.roundsSinceCompact+=1` 发生在 send 之前,失败路径不回滚 ⇒ 常驻被告知的轮次与压缩节奏都虚高 | 两个计数器移到**发送成功之后**;`lastActiveAt` 仍留在前面(失败唤醒必须让 A-fill 退避一个窗口,而不是死循环重试) |
963
+
964
+ ### 32.3 提示词/工具面/文档(P2)
965
+
966
+ | 问题 | 症状 | 修复 |
967
+ |---|---|---|
968
+ | **F11 `verdictMaxRounds` 少一轮** | `vs.round+1<verdictMaxRounds` 使默认 3 只得到 **2** 轮辩论 | 改为 `vs.round<verdictMaxRounds`(1 轮独立初评 + `verdictMaxRounds-1` 轮辩论),日志带上 `round k/N` |
969
+ | **F12 两个参数不在 `vibe_v4_set` 工具描述里** | schema 与 persona 都有 `verdictMaxRounds`/`stallAutoMeetingMs`,工具描述的参数表没有 | 描述里补齐两者并写明语义 |
970
+ | **F13 宿主调用被猜成"最后唤醒的常驻"** | `residentIdOf` 对"有 id 但不在编制里"的调用者也回退到 `currentResident`,于是主代理/宿主的写入被**静默记到某个常驻名下** | 仅当调用者**根本没有身份**(`exec.agent` 为 undefined,mock/工具缝)才回退 `currentResident`;有 id 但不匹配 ⇒ `''` ⇒ 显式 `{ok:false,message:'no such resident'}` |
971
+ | **F14 未知前缀被当成命题** | `guessTargetType` 把任何不认识的 id 映射为 `proposition` ⇒ `2.1`/`lemma-A` 这类 id 会被写进 `Verified/命题/` 并标 `类型: 命题`,与来源卡的声明矛盾 | 未知前缀在 `maybeQueueVerify`(唯一入队漏斗)直接拒绝并记活动日志;类型词在提示里改用中文(命题/方法/子问题)而不是内部 token |
972
+ | **F15 语料缺会议/群聊/框头** | `prompt-corpus-v4` 17 条全是 Lean/形式化形态,唯一的群聊/分工/停会表决载体(`meetingPrompt`)**没有任何可复核文本** | `formal-verify-v4.test.mjs` 的语料落盘段补齐:会议两视角(首位发言者 / 已看到他人发言者)、队列消息的行内发信人行、**真实投递**的 `[NEW MESSAGE from …]` 与 `[群聊]` 帧、`[YOU CLAIMED TASK …]` 帧;`vibe_v4_prompts` 增开 `which:'meeting'` 并同步 persona |
973
+ | **F16 `setParams` 全被忽略仍报 ok** | 未知键静默丢弃、返回 `{ok:true}`(AUDIT-CHECKLIST §1.9 点名的"声明而不接收"形态) | `setParams` 收集 `ignored` 并返回 `{ok:false,message:'unknown parameter(s): …', ignored, applied}`;`vibe_v4_set` 把它合并进 status 结果 |
974
+ | **F17 `status()` 缺协调态** | 看不到 `needCompact`/`roundsSinceCompact`/`wakeKind`,也看不到会议 `spoke k/N`、验证 `voted k/N` 与轮次——F1/F2/F7 恰恰只能通过这些面观察 | `listResidents()` 补三个字段;`status()` 新增 `consensus`(会议/验证 + k/N + round)、`artifactCount`/`artifactBaseline`、`paramsKeys` |
975
+ | **F18 `/v4 start` 丢参数、`/v4 set` 不校验键** | `/v4 start <problem>` 静默忽略问题文本;`/v4 set provider=123` 把字符串键强转成数字,未知键交给 `setParams` 静默丢弃 | `/v4 start <problem>` 真的把余下 token 作为 `{problem}`;`/v4 set` 先按 `status().paramsKeys` 校验键、值交给同一个 `normalizeParam` |
976
+
977
+ ### 32.4 提示词层(来自 `audit-241-prompts.md` 的 v4 项)
978
+
979
+ - **M2 信使名不可回复**:`inboxText` 渲染 `[facilitator]` 时**在框内**写明"框架/人类信使,不是常驻成员,不要向它回信;要回话请用本轮回执的 `input` 或 `vibe_v4_send_message {to:"all"}`"(`contextBrief` 与 `coreRulesBrief` 也各有一句),所以看到这条消息的那一轮就知道该怎么回话。
980
+ - **M5 写锁描述不实**:`vibe_v4_claim_write`/`release_write` 描述改为 `NOT IMPLEMENTED …` 并返回 `{ok:true,locked:false,note:…}`(见 §7)。
981
+ - **L5 不可达分支**:删掉 `meetingPrompt` 里依赖 `st.type==='verify'` 的那句(全部调用点都传 `'general'`)——不再有一条指向不会发生的状态的提示。
982
+ - **L6 发言者身份**:队列消息的行内发信人由 `senderLabel()` 统一渲染(`facilitator` 得到上面那句定义,普通常驻仍是 `r-N`)。
983
+
984
+ ### 32.5 本轮验证
985
+
986
+ ```
987
+ node tests/formal-verify-v4.test.mjs → passed=292 failed=0 / ALL GREEN
988
+ node tests/e2e-v4-fixes.test.mjs → 138 passed, 0 failed
989
+ node tests/selfdrive-v4.mjs → 21 passed, 0 failed
990
+ node tests/audit-preset-rows.test.mjs → 39 passed, 0 failed / ALL GREEN
991
+ node tests/audit-prompt-invariants.mjs → 157 passed, 0 failed
992
+ node tests/audit-persona-surface.test.mjs → v4 全部通过(v3 的 4 条失败来自同批其它修复,不在本预设范围)
993
+ node tests/audit-fuzz-helpers.mjs → 2310 invocations clean
994
+ node tests/audit-f1-compact-fix.test.mjs → 5 passed, 0 failed
995
+ node tests/audit-corrupt-file-guard.test.mjs→ 6 passed, 0 failed
996
+ node _oneoff/probe-v4-f1-heartbeat.mjs → F1 FIXED(失败唤醒后心跳续跑并把消息送达;控制组 OK)
997
+ node _oneoff/probe-v4-liveagent.mjs → F2 FIXED(`compactNow` 真的被调用)
998
+ node _oneoff/probe-v4-verdict-mean.mjs → F3 FIXED(0.9/0.95 → 均值 0.93 留库;1/1 → Verified/)
999
+ node _oneoff/probe-v4-fs-artifacts.mjs → F5 FIXED(fs 直写的第 3 张卡触发同步会议;控制组 OK)
1000
+ ```
1001
+
1002
+ `cordis.patch.yml` 由 `node scripts/build-preset-rows.mjs` 从四个 `agent.cordis.yml` 重新生成(本预设改了 persona 与 `/v4` 命令提示行)。
1003
+
922
1004
 
923
1005
 
924
1006
 
@@ -81,8 +81,10 @@
81
81
  Shared/TaskBoard.md (human view), Shared/Chat/<day>.md,
82
82
  Shared/Meetings/<id>.md, Shared/Debates/<target>.md,
83
83
  Problems/<id>.md, Verified/<kind>/<id>.md (read-only; m-vote only),
84
- State/ (a human-readable MIRROR only — the authoritative state is the
85
- session log projection; never hand-edit State/).
84
+ State/ (the AUTHORITATIVE state is State/<institute>.v5state.json in this
85
+ directory; it is a hardened JSON file, never a host session log. Everything
86
+ else here and elsewhere in the tree is a human-readable MIRROR — never
87
+ hand-edit any of it).
86
88
 
87
89
  Main controls (recommended flow: configure FIRST, then start):
88
90
  - vibe_v5_configure {project?, institute?, problem?, params?} — create/configure the institute WITHOUT starting it.
@@ -175,8 +177,10 @@
175
177
  Shared/TaskBoard.md (human view), Shared/Chat/<day>.md,
176
178
  Shared/Meetings/<id>.md, Shared/Debates/<target>.md,
177
179
  Problems/<id>.md, Verified/<kind>/<id>.md (read-only; m-vote only),
178
- State/ (a human-readable MIRROR only — the authoritative state is the
179
- session log projection; never hand-edit State/).
180
+ State/ (the AUTHORITATIVE state is State/<institute>.v5state.json in this
181
+ directory; it is a hardened JSON file, never a host session log. Everything
182
+ else here and elsewhere in the tree is a human-readable MIRROR — never
183
+ hand-edit any of it).
180
184
 
181
185
  Main controls (recommended flow: configure FIRST, then start):
182
186
  - vibe_v5_configure {project?, institute?, problem?, params?} — create/configure the institute WITHOUT starting it.