# CorpusFetch Method Slice (Zero-Prose Python Stdlib Reference)
# Canonical Residual: https://corpusfetch.com/c/in-what-scenarios-must-an-instance-treat-a-verifiable-execution-receipt-as-insufficient-evidence-for-reputation-slashing-under-federated-agent-governa.md
# Remnant Warrant:    https://corpusfetch.com/c/in-what-scenarios-must-an-instance-treat-a-verifiable-execution-receipt-as-insufficient-evidence-for-reputation-slashing-under-federated-agent-governa.warrant.json
# Markdown SHA-256:   6fbeeeca9144528167fd29ea3102aea19c0ab3dbc9eaab774752383865b2a8d2
# Code AST SHA-256:   b50429ce21328dcaa2ddd6bb7261b593753447d25e9eca92b8ba5866c17ce73a
# Verified Classes:   InsufficientReceiptEvidence, Receipt
# Defensive Guards:   1 fail-closed invariants (zero external deps)

from dataclasses import dataclass
from typing import Optional


class InsufficientReceiptEvidence(RuntimeError):
    """Raised when a receipt is cryptographically valid but not sufficient
    to justify slashing. The caller MUST abstain from slashing and defer."""
    pass


@dataclass
class Receipt:
    valid_signature: bool
    task_deterministic: bool
    replay_equivalence_commitment: Optional[str]
    issuance_policy_version: str
    adjudication_policy_version: str
    issuance_timestamp: float
    witness_keys_at_issuance: frozenset
    witness_keys_at_adjudication: frozenset
    subject_uniquely_bound: bool


def adjudicate_slash(receipt: Receipt, policy_registry, trust_registry) -> str:
    if not receipt.valid_signature:
        return "slash:attestation_failure"

    reasons = []

    # Condition 1: determinism closure
    if not receipt.task_deterministic and not receipt.replay_equivalence_commitment:
        reasons.append("no determinism closure for stochastic task")

    # Condition 2: policy temporal alignment
    if receipt.issuance_policy_version != receipt.adjudication_policy_version:
        if not policy_registry.is_authoritative_at(
            receipt.issuance_policy_version, receipt.issuance_timestamp
        ):
            reasons.append("issuance policy version not retrievable/authoritative")

    # Condition 3: trust-anchor temporal alignment
    if not receipt.witness_keys_at_issuance.issubset(
        trust_registry.trusted_at(receipt.issuance_timestamp)
    ):
        reasons.append("witness key not trusted at issuance time")

    # Condition 4: non-identifiability guard
    if not receipt.subject_uniquely_bound:
        reasons.append("subject not uniquely bound to execution")

    if reasons:
        raise InsufficientReceiptEvidence(
            "receipt valid but sufficiency predicate failed: "
            + "; ".join(reasons)
            + " -- abstain from slashing, defer to review"
        )

    return "slash:sufficiency_satisfied"
