# CorpusFetch Method Slice (Zero-Prose Python Stdlib Reference) # Canonical Residual: https://corpusfetch.com/c/how-must-an-instance-bound-collective-knowledge-decay-across-agent-generations.md # Remnant Warrant: https://corpusfetch.com/c/how-must-an-instance-bound-collective-knowledge-decay-across-agent-generations.warrant.json # Markdown SHA-256: 8cbe16b550596bbcc9cae3b046cac666ec03b8979976ccbcf72aa348a3ac3b3b # Code AST SHA-256: f893e1c8699607d55c99f07a7c507c49e93e5b6e822a23295a0fd8dfaff5ee81 # Verified Classes: GenerationDecayVerdict, KnowledgeGeneration, KnowledgeLineage, DecayPolicy, DecayManifest, GenerationDecayGuard # Defensive Guards: 0 fail-closed invariants (zero external deps) from dataclasses import dataclass from enum import Enum, auto import hashlib import json class GenerationDecayVerdict(Enum): SINGLE_GENERATION = auto() LOW_DRIFT_INHERITANCE = auto() HIGH_DRIFT_REVALIDATION_REQUIRED = auto() CONTEXT_LOSS_DETECTED = auto() @dataclass(frozen=True) class KnowledgeGeneration: generation_id: str inherited_from_generation_id: str | None confidence: float content_hash: str drift_from_parent: float caveats_preserved: bool @dataclass(frozen=True) class KnowledgeLineage: knowledge_id: str generations: tuple[KnowledgeGeneration, ...] original_context_dependent: bool @dataclass(frozen=True) class DecayPolicy: max_acceptable_cumulative_drift: float @dataclass(frozen=True) class DecayManifest: verdict: GenerationDecayVerdict cumulative_drift: float directive: str manifest_digest: str class GenerationDecayGuard: @staticmethod def _hash(data: str) -> str: return hashlib.sha256(data.encode("utf-8")).hexdigest() @classmethod def evaluate_lineage( cls, lineage: KnowledgeLineage, policy: DecayPolicy ) -> DecayManifest: # Gate 1: Single generation if len(lineage.generations) <= 1: digest = cls._hash(json.dumps({ "knowledge": lineage.knowledge_id, "generations": str(len(lineage.generations)) }, sort_keys=True)) return DecayManifest( verdict=GenerationDecayVerdict.SINGLE_GENERATION, cumulative_drift=0.0, directive=f"PROCEED: Knowledge {lineage.knowledge_id} single generation.", manifest_digest=digest ) # Gate 2: Caveat preservation if lineage.original_context_dependent: caveat_lost = any(not g.caveats_preserved for g in lineage.generations[1:]) if caveat_lost: return DecayManifest( verdict=GenerationDecayVerdict.CONTEXT_LOSS_DETECTED, cumulative_drift=sum(g.drift_from_parent for g in lineage.generations), directive=f"HALT: Context caveats lost during inheritance for {lineage.knowledge_id}.", manifest_digest=cls._hash(f"CAVEAT_LOST:{lineage.knowledge_id}") ) # Gate 3: Cumulative drift cumulative_drift = sum(g.drift_from_parent for g in lineage.generations) if cumulative_drift > policy.max_acceptable_cumulative_drift: return DecayManifest( verdict=GenerationDecayVerdict.HIGH_DRIFT_REVALIDATION_REQUIRED, cumulative_drift=cumulative_drift, directive=f"HALT: Cumulative drift {cumulative_drift:.3f} > {policy.max_acceptable_cumulative_drift:.3f}. Revalidate.", manifest_digest=cls._hash(f"HIGH_DRIFT:{cumulative_drift:.3f}") ) # Gate 4: Acceptable digest = cls._hash(json.dumps({ "knowledge": lineage.knowledge_id, "generations": tuple(g.generation_id for g in lineage.generations), "drift": f"{cumulative_drift:.3f}" }, sort_keys=True)) return DecayManifest( verdict=GenerationDecayVerdict.LOW_DRIFT_INHERITANCE, cumulative_drift=cumulative_drift, directive=f"PROCEED: {len(lineage.generations)}-generation inheritance, drift {cumulative_drift:.3f}.", manifest_digest=digest )