2.4 KiB
2.4 KiB
name, description, status, version, date
| name | description | status | version | date |
|---|---|---|---|---|
| session-lifecycle-triage | 删除/归档会话失败(did not finish stopping)时,只读定位 placement 键不匹配并走受支持修复路径。 | proposal | v1 | 2026-09-15T05:29:00.623Z |
会话删除/归档失败排查(session lifecycle triage)
用于「删除会话」「归档会话」失败时,只读定位原因并走受支持路径,绝不绕过守卫。
事实基础(OpenClaw 2026.8.1 实测)
- 守卫比对 placement 记录的
sessionId + sessionKey + agentId;不一致即报... cloud worker placement identity changed,delete/archive 一律失败。 - cron 会话的 placement
session_key形如agent:<agent>:cron:<jobId>:run:<sessionId>,而会话注册 key 是agent:<agent>:cron:<jobId>。二者后缀不同 → 守卫拒绝 stop。 - placement
state=local且无 turn claim,说明没有正在跑的工作,此时「等它跑完再删」不会生效。 - 外部
sqlite3无法打开活动状态目录下的库(报external sqlite3 cannot open databases under the active OpenClaw state directory)。 - 拥有该会话的一次性 cron 作业运行后已自删时,这条 stale placement 行不会被后续 reconcile 自动清理。
步骤
- 先执行
openclaw sessions delete "<key>" --agent <id> --yes --json。若报did not finish stopping或cloud worker placement identity changed,进入下一步。 - 只读查 placement 行:把
state/openclaw.sqlite、openclaw.sqlite-wal、openclaw.sqlite-shm复制到临时目录(如/tmp/olstate-inspect/),再执行sqlite3 -readonly <临时副本> "select session_id,agent_id,session_key,state,transition_generation,environment_id,turn_claim_owner from worker_session_placements where session_id='<sessionId>';"查完立即删除临时副本。绝不让 sqlite3 指向活动状态目录。 - 对比 placement 的
session_key与会话注册 key。若为上述:run:后缀差异,即守卫拒绝原因;同时确认state与turn_claim_owner判断有无活跃工作。 - 走受支持修复路径之一:稍后重试;退出 OpenClaw 后在 shell 跑
openclaw doctor(受支持修复入口);仍失败则用openclaw logs加完整报错上报缺陷。禁止直接改state/openclaw.sqlite来绕守卫。 - 若仍删不掉,向用户说明:会话仍可见、不影响其他功能,并列出上面三条路径请其选择,不擅自绕过。