作者差点让一个设计Agent直接改staging环境,后改为先在一次性免费服务器上执行相同命令验证回滚成功,再在正式环境执行——建立了AI Agent变更的审批准入流程。
上周二,我差点让一个设计 Agent 直接编辑我们的预发布环境。
我并没有突然信任它。只是厌倦了手动来回复制文件 diff。那个 Agent 提出了一个轻微的导航变更,最简单的下一步感觉就是"让它直接应用这个补丁吧"。点一下,就完成了。
我没有那么做,但只是因为一个队友问了一个本该显而易见的的问题:如果回滚不生效怎么办?
这个问题一直萦绕在我心头,尤其是在当前这波 AI Agent 新闻浪潮中。每周我都能看到又一篇事后分析,讲的是一个自主工具修改了未经审查的内容,然后没有留下干净的撤销方式。问题很少出在模型作恶上。而是缺少演练,缺少痕迹。
所以我开始做一件小事:在为一个真实环境批准任何 Agent 命令之前,我会先在 一个可丢弃的服务器上运行完全相同的命令,观察回滚是否可行。
这是一种关于知情同意和可逆性的工作流,而不是基准测试。这也是我能够借助 MonkeyCode 的免费模型访问(包括 3000 万 token 的试用额度)和免费服务器选项低成本尝试的工作流。
披露:本文是作为 MonkeyCode 产品推广的一部分而撰写的。
为什么要先演练回滚?
一个真正的批准时刻是这样的:人类看到提议的变更、人类批准、Agent 执行、出现问题、人类尝试恢复。
如果恢复路径没有被演练过,人类实际上是在批准一件不可逆的事情,即使命令在技术上是可以逆转的。
演练回滚将批准问题从"这个变更可能好吗?"翻转成"如果它不好,我能安全地撤销这个变更吗?"
第二个问题更容易测试。
一个你可以实际检查的小型决策日志
我故意把它做得枯燥无趣:每个动作一行 JSON。
import json
import os
from datetime import datetime, timezone
def record_action(entry):
log_path = os.getenv('AGENT_LOG', 'agent_actions.jsonl')
entry['recorded_at'] = datetime.now(timezone.utc).isoformat()
with open(log_path, 'a', encoding='utf-8') as f:
f.write(json.dumps(entry) + '\n')
def rollback_action(entry):
cmd = entry.get('rollback_command')
if not cmd:
raise ValueError('No rollback command provided for action')
print(f'Running rollback: {cmd}')
# In a real rehearsal, you'd execute this in the free server sandbox.
这是我运行的简化版本。一条示例记录在 Python dict 中看起来像这样:
{
'action_id': 'a92f1',
'proposed_change': 'Update primary nav label from Settings to Preferences',
'evidence': 'Usability test note: participants used Preferences when describing where to change profile details',
'rollback_command': 'git checkout -- src/components/nav.js',
'status': 'rehearsed',
'rollback_worked': True
}
在免费服务器上,每个提议的动作都会经过三个小步骤:
应用完全相同的提议变更。
运行完全相同的回滚命令。
记录状态是否干净地恢复。
如果第二步失败或状态与变更前的状态不匹配,我就停下来。不会发生真正的批准。
停止条件很无聊但也很自由:没有回滚证明,就没有真实的写入权限。这将 Agent 的工作从"说服我这次变更是对的"转变为"证明我可以撤销它"。
为什么这不仅仅是 DevOps 表演
几轮下来我注意到了两件事。
首先,免费服务器练习能够捕获在 diff 审查中永远不会出现的失败:缺少文件备份、没有回滚脚本的数据库迁移、依赖于实时环境变量的变更,以及仅在执行期间才出现的权限错误。
其次,演练回滚改变了审查者关注的内容。审查者不再盯着代码猜测意图,而是开始问"什么能撤销这个?"以及"那个撤销操作存在哪里?"对于产品团队来说,这是一个更健康的对话。
批准时刻的无障碍检查
我一直在调整的一件事是如何呈现面向审查者的日志。
如果唯一的撤销证据只是一个绿色的勾选,一个色盲的审查者或者在手机上快速阅读的人会错过它。所以日志也包含纯语言字段:
status_text: 'Rollback ran and the server state matched the pre-change snapshot.'
failure_text: 'Rollback reverted the file, but the navigation still pointed to the old route because the route map was not restored.'
这样批准决策就不依赖于单一的视觉提示。这是迈向包容性人类监督的又一小步。
这种方法不会告诉你的事
免费服务器不是你的生产环境。网络条件、密钥、数据量、延迟和第三方沙箱的行为都可能不同。
所以我不把它用作保证。我把它用作演练。它在人类被迫在生产环境中修复问题之前,捕获明显的回滚失败。
它也不是真实预发布环境或访问控制的替代品。如果你处理的是受监管数据、健康记录、支付或多租户生产写入,这个免费服务器演练不是你的批准边界。它是一间练习室,而不是安全审计。
谁应该跳过这个?如果你的团队没有人工审查者,或者仍然把 Agent 输出当作需要被接受而不是被质疑的东西,演练回滚解决不了这个问题。只有当有一个真正能够停止的人时,这个流程才有帮助。
但当它适用时,这是一个令人放松的习惯
现在我在批准真实 Agent 命令之前运行这个演练。它多花了几分钟,但它用具体的、有记录的答案取代了那种"如果这坏了怎么办"的低级焦虑。
而且因为免费模型访问和免费服务器选项让它变得低成本,我不需要为一个昂贵的沙箱去求人。我可以演练我想要避免的那个具体的失败,然后自己判断边界是否成立。
如果你也在 Agent 输出触及真实环境之前审查它,试着先演练回滚。它不会让 Agent 在设计建议上变得更好,但它会让人类这一侧的闭环更容易信任。