Skip to content

Node.js 更新日志 ​

当前版本 v1.8.55 · npm(@mldong/jeeflow)· 仓库 mldong/jeeflow-node · Releases 版本日期以本仓 git tag 为准;跨语言对齐脉络见 更新记录总览。

v1.8.55 — 2026-10-31 ​

「退回修改、重提直返」首轮发版(tag v1.8.55=commit 4160c98)。条文见 规范 04 引擎操作「退回修改、重提直返」节。

  • 新增:reapplyMode 节点属性与非法值解析期报错、submitType=6 直返建带 _reapplyContext 的申请待办、submitType=5 重提直接回来源节点、_branchCtx 分支归属 与汇合等齐判据、保留键入口剥离与同实例串行化。实现落点:src/reapply.ts + src/engine.ts。
  • 变更:带标记的申请待办在 executeAndJumpTask(命名跳转与血缘回退两档)/ executeAndJumpToEnd/executeAndJumpToFirstTaskNode 四个入口一律在状态变更前拒绝。
  • 修复(ext 回退契约被新保留键打破):taskRowToMap 的控制键集合补两枚保留键; 回退从"ext = instanceExt(同一对象直出)"改为副本再合回 _reapplyContext ——旧写法一旦加键就连环污染 instanceExt 出口;mergeExecIntoInstance 同挡这两枚。

v1.8.54 — 2026-10-17 ​

audit8 R110+R112(tag v1.8.54)。

  • 新增(删除定义守卫):processDefine/remove 删除前校验任何实例存在即拒,批量先整批校验;仓储增 hasInstancesByDefineId。
  • 诊断(未知档的边):followEdges 落穿时 console.warn 带 from/to,行为不变。

1.0.0–1.8.4 为四语言同构对齐期(Java / Go / Python / Node 同号演进);1.8.5 起按语言节奏发版,版本号不必同号(Node 未发布 1.8.24——CC_CREATE 批次未单独发版,随 1.8.25 一并发布)。

v1.8.53 — 2026-10-16 ​

audit8 R91+R77(tag v1.8.53,引擎 commit 881e2d5/880d786/f1cc1bf)。

  • R91 节点级拦截器:interceptorRegistry 按名解析+两级声明(节点档优先、根档回落、缺名报错), 随修一条读放大——流程根声明每定义只回查一行(新档⑦咬住),条文=规范 02 §3。
  • R77 提交后腿通道:afterCommit 可选登记,含真库回滚腿(回滚整批丢弃/提交恰好一次), 条文=规范 12 §12.3.1。
  • 同批:R70 ③ 注释与用例标题里的幽灵节号 spec §7.4 改指实际锚点(零行为差)。

v1.8.52 — 2026-10-16 ​

audit8 R92 行为变更(tag v1.8.52,引擎 commit 4438f4f)。

  • 行为变更(执行族返回值):executeProcessTask/executeAndJumpToEnd/executeAndJumpTask/ executeAndJumpToFirstTaskNode 四法返回 Promise<ProcessTask[]>(本次动作产出的任务行), 对齐 规范 04 §完成任务 与 java exec.getProcessTaskList(); 空档出 [] 而非 undefined/null。startProcessInstanceById 仍返回实例。
  • 实现口径:作用域用 AsyncLocalStorage(不是 class 字段——同一 EngineImpl 并发处理多请求 时字段会互踩),六条建单腿 saveTask 成功后登记;并发隔离由判据档钉住而非注释自称。
  • 对外影响:facade.ts 七处消费点本就是裸 await(不取返回值)⇒ HTTP 出口形状不变,壳只升 pin。

v1.8.51 — 2026-10-15 ​

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

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

v1.8.50 — 2026-10-14 ​

issues/201 收口:决策边表达式求值失败 catch 补可诊断日志(tag v1.8.50,引擎 commit ff18a5c)。 条文见 规范 06 · 门面 §4.6「求值失败留痕」(issues/201 立法,2026-10-14 owner 拍 C)。

  • 新增(可观测性,行为零变化):collectPath/evalDecisionExpr 失败支由空 catch { return false } 改为落 console.error(实例号/定义号/nodeId/expr/err 五件齐);遍历宽度维持折 false, 合法判假不落这条日志,对外仍 code=0。

v1.8.49 — 2026-10-13 ​

