diff --git a/docs/proposals/2026-10-02-agent-stack-completion.md b/docs/proposals/2026-10-02-agent-stack-completion.md index 198dfc4..79d7370 100644 --- a/docs/proposals/2026-10-02-agent-stack-completion.md +++ b/docs/proposals/2026-10-02-agent-stack-completion.md @@ -61,6 +61,20 @@ | 用示例句的向量相似度做路由,低于阈值则不命中 | [semantic-router](https://github.com/aurelio-labs/semantic-router) | 规则层和模型层之间的语义端口。向量模型由宿主注入,核心不做 I/O。IntentSpec 增加 examples。用来减轻中文子串误命中(I3) | | 只把相关流程交给生成器;评测逐轮写出期望命令 | [命令生成器](https://rasa.com/docs/pro/customize/command-generator/)、[评测](https://rasa.com/docs/reference/testing/e2e/dialogue-understanding-tests/) | Catalog 按相关度取 top-k,Metadata 白名单。`intentctl eval` 改为多轮并输出 precision / recall | +### 2.4 二次对照增补(2026-10-03) + +2026-10-03 重新读了 [pi v1.0.1](https://github.com/earendil-works/pi)(`4c6fb7cf`,MIT)和 [ZCode v3.14.3](https://github.com/zai-org/ZCode)(`29628c9a`,Apache-2.0)。评级、本仓落点和拒绝理由见 [2026-10-03-pi-zcode-second-pass.md](../records/2026-10-03-pi-zcode-second-pass.md)。pi-durable 在 v1.0.1 的事实更正见 [2026-10-03-pi-durable-review.md](../records/2026-10-03-pi-durable-review.md) 文首。 + +这一节只把会改三个库或产品行为的新增条目收进来。不改变第 5 节的阶段顺序,也不把上游包引进来。 + +| 借鉴 | 来源 | 落到本库 | 阶段 | +|---|---|---|---| +| 溢出识别用模式表;Retry-After 解析失败时指数退避;只在还没向调用方发出增量时重试;`length` 或未写完的工具调用不执行 | pi `packages/ai`,v0.99–v1.0.1 | Native 的 provider 客户端与 SSE 解析。Backend 直连默认有限次重试。用量拆成上一请求和累计 | N3 的模型回退与流重试;本项先做 | +| 运行内把旧工具结果换成路径;压缩按工具配对边界;写文件前必须读过且文件未被改过 | ZCode `packages/core` 的 compact 与 read-file-state;pi durable 的 compaction-as-entry | Native 的 ContextManager 与会话压缩。提醒不再追加成 user 消息 | N2 | +| 权限分计划、默认、自动改文件三档;deny 先于 ask 先于 allow;钩子事件与决策走同一条总线 | ZCode `packages/core` 的 permission 与 hooks;本提案 §2.1 已列事件名 | Native 的 PermissionPolicy 与 HookBus。不提供绕过确认的档位 | N1 | +| 工具调用先记意图再记结果;只有两次声明都是 safe 才重放;写文件可回滚,shell 不追踪 | pi durable README 的 Tools 与 Compaction;ZCode `contracts/rewind` | Native 的 RunState 与文件检查点。不回滚对话历史,不做透明续跑 | N3 | +| 模型写脚本批量调用工具,中间结果不进上下文;MCP 工具可延迟暴露,首条提示不等服务器连上 | pi `packages/codemode` 与 `docs/mcp.md`;本提案 §2.1 的代码编排端口 | Native 的代码编排端口与 MCP 客户端。产品开关默认关 | N2 | + ## 3. 解耦 三个库各自能单独编译、单独测试、单独被第三方使用。配合发生在组合根,不发生在核心模块里。 diff --git a/docs/records/2026-10-03-pi-durable-review.md b/docs/records/2026-10-03-pi-durable-review.md index 823971d..05711aa 100644 --- a/docs/records/2026-10-03-pi-durable-review.md +++ b/docs/records/2026-10-03-pi-durable-review.md @@ -1,5 +1,16 @@ # 调研:pi `packages/durable`(Pico5)有什么可以借鉴 +## 更正(v1.0.1,2026-10-03) + +对照对象已从本地克隆 `c7cdb460`(2026-09-21)前进到 [earendil-works/pi](https://github.com/earendil-works/pi) `4c6fb7cfe8c538a668726f6f8b3554098c39faee`(2026-10-03,v1.0.1)。下面四条替换正文里对应的判断;正文保留,作为当时的证据。完整二次对照见 [2026-10-03-pi-zcode-second-pass.md](2026-10-03-pi-zcode-second-pass.md)。 + +- **Packages 1–23 已经实现。** `packages/durable/docs/pico-v5-handoff.md` 的状态栏不再是 “No Pico5 implementation exists”。可运行的内容包括会话、工具回合、收件箱、中止、子代理句柄、结构化并发、压缩与溢出、扩展,以及生命周期和任务图。存储有内存、SQLite、JSONL 三套,并带一致性测试。正文 §1 的“只有记录契约和一份内存存储”只对 `c7cdb460` 成立。 +- **不把 `@earendil-works/pi-durable` 或 Chord 当依赖引进来,这个结论不变。** 包仍标 Experimental;Chord 仍声明不是稳定公开契约;实现是 TypeScript,本仓执行与存储在 Go。 +- **正文 §2.2 的试点规则升级为采纳设计。** 重放取交集、意图与结果分两次提交、先写者胜出的 memo、内存实现作语义参照、侧车提交标记、压缩只追加并带 head 指针,都已有可对照的实现。落地仍在后续批次,不在本更正里改代码。结果状态继续对齐 A2A,不新增 `faulted` 枚举。 +- **`packages/agent` 里的实验内核 pico3 已在 v1.0.0 删除。** 正文引用的 `effect_pending` 与 `replay: "never" | "safe"` 现位于 durable 的工具任务。不要再把 pico3 当参考入口。 + +透明续跑仍然暂缓:骨架设计 §4.2 不做。服务端 steer、会话分叉和所有权级联改为条件试点,触发条件仍是正文 §2.3 写的那些产品需求。 + - 状态:记录(2026-10-03);owner:weichen;任务:Dev 仓 `feature/pi-durable-borrow` - 对象:本机参考克隆 `/home/weichen/projects/Agent-System/.refs/pi`,`origin` 为 `https://github.com/earendil-works/pi.git`,HEAD `c7cdb460aa8a0cebef3446c4166729b8a0d97ead`(2026-09-21,`fix(coding-agent): reject bug reports offline`)。包版本 `@earendil-works/pi-durable` 0.86.1,MIT(仓库根 LICENSE 版权 2025 Mario Zechner;`packages/durable/package.json` 的 `license` 为 MIT)。 - 对照的本仓事实以 Dev `a5c9fd3385` 为准。库层对照的是提案 [2026-10-02-agent-stack-completion.md](../proposals/2026-10-02-agent-stack-completion.md)(Documents PR #34,本记录合入时已经在 documents main)及其审计记录。 diff --git a/docs/records/2026-10-03-pi-zcode-second-pass.md b/docs/records/2026-10-03-pi-zcode-second-pass.md new file mode 100644 index 0000000..b604917 --- /dev/null +++ b/docs/records/2026-10-03-pi-zcode-second-pass.md @@ -0,0 +1,79 @@ +# 调研:pi v1.0.1 与 ZCode v3.14.3 二次对照 + +- 状态:记录(2026-10-03);owner:weichen;任务:Dev 仓 `feature/pi-zcode-second-pass` +- 对象: + - [earendil-works/pi](https://github.com/earendil-works/pi) `4c6fb7cfe8c538a668726f6f8b3554098c39faee`(2026-10-03,v1.0.1)。相对本机参考克隆 `c7cdb460`(2026-09-21)前进 239 个提交。MIT,仓库根 LICENSE 版权 2025 Mario Zechner。 + - [zai-org/ZCode](https://github.com/zai-org/ZCode) `29628c9acdb81b703bbd4080c207a0e7ce5e276e`(2026-09-24,v3.14.3)。本机对照树 `/tmp/ZCode-study`。Apache-2.0,根目录 LICENSE、NOTICE.md、THIRD-PARTY-NOTICES.md。 +- 本仓事实以 Dev `7139e58df0` 为准。前序:[2026-10-01-agent-harness.md](../proposals/2026-10-01-agent-harness.md) 的 P0–P4、[2026-10-02-agent-stack-completion.md](../proposals/2026-10-02-agent-stack-completion.md)、[2026-10-02-agent-stack-audit.md](2026-10-02-agent-stack-audit.md)、[2026-10-03-pi-durable-review.md](2026-10-03-pi-durable-review.md)。 +- 提示词不逐字照搬。移植设计时在 NOTICE 里注明来源与修改;不把上游包、插件市场或技能正文整仓拷入。 + +结论先说:P0–P4 已经借走回放、结束门禁、续写、验证器、子代理和工作流骨架。这一轮要补的是模型层健壮性、上下文工程、权限与钩子、文件回滚、代码编排端口。不引入 `@earendil-works/pi-durable`、Chord,也不移植 ZCode 的 TypeScript 动态工作流。 + +--- + +## 1. 来源现在是什么 + +pi 仍是最小可扩展的 agent harness:交互、print、JSON、RPC 和 TypeScript SDK。v1.0.1 的实质增量是 codemode、MCP 产品化、虚拟模型、分类器基础设施,以及整棵 Pico5 运行时。`packages/durable` 仍标 Experimental;`packages/agent` 在 v1.0.0 删掉了实验内核 pico3。coding-agent 的实验 TUI 已迁到 durable。 + +ZCode 是桌面、Web 和 CLI 共用的编程工作台。本记录只看 `apps/zcode-cli/packages/core` 与 `contracts` 里的 harness,以及产品壳里和运行态有关的协议。P0–P4 已经对齐的部分(原生工具回放、Stop 上限 3、输出续写 3 次、同名同参提醒、证据清单验证、子代理深度 1、声明式工作流)不再重复评级。 + +## 2. 评级 + +每条都标了本仓落点。阶段名沿用 agent-stack 提案的 N1、N2、N3;「批次」指本任务之后的实现批次。 + +| 主题 | 上游 | 本仓 | 评级 | 批次 | +|---|---|---|---|---| +| 上下文溢出识别 | pi `packages/ai`:按供应商文案识别,含 Z.AI 中文站 | `deps/agent-native/runtime/llm/providers.go` 的 `ContextOverflow` 要求错误信息同时含 “context” 与 overflow/too long/length | adopt | 2,N3 | +| Retry-After 与容量重试 | pi:解析失败则指数退避;“Selected model is at capacity” 可重试 | `runtime/llm/client.go` 对 429/5xx 标可重试,不读 Retry-After | adopt | 2,N3 | +| 未完成的工具调用 | pi `1b2aa0ca0`:Responses 未完成的 tool call 拒绝执行 | `runtime/llm/sse.go` 的 `mapFinish`:finish 为 `length` 或空、且已有工具增量时返回 `StopToolCalls` | adopt | 2 | +| 流式重试不吞增量 | pi 的重试发生在收到正文之前 | `WithRetry` 先缓冲整次尝试再转发。默认打开会让流式失效 | adopt | 2,N10 | +| 用量拆分 | pi 会话成本区分请求与累计 | 循环把每轮 prompt token 累加(审计 N20) | adopt | 2,N20 | +| 运行内清理旧工具结果 | ZCode compact:保留最近若干条,更早的 Read/Bash/Grep 结果可替换 | 产品回放保留全文;内核 `session/compact.go` 按条数裁尾,可切断工具配对(审计 N7) | adopt | 4,N2 | +| 压缩与追加的竞态 | pi durable:压缩是新条目加 head,不改历史 | `compact.go` 读完解锁再摘要(审计 N8) | adopt | 4,N2 | +| 先读后改、文件过期 | ZCode `tool/read-file-state.ts`、edit handler:未读或 mtime 变化则拒绝 | 内置 write/edit 与后端 `write_file` 无此检查 | adopt | 4,N2 | +| 提醒不占 user 角色 | ZCode `system-reminder/source.ts`:按来源节流,不破坏工具配对 | `runtime/loop.go` 的 `withEphemeral` 追加 user 消息(审计 N22) | adopt | 4,N1/N2 | +| 子代理结果上限 | ZCode agent handler 约 120KB | `modules/backend/internal/runtime/sub_loop.go` 把结果原文交回 | adopt | 4,N2 | +| 默认工具 `+name/-name` | pi settings,`30a1d1849` | `runtime/tools/registry.go` 只有精确名和通配 | adopt | 4,N2 | +| RPC 回执 | pi `e473b5cd8`:`started` / `queued` / `handled` | `rpc/server.go` 只返回 OK 与正文 | adopt | 4 | +| 按字符截断 | ZCode 与审计 N16 | `runmgr.go` 的 `ExecuteTool` 用字节切片截断工具结果 | adopt | 4 | +| 权限三档 | ZCode:plan / build / edit;另有未实现的 auto 与旁路 yolo | 画像策略 deny / confirm / allow;无计划档 | adopt 三档;reject 旁路档 | 6,N1 | +| 钩子总线 | ZCode `contracts/hooks`:SessionStart、UserPromptSubmit、PreToolUse、PermissionRequest、PostToolUse、PostToolUseFailure、Stop、SubagentStart/Stop;决策 allow/deny/ask/modify/block;超时 60s | 内核只有 BeforeTool、AfterTool、Stop 回调;无配置 schema。`adapters/native/backend.go` 不透传(审计 N31) | adopt 进程内总线;hold 进程级钩子 | 6,N1 | +| 向用户提问 | ZCode AskUserQuestion | HITL 有 choice/input/confirm/form,没有一等工具 | adopt | 6,N1 | +| 计划模式工具闸 | ZCode EnterPlanMode / ExitPlanMode | `update_plan` 只写计划,不限制写工具 | adopt | 6,N1 | +| 确认卡参数 | 本仓缺口,不是上游新能力 | `ExecuteTool` 算出 `argsPreview` 后丢弃 | adopt | 6 | +| 意图与结果分两次提交 | pi durable Tools:`replay` 取存储时与当前声明的交集 | 工具结果在执行后一次写入;崩溃留下无结果的调用(审计 N1 的同类) | adopt | 7,N3 | +| 只回滚写文件 | ZCode `contracts/rewind`;pi 文件检查点只追踪写 | 无文件回滚 | adopt | 7,N3 | +| 请求只读已落盘投影 | pi `466db0fec`:prepareRequest 以持久投影为权威 | AgentSession 的队列在内存里进入下一次请求 | adopt | 7,N2 | +| 模型回退链 | pi 虚拟模型是每请求路由器,不是静态链 | 无回退;溢出不重试 | adopt 静态链,默认空;hold 虚拟模型路由 | 7,N3 | +| GenAI span | 提案 §2.1 已列名字;ZCode telemetry 默认少采正文 | 有 logging-system 的 trace_id,无这组 span | adopt | 7,N3 | +| 代码编排工具 | pi `packages/codemode`:模型写 JS,跑在 QuickJS,中间结果不进上下文;bash 对脚本最多 1MiB | 后端 `workflow_script.go` 是工作流步骤,不是模型侧工具 | adopt 端口语义,不搬 QuickJS | 8,N2 | +| MCP 延迟暴露 | pi `docs/mcp.md`:exposure、tool_search、首条提示不等服务器 | `runtime/mcp/manager.go` 启动即连接;stdio 取消后读协程不退出(审计 N3);失败重连只有注释(N18);HTTP Close 为空(N19) | adopt | 8,N2 | +| 运行态单一所有者 | ZCode 协议把 in-flight 与 settled 分开;发送即 ack | 前端 `store.ts` 的 live 与 runs 分别更新。Dev #161 已修可见性回归 | adopt 剩余的单一状态源与事件穷举 | 5 | +| 架构基线棘轮 | ZCode `architecture-policy.yaml` 与 knip | Dev 已有库间导入棘轮,不管 backend internal 分层,也不查死导出 | adopt | 3 | + +## 3. 拒绝,以及为什么 + +| 项 | 理由 | +|---|---| +| 依赖 pi-durable 或 Chord | TypeScript、Experimental、Chord 不是稳定契约。只借鉴规则和测试意图 | +| 透明续跑 | 骨架设计 §4.2 明确不做 | +| 回滚对话历史 | 文件可以回到某条用户消息之前;消息树保持追加 | +| 绕过确认的权限档 | ZCode 的 yolo 与本仓「deny 不能被 allow 跳过」冲突 | +| 进程级钩子、MCP OAuth | 宿主是多租户后端,不是单用户 CLI。钩子先做进程内回调 | +| ZCode 动态工作流 DSL | 编排已裁定归 Agent-Squad。不移植 TypeScript 沙箱脚本图 | +| ZCode TUI、桌面、远程 SSH、CUA、cron、插件市场 | 产品形态是单二进制加 Web。CUA 在上游也是占位 | +| pi 虚拟模型与分类器路由 | 当前没有「每个请求选模型」的产品需求。回退链用静态列表 | +| Anthropic 原生协议与 thinking 签名回放 | 仍按提案 N2 单独做。本轮只堵住会执行未完成工具调用的解析 | + +## 4. 不回退的既有决定 + +- 交付守卫失败即不通过。ZCode 在验证器自身出错时放行。见 harness 提案 §2。 +- 正文里的伪造工具调用要拦截。见 harness 提案 P0。 +- 动态工作流步数、脚本确认和回调白名单保持 P4 的数字。代码编排端口默认关闭。 +- 回合默认仍有轮次和预算上限。ZCode 的长任务哲学是不按工具次数硬停;本仓保留上限作安全阀。 +- 库声明自己不是操作系统沙箱。 + +## 5. 本记录的验收 + +- 本文件、pi-durable 记录文首更正、提案 §2.4 互相链接。 +- 不改 Go 或 TypeScript 代码,不改三个库的指针。