用途
该技能用于在运行中的应用里强制触发那些「从未被执行过的错误状态」——没人跑过的 catch 分支、没人见过的空状态。它们通常凭想象编写、未经测试就发布,最后由用户在糟糕的一天里发现。Reticle 可以强制这些条件在真实运行的应用中发生。
环境准备
如果尚未安装:
RETICLE_INSTALL_SOURCE=npx_skill npx @reticlehq/server@latest init
然后使用 install-and-verify 技能。
前置条件:网络模拟需要受控或租用的浏览器
reticle_network_mock 在 Reticle 拥有的浏览器中拦截请求,常驻 SDK 无法做到这一点。一个已连接但既没有 reticle drive 也没有 lease 的标签页仍会返回 { ok: false, reason: "no-cdp-provider" }。
可用的方式有两种:
- 租用一个 Playwright 标签页:
reticle_run { tool: "reticle_lease", args: { action: "acquire", url } }
- 或将
RETICLE_CDP_URL指向以远程调试方式启动的 Chrome。macOS 上由用户在自己的 Chrome 中执行一次:
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222
RETICLE_CDP_URL=http://localhost:9222 npx @reticlehq/server@latest mcp
如果既没有 lease 也没有受控浏览器,应如实说明,并仍可提供本技能中与时钟相关的一半功能(reticle_clock 不需要这些条件)。不可以只驱动正常路径、看着它通过,就报告错误处理可用。
强制一次失败
reticle_run({ tool: "reticle_network_mock", sessionId, args: {
mocks: [{ urlContains: "/api/deploys", status: 500 }],
}})
随后驱动流程,并在动作之前先说明你期望的恢复行为:
reticle_act_and_wait({ sessionId, ref, action: "click", until: { kind: "allOf", predicates: [
{ kind: "element", query: { testid: "error-banner" } },
{ kind: "console", level: "error", absent: true },
]}})
注意第二个断言条件:一个「处理」错误的方式是记录未捕获异常,这不算处理。完成后用 { clear: true } 清除 mock,否则之后每次检查都会在一个谎言上运行。
建议按出错频率从高到低强制以下情形:500;带真实错误体的 4xx;空 200([],即空状态);格式错误的响应体;以及永不 resolve 的请求(永远旋转的加载指示器)。
跳过时间而非等待
reticle_run({ tool: "reticle_clock", args: { sessionId, freeze: true } })
reticle_run({ tool: "reticle_clock", args: { sessionId, advanceMs: 5000 } })
reticle_run({ tool: "reticle_clock", args: { sessionId, reset: true } })
自动消失的提示条、防抖搜索、轮询、会话超时、重试退避,这些通常靠 sleep 验证,既慢又易碎。时序断言是对机器的断言,会在你的笔记本上通过、在 CI 上失败。应该:冻结时钟、精确推进指定间隔、断言结果。这样在快速的笔记本和负载高的 runner 上结果一致。完成后一定要 reset,否则被冻结的时钟会静默破坏之后运行的一切。
应该断言什么
断言恢复能力,而非没有崩溃:
- 错误展示给用户:是一个具体元素,而非仅仅「页面没有变空白」。
- 应用仍然可用:重试有效、表单仍保留输入、导航没有卡住。
- 状态诚实:
reticle_look { action: "state" }显示失败,而不是半应用的乐观更新。UI 视觉上回滚、但 store 仍保留乐观值是这里的经典 bug,只有读取 store 才能发现。 - 控制台没有未捕获错误。
诚实性
Mock 改变了应用所处的世界,因此在 mock 下得出的结论只针对被 mock 的条件。报告通过时应说明当时激活的是哪个 mock;交还前要清除所有 mock 并重置时钟。一次审计若在 /api/deploys 上留下固定的 500,会破坏下一个人的会话,看起来像真实故障。
能力参考:curl https://docs.reticle.sh/capabilities.md。其它内容:curl https://docs.reticle.sh/llms.txt。