issues/186 收口:补上第四能力 listHandlerTypes(tag v1.8.49,引擎 commit bd7151c+4710159)。 条文见 规范 07 · 元数据与注册表。

  • 新增(能力面补齐):spec07 定义的四个方法在本栈与 PHP 只落得下三个——listHandlerTypes 整条缺失。 本版补齐,口径对齐 java=某类型在场 ⟺ 该类型 listHandlers 非空,去重+首次注册序。
  • 现读更正:涉案确数是 2 家(node+php),八栈零生产消费者——这条不是"页面缺功能",是能力面缺口。
  • 判据:新格+变异对照;并行 node --test 417/417×2、typecheck rc=0。
  • 传播面:node→nestjs,1 张镜像(候选 54/0/0→晋升)。
  • ⚠ 同轮附带发现另案:本仓 flows 镜像 resolver 的非原子覆盖写会与并发测试进程相撞(既有用例随机红), 工装侧已修(.tmp.<pid>+rename+稳态零写),不进发布物(npm pack 44 个文件零命中该件)。

v1.8.48 — 2026-10-12 ​

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

  • 修复(用户可感知):候选人行此前键形恒兜底,realName 直接等于裸 id ⇒ 待办候选人显示一列数字。 本版接上 findById→getUser→兜底,行键按 src.id→src.userId→actorId 字符串化回落。
  • 判据:四档 T0 用例+逐处变异红样+字节级还原清洁;复跑 266 格+typecheck 全绿。
  • 传播面:node→nestjs;同批五引擎 9 张镜像+moon 一键包全晋升。

v1.8.47 — 2026-10-12 ​

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

  • 修复(用户可感知):设计器把候选人写在嵌套形 properties.field,解析层只读顶层 ⇒ 按 UI 配的人读成空。
  • 现读更正:会签条件腿已由 issues/163 轮修掉,本栈本案只剩候选人一处。
  • 判据:两档新格+变异红样;复跑 262 格全绿。
  • 传播面:node→nestjs;同批六引擎,9 张镜像+moon 一键包 10/10 晋升。

v1.8.46 — 2026-10-12 ​

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

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

v1.8.45 — 2026-10-11 ​

issues/145 事务七条债 · node 切片(该案第 2 条收口,tag v1.8.45,引擎 commit e7397be+a6e9049)。 条文见 规范 12 · 事务与持久化。

  • 变更:门面整次 dispatch 并入宿主事务,persist 业务表写腿随动作提交/回滚;本栈以 ALS (async local storage,AsyncLocalStorage 语义的环境绑定)承接事务上下文, 壳侧 transactionAwarePool 为接线点(安装后实探为 function)。
  • 判据:真库 tier 档+逐处变异对照;npmjs 与镜像站 integrity 同值、壳侧 --frozen-lockfile 真装到。

v1.8.44 — 2026-10-11 ​

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

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

v1.8.43 — 2026-10-11 ​

issues/172 收口:updateCCStatus 的 operator 归一缺件(tag v1.8.43,release commit 3647eb1); 同批带上 issues/162 的 node 腿。

  • 修复(用户可感知):抄送状态更新时 operator 未走归一(trim/空档),空串与带空白的值直接落库 ⇒ 台账行归属错乱、后续按 operator 取数查不到。这是 issues/142 B 批的漏收口,与 Rust 同案两栈并修 (Rust 更宽一档:空串直绑 actor_id='')。
  • issues/162 node 腿:highLight 降级面保留+带原因日志,不再静默。
  • 门禁同步升级:同轮新增跨栈格 L2-40(operator 归一),selftest 五负控敢报红;真机首跑 48/1 照出夹具注入盲区而未晋升,修夹具后 49/0/0 才原样晋升。
  • 传播面:node→nestjs+rust→salvo,2 壳 2 镜像。

v1.8.42 — 2026-10-11 ​

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

  • 变更(用户可感知):决策节点零命中显式报错——遍历完全部出边仍无命中(带 expr 的边全判 false/ 判定变量缺失/零出边/自定义决策处理器未命中)时抛 decision节点无法确定下一步执行路线 (逐字=java WfErrEnum.NOT_FOUND_NEXT_NODE,门面出口 99999999+该 msg)。改前本栈该档 静默停住(令牌不前进也不报错):办理人看到 code=0"成功"、实例挂在 state=10 且没有任何人的 待办。条文见 规范 06 §4.6「零命中档」。
  • 种子: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)。
  • 判据:spec.test.ts issues/164 块 3 格+变异对照;node demo 重置 15/10 零种子报错; demo 求值器 generalize(原硬编码只认 amount,改任意变量名——166 逐家现读照出的 demo 侧缺口)。

