orgList accounts / projects / subs / clusters
— none —
Trust
Giving an agent permission to change production is a trust motion. Mendhelm earns it by making the controls explicit — what each scope grants, what dry-run mode blocks, what the audit trail records — and by naming the things the agent will never touch.
Section 01 · Layered permissions
Mendhelm does not share a single assume-role across your whole account. We register one role per environment (dev / stg / prod), one per cloud (AWS / GCP / Azure / Kubernetes), and one trust boundary per service. Every action traverses that chain — so revoking a layer immediately shrinks what the agent can do, and audit logs carry the full path from the org down to the resource.
orgList accounts / projects / subs / clusters
— none —
environment (dev / stg / prod)Resource inventory, IAM policy state, drift deltas
Bound by env tag — prod writes only on explicit allow
service boundaryPods / ECS tasks / functions / VM instances
Restart, replace, scale within service namespace
resource group / namespaceK8s objects inside the namespace
Patch, restart, roll — never delete the namespace
Read vs write
Read scopes are wide-open by intent — drift detection is no good if it can't see the resource. Write scopes are narrow by design. The first thing you grant on day one is read; writes unlock per-action-class as you sign off on each one.
Section 02 · Least-privilege scoping
Onboarding hands Mendhelm the narrowest scopes that drift detection and healing still work under. We scale up only as you sign off on each new action class. These invariants run for every environment you connect.
invariant · 01Every new environment ships with read-only scopes. Write actions unlock one at a time, per action-class, after a human signs off on the dry-run shape.
invariant · 02There is no shared assume-role. Each role has a single intended purpose (drift detection, healing, patching) annotated in its name and description — so an audit trail reads as intent, not just action.
invariant · 03Scopes inherit from tags and labels, not from the IAM chain alone. Tag drift is itself drift — and gets reported, never silently relied on.
invariant · 04Service-account keys, assume-role sessions, webhook signing secrets, and K8s service-account tokens rotate on a fixed cadence. Old keys are revoked on day seven.
invariant · 05Any `iam:*`, `secretsmanager:*`, `cluster-admin`, or wildcard binding added to a scope triggers a second reviewer — the agent refuses to operate under it until a signed-off manifest lands.
Section 03 · Dry-run mode
Every write action ships as a dry-run envelope first: identical intent, identical scope, no mutation. The agent generates the diff, attaches it to an audit record, and waits for either an automatic promotion (after your N-second policy) or a human sign-off. Toggle dry-run OFF per action-class when you want direct execution — the toggle is sticky and the audit trail records every flip.
The toggle is a property of the action class, not the operator. Changing it does not require redeploying Mendhelm.
dry_run · onDiff first, record the intent, promote after policy window or human ok.
dry_run · offDirect execution. Audit trail still records prompt, scope, and outcome.
change_window · freezeHonored verbatim. Mendhelm refuses to mutate, regardless of the dry-run toggle.
Section 04 · Audit trail
Mendhelm does not own your audit trail — it streams every action to your destination (CloudTrail, GCP Audit Logs, Azure Activity, Kubernetes audit log, plus a Mendhelm activity feed) and to the digest. Rolling audit history forward is a read operation, never a write.
promptThe full agent prompt that produced the action, hashed and stored.
scopeExact principal, role, and resource ARN / namespace at action time.
intended_diffThe structured diff the agent proposed, before execution.
actual_diffThe diff that landed. Intent vs. actual surfaces honest mismatches.
dry_runBoolean: was this promoted from dry-run, executed directly, or blocked?
outcomeSuccess, partial, rolled back, promoted, escalated — with reason codes.
Who can read
The audit stream is readable by your security, your SRE leads, your auditor, and Mendhelm on-call — at read-only scopes. No one holds a write scope on the trail.
Section 05 · Concrete scopes
Two worked examples — staging on AWS, and a single namespace on Kubernetes — of the exact permissions Mendhelm asks for and the exact things it refuses to do inside that scope.
example · AWS · stgScope
iam:AssumeRole → mendhelm-stg-read / mendhelm-stg-writeMendhelm will
env:stg.Mendhelm won't
iam:DeletePolicy on any resource.aws:ResourceAccount denied).example · Kubernetes · prod/nsScope
ServiceAccount · mendhelm · namespace: checkout-prodMendhelm will
Mendhelm won't
cluster-admin, admin, or wildcard verbs.Section 06 · Contrast
The inverse of the scope is the contrast: an explicit negative list. If a thing is on this list, the agent fails closed — even if you accidentally grant a wildcard — because the policy lives at our end too, not only yours.
production secretsSecrets manager entries tagged restricted, K8s secrets with allow-listed selectors, and any secret newer than the last human-approved rotation window.
IAM policy deletioniam:DeletePolicy, iam:DetachUserPolicy, and any wildcard (*) grant require explicit human approval — Mendhelm rejects them at the scope check.
billing mutatorsNo write scope to AWS Billing, GCP Billing, Azure Cost Management, or any Stripe / vendor billing API. Reads are limited to anomaly detection.
destructive data opsNo DROP, TRUNCATE, or DELETE on databases unless a separate data-class scope is granted. Default posture is append-only on applied diffs.
support / org administrationAWS Support plans, Organizations SCP writes, Azure subscription moves, and GCP project IAM for org-level admins are out of scope by default.
auditor data deletionAudit streams are append-only at the storage layer. Mendhelm never holds a delete scope on CloudTrail, GCP Audit Logs, or Kubernetes audit log sinks.
Getting started
We take the first call personally. Walk us through your AWS / GCP / Azure / Kubernetes surface, and we'll return a minimal scope manifest you can diff against what you already run — and what the platform itself has been doing for the last 90 days.
response within 24h · no automation · founder-led scope review