跳转至

20 · 独立复审、修订证据与最新版本差异

本章回答两个问题:课程中的结论是否真正对应源码;哪些行为来自当前稳定版本,哪些来自发布后的主分支。复审是重新追源码与运行探针,不是重复四次同一个构建命令。

20.1 版本快照

本轮于 2026-10-03(Asia/Shanghai)重新 git fetch origin --tags,将 upstream/ fast-forward 到 9fba660cf1caca0ade5bea72269352416e595a19。官方 latest release 和 npm 最新稳定包仍为 v1.0.0 / 1.0.0。课程的稳定研究源码与实验依赖仍固定 a13d35a742c6ef8462812a28fbe1d8c8b7431c32,不会把 main 当成已发布 npm 1.0 的内容。

此前下载快照是 1387af7b427c5328eba734715f61b97b0b822688;这次新增 WezTerm 图片滚动修复及审计脚本改动。main 中其余发布后变化此前已下载,但现在补充其教学影响,而不只列 diffstat。

官方稳定发布 · 本次 main 快照 · 版本核对证据

20.2 对课程有实际影响的 main 差异

主题 v1.0.0 稳定基线 本次 main 快照 教学影响
Code Mode 输出累计 VM 内存、store 值、模型输出裁剪等各有边界;没有新的宿主累计输出字符/条目上限 新 MAX_OUTPUT_CHARS=16777216、MAX_OUTPUT_ITEMS=100000;超限使脚本失败 不能把后加保护写成 1.0 已保证;print 循环影响宿主内存,VM 内存上限不能覆盖它
MCP 项目覆盖 同名完整项目 server entry 整体替换 global 无 command/url/type 的设置型 entry 可覆写 enabled/exposure/toolExposure,保留 global 其他字段 {enabled:false} 这种片段不能无条件用于 1.0
Coding Agent MCP OAuth 配置 没有新的 oauth.clientRegistration 选择项 可选 dcr/cimd,CIMD 对 clientId/clientName 与 callbackUrl 有校验 指的是 CLI 配置与集成变化;底层 pi-mcp 在 1.0 已有可选 clientMetadataUrl 支持,不能说整个协议从未支持
Anthropic 中途工具变更 native 路径用工具引用,重定义同名工具会回退 current tool list inline tool_definition,可表达同名重定义;top-level tool list 保持 initial + placeholder 1.0 的 hasToolRedefinitions 回退仍须解释;不能用 main 编码推导 release payload
依赖安装与审计 npm 包含 shrinkwrap,实验当前发现 brace-expansion 5.0.9 high finding 直接固定 5.0.12、删除 shrinkwrap、推荐 managed installer;根仓库审计脚本另有 node-forge advisory 的限定例外 main 修复不自动改变已发布 1.0 npm 依赖;上游私有 gondolin 例外也不代表实验项目可忽略自己的 advisory
provider 模型与价格 稳定快照中的目录/映射 Cloudflare Clef 分类器、Together ID、Cloudflare Claude ID、Bedrock tier 等更新 实际服务调用前查目录,不以旧 ID 或价格作长期保证
provider 暂时错误 1.0 retry classifier 新增 capacity 错误重试识别 不能将 main 重试覆盖推断给稳定依赖
模型选择参数 原 --models 行为 忽略空 entries 逗号后的空值行为跟版本走
全屏终端图片 1.0 渲染边界 修复 WezTerm 滚动后的图片保留 终端视觉故障不能直接据 main 改动认定稳定版已修复
仓库打包 npm / repo 现有方式 新 Nix flake 分发方式变化,不修改 Core 工具循环合约

差异源码:输出累计限制、MCP override、OAuth 配置校验、Anthropic native 选择、审计脚本。

未列的 logo、快捷键展示和 README 修改可查完整 diffstat。表中只称“对应变化”,不声称所有 main 行都完成安全审计。主循环、SDK 工厂、SessionManager 的主要实现与这次 stable 基线一致,transcript 中部分辅助函数注释/弃用标记有变化。

20.3 三位独立审查者与第四轮最终核验

审查 独立范围 方法与证据
A · 核心语义 02、04–07 的 Agent / loop / SDK / session projection 完整函数上下文,独立验证 normalizeContext、branch 与 fork 语义
B · 工具与集成 08–12 的 tools / extension / MCP / VM / RPC / Durable / Chord 对照源码类型和运行路径,核对每张相关图与 main 差异
C · 实战与验证 03、13–16、18–19 及所有自写 TypeScript 独立 check/test/demo;对原弱测试做负控;真实恶意项目指令哨兵探针
D · 最终交付 当前版本、跨章节一致性、引用、测试证据、构建与公网产物 源码引用对象与行号校验;修订追踪;下载包独立运行和重建;浏览器实测

