"""Append-only run telemetry and deterministic artifact layout.""" from __future__ import annotations from dataclasses import asdict, dataclass from datetime import datetime, timezone from hashlib import sha256 import json import os from pathlib import Path import time from typing import Any def utc_now() -> str: return datetime.now(timezone.utc).isoformat() @dataclass(frozen=True, slots=True) class RunIdentity: experiment_id: str task_id: str harness_id: str harness_hash: str model_id: str model_key: str model_config_hash: str context_budget: int seed: int repetition: int repository_sha: str code_revision: str @property def run_id(self) -> str: payload = json.dumps(asdict(self), sort_keys=True, separators=(",", ":")) return sha256(payload.encode("utf-8")).hexdigest()[:20] def run_directory(results_root: Path, identity: RunIdentity) -> Path: return ( results_root / "raw" / identity.experiment_id / identity.harness_id / identity.task_id / identity.run_id ) def load_completed_or_archive_incomplete( results_root: Path, identity: RunIdentity ) -> dict[str, Any] | None: """Resume a completed cell or retain an interrupted attempt outside raw/.""" directory = run_directory(results_root, identity) if not directory.exists(): return None final_path = directory / "final_metrics.json" if final_path.exists(): value = json.loads(final_path.read_text(encoding="utf-8")) if not isinstance(value, dict): raise ValueError(f"completed metrics are not a JSON object: {final_path}") return value archive_root = ( results_root / "infrastructure_attempts" / identity.experiment_id / identity.harness_id / identity.task_id ) archive_root.mkdir(parents=True, exist_ok=True) destination = archive_root / f"{identity.run_id}-{time.time_ns()}" directory.replace(destination) with (destination / "archive_record.json").open("x", encoding="utf-8") as handle: json.dump( { "schema_version": 1, "reason": "incomplete cell retained before identical-identity retry", "identity": asdict(identity), "archived_at": utc_now(), "original_directory": str(directory), }, handle, indent=2, sort_keys=True, ) handle.write("\n") return None class EventWriter: """Writes one durable JSON object per event and never overwrites a run.""" def __init__( self, results_root: Path, identity: RunIdentity, resolved_harness: dict[str, Any], resolved_model: dict[str, Any], ): self.identity = identity self.directory = run_directory(results_root, identity) self.directory.mkdir(parents=True, exist_ok=False) self._sequence = 0 self._stream = (self.directory / "trajectory.jsonl").open("x", encoding="utf-8") self._write_json_exclusive( self.directory / "run_manifest.json", { "schema_version": 1, "created_at": utc_now(), "run_id": identity.run_id, "identity": asdict(identity), "resolved_harness": resolved_harness, "resolved_model": resolved_model, }, ) @staticmethod def _write_json_exclusive(path: Path, value: dict[str, Any]) -> None: with path.open("x", encoding="utf-8") as handle: json.dump(value, handle, indent=2, sort_keys=True) handle.write("\n") def emit(self, event_type: str, payload: dict[str, Any]) -> None: event = { "schema_version": 1, "run_id": self.identity.run_id, "sequence": self._sequence, "recorded_at": utc_now(), "event_type": event_type, "payload": payload, } self._stream.write(json.dumps(event, sort_keys=True, separators=(",", ":")) + "\n") self._stream.flush() os.fsync(self._stream.fileno()) self._sequence += 1 def write_artifact(self, filename: str, content: str) -> Path: if Path(filename).name != filename: raise ValueError("artifact filename must not contain directories") path = self.directory / filename with path.open("x", encoding="utf-8") as handle: handle.write(content) return path def close(self) -> None: if not self._stream.closed: self._stream.close() def __enter__(self) -> "EventWriter": return self def __exit__(self, exc_type: Any, exc: Any, traceback: Any) -> None: self.close() ALLOWED_EVENT_TYPES = { "run_started", "model_call", "tool_call", "retrieval_candidate", "file_read", "edit", "test_run", "resource_sample", "run_finished", }