Improve non-persistent decision trace audit logging

This commit is contained in:
KaifAhmad1
2026-02-18 00:44:14 +05:30
parent 3872ea75e1
commit bcb9a65a20
2 changed files with 26 additions and 4 deletions
+14 -2
View File
@@ -252,9 +252,21 @@ def capture_decision_trace(
try:
# Backward-compatible behavior: allow legacy call sites without graph_store.
if graph_store is None:
policy_refs = _normalize_policy_refs(policy_ids)
logger.warning(
"capture_decision_trace called without graph_store; "
"returning decision_id only for backward compatibility"
"capture_decision_trace skipped persistence (no graph_store) | "
f"decision_id={decision.decision_id} "
f"decision_maker={decision.decision_maker} "
f"timestamp={decision.timestamp.isoformat() if hasattr(decision.timestamp, 'isoformat') else decision.timestamp} "
f"category={decision.category} "
f"outcome={decision.outcome} "
f"confidence={decision.confidence} "
f"cross_system_keys={list((cross_system_context or {}).keys())} "
f"policy_refs={policy_refs} "
f"exception_count={len(_normalize_record_list(exceptions))} "
f"approval_count={len(_normalize_record_list(approvals))} "
f"precedent_count={len(_normalize_precedents(precedents))} "
"mode=backward_compatible_non_persistent"
)
return decision.decision_id
+12 -2
View File
@@ -1,6 +1,7 @@
"""Tests for decision trace capture convenience API."""
from datetime import datetime
import logging
from unittest.mock import Mock
from semantica.context.decision_methods import capture_decision_trace
@@ -20,10 +21,19 @@ def _sample_decision() -> Decision:
)
def test_capture_decision_trace_without_graph_store_is_backward_compatible():
def test_capture_decision_trace_without_graph_store_is_backward_compatible(caplog):
decision = _sample_decision()
decision_id = capture_decision_trace(decision, cross_system_context={})
with caplog.at_level(logging.WARNING):
decision_id = capture_decision_trace(
decision,
cross_system_context={"crm": {"arr": 120000}},
policy_ids=[{"policy_id": "renewal_discount_policy", "version": "3.2"}],
)
assert decision_id == decision.decision_id
assert "capture_decision_trace skipped persistence (no graph_store)" in caplog.text
assert f"decision_id={decision.decision_id}" in caplog.text
assert f"decision_maker={decision.decision_maker}" in caplog.text
assert f"outcome={decision.outcome}" in caplog.text
def test_capture_decision_trace_with_graph_store_records_trace_events():