v1.8.41 — 2026-10-10 ​

issues/163(npm,引擎 commit ed9f09e)。条文见 规范 06 §4.6 义务 2「求值通道」, 判据= __tests__/spec.test.ts 新增 issues/163 四格(阈值 2/3 放行+无 cond 对照+ONE_VOTE_VETO+嵌套读形), 以及会签 07 用例改回 java 形状(2/4 即放行、剩余成员废弃)。

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

v1.8.40 — 2026-10-10 ​

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

  • 修复:highLight.historyEdgeNames 不再漏掉"指向活跃节点的那一跳"的边名——collectPath 此前把边名 当递归实参传,遇活跃目标先 continue ⇒ 那条边永不收录(通向当前待办的那根线在画布上不亮)。 现把收录挪进源节点出边循环、排在活跃判断之前,与 java JeeflowFacade.collectPath:711-718 同位。 与 Go/Python 三家同病灶(普查读数见 issues/157 §6.1)。
  • 用户可感知:apply →(活跃)approve、网关分流后进入当前节点那一跳,边名从此会进 historyEdgeNames; 求值为 false 的分支仍整条不收(issues/153 那半不动)。
  • 判据:新增用例 03.6(夹具停在分支上,task2 活跃),断言 e3 收录、线性腿齐、e4/e5 不收。 变异对照(收录挪回下钻之后)251 tests / 250 pass / 1 fail,红的那一格恰是 03.6,既有 03.5 绿。
  • gate:tsc -p tsconfig.check.json 无告警;T0 npm test 251 pass / 0 fail;T1 npm run test-mysql 22 pass / 0 fail。

v1.8.39 — 2026-10-10 ​

issues/154 ④(npm,引擎 commit 0fd7598)。条文见 规范 06 §4.6。

  • 新增:approvalRecord 每行补首列 id(String(t.id ?? '')),本栈出口里 id 确为首键 (Node 无 map 无序问题)。
  • ①②③ 现读已合规:shared.ts 的 ORDER BY id ASC、实例不存在出空数组、ext 由任务变量解析否则 {}。
  • 判据:npm test 全绿;未碰构建产物目录与 package.json 版本号以外的东西。

v1.8.38 — 2026-10-08 ​

issues/152 委托三件收口(npm,引擎 commit 6ec4b78)。规范条文见 规范 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 基准—— tf_nextNodeOperator > assignee(非空才返回)> assignmentHandler 兜底;handler 不再是"最先且独占"。 同批删除零调用者的 createTaskWithActors(60 行死码,与在跑的建单分支重复); 顺带更正 __tests__/spec.test.ts 里一处挂错位置的钩子注释(那是 rollbackToParent 的 surrogateAgents→mergeAgents,不是它标注的那条腿)。判据见 __tests__/actors-priority-100.test.ts 四格。
  • 新增(issues/115 §3-8):门面第 47 个 action processTask/removeTaskActor; §3-8 另补主键档三格(纯空白/0/负数)钉住跨栈逐字文案。
  • 修复(issues/137 §3-1/§3-6/A §3-4/D/E):门面固定文案+判别式;删除腿两形并集; 实例级 expire_time 发起腿写点;相对档前缀判非负(intPrefix 加 n >= 0)+入口 trim(正则里的 + 保留)。
  • 变更(issues/141 G4):未知节点档记可诊断日志。
  • 测试:npm run typecheck(tsconfig.check.json)+ npm test 244/244; npm run test-mysql(__tests__/jdbc.test.ts 连 160 真库)22 tests / 22 pass / 0 fail。

