"""Stockage versionne des prompts. Un prompt est du code : il se diffe, il se relit, il se rejoue.""" from dataclasses import dataclass @dataclass class Pin: """Un score d'eval fige a une version donnee.""" version: str score: float class Vault: def save(self, name: str, body: str, *, force: bool = False, reason: str = "") -> str: """Enregistre une version. Refuse si le score passe sous le pin. Un prompt qui se degrade en silence est la panne la plus chere a diagnostiquer : mieux vaut bloquer et expliquer. """ pin = self._pins.get(name) score = self._evaluate(name, body) if pin and score < pin.score and not force: raise ScoreRegression( f"{name}: {score:.3f} < pinned {pin.score:.3f}. " f"pass force=True with a reason to override." ) if force and not reason: raise ValueError("forcing a regression requires a reason, it lands in the log") return self._write(name, body, score=score, forced=force, reason=reason)