EU-sovereign AI decision middleware. Wraps any AI agent, evaluates policy in-process, and writes tamper-resistant decision records to local storage. Zero dependencies. Air-gapped capable. Apache 2.0.
pip install sentinel-kernel
GitHub · PyPI · Full sample reportThe charts below are rendered from a sample Sentinel run with 200 simulated decisions. Every element is inline SVG — zero external resources, zero JavaScript. Safe for air-gapped environments.
| Time | Agent | Result | Scope | Residency | Latency |
|---|---|---|---|---|---|
| 10:20:28 | _build_sentinel_with_sample_da | DENY | EU | EU-DE | 0 ms |
| 10:20:28 | _build_sentinel_with_sample_da | DENY | EU | EU-DE | 0 ms |
| 10:20:28 | _build_sentinel_with_sample_da | ALLOW | EU | EU-DE | 0 ms |
| 10:20:28 | _build_sentinel_with_sample_da | ALLOW | EU | EU-DE | 0 ms |
| 10:20:28 | _build_sentinel_with_sample_da | DENY | EU | EU-DE | 0 ms |
| 10:20:28 | _build_sentinel_with_sample_da | ALLOW | EU | EU-DE | 0 ms |
| 10:20:28 | _build_sentinel_with_sample_da | DENY | EU | EU-DE | 0 ms |
| 10:20:28 | _build_sentinel_with_sample_da | ALLOW | EU | EU-DE | 0 ms |
| 10:20:28 | _build_sentinel_with_sample_da | ALLOW | EU | EU-DE | 0 ms |
| 10:20:28 | _build_sentinel_with_sample_da | ALLOW | EU | EU-DE | 0 ms |
| 10:20:28 | _build_sentinel_with_sample_da | ALLOW | EU | EU-DE | 0 ms |
| 10:20:28 | _build_sentinel_with_sample_da | ALLOW | EU | EU-DE | 0 ms |
| 10:20:28 | _build_sentinel_with_sample_da | ALLOW | EU | EU-DE | 0 ms |
| 10:20:28 | _build_sentinel_with_sample_da | DENY | EU | EU-DE | 0 ms |
| 10:20:28 | _build_sentinel_with_sample_da | ALLOW | EU | EU-DE | 0 ms |
| 10:20:28 | _build_sentinel_with_sample_da | ALLOW | EU | EU-DE | 0 ms |
| 10:20:28 | _build_sentinel_with_sample_da | ALLOW | EU | EU-DE | 0 ms |
| 10:20:28 | _build_sentinel_with_sample_da | DENY | EU | EU-DE | 0 ms |
| 10:20:28 | _build_sentinel_with_sample_da | DENY | EU | EU-DE | 0 ms |
| 10:20:28 | _build_sentinel_with_sample_da | DENY | EU | EU-DE | 0 ms |
from sentinel.manifesto import (
SentinelManifesto, EUOnly, Required, OnPremiseOnly,
Targeting, AcknowledgedGap,
)
class OurPolicy(SentinelManifesto):
jurisdiction = EUOnly()
kill_switch = Required()
storage = OnPremiseOnly(country="DE")
bsi = Targeting(by="2026-12-31")
ci_cd = AcknowledgedGap(
provider="Managed SaaS CI",
migrating_to="Self-hosted Forgejo",
by="2027-Q2",
reason="No EU-sovereign CI alternative with comparable UX",
)
report = OurPolicy().check()
print(report.as_text())
# 2-minute local demo
pip install sentinel-kernel
python -c "
from sentinel import Sentinel
sentinel = Sentinel()
@sentinel.trace
def decide(req):
return {'decision': 'approved'}
decide({'amount': 5000})
print(sentinel.query(limit=1)[0].to_json())
"
# Full Grafana + OTel stack (requires Docker)
git clone https://github.com/sebastianweiss83/sentinel-kernel
cd sentinel-kernel/demo
docker compose up --build
| Question | Sentinel answer |
|---|---|
| What was decided? | Append-only DecisionTrace with policy result and rule |
| By which model, which policy, which version? | Every trace records agent, model, policy name/version |
| Under whose law is the evidence stored? | sovereign_scope and data_residency on every record |
| Can a human halt it? | Runtime kill switch (Art. 14) with no restart |
| What of this am I compliant with today? | sentinel compliance check |
| Where is my sovereignty leaking? | sentinel scan (runtime + CI/CD + infrastructure) |