fix: serialize decision ledger writes
This commit is contained in:
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user