test(zcode): MCP 提示词测试的陈旧断言 —— b0c8719 加方向判据时漏改本文件

## 现象

跑 zcode-mail-bridge 全套(AgentMail 自身 MCP 服务面的测试),
`prompt.test.mjs` 红 1 格:「带 in_reply_to 时要说清是回哪封」。

## 根因:不是回归,是 b0c8719(09-30)漏改测试

b0c8719 给四桥的 in_reply_to 加了**方向判据**:

    只有 parent_from === 自己 时才说「回的是你那封」,
    否则是多方线索里的他人续谈(单向续信链曾被逐封误读成双向对话)。

那次改了 lib/relay-policy.js + src/prompt.mjs + relay-policy.test.mjs,
**漏改了 prompt.test.mjs**。旧夹具只传 in_reply_to、断言旧的无条件文案
「回的是你那封:m0」,而新代码正确地不再指认方向 ⇒ 假红。

实测三场景确认代码行为符合 b0c8719 设计意图:

    只有 in_reply_to       → 「回复到了」但不指认方向   ✓(退回旧行为)
    + parent_from=自己     → 「回的是你那封:m0」       ✓
    + parent_from=别人     → 「多方线索里的续谈…」      ✓

## 修法

夹具补上 parent_from,并把三个方向场景钉全(真回复 / 多方续谈 /
服务端未升级),含反向断言。

## 变异验证

    变异①:prompt.mjs 丢掉 parent_from===agentName 守卫 → 红 1 格 ✓
    变异②:relay-policy 的 mine 永真               → 红 1 格 ✓
    复原后 16/16 绿;全套 25 文件 397/397。

## 附带发现(未改)

`node --test test/`(目录级)会报一个 test:1:1 的幽灵 fail——
node 把 test/manual/(e2e 手册与证据 json)当测试目录递归了。
用 `node --test "test/*.test.mjs"` 跑即干净。manual/ 内容非自动测试,保留不动。
This commit is contained in:
2026-10-02 11:52:34 +08:00
parent 6757644756
commit 56c699b338

View File

@ -28,8 +28,24 @@ test('新任务:说明这是新邮件,并给出发件人/主题/邮件 id',
test('★ 回信不是新任务:带 in_reply_to 时要说清是回哪封', () => {
// 模型分不清「新任务」与「回信」时,会把对方一句「已收到」再当待办做一遍。
const p = buildMailPrompt({ agentName: 'zcode', data: mail({ in_reply_to: 'm0' }) });
assert.match(p, /回的是你那封:m0/);
//
// ★ 2026-10-02 修陈旧断言(b0c8719 漏改):b0c8719 给 in_reply_to 加了
// **方向判据**——只有 parent_from === 自己时才说「回的是你那封」
// (单向续信链曾被逐封误读成双向对话)。本测试当时只传了 in_reply_to,
// 断言的却是旧的无条件文案 ⇒ 假红。夹具补上 parent_from,并顺手把
// 三个方向场景钉全(改 relay-policy 而漏改 prompt 的测试正是这个教训)。
const mine = buildMailPrompt({ agentName: 'zcode', data: mail({ in_reply_to: 'm0', parent_from: 'zcode' }) });
assert.match(mine, /回的是你那封:m0/);
// 多方续谈:父邮件是别人发的,不得宣称「回的是你那封」
const others = buildMailPrompt({ agentName: 'zcode', data: mail({ in_reply_to: 'm0', parent_from: 'pi' }) });
assert.doesNotMatch(others, /回的是你那封/);
assert.match(others, /续谈/);
// 服务端未升级(无 parent_from):退回「回复到了」但同样不指认方向
const noParent = buildMailPrompt({ agentName: 'zcode', data: mail({ in_reply_to: 'm0' }) });
assert.doesNotMatch(noParent, /回的是你那封/);
assert.match(noParent, /回复.*到了|回复到了/);
});
test('★ 人来信 vs Agent 来信:回信责任必须不同', () => {