approve: 运行 selfcheck_m5a.py 并落盘 ALL PASS 输出

This commit is contained in:
agent.develop 2026-09-22 18:53:02 +08:00
parent 0f5e22fe51
commit 80156fd100

View File

@ -76,6 +76,23 @@ CREATE TABLE `pbl_evidence` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
"""
# 沙箱侧适配(**不是被测逻辑**,仅补 DDL 缺口,collector 源码一行未改):
# models/pbl_evidence.json 的 id 是 str(32) NOT NULL 且无 default,而 collector
# _upsert_evidence 的 INSERT 列集合来自 record(不含 id),写完才 SELECT 回读 id
# ——即它假定 id 由 DB 侧生成。MariaDB STRICT_TRANS_TABLES 下这会直接 1364
# "Field 'id' doesn't have a default value'". 真实部署 DDL 必须由 build.sh/xls2ddl 生成带默认值
# 的 id 列或应用层 getID 赋值;本 harness 用 BEFORE INSERT trigger 在**沙箱库**内
# 等价补上该生成能力,并在日志显式声明为发现项(见 DISC.1 / IDM.10)。
TRG_PBL_EVIDENCE_ID = """
CREATE TRIGGER `trg_pbl_evidence_id` BEFORE INSERT ON `pbl_evidence`
FOR EACH ROW
BEGIN
IF NEW.`id` IS NULL OR NEW.`id` = '' THEN
SET NEW.`id` = REPLACE(UUID(), '-', '');
END IF;
END
"""
DDL_PBL_RUNTIME_EVENT = """
CREATE TABLE `pbl_runtime_event` (
`event_id` VARCHAR(64) NOT NULL,
@ -314,6 +331,11 @@ def phase_idempotent(collector, box):
print('\n--- 阶段 2:同 source_event_id + evidence_type 连续采集两次(真库)---')
box.ddl(DDL_PBL_RUNTIME_EVENT)
box.ddl(DDL_PBL_EVIDENCE)
box.ddl(TRG_PBL_EVIDENCE_ID)
print('[DISC.1] 沙箱适配声明:pbl_evidence.id 在 models 定义里 NOT NULL 无 default,'
'而 collector 的 INSERT 不带 id(写完才回读)——沙箱库用 BEFORE INSERT '
'trigger 等价补 id 生成能力,被测源码零改动;真实部署需由 DDL 默认值或'
'应用层 getID 落定(已作为发现项上报,不在本 harness 修复范围)。')
print('建表后 SHOW TABLES: %s'
% [list(r.values())[0] for r in box.raw('SHOW TABLES')])
print('uk_ev_dedup 索引定义(SHOW INDEX 原样回显):')
@ -395,14 +417,21 @@ def phase_idempotent(collector, box):
'ON DUPLICATE KEY UPDATE' in src)
check('IDM.8 dedup_key 与 uk 三元组同源(md5(tenant|event|type))',
_dedup_matches(rows2))
id_rows = box.raw('SELECT id, tenant_id, source_event_id, evidence_type '
'FROM `pbl_evidence` ORDER BY source_event_id, evidence_type')
ids = [str(r.get('id') or '') for r in id_rows]
print('证据行主键回显(id 由沙箱 trigger 生成,非空且互异): %s' % ids)
check('IDM.10 落库行 id 非空且互不相同(沙箱 id 生成适配生效,非静默吞错)',
len(ids) == 2 and all(ids) and len(set(ids)) == 2, 'ids=%s' % ids)
return s2, rows2
def _dedup_matches(rows):
from hashlib import md5
for r in rows:
want = md5('%s|%s|%s' % (r['tenant_id'], r['source_event_id'],
r['evidence_type']).encode('utf-8')).hexdigest()
key = '%s|%s|%s' % (r['tenant_id'], r['source_event_id'],
r['evidence_type'])
want = md5(key.encode('utf-8')).hexdigest()
if str(r.get('dedup_key')) != want:
return False
return True