146 篇 RFC 译文按 v4 基线(#348)重出:v4 模板+术语表、金标 few-shot、三段协议、切换行后处理;全量机械核对零异常(一处 task id 术语违规已修)。三篇超长 RFC(code-mode 已入,web-seam/ agent-scope/sandbox/cds-core 仍在长文档通道产出)随后补。
2.4 KiB
2.4 KiB
RFC:确定性测试、回放不变式 fixture 与竞态压力测试
English | 中文
Status: proposed
问题
若干 agent loop(智能体循环)测试通过 setTimeout(30) 睡眠来同步——这是一笔不稳定性债务,浪费 agent 的重试周期,还可能掩盖时序 bug。另外,我们的核心架构承诺(任何会话日志回放后都能得到相同的派生历史)目前只在两个测试中断言,但在所有测试中断言的成本极低。此外,inbox 唤醒竞态只被手动验证过一次,没有任何机制持续复验。
提案
三项措施:
- 测试中禁止挂钟睡眠。 将
setTimeout(N)等待替换为事件驱动等待(既有的waitForIdle模式,扩展为waitForStatus、waitForEvent(n)),或在需要测试时间本身时使用 vitest 的 fake timer。通过 lint 规则强制执行:禁止在packages/*/tests中使用setTimeout,白名单辅助模块除外。 - 通用回放 fixture(测试前置数据)。 一个共享测试辅助函数包装 agent loop harness,使每个测试结束后,agent 的会话日志被回放到一个全新的 Session 中,并自动断言
deriveMessages()相等。这样该不变式在每次 CI 运行中会被套件产生的所有场景检查数百次,而非仅两次。 - 夜间竞态压力测试。 一个 CI job 以
vitest --repeat=200(加--shuffle)运行 agent-loop 和 inbox 套件,以暴露调度依赖的失败;发现的任何不稳定测试都视为 bug 修复,绝不靠重试掩盖。
计划
措施 1 和 2 一起落地(它们改动相同的辅助模块);在套件消除所有睡眠后再添加夜间 job,以确保重复运行速度快。
验收标准
packages/*/tests中不再有setTimeout(白名单辅助模块除外),由 lint 规则强制执行。- 共享 harness 将每个测试的会话日志回放到全新的
Session中,并自动断言deriveMessages()相等,覆盖整个套件。 - 夜间 job 以
--repeat和--shuffle运行 agent-loop 和 inbox 套件;发现的不稳定测试作为 bug 分诊,绝不靠重试掩盖。
风险
Fake timer 与 agent loop 中的 Promise 调度存在微妙交互——优先使用事件驱动等待;仅在测试 timer 服务行为本身时才使用 fake timer。