Appearance
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 空切片(javaCollections.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节点无法确定下一步执行路线(逐字=javaWfErrEnum.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.go3 格+变异对照(摘报错改回静默即红);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让门控键覆盖同名流程变量),照 rustgate_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⇒ 那条边永不收录,流程图上"通向当前待办的那根线"永远是灰的 (实例确实走到了那里)。现把收录挪进源节点出边循环、排在活跃判断之前,逐字同位于 javaJeeflowFacade.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 行+逐人 fireCC_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)三档逐字对齐 JavaFlowUtil.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=boot2hisVariable), 外加串行推进出的下一位成员。回退那一处头一轮取成了prev(落地行节点),已在96d647a改回current并把夹具换成双节点不同偏移。 - 测试
engine/expire_time_test.go13 个函数 / 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.godiff = 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),CIVerify 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/jdbc22s 全绿)。变异对照:实现临时换回NOW()不绑参 ⇒ 时区等值 / 期望值 / 钟挪不动三条断言同时红,还原后绿。 - 发版核验
goproxy.cn回拉github.com/mldong/jeeflow-go v1.8.31命中,go list -m实测解析到 v1.8.31。 - 同批跨栈:Java
1.8.31、Rust1.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-1813 栈同形同错(失败逐字相同)=门禁夹具支间未清场,非引擎缺陷。
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 复用)水合任务副本,语义对齐 JavafindTasksByInstanceId/ PHPPdoProcessRepository/ 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 真验两回归:
stuckApproverJOIN 条件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任务行落库之后 fireEventTaskCreate(带instanceId/taskId/nodeId/operator)——此前「从不 fire」,新待办 TODO 事件整类缺失,messagePage 恒空;新待办 / 分支节点 / 退回重办 / 会签各子任务逐任务触发,对齐 JavaCreateTaskHandler时机。
v1.8.22 — 2026-08-31
- 修复:
execute不再覆盖实例u_*——prepareExecuteTask+ 结束节点写回两处把操作人u_*(含u_realName)整体写回实例变量,发起人漂移为上一操作人;改为以 start 注入的发起人u_*为底、仅并入非u_*键(helpermergeExecIntoInstance)。实例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_nameNULL 扫描;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、updateaction +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。