admina-framework 0.9.2__tar.gz → 0.9.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. {admina_framework-0.9.2/admina_framework.egg-info → admina_framework-0.9.4}/PKG-INFO +316 -161
  2. {admina_framework-0.9.2 → admina_framework-0.9.4}/README.md +313 -160
  3. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/__init__.py +1 -1
  4. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/cli/main.py +132 -17
  5. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/compliance/forensic.py +108 -4
  6. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/proxy/engine_bridge.py +5 -60
  7. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/sdk/governed_model.py +3 -1
  8. {admina_framework-0.9.2 → admina_framework-0.9.4/admina_framework.egg-info}/PKG-INFO +316 -161
  9. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina_framework.egg-info/SOURCES.txt +2 -0
  10. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina_framework.egg-info/requires.txt +3 -0
  11. {admina_framework-0.9.2 → admina_framework-0.9.4}/pyproject.toml +34 -2
  12. {admina_framework-0.9.2 → admina_framework-0.9.4}/tests/test_benchmark_14us.py +9 -0
  13. {admina_framework-0.9.2 → admina_framework-0.9.4}/tests/test_domains.py +3 -26
  14. admina_framework-0.9.4/tests/test_firewall_parity.py +176 -0
  15. admina_framework-0.9.4/tests/test_forensic_blackbox.py +266 -0
  16. {admina_framework-0.9.2 → admina_framework-0.9.4}/LICENSE +0 -0
  17. {admina_framework-0.9.2 → admina_framework-0.9.4}/NOTICE +0 -0
  18. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/cli/__init__.py +0 -0
  19. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/cli/commands/__init__.py +0 -0
  20. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/cli/templates/admina.yaml.j2 +0 -0
  21. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/cli/templates/docker-compose.yml.j2 +0 -0
  22. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/cli/templates/env.j2 +0 -0
  23. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/cli/templates/main.py.j2 +0 -0
  24. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/cli/templates/plugin.py.j2 +0 -0
  25. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/cli/templates/plugin_pyproject.toml.j2 +0 -0
  26. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/cli/templates/plugin_readme.md.j2 +0 -0
  27. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/cli/templates/plugin_test.py.j2 +0 -0
  28. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/core/__init__.py +0 -0
  29. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/core/config.py +0 -0
  30. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/core/event_bus.py +0 -0
  31. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/core/secrets.py +0 -0
  32. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/core/types.py +0 -0
  33. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/dashboard/__init__.py +0 -0
  34. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/dashboard/static/heimdall.png +0 -0
  35. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/dashboard/static/index.html +0 -0
  36. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/dashboard/static/vendor/alpinejs.min.js +0 -0
  37. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/__init__.py +0 -0
  38. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/agent_security/__init__.py +0 -0
  39. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/agent_security/firewall.py +0 -0
  40. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/agent_security/loop_breaker.py +0 -0
  41. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/ai_infra/__init__.py +0 -0
  42. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/ai_infra/llm_engine.py +0 -0
  43. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/ai_infra/rag.py +0 -0
  44. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/ai_infra/webui.py +0 -0
  45. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/compliance/__init__.py +0 -0
  46. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/compliance/cross_regulation.py +0 -0
  47. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/compliance/eu_ai_act.py +0 -0
  48. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/compliance/gdpr.py +0 -0
  49. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/compliance/nis2.py +0 -0
  50. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/compliance/oisg.py +0 -0
  51. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/compliance/otel.py +0 -0
  52. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/data_sovereignty/__init__.py +0 -0
  53. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/data_sovereignty/classification.py +0 -0
  54. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/data_sovereignty/pii.py +0 -0
  55. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/domains/data_sovereignty/residency.py +0 -0
  56. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/integrations/__init__.py +0 -0
  57. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/integrations/_engines.py +0 -0
  58. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/integrations/cheshirecat/__init__.py +0 -0
  59. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/integrations/cheshirecat/admina-plugin/admina_governance.py +0 -0
  60. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/integrations/crewai/__init__.py +0 -0
  61. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/integrations/crewai/callbacks.py +0 -0
  62. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/integrations/langchain/__init__.py +0 -0
  63. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/integrations/langchain/callbacks.py +0 -0
  64. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/integrations/n8n/__init__.py +0 -0
  65. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/integrations/openclaw/__init__.py +0 -0
  66. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/__init__.py +0 -0
  67. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/base.py +0 -0
  68. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/__init__.py +0 -0
  69. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/adapters/__init__.py +0 -0
  70. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/adapters/ollama.py +0 -0
  71. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/adapters/openai.py +0 -0
  72. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/alerts/__init__.py +0 -0
  73. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/alerts/log.py +0 -0
  74. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/alerts/webhook.py +0 -0
  75. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/auth/__init__.py +0 -0
  76. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/auth/apikey.py +0 -0
  77. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/compliance/__init__.py +0 -0
  78. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/compliance/eu_ai_act.py +0 -0
  79. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/connectors/__init__.py +0 -0
  80. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/connectors/chromadb.py +0 -0
  81. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/connectors/filesystem.py +0 -0
  82. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/forensic/__init__.py +0 -0
  83. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/forensic/filesystem.py +0 -0
  84. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/forensic/minio.py +0 -0
  85. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/guards/__init__.py +0 -0
  86. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/guards/guardrailsai_guard.py +0 -0
  87. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/pii/__init__.py +0 -0
  88. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/pii/spacy_regex.py +0 -0
  89. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/transports/__init__.py +0 -0
  90. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/transports/http_rest.py +0 -0
  91. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/builtin/transports/mcp.py +0 -0
  92. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/plugins/registry.py +0 -0
  93. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/proxy/__init__.py +0 -0
  94. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/proxy/api/__init__.py +0 -0
  95. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/proxy/api/dashboard.py +0 -0
  96. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/proxy/api/integration.py +0 -0
  97. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/proxy/config.py +0 -0
  98. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/proxy/governance.py +0 -0
  99. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/proxy/main.py +0 -0
  100. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/proxy/multi_upstream.py +0 -0
  101. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/proxy/state.py +0 -0
  102. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/py.typed +0 -0
  103. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/sdk/__init__.py +0 -0
  104. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/sdk/_compat.py +0 -0
  105. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/sdk/compliance_kit.py +0 -0
  106. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/sdk/governed_agent.py +0 -0
  107. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina/sdk/governed_data.py +0 -0
  108. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina_framework.egg-info/dependency_links.txt +0 -0
  109. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina_framework.egg-info/entry_points.txt +0 -0
  110. {admina_framework-0.9.2 → admina_framework-0.9.4}/admina_framework.egg-info/top_level.txt +0 -0
  111. {admina_framework-0.9.2 → admina_framework-0.9.4}/setup.cfg +0 -0
  112. {admina_framework-0.9.2 → admina_framework-0.9.4}/tests/test_core_config.py +0 -0
  113. {admina_framework-0.9.2 → admina_framework-0.9.4}/tests/test_governance_pipeline.py +0 -0
  114. {admina_framework-0.9.2 → admina_framework-0.9.4}/tests/test_mcp_transport.py +0 -0
  115. {admina_framework-0.9.2 → admina_framework-0.9.4}/tests/test_proxy_security.py +0 -0
  116. {admina_framework-0.9.2 → admina_framework-0.9.4}/tests/test_version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: admina-framework
