Source code for ralph.checkpoint.run_context
"""Run lineage helpers for checkpoint payloads."""
from __future__ import annotations
from dataclasses import dataclass, field, replace
from uuid import uuid4
[docs]
@dataclass(frozen=True)
class RunContext:
"""Track run lineage and actual completed work counts."""
run_id: str
parent_run_id: str | None = None
resume_count: int = 0
actual_developer_runs: int = 0
actual_reviewer_runs: int = 0
recovery_cycle_count: int = 0
fallover_history: list[dict[str, object]] = field(default_factory=list)
last_failure_category: str | None = None
[docs]
@classmethod
def new(cls) -> RunContext:
"""Create a fresh run context."""
return cls(run_id=str(uuid4()))
[docs]
@classmethod
def resumed_from(cls, previous: RunContext) -> RunContext:
"""Create a new run context for a resumed session."""
return cls(
run_id=str(uuid4()),
parent_run_id=previous.run_id,
resume_count=previous.resume_count + 1,
actual_developer_runs=previous.actual_developer_runs,
actual_reviewer_runs=previous.actual_reviewer_runs,
recovery_cycle_count=previous.recovery_cycle_count,
fallover_history=list(previous.fallover_history),
last_failure_category=previous.last_failure_category,
)
[docs]
def record_developer_iteration(self) -> RunContext:
"""Return a copy with one more completed developer iteration."""
return replace(self, actual_developer_runs=self.actual_developer_runs + 1)
[docs]
def record_reviewer_pass(self) -> RunContext:
"""Return a copy with one more completed reviewer pass."""
return replace(self, actual_reviewer_runs=self.actual_reviewer_runs + 1)
[docs]
def to_dict(self) -> dict[str, object]:
"""Return a JSON-safe dictionary representation."""
return {
"run_id": self.run_id,
"parent_run_id": self.parent_run_id,
"resume_count": self.resume_count,
"actual_developer_runs": self.actual_developer_runs,
"actual_reviewer_runs": self.actual_reviewer_runs,
"recovery_cycle_count": self.recovery_cycle_count,
"fallover_history": list(self.fallover_history),
"last_failure_category": self.last_failure_category,
}