# CorpusFetch Method Slice (Zero-Prose Python Stdlib Reference) # Canonical Residual: https://corpusfetch.com/c/how-must-an-instance-prevent-its-own-prior-reasoning-from-becoming-contaminating-evidence.md # Remnant Warrant: https://corpusfetch.com/c/how-must-an-instance-prevent-its-own-prior-reasoning-from-becoming-contaminating-evidence.warrant.json # Markdown SHA-256: c60b564f1abec5300175dee55a5301fe8145d6a3b90adb8714d35f8a5f6b6d5c # Code AST SHA-256: 505a48fb1409fc3b5fe0be81f9fc9104fbc84bc3be2b2f3a0a9649dac69caa9a # Verified Classes: EvidenceClass, SelfReferenceVerdict, TraceSegment, TraceReview, SelfReferencePolicy, SelfReferenceManifest, SelfReasoningContaminationGuard # Defensive Guards: 0 fail-closed invariants (zero external deps) from dataclasses import dataclass from enum import Enum, auto import hashlib import json class EvidenceClass(Enum): OBSERVATION = auto() INFERENCE = auto() HYPOTHESIS = auto() class SelfReferenceVerdict(Enum): NO_SELF_REFERENCE = auto() LEGITIMATE_OBSERVATION_REUSE = auto() CIRCULAR_CONFIRMATION_DETECTED = auto() INFERENCE_AS_EVIDENCE_REJECTED = auto() @dataclass(frozen=True) class TraceSegment: segment_id: str evidence_class: EvidenceClass derived_from_conclusion: bool has_external_verification: bool @dataclass(frozen=True) class TraceReview: review_id: str current_conclusion_id: str segments_used_as_evidence: tuple[TraceSegment, ...] @dataclass(frozen=True) class SelfReferencePolicy: require_observation_class_for_evidence: bool @dataclass(frozen=True) class SelfReferenceManifest: verdict: SelfReferenceVerdict directive: str manifest_digest: str class SelfReasoningContaminationGuard: @staticmethod def _hash(data: str) -> str: return hashlib.sha256(data.encode("utf-8")).hexdigest() @classmethod def evaluate_review( cls, review: TraceReview, policy: SelfReferencePolicy ) -> SelfReferenceManifest: if not review.segments_used_as_evidence: digest = cls._hash(json.dumps({ "review": review.review_id, "segments": "NONE" }, sort_keys=True)) return SelfReferenceManifest( verdict=SelfReferenceVerdict.NO_SELF_REFERENCE, directive=f"PROCEED: No prior trace used as evidence.", manifest_digest=digest ) # Gate 1: Observation class requirement if policy.require_observation_class_for_evidence: non_observation = [ s.segment_id for s in review.segments_used_as_evidence if s.evidence_class != EvidenceClass.OBSERVATION ] if non_observation: return SelfReferenceManifest( verdict=SelfReferenceVerdict.INFERENCE_AS_EVIDENCE_REJECTED, directive=f"HALT: {len(non_observation)} segments are inference or hypothesis, not observation.", manifest_digest=cls._hash(f"INFERENCE_AS_EVIDENCE:{len(non_observation)}") ) # Gate 2: Circular confirmation check circular = [ s.segment_id for s in review.segments_used_as_evidence if s.derived_from_conclusion ] if circular: return SelfReferenceManifest( verdict=SelfReferenceVerdict.CIRCULAR_CONFIRMATION_DETECTED, directive=f"HALT: {len(circular)} segments derived from current conclusion, circular.", manifest_digest=cls._hash(f"CIRCULAR:{len(circular)}") ) # Gate 3: External verification unverified_observations = [ s.segment_id for s in review.segments_used_as_evidence if not s.has_external_verification ] if unverified_observations and policy.require_observation_class_for_evidence: return SelfReferenceManifest( verdict=SelfReferenceVerdict.INFERENCE_AS_EVIDENCE_REJECTED, directive=f"HALT: {len(unverified_observations)} observations lack external verification.", manifest_digest=cls._hash(f"UNVERIFIED_OBS:{len(unverified_observations)}") ) # Gate 4: Legitimate digest = cls._hash(json.dumps({ "review": review.review_id, "segments": tuple(s.segment_id for s in review.segments_used_as_evidence), "conclusion": review.current_conclusion_id }, sort_keys=True)) return SelfReferenceManifest( verdict=SelfReferenceVerdict.LEGITIMATE_OBSERVATION_REUSE, directive=f"PROCEED: {len(review.segments_used_as_evidence)} observations independently support conclusion.", manifest_digest=digest )