Files
JX-BPOS/api-report/apps/api
ChaiHaoandClaude Fable 5 0ba3a80e13 Mastra 编译器落地:流程包 → workflow(路线 B)—— 回边成出口,变体各带入口
按 spike 实测结论(spike/mastra-reopen/FINDINGS.md)落地 M5-1 的编译器:

- **回边不连回去**,落成回边出口步骤:本 run 到此为止,把
  `{reopen, reopenedBy, reopenTarget, payload}` 写进 result,胶合层起新 run。
  1 run = 1 实例,与「重开产生新实例、旧实例留痕不动」一一对应
- **每个回边目标各编译一份「以它为入口」的变体**(`<包id>@<节点id>`)——
  新 run 只能从入口起步;种子 unified-quote 编出 `@start` 与 `@A4` 两份
- 条件出边 → `.branch()` + **XOR 收口步**:Mastra 把未命中的分支键也放进输出
  (值 undefined),收口步过滤并断言恰一条 —— 「恰取一条」运行时照旧成立;
  条件谓词排掉「前面已命中」的情形(Mastra 求值非短路),无条件边作兜底,
  连兜底都没有时留一条「全不中 → 死路诊断」的出路
- 活动点/审批点 → 「起任务 → suspend()」,副作用写在 `if (!resumeData)` 里
  (实测 resume 时 execute 从头重跑,不这么写会起两次任务、旧的成孤儿)
- 编译期全验:悬空边、正向边成环(未标 reopen)当场报 —— 编译只走到得了的边,
  悬空边会落在递归碰不到的角落(实测:多默认边情形下 E9 压根没被编译)
- Mastra 泛型桥接收在两个薄工厂里,不把类型逃逸撒满文件

测试:编译器四例(变体/无回边/成环/悬空)+ app 层一例(种子真图编得出来);
五闸全过。胶合层(FlowRuntime 的 Mastra 实现)与 CONTRACT/debt 对账随后。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
2026-07-29 00:15:07 +08:00
..