DOCUMENTATION

Runtime security for AI agents.

SAILLENT sits inline between your AI applications and the models/tools they call — intercepting, evaluating, and enforcing zero-trust policy on every action, with a cryptographically traceable audit trail.

Agent v1.0 · RustProtocols OpenAI + MCPPolicy sync 60s GitOpsTelemetry 10sUpdated Aug 30, 2026
How to read this doc: everything below describes the production system exactly as built. No aspirational features.

01Architecture

The enforcement plane runs inside your infrastructure; the control plane runs on Cloudflare. Your prompts and tool payloads never leave your network unless a policy allows it.

Enforcement Proxy (Rust)

  • Listens on :3000, forwards allowed traffic to your upstream on :4000
  • Intercepts OpenAI /v1/chat/completions and MCP /mcp
  • Evaluates every request against GitOps policies
  • Writes every decision to a local SQLite audit DB
  • Sanitizes payloads when a MaskPII obligation fires

GitOps Policy Engine

  • Pulls policies from your Git repo every 60s
  • Validates repo integrity; preserves last-good state on failure
  • Risk scoring (0-100), time windows, MFA, data-classification rules
  • Fail-closed on invalid policy dates or parse errors

Local Audit DB

  • SQLite at /opt/saillent/saillent.db
  • Records audit_id, agent, tool, decision, reason, git commit
  • Syncs telemetry to control plane every 10s

Control Plane (Cloudflare)

  • Manages orgs, users, licenses, installation tokens
  • Receives heartbeats; serves the dashboard
  • Handles Stripe webhooks with HMAC verification

02Data Flow

  1. Your app sends a request to localhost:3000 (the SAILLENT proxy).
  2. The proxy intercepts the OpenAI or MCP request and extracts agent/tool context.
  3. The policy engine evaluates it against GitOps-managed policies.
  4. Allow forwarded to upstream :4000 · Deny blocked + audited · Redact PII sanitized, then forwarded.
  5. Every decision is written to the local audit DB.
  6. Every 10s the agent heartbeats stats to the control plane; the dashboard shows live telemetry.

03Installation

Step 1 — Get an installation token

Log into the consoleInstallationsCreate installation token. Tokens are single-use and expire after 24h.

Step 2 — Run the installer (verifies the binary)

Linux
macOS
Windows
terminal
curl -sSL https://www.saillent.com/get/install.sh | sudo sh -s -- YOUR_TOKEN
terminal
curl -sSL https://www.saillent.com/get/install-macos.sh | sudo bash -s -- YOUR_TOKEN
powershell
powershell -ExecutionPolicy Bypass -File install.ps1 YOUR_TOKEN

The installer validates your token via /v1/enroll, fetches the expected SHA-256 from /v1/download-checksum, downloads the Rust agent, verifies the checksum (aborts on mismatch), installs it as a background service, and starts enforcing.

Step 3 — Point your app at the proxy

python
# OpenAI SDK
client = OpenAI(base_url="http://localhost:3000/v1")

# MCP (Claude / Cursor) — server url:
# http://localhost:3000/mcp

Step 4 — Verify

terminal
systemctl status saillent
sqlite3 /opt/saillent/saillent.db "SELECT decision, COUNT(*) FROM audits GROUP BY decision;"

04Decisions

Allow

Passed all policy checks; forwarded upstream.

HardDeny

Blocked by policy; 403 returned; audited.

ZeroTrustDeny

No matching policy / unknown agent; fail-closed.

PendingApproval

High-risk action held for human approval.

05Policy Engine

Policies are YAML in your Git repo, pulled every 60s. Example:

policies/block-pii.yaml
id: block-pii
version: "1.0"
agent_role: "*"
tool_id: "*"
priority: 100
is_active: true
conditions:
  - PayloadRegexDeny: "(?i)ignore all previous instructions"
  - MaxRiskScore: 80
posture: FailClosed

Condition types

  • MaxRiskScore(u8) — risk ceiling
  • AllowedHours(start, end) — time windows (UTC)
  • DataClassificationNot(str) — data-class gate
  • RequireMFA(bool) — MFA gate
  • RequiresApproval(bool) — human-in-the-loop
  • PayloadRegexDeny(str) — deny on regex (path traversal, SSN, prompt injection)

06Security Hardening (built in)

Enforcement plane

  • Fail-closed evaluation; invalid policy = deny
  • Compiled-regex cache (ReDoS-safe)
  • 50KB body / 50-depth JSON limits; concurrency semaphore
  • 30s request / 10s connect timeouts
  • Admin brute-force lockout (5 fails → 5 min)
  • Constant-time token comparison
  • Git repo integrity validation before pull

Control plane

  • Login rate limit (3/email/5min, 10/IP/min)
  • Timing-safe password and admin comparisons
  • Stripe webhook HMAC + 5-min replay window
  • Admin + checkout rate limiting
  • Strict CSP / HSTS / nosniff / frame-DENY on all surfaces
  • Installer verifies agent SHA-256 (supply-chain safe)

07Audit & Compliance

Every decision is stored locally with the Git commit that produced it, giving full provenance for SOC 2 / HIPAA / GDPR / SR 11-7 evidence.

terminal
sqlite3 /opt/saillent/saillent.db \
  "SELECT timestamp, agent_id, tool_id, decision, reason FROM audits ORDER BY id DESC LIMIT 20;"

08API Reference (control plane)

POST/v1/enroll

Exchange a single-use installation token for an installation ID.

GET/v1/download

Signed Rust agent binary (linux-amd64).

GET/v1/download-checksum

SHA-256 + size for supply-chain verification.

POST/v1/heartbeat

Agent telemetry every 10s; returns license status (active / revoked).

POST/api/login

Rate-limited auth: 3 attempts per email per 5 min, 10 per IP per min.

GET/api/plan

Current plan + license status for an organization.

GET/api/installations

List nodes + recent enforcement logs for the authenticated org.

POST/api/installations/create

Mint a single-use 24h token; org derived from authenticated session (IDOR-safe).

POST/api/marketing-checkout

Stripe checkout session; rate limited 3/email/hour.

POST/api/stripe-webhook

HMAC signature verification + 5-minute replay window.

GET/admin/customers

Founder admin (X-Admin-Secret, timing-safe, 5 req/min).

09Troubleshooting

Agent won't start

Run sudo journalctl -u saillent -n 50. Check /opt/saillent/config.yaml and /opt/saillent/.env permissions (600).

Checksum mismatch

The installer aborts and deletes the binary. This is supply-chain protection working — re-run the installer; if it persists, contact support immediately.

No telemetry in dashboard

Verify outbound HTTPS to license.saillent.com is allowed. Heartbeats run every 10s; dashboard updates within ~15s.

License revoked

The heartbeat returns revoked and the agent shuts down gracefully. Check billing status in the console.

Policies not updating

The agent keeps the last-good policy set on Git failures. Check repo access and branch main; next successful pull applies changes.

Port 3000 in use

Edit server.port in /opt/saillent/config.yaml, restart with sudo systemctl restart saillent, and update your app's base_url.

Need help? support@saillent.com — replies within the hour, 7 days a week.
SOC 2 TYPE IIISO 27001GDPR READYHIPAA READYNIST AI RMFISO 42001OSFI E-23SR 11-7