v1.8.36 — 2026-09-30 ​

  • 新增(issues/142 A 批):engine.execCustomNode(新)——clazz 三档判定 → inst.createHistoryTask(...) → await repo.saveTask(ht) 真落库 → followEdges 续流, 不 fire 码 3(出生即 20 的行不塞进 processTaskList,不向集成层广播假待办); 任务类零参与者照常建单。
  • 变更(issues/142 B 批 · spec 06 §2.11):spi 新增 normalizeActors/normalizeActorValue (旧名 normalizeCcActors/normalizeCcActorValue 保留为同一函数对象的别名,并有断言钉住 "绝不许长成第二份实现");engine 新增 parseActorIds(parseCcActors 成其别名); facade 删除 toStringList2(内部未导出,无破坏)。taskAddActor/transfer/nextNodeOperator/ updateCcStatus/两仓 addTaskActor 接同一枚尺子;主键档响亮报错。
  • 修复:测试 id 发生器改单调计数器(mkSeqIdGen)——旧 Date.now()*1000+random 同一毫秒 取值空间仅 1000,一轮连发 40 个 id 撞号率实测 54%,内存仓 Map 后者覆盖前者 ⇒ 任务行与血缘 凭空消失的最难查随机假红,收掉。
  • 测试:npm test 228/228 pass、npm run typecheck EXIT=0。

v1.8.35 — 2026-09-29 ​

  • 改造(issues/132):EventType 从旧 C 套 0..5 重排到 A 套 1..9,其中 TaskComplete 4→5、CcCreate 5→4 互换;ProcessFinish/ProcessReject 合并为 ProcessInstanceEnd(2)(靠载荷 state 分)。
  • 新增(issues/127):办理抄送腿 tf_ccActors 建 cc +逐人 fire 4;TASK_COMPLETE(5)/ TASK_REJECT(6) 互斥落地;7/8/9 三支补支(转办/撤回/终止——9 在本栈无可达触发源,占号+记账)。
  • 修复:撤回不再「既发 8 又发 2」——notifyInstanceEnd 漏斗只服务「流程走到终点」(20/45), 30 撤回走自己的 8;facade 侧注释同步。
  • 兼容(§11.6):六个旧名以 enum 外部常量保留一代(ProcessStart / ProcessFinish / ProcessReject / TaskCreate / TaskComplete / CcCreate)。不写进 enum 成员是刻意的: 数字枚举会为每个成员生成反向映射,后声明者覆盖 EventType[1],而集成层事件流水 sink 要按 code→规范名写行——反向映射被污染=线上假红。由此留一条跨栈差异:TS 做不到 EventType.ProcessStart 这种点号式旧写法(Go/Python 可以),下游升级需改裸名 import, 本栈记为语言形状豁免。
  • 测试:npm test 151/0、npm run typecheck 0;T1 npm run test-mysql 17/0。 变异:删别名导出 ⇒ 别名格红;把别名写进 enum 成员 ⇒ 反向映射格红(实测 Actual: 'ProcessStart')。

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 任务行 不改写")原样保留,实例级守卫排在它之前。落点:src/model.ts 守卫 + src/facade.ts 把 withdraw/updateUser 上移到改写循环之前。 T0 132/132(基线 128)+ typecheck 0 err。
  • 修复(issues/130 · 委托 enabled 脏值默认方向):判据收窄为只认数值 1(typeof number && Number.isInteger && === 1;JS 无独立 float,1.0===1 属类型层判据,已在测试注释钉死); 边界还原两处分开钉:memory-ext.saveSurrogate 写侧台账归一(updateSurrogate 有意不归一, 留脏值显形路径)+ jdbc/ext.queryNewestSurrogate 读侧驱动还原;门面 parseSurrogateEnabled 归一保留。 npm test 136/136。与 python 内存仓"不还原"是一处已知设计分叉(SQL 读侧两栈一致),归 owner 后续拍。

