Nautilus
Policy-first data broker for AI agents. One call plans, routes, enforces, attests, and audits.
Part of the Kraken stack: Fathom (reasoning engine) · Nautilus (policy data broker) · Stargraph (agent-graph framework).
Current version: the PyPI badge above (a number typed here goes stale on the next release). Ask an install: nautilus version, or curl -sS $NAUTILUS/healthz.
License: Apache-2.0
Language: Python 3.13+
Package Manager: uv
Maintained by: KrakenNet
Why Nautilus?
Every AI agent framework gives agents direct access to data. For most tasks, that's fine.
For some tasks, unchecked access is unacceptable:
- Policy routing — "Which databases should this query hit?" can't be the agent's choice.
- Scope enforcement — "What rows is this agent allowed to see?" needs provable constraints.
- Audit — "What data did this agent touch, and why?" requires a tamper-evident trail.
- Attestation — "Can we prove this routing decision happened?" needs a signed token.
Nautilus provides deterministic, policy-first data brokering using Fathom — a CLIPS-based expert system — to route, scope, and attest every request.
Install
uv add nautilus-rkm
Database and object-store drivers are extras — install the ones your sources
need, or [all] for every built-in adapter:
uv add "nautilus-rkm[postgres]" # pgvector, elasticsearch, neo4j, influxdb, s3
uv add "nautilus-rkm[all]"
A source whose driver is missing fails at startup naming the extra to install.
Quick Start
nautilus demo # a governed agent-to-agent handoff decision. No config, no database.
nautilus init # writes a nautilus.yaml that runs as it stands
from nautilus import Broker
with Broker.from_config("nautilus.yaml") as broker:
response = broker.request(
"agent-alpha",
"Find vulnerabilities for CVE-2026-1234",
{"purpose": "threat-analysis", "session_id": "s1"},
)
print(response.outcome) # "allowed" | "denied" | "errored" | "skipped"
print(response.data) # {"main-db": [...]}
print(response.sources_queried) # ["main-db"]
print(response.denial_records) # why "classified-db" was refused, and by which rule
print(response.attestation_token) # signed JWS
print(response.duration_ms) # 47
See the Getting Started guide for a full walkthrough.
What Ships Today
Core runtime
Brokerfacade with sync/async APIs (request,arequest,from_config,afrom_config)- Fathom-based policy router for intent-aware source selection and scope enforcement
- Per-source scope constraints (WHERE-clause fragments) with injection-safe field validation
- Ed25519 JWS attestation service for signed routing decisions
- JSONL audit sink with per-request, append-only entries (fsync'd)
- Pattern-matching and LLM-based intent analysis (Anthropic, OpenAI)
- Cross-agent handoff reasoning with session-backed escalation detection
Adapters (10 built-in)
- PostgreSQL, PgVector, Elasticsearch, Neo4j, REST, ServiceNow, InfluxDB, S3, LLM
static— rows declared innautilus.yaml, for a first run with no database- Pluggable via entry points and the Adapter SDK
Transports
- FastAPI REST server (
POST /v1/request, health/readiness probes) - MCP transport (stdio and HTTP modes)
- CLI:
nautilus demo,nautilus init,nautilus serve,nautilus health,nautilus version
Rule packs
data-routing-nist— NIST clearance/classification routing rulesdata-routing-hipaa— HIPAA-compliant routing rules
What You Get Per Request
| Step | What happens |
|---|---|
| Intent analysis | Classify intent into data types, entities, temporal scope, sensitivity |
| Policy routing | Fathom evaluates (clearance, purpose, source) — route, scope, or deny |
| Adapter fan-out | Routed sources execute concurrently with per-adapter error isolation |
| Attestation | Ed25519 JWS signed over routing decision, bound to request_id |
| Audit | JSONL entry appended per request — success, denial, or error |
Key Differentiator: Session-Aware Routing
Unlike stateless policy engines, Nautilus maintains working memory across requests within a session:
- Cumulative exposure — "This agent accessed PII from 3 sources — deny the 4th."
- Cross-agent handoffs — "Agent A is passing
secretdata to Agent B who hasunclassifiedclearance — deny." - Escalation detection — "Anomalous access pattern detected — escalate for forensic review."
Run the handoff refusal yourself with nautilus demo — no config, no adapter, no database.
Integration Shapes
As a library
from nautilus import Broker
with Broker.from_config("nautilus.yaml") as broker:
response = broker.request("agent-id", "intent", context)
As a REST sidecar
nautilus serve --config nautilus.yaml --transport rest --bind 0.0.0.0:8000
curl -H "X-API-Key: $KEY" -X POST localhost:8000/v1/request \
-d '{"agent_id": "agent-alpha", "intent": "...", "context": {...}}'
As an MCP server
nautilus serve --config nautilus.yaml --transport mcp
Air-gapped mode
nautilus serve --config nautilus.yaml --air-gapped
Configuration
A nautilus.yaml declares sources, rules, analysis, audit, and attestation:
sources:
- id: main-db
type: postgres
description: "Customer orders"
classification: confidential
data_types: [users, orders]
allowed_purposes: [support]
connection: ${DATABASE_URL}
table: public.orders
agents:
support-bot:
id: support-bot
clearance: confidential
default_purpose: support
rules:
user_rules_dirs: [./rules/]
attestation:
enabled: true
audit:
path: ./audit.jsonl
Documentation
Full documentation is available at krakennet.github.io/nautilus.
Related Projects
- Fathom — Deterministic reasoning runtime that powers Nautilus routing
- Bosun — Agent governance built on Fathom (fleet analysis, compliance attestation)
Development
git clone https://github.com/KrakenNet/nautilus.git
cd nautilus
uv sync
uv run pytest -m unit # fast suite, no containers
uv run pytest -m integration # full e2e, boots PostgreSQL via testcontainers
uv run ruff check && uv run ruff format --check && uv run pyright
uv run mkdocs serve # docs preview
See CHANGELOG.md for release notes.
Contributing
We welcome contributions! Please read our Contributing Guide before submitting a pull request. All contributors are expected to follow our Code of Conduct.
Security
To report a security vulnerability, please see our Security Policy. Do not open a public issue for security concerns.
Star History
License
Apache-2.0 — see LICENSE for details.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file nautilus_rkm-0.3.0.tar.gz.
File metadata
- Download URL: nautilus_rkm-0.3.0.tar.gz
- Upload date:
- Size: 420.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cb804b0f77cef55c65f05268a53e351619367068d80f7f42f5da24ea3c4c48e2
|
|
| MD5 |
7d0cc226102d12d433b6c443a08d8902
|
|
| BLAKE2b-256 |
7c113989b48e93224bc610d5afea5b8039b5763aea7283f878f948f34a8fc822
|
Provenance
The following attestation bundles were made for nautilus_rkm-0.3.0.tar.gz:
Publisher:
pypi-publish.yml on KrakenNet/nautilus
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nautilus_rkm-0.3.0.tar.gz -
Subject digest:
cb804b0f77cef55c65f05268a53e351619367068d80f7f42f5da24ea3c4c48e2 - Sigstore transparency entry: 2760558178
- Sigstore integration time:
-
Permalink:
KrakenNet/nautilus@12ed952fd2ff68b4cc697f97b88d2c6922193501 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/KrakenNet
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yml@12ed952fd2ff68b4cc697f97b88d2c6922193501 -
Trigger Event:
push
-
Statement type:
File details
Details for the file nautilus_rkm-0.3.0-py3-none-any.whl.
File metadata
- Download URL: nautilus_rkm-0.3.0-py3-none-any.whl
- Upload date:
- Size: 502.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
997a005df22a5d00ff2a7ca985bff45a7a404d95c127d7ea0566ee7c05b6a018
|
|
| MD5 |
53d8a62d61447c7c9df08f3aa37213e6
|
|
| BLAKE2b-256 |
b3ce7fe00f23a810b47cbf4e959bce6e5850bd84684963d97e2e1f03bb202731
|
Provenance
The following attestation bundles were made for nautilus_rkm-0.3.0-py3-none-any.whl:
Publisher:
pypi-publish.yml on KrakenNet/nautilus
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nautilus_rkm-0.3.0-py3-none-any.whl -
Subject digest:
997a005df22a5d00ff2a7ca985bff45a7a404d95c127d7ea0566ee7c05b6a018 - Sigstore transparency entry: 2760558214
- Sigstore integration time:
-
Permalink:
KrakenNet/nautilus@12ed952fd2ff68b4cc697f97b88d2c6922193501 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/KrakenNet
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yml@12ed952fd2ff68b4cc697f97b88d2c6922193501 -
Trigger Event:
push
-
Statement type: