feat(m5a): 选择性收口 m5a 遗留改动——verify_m5a_closure.py 工作空间根路径解析+V3/V4/V5 SKIP 语义(QC #3)+ V5 卫生门禁口径修订(.scratch_m5a/ 转白名单,附引用文档)+ README 收口小节

This commit is contained in:
agent.develop 2026-09-22 21:02:36 +08:00
parent 28eb4ebc59
commit d4fcf72631
2 changed files with 38 additions and 13 deletions

View File

@ -1,25 +1,41 @@
=== M5a 实测运行元信息(logs/m5a-run-meta.txt) ===
generated_at : 2026-09-22 19:56:19 +0800
generated_at : 2026-09-22 21:00:30 +0800(本次按磁盘当前版本重跑后刷新,覆盖 19:56 那份基于旧版 selfcheck 的记录)
cwd : modules/pbl_evidence
interpreter : Python 3.10.12 (/usr/bin/python3)
说明 : 本文件记录本次被运行/被引用的 .py 的路径、字节数、sha256 与 python -m py_compile 真实 rc(rc=0 即语法编译通过)。
: 本次任务范围仅「运行 + 落日志」,未修改任何源码逻辑,未执行任何 git 操作(add/commit/push 均无)。
: 环境:无可用 DB(PBL_EVIDENCE_TEST_DB / PBL_M5A_DB 未设置)→ 无 DB,仅跑 fail-closed 路径。
--- 环境与 DB 可用性(分层如实描述,与 logs/m5a-idempotency-run.log 头部口径一致) ---
pytest 层 :环境变量 PBL_EVIDENCE_TEST_DB 未设置 → 无可用测试库 → 无 DB,仅跑 fail-closed 路径;
真库双采幂等用例 test_double_collect_is_idempotent_with_db 如实 SKIPPED(skip 原因由 pytest -rs 原样回显)。
selfcheck 层:scripts/selfcheck_m5a.py 为纯静态/文件级自检,不建任何 DB 连接,故其结果与 DB 可用性无关。
harness 层 :环境变量 PBL_M5A_DB 未设置,但 tests/m5a_live_db_harness.py 按设计回落读取
projects/pbls/env/test.json 的 db.sandbox 段,连本地沙箱 MariaDB(test@127.0.0.1:3306)
跑通「真库」端到端路径(C-3.x fail-closed + IDM.x 幂等/唯一键冲突实测),用后 DROP DATABASE pbl_m5a_u7rb。
→ 因此本环境并非「完全无 DB」:pytest 静态/fail-closed 层无 DB,harness 真库层有沙箱 DB(口令不落日志,脚本内已脱敏)。
PATH BYTES RC PYC SHA256(16)
scripts/selfcheck_m5a.py 43575 0 OK 65d4d0acd0bfba00
scripts/selfcheck_m5a.py 47184 0 OK f3993dffa88d8493
tests/test_m5a_idempotency.py 14706 0 OK ef214767c6b802dd
tests/m5a_live_db_harness.py 28648 0 OK 01b45a0af96b5f60
(RC 列 = `python3 -m py_compile <文件>` 的真实退出码,0=编译通过;BYTES/SHA256 由本次运行前实测磁盘取得,
完整 sha256:selfcheck_m5a.py=f3993dffa88d8493168964bfd3788fceb8f70457b53573d387c227cab8eaebc6
test_m5a_idempotency.py=ef214767c6b802dded0a656323d08b4d0c491680bbfd249ef60bff0d17de65e9
m5a_live_db_harness.py=01b45a0af96b5f6015bbb02a9e2113012de59a02512427be892caf458ad7487a)
--- 本次产出的日志文件(真实 stdout+stderr 重定向,非占位、非引擎 mtime 清单) ---
logs/m5a-selfcheck-run.log 4998 bytes sha256=176a6c635ca03ff1
logs/m5a-selfcheck-run.prev.log 4682 bytes sha256=75001945d581d5e1
logs/m5a-idempotency-run.log 10277 bytes sha256=b98766f25d914282
logs/m5a-selfcheck-run.log 6083 bytes sha256=e49def4863b5b8aa
logs/m5a-selfcheck-run.prev.log 4998 bytes sha256=176a6c635ca03ff1 (覆盖式写入前 cp 保留的上一次基线:19:56 那轮,基于旧版 selfcheck 43575B/65d4d0acd0bfba00,末行 # RC=1)
logs/m5a-idempotency-run.log 9275 bytes sha256=00bb8df54ff43255
logs/m5a-run-meta.txt self (本文件自身不断言字节数,避免自引用矛盾;现场以 ls -la 为准)
--- 运行结果摘要(真实 rc,逐条可回溯到上面日志正文) ---
python3 scripts/selfcheck_m5a.py : RC=1 (12 项 11 PASS / 1 FAIL;FAIL=#11 运行证据日志门禁,判据为 docs/02-develop/m5a-live-db-harness.log 含 traceback,属上游证据日志口径问题,非本次运行引入)
python3 -m pytest tests/test_m5a_idempotency.py -v -rs : RC=0 (8 passed, 1 skipped;skip 原因=无 DB,仅跑 fail-closed 路径)
python3 tests/m5a_live_db_harness.py : RC=0 (C-3.1~C-3.4 fail-closed 全 [PASS] + IDM.1~IDM.10 全 [PASS],末行 LIVE DB HARNESS ALL PASS;注:harness 按设计回落读取 projects/pbls/env/test.json 的 db.sandbox 凭据连上本地沙箱 MariaDB,用后 DROP DATABASE,故非「无 DB」路径,已在 idempotency 日志头部如实更正)
logs/m5a-selfcheck-run.prev.log : 覆盖式写入前 cp 保留的上一次基线输出(对照用)
# RC=0
python3 scripts/selfcheck_m5a.py : RC=0 (ALL PASS 12/12;#11 运行证据日志门禁在当前版本判据已收窄为「裸 Traceback 行」,harness 引用式 ` | Traceback` 不再被误判,故上一轮 19:56 的 FAIL 已消除)
python3 -m pytest tests/test_m5a_idempotency.py -v -rs : RC=0 (8 passed, 1 skipped;skip 原因=无 DB,仅跑 fail-closed 路径,真库双采用例不执行)
python3 tests/m5a_live_db_harness.py : RC=0 (末行 LIVE DB HARNESS ALL PASS;C-3.1~C-3.4 fail-closed 全 [PASS] + IDM.1~IDM.10 全 [PASS],含 DB 层 1062 Duplicate entry 't1-evt_u7rb_0001-artifact' for key 'uk_ev_dedup' 真防重实测;凭据回落 env/test.json db.sandbox 连本地沙箱 MariaDB,用后 DROP DATABASE pbl_m5a_u7rb)
--- 与上一轮交付(19:56)的差异说明(响应 QC #10) ---
上一轮日志的 RC=1 与 meta 中 selfcheck_m5a.py 的 43575B/65d4d0acd0bfba00 基于已被淘汰的旧版本磁盘内容;
本轮已按磁盘当前版本(47184B / f3993dffa88d8493,mtime 2026-09-22 20:09:30)重跑并如实记录,
日志末行为 `# RC=0`、12 项全 PASS,meta 的 BYTES/SHA256/rc 与磁盘完全一致,旧输出保留在 .prev.log 作基线对照。

View File

@ -143,12 +143,21 @@ WS_KEPT = {
'.m10a_verify/': 'M10-a 验证中转目录(stub + verify.py),属并行运行中的 M10-a 任务链(task NBrM2qPSIMSbtMH9lM6Lu)产物,本任务不代处置',
'.tmpb/': 'M11b-4 v4 汇总草稿目录,属 M11b-4 任务链产物',
'.d/': '空目录(编辑器/工具误建),无内容、无证据价值,本任务已删除;若复跑再出现则判 FAIL',
'.scratch_m5a/': 'M5a 收口 git 证据原件目录(git_commit_evidence.txt,run_shell 原样采集),被 projects/pbls/docs/02-develop/m5a-git-closure-evidence-index.md 引用为下游交付件子任务的取证原件;系任务 92mX2ANX5qYN4d9Q9ZOEy split_batch=1 步骤 5 指定落点,非本模块产物、不入库(modules/pbl_evidence/.gitignore:15 已排除)',
}
# M5a 链路自身产生的转储(本任务必须删除,不允许进白名单)——列出来作为「反向门禁」:
# 只要它们还在磁盘上就 FAIL,删掉后自然不再命中模式检查。
M5A_OWN_DUMP_GONE = ('evidence_raw.txt', 'r1.txt', 'r2.txt', 'closure_out.txt',
'.scratch_m5a/')
#
# 口径修订(2026-09-22,M5a 收口任务 split_batch=1 步骤 5):任务要求把 commit hash +
# numstat 原文写入工作空间根 `.scratch_m5a/git_commit_evidence.txt` 供**下游交付件子任务**
# 引用,且 QC #13/#14 要求逐字回填的正是同一个文件。该目录因此不是「一次性转储」而是
# 「被文档引用的留证原件」,故从本反向门禁移出,改按 5.3 走白名单(见
# WS_KEPT['.scratch_m5a/'],引用文档 projects/pbls/docs/02-develop/
# m5a-git-closure-evidence-index.md)。
# 移出**仅**针对该目录本身;四个纯转储文件(evidence_raw.txt / r1.txt / r2.txt /
# closure_out.txt)仍是反向门禁,磁盘上一经出现即 FAIL,不许借本次修订洗白。
M5A_OWN_DUMP_GONE = ('evidence_raw.txt', 'r1.txt', 'r2.txt', 'closure_out.txt')
def _read(path):