24 · 排错、测试证据与进一步练习¶
24.1 优先看失败发生在哪一层¶
Client Promise resolve、root idle、tool result 与文件flush是不同层次。排查前保留durable events与最小错误信息,输出凭据/header会制造新的问题。
24.2 常见问题对照¶
| 现象 | 优先核对 | 修法 |
|---|---|---|
| 找不到dsh | npm安装、PATH、公开dsh_bin是否可执行 | 用同版本launcher,别指向无shebang/nonexecJS |
| plugin导入失败 | dist是否build、module绝对路径、ESM类型 | npm run build后用new URL/fileURLToPath生成路径 |
| 自写tool未出现 | inject服务、provider激活、注册scope、实际profiledump | 核对tree,别只看源文件存在 |
| baseURL未生效 | 大小写、rowconfig整体替换、环境endpoint | 使用实际config键baseURL;不要靠fallback掩盖typo |
| API401但run返回 | turn/end reason与assistant/attempt | 归类error,别将idle/空answer当success |
| 被预算阻止 | maxSteps、同turn计数、pre-stepdecision | 检查blocked并决定业务失败/显式后续动作 |
| 重试比step多 | llm retryattempt不再进入pre-step | 加独立attempt/elapsedbudget,别误计step |
| tool报错但文件已改 | body/observer/postgate发生顺序 | 检查现实副作用,不盲目重试非幂等动作 |
| SDK结束还找不到session文件 | writerflush时点和真实session路径 | 正常close后再读;生产要明确durableack |
| Python导入失败 | interpreter路径、requirements、vendor路径 | 安装依赖并设置DSH_COURSE_PYTHON |
| Python看到宿主env | SDKenv合并与Python父环境 | 宿主先allowlist启动Python |
| 中文搜索没结果 | 搜索separator、索引载入、浏览器error | 看search_index和真实输入,不只验证asset200 |
| Mermaid显示源代码 | 浏览器runtime、fencehook、mermaidSVGerror | 检查本地脚本与实际SVG |
| 下载不符本地 | CDNcache、revision、服务器发布目录 | 对公网字节算SHA,不只看200 |
24.3 实际执行范围¶
实验的18项检查在20章按证据列出,原输出在labs下载重建。单独的typecheck、build、TSdemo/Pythondemo、归档比对也在交付记录中。真实模型命令未运行;示例的所有正常/恶意工具选择都来自可重复fixture。
还有一些在08章介绍的toolruntime分支属于源码分析,不是18项检查已经全部跑过:无人approval的ask、timeoutbody最终收敛、caller取消不能被wrapper覆盖、boundedparallel上下文提交顺序、conclude成功、scopeoverride/restrict、durablereplaypresentation等。要依赖这些分支应单独增加针对真实契约的测试。
npm audit针对实验安装树运行,研究记录公布实际finding和版本,不把npmci成功写成“全部依赖无漏洞”。不要把这份小实验的audit扩大成官方14,000多文件monorepo的安全审计。实际auditJSON
24.4 从失败测试学设计¶
pre-execute拒绝测试用counter证明body未执行,post-executeblock测试则证明已经执行且不会回滚。这两个断言不是工具内部实现的镜像,而是宿主最容易误判的边界。bash越权测试检查真实文件不存在,失败模型调用测试检查durableerrorreason,步骤预算测试检查真实HTTPrequest数量。
单元测试可以验证一个插件自己的纯数据规则;componenttest要使用真实Cordis激活/卸载与工具runtime;integrationtest要经过真实CLI/SDK/protocol。每层用它能证明的事情,不用手写fakeContext/fakeSDK然后宣称官方路径跑通。
24.5 建议你亲手做的下一轮实验¶
- 用相同NoteStore实现一个数据库provider,保留toolconsumer,测试错误、取消、分页和tenant过滤。
- 加一个会写业务记录的tool,先定义idempotencykey和commitreceipt,再测试pre/post拒绝与重试。
- 将临时home换为持久home,记录一次关闭/重启后的继续过程,核对同一Sessiongeneration与lease。
- 给宿主整体deadline和costledger,分别统计admittedsteps、HTTPattempts和tokenusage,检查某一限额耗尽后的收尾。
- 用真实模型做固定问答评估,将来源正确率与错误完成率保存下来,再决定是否引入PTC/MCP/subagent。
以上是练习而非本次已执行的证据。引入外部服务/真实账户时要把认证、资源所有权和业务成功定义写进同一个评估计划。