把审批、文件系统与网络拆成三个控制维度,讲清允许/询问/禁止、沙箱升级门槛,以及失败分类后再决定下一步。
上一章讲了项目规则怎么进请求。模型读到「不要改某目录」——目录就真改不了吗?仅凭这句话没有执行层限制。第六章沿一次工具调用,看审批、文件系统范围与网络策略如何汇到真正执行。
模型计划 ≠ 宿主最终允许的动作
模型提出工具名与参数后,真正创建进程前,宿主先拿当前环境与权限配置,判断:是否允许、是否要审批、采用哪种执行限制。读代码、写测试、下依赖看起来都是标准步骤,但涉及的文件范围与网络访问并不相同——要把审批、文件系统、沙箱、网络策略分开,再看它们如何汇集。
- 审批:这次动作能不能继续;
- 文件系统:能读/写的范围;
- 网络:能连接或放行的策略。
三者有联系,但不能用其中一个结果代替另外两个。用户同意「跑测试」≠ 取消一切资源限制。执行后输出或错误还要完整交给模型,它才知道是权限不足还是命令本身报错。
三个容易混在一起的问题
- 这一个动作是否需要获得允许(审批);
- 即使动作被允许,进程是否仍写不了任意路径(文件系统);
- 能读工作区,是否就能连任意服务(网络)。
不是让用户机械点三四个按钮,而是三个控制维度。不要把「免谈审批」理解成完全开放:配置可允许免审批执行,但执行仍在受限环境里;也可能直接禁止某操作,根本不进入询问。
允许 / 询问 / 禁止
命令结合规则与当前环境检查,常见分流:允许 → 进入后续执行安排;询问 → 还缺批准决定;禁止 → 直接返回原因。三个分支都要有明确出口。规则检查可能涉及拆分后的多个命令片段,不能只盯最前面几个字符。显式允许规则与默认判断有区别;某些绕开初始沙箱的条件要求所有解析片段都被规则允许。「跑指定测试」和「顺手清某个目录」写在同一条命令里,也不能得到同样待遇。工程上应把命令、目录匹配、原因与最终分流一起保留。
审批要可审查、可追溯
需要审批时,宿主应整理可审查的动作,而不是只问「是否继续」:命令、工作目录、权限意图与原因都可能影响决定。还要区分「这次批准」与可复用批准:会话级批准缓存只有符合条件的决定才写入,复用时请求对应 cache key 全部匹配才可以——不要扩散到整个工作区。允许范围明确的测试 ≠ 自动允许发布上传或删其他文件。
项目规则 vs 执行层访问策略
项目规则告诉模型应该怎么改代码;真正限制文件访问,需要执行层把权限配置落实成进程可用的能力。工作目录 ≠ 唯一读写范围;实际权限可能由工作区、额外授权与执行器配置共同决定。测试写缓存失败,可能是缓存路径不在可写范围,而不是测试逻辑有问题——应明确缺哪些权限再按策略处理,而不是为了跑通把限制全拆掉,更不要认为「模型答应不越界」等于 OS 已经限制越界。
网络是另一条路径
测试要下依赖时,完全文件权限仍可能连接失败。工具运行前可建立网络审批上下文,让实际执行经相应代理去连目标;业务规则与环境共同影响最终结果。不能把网络失败直接归为「模型不够聪明」。受管网络策略还可能在命令运行期间影响执行,网络审批与进程结束之间也有清理收尾。有些环境有自己的网络策略,且明确拒绝用沙箱升级绕开——拿到更高执行权限,不代表网络约束自然消失。排查时分清域名策略、代理路径还是应用自身网络错误。
沙箱:平台机制落实限制
沙箱管理器按平台、配置与工具偏好选择可用实现,把命令转成能在当前环境运行的形式。常见分类例如:macOS 上 Seatbelt 一类机制、Linux 上沙箱路径、Windows 上相关后端——名字不同,目标都是把配置中的限制交给执行环境。某些执行器也可能自管进程沙箱,不能把本地示意图当成所有场景的唯一方式。上层表达需要哪些资源,下层落实平台差异;接口相同不代表安全属性天然相同。
失败后不要默认「换成不受限再跑」
Codex 实现并不是失败就无限权重试。调度器先区分普通工具错误与沙箱拒绝,再检查工具是否允许升级、当前审批策略是否支持、是否还有网络策略约束。条件不成立则带原因返回;条件成立也可能需要新的批准——先前对受限尝试的批准,不会直接覆盖另一种执行方式。断言失败应回去改代码;访问受限要核对所需资源;网络策略拒绝要检查目标与规则。即使重试发生,也不代表第一次尝试没有副作用,必要时检查文件与外部状态。
修 bug 时怎么拆步骤
先读失败用例与相关实现 → 修改目标文件 → 跑指定测试 → 核对结果。拆分后每步对象更清楚:哪些只读、哪些写工作区、哪些可能要访问网络。缺依赖时,不要把下载、改配置、运行揉成一条难审查的长命令;先解释缺什么,再选符合当前策略的动作。被拒绝要保留原始原因,不能换看似无关的工具偷偷绕过同一限制。批准只说明某步可尝试,沙箱只约束访问范围——都不能证明代码已修好;退出码、断言与最终差异才帮助判断目标是否完成。
四个工程检查点
- 审查对象够不够具体;
- 权限有没有落到实际执行层;
- 失败是否区分了不同原因;
- 最终结果能否和原始请求对应起来。
下一期讲长命令管理:工具先返回时进程还在不在、怎么继续读输出、什么时候才算结束。