Files
JX-BPOS/spike
ChaiHaoandClaude Fable 5 ce59e4e1e4 spike:回边 reopen 的 Mastra 表达 —— 结论走路线 B(新 run = 新实例)
隔离验证(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
2026-07-29 00:04:35 +08:00
..