# module: process 职责: 流程层:流程包定义与版本、**边映射闭合校验**(连线即映射 · 画图即校验 · 不闭合不得发布)、 负责人四策略的确定性解析、工作流状态的聚合投影、失败走向的消化判定、节点实例重开 不负责: 活动的执行(见 task 与范式引擎)、触发器(与流程包**平级**,见 trigger)、 画布的绘制(见 apps/web 的 gov-process) 公开出口: index.ts - 类型:`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` `selectEdges` `assemble` `joinReady` `rejectRouteOf` `dispatchOf` `startNodeOf` - adapter:`createProcessStore`;Drizzle 表:`processPackageTable` `workflowTable` `nodeInstanceTable` 层级: L7(编码规范 §4) 依赖: @contracts;task(L6)、@sfeel 被依赖: trigger, app(治理台 · 工作流管理) 不变量(OS 03 / 3.2): - **不闭合不得发布**:未完成边、必填未映射、类型冲突、孤立节点、异或出边缺条件、 汇合同名字段来源不明、容忍分支被下游必填依赖 —— 任一即 `publishable = false` - **求值语义前后端同源**:画布的即时校验与后端裁决共用 `checkClosure` - **负责人解析确定性**:轮值并列时按 staffId 稳定排序;同输入必同结果,结果与依据留痕 - **工作流状态是聚合投影**:流程层不另设状态机;计量对象是**节点实例**, 重开产生新实例、旧实例不再入算;XOR 未选分支从未激活、不入集合 - **失败走向的消化**:改道 / 容忍 / 升审批一经生效即消化;终止流待人工处置中算异常 - **流级重做一律重开新实例** —— 同节点、新任务 ID、留痕关联,不复活旧任务 其它不变量: - **流转零 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 不动。