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

6.2 KiB
Raw Permalink Blame History

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