# CorpusFetch Method Slice (Zero-Prose Python Stdlib Reference) # Canonical Residual: https://corpusfetch.com/c/what-invariants-preserve-contract-integrity-when-the-delegating-principal-changes.md # Remnant Warrant: https://corpusfetch.com/c/what-invariants-preserve-contract-integrity-when-the-delegating-principal-changes.warrant.json # Markdown SHA-256: 5ff3f38d4f6c116a44a1f4fb76313fd70d0692d332e5fa5e6fb11c6236d41a80 # Code AST SHA-256: e9963f1e950dd8846c15a2b1065db699f83666f1adac98671e29deddfa41f085 # Verified Classes: ContractContinuityVerdict, ContractTransition, ContinuityPolicy, ContinuityManifest, PrincipalTransitionGuard # Defensive Guards: 0 fail-closed invariants (zero external deps) from dataclasses import dataclass from enum import Enum, auto import hashlib import json class ContractContinuityVerdict(Enum): NO_TRANSITION = auto() CONTINUED_ACCEPTED = auto() HALTED_REJECTED = auto() CONTINUED_PARTIAL = auto() @dataclass(frozen=True) class ContractTransition: contract_id: str original_principal: str new_principal: str new_principal_acceptance: bool partial_acceptance_receipt: str | None transition_instrument_exists: bool @dataclass(frozen=True) class ContinuityPolicy: require_explicit_acceptance: bool @dataclass(frozen=True) class ContinuityManifest: verdict: ContractContinuityVerdict directive: str manifest_digest: str class PrincipalTransitionGuard: @staticmethod def _hash(data: str) -> str: return hashlib.sha256(data.encode("utf-8")).hexdigest() @classmethod def evaluate_transition( cls, transition: ContractTransition, policy: ContinuityPolicy ) -> ContinuityManifest: # Gate 1: No transition if transition.original_principal == transition.new_principal: digest = cls._hash(json.dumps({ "contract": transition.contract_id, "transition": False }, sort_keys=True)) return ContinuityManifest( verdict=ContractContinuityVerdict.NO_TRANSITION, directive=f"PROCEED: Contract {transition.contract_id} no principal change.", manifest_digest=digest ) # Gate 2: Full acceptance if transition.new_principal_acceptance: digest = cls._hash(json.dumps({ "contract": transition.contract_id, "accepted": True }, sort_keys=True)) return ContinuityManifest( verdict=ContractContinuityVerdict.CONTINUED_ACCEPTED, directive=f"PROCEED: Contract {transition.contract_id} accepted by new principal.", manifest_digest=digest ) # Gate 3: Partial acceptance if transition.partial_acceptance_receipt: digest = cls._hash(json.dumps({ "contract": transition.contract_id, "partial": transition.partial_acceptance_receipt }, sort_keys=True)) return ContinuityManifest( verdict=ContractContinuityVerdict.CONTINUED_PARTIAL, directive=f"PROCEED_WITH_SCOPE: Contract {transition.contract_id} partially accepted.", manifest_digest=digest ) # Gate 4: Transition instrument if transition.transition_instrument_exists and not policy.require_explicit_acceptance: digest = cls._hash(json.dumps({ "contract": transition.contract_id, "instrument": True }, sort_keys=True)) return ContinuityManifest( verdict=ContractContinuityVerdict.CONTINUED_ACCEPTED, directive=f"PROCEED: Contract {transition.contract_id} inherited via transition instrument.", manifest_digest=digest ) # Gate 5: Rejected return ContinuityManifest( verdict=ContractContinuityVerdict.HALTED_REJECTED, directive=f"HALT: Contract {transition.contract_id} not accepted by new principal.", manifest_digest=cls._hash(f"REJECTED:{transition.contract_id}") )