来源: 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:
一个 fake-llm-server(OpenAI 兼容 SSE)按 scenario 驱动多轮对话,并发出 compress/decompress/search 的 tool_use;
驱动真实 dsh/cordis 宿主(@deepseek-ai/dsh-agent)headless 运行并挂载 AcpCompactionEngine;
verify 步骤断言持久化 state:block 数、nudge 注入次数受 [compression] emergency nudge 无上限逐 step 重注入,且缺少 compress attempt 断路器 #108 cap 约束、压缩统计、日志中工具调用序列合法;
Dockerfile.e2e 钉住 @deepseek-ai/* + cordis + Node major,并在 .github/workflows/e2e.yml 加一个 job 跑它。
可先落地最小可行集(1 个 basic-compress scenario + docker job)把宿主集成纳入 CI,再逐步补齐其余 scenario。
来源: 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:jobe2e(matrix ubuntu + windows,node 22)跑node scripts/e2e/run-e2e.mjs;jobdockerbuildDockerfile.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.jsonautoUpdate:false)。package.json带"e2e"script。为什么重要
dsh 的核心价值是「durable-surface」压缩模型:seq-as-ref、nudge 以
user/message事件 append、shadow 而非二次总结。这类跨轮、依赖真实宿主事件流的正确性,纯单元测试很难覆盖,尤其:agent/pre-step循环里的注入节奏(正是 [compression] emergency nudge 无上限逐 step 重注入,且缺少 compress attempt 断路器 #108 那类反馈环,只有跑起来才看得见);tool_calls/tool 响应的严格配对(provider 会拒绝 assistanttool_calls块后紧跟非 tool 消息);session.jsonl.zstd回放(session-events 兼容层)。pi 的 e2e 就是为捕获这些宿主集成回归而存在的;dsh 缺这一层,等于把宿主集成回归完全交给人工。
建议
为 dsh 移植一套等价 harness:
fake-llm-server(OpenAI 兼容 SSE)按 scenario 驱动多轮对话,并发出 compress/decompress/search 的tool_use;@deepseek-ai/dsh-agent)headless 运行并挂载AcpCompactionEngine;verify步骤断言持久化 state:block 数、nudge 注入次数受 [compression] emergency nudge 无上限逐 step 重注入,且缺少 compress attempt 断路器 #108 cap 约束、压缩统计、日志中工具调用序列合法;Dockerfile.e2e钉住@deepseek-ai/*+ cordis + Node major,并在.github/workflows/e2e.yml加一个 job 跑它。可先落地最小可行集(1 个 basic-compress scenario + docker job)把宿主集成纳入 CI,再逐步补齐其余 scenario。