fix: serialize decision ledger writes

This commit is contained in:
User
2026-07-14 15:30:06 +02:00
parent 333874a755
commit 9d4e057426
5 changed files with 77 additions and 6 deletions
+18
View File
@@ -1,3 +1,4 @@
import fcntl
import os
import tempfile
from datetime import UTC, datetime
@@ -7,6 +8,7 @@ from typing import Literal
from pydantic import BaseModel
DECISIONS_FILE = "review_decisions.jsonl"
DECISIONS_LOCK_FILE = ".review_decisions.lock"
# 22 tipi di the reference implementation (verified leggendo session/decisions.py) + 1 nuovo (D15):
# `decision_retracted` per il rollback a granularità step (ritira una decisione
@@ -121,6 +123,22 @@ def append_decisions(
if not inputs:
return []
session_dir.mkdir(parents=True, exist_ok=True)
lock_path = session_dir / DECISIONS_LOCK_FILE
with lock_path.open("a+") as lock:
fcntl.flock(lock, fcntl.LOCK_EX)
try:
return _append_decisions_locked(session_dir, inputs)
finally:
fcntl.flock(lock, fcntl.LOCK_UN)
def _append_decisions_locked(
session_dir: Path,
inputs: list[DecisionInput],
) -> list[DecisionRecord]:
"""Append while the caller holds the session's cross-process ledger lock."""
# Fase corrente PRIMA dell'append (high-water-mark D15). Import lazy: phase.py
# importa decisions.py (ciclo). Per i marker di fase (subject "phase:N") il valore
# e' ridondante col subject; per le decisioni sostanziali con subject "a nome"