当AI代理用一句提示词就能改动系统,速度是容易的,问责不是。谁审过计划?谁批的?真正跑起来的计划,还是被批准的那一份吗?

打开网易新闻 查看精彩图片

在Flip the Switch黑客松2026上,一位开发者独自用Switch和Antigravity搭出了Change Desk,专门回答上面这几个问题。整套东西的骨架很朴素:一次变更请求要穿过一个Switch房间,依次走完请求、计划、审查、人工批准、执行五步。

房间里同时住着三个代理。规划者负责写plan.md;风险审查者对照一份策略文件检查计划,并把计划的SHA-256哈希记进review.md;执行者负责跑变更,而且只在批准之后才动手。目标是一个小沙盒应用,从v1.0.0升到v2.0.0,所以没有真实资产处在风险里。

Switch在这里扮演协调层。代理之间靠@提及把活交给彼此,整段对话都留在同一个地方。在执行者的设置里,寻址被限定为“谁能和你的代理说话:只有我(所有者)”,按界面上的说明,就是“只有你本人,代理不能和它说话,包括你自己的代理”。谁有权指挥执行者,由Switch决定;变更能不能真的跑,则由一个小脚本来决定。

那道闸门是tools/apply_change.sh,它是确定性的。以下条件只要有一条不成立,它就拒绝执行:变更ID格式合规;该ID没有在只追加的账本里出现过(防重放);存在已签名的批准;计划哈希与获批时一致;审查绑定的是同一份计划;版本与签名时一致;目标位于沙盒之内。应用之后它还会跑一次健康检查,失败就自动回滚。

人工那一步是tools/approve.sh。它把完整的计划和审查摆出来,在真实终端上要求确认,然后用操作员密钥对变更ID、计划哈希和版本签名。

实跑记录是CHG-20261104-001。开发者请求把版本从v1.0.0升到v2.0.0,规划者在evidence/CHG-20261104-001/plan.md里起草了步骤并算出哈希(19bacc111377...)。审查者独立对照policy/change-policy.md审计了这份计划,核验哈希,把APPROVED结论发进房间。

接着开发者运行./tools/approve.sh,看过未截断的计划,在终端上批准,把签名令牌发回房间。执行者接住它,做了四次工具调用,大约23秒完成执行。每一步都留下证据:计划、审查、批准、执行日志。这次真实运行的脱敏副本被提交在examples/evidence/live-run-CHG-20261104-001/下,任何人都能查看确切产物,不用自己跑一遍。

先踩的坑也不少。第一版草稿凭空造了格式里没有的字段,比如顶层version和指向外部文件的指令路径,靠对照官方triage-pair.template.yaml示例、跑Switch的模板检查工具,才在导入前发现;后来写了tools/build_template.py,按官方schema把代理的markdown文件自动编译成内联YAML。

官方示例靠名字交接工作,而初版提示词里代理只喊一句PLAN READY却不提及任何人。房间里的代理只有被点名才会触发,所以在正式跑之前,指令里补上了对规划者、审查者、执行者的显式@提及。

还有哈希幻觉。让大模型在提示词上下文里算SHA-256是已知的失败模式,会产出截断或编造的十六进制串;审查者的哈希只要差一个字节,闸门就会失败。对策是tools/hash_plan.sh,一个确定性的bash助手,让代理去跑脚本而不是猜哈希。

实跑时执行者的第一次闸门调用确实失败关闭了。Switch的代理运行器会隔离执行环境,把XDG_CONFIG_HOME重定向到/tmp/switch-opencode-...下的临时目录,闸门去那里找operator.key,结果拒绝:GATE REFUSED: FAIL-CLOSED: Operator key missing。后来apply_change.sh改为通过getent passwd回退到用户主目录,第二次尝试才让沙盒里的代理验签成功。

边界也说清楚。这是一个沙盒里的原型。代理和开发者跑在同一个操作系统账户下,一个存心的同用户进程可以读到操作员密钥。闸门运行在代理运行器内部,目前用的是对称HMAC,任何能验签的东西也能读到密钥。签名证明的是密钥被用过,防的是提示词注入或房间层面的误批准,防不住本地代理去翻文件系统。

Switch的寻址配置为所有者,没有拿第二个用户账户测过。证据文件夹里的文件靠SHA-256指纹和只追加的运行账本做到可发现篡改,不是不可变的硬件存储。

想自己试的话,仓库在github.com/gnshx/switch-change-desk。离线测试克隆后跑make test,21个回归测试,大约2秒跑完。在Switch里跑则是在Switch Console导入switch-change-desk.template.yaml,注意模板对话框里的directory参数要指向你的克隆路径,让所有代理和终端共享同一个工作目录。

下一步的计划包括:把对称HMAC换成非对称签名(比如Ed25519或ssh-keygen -Y),人用私钥签,闸门用提交的公钥验,密钥就不再对代理运行器可见;用真实的第二个账户测试Switch的寻址策略,当面确认外部者被拒;再加一个由不同模型供应商驱动的审查者,去抓更隐蔽的边界情况。

用AI代理搭东西教会开发者一件事:速度是容易的,问责必须被工程化。Switch给了协作房间和寻址边界,策略闸门给了确定性的把握。