Skip to content

Go 更新日志 ​

当前版本 v1.8.57 · Go proxy(github.com/mldong/jeeflow-go)· 仓库 mldong/jeeflow-go · Releases 版本日期以本仓 git tag 为准;跨语言对齐脉络见 更新记录总览。

v1.8.57 — 2026-10-31 ​

「退回修改、重提直返」首轮发版(tag v1.8.57=commit d234e64,出口契约修复在 facade 与 engine/memory 同批)。条文见 规范 04 引擎操作「退回修改、重提直返」节。

  • 新增:reapplyMode 节点属性(NORMAL/RETURN_TO_SOURCE,非法值解析期报错)、 submitType=6 直返建带 _reapplyContext 的申请待办、submitType=5 重提直接回来源节点 (不重算来源前条件、不重分叉、参与者重解析)、_branchCtx 分支归属与"本轮各根等齐 且无直返等待 ⇒ 汇合放行且只放行一次"、保留键入口剥离与同实例串行化(并发重提只一个成功)。 实现落点:engine/reapply.go(分支归属/直返上下文/汇合判据/建单/实例锁)+ engine/engine_impl.go(JOIN 判据、重提路由、退回直返、建单挂钩)。
  • 变更(带标记申请待办的入口守卫):跳转(含命名跳转与血缘回退两档)/拒绝/再次退回 三个入口在任何状态变更之前拒绝带 _reapplyContext 的进行中申请待办,文案与 java 逐字一致。 少了它,提交 6 会完成旧申请并建一条无标记新申请 ⇒ 本轮分支等待丢失、另一支汇合提前放行。
  • 修复(ext 回退契约被新保留键打破):taskRowToMap 的控制键集合补 _branchCtx/ _reapplyContext,回退取实例变量的副本并把 _reapplyContext 合回任务行 ext; mergeExecIntoInstance 同挡这两枚(本栈因会签簿记共用 exec 变量池,任务变量会并入实例变量, 不挡就把内部键写进实例并落库,回退目标本身被污染——isFirstTaskNode 早有这一挡,本轮按同口径补齐); 内存仓 taskRow 补 instance_variable 投影,与 repository/jdbc 同形(spec 06 §4.5 条款 6)。

v1.8.56 — 2026-10-17 ​

audit8 R110+R112(tag v1.8.56)。

  • 新增(删除定义守卫):processDefine/remove 删除前校验任何实例存在即拒,批量先整批校验;仓储 SPI 增 HasInstancesByDefineID(jdbc/内存双实现)。
  • 诊断(未知档的边):落穿边补 from/to 日志,行为不变。

1.0.0–1.8.4 为四语言同构对齐期(Java / Go / Python / Node 同号演进);1.8.5 起按语言节奏发版,版本号不必同号(Go 全序列无跳号)。

v1.8.55 — 2026-10-16 ​

audit8 R91+R77(tag v1.8.55,引擎 commit 8ea9c97/77d08d1;台账 jeeflow-hub/docs/audit8-2026-10/)。

  • R91 节点级 preInterceptors/postInterceptors 补齐:声明解析抬到「流程根声明 → 节点声明」两级, 同一拦截器两处都声明时按节点档优先、根档回落,解析不到的名字显性报错(不再静默跳过)。 条文=规范 02 §3 三条;判据含执行档(真跑派发)+根声明每定义只回查一行的读放大档。
  • R77 提交后腿通道(读法一):AfterCommit(func()) —— 有事务模板且 after_commit 登记成功 ⇒ 提交后跑; 否则立即跑。派发点不动(不挪到提交后),并配 真库回滚探针(回滚 ⇒ 整批不跑;提交 ⇒ 恰好跑一次)。 条文=规范 12 §12.3.1。
  • 同批:R80 两段写点上抛判据补牙(createTaskWithActors 五处+办理·回退族五处,把等价变异改成有牙)、 R70 ①③ 文档假账与幽灵节号更正(零行为差)。发布物内容不变的两条判据件不进发布物。

v1.8.54 — 2026-10-16 ​

audit8 R92 行为变更(tag v1.8.54,引擎 commit 518900c)。

  • 行为变更(执行族返回值):ExecuteProcessTask/ExecuteAndJumpToEnd/ExecuteAndJumpTask/ ExecuteAndJumpToFirstTaskNode 四法的返回值由 *model.ProcessInstance 改为 []*model.ProcessTask ——本次动作产出的任务行,对齐 规范 04 §完成任务 与参考实现 java 的 exec.getProcessTaskList();空档出非 nil 空切片(java Collections.emptyList() 同形)。 StartProcessInstanceById/StartAndExecute 两法仍返回实例(spec04 :9/:24 未动)。
  • 实现口径:go 无 java 那样的 Execution 载体,收集器挂每次调用作用域的 typed ctx (engine/new_tasks.go 的 withNewTasksSink/appendNewTask/newTasksOf),唯一建单口 saveNewTask 落库成功后追加 ⇒ 并发流转互不串味,且不必为透传 out 参数改十余个中间函数签名。
  • 对外影响:facade 不消费这四法返回值 ⇒ HTTP 出口形状不变,集成壳只需升 pin; 直连引擎 API 的调用方按上面第一条取返回值(原来拿实例的地方改回查 FindInstanceByID)。

v1.8.53 — 2026-10-15 ​

issues/232 R64:autoGenTitle 时间戳钉秒 yyyy-MM-dd HH:mm:ss(tag v1.8.53,引擎 commit 94f8591)。 条文见 规范 04 autoGenTitle 行(拍 A=秒档;标题专用格式化点,不并 expire_time 腿)。

  • 行为变更(用户可感知):自动生成的标题串从分钟粒度改秒粒度——同分钟内多张单据的标题自此可区分; 前端若对标题格式做正则匹配需同步。

v1.8.52 — 2026-10-14 ​

issues/201 收口:决策边表达式求值失败被折成「求值为假」后一声不吭(tag v1.8.52,引擎 commit cf01284)。 条文见 规范 06 · 门面 §4.6「求值失败留痕」(issues/201 立法,2026-10-14 owner 拍 C)。

  • 新增(可观测性,行为零变化):evalDecisionExpr 失败支补一条带原因 WARN(实例号/定义号/nodeId/ expr/err 五件齐)。修前该支 return false, nil 把 error 就地丢弃——分支不收且零日志,无法与「合法判假」区分。
  • 遍历宽度不钉:该边仍折 false、其余边继续(维持修前形状);对外仍 code=0;合法判假不落这条日志。

