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 运行反馈
—等待运行
先运行一次,看看哪里出问题
运行后会显示结论、场景和改进建议。
代码已修改。下面是上次运行的结果,请重新运行。
- 先看左侧的两个函数一个处理任务恢复,一个检查是否真正完成。
- 运行后,在这里找原因对照实际执行和保存的进度,看中断发生在哪里。
- 改好再运行接口就在代码上方,也可以复制给你的 Agent 帮忙。
示范不覆盖你的代码,也不计入你的成绩。
任务接力 · 实际执行 ≠ 保存的进度
01
生成报告
未执行
进度未保存
02
发布报告
未执行
进度未保存
03
通知团队
未执行
进度未保存
新实例接手任务
当前显示最终状态
关键事件 · 按发生顺序
需要一点提示?本场景提示
查看完整日志
“实际”行展示系统里发生的事实,玩家代码看不到这些行;只能读取持久进度、请求记录和工具返回结果。