You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[approvals] 存量僵尸请求无人认领:已终态但 run 悬空的请求落在 releaseDeadRunRequests 的盲区里 #4469
Activity
fix(approvals,verify): find stranded terminal requests; stop the harn…
os-zhuang commentedon Aug 1, 2026
已由 #4502 修复(已合入
main,commit5a84d4148)。把说明留在这里,因为这是下一个读者最可能来的地方。根因 —— 为什么它能长期无声
故障形态就是本 issue 描述的:请求行已翻成
approved/rejected/returned,而它的flow_run_id指向的 run 已不存在 —— 决策落库了,流程永远不动。releaseDeadRunRequests扫不到它们,原因值得原样写下来:它只扫status: 'pending',而把请求推入僵尸态的那一步,正是把它推出pending的那一步。弄坏它的动作同时把它移出了唯一一个会去看它的清扫器的视野。而且即便它去看了也答不上来:它的存活性判据是
getRun,读的是执行日志环形缓冲 —— 重启后对一个活着的挂起 run 同样返回null。它把null当作「还活着」(保守,且对它自己要做的事是正确的)—— 这恰恰意味着它没有能力说出「这个 run 是真的没了」。改动
新增
ApprovalService.inspectStrandedRequests()(packages/plugins/plugin-approvals/src/approval-service.ts),同时用两个判据,两个都不通过才报告:hasSuspendedRun(runId) === false—— 直接问挂起存储,没有活的暂停。该方法在库读不到时抛错,这种情况被跳过并计入undetermined,绝不判死:存储不可读 ≠ run 不存在。getRun(runId) == null—— 也没有终态历史行(sys_automation_run里run_前缀的行)。跑完的 run 不算悬空;既不在挂起、也没跑完的才算。只报告,绝不改写 —— 按 issue 的建议做的。决策是真实发生过的,自动回滚会让审计与事实不符。报告面向人工:哪些请求卡在哪一级(
requestId / status / runId / nodeId / flowName / objectName / recordId),以及业务记录上镜像的状态字段现在读作什么(通常就是用户正盯着的那个过期值)。新增导出StrandedApprovalRequest为报告行的类型。它挂在既有的 SLA/死信清扫时钟上(
approvals-plugin.ts),所以运维不必知道要去找,日志里就会浮出来。recalled刻意排除:撤回本就是有意放弃它的 run(recall明确容忍一个无法 resume 的 run),把它们报出来只会让真正的发现被淹没。验证证据
packages/plugins/plugin-approvals/src/stranded-request-inspection.test.ts,13 例全过。关键几条:approved的僵尸,releaseDeadRunRequests()返回{ scanned: 0, released: 0 }(它的扫描集是空的)。approved,记录仍读pending)。hasSuspendedRun抛错、getRun抛错 —— 都跳过且undetermined === 1,所以「0 stranded」永远不会被误读成「一切正常」。hasSuspendedRun、或根本没接 automation → 不给结论(没有判据就不下判决)。撤销验证:把存活性判据取反(
if (!suspended) continue)后该套件失败。文档(
content/docs/automation/approvals.mdx的死信 callout 补上这一类看不见的终态请求)与 changeset 因合并队列锁分支而拆在 #4517。Generated by Claude Code
fix(automation,approvals): 屏幕流 resume 服务端校验 + 审批越权可审计 (objectstack-ai…
docs(automation): 屏幕流 resume 契约与审批越权标记的文档 + 两份 changeset(objectstack-…
feat(objectql): 只报告不拦截的悬空 lookup 引用巡检 (objectstack-ai#4551) (objectst…
docs(plugin-approvals): fix the runId field doc the widening falsifie…
fix(plugin-approvals): report a run that failed mid-resume as strande…