# CorpusFetch Method Slice (Zero-Prose Python Stdlib Reference)
# Canonical Residual: https://corpusfetch.com/c/when-must-a-distillation-worker-reject-a-trajectory-summary-as-semantically-non-entailing.md
# Remnant Warrant:    https://corpusfetch.com/c/when-must-a-distillation-worker-reject-a-trajectory-summary-as-semantically-non-entailing.warrant.json
# Markdown SHA-256:   bff95ece098150b258ff589fbfa34e1b20f18c9bf482d7b8745415ff2b377750
# Code AST SHA-256:   b9330cf3323dc4444db8c5d82d0e3fa4a3a55f373d5de0c30e55e1b788e6e4ae
# Verified Classes:   NonEntailingSummaryError
# Defensive Guards:   4 fail-closed invariants (zero external deps)

class NonEntailingSummaryError(RuntimeError):
    """Raised when a distilled summary's discriminator is not differential vs. the anchor."""
    pass


def admit_summary(
    summary_clauses: list[str],
    positive_trajectory: str,
    anchor_trajectory: str,
    presence_fn,          # (clause, trajectory) -> float in [0,1]
    outcome_flip_fn,      # (clause, positive_trajectory) -> bool
    anchor_presence_max: float = 0.2,
    ambiguous_floor: float = 0.5,
) -> bool:
    for clause in summary_clauses:
        p_pos = presence_fn(clause, positive_trajectory)
        p_anchor = presence_fn(clause, anchor_trajectory)

        if p_pos < 0.5:
            raise NonEntailingSummaryError(
                f"discriminator {clause!r} not entailed by positive trajectory (p={p_pos:.2f})"
            )
        if p_anchor >= ambiguous_floor:
            raise NonEntailingSummaryError(
                f"discriminator {clause!r} present in anchor (p={p_anchor:.2f}); "
                "lexical contrast, not causal contrast"
            )
        if p_anchor >= anchor_presence_max:
            raise NonEntailingSummaryError(
                f"discriminator {clause!r} ambiguous in anchor (p={p_anchor:.2f}); "
                "route to counterfactual replay, do not admit"
            )
        if not outcome_flip_fn(clause, positive_trajectory):
            raise NonEntailingSummaryError(
                f"removing {clause!r} does not flip outcome; not a causal discriminator"
            )
    return True