A/B/C 是独立代理;D 是作者对修订后交付执行的第四轮核验,不把作者自查冒充第四个独立代理。构建、源码链接检查和测试是证据,不能替代 A/B 的语义审查。审查 PASS 的范围是本课程及其对应执行路径,不是“整个 Pi 仓库绝无 bug”。

20.4 初审为什么没有通过

初审 A、B、C 均给出 FAIL,并保留原报告。以下为修订的具体内容:

发现 修订 / 验证
normalizeContext 被说成完整协议规范化 04 章解释它只 fold 兼容外置字段;补 provider adapter 节点与能力差异
图片按本次最终模型处理的说法过强 06 章区分历史 routedModel、_limitsModel、后来 resolveModel,增加时间线图
branch 光标持久化与 fork 范围混淆 07 章列具体 API;真实磁盘测试未 append 重开;验证路径提取与全树 fork
Compaction 只有概述 补 token usage 失效、合法切点、split-turn、摘要失败与 checkpoint,并补图
StreamFn 任意 throw 的边界没讲清 05 章区分底层 EventStream、await run、Agent lifecycle 与 observer 错误
loop 图漏 length 拒绝 加整批 error results 分支及 turn_end / agent_end 终点
扩展只在 session_start 重放分支状态 增 session_tree 与每次工具调用按 getBranch 重算策略
Core hook 改参不二次校验未说明 08 章画 validate → mutable hook → execute;区分 Durable 的二次验证
MCP structured error 与 fulfilled 混淆 09 章补 result.isError 检查;说明 structuredContent 优先与 _meta 边界
OAuth iss 条件与重试例外遗漏 09 章按源码分条件,补 session-expired 特例
RPC accepted 值错误 改为 started / queued / handled,补真实 response 与完成等待竞态
Durable 普通 isError 被误当 failed 11 章列 completed / thrown / aborted / interrupted,补第二个崩溃窗口
Storage 单 owner 前提遗漏 11 章明确无跨进程锁与唯一进程 owner
SDK 示例仍可能接受目标 SYSTEM.md 共用研究 loader 显式来源隔离;真实 AGENTS / SYSTEM / APPEND / extension 哨兵验证到 provider messages
原 sequential 测试只看同步启动顺序 mixed batch 有真实异步完成断言,并用去掉 sequential 的负控验证能失败
原 listener 测试只有一个微任务 未释放 gate 时断言 prompt 未结束,负控忽略 Promise 会失败
store 测试没跨 execute 提交 宿主显式 apply storeWrites,再次执行 load;失败脚本不提交,已发生副作用仍存在
八轮停止缺少运行验证 真实示例与测试共用预算;九个脚本响应只派发八次
120 秒定时 abort 被误解为硬停止 13/14 章明确合作取消与外部 watchdog;图中模型经 Agent/宿主输出给用户

20.5 怎样读复审证据

初审报告中的旧行号对应当时原稿;修订后用章节名、问题 ID 和固定源码定位核对。初审 FAIL 不会被覆盖成 PASS;后续报告另外保存,让读者能看到失败、修改和复验这条链。

三位独立审查者已全部完成修订复验:

审查 初审 修订后复验 原报告
A · 核心语义 FAIL PASS,7 项闭环,另纠正 active branch 路径尾措辞 初审 / 复验
B · 工具与集成 FAIL PASS,9 项闭环,6 张图语义核对 初审 / 复验
C · 实战与验证 FAIL PASS,7 项闭环,21 项测试及 5 个错误行为负控 初审 / 复验
D · 作者第四轮交付核验 公网旧 ZIP / 手机行号遮挡曾阻断通过 PASS,修复后全站、下载包重建、浏览器实际下载均通过 最终报告

C 的五个负控是故意破坏串行、listener await、预算 hook、store commit、SYSTEM 来源隔离;目标测试均用 AssertionError 检出,排除了 import/setup 错误造成的假失败。正确版本的 21 项测试全部通过。负控失败是符合预期的证据,不是正式实验测试失败。

独立探针与日志:A 的 compaction 探针、C 负控脚本、C 负控日志。脚本在项目根目录且 examples 依赖已安装时运行;它们不是可直接在浏览器执行的 Agent 服务。

20.6 以后升级时复用这套方法

  1. 拉取官方 release / tag / main 与 npm metadata,记录获取时间和 commits。
  2. 将 stable 与 unreleased 分开读,复查 main 差异表。
  3. 检查所有 import、配置、枚举和 schema,运行与产品相同的资源加载路径。
  4. 对停止、取消、串行、完成屏障、授权与恢复建立能检出错误的测试;用负控确认断言有区分能力。
  5. 审核每张图的箭头、条件、失败分支与持久化时刻。
  6. 独立语义审查、引用检查、实验包运行、Markdown 重建、浏览器与公网下载验证全部通过后再发布。

这套流程不能保证未来版本不变;它能让你知道这份文档何时验证、针对什么源码,以及哪里需要重新查证。