OpenClaw Cron Pairing And Operator Scopes
中文 | English
摘要
即使 gateway 正常、机器整体看起来也没坏,cron 创建依然可能失败。在一个真实 OpenClaw 环境里,真正的问题并不是 cron 本身,而是 paired device 的 operator scopes 不够,导致 gateway 用带 pairing 味道的 close reason 拒绝了 cron 操作。
现象
像 cron(action="status") 或创建 job 这样的操作会报:
gateway closed (1008): pairing required这个报错很容易被误读成 pairing 流程没做完,或者 cron 子系统本身坏了。
根因
真正的问题是实际向 gateway 发请求的 runtime identity 出现了 operator scopes 不匹配。机器上其实已经有 pairing 数据,但真正生效的 client 是 gateway-client,它拥有的 scopes 不足以执行 cron 动作,于是 gateway 就用一个带 pairing 味道的 close reason 拒绝了请求,哪怕 pairing 本身早就完成了。
这次排障里还有第二层陷阱:只改 paired-device record 还不够。runtime 自己还带着一份本地 auth 视图,放在 identity/device-auth.json 里,所以即使 paired.json 已经改对了,effective scopes 仍可能停留在旧状态。
如何确认
- 检查
~/.openclaw/identity/device.json,先确认本地 OpenClaw 进程实际使用的是哪个 runtime device 和 client。 - 检查
~/.openclaw/identity/device-auth.json,看这个 runtime identity 当前实际拿到的 scopes。 - 检查
~/.openclaw/devices/paired.json,确认同一个 device 或 client 的 paired record。 - 不要先入为主地以为当前活跃设备就是最先看到的 UI 侧条目,要确认真正生效的是不是
gateway-client之类的 runtime client。 - 如果设备看起来已配对,但 cron 仍报
gateway closed (1008): pairing required,就应优先怀疑 runtime scopes 不匹配。
修复方法
同时更新真正 gateway client 对应的 paired-device record 和 runtime auth record,让它们对 cron 管理所需的完整 operator 集合达成一致:
operator.readoperator.writeoperator.adminoperator.pairingoperator.approvals
在这次复现环境里,真正需要修的是 ~/.openclaw/devices/paired.json 里的 gateway-client 记录,以及 ~/.openclaw/identity/device-auth.json 里的对应 runtime scopes,而不是只改另一个 paired device,比如 openclaw-control-ui。
当这两份记录一致后,cron(action="status") 就恢复可用,后续 cron job 也能正常创建。
实践意义
带 pairing 字样的 gateway close message 不一定真的是“设备没配对”,在实战里它也可能表示“真正运行中的 client 虽然已配对,但 scopes 不足以执行当前 operator 动作”,而且决定结果的状态可能同时分布在 paired state 和 runtime auth state 两层。