Files
deepseek-harness/docs/rfc/proposed/testing/2026-06-11-deterministic-and-stress-testing.zh.md
T
Ziya 2565133af3 docs(i18n): RFC tree batch — 146 bilingual pairs via the committed pipeline
implemented(除 4 篇超长文档随后补)、proposed、rejected 全树配对;
同一流水线 + 二遍校验(paraphrase-back + 仓库上下文一致性)产出。
docs/rfc/implemented/AGENTS.md 与其 CLAUDE.md 符号链接列入排除
(agent 指令文件,与根 AGENTS.md 同策略)。
2026-07-15 23:25:06 -07:00

2.4 KiB

RFC:确定性测试、回放不变式 fixture 与竞态压力测试

English | 中文

Status: proposed

问题

若干 agent loop(智能体循环)测试通过 setTimeout(30) 睡眠来同步——这是一笔不稳定性债务,浪费 agent 重试周期,还可能掩盖排序 bug。另一方面,我们的核心架构承诺(任何会话日志回放后都能得到完全相同的派生历史)目前只在两个测试中断言,但在所有地方断言的成本很低。此外,inbox 唤醒竞态只被手动验证过一次,没有任何东西持续地重新验证它。

提案

三项措施:

  1. 测试中禁止挂钟睡眠。 将 setTimeout(N) 等待替换为事件驱动等待(现有的 waitForIdle 模式,扩展为 waitForStatus、waitForEvent(n)),或在需要测试时间本身时使用 vitest fake timers。通过 lint 规则强制:禁止在 packages/*/tests 中使用 setTimeout,白名单辅助模块除外。
  2. 通用回放 fixture(测试前置数据)。 一个共享的测试辅助函数包装 agent loop harness,使得每个测试结束后,agent 的会话日志被回放到一个全新的 Session 中,并自动断言 deriveMessages() 相等。这样该不变式在每次 CI 运行中会被检查数百次(覆盖套件产生的所有场景),而非仅两次。
  3. 夜间竞态压力测试。 一个 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 timers 与 agent loop 中的 Promise 调度存在微妙交互——优先使用事件驱动等待;仅在测试 timer 服务行为本身时才使用 fake timers。