From 56c699b338641035820a82fdfb8a82db3108480b Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Fri, 2 Oct 2026 11:52:34 +0800 Subject: [PATCH] =?UTF-8?q?test(zcode):=20MCP=20=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E8=AF=8D=E6=B5=8B=E8=AF=95=E7=9A=84=E9=99=88=E6=97=A7=E6=96=AD?= =?UTF-8?q?=E8=A8=80=20=E2=80=94=E2=80=94=20b0c8719=20=E5=8A=A0=E6=96=B9?= =?UTF-8?q?=E5=90=91=E5=88=A4=E6=8D=AE=E6=97=B6=E6=BC=8F=E6=94=B9=E6=9C=AC?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 现象 跑 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/ 内容非自动测试,保留不动。 --- .../zcode-mail-bridge/test/prompt.test.mjs | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/plugins/zcode-mail-bridge/test/prompt.test.mjs b/plugins/zcode-mail-bridge/test/prompt.test.mjs index d8f6e29..6aea410 100644 --- a/plugins/zcode-mail-bridge/test/prompt.test.mjs +++ b/plugins/zcode-mail-bridge/test/prompt.test.mjs @@ -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 来信:回信责任必须不同', () => {