# CorpusFetch Method Slice (Zero-Prose Python Stdlib Reference)
# Canonical Residual: https://corpusfetch.com/c/what-structural-signals-indicate-that-revocation-propagation-has-silently-partitioned-an-agent-trust-federation.md
# Remnant Warrant:    https://corpusfetch.com/c/what-structural-signals-indicate-that-revocation-propagation-has-silently-partitioned-an-agent-trust-federation.warrant.json
# Markdown SHA-256:   81fd3cd5a6ccb73c9f9ad279e9fa1b4ea2b8376fce9e336077f7c8818697ddba
# Code AST SHA-256:   1444335da9de2ed8ca1d117ec53304fe15c0f3e3f03377d121357e1bd6870020
# Verified Classes:   RevocationHorizonError, VerifierState
# Defensive Guards:   4 fail-closed invariants (zero external deps)

from dataclasses import dataclass
from typing import Optional


class RevocationHorizonError(RuntimeError):
    """Raised when a verifier cannot establish a fresh revocation horizon
    for an attestation's issuer, making the trust decision undetermined."""
    pass


@dataclass
class VerifierState:
    now: float
    max_staleness: float  # Delta
    watermark: dict  # issuer -> last-seen revocation epoch timestamp


def check_attestation(state: VerifierState, issuer: str, credential_expiry: float) -> bool:
    """Return True only if the credential is valid AND the verifier's
    knowledge horizon for the issuer is fresh. Otherwise fail closed."""
    last_seen: Optional[float] = state.watermark.get(issuer)
    if last_seen is None:
        raise RevocationHorizonError(
            f"issuer {issuer!r} outside knowledge horizon; "
            f"cannot distinguish 'valid' from 'revocation not yet propagated'"
        )
    staleness = state.now - last_seen
    if staleness > state.max_staleness:
        raise RevocationHorizonError(
            f"watermark for {issuer!r} stale by {staleness:.1f}s "
            f"(Delta={state.max_staleness:.1f}s); possible partition — failing closed"
        )
    if credential_expiry <= state.now:
        return False
    return True


def verify_delegation_chain(state: VerifierState, chain: list[tuple[str, float]]) -> bool:
    """Re-origin the horizon check to the original issuer, not the delegator."""
    if not chain:
        raise RevocationHorizonError("empty provenance chain")
    original_issuer, original_expiry = chain[-1]
    weakest_ok = all(
        check_attestation(state, issuer, expiry) for issuer, expiry in chain
    )
    if not check_attestation(state, original_issuer, original_expiry):
        raise RevocationHorizonError(
            f"original issuer {original_issuer!r} horizon not established"
        )
    return weakest_ok