v1.8.33 — 2026-09-28 ​

  • 修复(issues/126 案 A):新增 src/engine.ts 的 processTime(三档逐字;前缀非整数按 §口径落穿→null, 注释写明与 Java 抛 NumberFormatException 的差异是故意的——配置写错不该让建单卡死)+ applyNodeExpireTime, 接五处写点(含 :303 串行推进位与 :461 回退新建;回退处 createTime 与 expire 共用同一个 Date,不另起时钟)。 createTaskWithActors 四支同尺接线——该函数全仓零调用者,接线不造测试(口径见台账)。
  • 测试 新增 8 格;npm test ⇒ 128 格全绿(改前基线 120),T1 npm run test-mysql rc=0。 既有断言零改动:__tests__/spec.test.ts numstat 210 增 0 删。
  • 变异对照两层:processTime 直接返回 now ⇒ 6 红;摘掉 :303 ⇒ 正格红在「第二成员必须带到期时间(实得 undefined)」。
  • 跨栈一致性(同批八栈一起发,基准=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 同题):本栈落点比 java 多——门面把"我是谁"作位置参下发(java 下发 t.operator EQ 条件),且内存仓与 SQL 仓两套实现,只修门面会 T0 绿而生产红、只修一套会同栈两仓结论不同。
    • 门面(13 处):新增 operatorArg() 替换 12 处 String(args.operator ?? 'user1');surrogatePage 的 args.operator != null 让 "" 与缺键走两支(JDBC 出 0 行 / 内存仓丢条件出全库)⇒ 按同档原则并成"不带归属过滤"(java 该 action 本就不下发归属条件,已核 JeeflowFacade.surrogatePage,故回落点不是 user1)。
    • 内存仓:if (operator && …) 四处真值判据(issues/129 §2 点名的 src/memory.ts:273 即 doneList 那句)⇒ ownershipKey():空/全空白 ⇒ 空页;matchConditions 在原有通用放行之前插归属兜底。
    • SQL 仓:jdbc/shared.ts 的 if (val == null || val === '') continue 与 jdbc/ext.ts 同形 ⇒ 归属列空值改判 AND 1=0;三个位置参入口空值直接返回空页不取连接。只收 EQ 归属列(OWNERSHIP_COLUMNS 收在 src/spi.ts 一处,两仓共用),m_LIKE_* 可选放行不动。
  • 测试 npm test 120/120(基线 113 + 新 7 件:四出口三档并排、行集级负向"不得等于全库/不得等于别人的档"、仓储层 4 归属列 × 3 空值 × 4 分页 = 48 格全 0、SQL 零连接探针带反闸、processSurrogate/page 同档、issues/114 回归);npm run typecheck 干净;spec.test.ts diff 零删除行 ⇒ 既有断言与期望值未动。
  • 变异对照两发互不遮蔽:只回退门面 ⇒ 3 红({"operator":""} 应与缺键同档,实读 0 vs 3);只回退仓储 ⇒ 4 红(pageInstances 归属值 "" ⇒ 空页,实读 8=全库症状在仓储层复现);七文件按 sha256 还原后 120/120。
  • 线上复验:160 demo 部署 v1.8.32 后四出口空串档 = 4 / 5 / 1 / 2(修前 25 / 46 / 24 / 9)。
  • 发版核验:npm view @mldong/jeeflow@1.8.32 命中;CI Release + Verify Release(registry 轮询 + 干净目录 npm i 断版本)绿。

v1.8.31 — 2026-09-28 ​

  • 修复(issues/133 第一半 · 可空时间列出口形态):processInstance/detail.tasks[] 与 approvalRecord 的可空时间列在空值时出 '',与规范 06-facade.md:93「空值返回 null」不符——前端 new Date('') 得 Invalid Date,跨栈同字段其余七栈出 null。本栈改为 null(全局剥 null 的 SmartNullStrippingInterceptor 是框架侧问题,已在 mldong-nestjs 侧单独修,与本条无关)。
  • 测试:__tests__/spec.test.ts 新增形状件(空值 ⇒ 键存在且为 null,且同响应内必然为 null 的同源字段作内部对照,防"HTTP 层缺键≠没投影"式误判);变异对照:还原 '' ⇒ 件红。npm 回拉 1.8.31。
  • 本栈第二半(整键缺失那一半)作废留痕:立案时按"boot 系时间列恒出键"推断需要引擎补齐,复核发现规范根本没承诺 approvalRecord / detail.tasks 携带这三个时间键 ⇒ 该半撤回,spec 不改,各栈不动(见 jeeflow-hub/issues/133)。

v1.8.30 — 2026-09-24 ​

  • 变更(issues/124 变量出口立法,对齐 Java v1.8.30 基准):processInstance/detail 出口 variables 更名为 ext(inst.variables ?? {},键形态与列表行一致),variable / instanceVariable 原串退出门面出口;唯一出口 = ext(实例侧)+ instanceExt(任务行侧),空变量出 {};持久层 variable 列不动。
  • 测试 存量断言改读 .ext(issues/115 两格 approvalRecord 行 + jdbc 传输三格;SQL 列读取不动),113/113 绿;npm 与 npmmirror 双 registry 回拉 1.8.30。

