Enterprise Controls & Managed Settings
Manage Droid defaults and hard policy controls for models, tools, safety, network access, retention, and telemetry.
Factory's enterprise story is built on a single, predictable settings hierarchy. Orgs express hard policy controls and shared defaults in managed settings, then let projects and users customize only where the policy allows it.
Enterprise Controls govern models, tools, safety policies, network restrictions, retention, plugin marketplaces, service accounts, and feature defaults across laptops, CI, VMs, and airgapped environments.
This page is the org-admin reference for the settings hierarchy, the precedence rules that decide who wins, the merge semantics for each data type, and the authoritative org-managed settings schema. For personal preferences a user manages in the Factory App, see App settings. For the CLI settings.json reference, see Settings. For per-feature how-tos, see Custom Models (BYOK), MCP, Sandbox, Hooks, Plugins, and Autonomy Levels.
The settings levels
Settings are authored in .factory/ folders, using the same schema at every level. What changes between levels is precedence.
| Level | Where it lives | Who owns it |
|---|---|---|
| Org | Managed-settings endpoint, an org .factory/ bundle, or a system-managed settings.json | Org administrators |
| Folder | <git-root>/.../<subfolder>/.factory/ | Repo maintainers (monorepo subtrees) |
| Project | <git-root>/.factory/ | Repo maintainers |
| User | ~/.factory/ | Individual developers |
Each .factory/ folder can contain:
settings.json: general settings (models, safety, preferences, telemetry).hooks.json: hook definitions.mcp.json: MCP server configurations.droids/,commands/,skills/: droid, command, and skill definitions.
At resolution time the four authored levels are placed into a longer build order that also includes a command-line overlay, remote dynamic config, and hardcoded defaults. The full order, highest priority first, is:
| Priority | Level | Source |
|---|---|---|
| 1 | Org (and org plugins) | Remote managed settings or system-managed settings.json |
| 2 | Runtime | The --settings overlay passed on the command line |
| 3 | Folder | Nested .factory/ directories in a monorepo subtree |
| 4 | Project | <git-root>/.factory/ |
| 5 | User | ~/.factory/ |
| 6 | Dynamic | Remote dynamic config |
| 7 | BuiltIn | Hardcoded Droid defaults |
For hard controls, the highest level present wins, so Org is authoritative: lower levels can extend a policy where the schema allows accumulation, but they can never weaken or remove it. For session defaults, the order inverts and the most-local level wins. The next section explains why.
How precedence works: hard controls vs session defaults
This is the single most important distinction on this page. Managed settings resolve through two precedence systems at once, and they run in opposite directions. For the user-facing perspective on how personal preferences interact with these controls, see App settings.
| Hard controls | Session defaults | |
|---|---|---|
| Who wins | Highest level present. Org (priority 1) is authoritative. | Most-local level. Runtime > Folder > Project > User > Org > Dynamic > BuiltIn. |
| What lower levels can do | Extend where the schema allows accumulation (union arrays, add new locked keys); never weaken, remove, or re-enable. | Override the value chosen by a less-local level, but only within the ceilings set by hard controls. |
| Fields | modelPolicy, mcpPolicy, commandBlocklist (and allow/deny lists), sandbox, managed hooks, strictKnownMarketplaces, subagentModelSettings, plus scalars like maxAutonomyLevel, subagentAutonomyLevel, cloudSessionSync, wikiCloudSync, voiceDictationEnabled, sessionRetentionDays. | The keys inside sessionDefaultSettings: model, reasoningEffort, interactionMode, autonomyLevel, autonomyMode, specModeModel, specModeReasoningEffort, runInWorktree. |
Session defaults rank levels so that lower (more-local) wins: Runtime is most authoritative, then Folder, Project, and User, with Org, Dynamic, and BuiltIn acting as fallbacks. So a user who sets a preferred model overrides the org's default model, and a --settings runtime overlay overrides even the user. These choices are still capped by hard controls: the org modelPolicy allowlist decides which models exist at all, and maxAutonomyLevel caps the effective autonomyLevel no matter who set it.
In short: orgs decide the boundaries (hard controls, top-down), and users pick their preferred defaults inside those boundaries (session defaults, bottom-up).
Merge semantics
Within each precedence system, the actual merge depends on the data type. Factory uses three merge modes so hard policy controls stay intact while defaults can still adapt to local context.
| Merge mode | How it works | Examples | Best for |
|---|---|---|---|
| Simple values, first wins | For scalar hard-control values (strings, numbers, booleans), the first level that sets the value wins. Lower levels cannot change or remove it. | maxAutonomyLevel, cloudSessionSync, wikiCloudSync, voiceDictationEnabled, sessionRetentionDays | Organization-wide ceilings, feature gates, and retention decisions. |
| Arrays, union | Array fields accumulate across levels. Org entries are always present; project, folder, and user levels can add more without removing or weakening higher-level entries. | Command allow lists and deny lists, enabled hooks | Policies like always-denied commands or always-enabled hooks that teams may still extend. |
| Objects, locked keys | Keys defined at a higher level are locked. Lower levels can add new keys but cannot modify or delete existing ones. | Org-defined customModels, MCP server definitions | Centralized control over critical configuration, with room for project or user additions. |
For example, if the org defines claude-enterprise in customModels, projects can add payments-gpt and users can add personal-experimental, but neither can change or remove claude-enterprise.
The scalar keys inside sessionDefaultSettings are the exception to "first wins": the most-local level wins, not the first. See How precedence works.
System-managed settings file
For deployments where org policy must be applied before any user signs in, including managed laptops, CI runners that aren't authenticated to Factory, airgapped installs, or restricted-network installs, IT/MDM administrators can drop a settings.json at a hardcoded, well-known path on each machine:
| OS | Path |
|---|---|
| macOS | /Library/Application Support/Factory/settings.json |
| Linux & WSL | /etc/factory/settings.json |
| Windows | C:\Program Files\Factory\settings.json |
The file uses the same org-managed settings schema as the rest of this page.
When this file is present it is the authoritative source for org-level settings on that machine. It short-circuits any API fetch or developer-mode environment overrides for org settings. The factoryTier signal is still queried from the Factory API on a best-effort basis (failures are non-fatal) so enterprise-gated behaviors keep working for managed deployments.
If the file is absent or unreadable, Droid falls back to the existing org-settings flow (Factory App / managed-settings endpoint). If the file is present but malformed or fails schema validation, org settings resolve to an empty policy and the failure is logged. A broken admin deployment is not silently bypassed.
This is the recommended way to ship base policy with an MDM image or installer; users cannot override or weaken it.
Org-managed settings schema
Below is the full schema for org-managed settings. These are configured by org admins through the Enterprise Controls in the Factory App. Every property is optional; omit any field you do not need to set.
Session defaults
sessionDefaultSettingsobjectDefault session preferences the org ships to all members. Every key here is a session default: the most-local level wins, capped by hard controls. Users can override these with their own preferences (see App settings); the values here act as the org-wide fallback.
Properties
modelstringDefault model identifier. See Models for the available IDs.
reasoningEffortstringHow much thinking the model does before responding. One of none, dynamic, off, minimal, low, medium, high, xhigh, max.
interactionModestringDroid interaction mode. One of auto, spec, agi.
autonomyLevelstringDefault autonomy level for the session. One of off, low, medium, high. Capped by maxAutonomyLevel.
runInWorktreebooleanWhen true, new sessions started against a git repo run in an isolated worktree.
specModeModelstringModel to use when spec mode is active. See Models.
specModeReasoningEffortstringReasoning effort override for spec mode. Same values as reasoningEffort.
autonomyModestringDeprecated. Use interactionMode and autonomyLevel instead.
Autonomy, safety, and commands
maxAutonomyLevelstringMaximum autonomy level any user or project can set. One of off, low, medium, high. A hard ceiling that caps the autonomyLevel session default.
builtInToolAutonomyOverridesobjectPer-tool autonomy level required to run a built-in network tool without a confirmation prompt. Map of built-in tool name to low, medium, or high. A tool auto-runs only when the session's Autonomy Level is at or above its configured requirement; otherwise Droid asks for approval. Tools without an entry default to low. Enforced from org-managed settings only, so user and project settings cannot weaken it. Configured under Built-in Tool Autonomy in Enterprise Controls.
WebSearchstringAutonomy level required to run the built-in Web Search tool. One of low, medium, high. Defaults to low.
FetchUrlstringAutonomy level required to run the built-in Fetch URL tool. One of low, medium, high. Defaults to low.
subagentAutonomyLevelstringAutonomy level applied to subagents spawned by the Task tool. One of inherit, off, low, medium, high; defaults to inherit, which falls back to the parent session's autonomy level. An explicit level is clamped to maxAutonomyLevel so it can never exceed the enterprise cap.
subagentModelSettingsobjectComplexity-to-model routing for subagents. Applies when a subagent's droid uses model: inherit and the parent passes a complexity tier.
lightModelstringModel used for light complexity tasks. A model identifier, or omit to inherit the spawning session's model.
lightReasoningEffortstringReasoning effort for the light tier. Same values as reasoningEffort.
mediumModelstringModel used for medium complexity tasks. A model identifier, or omit to inherit the spawning session's model.
mediumReasoningEffortstringReasoning effort for the medium tier. Same values as reasoningEffort.
heavyModelstringModel used for heavy complexity tasks. A model identifier, or omit to inherit the spawning session's model.
heavyReasoningEffortstringReasoning effort for the heavy tier. Same values as reasoningEffort.
enableDroidShieldbooleanEnable Droid Shield safety checks.
commandAllowliststring[]Shell command patterns that are always allowed (accumulated across levels).
commandDenyliststring[]Shell command patterns that always require confirmation (accumulated across levels). A denylisted command can still run if the user explicitly approves it; use commandBlocklist for a hard block.
commandBlockliststring[]Shell command patterns that can never run (accumulated across levels). Unlike the denylist, blocked commands have no approval path and cannot be bypassed with a wrapper shell, absolute path, or quoting tricks. For the full matching and bypass-resistance behavior, see Agent Safety & Controls.
allowManagedHooksOnlybooleanWhen true, only org-managed hooks and hooks from org-enabled plugins are loaded; hooks defined at the user and project levels are dropped. Defaults to false, where hooks from every level participate. See Org-managed hooks.
hooksobjectOrg-managed hook definitions, keyed by hook event. Org-defined hooks are always loaded and cannot be removed by lower levels. For event semantics and authoring, see Hooks.
Properties
EventNameobject[]One key per hook event: PreToolUse, PostToolUse, Notification, UserPromptSubmit, Stop, SubagentStop, PreCompact, SessionStart, SessionEnd. Each value is an array of matcher groups. Unknown event keys are tolerated but warned about at load time.
Matcher group properties
matcherstringTool name pattern to match (only applies to PreToolUse and PostToolUse).
commandRegexstringOptional regular expression matched against the command.
hooksobject[]requiredCommands to run when the matcher matches.
Hook command properties
typestringrequiredMust be "command".
commandstringrequiredShell command to execute.
timeoutnumberPer-command timeout in seconds.
hooksDisabledbooleanDisable all hooks for the session.
showHookOutputbooleanShow hook output in the session view.
sandboxobjectBuilt-in sandboxing for command execution and file access. For sandbox behavior and modes, see Sandbox.
Properties
enabledbooleanWhether sandboxing is enabled.
modestringSandbox scope. One of per-command or whole-process.
filesystemobjectFilesystem access lists: allowRead, allowWrite, denyRead, denyWrite (each a string array of paths).
networkobjectNetwork access: allowedDomains, allowUnixSockets, allowAllUnixSockets, allowLocalBinding, and httpProxyPort / socksProxyPort for proxying egress.
Models and BYOK
For BYOK and gateway setup, see Custom Models (BYOK).
customModelsobject[]Org-provisioned custom model definitions.
Properties
modelstringrequiredModel name sent to the provider API.
idstringrequiredUnique identifier for this custom model entry. Must start with custom: (e.g. custom:my-internal-model-v1).
indexintegerrequiredDisplay order index.
baseUrlstringrequiredBase URL of the model API endpoint.
apiKeystringrequiredAPI key for authenticating with the provider.
providerstringrequiredProvider type. One of anthropic, openai, generic-chat-completion-api, factory, google, xai, voyage.
displayNamestringrequiredHuman-readable name shown in the model picker.
maxContextLimitintegerMaximum context window size in tokens.
enableThinkingbooleanEnable extended thinking / chain-of-thought.
thinkingMaxTokensintegerMaximum tokens for the thinking phase.
maxOutputTokensintegerMaximum output tokens.
extraHeadersobjectAdditional HTTP headers to send with each request. Map of header name to value.
extraArgsobjectAdditional provider-specific arguments passed to the API.
noImageSupportbooleanrequiredSet to true if the model does not support image inputs.
modelPolicyobjectOrg-level model access control. Allowlists use higher-wins (a higher level's allowlist is the ceiling); blockedModelIds is a union across levels.
Properties
allowedModelIdsstring[]Model IDs that are explicitly allowed. See Models for the available IDs.
blockedModelIdsstring[]Model IDs that are explicitly blocked. Combined across levels: once blocked at any level, always blocked.
allowCustomModelsbooleanWhether users may add their own custom models (user BYOK). Set to false to disable user-supplied keys entirely.
allowedBaseUrlsstring[]Base URLs that custom models are allowed to connect to. Use this to force all custom-model traffic through an approved LLM gateway.
allowAllFactoryModelsbooleanAllow all Factory-hosted models regardless of the allow/block lists.
isFastModelsAllowedbooleanWhether fast model variants may be used.
requireExplicitOptInModelIdsstring[]Model IDs that require an explicit org opt-in before they can be used.
allowFactoryRouterByokbooleanWhether the Factory Router may be used with bring-your-own-key credentials.
userModelPoliciesobjectPer-user model overrides. Map of user ID to policy object.
Properties
allowedModelIdsstring[]Model IDs this user is allowed to use.
blockedModelIdsstring[]Model IDs this user is blocked from using.
MCP
MCP access is allowlist-only. For server configuration, see MCP.
mcpPolicyobjectOrg-level MCP server access control.
Properties
enabledbooleanWhether the MCP allowlist is enforced. Defaults to false.
allowliststring[]MCP servers that are permitted. When enforcement is enabled, any server not on the allowlist is ignored, even if a project or user configures it. There is no MCP blocklist; access is allowlist-only.
mcpAutonomyOverridesobjectPer-server autonomy overrides. Map of MCP server name to an object with an optional defaultLevel (low, medium, high) and an optional tools map of tool name to level.
mcpAutonomyUrlOverridesobject[]Autonomy overrides matched by URL. Each entry has a urlPattern and a defaultLevel (low, medium, high).
Plugins and marketplaces
For setup and rollout, see Internal Plugin Marketplaces and Plugins.
enabledPluginsobjectMap of plugin name in plugin@marketplace format to true (enabled) or false (disabled). Plugins set to true are automatically installed on CLI startup once their marketplace is available.
extraKnownMarketplacesobjectAdditional plugin marketplaces. Map of marketplace name to a source object. Marketplaces listed here are automatically cloned and registered on CLI startup.
Properties
sourceobjectrequiredMarketplace source, one of the following shapes, discriminated by the source field:
GitHub source
sourcestringrequiredMust be "github".
repostringrequiredGitHub repository in owner/repo format.
refstringOptional Git branch or tag to track (e.g. "main", "v1.2.0").
shastringOptional full 40-character commit SHA. When set, the marketplace is pinned to this exact commit.
URL source
sourcestringrequiredMust be "url".
urlstringrequiredGit repository URL of the marketplace (e.g. https://gitlab.com/company/plugins.git).
refstringOptional Git branch or tag to track.
shastringOptional full 40-character commit SHA to pin to.
Local source
sourcestringrequiredMust be "local".
pathstringrequiredLocal filesystem path to the marketplace.
Git subdirectory source
sourcestringrequiredMust be "git-subdir".
urlstringrequiredGit repository URL hosting the marketplace.
pathstringrequiredSubdirectory within the repository that contains the marketplace manifest.
refstringOptional Git branch or tag to track.
shastringOptional full 40-character commit SHA to pin to.
strictKnownMarketplacesobject[]Marketplace sources that are strictly enforced. A higher-level list is the ceiling and is not broadened by lower levels. Each entry is a source object directly (e.g. { "source": "github", "repo": "owner/repo" }), not wrapped in a source key like extraKnownMarketplaces values.
Network, sync, and retention
networkPolicyobjectIP restrictions for authenticated Factory web, CLI, and API requests.
Properties
allowedIpsstring[]requiredIPv4 addresses or CIDR ranges that may access Factory web, CLI, and API key surfaces. Must contain at least one entry when set.
cloudSessionSyncbooleanWhether sessions are synced to the cloud.
wikiCloudSyncbooleanWhether AutoWiki content can be stored in the Factory App and synced to GitHub wikis. Enabled by default; when disabled, all AutoWiki API endpoints are blocked and the CLI skips Cloud Sync and GitHub wiki sync. See AutoWiki.
sessionRetentionDaysintegerNumber of days cloud sessions are retained. Between 14 and 365.
Feature controls
voiceDictationEnabledbooleanWhether voice dictation is available as an input method to members of the organization.
Droid Computers
managedComputersEnabledbooleanWhether Factory-managed Droid Computers are enabled for the organization.
managedComputersAllowedEmailsstring[]Emails permitted to use managed Droid Computers.
byomComputersEnabledbooleanWhether bring-your-own-machine Droid Computers are enabled.
byomComputersAllowedEmailsstring[]Emails permitted to use bring-your-own-machine computers.
Missions
missionPolicyobjectOrg-level access control for missions.
Properties
restrictedAccessbooleanWhether mission access is restricted. Defaults to false.
allowedUserIdsstring[]User IDs allowed to use missions when access is restricted.
Org administration
includeCoAuthoredByDroidbooleanInclude a Co-authored-by: Droid trailer in git commits.
ideAutoConnectbooleanAutomatically connect to the IDE on session start.
disableAutoUpdatebooleanDisable automatic CLI updates (useful for managed or pinned deployments).
restrictMemberVisibilitybooleanRestrict whether members can see other members of the organization.
restrictApiKeyCreationToManagersbooleanWhen true, only Owners and Managers can create API keys.
advancedAnalyticsEnabledbooleanWhether advanced analytics are enabled for the organization.
disableWeeklyUsageSummarybooleanControls the weekly email to organization Managers and Owners that lists users and active service accounts at or above 80% of their monthly credit cap. The summary is sent when this setting is omitted or false; set it to true to stop the summary.
factoryRouterGuidancestringFree-text guidance for the Factory Router.
factoryRouterRulesobject[]Routing rules for the Factory Router. Each rule has an optional when condition and a guidance string.
Supported model IDs
The identifiers used in allowedModelIds, blockedModelIds, and requireExplicitOptInModelIds are the model IDs listed on Models, which is the single source of truth for available models across providers. Unrecognized IDs are silently dropped rather than failing validation, so policies stay valid across model updates.
Level responsibilities
The same schema applies at every level; the typical division of labor is:
- Org publishes the authoritative policy: allowed models and gateways, BYOK rules, global command allow/deny/block lists, org-standard droids, commands, hooks, and plugin marketplaces, plus retention, cloud sync, network policy, and feature gates. This bundle is distributed to every environment Droid runs in.
- Project and folder
.factory/directories (checked into version control) specialize org policy for a codebase: project-specific droids and gateways within the allowed set, hooks that know the repo's tests and deploys, and tighter controls for high-risk repositories. Folder-level directories handle monorepos where subsystems differ. - User
~/.factory/holds personal session defaults where the active policy allows it: a preferred model from the allowed set, preferred reasoning effort, interaction mode, and autonomy level. See App settings for the personal preferences surface.
Because hard controls remain authoritative, users cannot re-enable disallowed models or tools, loosen command lists, or raise autonomy above an enforced ceiling.
Example: enforcing a model policy
Suppose your org wants to allow only approved enterprise models, disallow user-supplied API keys, and force all prompts through a particular LLM gateway. You would:
- 1Define the allowed models and gateway endpoints in
modelPolicyandcustomModels. - 2Set
modelPolicy.allowCustomModelstofalseto disable user BYOK entirely. - 3Use
modelPolicy.allowedBaseUrlsto require approved gateway endpoints for custom models.
Projects and users can still choose which of the approved models to use, but cannot break these guarantees.
Example: environment-specific autonomy
Consider an org that wants high autonomy in CI and sandboxed containers but limited autonomy on developer laptops. You could:
- 1At org level, set
maxAutonomyLeveltohigh. - 2In project settings, define environment-aware hooks that inspect environment tags (for example
environment.type=local|ci|sandbox) and downgrade or block autonomy abovemediumon laptops. - 3Optionally, define stricter folder-level policies for particularly sensitive repos.
Users can only choose safer personal defaults within the allowed space.
Example: full org-managed settings
{
"sessionDefaultSettings": {
"model": "<model-id-from-/models>",
"reasoningEffort": "high",
"interactionMode": "auto",
"autonomyLevel": "medium",
"specModeModel": "<model-id-from-/models>",
"specModeReasoningEffort": "medium",
"runInWorktree": false
},
"maxAutonomyLevel": "high",
"builtInToolAutonomyOverrides": {
"WebSearch": "high",
"FetchUrl": "medium"
},
"subagentAutonomyLevel": "medium",
"cloudSessionSync": true,
"voiceDictationEnabled": true,
"includeCoAuthoredByDroid": true,
"enableDroidShield": true,
"ideAutoConnect": true,
"commandAllowlist": ["npm *", "yarn *", "pnpm *", "make *"],
"commandDenylist": ["rm -rf /", "sudo *"],
"commandBlocklist": ["shutdown", "mkfs", "curl"],
"allowManagedHooksOnly": true,
"hooks": {
"PreToolUse": [
{
"matcher": "Execute",
"hooks": [
{
"type": "command",
"command": "\"$FACTORY_PROJECT_DIR\"/.factory/hooks/audit-command.sh",
"timeout": 30
}
]
}
]
},
"customModels": [
{
"model": "my-internal-model",
"id": "custom:my-internal-model-v1",
"index": 0,
"baseUrl": "https://llm-gateway.internal.example.com/v1",
"apiKey": "${INTERNAL_MODEL_API_KEY}",
"provider": "generic-chat-completion-api",
"displayName": "Internal Model v1",
"maxContextLimit": 128000,
"enableThinking": true,
"thinkingMaxTokens": 8192,
"maxOutputTokens": 16384,
"extraHeaders": {
"X-Team": "platform"
},
"extraArgs": {},
"noImageSupport": false
}
],
"modelPolicy": {
"allowedModelIds": ["<model-id-from-/models>"],
"blockedModelIds": [],
"allowCustomModels": false,
"allowedBaseUrls": ["https://llm-gateway.internal.example.com/v1"],
"allowAllFactoryModels": false
},
"mcpPolicy": {
"enabled": true,
"allowlist": ["internal-docs", "ticketing"]
},
"networkPolicy": {
"allowedIps": ["10.0.0.0/8", "192.0.2.0/24"]
},
"sandbox": {
"enabled": true,
"mode": "per-command",
"filesystem": {
"denyRead": ["~/.ssh", "~/.aws"],
"denyWrite": ["/etc"]
},
"network": {
"allowedDomains": ["api.github.com", "registry.npmjs.org"]
}
},
"restrictApiKeyCreationToManagers": true,
"sessionRetentionDays": 90,
"advancedAnalyticsEnabled": true,
"disableWeeklyUsageSummary": false,
"userModelPolicies": {
"user-abc-123": {
"allowedModelIds": ["<model-id-from-/models>"],
"blockedModelIds": []
}
},
"enabledPlugins": {
"my-org-plugin@internal-marketplace": true,
"experimental-plugin@internal-marketplace": false
},
"extraKnownMarketplaces": {
"internal-marketplace": {
"source": {
"source": "github",
"repo": "my-org/factory-plugins"
}
}
},
"strictKnownMarketplaces": [
{
"source": "github",
"repo": "my-org/factory-plugins"
}
]
}Models, gateways, MCP, and tooling
The hierarchy governs which models and external systems Droid can reach. The org-level controls are the schema fields above; each area also has a dedicated page:
- Models and BYOK:
modelPolicy(allowedModelIds,blockedModelIds,allowCustomModels,allowedBaseUrls) andcustomModels. See Models for IDs and Custom Models (BYOK) for gateway and provider setup, including cloud platforms (Bedrock, Vertex, Azure OpenAI) and self-hosted endpoints. - MCP servers:
mcpPolicy(allowlist-only), plusmcpAutonomyOverridesandmcpAutonomyUrlOverridesfor per-server or per-URL autonomy. See MCP. - Droids, commands, and hooks: published in the org
.factorybundle; setallowManagedHooksOnlytotrueto ignore project- and user-defined hooks. See Hooks and Agent Safety & Controls.
Putting it all together
Enterprise Controls underpin everything described in the other enterprise pages:
- Identity & Access: who can change which level of settings.
- Data Flows & Privacy: where data and telemetry are allowed to go.
- Deployment Patterns: which environments Droid can run in and how it connects.
- Agent Safety & Controls: policies for commands, tools, and Droid Shield.
- Compliance & Audit: guarantees and telemetry used to prove compliance.
By expressing policy once at the right level, you can run Droid across cloud, hybrid, and airgapped environments without per-machine drift or one-off configuration.