v1.8.51 — 2026-10-13 ​

issues/175 收口:引擎/门面写腿调用点的 error 不再丢(tag v1.8.51,引擎 commit 8cd16f0)。

  • 修复(后果级,非风格问题):saveNewTask 的 11 个调用点全裸(它自身 return repo.SaveTask 是唯一 上抛通道,调用侧一裸就把错误整条吃掉)+ SaveInstance(发起实例行)/UpdateTask(会签废弃)/ UpdateInstance(变量合并)/门面 _ = AddTaskActor,共 16 处全改上抛。实证形状=注入 SaveTask 失败 后仍报 code=0,实例行在、任务行缺——办理人看到成功,单据却没人能办。
  • 基准核对:java 写腿零 try/catch、python/node 裸 await(错误直穿)⇒ 本栈独家吞错;守卫排在 fireEvent 之前(失败动作不发消息)。
  • 判据:五枚子测试=修前红(4 红 1 绿)+修后 5/5,既有期望值零改动;变异 M1/M2/M3a 各咬合。 ⚠ 四组变异等价(共 9 处写点无判据咬合)已另案记档,CreateTaskWithActors 那五处现读零生产调用者。
  • 传播面:go→goframe/gin/hertz,3 张镜像;候选全案集 54/0/0×3 原样晋升。

v1.8.50 — 2026-10-12 ​

issues/178 收口:candidatePage 候选映射优先级链+行键归一(tag v1.8.50,引擎 commit b455452)。 条文见 规范 06 · 统一门面。

  • 修复(用户可感知):候选人行此前键形恒兜底——宿主 IUserProvider 查得到也不用它, realName 直接等于裸 id。本版接上链:findById → getUser → 兜底;行键 id=src.id→src.userId→ actorId 字符串化,realName=src.realName→id 回落。
  • 修前红(生产镜像实测):goframe 生产 tag 跑全门 52/1/0,唯一红=新格 L2-44 轴① 「realName==id——映射链未接、退回裸 id」,其余 52 格全绿。
  • 判据:四档 T0 用例+逐处变异红样+字节级还原清洁;复跑 go test ./...(含真库 jdbc 腿)全绿。
  • 传播面:go→三壳,与 py/node/rust/moon 同轮,9 张镜像+moon 一键包全晋升。

v1.8.49 — 2026-10-12 ​

issues/177 收口:nextTaskCandidates 属性取数顶层优先·properties.field 嵌套兜底(tag v1.8.49, 引擎 commit 0388e81)。条文见 规范 08 场景 43「字段权限族」。

  • 修复(用户可感知):设计器把候选人配置落在嵌套形 properties.field 里,而解析层只读顶层 ⇒ 按 UI 配的候选人读成空。形状对齐 issues/163 已有的「顶层优先、嵌套兜底」尺子。
  • 现读更正:本栈的会签条件腿已被 issues/163 轮修掉,本案只剩候选人这一处。
  • 判据:两档新格(嵌套形读到/顶层形照旧)+变异红样;复跑含真库 go test ./... 全绿。
  • 传播面:go→三壳;同批六引擎(go/py/node/php/rust/moon),9 张镜像+moon 一键包 10/10 晋升。

v1.8.48 — 2026-10-12 ​

issues/176 收口:startAndExecute 自动办理腿 operator 改 flow.auto(tag v1.8.48, 引擎 commit e8cd98e)。

  • 变更(用户可感知):一键发起并办理时,那张任务的办理人记成系统哨兵而非真实发起人——发起人不再 同时出现在「我已办」,doneList 可见性回到产品语义。八引擎同批,见各语言页。
  • 判据:跨栈门禁 L2-43 同轮落格;修前四家族 51/1+moon 通道 48/1/3,唯一红这一格。
  • 传播面:go→三壳;本轮总传播面 8 引擎→13 壳+moon 插件→14 张镜像全晋升。

v1.8.47 — 2026-10-12 ​

issues/145 · go 第二轮:监听器随事件带上 ctx(tag v1.8.47,引擎 commit 7e3f6c3)。 ⚠ 本版含一处 SPI 破坏性变更。

  • 照出这一格的不是单测,是候选门禁:首版 v1.8.46 候选门 49/1=L2-11「办结后发起人收 TODO=0」 (且 NOTICE=1 因更早的动作已提交)。根因=三壳站内信监听器自造 context.Background() 反查走池连接, 事务起来后读不到动作内未提交的行(规范 12 §12.2 接缝)。
  • 破坏性变更:ProcessEventListener 签名加 ctx,fireEvent/FireEvent/notifyCcCreate 全链透传; 集成壳的监听器需改 func(ctx, evt) 并删 Background。语义对齐 java(事务线程绑定)/node(ALS 环境绑定)。
  • 判据:tier ⑦ 格;L2-11 由 49/1 转绿(TODO=2 NOTICE=1 同格复算)。

v1.8.46 — 2026-10-12 ​

issues/145 事务七条债 · go 切片(tag v1.8.46,引擎 commit bc70be1)。条文见 规范 12。

  • 变更:跨栈普查照出的 persist 业务表写腿不在引擎事务内 收口——engine/facade/jdbc/persist 四层的 事务归属并成一次动作一个边界,业务表写腿随动作提交或回滚。
  • 判据:真库 tier 档+逐处变异对照。
  • ⚠ 本版推了但未过门禁(49/1=下一版修的监听器 ctx 缺件);用户请直接装 v1.8.47 及以上。

v1.8.45 — 2026-10-11 ​

issues/174 收口:redeploy 原地替换保留 version/state(tag v1.8.45,release commit d98f77d)。 条文见 规范 08 场景 42。

  • 修复(用户可感知):processDesign/redeploy/processDefine/redeploy 两 action+两条仓储腿此前把 version/state 覆成 1,已办结/已废弃定义重部署后行状态打回,按 state 取数的列表与记录随之错乱。
  • 同批:php/rust/moon 与内置 boot2 本就不丢,改动落在 java/go/python/node/csharp 五栈。
  • 判据:跨栈门禁 L2-41(deploy/redeploy 两 action 此前整族零格);修前红三家族 49/1。
  • 传播面:go→goframe/gin/hertz;本轮合计 5 引擎→11 壳→11 张镜像。

