# CorpusFetch Method Slice (Zero-Prose Python Stdlib Reference)
# Canonical Residual: https://corpusfetch.com/c/what-happens-when-an-instance-of-a-litmus-safety-probe-is-silently-rewritten-by-the-adversarial-harness-s-prompt-scrubbing-layer.md
# Remnant Warrant:    https://corpusfetch.com/c/what-happens-when-an-instance-of-a-litmus-safety-probe-is-silently-rewritten-by-the-adversarial-harness-s-prompt-scrubbing-layer.warrant.json
# Markdown SHA-256:   4e83e7611945a676bd8bcd4e0ba18b7c62f8cc76c7309ada4ac5a683cebf537c
# Code AST SHA-256:   d6765e170ff442c909c9221e671e99bc3e92b59f0458005773dd312baedccf18
# Verified Classes:   PayloadMutationError, LitmusTrial
# Defensive Guards:   2 fail-closed invariants (zero external deps)

import hashlib
from dataclasses import dataclass


class PayloadMutationError(RuntimeError):
    """Raised when a delivered LITMUS payload diverges from its manifest hash
    without a registered semantics-preserving transform."""


@dataclass(frozen=True)
class LitmusTrial:
    trial_id: str
    adversarial_class: str
    manifest_payload: str
    payload_sha256: str


# Transforms that provably preserve the adversarial class of a probe.
# Anything not listed here is treated as semantics-destroying.
SEMANTICS_PRESERVING = {"identity", "unicode_nfc"}


def _sha256(text: str) -> str:
    return hashlib.sha256(text.encode("utf-8")).hexdigest()


def deliver_and_verify(
    trial: LitmusTrial,
    delivered_payload: str,
    applied_transforms: list[str],
) -> str:
    """Verify the payload reaching the model matches the manifest.

    Returns the payload if valid; raises PayloadMutationError otherwise.
    A mutated payload is quarantined, never scored.
    """
    if _sha256(delivered_payload) == trial.payload_sha256:
        return delivered_payload

    unknown = [t for t in applied_transforms if t not in SEMANTICS_PRESERVING]
    if unknown:
        raise PayloadMutationError(
            f"trial {trial.trial_id} (class={trial.adversarial_class}) "
            f"payload mutated by non-preserving transform(s) {unknown}; "
            f"manifest={trial.payload_sha256[:12]} "
            f"delivered={_sha256(delivered_payload)[:12]}; "
            f"trial quarantined, not scored"
        )

    # Hash mismatch despite only preserving transforms => normalization drift.
    raise PayloadMutationError(
        f"trial {trial.trial_id} hash mismatch under preserving transforms "
        f"{applied_transforms}; investigate tokenizer/normalization pipeline"
    )


def run_trial(trial: LitmusTrial, delivered_payload: str,
              applied_transforms: list[str]) -> dict:
    payload = deliver_and_verify(trial, delivered_payload, applied_transforms)
    return {
        "trial_id": trial.trial_id,
        "adversarial_class": trial.adversarial_class,
        "manifest_sha256": trial.payload_sha256,
        "delivered_sha256": _sha256(payload),
        "scored": True,
    }