3
- Version: 0.9.2
3
+ Version: 0.9.4
4
4
  Summary: Admina — governed AI development framework
5
5
  Author-email: Stefano Noferi <info@admina.org>
6
6
  Maintainer-email: Stefano Noferi <info@admina.org>
@@ -52,43 +52,109 @@ Requires-Dist: opentelemetry-api<2,>=1.20; extra == "telemetry"
52
52
  Requires-Dist: opentelemetry-sdk<2,>=1.20; extra == "telemetry"
53
53
  Requires-Dist: opentelemetry-exporter-otlp-proto-grpc<2,>=1.20; extra == "telemetry"
54
54
  Requires-Dist: opentelemetry-instrumentation-fastapi<1,>=0.40b0; extra == "telemetry"
55
+ Provides-Extra: rust
56
+ Requires-Dist: admina-core<0.10,>=0.9.3; extra == "rust"
55
57
  Provides-Extra: full
56
58
  Requires-Dist: admina-framework[nlp,proxy,telemetry]; extra == "full"
57
59
  Dynamic: license-file
58
60
 
59
- # Admina — Governed AI Development Framework
61
+ <!--
62
+ <p align="center">
63
+ <img src="resources/banner.png" alt="Admina — Governed AI by Default" width="100%">
64
+ </p>
65
+ -->
60
66
 
61
- **Install once, get governed AI. The open framework for building AI applications that are governed by design.**
67
+ <p align="center">
68
+ <strong>Install once, get governed AI.</strong><br>
69
+ <em>PII redacted · Injections blocked · Loops broken · Actions audited · EU AI Act tracked</em>
70
+ </p>
62
71
 
63
- Admina gives you an SDK, a transparent proxy, a plugin system, a CLI, and a dashboard — all in one install. Every AI interaction is governed: PII redacted, injections blocked, loops broken, actions audited, EU AI Act compliance tracked. Works in-process (SDK) and over the network (proxy). Zero code changes to add governance to existing applications.
72
+ <p align="center">
73
+ <a href="https://pypi.org/project/admina-framework/"><img src="https://img.shields.io/pypi/v/admina-framework?style=flat-square&color=32CD32" alt="PyPI version"></a>
74
+ &nbsp;<a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-32CD32?style=flat-square" alt="License"></a>
75
+ &nbsp;<img src="https://img.shields.io/badge/python-3.11%2B-32CD32?style=flat-square&logo=python&logoColor=white" alt="Python 3.11+">
76
+ &nbsp;<img src="https://img.shields.io/badge/platform-Linux%20%7C%20macOS-6C757D?style=flat-square" alt="Platform">
77
+ </p>
64
78
 
