| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
fix(core,repository-pdo): issues/137 §3-6 删除腿收口为「原值 ∪ trim 值」两形并集(php) owner 2026-10-02 拍「两形并集」(原裁定 A「只丢空值、不 trim 非空值」的前提被普查推翻后改判, 详见 java 基准腿 c48a6ba 与 doc 369c02a/1d4af72):删除值同时以「原值」与「trim 值」两形 参与匹配,空值一律丢弃,并集为空则早退。 本栈改前属 **trim 派**(两仓 removeTaskActor 都过 CcActorUtil::normalizeActors,内存仓还在 array_filter 里对库值额外 trim())⇒ 门面按语义 6 交出的历史脏行原值 " 9101 " 被削成 9101, 真库 NO PAD 排序规则下 actor_id = '9101' 打不中 ' 9101 ' 那一行,删不掉而门面报成功 ——**被摘的人待办还在**,spec 语义 6 在本栈只是名义成立。改后两形都带。 - CcActorUtil::deleteForms:删除腿单点。trim 与判空**复用既有元素级判据 toActorId() 那一枚**, 只加"原值也进集合"这一层,**没抄第二份**(spec §2.11 尾注)。去重一律 in_array(..., true) **严格**比较——松散比较在 PHP 8 把数字串按数值比,'0' == '00' 会静默丢掉第二个人 (issues/141 G2 在本栈的实测踩点);判空严禁无回调 array_filter(会吃掉 '0')。 - 顺带把入参形态收敛抽成私有 itemsOf(),由 normalizeActors() 与 deleteForms() **共用一枚** (纯重构、行为逐字等价:三条分支逐一核对,全量 626 绿为证)。 - 两仓 removeTaskActor 改走 deleteForms + $forms === [] 早退;**内存仓库值侧去掉 trim()** 改按字面严格比(并集已在入参侧覆盖两形,库值再 trim 会让"删脏行"这件事照不出来、也让两仓分叉); 删掉原有死变量 $known。PDO 腿保留既有 N 条 DELETE ... actor_id = ? 形状(免动态拼占位符), 删除集合与 java 的单条 IN (...) 逐字等价。 - ProcessRepositoryInterface::removeTaskActor 注释按 §2.11「SPI 注释义务」改写为删除腿三件事, 明写**与 addTaskActor 写侧义务不同、别照抄**,并列出八栈同名件。 - JeeflowFacade::taskRemoveActor 的注释**纯改写、零行为改动**:旧注释断言「本栈还差半截、 PDO 仓本轮不动、真库上未 trim 历史行仍删不掉」,已被本次改动直接证伪,留着就是假账。 新注释讲清分工:门面只管交出**行上原值**(=并集的原值形那一份),trim 形由仓储补, **门面侧不要先 trim 掉**。 新增 tests/Core/TaskActorDeleteFormsTest.php **20 格**(单点纯函数 + 内存仓删除腿) + tests/RepositoryPDO/PdoSqliteTaskActorDeleteFormsTest.php **13 格**(同批判据打在 sqlite::memory: 上,断言一律 SELECT actor_id ... ORDER BY ROWID **直查库列值**, 脏行直插 INSERT 绕开写侧归一;含两仓同答案格,issues/117 场景 27)。 改前红样三组(tmp/mutation-php-deleteforms/,字节级 cp 备份 → 精确 str_replace(锚点非唯一即 exit 3) → 跑测试 → copyback → sha256sum -c): · A 单点还原成只产 trim 形(=改前形状)⇒ **16 红**,铁证是两仓同名格 testUntrimmedLegacyRowIsDeletedByItsRawForm 打出 -'leader' / +' 9101 ' +'leader'—— 正是 php 改前那个"门面报成功、脏行还在"的假成功; · **B 单点只产原值形(=owner A 案字面形状)⇒ 15 红,其中一条是既有的 TaskActorBlankDroppedTest::testRemoveTaskActorTrimsMatchAndBlankListIsNoOp(142 B 批已发版格)** ——这就是"按 A 字面执行必须反向改既有测试"的实测证据,也是改判并集的理由; · C 两仓还原裸传 ⇒ 14 红,含两仓 testBlankInputNeverDeletesEmptyActorIdDirtyRow 与 PDO 侧 testNullElementIsNeverStringifiedIntoAMatch。 三组 copyback 后 sha256sum -c 均 OK,收尾复跑 626 全绿。 读数(均我复跑非转述):php vendor/bin/phpunit **Tests: 626, Assertions: 4528, Skipped: 37** (改前基线 **593**——⚠️ 启动词/批二记的 575 已过期,本机实测 593;Skipped 37 与批二逐字相同, 是 127.0.0.1:3306 真库腿的环境性既有 skip,本轮未新增也未消除); 既有 TaskActorBlankDroppedTest+PdoSqliteTaskActorBlankTest **37 格全绿**、 RemoveTaskActor115Test **17 格 150 断言全绿**。既有测试期望值改动 **0 处**。 ⚠️ 两处与其它栈的**有意**差异(都不是疏漏,已在测试 docblock 明写): ① php 两仓签名是 array $actorIds + declare(strict_types=1) ⇒ 整个入参为 null 在仓储层是 TypeError 而不是"零删除",故「入参 null ⇒ 空数组」这一格钉在单点层(deleteForms(null) === []), 仓储层钉 []/全空白/含 null **元素**三形;未擅自放宽签名。 ② itemsOf() 对标量(int/bool/object)返回 [],而 python 的 actor_delete_forms 是 [raw] ——这是 php normalizeActors 的**既有**分叉(其 docblock 已注明"与引擎漏斗旧行为一致"), 选择复用同一枚而不是在 deleteForms 里另立第二套收敛;两仓签名是 array, 这一档从仓储路径不可达。 ③ 契约本身的一处残留(java 基准同形、已进 spec 1d4af72):并集覆盖的是**入参的两形**、 库值侧按字面比,故「调用方传已 trim 的 'leader' + 库里躺未 trim 的 ' leader '」仍不命中。 门面路径不受影响(交的是行上原值);旧 php 因两侧都 trim 恰好能吃下这一组合, 属**有意按裁定收窄**,不是回退。 | 4 天前 | |
fix(persist): MySQL information_schema 列名大小写兼容 Windows PDO Co-authored-by: Cursor <cursoragent@cursor.com> | 1 个月前 | |
feat(repository-pdo): §3-10 步骤③ schema-mysql.sql 副本改为编辑源逐字分发件+补 .gitattributes - 副本由手写 VARCHAR(64) 版换成 jeeflow-java 编辑源的逐字分发件:15 个 BIGINT id 列、14 条二级索引、 8 条表级 COMMENT、content 由 TEXT 变 BLOB 一起带入;与编辑源 diff 0 行(剥 CR 后逐字相同,与其余七栈同形) - 原副本首行那 58 行差异说明删除(差异已不存在),其中被实测确认为真的三条(IF NOT EXISTS 静默不生效、 1366 报错码、引擎侧 string 绑定/strId 归正/stringifyIds 三处等价)迁进 scripts/sync-schema.sh 的纳入注释留档 - 首行"对齐 Java schema-mysql.sql"这句自 08-11 起假了 50 天(09-30 才诚实化标注),本轮起变成真的 - 本仓此前无 .gitattributes,按 rust/csharp 同形补 *.sql text eol=lf(只加这一条,不动其它行尾规则); 现读两份 .sql 的 blob CR 字节数均为 0 ⇒ 不触发重规范化、零行尾漂移 - gate:分发幂等复跑后其余七仓 git status 全干净、只有本仓副本按预期变更; REQUIRE_MYSQL=1 全量 640 tests 4832 assertions Skipped 0 | 4 天前 | |
fix(web-contract): issues/137 §3-1 门面出口固定文案「流程处理失败」+判别式五条(php) owner 2026-10-02 第 3 问拍 A(措辞就用 流程处理失败,进第八条逐字契约文本)、第 4 问拍 A (isForeignDetail 判别式推其余七栈)。spec 先行已落(doc 56f359e 新开 §2.12),本栈照它落地。 改前两处泄漏: - JeeflowFacade.php:163 门面顶层出口 $this->error($e->getMessage() ?: (string) $e)—— 任何异常的 message 都原样外透,且 ?: (string) $e 那个兜底会吐出**完整类型名+栈**,比 message 更严重; - :891 bizData 腿 '业务数据读取失败: ' . ($e->getMessage() ?: (string) $e)——把反射/驱动原文拼进了对外 msg (csharp 的同形状腿批二 dca1b33 已修,php 这处一直挂着)。 **普查结论(决定判据形状,本栈与 java 同病)**:packages/*/src/ 下 29 处 throw new—— JeeflowException 11 处(全部携带契约文案);裸 \RuntimeException 16 处,其中 **7 处携带中文契约文案** (ProcessInstance:429/434、ProcessTask:81/84/100、**ModelParser:70「读取流程定义 JSON 失败」**、 门面 requireExt:1742「未接入 IProcessExtRepository…」),另 8 处是 persist 包英文 persist: ... 内部文案; 裸 \InvalidArgumentException 3 处(门面 idListArgs:2174/2179/2185「id 缺失或非法」,全部契约文案)。 ⇒ **契约文案不是全走 JeeflowException**,一刀切"只透契约异常族"会静默改写契约面且没人报警 (spec §2.12 点名的正是这个坑)⇒ 判别式必须落满 java 同款五条。 - JeeflowFacade::INTERNAL_FAILURE_MSG = '流程处理失败'(逐字,八栈同一串)。 - JeeflowFacade::isForeignDetail(type, message, cause, trace, file = null) 纯函数,五条按序: ① message null/空串 ⇒ 内部;② is_a($type, JeeflowException::class) ⇒ 逐字透出; ③ message 恰等于 cause 原文或 (string) $cause(裸包装两形)⇒ 内部; ④ runtimeInternal():\Error 全族(含 TypeError/ValueError/DivisionByZeroError, 即 java NPE/NumberFormat/CCE 的本栈等价)+ \PDOException(**它继承 RuntimeException 必须单列**, 否则会被 ② 的祖先判断误放)+ \JsonException + \ReflectionException; ⑤ thrownInsideEngine():trace[0]['class'](或命名空间函数名)前缀 Jeeflow\ 且非 Jeeflow\Tests\。 ⚠️ 比 java 多第 5 参 ?string $file(默认 null,纯函数性质不变):实测 php 的 trace[0]['class'] 是抛出点**声明类**(继承方法也报声明类,与 java getClassName() 等价)可用, 但 **trace[0]['file'] 是调用方文件、不可用于归属** ⇒ 闭包/顶层抛出的兜底只能用 $e->getFile(), 已在方法 docblock 写明(不要照 java 的签名抄)。 - 顶层 catch:foreign ⇒ logInternalFailure($action, new JeeflowException(INTERNAL_FAILURE_MSG, 99999999, $e)) (原文进 error_log + getPrevious() 链)→ error(INTERNAL_FAILURE_MSG); 非 foreign ⇒ error($e->getMessage()),**旧的 ?: (string) $e 兜底一并删除**。 logInternalFailure 是 protected 的副作用单点 ⇒ 文案判据与副作用各自可测(测试子类覆写捕获)。 - bizData 腿收成 error('业务数据读取失败') + 同款日志/previous。**前缀裁定有跨栈证据**(不是猜的): java JeeflowFacade.java:1469 与 csharp ActionsExt.cs:302 修后都是逐字 业务数据读取失败 (无冒号无原文)⇒ 该前缀本体是跨栈契约文案,保留前缀、删掉 : +原文拼接。 - 其余 grep 命中(ProcessPublisher:59、SurrogateInterceptor:101/138)已经是 error_log() 日志腿 ——原文进日志正是规范要求的去处,不改。web-psr 包零 catch/零 getMessage,干净。 - **未碰 ProcessRepositoryInterface**(SPI 接口成员零增加,与本仓既有纪律同账)。 新增 tests/WebContract/FacadeInternalErrorNoLeakTest.php **14 格 180 断言**: 负向 8 形状(TypeError/ValueError/DivisionByZeroError/空 message 的 \Error 兜底档/ JsonException/PDOException 的 SQLSTATE[...]/裸包装两形/第三方桩+匿名类), 每格断言 msg **逐字** 流程处理失败 + 原文片段不进 msg + **getPrevious() === 原异常对象** + error_log 临时文件含原文(ini_set 重定向捕获)——最后两条是防"把原文整个丢掉"也能绿的假修。 正向:JeeflowException 四文案逐字透出、requireExt/idListArgs 裸异常腿逐字透出、 ModelParser 真实 deploy 坏 JSON 腿逐字透出、spec 06 失败文案表五条 (operator 必填/任务不存在/任务非进行中,不可摘除参与人/至少需保留一名参与人/流程定义不存在) 逐字回归、bizData 腿 assertSame('业务数据读取失败') 且断言 msg 不含 :、 纯函数矩阵 22 断言(五条各钉两侧,含"引擎自己写文案再挂 cause ≠ 裸包装"这一反例)。 改前红样三组(tmp/mutate-31.py,字节级锚点唯一性校验 → 变异 → 跑 → copyback → sha256sum -c OK): · A 顶层还原 $e->getMessage() ?: (string)$e 直接外透 ⇒ **8 失败**(全部 8 个负向格红); · B isForeignDetail 恒 true(一律固定文案)⇒ **4 失败**(正向全红、负向全绿)—— 这一组正是"判据过宽会静默改写契约面"的实证; · C bizData 还原 '业务数据读取失败: '+原文 ⇒ **1 失败**(testBizDataLegSealsDriverText)。 读数(均我复跑非转述):php vendor/bin/phpunit ⇒ **Tests: 640, Assertions: 4708, Skipped: 37** (改前基线 **626**,626+14=640、4528+180=4708,Skipped 37 与基线逐字同=127.0.0.1:3306 真库腿的环境性既有 skip);新格 **14 tests / 180 assertions**;既有 115+142+§3-6 删除腿共 **87 格全绿**。 **既有测试期望值改动 0 处**(git diff --name-only 里零 tests/ 文件)。 行尾:JeeflowFacade.php 改后 **CRLF 2263 / totalLF 2263 / bareLF 0**,numstat 116 2 (删的 2 行恰是两条旧泄漏拼接行),非整文件重写。 ⚠️ 一条如实留档(本轮**有意不动**):persist 包那 8 处英文 persist: ... 裸 RuntimeException (含表名/列名等内部细节)按第 5 条会**逐字透出**——因为抛出点在 Jeeflow\Persist 引擎命名空间内。 这与 java 对"引擎自写 RuntimeException 文案"的处理完全一致(判据按**谁写的**判,不按**像不像内部细节**判), 但它确属"引擎写的内部味文案"。要收口得另立议题(要么把这些腿改成 JeeflowException 之外的内部档, 要么给第 5 条加"persist 包也算外部"的例外),**不在本轮范围**,先记着别当已修。 | 4 天前 | |
feat(E3): PSR-15 adapter + ResponseFactory + demo-slim + 八表 schema - web-psr: JeeflowRequestHandler (PSR-15) + ResponseFactory (nyholm/psr7) - demo-slim: Slim 4 参考 demo(预部署 3 个示例流程) - schema: 补全 wf_process_design/design_his/surrogate 三张扩展表 - tests: 9 PSR adapter 测试(路由/JSON解析/完整流程) - 186 tests, 694 assertions 全绿 | 1 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 4 天前 | ||
| 1 个月前 | ||
| 4 天前 | ||
| 4 天前 | ||
| 1 个月前 |