Target and assistant settings
The platform chart keeps target connectivity, assistant behavior, and target-specific installation settings separate:
There is intentionally no generic
agent section and no AgentV Helm section. Each name identifies one responsibility and one target scope.
Production must set targetAgents.agentv.systemd.version to an exact semantic version and releaseBaseUrl to HTTPS. The public default is https://github.com/acornops/agentv/releases/download. An internal mirror must expose the identical v<version>/install-agentv.sh, archive, and checksum layout; mutable labels such as latest are rejected.
Public hosts
Replace
example.com with domains you control. The public demo uses https://console.demo.acornops.dev and https://api.demo.acornops.dev. The platform route and the management console route are separate, but both default deployment paths proxy /api to the control plane. The management console uses its own origin for browser session flows so cookies stay same-origin.
For Kubernetes, configure these with platform.publicUrl, platform.consoleUrl, exposure.ingress.apiHost, and exposure.ingress.consoleHost. For VM Compose, configure CONTROL_PLANE_BASE_URL, API_HOST, MANAGEMENT_CONSOLE_HOST, MANAGEMENT_CONSOLE_UPSTREAM, and CORS_ORIGIN. Keep TRUST_PROXY=1 when TLS and host headers are handled by the edge proxy.
Required secret keys
The Kubernetes chart defaults to an existing Secret namedacornops-platform-secrets. These keys are required for the central platform:
Optional secret-backend keys include:
Generate unique values for every internal token and encryption key per environment.
Provider credentials
Provider API keys are not configured throughOPENAI_API_KEY, ANTHROPIC_API_KEY, or GEMINI_API_KEY deployment variables. Configure them as write-only credentials:
- per workspace in Workspace Settings → AI, or
- as an optional platform default in Platform Settings → AI in the platform admin console.
workspace, platform_default, or none); they never return credential plaintext.
Provider routing and API surfaces
Platform operators can route provider traffic through API-compatible endpoints without changing workspace credentials:
An empty value uses the provider SDK’s vendor endpoint. Provider SDK-specific environment variables are not part of the AcornOps configuration contract.
OpenAI uses the Responses API by default. Select an API-compatible Chat Completions endpoint explicitly with:
components.llmGateway.openaiApiSurface=chat_completionson Kubernetes, orLLM_PROVIDER_OPENAI_API_SURFACE=chat_completionswith VM Compose.
responses to roll back.
Git skill import hosts
Users import a skill by pasting one repository, folder, orSKILL.md URL.
Configure the accepted GitHub and GitLab hosts with gitImports.hosts. The
chart enables GitHub.com and GitLab.com by default. Setting this array replaces
those defaults, so include every host that users should access.
networkPolicies.extraEgress.controlPlane using its stable IP or CIDR and HTTPS
port. Add organization CA trust when the host does not use a public certificate
chain.
Automation runtime
See Automation runtime for rollout order and operational diagnostics.
EXTERNAL_INTEGRATION_CLIENTS_JSON stores descriptors such as client id,
provider, display name, enabled flag, lowercase SHA-256 token hash, and optional
allowedCapabilities. Generate raw bearer tokens out of band and store only
their hashes in this Secret value. Raw external integration client tokens do not
authorize general control-plane API calls; they are accepted only by the external
integration account-link, linked-user bot, and external webhook route
connect/status endpoints.
allowedCapabilities is an operator-side ceiling for that registered client. If
you omit it, AcornOps uses the default external integration ceiling:
read_workspace_data, create_sessions, and create_read_only_runs. Users
still approve per-workspace grants when they link the external account. Add
create_read_write_runs only when the client may request write-capable
troubleshooting runs or active read-write/approval-gated Workflows; keep
read_workspace_data and create_sessions because run creation depends on
them. The same linked integration and client may decide approvals only for
troubleshooting runs or Workflow executions it originated, and only after an
explicit linked-user confirmation. Browser-created, other-link/client,
scheduled, and system-triggered approvals remain denied.
Internal transport TLS
Kubernetes platform installs default to plaintext HTTP between internal platform services. To enable internal HTTPS/mTLS, setinternalTransport.tls.enabled=true
and provide Kubernetes Secret names under internalTransport.tls.ca.secretName
and internalTransport.tls.certificates.*.secretName.
The chart accepts only Secret names and key names. It does not accept raw PEM
certificate or private key values. Public ingress stays on the control-plane HTTP
service port; the chart adds a separate internal mTLS listener for callbacks,
JWKS, and the built-in MCP bridge. Kubelet probes use dedicated health ports for
services that require mTLS for application traffic.
The built-in MCP bridge uses the same run-scoped JWT authorization as other
execution-time LLM gateway calls. There is no separate built-in MCP service
token to configure.
OIDC
The control plane owns OIDC login and callback handling:- Login entrypoint:
GET /api/v1/auth/oidc/login?return_to=<management-console-url> - Callback entrypoint:
GET /api/v1/auth/oidc/callback - Logout handoff:
GET /api/v1/auth/oidc/logout/start - Post-logout callback:
GET /api/v1/auth/oidc/logout/callback
/api proxy. If you override userAccess.oidc.redirectUri or OIDC_REDIRECT_URI, register the exact override value instead. Registering only https://api.example.com/api/v1/auth/oidc/callback will fail unless your deployment is configured to use that URL as the OIDC redirect URI.
Register this exact post-logout redirect URI when your provider supports
RP-initiated logout:
OIDC_PROVIDER_NAME is a stable persisted identity namespace, not only a
display label. Do not reuse the same value for an unrelated issuer. AcornOps
matches returning identities by that provider namespace and the verified
sub claim; it never attaches a previously unseen subject to an existing
account based only on an email collision. Such users must sign in with the
account’s existing method and explicitly connect SSO when that capability is
available.
Controlled fixtures and bootstrap deployments can explicitly prelink accounts
with OIDC_PRELINKED_IDENTITIES_JSON. Reconciliation runs atomically before
the server accepts traffic, is idempotent for the same mapping, and fails
startup if an email or provider subject is already mapped differently. It does
not weaken admission: every subsequent login is still evaluated against the
configured admission policy. Never derive this configuration from email alone;
obtain the exact sub from the provider’s administrative data.
The former OIDC_REQUIRE_VERIFIED_EMAIL setting has been removed and is
rejected at startup. Express that requirement with
requireVerifiedEmail: true in the admission policy.
Admission rules are combined with AND semantics. You can require a literal
email_verified=true, allow exact email domains, and require claims using
exists, equals, contains, or intersects. Claim paths are arrays, which
keeps nested and namespaced claims unambiguous:
Password auth
Password login is enabled by default alongside OIDC, password reset is enabled by default for password-backed accounts, and self-service signup is disabled in production deployment configs. The management console readsGET /api/v1/auth/config and shows only the enabled login methods.
Operators can:
- disable password login with
userAccess.password.enabled=falseorPASSWORD_AUTH_ENABLED=false, - disable password reset with
userAccess.password.resetEnabled=falseorPASSWORD_RESET_ENABLED=false, - allow
passwordinplatformSettings.userSignInMethods.allowedMethodsanddefaultMethods, then manage the effective sign-in methods from the audited Platform Admin settings page. Self-service signup becomes available only when the password email-verification prerequisites are also ready.
email.deliveryMode=smtp, email.from, email.publicBaseUrl, and email.smtp.* Helm values, backed by SMTP_USERNAME and SMTP_PASSWORD in the platform Secret.
Password reset defaults:
PASSWORD_RESET_TOKEN_TTL_SECONDS:3600PASSWORD_RESET_REQUEST_WINDOW_SECONDS:300
EMAIL_DELIVERY_MODE=log. Production rejects log delivery unless EMAIL_DELIVERY_ALLOW_LOG_IN_PRODUCTION=true is set explicitly.
When self-service signup is enabled, email verification is required by default. Only private deployments should disable verification with PASSWORD_SIGNUP_ALLOW_UNVERIFIED_EMAIL=true.
Development deployments may expose a dev-login endpoint. Do not enable dev-login in production.
Browser sessions
Browser sessions have both an absolute max age and a sliding idle timeout.SESSION_MAX_AGE_SECONDS defaults to 604800 and controls the absolute session lifetime. SESSION_IDLE_TIMEOUT_SECONDS defaults to 86400 and refreshes on active authenticated requests until the absolute max age is reached.
SESSION_TTL_SECONDS is still accepted as a legacy fallback for SESSION_MAX_AGE_SECONDS when the newer variable is unset. Keep SESSION_IDLE_TIMEOUT_SECONDS less than or equal to the effective max age.
LLM providers and run limits
The control plane sets default model policy and runtime budgets for runs:
The LLM gateway enforces the run-scoped JWT minted by the control plane. It should not infer provider, model, or tool permissions from request body fields alone.
Reasoning summaries are workspace opt-in and off by default for each workspace. When enabled in AI Settings, OpenAI, Anthropic, and Gemini may stream short provider-generated summaries while a response is being generated. AcornOps displays summaries only; it does not request or expose raw chain-of-thought, encrypted reasoning items, thinking signatures, or provider-internal reasoning state.
Operators can set the deployment policy ceiling with:
Summaries are saved in run event history when enabled, so users who reconnect or review a completed run see the same summary trail. Provider and model support varies, and summaries can increase provider latency or billable reasoning/output tokens.
Gateway auth readiness and limits
The LLM gateway validates run-scoped JWTs against the control plane’s JWKS endpoint. Keep JWKS readiness required in production so gateway pods do not accept runtime traffic before they have a fresh signing-key view.Write confirmations
Write-capable AgentK and AgentV tools require confirmation by default. AgentV’s only built-in write is the separately gatedrestart_service. The deployment default is controlled by:
Clusters can inherit the deployment default or set a per-cluster override. Required confirmations are enforced by the backend runtime before tool execution. Browser chat cards and bot surfaces only submit explicit approve or reject decisions.
In the management console, per-cluster write confirmation policy is managed from Cluster Settings.
Workflow and evidence retention
Workflow execution duration, generated-document retention, and complete tool-result artifact limits are deployment-wide. Workflow definitions cannot override them.
The Workflow options API returns each effective value as a singleton policy list. Legacy mutation fields remain accepted for compatibility but cannot override deployment configuration.
Audit logging lifecycle
Workspace audit logging is deployment-wide. There is no workspace-level or user-level override.
Supported modes are:
read_write: persist read and write audit events.write_only: persist only audit events classified asoperation: "write".disabled: persist no future workspace audit events.
disabled. Audit metadata remains sanitized before persistence, so raw tokens, secrets, message bodies, pod logs, auth headers, and full tool arguments are not stored.
Additional CA trust
Use an additive CA bundle when server-side components must reach OIDC, provider, webhook, MCP, registry, or other HTTPS endpoints signed by an organization-private CA. For Kubernetes, configure one namespace-local reference:secretKeyRef instead when required by your distribution policy. A component-specific reference under components.controlPlane, components.executionEngine, or components.llmGateway replaces the global bundle for that component.
For VM Compose, set ADDITIONAL_CA_BUNDLE_SOURCE_PATH to the host PEM bundle used by the trust overlay. Target connectors use their own settings described in Connect a Kubernetes cluster and Connect a Linux VM.
Additional CA trust:
- extends normal public roots,
- keeps certificate and hostname verification enabled,
- is separate from internal service mTLS,
- does not enable verified TLS for Postgres or Redis unless their URLs request it,
- does not configure container-runtime or OCI registry trust.
MCP egress policy
Remote MCP servers can be installed at workspace scope for Agent and Workflow use, or at exact target scope for one Kubernetes cluster or VM. In production, the gateway should require HTTPS and block private, local, and reserved network targets unless you intentionally allow specific hosts. Use allow-lists for trusted internal MCP endpoints instead of broad private-network access.
Remote MCP server
publicHeaders are for non-secret metadata only. Credentials belong in secret-backed auth fields, and platform scope headers are reserved.
MCP registry policy uses components.llmGateway.catalog. The Official MCP Registry is disabled by default and must be enabled explicitly. Configure internal registries through bootstrapSources, use secretKeyRef for registry credentials, and keep bootstrap routing set to direct. MCP installations select workspace-managed or individual credential ownership and require no deployment-level callback configuration. See MCP registries for complete examples and lifecycle behavior.
Webhooks
Webhook signing secrets are generated per subscription and returned only once at creation time. The control plane stores encrypted webhook secrets and signs deliveries with HMAC-SHA256. Webhook events and delivery jobs are durable in control-plane Postgres. Every control-plane replica can claim work with expiring database leases; Redis is not required for webhook delivery. Delivery remains at least once, so consumers must handle duplicates and verify signatures before processing payloads.
The effective per-origin concurrency is the lower of the global worker
concurrency and perOriginConcurrency. Claim leases account for the time a
full same-origin batch may wait behind that effective limit. The control
plane’s delivery deadline covers DNS resolution, connection setup, and the
complete response body, so a stalled resolver or streaming peer cannot retain
a delivery past its lease budget.
Webhook delivery URLs must use HTTPS. Public destinations work by default. Private-address delivery requires an explicit hostname allowlist in addition to any packet-level egress rule:
For a private Mattermost bot at
mattermost-bot.internal, configure the application-level hostname exactly:
*. entry matches subdomains, including deeper descendants, but not the bare suffix. The allowlist is additive: public destinations remain available. AcornOps still rejects HTTP, embedded credentials, IP-literal URLs, localhost, metadata services, hard-blocked reserved destinations, mixed allowed/disallowed DNS answers, and redirects. It validates DNS and pins an allowed address before connecting. There is no broad insecure-development webhook switch.