File size: 5,768 Bytes
9f075f3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6a63b76
 
 
 
 
 
 
 
 
 
6f3ae23
6a63b76
 
 
 
 
6f3ae23
6a63b76
 
 
 
6f3ae23
 
6a63b76
 
 
 
6f3ae23
 
6a63b76
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9f075f3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6a63b76
9f075f3
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""B0 基线冻结 · 维度锁读取校验(HoloAeon 侧)

按 AGENT_FEED_V4_REHAB_FUSION_20261102.md §4 SOP-1 第 4 步要求:
"两侧单测各加一条断言读它"——本脚本读 reports/dimension_lock.json,
对 12 维度锁做断言;不并入 unittest discover,避免破坏 34/21/5 与 v3_gate 32 项锁。
完美判据:退出码 0 = PASS。

密令:潮起开门,潮落闭嘴。evidence_class=simulated,仿真≠证明,碳基终裁。
"""
import json
import os
import sys

HERE = os.path.dirname(os.path.abspath(__file__))
ROOT = os.path.dirname(HERE)
LOCK = os.path.join(ROOT, "reports", "dimension_lock.json")

EXPECTED = {
    "lock_id": "B0-LOCK-V2.0-REHAB-FUSION",
    "spec_version": "0.9.1",
    "diff0_hash": "2fc892cf9af6e755",
    "tamper_sensitive_hash": "f42c8229ee5acd73",
    "holoaeon_agents": 25,
    "holoaeon_skills": 47,
    "holoaeon_selftest_groups": 25,
    "ivsa_selftest_groups": 21,
    "skill_matrix_runtime_skills": 1199,
}

# 冻结快照项:文档态,随版本演进,不参与运行态校验
# 与 EXPECTED(运行态锁死项)性质不同:
#   EXPECTED 的值永远不变(如 spec_version=0.9.1)
#   FROZEN_SNAPSHOT 的值会随 DOC_VERSION 演进(如 spec_doc_version 0.9.4→0.9.18)
# 校验策略:只读取并打印差异,不判 FAIL——演进是受控的,碳基终审
FROZEN_SNAPSHOT = {
    "spec_doc_version": {
        "frozen_value": "0.9.4",
        "current_source": "holoaeon.spec.DOC_VERSION",
        "reason": "文档版本号,随批次演进,不参与运行态锁死校验",
        "note_cmd": "python -c \"from holoaeon.spec import DOC_VERSION; print(DOC_VERSION)\"",
    },
    "holoaeon_domain_packs": {
        "frozen_value": 9,
        "current_source": "holoaeon.packs.PACK_ORDER len",
        "reason": "九领域包数,V1 起未变",
        "note_cmd": "python -c \"from holoaeon.packs import PACK_ORDER; print(len(PACK_ORDER))\"",
    },
    "holoaeon_extra_packs": {
        "frozen_value": 9,
        "current_source": "holoaeon.packs.EXTRA_PACK_ORDER len",
        "reason": "扩展包数,随批次演进,以命令回读为准,不记时点快照",
        "note_cmd": "python -c \"from holoaeon.packs import EXTRA_PACK_ORDER; print(len(EXTRA_PACK_ORDER))\"",
    },
    "holoaeon_unittests": {
        "frozen_value": "34/21/5",
        "current_source": "tests/ + tests/v3 + tests/verax 实跑计数",
        "reason": "三套测试计数,随批次演进,以命令回读为准,不记时点快照",
        "note_cmd": "python -c \"import subprocess,sys;r=subprocess.run([sys.executable,'-m','unittest','discover','-s','tests'],capture_output=True,text=True);print([l for l in r.stderr.splitlines() if l.startswith('Ran')][-1])\"",
    },
}


def read_frozen_snapshot_current():
    """读取冻结快照项的当前值(只读,不校验)。"""
    current = {}
    try:
        from holoaeon.spec import DOC_VERSION
        current["spec_doc_version"] = DOC_VERSION
    except Exception:
        current["spec_doc_version"] = "(读取失败)"
    try:
        from holoaeon.packs import PACK_ORDER, EXTRA_PACK_ORDER
        current["holoaeon_domain_packs"] = len(PACK_ORDER)
        current["holoaeon_extra_packs"] = len(EXTRA_PACK_ORDER)
    except Exception:
        current["holoaeon_domain_packs"] = "(读取失败)"
        current["holoaeon_extra_packs"] = "(读取失败)"
    # unittest 计数不在此自动跑(避免拖慢校验),只标注"见实测"
    current["holoaeon_unittests"] = "(见实测,不自动跑)"
    return current


def print_frozen_snapshot():
    """打印冻结快照项当前值与冻结值的差异(仅供碳基终审视察,不判 FAIL)。"""
    current = read_frozen_snapshot_current()
    print("[SNAPSHOT] 冻结快照项(不参与校验,仅供碳基终审视察):")
    for key, meta in FROZEN_SNAPSHOT.items():
        cur = current.get(key, "(未知)")
        frozen = meta["frozen_value"]
        if key == "holoaeon_unittests":
            note = "← 见 README 实测值"
        elif str(cur) == str(frozen):
            note = "← 一致"
        else:
            note = "← 演进(正常)"
        print(f"  - {key}: 冻结={frozen}  当前={cur}  {note}")


def main():
    if not os.path.isfile(LOCK):
        print(f"[FAIL] dimension_lock.json 不存在: {LOCK}")
        return 1
    with open(LOCK, "r", encoding="utf-8") as f:
        d = json.load(f)

    fails = []
    if d.get("lock_id") != EXPECTED["lock_id"]:
        fails.append(f"lock_id={d.get('lock_id')} != {EXPECTED['lock_id']}")
    if d.get("evidence_class") != "simulated":
        fails.append("evidence_class != simulated")
    dims = {x["name"]: x["value"] for x in d.get("dimensions", [])}
    if len(d.get("dimensions", [])) != 12:
        fails.append(f"dimensions count={len(d.get('dimensions', []))} != 12")
    for k, v in EXPECTED.items():
        if k == "lock_id":
            continue
        if dims.get(k) != v:
            fails.append(f"{k}={dims.get(k)!r} != {v!r}")
    gates = d.get("audit", {}).get("seven_gates", [])
    if len(gates) != 7:
        fails.append(f"seven_gates count={len(gates)} != 7")
    if d.get("audit", {}).get("violation_count") != 0:
        fails.append("violation_count != 0")

    if fails:
        print("[FAIL] dimension_lock 校验失败:")
        for x in fails:
            print("  -", x)
        return 1
    print("[PASS] dimension_lock.json 12 维度 + 7 闸 + 0 violation 全部一致")
    print("       diff0_hash=2fc892cf9af6e755 tamper=f42c8229ee5acd73 spec_version=0.9.1")
    print_frozen_snapshot()
    return 0


if __name__ == "__main__":
    sys.exit(main())