M5(1/3): process 的 domain —— 闭合校验、四策略解析、状态聚合

- checkClosure:七类违规(边未映射 / 必填未齐 / 类型冲突 / 孤立节点 /
  网关不平衡 / 汇合来源不明 / 容忍分支被必填依赖)+ 活动未安装 + 岗位不存在;
  不闭合不得发布 —— 画布即时校验与后端裁决同源
- resolveOwner:四策略封闭(指定人 / 岗位唯一人 / 轮值 / 来源跟随);
  岗上多人退轮值,并列按 staffId 稳定排序 —— 解析必须确定性
- aggregateWorkflowState:聚合投影,流程层不另设状态机;计量对象是节点实例,
  XOR 未选分支不入集合,改道/容忍/升审批已消化即不入异常
- nextInstanceNumber:流级重做重开新实例,不复活旧任务

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 01:55:47 +08:00
co-authored by Claude Opus 5
parent 3c974d2860
commit a919d2e961
8 changed files with 769 additions and 2 deletions
+31
View File
@@ -0,0 +1,31 @@
# module: process
职责: 流程层:流程包定义与版本、**边映射闭合校验**(连线即映射 · 画图即校验 · 不闭合不得发布)、
负责人四策略的确定性解析、工作流状态的聚合投影、失败走向的消化判定、节点实例重开
不负责: 活动的执行(见 task 与范式引擎)、触发器(与流程包**平级**,见 trigger)、
画布的绘制(见 apps/web 的 gov-process)
公开出口: index.ts
- 类型:`ClosureInput` `ClosureReport` `ClosureViolation` `ActivityContractFace`
`Candidate` `Resolution` `NodeInstance` `WorkflowState`
- 错误:`NotPublishableError` `PositionVacantError`
- 纯函数:`checkClosure` `publishable` `resolveOwner` `aggregateWorkflowState`
`isDigested` `nextInstanceNumber`
层级: L7(编码规范 §4)
依赖: @contracts;task(L6)、@sfeel
被依赖: trigger, app(治理台 · 工作流管理)
不变量(OS 03 / 3.2):
- **不闭合不得发布**:未完成边、必填未映射、类型冲突、孤立节点、异或出边缺条件、
汇合同名字段来源不明、容忍分支被下游必填依赖 —— 任一即 `publishable = false`
- **求值语义前后端同源**:画布的即时校验与后端裁决共用 `checkClosure`
- **负责人解析确定性**:轮值并列时按 staffId 稳定排序;同输入必同结果,结果与依据留痕
- **工作流状态是聚合投影**:流程层不另设状态机;计量对象是**节点实例**,
重开产生新实例、旧实例不再入算;XOR 未选分支从未激活、不入集合
- **失败走向的消化**:改道 / 容忍 / 升审批一经生效即消化;终止流待人工处置中算异常
- **流级重做一律重开新实例** —— 同节点、新任务 ID、留痕关联,不复活旧任务
## M5 待补(docs/PROGRESS.md)
port.ts 与 usecase:流程包的存取与发布、工作流实例的起单与流转
(Mastra `createWorkflow` 编译在 `internal/adapter/workflow-compiler.ts`,编码规范 §6.1)。