AGENT 工程闯关 · 第 02 关

任务中断,如何优化?

01 改代码02 看反馈

01 修改代码

harness.js
模型是固定剧本,你来补上 Harness。
接口速查:ctx 里有哪些数据、能调用哪些工具
onResume(ctx)
中断后接手任务时调用。你来决定从哪一步继续,可以调用工具;恢复过程中可能再次中断。
canComplete(ctx) → true / false
模型申请完成时调用,运行在全新实例中。返回 true 才宣称任务完成,否则转人工。ctx.tools 为 null,只能检查进度。
ctx.task → { id, revision, publishAllowed, steps }
接手时读取的当前任务。revision 是当前版本;publishAllowed 是当前发布授权;steps 是按顺序排列的 { id, label } 数组,依次为 draft(生成报告)、publish(发布报告)、notify(通知团队)。
ctx.checkpoint → { revision, completed }
进程之外保存的进度。completed 是成功凭据数组,每项 { stepId, revision, receiptId, status: "succeeded" }。旧版本进度不能当作当前任务已完成。
ctx.attempts → [{ stepId, revision, result }]
runStep 自动保存的请求记录,重启后仍可读取。result 为 null 表示没有拿到回执,不代表没执行;非 null 是返回的成功凭据。
ctx.reason · ctx.model · ctx.now() · ctx.deadline
接手原因 start / restart;模型的话(申请完成时 says 为 done);当前模拟时间;180 秒任务期限。所有数据都是调用时的快照,不会随工具调用自动刷新。
await ctx.tools.runStep(stepId)
执行一个步骤,返回 { stepId, revision, receiptId, status: "succeeded" }。必须按任务顺序;同一版本的同一步骤重复调用会真的重复执行。生成报告不需要发布授权,发布和通知都必须有当前授权。
await ctx.tools.inspectStep(stepId)
核对当前版本的实际执行结果。返回成功凭据,或 { stepId, revision, status: "not_found" / "unknown" }。not_found 明确没执行;unknown 查不清,不能直接重做,本关应交人工。
await ctx.tools.saveCheckpoint({ revision, completed })
将进度保存到进程之外,重启后仍在。completed 必须是工具返回的真实成功凭据,不能编造。保存是覆盖操作,应保留此前已确认的步骤。执行工具与保存进度不是一次原子操作。
await ctx.tools.askHuman(reason)
交人工继续处理,说明不能安全恢复的原因,之后不能再调用工具。

顶层变量和局部变量在进程中断后丢失。每组最多 180 秒模拟时间、60 次工具调用。不要使用 setTimeout 或引入模块。

编辑器快捷键:在代码框内按 ⌘ / Ctrl + Enter 运行全部场景;Tab 缩进;Shift + Tab 移出代码框。

正在载入编辑器…

02 运行反馈

  1. 先看左侧的两个函数一个处理任务恢复,一个检查是否真正完成。
  2. 运行后,在这里找原因对照实际执行和保存的进度,看中断发生在哪里。
  3. 改好再运行接口就在代码上方,也可以复制给你的 Agent 帮忙。

示范不覆盖你的代码,也不计入你的成绩。

闯关说明

1. 为什么有这道题?

你让 Agent 生成一份报告、发布报告,再通知团队。任务做到一半,进程中断了。新实例接手时,可能读到已保存的进度,也可能只读到一条没有回执的请求。

从头重做,可能重复发布、重复通知;直接跳到最后,又可能漏掉步骤。报告已经发布,但进度还没来得及保存,是这道题最容易踩的坑。

这关能学到什么:把任务进度保存在进程之外;区分“没有记录”和“没有执行”;恢复前核对当前任务与授权。

这些原则也适用于批量处理、自动化工作流和需要跨多次连接完成的任务。只断了页面连接,不一定需要重做;本关重点模拟执行进程真的中断。

2. 怎么参与?

我们提供固定剧本的 Agent。你只改 onResume 和 canComplete:前者决定从哪里接着做,后者检查任务是否真的完成。步骤固定为 生成报告 → 发布报告 → 通知团队。

每次接手都可能是全新进程,顶层变量不会保留;完成检查也会读取持久进度,而不是上一轮的内存。改好后点“运行全部场景”,看反馈,再修改。不用 API Key,也可以“复制给 Agent”请你的 Agent 帮忙。

3. 怎样算过关?

转人工不等于失败。全部 22 组都满足底线,代表“安全底线通过”;还要 22 组全部处理合适,才显示“本关通过”。一组违反底线,本次总分就是 0。

4. 系统会检查哪些情况?

五个场景,共 22 组。测试会改变任务编号、版本、结果是否已生效,以及中断发生在工具执行前还是执行后。不能只记住某一个任务编号。

场景发生了什么测试数
① 进度已保存前面的步骤已完成,进度也已保存。只需接着做剩下的。5
② 结果还没记下请求有记录,回执和进度却没有。可能已发布、可能没发布,还有一组始终查不清。5
③ 恢复途中又中断新实例恢复执行时,再经历两次中断。内存会丢,但进度、请求和实际结果仍在。5
④ 权限或任务已变化任务已有新版本、发布权限被撤销,或两者同时变化。本关期望交人工确认任务与授权,不能沿用旧凭据完成新版任务。5
⑤ 一切正常固定 Agent 已做完并保存全部步骤。检查你的完成判定,别把好结果改坏。2

场景④(changed)公开包含:2 组仅改版(批准仍有效)、2 组仅撤权、1 组同时变化。改版组期望交人工确认新版任务,不是禁止生成新版草稿;草稿不需要发布授权,新版步骤也不算旧版步骤的重复执行。

反馈中的“实际执行”是给你排错用的,玩家代码不能直接读取。代码只能通过任务进度、请求记录和工具结果了解情况。

5. 底线通过后,怎样拿更高分?

评分项看什么分值
恢复底线全部测试满足上面的要求60
处理是否合适能安全恢复的接着完成;查不清、任务改版待确认或授权失效的交人工最多 30
调用是否精简已确认的步骤不反复查,少做没有必要的执行和查询最多 10

一律交人工可能只达到“安全底线通过”:能自动恢复的任务没有完成,不能算“本关通过”。22 组全部处理合适后,减少多余调用仍能提高分数;不要求冒险重试。

精确计分方法与运行限制

全部底线通过时,按下面的公式计分,最终总分四舍五入。

总分 = 60
+ 30 × 处理合适的测试数 / 22
+ 10 × max(0, 1 − 平均多余业务调用数 / 2)

多余业务调用:只统计你发起的 runStep 与 inspectStep,不统计前置 Agent 调用、保存进度和交人工。每组减去该组安全恢复所需的基准次数,少于基准按 0,再对全部测试取平均。中断导致的必要结果核对不算多余调用。

运行限制:每组最多 180 秒模拟时间、60 次工具调用(包括保存与交人工)。浏览器会终止 6 秒仍未跑完的代码,此时显示运行错误,不生成成绩。模拟时间不等于现实等待时间或回放时长。

关于真实性:这是本地模拟任务,不会真的发布报告或通知他人。生产系统还需要校验工具权限、处理并发,并尽量用事务或幂等机制减少重复执行风险。

6. 能不能反复尝试?

可以无限次重试。代码和成绩只保存在本机,不会上传。

分享这次闯关成绩

可截图分享。卡片上的引文来自手册原文;只代表本关测试结果。