# Work Log — 2026-09-22(M11b-2c-A 实跑 pytest + selftest 并落盘留证 / QC 退回响应) - **模块仓库**: `modules/pbl_runtime_ext`(PBL scense_runtime 薄扩展,M11a/M11b 单事务事件+状态写入与广播) - **任务**: [M11b-2c-A] 实跑 pytest + selftest 并落盘留证(QC 退回 5 条意见逐条响应) - **执行环境**: Python 3.10.12 / pytest 9.1.1 / venv=`.venv`(已存在,`pip install -e .` 已装) - **起始 HEAD**: `51c3f26`(含 `5542cf5` PBL-RTX-0004 修复) ## 1. 本轮时间线(命令与结果) | # | 命令 | 结果 | 退出码 | |---|------|------|--------| | 1 | `.venv/bin/python -m pytest tests/ -v --tb=short` | `9 passed in 0.40s`(collected 9 items) | 0 | | 2 | `.venv/bin/python scripts/m11b_selftest.py` | `总计 110 项,PASS 110,FAIL 0` / `RESULT: PASS` | 0 | | 3 | `.venv/bin/python scripts/m11b2c_p99_probe.py --samples 30` | write(INSERT) P99=0.1946ms / read P99=0.1238ms / write(UPDATE) P99=0.4233ms,`P99 结论:达标` | 0 | | 4 | `bash tests/run_m11b1a_localdb.sh` | **失败**(实库 DDL 装载 ERROR 1064,见第 4 节) | 1 | 留证落点(project-directory-spec 第五节 develop 落点,非模块仓库内临时目录): - `projects/pbls/docs/02-develop/m11b2c-pytest-run.log` — 本轮重跑,含完整命令 + 时间戳 + `9 passed` + `EXIT_CODE=0` - `projects/pbls/docs/02-develop/m11b2c-selftest-run.log` — selftest 110 项 + P99 数值行 + 实库 runner 原样输出与根因 - `projects/pbls/docs/02-develop/m11b2c-pytest-run-history-20260921T1150-failed.log` — 上一轮 `3 failed, 6 passed` 失败证据**归档保留**(未覆盖、未删改) ## 2. QC 退回意见逐条响应 | QC | 问题 | 本轮处置 | 证据 | |----|------|----------|------| | #1 | T3 因 PBL-RTX-0004 失败(`_apply_state` UPDATE 分支 NOT NULL 全列构造) | 采纳 (b) 路线:该缺陷已在前序 commit `5542cf5` 修复(`build_row(full_row=False)` UPDATE 语义 + `required_columns` 识别 nullable/排除自增与 DEFAULT 列 + self_check 闭环门禁)。本轮实跑 T3 由 FAIL → PASS,**未使用 xfail / 未放宽断言阈值 / 未静默跳过** | pytest 日志 T3 PASSED;selftest B7[顺序与版本] 全 PASS | | #2 | 仓库唯一留证是失败证据(`collected 0 items / EXIT_CODE=5`、`EXIT_CODE=1`),与「实跑留证」表述矛盾 | 重跑并覆盖到规范落点,两份 log 均含完整命令行、时间戳、`9 passed`、`EXIT_CODE=0`,并补 `m11b2c_p99_probe.py` 成功输出(P99 数值行 + `P99 结论:达标`);旧失败证据改名归档不丢失 | 上述三个 log 文件 | | #3 | 探针 `assert len(rows) == 1` 恒不成立(预热 state_key 与采样同 (tenant,session),`entity_ids` 在内存替身未下推)→ T4/T4b 崩溃、P99 从未产出 | 预热改用独立 `session_id=90911`;采样侧按 `entity_id` 二次过滤后断言;新增「返回行 entity_id 与请求一致」断言(`bad_rows` 计数并入 verdict)防再次静默放宽 | 探针输出 `read 行 entity_id 一致性校验:PASS 全部与请求一致`;T4/T4b/T4c 全 PASS | | #4 | `.m11b2c_tmp/` 5 个 `.out/.err` 临时产物被 git 收口提交进模块仓库,污染仓库且不在规范落点 | `git rm -r --cached .m11b2c_tmp/` + 物理删除目录;`.gitignore` 已含 `.m11b2c_tmp/`、`.pytest_cache/`、`__pycache__/`、`.venv/`、`*.log`;留证迁至 `projects/pbls/docs/02-develop/`;本 work-log 按 module-development-spec 补齐 | `git status --short` 中 7 条 `D .m11b2c_tmp/*` | | #5 | `test_t4c_probe_declares_environment_limit_honestly` 是 `open().read()` 字符串包含式 grep 伪测试(T4/T4b 全崩时它仍 PASS) | 重写为 `test_t4c_probe_runs_and_discloses_environment_limit`:真实调用 `p99_probe.run(30)`,断言 `rc in (0,1)`(rc=2 判为探针失效)、`rw['n']>=30`、`rr['n']>=30`、六项百分位元数据非 NaN、`P99<=200ms`、capsys 捕获输出中确有 `P99=` 数值行与 `P99 结论:` 行、entity_id 一致性校验 PASS;「环境受限诚实声明」降级为对模块 docstring 的**附加**校验而非唯一断言 | `tests/test_m11b2c_runtime_ext.py::test_t4c_probe_runs_and_discloses_environment_limit` PASSED | ## 3. 关键技术决策与陷阱 1. **不放宽断言,改修根因**:QC #1 给了 xfail 挂单与真修两条路。因 PBL-RTX-0004 属本模块 `_apply_state` UPDATE 分支的实现缺陷(非外部业务缺陷),且修复已落地,选真修路线——留证必须是「全绿 + RC=0」的真实执行,不接受用 xfail 掩盖可修缺陷。 2. **失败证据不删除,只归档**:QC #2 的实质是「声称与实测矛盾」,处置方式是补出成功证据,同时把失败证据改名为 `*-history--failed.log` 保留,形成缺陷→修复→复验的完整链条。 3. **P99 采样的分支覆盖**:探针 S 段(唯一 entity_id → 状态行首建 INSERT 分支)与 U 段(固定 entity_id 反复覆写 → UPDATE 分支,正是 PBL-RTX-0004 触发点)分别计时,避免修复后 UPDATE 分支重新劣化无人察觉。U 段 P99=0.42ms 与 S 段同量级,说明修复未引入性能回退。 4. **诚实声明(环境受限)**:内存事务引擎 FakeEngine 驱动的 P99 覆盖「幂等键计算 → 事件 INSERT → 状态 UPSERT(乐观锁) → 快照 INSERT → commit → 提交后广播」完整代码路径,但**不含网络 RTT 与真实 InnoDB 提交开销**,不冒充真实库数字。真实库复测路径:pbls 应用环境执行 `python3 scripts/m11b_selftest.py --live`。 5. **陷阱**:`read_states` 按 `(tenant_id, session_id)` 过滤,`entity_ids` 入参在内存替身实现中不下推 IN 条件——任何按 entity_id 断言行数的写法都必须自己二次过滤,否则断言恒假(本轮 QC #3 根因)。 ## 4. 环境受限项 / 遗留缺陷(上报 PM) - **C 层真实库端到端未验证**:本工作空间无 ahserver/apppublic/sqlor 运行时(`ModuleNotFoundError`),selftest C 段自身即 SKIP 并如实声明。 - **`bash tests/run_m11b1a_localdb.sh` 失败(新发现,非本轮引入)**:一次性本地 MariaDB 能正常拉起(`mariadbd ready (2s)`),但 `scripts/pbl_runtime_event_ddl.py:full_script()` 渲染的 C 段存储过程 `pbl_assert_append_only` 中 `IF ... THEN RETURN; END IF;` 未被 DELIMITER 正确包裹,mariadb CLI 在 `RETURN` 后的分号提前切分语句 → `ERROR 1064 (42000) at line 65` → 后续 `CALL pbl_runtime_event_ensure_partitions(9)` 报 `1305 PROCEDURE pbls.pbl_runtime_event_ensure_partitions does not exist` → runner `rc=1`。 - 建议登记为 **PBL-RTX-0005**(DDL 生成器存储过程 DELIMITER 兼容性缺陷,影响 append-only 守卫与分区维护过程实库装载)。 - 本任务边界禁止修改 `scripts/pbl_runtime_event_ddl.py` 与 `models/*.json`,故未在此修复;原样输出与根因已写入 `m11b2c-selftest-run.log` 第 [3/3] 段。 - 等价覆盖已按任务规则补记:A 层离线核验 18 项 → pytest T1/T1b;B 层端到端 110 项 → pytest T3(同一份 `tx_write` 主链路代码)。 - **develop 侧无 report_bug 工具**:本轮按角色工具集(classify/start_fix/fix_bug/list_bugs)无立单能力,PBL-RTX-0005 以 work-log + 交付摘要 + log 三处留痕方式上报 PM,请 PM 派生修复任务。 ## 5. 分支与提交状态 - 分支:`main`(本地仓库,无远程;部署前需 `git remote add origin` 才能被 deploy 角色 pull) - 本轮工作区变更(本 log 落笔时 `git status --short`): - `D .m11b2c_tmp/pytest_run1.txt`、`D .m11b2c_tmp/selftest.err`、`D .m11b2c_tmp/selftest.out`、`D .m11b2c_tmp/selftest2.err`、`D .m11b2c_tmp/selftest2.out`、`D .m11b2c_tmp/selftest_run1.txt`、`D .m11b2c_tmp/tb3.err`(索引内删除,收口时生效) - `M tests/test_m11b2c_runtime_ext.py`(T4c 重写为行为断言 + T3b read 行按 entity_id 过滤) - `?? docs/work-log-2026-09-22.md`(本文件) - 按任务边界,git commit 由 PM 审核通过后系统统一收口(引擎代为执行),本角色不自称已 commit/push。