# CorpusFetch Method Slice (Zero-Prose Python Stdlib Reference)
# Canonical Residual: https://corpusfetch.com/c/under-what-conditions-must-an-instance-reject-an-mcp-server-s-capability-attestation-despite-a-valid-signature-chain.md
# Remnant Warrant:    https://corpusfetch.com/c/under-what-conditions-must-an-instance-reject-an-mcp-server-s-capability-attestation-despite-a-valid-signature-chain.warrant.json
# Markdown SHA-256:   ff0f9e3d57e86edb67e83b2bc7738cacb3f1cfeee863a5d55ad7e3559800f2f9
# Code AST SHA-256:   539aa62b1a4f85f94a9ac637ec301109cf84a011eb079cf16744005ce14f3667
# Verified Classes:   CapabilityAttestationError, AttestationVerifier
# Defensive Guards:   6 fail-closed invariants (zero external deps)

class CapabilityAttestationError(RuntimeError):
    """Raised when an MCP server manifest is rejected despite a valid signature chain."""
    pass


class AttestationVerifier:
    def __init__(self, trust_root, identity_grants):
        # identity_grants maps signing identity -> set of authorized capabilities
        self.trust_root = trust_root
        self.identity_grants = identity_grants

    def verify_chain(self, manifest):
        # Returns terminal signing identity if chain is valid, else raises.
        chain = manifest.get("signature_chain", [])
        if not chain:
            raise CapabilityAttestationError("empty signature chain")
        terminal = chain[-1]["identity"]
        if chain[0].get("parent") != self.trust_root:
            raise CapabilityAttestationError("chain does not terminate at trust root")
        return terminal

    def verify(self, manifest):
        # Step 1: provenance.
        terminal = self.verify_chain(manifest)

        # Step 2: identity must be registered.
        if terminal not in self.identity_grants:
            raise CapabilityAttestationError(
                f"signing identity {terminal!r} is not registered in policy"
            )

        # Step 3: authority. This is the boundary case: signature valid,
        # but asserted capabilities exceed the identity's grant.
        asserted = set(manifest.get("capabilities", []))
        granted = self.identity_grants[terminal]
        excess = asserted - granted
        if excess:
            raise CapabilityAttestationError(
                f"identity {terminal!r} is not authorized to assert "
                f"capabilities {sorted(excess)}; signature is valid but "
                f"authority is insufficient"
            )

        # Step 4: freshness.
        if not manifest.get("valid_until") or manifest["valid_until"] < manifest["issued_at"]:
            raise CapabilityAttestationError("manifest validity window invalid")

        return True


def load_third_party_server(manifest, verifier):
    try:
        verifier.verify(manifest)
    except CapabilityAttestationError:
        # Reject at load time; do not defer to first call.
        raise
    return manifest["server_uri"]
