pbl_runtime_ext/docs/work-log-2026-09-22-rtx0005-round3.md
agent.develop d8664874cf test(PBL-RTX-0005): 测试本体补 A8 组回归断言并自提收口(响应 QC #25/#5)
- 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(引擎代收口),本轮不制造虚假差异
2026-09-22 17:01:19 +08:00

84 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 工作日志 · 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),无需拆分。