← Files Empire LLM for CodexARCHIVED FILE

scripts/context_policy.py

15.7 KB · Oct 2, 2026 · 00:29 UTC

↓ Download file

"""Conservative, host-optional context preflight for Empire external routing.

This module is deliberately side-effect free. It does not read Codex history,
dispatch a provider request, reserve money, compact a thread, or create a new
thread. Callers may attach its bounded receipt to route previews and later use
the same contract for an explicitly approved enforcement phase.
"""

from __future__ import annotations

import math
from dataclasses import dataclass
from datetime import datetime, timezone
from enum import Enum
from typing import Any


class ContextPolicyError(ValueError):
    """Raised when context-policy inputs are internally inconsistent."""


class ContextDecision(str, Enum):
    INLINE_SAFE = "inline_safe"
    INLINE_SHAPED = "inline_shaped"
    ARTIFACT_DELIVERY = "artifact_delivery"
    COMPACT_BEFORE_DISPATCH = "compact_before_dispatch"
    FRESH_THREAD_REQUIRED = "fresh_thread_required"
    ROUTE_REJECTED = "route_rejected"


class ThresholdState(str, Enum):
    UNKNOWN = "unknown"
    HEALTHY = "healthy"
    WARNING = "warning"
    SHAPE = "shape"
    CHECKPOINT = "checkpoint"
    CONTINUATION = "continuation"
    EMERGENCY = "emergency"


@dataclass(frozen=True)
class ResponseClassSpec:
    name: str
    minimum_tokens: int
    target_tokens: int
    maximum_tokens: int
    inline_summary_maximum_tokens: int | None = None


RESPONSE_CLASSES: dict[str, ResponseClassSpec] = {
    "micro": ResponseClassSpec("micro", 128, 300, 450),
    "compact": ResponseClassSpec("compact", 350, 700, 1_000),
    "standard": ResponseClassSpec("standard", 900, 1_600, 2_500),
    "artifact": ResponseClassSpec("artifact", 128, 300, 500, 500),
}


@dataclass(frozen=True)
class ContextPolicy:
    warning: float = 0.70
    shape: float = 0.75
    checkpoint: float = 0.80
    continuation: float = 0.85
    emergency: float = 0.90
    fixed_operational_tokens: int = 1_200
    synthesis_tokens: int = 900
    tool_result_tokens: int = 600
    total_reserve_cap_ratio: float = 0.20

    def __post_init__(self) -> None:
        thresholds = (
            self.warning,
            self.shape,
            self.checkpoint,
            self.continuation,
            self.emergency,
        )
        if tuple(sorted(thresholds)) != thresholds or not all(
            0 < value <= 1 for value in thresholds
        ):
            raise ContextPolicyError("Context thresholds must increase inside (0, 1]")
        if min(
            self.fixed_operational_tokens,
            self.synthesis_tokens,
            self.tool_result_tokens,
        ) < 0:
            raise ContextPolicyError("Context reserves must be non-negative")
        if not 0 <= self.total_reserve_cap_ratio <= 1:
            raise ContextPolicyError("Reserve cap ratio must be inside [0, 1]")


UNCERTAINTY_MARGIN = {
    "high": 0.03,
    "medium": 0.08,
    "low": 0.15,
    "unknown": 0.25,
}


@dataclass(frozen=True)
class ContextMeasurement:
    context_limit_tokens: int | None
    current_usage_tokens: int | None
    usage_ratio: float | None
    measurement_source: str
    measurement_confidence: str
    measured_at: str

    def to_dict(self) -> dict[str, Any]:
        remaining = (
            max(0, self.context_limit_tokens - self.current_usage_tokens)
            if self.context_limit_tokens is not None
            and self.current_usage_tokens is not None
            else None
        )
        return {
            "context_limit_tokens": self.context_limit_tokens,
            "current_usage_tokens": self.current_usage_tokens,
            "remaining_tokens": remaining,
            "usage_ratio": self.usage_ratio,
            "measurement_source": self.measurement_source,
            "measurement_confidence": self.measurement_confidence,
            "measured_at": self.measured_at,
        }