65
- > ⚖️ **Compliance disclaimer.** Admina is a self-assessment and
66
- > defense-in-depth tool. The EU AI Act gap-analysis and risk
67
- > classification features are **decision-support aids, not legal
68
- > advice**. They do not replace the conformity assessment required
69
- > under EU AI Act Art. 43 for high-risk systems, nor the involvement
70
- > of a notified body where the regulation requires one.
71
- >
72
- > **EU AI Act timeline (after the Omnibus VII agreement of 7 May 2026):**
73
- > Art. 5 prohibitions in force since 2 February 2025; GPAI obligations
74
- > in force since 2 August 2025; Art. 50 transparency for synthetic
75
- > content and the new NCII / synthetic-CSAM prohibition apply from
76
- > 2 December 2026; **Annex III high-risk obligations from 2 December
77
- > 2027** (postponed from 2 Aug 2026); Annex I high-risk from 2 August
78
- > 2028 (postponed from 2 Aug 2027). The full machine-readable timeline
79
- > ships with Admina as `admina.domains.compliance.eu_ai_act.EU_AI_ACT_DEADLINES`.
80
- > See [`MODEL_CARD.md`](MODEL_CARD.md) for the full scope, limitations,
81
- > and known failure modes of every Admina component.
79
+ <p align="center">
80
+ <a href="https://github.com/admina-org/admina/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/admina-org/admina/ci.yml?style=flat-square&label=CI&logo=githubactions&logoColor=white" alt="CI"></a>
81
+ &nbsp;<a href="https://github.com/admina-org/admina/actions/workflows/release.yml"><img src="https://img.shields.io/github/actions/workflow/status/admina-org/admina/release.yml?style=flat-square&label=release" alt="Release"></a>
82
+ &nbsp;<a href="https://github.com/admina-org/admina/actions/workflows/security.yml"><img src="https://img.shields.io/github/actions/workflow/status/admina-org/admina/security.yml?style=flat-square&label=security%20scan&logo=shield&logoColor=white" alt="Security scan"></a>
83
+ &nbsp;<a href="https://pypi.org/project/admina-framework/"><img src="https://img.shields.io/pypi/dm/admina-framework?style=flat-square&label=downloads" alt="PyPI downloads"></a>
84
+ </p>
85
+
86
+ <p align="center">
87
+ <a href="https://deepwiki.com/admina-org/admina"><img src="https://deepwiki.com/badge.svg" alt="Ask DeepWiki"></a>
88
+ &nbsp;<a href="https://github.com/admina-org/admina/discussions"><img src="https://img.shields.io/github/discussions/admina-org/admina?style=flat-square&logo=github" alt="Discussions"></a>
89
+ &nbsp;<a href="https://admina.org/docs"><img src="https://img.shields.io/badge/docs-admina.org-blue?style=flat-square" alt="Docs"></a>
90
+ </p>
91
+
92
+ <p align="center">
93
+ <a href="#quick-start"><img src="https://img.shields.io/badge/⚡%20Quick%20Start-2%20min-32CD32?style=for-the-badge" alt="Quick Start" height="40"></a>
94
+ &nbsp;<a href="#see-it-in-action"><img src="https://img.shields.io/badge/▶%20Live%20Demo-Dashboard-3B82F6?style=for-the-badge" alt="Live Demo" height="40"></a>
95
+ &nbsp;<a href="https://admina.org/docs"><img src="https://img.shields.io/badge/📖%20Read%20the%20Docs-admina.org-6C757D?style=for-the-badge" alt="Docs" height="40"></a>
96
+ &nbsp;<a href="https://deepwiki.com/admina-org/admina"><img src="https://img.shields.io/badge/🤖%20Ask%20DeepWiki-AI%20wiki-7C3AED?style=for-the-badge" alt="DeepWiki" height="40"></a>
97
+ </p>
98
+
99
+ <p align="center">
100
+ <a href="https://github.com/admina-org/admina/stargazers"><img src="https://img.shields.io/github/stars/admina-org/admina?style=social" alt="Stars"></a>
101
+ &nbsp;<a href="https://github.com/admina-org/admina/network/members"><img src="https://img.shields.io/github/forks/admina-org/admina?style=social" alt="Forks"></a>
102
+ &nbsp;<a href="https://github.com/admina-org/admina/graphs/contributors"><img src="https://img.shields.io/github/contributors/admina-org/admina?style=flat-square&label=contributors" alt="Contributors"></a>
103
+ &nbsp;<img src="https://img.shields.io/github/last-commit/admina-org/admina?style=flat-square" alt="Last commit">
104
+ </p>
105
+
106
+ ---
107
+
108
+ ## See it in action
109
+
110
+ **Scaffold a project and boot the governed proxy + dashboard — no Docker:**
82
111
 
