forked from ChaiHao/BPOS-MVP
隔离验证(spike/mastra-reopen,@mastra/core@1.53.0,不属主工程、不受产线闸约束), 两条候选各写可跑原型 + 6 探针 + 2 反例,三场景全通。**结论有运行输出支撑**。 推荐**路线 B**(回跳 = 结束本 run,胶合层用同一份定义起新 run),两条决定性理由: ① 语义对齐:1 run = 1 实例 —— 新 runId / 新任务 ID / 旧快照冻结全是引擎自带; 路线 A(dowhile)里第二轮 A4 是同一 step 的重跑,**引擎会覆盖第 1 轮记录** (实测:第 2 轮开始时内层快照 context 里 A5 那一格直接消失),与 「重开产生新实例、旧实例留痕不动」正面冲突; ② 健壮性:误 resume(迟到/重复回调 —— 我们的活动终态本就来自不受控的外部调用链) 在 A 下把整条 run 打成**不可恢复的 failed**(补正确 resume 也救不回), 在 B 下只是抛异常、run 毫发无伤。 其余实测事实(FINDINGS.md 全文):dowhile 内 suspend/resume 可用但**定位不到轮次** (forEachIndex 对 dowhile 是哑参;不存在的 resumeLabel 会静默命中当前挂起 step); .branch() 条件在源步终态后一次性全求值、拿得到 requestContext; .branch() 输出含未命中的 undefined 键(收口步必须允许); step 的 execute 在 resume 时从头重跑(副作用必须写在 if(!resumeData) 里)。 FINDINGS.md 第 6 节给出了走 B 的编译器七件事,下一步照它落地。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m