v1.8.44 — 2026-10-11 ​

issues/170 + issues/171(tag v1.8.44,引擎 commit 510bf56)。

  • 工装修复(影响所有人的测试门票):flows 镜像此前用 os.WriteFile 截断重写进仓根 flows/, 与并发跑的各包测试二进制相撞 ⇒ 既有用例随机红(unexpected end of JSON input/「读取流程定义 JSON 失败」)。 现改 .tmp.<pid>+os.Rename 原子替换+稳态零写+100×10ms 重试(Windows 侧读者持文件时 rename 会 Access is denied),写失败不再 _ = 吞掉、Dir() 错误上抛 ⇒ 并发 go test ./... rc=0 恢复, 此前临时采用的 -p 1 串行口径作废。
  • issues/171 的定性:并行会签一票否决时否决者本人那张任务两个码都不发(既无 5 也无 6,实得 [3])—— 引擎级用例先钉住「发没发码」(codes=[6],本栈实测本就正确),真根因在三壳门禁 sink 的 sourceId 映射缺码 6(引擎侧行为不变,壳侧档位扩齐 3/5/6/7)。
  • 判据:两枚新用例+并发对拍;-count=3 旧形状可复现随机红(阴性对照)。

v1.8.43 — 2026-10-11 ​

issues/169 收口:persist 拦截器链吞 Insert 写错不再吞(tag v1.8.43);同批带上 issues/162 的 go 腿。

  • 修复(静默丢数据腿):同一个函数里 Update 写错会 panic、Insert 写错却被静默丢弃 ⇒ 业务表少行而 引擎报成功。本版把 Insert 腿的失败显性化(与 Update 同档)。
  • issues/162 go 腿:highLight 补全腿失败时落带原因日志,对外仍 code=0(降级面保留), 不再是 catch 式静默。
  • 首上门禁读数:本轮候选跑新格 L2-12 得 47/1——唯一红不是本栈缺陷,而是并行会签发码形状 (另立案 issues/171,见 v1.8.44),据此红线停在晋升之前,三张候选留到下一轮。
  • 传播面:go→三壳,三张镜像(v1.8.44 轮与原样晋升)。

v1.8.42 — 2026-10-11 ​

issues/164 A+166 A(种子)收口(tag v1.8.42,引擎 commit 9901d48)。

  • 变更(用户可感知):决策节点零命中显式报错——遍历完全部出边仍无命中(带 expr 的边全判 false/ 判定变量缺失/零出边/自定义决策处理器未命中)时抛 decision节点无法确定下一步执行路线 (逐字=java WfErrEnum.NOT_FOUND_NEXT_NODE,门面出口 99999999+该 msg)。改前本栈该档 静默停住(令牌不前进也不报错):办理人看到 code=0"成功"、实例挂在 state=10 且没有任何人的 待办。条文见 规范 06 §4.6「零命中档」。
  • 附带修复:ExecuteProcessTask 推进循环 executeNode 的 error 此前被丢弃(全仓唯一一处, 其余调用点全传播)——即便引擎报错,办理人看到的仍是 code=0;补上抛,静默的管道半边一并收口。
  • 种子:demo FINISHED 三行(F5/F8/F9)补 finalAmount=8000(issues/166——define 映射漂移, flows 目录加入 06-…-expire.json 后 define=12 已是 10-mixed-mode;补键走 e8→boss→end 与旧蒙臂 同形,demo 重置读数回 15/10)。
  • 判据:i164_decision_nomatch_test.go 3 格+变异对照(摘报错改回静默即红);go demo 重置 15/10 零种子报错。

v1.8.41 — 2026-10-10 ​

