---
type: study
status: verified
created: 2026-08-11
updated: 2026-08-11
sensitivity: standard
tags:
  - langchain
  - deep-agents-code
  - approvals
  - sandbox
  - security
sources:
  - "https://docs.langchain.com/oss/deepagents/code/approval-modes"
  - "https://docs.langchain.com/oss/deepagents/code/goals-and-rubrics"
  - "https://docs.langchain.com/oss/deepagents/code/remote-sandboxes"
last_verified: 2026-08-11
---

# Deep Agents Code：审批、目标、Rubric 与远程沙箱

## 三种审批模式

默认 gated actions 包括文件写/改/删、shell、web 请求和 task 委派；`ls`、`read_file`、`glob`、`grep` 等只读工具不提示。

| 模式 | 行为 | 适用边界 |
| --- | --- | --- |
| Manual | 每个 gated action 人工确认 | 默认、风险最高的本地任务 |
| Auto | 例行动作自动放行，不确定项交给模型分类 | 可信本地仓库的提效实验 |
| YOLO | 不审查任何 gated action | 仅接受全部风险的隔离环境 |

Auto 是启发式授权，不是 sandbox、OS capability 或安全证明。它要求 experimental opt-in；远程 sandbox 激活时会回退到 Manual。YOLO 需一次性风险确认，键盘不能从 Manual/Auto 切入；从 YOLO 切出后不能键盘切回。

Auto 与 YOLO 只适用于交互 TUI，不用于 `-n`、piped stdin 或 ACP server。Headless 使用 fail-closed MCP、文件工具 allowlist 和 shell allowlist。

## Auto 的决策链

Auto 保留 gated-action 规则，只改变审查方式：

1. 明确例行、低风险动作直接通过，例如普通源文件写入或只读 Git 命令。
2. 敏感目标和变更性动作进入 classifier；只有用户 literal prompt 可作为授权依据。
3. 多次 deny、超时或 classifier 故障后，回退人工审批。

Classifier 默认复用主模型，可单独指定更快、更便宜的模型。优先级：会话 `/auto model` → CLI flag → 环境变量 → config → 继承主模型。项目 `.env` 不能指定该模型，避免仓库控制授权者。

Classifier 默认 20 秒。超时 batch fail closed 为 `classifier_unavailable`，重复发生回退 Manual；优先换更快模型，再考虑提高 1–300 秒范围内的 timeout。

执行副作用前会重新校验 thread、mode、batch 和精确调用集合。若 classifier 期间切回 Manual，旧 Auto 结果不能静默执行。

### Auto 无法覆盖的边界

- MCP 的 read-only annotation 来自 server 自报。
- 父级 Auto 不覆盖 delegated subagent 内部动作。
- 显式开启的 `js_eval` / dynamic fan-out 不会逐动作走父级审批。
- 分类输入输出仍可能被模型供应商和 tracing backend 看见。

因此敏感任务必须同时用最小工具、remote sandbox、网络/凭证隔离与产物 review。

## Goal 与 Rubric

两者都是质量门，但用途不同：

| 机制 | 谁定义标准 | 生命周期 |
| --- | --- | --- |
| Goal | 用户给目标，Agent 草拟 acceptance criteria，人工 review | 跨多 turn 持续，可 amend/pause/resume |
| Rubric | 用户已知 criteria，直接给 grader | 可只作用下一 turn 或 sticky |

Goal 适合“结果明确、验收标准尚需展开”的开放工作。`/goal <objective>` 先生成 criteria，用户可接受、编辑、要求修订或取消；接受后每一 follow-up turn 都会评分，直到完成、blocked、暂停或清除。

`/goal amend` 协调修改 objective 与 criteria，仍需 review；pause 保留但不驱动中间任务，resume 从现有对话继续。Grader 模型与最大迭代可独立设置。

Rubric 适合已知门槛：sticky criteria、文件 criteria 或 next-turn gate。非交互无法暂停 Goal review，所以用 `--rubric`，并可显式指定 grader model 与 max iterations。

生产实践：

- Criteria 必须可观察、可验证，避免“质量要好”等循环性描述。
- Rubric 迭代上限与 Agent graph recursion limit 分开设定。
- Grader 最好有确定性证据工具（tests、lint、schema check），不要只让 LLM 自评。
- 达到迭代上限不等于通过；自动化脚本要区分 satisfied 与 cap exhaustion。
- “blocked” 应表示确实无法继续，而不是预算将尽。

## Remote sandbox 架构

`dcode` 使用 sandbox-as-tool：模型循环、memory 与工具 dispatch 留在本机，`read_file`、`write_file`、`execute` 等实际作用于远端环境。本机工作区不会自动上传；必须用 setup script 或 provider file-transfer API 播种。

当前内置 provider：LangSmith、AgentCore、Daytona、Modal、Runloop、Vercel。E2B 是第三方 package provider。LangSmith 默认包含，其余通过 extra 安装；`all-sandboxes` 不包含第三方 provider。

常用 flags：

| Flag | 作用 |
| --- | --- |
| `--sandbox TYPE` | 选择 provider；裸 flag 使用 config default |
| `--sandbox-id ID` | 重连已有环境，不创建/清理 |
| `--sandbox-snapshot-name NAME` | 使用或创建 snapshot；与 sandbox ID 互斥 |
| `--sandbox-setup PATH` | 创建后运行 setup script |

裸 `--sandbox` 接受可选值，应放命令末尾，否则后一个 positional argument 可能被当作 provider 名。生产脚本优先显式写 provider。

默认工作目录因 provider 不同：LangSmith `/root`、AgentCore `/tmp`、Daytona `/home/your-name`、Modal `/workspace`、Runloop/E2B `/home/your-name`、Vercel `/vercel/sandbox`。Setup、execute 与路径假设必须统一。

## Provider 扩展与优先级

发现优先级为 config-declared > third-party entry point > built-in。第三方 package 注册 `deepagents_code.sandbox_providers` entry point；本地/企业实现可在 config 用 `class_path` 声明。

Config provider 可描述 working dir、package hint、是否支持 sandbox ID、是否支持 snapshot，以及传给 `get_or_create()` 的 params。重用 built-in name 会覆盖它。

`class_path` 会在本机 import 并执行任意 Python module-level code。它不是远端 sandbox 内的代码，而是 `dcode` 进程权限下的本机代码；只有完全信任的配置才能使用。

## Setup scripts 与 secrets

Setup script 适合 clone repo、安装依赖和初始化工作目录。文档说明 `${VAR}` 会用本地环境变量展开，这意味着密钥可能被直接写入远端 shell 输入、文件、进程环境或日志。

安全做法：

- Setup script 本身必须受版本控制与审查。
- 不从不可信项目读取 setup script。
- 优先使用 provider 的认证代理或短期、最小权限 token。
- 不把长期 API keys 写入 sandbox 文件或环境。
- 用 file-transfer API 上传必要源码，不上传整个 home 或 `.env`。
- 给 sandbox TTL、资源上限与清理策略。

远端隔离只保护本机，不防间接提示注入。Agent 仍可在 sandbox 内读取所有可达文件并通过允许的网络外传；审批与网络限制必须共同存在。

## 推荐运行策略

| 场景 | 推荐组合 |
| --- | --- |
| 可信本地仓库、日常开发 | Manual；必要时实验 Auto；文件/shell 收窄 |
| 不可信仓库 | Remote sandbox + Manual + 拒绝项目 MCP/hooks |
| CI 代码检查 | 非交互 + 明确文件工具 + 最小 `-S` + timeout/max-turns + rubric |
| 需要自主修改的隔离任务 | Remote sandbox + Manual 产物 review；不要把 Auto 当隔离 |
| 纯分析、不需写入 | 只读文件工具，不暴露 execute/write/delete |

YOLO 只能在已经接受“无需审查的一切副作用”时使用；远端 sandbox 能降低宿主损害，却不能自动保护远端凭证、数据与网络。