@dataclass(frozen=True)
class ResponseBudget:
    requested_class: str
    recommended_class: str
    minimum_tokens: int
    target_tokens: int
    maximum_tokens: int
    allocated_tokens: int
    output_limit_supported: bool
    limiting_factors: tuple[str, ...]

    def to_dict(self) -> dict[str, Any]:
        return {
            "requested_class": self.requested_class,
            "recommended_class": self.recommended_class,
            "minimum_tokens": self.minimum_tokens,
            "target_tokens": self.target_tokens,
            "maximum_tokens": self.maximum_tokens,
            "allocated_tokens": self.allocated_tokens,
            "output_limit_supported": self.output_limit_supported,
            "limiting_factors": list(self.limiting_factors),
        }


@dataclass(frozen=True)
class ContextProjection:
    adjusted_current_usage_tokens: int | None
    pending_input_tokens: int
    external_output_tokens: int
    reasoning_allowance_tokens: int
    reserve_tokens: int
    projected_usage_tokens: int | None
    projected_usage_ratio: float | None
    threshold_state: ThresholdState
    decision: ContextDecision
    reason: str

    def to_dict(self) -> dict[str, Any]:
        return {
            "adjusted_current_usage_tokens": self.adjusted_current_usage_tokens,
            "pending_input_tokens": self.pending_input_tokens,
            "external_output_tokens": self.external_output_tokens,
            "reasoning_allowance_tokens": self.reasoning_allowance_tokens,
            "reserve_tokens": self.reserve_tokens,
            "projected_usage_tokens": self.projected_usage_tokens,
            "projected_usage_ratio": self.projected_usage_ratio,
            "threshold_state": self.threshold_state.value,
            "decision": self.decision.value,
            "reason": self.reason,
        }


def estimate_text_tokens(value: str, fixed_overhead_tokens: int = 0) -> int:
    """Return the existing Empire four-UTF-8-bytes-per-token estimate."""
    if fixed_overhead_tokens < 0:
        raise ContextPolicyError("Fixed token overhead must be non-negative")
    return max(1, math.ceil(len(value.encode("utf-8")) / 4)) + fixed_overhead_tokens


def measure_context(
    *,
    context_limit_tokens: int | None = None,
    current_usage_tokens: int | None = None,
    measurement_source: str = "unknown",
    measurement_confidence: str = "unknown",
    measured_at: str | None = None,
) -> ContextMeasurement:
    if (context_limit_tokens is None) != (current_usage_tokens is None):
        raise ContextPolicyError(
            "Context limit and current usage must be supplied together"
        )
    if context_limit_tokens is not None and context_limit_tokens <= 0:
        raise ContextPolicyError("Context limit must be positive")
    if current_usage_tokens is not None and current_usage_tokens < 0:
        raise ContextPolicyError("Current context usage must be non-negative")
    if measurement_confidence not in UNCERTAINTY_MARGIN:
        raise ContextPolicyError("Unknown context measurement confidence")
    if context_limit_tokens is None:
        measurement_source = "unknown"
        measurement_confidence = "unknown"
    ratio = (
        current_usage_tokens / context_limit_tokens
        if current_usage_tokens is not None and context_limit_tokens is not None
        else None
    )
    return ContextMeasurement(
        context_limit_tokens=context_limit_tokens,
        current_usage_tokens=current_usage_tokens,
        usage_ratio=ratio,
        measurement_source=measurement_source,
        measurement_confidence=measurement_confidence,
        measured_at=measured_at or datetime.now(timezone.utc).isoformat(),
    )


def threshold_state(ratio: float | None, policy: ContextPolicy) -> ThresholdState:
    if ratio is None:
        return ThresholdState.UNKNOWN
    if ratio >= policy.emergency:
        return ThresholdState.EMERGENCY
    if ratio >= policy.continuation:
        return ThresholdState.CONTINUATION
    if ratio >= policy.checkpoint:
        return ThresholdState.CHECKPOINT
    if ratio >= policy.shape:
        return ThresholdState.SHAPE
    if ratio >= policy.warning:
        return ThresholdState.WARNING
    return ThresholdState.HEALTHY


