holoaeon / scripts /contract_interop.py
weideyouni's picture
B1b: scripts/contract_interop.py
fb38eee verified
Raw History Blame Contribute Delete
3.88 kB
# -*- coding: utf-8 -*-
"""B1b 同参指纹互认实验(确定性、可跨进程复跑)。
用法:
python scripts/contract_interop.py --out reports/contract_v1_interop_a.json
python scripts/contract_interop.py --out reports/contract_v1_interop_b.json
python scripts/contract_interop_final.py # 比对两次运行并落最终回执
判据:
I1 同一 body 两次构造 → 指纹相等(跨进程由两次独立运行比对字节证明)
I2 payload 改一个键 → 指纹不同
I3 nonce 不进指纹 → 再加 nonce 指纹不变
I4 全部样本 validate_v1 通过
输出不含时间戳,保证两次运行字节一致。
"""
import json
import os
import sys
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if ROOT not in sys.path:
sys.path.insert(0, ROOT)
from holoaeon.fusion_upgrade import contract as c
RED = {"zero_dose": True, "c0_not_efficacy": True, "emergency_120": True}
def samples():
general = {"source": "local", "target": "gitee", "skill": "fusion_contract",
"mechanism": "semantic_bus", "lane": "read",
"payload": {"domain": "general", "notes": "B1b 最小样本"}}
medical = {"source": "local", "target": "ivsa", "skill": "fusion_plan",
"mechanism": "meridian", "lane": "read",
"payload": {"domain": "medical", "inputs": {"case_id": "R-001"},
"evidence": {"sha256": "98940b774566543b"},
"redlines": dict(RED), "notes": "只交换契约,不搬代码"}}
changed = json.loads(json.dumps(general))
changed["payload"]["notes"] = "改一个键"
with_nonce = json.loads(json.dumps(general))
with_nonce["nonce"] = "n-20261102-01"
return {"general": general, "medical": medical, "changed": changed, "with_nonce": with_nonce}
def run():
raw = samples()
docs = {}
for name, body in raw.items():
doc = c.build(**{k: v for k, v in body.items() if k != "payload"},
payload=body.get("payload"))
if "nonce" in body:
doc["nonce"] = body["nonce"]
docs[name] = doc
# I1:同参再构造一次
again = c.build(source="local", target="gitee", skill="fusion_contract",
mechanism="semantic_bus", lane="read",
payload={"domain": "general", "notes": "B1b 最小样本"})
rows = []
for name in ("general", "medical", "changed", "with_nonce"):
doc = docs[name]
v = c.validate_v1(doc)
rows.append({"name": name, "contract_id": doc["contract_id"],
"valid": v["ok"], "errors": v["errors"]})
result = {
"experiment": "B1b-cross-process-fingerprint",
"dna_id": "SG-DNA-FIVE-SITE-SYNC-V1.1",
"fingerprint_rule": "sha256(canonical(source,target,skill,mechanism,lane,payload))[:12]",
"samples": rows,
"same_params_equal": docs["general"]["contract_id"] == again["contract_id"],
"payload_changed_differs": docs["general"]["contract_id"] != docs["changed"]["contract_id"],
"nonce_not_in_fingerprint": c.fingerprint(docs["general"]) == c.fingerprint(docs["with_nonce"]),
"all_valid": all(r["valid"] for r in rows),
}
return result
def main(argv):
result = run()
out = None
if "--out" in argv:
idx = argv.index("--out")
if idx + 1 < len(argv):
out = argv[idx + 1]
text = json.dumps(result, ensure_ascii=False, indent=2, sort_keys=True)
if out:
with open(out, "w", encoding="utf-8", newline="\n") as f:
f.write(text + "\n")
print(text)
ok = (result["same_params_equal"] and result["payload_changed_differs"]
and result["nonce_not_in_fingerprint"] and result["all_valid"])
return 0 if ok else 1
if __name__ == "__main__":
sys.exit(main(sys.argv))