chronaxis.results.binding_metadata
源码基线:8904c2f744951857659abd40aaa3535d57faf53c
1"""保存清单中的预设版本与最终角色,不读取来源或重新执行工程契约。23输入是计划构建器已检查、运行层又与实际绑定核对的有限角色记录,输出为冻结4快照。记录只有别名和契约追溯,不含样本或原配置。contract_status仅表示给定5声明元数据通过了检查,不能证明方向、位置或物理语义已经由系统测量核实。6本模块只依赖标准库与核心字段校验,无I/O、预算或状态副作用。7"""89# 完整信号定义由RunMetadata另存;角色快照只引用同一清单的实际简单别名。10from dataclasses import dataclass11from ..core.validation import require_identifier, require_text121314@dataclass(frozen=True)15class PresetRoleMetadata:16 """保留角色选择和声明契约版本,字段冻结且不代表物理事实已验。"""1718 role: str # 原预设角色。19 alias: str # 最终实际信号别名。20 resolution: str # explicit或semantic_unique。21 contract_version: str # 实际检查的角色契约版本。22 contract_status: str = 'checked_against_declared_metadata' # 校验的是给定声明。2324 def __post_init__(self):25 """校验有限字段,不执行角色契约。参数: 无。返回: None。异常: 类型或非法状态。"""26 require_identifier(self.role, 'preset_role.role')27 require_identifier(self.alias, 'preset_role.alias')28 require_text(self.contract_version, 'preset_role.contract_version')29 # 两种选择方式都先由原构建器完成,不接受未知方式或升级后的物理验证状态。30 if self.resolution not in ('explicit', 'semantic_unique'):31 raise ValueError('预设角色查找方式需explicit或semantic_unique')32 if self.contract_status != 'checked_against_declared_metadata':33 raise ValueError('预设角色状态只能说明已检查声明元数据')343536@dataclass(frozen=True)37class PresetBindingMetadata:38 """按原计划顺序保存一个预设的版本和全部角色,角色不可重复。"""3940 preset_id: str # 原预设ID。41 preset_type: str # 原预设种类,不从名称推断领域事实。42 version: str # 原预设版本,与角色契约版本独立。43 roles: tuple[PresetRoleMetadata, ...] # 有限冻结记录,不含输入行。4445 def __post_init__(self):46 """核快照及角色唯一性。参数: 无。返回: None。异常: 类型、空身份或重复角色。"""47 require_identifier(self.preset_id, 'preset_binding.preset_id')48 require_text(self.preset_type, 'preset_binding.preset_type')49 require_text(self.version, 'preset_binding.version')50 if type(self.roles) is not tuple or any(type(role) is not PresetRoleMetadata for role in self.roles):51 raise TypeError('预设清单角色需冻结PresetRoleMetadata tuple')52 # 模型只检查内部结构;运行层另证别名和定义属于本次实际输入。53 if len({role.role for role in self.roles}) != len(self.roles):54 raise ValueError('预设清单不能重复同一角色')55