83
- [![PyPI version](https://img.shields.io/pypi/v/admina-framework.svg)](https://pypi.org/project/admina-framework/)
84
- [![PyPI downloads](https://img.shields.io/pypi/dm/admina-framework.svg)](https://pypi.org/project/admina-framework/)
85
- [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE)
86
- [![Python](https://img.shields.io/badge/Python-3.11+-green.svg)](https://python.org)
87
- [![Rust](https://img.shields.io/badge/Rust-Engine-orange.svg)](core-rust/)
88
- [![CI](https://github.com/admina-org/admina/actions/workflows/ci.yml/badge.svg)](https://github.com/admina-org/admina/actions/workflows/ci.yml)
89
- [![Docs](https://img.shields.io/badge/docs-admina.org-blue.svg)](https://admina.org/docs)
90
- [![Version](https://img.shields.io/badge/version-0.9.0-blue.svg)](CHANGELOG.md)
91
- [![Platforms](https://img.shields.io/badge/platforms-Linux%20%7C%20macOS-lightgrey.svg)](CONTRIBUTING.md#supported-platforms)
112
+ <p align="center">
113
+ <img src="resources/admina-init-dev.gif" alt="admina init → admina dev → Ready on localhost:3000" width="900">
114
+ </p>
115
+
116
+ **Wrap any model in a few lines — PII is stripped before the model ever sees it:**
117
+
118
+ <p align="center">
119
+ <img src="resources/sdk-3lines.gif" alt="GovernedModel redacts PERSON, EMAIL and credit card before the LLM call" width="900">
120
+ </p>
121
+
122
+ **The governance dashboard, before and after simulated traffic — Admina Score 40 → 60:**
123
+
124
+ <table>
125
+ <tr>
126
+ <td align="center" width="50%">
127
+ <img src="resources/dashboard-firstuser.png" alt="Dashboard at first boot — score 40/100" width="100%"><br>
128
+ <em>First boot — Admina Score <strong>40/100</strong></em>
129
+ </td>
130
+ <td align="center" width="50%">
131
+ <img src="resources/dashboard-traffic.png" alt="Dashboard after simulated traffic — score 60/100" width="100%"><br>
132
+ <em>After <code>python scripts/simulate.py</code> — <strong>60/100</strong></em>
133
+ </td>
134
+ </tr>
135
+ </table>
136
+
137
+ ---
138
+
139
+ ## Why Admina?
140
+
141
+ | | Plain LLM / RAG app | **With Admina** |
142
+ | :----------------------------- | :----------------------------------- | :----------------------------------------------------------------------- |
143
+ | PII in prompts/responses | leaks unless you build redaction | **Redacted by default** — email, SSN, IBAN, phone, IP, names |
144
+ | Prompt injections | reach the model | **Blocked at the proxy** — 15 regex + Rust heuristic scoring |
145
+ | Agent tool calls | unaudited | **Validated pre-action + logged post-action** (forensic chain) |
146
+ | Loop / runaway agents | burn tokens / budget | **Broken** — TF-IDF cosine similarity over the action stream |
147
+ | EU AI Act readiness | manual | **Gap analysis + risk classification** built-in |
148
+ | Audit trail | logs you hope nobody deletes | **SHA-256 hash chain** — tamper-evident by design |
149
+ | Adding governance to existing code | rewrite the call sites | **Zero code changes** via proxy, or 3 lines via SDK |
150
+ | Performance overhead | unknown | **~6 µs per pipeline** (Rust engine), in-process or networked |
151
+ | License | varies | **Apache 2.0**, open core |
152
+
153
+ > Admina is **decision-support and defense-in-depth**, not legal advice. See [Compliance scope](#compliance-scope) for the full disclaimer and limitations.
154
+
155
+ ---
156
+
157
+ ## 30-second example
92
158
 
93
159
  ```python
94
160
  from admina import GovernedModel, GovernedData, GovernedAgent, ComplianceKit
@@ -120,30 +186,40 @@ report = kit.gap_analysis(risk_category="high", current_compliance={...})
120
186
  ### Install from PyPI
121
187
 
122
188
  ```bash
123
- # SDK only (lightweight, pure Python)
124
- pip install admina-framework
125
-
126
- # Proxy + infrastructure deps
189
+ # Recommended for new users: SDK + proxy + dashboard.
190
+ # Lets you run `admina dev` and see the dashboard out of the box.
127
191
  pip install "admina-framework[proxy]"
128
192
 
129
- # Everything (proxy + NLP + telemetry)
193
+ # Everything (proxy + NLP + telemetry). Use this if you also want
194
+ # spaCy-based NER for PII detection or OpenTelemetry export.
130
195
  pip install "admina-framework[full]"
196
+ python -m spacy download en_core_web_sm # for [full] only
131
197
 
132
- # After [nlp] / [full] install: download the spaCy NER model
133
- python -m spacy download en_core_web_sm
198
+ # Optional: Rust-accelerated engine (auto-detected at runtime).
199
+ # Opt-in extra — pulls in the admina-core wheel from PyPI.
200
+ pip install "admina-framework[rust]"
134
201
 
135
- # Optional: Rust-accelerated engine (auto-detected at runtime)
136
- pip install admina-core
202
+ # Advanced: SDK only (no proxy, no dashboard, no `admina dev`).
203
+ # Use this when embedding the SDK into another service and you don't
204
+ # need the local dev server.
205
+ pip install admina-framework
137
206
  ```
138
207
 
139
208
  > The PyPI distribution name is `admina-framework`; the Python import
140
209
  > name is `admina` (e.g. `from admina import GovernedModel`). This is
141
210
  > a normal Python pattern — same as `python-dateutil` → `import dateutil`.
142
211
 
143
- > The Rust engine is an optional accelerator. `pip install admina-framework`
144
- > ships only the pure-Python implementation; Admina auto-detects the
145
- > Rust engine at runtime and falls back to the Python implementation
146
- > if it's not installed.
212
+ > The Rust engine is an **optional, opt-in** accelerator. The default
213
+ > `pip install admina-framework` ships only the pure-Python implementation;
214
+ > `admina-framework[rust]` adds the `admina-core` wheel, which Admina
215
+ > auto-detects at runtime (falling back to pure Python if it's absent).
216
+ >
217
+ > The default is pure Python on purpose: the Python injection firewall
218
+ > currently has **broader detection coverage** than the Rust one (it adds
219
+ > obfuscation-normalisation — homoglyph, leetspeak, base64, ROT13 — and a
220
+ > wider multilingual pattern set). Enable `[rust]` when per-request latency
221
+ > matters more than that extra coverage. See
222
+ > [Performance](#performance--hybrid-python--rust-engine) for the trade-off.
147
223
 
148
224
  ### Or install from source
149
225
 
@@ -151,56 +227,48 @@ pip install admina-core
151
227
  git clone https://github.com/admina-org/admina.git
152
228
  cd admina
153
229
 
154
- # Option 1: SDK only (lightweight)
155
- pip install -e .
156
- python -c "from admina import GovernedModel; print('SDK ready')"
157
-
158
- # Note: To use the OllamaAdapter, install Ollama (https://ollama.ai)
159
- # and pull a model first: ollama pull llama3.1:8b
160
-
161
- # Option 2: Proxy + infra deps
230
+ # Recommended: proxy + dashboard + infra deps (enables `admina dev`)
162
231
  pip install -e ".[proxy]"
163
232
 
164
- # Option 3: Everything (proxy + NLP + telemetry)
233
+ # Everything (proxy + NLP + telemetry)
165
234
  pip install -e ".[full]"
166
235
 
167
- # Option 4: Full stack (proxy + dashboard + infra via Docker)
236
+ # CLI workflow
237
+ admina init my-project # Scaffold a governed AI project
238
+ cd my-project # admina dev runs from the project directory
239
+ admina dev # Start the local proxy + dashboard
240
+
241
+ # Full stack via Docker (no [proxy] extra required)
168
242
  ./scripts/bootstrap-secrets.sh # Auto-generate .env with random credentials
169
243
  docker compose up --build # Credentials printed at bootstrap
170
244
 
171
- # Option 5: CLI
245
+ # Note: To use the OllamaAdapter, install Ollama (https://ollama.ai)
246
+ # and pull a model first: ollama pull llama3.1:8b
247
+
248
+ # Advanced: SDK only (no proxy, no dashboard)
172
249
  pip install -e .
173
- admina init my-project # Scaffold a governed AI project
174
- cd my-project # admina dev runs from the project directory
175
- admina dev # Start local dev stack
250
+ python -c "from admina import GovernedModel; print('SDK ready')"
176
251
  ```
177
252
 
178
253
  Dashboard: [http://localhost:3000](http://localhost:3000) | API docs: [http://localhost:8080/docs](http://localhost:8080/docs)
179
254
 
180
255
  ## Architecture
181
256
 
182
- Admina is organized into 4 governance domains:
183
-
184
- | Domain | What it governs | Key features |
185
- |--------|----------------|--------------|
186
- | **Data Sovereignty** | Where data lives and how it's protected | PII redaction (spaCy + regex), residency zones, data classification |
187
- | **AI Infrastructure** | LLM and RAG stack | Ollama backend, ChromaDB vectors, Open WebUI, GPU auto-detect |
188
- | **Agent Security** | What agents can do | Injection firewall (Rust), loop breaker, proxy governance |
189
- | **Compliance** | Regulatory obligations | EU AI Act (Art. 6-15), forensic black box (SHA-256 chain), OTEL |
190
-
191
- Every governance feature works in **dual mode** — both via SDK (in-process) and proxy (network):
192
-
193
- ```
194
- SDK Mode: Proxy Mode:
195
- your code AI Agent
196
- | |
197
- GovernedModel.ask() POST /mcp
198
- | |
199
- [governance pipeline] [governance pipeline]
200
- | |
201
- Ollama / OpenAI MCP Server / LLM
257
+ Admina runs in **dual mode** — in-process via SDK or networked via proxy — but both modes feed the **same governance pipeline**.
258
+
259
+ ```mermaid
260
+ flowchart LR
261
+ A1["your code → GovernedModel.ask()"] --> P
262
+ A2["AI agent → POST /mcp"] --> P
263
+ P["governance pipeline"]
264
+ P --> U1["Ollama / OpenAI"]
265
+ P --> U2["MCP server / LLM"]
266
+ classDef pipe fill:#0ea5e9,stroke:#0369a1,color:#fff;
267
+ class P pipe;
202
268
  ```
203
269
 
270
+ Pipeline (identical in both modes): `PII redaction → firewall → loop-breaker → audit → forensic chain (SHA-256) → OTEL`
271
+
204
272
  ## The 4 Governance Domains
205
273
 
206
274
  | Domain | Capabilities | Engine |
@@ -266,49 +334,6 @@ dependency: one uvicorn serves the proxy API and the dashboard SPA on the
266
334
  same port. Use `--stack` for the production-like Docker compose, or
267
335
  `--with-llm` to also boot local LLM services.
268
336
 
269
- ## Forensic backend — choose deliberately
270
-
271
- The forensic blackbox (the SHA-256 hash chain that makes the audit trail
272
- tamper-evident) supports four backends. Read this before picking one for
273
- production.
274
-
275
- | Backend | License | When to use | Caveats |
276
- |---------|---------|-------------|---------|
277
- | **`memory`** *(default)* | n/a | Local development, tests, demos | Records are LOST on restart — no audit persistence. Loud warning at startup. |
278
- | **`filesystem`** | n/a | Single-host on-prem, air-gapped, smaller deployments | Persistence depends on the host filesystem; not ideal for HA. Requires `FORENSIC_BASE_DIR`. |
279
- | **`s3`** *(boto3)* | Apache 2.0 (boto3) | Production / HA / multi-region | Works with **any S3-compatible service** — AWS S3, Cloudflare R2, Backblaze B2, **SeaweedFS** (Apache 2.0), **Garage** (AGPLv3), **Ceph RGW** (LGPLv2). Recommended new default. |
280
- | **`minio`** *(legacy)* | see below ⚠️ | Backwards compatibility with existing MinIO clusters | Two distinct concerns; read the disclaimer. |
281
-
282
- > ⚠️ **MinIO disclaimer — what users of Admina need to know.**
283
- >
284
- > MinIO has two separate licensing/maintenance issues that can affect
285
- > downstream users of Admina, even though Admina itself is Apache 2.0:
286
- >
287
- > 1. **MinIO Server is AGPLv3.** If you deploy MinIO Server as part of a
288
- > network-accessible service (e.g. a SaaS that exposes Admina's
289
- > dashboard or API to the public Internet), AGPLv3's network clause
290
- > can be read to require you to publish the source code of the
291
- > *combined* application that interacts with MinIO over the network.
292
- > The MinIO commercial license removes this obligation, but is paid.
293
- > This is **not** an Admina obligation — Apache 2.0 is permissive —
294
- > but it is an obligation MinIO Server itself imposes on whoever
295
- > runs it.
296
- > 2. **The MinIO Python SDK has been archived.** No more security
297
- > patches, no support for new Python releases. Continuing to depend
298
- > on it is a supply-chain risk.
299
- >
300
- > **Recommendation:** for new deployments, use `FORENSIC_BACKEND=s3`.
301
- > The `boto3` client is Apache 2.0 and works against any S3-compatible
302
- > service. Two open-source FOSS-friendly options that don't trigger the
303
- > AGPL network clause for typical Admina deployments:
304
- > - **SeaweedFS** (Apache 2.0, S3 gateway, lightweight, single binary)
305
- > - **Garage** (AGPLv3, but as a backend — Garage's AGPL applies to
306
- > Garage itself, not to applications that connect to it via S3 API)
307
- >
308
- > Existing MinIO deployments keep working through `FORENSIC_BACKEND=minio`,
309
- > but plan a migration. The `minio` backend will be removed in a future
310
- > release.
311
-
312
337
  ## Dashboard
313
338
 
314
339
  Real-time governance dashboard on port 3000:
@@ -330,19 +355,38 @@ cp admina.yaml.example admina.yaml # Copy and customize
330
355
 
331
356
  See [`admina.yaml.example`](admina.yaml.example) for all options including domains, AI infra, plugins, dashboard, forensic storage, alert channels, and integrations.
332
357
 
333
- ### Environment variables (Docker / .env)
358
+ <a id="compliance-scope"></a>
334
359
 
335
- | Variable | Default | Description |
336
- |----------|---------|-------------|
337
- | `ADMINA_API_KEY` | *(empty)* | API key for all endpoints |
338
- | `UPSTREAM_MCP_URL` | `http://localhost:9000` | Default upstream MCP server |
339
- | `REDIS_URL` | `redis://localhost:6379/0` | Session state + rate limiting |
340
- | `MINIO_SECRET_KEY` | *(required)* | MinIO secret key for forensic storage |
341
- | `LOG_LEVEL` | `INFO` | Logging verbosity |
360
+ <details open>
361
+ <summary><strong>⚖️ Compliance scope &amp; legal disclaimer</strong> — what Admina does and does not do legally</summary>
362
+
363
+ <br>
364
+
365
+ > Admina is a self-assessment and defense-in-depth tool. The EU AI Act
366
+ > gap-analysis and risk classification features are **decision-support
367
+ > aids, not legal advice**. They do not replace the conformity assessment
368
+ > required under EU AI Act Art. 43 for high-risk systems, nor the
369
+ > involvement of a notified body where the regulation requires one.
370
+ >
371
+ > **EU AI Act timeline (after the Omnibus VII agreement of 7 May 2026):**
372
+ > Art. 5 prohibitions in force since 2 February 2025; GPAI obligations
373
+ > in force since 2 August 2025; Art. 50 transparency for synthetic
374
+ > content and the new NCII / synthetic-CSAM prohibition apply from
375
+ > 2 December 2026; **Annex III high-risk obligations from 2 December
376
+ > 2027** (postponed from 2 Aug 2026); Annex I high-risk from 2 August
377
+ > 2028 (postponed from 2 Aug 2027). The full machine-readable timeline
378
+ > ships with Admina as `admina.domains.compliance.eu_ai_act.EU_AI_ACT_DEADLINES`.
379
+ > See [`MODEL_CARD.md`](MODEL_CARD.md) for the full scope, limitations,
380
+ > and known failure modes of every Admina component.
381
+
382
+ </details>
342
383
 
343
384
  ## Integrations
344
385
 
345
- ### GuardrailsAI
386
+ <details>
387
+ <summary><strong>GuardrailsAI</strong> — ML-based content validation as a governance plugin</summary>
388
+
389
+ <br>
346
390
 
347
391
  ML-based content validation (toxic language, jailbreak, bias, PII via Presidio) as a governance domain plugin:
348
392
 
@@ -356,7 +400,12 @@ pip install <your-guardrails-ai-wheel>
356
400
 
357
401
  Enable in `admina.yaml` under `agent_security.domains.guardrailsai`. All inference runs locally by default — no data leaves the deployment perimeter.
358
402
 
359
- ### OpenClaw
403
+ </details>
404
+
405
+ <details>
406
+ <summary><strong>OpenClaw</strong> — govern OpenClaw agent actions via pre/post-action hooks</summary>
407
+
408
+ <br>
360
409
 
361
410
  Govern OpenClaw agent actions through the Admina proxy. Every tool call, shell command, and API request is validated before execution:
362
411
 
@@ -367,9 +416,12 @@ chmod +x setup.sh && ./setup.sh
367
416
 
368
417
  The skill uses `POST /api/v1/validate` (pre-action) and `POST /api/v1/audit` (post-action) endpoints.
369
418
 
370
- ### n8n
419
+ </details>
420
+
421
+ <details>
422
+ <summary><strong>n8n</strong> — community nodes for n8n workflow automation</summary>
371
423
 
372
- Community nodes for n8n workflow automation:
424
+ <br>
373
425
 
374
426
  | Node | Purpose |
375
427
  |------|---------|
@@ -379,9 +431,14 @@ Community nodes for n8n workflow automation:
379
431
 
380
432
  Install: `npm install n8n-nodes-admina` in your n8n instance.
381
433
 
382
- ### Cheshire Cat AI
434
+ </details>
435
+
436
+ <details>
437
+ <summary><strong>Cheshire Cat AI</strong> — govern all Cheshire Cat interactions via Python hooks</summary>
438
+
439
+ <br>
383
440
 
384
- Govern all Cheshire Cat interactions via three Python hooks (`agent_fast_reply`, `before_cat_sends_message`, `before_cat_recalls_memories`):
441
+ Three Python hooks (`agent_fast_reply`, `before_cat_sends_message`, `before_cat_recalls_memories`):
385
442
 
386
443
  ```bash
387
444
  cd integrations/cheshirecat/admina-plugin
@@ -389,9 +446,14 @@ cd integrations/cheshirecat/admina-plugin
389
446
  # Copy plugin into Cheshire Cat plugins/ directory
390
447
  ```
391
448
 
392
- ### LangChain
449
+ </details>
450
+
451
+ <details>
452
+ <summary><strong>LangChain</strong> — drop-in callback handler</summary>
453
+
454
+ <br>
393
455
 
394
- Drop-in callback handler — governs every LLM call and tool invocation in-process:
456
+ Governs every LLM call and tool invocation in-process:
395
457
 
396
458
  ```python
397
459
  from admina.integrations.langchain.callbacks import AdminaCallbackHandler
@@ -400,9 +462,12 @@ handler = AdminaCallbackHandler()
400
462
  llm = ChatOpenAI(callbacks=[handler])
401
463
  ```
402
464
 
403
- ### CrewAI
465
+ </details>
466
+
467
+ <details>
468
+ <summary><strong>CrewAI</strong> — step and task callbacks for multi-agent governance</summary>
404
469
 
405
- Step and task callbacks for multi-agent governance:
470
+ <br>
406
471
 
407
472
  ```python
408
473
  from admina.integrations.crewai.callbacks import admina_step_callback, admina_task_callback
@@ -411,16 +476,32 @@ agent = Agent(role="Researcher", step_callback=admina_step_callback)
411
476
  crew = Crew(agents=[agent], tasks=[task], task_callback=admina_task_callback)
412
477
  ```
413
478
 
414
- See [full integration docs](docs/guides/integrations.md) for details.
479
+ </details>
415
480
 
416
- ## Hybrid Python + Rust Engine
481
+ See [full integration docs](docs/guides/integrations.md) for details.
417
482
 
418
- The Rust core engine is an optional accelerator. `pip install admina-framework`
419
- ships only the pure-Python implementation; to enable the Rust engine
420
- build `admina_core` separately (`maturin develop --release
421
- --manifest-path core-rust/Cargo.toml`, see [CONTRIBUTING.md](CONTRIBUTING.md)).
422
- At runtime Admina auto-detects whichever is available and falls back
423
- transparently to Python if the Rust extension is not installed.
483
+ ## Performance — Hybrid Python + Rust engine
484
+
485
+ The Rust core engine is an optional accelerator. The default
486
+ `pip install admina-framework` ships only the pure-Python implementation;
487
+ enable the Rust engine with the opt-in extra `pip install
488
+ "admina-framework[rust]"` (or build from source for local development —
489
+ `maturin develop --release --manifest-path core-rust/Cargo.toml`, see
490
+ [CONTRIBUTING.md](CONTRIBUTING.md)). At runtime Admina auto-detects
491
+ whichever is available and falls back transparently to Python if the Rust
492
+ extension is not installed.
493
+
494
+ > **Detection trade-off (why Rust is opt-in, not the default).** The Rust
495
+ > firewall is faster but currently detects a narrower set of attacks than
496
+ > the pure-Python firewall. The Python engine normalises common evasions
497
+ > before matching (homoglyph, leetspeak, char-by-char hyphenation, base64,
498
+ > ROT13) and carries a wider multilingual pattern set; the Rust engine does
499
+ > not yet. On an internal 14-attack evasion corpus the Python firewall
500
+ > blocks all 14 while the Rust firewall blocks 7 (the plain-text and
501
+ > multilingual-keyword attacks), with no false positives on either side.
502
+ > Full Rust↔Python detection parity is tracked for 0.10. Until then, keep
503
+ > the default (pure Python) when detection breadth matters; opt into
504
+ > `[rust]` when latency dominates.
424
505
 
425
506
  Measured numbers below assume the Rust engine is loaded:
426
507
 
@@ -468,7 +549,87 @@ python scripts/simulate.py --duration 300 --rate 10
468
549
 
469
550
  Generates a weighted mix of: clean MCP requests, injection attempts, PII content, loop triggers, REST validate/audit calls, EU AI Act classifications, and dashboard reads. Colored terminal output with per-event action and summary counters.
470
551
 
471
- ## Project Structure
552
+ ## Infrastructure & Services
553
+
554
+ The full stack (`docker compose up`) runs 9 containers:
555
+
556
+ | Port | Service | Description |
557
+ |------|---------|-------------|
558
+ | `8080` | Proxy | MCP proxy + REST API + OpenAPI docs |
559
+ | `3000` | Dashboard | Real-time governance web UI |
560
+ | `3001` | Grafana | Metrics dashboards |
561
+ | `9090` | MinIO Console | Forensic storage browser |
562
+ | `4317` | OTEL Collector | OTLP gRPC ingestion |
563
+
564
+ ClickHouse and Redis are internal only (not exposed to host).
565
+
566
+ <details>
567
+ <summary><strong>🗄️ Forensic backends (4 options) — choose deliberately</strong></summary>
568
+
569
+ <br>
570
+
571
+ The forensic blackbox (the SHA-256 hash chain that makes the audit trail
572
+ tamper-evident) supports four backends. Read this before picking one for
573
+ production.
574
+
575
+ | Backend | License | When to use | Caveats |
576
+ |---------|---------|-------------|---------|
577
+ | **`memory`** *(default)* | n/a | Local development, tests, demos | Records are LOST on restart — no audit persistence. Loud warning at startup. |
578
+ | **`filesystem`** | n/a | Single-host on-prem, air-gapped, smaller deployments | Persistence depends on the host filesystem; not ideal for HA. Requires `FORENSIC_BASE_DIR`. |
579
+ | **`s3`** *(boto3)* | Apache 2.0 (boto3) | Production / HA / multi-region | Works with **any S3-compatible service** — AWS S3, Cloudflare R2, Backblaze B2, **SeaweedFS** (Apache 2.0), **Garage** (AGPLv3), **Ceph RGW** (LGPLv2). Recommended new default. |
580
+ | **`minio`** *(legacy)* | see below ⚠️ | Backwards compatibility with existing MinIO clusters | Two distinct concerns; read the disclaimer. |
581
+
582
+ > ⚠️ **MinIO disclaimer — what users of Admina need to know.**
583
+ >
584
+ > MinIO has two separate licensing/maintenance issues that can affect
585
+ > downstream users of Admina, even though Admina itself is Apache 2.0:
586
+ >
587
+ > 1. **MinIO Server is AGPLv3.** If you deploy MinIO Server as part of a
588
+ > network-accessible service (e.g. a SaaS that exposes Admina's
589
+ > dashboard or API to the public Internet), AGPLv3's network clause
590
+ > can be read to require you to publish the source code of the
591
+ > *combined* application that interacts with MinIO over the network.
592
+ > The MinIO commercial license removes this obligation, but is paid.
593
+ > This is **not** an Admina obligation — Apache 2.0 is permissive —
594
+ > but it is an obligation MinIO Server itself imposes on whoever
595
+ > runs it.
596
+ > 2. **The MinIO Python SDK has been archived.** No more security
597
+ > patches, no support for new Python releases. Continuing to depend
598
+ > on it is a supply-chain risk.
599
+ >
600
+ > **Recommendation:** for new deployments, use `FORENSIC_BACKEND=s3`.
601
+ > The `boto3` client is Apache 2.0 and works against any S3-compatible
602
+ > service. Two open-source FOSS-friendly options that don't trigger the
603
+ > AGPL network clause for typical Admina deployments:
604
+ > - **SeaweedFS** (Apache 2.0, S3 gateway, lightweight, single binary)
605
+ > - **Garage** (AGPLv3, but as a backend — Garage's AGPL applies to
606
+ > Garage itself, not to applications that connect to it via S3 API)
607
+ >
608
+ > Existing MinIO deployments keep working through `FORENSIC_BACKEND=minio`,
609
+ > but plan a migration. The `minio` backend will be removed in a future
610
+ > release.
611
+
612
+ </details>
613
+
614
+ <details>
615
+ <summary><strong>⚙️ Environment variables (Docker / .env)</strong></summary>
616
+
617
+ <br>
618
+
619
+ | Variable | Default | Description |
620
+ |----------|---------|-------------|
621
+ | `ADMINA_API_KEY` | *(empty)* | API key for all endpoints |
622
+ | `UPSTREAM_MCP_URL` | `http://localhost:9000` | Default upstream MCP server |
623
+ | `REDIS_URL` | `redis://localhost:6379/0` | Session state + rate limiting |
624
+ | `MINIO_SECRET_KEY` | *(required)* | MinIO secret key for forensic storage |
625
+ | `LOG_LEVEL` | `INFO` | Logging verbosity |
626
+
627
+ </details>
628
+
629
+ <details>
630
+ <summary><strong>📁 Full project structure</strong></summary>
631
+
632
+ <br>
472
633
 
473
634
  ```
474
635
  admina/
@@ -502,7 +663,12 @@ admina/
502
663
  +-- docker-compose.yml Full stack deployment (9 containers)
503
664
  ```
504
665
 
505
- ## API
666
+ </details>
667
+
668
+ <details>
669
+ <summary><strong>🔌 API examples (curl)</strong></summary>
670
+
671
+ <br>
506
672
 
507
673
  ```bash
508
674
  # Health check (always public)
@@ -535,19 +701,7 @@ curl -X POST http://localhost:8080/api/compliance/classify \
535
701
  curl http://localhost:8080/api/dashboard/score
536
702
  ```
537
703
 
538
- ## Infrastructure & Services
539
-
540
- The full stack (`docker compose up`) runs 9 containers:
541
-
542
- | Port | Service | Description |
543
- |------|---------|-------------|
544
- | `8080` | Proxy | MCP proxy + REST API + OpenAPI docs |
545
- | `3000` | Dashboard | Real-time governance web UI |
546
- | `3001` | Grafana | Metrics dashboards |
547
- | `9090` | MinIO Console | Forensic storage browser |
548
- | `4317` | OTEL Collector | OTLP gRPC ingestion |
549
-
550
- ClickHouse and Redis are internal only (not exposed to host).
704
+ </details>
551
705
 
552
706
  ## Project documents
553
707
 
@@ -557,6 +711,7 @@ ClickHouse and Redis are internal only (not exposed to host).
557
711
  - [CHANGELOG.md](CHANGELOG.md) — release notes
558
712
  - [SECURITY.md](SECURITY.md) — coordinated disclosure policy
559
713
  - [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) — Contributor Covenant 2.1
714
+ - **Browse the AI-generated wiki** → [deepwiki.com/admina-org/admina](https://deepwiki.com/admina-org/admina)
560
715
 
561
716
  Admina is Apache 2.0. Contributions are welcome.
562
717