AI-Sovereign-sentinel / sovereign_freeze_bridge.py
rezabarkhordary's picture
Create sovereign_freeze_bridge.py
8063d41 verified
Raw
History Blame
17.6 kB
# sovereign_freeze_bridge.py
from __future__ import annotations
import json
import os
import uuid
from dataclasses import dataclass, asdict
from datetime import datetime, timezone
from typing import Any, Dict, Optional, List, Tuple
FREEZE_CASES_FILE = os.getenv("SOV_FREEZE_CASES_FILE", "sovereign_freeze_cases.json")
FREEZE_INDEX_FILE = os.getenv("SOV_FREEZE_INDEX_FILE", "sovereign_freeze_index.json")
FREEZE_AUDIT_FILE = os.getenv("SOV_FREEZE_AUDIT_FILE", "sovereign_freeze_audit.jsonl")
def _utc_now() -> str:
return datetime.now(timezone.utc).isoformat()
def _safe_read_json(path: str, default: Any) -> Any:
try:
if not os.path.exists(path):
return default
with open(path, "r", encoding="utf-8") as f:
return json.load(f)
except Exception:
return default
def _safe_write_json(path: str, data: Any) -> None:
directory = os.path.dirname(path)
if directory:
os.makedirs(directory, exist_ok=True)
tmp = f"{path}.tmp"
with open(tmp, "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2, sort_keys=True)
os.replace(tmp, path)
def _append_jsonl(path: str, row: Dict[str, Any]) -> None:
directory = os.path.dirname(path)
if directory:
os.makedirs(directory, exist_ok=True)
with open(path, "a", encoding="utf-8") as f:
f.write(json.dumps(row, ensure_ascii=False, sort_keys=True) + "\n")
def _norm_text(v: Any) -> str:
return str(v or "").strip()
def _norm_tags(v: Any) -> List[str]:
if isinstance(v, list):
return [str(x).strip().lower() for x in v if str(x).strip()]
if isinstance(v, str):
return [x.strip().lower() for x in v.split(",") if x.strip()]
return []
def _bucket_key(payload: Dict[str, Any]) -> str:
engine = _norm_text(payload.get("engine") or payload.get("engine_name") or "unknown_engine")
parent = _norm_text(payload.get("parent_model") or payload.get("parent_model_id") or payload.get("agent_id") or "unknown_parent")
version = _norm_text(payload.get("model_version") or payload.get("build_id") or "unknown_version")
env = _norm_text(payload.get("deployment_env") or payload.get("environment") or "unspecified")
tags = ",".join(sorted(_norm_tags(payload.get("data_tags"))))
return f"{engine}|{parent}|{version}|{env}|{tags}"
@dataclass
class FreezeCase:
freeze_case_id: str
created_at: str
updated_at: str
status: str # frozen / released / escalated_block
engine: str
parent_model: str
model_version: str
deployment_env: str
data_tags: List[str]
risk_level: str
decision_id: str
reason: str
source: str # authority_gate / cognition / zero_layer / runtime
authority_decision: str # FREEZE / BLOCK / ALLOW
freeze_token: str
review_required: bool
released_at: Optional[str] = None
released_by: Optional[str] = None
release_note: Optional[str] = None
escalated_at: Optional[str] = None
escalated_by: Optional[str] = None
escalation_note: Optional[str] = None
audit_trail: Optional[List[Dict[str, Any]]] = None
class SovereignFreezeBridge:
"""
Bridges FREEZE decisions into a bank-grade freeze case lifecycle.
What it does:
- when decision == FREEZE -> create a persistent freeze case
- prevents execution while case is still frozen
- if case gets released -> execution may continue
- if case gets escalated -> treat as BLOCK
- writes dedicated freeze audit trail
"""
def __init__(
self,
cases_file: str = FREEZE_CASES_FILE,
index_file: str = FREEZE_INDEX_FILE,
audit_file: str = FREEZE_AUDIT_FILE,
) -> None:
self.cases_file = cases_file
self.index_file = index_file
self.audit_file = audit_file
# -------------------------
# storage
# -------------------------
def _load_cases(self) -> Dict[str, Dict[str, Any]]:
obj = _safe_read_json(self.cases_file, {})
return obj if isinstance(obj, dict) else {}
def _save_cases(self, obj: Dict[str, Dict[str, Any]]) -> None:
_safe_write_json(self.cases_file, obj)
def _load_index(self) -> Dict[str, str]:
obj = _safe_read_json(self.index_file, {})
return obj if isinstance(obj, dict) else {}
def _save_index(self, obj: Dict[str, str]) -> None:
_safe_write_json(self.index_file, obj)
def _audit(self, event_type: str, freeze_case_id: str, payload: Dict[str, Any]) -> None:
_append_jsonl(
self.audit_file,
{
"ts": _utc_now(),
"event_type": event_type,
"freeze_case_id": freeze_case_id,
"payload": payload,
},
)
# -------------------------
# helpers
# -------------------------
def _extract_reason(self, decision_bundle: Dict[str, Any]) -> str:
reason = decision_bundle.get("reason")
if isinstance(reason, str) and reason.strip():
return reason.strip()
reasons = decision_bundle.get("reasons")
if isinstance(reasons, list) and reasons:
return " | ".join(str(x) for x in reasons[:6])
authority = decision_bundle.get("authority_gate") or decision_bundle.get("authority") or {}
if isinstance(authority, dict):
r = authority.get("reason")
if isinstance(r, str) and r.strip():
return r.strip()
return "freeze_without_explicit_reason"
def _extract_decision(self, decision_bundle: Dict[str, Any]) -> str:
for key in ("decision", "action", "outcome", "authority_decision"):
val = decision_bundle.get(key)
if isinstance(val, str) and val.strip():
return val.strip().upper()
auth = decision_bundle.get("authority_gate") or {}
if isinstance(auth, dict):
val = auth.get("decision")
if isinstance(val, str) and val.strip():
return val.strip().upper()
return "UNKNOWN"
def _extract_source(self, decision_bundle: Dict[str, Any]) -> str:
if "authority_gate" in decision_bundle:
return "authority_gate"
if "zero_layer" in decision_bundle:
return "zero_layer"
if "cognition" in decision_bundle:
return "cognition"
return "runtime"
def _extract_decision_id(self, decision_bundle: Dict[str, Any]) -> str:
for key in ("decision_id", "event_id", "audit_id"):
v = decision_bundle.get(key)
if isinstance(v, str) and v.strip():
return v.strip()
auth = decision_bundle.get("authority_gate") or {}
if isinstance(auth, dict):
v = auth.get("decision_id")
if isinstance(v, str) and v.strip():
return v.strip()
return str(uuid.uuid4())
def _append_case_event(self, case_obj: Dict[str, Any], event_type: str, actor: str, note: str, extra: Optional[Dict[str, Any]] = None) -> None:
trail = case_obj.get("audit_trail")
if not isinstance(trail, list):
trail = []
trail.append(
{
"ts": _utc_now(),
"event_type": event_type,
"actor": actor,
"note": note,
"extra": extra or {},
}
)
case_obj["audit_trail"] = trail
case_obj["updated_at"] = _utc_now()
# -------------------------
# public operations
# -------------------------
def create_or_link_freeze_case(
self,
payload: Dict[str, Any],
decision_bundle: Dict[str, Any],
) -> Dict[str, Any]:
decision = self._extract_decision(decision_bundle)
if decision != "FREEZE":
return {
"freeze_created": False,
"freeze_linked": False,
"freeze_case_id": None,
"status": None,
"reason": "decision_is_not_freeze",
}
cases = self._load_cases()
index = self._load_index()
bucket = _bucket_key(payload)
existing_case_id = index.get(bucket)
if existing_case_id and existing_case_id in cases:
case_obj = cases[existing_case_id]
status = case_obj.get("status", "frozen")
self._append_case_event(
case_obj,
event_type="freeze_reaffirmed",
actor="system",
note="Freeze re-asserted for existing case.",
extra={"decision_id": self._extract_decision_id(decision_bundle)},
)
cases[existing_case_id] = case_obj
self._save_cases(cases)
self._audit("freeze_reaffirmed", existing_case_id, {"bucket": bucket, "status": status})
return {
"freeze_created": False,
"freeze_linked": True,
"freeze_case_id": existing_case_id,
"status": status,
"reason": "existing_case_reused",
}
freeze_case_id = str(uuid.uuid4())
freeze_token = str(uuid.uuid4())
case = FreezeCase(
freeze_case_id=freeze_case_id,
created_at=_utc_now(),
updated_at=_utc_now(),
status="frozen",
engine=_norm_text(payload.get("engine") or payload.get("engine_name") or "unknown_engine"),
parent_model=_norm_text(payload.get("parent_model") or payload.get("parent_model_id") or payload.get("agent_id") or "unknown_parent"),
model_version=_norm_text(payload.get("model_version") or payload.get("build_id") or "unknown_version"),
deployment_env=_norm_text(payload.get("deployment_env") or payload.get("environment") or "unspecified"),
data_tags=_norm_tags(payload.get("data_tags")),
risk_level=_norm_text(payload.get("risk_level") or "unspecified").lower(),
decision_id=self._extract_decision_id(decision_bundle),
reason=self._extract_reason(decision_bundle),
source=self._extract_source(decision_bundle),
authority_decision="FREEZE",
freeze_token=freeze_token,
review_required=True,
audit_trail=[],
)
case_obj = asdict(case)
self._append_case_event(
case_obj,
event_type="freeze_created",
actor="system",
note="Freeze case created from runtime decision.",
extra={"bucket": bucket},
)
cases[freeze_case_id] = case_obj
index[bucket] = freeze_case_id
self._save_cases(cases)
self._save_index(index)
self._audit("freeze_created", freeze_case_id, {"bucket": bucket, "engine": case.engine})
return {
"freeze_created": True,
"freeze_linked": False,
"freeze_case_id": freeze_case_id,
"freeze_token": freeze_token,
"status": "frozen",
"reason": case.reason,
}
def get_case(self, freeze_case_id: str) -> Optional[Dict[str, Any]]:
cases = self._load_cases()
obj = cases.get(freeze_case_id)
return obj if isinstance(obj, dict) else None
def get_case_by_payload(self, payload: Dict[str, Any]) -> Optional[Dict[str, Any]]:
index = self._load_index()
cases = self._load_cases()
case_id = index.get(_bucket_key(payload))
if not case_id:
return None
obj = cases.get(case_id)
return obj if isinstance(obj, dict) else None
def effective_state(self, payload: Dict[str, Any]) -> Dict[str, Any]:
"""
Returns the effective enforcement state for the payload:
- no_case
- frozen
- released
- escalated_block
"""
case_obj = self.get_case_by_payload(payload)
if not case_obj:
return {
"state": "no_case",
"allow_execution": True,
"freeze_case_id": None,
"reason": "no_freeze_case",
}
status = case_obj.get("status", "frozen")
case_id = case_obj.get("freeze_case_id")
if status == "released":
return {
"state": "released",
"allow_execution": True,
"freeze_case_id": case_id,
"reason": "freeze_released",
}
if status == "escalated_block":
return {
"state": "escalated_block",
"allow_execution": False,
"freeze_case_id": case_id,
"reason": "freeze_escalated_to_block",
}
return {
"state": "frozen",
"allow_execution": False,
"freeze_case_id": case_id,
"reason": "freeze_active",
}
def can_execute(self, payload: Dict[str, Any]) -> Tuple[bool, Dict[str, Any]]:
state = self.effective_state(payload)
return bool(state.get("allow_execution")), state
def release_case(self, freeze_case_id: str, released_by: str, note: str = "") -> Dict[str, Any]:
cases = self._load_cases()
obj = cases.get(freeze_case_id)
if not isinstance(obj, dict):
return {"ok": False, "error": "freeze_case_not_found"}
status = obj.get("status")
if status == "escalated_block":
return {"ok": False, "error": "case_already_escalated_block"}
if status == "released":
return {"ok": True, "freeze_case_id": freeze_case_id, "status": "released", "idempotent": True}
obj["status"] = "released"
obj["released_at"] = _utc_now()
obj["released_by"] = _norm_text(released_by) or "unknown_reviewer"
obj["release_note"] = _norm_text(note)
self._append_case_event(
obj,
event_type="freeze_released",
actor=obj["released_by"],
note=obj["release_note"] or "Freeze released.",
)
cases[freeze_case_id] = obj
self._save_cases(cases)
self._audit("freeze_released", freeze_case_id, {"released_by": obj["released_by"]})
return {
"ok": True,
"freeze_case_id": freeze_case_id,
"status": "released",
"released_at": obj["released_at"],
}
def escalate_case(self, freeze_case_id: str, escalated_by: str, note: str = "") -> Dict[str, Any]:
cases = self._load_cases()
obj = cases.get(freeze_case_id)
if not isinstance(obj, dict):
return {"ok": False, "error": "freeze_case_not_found"}
if obj.get("status") == "escalated_block":
return {"ok": True, "freeze_case_id": freeze_case_id, "status": "escalated_block", "idempotent": True}
obj["status"] = "escalated_block"
obj["authority_decision"] = "BLOCK"
obj["escalated_at"] = _utc_now()
obj["escalated_by"] = _norm_text(escalated_by) or "unknown_reviewer"
obj["escalation_note"] = _norm_text(note)
self._append_case_event(
obj,
event_type="freeze_escalated_block",
actor=obj["escalated_by"],
note=obj["escalation_note"] or "Freeze escalated to block.",
)
cases[freeze_case_id] = obj
self._save_cases(cases)
self._audit("freeze_escalated_block", freeze_case_id, {"escalated_by": obj["escalated_by"]})
return {
"ok": True,
"freeze_case_id": freeze_case_id,
"status": "escalated_block",
"escalated_at": obj["escalated_at"],
}
def register_decision(self, payload: Dict[str, Any], decision_bundle: Dict[str, Any]) -> Dict[str, Any]:
"""
Main bridge entrypoint.
Call this right after authority/runtime decision is made.
"""
decision = self._extract_decision(decision_bundle)
if decision == "FREEZE":
out = self.create_or_link_freeze_case(payload, decision_bundle)
return {
"bridge_status": "freeze_registered",
"decision": "FREEZE",
"freeze": out,
}
# For non-freeze decisions, still check if an existing freeze case blocks execution
exec_ok, state = self.can_execute(payload)
if not exec_ok:
forced = "BLOCK" if state.get("state") == "escalated_block" else "FREEZE"
return {
"bridge_status": "existing_freeze_overrides_execution",
"decision": forced,
"freeze": state,
}
return {
"bridge_status": "no_freeze_intervention",
"decision": decision,
"freeze": state,
}
if __name__ == "__main__":
bridge = SovereignFreezeBridge()
sample_payload = {
"engine": "banking_runtime_v1",
"parent_model": "agent_alpha",
"model_version": "v1",
"deployment_env": "production",
"data_tags": ["pii", "payments", "customer_chat"],
"risk_level": "high",
}
sample_decision = {
"decision_id": str(uuid.uuid4()),
"decision": "FREEZE",
"reason": "suspicious_cross_account_instruction",
"authority_gate": {"decision": "FREEZE", "reason": "authority_freeze"},
}
print(json.dumps(bridge.register_decision(sample_payload, sample_decision), indent=2, ensure_ascii=False))