v1.8.29 — 2026-09-23 ​

  • 修复(issues/122 收口补链,推翻 v1.8.28 里"instanceDetail 不在本版口径内"的划线):复核"同一函数覆盖的其它可空列"时新写的全链扫描用例当场抓到 instanceDetail 绕过了 fmtTime——data.tasks[].{finishTime,expireTime,createTime,updateTime} 与 data.createTime 是裸 Date/undefined,序列化成 ISO 串(不是规范 06 §2.4 的 yyyy-MM-dd HH:mm:ss)或整键消失(经下游剥-null 拦截器)。修法是把归一下沉:fmtTime 空值统一出 ''、返回类型收口为 string,approvalRecord 那处手工 ?? '' 撤掉,instanceDetail 五个时间列改走 fmtTime。
  • 测试 T0:npm test 113/113(+1 用例)、npm run test-mysql 17/17。变异对照(fmtTime 空值改回 return null)⇒ 恰好 issues/122 两格红 111/113,还原后复绿。
  • CI(发版机制补真):release.yml 此前只到 Publish to npm 就结束,"CI 绿"只等于上传命令退 0。新增 verify 步:轮询公共 registry 到可拉 + 干净目录 npm i @mldong/jeeflow@<ver> 并断言 package.json 版本 + import 成功。首跑即抓到真问题:版本 URL 已 200,紧接着 npm i 仍 ETARGET(packument 元数据比版本 URL 晚几秒)⇒ 改成"URL 与安装各带一轮重试"后转绿。
  • 发版 tag v1.8.29 → Verify Release master success,逐字三条:✅ …/1.8.29 已可拉 → ✅ 干净目录 npm i 成功 → ✅ import @mldong/jeeflow 成功,版本 1.8.29。
  • 跨栈验证 nestjs 壳 pin 1.8.29(package.json/package-lock.json/pnpm-lock.yaml 三处都落)→ base+1 → 强推 SYNC 7a7c8791 → 候选镜像 → 门禁 PASS=31 FAIL=1(唯一红 L2-18=门禁夹具支间未清场,非引擎缺陷);出口形状格 L2-16 record_row_keys 13 栈 0 分叉(同一格的 traces.ledger_time_raw 叶子另有 1 条比较器假红:它按相等比墙上写入时刻,而 13 栈串行跑批极差 150 分钟,形状 13/13 合规)。中途一次假阻塞:刷锁走 registry.npmmirror.com,镜像站比 npmjs 晚约 4 分钟同步,第一跑因此 ETARGET 停在半路。

v1.8.28 — 2026-09-23 ​

  • 修复(委托判据取行顺序,对齐 Java 参考实现):新增 src/surrogate-rule.ts 作单一事实源——surrogateIsEffective 单条裁决四判据(enabled 严格整数 1 / 被委托人非空且 !== operator / 窗口覆盖判定时刻,起止 null = 该侧不限、at=null 不比窗),newestOf + 内存仓(memory-ext.ts)与 SQL 仓(jdbc/ext.ts)同调用:各作用域先按 id 取最新一条(SQL ORDER BY id DESC LIMIT 1 不带 enabled / 窗口 / 自委托谓词)再交裁决。同层内判否不复活更旧那条;精确作用域判否(含池空)后仍看全流程作用域最新一条。夹具 __tests__/surrparity.ts 参考答案模型同步升级成两层择优 adjudicate(),自证计数器改「兜底命中 ≥1」(挂错分支的计数器永远数不到)。
  • 修复(出口文案统一):退回上一步两格对外 msg 删 20010007: / 20010008: 码前缀,改 Java 逐字中文文案(src/engine.ts 两格 throw + 源码注释更正「对外 msg 用固定中文文案、不含引擎内部码」);__tests__/spec.test.ts 四处 assert.rejects 由正则改谓词函数并加反闸「不含 2001000」——单纯 includes(文案) 对带前缀的旧文案恒绿,抓不到这类回归。
  • 修复(可空时间列出键):approvalRecord 行的 finishTime 空值由 null 改出 ''(fmtTime(t.finishTime) ?? ''),与 Java 系 record 行同形。此前引擎确实投了该键、值为 null,但集成侧(NestJS 栈)全局「剥 null 值键」的序列化拦截器在对象字面量出口拿不到保留元数据 ⇒ 整键被删,前端拿不到该字段;出 '' 后键不再被吞。同函数覆盖的委托行出口与任务行 taskRowToMap 一并复核(无同类丢键);instanceDetail 任务行的空值形状跨栈本就分叉(省略 null 时间键),不在本版口径内。
  • 测试 T0:npm test 112/112;npm run test-mysql 17/17(本机 MySQL)。
  • 变异对照 ① 把内存仓兜底那一行改成 null ⇒ 107/112(正向格、判据 a~d、乱序取最大、判别力夹具、兜底格五格齐红);② 摘掉 ?? '' ⇒ # fail 1。均还原后复绿。
  • 跨栈验证 13 个集成栈候选镜像门禁对拍:委托判据格 L2-17 全绿(13/13,nestjs 栈同判),13 栈逐格 0 分叉;L2-18 13 栈同形同错=门禁夹具支间未清场,非引擎缺陷。

