Skip to content

[test][e2e] dsh 缺少端到端 / docker 模拟宿主回归测试(pi 有完整 harness) #120

Description

@ranxianglei

来源: ranxianglei/billion-context-pi#305 对照分析 dsh 与 pi 的测试覆盖差距时发现

现象

billion-context-dsh 目前只有单元测试(tests/*.test.ts + tests/kernel-upstream/search.test.ts),没有任何端到端(e2e)/ docker 模拟宿主的回归测试。CI(.github/workflows/ci.yml)只跑 typecheck → test → build → dist-drift-check。

而 billion-context-pi(本仓)有一套完整的 e2e harness,能驱动真实宿主 headless + 脚本化假 LLM,并对持久化后的 ACP state 做断言:

  • Dockerfile.e2e:FROM node:22-slim,用 devDependencies + lockfile 钉住 Pi host 版本,npm ci、build dist,ENTRYPOINT 跑 node ./scripts/e2e/run-e2e.mjs。
  • .github/workflows/e2e.yml:job e2e(matrix ubuntu + windows,node 22)跑 node scripts/e2e/run-e2e.mjs;job docker build Dockerfile.e2e 并 docker run --rm。
  • scripts/e2e/:run-e2e.mjs、fake-llm-server.cjs(OpenAI 兼容 SSE,:8400,按 scenario 驱动多轮、解析 compress/decompress/search 的 tool_use)、e2e-extension.js、verify.mjs(断言 block 数 / nudge baseline / 压缩统计 / session-log 工具调用序列),以及 scenarios/01..05-*.json(basic-compress / batch-compress / nudge-triggered / compress-then-decompress / multiple-compressions)。每个 scenario 使用独立的 Pi HOME(models.json→假 provider、acp.json autoUpdate:false)。
  • package.json 带 "e2e" script。

为什么重要

dsh 的核心价值是「durable-surface」压缩模型:seq-as-ref、nudge 以 user/message 事件 append、shadow 而非二次总结。这类跨轮、依赖真实宿主事件流的正确性,纯单元测试很难覆盖,尤其:

pi 的 e2e 就是为捕获这些宿主集成回归而存在的;dsh 缺这一层,等于把宿主集成回归完全交给人工。

建议

为 dsh 移植一套等价 harness:

  1. 一个 fake-llm-server(OpenAI 兼容 SSE)按 scenario 驱动多轮对话,并发出 compress/decompress/search 的 tool_use;
  2. 驱动真实 dsh/cordis 宿主(@deepseek-ai/dsh-agent)headless 运行并挂载 AcpCompactionEngine;
  3. verify 步骤断言持久化 state:block 数、nudge 注入次数受 [compression] emergency nudge 无上限逐 step 重注入,且缺少 compress attempt 断路器 #108 cap 约束、压缩统计、日志中工具调用序列合法;
  4. Dockerfile.e2e 钉住 @deepseek-ai/* + cordis + Node major,并在 .github/workflows/e2e.yml 加一个 job 跑它。

可先落地最小可行集(1 个 basic-compress scenario + docker job)把宿主集成纳入 CI,再逐步补齐其余 scenario。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions