博客
人机协同:Tactic Remote 的审批系统如何让开发者始终掌控全局
Tactic Remote 的审批系统通过 hook 拦截 Claude Code 的工具调用,以推送通知的形式发送到你的 iPhone,并在你明确批准或拒绝每个操作之前阻止执行。
继续查看该栏目下的产品与工程更新。
浏览此分类AI 编程代理非常强大,但缺乏监督的能力是一种隐患。Tactic Remote 围绕一个核心理念构建:开发者应该审批 AI 代理在其开发环境中执行的每一个关键操作。今天,我们将详细介绍审批系统的工作原理、延迟成本,以及未来的发展方向。
为什么审批如此重要
Claude Code 可以读取文件、写入文件、执行 shell 命令以及与外部服务交互。每一个操作都会产生实际影响。一个被误解的提示可能导致文件被删除、git 操作出错或意外的 API 调用。
Anthropic 为 Claude Code 设计了一套权限系统,会在终端中提示用户进行审批。但如果你不在 Mac 旁边——通勤中、会议中或者只是在另一个房间——这些提示会无限期地阻塞执行。你的代理只能闲置等待。
Tactic Remote 通过将每个审批提示实时推送到你的 iPhone 来解决这个问题。你可以查看提议的操作,了解完整上下文,然后点击批准或拒绝。代理会立即恢复工作,无需切换到 Mac 操作。
架构:Hook 与拦截
审批系统建立在 Claude Code 的 hook 机制之上。当 Claude Code 即将执行一个工具调用——文件写入、shell 命令或任何其他需要权限的操作时——Tactic Remote Mac 客户端会在执行前拦截该事件。
以下是完整流程:
- Claude Code 发起工具调用。 例如,它想在你的项目目录中执行
rm -rf node_modules && npm install。 - Hook 被触发。 Tactic Remote 的 hook 脚本捕获工具名称、参数以及提议操作的完整上下文。这是同步发生的——Claude Code 处于暂停状态,等待 hook 返回结果。
- Mac 客户端评估操作。 它会将操作与已配置的自动审批规则进行比对。如果操作匹配某条规则(例如只读文件操作),则立即返回批准结果,无需通知 iPhone。
- 如果需要手动审批,则发送推送通知。 通知中包含操作类型、Claude 打算执行的操作摘要以及足够做出决策的上下文信息。
- iPhone 应用显示审批请求。 你可以看到完整的命令或文件差异、工作目录以及导致此操作的对话上下文。
- 你批准或拒绝。 你的回应通过 WebSocket 传回 Mac 客户端,Mac 客户端将结果返回给 hook,hook 解除对 Claude Code 的阻塞。
从 Claude Code 的角度来看,整个链路是同步的。它调用了一个 hook 并收到了响应。它并不知道审批请求被路由到了另一个网络上的手机。
iPhone 上的审批界面
审批界面设计用于快速、明智的决策。每个请求显示以下信息:
- 操作类型 —— 文件写入、shell 命令、API 调用或其他工具调用。
- 完整载荷 —— 要执行的确切命令或要写入的确切内容。shell 命令不会被摘要或截断。文件差异会显示被修改的具体行。
- 工作目录 —— 操作将在哪里执行,便于你评估影响范围。
- 对话摘录 —— 导致 Claude 提出此操作的最近几轮对话,让你了解请求背后的原因。
- 会话元数据 —— 属于哪个 tmux 会话、已运行多长时间,以及本次会话中已批准了多少操作。
你可以批准、拒绝,或拒绝并附带一条反馈消息发送给 Claude Code。
性能:审批有多快?
我们跟踪了所有连接模式下的审批往返时间。这些数据代表从 Claude Code 的 hook 触发到收到审批响应并恢复执行之间的时间。
| 场景 | 中位数 | P95 |
|---|---|---|
| 本地网络,应用在前台 | 85ms + 人工时间 | 140ms + 人工时间 |
| 本地网络,应用在后台(推送通知) | 1.2s + 人工时间 | 2.8s + 人工时间 |
| Cloudflare Tunnel,应用在前台 | 280ms + 人工时间 | 450ms + 人工时间 |
| Cloudflare Tunnel,应用在后台 | 1.8s + 人工时间 | 3.5s + 人工时间 |
"人工时间"是主要因素。实际上,大多数开发者在主动监控会话时会在 3-8 秒内响应审批请求。系统开销与决策时间相比可以忽略不计。
关键的是,审批系统对匹配自动审批规则的操作不会增加任何开销。这些操作完全绕过 iPhone,在 Mac 上 5ms 以内完成。
自动审批策略
并非每个操作都需要手动审查。读取文件通常是安全的,运行 linter 风险也很低。Tactic Remote 支持可配置的自动审批策略,让你定义哪些操作可以跳过 iPhone 并自动执行。
目前支持的策略选项包括:
- 只读文件操作 ——
cat、read、文件列表等非修改性操作。 - 特定命令前缀 —— 例如,自动审批所有以
npm test或cargo check开头的命令。 - 目录范围限定 —— 自动审批特定目录内的所有操作(适用于临时或测试目录)。
- 工具类型白名单 —— 审批特定工具类别的所有操作。
策略在 Mac 客户端配置,并同步到 iPhone 应用以供查看。你可以在会话视图中查看当前生效的策略,并临时覆盖它们(例如,在进行生产环境部署时切换到"所有操作均需手动审批"模式)。
拒绝并附带反馈
当你拒绝一个操作时,可以选择附带一条消息。该消息会被返回给 Claude Code,效果如同用户在终端中输入。Claude Code 会将其视为指导并调整方案。
例如,如果 Claude 提议删除一个配置文件,而你拒绝并留言"不要删除该文件,它包含不在 git 中的本地覆盖配置",Claude 会接受反馈并寻找替代方案。这在开发者和代理之间建立了一个真正的反馈循环,即使他们不在同一台机器旁。
可靠性保障
审批系统的设计原则是安全失败:
- 如果 WebSocket 连接在审批过程中断开,hook 会超时并返回拒绝结果。Claude Code 收到"权限被拒绝"的结果并停止操作。
- 如果 iPhone 不可达(无网络、手机关机),待处理的审批会在 Mac 客户端排队最多 10 分钟。如果手机在该时间窗口内重新连接,排队的审批会被送达。超时后,它们会被自动拒绝。
- 如果 Mac 客户端崩溃,hook 脚本检测到进程缺失并返回拒绝结果。没有明确的批准,Claude Code 无法继续执行。
默认行为始终是拒绝。系统需要一个明确的批准才能继续。不存在任何因连接断开或进程崩溃而导致未经审查的操作被执行的情况。
未来规划
我们正在对审批系统进行多项改进:
细粒度策略构建器。 在 iPhone 应用上提供可视化界面,无需编辑配置文件即可构建自动审批策略。支持拖放操作和布尔逻辑规则:"自动审批匹配 git status 或 git diff 但不匹配 git push 的 shell 命令。"
会话级信任提升。 支持为特定会话临时提升信任级别。例如,"在接下来的 15 分钟内自动审批此会话中的所有文件写入操作"——当你正在主动监督大规模重构任务且不想逐个审批每个文件时非常有用。
审批分析。 一个展示审批模式的仪表板——你最常批准哪些操作、最常拒绝哪些操作,以及基于历史记录的自动审批策略建议。
批量审批。 当 Claude Code 提出一系列相关操作时(例如,作为单个功能的一部分写入 5 个文件),可以选择作为一个批次进行审查并一次性批准或拒绝整组操作。
审批系统是 Tactic Remote 能够用于实际开发工作的核心。自主运行的 AI 代理很有用,但具备人工监督的自主 AI 代理才值得信赖。这个区别至关重要,我们将持续在这方面投入。