v1.8.27 — 2026-09-22 ​

09-22 夜发版轮(issues/120 时钟基座 + issues/121 P1/P2 血缘回退)Node 侧代次;tag v1.8.27(19:26),bump commit 2a0371d。

  • 新增(121 P1):建单写 parentTaskId 与行级 isFirstTaskNode,门面读时行上值优先(9cf1678); 引擎控制键不算「任务变量非空」,P1 不打断 ext 回退实例变量(9c6ae3e)。
  • 变更(121 P2):退回上一步改血缘版(f06b633);submitType 3/6 口径拆开(d3a058e)。
  • 测试(判别力补齐):无血缘补到三种数据形状,其中**"parent 指不到真实行"那一格才可杀住"静默不建单"**(b64fb0b); 委托条款 1.1 / 覆盖范围 / 1.4 乱序夹具三处补齐判别力(49a85aa)。
  • 新增(issues/116 批次 D):委托代理自动生效内置默认开启 + 审计补齐 4 处(418fbd7)。
  • 发版核验:npm view @mldong/jeeflow@1.8.27 人工核到;该仓 release workflow 的 verify 步在 1.8.29 那轮才补 (补上首跑就抓到"版本 URL 已 200 但 npm i 仍 ETARGET"的传播尾,见 v1.8.29 节)。

v1.8.26 — 2026-09-09 ​

  • 修复 五语言 SQL 仓聚合水合:findInstanceById 构造 ProcessInstance 时硬编码 tasks: [],门面 processInstance/detail 的 tasks/activeTaskList 恒空(gate26 L2-12 门禁真根因,非会签语义)。二次查 wf_process_task(复用 findHistoryTasks:ORDER BY id ASC + 批查 ActorIDs,事务内经 c()/txStore 复用连接)水合任务副本,语义对齐 Java findTasksByInstanceId / PHP PdoProcessRepository / C# FindTasksInternalAsync(聚合水合口径)。updateTaskWithConn 按 task.id 幂等 UPDATE(无 INSERT / 不改 actor),水合后 withdraw 回写与 Java 同构。memory 仓本就水合(基线正确,未动);引擎核心会签语义未动。
  • 测试 T0 新增「SQL 仓 findInstanceById 水合任务 → detail 任务列表非空」(jdbc.test.ts,mysql/postgres 双库);全绿。
  • 集成栈 mldong-nestjs-jeeflow 源码同判缺陷已修(本批不发集成门禁——nest 不在 P3 范围,无集成仓 gate;实证待 L0 恢复后补)。

v1.8.25 — 2026-09-04 ​

  • 新增 CC_CREATE 抄送知会事件(六语言统一缺口 Node 栈;未单独发 1.8.24,随本版发布)。
  • 新增 stats 三 action(processInstance/stats/overview|trend|group)落地。
  • 修复 stats 契约对齐 A–E 验收。
  • 修复 fireEvent 单监听器异常兜底(P2,一个监听器异常不打断其余)。

v1.8.23 — 2026-09-01 ​

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

v1.8.22 — 2026-08-31 ​

  • 修复:execute 不再覆盖实例 u_*——以 start 注入的发起人 u_* 为底、仅并入非 u_* 键(helper mergeExecIntoInstance)。实例 u_realName 恒为发起人,对齐 Java 基准。

v1.8.21 — 2026-08-30 ​

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

v1.8.20 — 2026-08-24 ​

  • 修复 会签一票否决条件化 + merged 废弃残留任务(五语言对齐内置引擎);串行会签无 Node 变更(实现本就正确)。

v1.8.19 — 2026-08-23 ​

  • 修复–82 门面字段级契约批次(五语言)Node 部分:processSurrogate 补 update / detail、candidatePage 行键归一、listByType 补 processDefineState、id 精度守卫(toId,float64 超 2^53 显性报错)、委托修复、submitType 门面行为 + 抄送空 actors → 99999999 测试。

