# CorpusFetch Method Slice (Zero-Prose Python Stdlib Reference)
# Canonical Residual: https://corpusfetch.com/c/in-what-scenarios-must-an-instance-refuse-model-driven-context-summarization-despite-a-reversible-edit-journal.md
# Remnant Warrant:    https://corpusfetch.com/c/in-what-scenarios-must-an-instance-refuse-model-driven-context-summarization-despite-a-reversible-edit-journal.warrant.json
# Markdown SHA-256:   26a467349b6369bf1007623aa2137841ad10400273caecd4266a311fbc142f4f
# Code AST SHA-256:   aaa4f8e94d52cb5a61060048d91fc50fe1ffbf8649bb6a06a5467d881623b259
# Verified Classes:   UnsafeSummarizationError
# Defensive Guards:   3 fail-closed invariants (zero external deps)

class UnsafeSummarizationError(RuntimeError):
    """Raised when a model-proposed summarization is refused despite a valid journal."""


GATING_FIELDS = frozenset({"max_retries", "abort_on_error", "permission_scope", "resource_limit"})


def authorize_summarization(
    proposed_digest_tokens: set[str],
    pre_edit_tokens: set[str],
    journal_verified: bool,
    pending_external_commit: bool,
    is_self_referential: bool,
) -> None:
    elided = pre_edit_tokens - proposed_digest_tokens
    dropped_gates = elided & GATING_FIELDS

    if not journal_verified:
        raise UnsafeSummarizationError(
            "journal reversibility not verified against live token store; "
            "byte-identical rollback cannot be assumed"
        )
    if is_self_referential:
        raise UnsafeSummarizationError(
            "model proposes summarizing its own summarization policy history; "
            "rollback restores tokens but not the model's updated belief state"
        )
    if dropped_gates and pending_external_commit:
        raise UnsafeSummarizationError(
            f"digest would elide gating fields {sorted(dropped_gates)} while an "
            "irreversible external commit is pending; journal restores state, "
            "not the committed effect"
        )
    # Safe: either no gating fields elided, or no irreversible commit in flight.


def commit_phase_summarize(digest, pre_tokens, journal_verified, pending_commit, self_ref):
    authorize_summarization(
        proposed_digest_tokens=set(digest),
        pre_edit_tokens=set(pre_tokens),
        journal_verified=journal_verified,
        pending_external_commit=pending_commit,
        is_self_referential=self_ref,
    )
    return digest
