Every control below is something the system makes impossible, not something we intend. Each one names the mechanism and the file, because a claim you cannot check is a claim you should not believe.
Enforced bya queue, not a call
Changes reach your cluster without a credential for it
No kubeconfig, no service-account token, no network path inward to make a change. The agent inside your cluster asks for work and carries it out under its own ServiceAccount, so compromising this platform yields a queue of proposals your own RBAC still has to permit. The exceptions are ones you add: a bastion host or a monitored VM is reached over SSH with the key you give it.
packages/core/src/actions/
Enforced bya guard at module load
Collection is read-only, and the platform refuses to start otherwise
A write verb anywhere in the collection catalogue throws in the platform before its first request is served — the catalogue that renders the ClusterRole you apply. Changes are a separate, opt-in catalogue whose rules reach the ClusterRole you apply only for the operations you enable — and the same catalogues render the table the console shows you, so the grant and the description cannot disagree.
agents/permissions.ts — assertReadOnly()
Enforced byan absent grant
Secrets are never listed, and that is permanent
Kubernetes has no metadata-only list verb for secrets, so listing them would hand a token inside your cluster the ability to read every credential in it. The Secrets page is derived from what references a secret instead — names and where they are used, never contents.
agents/permissions.ts
Enforced bythe query layer
A query that forgets its tenant throws instead of running
Tenant-scoped reads inspect their own SQL and refuse to execute unless the text constrains the tenant. Forgetting the predicate is an error at the call site, not a leak discovered later.
packages/db — TenantScopeError
Enforced bymount order
An ingestion key is never a human session
The ingest routes are mounted ahead of the session middleware, so a cookie arriving on an ingestion request is never resolved into a principal. Agent keys carry ingestion-only scopes the database constrains, plus two switches that are off unless you turn them on: container exec, and carrying out approved changes.
services/api/src/index.ts
Enforced bysealed at rest
Stored credentials are sealed, and reads never return them
Hypervisor accounts, model provider keys and Git tokens are sealed with AES-256-GCM and decrypted only where they are used; reads return a hint and a fingerprint. One deliberate exception: a backup destination's access key is written into the storage-location file you download to apply to your cluster. A build credential is destroyed when the build reaches a terminal state.
packages/core/src/crypto.ts
Enforced bya CHECK constraint
An automatic destructive change is unstorable
Auto-execution requires the low risk tier, and the tier is computed from the verb and the scope rather than taken from whatever proposed the change. For delete, exec and rollback the database refuses an automatic policy outright, so that rule survives a bug in the layer above it; for every other verb the policy code enforces it.
migration 005 — ai_auto_requires_low_risk
Enforced bya static gate
Model-written Ansible is judged before a person is asked to approve it
An allowlist of modules, no shell, raw or script, file lookups only, egress limited to addresses the request itself creates, and no_log required on any task that interpolates a secret. It ends in a real syntax check over a temporary directory rather than a guess about strings, and a refused bundle is never stored — so there is nothing to approve by mistake.
provisioning/gate.ts