Architecture

Every boundary, and exactly what crosses it.

Odonat asks for write access to your production environment. That is only reasonable if you can see where the process runs, what it is permitted to call, and what stops it when it is wrong. Everything on this page is taken from the Helm chart you install, not written for the website.

Deployment topology

One namespace, two containers, zero inbound ports.

Everything Odonat installs lives inside the innermost box. Nothing outside your VPC can open a connection to it.

Boundary crossings

Six crossings. Two of them carry nothing.

This is the complete list. If a reviewer finds a seventh, that is a bug and we want to hear about it at security@odonat.ai.

Public internet → agent
none
Nothing. There is no inbound path.
NetworkPolicy ingress: [] — an empty rule set denies all inbound at the CNI. The agent is never dialled; it polls outward.
Agent → Kubernetes API
outbound TCP 443
Reads pods, services, nodes, events, namespaces, pod logs, deployments, replicasets, statefulsets, daemonsets and metrics. Writes deployments/scale and statefulsets/scale, nothing else.
ClusterRole. The scale subresource cannot change an image, a command, an env var, or any other part of a pod spec.
Agent → foundation model
outbound TCP 443
A prompt that has passed two-pass redaction: regex for known credential shapes, then entropy analysis for high-randomness secrets.
Envoy sidecar in the same pod, configured failClosed. If redaction fails the request is dropped rather than sent.
Agent → GitHub / GitLab
outbound TCP 443
Reads repository contents and checks. Opens pull requests.
App scope. It cannot force push and it cannot alter branch protection.
Agent → your SIEM
outbound
A signed record of every action requested, as it happens.
Your Splunk or Datadog. The compliance record lives in a system you control, so it survives us.
Agent → disk
none
No proprietary source is ever written to disk.
Working state lives on a memory-backed volume; the root filesystem is mounted read-only.
Permission boundary

What the ClusterRole does not contain.

A permission list is easy to read charitably. The useful question is what is missing, because that is what a fully compromised agent still cannot do. These verbs appear nowhere in the chart.

create
It cannot bring new workloads into existence.
delete
It cannot remove a pod, a deployment, or a namespace.
exec
It cannot get a shell in any container, including your app containers.
secrets
It cannot read a Secret. Not scoped narrowly — absent entirely.
escalate / bind
It cannot grant itself or anything else a wider role.
any non-scale write
The only mutating verbs it holds are patch and update, and only on deployments/scale and statefulsets/scale.

Pod hardening

runAsNonRoot: true
UID and GID 10001. Never root.
readOnlyRootFilesystem: true
Both containers. Writable paths are explicit mounts.
allowPrivilegeEscalation: false
No setuid path to more privilege than it started with.
capabilities.drop: ["ALL"]
No Linux capabilities retained.
seccompProfile: RuntimeDefault
Syscall filter applied at the pod level.

These are set in the Deployment template, not exposed as values. There is no override that turns them off.

Control path

Four stages, and what bounds each one.

Each stage degrades toward doing nothing. The interesting column is the third.

01
Pre-merge0s

A pull request is replayed against real production traffic in a Shadow Replay. Latency regressions, malformed config and hardcoded secrets surface here, before the merge button does anything.

Bounded by Fails open. If Odonat cannot report, CI proceeds exactly as it did before you installed it. A reliability tool that can block your deploys is a new source of outages.

02
Rollout<10s to halt

What survives the gate ships into a Sentinel Cell: 1% of production traffic, observed for six minutes. Correctness and capacity faults that only appear under real load surface here.

Bounded by Traffic is shaped through your existing Istio or App Mesh, not replaced by ours. If the agent dies mid-rollout your orchestrator carries on.

03
Production anomaly<30s to a revert PR

Datadog, PagerDuty and Splunk alerts normalise into one IncidentEvent shape. The causal engine correlates them against recent deploys and config changes and returns a ranked hypothesis with a confidence score.

Bounded by Reasoning is the only part with a model in it. Ingestion, the deterministic gates and the safety plane are ordinary services, so they keep running when the model provider does not.

04
Action60s hard timeout

Above 85% confidence the executor runs an action from a compiled allowlist: git_revert or scale_replica. Below it, the finding is written up and routed to a human with a one-click approve.

Bounded by The allowlist is compiled into the binary, not prompted. Drops, deletes, truncates, namespace deletions and force pushes raise an exception the calling code cannot catch. Every remediation carries a hard 60-second timeout.

The chart is plain YAML, short enough to read in one sitting, and your platform team should read it rather than take our word for any of the above. What it renders, and the values you actually override, are on the deployment page.