sentinel / scripts /audit_report.py
samarthmishra46's picture
Sentinel V2 — HF deploy snapshot (full stack, DeBERTa on)
1788dab
Raw
History Blame Contribute Delete
2.76 kB
"""Audit-log demo report (Nikhil, Day 4).
The "show Sumit the 7-year compliance record" view. Runs the demo review queries
against an existing audit DB and prints them, plus a full audit-log table and a
latency-completeness check.
python scripts/audit_report.py --path ./sentinel_audit.db
The 3 demo queries (sprint plan): all decisions this session, all STOPs, all
escalations. Plus: latency distribution + verification that every record carries
a measured latency_ms.
"""
from __future__ import annotations
import argparse
import asyncio
import sys
from pathlib import Path
try:
sys.stdout.reconfigure(encoding="utf-8") # type: ignore[attr-defined]
except Exception: # pragma: no cover
pass
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
from app.audit import SqliteBackend, queries # noqa: E402
def _section(title: str) -> None:
print(f"\n{'=' * 70}\n {title}\n{'=' * 70}")
async def main(path: str) -> None:
backend = SqliteBackend(path)
await backend.connect()
try:
print(f"audit DB: {path}")
# --- Demo query 1: all decisions this session (the full table) --------
records = await queries.all_records(backend)
_section(f"Query 1 - all decisions this session ({len(records)})")
print(queries.format_records_table(records))
print(f"\n decision counts: {await queries.decision_counts(backend)}")
# --- Demo query 2: all STOP decisions ---------------------------------
stops = await queries.by_decision(backend, "STOP")
_section(f"Query 2 - all STOP decisions ({len(stops)})")
print(queries.format_records_table(stops) if stops else " (none)")
# --- Demo query 3: all escalations ------------------------------------
escs = await queries.escalations(backend)
_section(f"Query 3 - all ESCALATE decisions ({len(escs)})")
print(queries.format_records_table(escs) if escs else " (none)")
# --- Latency distribution + verification ------------------------------
_section("Latency")
print(f" distribution: {await queries.latency_stats(backend)}")
missing = await queries.records_without_latency(backend)
total = len(records)
ok = total - len(missing)
status = "[OK]" if not missing else "[FAIL]"
print(f" {status} latency_ms recorded on {ok}/{total} records"
+ (f" ({len(missing)} missing)" if missing else ""))
finally:
await backend.close()
if __name__ == "__main__":
p = argparse.ArgumentParser(description="Print audit-log demo queries.")
p.add_argument("--path", default="sentinel_audit.db", help="SQLite audit DB path")
args = p.parse_args()
asyncio.run(main(args.path))