- tests/test_m11b1a_ddl_runtime.py(15489B, +2020B): layer_a() 新增 A8 组 5 条真实断言 1) append_only_sql 过程体非法 RETURN 检出数==0(根因形态) 2) full_script 全文 ^\\s*RETURN 命中==0 3) 守卫未弱化: SIGNAL SQLSTATE 45000 >=3 + IF p_table + BEFORE UPDATE/DELETE 在位 4) DELIMITER 配对完整(_delimiter_integrity_errors 零错, $$ / ; 均在产物) 5) 门禁自检: 还原 RETURN; 坏样本必须被 _procedure_body_return_errors 检出(防永真假门禁) - tests/evidence/rtx0005_round3_localdb_run_20260922.txt: run_m11b1a_localdb.sh 原样落盘 rc=0, 34 项 PASS 34 FAIL 0(DDL 装载 rc=0 无 1064, 分区 7->11, prune 保 pmax, UPDATE/DELETE 被拒) - tests/evidence/rtx0005_round3_gate_regression_20260922.txt: --verify rc=0 / pytest 9 passed / selftest 110 PASS 0 FAIL / 产物 grep RETURN=0,五段带 EXIT_CODE 原样输出 - docs/work-log-2026-09-22-rtx0005-round3.md: 本轮改动点与实跑结果归档 - 选择性 git add 4 项(未使用 git add -A);scripts/ 修复本体工作树与 HEAD 无差异, 其入库在前序 dfffebb(引擎代收口),本轮不制造虚假差异
84 lines
6.2 KiB
Markdown
84 lines
6.2 KiB
Markdown
# 工作日志 · 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),无需拆分。
|