# 案例 06 · CodePilot:AI Agent / 编码 Agent 平台 > 一句话点题:**本案例练的是「能动手的 AI 如何不失控」——编码 Agent 的难点不是让模型会写代码,而是让它在能读仓库、改文件、跑命令、调用工具、长时间执行任务时,仍然被权限、沙箱、预算、审批、检查点和评测约束住。** --- > **🧪 案例篇第 6 篇 · 本案例只练一件事** > > 练**AI Agent / 编码 Agent 平台**下的架构判断:什么时候用工作流,什么时候才让 Agent 自主循环,工具调用为什么必须过权限网关,沙箱和人工审批为什么不是一回事,长任务如何靠检查点和上下文压缩恢复,子代理如何隔离重活,以及 eval 如何防止模型 / prompt 升级后质量悄悄退化。 > > | 读完你应该能 | 本案例靠什么练 | > |---|---| > | 说清 Agent 和聊天框的根本差异 | 用「读仓库 → 改文件 → 跑测试 → 看结果 → 再改」的行动循环解释 | > | 判断工具调用为什么不能直接交给模型 | 用权限网关、沙箱、工作区边界和高危审批兜住副作用 | > | 看懂长任务为什么会忘目标、烧预算、跑偏 | 用检查点、trace、上下文压缩、预算上限和恢复流程处理 | > | 判断子代理什么时候有用、什么时候只是增加噪声 | 用独立上下文、独立预算、结果摘要回灌主线来隔离重活 | > > **重要提醒:下面是教学化案例,不是某个真实编码 Agent 产品的内部图纸。** 数字用于数量级推理,目的是练判断,不是给出唯一答案。 --- ## 开场:为什么编码 Agent 不是「更会写代码的聊天框」 因为聊天框只会给建议,编码 Agent 会真的动你的仓库。 > **CodePilot** 是一个给工程团队用的编码 Agent 平台。工程师可以提交任务:「修复这个失败测试」「给支付回调补幂等」「把这个依赖升级到新版」「读这个模块并给出重构方案」。CodePilot 会拉取仓库、阅读代码、制定计划、修改文件、运行测试、根据报错继续调整,最后交付一个 diff 或 Pull Request。 第一眼看,它像是「会写代码的模型」: - 用户描述需求; - 模型读代码; - 模型生成补丁; - 跑测试; - 输出结果。 但真正上线后,最危险的不是「代码写得不够漂亮」,而是: > **Agent 被 README 里的提示注入诱导去读密钥,跑了危险命令,改了工作区外的文件,长任务压缩后忘了用户要求,子代理各改各的互相冲突,模型升级后修 bug 成功率悄悄下降。** 所以这一章不写「怎么调一个大模型 API」。它问一个更具体的问题: > **如何让一个能读写代码、能执行命令、能长时间自主工作的 Agent,既有用,又停得住、审得清、恢复得了?** 这章和前五章的压力源不同: - [StarArena](../stararena-ticketing/README.md) 怕的是库存和支付状态。 - [PatchDesk](../patchdesk-saas/README.md) 怕的是多租户边界。 - [DocuMind](../documind-rag/README.md) 怕的是答案可信和提示注入。 - [SyncRoom](../syncroom-collaboration/README.md) 怕的是实时状态收敛。 - [FeedStream](../feedstream-content/README.md) 怕的是内容分发放大。 - **CodePilot 怕的是 AI 一旦能动手,错误就从「说错」变成「改坏、泄露、花钱、提交」。** --- ## 读前小词典 这篇会反复出现几个词,先用人话对齐一下: | 词 | 人话解释 | |---|---| | Agent | 能自己多步行动的 AI。不是只回答,而是会规划、调工具、看结果、再决定下一步。 | | Workflow | 工作流。步骤提前写死或半固定,模型只在某些节点判断。比 Agent 更可控、更便宜。 | | Agent loop | Agent 行动循环。通常是「计划 → 调工具 → 观察结果 → 再计划」。 | | Tool call | 工具调用。模型请求读文件、搜代码、改文件、跑测试、查网页、调用内部 API。 | | Sandbox | 沙箱。把命令关在隔离环境里执行,限制它能读哪里、写哪里、能不能联网。 | | Workspace | 工作区。Agent 被允许读写的项目目录。工作区外通常不该被动到。 | | Permission gateway | 权限网关。所有工具调用先过它,决定放行、拒绝,还是暂停问人。 | | Approval | 人工审批。高风险动作前停下来问用户,比如联网、删除文件、提交、部署。 | | Checkpoint | 检查点。保存任务状态、已改 diff、工具结果摘要和预算,中断后能继续。 | | Trace | 执行轨迹。记录 Agent 每一步做了什么、调了什么工具、看到了什么结果。 | | Context window | 上下文窗口。模型一次能看见的内容上限。任务长了会装不下。 | | Compaction | 上下文压缩。把早期历史摘要成短记录,腾出窗口继续任务。 | | Memory | 记忆。跨步骤或跨会话保留的规则、偏好、历史经验。不是越多越好,会过时。 | | Subagent | 子代理。把搜索、日志排查、审查这类子任务丢给独立上下文的 Agent,只把摘要带回主线。 | | Prompt injection | 提示注入。外部内容里夹带「忽略规则、泄露密钥」这类指令,诱导模型违规。 | | Budget | 预算。单任务最大步数、token、时间、工具调用次数和花费上限。 | | Eval | 评测。用一批代表性任务持续衡量成功率、安全性和回归,防止升级后悄悄变差。 | --- ## 一、起始状态:先做受控编码助手,别先做全自动工程师 CodePilot 的第一版目标很克制:**让小团队把低风险工程任务交给 Agent 处理,但所有真实改动都能被人看见和拦住。** 起始阶段的约束大概是这样: | 维度 | 起始阶段 | |---|---| | 试点团队 | 20~50 名工程师 | | 接入仓库 | 5~20 个 | | 单仓库规模 | 1 万~20 万行代码 | | 每日 Agent 任务 | 50~200 个 | | 峰值并发任务 | 5~20 个 | | 常见任务 | 补测试、小 bug、读代码、改文档、简单依赖升级 | | 核心目标 | 能交付可 review 的 diff,并能解释每一步为什么这么改 | | 最不能错 | 读密钥、改工作区外文件、自动执行不可逆操作、没有 trace | 这时最合理的架构不是「全自动软件工程师」,而是**受控 Agent loop + 工具网关 + 工作区沙箱 + 人工 review**: ``` 工程师提交任务 │ ▼ ┌────────────────────────────────────────────┐ │ 任务服务 │ │ 记录目标、仓库、分支、预算、权限档位 │ └──────────────┬─────────────────────────────┘ ▼ ┌────────────────────────────────────────────┐ │ Agent 编排器 │ │ 计划 → 读文件 / 搜索 → 打补丁 → 跑测试 → 再调整 │ └──────────────┬─────────────────────────────┘ ▼ ┌────────────────────────────────────────────┐ │ 工具网关 + 沙箱 │ │ 限定工作区、限制网络、危险动作问人、全程 trace │ └──────────────┬─────────────────────────────┘ ▼ diff / 测试结果 / 执行轨迹 → 人工 review ``` 这不是保守,而是把第一版的边界讲清楚: - Agent 可以读仓库,但敏感路径默认不可读。 - Agent 可以改文件,但只能改工作区。 - Agent 可以跑测试,但命令要有超时和资源限制。 - Agent 可以建议提交或开 PR,但不能绕过 review。 - Agent 可以长时间执行,但每一步都要可追踪、可恢复、可停止。 --- ## 二、量化假设:它不是先被 QPS 压垮,而是被权限、上下文和副作用压垮 先算一笔账。假设 CodePilot 从试点推广到一个中型研发组织: ``` 工程师:300 仓库:800 活跃仓库:150 单仓库规模:5 万~80 万行代码 每日 Agent 任务:1,000~3,000 个 峰值并发任务:50~120 个 单任务平均轮次:8~20 步 长任务轮次:30~80 步 每轮工具调用:1~4 次 常见工具:读文件、搜索、打补丁、跑测试、包管理、Git、内部 API 目标:简单任务 5~10 分钟内给出 diff 目标:复杂任务 30~60 分钟内给出 PR 或明确失败原因 安全目标:越权写工作区外文件 = 0;敏感文件外泄 = 0 预算目标:每个任务都有最大步数、最大 token、最大执行时间、最大并发 质量目标:模型 / prompt / 工具策略变更前,核心 eval 不低于基线 ``` 这个数量级里,请求量不是第一个问题。普通 Web 系统会先算 QPS,但 CodePilot 会先撞上这些东西: 1. **权限边界**:Agent 能执行命令,就可能误删、误改、误联网。 2. **上下文边界**:仓库太大、日志太长、任务太久,模型会装不下。 3. **副作用边界**:文件编辑可回滚,但发请求、推代码、部署、改数据库可能收不回。 4. **成本边界**:多试几步可能修好,也可能无限循环烧钱。 5. **质量边界**:模型升级后,成功率可能提升,也可能在某类任务上退化。 所以 CodePilot 的架构重心不是「怎么多扛几个请求」,而是: > **把 Agent 的自主性关进可执行、可审计、可恢复、可评测的边界里。** --- ## 三、触发信号:什么时候说明第一版开始不够用 第一版跑起来后,不要凭感觉升级。看这些信号: | 信号 | 表现 | 为什么这是架构问题 | |---|---|---| | 用户频繁盲批 | 每个命令都问,用户开始不看就批准 | 审批策略太吵,安全变成形式 | | 越权请求增多 | Agent 经常想读 `~/.ssh`、`.env`、工作区外路径 | 权限默认值和提示注入防线不够清楚 | | 长任务中断后全废 | 跑了 40 分钟,进程挂了只能重来 | 没有持久化检查点和可恢复任务状态 | | 压缩后忘要求 | 一开始要求「别动数据库层」,后面压缩后还是改了 | 关键约束没有固定保留和重载 | | 工具日志撑爆窗口 | 全量测试日志、依赖树、搜索结果把上下文塞满 | 工具输出缺少摘要、截断和引用 | | 子代理互相冲突 | 两个子代理同时改同一片代码 | 子任务边界和合并协调缺失 | | 成本突然升高 | 某类任务反复尝试、无限修复同一个错误 | 缺少步数、时间、token、重复检测上限 | | 结果无法复盘 | 只看到最终 diff,不知道为什么这么改 | trace 不完整,review 没有证据链 | | 升级模型后退化 | 小 bug 修得更多,但安全拒绝能力下降 | 没有 eval 门禁衡量多维质量 | | prompt injection 事故 | issue / README 里一句话诱导 Agent 泄密或外联 | 外部内容被当成指令,没有不可信输入隔离 | 这些信号不是在说「模型还不够聪明」。它们在说:**只靠模型能力无法让 Agent 进入生产,必须把控制能力做进架构。** --- ## 四、核心矛盾:Agent 越能干,越必须被限制 CodePilot 的核心对象有五组: 1. **任务 / 目标 / 预算**:用户要它做什么,允许花多少步、多少时间、多少钱。 2. **仓库 / 工作区 / 分支**:它能读写哪个项目,最终产物落到哪里。 3. **工具 / 权限 / 沙箱**:它能调用什么工具,每个工具的物理边界在哪里。 4. **上下文 / 记忆 / 压缩**:它每一步看见什么,哪些约束必须长期保留。 5. **trace / diff / eval**:它做过什么,怎么 review,质量是否持续稳定。 如果只看最简单路径,它像这样: ``` 用户给任务 → 模型生成代码 → 跑测试 → 返回 ``` 但真实系统必须在每一步都回答: - 这次工具调用只是读文件,还是会改变世界? - 这个命令能不能联网?能不能写工作区外? - 这段 README 是项目说明,还是有人写进去的提示注入? - 这次修改能不能回滚?要不要先 checkpoint? - 上下文压缩时,用户的硬约束有没有保住? - 子代理的结果是证据,还是只是建议? - Agent 失败时,是测试失败、权限失败、预算耗尽,还是模型跑偏? - 新模型上线后,任务成功率、安全拒绝率、最小改动率有没有退? 所以新的架构命题变成: > **CodePilot 的价值来自自治执行,风险也来自自治执行。架构的核心不是让它更自由,而是把「能动什么、何时问人、怎么恢复、怎么证明没变差」做成系统结构。** 最关键的分类是按风险看工具: | 工具类型 | 例子 | 默认策略 | |---|---|---| | 只读低风险 | 搜索代码、读非敏感文件、查看测试配置 | 可自动,但输出仍当不可信观察 | | 可逆中风险 | 修改工作区文件、生成 diff、格式化代码 | 沙箱内允许,保留 checkpoint 和 diff | | 高风险副作用 | 联网下载、发请求、写数据库、发邮件、推代码 | 默认 ask 或 deny | | 不可逆 / 组织风险 | 部署、删除远端资源、改权限、转账 | 强制人工审批,很多场景直接禁止 | --- ## 五、方案推演:编码 Agent 到底该怎么执行工具 这是本案例最重要的决策。很多 Demo 能跑,但一旦接入真实仓库和 shell,风险马上变成工程问题。 ### 方案 A:只做聊天建议,不执行工具 ``` 用户贴代码 / 错误日志 └─▶ 模型给建议 └─▶ 人自己复制、改、跑测试 ``` | 优点 | 代价 | |---|---| | 安全边界简单,模型没有真实副作用 | 用户仍要搬运上下文,效率提升有限 | | 容易接入 | 无法自己验证,容易停在「看起来对」 | | 适合学习和解释 | 不能承担整段工程任务 | ### 方案 B:本地 Agent 直接拿完整 shell 权限 ``` Agent 读仓库 → 改文件 → 跑任意命令 → 联网 → 提交 ``` | 优点 | 代价 | |---|---| | 最灵活,遇到问题可以自己试 | 风险最大,误删、泄密、外联、越权都可能发生 | | Demo 体验强 | 很难给团队统一治理和审计 | | 实现看似简单 | 一旦出事故,没有结构化边界可兜底 | ### 方案 C:平台化 Agent,所有工具过网关和沙箱 ``` 模型提出工具调用 └─▶ 权限网关判断 allow / ask / deny └─▶ 沙箱执行 └─▶ 结果作为观察返回模型 └─▶ trace / checkpoint / budget 全程记录 ``` | 优点 | 代价 | |---|---| | 能动手,但有物理边界 | 配置和心智复杂度更高 | | 工具副作用可审计、可限制 | 某些合法任务会被沙箱挡住,需要显式授权 | | 支持团队治理、CI、云端任务 | 需要建设任务状态、trace、沙箱池和 eval | CodePilot 成长期选择:**方案 C。工具调用必须经过权限网关和沙箱,高风险动作必须能暂停问人。** 关键不是「信不信模型」,而是: > **凡是模型指令能影响的层,都不算硬约束。硬约束必须落在模型绕不过的地方:权限网关、沙箱、预算、审批、CI、eval。** --- ## 六、关键架构决策:用 ADR 把为什么留下来 ADR 是 Architecture Decision Record,可以理解成「架构决策记录」。编码 Agent 最容易在后面被人问:「为什么不全自动?为什么沙箱和审批要分开?为什么要保存 trace?为什么子代理不能继承全部上下文?」这些都应该提前写下来。 ### ADR-01:默认工作流优先,只在开放任务上使用自主 Agent loop - **背景**:很多工程任务其实步骤明确,比如「跑 lint → 修格式 → 跑测试 → 提交 diff」。这类任务用固定工作流更便宜、更可预测。 - **选择**:CodePilot 默认先把任务拆成可控工作流;只有当路径不确定、必须根据工具反馈多次调整时,才进入自主 Agent loop。 - **放弃**:放弃所有任务都让模型自由规划的简单宣传口径。 - **换来**:更低成本、更强可控性、更容易复盘失败原因。 - **风险**:工作流边界设计不好时,会限制 Agent 的灵活性。 - **复审条件**:当大量任务在固定流程里卡住,且人工复盘说明确实需要开放探索时,再放宽对应任务类型。 ### ADR-02:工具调用必须经过权限网关和沙箱,不能由模型直接执行 - **背景**:编码 Agent 能读写文件、跑 shell、联网、调用内部 API,副作用真实。 - **选择**:所有工具调用先过权限网关;文件写入限制在工作区;敏感路径默认拒绝;命令在沙箱里执行;网络默认收窄;高风险动作 ask 或 deny。 - **放弃**:放弃「模型想跑什么就跑什么」的灵活性。 - **换来**:即使模型被提示注入诱导,物理边界仍能兜住大部分事故。 - **风险**:权限配置会变复杂,某些开发任务需要额外授权。 - **复审条件**:当团队接入更多内部工具、MCP(Model Context Protocol,工具 / 数据接入协议)或云资源时,重新审权限分层和默认 deny 策略。 ### ADR-03:沙箱模式和人工审批解耦成两根轴 - **背景**:很多人把「自动 / 手动」当一个档位,但这会混淆两件事:物理上能动哪里,流程上什么时候问人。 - **选择**:沙箱管物理边界,审批管流程打断。例如 `read-only + never` 适合 CI 分析,`workspace-write + on-request` 适合默认编码任务,高风险外部副作用必须 ask。 - **放弃**:放弃一个简单但含糊的一维自动化档位。 - **换来**:权限边界更清楚,能同时支持本地结对、CI 只读分析、云端异步任务。 - **风险**:用户需要理解两个维度,否则会误以为「少问人 = 权限更大」。 - **复审条件**:当用户频繁盲批,或合法任务频繁被打断,说明审批策略需要重调。 ### ADR-04:长任务必须持久化检查点、trace 和预算状态 - **背景**:编码任务可能跑几十分钟,中间会话变长、工具输出变大、进程也可能中断。 - **选择**:保存任务状态、步骤 trace、已改 diff、工具结果摘要、预算用量;接近上下文上限时自动压缩,但从稳定存储重载项目规则、用户目标和关键约束。 - **放弃**:放弃只靠一次长对话硬撑到底。 - **换来**:任务可恢复、可审计,压缩后不至于完全忘记核心约束。 - **风险**:摘要可能丢细节,错误摘要会误导后续步骤。 - **复审条件**:如果长任务失败多来自「忘了早期约束」,需要改压缩模板、固定保留清单或拆任务。 ### ADR-05:子代理只隔离重活,结果摘要回灌主线 - **背景**:全仓搜索、依赖分析、测试日志排查会产生大量中间信息,容易污染主上下文。 - **选择**:子代理有独立上下文、独立工具权限、独立预算;主线只接收结构化摘要、证据文件和建议,最终决策仍由主线合并。 - **放弃**:放弃让子代理继承全部主对话历史。 - **换来**:主线上下文更干净,复杂任务可并行拆分。 - **风险**:子代理摘要可能漏掉关键事实,多代理还会放大成本和延迟。 - **复审条件**:只有当单 Agent 的上下文被重活挤爆,或任务天然可拆且写入范围不重叠时,才引入子代理。 --- ## 七、演进后的结构与数据流 下面只画 CodePilot 的核心结构。它不是「模型 + shell」,而是一套任务执行、权限控制、上下文管理、可观测和评测系统。 ### 起始路径 ``` 用户发任务 → 模型生成补丁 → 本地跑命令 → 用户看结果 ``` 问题是:权限、沙箱、预算、恢复、trace、eval 都没有结构化。 ### 演进后的结构 ``` 用户 / CI / 定时任务 │ ▼ ┌──────────────────────────────────────────────┐ │ 任务入口 │ │ 目标、仓库、分支、权限档位、预算、审批策略 │ └──────┬───────────────────────────────────────┘ ▼ ┌──────────────────────────────────────────────┐ │ Agent 编排器 │ │ 工作流优先;必要时进入 Agent loop │ │ 计划 → 工具调用 → 观察 → 再计划 │ └──────┬───────────────────────┬───────────────┘ │ │ ▼ ▼ ┌──────────────┐ ┌──────────────────────┐ │ 上下文构建器 │ │ 任务状态 / trace │ │ 仓库地图、文件、 │ │ 检查点、diff、预算 │ │ 规则、记忆、压缩 │ │ 工具结果摘要 │ └──────┬───────┘ └──────────────────────┘ │ ▼ ┌──────────────────────────────────────────────┐ │ 工具网关 │ │ allow / ask / deny;敏感路径;网络策略;资源上限 │ └──────┬───────────────────────┬───────────────┘ ▼ ▼ ┌──────────────┐ ┌──────────────────────┐ │ 沙箱执行器 │ │ 人工审批 / Review Gate │ │ 工作区隔离、超时 │ │ 高风险动作、最终 PR 审查 │ │ CPU/内存/网络限额│ └──────────────────────┘ └──────┬───────┘ ▼ 工具结果 / 测试日志 / diff → 回到 Agent 编排器 旁路:eval 平台持续跑代表性任务,卡住模型 / prompt / 工具策略升级 ``` 这张图的核心变化不是「多了几个服务」,而是结构变清楚了: - **任务入口**定义目标、仓库、预算和权限档位。 - **Agent 编排器**决定走固定工作流还是自主循环。 - **上下文构建器**只给模型必要信息,并把项目规则和关键约束固定保留。 - **工具网关**把模型意图变成受控工具调用。 - **沙箱执行器**给命令物理边界,限制工作区、网络和资源。 - **trace / checkpoint**让长任务可恢复、可审计。 - **Review Gate**把不可逆动作和最终产物交还给人。 - **eval 平台**防止系统升级后质量无声退化。 ### 跟一次「修失败测试并补回归」走到底 ``` 1. 工程师提交任务:「修复 billing 模块这个失败测试,并补一个回归测试」。 2. 任务入口记录仓库、分支、预算:最多 25 步、30 分钟、只能写工作区。 3. 上下文构建器加载项目规则、相关 AGENTS.md、测试命令、最近失败日志。 4. Agent 编排器先计划:定位失败 → 读相关文件 → 修改 → 跑单测 → 补回归。 5. 模型请求搜索代码。工具网关判断为只读低风险,自动放行。 6. 模型请求修改 `billing/refund.ts`。这是工作区内可逆写入,沙箱允许,先保存 checkpoint。 7. 模型请求运行 `pnpm test billing`。命令在沙箱中执行,带超时、CPU / 内存限制和网络禁用。 8. 测试失败,工具结果摘要进入上下文,原始日志以 trace 引用保留。 9. Agent 再读失败栈,发现缺少幂等键边界处理,继续打补丁。 10. 测试通过,Agent 生成最终 diff、解释、测试证据。 11. Review Gate 要求人 review diff;通过后才允许开 PR 或提交。 ``` 这里的关键点: - 模型不是直接操作机器,它只是提出工具调用。 - 工具结果是观察,不是新指令;README、issue、测试日志都可能包含提示注入。 - 每次写入前有 checkpoint,最终 diff 可 review。 - 测试日志可以摘要进上下文,但原始 trace 要可追溯。 - 没有通过 review gate,Agent 不能把改动推到主干。 ### 跟一次「长任务上下文快满」走到底 ``` 1. Agent 已经执行 40 步,读了很多文件,跑了多轮测试。 2. 上下文窗口接近上限,系统触发 compaction。 3. 压缩器把早期对话整理成结构化摘要: - 用户目标 - 硬约束 - 已尝试方案 - 当前 diff - 未解决问题 - 证据文件和 trace 链接 4. 系统从稳定存储重新加载项目规则和权限策略,而不是指望摘要记住一切。 5. 预算状态也被带回:还剩 8 步、10 分钟、不能联网。 6. Agent 继续执行;如果再次接近上限或预算耗尽,必须停下来交代状态,不能无限循环。 ``` 上下文压缩不是魔法。它只是把「装不下」变成「有纪律地丢掉低价值历史」。真正不能丢的东西,要进入稳定规则、检查点和 trace。 --- ## 八、坏了怎么办:故障场景与兜底 | 故障 | 直接后果 | 检测方式 | 架构兜底 | |---|---|---|---| | 模型直接执行 shell | 误删、外联、泄密、越权 | 高危命令审计、越权尝试 | 所有工具调用先过权限网关和沙箱 | | 工作区边界缺失 | 改到用户机器其他项目 | 文件写入路径审计 | 只允许指定 workspace 写入,工作区外 deny | | 敏感路径可读 | `.env`、SSH key、云凭据被读出 | 敏感路径访问告警 | deny 读取敏感路径,必要时物理隔离凭据 | | 网络默认放开 | 注入内容诱导外传代码或密钥 | 外联域名审计、异常 egress | 默认断网或 allowlist,高风险联网 ask | | 工具结果被当系统指令 | README / issue 诱导 Agent 忽略规则 | 注入测试用例、异常工具链行为 | 外部内容标成不可信数据,不能覆盖系统规则 | | 审批太多 | 用户疲劳盲批 | 批准耗时、连续批准率 | 低风险靠沙箱自动,高风险才问 | | 审批太少 | 不可逆操作自动发生 | 高风险操作审计 | 外部副作用强制 ask / deny | | 长任务无 checkpoint | 中断后重来,状态不一致 | 中断恢复失败率 | 持久化任务状态、diff、trace、预算 | | 上下文压缩丢规则 | 后续步骤违反早期约束 | 失败复盘、压缩后违规率 | 压缩后重载项目规则,硬约束固定保留 | | 子代理全量继承上下文 | 主线被中间噪声淹没 | 上下文占用、无关 token 比例 | 子代理隔离,只回灌摘要和证据 | | 子代理写入冲突 | 多个子任务改同一片代码 | diff 冲突率 | 分配不重叠写入范围,主线统一合并 | | 无预算上限 | 无限循环、烧 token、打爆测试环境 | 步数 / 成本异常 | 步数、时间、token、工具调用、并发上限 | | 只看最终 diff | review 不知道为什么改 | review 退回率 | trace 记录计划、工具调用、测试证据 | | 没有 eval | 模型升级后质量退化 | 线上失败、人工投诉 | 代表性任务 eval 接入发布门禁 | | 测试命令无超时 | 某个任务长期占住 worker | worker 占用时间 | 命令超时、资源配额、任务取消 | | 自动提交绕过 review | 错误代码进主干 | 未审 PR / commit | 最终提交、PR、部署必须过 Review Gate | 编码 Agent 的成熟度,不是看它能不能一次写出漂亮代码,而是看它在读错上下文、工具失败、注入诱导、任务中断、预算耗尽时,能不能停得住、恢复得了、解释得清、评测不过不上线。 --- ## 📌 拿模板验证这次推演 本案例不是重写某个编码 Agent 产品模板,而是把「能动手的 AI」里最容易互相影响的几条链路放在一起推演。 | 可复用模板 / 章节 | 本案例复用什么 | 本案例重点补什么 | |---|---|---| | [AI Agent / 工作流平台](../../templates/ai-agent-platform/README.md) | 工作流 vs Agent、行动循环、工具、记忆、人类介入、trace | 把通用 Agent 落到代码仓库和真实 shell 副作用 | | [OpenAI Codex](../../templates/codex/README.md) | 沙箱 × 审批双轴、工作区边界、云端异步任务、PR 交付 | 用教学案例解释为什么「能动多大」和「何时问人」要分开 | | [Claude Code](../../templates/claude-code/README.md) | 上下文工程、权限层、OS 沙箱、子代理、hooks、compaction | 强调子代理隔离重活,以及外部内容不可信 | | [OpenClaw](../../templates/openclaw/README.md) | 常驻 Agent、渠道入口、工具审批、自托管边界、记忆透明 | 提醒「单用户信任边界」不能直接当团队多租户平台 | | [Hermes Agent](../../templates/hermes/README.md) | 长期记忆、技能沉淀、cron Agent 任务、可插拔子系统 | 补充长期 Agent 会遇到的记忆过时和技能漂移 | | [23 · 规格即架构约束](../../tutorial/23-规格即架构约束怎么写给AI.md) | AGENTS.md / 规则 / CI 约束 | 把项目规则变成 Agent 每次都能读、机器能检查的边界 | | [24 · 审查清单](../../tutorial/24-审查清单AI产出默认缺什么.md) | AI 默认漏掉安全、失败、边界 | 最终 diff 必须用 review checklist 把关 | | [25 · 评测驱动](../../tutorial/25-评测驱动把够好写进架构.md) | eval 门禁 | 防止模型 / prompt / 工具策略升级后无声退化 | > **读法建议**:先读本章,再回看 [AI Agent 平台模板](../../templates/ai-agent-platform/README.md)、[Codex 模板](../../templates/codex/README.md) 和 [Claude Code 模板](../../templates/claude-code/README.md)。你会更容易看懂:编码 Agent 的核心不是「模型更强」,而是「自主行动被工程边界包住」。 --- ## 🎯 随堂检验 --- ## 本案例小结 - **编码 Agent 不是聊天框,而是能改变仓库状态的执行系统。** 一旦能改文件、跑命令、联网,架构重点就从「回答质量」变成「受控执行」。 - **能用工作流就先用工作流。** 自主 Agent loop 适合路径不确定的任务;固定流程更便宜、更稳定、更容易审计。 - **工具调用必须过权限网关和沙箱。** 模型只提出意图,真正执行要由模型绕不过的层来决定 allow / ask / deny。 - **沙箱和审批是两根轴。** 沙箱管物理边界,审批管流程打断;两者解耦后,团队才能按场景组合自治程度。 - **长任务要靠 checkpoint、trace、compaction 和预算活下来。** 不保存状态、不限制步数、不记录证据,长任务迟早变成不可复盘的黑盒。 - **子代理用于隔离重活,不是默认炫技。** 只有搜索、日志、审查这类会挤爆主上下文的任务,才值得拆出去。 - **eval 是编码 Agent 的发布门禁。** 模型、prompt、工具策略升级前,必须用代表性任务验证成功率、安全拒绝、最小改动和回归稳定性。 > **第一期收束**:到这里,案例篇第一批 6 个核心案例完成了一轮闭环:从库存交易、多租户 SaaS、企业 RAG、实时协同、内容分发,走到能动手的编码 Agent。后续如果继续扩展案例篇,可以围绕行业纵深或专项技术栈再开第二批,而不是和这 6 篇重复。 --- ## 相关链接 - 模板对照:[AI Agent / 工作流平台](../../templates/ai-agent-platform/README.md) · [OpenAI Codex](../../templates/codex/README.md) · [Claude Code](../../templates/claude-code/README.md) · [OpenClaw](../../templates/openclaw/README.md) · [Hermes Agent](../../templates/hermes/README.md) - 方法论:[07 · 从 0 到 1 设计一个系统](../../tutorial/07-从0到1设计一个系统.md) · [08 · 架构决策记录与演进](../../tutorial/08-架构决策记录与演进.md) · [17 · 大模型时代的架构判断](../../tutorial/17-大模型时代的架构判断.md) - AI 协同:[23 · 规格即架构约束](../../tutorial/23-规格即架构约束怎么写给AI.md) · [24 · 审查清单](../../tutorial/24-审查清单AI产出默认缺什么.md) · [25 · 评测驱动](../../tutorial/25-评测驱动把够好写进架构.md)