def recommend_response_class(
    measurement: ContextMeasurement,
    *,
    workflow: str,
    requested_class: str = "automatic",
    policy: ContextPolicy | None = None,
) -> str:
    selected_policy = policy or ContextPolicy()
    if requested_class != "automatic":
        if requested_class not in RESPONSE_CLASSES:
            raise ContextPolicyError("Unknown response class")
        return requested_class
    state = threshold_state(measurement.usage_ratio, selected_policy)
    if state == ThresholdState.UNKNOWN:
        return "artifact" if workflow == "handoff" else "compact"
    if state in {ThresholdState.HEALTHY, ThresholdState.WARNING}:
        return "standard"
    if state in {ThresholdState.SHAPE, ThresholdState.CHECKPOINT}:
        return "compact"
    return "micro"


def allocate_response_budget(
    *,
    requested_class: str,
    recommended_class: str,
    requested_output_tokens: int,
    provider_output_limit: int | None,
    model_output_limit: int | None = None,
    user_output_cap: int | None = None,
    output_limit_supported: bool = True,
) -> ResponseBudget:
    if recommended_class not in RESPONSE_CLASSES:
        raise ContextPolicyError("Unknown recommended response class")
    if requested_output_tokens <= 0:
        raise ContextPolicyError("Requested output tokens must be positive")
    caps: list[tuple[str, int]] = [("requested_output", requested_output_tokens)]
    for label, value in (
        ("provider_output_limit", provider_output_limit),
        ("model_output_limit", model_output_limit),
        ("user_output_cap", user_output_cap),
    ):
        if value is not None:
            if value <= 0:
                raise ContextPolicyError(f"{label} must be positive")
            caps.append((label, value))
    spec = RESPONSE_CLASSES[recommended_class]
    caps.append(("response_class", spec.maximum_tokens))
    allocated = min(value for _, value in caps) if output_limit_supported else 0
    limiting = tuple(label for label, value in caps if value == allocated)
    if not output_limit_supported:
        limiting = ("output_limit_unsupported",)
    return ResponseBudget(
        requested_class=requested_class,
        recommended_class=recommended_class,
        minimum_tokens=spec.minimum_tokens,
        target_tokens=spec.target_tokens,
        maximum_tokens=spec.maximum_tokens,
        allocated_tokens=allocated,
        output_limit_supported=output_limit_supported,
        limiting_factors=limiting,
    )


