独立审查 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;执行后删除依赖符号链接,避免它进入交付研究包。
- 将临时
notes-tools.js的预算条件改成false,运行原共用pre-step预算测试。真实 FAIL,退出码 1;fixture 收到 4 次 HTTP,而正常实现应只收到 2 次。reviewer-c-budget-negative.txt保留断言和堆栈。脚本耗尽时第 4 次为 fixture 错误响应,不能解释为 4 次成功工具操作。 - 将临时
note-service.js的 read 改为返回内部冻结对象,去掉复制,运行原读取值是copy测试。真实 FAIL,退出码 1;对返回值赋值出现 TypeError。reviewer-c-copy-negative.txt保留原始输出。这证明该测试要求可独立修改的副本,不能仅靠“原对象已冻结”冒充 copy。 - 独立
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 章只声称本组合的此范围,没有虚构额外
.dshpatch 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。