values.yaml that maps to the operator’s command-line flags and Kubernetes resource configuration.
Default values
Value reference
Image
Replicas and scheduling
Removed: the validating webhook
Chart 0.12.0 removed the Deployment validating admission webhook, itswebhook.enabled, webhook.mode and webhook.port values, its Service, and its ValidatingWebhookConfiguration. It never produced a warning or a denial in any release, so removing it changes no admission behaviour on your cluster.
Persona validation itself is unaffected: the controller still validates every Deployment against its persona and records the result on the persona’s status. See validation.
Self-healing
Rendered as
--enable-health-check=<value> on the operator container either way, so the setting is always visible in the pod spec:
healthCheck.enabled is false, the operator still validates personas, records their health, and discovers the cluster, and from chart 0.12.0 it never opens an incident or proposes a fix. Chart 0.11.x and older did not fully honour this: an older code path still opened OOMKilled incidents and wrote RemediationAction proposals with detection off, without the guardrails the health-check path applies. Setting metricsServer.enabled=false passes --enable-metrics-server=false; OOM and crash-loop detection read pod status and are unaffected, but usage and saturation signals go dark. See Self-healing.
Remediation safety
Dorgu never proposes a remediation for a persona in a protected namespace. Three sources make up the list:
kube-system, always.- The namespace the operator runs in, always. The chart sets
POD_NAMESPACEon the operator container from the downward API, so with the documented install that isdorgu-system, and with any other--namespaceit is that one. - Anything you add, through
safety.excludedNamespaceshere or throughspec.policies.selfHealing.excludeNamespaceson the ClusterPersona. Both are honoured.
Fixed in operator v0.12.0. Older releases protected a hardcoded
dorgu-operator-system, the kustomize default, rather than the namespace the chart actually installs into. With the documented --namespace dorgu-system install, Dorgu’s own namespace was not protected at all. Upgrade if you run 0.11.x.Event pipeline and DorguEvent retention
The two
dorguEvents.* values apply only when eventPipeline.enabled=true, and the chart renders their flags only then. With the pipeline off no watcher or cleaner starts, no DorguEvent is written, and existing records are not pruned. Delete them with kubectl delete dorguevents -A --all. The Kubernetes Events on incidents, which kubectl describe shows, are separate and always on.
DorguEvent records are Dorgu’s own log of what it saw, readable with kubectl get dorguevent -A. They live in etcd, so they are bounded twice over: by age, and by count.
The count bound is the one that holds on a large cluster. Records arrive in proportion to cluster size, so a time window alone bounds nothing: a five-app clean-room cluster produced 187 records in 100 minutes, roughly 2,700 a day, every one of them inside the 24-hour window and all of them in etcd. The cleaner runs every 30 minutes, deletes oldest-first, and runs one pass at startup rather than waiting a full interval, because a restarted operator inherits the largest backlog it will ever see.
With the pipeline on, both flags are rendered on the operator container, so the pod spec states what bounds the record count, maxRecords: 0 included:
New in operator v0.10.0. Before it, the cleaner had no
delete permission on dorguevents.dorgu.io at all: it ran every cycle, failed, and removed nothing. The ClusterRole now grants delete on Dorgu’s own CRD and on no workload kind. See why that verb is there.AI
Both AI values default off, so a chart installed with no
--set flags makes no API calls and spends nothing. Rules run either way.
The key is always delivered to the pod as an environment variable via secretKeyRef (ANTHROPIC_API_KEY for claude, GEMINI_API_KEY for gemini), and the chart never passes it as a container argument. llm.existingSecretKey defaults to the matching name, and any llm.provider other than claude or gemini fails the install.
See AI setup for the full walkthrough and the caveat about llm.apiKey being visible in helm get values.
Bootstrap
Set
autoCreateClusterPersona: false if you manage ClusterPersonas through GitOps and do not want the operator creating one.
Validation
Metrics and probes
With
metrics.enabled=true the chart creates a <release>-metrics Service on the metrics port and a <release>-metrics-reader ClusterRole. With metrics.secure=true every scrape is authenticated and authorized, so bind the reader role to whatever scrapes the operator:
create on tokenreviews and subjectaccessreviews to check those scrapes, and the chart grants both only while metrics.secure=true. The operator exports gate decisions, apply tickets, heal credit, stage durations, incident counters and model usage. Every family is listed in the metrics reference.
ArgoCD
The watcher auto-detects whether the ArgoCD CRD exists. If
enabled: true but the CRD is absent, the watcher silently skips.
Prometheus
Example:
http://prometheus-server.monitoring:9090
Removed: the WebSocket server
Chart 0.13.0 removed the operator’s WebSocket server and itswebsocket.enabled, websocket.port, websocket.service.type and websocket.service.port values, the <release>-websocket Service and the container’s websocket port. The server was unauthenticated and nothing used it. A values file that still sets websocket.* installs unchanged, because Helm ignores unknown keys. See the upgrade guide.
Resources
Service account
Example: the recommended default
Nothing to set. Detection, rule-based diagnosis, and rule-based remediation are all on, and no key is involved:Example: opting in to AI
Create the Secret out of band, then:Example: Production deployment
Configuration overview
Feature matrix and CLI flags
AI setup
Key handling, verification, and turning AI off
Self-healing
What the health-check reconciler does once enabled
Installation
Install the operator with these values