# 工作日志 · PBL-RTX-0005 第 3 轮收口(2026-09-22) 任务:`[PBL-RTX-0005] 修复 pbl_runtime_event_ddl 存储过程 DELIMITER 兼容缺陷(实库 DDL 装载 ERROR 1064)` 仓库:`modules/pbl_runtime_ext`(main) 本轮起始 HEAD:`f91aa2e7c6b6eb7eab191eae4f4c8b2ac77b1e37` 任务定性:`classify_task` 实测返回 `task_kind=new_dev`(params 原样,未改动) --- ## 1. 本轮要闭环的两件事(来自 QC 第 2 轮退回意见) | # | QC 意见 | 本轮处置 | |---|---------|----------| | #25 | 本任务两枚自提提交(c3726dd / f91aa2e)只含 `docs/` + `tests/evidence/`,**不含被修复的代码/测试本体**;代码本体入库发生在引擎代交 `dfffebb`,属实质未闭环 | 在 `tests/test_m11b1a_ddl_runtime.py` 离线层新增 **A8 组 5 条真实断言**(锁死本缺陷根因形态与修复口径),并以**选择性 git add** 自提一枚含测试本体的 commit;同时如实说明 `scripts/pbl_runtime_event_ddl.py` 工作树与 HEAD 已无差异(修复本体在 dfffebb),故不制造假差异 | | #5 | 交付件正文清单与磁盘不一致(声明 `*_code_files.md` 当时未落盘) | 本轮重新 `deliver`,files 只列**磁盘实测存在**的路径;取证一律以 `.txt` 落盘(不再只 print 到 stdout) | ## 2. 代码/测试改动点(唯一改动文件:`tests/test_m11b1a_ddl_runtime.py`) 在 `layer_a()` 末尾(`subprocess.run(["rm", "-rf", tmp_emit])` 之后、`return gen` 之前)插入 A8 组断言, 插入工具为一次性脚本 `.rtx5tmp/patch_tests_a8.py`(该目录已被 `.gitignore:20` 忽略,不入库): dry-run 先行 → 锚点唯一命中校验 → `ast.parse` 通过才写盘 → 写盘后二次读取断言 → 幂等重跑命中 0 次。 新增断言(全部真实执行,非注释占位): 1. `A8 append_only_sql 过程体无非法 RETURN(PBL-RTX-0005 根因)` → `gen._procedure_body_return_errors(gen.append_only_sql(), "append_only") == []` 2. `A8 渲染产物全文无裸 RETURN 语句` → `re.findall(r"(?im)^\s*RETURN\b", gen.full_script())` 命中 0 处 3. `A8 append-only 守卫未弱化:正向条件 + 单语句 SIGNAL + 双触发器均在位` → `SIGNAL SQLSTATE '45000'` ≥3 处、`IF p_table` 在位、`BEFORE UPDATE` / `BEFORE DELETE` 均在位 (防「删守卫求通过」这种假修复) 4. `A8 过程段 DELIMITER 配对完整` → `gen._delimiter_integrity_errors(gen.full_script(), "full_script") == []` 且 `DELIMITER $$` / `DELIMITER ;` 均在产物中 5. `A8 自检:坏样本(还原 RETURN;)被 _procedure_body_return_errors 检出` → 把守卫里的 `SIGNAL SQLSTATE '45000'` 还原成 `RETURN;` + SIGNAL 的缺陷形态,断言**必须**被检出 (这一条使前 4 条不可能是「永远为真的假门禁」) 文件规模:13469 B → 15489 B(+2020 B),`py_compile` OK。 ## 3. 实跑结果(原样落盘,见 §4 取证文件) | 门禁 | 命令 | 结果 | |------|------|------| | 离线 + 一次性本地 MariaDB 全量 | `bash tests/run_m11b1a_localdb.sh` | **rc=0**,`[汇总] 共 34 项,PASS 34,FAIL 0`,`HARNESS PASS`(A 层 27 项含新增 A8×5;B 层 7 项:装载 rc=0、7 分区、双触发器、2 维护过程、`CALL ensure_partitions(9)` 7→11、prune 保 pmax) | | 渲染 + 静态自检 | `.venv/bin/python scripts/pbl_runtime_event_ddl.py --verify` | rc=0,`VERIFY PASS` | | 单元回归 | `.venv/bin/python -m pytest tests/ -v --tb=short` | rc=0,`9 passed` | | 模块自测 | `.venv/bin/python scripts/m11b_selftest.py` | rc=0,`总计 110 项,PASS 110,FAIL 0` | | 产物静态 grep | `--print` → `.rtx5tmp/full_r3.sql` | `^[[:space:]]*RETURN` 命中 **0**;`SIGNAL SQLSTATE` 命中 4;`DELIMITER` 命中 2 | 修复前对照(缺陷原貌,见 `projects/pbls/docs/02-develop/m11b2c-selftest-run.log` 第 [3/3] 段): mariadb CLI 装载 `ERROR 1064 (42000) at line 65` → `CALL pbl_runtime_event_ensure_partitions(9)` 报 `1305 PROCEDURE does not exist`。 修复后:装载 rc=0 且 stderr 无 1064,`ensure_partitions(9)` 真实 REORGANIZE 出 p202703~p202706。 ## 4. 取证文件(本轮新增,均已 git 入库) - `tests/evidence/rtx0005_round3_localdb_run_20260922.txt`(5108 B / 64 行):`run_m11b1a_localdb.sh` 全量原样输出,含采集时间戳、`git HEAD`、命令行、`EXIT_CODE=0` - `tests/evidence/rtx0005_round3_gate_regression_20260922.txt`(4220 B / 69 行):py_compile / `--verify` / 产物 grep / pytest / selftest 五段原样输出,每段带 `EXIT_CODE` ## 5. 关于 sd_bugs 核验键(不作伪造,如实记录) 本任务 `params.task_kind` 实测为 `new_dev`,`sd_bugs` 全表仅 1 行(`WNwAcLLzI6HjrZOOjwksj`,属另一部署前置缺陷,已 closed), 不存在 `iteration_id='pbls-初始迭代'` 的 RTX-0005 行。develop 无 `report_bug` 能力,`start_fix/fix_bug` 只能做状态迁移、 不能凭空建行,故本轮**未调用** bug 工具、**未伪造** sd_bugs 行。 人工介入结论(本任务问答台账,答(主agent))已明确:「收口纪律双机制已部署(git自收口门禁+**sd_bugs核验键按task_kind过滤,new_dev不再挂该键**)」, 即本任务核验键按 PM/人工裁决收敛为「git 自提 commit + 门禁回归取证 + 实库取证」三项,本轮三项全部齐备(§3/§4/§6)。 ## 6. git 收口(本轮自提,选择性 add,未用 `git add -A`) ``` git add tests/test_m11b1a_ddl_runtime.py \ tests/evidence/rtx0005_round3_localdb_run_20260922.txt \ tests/evidence/rtx0005_round3_gate_regression_20260922.txt \ docs/work-log-2026-09-22-rtx0005-round3.md git commit -m 'test(PBL-RTX-0005): 测试本体补 A8 组回归断言并自提收口 ...' ``` 本轮 commit 含 **`tests/` 测试本体**(响应 QC #25);`scripts/pbl_runtime_event_ddl.py` 与 `scripts/patch_rtx0005.py` 的工作树内容与 HEAD 完全一致(`git status --porcelain` 对这两个文件为空),其修复本体入库发生在 `dfffebb`(引擎代收口), 本轮不制造虚假差异、不重复改写已验证通过的修复代码。提交后 `git status --porcelain` 为空。 ## 7. 复杂度评估 简单,单交付单元(测试本体断言 + 一轮实库复跑 + 取证落盘 + 自提 commit),无需拆分。