Skip to content

Unit

A business unit or team in the org hierarchy (ADR-0018): delegated owners, a member selector and an overlay applied on top of the ring profile. Enforced security fields may only be tightened.

Generated from schemas/unit.schema.json; do not edit. Nested fields use dotted paths, [] marks array items and .* map values.

Field Type Required Default Allowed values Constraints Description
apiVersion string yes const halos.dev/v1 Document version.
description string What the unit is.
kind string yes const Unit Document kind.
labels object Free-form labels.
labels.* string
members object yes Selects the unit’s users from its parent’s (any listed group or user matches).
members.groups array of string IdP groups.
members.groups[] string
members.users array of string User ids.
members.users[] string
name string yes pattern ^[a-z0-9][a-zA-Z0-9._-]*$ Unique name within its kind.
overlay object Profile settings the unit changes on top of the baseline. Lists in permissions.deny, mcp.denied and hooks.items union; mcp.servers are added; other lists replace; env and telemetry.attributes merge per key.
overlay.agents object Bounds delegated agents for this profile’s members (ADR-0024). A unit overlay may only lower maxDepth and narrow remote.
overlay.agents.maxDepth integer minimum 1; maximum 5 Lowers agents.maxDepth for these members.
overlay.agents.remote array of string agents.remote names these members may call; empty = every entry whose rings or units admit them.
overlay.agents.remote[] string minLength 1
overlay.egress object Network egress for the agent’s shell and fetch tools (ADR-0032). A deny rule wins over an allow rule; unmatched hosts take the default. Rendered natively per harness; what a harness cannot hold is a release warning.
overlay.egress.allowedDomains array of string Allowlist: exact hosts or *.domain (subdomains only, not the apex). Must allow the gateway host. Replaces the parent’s list.
overlay.egress.allowedDomains[] string pattern ^(*.)?(a-z0-9?.)*a-z0-9?$
overlay.egress.default string allow, deny For hosts no rule matches. Unset: deny when allowedDomains or presets allow anything, else allow. allow with an allowlist is an error.
overlay.egress.deniedDomains array of string Always denied, even when an allow rule matches. Unions down an extends chain and across units.
overlay.egress.deniedDomains[] string pattern ^(*.)?(a-z0-9?.)*a-z0-9?$
overlay.egress.presets array of string Named domain sets added to the allowlist (see the egress and sandbox guide for each set’s hosts).
overlay.egress.presets[] string package-registries, vcs, model-providers
overlay.env object Extra environment; may add keys, never change an inherited one.
overlay.env.* string
overlay.hooks object Hook policy.
overlay.hooks.items array of object Managed hooks.
overlay.hooks.items[] object A managed hook.
overlay.hooks.items[].command string yes Command to run.
overlay.hooks.items[].event string yes PreToolUse, PostToolUse, SessionStart, Stop, UserPromptSubmit Hook event.
overlay.hooks.items[].matcher string Tool matcher.
overlay.hooks.managedOnly boolean Only managed hooks may run.
overlay.instructions string Appended to the inherited instructions (managed CLAUDE.md / AGENTS.md / GEMINI.md).
overlay.mcp object MCP policy.
overlay.mcp.denied array of string Denied server names.
overlay.mcp.denied[] string
overlay.mcp.managedOnly boolean Block every server not listed.
overlay.mcp.servers array of object Allowed MCP servers.
overlay.mcp.servers[] object An allowed MCP server.
overlay.mcp.servers[].auth object How clients authorize to a remote server (ADR-0029).
overlay.mcp.servers[].auth.clientID string Pre-registered OAuth client id (oauth, enterprise).
overlay.mcp.servers[].auth.clientIDMetadataURL string format uri; pattern ^https:// https URL of an org-hosted Client ID Metadata Document (oauth); the URL is the client id.
overlay.mcp.servers[].auth.issuer string format uri; pattern ^https:// Authorization server issuer (oauth, enterprise).
overlay.mcp.servers[].auth.mode string none, oauth, enterprise, halos none (default) | oauth (the server’s authorization server) | enterprise (Enterprise-Managed Authorization: an ID-JAG from identity.issuer) | halos (halo-server mints audience-bound tokens).
overlay.mcp.servers[].auth.scopes array of string Scopes to request (oauth, enterprise).
overlay.mcp.servers[].auth.scopes[] string pattern ^\S+$
overlay.mcp.servers[].command array of string stdio command line (exclusive with url).
overlay.mcp.servers[].command[] string
overlay.mcp.servers[].headers object HTTP headers.
overlay.mcp.servers[].headers.* string
overlay.mcp.servers[].name string yes Server name.
overlay.mcp.servers[].tools object Narrows the server’s tools (ADR-0029). deny wins over allow; empty allow = every tool.
overlay.mcp.servers[].tools.allow array of string Only these tools (where the harness supports an allowlist; else a manifest warning).
overlay.mcp.servers[].tools.allow[] string pattern ^[A-Za-z0-9_.-]{1,128}$
overlay.mcp.servers[].tools.deny array of string Never these tools.
overlay.mcp.servers[].tools.deny[] string pattern ^[A-Za-z0-9_.-]{1,128}$
overlay.mcp.servers[].url string format uri https URL (exclusive with command).
overlay.models object Model policy.
overlay.models.allowed array of string Allowed model aliases.
overlay.models.allowed[] string
overlay.models.default string Default model alias (a gateway.models key).
overlay.models.enforce boolean Reject models outside allowed rather than only hiding them; default must then be in allowed.
overlay.permissions object Permission policy.
overlay.permissions.allow array of string Allow rules.
overlay.permissions.allow[] string
overlay.permissions.ask array of string Ask rules.
overlay.permissions.ask[] string
overlay.permissions.deny array of string Deny rules.
overlay.permissions.deny[] string
overlay.permissions.disableBypass boolean Disable the harness’s bypass-permissions mode.
overlay.permissions.mode string default, acceptEdits, plan, auto Default permission mode.
overlay.permissions.sandbox string off, workspace-write, read-only Harness sandbox policy.
overlay.permissions.sandboxRequired boolean Fail closed: the harness refuses to run (Claude: sandbox.failIfUnavailable) instead of running unsandboxed when its sandbox dependencies are missing.
overlay.sandbox object Agent sandbox (ADR-0032): mode, extra writable roots and paths the agent may never read or write.
overlay.sandbox.mode string off, workspace-write, read-only Same setting as permissions.sandbox (set either; both must agree). off is an error while egress or sandbox paths are set.
overlay.sandbox.protectedPaths array of string Never read or written by the agent: absolute, ~/ or workspace-relative globs such as .env*. Unions down an extends chain and across units.
overlay.sandbox.protectedPaths[] string minLength 1
overlay.sandbox.writableRoots array of string Absolute or ~/ directories writable beyond the workspace (no globs, not / or ~, not over a protected path). Replaces the parent’s list; a unit adding one is a loosening.
overlay.sandbox.writableRoots[] string pattern ^(/|~/)
overlay.telemetry object Telemetry policy.
overlay.telemetry.attributes object Extra resource attributes.
overlay.telemetry.attributes.* string
overlay.telemetry.enabled boolean Emit OTEL telemetry. Must be true for profiles used by rings.
overlay.telemetry.logPrompts boolean Include prompt text in telemetry.
overlay.telemetry.otlpEndpoint string OTLP endpoint URL.
overlay.telemetry.protocol string grpc, http/protobuf OTLP protocol.
owners array of string yes minItems 1 CODEOWNERS owners of the unit directory: @org/team, @user or an email.
owners[] string pattern ^(@[A-Za-z0-9][A-Za-z0-9_.-](/[A-Za-z0-9][A-Za-z0-9_.-])?|[^@\s]+@[^@\s]+.[^@\s]+)$
parent string Enclosing unit; empty for a top-level unit.