Appearance
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 §完成任务 与 javaexec.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 --test417/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。
- 修复(用户可感知):两个
redeployaction+两条仓储腿此前把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节点无法确定下一步执行路线(逐字=javaWfErrEnum.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.tsissues/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,裸名)并进求值原料, 照 rustgate_vars那一步;ONE_VOTE_VETO判定顺序不动。 - 同批:补"顶层优先、嵌套兜底"读取
properties.field子对象里的条件(设计器实际落笔处); demo 简易求值器吃#门控变量;nestjs 集成壳同批剥#前缀(宿主 SPI 优先于引擎内置件)。 - 用户可感知:按文档/设计器配阈值条件的并行会签,从"永远等满员"变成按阈值放行。
- 判据:T0
npm test255/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⇒ 那条边永不收录(通向当前待办的那根线在画布上不亮)。 现把收录挪进源节点出边循环、排在活跃判断之前,与 javaJeeflowFacade.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无告警;T0npm test251 pass / 0 fail;T1npm run test-mysql22 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 test244/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 test228/228 pass、npm run typecheckEXIT=0。
v1.8.35 — 2026-09-29
- 改造(issues/132):
EventType从旧 C 套0..5重排到 A 套1..9,其中TaskComplete4→5、CcCreate5→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 test151/0、npm run typecheck0;T1npm run test-mysql17/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 test136/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),T1npm run test-mysqlrc=0。 既有断言零改动:__tests__/spec.test.tsnumstat 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_*可选放行不动。
- 门面(13 处):新增
- 测试
npm test120/120(基线 113 + 新 7 件:四出口三档并排、行集级负向"不得等于全库/不得等于别人的档"、仓储层 4 归属列 × 3 空值 × 4 分页 = 48 格全 0、SQL 零连接探针带反闸、processSurrogate/page同档、issues/114 回归);npm run typecheck干净;spec.test.tsdiff 零删除行 ⇒ 既有断言与期望值未动。 - 变异对照两发互不遮蔽:只回退门面 ⇒ 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命中;CIRelease+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 test113/113(+1 用例)、npm run test-mysql17/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 mastersuccess,逐字三条:✅ …/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 → 强推 SYNC7a7c8791→ 候选镜像 → 门禁 PASS=31 FAIL=1(唯一红L2-18=门禁夹具支间未清场,非引擎缺陷);出口形状格L2-16 record_row_keys13 栈 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 取最新一条(SQLORDER 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 test112/112;npm run test-mysql17/17(本机 MySQL)。 - 变异对照 ① 把内存仓兜底那一行改成
null⇒ 107/112(正向格、判据 a~d、乱序取最大、判别力夹具、兜底格五格齐红);② 摘掉?? ''⇒# fail 1。均还原后复绿。 - 跨栈验证 13 个集成栈候选镜像门禁对拍:委托判据格
L2-17全绿(13/13,nestjs 栈同判),13 栈逐格 0 分叉;L2-1813 栈同形同错=门禁夹具支间未清场,非引擎缺陷。
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);submitType3/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 复用连接)水合任务副本,语义对齐 JavafindTasksByInstanceId/ PHPPdoProcessRepository/ 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任务行落库之后 fireTaskCreate事件——此前「从不 fire」,新待办 TODO 事件整类缺失,messagePage 恒空;新待办 / 分支节点 / 退回重办 / 会签各子任务逐任务触发,对齐 JavaCreateTaskHandler时机。
v1.8.22 — 2026-08-31
- 修复:
execute不再覆盖实例u_*——以 start 注入的发起人u_*为底、仅并入非u_*键(helpermergeExecIntoInstance)。实例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
- 新增(四语言同构):表单数据契约、
IOrgUserProviderSPI、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。