M5(2/3): process 用例与流转 —— 流程引擎的确定性调度

- routing domain:选边(XOR 恰取一条 + 默认分支兜底;AND 全走)、边映射装配(四类来源 +
  S-FEEL 转换)、AND 汇合回齐(容忍分支不阻汇合)、审批点驳回走向声明式
- process-service:起单 → 调度节点 → 负责人四策略解析(结果与依据留痕)→
  活动起单 / 审批点卡工位 / 终点收束按来源回执;任务终态到达继续流转或走失败走向四选一;
  审批驳回按声明回指定节点重开新实例;状态每次变动后重算聚合投影
- adapter:流程包(id × version)、工作流实例、节点实例三表持久 —— 崩溃后可续跑

ADR 待补项登记为 debt M5-1:§6.1 的 Mastra workflow 编译器作为可替换 adapter 后补,
当前由自持确定性状态机承担,语义等价、usecase 不动

325 个测试通过,门禁五道全绿

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
This commit is contained in:
JCAI Main Agent
2026-07-27 02:01:08 +08:00
co-authored by Claude Opus 5
parent 291fc39179
commit a8f6eef610
15 changed files with 4072 additions and 10 deletions
+22 -6
View File
@@ -6,11 +6,16 @@
画布的绘制(见 apps/web 的 gov-process)
公开出口: index.ts
- 类型:`ClosureInput` `ClosureReport` `ClosureViolation` `ActivityContractFace`
`Candidate` `Resolution` `NodeInstance` `WorkflowState`
- 类型:`ProcessService` `StartWorkflowInput` `WorkflowRecord` `ClosureReport` `ClosureViolation`
`ActivityContractFace` `Candidate` `Resolution` `NodeInstance` `WorkflowState` `Dispatch`
- 错误:`NotPublishableError` `PositionVacantError`
- 端口类型:`ProcessStore` `ActivityDirectory` `OrgDirectory` `TaskGateway` `ApprovalGateway`
`Sfeel` `FlowEventPublisher` `ReceiptNotifier`
- 用例工厂:`createProcessService(deps): ProcessService`
- 纯函数:`checkClosure` `publishable` `resolveOwner` `aggregateWorkflowState`
`isDigested` `nextInstanceNumber`
`isDigested` `nextInstanceNumber` `selectEdges` `assemble` `joinReady`
`rejectRouteOf` `dispatchOf` `startNodeOf`
- adapter:`createProcessStore`;Drizzle 表:`processPackageTable` `workflowTable` `nodeInstanceTable`
层级: L7(编码规范 §4)
依赖: @contracts;task(L6)、@sfeel
@@ -26,6 +31,17 @@
- **失败走向的消化**:改道 / 容忍 / 升审批一经生效即消化;终止流待人工处置中算异常
- **流级重做一律重开新实例** —— 同节点、新任务 ID、留痕关联,不复活旧任务
## M5 待补(docs/PROGRESS.md)
port.ts 与 usecase:流程包的存取与发布、工作流实例的起单与流转
(Mastra `createWorkflow` 编译在 `internal/adapter/workflow-compiler.ts`,编码规范 §6.1)。
其它不变量:
- **流转零 LLM**:选边与条件求值全部经 `@sfeel`;判定依据入事件记录
- **XOR 恰取一条**:条件命中优先,无条件的边作默认分支兜底
- **AND 汇合要回齐**:未回齐就不进汇合节点;容忍分支以「已消化」计,不阻汇合
- **流程层不自动重试活动**(过程内重试归 Harness);
流级重做一律人裁决后**重开新任务实例**
- **驳回走向声明式**:审批点的驳回按 `reject` 声明回指定节点重开新实例,不由临场决定
- **凡单必有来源**:`source` 必填;终点按输出声明交付、按来源回执
## M5 待补(docs/PROGRESS.md · docs/debt.md M5-1)
`internal/adapter/workflow-compiler.ts` —— 编码规范 §6.1 规定流程包动态编译为 Mastra
`createWorkflow`/`createStep`(XOR → `.branch()`,AND → `.parallel()`,节点 `suspend()`/`resume()`)。
当前流转由本模块自持的**确定性状态机 + `sys.node_instance` 持久**承担,语义等价且已可测;
Mastra 编译器作为可替换的 adapter 后补,替换时 usecase 不动。