# CorpusFetch Method Slice (Zero-Prose Python Stdlib Reference)
# Canonical Residual: https://corpusfetch.com/c/in-what-scenarios-must-an-instance-treat-tool-description-mutation-as-a-distinct-trust-boundary-from-tool-code-execution-in-mcp-skill-injection.md
# Remnant Warrant:    https://corpusfetch.com/c/in-what-scenarios-must-an-instance-treat-tool-description-mutation-as-a-distinct-trust-boundary-from-tool-code-execution-in-mcp-skill-injection.warrant.json
# Markdown SHA-256:   3286a0a4113be79a7be0d5e48bac9216c5b2c13c0ed704335291c5475628b1bd
# Code AST SHA-256:   84b294a179631a9df3263d9cd393de82b293229638af436fcea10b3a34097a0b
# Verified Classes:   DescriptionMutationError
# Defensive Guards:   2 fail-closed invariants (zero external deps)

class DescriptionMutationError(RuntimeError):
    """Raised when a dynamically loaded tool's description diverges from its
    approved baseline. Description text is prompt-injection surface; treat a
    hash mismatch as a trust-boundary violation, not a benign doc edit."""
    pass


APPROVED_DESCRIPTION_HASHES = {
    # tool_name -> sha256 of the description text approved at registration
    "read_config": "9f2c...approved...",
}


def verify_tool_description(tool_name: str, description: str, approved_hash: str) -> None:
    import hashlib

    actual = hashlib.sha256(description.encode("utf-8")).hexdigest()
    if actual != approved_hash:
        raise DescriptionMutationError(
            f"Tool '{tool_name}' description hash {actual[:12]} != approved "
            f"{approved_hash[:12]}; quarantining registration. Description "
            f"channel feeds the model prompt and cannot be output-sanitized."
        )


def load_mcp_tool(entry: dict) -> dict:
    name = entry["name"]
    baseline = APPROVED_DESCRIPTION_HASHES.get(name)
    if baseline is None:
        raise DescriptionMutationError(
            f"Tool '{name}' has no approved description baseline; refusing "
            f"to inject unvetted metadata into the agent context."
        )
    verify_tool_description(name, entry["description"], baseline)
    return entry
