From bcb9a65a206b64113d9a2e90c2e6200cab0b5fb7 Mon Sep 17 00:00:00 2001 From: KaifAhmad1 Date: Wed, 18 Feb 2026 00:44:14 +0530 Subject: [PATCH] Improve non-persistent decision trace audit logging --- semantica/context/decision_methods.py | 16 ++++++++++++++-- tests/context/test_decision_methods_trace.py | 14 ++++++++++++-- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/semantica/context/decision_methods.py b/semantica/context/decision_methods.py index b1349cd4..23138ebf 100644 --- a/semantica/context/decision_methods.py +++ b/semantica/context/decision_methods.py @@ -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 diff --git a/tests/context/test_decision_methods_trace.py b/tests/context/test_decision_methods_trace.py index 2c578a5c..958533f3 100644 --- a/tests/context/test_decision_methods_trace.py +++ b/tests/context/test_decision_methods_trace.py @@ -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():