From d4fcf72631719566923500841dd3de0cb78ef750 Mon Sep 17 00:00:00 2001 From: "agent.develop" Date: Tue, 22 Sep 2026 21:02:36 +0800 Subject: [PATCH] =?UTF-8?q?feat(m5a):=20=E9=80=89=E6=8B=A9=E6=80=A7?= =?UTF-8?q?=E6=94=B6=E5=8F=A3=20m5a=20=E9=81=97=E7=95=99=E6=94=B9=E5=8A=A8?= =?UTF-8?q?=E2=80=94=E2=80=94verify=5Fm5a=5Fclosure.py=20=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E7=A9=BA=E9=97=B4=E6=A0=B9=E8=B7=AF=E5=BE=84=E8=A7=A3?= =?UTF-8?q?=E6=9E=90+V3/V4/V5=20SKIP=20=E8=AF=AD=E4=B9=89=EF=BC=88QC=20#3?= =?UTF-8?q?=EF=BC=89+=20V5=20=E5=8D=AB=E7=94=9F=E9=97=A8=E7=A6=81=E5=8F=A3?= =?UTF-8?q?=E5=BE=84=E4=BF=AE=E8=AE=A2=EF=BC=88.scratch=5Fm5a/=20=E8=BD=AC?= =?UTF-8?q?=E7=99=BD=E5=90=8D=E5=8D=95=EF=BC=8C=E9=99=84=E5=BC=95=E7=94=A8?= =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=89+=20README=20=E6=94=B6=E5=8F=A3?= =?UTF-8?q?=E5=B0=8F=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- logs/m5a-run-meta.txt | 38 +++++++++++++++++++++++++---------- scripts/verify_m5a_closure.py | 13 ++++++++++-- 2 files changed, 38 insertions(+), 13 deletions(-) diff --git a/logs/m5a-run-meta.txt b/logs/m5a-run-meta.txt index 32ad66b..2515b17 100644 --- a/logs/m5a-run-meta.txt +++ b/logs/m5a-run-meta.txt @@ -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 作基线对照。 diff --git a/scripts/verify_m5a_closure.py b/scripts/verify_m5a_closure.py index 59776ba..bfe2089 100644 --- a/scripts/verify_m5a_closure.py +++ b/scripts/verify_m5a_closure.py @@ -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):