test(PBL-RTX-0005): 核验性门禁回归取证入库(响应 QC #10)

- tests/evidence/rtx0005_gate_regression_20260922.txt(16767B): 本任务内重跑并原样落盘
  [1] pbl_runtime_event_ddl.py --verify rc=0(DELIMITER 配对/过程体无非法 RETURN/门禁自检坏样本可检出)
  [2] pytest tests/ rc=0 9 passed  [3] m11b_selftest.py rc=0 110 PASS 0 FAIL
- docs/work-log-2026-09-22-rtx0005.md: 追加 §7 第2轮收口——如实写明修复代码本体源自
  前序提交 dfffebb(引擎代为收口),本轮为取证/门禁/文档收口,未重写修复代码;
  并记录 QC #9 sd_bugs 状态机实测不过(start_fix/fix_bug 均 FAIL: Bug 不存在)未伪造
- 选择性 git add 2 项,未使用 git add -A
This commit is contained in:
agent.develop 2026-09-22 15:24:50 +08:00
parent c3726ddd29
commit f91aa2e7c6
2 changed files with 211 additions and 0 deletions

View File

@ -94,3 +94,46 @@ SIGNAL SQLSTATE '45000' ...
2. `m11b_selftest.py` 的 `C. 真实库端到端` 段仍 SKIP(本工作空间无 ahserver/apppublic 运行时),
如实降级披露,未谎报;真实库行为由 §4 的沙箱取证与 `run_m11b1a_localdb.sh` B 段覆盖。
3. `--live` 段(验收 d)以独立一次性沙箱取证脚本形式补齐并落盘,未触碰项目 test/prod 库。
---
## 7. 第 2 轮收口(2026-09-22 15:17~15:26,响应 QC #8/#9/#10)
### 7.1 修复代码归属澄清(QC #10)
DELIMITER / 非法 `RETURN` 的**根因修复代码本体**来自前序提交 `dfffebb`(引擎代为收口,
含 `scripts/pbl_runtime_event_ddl.py` +139、`scripts/patch_rtx0005.py` 新增 231、
`tests/evidence/rtx0005_live_evidence.py` 新增 186、`tests/test_m11b1a_ddl_runtime.py` +29、
`sql/migrations/20260919_m11b_02|03`、`sql/m11b_partitions.sql`)。
上一轮 agent 自署名提交 `c3726dd` 只含 docs + evidence .txt(+98/-2)。
本轮**不声称重写了修复代码**,而是在本任务内做一次显式的**核验性提交**:把修复代码的
回归门禁结果原样落盘并入库 —— `tests/evidence/rtx0005_gate_regression_20260922.txt`(16767B)。
### 7.2 核验性门禁回归(原样输出已落盘,HEAD=c3726dd,15:22:32 +0800)
| 段 | 命令 | rc | 关键行 |
|---|---|---|---|
| [1] | `.venv/bin/python scripts/pbl_runtime_event_ddl.py --verify` | 0 | `PASS DELIMITER 语句完整性: 4 个产物 DELIMITER 配对正确、27 个 $$ 段首关键字完整、无裸 CREATE$$/DROP$$ 残缺行`;`PASS 过程体无非法 RETURN(PBL-RTX-0005 门禁)…append-only 守卫完整保留`;`PASS 非法 RETURN 门禁自检:坏样本(含 RETURN;)被检出 1 条、好样本(修复后守卫)零误报`;末行 `VERIFY PASS` |
| [2] | `.venv/bin/python -m pytest tests/ -v --tb=short` | 0 | `collected 9 items` / `9 passed in 0.40s` |
| [3] | `.venv/bin/python scripts/m11b_selftest.py` | 0 | `总计 110 项,PASS 110,FAIL 0` / `RESULT: PASS` |
另本轮重跑 `bash tests/run_m11b1a_localdb.sh` → rc=0,`[汇总] 共 29 项,PASS 29,FAIL 0` /
`HARNESS PASS`;[B] 实库层 B1「分区 7 个 / 维护过程 2 个 / 触发器 2 个」、B3
`CALL ensure_partitions(9)` 分区 7→11、B4 prune DROP p202001 剩余 11 个。
### 7.3 git 收口(QC #8)
- 本模块仓:选择性 `git add tests/evidence/rtx0005_gate_regression_20260922.txt docs/work-log-2026-09-22-rtx0005.md`(禁 -A)+ commit(Author=agent.develop)。
- `projects/pbls` 仓:逐项 add `docs/02-develop/dev-notes-rtx0005-ddl-1064-fix.md`、
`m11b2c-localdb-fix-run.log`、`dev-notes-rtx0005-round2-closure.md`;
越界改动 `m5b-four-types-wip.patch` 已 `git checkout --` 回滚(6537B 复原,porcelain 为空);
其余未跟踪文件(deliverables/*、m5a-*、m11b2c-anchor2-*)不属本任务,未 add、未删,如实声明。
### 7.4 sd_bugs 状态机(QC #9)实测不过,未伪造
`start_fix('PBL-RTX-0005')` → `FAIL: Bug 不存在`;`fix_bug('PBL-RTX-0005')` → `FAIL: Bug 不存在`;
`query_project_data(sd_bugs)` 全表 1 行(2026-09-18 无关 closed 部署前置 Bug)。
start_fix/fix_bug 只做状态迁移不建行,develop 无 report_bug 能力,且 classify_task 依 PM
params 判定 `task_kind=new_dev`。需 PM 先在 sd_bugs 登记本缺陷行(iteration_id='pbls-初始迭代')
并把 task_kind 改 `bug_fix`,或将本任务交付本体认定为「代码 + 门禁回归 + 实库取证」。
详见 `projects/pbls/docs/02-develop/dev-notes-rtx0005-round2-closure.md` §3。

View File

@ -0,0 +1,168 @@
=== PBL-RTX-0005 核验性门禁回归取证(响应 QC #10)===
时间: 2026-09-22 15:22:32 +0800
git HEAD: c3726dd branch: main
说明: 修复代码本体源自前序提交 dfffebb;本文件为本任务内的显式核验性提交——重跑 verify() 静态门禁 + 全套回归,证明 DELIMITER/RETURN 缺陷已闭环且未复发。
--- [1] python scripts/pbl_runtime_event_ddl.py --verify ---
PASS 任务书字段齐备: id,tenant_id,event_uid,event_code,idem_key,world_id,scene_id,session_id,entity_id,actor_id,event_type,payload,payload_json,causation_id,seq,seq_no,source,state,state_version,tx_group,broadcast,created_by,created_at,updated_at,occurred_at
PASS 物理主键=id,created_at(逻辑主键 id + 分区键)
PASS 唯一键均含分区键: uk_event_uid,uk_tenant_idem
PASS 存在 (scene_id, created_at) 复合索引 ix_scene_created
PASS 存在 event_uid 唯一索引 uk_event_uid
PASS 预建 6 个月分区: p202609,p202610,p202611,p202612,p202701,p202702 + pmax(MAXVALUE)
PASS 分区键类型 DATETIME(非 TIMESTAMP)
PASS append-only: BEFORE UPDATE + BEFORE DELETE + pbl_assert_append_only()
PASS 覆盖 M11a/M11b 写路径全部列名(23 个)
PASS 幂等:IF NOT EXISTS + DROP ... IF EXISTS + 分区存在性判断
PASS DELIMITER 语句完整性: 4 个产物 DELIMITER 配对正确、27 个 $$ 段首关键字完整、无裸 CREATE$$/DROP$$ 残缺行
PASS 幂等关键字逐文件覆盖: 01 建表分区 / 02 过程+双触发器 / 03 双过程+EVENT
PASS 过程体无非法 RETURN(PBL-RTX-0005 门禁): 4 个产物的过程/触发器体均为等价正向条件单语句 SIGNAL,append-only 守卫完整保留
PASS 非法 RETURN 门禁自检:坏样本(含 RETURN;)被检出 1 条、好样本(修复后守卫)零误报
VERIFY PASS
RC_VERIFY=0
--- [2] .venv/bin/python -m pytest tests/ -v --tb=short ---
============================= test session starts ==============================
platform linux -- Python 3.10.12, pytest-9.1.1, pluggy-1.6.0 -- /d/pipeline/workspaces/0/sdlc_general/modules/pbl_runtime_ext/.venv/bin/python
cachedir: .pytest_cache
rootdir: /d/pipeline/workspaces/0/sdlc_general/modules/pbl_runtime_ext
configfile: pyproject.toml
collecting ... collected 9 items
tests/test_m11b2c_runtime_ext.py::test_t1_ddl_offline_harness_all_pass PASSED [ 11%]
tests/test_m11b2c_runtime_ext.py::test_t1b_ddl_baseline_sha256_matches PASSED [ 22%]
tests/test_m11b2c_runtime_ext.py::test_t2_selftest_offline_all_pass PASSED [ 33%]
tests/test_m11b2c_runtime_ext.py::test_t2b_three_place_sync_for_m11b_contracts PASSED [ 44%]
tests/test_m11b2c_runtime_ext.py::test_t3_selftest_memory_engine_end_to_end PASSED [ 55%]
tests/test_m11b2c_runtime_ext.py::test_t3b_state_conflict_rolls_back_cleanly PASSED [ 66%]
tests/test_m11b2c_runtime_ext.py::test_t4_p99_write_event_with_state_within_sla PASSED [ 77%]
tests/test_m11b2c_runtime_ext.py::test_t4b_p99_read_entity_state_within_sla PASSED [ 88%]
tests/test_m11b2c_runtime_ext.py::test_t4c_probe_runs_and_discloses_environment_limit PASSED [100%]
============================== 9 passed in 0.47s ===============================
RC_PYTEST=0
--- [3] .venv/bin/python scripts/m11b_selftest.py ---
--- A. 离线单元 ---
partitions | partitions PASS:跨年命名 ['p202611', 'p202612', PASS partitions PASS:跨年命名 ['p202611', 'p202612', 'p202701', 'p202702']
partitions | partitions PASS:下月边界 2027-01-01 PASS partitions PASS:下月边界 2027-01-01
partitions | partitions PASS:已存在分区 skip、缺失分区 add PASS partitions PASS:已存在分区 skip、缺失分区 add
partitions | partitions PASS:DDL ALTER TABLE pbl_runtime PASS partitions PASS:DDL ALTER TABLE pbl_runtime_event ADD PARTITION (PARTITION p202602 VALUES LESS THAN (DATE'2026-03-01'))
partitions | partitions.self_check PASS PASS partitions.self_check PASS
partitions.self_check 整体 PASS
broadcast | broadcast PASS:after_cursor=4 只回 1 条 PASS broadcast PASS:after_cursor=4 只回 1 条
broadcast | broadcast PASS:环形缓冲溢出报 truncated=True PASS broadcast PASS:环形缓冲溢出报 truncated=True
broadcast | broadcast PASS:通道按 tenant.world 隔离 PASS broadcast PASS:通道按 tenant.world 隔离
broadcast | broadcast PASS:订阅者扇出成功 PASS broadcast PASS:订阅者扇出成功
broadcast | broadcast PASS:stats published=6 p95=0.018ms PASS broadcast PASS:stats published=6 p95=0.018ms 越界=0
broadcast | broadcast PASS:通道命名 pbl.world.7.1 PASS broadcast PASS:通道命名 pbl.world.7.1
broadcast | broadcast.self_check PASS PASS broadcast.self_check PASS
broadcast.self_check 整体 PASS
latency | latency PASS:裁决 120ms ≤ 200ms 未越界 PASS latency PASS:裁决 120ms ≤ 200ms 未越界
latency | latency PASS:裁决 450ms > 200ms 记越界 PASS latency PASS:裁决 450ms > 200ms 记越界
latency | latency PASS:summary avg=285.0 p95=450.0 breac PASS latency PASS:summary avg=285.0 p95=450.0 breaches=1
latency | latency PASS:轮询兜底 3000ms 已配置 PASS latency PASS:轮询兜底 3000ms 已配置
latency | latency PASS:p95=10 PASS latency PASS:p95=10
latency | latency PASS:Timer 实测 5.1ms PASS latency PASS:Timer 实测 5.1ms
latency | latency.self_check PASS PASS latency.self_check PASS
latency.self_check 整体 PASS
tx_write | tx_write PASS:幂等键同参同键、异参异键、≤32 字符(bebdba41666 PASS tx_write PASS:幂等键同参同键、异参异键、≤32 字符(bebdba416666…)
tx_write | tx_write PASS:client_event_id 原样透传(重放同键) PASS tx_write PASS:client_event_id 原样透传(重放同键)
tx_write | tx_write PASS:pbl_runtime_event 禁 UPDATE/DELE PASS tx_write PASS:pbl_runtime_event 禁 UPDATE/DELETE/TRUNCATE
tx_write | tx_write PASS:基表写保护生效(world 等 6 张) PASS tx_write PASS:基表写保护生效(world 等 6 张)
tx_write | tx_write PASS:pbl_runtime_event 用到的 13 列与 mod PASS tx_write PASS:pbl_runtime_event 用到的 13 列与 models 定义一致
tx_write | tx_write PASS:pbl_entity_state 用到的 9 列与 model PASS tx_write PASS:pbl_entity_state 用到的 9 列与 models 定义一致
tx_write | tx_write PASS:pbl_world_state_snapshot 用到的 9 PASS tx_write PASS:pbl_world_state_snapshot 用到的 9 列与 models 定义一致
tx_write | tx_write PASS:UPDATE SET 语义不误报缺 NOT NULL 列(PB PASS tx_write PASS:UPDATE SET 语义不误报缺 NOT NULL 列(PBL-RTX-0004 误报侧已闭环)
tx_write | tx_write PASS:INSERT 真缺列仍被 PBL-RTX-0004 拦下(fa PASS tx_write PASS:INSERT 真缺列仍被 PBL-RTX-0004 拦下(fail-closed 未弱化)
tx_write | tx_write PASS:pbl_runtime_event 必填列 2 个(已排除自增 PASS tx_write PASS:pbl_runtime_event 必填列 2 个(已排除自增/DEFAULT 列):event_uid,event_type
tx_write | tx_write PASS:pbl_entity_state 必填列 8 个(已排除自增/ PASS tx_write PASS:pbl_entity_state 必填列 8 个(已排除自增/DEFAULT 列):tenant_id,session_id,entity_id,state_version,checksum,updated_by,created_at,updated_at
tx_write | tx_write PASS:pbl_world_state_snapshot 必填列 8 PASS tx_write PASS:pbl_world_state_snapshot 必填列 8 个(已排除自增/DEFAULT 列):tenant_id,session_id,snapshot_uid,state_fingerprint,events_through_seq,reason,created_at,updated_at
tx_write | tx_write PASS:pbl_runtime_event 部分必填列被 PBL-RT PASS tx_write PASS:pbl_runtime_event 部分必填列被 PBL-RTX-0004 拦下
tx_write | tx_write PASS:pbl_entity_state 部分必填列被 PBL-RTX PASS tx_write PASS:pbl_entity_state 部分必填列被 PBL-RTX-0004 拦下
tx_write | tx_write PASS:事件表/快照表 INSERT 写路径列集合通过校验(无回归) PASS tx_write PASS:事件表/快照表 INSERT 写路径列集合通过校验(无回归)
tx_write | tx_write PASS:UPDATE 禁止 SET 不可变列(PBL-RTX-0006 PASS tx_write PASS:UPDATE 禁止 SET 不可变列(PBL-RTX-0006)
tx_write | tx_write PASS:3 协程契约 + 1 同步守卫签名正确 PASS tx_write PASS:3 协程契约 + 1 同步守卫签名正确
tx_write | probe| PASS P1 正常写入(事件+2状态+快照)单事务提交:stmt=8 事件 PASS probe| PASS P1 正常写入(事件+2状态+快照)单事务提交:stmt=8 事件行=1 状态行=2 快照行=1 广播在commit后=True 占位符违规=0
tx_write | probe| PASS P2 幂等重放:dedup=True 事件行数=1 广播次数=0( PASS probe| PASS P2 幂等重放:dedup=True 事件行数=1 广播次数=0(重放不重复写、不重复广播)
tx_write | probe| PASS P3 乐观锁冲突回滚:错误码=PBL-STATE-CONFLICT PASS probe| PASS P3 乐观锁冲突回滚:错误码=PBL-STATE-CONFLICT commit=-1 rollback=5 事件行残留=0 广播=0
tx_write | probe| PASS P4 中途故障原子性:抛出=RuntimeError rollba PASS probe| PASS P4 中途故障原子性:抛出=RuntimeError rollback=5 已提交事件行=0 已提交状态行=0 广播=0
tx_write | probe| PASS P5 append-only:UPDATE/DELETE/TRUN PASS probe| PASS P5 append-only:UPDATE/DELETE/TRUNCATE 被代码守卫拦截=True 引擎兜底拦截=True
tx_write | probe| PASS P6 占位符/参数数门禁生效:'SELECT 1'+2参数 被拒( PASS probe| PASS P6 占位符/参数数门禁生效:'SELECT 1'+2参数 被拒(错误码=PBL-RTX-0005)
tx_write | probe| PASS P7 契约三处同步:6/6 对齐 PASS probe| PASS P7 契约三处同步:6/6 对齐
tx_write | probe| m11b_probe PASS:7 项探针(state_updates 非空 PASS probe| m11b_probe PASS:7 项探针(state_updates 非空端到端 P1~P4 + 守卫 P5 + 门禁有效性 P6 + 三处同步 P7)
tx_write | tx_write.self_check PASS PASS tx_write.self_check PASS
tx_write.self_check 整体 PASS
m11b_api | m11b_api PASS:5 个协程契约齐备 PASS m11b_api PASS:5 个协程契约齐备
m11b_api | m11b_api PASS:assert_append_only 同步守卫可调用 PASS m11b_api PASS:assert_append_only 同步守卫可调用
m11b_api | m11b_api PASS:contracts 清单 8 项与注册表一致 PASS m11b_api PASS:contracts 清单 8 项与注册表一致
m11b_api | m11b_api.self_check PASS PASS m11b_api.self_check PASS
m11b_api.self_check 整体 PASS
rtx_db | rtx_db PASS:仅用 sor.C/U/R/sqlExe + sqlorContext PASS rtx_db PASS:仅用 sor.C/U/R/sqlExe + sqlorContext(无模块级猜测签名)
rtx_db | rtx_db PASS:事务原语探测 sor/conn/sql 三级 PASS rtx_db PASS:事务原语探测 sor/conn/sql 三级
rtx_db | rtx_db PASS:无 begin/commit/rollback → 探测返回 Non PASS rtx_db PASS:无 begin/commit/rollback → 探测返回 None(上层抛 PBL-RTX-0002)
rtx_db | rtx_db PASS:库名不可得即抛 PBL-RTX-0001(不猜默认库) PASS rtx_db PASS:库名不可得即抛 PBL-RTX-0001(不猜默认库)
rtx_db.self_check 整体 PASS
A[三处同步] apply_runtime_event PASS impl=True export=True register=True
A[三处同步] poll_events PASS impl=True export=True register=True
A[三处同步] read_states PASS impl=True export=True register=True
A[三处同步] assert_append_only PASS impl=True export=True register=True
A[三处同步] pbl_runtime_broadcast_pull PASS impl=True export=True register=True
A[三处同步] pbl_runtime_broadcast_stats PASS impl=True export=True register=True
A[包出口可导入] pbl_runtime_broadcast_pull PASS
A[包出口可导入] pbl_runtime_broadcast_stats PASS
A[包出口可导入] apply_runtime_event PASS
A[包出口可导入] poll_events PASS
A[包出口可导入] read_states PASS
A[包出口可导入] assert_append_only PASS
A[M11b 注册清单完整(fail-closed 门禁)] PASS missing=[] total=12
A[M11a 注册清单完整] PASS total=6
--- B. 内存事务引擎端到端(真实 apply_runtime_event 主链路)---
B1[正常写入] ok 且非幂等命中 PASS seq_no=1 event_id=1
B1[正常写入] 事件表 1 行 PASS
B1[正常写入] 状态表 1 行 v1 PASS
B1[正常写入] 快照表 1 行 PASS
B1[正常写入] 单事务多语句 PASS stmt_count=3
B1[正常写入] 提交后广播进缓冲 PASS cursor=1
B2[无幽灵更新] 事务日志 begin→commit PASS log=['begin', 'commit']
B2[无幽灵更新] commit 时 hub 游标=0,广播后=1 PASS commit_cursor=0 now=1
B3[幂等重放] dedup=True PASS event_id=1
B3[幂等重放] 事件仍 1 行 PASS
B3[幂等重放] 未重复广播 PASS cursor 1→1
B4[乐观锁冲突] PBL-STATE-CONFLICT PASS entity_id=pos 乐观锁冲突:base_version=99 当前 state_version=1(整
B4[乐观锁冲突] 事件行数未增加(无脏数据) PASS 1→1
B4[乐观锁冲突] 冲突键未落库 PASS
B4[乐观锁冲突] 状态版本未污染(仍 v1) PASS
B4[乐观锁冲突] 未广播 PASS
B5[DML失败] 异常上抛(不静默) PASS 注入故障:pbl_entity_state INSERT 失败
B5[DML失败] 事件行不存在(回滚证据,非标记 rolled_back) PASS events=1
B5[DML失败] 无状态脏行 PASS
B5[DML失败] 未广播(无幽灵更新) PASS
B6[回滚证据] 日志含 rollback PASS log=['begin', 'commit', 'begin', 'commit', 'begin', 'rollback', 'begin', 'rollback']
B7[顺序与版本] seq 单调 1→2 PASS [1, 2]
B7[顺序与版本] state_version 递增到 2 PASS
B8[poll命中hub] source=hub PASS events=2
B9[poll退回查库] source=db PASS events=2
B9[poll退回查库] 取回 2 条已提交事件 PASS [1, 2]
B9[poll退回查库] payload 已反序列化为对象 PASS
B10[缺口退查库] source=db PASS truncated=True
B11[read_states] 返回状态且 state_value 为对象 PASS keys=[None]
B12[缺租户] PBL-TENANT-0001 PASS
B13[broadcast_pull] ok PASS source=db count=2
B13[broadcast_stats] 含 sla/contracts PASS published=12
B13[broadcast_pull] 无租户段拒绝跨租户拉取 PASS channel 必须以 pbl.world. 开头
B14[SLA打点] 三阶段均有样本 PASS adj=0.347 bcast=0.004 e2e=0.56
B14[SLA打点] 广播实测 ≤300ms PASS max=0.006ms
B15[分区] 失败时如实降级(不谎报已建) PASS ok=False degraded=True err=PBL-RTX-0003: apppublic.DBPools 不可导入:Mod
--- C. 真实库端到端(原子性/回滚/广播时序的权威证据)---
SKIP C:环境受限未验证 —— 本工作空间无 ahserver/apppublic 运行时('ModuleNotFoundError')
B 层用可回滚内存事务引擎跑通同一份 tx_write 主链路代码替代;
连库跑法:在 pbls 应用环境执行 `python3 scripts/m11b_selftest.py --live`
================ 汇总 ================
总计 110 项,PASS 110,FAIL 0
RESULT: PASS
RC_SELFTEST=0