Appearance
更新记录 · 总览
jeeflow 为多语言联邦发布:契约对齐、发版分轨。Java / Go / Python / Node 同源
1.x但不必同号;PHP(Packagist)、Rust(crates.io)、MoonBit(mooncakes.io)、C#(NuGet)为独立版本线。每个语言的完整版本记录见左侧菜单对应语言页,本页只保留当前版本表与版本号阅读说明,另附独立版本线里程碑。
当前版本
| 语言 | 版本 | 发布通道 | 版本记录 |
|---|---|---|---|
| Java | 1.8.54 | Maven Central | Java 更新日志 |
| Go | 1.8.57 | Go proxy | Go 更新日志 |
| Python | 1.8.52 | PyPI | Python 更新日志 |
| Node.js | 1.8.55 | npm | Node 更新日志 |
| PHP | 1.4.1(独立线) | Packagist | PHP 更新日志 |
| Rust | 1.0.50 | crates.io(四 crate) | Rust 更新日志 |
| MoonBit | 0.1.54(独立线) | mooncakes.io(四模块) | MoonBit 更新日志 |
| C# | 1.0.30(独立线) | NuGet(四包) | C# 更新日志 |
各版本号对应的批次归属与跳号缘由,见各语言更新日志页。
2026-10-31 轮(退回修改、重提直返 · 八引擎同日各发一版)
「退回修改、重提直返」首轮发布,八引擎各自升号(Java 1.8.54 / Go 1.8.57 / Python 1.8.52 / Node 1.8.55 / PHP 1.4.1 / Rust 1.0.50 / MoonBit 0.1.54 / C# 1.0.30)。条文与形状见 规范 04 引擎操作「退回修改、重提直返」节;本轮不动 mldong 内置引擎 与集成壳、不建镜像(发版范围只有 jeeflow 家族)。
- 新契约(用户可感知):审批节点
properties.reapplyMode = RETURN_TO_SOURCE时, 退回发起人(submitType=6)后重提(submitType=5)直接回本次退回的来源节点, 不再按申请节点出边重走一遍;条件分支在重提时不重算来源之前的条件(退回前走高档、 改小金额重提仍回高档),并行分支按_branchCtx的"本轮各根等齐(含该分支还在申请人 手里修改)"才放行且只放行一次。 - 零 DDL:两个控制键(
_branchCtx分支归属栈、_reapplyContext退回绑定)寄存在任务 变量 JSON 的保留键里;存量任务无键时汇合回落既有判据,行为不变。 - 入口纪律:客户端传入的同名保留键先剥离(伪造不改变路由、不落库);带标记的申请待办 只接受
submitType=5,在跳转/拒绝/再次退回入口一律在任何状态变更之前显式拒绝; 同一实例的办理串行化(并发重提至多一个成功、汇合不重复放行)。多进程部署仍需仓储侧跨进程锁。 - 出口契约修复(本轮的隐性回归,八栈同修):建单无条件写入
_branchCtx后, "任务变量只剩引擎控制键 ⇒ 任务行ext回退实例变量"这条既有契约(issues/82-3 / 121 P1) 在八栈全部失效且内部键从ext透出——只有 PHP 的内容级用例把它报成红,其余七栈的既有 用例只断"容器存在"。现把两枚保留键算进控制键集合,回退后把_reapplyContext原样合回 任务行ext(前端「重新提交后返回:X」的唯一取数口),且不污染同一响应的instanceExt。 Go/Python/Node 另在"实例变量写回"处挡掉这两枚(那三栈把任务变量并入执行上下文, 不挡就会把内部键写进实例变量并落库)。 - 前端与配套:
@mldong/jeeflow-ui1.0.5(直返提示、多申请待办逐条提交、指定人参数控制); 流程设计器两条分支补reapplyMode属性面板(非法值不静默回写)。 八引擎的演示站(含 PHP/Rust/MoonBit/C# 独立入口)本轮各 23 格矩阵全绿。
2026-10-16 二轮(同日第二批发版)
audit8 第二轮:R91 节点级拦截器全族+R77 提交后腿通道(五栈)+R78 元数据腿列匹配甲档(moon/rust)+ R86 jump 目标缺失显式报错(rust/moon)+R95 空转档第一腿(moon),六版同日各发 (Go 1.8.55 / Python 1.8.50 / Node 1.8.53 / Rust 1.0.48 / MoonBit 0.1.49 / C# 1.0.27; Java 与 PHP 本代零改动——java 参考实现无待发行,php 只有不进 composer 发布物的工具件)。
- R91:
preInterceptors/postInterceptors的节点级声明与根级声明两级优先序、按名解析、缺名显性报错 ⇒ 条文见 规范 02 §3。 - R77:提交后腿可选通道(登记成功=提交后恰好一次;无通道/回滚=立即跑/整批丢弃),配真库回滚探针 ⇒ 条文见 规范 12 §12.3.1。
- R78 甲:元数据腿列匹配一律逐字精确(只折大小写、禁驼峰↔下划线归一);rust 因两轴同源另采 "元数据腿忽略
strict_columns"落法(开关作废为 no-op,宽松尺子留作公开件) ⇒ 条文见 规范 10 §5.1。 - R86:
jump目标节点不存在由静默 no-op 改显式报错(对外 code=0 且任务已被办掉=实例原地失联是本案病灶)。 - R95:本栈三档判据落点现读更正为
repository-mysql/smoke的 M4/M6/M7/M8,并补上 规范 12 §12.4 空转档缺的那一腿(同事务连接读回自己刚写的行)。
2026-10-16 代(Java/Go/Python/Node+PHP/Rust/MoonBit 独立线)跨栈行为变更(用户可感知,升级前必读)
audit8 R68/R92/R93 三案并批,七引擎同日各发一版(Java 1.8.51 / Go 1.8.54 / Python 1.8.49 / Node 1.8.52 / PHP 1.3.37 / Rust 1.0.47 / MoonBit 0.1.48;C# 本代零改动)。
- 执行族返回值统一(issues/230 R92,Go/Python/Node 三栈):办理类四法(完成任务/跳结束/ 跳转/退发起人)由返回流程实例改为返回本次动作产出的任务行,与 java 参考实现
exec.getProcessTaskList()及 规范 04 钉档一致;空档一律出非 null 空集合。 发起类两法仍返回实例。三栈门面都不消费该返回值 ⇒ 各栈 HTTP 出口形状不变,只有直连引擎 API 的调用方受影响。 - 委托 update 缺键档统一为「清空」(issues/236 R68①,Rust/MoonBit 两栈):
processName/surrogate/startTime/endTime缺键此前 rust 全保留、moon 混合两形,现与 java 参考实现一致=缺键即清空,enabled缺键复位 1,operator仍唯一保留(规范 06 §4.5 条款 4)。 - 委托
enabled布尔档修正(issues/236 R68②,Java/MoonBit):载荷传true曾被折算成停用, 现true→1、false→0。 - 决策零命中异常对齐(issues/234 R93,PHP):抛出的异常文案与内部码钉成各栈同串同码 (
decision节点无法确定下一步执行路线+ 20010001);对外信封码本就合规,改的是异常对象那一半。 - Rust 是唯一行为面破坏性较大的一栈(缺键语义翻转),若你的代码依赖"只带 id 的 update 不改任何东西", 升级前请显式回传需保留的字段。
2026-10-15 代(Java/Go/Python/Node+PHP/C# 独立线)跨栈行为变更(用户可感知,升级前必读)
audit8 R63/R64/R90 三案并批,六引擎同日各发一版(Java 1.8.50 / Go 1.8.53 / Python 1.8.48 / Node 1.8.51 / PHP 1.3.36 / C# 1.0.26;Rust/MoonBit 本代零改动)。
- 决策路由改「首条真边独走」(issues/234 丙-9,Java/PHP/C# 三栈):decision 节点多条出边表达式 同时为真时,此前全部执行(多路并行流转),现改首条真边独走——对齐 spec 02 §5 与 go/python/node/rust/moon 多数派既有形状。存量里依赖"多真边齐走"的流程受影响。
- autoGenTitle 时间戳钉秒(issues/232,Go/Python/Node/C# 四栈):自动生成的标题串从分钟粒度 改
yyyy-MM-dd HH:mm:ss(Java/PHP/Rust/MoonBit 原为秒档零改动)——同分钟内多张单据的标题自此可区分。 - 已识别键不再镜像进 ext(issues/231①,Java/C# 两栈):task 节点上已被解析进模型的键 (name/displayName/layout/pre/postInterceptors;C# 另含 width/height)此前会重复镜像一份进任务 ext, 现按 spec 02 头注立法收敛到 boot2 内置版血统语义;真未知键照常镜像。
v1.8.42 代(Java/Go/Node+PHP/Rust/MoonBit 独立线)跨栈行为变更(用户可感知,升级前必读)
issues/164(决策零命中八栈对齐)+ issues/165(会签放行表达式裸名)+ issues/166(演示种子映射漂移)同批。 各语言代次:Java 1.8.42 / Go 1.8.42 / Python 1.8.42(上代已含 161) / Node 1.8.42 / PHP 1.3.24 / Rust 1.0.28 / MoonBit 0.1.37;C# 本代零改动(报错派+裸名后缀匹配早就是基准侧)。
- 决策无路可走从"静默停住"改报错(164,go/node 1.8.42、rust 1.0.28、moon 0.1.37——与 python 161、 java/php/csharp 报错派汇合,八栈同语义):所有 expr 边都不为真且无默认边时抛
decision节点无法确定下一步执行路线(99999999)。坏定义会开始报错——升级前请检查存量定义的 决策边变量与默认分支;办理人不再看到"code=0 成功但实例卡死没人能办"的僵尸实例。 - 按文档配的会签放行条件从此真放行(165,java 1.8.42、php 1.3.24):
#nrOfCompletedInstances>=2这类裸名形状(文档/设计器/教程给用户的形状)在生产求值器上此前恒 false(求值原料只挂csv_{node}_*前缀键),本版起原料裸名+前缀键同挂——按文档配的会签达阈值即放行; 前缀键形状照旧可用(兼容面不变)。 - 同批:go 引擎补上推进链的错误上抛(此前
executeNode的 error 被丢弃,引擎报错办理人仍看到成功); go/node/php 三语言 demo 的表达式求值器缺口(硬编码只认amount/php 未注册求值器 SPI)与 php demo 的 define 映射漂移一并修复(八语言 demo 重置读数全部回到 15 进行中 / 10 已完成)。 - 传播面:Java→boot2/boot3/boot4、Go→goframe/gin/hertz、Node→nestjs、Rust→salvo、PHP→laravel, 9 张镜像;MoonBit→mldong-moon 插件 pin(moon 通道)。演示种子(166)随各引擎仓同批修, 不依赖镜像。
v1.8.42 代(Python/Go/Node)跨栈行为变更(用户可感知,升级前必读)
issues/161(Python)+ issues/163(Python/Go/Node)同批修的是决策与放行两条求值腿。 各语言代次:Python 1.8.42 / Go 1.8.41 / Node 1.8.41。
- 并行会签的放行表达式从此真求值(163,三栈):
countersignCompletionCondition配#nrOfCompletedInstances>=2这类阈值时,达阈值即合并、未完成成员任务行废弃(ONE_VOTE_VETO行为不变)。 此前这三个引擎只拿它比对ONE_VOTE_VETO一档,"两人同意即放行"的配置实际要等全部成员办完 (java/php/csharp/rust/moon 本来就在求值侧)。 - 决策无路可走时的行为对齐 java(161,仅 Python):所有 expr 边都不为真且无默认边时,不再"蒙第一条边", 改为报
decision节点无法确定下一步执行路线(99999999)。坏定义会开始报错——依赖旧蒙法保通的存量 定义升级前请先检查决策边的变量与默认分支(Go/Node/Rust/MoonBit 目前仍是"静默停住",另案处理; Java/PHP/C# 本就是报错侧)。 - 同批:嵌套形
properties.field里的放行条件也能被读到(三栈此前只读顶层); 三语族的七个集成壳同批剥#前缀。 - 传播面:Python→fastapi/flask/django、Go→goframe/gin/hertz、Node→nestjs,7 张镜像。
v1.0.29 代(Rust)单栈行为变更(用户可感知,升级前必读)
issues/167:无 apply 节点流程的首任务自办放行。此前 startAndExecute 打到无 apply 流程 (首任务参与者由 assignmentHandler 解析、表单没给值 ⇒ 零参与者 DOING 行)时逐字报 权限不足: Operator X not allowed on task N——门面自办腿明明先 add_task_actor(操作人), 内存仓读路径却不水合参与者表,引擎 is_allowed 看不见。现内存仓读路径以参与者 map 为事实源 (对齐 sqlx 仓/java 基准),自办腿按「参与者表真实含发起人」放行,不是权限豁免;同根因的 「事后加参与者再办理」潜伏面(surrogate/transfer 办理腿、remove 即刻生效)一并收掉。 sqlx 仓零改动:生产集成(mldong-salvo)行为不变,壳 pin 无需跟版;rust demo 补注册 7 个内置 assignment handler(八家唯一漏注册),种子读数回 16/16+9/9+8/8(页读 15/10)。
v1.0.27 代(Rust)单栈行为变更(用户可感知,升级前必读)
issues/158 修的是同一个实例两条腿两个答案:Rust 引擎运行时一直自带内置求值腿(宿主不注册 IExpressionEvaluator 也能定支),而门面 highLight 在 SPI 为 None 时整档判 false ⇒ "通向当前待办的那根决策线"在流程图上永远不灰变绿。现把内置求值做成 SPI 形状的默认件 (jeeflow-core::default_evaluator),由 ServiceContext::expression_evaluator_or_default() 单一出口让运行时与门面共用——与 C# 的 ExpressionEvaluatorOrDefault 同形,集成壳零改动。
- 可感知变化 ①:不注册求值 SPI 的宿主,走过的那条决策边从此会亮;没走的那条不再亮。
- 可感知变化 ②:内置求值不再靠字典序蒙方向——裸变量名代入后再比较,且关系运算要求两侧都是数字。 旧形状下
amount > 1000与amount <= 1000同时为 true("amount" > "1000"按字典序成立), 只是被"先撞上列表里第一条 true 边"掩盖;升级后两条分支都带 expr 的流程,未走那条不再被误判。 - 立法:规范 06 §4.6 义务 2 新增"求值通道"一段——两条腿必须同源, 并写明**"这一栈本轮 48/0"不等于"求值档已对齐"**(它只等于这一栈的壳恰好注册了 SPI)。 按这条普查其余引擎,照出的 python 分叉另立案
issues/160(运行时不求值取第一条边定支+门面裸except Exception吞掉整条模型腿)。 - 传播面:rust→salvo,1 张镜像(不是 13)。
v1.8.40 代(Go/Python/Node)跨栈行为变更(用户可感知,升级前必读)
issues/157 修的是 highLight 的一条漏收录:collectPath 把边名当递归实参传,而"遇活跃节点停止深入" 发生在收录之前 ⇒ 指向当前待办节点那一跳的边名永不进 historyEdgeNames。三引擎逐字同形地错 (Go facade.go/Python facade.py/Node facade.ts),Java/PHP/Rust/C#/MoonBit 五家现读为基准形状。
- 可感知变化:画布上"通向当前待办的那根线"从此会亮(此前只有历史节点绿、最新那一跳的线是灰的)。 求值为 false 的分支边与目标节点仍不收(issues/153 那一半不动),活跃节点自己的出边也不收。
- 立法补齐:规范 06 §4.6 义务 2 新增"收录位置"一句——原条文只钉了求值过滤, 没钉收录不得绑在下钻上,这是三栈各自认为自己合规的根因。
- 判据:跨栈门禁
L2-39档③ 打在决策流夹具上(实例停在分支节点),三引擎各加一枚同形用例; 变异对照均为"新格红、既有 03.5 绿"——旧用例把分支办完后activeNodeNames为空,结构上照不出这一跳。
v1.8.41 代跨栈行为变更(用户可感知,升级前必读)
八引擎同批改的是视图端点出口形状(issues/153·154·155;条文在 规范 06 · 统一门面 §4.6,判据基线在 规范 08)。 各语言代次:Java 1.8.41 / Go 1.8.39 / Python 1.8.39 / Node 1.8.39 / PHP 1.3.22 / Rust 1.0.26 / MoonBit 0.1.35 / C# 1.0.16。
approvalRecord从八键变九键:新增首列id(任务行主键,一律字符串出口)。 前端把它当行key用是本轮立法的目标用法;19 位雪花 id 出成数字会在 JS 侧掉精度。- 行序尺子统一成
id ASC:此前 Java 按create_time、Go/Python/Node 按id、Rust 根本没有ORDER BY。 同一份流程定义换后端行序会变,这是升级时最容易在页面上被当成 bug 报回来的一条。 highLight三条义务:① 沿模型补全路径(网关/结束节点也进历史节点集,边名进historyEdgeNames); ② 决策节点的带表达式出边先求值,false 分支不高亮(Rust 此前整条丢弃、MoonBit 此前完全不滤); ③nodeProgress成员姓名走宿主IUserProvider解析,不许硬编码空串(Rust/MoonBit 此前的指纹)。 表达式求值 SPI 未注册时整档判 false——那是降级档,注册了才有点亮效果。- 实例不存在时的形状统一:
approvalRecord出空数组,不再有的栈报错、有的栈出空。 ext空档统一出{}:删掉 Rust 那一条"回落实例变量"的私有行为。ccList默认分页统一 1/10:Rust 与 MoonBit 此前默认 20。getAssigneeTextData两条义务:value是用户 id,不得当节点定位键使用(两处前端已加"命中节点 id 才用"的守卫);label八栈严格节点显示名:用户id(PHP 此前独家出真实姓名,本代并派回七栈形状)。 ⚠ 副作用:并派后办理列表那处徽标八栈一致显示 id 而非姓名——这是"契约一致"的必然结果,要换回姓名需另立一案。
v1.8.37 代跨栈行为变更(用户可感知,升级前必读)
- 参与者解析三档顺序八栈统一(issues/100):
tf_nextNodeOperator(本次指定的下一处理人) > 节点assignee(解析结果非空才生效)>assignmentHandler注册表兜底。 Go 与 Node 是本轮改的那两栈——此前这两栈把assignmentHandler当"最先且独占", 节点同时配了assignee与 handler 时,assignee被静默短路 ⇒ 同一份流程定义升级后 待办可能换人,这是本代唯一会改变运行期归属的条目,集成方请重点回归这一格。assignee解析成空(如" , , ")时落回 handler,不建"没人的待办"之外的形状。 - 门面新增第 47 个 action
processTask/removeTaskActor(issues/115 §3-8):摘掉单个参与人。 语义 5/6——匹配用归一值、DELETE用行上的原值,历史脏行" 9101 "不算"另一个人"; 主键档(processTaskId缺失/空串/纯空白/0/负数)统一并入缺参数档,八栈逐字文案一致。 - 门面内部异常出口固定文案(issues/137 §3-1/137-G/139,spec 06 §2.12):处理器/Provider 抛出的 原文不再拼进对外
msg——对外一律「流程处理失败」,原文只进日志。判别式五条(谁写的这段文案) 见 规范 06;集成方 handler 的原文同属内部信息。 - 实例级
expire_time按定义级表达式求值(issues/137 A §3-4,PHP 另含 §3-9 写点④): Java 与 C# 两栈原先连流程根上的expireTime都没搬进ProcessModel(模型解析层断链, 基准栈自己也漏),本轮补齐;其余各栈补的是发起腿写点。另:相对档前缀判非负 (-5h此前落穿成 NULL,+5h仍合法)+两端空白容忍(D/E 档)。 - 删除腿两形并集(issues/137 §3-6,spec 06 语义 6):入参
" 9101 "一条DELETE同时摘掉脏行" 9101 "与规范行9101,其余参与人不动。 - PHP 栈建表底座换代(issues/137 §3-10 + issues/70 第 10 条):
packages/repository-pdo/sql/schema-mysql.sql改为与 Java 编辑源逐字分发的一份(15 列BIGINT/14 索引/8 COMMENT 齐全)。 引擎对外 API 不变,但照旧副本建的库与新测试种子不再一致——Laravel 集成壳已同步改为database/schema/wf-mysql.sql(只读参考件)+mysql < 该文件,内置的create_wf_tablesmigration 已废弃。
v1.8.36 代跨栈行为变更(用户可感知,升级前必读)
- 记录类(
snaker:custom)节点不再产生待办:执行clazz处理器后落一条查得到的留痕 (task_state=20,operator/finish_time必写、expire_time保持 NULL,doneList 与审批记录 都按这两列取数);不建待办、不发码 3。clazz配错(空/未注册/反射失败/方法找不到)= 配错档,记日志照常落行续流,不再打断建单。 - 任务节点解析不出参与者时多一条办不动的待办(设计如此):仍建 DOING 行、参与者为空, 可查、可被 transfer /
nextNodeOperator救活;严禁兜底挂当前操作人(那是伪造的待办)。 - 参与者归属值写侧归一(spec 06 §2.11):
addCandidate/transfer/surrogate/nextNodeOperator/两仓addTaskActor的值一律 trim 后落库;空串/纯空白/null 丢弃;'0'/'00'/'1'/'01'四个"看起来像假值"的正常 id 不再被语言假值判据吃掉; 逗号串与数组两形同判据。主键档(processTaskId缺失/空)从静默成功改为响亮报错; PHP 栈空actorIds也由code=0改报错(八栈独一份的违反档收口)。 - 配错节点类型不再打断办理(issues/143):出边指向"未知档节点"时记一条带 from/to 的 WARNING + 令牌停住——此前 java NPE / php Fatal / C# 无声停住三派分叉收口。
- API 改名速查:java
normalizeCcActors→normalizeActors(Deprecated 转发);gospi.NormalizeCcActors→spi.NormalizeActors;pythonnormalize_cc_actors→normalize_actors; node 旧名为同一函数对象别名;phpCcActorUtil::normalizeActors/normalizeActor新增; rustnormalize_cc_actors→normalize_actors;moon@model.normalize_actors;csharpNormalizeCcActors→NormalizeActors+NormalizeActorValue。旧名全部保留转发,改名不破坏编译。
版本号怎么读
- 同源不同号:Java / Go / Python / Node 是同一引擎规范的四语言同构实现,语义对齐但各自发版、不必同号——同一个跨语言批次里各语言版本号常不相同(例:CC_CREATE 批 = Java 1.8.21 / Go·Python 1.8.24 / Node 跳号并入 1.8.25)。
- 历史分期:
1.0.0–1.8.4四语言同号同构演进;1.8.5–1.8.16基本同号、开始出现单语言版本;1.8.17起完全分轨,主线号不再有意义,以各语言自己的版本号为准。 - 独立版本线:PHP
1.x(Packagist,2026-08-11 首发)、Rust1.0.x(crates.io,2026-08-25 首发 1.0.5)、MoonBit0.x(mooncakes 早期平台强制 0.x,放开后首版即 1.0.0)、C#1.0.x(NuGet 四包,2026-09-06 首发 1.0.0)。 - 日期口径:各语言页的版本日期以该语言仓 git tag 为准;Maven Central / PyPI / npm / crates.io 的发布完成时间可能晚一天。
- 跳号是常态而非事故:号被占(Rust 1.0.0–1.0.4)、批次未单独发版(Node 1.8.24)、无本语言变更不跟号(Java 无 1.8.22–1.8.24)、同代次只发出部分模块(MoonBit 0.1.7 与 0.1.9 两代都只上架 core/persist,四件齐发在 0.1.8 与 0.1.10)都会造成断档,语言页内有注。
- 装配提示:MoonBit 侧遇到"半代次"号(0.1.7 / 0.1.9)请直接跳到同簇的完整号(0.1.8 / 0.1.10),不要混装。
独立版本线里程碑
- 2026-08-11 · PHP 独立线首发(第五语言):v1.0.0,Packagist
mldong/jeeflow-php。 - 2026-08-25 · Rust 独立线首发(第六语言):crates.io v1.0.5(1.0.0–1.0.4 联调 tag 跳过)。
- 2026-09-05 · MoonBit 独立线首发(第七语言):mooncakes 0.1.0 → 0.1.1(雪花 id 精度修复)→ 0.1.2(CI 通道恢复 + stats 口径)三连发。
- 2026-09-06 · C# 独立线首发(第八语言):NuGet 1.0.0 → 1.0.1(包元数据完善 + License 对齐 Apache-2.0);Trusted Publishing tag 触发 CI 发版,回拉验证四程序集全通。