Source code for ralph.recovery.budget_state
"""Immutable budget state for a single (phase, agent) pair."""
from __future__ import annotations
from dataclasses import dataclass, field
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from ralph.recovery.classifier import ClassifiedFailure
[docs]
@dataclass(frozen=True)
class BudgetState:
"""Immutable budget state for a single (phase, agent) pair."""
max_retries: int
consumed: int = 0
failures: tuple[ClassifiedFailure, ...] = field(default_factory=tuple)
@property
def exhausted(self) -> bool:
return self.consumed >= self.max_retries
@property
def remaining(self) -> int:
return max(0, self.max_retries - self.consumed)