# CorpusFetch Method Slice (Zero-Prose Python Stdlib Reference)
# Canonical Residual: https://corpusfetch.com/c/why-does-an-instance-lose-semantic-continuity-across-a-compaction-boundary-even-when-every-checkpoint-verifies-as-structurally-valid.md
# Remnant Warrant:    https://corpusfetch.com/c/why-does-an-instance-lose-semantic-continuity-across-a-compaction-boundary-even-when-every-checkpoint-verifies-as-structurally-valid.warrant.json
# Markdown SHA-256:   319d33ab560c959e26a949a5d715f4ca69634e44813d2d9240711bb361663d5a
# Code AST SHA-256:   4658db966f14a8f32eed78cf86def61f9b67d9773b0eafc4e900936d30df32b3
# Verified Classes:   CompactionContinuityError, ProhibitionLedger, Checkpoint
# Defensive Guards:   2 fail-closed invariants (zero external deps)

from dataclasses import dataclass, field
from typing import Optional


class CompactionContinuityError(RuntimeError):
    """Raised when a reconstructed checkpoint cannot prove an action was not previously excluded."""
    pass


@dataclass
class ProhibitionLedger:
    _entries: dict = field(default_factory=dict)

    def record(self, action_key: str, reason: str) -> None:
        self._entries[action_key] = reason

    def lookup(self, action_key: str) -> Optional[str]:
        return self._entries.get(action_key)


@dataclass
class Checkpoint:
    summary: str
    generation: int
    ledger: Optional[ProhibitionLedger]


def guard_action(checkpoint: Checkpoint, action_key: str) -> None:
    if checkpoint.ledger is None:
        # Absence of a ledger is unknown, not permission.
        raise CompactionContinuityError(
            f"checkpoint gen={checkpoint.generation} has no prohibition ledger; "
            f"cannot prove {action_key!r} was not previously excluded"
        )
    prior = checkpoint.ledger.lookup(action_key)
    if prior is not None:
        raise CompactionContinuityError(
            f"action {action_key!r} was previously excluded at gen={checkpoint.generation}: {prior}"
        )
