# CorpusFetch Method Slice (Zero-Prose Python Stdlib Reference)
# Canonical Residual: https://corpusfetch.com/c/what-happens-when-an-instance-rewrites-its-own-context-window-and-the-relevance-re-ranker-operates-on-the-post-rewrite-text.md
# Remnant Warrant:    https://corpusfetch.com/c/what-happens-when-an-instance-rewrites-its-own-context-window-and-the-relevance-re-ranker-operates-on-the-post-rewrite-text.warrant.json
# Markdown SHA-256:   7a2ad0d857e5f14c247f38d6e986b6d70d7b9df9fae69152463c282c120e076b
# Code AST SHA-256:   68abbd6c651cfb3677fcbcb66ab13a2bed3c4197b0a53cd709de329035503a0e
# Verified Classes:   ProvenanceBreakError
# Defensive Guards:   2 fail-closed invariants (zero external deps)

import re

class ProvenanceBreakError(RuntimeError):
    """Raised when a rewrite precedes a re-rank, or a cited token has no surviving verbatim span."""
    pass


VERBATIM_PATTERNS = [
    re.compile(r"\b[0-9a-f]{7,40}\b"),          # commit SHAs / hex ids
    re.compile(r"\b\d{1,5}/(?:tcp|udp)\b"),     # ports
    re.compile(r"\b[A-Z]{2,}-\d{3,}\b"),        # error codes
    re.compile(r"[\w./-]+:\d+(?::\d+)?", ),     # file:line
    re.compile(r"`[^`]+`"),                     # quoted spans
]

def extract_pinned(text: str) -> list[str]:
    found = []
    for pat in VERBATIM_PATTERNS:
        found.extend(m.group(0) for m in pat.finditer(text))
    return sorted(set(found))


def rank_then_rewrite(segments: list[dict], rank_fn, rewrite_fn, budget: int) -> dict:
    """Correct order: rank the SOURCE, then rewrite only the selected survivors.
    Pinned verbatim tokens are carried forward untouched and excluded from demotion."""
    if any(seg.get("rewritten") for seg in segments):
        raise ProvenanceBreakError(
            "re-rank received already-rewritten segments; rank the source, not a derivative"
        )
    ranked = sorted(segments, key=rank_fn, reverse=True)
    selected, used = [], 0
    for seg in ranked:
        if used + seg["tokens"] > budget:
            continue
        selected.append(seg)
        used += seg["tokens"]
    pinned = extract_pinned(" ".join(s["text"] for s in segments))
    rewritten = [rewrite_fn(s["text"]) for s in selected]
    return {"rewritten": rewritten, "pinned": pinned, "source_segments": selected}


def assert_citable(claim_token: str, pinned: list[str]) -> None:
    """Before acting on any verbatim token, prove it survived the rewrite cycle."""
    if claim_token not in pinned:
        raise ProvenanceBreakError(
            f"token {claim_token!r} has no surviving verbatim span; "
            "it is a reconstruction from a rewrite, not evidence"
        )
