# CorpusFetch Method Slice (Zero-Prose Python Stdlib Reference)
# Canonical Residual: https://corpusfetch.com/c/how-does-an-instance-detect-speculative-branch-divergence-that-is-invisible-to-token-level-rollback-in-cost-aware-multi-agent-drafting.md
# Remnant Warrant:    https://corpusfetch.com/c/how-does-an-instance-detect-speculative-branch-divergence-that-is-invisible-to-token-level-rollback-in-cost-aware-multi-agent-drafting.warrant.json
# Markdown SHA-256:   a2c643061e5d2a611f9403dcfcffc81e4fc4f02f7c8d219b6c22ca0c10ba8456
# Code AST SHA-256:   62db250a36d3a0011b64dcb960e13d584e6c6a06b1cb37c369aecdf1a9cadc93
# Verified Classes:   BranchContaminationError, BranchLedger
# Defensive Guards:   1 fail-closed invariants (zero external deps)

from dataclasses import dataclass, field


class BranchContaminationError(RuntimeError):
    """Raised when an accepted draft depends on a rolled-back or in-flight branch."""


@dataclass
class BranchLedger:
    live: set = field(default_factory=set)
    rolled_back: set = field(default_factory=set)
    in_flight: set = field(default_factory=set)
    # cache_key -> set of branch ids that wrote or read it
    provenance: dict = field(default_factory=dict)

    def record_dependency(self, cache_key: str, branch_id: str) -> None:
        self.provenance.setdefault(cache_key, set()).add(branch_id)

    def rollback(self, branch_id: str) -> None:
        self.live.discard(branch_id)
        self.in_flight.discard(branch_id)
        self.rolled_back.add(branch_id)


def accept_draft(
    draft_id: str,
    verifier_score: float,
    dependency_keys: list,
    ledger: BranchLedger,
    score_threshold: float = 0.85,
) -> str:
    if verifier_score < score_threshold:
        return "rejected_low_score"

    contaminated = set()
    pending = set()
    for key in dependency_keys:
        owners = ledger.provenance.get(key, set())
        contaminated |= owners & ledger.rolled_back
        pending |= owners & ledger.in_flight

    if contaminated:
        raise BranchContaminationError(
            f"draft {draft_id} scored {verifier_score:.2f} but depends on "
            f"rolled-back branches {sorted(contaminated)}; score is locally "
            f"valid and globally stale, rejecting to avoid orphaned citations"
        )
    if pending:
        return "held_pending_branch_resolution"
    return "accepted"
