audit.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. from __future__ import annotations
  2. from dataclasses import dataclass
  3. from sqlalchemy import text
  4. @dataclass(frozen=True)
  5. class AuditFinding:
  6. finding_type: str
  7. count: int
  8. severity: str
  9. def run_canonical_audit(session) -> tuple[AuditFinding, ...]:
  10. checks = {
  11. "active_document_without_chunks": """
  12. SELECT COUNT(*) FROM public.governance_documents d
  13. WHERE d.status = 'active' AND NOT EXISTS (
  14. SELECT 1 FROM public.governance_chunks c WHERE c.document_id = d.id
  15. )
  16. """,
  17. "active_chunk_without_embedding": """
  18. SELECT COUNT(*) FROM public.governance_chunks c
  19. JOIN public.governance_documents d ON d.id = c.document_id
  20. WHERE d.status = 'active' AND NOT EXISTS (
  21. SELECT 1 FROM public.knowledge_chunk_embeddings e
  22. JOIN public.knowledge_embedding_profiles p ON p.id = e.profile_id
  23. WHERE e.chunk_id = c.id AND p.status = 'active'
  24. )
  25. """,
  26. "active_point_without_document": """
  27. SELECT COUNT(*) FROM public.knowledge_points p
  28. WHERE p.status = 'active' AND NOT EXISTS (
  29. SELECT 1 FROM public.governance_documents d
  30. WHERE d.object_uid = p.source_uid AND d.status = 'active'
  31. )
  32. """,
  33. "ready_projection_hash_mismatch": """
  34. SELECT COUNT(*) FROM public.knowledge_index_projections projection
  35. JOIN public.governance_documents d ON d.id = projection.document_id
  36. WHERE projection.status = 'ready'
  37. AND projection.content_hash <> d.content_hash
  38. """,
  39. "expired_cache_dependency": """
  40. SELECT COUNT(*) FROM public.knowledge_cache_dependencies
  41. WHERE expires_at <= CURRENT_TIMESTAMP
  42. """,
  43. }
  44. findings = []
  45. for finding_type, statement in checks.items():
  46. count = int(session.execute(text(statement)).scalar_one())
  47. if count:
  48. findings.append(AuditFinding(finding_type, count, "error"))
  49. return tuple(findings)