# M09 Coding Agent与隔离运行时

> 本章产出：将模型协调器与代码执行环境分离的接口，受限工作区、测试验收和取消协议。网页中的实验只能模拟，不允许直接在访客浏览器背后的主机执行Shell。

## 1. 为什么加入Coding Agent这个第二环境

售后任务主要访问结构化工具。代码修复任务会读取文件、修改多个位置、执行测试、产生大量输出，并占用CPU和磁盘。把同一Agent Core接入这个环境，可以验证哪些抽象真正通用：模型适配、预算、Trace与任务生命周期可共用；退款规则和代码补丁规则不能强行统一。

我们的目标不是重写一个通用IDE，而是在三个原创小仓库任务上验证运行时边界。真实开源仓库Benchmark作为进阶选项，不是入门前置。

## 2. “模型”“协调器”“执行环境”可以独立失败

协调器负责下一步决策、任务状态和工具授权；执行环境只负责在受限工作区完成指定操作。模型API凭证属于协调器，不进入被修改的代码工作区。

Harvard CS2680 A3使用协调容器与任务容器分离的结构，是这个实验的参考；课程自带本地小任务，不依赖学校的代理或镜像。[S17](../../references/SOURCES.md#s17)

环境接口包括：读取文件、应用补丁、运行受限命令、读取artifact、取消执行和销毁环境。每个请求带环境ID、当前任务身份与权限，不允许模型自行指定任意宿主路径或Docker参数。

## 3. 文件路径检查只是一层防线

`../`、绝对路径、符号链接和挂载点都可能突破天真的字符串前缀检查。`/workspace-evil`也以`/workspace`开头，不能用普通字符串判断是否在目录内。

解析并验证规范路径有帮助，但在有并发修改、符号链接替换的场景仍需考虑检查与使用之间的竞态。生产实现可使用更严格的目录文件描述符操作、内核限制或隔离文件系统；本课程最重要的边界是即使应用路径检查失败，进程也看不到宿主敏感目录。

不要把主目录、SSH目录、云凭证或Docker socket挂入sandbox。只复制该任务必要的仓库快照，每个任务的可写层分开。共享只读依赖或镜像层可以优化准备开销，但可写状态不得跨租户复用。

## 4. 容器安全是配置和威胁模型，不是一个标签

Linux namespace、cgroup、capability等机制分别控制可见资源和资源用量，但普通容器共享宿主内核，不是对任意恶意代码的绝对安全边界。[S33](../../references/SOURCES.md#s33)

课程本地实验建议非root用户、只读根文件系统、独立工作区、默认禁网、移除不必要capability、限制进程数、CPU、内存、输出与执行时间。镜像来自审阅过的构建配置并固定版本；不在运行时随意安装依赖。

真实多租户执行不可信代码时，需要进一步评估更强隔离、宿主补丁、网络出口、秘密代理和审计。教材不会把本地教学Docker配置宣传为已经审计的生产sandbox。

审批和sandbox的职责不同：用户同意运行测试，不等于测试应该能读取宿主密钥；sandbox允许写工作区，也不等于可以自动发布修改。Anthropic的sandbox文章提供了这一区别的实际工程背景。[S08](../../references/SOURCES.md#s08)

<!-- interaction:I18 -->

## 5. 命令执行契约

返回值至少包含`exit_code`、`timed_out`、`cancelled`、`stdout_ref`、`stderr_ref`、截断标志和资源使用摘要。非零退出码不总是基础设施失败：测试失败可能是有价值的观察。

读取stdout时要有流式上限，避免子进程输出数GB后才截断。超时后停止整个受控进程组或环境，等待清理确认，再把状态返回协调器。不要只停止读取输出而让进程继续运行。

工具结果引用必须有任务范围和访问控制。一个错误的artifact URL可能把别人的代码暴露给模型，即使命令本身被隔离。

## 6. 代码修复的成功不由Agent自己宣布

每个任务包含问题描述、起始代码、公开测试和独立验收测试。学生可以读取公开测试学习接口；提交后，评测器从干净起点应用补丁，在独立环境运行验收。

必须检查测试文件或评分器是否被修改。对课程小任务可以限制允许修改的文件；对真实项目，需要更细的补丁审查。不能让Agent把断言删掉后报告“全绿”。

“所有已知测试通过”仍不等于语义完全正确。增加边界、性质和回归测试。例如费用函数必须对非负重量返回非负整数分，对重量增加保持非减；这些性质比几条固定样例更能发现硬编码补丁。

<!-- interaction:I19 -->

## 7. 三个原创任务及其学习价值

第一题修复包裹计费的向上取整，强调整数算术与边界；第二题修复活动订单过滤，强调不原地修改调用者数据；第三题修复每租户缓存键，强调相同订单号在不同主体下不是同一资源。

这些题目刻意小，是为了把预算花在运行时与验收机制，而不是耗在几十GB依赖。它们不能代表真实SWE-bench能力，也不能用于宣称Agent能修复复杂开源项目。

可以在进阶阶段选择经许可的真实仓库历史Issue，但要锁定commit、依赖与测试环境，避免把后来的修复泄漏给Agent。mini-SWE-agent与Harvard A2可用作源码和实验结构对照。[S19](../../references/SOURCES.md#s19) [S16](../../references/SOURCES.md#s16)

## 8. Runtime扩展：什么时候值得做得更底层

当测量发现准备环境、复制数据或短脚本启动占据大量时间，可以研究共享只读准备、私有写层、预热池、能力受限的轻运行时或typed buffer接口。先保证逻辑状态隔离与取消记账，再讨论共享和零复制。

不要因为某次微基准快，就宣布整体Agent更快。模型等待、调度队列、工具网络与失败重试可能占据主要时间。下一章会把这些成本统一放回端到端模型。

## 9. 完成标准与安全边界

L07的coding部分提交：接口规范、一次成功与一次失败Trace、资源限制配置、取消清理记录、独立测试结果、威胁模型。包内Python参考测试验证小仓库的参考解与语义，不代表已经执行Docker隔离测试。

课程网页只展示预录事件和确定性模拟；真实代码执行必须是学习者主动开启的本地实验或经过独立安全设计的服务端环境。

<!-- knowledge:K08 -->
<!-- knowledge:K12 -->
