"""上下文快照身份与输入哈希的确定性;离线纯函数,不连库。 哈希期望覆盖键序无关与逐类输入变化,身份期望按 uuid5 惯例稳定派生。 """ from muse.上下文.接口 import ( 快照身份, 快照载荷, 文本哈希, 材料装配结果, 来源绑定, 输入哈希, ) 范围 = { "work_id": "work-a", "as_of": 2, "source_ids": ["doc-1", "plan-1"], "documents": [ { "chapter_id": "ch-1", "branch_id": "main", "revision": 1, "document_id": "doc-1", "document_hash": "hash-1", "position": 1, } ], "directory_revision": 3, "authorized_by": "author-a", "run_purpose": "production", "content_purpose": "generation", "target_plan": { "chapter_id": "ch-3", "plan_id": "plan-1", "revision": 1, "content_hash": "plan-hash", }, } 装配 = 材料装配结果( 入选来源=("目标章细纲", "历史:ch-1"), 文本="邮差在旧码头确认收信人。\n\n林深停在码头。", 字节数=59, # 36 + 分隔符 2 + 21,均按 UTF-8 字节 省略=(("事实:lin-shen", "BUDGET_EXCEEDED"),), ) 绑定 = ( 来源绑定("plan-1", "1", "plan-hash", "visible-text-codepoints/v1:production:generation"), 来源绑定("doc-1", "1", "hash-1", "visible-text-codepoints/v1:production:generation"), ) def test_同载荷同哈希且键序无关__b09301() -> None: 载荷 = 快照载荷("task-1", 范围, 装配, 绑定) assert 输入哈希(载荷) == 输入哈希(快照载荷("task-1", 范围, 装配, 绑定)) # 键序无关:把范围与载荷键按相反顺序重建,哈希不变 逆序范围 = {键: 范围[键] for 键 in reversed(list(范围))} 逆序载荷 = {键: 载荷[键] for 键 in reversed(list(载荷))} 逆序装配节 = {键: 载荷["装配"][键] for 键 in reversed(list(载荷["装配"]))} 逆序载荷["装配"] = 逆序装配节 逆序范围["target_plan"] = { 键: 范围["target_plan"][键] for 键 in reversed(list(范围["target_plan"])) } assert 输入哈希(逆序载荷) == 输入哈希(载荷) assert 输入哈希(快照载荷("task-1", 逆序范围, 装配, 绑定)) == 输入哈希(载荷) # 同一任务同一输入派生同一身份;文本哈希按 UTF-8 字节稳定 哈希 = 输入哈希(载荷) assert 快照身份("task-1", 哈希) == 快照身份("task-1", 哈希) assert 快照身份("task-1", 哈希) != 快照身份("task-2", 哈希) assert 文本哈希(装配.文本) == 文本哈希("邮差在旧码头确认收信人。\n\n林深停在码头。") def test_任一输入变化产生新哈希与新身份__b09302() -> None: 基准 = 输入哈希(快照载荷("task-1", 范围, 装配, 绑定)) 基准身份 = 快照身份("task-1", 基准) 变化装配省略 = 材料装配结果( 入选来源=装配.入选来源, 文本=装配.文本, 字节数=装配.字节数, 省略=(("事实:lin-shen", "BUDGET_EXCEEDED"), ("事实:dock-yard", "EMPTY")), ) 变化字节与文本 = 材料装配结果( 入选来源=("目标章细纲",), 文本="邮差在旧码头确认收信人。", 字节数=36, 省略=装配.省略 ) 变化文本同字节 = 材料装配结果( 入选来源=装配.入选来源, 文本="邮差在新码头确认收信人。\n\n林深停在码头。", 字节数=装配.字节数, 省略=装配.省略, ) 变化绑定 = (来源绑定("plan-1", "2", "plan-hash-2", 绑定[0].投影版本), 绑定[1]) 变化投影版本 = ( 来源绑定( 绑定[0].来源ID, 绑定[0].数据版本, 绑定[0].结构哈希, "visible-text-codepoints/v1:evaluation:generation", ), 绑定[1], ) 变化范围 = dict(范围, directory_revision=4) 变化哈希集 = { "省略": 输入哈希(快照载荷("task-1", 范围, 变化装配省略, 绑定)), "字节数": 输入哈希(快照载荷("task-1", 范围, 变化字节与文本, 绑定)), "文本同字节": 输入哈希(快照载荷("task-1", 范围, 变化文本同字节, 绑定)), "来源版本": 输入哈希(快照载荷("task-1", 范围, 装配, 变化绑定)), "投影版本": 输入哈希(快照载荷("task-1", 范围, 装配, 变化投影版本)), "目录版本": 输入哈希(快照载荷("task-1", 变化范围, 装配, 绑定)), } assert 基准 not in 变化哈希集.values() assert len(set(变化哈希集.values())) == len(变化哈希集) for 哈希 in 变化哈希集.values(): assert 快照身份("task-1", 哈希) != 基准身份