跳转至

独立审查 C · 修订复验

结论:PASS(本报告限定的七章与自写实验范围)。 2026-10-03 的实际初审发现保存在 reviewer-c-initial.md,其 FAIL 保留;C-01 至 C-04 已逐项重新读取正文、核对源码并闭环。本结论不是整个上游仓库所有实现、全部生产条件或 C 作者自己的 14–17 章的独立 PASS。

被审身份与范围

主源码:da00f7f5358f2949383b35c14f548bc20187d80c;实际发布实验:dsh-v0.2.0-rc.2 / 639ed015397290b3745d163aafe02ffee4aa3f84。分别独立读取两仓库 HEAD,不用短 hash 推断版本。

本轮独立审查 A 作者 02-design、03-cordis、05-session、06-projection-and-prompt、07-agent-loop、08-tools、13-agents-and-goals 七章全文及示例/设计图;实验审查 examples 的全部自写 TypeScript、三份 Node test、Python launcher/client、五文件官方 Python vendor、package/lock/tsconfig/README/requirements。另阅读 18–20 章,用于校验实验行为与文字声称是否匹配。未更改被审正式内容或上游代码。

重点源码函数上下文见初审范围。再次核对 Agent throwError / kick / turn / step,确认错误在 driver 层 contained,而普通 whenIdle() resolve 不代表成功;scheduler 保留模型顺序提交;Session repair 区分 NOT_STARTED 与 OUTCOME_UNKNOWN;Goal 的 mutation/revision/activation 和 driver 双重准入;Schedule 先 Session flush 再 receipt;Teams 的串行任务事务、target-local mailbox 和非全局原子事务边界。图示没有把 stream 通知、内存提交、业务成功和 durable acknowledgement 合并成同一事实。

问题闭环

初审发现 实際重新检查 结果
C-01,08 §8.13 覆盖夸大 docs/08-tools.md:134–138 改为建议清单,并明确 11 个契约测试的实际行为;ask/signal fusion/运行中 timeout/并发提交/context block/conclude/scope/replay 仍标未运行,18/18 未被借来逐项背书 RESOLVED
C-02,20 §20.4 Python 源链接不存在 docs/20-sdk-labs.md:68 现为 python/sdk,固定 rc.2 的完整 commit,git show 验证目录存在 RESOLVED
C-03,projection definition 冲突承诺过强 docs/06-projection-and-prompt.md:52 现在完整说明只检查 stateVersion、同版本 refs++、使用首定义及作者一致性义务;独立真实 registry 探针也证实该契约 RESOLVED
C-04,空 context 来源字段形状 docs/06-projection-and-prompt.md:83 现在列出 typed object 的非空 sections 与仅 kind 两分支,和 runtime-context.ts:152–162 对齐 RESOLVED

独立执行证据

这里的测试是发布版真实 Cordis / SDK / dsh --profile sdk-minimal / Messages HTTP SSE 的纵向测试,不是只对文案做字符串检查。

命令/检查 本审查实际结果 原始证据
npm run check 成功,tsc --noEmit reviewer-c-check.txt
npm test 18/18,0 fail reviewer-c-test.txt
npm run demo 成功,3 次实际 HTTP、2 次工具、最终回答来自 SDK result reviewer-c-demo.txt
npm run demo:python 成功,3 次 HTTP、2 次工具、completed reviewer-c-python-demo.txt
npm run build 后再次 npm test 重新由当前 TypeScript 编译,仍 18/18,0 fail reviewer-c-build.txt、reviewer-c-rebuilt-test.txt
Python vendor 来源 5 文件与 rc.2 release/python/sdk/src 逐字节相同,全部 SHA256 与 SOURCE.json 一致 独立读取/断言;清单在原 SOURCE.json
固定 GitHub 源链接 七章及 18–20 章共 137 条,路径和行锚检查 0 问题 reviewer-c-final-check.json

本审查命令环境 Node 24.14.0、npm 11.9.0;默认 python3 为 3.13.5。作者在另外验收记录中写的 Python 3.11.14 是其环境,本审查不把默认 Python 3.13.5 执行日志改写成 3.11.14。未重新联网安装依赖;从下载 ZIP 全新安装的验收属于 root 的独立证据,不能冒称由 C 本轮执行。

还独立比较 agent.ts、inbox.ts、tool-calls.ts、runtime-context.ts、Cordis fiber.ts / events.ts 两冻结快照,字节相同,与这些章节的核心版本边界一致。此比较不扩张为“所有包 main 与 rc.2 相同”。

错误实现负控:测试确实抓错

负控在 research/reviews/reviewer-c-probes 复制的 dist/test 里执行,正式 examples / node_modules 未被修改。复现说明在该目录 README;执行后删除依赖符号链接,避免它进入交付研究包。

  1. 将临时 notes-tools.js 的预算条件改成 false,运行原 共用pre-step预算 测试。真实 FAIL,退出码 1;fixture 收到 4 次 HTTP,而正常实现应只收到 2 次。reviewer-c-budget-negative.txt 保留断言和堆栈。脚本耗尽时第 4 次为 fixture 错误响应,不能解释为 4 次成功工具操作。
  2. 将临时 note-service.js 的 read 改为返回内部冻结对象,去掉复制,运行原 读取值是copy 测试。真实 FAIL,退出码 1;对返回值赋值出现 TypeError。reviewer-c-copy-negative.txt 保留原始输出。这证明该测试要求可独立修改的副本,不能仅靠“原对象已冻结”冒充 copy。
  3. 独立 projection-duplicate.mjs 挂载真实 SessionStore / SessionProjectionRegistry,同 key 同版本但不同 init 均被接收、stateOf 保持 first;不同版本明确拒绝。探针成功,日志 reviewer-c-projection-duplicate.txt 支持 C-03 的正文修订。

文档与测试的界限已对齐

  • 两个模型工具名来自实际请求断言;未知 bash 返回错误且 workspace 标记文件不存在。关闭 tool rows 是模型调用表面限制,正文没有误称 OS sandbox。
  • 真实异步 gate 测试在 gate 未打开时检查执行 Promise 尚未 settled;pre deny 的 body counter 为 0,post block 的副作用 counter 为 1。测试确实验证不同阶段的实际行为。
  • 第二轮使用同一 Session,实际后续 HTTP 包含 first answer,预算重置;正文没有把这称作 runtime 冷重启恢复。
  • AGENTS/SYSTEM sentinel 写入实际目标目录并检查实际 HTTP 请求;当前标题和 19 章只声称本组合的此范围,没有虚构额外 .dsh patch fixture。
  • HTTP 401 最终是 error,idle 与空 finalResponse 不被当成功。V4 文件断言在正常 SDK close 后检查;正文没有把事件通知或 idle 当 fsync ack,没有声称 kill -9 耐久性。
  • admitted-step 预算不会覆盖同一步 provider retry;requestTimeoutMs 不会变成 run 总时间硬预算。公开 TS / Python 启动参数与两者环境继承差异一致,Python 通过 public dsh_bin 指向同版本 launcher,没有私有 argv 替换。
  • 未验证的工具清单、真实模型质量、完整 provider 协议、远端 transport、native UI、系统沙箱、hard-crash、多进程长期 Teams 和冷恢复范围保持显式未验证。

在上述审查范围内没有剩余可复现技术问题。最终审查对象的文档与自写实验文件 SHA256 记录在 reviewer-c-final-check.json;以后改动这些对象需补验,不能自动沿用本 PASS。