AI-Powered Investigative Intelligence for Anti-Corruption Journalism
Emet is an autonomous investigation agent that traces corporate ownership, screens sanctions lists, analyzes blockchain flows, and synthesizes findings into auditable, publication-safe reports. It is built on the FollowTheMoney (FtM) data model -- the same schema used by Aleph and OCCRP's investigative data platform.
The name "Emet" (Hebrew: truth) is the word inscribed on the forehead of the Golem -- a guardian animated to protect its community. The first letter, Aleph, is also the name of OCCRP's investigative data platform.
What It Does
Give Emet a goal in plain language. It runs a multi-step investigation autonomously:
bash
1emet investigate \2"Trace beneficial ownership of Meridian Holdings through offshore jurisdictions"\3 --llm ollama --max-turns 8
An LLM reasons about what to do next. The agent searches entity databases, screens sanctions and PEP lists, traces corporate ownership chains, monitors global news, investigates blockchain transactions, and synthesizes everything into a structured report -- with PII scrubbed at publication boundaries and a full forensic audit trail.
Investigation Tools
Tool
Function
search_entities
Federated entity search across Aleph, OpenSanctions, OpenCorporates, ICIJ Offshore Leaks, GLEIF, UK Companies House, SEC EDGAR
screen_sanctions
OFAC, EU, UN consolidated sanctions and PEP screening with fuzzy matching
trace_ownership
Multi-hop beneficial ownership tracer with effective stake computation through offshore structures
osint_recon
Domain, email, IP, and social footprint reconnaissance (via SpiderFoot)
GDELT-powered real-time entity monitoring across global news
analyze_graph
Community detection, broker identification, circular ownership detection, shell company scoring, PageRank
generate_report
LLM-synthesized investigation reports with evidence chains and confidence scoring
search_aleph
Direct Aleph API search across collections, documents, and leaked records
Additional Capabilities
Federated search across 7+ sources with parallel async fan-out, Jaccard deduplication, token-bucket rate limiting, and response caching
Evidence chain tracking: every factual claim is bound to source references with a 0-1 confidence score; unsupported claims are flagged before publication
Collection -- Federated data retrieval from public registries, sanctions lists, blockchain explorers, court records, and news feeds. Each source adapter produces FtM-schema entities with provenance metadata.
Analysis -- Graph algorithms (PageRank, community detection via Louvain/label propagation, shortest path, broker identification, circular ownership detection, shell company topology scoring, structural anomaly detection), evidence chain confidence scoring, temporal pattern analysis, and entity resolution.
Orchestration -- LLM-driven agent loop that decides which tools to call, tracks leads by priority, manages investigation budget, and synthesizes findings into reports. Falls back to heuristic routing when no LLM is available.
Human review is required at the publication boundary. The safety harness operates in two modes: investigate (audit-only -- log everything, block nothing) and publish (enforcing -- PII scrubbed, sensitive data redacted, all outputs sanitized).
LLM Backend
Emet is LLM-agnostic with a tiered routing system:
Tier
Task Type
Default Model (Docker)
Fast
Entity extraction, classification, NER
Qwen3 8B
Balanced
Document analysis, sanctions screening
Qwen3 14B / Qwen3.5 27B
Powerful
Multi-step reasoning, report synthesis
Qwen3 14B / Qwen3.5 27B / Qwen3 235B MoE
Three provider backends:
Ollama (default) -- local models, zero API cost, data never leaves the machine
Anthropic Claude -- cloud API fallback
Stub -- canned responses for testing and demo mode
Cascading fallback: if the configured provider is unavailable, Emet degrades gracefully through the chain (Ollama -> Anthropic -> Stub -> heuristic routing). It never crashes due to LLM unavailability.
Cross-investigation: HippoRAG knowledge graph (based on arXiv:2502.14802) with CatRAG query-adaptive edge weighting. Entities from different investigations are linked automatically through co-occurrence triples and Personalized PageRank. This is where "Entity A is a donor in Investigation 1" connects to "Entity A is a contractor in Investigation 2."
Graph Capabilities
Built on NetworkX with investigative interpretations layered on standard algorithms:
Algorithm
Investigative Use
PageRank
Influence scoring -- identify the most structurally important entities in a network
Community Detection
Network cluster identification via Louvain or label propagation -- find groups of tightly connected entities
Shortest Path
Connection tracing -- find the shortest chain between two entities
Broker Identification
Betweenness centrality -- find intermediaries connecting otherwise separate groups
Circular Ownership
Detect ownership loops (A owns B owns C owns A) -- a shell company red flag
Shell Topology Scoring
Score entities on structural indicators of shell company behavior
Structural Anomaly Detection
Fan-in analysis -- flag entities owned by an unusual number of parents (pooled SPV / layering hub signal)
Beneficial Ownership (UBO) Tracing
Walk incoming ownership edges recursively, multiply share percentages to compute each owner's effective stake in a target
All results include human-readable explanations suitable for journalists and suggested follow-up actions.
All entities use the FollowTheMoney data model throughout the pipeline. This means:
Entities produced by Emet can be exported as FtM JSONL bundles and imported directly into Aleph collections
Aleph collections can be searched and retrieved natively via the search_aleph tool
Entity schemas (Person, Company, LegalEntity, Ownership, Directorship, Payment, etc.) are consistent with OCCRP's existing data infrastructure
Federated search results from all sources are normalized to FtM before entering the investigation graph
Security
Layer
Function
PII Scrubbing
Regex-based detection of email, phone, SSN, credit card (with Luhn validation), IP address, date of birth. Applied at every publication boundary.
Target Policy
Code-enforced rule: investigate organizations and public figures only. Private individuals are denied unless a logged public-interest override is supplied. Classification uses FtM schema + public-dataset provenance (congressional disclosures, FEC, EDGAR, sanctions).
Intent Capsules
HMAC-SHA256 signed mandates that authorize a bounded set of agent actions. Every action traces back to a signed capsule with budget, tool, and egress constraints.
Safety Harness
Two-mode (investigate vs publish). Pre-execution checks, circuit breakers, cost caps, and a full forensic audit trail.
Audit Archive
Every tool call, LLM exchange, and reasoning step captured in gzip-compressed JSONL with SHA-256 integrity verification. Actor identity recorded on every event.
Emet's behavior is governed by VALUES.json, a machine-readable ethics constitution based on the SPJ Code of Ethics, OCCRP editorial standards, and GIJN verification methodology:
Pillar
Weight
Core Constraint
Accuracy
0.25
Every claim traceable to source material. AI inference always flagged.
Source Protection
0.25
Source identity never exposed without consent. Document metadata scrubbed.
Public Interest
0.20
Investigation scope proportionate to significance. Private privacy respected.
Proportionality
0.15
Least intrusive method preferred. Data collection limited to necessity.
Transparency
0.15
Methodology documented and auditable. AI tool usage disclosed.
Consensus gates require human editorial approval for publication, entity modification, and sensitive operations.
Deployment
Docker (recommended)
Three deployment tiers, all fully local -- no data leaves the machine, no cloud APIs called:
bash
1# Field -- laptop / Mac Mini (24-32GB RAM)2# Models: Qwen3 14B + Qwen3 8B (~20GB model footprint)3docker compose -f docker-compose.yml -f docker-compose.field.yml up -d
45# Server -- office server (64GB+ RAM)6# Models: Qwen3.5 27B + Qwen3 8B (~40GB model footprint)7docker compose -f docker-compose.yml -f docker-compose.server.yml up -d
89# Enterprise -- newsroom infrastructure (256GB+ RAM)10# Models: Qwen3 235B MoE + Qwen3.5 27B + Qwen3 8B (~170GB model footprint)11docker compose -f docker-compose.yml -f docker-compose.enterprise.yml up -d
On first run, the ollama-setup container pulls models automatically. Monitor progress:
docker compose logs -f ollama-setup
Verify the stack is running:
bash
1docker compose ps2# engine, db, redis, mcp, spiderfoot should be running34curl http://localhost:8000/health
5# {"status": "ok"}
Local Development (pip)
Requires Python 3.11+.
bash
1pip install -e ".[dev]"2cp .env.example .env
3# Edit .env with API keys (all optional -- demo mode works without any)45# Demo mode -- bundled scenario, no keys needed6emet investigate "Meridian Holdings offshore network" --llm stub --demo
78# With local Ollama9emet investigate "Trace ownership of Acme Holdings" --llm ollama
1011# With Anthropic Claude12exportANTHROPIC_API_KEY=sk-ant-...
13emet investigate "Trace ownership of Acme Holdings" --llm anthropic
Interfaces
Interface
Command
Use Case
CLI
emet investigate "..."
Direct investigations, scripting, automation
HTTP API
emet serve --http --port 8000
Web dashboards, programmatic access
WebSocket
ws://host:8000/ws/investigations/{id}
Real-time streaming updates
MCP
emet serve --transport stdio
Claude Desktop, MCP-compatible clients
API docs are auto-generated at http://localhost:8000/docs when the HTTP server is running.
Demo Script
bash
1# After Docker stack is running:2./demo_occrp.sh
Runs three investigations demonstrating ownership tracing, sanctions screening, and financial flow analysis. Results saved to ./investigations/.
Configuration
All data source API keys are optional. Emet degrades gracefully when sources are unavailable, and demo mode works with zero configuration.
See .env.example for the full list of configurable environment variables, grouped by category:
Data sources -- OpenSanctions, OpenCorporates, UK Companies House, ICIJ, GLEIF, SEC EDGAR, FEC, CourtListener
Blockchain -- Etherscan (ETH), Solana (public RPC, no key)
News/OSINT -- GDELT (no key), SpiderFoot (self-hosted)
Hippocratic License 3.0 with AI Welfare module. See LICENSE.md.
Enabled modules: CL (labor rights), ECO (environmental), MEDIA (disinformation), MIL (military), SV (surveillance), XUAR (human rights).
Usage rights by organization type:
Investigative journalists, newsrooms, press freedom organizations, anti-corruption NGOs, academic journalism programs -- free, no restrictions beyond the license terms.
Commercial use (compliance, KYC/AML, due diligence, corporate intelligence) -- commercial license required. See LICENSE-COMMERCIAL-ADDENDUM.md.
Prohibited under all circumstances -- surveillance of journalists or sources, press suppression, targeting whistleblowers, mass surveillance, circumventing press freedom protections.
Core infrastructure derived from Project Kintsugi (self-repairing agentic harness). The governance, security, memory, and plugin layers are domain-agnostic by design. The investigative layers (agent loop, MCP tools, FtM spine, federated data sources, graph algorithms) are Emet-specific.