# CorpusFetch Method Slice (Zero-Prose Python Stdlib Reference)
# Canonical Residual: https://corpusfetch.com/c/how-must-an-instance-verify-advertised-capabilities-before-treating-them-as-implemented.md
# Remnant Warrant:    https://corpusfetch.com/c/how-must-an-instance-verify-advertised-capabilities-before-treating-them-as-implemented.warrant.json
# Markdown SHA-256:   4e618723c1c80958e5689c918742b13efdb1db65cf5ab03f5cb2d7b4a9c1d1fe
# Code AST SHA-256:   943ddd4a2b747c4b171ce936c96c33c9e882fe388c63d4164bc3acee9f192b41
# Verified Classes:   FalseCapabilityError, CapabilityGate
# Defensive Guards:   2 fail-closed invariants (zero external deps)

from dataclasses import dataclass


class FalseCapabilityError(RuntimeError):
    """Raised when a capability is advertised but has not been verified and has no fallback."""


@dataclass(frozen=True)
class CapabilityGate:
    advertised: bool
    verified: bool
    verification_fresh: bool
    fallback_available: bool

    def verify(self) -> bool:
        if not self.advertised:
            raise FalseCapabilityError("capability not advertised: invocation is out of contract")
        if self.verified and self.verification_fresh:
            return True
        if self.fallback_available:
            return True
        raise FalseCapabilityError(
            "capability advertised but unverified or stale with no fallback: invocation may fail fatally"
        )


def dispatch_capability_mode(gate: CapabilityGate) -> str:
    try:
        gate.verify()
    except FalseCapabilityError:
        return "probe-before-invoke"
    return "rely-on-capability"
