Every supported rule namespace, field by field. Part of the apus policy reference.
Policy rule reference
Every rule below is optional; a check runs only when the rule is present. The
observed state is existing Apus config or workspace metadata.
Channels
| Policy field |
Observed state |
Use when |
channels.denyRules[].when.provider |
channels.* provider and enabled state |
Deny configured channels from a provider such as telegram. |
channels.denyRules[].reason |
Finding message and repair hint context |
Explain why the provider is denied. |
MCP servers
| Policy field |
Observed state |
Use when |
mcp.servers.allow |
mcp.servers.* ids |
Require every configured MCP server to be in an allowlist. |
mcp.servers.deny |
mcp.servers.* ids |
Deny specific configured MCP server ids. |
Model providers
| Policy field |
Observed state |
Use when |
models.providers.allow |
models.providers.* ids and selected model refs |
Require configured providers and selected model refs to use approved providers. |
models.providers.deny |
models.providers.* ids and selected model refs |
Deny configured providers and selected model refs by provider id. |
Network
| Policy field |
Observed state |
Use when |
network.privateNetwork.allow |
Private-network SSRF escape hatches |
Set to false to require private-network access to stay disabled. |
Message routing
| Policy field |
Observed state |
Use when |
routing.requireBindings |
Channel route bindings, excluding ACP bindings |
Require at least one message-routing binding. |
routing.requireConfiguredChannels |
Binding channel ids and configured channels.* ids |
Detect stale or misspelled binding channel ids. |
routing.probes[].route |
The public Apus route resolver |
Describe a representative inbound route without sending a message. |
routing.probes[].expect.agentId |
Resolved agent id |
Require the route to reach the reviewed agent. |
routing.probes[].expect.matchedBy |
Resolver match kind |
Require peer, account, channel, or other reviewed binding specificity. |
Check ids must be unique. A route supports channel, optional accountId,
peer, parentPeer, guildId, teamId, and memberRoleIds. Peer kinds are
direct, group, and channel. matchedBy may contain one or more runtime
match kinds, including binding.peer, binding.account, binding.channel,
or default.
Routing checks are conformance checks only. They do not change startup,
message delivery, binding precedence, or fallback behavior. Findings require
operator review because automatically changing a binding could redirect
private messages.
Ingress and channel access
| Policy field |
Observed state |
Use when |
ingress.session.requireDmScope |
session.dmScope |
Require a reviewed direct-message isolation scope. |
ingress.channels.allowDmPolicies |
channels.*.dmPolicy and legacy channel DM policy fields |
Allow only reviewed direct-message channel policies. |
ingress.channels.denyOpenGroups |
Channel, account, and group ingress policy |
Deny open group ingress for configured channels and accounts. |
ingress.channels.requireMentionInGroups |
Channel, account, group, guild, and nested mention gate config |
Require mention gates when group ingress is open or mention-gated. |
Gateway
| Policy field |
Observed state |
Use when |
gateway.exposure.allowNonLoopbackBind |
gateway.bind |
Set to false to require loopback Gateway binding. |
gateway.exposure.allowTailscaleFunnel |
Tailscale serve/funnel Gateway posture |
Set to false to deny Tailscale Funnel exposure. |
gateway.auth.requireAuth |
gateway.auth.mode |
Set to true to reject disabled Gateway auth. |
gateway.auth.requireExplicitRateLimit |
gateway.auth.rateLimit |
Set to true to require explicit auth rate-limit config. |
gateway.controlUi.allowInsecure |
Device-identity invariant and origin fallback |
Set to false to require device identity and deny Host-header origin fallback. |
gateway.remote.allow |
Remote Gateway mode/config |
Set to false to deny remote Gateway mode. |
gateway.http.denyEndpoints |
Gateway HTTP API endpoints |
Deny endpoint ids such as chatCompletions or responses. |
gateway.http.requireUrlAllowlists |
Gateway HTTP URL-fetch inputs |
Set to true to require URL allowlists on URL-fetch inputs. |
gateway.nodes.denyCommands |
gateway.nodes.commands.deny |
Require exact node command ids such as system.run to be denied in Apus config. |
gateway.nodes.denyCommands is an exact, case-sensitive policy deny-superset rule.
Use it when policy must prove that privileged node commands are explicitly
denied by Apus config. A deployment that intentionally allows a privileged
node command should update policy.jsonc after review instead of relying on
gateway.nodes.commands.allow alone.
Agent workspace
| Policy field |
Observed state |
Use when |
agents.workspace.allowedAccess |
agents.defaults.sandbox.workspaceAccess and agents.entries.*.sandbox.workspaceAccess |
Allow only sandbox workspace access values such as none or ro. |
agents.workspace.denyTools |
Global and per-agent tool deny config |
Require mutation tools (exec, process, write, edit, apply_patch) to be denied. |
Sandbox posture
| Policy field |
Observed state |
Use when |
sandbox.requireMode |
agents.defaults.sandbox.mode and per-agent mode |
Allow only reviewed sandbox modes such as all or non-main. |
sandbox.allowBackends |
agents.defaults.sandbox.backend and per-agent backend |
Allow only reviewed sandbox backends such as docker or podman. |
sandbox.containers.denyHostNetwork |
Container-backed sandbox/browser network mode |
Deny host network mode. |
sandbox.containers.denyContainerNamespaceJoin |
Container-backed sandbox/browser network mode |
Deny joining another container network namespace. |
sandbox.containers.requireReadOnlyMounts |
Container-backed sandbox/browser mount mode |
Require mounts to be read-only. |
sandbox.containers.denyContainerRuntimeSocketMounts |
Container-backed sandbox/browser mount targets |
Deny container runtime socket mounts. |
sandbox.containers.denyUnconfinedProfiles |
Container security profile posture |
Deny unconfined container security profiles. |
sandbox.browser.requireCdpSourceRange |
Sandbox browser CDP source range |
Require browser CDP exposure to declare a source range. |
Policy treats missing sandbox.mode as its implicit default off, so
sandbox.requireMode reports a fresh or unconfigured sandbox as outside an
allowlist such as ["all"].
Data Handling
| Policy field |
Observed state |
Use when |
dataHandling.sensitiveLogging.requireRedaction |
Runtime invariant oc://apus.invariant/logging/redaction |
Set to true to record the requirement; Apus always satisfies it. |
dataHandling.telemetry.denyContentCapture |
diagnostics.otel.captureContent |
Set to true to reject telemetry content capture. |
dataHandling.retention.requireSessionMaintenance |
session.maintenance.mode |
Set to true to require effective session maintenance mode enforce. |
dataHandling.memory.denySessionTranscriptIndexing |
memory.search.experimental.sessionMemory, memory.search.rememberAcrossConversations, and per-agent overrides |
Set to true to reject session transcript indexing into memory. |
Secrets
| Policy field |
Observed state |
Use when |
secrets.requireManagedProviders |
Config SecretRefs and secrets.providers.* declarations |
Set to true to require SecretRefs to point at declared providers. |
secrets.denySources |
Secret provider sources and SecretRef sources |
Deny sources such as exec, file, or another configured source name. |
secrets.allowInsecureProviders |
Insecure secret-provider posture flags |
Set to false to reject providers that opt into insecure posture. |
Exec approvals
Exec-approvals checks read the runtime exec_approvals_config singleton row in
~/.apus/state/apus.sqlite by default, or the same database under
$APUS_STATE_DIR/state when APUS_STATE_DIR is set. Findings use the
stable oc://exec-approvals.json/... URI scheme, which addresses paths within
the authoritative JSON document stored in that row.
Posture rules under execApprovals.defaults.* or execApprovals.agents.*
require readable artifact evidence; a missing or invalid artifact reports as
unobservable evidence rather than a best-effort pass. Once readable, omitted
fields inherit runtime defaults: missing defaults.security is full, and
missing agent security inherits that default. Evidence includes defaults,
agents.*, agents.*.allowlist[].pattern, optional argPattern, effective
autoAllowSkills posture, and entry source — never socket path/token,
commandText, lastUsedCommand, resolved paths, or timestamps.
| Policy field |
Observed state |
Use when |
execApprovals.requireFile |
Active runtime exec_approvals_config row |
Set to true to require the approvals document to exist and parse. |
execApprovals.defaults.allowSecurity |
defaults.security, defaulting to full |
Allow only approved default approval security modes. |
execApprovals.agents.allowSecurity |
agents.*.security, inheriting defaults |
Allow only approved per-agent effective approval security modes. |
execApprovals.agents.allowAutoAllowSkills |
defaults.autoAllowSkills and agents.*.autoAllowSkills, inheriting runtime defaults |
Set to false to require strict manual allowlists without implicit skill CLI approval. |
execApprovals.agents.allowlist.expected |
Aggregate agents.*.allowlist[] pattern and optional argPattern entries |
Require the approvals allowlist to match the reviewed pattern set. |
Example: require the approvals artifact, deny permissive defaults, and allow
only reviewed exec approval posture for selected agents.
{
"execApprovals": {
"requireFile": true,
"defaults": {
// Security modes: "deny", "allowlist", or "full".
// This default permits only the locked-down deny posture.
"allowSecurity": ["deny"],
},
},
"scopes": {
"restricted-shell": {
"agentIds": ["family-agent", "groups-agent"],
"execApprovals": {
"agents": {
// Selected agents may use reviewed allowlist posture, but not "full".
"allowSecurity": ["allowlist"],
// false means skill CLIs must appear in the reviewed allowlist instead of
// being implicitly approved by autoAllowSkills.
"allowAutoAllowSkills": false,
"allowlist": {
"expected": [
// Simple entry: exact reviewed executable pattern with no argPattern.
"travel-hub",
// Constrained entry: pattern plus reviewed argument regex.
{ "pattern": "calendar-cli", "argPattern": "^sync\\b" },
"/bin/date",
],
},
},
},
},
},
}
Auth profiles
| Policy field |
Observed state |
Use when |
auth.profiles.requireMetadata |
auth.profiles.* provider and mode metadata |
Require metadata keys such as provider and mode on config auth profiles. |
auth.profiles.allowModes |
auth.profiles.*.mode |
Allow only supported auth profile modes such as api_key, aws-sdk, oauth, or token. |
Tool metadata
| Policy field |
Observed state |
Use when |
tools.requireMetadata |
Governed AGENTS.md tool declarations |
Require governed tools to declare metadata keys such as risk, sensitivity, or owner. |
Tool posture
| Policy field |
Observed state |
Use when |
tools.profiles.allow |
tools.profile and agents.entries.*.tools.profile |
Allow only tool profile ids such as minimal, messaging, or coding. |
tools.fs.requireWorkspaceOnly |
tools.fs.workspaceOnly and per-agent tools.fs overrides |
Set to true to require workspace-only filesystem tool posture. |
tools.exec.allowSecurity |
tools.exec.security and per-agent exec security |
Allow only exec security modes such as deny or allowlist. |
tools.exec.requireAsk |
tools.exec.ask and per-agent exec ask mode |
Require approval posture such as always. |
tools.exec.allowHosts |
tools.exec.host and per-agent exec host routing |
Allow only exec host routing modes such as sandbox. |
tools.elevated.allow |
tools.elevated.enabled and per-agent elevated posture |
Set to false to require elevated tool mode to stay disabled. |
tools.alsoAllow.expected |
tools.alsoAllow and per-agent tools.alsoAllow |
Require exact alsoAllow entries and report missing or unexpected additive tool grants. |
tools.denyTools |
tools.deny and agents.entries.*.tools.deny |
Require configured tool deny lists to include tool ids or groups such as group:runtime and group:fs. |
Tool requirements use the same group membership, aliases, and * matching as
core tool policy. For example, group:fs includes ls, group:runtime includes
secrets, cron resolves to automations, and the image-understanding tool is
view_image. A required deny list must cover every tool in a required group;
an empty list covers nothing, and denying write does not deny apply_patch.