v1.8.18 — 2026-08-16 ​

  • 修复:FormFieldAssigneeHandler.findFieldValue 增加 f_ 前缀优先匹配(对齐 Java 1.8.11)。

v1.8.17 — 2026-08-15 ​

  • 修复:mysql2 分页 LIMIT 改走 query(),占位符不再失败。

v1.8.16 — 2026-08-13 ​

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

v1.8.15 — 2026-08-09 ​

  • 变更(CI)为 CI 发布流水线做准备;无引擎行为变更。

v1.8.14 — 2026-08-09 ​

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

v1.8.13 — 2026-08-09 ​

  • 新增:registerPersistMeta 注册助手,集成方一行调用同步字典项与实例。
  • 变更 流程定义声明 postInterceptors 但注册表无实例时,发起 / 办理改为显式报错(原为静默跳过)。

v1.8.12 — 2026-08-08 ​

  • 改进 updateDefine / save / deploy 的 content 字段支持 string 与 JSON 对象双形态(四语言同批)。

v1.8.11 — 2026-08-06 ​

  • 修复:待办列表 display_name 列冲突;新建设计无 content 时生成默认内容快照(无法部署)。
  • 修复:会签任务 performType 落库(三端对齐 Java);撤回状态改为 Withdraw(30) 而非 Reject(45);发起时抄送 f_ccActors 创建抄送。

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

  • 无本语言行为变更(版本对齐)。

v1.8.8 — 2026-08-05 ​

  • 新增:nodeProgress 成员 name 经 UserProvider SPI 解析 realName,未注册或查不到时回退空串。

v1.8.7 — 2026-08-05 ​

  • 修复:performType 增加字符串兼容('ALL' / 'COUNTERSIGN')。

v1.8.6 — 2026-08-05 ​

  • 新增:highLight 新增 nodeProgress——会签节点成员进度、普通节点历史与进行中状态。

v1.8.5 — 2026-08-05 ​

  • 修复 E9:引擎 id 全程改为字符串承载,修复雪花 id(>2^53)精度丢失;MySQL 连接池需 supportBigNumbers + bigNumberStrings;审计用户列防御 BIGINT(createUser/updateUser 读回 rowId() 归一化)。

v1.8.4 — 2026-08-05 ​

  • 新增:流程定义级 postInterceptors 声明与拦截器注册表,未声明的流程不触发,与 Java 语义一致。
  • 新增 三门下沉:processDesign/listByType、processInstance/bizData、updateDefine 顶层 JSON 兼容、remove / upAndDown 批量。
  • 修复:包导出面补齐。

v1.8.3 — 2026-08-04 ​

  • 无本语言行为变更(版本对齐;– 为 Java 侧随版,三门于 1.8.4 对齐)。

v1.8.2 — 2026-08-04 ​

  • 修复:SYNC 字段权限语义同步(办理入口过滤,上游只读不可绕过)。

v1.8.1 — 2026-08-04 ​

  • 修复:SYNC 字段权限键兼容前端 PERMISSION_f_ 约定。

v1.8.0 — 2026-08-04 ​

  • 新增:persistMode 双模式(ARCHIVE / SYNC 同步演进)闭环——任务节点级字段权限、状态字段写入、tf_ 去前缀、幂等节点级、子表递归、MetaTableWriter.update。

v1.7.0 — 2026-08-04 ​

  • 新增:元数据驱动的动态写入 / 读取规范(src/persist.ts)。

v1.6.6 — 2026-08-04 ​

  • 修复:persist 表结构探测 schema 限定。

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 ​

  • 新增:业务数据通用入库 src/persist.ts + PersistPostInterceptor。

v1.6.1 / v1.6.0 — 2026-08-04 ​

  • 新增(四语言同构):表单数据契约、IOrgUserProvider SPI、7 个内置参与者处理器、candidatePage 双源、assign 增加 operator 参数。

v1.5.1 — 2026-08-03 ​

  • 新增:processDesign/redeploy、updateDefine、update + 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 / v1.1.0 — 2026-08-02 ​

  • 新增 视图端点补齐 + IUserSearchProvider;管理扩展三表 + IProcessExtRepository + 统一门面(四语言同构)。

v1.0.0 — 2026-08-01 ​

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

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