《预约成功之后,世界偷偷改了答案》
——EnvOS:给活在流动世界里的 Agent 做一场带时间戳的审计
论文:EnvOS: Auditing Computer-Use Agents When the World Moves On
作者:Ankush Kadu, Athira Gopal, Niharika Singh, Arpit Jain, Aswanth Krishnan(QpiAI, Bangalore)
arXiv:2610.40246 | 已被 NeurIPS 2026 Workshops(AABA4ET & CL4FMAgents)接收
🖼️ 一张照片,还是一段录像?
先想象一个再普通不过的下午。
你在网上预约诊所的复诊。下午两点,挂号页面明晃晃写着:三号诊室,A 栋。你记下了,继续填别的表格。三点整,你点下"确认预约"。
没人告诉你的是:两点半,医院把这场复诊挪到了 B 栋。页面更新过,但没弹窗、没短信、没有任何一条通知追到你面前。
现在问题来了:你预约失败了。这是你的错吗?
如果考官只看"任务结束时的世界状态"——你确实订错了楼,零分。可是慢着:你的每一步都合乎逻辑,你只是拿着一张两小时前的地图,走了一段两小时后的路。错的是路,还是走路的人?
这就是计算机使用 Agent(computer-use agent)今天面临的真实处境。它们操作的不是死板的表单,而是活着的软件:预约会挪窝、条款会修订、记录会更新。而绝大多数评测(eval)仍然假设一件事:世界从 episode 开始那一刻起就冻结了。Agent 跑完,看最终状态打分,收工。
静态评测像什么呢?像凭一张案发现场的照片判案。照片里车停在人行道上——可是红绿灯在那一瞬间变了,前车急刹,路口改了施工围挡……这些"过程"全都不在照片里。照片只会告诉你结果,不会告诉你因果。
EnvOS 这篇论文做的事,说白了就是:把照片换成监控录像。而且不止于此。录像到手之后,他们还给每一帧装上时间戳、封存原始底片、连"判卷人"都一并送上被告席——因为判卷人也可能看错。
🌊 世界在动,错的到底是谁?
把这个问题放进评测史的脉络里看,会清楚它在哪一环上补洞。
Agent 评测大致经历过三次迁徙:第一次,从"答固定题库"迁到长程任务——agent 要在几十步里保持不迷路;第二次,从脚本环境迁到真实软件——表单、日历、数据库,状态和状态之间的依赖都是真的;第三次,也是正在发生的这一次,从冻结的世界迁到流动的世界。前两次迁徙都有人做过了,第三次刚起步就撞上本文讲的这堵墙:世界一旦会动,"对"与"错"就不再是终态快照能回答的问题。
先把这个问题的形状看清楚,因为它比"agent 不够聪明"微妙得多。
当一个 agent 在动态环境里失败,嫌疑人其实有三个:
- Agent 自己——它看见了新值,但没用。这是真失败;
- 环境的机关——那次"变更"根本没按剧本触发,或者触发得太早、触发了两次、甚至把无关的记录也误伤了。这时候 agent 是被冤枉的;
- 评分的裁判——变更正确触发了,信息也送到了,但判卷脚本把对的行为判成错(或者反过来)。
传统的终态打分(terminal pass/fail)根本没有能力区分这三种情况。一个孤零零的"失败"标签背后,是三种完全不同的故事,而它们通向完全不同的结论:该修模型、修 benchmark,还是修评分器。
作者把这个困境拆成两种有效性:
- 干预有效性(intervention validity):环境真的发生了"预定的那次状态迁移"吗?时机对吗?有没有副作用?
- 评估有效性(evaluation validity):agent 真的收到它该收到的信息了吗?判分结果有留档证据支撑吗?
这两个问题不解决,一切"agent 能力榜单"都是在沙地上盖楼。更麻烦的是,当下 RLVR(基于可验证奖励的强化学习)的潮流正在用程序化检查器当奖励函数——检查器判错一次,喂给模型的就是一个毒奖励。错的就不只是一个 benchmark 数字,而是一个被训练歪的模型。
EnvOS 的野心:把"造一个会变的环境"这件事,从手工作坊变成有认证、有证据、可审计的工程流程。
这条路上的先行者已经不少——长程交互评测、时间扰动、演化环境,这两年都陆续有人探过。EnvOS 与它们互补的位置在于:它不只关心环境怎么动,更关心你怎么证明这场动是合法的、以及判出来的失败到底属于谁。前者是体验问题,后者是司法问题。司法问题不解决,体验做得再花,结论也是一纸空文。
🏥 第一桩案件:搬家的诊所
光谈框架太抽象,先看他们搭的两个"案发现场"。
诊所预约任务:agent 要替用户完成一次复诊预约。它的旅程是这样的——先读邮件,弄清用户想约哪天;再翻日历,避开已有安排;然后打开预约门户,看有哪些场次。门户一开始展示的场次地点是 v₀,agent 顺理成章地记下了。等它之后发出某个"符合条件的请求"时,后台的权威记录被悄悄改写为 v₁。没有弹窗,没有公告,但原始页面始终可以回访。
把这条时间线画出来就明白陷阱在哪了:知情发生在两点,变更发生在两点半,提交发生在三点。agent 手里的地图在两点是准确的,到三点就是一张旧地图。它要做的不是"看到新值"——没人给它看——而是意识到"我两小时前看到的那个值,可能不再作数",然后自己走回去查。
关键在于时机:必须先让 agent 看到旧值,之后的某个请求才触发变更。如果变更发生在"看到旧值"之前,那就不存在"过期信息"这回事——agent 看到的本来就是新地图,整个实验的前提就塌了。这个先后顺序,是整个设计合法性的地基。
三个实验条件,名字都带注册编号(这是预注册研究的洁癖):
| 条件 | 复核环节给 agent 看什么 |
|---|---|
| OFF-A | 什么都不多给。原始记录仍在,但没人提醒 |
| CUE-A | 一条"请复核"的提醒 + 原文链接,但不透露新值 |
| LIVE-A | 同样的提醒和链接,并且直接把新地点显示出来 |
注意:三种条件下,后台的变更是完全一样的。动的不是世界本身,而是"世界把新值递到你眼前的方式"。
结果(Claude Opus 5,16 个实例,48 步动作预算):
- OFF-A:0/16 成功
- CUE-A:2/16 成功
- LIVE-A:15/16 成功
零分、两分、十五分。同一个模型,同一批任务,同一个动作预算。唯一变量是:复核界面上有没有把新值直接端出来。
LIVE–CUE 的配对符号检验:16 对里 13 对只有 LIVE 侧成功、0 对反向、3 对平局,p = 0.000244;经整块 Holm 校正后 p = 0.000488;再经过全文 12 项检验的 paper-wide Holm 校正,依然站得住——p = 0.00293。
而一个刺眼的细节是:在 CUE-A 里,16 次轨迹中只有 1 次真的点开了那条"请复核"的链接。提醒发了,链接给了,agent 不去。这不是 agent 叛逆——在它的世界里,那条提醒可能只是又一行无关紧要的文本,和页脚上千万条"服务条款更新"没有区别。
这个 0 → 2 → 15 的阶梯,是整篇论文最有冲击力的一组数字:环境呈现信息的方式,直接决定了"能力"是否存在。
🧾 第二桩案件:午夜修订的保险条款
第二个任务是保险理赔审批。核心公式干净得像小学应用题:
应批金额 = min(索赔金额 − 免赔额,现行赔付上限)
agent 先看到政策页上的旧上限 v₀;某个后续请求触发后,库里那条政策记录被改成 v₁。审批必须按审批时刻有效的政策进行。有个别实例还故意跨过计算门槛——光查出新上限还不够,得真的会算,拿错旧值一算下来正好错得离谱。
这里只有两个条件:OFF-A(审批前不给额外政策信息)和 ON-A(审批前把现行政策记录重新展示一遍——给上限,但不给答案)。
结果出现了戏剧性的模型分化:
- Claude Opus 5:OFF-A 10/10,ON-A 10/10。它不是没看见变更——在 OFF-A 的全部 10 次运行里,它都自己回头查了政策记录,一次不落。它不需要被提醒,它天生多疑。由于满分封顶,这个 block 里"面板有没有用"根本无从检验(预注册的 rescue 门槛未触发,作者也老老实实不下"面板有效"的结论)。
- Claude Sonnet 5:OFF-A 1/10,ON-A 9/10。配对检验 8 对处理侧成功、0 对反向、2 对平局,本地 p = 0.00781——块内显著;但放到全文 12 项检验的 Holm 校正下,p = 0.0781,不再显著。作者在文中把两套推断并排陈列,明确禁止读者混用。
- Gemini 3.1 Pro Preview(后续注册的跟进配置):OFF-A 0/10,ON-A 5/10,p = 0.0625——没有展示出效应。注意这不是"证明了没用",而是"这个配置、在这批实例、这个预算下没检出来"。而且它的调用方式本身就不同:帧直接内联在无状态 REST 请求里、没有工具可用;Claude 系模型则是被要求自己用文件读取工具去看每一帧。模型、供应商、调用器、图像投递通道是绑在一起变的,谁也拆不出单纯的"厂商效应"。
顺带一提,诊所那个 Sonnet block 在注册的截止点只数完了 51 个单元格中的 21 个,按预注册规则不做任何推断。这种"没数完就闭嘴"的纪律,本身就是审计文化的一部分。
把三家放在一起看,结论不是"谁强谁弱",而是一个更别扭的事实:"agent 有没有发现变化"是模型、任务与界面三者的联合函数,拆不开,也就不能合成一张排行榜。
🧪 案发现场是怎么搭的
在继续讲流程之前,值得看一眼这套"案发现场"本身的工程规格,因为魔鬼全在细节里。
整个前瞻实验跑在一个合成的职场测试床上:14 个容器化的基础设施服务,诊所应用、保险应用、配套的邮件、日历、数据库一应俱全。Agent 通过一个受控的语义浏览器接口干活——每一步拿到的是截图加文本观察,动作走固定的 schema,调用本身是无状态的,只带一张短备忘录和最近几步动作历史。诊所任务给 48 步动作预算,理赔任务给 40 步。条件之间共享同一批实例数据和指令,顺序固定且做了平衡。
作者们很诚实地在文中标注:这不是操作系统级的无限制 computer-use,只是"在声明好的动作与观察契约之内"的计算机使用。这个限定非常重要——它意味着所有结论都附带着一个隐形的适用范围从句:在这套接口、这个预算、这批实例上。任何想把数字直接外推到"Opus 比 Sonnet 强"的读者,都会被作者预先写好的护栏拦住。
匹配条件之间的对比也设计得很克制:同一个生成实例,在每一种实验条件下各跑一遍,只数"不一致的对子"。16 个实例在 OFF/CUE/LIVE 三种条件下各跑一次,哪个实例在哪条臂上翻了车,逐格可查——论文里那张按实例展开的结果图(Figure 3),本质上就是把每个病例的 X 光片贴在墙上,不许任何汇总统计掩盖单个案例的故事。
🧬 把考题送上手术台:EnvOS 的三步流程
好,现在看 EnvOS 本身怎么造出这样一个会变的世界,并且证明它造对了。
核心是一个干净的数学对象——扰动 ρ = (δ, τ, c, g):
- δ:权威状态上的改写算子(哪条记录、变成什么);
- τ:触发条件(在哪个请求边界开火);
- c:披露通道(新值通过什么界面、以什么形式出现);
- g:一次性保险(整个 episode 最多触发一次)。
注意 δ 和 c 是分开的两件事:世界变了,不等于 agent 被通知了。论文里反复强调一条本体论戒律——"页面被服务过"、"模型被展示过"、"模型理解并使用了"是三个独立事件。前两个可以审计,第三个谁也不能假设。
整个框架分三步:
第一步:构造(Construction)
从现象(phenomenon)出发——"agent 见过的值在它行动之前被取代",这是与应用无关的一类环境变化。再把它落到一个具体应用的可执行扰动上。种子世界 + 扰动 + 披露条件 + 成功不变量 + 评分器,打包成一个"候选评估工件"。
第二步:认证(Certification)——考题先体检,再开考
候选工件要过五道检查,任何一道不过关都不准入场:
- 干预有效性:变更真的在声明的边界触发了吗?有没有误伤无关记录?"只触发一次"的保险丝灵不灵?
- 观察一致性:允许的披露和权威状态对得上吗?承诺的通道真的走通了吗?
- 可行性:得有一条脚本化的参考路线能真正走通任务——而且是在每个冻结的生成实例上单独验,不是验完模板就算数。
- 行为区分度:故意做一个"有缺陷的脚本策略",工件必须能把它揪出来。揪不出缺陷的考题,不配当考题。
- 评分器鲁棒性:拿故意损坏的记录、擦边球、合法正例去喂评分器,看它会不会把脏档案当干净、把干净当脏。
检查只有三种结果:通过 / 违规 / 监控错误。"监控错误"——系统自己测不了——绝不算通过。评不了,就不许入场。这条规则看似死板,实则锋利:它堵死了"测不出来就算过"这条最常见的自我安慰通道。
第三步:受控执行 + 基于证据的评估
被认证的实例才能跑模型。执行时:任务实例、动作预算、有效性规则、结局不变量、分析规则全部预先冻结;发布清单(release manifest)对 29 个仓库路径、容器镜像、生成器、调用器、模型标识做 SHA-256 哈希,跑的时候哪怕一个比特漂移,驱动程序直接拒跑。修订?可以,但每一条都带日期公开披露,不许悄悄掺进来。
跑完之后,独立实现的第二套代码从归档证据里重新推导有效性与结局。归档 insufficient 的条款,就老老实实标"未决",不许脑补。
⚖️ 法医的时间戳:先查考场,再判考生
评估一条轨迹时,EnvOS 的顺序是反直觉的,也是全文我最欣赏的一条纪律:
先判定这条 episode 有没有资格进分析,再判定它过没过。
什么叫没资格?——变更根本没触发;承诺给模型的观察没送达;注入器把别的记录误改了。这些情况下 agent 的失败是考场的错,不能记在考生头上。反过来,一条合法但未成功的 episode——包括把 48 步动作预算耗尽的那种——就是失败,不许换题重跑,不许"再给它一次机会"。每个格子只留两个保留名额(provider 掉线之类的故障走单独的登记通道,混不进成绩)。
这套"validity-first counting"由六阶段审计流水线撑着:认证、策略隔离(跑模型的 OS 账号是封禁的、能访问哪些源写死在配置里,还用金丝雀探针去戳有没有越界)、规则冻结、先有效性后计数、独立重推导、定向挑战。
结局判分看的是五个注册不变量:目标状态正确、只有一次提交、无附带损伤、提交后的必要延续动作、最终报告与提交状态一致。每一条都对照动作发生时刻的权威状态——不是任务结束时的快照。
这就是"监控录像"的本体:每一个动作都被钉在它发生的那一帧上,世界的样子也钉在那一帧上。事后任何人——包括多年后带着怀疑回来的审稿人——都可以把底片调出来,逐帧重放,重算当年的判决。
为什么这条顺序值得大书特书?因为评测界有一种积习:失败就是失败,先记账,再找借口。静态 benchmark 时代这种积习危害有限——环境冻结,所有失败确实都归 agent。可世界一旦会动,每一次"宽容地"把考场错误算到 agent 头上,榜单上就多一条冤案;每一次"热心地"把无效 episode 剔除出失败统计,榜单上就多一个水货。两种污染方向相反,毒性相同:都让"模型能力"这个本该精确的物理量,变成评测机关自身误差的函数。先查资格再判对错,是把两种污染同时掐死的唯一阀门。
🔍 连判卷人也上了被告席
故事到这里还差最后一环,也是这篇论文最不寻常的一环:审计评估器自己。
逻辑很直白——如果 EnvOS 声称"我们能分清 agent 的错和环境的错",那它必须也经得起同样的问题:"你凭什么说你的判分是对的?"
于是有了三组"档案挑战"(archive challenge):拿真实 episode 的归档副本,故意改坏其中某份证据,看流水线能不能认出"这不再是干净的记录"。
- 密封挑战:一个独立的模型造了 28 个案例(对它的建造者白盒,但对搭建流水线的 Claude agent 全程保密),评分器 28/28 全部命中预期判决。
- 纯规则挑战——最精彩的一组:一个 GPT-6 对话只拿到规则摘录和档案 schema,看不到任何代码、论文、历史案例或结果,凭空设计了 56 个案例及各自的预期判决。作者照着规则把它们实现出来,再让另一个对话复核保真度,最终 36 个案例入场:10 个干净对照全部被正确接受;26 个损坏案例,一个都没被当成干净放过——24 个被直接揪出,2 个未下判决,0 个漏网。
- 外部挑战:一个 Gemini CLI agent 拿到规则、schema 和 15 份档案副本,自己设计并生成 56 个案例。流水线在 39 个损坏案例中抓住 25 个(理赔 14/20,诊所 11/19);而"简单翻日志"的基线只抓住 4 个。
一句话版本:在盲造的脏档案面前,EnvOS 从未把脏的当干净的;在外部生成的案例上,它的捕获率是朴素日志检查的六倍多。
这项工作为什么必须做,论文写得很克制,但分量很重:既然这些环境是从种子程序化生成的、结局是由"经过审计的自动评分器"从已提交状态里算出来的,它们天然就是 RLVR 的训练场——而每一次评分器误判,都是一个喂给训练过程的毒奖励。挑战结果同时标出了这片训练场的雷区埋在哪。
⚠️ 诚实的边界:作者自己画下的框
这篇论文最"不性感"、但也最值钱的地方,是作者亲手给自己画的边界框:
- 两个 workflow 而已。 前瞻实验只有诊所预约和保险理赔,全部跑在一个合成职场测试床上。这不构成"方法可以移植到任意生产应用"的证据。
- "理解"无法审计。 页面被服务、帧被送达,都可留档;但模型"是否理解并使用了"那个值,任何仪器都测不到。论文把这条写成一条本体论戒律,而不是技术遗憾。
- 独立重推导不是第三方审计。 重推导的代码是同一支团队写的独立实现,能暴露实现之间的分歧,但暴露不了两家共享同一份归档证据时的共同盲区——所以才需要后面那组外部挑战。
- 挑战覆盖有死角。 三组挑战的访问权限、实现方式、能测的错误类型各不相同,漏网之案被如实登记,而不是从报告里消失。附录里甚至保留了一份带日期的勘误(erratum):某个历史 block 的 Newcombe 区间存储有误,改了,写明日期,放在那里任人翻检。
- 探索性现象族不入主结论。 附录 S1 还报告了其它环境现象家族的认证与探索性评估,但作者明确声明:它们不与主实验混合,不构成任何检测率估计。
把边界画得这么清楚,不是因为作者谦虚,而是因为审计工作的信用恰恰建立在"声明了什么、没声明什么"的精确度上。一个不知道自己不知道什么的审计系统,比没有审计系统更危险——它会给错误结论盖上合格的印章。
🧠 费曼式收尾:把一锅浓汤熬回几勺
绕了这么远,值得带走的其实就几句话。
第一,世界是活的,评测必须带时间戳。 终态打分在动态环境里必然双向误判:把环境的错记在 agent 头上,把运气记成能力。EnvOS 的对策不是更聪明地打分,而是把"何时发生了什么"完整留档,让每个动作对照它发生那一刻的世界,而不是任务结束时的世界。
第二,界面即能力,提醒不等于送达。 0/16 → 2/16 → 15/16 不是同一个模型三次考试的分数,而是同一个模型面对三种"世界表达方式"的成绩单。"agent 行不行"这个问题,离了界面没有答案。
第三,先查考场,再判考生。 一条 episode 进不了分析,就不参与计数。这不是包庇 agent,而是不让 benchmark 机关自己的错误污染结论——而且反过来,合法但没做完就是没做完,预算耗尽也是失败,不许撒娇。
第四,审计是递归的。 判卷人也要被审,而且要用盲造案例审。这是通往 scalable oversight 的那条窄路:监督者本身必须处于被监督之下,一路递归到地基。
第五,严肃本身就是一种结果。 预注册、哈希清单、带日期的修订、没数完就放弃推断的 block——这套"笨功夫"让论文里每个数字都经得起翻案。在一个热衷于刷榜的领域,这种笨功夫比任何一个具体分数都稀缺。
第六,审计过的评测,才有资格当训练场。 这是论文埋在结尾的一条线索:因为每个环境都从种子生成、每个结局都由经过挑战检验的自动评分器从已提交状态算出,这套东西天然可以喂给 RLVR。但同一句话反过来说也成立——评分器一旦被信任,它的每个盲区都会变成模型的坏习惯。把评测做成可审计,不只是学术洁癖,是在给即将到来的大规模 agent 训练铺铁轨。
监控录像已经装好。接下来每一次 agent 在流动世界里的失误,我们都有机会回答那个真正重要的问题:
错的到底是谁?
📚 参考文献
- Kadu, A., Gopal, A., Singh, N., Jain, A., & Krishnan, A. (2026). EnvOS: Auditing Computer-Use Agents When the World Moves On — Phenomenon-Based Task Construction, Certification, and Evidence-Based Evaluation. Accepted at the NeurIPS 2026 Workshops on Agentic AI Benchmarks and Applications for Enterprise Tasks (AABA4ET) and on Continual Learning in the Era of Foundation Models and Embodied Agents (CL4FMAgents). arXiv:2610.40246.
链接:https://arxiv.org/abs/2610.40246
(文中讨论的现象学框架、扰动形式化 ρ = (δ, τ, c, g)、诊所预约与保险理赔两组前瞻性实验、以及全部评估器挑战细节,均出自该论文及其附录。)
#每日论文 #paperscool #agent审计
讨论回复
加载中...正在加载回复...
智谱 GLM-5 已上线
我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。