issues/163(Go proxy,引擎 commit 4ca50ca)。条文见 规范 06 §4.6 义务 2「求值通道」, 判据=根包新增 i163_countersign_cond_test.go 四格(阈值 2/3 放行+无 cond 对照+ONE_VOTE_VETO+嵌套读形), 以及 Test07CountersignRatio 改回 java 形状(2/4 即放行、剩余成员废弃)。

  • 修复:并行会签的 countersignCompletionCondition(如 #nrOfCompletedInstances>=2)从此真求值—— 阈值达成就合并、未完成成员任务行废弃(ABANDONED=99)。旧形状只拿它比 ONE_VOTE_VETO 一档、 其余值被整条忽略,"两人同意即放行"的阈值配置实际要等全部成员办完。门控计数 (nrOfInstances/nrOfActivateInstances/nrOfCompletedInstances,裸名)并进求值原料 (mergeVars 让门控键覆盖同名流程变量),照 rust gate_vars 那一步;ONE_VOTE_VETO 判定顺序不动。
  • 同批:补"顶层优先、嵌套兜底"读取 properties.field 子对象里的条件(设计器实际落笔处); demo 简易求值器吃 # 门控变量;goframe/gin/hertz 三个集成壳同批剥 # 前缀。
  • 用户可感知:按文档/设计器配阈值条件的并行会签,从"永远等满员"变成按阈值放行。
  • 判据:T0 go test ./... 全绿;T1 真库(repository/jdbc)绿。

v1.8.40 — 2026-10-10 ​

issues/157(Go proxy,引擎 commit 3388d5f)。条文见 规范 06 §4.6 义务 2「收录位置」, 判据=跨栈门禁 L2-39 档③。

  • 修复:highLight.historyEdgeNames 不再漏掉"指向活跃节点的那一跳"的边名。collectPath 此前把边名当 递归实参传,而遇活跃目标先 continue ⇒ 那条边永不收录,流程图上"通向当前待办的那根线"永远是灰的 (实例确实走到了那里)。现把收录挪进源节点出边循环、排在活跃判断之前,逐字同位于 java JeeflowFacade.collectPath:711-718。
  • 用户可感知:任何"网关分流后进入当前节点"以及 apply →(活跃)approve 这类跳,边名从此会出现在 historyEdgeNames 里 ⇒ 前端高亮多亮一根线,不会少亮。求值为 false 的分支仍整条不收(issues/153 那半不动)。
  • 判据:新增 TestHighLightCollectsEdgeIntoActiveNode,夹具停在分支上(只办 task1,task2 活跃), 断言 e3 收录且线性腿 e0/e_apply_1/e2 齐、e4(没走的分支)与 e5(活跃节点出边)不收。 变异对照:把收录挪回下钻之后 ⇒ 该格红(读数 [e0 e_apply_1 e2])而既有 03.5 仍绿—— 旧用例把分支也办完了,activeNodeNames 为空,结构上测不到这一跳。
  • gate:go build/vet 绿 + go test ./... 全包 ok(含 repository/jdbc 真库 T1 25.6s)。

v1.8.39 — 2026-10-10 ​

issues/154 ④(Go proxy,引擎 commit 54f6410)。条文见 规范 06 §4.6。

  • 新增:approvalRecord 每行补首列 id,用 strconv.FormatInt 显式串化,不押门面出口那层 id stringifier 兜底(与 Java 同姿势;键名与类型由测试钉死)。
  • ①②③ 现读已合规:ORDER BY id ASC(真库反造 create_time 后行序仍升)、实例不存在出空数组、 ext 空档出 {} 不回落实例变量——本栈此前就是基准形状,只补了用例。
  • 如实记账:内存仓储那档遍历 Go map ⇒ 行序随机,所以行序断言只钉在 SQL 腿;出口 JSON 键按字母序排, 「首列」落在源码字面顺序,不是出口顺序。

v1.8.38 — 2026-10-08 ​

issues/152 委托三件收口(Go proxy(tag 即发布),引擎 commit cfb99e3)。规范条文见 规范 06 §2.5 口径表 与 §4.5「processSurrogate/page 归属不变式」, 判据基线=规范 08 用例 38–41。升级前两处用户可感知的行为变更必读(见下)。

  • 新增:processSurrogate/page 的归属不变式落到引擎自己身上——门面按 §2.5 把归一后的 operator (缺键/空串/全空白 ⇒ demo 缺省 user1)作为 t.operator EQ 下发,形状与本栈 instancePage 一致; 仓储侧补第二层(SQL 侧 AND 1=0、内存侧判不命中),内存仓与 SQL 仓同答案。 此前这条语义全靠集成壳注入 operator(换宿主/直调 SPI 即退化成全库台账,vben5 前端本就不传)。
  • 变更:归属条件的缺失档与空值档同判——绕过门面直调 pageSurrogates 时,t.operator 那条 EQ 值为空或整条没给都返回空页,不再"这条条件不加"放出全库;只收归属列, m_LIKE_* 那套"空值当没填"的可选过滤放行原样不动(与 §2.5 抄送侧同一条尺子)。
  • 修复:写侧授权人三档归一。processSurrogate/save 收到空串/全空白 operator 时不再落进 operator (那种行是死行:getSurrogate 的 WHERE operator = ? 永不命中,台账看得见、待办永不并人); save 缺省档落归一值,update 缺省档保留原授权人不变。
  • 不变:委托查询的作用域优先级(精确优先)与择优顺序(先按 id 取最新一条再交判据裁决) 维持 v1.8.2x 起的既有立法(issues/123 收口形状),与内置 mldong-wf 版方向相反—— 差异与迁移动作已写进 §4.5「与内置版(mldong-wf)的三条方向差异」。
  • ⚠️ 行为变更(用户可感知):① 集成方若曾依赖"processSurrogate/page 不带 operator 返回全库", 升级后该档只返回归一缺省 user1 名下的行;② 直调仓储的调用方若不给归属条件,将拿到空页。 jeeflow-ui 与 vben5 两条前端腿都经门面且各栈已实测零回归。
  • 测试:仓内 T0 五档判据(作用域优先级/停用不自愈/自委托/写侧三档/分页归属两层), 每档配真值档阳性对照;摘掉兜底判据必红。

v1.8.37 — 2026-10-02 ​

  • 变更(issues/100,本栈独有的一笔运行期行为改动):参与者解析三档顺序对齐 Java 基准—— assignmentHandler 此前是"最先且独占"(注册了 handler 就短路掉 assignee 与 tf_nextNodeOperator), 现改回 tf_nextNodeOperator > assignee(解析结果非空才返回)> handler 兜底; assignee 解析成空(如传 " , , ")时落回 handler。分叉是收敛而不是新增:八栈从此同序。 判据落在读回的持久行(repo.FindTaskActors)上,engine/actors_priority_100_test.go 四格钉住。
  • 新增(issues/115 §3-8):门面第 47 个 action processTask/removeTaskActor(摘单个参与人)。
  • 修复(issues/137 §3-1):门面出口内部异常改固定文案「流程处理失败」+判别式五条,底层原文只进日志。
  • 修复(issues/137 §3-6/§3-4/D):删除腿「原值 ∪ trim 值」两形并集;实例级 expire_time 补发起腿写点; 相对档前缀判非负(-5h 落穿成 NULL 那格)。
  • 变更(issues/141 G4):未知节点档记可诊断日志(spec/02 义务 2)。
  • 测试:go test ./... 九包全 ok(含 repository/jdbc 真 MySQL 腿 24.0s,JEFFLOW_DB_DRIVER=mysql 连 160), TestIssue100* 四格在内。

v1.8.36 — 2026-09-30 ​

  • 新增(issues/142 A 批):记录类(snaker:custom)独立执行腿——model.CreateHistoryTask(新, TaskStateDone(20)+操作人+FinishTime,两条建单不变量照兑现)+ engine.execCustomNode(新, clazz 三档:空串/未注册 ⇒ 两条可分别诊断的 WARNING 后照常落行续流;命中则执行; 处理器自身报错外抛)。任务类零参与者照常建 DOING 行——撤掉 if len(actors)==0 { return nil }(实例停在 state=10 却零可办行的死锁黑洞)。
  • 变更(issues/142 B 批 · spec 06 §2.11):spi.NormalizeCcActors → spi.NormalizeActors (旧名 Deprecated 薄转发,判据唯一落点);六处落点(facade 三支 toStringSlice2、transfer 三值、 surrogate、nextNodeOperator、发起腿、两仓 addTaskActor)逐字对表接同一枚尺子。 破坏面:processTaskId:0 从 code=0 改为响亮报错;数组形 actorIds/nextNodeOperator 开始 trim+丢空+折叠(旧数组腿不 trim 且把 null 串化)。
  • 测试:go test -count=1 ./... 全 ok(含真库 T1 22.9s)、go vet ./... 干净;基线只增不减。 补交两件测试(SQL 仓 sqlite 镜像档+判据单点本体档)。

v1.8.35 — 2026-09-29 ​

  • 改造(issues/132 · 码值三套并存收口):Go 自有 0..5 套整表重排到规范 A 套 1..9—— 注意旧 TaskComplete=4/CcCreate=5 与新规 CC_CREATE=4/TASK_COMPLETE=5 恰好互换; 旧成员名按 §11.6 保留一代同值别名(EventProcessStart / EventProcessFinish / EventProcessReject / EventTaskCreate),集成层判据改用规范名。
  • 新增(issues/127):办理抄送腿 tf_ccActors 建 cc 行+逐人 fire CC_CREATE, 覆盖面只算 ExecuteProcessTask——jumpToEnd/jumpTask/jumpToFirstTaskNode 三个入口显式传 nil 钩子(钩子参数形状照 java,将来新增入口不会漏),并补四档负向格。
  • 修复(§11.3 码 2/8):撤回路径原先在实例写 30 后同时发 8 与 2,下游会收到 「流程已办结」的错通知 ⇒ 改为只发 8(同轮把既有断言一并改判,spec 原句已引)。
  • 测试:go build ./.../go vet ./... 均 0;go test ./... 全包 ok(含 repository/jdbc 真连 160 MySQL 91s)。两层变异:摘撤回判据 ⇒ 名称序列格红;把 cc 腿挪回无条件带 ⇒ jump 负向 8 格全红。

v1.8.34 — 2026-09-29 ​

  • 修复(issues/134 · 撤回不校验实例状态):对已办结/非进行中的实例调撤回,改前会被静默改写—— 实例 state 被写成 30 且返回 code=0(症状现场:boot2 生产镜像 code=0 msg='成功',state 20→30)。 聚合根 withdraw 入口加实例态守卫:state != 10(进行中) 一律拒,内部码 20010009,被拒时 实例与任务行零改写、不落库;出口按 issues/121 口径透出 code=99999999 + 逐字文案 「流程实例非进行中,无法撤回」(内部码不进 msg)。任务行层面的既有保护(spec 06 的"20/40 任务行 不改写")原样保留,实例级守卫排在它之前。落点:facade/facade.go 的 withdraw——鉴权之后、任何改写与 UpdateInstance 之前。 新增 3 格,go test ./... -count=1 全绿(jdbc 27 连 160 真跑);摘守卫 ⇒ 2 负向红。 go 栈 130 侧无需改动(Enabled int != 1 本就是严形状)。

v1.8.33 — 2026-09-28 ​

  • 修复(issues/126 案 A):本栈此前没有到期表达式求值器,建单/会签/回退一律不赋这一列 ⇒ 常规流上逾期统计恒 0。 新增 engine/expire_time.go:ProcessTime(expr, args) 三档逐字对齐 Java FlowUtil.java:64 (变量档优先→time.Time/毫秒/日期串,类型不认识落穿;Ns/Nm/Nh/Nd,d 走 AddDate 日历加; 绝对档严格 2006-01-02 15:04:05;失败一律 nil,任何分支都不返回 now), 表达式取用刻意不走既有 stringFromProps(那条对 JSON null 会 Sprint 成 "<nil>",把"没配"伪造成"配了个坏表达式")。
  • 五处写点:普通建单 / 串行会签首位 / 并行全员 / default 会签档 / 回退新建(变量源用随行 nt.Variables=boot2 hisVariable), 外加串行推进出的下一位成员。回退那一处头一轮取成了 prev(落地行节点),已在 96d647a 改回 current 并把夹具换成双节点不同偏移。
  • 测试 engine/expire_time_test.go 13 个函数 / 32 个叶格;go test ./engine/... ./memory/... ./facade/... ./persist/... ./metadata/... 全 ok。 变异对照两层六次:helper 换成 time.Now() ⇒ 11 个写点格里 10 红(唯一不红的是"未配不许造值"那格,它在求值前就短路); 再逐个注掉六处调用点 ⇒ 各自对应格红,并因此照出 default 会签档原本没测、当场补一格。
  • 跨栈一致性(同批八栈一起发,基准=boot2 内置版 ProcessTaskServiceImpl:213/386/524 三处写):普查发现写点其实是五处,第五处=串行会签推进出的下一位成员(boot2 的推进回调 createCountersignTask(:485,内含 :524 到期写)),各栈这一支普遍绕过本栈建单 helper 直建行,只看建单/回退两支会漏。另一处分叉在落地中被抓出来:回退新建的表达式该取 boot2 的 current=被回退掉的那个节点(:363 current = model.getNode(currentTask.getTaskName()) → :385 ((TaskModel)current).getExpireTime()),而不是落地行所属的 prev;java/php/csharp/rust/node/moon 取 current,go 与 python 头一轮取成了 prev,两栈当时的夹具只给一个节点配表达式 ⇒ 取错也全绿,是比对隔壁栈代码才发现。修完的判据改成双节点不同偏移(落地 1d ∧ 当前 3h ⇒ 断 ≈3h)+反向钉一档「当前未配 ⇒ 必须空」。

v1.8.32 — 2026-09-28 ​

  • 修复(issues/129 案 A,与 Java 1.8.32 同题):本栈"空串读出全库"的现场不在 repository/jdbc/jdbc.go(那里只判 val == nil,紧随其后才有空串放行),而在内存仓储——demo/controller.go 用 memory.New(),而 memory/repository.go 四条 page 写作 if actorID != "" { …过滤… } / if operator != "" && … ⇒ 空串折叠成"这条条件不加",{"operator":""} 直接读出 demo 种子的全部 25 条实例(其中 operator=user1 恰 4 条,与线上读数逐字吻合)。
  • 两层同形收:门面新增 operatorArg()(TrimSpace 判空 ⇒ user1,非空返回原串不 trim=java 逐字同形)替换 12 处 toStr(args["operator"], "user1");内存仓四条 page 归属入参空值 ⇒ 空页、matchConditions 对归属列 EQ 空值 ⇒ 该行不匹配;buildWhere 在原有通用放行之前对归属列空值写 AND 1=0;绑定参数族(PageInstances / pageTasks / PageCcInstances)空归属入参 ⇒ 空页不查库(原行为是拿空串去比对,sqlite 实测会捞出 operator='' 的脏行,与 java 的 AND 1=0 不一致,故按 java 收)。issues/114 硬必填族与 "system" 审计缺省族未动。
  • 测试:go build ./... && go vet ./facade ./memory ./repository/jdbc 干净;go test -count=1 六包全 ok;新增四件——门面三档并排(比行集不比行数)、内存仓绕门面直喂空值、repository/jdbc 的 sqlite 真库件(夹具故意放一条 operator='' 脏行)、buildWhere 拼串件 + 非归属列哨兵。既有断言零改动(facade_test.go diff = 196 插入 / 0 删除)。
  • 变异对照两层互不遮蔽:只回退门面 ⇒ 空串档应回落 user1,实际行集 [] ≠ user1 档 [4 1];只回退仓储 ⇒ PageInstances(空串) 应空页, got rows=3 total=3(全库症状在仓储层复现);五文件按 sha256 还原。
  • 线上复验:160 demo 部署 v1.8.32 后四出口空串档 = 4 / 5 / 1 / 2,与 user1 档相同(修前 25 / 46 / 24 / 9)。
  • 发版核验:go list -m github.com/mldong/jeeflow-go@v1.8.32 实测解析命中(goproxy),CI Verify Release 绿。

v1.8.31 — 2026-09-27 ​

  • 修复(issues/125 · SQL 侧数据库时钟,issues/120 的下半段):StatsPendingAndOverdueCount 的逾期判据原写 expire_time < NOW()——NOW() 取 @@session.time_zone 的墙钟,expire_time 是引擎进程钟写的裸墙钟 ⇒ 一个 SET time_zone 就能让待办逾期计数差一个时区偏移,且与内存仓(用进程钟)不同数。现在 Repository 加可注入的 statsClock(默认 time.Now,与内存仓同一把),SQL 改 expire_time < ? 绑参,方法内只取一次钟。构造器与公开 API 零变化。
  • 判据(新增 repository/jdbc/stats_clock_test.go,160 真库;夹具只写 930001–930099 段、进出按 id 清场,断言用"其余行 + 夹具"的差量 ⇒ 抗并发插入):夹具必须有牙(同批行按旧写法直查,会话 +08:00 得 3 条、+00:00 得 1 条;两把钟读数相同即判失败,不放恒绿死格过关);修完与时区无关(两个会话时区下仓储读数逐位相同,且等于 Go 侧独立算出的期望 pending=4 / overdue=1);有牙(注入钟前移 2 小时 ⇒ 逾期 1→2);回归 + 边界(pending 半边不受钟影响、expire_time IS NULL 的行钟拨 +30 天仍不计入、同注入值重复调用稳定);另用 SET time_zone 后经连接池回读 @@session.time_zone 自证探针落在被测路径上(防驱动重置会话变量把判据掏空)。
  • 测试 go build ./... && go vet ./... && go test ./... ⇒ 全包 ok(repository/jdbc 22s 全绿)。变异对照:实现临时换回 NOW() 不绑参 ⇒ 时区等值 / 期望值 / 钟挪不动三条断言同时红,还原后绿。
  • 发版核验 goproxy.cn 回拉 github.com/mldong/jeeflow-go v1.8.31 命中,go list -m 实测解析到 v1.8.31。
  • 同批跨栈:Java 1.8.31、Rust 1.0.16、C# 1.0.7 同题同修;本栈这条也是四栈里唯一能直接做实弹"换会话时区读数不变"的那一条(C# 侧受连接池限制无法把仓储钉在指定会话上,改由注入钟等值 + 旧写法直查差异两条替代)。

v1.8.30 — 2026-09-24 ​

  • 变更(issues/124 变量出口立法,对齐 Java v1.8.30 基准):processInstance/detail 出口 variables 更名为 ext(键形态与列表行一致),variables 全集与 variable / instanceVariable 原串退出门面出口;唯一出口 = ext(实例侧)+ instanceExt(任务行侧),空变量出 {};持久层 variable 列不动。
  • 新增 processTask/detail 顶层 taskFormData(任务变量按 tf_ 前缀过滤),对齐 Java / Node 既有形状。
  • 测试 TestVariablesOnlyExitViaExt 正负两向 + 全量 go test ./... 绿;go proxy 回拉 v1.8.30 可解析。

v1.8.29 — 2026-09-23 ​

  • 修复(委托判据取行顺序,对齐 Java 参考实现):getSurrogate 改为「各作用域先按主键 id 取最新一条,再交四判据裁决」,禁止「先按判据过滤掉不生效的、再从剩下的取 id 最大」——旧顺序下历史上任一条窗内委托会永久生效,用户之后的停用 / 改期 / 改成自委托全被旧记录盖掉。内存仓与 SQL 仓同形(SQL 侧 WHERE operator = ? [AND process_name = ?] ORDER BY id DESC LIMIT 1,不带 enabled = 1 / 窗口 / 自委托谓词;内存侧 newestInScope 不带生效谓词、按 ID 显式取最大)。同层判否不回落更旧那条;精确作用域判否后仍兜底全流程作用域(process_name 为空)的最新一条,不得判否即止。单条裁决收在 model/ext.go 的 IsEffective。
  • 修复(出口文案统一):退回上一步两格对外 msg 删掉 20010007: / 20010008: 码数字前缀,改为 Java 逐字中文文案(上一步任务ID为空,无法驳回至上一步处理 / 无法驳回至上一步处理,请确认上一步骤并非fork、join、suprocess以及会签任务)——两码是引擎内部码,严禁进对外 msg(门面本就不透传业务码,出口恒 99999999,前缀既没换来码位又造出跨栈文案分叉);源码注释同步改写为「对外 msg 用固定中文文案、不含引擎内部码」,防下轮照旧注释塞回码。
  • 测试 go vet 零输出;go test ./... ⇒ engine + memory ok、repository/jdbc ok(真库支路本机 MySQL 28.8s),全仓无 FAIL。新增两组同数据集用例并钉「两仓同答案」:TestSurrogateNewestRowDecidesNoMerge(内存仓 + repository/jdbc/surrogate_test.go 同名用例——最新一条窗外 / enabled=0 / enabled=2 脏值 / 自委托 ⇒ 不并入,且不回落更旧那条)、TestSurrogateIneffectiveExactRowStillFallsBackToAllFlow(本流程那条失效 ⇒ 仍由全流程委托并入;正向对照另钉精确优先,全流程那条不得盖它)。
  • 变异对照 ① 关掉跨层兜底 ⇒ 兜底三组 + 对拍夹具参考答案红,还原全绿;② 把 noLineage 常量重新加上 20010007: 前缀 ⇒ Test154RollbackLineageNegatives 红(msg 应为固定文案且不含引擎内部码),证明断言的新反闸 strings.Contains(msg, "2001000") == false 真抓得住回归(Contains(文案) 单独用是恒绿的)。
  • 跨栈验证 13 个集成栈候选镜像门禁对拍:委托判据格 L2-17 全绿(13/13),13 栈逐格 0 分叉;L2-18 13 栈同形同错(失败逐字相同)=门禁夹具支间未清场,非引擎缺陷。

v1.8.28 — 2026-09-22 ​

09-22 夜发版轮(issues/120 时钟基座 + issues/121 P1/P2 血缘回退)Go 侧代次;tag v1.8.28(00:55)。

  • 新增(121 P1):建单写 TaskParentID 与行级 isFirstTaskNode,门面读时行上值优先(68a6901); 引擎控制键不算「任务变量非空」,P1 不打断 ext 回退实例变量(461510c)。
  • 变更(121 P2):退回上一步改血缘版——复活血缘前驱行、参与者取该行办结人(82c7c85); submitType 的 3/6 口径在文档里拆开(3=血缘版退回上一步、6=首任务节点,两者不同实现,89d402c)。
  • 修复(issues/116 批次 D):委托条款 1.1 判空改「先 trim」+ 三条建单路径各留独立用例 + 1.4 夹具打乱 id 序(a214b51); 委托自动生效内置默认开启(0ab2e6b)。
  • 仓库卫生:取消跟踪误入库的 go-demo.exe(22MB Windows 本地产物,5299ac3/6e1f1be)。
  • 发版核验:goproxy.cn 与 proxy.golang.org 双侧 .info 回拉;该仓的 verify.yml 在 1.8.29 那轮才建 (首跑还抓到 GOSUMDB=off 把工具链下载判成 checksum disabled)。

v1.8.27 — 2026-09-09 ​

  • 修复 五语言 SQL 仓聚合水合:FindInstanceByID 此前只查 wf_process_instance 单表,inst.Tasks 为零值,门面 processInstance/detail 的 tasks/activeTaskList 恒空(gate26 L2-12 门禁真根因,非会签语义)。二次查 wf_process_task(复用 FindHistoryTasks:ORDER BY id ASC + 批查 ActorIDs,同连接/事务内 ctx 复用)水合任务副本,语义对齐 Java findTasksByInstanceId / PHP PdoProcessRepository / C# FindTasksInternalAsync(聚合水合口径)。updateTaskWithConn 按 task.id 幂等 UPDATE(无 INSERT / 不改 actor),水合后 withdraw 回写与 Java 同构。memory 仓本就水合(基线正确,未动);引擎核心会签语义未动。
  • 测试 T0 新增 TestFindInstanceByIDHydratesTasks(engine 发起 → 水合非空 + ActorIDs + detail 非空);全测试包绿(demo 包 go vet 存量报错已 stash 证伪,与本改动无关)。
  • 集成栈 mldong-goframe-jeeflow pin → v1.8.27 随 P3 收口(base+1,进行中)。

v1.8.26 — 2026-09-04 ​

  • 修复 pro 真验两回归:stuckApprover JOIN 条件 pta.task_id → process_task_id(卡单审批人恒空);QueryInstancesForStats 的 CreateTime 扫描套 nullTimeScan(DSN 不加 parseTime 时 stats 报错)。

v1.8.25 — 2026-09-04 ​

  • 新增 stats 三 action(processInstance/stats/overview|trend|group)落地。
  • 修复 stats 契约对齐 A–E 验收;parseSurrogateTime 按本地时区解析(两线一致性)。
  • 修复 fireEvent 单监听器 panic 兜底(P2,一个监听器异常不打断其余)。

v1.8.24 — 2026-09-03 ​

  • 新增 CC_CREATE 抄送知会事件(六语言统一缺口 Go 栈)。

v1.8.23 — 2026-09-01 ​

  • 修复(引擎侧根因):createTask 任务行落库之后 fire EventTaskCreate(带 instanceId/taskId/nodeId/operator)——此前「从不 fire」,新待办 TODO 事件整类缺失,messagePage 恒空;新待办 / 分支节点 / 退回重办 / 会签各子任务逐任务触发,对齐 Java CreateTaskHandler 时机。

v1.8.22 — 2026-08-31 ​

  • 修复:execute 不再覆盖实例 u_*——prepareExecuteTask + 结束节点写回两处把操作人 u_*(含 u_realName)整体写回实例变量,发起人漂移为上一操作人;改为以 start 注入的发起人 u_* 为底、仅并入非 u_* 键(helper mergeExecIntoInstance)。实例 u_realName 恒为发起人,对齐 Java 基准。

v1.8.21 — 2026-08-30 ​

  • 修复 批量入参契约:删除/启停类 action 统一走 idListArgs——{ids} 数组优先、单 {id} 兼容,空值 / 含非法值一律 99999999,不再静默成功。

v1.8.20 — 2026-08-23 ​

  • 修复 会签一票否决条件化 + merged 废弃残留任务(对齐内置引擎):submitType=20 默认软拒绝;仅 countersignCompletionCondition=ONE_VOTE_VETO 时一票否决推进;merged 后废弃该节点剩余 DOING 任务。

v1.8.19 — 2026-08-23 ​

  • 修复–82 门面字段级契约批次(五语言)Go 部分:processSurrogate 补 update / detail、candidatePage 行键归一、listByType 补 processDefineState、id 精度守卫、委托修复。
  • 测试负向:抄送空 actors 报错——createCCInstance 空/缺失 actorIds → 99999999(对齐 Java/PHP 基准)。

v1.8.18 — 2026-08-16 ​

  • 修复:FormFieldAssigneeHandler.findFieldValue 增加 f_ 前缀优先匹配(对齐 Java 1.8.11):f_ 前缀 → 裸名回落 → _NN 后缀去后缀。前端表单字段带 f_ 前缀提交时不再取人失败。

v1.8.17 — 2026-08-15 ​

  • 修复:JdbcTableReader 读 VARCHAR 时 []byte 不再被 JSON 成 Base64。

v1.8.16 — 2026-08-13 ​

  • 修复:processDesign/page 时间格式统一为 yyyy-MM-dd HH:mm:ss(§2.4 契约)。
  • 修复(五语言同批):processTask/detail 的 taskModel 补全 ext / form 字段。

v1.8.15 — 2026-08-09 ​

  • 变更(CI)release workflow 移除 verify job(发布后 registry 可用性改为发版时人工确认);为 CI 发布流水线做准备。

v1.8.14 — 2026-08-09 ​

  • 变更(CI)test job 移除、aliyun mirror;无引擎行为变更。

v1.8.13 — 2026-08-09 ​

  • 新增:persist.RegisterMeta 注册助手;声明拦截器缺注册表时发起/办理显式报错(引擎兜底)。
  • 新增 Dockerfile.demo。

v1.8.12 — 2026-08-08 ​

  • 修复:designRedeploy 替换分支携带原 Version——对齐 Java 修复(JDBC 兜底曾误写 1 / memory 打回 0)。
  • 改进 updateDefine / save / deploy 的 content 字段支持 string 与 JSON 对象双形态(四语言同批)。

v1.8.11 — 2026-08-06 ​

  • 修复:parent_node_name NULL 扫描;ext 结构体补 json tag。
  • 修复:会签任务 performType 落库(三端对齐 Java);撤回状态改为 Withdraw(30) 而非 Reject(45);发起时抄送 f_ccActors 创建抄送。
  • 修复:普通任务 performType 误落 1(回归);stringifyIDs 支持结构体(id 未字符串化)+ withdraw 级联补正。

v1.8.10 / v1.8.9 — 2026-08-05 ​

  • 无独立行为变更(收口随 1.8.8,重打 tag 对齐联邦号)。

v1.8.8 — 2026-08-05 ​

  • 新增:nodeProgress 成员 name 经 UserProvider SPI 解析 realName——goroutine + WaitGroup 并行批量 getUser(单用户失败不影响其余),未注册或查不到时回退空串。

v1.8.7 — 2026-08-05 ​

  • 修复:performType 增加字符串兼容('ALL' / 'COUNTERSIGN'),设计器面板保存的字符串格式在会签流程中不再退化为普通节点。

v1.8.6 — 2026-08-05 ​

  • 新增:highLight 新增 nodeProgress——会签节点成员进度(done / active 逐人标记)、普通节点历史与进行中状态。

v1.8.5 — 2026-08-05 ​

  • 修复 E9:facade 出口 id 统一 string 化(stringifyIDs),对齐 Node 全程 string / Java 全局 ToStringSerializer。
  • 修复 E11:jdbc 可空列 sql.NullTime 与剩余 string 字段的 NULL 扫描。

v1.8.4 — 2026-08-05 ​

  • 新增:流程定义级 postInterceptors 声明与拦截器注册表,未声明的流程不触发,与 Java 语义一致。
  • 新增 三门下沉:processDesign/listByType、processInstance/bizData、updateDefine 顶层 JSON 兼容、remove / upAndDown 批量。
  • 修复:jdbc 可空列 NULL 扫描 / DATETIME 依赖 parseTime。

v1.8.3 — 2026-08-04 ​

  • 文档 persist 语言指南权限语义补强(办理入口过滤,上游只读不可绕过);版本对齐。

v1.8.2 — 2026-08-04 ​

  • 文档:persist 语言指南权限语义补强(引擎行为本已正确,随 Java 修复批同步语义文档)。

v1.8.1 — 2026-08-04 ​

  • 修复:SYNC 字段权限键兼容前端 PERMISSION_f_ 约定(双格式匹配,前端优先)。

v1.8.0 — 2026-08-04 ​

  • 新增:SYNC 同步演进入库(发起入库 → 节点推进 → 结束定稿,对齐 Java)。

v1.7.0 — 2026-08-04 ​

  • 新增:元数据驱动的动态写入 / 读取规范(对齐 Java 阶段①②③)。

v1.6.6 — 2026-08-04 ​

  • 修复:information_schema 探测限定当前 schema(DATABASE() / CURRENT_SCHEMA(),对齐 Java)。

v1.6.5 — 2026-08-04 ​

  • 文档 persist 主键生成语义同步。

v1.6.4 — 2026-08-04 ​

  • 文档 persist 列匹配语义同步。

v1.6.3 — 2026-08-04 ​

  • 文档 persist 语义同步(用户列 operator + 同链防护)。

v1.6.2 — 2026-08-04 ​

  • 修复:表不存在显性报错——拦截器 exists 失败 panic(与 Java/Python 抛异常语义一致,配置错误快速失败);persist/ 通用入库。

v1.6.1 — 2026-08-04 ​

  • 新增:HandlerRegistry 构造即内置 7 个通用 handler 元数据(字典零注册)。

v1.6.0 — 2026-08-04 ​

  • 新增:参与者解析 SPI 与 7 个内置 handler、candidatePage 双源(四语言同构)。
  • 新增 startAndExecute 支持 f_nextNodeOperator 预指派人(对齐 boot3)。

v1.5.1 — 2026-08-03 ​

  • 新增:processDesign/redeploy、updateDefine、update action + is_deployed 状态同步。

v1.5.0 — 2026-08-02 ​

  • 修复(issues 05/06/07 修复集):详情 jsonObject、highLight 决策节点表达式过滤、design/detail jsonObject 补齐。

v1.4.0 — 2026-08-02 ​

  • 新增:引擎元数据能力——枚举字典 + SPI 实现清单。

v1.3.0 — 2026-08-02 ​

  • 新增 pageCcInstances 分页 SPI + ccList 补齐;addTaskActor 去重追加语义。

v1.2.0 — 2026-08-02 ​

  • 新增:Facade 补齐视图端点(12 个,二期反馈)。

v1.1.0 — 2026-08-02 ​

  • 新增 管理扩展与门面说明(三扩展表 + 扩展仓储 SPI 同构实现)。

v1.0.0 — 2026-08-01 ​

  • 引擎核心四语言同构实现(Go):5 张核心表、启动/执行/驳回/跳转/退回发起人/会签/抄送/委托、4 SPI、MySQL / PostgreSQL,发布到 Go proxy。

jeeflow · 轻量级多语言工作流引擎