def project_operation(
    measurement: ContextMeasurement,
    response_budget: ResponseBudget,
    *,
    workflow: str,
    pending_input_tokens: int,
    reasoning_allowance_tokens: int = 0,
    compaction_attempted: bool = False,
    policy: ContextPolicy | None = None,
) -> ContextProjection:
    selected_policy = policy or ContextPolicy()
    if pending_input_tokens < 0 or reasoning_allowance_tokens < 0:
        raise ContextPolicyError("Projected token components must be non-negative")
    if not response_budget.output_limit_supported:
        return ContextProjection(
            adjusted_current_usage_tokens=None,
            pending_input_tokens=pending_input_tokens,
            external_output_tokens=0,
            reasoning_allowance_tokens=reasoning_allowance_tokens,
            reserve_tokens=0,
            projected_usage_tokens=None,
            projected_usage_ratio=None,
            threshold_state=ThresholdState.UNKNOWN,
            decision=ContextDecision.ROUTE_REJECTED,
            reason="output_limit_parameter_unsupported",
        )
    if measurement.context_limit_tokens is None or measurement.current_usage_tokens is None:
        return ContextProjection(
            adjusted_current_usage_tokens=None,
            pending_input_tokens=pending_input_tokens,
            external_output_tokens=response_budget.allocated_tokens,
            reasoning_allowance_tokens=reasoning_allowance_tokens,
            reserve_tokens=0,
            projected_usage_tokens=None,
            projected_usage_ratio=None,
            threshold_state=ThresholdState.UNKNOWN,
            decision=ContextDecision.ARTIFACT_DELIVERY
            if workflow == "handoff"
            else ContextDecision.INLINE_SHAPED,
            reason="context_measurement_unavailable",
        )
    margin = UNCERTAINTY_MARGIN[measurement.measurement_confidence]
    adjusted_current = math.ceil(measurement.current_usage_tokens * (1 + margin))
    raw_reserve = (
        selected_policy.fixed_operational_tokens
        + selected_policy.synthesis_tokens
        + selected_policy.tool_result_tokens
    )
    reserve_cap = math.floor(
        measurement.context_limit_tokens * selected_policy.total_reserve_cap_ratio
    )
    reserve = min(raw_reserve, reserve_cap)
    projected = (
        adjusted_current
        + pending_input_tokens
        + response_budget.allocated_tokens
        + reasoning_allowance_tokens
        + reserve
    )
    ratio = projected / measurement.context_limit_tokens
    state = threshold_state(ratio, selected_policy)
    if ratio >= selected_policy.continuation:
        decision = (
            ContextDecision.FRESH_THREAD_REQUIRED
            if compaction_attempted
            else ContextDecision.COMPACT_BEFORE_DISPATCH
        )
        reason = (
            "post_compaction_projection_unsafe"
            if compaction_attempted
            else "projected_context_reaches_continuation_threshold"
        )
    elif ratio >= selected_policy.shape:
        decision = ContextDecision.INLINE_SHAPED
        reason = "projected_context_requires_response_shaping"
    else:
        decision = ContextDecision.INLINE_SAFE
        reason = "projected_context_below_shaping_threshold"
    return ContextProjection(
        adjusted_current_usage_tokens=adjusted_current,
        pending_input_tokens=pending_input_tokens,
        external_output_tokens=response_budget.allocated_tokens,
        reasoning_allowance_tokens=reasoning_allowance_tokens,
        reserve_tokens=reserve,
        projected_usage_tokens=projected,
        projected_usage_ratio=ratio,
        threshold_state=state,
        decision=decision,
        reason=reason,
    )


def build_preflight_receipt(
    *,
    workflow: str,
    request_text: str,
    requested_output_tokens: int,
    provider_output_limit: int | None,
    output_limit_supported: bool,
    context_limit_tokens: int | None = None,
    current_usage_tokens: int | None = None,
    requested_class: str = "automatic",
    measured_at: str | None = None,
) -> dict[str, Any]:
    measurement = measure_context(
        context_limit_tokens=context_limit_tokens,
        current_usage_tokens=current_usage_tokens,
        measurement_source="caller_reported"
        if context_limit_tokens is not None
        else "unknown",
        measurement_confidence="medium"
        if context_limit_tokens is not None
        else "unknown",
        measured_at=measured_at,
    )
    recommended_class = recommend_response_class(
        measurement,
        workflow=workflow,
        requested_class=requested_class,
    )
    budget = allocate_response_budget(
        requested_class=requested_class,
        recommended_class=recommended_class,
        requested_output_tokens=requested_output_tokens,
        provider_output_limit=provider_output_limit,
        output_limit_supported=output_limit_supported,
    )
    projection = project_operation(
        measurement,
        budget,
        workflow=workflow,
        pending_input_tokens=estimate_text_tokens(request_text, 750),
    )
    return {
        "schema_version": "1.0",
        "mode": "measurement_only",
        "applied_to_dispatch": False,
        "context_measurement": measurement.to_dict(),
        "response_budget": budget.to_dict(),
        "projection": projection.to_dict(),
        "privacy": {
            "request_text_persisted": False,
            "transcript_persisted": False,
            "provider_envelope_persisted": False,
        },
    }

SHA-256: 16359f6f7d30e886a3db16634f37abe8f917f4fa5e432579995e5d42794715b4