Configuration
File locations
Section titled “File locations”| Path | Scope |
|---|---|
~/ |
Global |
~/ |
Global, machine only — credentials for clock-started runs; see Scheduled credentials: clock.env |
. |
Workspace, per user (gitignored) |
Each key resolves on its own. A workspace value overrides the global value, a
global value fills a workspace omission, and built-in defaults fill the rest.
Tables merge setting by setting; scalars and arrays replace the global value
whole. Named crews merge by crew name and field, so a workspace can override
one crew’s model without restating the crew.
Three security keys never inherit from global once a workspace file exists:
execution., execution., and
execution.. A workspace file that omits one gets its built-in
default. orbit labels every value with its source.
orbit seeds the global file. orbit resets the global root
first, including the machine identity. A reset creates a new machine ID;
non-interactive resets require both --machine-name and --task-prefix.
Missing non-interactive inputs or invalid supplied identity flags are refused
before deleting the existing root.
orbit config path # the config.toml in effectorbit config show # values with their sourceorbit config show --all # also Paths, Crew purposes and Revieworbit config get workflow.default_creworbit config set workflow.default_crew opusorbit config keys # every settable key, with type and descriptionorbit hides unconfigured Advanced keys and counts them in each
section heading. A key set in any layer remains visible, even if that layer is
shadowed or its security value is not inherited. Use --all (alias --advanced)
to list every key, expand unset sections, and append Paths, Crew purposes and
Review. Those three blocks restate rows the sections already print, so the
default view omits them. --json always includes crew_purposes and review.
machine. and machine. render under Identity, not as Machine
keys; machine. stays a Machine key. --scope applies
the same filter to that file. JSON always includes all keys; each provenance
record has tier: or tier: . Tiers affect display only;
loading, config , and config keep their existing behavior. Row
descriptions are one sentence; the tables below keep the defaults and ranges.
orbit writes the workspace file; --global writes the global one.
If the workspace file does not exist yet, add --fresh to start it empty or
--seed-from-global to start from a copy of the global file.
For extra agent instructions selected by a task’s tags, edit the Tag instructions tables directly.
Scheduled credentials: clock.env
Section titled “Scheduled credentials: clock.env”~/ holds the credentials for runs no login shell starts.
launchd (macOS) or a systemd user timer (Linux) starts orbit
with no login environment, so the tick reads this file and supplies its
values as defaults to the child runs it starts; its own process environment
is never changed, and the installed unit files never contain a secret. It is
machine-global, beside the global config.: there is no workspace
clock., and no checkout or sync carries it. For the setup procedure,
see Schedule recurring work.
orbit creates the file comment-only with
owner-only permissions when it is absent, and never rewrites an existing
file. Keep it that way:
chmod 600 ~/.orbit/clock.env# ~/.orbit/clock.env — placeholders; put real values only in the fileCLAUDE_CODE_OAUTH_TOKEN=<token-from-claude-setup-token>ANTHROPIC_CREDITS_API_KEY_1=<api-key-for-the-credits-crew>GITHUB_TOKEN=<github-token>Loading rules:
- One
NAME=per line. Blank lines andvalue #comments are skipped, a leadingexportis accepted, and one pair of surrounding single or double quotes is stripped. Nothing is expanded. An empty value, a name starting withORBIT_, and a name nobody admits are dropped; a repeated name keeps its last value. - A name is admitted only when a discovered workspace’s effective
execution.lists it, or a crew’senv. pass enventry reads it as its source (below). Each workspace’s runs receive the names that workspace’s own effectivepassadmits;passis a security key, so a workspace file’s list replaces the global one for that workspace. - A non-empty value already in the tick’s environment wins; an empty or
absent one is filled from the file. A dry run (
orbit) loads nothing.clock tick --dry-run - The file must be a regular file, not a symlink, owned by the user running
the tick, and readable by its owner alone. A symlink, another owner’s
file, or a group- or world-readable mode is refused as a load error
naming the
chmodfix; the tick still runs and loads nothing from it. Sandboxed agents cannot read the file itself.600
Per-crew sources work the same way. A crew’s env entry
NAME= (global config only; see Crews) makes that crew’s
agents receive NAME with the value of SOURCE, read from the launching
process or, for clock-started runs, from clock.. Keep the source under
a name no CLI reads, such as ANTHROPIC_CREDITS_API_KEY_1, so other crews
and interactive shells are unaffected; the agent never receives SOURCE
itself. When a crew entry sets a Claude credential (ANTHROPIC_API_KEY or
CLAUDE_CODE_OAUTH_TOKEN), the other Claude credential is removed from that
crew’s agents. An unset or empty source excludes that crew from drains and
is reported by name — never by value — on the run and by orbit .
Verification reports names only. orbit lists what the
file supplied as clock_env_loaded, orbit ’s env-pass row names
pass variables unset in doctor’s own environment, and on macOS its
claude-worker-token row names the pass list or clock. lacking a
Claude credential, or a crew source clock. lacks. No command, run
record, or log prints a value.
On macOS, a Claude activity with neither CLAUDE_CODE_OAUTH_TOKEN nor
ANTHROPIC_API_KEY in its composed environment is refused before claude
starts, rather than fall back to the Claude Desktop login, which the
Desktop revokes mid-run. Create a dedicated token with claude ,
store it as CLAUDE_CODE_OAUTH_TOKEN above, and admit that name in
execution.; an admitted ANTHROPIC_API_KEY, or a per-crew env
mapping supplying either name, also satisfies the check. A token stored
under a name pass omits counts as lacking.
Unknown settings
Section titled “Unknown settings”Unknown keys and tables load with a warning naming their file and path, plus a
nearby known key when available. Each file and path warns once per process.
Unknown tables, including empty ones, are reported as a whole. Known section
headers, plugin settings and registered table-valued settings stay under their
own validation. Unknown [operation] and [review] fields also warn; known
values still validate normally.
orbit lists unknown settings alongside retired keys.
orbit backs up each affected file and removes
those entries, preserving known settings and translated review preferences.
Check the list first when sharing config with a newer binary: that version
may still use an entry this version does not recognise.
Host registry
Section titled “Host registry”~/ registers the remote Orbit installations this machine
can reach over SSH. It is machine-global, beside workspaces.; workspace
configuration does not override or merge it. The local host’s identity stays
in [machine] in the global config., outside this file.
Manage entries with orbit , rename, and remove, or the
dashboard’s Settings › Hosts. For setup and
prefix routing, see Run Orbit across hosts.
The following illustrates the schema written by orbit ; use the
command to discover the remote identity rather than inventing its values:
schema_version = 1
[[hosts]]name = "owner"machine_id = "hm_example_owner"ssh = "orbit-owner"task_prefix = "BOX"| Field | Meaning and validation |
|---|---|
schema_version |
Required integer. This build accepts only 1. |
hosts |
Array of remote entries ([[hosts]]); omission means no remote hosts. |
name |
Required host name, defaulting to the remote’s machine.. Non-empty, at most 128 bytes, with no surrounding whitespace, control characters, or path separators. Unique ignoring case, including against this machine’s name. |
machine_id |
Required remote identity: hm_ followed by ASCII letters, digits, _, or -, at most 128 bytes overall. Unique and different from this machine’s ID. |
ssh |
Required SSH alias or user@host. No leading -, whitespace, control characters, or shell metacharacters. |
task_prefix |
Required task namespace. Two to five uppercase ASCII letters, unique across registered hosts and this machine. Stored legacy ORB remains valid; fresh initialization reserves ORB, ADR, L, and F. |
Unknown keys, malformed entries, unsupported schema versions, and duplicate identities or prefixes fail loading. Orbit keeps the file’s bytes intact on a load failure. Mutations validate the resulting entries, sort them by name, and replace the file atomically. A refused mutation preserves the prior file.
Reachability, Orbit version, protocol, and workspaces are read live by
orbit and show; none is persisted in this file. Registration is
one-way and stores no SSH credentials.
Legacy migration
Section titled “Legacy migration”~/ is the legacy destination file. Its reader
remains for one release. Use orbit to migrate it; do not add new rows
to the legacy file.
- Only the legacy file exists: federated MCP, pull drains, and replica
worktree cleanup still read it.
orbitmarks rows legacy. They have no stored task prefix, so they cannot supply prefix routes.host list - First add, rename, or remove: Orbit probes every retained legacy host,
writes
hosts., applies the operation, and deletes the legacy file.toml orbitmigrates an already-listed host successfully, preserving its SSH target and chosen migration name;host add <existing-ssh-target> --nameapplies only to a new host. Migrated names use the remote’smachine., falling back to its SSH target when the name is taken.name - A retained host does not answer:
legacy_host_unreachablerefuses the mutation and neither file changes. Restore SSH access or remove the decommissioned row withorbit. The removed legacy host is never contacted; all remaining hosts must answer.host remove <ssh-target-or-machine-id> --forceonly overrides replica and pull-drain dependents. - Both files exist: every consumer, including
orbit, refuses withhost host_file_conflict. The diagnostic compares them by machine ID and lists missing routes with theirorbitcommands. Preserve a backup, retire the legacy file, then run those commands to register any missing hosts. Orbit does not choose one file for you.host add
orbit warns while only the legacy file exists and gives an
orbit command using an existing SSH target. The next release
drops the legacy reader and retains the both-files conflict check for one
additional release. The older singular host. identity file is
unrelated to this migration.
A crew is a named provider and model. A task runs on its own crew, or on
[workflow] when it names none.
[crews.sol]provider = "codex"model = "gpt-6.1-sol"effort = "high"description = "Systems implementation"tags = ["implementation", "review"]
[crews.opus]provider = "claude"model = "opus"
[crews.argon]enabled = falseprovider = "antigravity"model = "gemini-4-argon-high"
[workflow]base_branch = "main"default_crew = "sol"| Field | Purpose |
|---|---|
provider |
Required. Agent CLI family: claude, codex, antigravity, gemini, grok, copilot, or muse. |
model |
Required. Model ID passed to the provider CLI. |
enabled |
Default true. false keeps the crew listed but refuses to run it. See Disabled crews. |
effort |
Reasoning effort. See Reasoning effort. |
description |
Short summary for people. |
tags |
Discovery labels. |
env |
Variables this crew’s agents receive on top of execution., as NAME or NAME=. Global config only. For clock-started runs the source is read from clock.; see Scheduled credentials: clock.env. |
ollama and openai_compat are recognized provider IDs with no shipped
executor: a crew naming either one loads, then fails at dispatch. See
Providers. gemini is the legacy Google
CLI lane; orbit seeds Antigravity’s gemini-flash and argon crews when agy is installed. For deprecated
provider aliases and a starter crew per executor, see
Set up an executor.
At dispatch, the first crew that is set wins: an explicit crew on the run or
activity input, then the task’s crew, then [workflow] .
default_crew must name a defined crew. If you define crews and leave it
unset, Orbit falls back to an opus (or legacy claude) crew, and otherwise
refuses to load.
Disabled crews
Section titled “Disabled crews”orbit writes every built-in crew. It sets enabled on the crews
whose provider CLI it detects and enabled on the rest. To turn a
provider on later:
orbit config set crews.argon.enabled trueA crew table without enabled is enabled. A disabled crew:
- stays listed:
orbit(config show ENABLEDcolumn),orbit,config get crews. <name>. enabled orbit.withworkspace. list include:(["crews"] enabledper crew, schema version 3), and the dashboard all show it; - is never drawn from a complexity pool. A pool whose members are all disabled
acts as an empty pool, so the task gets
default_crew; - is refused, never substituted, when a task’s
crew, an explicit crew, ordefault_crewselects it. The error names the crew and theorbitcommand;config set … enabled true - is reported by
orbitwhendoctor default_crewnames it. Config still loads.
With no supported agent CLI detected, every crew is seeded disabled and
default_crew stays unset, so nothing dispatches until you
enable a crew.
orbit also seeds the four workflow. pools from the
detected providers. Claude only: haiku / sonnet / opus / opus. Codex
only: luna / sol / sol / astra. Both: haiku, / sol, /
opus / opus, . Grok adds grok to medium; a detected agy appends
gemini-flash to low and argon to hard; a detected muse appends muse-spark, muse-wonder,
and muse-wonder-full to low, medium, and hard. Other
providers leave the pools empty, which routes to default_crew. Init only
seeds a new file; an existing config is not rewritten.
Reasoning effort
Section titled “Reasoning effort”effort is unset by default, which keeps the provider’s own default. A
supported value is passed through the provider’s documented flag.
| Provider | Accepted values | Rendered as |
|---|---|---|
claude |
low, medium, high, xhigh, max |
--effort |
codex |
low, medium, high, xhigh, max |
--config |
muse |
low, medium, high, xhigh, max |
--reasoning-effort |
antigravity |
low, medium, high |
--effort |
grok with grok-4. or grok-4. |
low, medium, high, xhigh |
--reasoning-effort |
grok with grok-4. |
low, medium, high |
--reasoning-effort |
| others | None | — |
An invalid or unsupported effort is ignored for that crew, as if unset,
so a slip such as effort (a task-complexity word) cannot stop every
command. Loading logs a warning with the config path, crew, value, and accepted
values, and orbit lists each ignored value with the fix. Orbit never
remaps an unsupported value onto a nearby one. orbit refuses to
write a value that loading would drop. A missing provider or model, a
retired backend, or an unknown pool reference still fails config loading.
The narrower sets follow each CLI. agy defines no xhigh or max.
Grok effort is verified only for grok-4., grok-4., and
grok-4.; on any other Grok model it is ignored with a warning. The provider
can still reject a value for a particular model.
Choose capability with the model first, then use effort to tune the reasoning
budget within it.
System work
Section titled “System work”Orbit’s own work draws its crew from the complexity pools, like a task with no
crew, until you give a purpose a pool of its own (see
purpose pools). Shipped auto-task templates name no crew, so
each minted task draws from the pool for its complexity; a template.
setting, an explicit template crew, and workflow. for
delivery-code-review still win. While their purpose pools are unset, the
task pilot draws from low, step-failure and PR conflict recovery from
medium, and repairs authorized by orbit , conflict
repairs included, from low. Repairs are narrowed only by --allow-crew, and a
pool the run cannot use stops the repair rather than escalating. A run draws
once per pool, keeping the pool’s weights and skipping disabled and
usage-limited crews, and records the draw in its state. An empty pool falls
back to default_crew, and the recorded draw says so. Recovery never inherits
a failed task’s crew.
Purpose pools
Section titled “Purpose pools”Each purpose of work can name a weighted pool of its own under
[workflow., written like the complexity pools:
[workflow.purpose_crews]task_pilot = ["luna:3", "sonnet:1"]failure_recovery = ["sol"]baseline_red_repair = ["opus"]The purposes are task_pilot, failure_recovery, auto_fix,
baseline_red_repair and sweep_tasks (every task the CI failure,
Dependabot, code-scanning and merged-head repair sweeps file), explorer
(the read-only explorers an implementing agent delegates, which have no
earlier route: with no eligible member, delegation is not offered), plus
final_recovery and review, which keep their own rules: final recovery
draws only from its pool, and [] turns it off; automatic review needs its
pool set and avoids the crew that implemented the reviewed work. For the
first five, a crew is chosen in this order:
- An explicit crew on the task, auto-task template or activity input, used as it is.
- The purpose’s pool, when it has an enabled member. A provider usage limit or failure hold on the assigned member redraws from the pool’s other enabled members, keeping their weights, before the route below.
- The earlier route. The tasks the red-base re-check and the sweeps file
(
baseline_red_repairandsweep_tasks) draw from a matching type pool when one exists, then from the complexity pool named above, elsedefault_crew. The activity purposes (task_pilot,failure_recoveryandauto_fix) go straight to the complexity pool.
--allow-crew narrows a purpose draw the same way it narrows a complexity
draw. A task’s purpose comes from the tag it was filed with
(baseline-red-repair, ci-failure-sweep, the Dependabot and code-scanning
tags, a merged-head follow-up tag), or from a crew-purpose:<purpose> tag an
auto-task template adds. orbit lists each purpose’s resolved
pool and where it comes from (the default view already prints the purpose
keys; --json includes crew_purposes), and orbit names the rule behind each
activity crew a run drew.
Type pools
Section titled “Type pools”A task type from workflow. can give any complexity tier
a pool of its own under [workflow., written like
the complexity pools:
[workflow.type_complexity_crews.ui]hard = ["opus"]
[workflow.type_complexity_crews.security]hard = ["fable:3", "opus:1"]A task’s type is the first crew_performance_types entry its tags or context
files match (the type the implementer scorecard groups it under); other
never has a pool. A typed task with no crew draws from its type’s pool for its
complexity instead of workflow., and records the
source type:<type>/. A task whose type has no pool for its tier draws
from the complexity pool as before. The order is an explicit crew, then a
purpose pool, then the type pool, then the complexity pool, then
default_crew. Executor OS filtering, usage pressure and the performance
multiplier apply as they do to complexity pools.
Orbit draws at creation, when the crew is cleared, when the complexity changes
and when a tag or context-file edit moves the task to another type pool, or
out of one. At dispatch it keeps a type-pool crew while that crew is still an
enabled member and the task still classifies to that type and tier. A
provider hold or usage limit redraws from the pool’s other members, then
from the complexity pool, then from default_crew.
The load refuses a type crew_performance_types does not define, an unknown
tier, an empty pool, an unknown or disabled crew and a zero weight, and the
error names the key. Each <type>. pool layers separately, so a
workspace pool replaces only the same type and tier from global. Settings ›
Crews lists each pool under the crews it uses.
[workflow] is deprecated: it still loads for one release with a
warning, but is ignored. Orbit no longer defines a built-in system crew, so a
template or job still naming crew: routes through the pools with a
warning. A [crews. table you define is an ordinary crew.
Settable keys
Section titled “Settable keys”orbit accepts these keys, except the two read-only machine. identity keys. orbit prints the same list, and the docs test suite fails when this table and that list diverge.
| Key | Type, default and purpose |
|---|---|
workflow. |
Advanced. string · Default: mainBase branch for ship, auto, and the task pilot when the registered workspace has none. |
workflow. |
string · Default: See Crews Crew for a task that names none and gets no override. |
workflow. |
array<string> · Default: []Crew pool for low-complexity tasks with no crew, and for the task pilot and PR auto-fix while their purpose pools are unset. |
workflow. |
array<string> · Default: []Crew pool for medium-complexity tasks with no crew, and for step-failure and PR conflict recovery while their purpose pool is unset. |
workflow. |
array<string> · Default: []Crew pool for hard-complexity tasks with no crew. |
workflow. |
array<string> · Default: []Crew pool for xhard-complexity tasks with no crew. |
workflow. |
table<string,table<string,array<string>>> · Default: {}Per task type and complexity tier, a weighted crew pool that replaces that tier’s complexity pool for tasks of the type. See type pools. |
workflow. |
array<string> · Default: []Crew pool for repairs authorized by orbit . Unset or [], they draw from workflow.. An explicit crew still wins, and --allow-crew still applies. See purpose pools. |
workflow. |
array<string> · Default: []Crew pool for the tasks the red-base re-check files. Unset or [], they draw from their matching type pool, then their complexity pool. An explicit crew still wins, and --allow-crew still applies. See purpose pools. |
workflow. |
array<string> · Default: []Crew pool for the read-only explorers an implement or review-repair agent delegates through orbit. while workflow. is on. Members disabled here, or whose executor host_ excludes this host, are skipped. Unset, [] or with no eligible member, delegation is not offered and every call is refused. A named crew must be a member. See purpose pools. |
workflow. |
array<string> · Default: []Crew pool for step-failure and PR conflict recovery. Unset or [], they draw from workflow.. An explicit crew still wins, and --allow-crew still applies. See purpose pools. |
workflow. |
array<string> · Default: ["sol:100", Crew pool for final recovery, drawn once per run after step recovery is exhausted. The default keeps only members you define; [] disables final recovery. Replaces the deprecated workflow.. |
workflow. |
string or array · Default: Unset Crew for before-PR and before-landing review, including the reviewer a claim from a review. machine captures. Written and admitted like workflow., and drawn by the same rules. Unset or [], that reviewer comes from workflow., so after-landing review can keep a different pool. A review layer that resolves no crew from either key refuses to start, naming both. |
workflow. |
string or array · Default: Unset Crew for automatic review: every review task the after-landing auto-task mints, and the reviewer review. runs while workflow. is unset. Unset, after-landing review uses that auto-task’s template crew. An array is a pool written like the complexity pools (["sol", or ["sol:3", , all bare or all weighted): each review draws one crew by weight, skipping crews that are disabled or at a provider usage limit and then preferring one that did not implement the reviewed work, each step falling back to the pool when it would leave none. A distributed owner resolves its pool to one crew per claim. [] unsets it; a crew the registry does not define fails the load. Replaces the deprecated operation.. |
workflow. |
array<string> · Default: []Crew pool for every task a sweep files: the CI failure sweep, the Dependabot and code-scanning sweeps, and the merged-head repairs a review reconciliation files. Unset or [], they draw from their matching type pool, then their complexity pool. Replaces the deprecated ci_, dependabot and merged_ pools, which still load into it; a file whose old pools differ fails to load until you merge them here. An explicit crew still wins, and --allow-crew still applies. See purpose pools. |
workflow. |
array<string> · Default: []Crew pool for the task pilot. Unset or [], it draws from workflow.. An explicit crew still wins, and --allow-crew still applies. See purpose pools. |
workflow. |
Advanced. integer · Default: 90Delivery admission skips a crew while a live usage window of its provider, or of its model, is exhausted or used at or above this percent. 100 skips only on exhaustion. |
workflow. |
array<string> · Default: []Per-provider thresholds replacing workflow., each provider:percent or provider:off (record readings without gating admission), such as ["claude:80", . |
workflow. |
Advanced. array<string> · Default: []Rolling budgets for providers that report no usage, each provider:<amount><usd|tokens>/, such as ["grok:30usd/. Counts this host’s Orbit runs only. |
workflow. |
Advanced. string · Default: waitA task whose explicit crew is limited waits in the backlog ( wait), or is drawn from the unlimited members of its complexity pool (pool). A purpose-sourced crew is not an explicit pin; it redraws within its purpose pool first. |
workflow. |
Advanced. string · Default: staticHow task creation, complexity re-rate and admission draws weigh pool members. static uses the configured weights. usage_ scales each member’s weight by its crew’s weekly usage pressure, clamped by workflow., and at admission draws a crew the system chose again from its whole pool, keeping the task’s automatic crew source. Explicit crews are never re-drawn. The crew_ object a run records is the draw itself, not this key. |
workflow. |
Advanced. number · Default: 8Under usage_, the weight multiplier is clamped to [1/. At least 1. |
workflow. |
Advanced. number · Default: 1.Under usage_, the exponent applied to pressure before the cap. At least 0; 0 disables weighting. |
workflow. |
Advanced. array<table> · Default: []Ordered task types for the implementer scorecard’s by-type matrix. Each [[workflow. entry has a unique non-empty name (never other) and at least one of tags or paths; a task takes the first type whose tags it carries or whose path globs match its context files, else other. Empty means every task is other. Read with orbit . |
workflow. |
Advanced. string · Default: offHow task creation, complexity re-rate and admission draws weigh pool members by each crew’s implementer score on the task’s type within its complexity tier: off, absolute (advantage score ), comparative (advantage score ), shadow_ or shadow_. A live mode draws on weight , the factor clamp(exp(strength , and records applied: . Shadow computes and records the same factor with applied: and draws as off would, usage pressure still included. Before enabling a live mode, read orbit : static share is the configured weight, drawn share is the weight the draw used, and would-be share applies the recorded factor. Draws with no performance record are listed separately and counted as static. A large gap between drawn and would-be is work that would move. Independent of workflow.; performance alone never re-draws an assigned crew, and explicit crews are never re-drawn. A missing, stale or mismatched snapshot gives every factor 1 and records why in the run’s crew_. Only off makes the seeded hourly crew_ routine write nothing and skip the scan. |
workflow. |
Advanced. number · Default: 3The strength k of the crew-performance factor. At least 0; 0 disables the factor. |
workflow. |
Advanced. number · Default: 4The crew-performance factor is clamped to [1/. At least 1. |
workflow. |
Advanced. integer · Default: 30Evidence window in days ( 1–90) the crew-performance snapshot is built from. The seeded crew_ routine rebuilds the snapshot hourly over this window; orbit shows its age, window and type list, or why it is unusable (missing, stale after 24 hours, or type_). |
workflow. |
array<string> · Default: []Commands every delivered candidate must pass. Owner PR and local deliveries run them before push or merge; a distributed claim must pass them before this owner accepts its handoff. Empty means no required check on any path: nothing runs and a claimed handoff carries no validation logs. |
workflow. |
string · Default: reviewHow far this owner takes an accepted distributed handoff: review waits for an operator’s Approve handoff; done lands it through the owner’s landing job, as orbit does. |
workflow. |
Advanced. string · Default: bandHow a distributed owner orders admission against its live executors, so each takes work only it can run first. band puts that work ahead of priority within a dispatch band, so critical and corrective work still leads; priority puts it first only within a priority; off keeps the plain band, priority, expiry and age order. Applies to followers’ pulls and the owner’s own drain. |
workflow. |
array<string> · Default: ["**/Path globs ( * within a component, ** across components) whose context_ entries take no context lock. The agent still receives them as context; admission, readiness and lock reservations skip them. A task whose every entry matches still locks them all. [] locks every entry. |
workflow. |
Advanced. array<table> · Default: []Ordered [[workflow. entries, each a pattern (a Rust regex searched for in the workspace-relative path; anchor it with ^ and $) and a mode of exclusive (default) or shared. The first matching entry wins. Two tasks whose context overlaps only at a shared path, judged at the narrower selector’s path, run together, and a conflict between them is resolved when the second lands. module: and command: selectors stay exclusive. Empty locks every overlap. |
workflow. |
array<string> · Default: []Commands a repaired candidate runs instead of workflow. when its tree differs from the last tree its run passed the full list on only in paths matching workflow., such as ["make . Any other change runs the full list. Each validation records which list ran and why as validation_. Empty always runs the full list. |
workflow. |
table<string,string> · Default: {}Generated files, as path glob = regenerate command, such as "docs/. When a stopped rebase conflicts on a match, conflict recovery takes one side, runs the command in the checkout and stages its output instead of merging it. A command that fails or leaves conflict markers fails the repair. |
workflow. |
array<string> · Default: ["docs/Path globs ( * within a component, ** across components; a leading ! excludes) a candidate must change only within for a task tagged skip-review or skip-validation to skip agent review or local validation. Any other changed path ignores both tags, and the task’s history records why. [] disables both tags. |
workflow. |
Advanced. array<string> · Default: ["**/Path globs ( * within a component, ** across components; a leading ! excludes) whose changed lines count as tests in each landed delivery’s diff stats, charted under Analytics › Metrics › Lines changed. Checked before workflow.. Changes apply to deliveries recorded afterwards. |
workflow. |
Advanced. array<string> · Default: ["docs/Path globs whose changed lines count as other (docs, config, data, assets) in landed-delivery diff stats. A path matching neither this nor workflow. counts as code. |
workflow. |
Advanced. array<string> · Default: title, description, criteria, plan, selectorsTask fields whose edit makes an accepted task-pilot assessment stale. Also accepts tags, crew, tools, type, complexity, relations, dependencies, instructions. |
workflow. |
Advanced. string · Default: ignoreWhether a branch-head move makes an accepted task-pilot assessment stale: ignore, context_ (only when the move changed a path the task’s selectors name), or any. |
workflow. |
bool · Default: falseRecord in each run’s state the newest task comment every agent prompt with task context included, the run’s steering watermark, and lead the run’s later prompts with the operator comments written after it. The shipped delivery pipelines do not commit while one is undelivered. Claimed leaves read steering from their owner and fail closed before commit when it cannot answer. |
workflow. |
Advanced. integer · Default: 2Steering rounds a run may spend at the promotion gate before it holds as steering_ (1–10). |
workflow. |
bool · Default: trueMark regression-prone backing files named by a task’s file: or symbol: context selectors in its implement and review prompts. A symbol-only footprint can qualify; symbols in the same file share its file-level rate and produce at most one mark for that path. Each mark gives the path, how many of its touching tasks regressed, their most common natures and escapes (unclassified when unrecorded) and one lesson line, and the prompt adds a check for each. Each prompt that carries marks records them on the task; Analytics › Codebase compares marked paths’ regression rates with marks against the window before the first mark. Prompts carry no marks and the envelope omits regression_ when disabled, when the task has neither file: nor symbol: selectors, or when no backing file meets min_ and threshold_. These file-level prompt marks are separate from the task riskiness estimate: the score is fitted on size alone, without per-file or crew attribution. Its basis is the distinct file and directory paths in context selectors when there is no usable diff-based fit, or inserted plus deleted lines for a review or done task with a resolvable diff and enough matching landed-diff history. The detail breakdown shows the basis and size-band evidence: recent done tasks on the same basis at least this size, and how many regressed. A ~ before the percentage means pathless selectors are omitted from the declared-file count, which is therefore a lower bound. window_ and min_ apply to task scores even when marks are off; threshold_ and max_ apply to prompt marks only. A Tasks row without an estimate has no risk part. Task detail shows No estimate with the reason: no files (no context selectors and no usable diff-based estimate), no paths (selectors identify no file or directory), thin history (not enough usable done-task observations on the selected basis to fit), or unavailable (the estimate could not be computed); only an estimated task shows the breakdown. |
workflow. |
Advanced. integer · Default: 30Trailing days of done tasks used for task riskiness scores and prompt marks ( 1–365). A path’s regressions drop out once their tasks are older. |
workflow. |
Advanced. integer · Default: 5Minimum task support used for riskiness scores and required before a context file can be marked ( 1–10000). |
workflow. |
Advanced. integer · Default: 40Prompt marks only: share of a file’s touching tasks a regression_ link names, in percent, at or above which the path is marked (1–100). |
workflow. |
Advanced. integer · Default: 3Prompt marks only: most paths one prompt marks, highest regression rate first ( 1–20). |
workflow. |
bool · Default: falseLet a managed implement or review-repair agent delegate read-only questions through orbit.. Each call runs a sandboxed explorer from workflow. in the caller’s own worktree: it cannot write, change Orbit state, dispatch or invoke another agent, never gets the operator’s trusted-host admission, and answers with the paths it read. Every other agent is refused, and the operator’s invocation is unchanged. Refusals name their reason and the caller continues. Run detail lists each explorer with its crew, duration, tokens and cost, and Analytics › Cost compares implement runs with and without explorers per crew. Off, the agent is offered no delegation. |
workflow. |
Advanced. integer · Default: 6Explorer calls one implement or review-repair run may make ( 1–100). A retry with the same idempotency_ spends none. |
workflow. |
Advanced. integer · Default: 2Explorers one run may have queued or running at once ( 1–16). |
workflow. |
Advanced. integer · Default: 600Default and ceiling of one explorer’s provider wall clock, in seconds ( 1–3600). |
workflow. |
Advanced. integer · Default: 16384Largest explorer answer returned to the calling agent, in bytes ( 167–262144); a longer one is shortened and flagged answer_. |
workflow. |
bool · Default: falseAsk the task pilot for an explore brief: a short map of the files and symbols a task’s change touches, its call path, the pattern to copy, covering tests and gotchas, every location a selector and never a line number. Apply checks it against the pilot’s pinned revision and the task’s lock footprint, caps it at 8 KiB, and stores it as the task artifact explore-brief., which only Orbit may write. An invalid brief is dropped with its reason in the pilot comment and never fails the assessment. A current brief is given to the implementer while workflow. is on; see that key. |
workflow. |
array<string> · Default: []Task tags that request an explore brief while workflow. is on. Empty requests one for every piloted task. Tags are read when the task is piloted. |
workflow. |
bool · Default: trueWhether a stored explore brief goes to the implementer. At each implementation start Orbit gives it only while the task is unchanged since its pilot and the files it maps changed little since; otherwise the run starts without it. orbit reports each outcome (fresh, drifted, dropped: or absent). false keeps briefs in shadow: produced, stored and classified, never delivered. A run claimed on a follower can receive the owner’s captured brief: admission carries the owner’s brief, material fingerprint, freshness policy, and deliver setting to the follower, which re-applies the same fresh/drifted/drop material and code-drift checks against the claim’s base and ignores the replica’s own brief policy. A claim from an older receipt without a captured brief starts cold, without it. |
workflow. |
Advanced. bool · Default: trueStart no new task while host CPU, memory, disk space, or (on Linux) disk I/O pressure stays high. Disabled, pressure is still reported. |
workflow. |
string · Default: "load"load or utilization. Linux utilization uses busy CPU tick deltas excluding idle and I/O wait; macOS uses Mach utilization for either choice. Both use the existing ten-second sustain window; I/O pressure remains independently gated. The active source appears in readiness and doctor. |
workflow. |
integer · Default: 90CPU high-water mark. With the default cpu_, Linux uses load average divided by online CPUs, includes the run queue and I/O wait, and can exceed 100%; this differs from machine., which measures forecast utilization. |
workflow. |
integer · Default: 85Resume below this CPU percentage. |
workflow. |
Advanced. integer · Default: 2While CPU alone holds admissions, a local drain still starts up to this many no-diff-expected auto-tasks (reviews, curation). Memory, disk and I/O pressure hold them too; 0 holds them with everything else. |
workflow. |
integer · Default: 90Memory high-water mark. It and machine. measure non-reclaimable memory; the global auto-concurrency threshold must stay below this global high mark. |
workflow. |
integer · Default: 85Resume below this memory percentage. |
workflow. |
integer · Default: 90Disk high-water mark, per observed filesystem. |
workflow. |
integer · Default: 85Resume below this disk percentage. |
workflow. |
Advanced. integer · Default: 20Linux only. High-water mark for disk I/O stall: full in /, the share of the last minute in which every runnable task was stalled on I/O. full, not some, because some fires whenever any one process waits on disk, which is normal on a busy build host. Hosts without pressure stall information are not gated. |
workflow. |
integer · Default: 10Resume below this full percentage. |
workflow. |
string · Default: interactiveHow the PATH (and allowlisted toolchain locators such as CARGO_) that required validation and local_ steps see is resolved from the owner’s shell: interactive tries an interactive login shell (-i ) so toolchains exported in rc files are found, falling back to -l on startup failure, nonzero exit, timeout, or a missing marker; login probes only -l ; off never probes the shell. Each probe is bounded to 10 seconds and its outcome is cached for two minutes. Replaces the deprecated login_ (false is off) and interactive (false is login) booleans. |
workflow. |
array<string> · Default: []PATH entries for required validation and local_ steps, combined with the resolved PATH per path_. A leading ~/ expands to HOME. Empty adds nothing. |
workflow. |
Advanced. string · Default: prependHow workflow. combines with the resolved PATH: prepend puts it first, replace makes it the whole PATH. |
workflow. |
array<string> · Default: []Environment variable names bound to managed host output for required validation and host evidence. Configured bindings replace inherited values; commands must honor them. Empty allocates nothing. See Workspace build output. |
workflow. |
Advanced. bool · Default: falseWhen a host validation target is bound, force CARGO_ on required validation, host evidence, baseline reruns and recovery. true leaves the variable untouched. No binding does not set it. |
machine. |
string · Default: Set by orbit Global only. This machine’s display name, and the one [machine] value you can change. |
machine. |
array of strings · Default: []Global only. Capability labels this machine carries ( ["gpu", ) for tasks whose requires_ name them; a host may start such a task only when it carries every label. Its OS (linux, macos or windows) is an implicit label. Labels are trimmed and lowercased, and use ASCII letters, digits, -, _, ., : and /, up to 64 bytes. orbit prints the effective set. |
machine. |
string · Default: Set by orbit Global only, read-only. This machine’s stable generated identity ( hm_), written once by orbit and never reused. orbit refuses it. |
machine. |
string · Default: Set by orbit Global only, read-only. The task-ID namespace for IDs minted on this machine (2–5 uppercase ASCII letters), chosen once by orbit . orbit refuses it. |
machine. |
Advanced. integer · Default: 180Global only. Hold new unattended admissions only when a scheduled host shutdown or reboot is this many minutes away or sooner ( >=). A later schedule is still reported and admission continues. |
machine. |
string · Default: warnGlobal only. How detached pipeline workers are bounded: warn runs each in its own systemd user scope, bounded by the machine. limits, and runs it uncontained with a warning where no user manager is reachable; strict refuses that launch instead; off never uses a scope. Needs Linux with a user manager for a scope. A boolean still loads with a warning (true is warn, false is off), as does the deprecated machine. (true is strict). |
machine. |
Advanced. string · Default: 40%Global only. Worker scope MemoryHigh= (throttle point): a size such as 6G, a percentage of RAM, or infinity. |
machine. |
Advanced. string · Default: 50%Global only. Worker scope MemoryMax= (OOM point), same format. |
machine. |
Advanced. integer · Default: 4096Global only. Worker scope TasksMax=. |
machine. |
bool · Default: falseGlobal only. Enable private browser credentials at dashboard startup. Reopen with orbit ; URLs expire after five minutes and one exchange. Existing routes keep their authorization. |
machine. |
integer · Default: 43200 (12h)Global only. Browser-session lifetime in seconds, 1.. Restart the dashboard to apply. Cookies are HttpOnly, SameSite=Strict and scoped to /; sessions end when the server stops. |
machine. |
Advanced. integer · Default: unset Global only. Worker scope CPUQuota= as a percentage of one core (400 = four cores); 0 or unset sets no CPU limit. Linux only. |
machine. |
string · Default: offGlobal only. Forecast admission mode: off, shadow, or enforce. off leaves admission unchanged. shadow records what gap fit would admit in each local drain pass and admits as off. enforce admits local candidates whose profile fits under the forecast. Under orbit , enforce sends the fit list with each pull request and requests nothing while nothing fits; shadow records that list and requests as with off. |
machine. |
integer · Default: 90Global only. Forecast CPU utilization as a percentage of host cores (1–100); distinct from the default Linux load-based throttle signal ( workflow.). |
machine. |
integer · Default: 75Global only. Forecast non-reclaimable memory as a percentage of host memory (1–100), strictly below global workflow.. |
machine. |
Advanced. integer · Default: 50Global only. Most recent completed deliveries retained per profile key; at least min_. |
machine. |
integer · Default: 10Global only. Minimum completed deliveries before using a profile key rather than falling back. |
machine. |
Advanced. integer · Default: 120Global only. Maximum forecast horizon for a candidate, in minutes. |
machine. |
Advanced. integer · Default: 30Global only. Maximum queue-head wait before the starvation guard stops backfilling, in minutes. |
machine. |
Advanced. integer · Default: 20Global only. Consecutive protected passes whose miss has not improved before a drain reports the queue head stuck: an enforce drain files one friction, and orbit and orbit print a Stuck line while it lasts. Admission is unchanged. At least 1. |
tasks. |
integer · Default: Unset Floor for this machine’s task-ID allocator. Moves only forward, so machines can hold disjoint ID ranges. |
ci_ |
Advanced. integer · Default: 6Hours an archived/rejected CI sweep finding without covered_ holds its exact failure key (0–720). Explicit task/PR covers hold while open or until a failing checkout contains the landed fix; operator holds report their owner and reason. |
publication. |
string · Default: omitWeekly task publication attachment policy: omit, fail, or include. See Scheduled publication. |
publication. |
Advanced. boolean · Default: falseExplicitly accept unscanned attachments when the routine policy is include; sensitive path and size limits still apply. |
automation. |
Advanced. integer · Default: 60Minutes a delivery-automation deferral may persist before Orbit logs a warning and files one friction (1–1440). |
decision_ |
bool · Default: falseRaise decision requests for work held on a human decision. |
lease. |
bool · Default: falseAccept path-lease operations in this workspace. While false, every lease operation is refused with an error naming this key. See Hold paths with leases. |
lease. |
Advanced. string · Default: advisoryMode of a lease request that names none: advisory (always granted, blocks nothing) or hard (queued, holding nothing, while another task, reservation or hard lease holds an overlapping path). |
lease. |
Advanced. string · Default: allowWhether a human principal may hold hard leases: allow, or never to grant hard requests as advisory. |
lease. |
Advanced. string · Default: allowWhether an agent principal (a declared agent or managed run) may hold hard leases: allow, or never to grant hard requests as advisory. |
lease. |
Advanced. string · Default: highHighest lease priority a human principal may request: low, normal or high. A higher request is refused. |
lease. |
Advanced. string · Default: normalHighest lease priority an agent principal may request: low, normal or high. A higher request is refused. |
lease. |
Advanced. integer · Default: 30Minutes a queued hard-lease request or expansion waits before it moves up one priority level ( 1–10080). |
lease. |
Advanced. Global only. string · Default: unset The OS user of the lease listener that orbit accepts lease operations from over a Unix socket at ~/. Unset serves no socket. Root, the operator’s own user and a missing user are refused at startup. |
lease. |
Advanced. Global only. string · Default: unset Address and port the lease listener ( orbit , run as the listener user) binds, such as 100.. Read from the listener user’s ~/. Unset runs no listener; 0. or :: requires native TLS or lease.. |
lease. |
Advanced. Global only. table · Default: unset Native TLS: { , a PEM certificate chain (leaf first) and matching unencrypted private key. The key must have no group or other permissions (0600). Missing, unreadable, invalid or mismatched material refuses startup. Supports TLS 1.2 and 1.3; restart the listener after certificate rotation. |
lease. |
Advanced. Global only. bool · Default: falseA terminating proxy is in front of the lease listener, so it may bind every interface and reads X-Forwarded-For from lease.. Refused without trusted_. |
lease. |
Advanced. Global only. array<string> · Default: []Proxy addresses or CIDR ranges whose X-Forwarded-For the lease listener reads. The client is the rightmost entry that is not a trusted proxy; a malformed one is refused with 400. Forwarded is never read. |
lease. |
Advanced. Global only. string · Default: unset Absolute path of the operator’s lease intake socket (the operator’s ~/) that the lease listener forwards authenticated operations to. Required. |
lease. |
Advanced. Global only. integer · Default: 10Failed authentications from one client address (IPv6 per /64) before the lease listener answers 429 until the window ends ( 1–1000). |
lease. |
Advanced. Global only. integer · Default: 300Window, in seconds, over which the lease listener counts failed authentications ( 1–86400). |
lease. |
Advanced. Global only. integer · Default: 120Requests per minute from one resolved address or IPv6 prefix. Valid range: 1–100000. |
lease. |
Advanced. Global only. integer · Default: 64IPv6 prefix length for address budgets; mapped IPv4 remains per address. Valid range: 0–128. |
lease. |
Advanced. Global only. integer · Default: 60Read requests per minute per token, independent of writes and address. Valid range: 1–100000. |
lease. |
Advanced. Global only. integer · Default: 20Write requests per minute per token, independent of reads and address. Valid range: 1–100000. |
lease. |
Advanced. Global only. integer · Default: 2Open notice streams per token; streams also count as in-flight requests. Valid range: 1–100. |
lease. |
Advanced. Global only. integer · Default: 8In-flight requests per token, including open streams. Valid range: 1–1000. |
lease. |
Advanced. Global only. integer · Default: 64Concurrent listener connections, including TLS handshakes. Valid range: 1–10000. |
lease. |
Advanced. Global only. integer · Default: 16Concurrent listener requests; excess receives 503. Valid range: 1–1000. |
lease. |
Advanced. Global only. integer · Default: 65536Maximum request body bytes; oversized requests receive 413. Valid range: 1–1048576. |
lease. |
Advanced. Global only. integer · Default: 5Seconds allowed to receive HTTP headers or complete a TLS handshake. Valid range: 1–300. |
lease. |
Advanced. Global only. integer · Default: 10Seconds allowed for a request handler and body receipt. Valid range: 1–300. |
lease. |
Advanced. Global only. integer · Default: 4096Maximum rate-limit identities, including two shared overflow buckets. Valid range: 3–65536. |
experiments. |
bool · Default: falseAllow experiments to start in this workspace. While false, orbit is refused with an error naming this key; drafts can still be defined, edited, shown and abandoned. |
experiments. |
Advanced. integer · Default: 3Experiments that may run at once in this workspace ( 1–20). Starting or resuming one beyond it is refused; a paused experiment does not count. |
seeding. |
string or array<string> · Default: allWhich of Orbit’s shipped default routines this workspace seeds: "all", "none", or a list of their file stems (["worktree_). A list seeds exactly those names, so a default a later release adds is not seeded. An unknown name fails config load with the name. orbit , --force re-init, orbit and the seeding orbit runs after an upgrade all honour it. Narrowing it retires a left-out default Orbit seeded and you never edited; an edited copy moves to .. Widening it seeds the default again on the next sync. |
seeding. |
string or array<string> · Default: allThe same policy for shipped default auto-tasks, by auto-task name ( ["doc-duties", ). An opt-out you recorded with orbit is kept while the policy leaves the default out. |
experiments. |
Advanced. array<string> · Default: []Config keys an experiment arm’s config overlay may set. Starting an experiment whose arm sets any other key is refused. |
pr. |
Advanced. bool · Default: trueClose a task’s open Orbit-authored pull requests, including preservation PRs for blocked tasks, when the task lands, is rejected, or is archived, with a comment naming the landing or decision. Branches are kept; a forge error is a warning, never a failure. |
pr. |
Advanced. array<string> · Default: []Forge logins whose pull requests count as Orbit-authored for pr. and for settling a task to done from its delivery pull request merged outside Orbit. Empty means the login the forge CLI is authenticated as on this machine. |
pr. |
Advanced. string · Default: Unset Template for a single-task pull request title, using the delivery template placeholders. Unset uses the task title. |
pr. |
Advanced. string · Default: Unset Pull request body template: "repo" (the repository’s pull_) or a repository-relative path, read at the delivery’s base revision. Unset uses Orbit’s own layout. |
pr. |
Advanced. array<string> · Default: []Body headings the implementer may fill through the pr-sections. task artifact. |
pr. |
Advanced. array<string> · Default: []Body headings the implementer must fill. An unfilled one is handled by pr. and recorded in task history. |
pr. |
Advanced. string · Default: draftWhat happens when a required section is unfilled: draft opens the pull request as a draft with a note under the heading; refuse opens no pull request. |
pr. |
Advanced. string · Default: autoWhen a single-task body carries the optional ## section: auto for tasks tagged ui, always, or off. If no screenshots are publishable, it shows No ; this does not count as a missing required section and never drafts or refuses the PR. |
pr. |
Advanced. bool · Default: trueInclude the Branch Freshness section (and the {{freshness}} value) in pull request bodies. |
pr. |
Advanced. bool · Default: trueAppend the authoring model’s signature to pull request bodies. |
pr. |
Advanced. bool · Default: trueAppend the Orchestrated-By trailer to pull request bodies. |
pr. |
Advanced. array<string> · Default: []Labels applied to each pull request Orbit opens. |
pr. |
Advanced. array<string> · Default: []Exact, case-sensitive allowlist of task tags mirrored as PR labels after creation or reuse. |
pr. |
Advanced. table<string,string> · Default: {}Map feature, bug, refactor or chore to label names, e.g. { . Unknown types are refused. Task labels are unioned across the delivery; missing labels are created and existing labels accepted. Names must be non-empty and cannot start with -. Failures warn and are recorded as task_ / . in the PR step output without failing the step. Empty settings add no commands. Later task edits do not sync or remove labels. |
pr. |
Advanced. array<string> · Default: []Reviewers (logins or org/) requested on each pull request Orbit opens. |
pr. |
Advanced. bool · Default: falseOpen every pull request as a draft. A draft is never merged automatically. |
commit. |
Advanced. string · Default: Unset Template for single-task commit subjects; must contain [{{task_. Subjects keep a 72-character budget: the title is shortened first, with an ellipsis, and kept whole in the body. |
commit. |
Advanced. string · Default: Unset Template for single-task commit bodies, before the trailers. |
commit. |
Advanced. bool · Default: trueAdd the Planned-By trailer to commit messages that carry it. |
commit. |
Advanced. bool · Default: trueAdd the Implemented-By trailer to commit messages that carry it. |
commit. |
Advanced. bool · Default: trueAdd the Orchestrated-By trailer to commit messages. |
branch. |
Advanced. string · Default: {{prefix}}/Template for single-task delivery branch names; must contain {{task_ and {{hash}}. A name containing . or starting with - is refused. |
pr. |
Advanced. string · Default: Unset URL template that links a task ID in PR descriptions. |
execution. |
array<string> · Default: HOME, PATH, CODEX_, TMPDIR, USEREnvironment variables passed to agent subprocesses. Replaces the default list rather than extending it. macOS also passes _ by default. A name you add that the launching shell does not set reaches no agent: drains, orbit and orbit warn on stderr and record it on the run, and orbit reports it (start drains from a login shell). Clock-started runs read admitted names from ~/; see Scheduled credentials: clock.env. |
execution. |
string · Default: workspace-writeCodex sandbox mode: read-only, workspace-write, or danger-full-access. The global file orbit writes sets danger-full-access. |
execution. |
Advanced. string · Default: Unset Codex approval policy: untrusted, on-request, or never. |
execution. |
Advanced. integer · Default: 45Longest timeout one proc. call may use inside a managed activity, also capped by the activity’s remaining wall-clock budget (1–1440). Outside an activity the ceiling stays 60 seconds. |
execution. |
Advanced. integer · Default: 30Minutes a provider process may produce no output and use no CPU before its step fails as stalled and is retried. 0 disables the check and leaves only the wall-clock timeout. At most 1440. |
runtime. |
Advanced. integer · Default: 100Roll the operational orbit. past this size (MiB). At least 1 and at most runtime.. |
runtime. |
Advanced. integer · Default: 500Operational orbit. archive budget in MiB; the oldest are pruned first. |
runtime. |
integer · Default: 7Delete archives in both operational and agent feeds older than this. |
retention. |
integer · Default: 60Days orbit keeps audit rows (1–36500). Older command-audit rows, this workspace’s run-audit rows, and run-audit rows whose workspace id is no longer registered become reclaimable, along with audit blobs no remaining row names. Another registered workspace keeps its own window. Health > Events, Incidents, Denials, orbit and diagnostics friction lose older raw history, with no rollups. Durable lock-denial facts preserve Lock contention. Nothing is deleted until you run orbit or enable the store-gc routine. |
retention. |
integer · Default: 60Days after a run finishes before orbit may drop its pipeline state (30–36500). Run rows, steps, summaries and commit outcomes stay, preserving succeeded implement_one durations. Unregistered workspace ids are included. Consider 30 days on a large store; smaller values, including command overrides, are refused because Reliability Pipeline echo dedupe and forecast-accuracy per-drain limiter shares need 30 days of run state. Older raw checkpoints are lost. Resource minutes and admission forecasts older than 30 days are pruned separately, except rows kept at any age by count: each workspace, work class and complexity’s newest max(200, deliveries, the newest 10,000 forecasts, and host minutes from the oldest kept forecast onward. Auto-concurrency profiles and forecast accuracy keep working on those rows; older raw samples outside them are lost. |
retention. |
Advanced. integer · Default: 14Days after a task commit is applied before orbit may delete its commit journal row (1–36500). Recovery replays only prepared and committed rows, so an applied row is kept only for diagnosis; prepared, committed and aborted rows, and each task’s newest applied row, are never deleted. Unregistered workspace ids are included. Older applied-transition diagnostics are lost; published task history and recovery inputs stay. Nothing is deleted until you run orbit . |
retention. |
Advanced. integer · Default: 1073741824Warn from orbit when the host store file is larger than this many bytes and no store-gc routine is enabled (1 GiB). Zero warns for any non-empty file. The check stays ok under the threshold or while the routine is enabled. |
worktree. |
Advanced. array<string> · Default: ["target", Rebuildable paths in kept terminal run worktrees. Relative globs use * within a component and whole-component ** across components. An explicit list replaces earlier layers; [] disables reclamation. Absolute, parent and root-matching patterns fail config load. Only ignored or untracked paths without tracked content are deleted, after registration, confinement, symlink and worker checks. Inspect with orbit , apply with --confirm. |
worktree. |
Advanced. integer · Default: Unset Reclaim during admission when free MiB under the state directory falls below this threshold, oldest terminal worktrees first. Active runs and live or undecidable workers stay protected. |
worktree. |
Advanced. integer · Default: 336Hours a task must stay parked in someday, counted from that status change, before worktree GC removes a terminal run’s worktree serving it (0–876000). A live worker, an unsettled claim or a Git worktree lock keeps it. A clean worktree whose run branch holds commits no other ref reaches and origin lacks stays, branch included, as skipped:unpublished_. |
security_ |
Advanced. string · Default: moderateLowest severity the security alert sweep files for Dependabot and code-scanning alerts: low, moderate, high, or critical. Run input overrides the workspace value, which overrides the global one. Secret-scanning alerts are always filed. |
review. |
string · Default: offWhen automatic review runs before landing, by a fresh reviewer that fixes what it finds: off; before_ holds PR creation for the review; before_ opens the PR first, reviews it while hosted CI runs, and merges only the head the review settled, leaving the PR open with the task in review on any outcome but an approve. Refused for local-only delivery. A run keeps the value it was submitted with. Replaces the deprecated review. and review. booleans, which still load (both true fails the load: there is one review layer before landing). |
review. |
array<string> · Default: []Owner policy for the distributed drain: machine ids ( hm_) whose claimed leaves run before-landing review while this owner’s own deliveries do not. The owner resolves it for the caller’s machine when a follower probes or pulls, and the claim captures the result. Orbit fails to load config while review. is before_ and the list is non-empty. The machine label is chosen by the caller, so this is policy, not a security boundary. |
review. |
integer · Default: 30Time limit for one candidate’s before-PR or before-landing review (1–1440). Each candidate gets one review; a changed candidate is a new one. |
review. |
array<string> · Default: []Commands before-PR review may rerun on the host to confirm that a failed required check fails the same way on the pinned base. workflow. always count. A confirmed claim holds the task in the backlog until the base passes; a claim about any other command settles the review incomplete. A listed command’s failure cannot be recorded as a diagnostic: it needs a passing record or a confirmed claim. The list is captured when a delivery or claim is admitted. |
review. |
Advanced. bool · Default: falseReview findings must be verified before approval. When on, a review-filed bug (tagged code-review, delivery-code-review, security-review or qa-sweep) is refused at approval and promotion and kept out of drains until finding_ confirms it. When off, verification state is ignored. Read each time the gate is checked; toggle it with orbit or the dashboard’s Settings › Effective switch. Turning it on does not enable the finding_ routine. |
Agent stdout/stderr relay uses ~/ with a separate 200 MiB archive budget and 50 MiB file limit. Its output cannot evict operational events from orbit.. A full agent queue blocks the relay instead of dropping lines; the operational feed can still drop a line when its own queue is full. The dashboard log dock, /, /, and orbit merge the two active feeds; per-run captures remain available separately. runtime. applies to both feeds. Size limits still take precedence over age when either feed’s own budget is exhausted; seven days of operational history requires its non-relay volume to fit the operational budget.
Log snapshots retain the numeric operational offset and add agent_offset. Resume SSE with from and agent_from; split-feed event IDs carry both byte cursors as operational:agent. Custom log paths with a filename other than orbit. read that file alone.
Notes:
- Pool entries are
nameorname:weight, all bare or all weighted. An empty pool sends that tier todefault_crew. - Each resource-throttle percentage is 1–100, and each resume mark must be lower than its high-water mark.
orbitandrun ship --strict-worker-containment orbitturn on strict containment for one run, whateverrun auto --strict-worker-containment machine.says.worker_containment - After-landing review is not a config key. Turn it on with
orbit; it reviews landed deliveries in batches, observingauto-task toggle delivery-code-review on origin/when that remote exists.<branch> orbitandconfig show --all orbitreport both review switches, and doctor is not ok while the observed commit trails the remote-tracking head past the batch’s maximum wait.doctor operation.andreview_policy operation.are deprecated and still load with a warning:review_minutes before-prbecomesreview.,timing = "before_pr" after-landingturns on thedelivery-code-reviewauto-task until you toggle it yourself, andnoneturns neither on. A later release rejects them.operation.andreview_reviewer_starts operation.are retired and ignored with a warning.review_repair_cycles - The keys these consolidate still load with a deprecation warning:
operation.,review_crew workflow., thefinal_recovery_crews ci_failure_sweep,dependabotandmerged_head_repairpurpose pools,review.,before_pr review., a booleanbefore_landing machine.,worker_containment machine., andworker_containment_strict workflow.andvalidation_env. login_shell interactive. A file that also sets the replacement keeps the replacement’s value.orbitwrites each value under its replacement and then deletes the old key. A later release rejects them.doctor --fix-retired-config-keys
Crew fields are settable as crews., where the field is
model, provider, enabled, effort, description, tags, or env
(env requires --global); for
example, orbit . orbit cannot
create a crew: first add a [crews. table with model and provider.
An installed plugin’s declared settings are settable as plugins..
The scheduled worktree GC also reclaims declared output in every kept terminal
worktree. Candidate commits, branches, tracked files and unmatched .
evidence remain; resumed runs rebuild reclaimed output. Collection never runs a
cleanup command: checkout-authored Cargo configuration can redirect cargo
outside the worktree, and Make or npm scripts can execute code with host authority.
Declare only rebuildable paths; evidence matching a declared pattern is reclaimable.
Cost, task-store Codebase rankings, orbit and friction stats keep working
across audit, run and journal pruning. Upgrade backfills retained denial and commit
facts once before pruning; history deleted before upgrade cannot be recovered.
Tag instructions
Section titled “Tag instructions”Use [workflow. when a class of tasks needs extra
implementation, review or recovery guidance. For example, a custom
data-migration tag can select your repository’s migration checklist without
copying it into every task. A tag selects instructions; task descriptions,
comments and tags never supply the instruction text itself.
Edit . for workspace mappings, or ~/
for global mappings. orbit does not write these dynamic keys.
This example names files you supply in your own repository:
[workflow.tag_instructions.data-migration]implement = "agent-guidance/migration-implement.md"review = "agent-guidance/migration-review.md"recovery = "agent-guidance/migration-recovery.md"
[workflow.tag_instructions.ui]review = false # Disable the shipped reviewer instruction for this tag.For example, agent-guidance/ could contain:
For a data migration, identify the affected records and compatibility needs.Use the repository's migration checks and record their results.Describe rollback steps and any operator action needed before rollout.Create the review and recovery files too: the review checklist can ask for compatibility and rollback evidence; recovery guidance can ask the agent to preserve failure logs before making a repair. Commit all mapped files to the delivery’s base branch before using the tag on a task.
The role determines which activities receive the file:
implement:agent_implement, including QA sweeps taggedqa-sweep.review:agent_review_repairandreview_reconciliation_review.recovery:step_failure_recovery,final_recoveryandpr_conflict_recovery.
Scope, layering and defaults
Section titled “Scope, layering and defaults”Each value must be a repository-relative file path using / separators,
without absolute paths, empty path segments or .. A leading . is
accepted; other . segments are refused. false supplies no instruction
for that tag and role, including any shipped default. true is invalid.
Mappings layer per tag and role: a workspace review entry replaces the
global review entry for that tag, while its other roles and other global
tags remain inherited. An omitted role uses the inherited mapping, then
Orbit’s shipped default if one exists. A mapped file replaces that default
for the same tag and role.
Orbit ships these defaults:
no-diff-expected, forimplement: read-only handoff, with no workspace gates orno-diff..json skip-validation, forimplement: no local validation while every changed path matchesworkflow..light_delivery_paths ui, forimplementandreview: route implementers to a host with a verified browser kit and select the optional PR screenshots section. Visual task artifact evidence follows the workspace guide and the actual diff, not the tag.
Replacing or disabling a tag instruction changes the added prompt text.
Built-in safety, sandbox, gate and handoff rules still win over it. The full
screenshot rule also remains in the task-execution and task-review
references: it follows a visible change, even without the ui tag. An empty
optional PR screenshots section shows No and never
blocks opening.
Instruction mappings do not themselves grant a validation or review skip;
see Review-skip tags for review policy.
Tags are trimmed and lowercased for matching, deduplicated and applied in
sorted order. DATA-MIGRATION selects data-migration. Config validation
refuses blank tags, duplicate normalized tags, unknown roles, invalid values
or paths, and more than 32 mapped tags.
Committed text and refusals
Section titled “Committed text and refusals”Orbit reads each file from the delivery’s recorded base_sha, or from the
checkout’s HEAD when no worktree base was recorded. It never reads the
working copy. Changes committed or left uncommitted by that delivery cannot
alter the instructions it runs under.
The activity receives one Tag instructions section after its built-in instruction and any steering or inspection text. Each entry identifies its tag and source. An untagged task, or a tag with no mapping or shipped default for that role, adds nothing.
A refused mapping fails the activity before its provider starts; Orbit does not silently omit or truncate it. File refusals affect only tasks carrying the relevant tag:
tag_instruction_unreadable: the file is missing at the base revision, is not a file, is not UTF-8, or is empty/whitespace-only.tag_instruction_too_large: a file exceeds 8 KiB.tag_instructions_too_large: the combined tag instruction text for one prompt exceeds 16 KiB.
File errors identify the tag, role and path; the combined-size error names the role and byte count.
For a distributed claim, the owner captures instructions and refusals in
the claim receipt. It reads files from its last-fetched origin/ for
PR delivery, or the local base ref for local delivery; capture does not
fetch. An unavailable authoritative ref is captured as a refusal, without
falling back to another branch or HEAD. The leaf uses that capture rather
than its replica’s mappings or files, including any applicable refusal.
The receipt holds at most 64 KiB of instruction text; entries beyond that
limit are captured as refusals. A claim from an older owner with no capture
falls back to the replica’s mappings and files, with a warning.
Inspect applied instructions
Section titled “Inspect applied instructions”Use your run ID to inspect what each activity actually received:
orbit run show "$RUN_ID"orbit run show "$RUN_ID" --jsonThe text view prints a Tag line per dispatch that received
instructions. JSON, including the orbit. tool, exposes
tag_instructions with state observed, none (audit evidence exists but
no dispatch received instructions), or unavailable (no audit evidence).
The projection lists up to 32 dispatches and reports truncated when more
exist.
Each activity. audit event records the step,
activity, task, tag, role, source, SHA-256 and byte size, without the text.
The source is default or workspace; workspace records the repository
path and revision, including for a mapping inherited from global config.
Review-skip tags
Section titled “Review-skip tags”Use workflow. to let a workspace tag skip agent review for
a bounded class of low-risk changes, including paths outside
workflow.. For example, a comment-only maintenance task
can touch source files when a repository-specific guard verifies that the
non-comment content is unchanged.
Add a profile to ., or to ~/ for a
global policy:
[workflow.review_skip_tags.comment-hygiene]paths = ["src/**", "!src/generated/**"]guard = "scripts/check-comment-only-diff.sh"The script in this example is one you supply in your repository. Commit it
before relying on the profile: Orbit reads the guard from the delivery’s
base revision. File a maintenance task carrying comment-hygiene, with
acceptance criteria that limit it to comment changes. The profile permits
the review skip only if the candidate meets all of these conditions:
- Every task delivered by the candidate carries the mapped tag.
- Every changed path since the candidate’s synchronized base matches the
profile’s
paths. Deletions count; a rename checks both paths. An empty diff does not qualify. - The optional
guardexits 0. A missing guard at the base revision, a nonzero exit or a timeout retains normal review.
When a profile applies, it skips before-PR review, before-landing review (including host-specific review), and after-landing delivery-code-review sampling. A mapped tag skips review only: required validation, workspace gates and hosted CI still run.
Paths and guards
Section titled “Paths and guards”paths is a required, non-empty array of globs. * stays within one path
component; ** spans components; a leading ! excludes a match. A path
qualifies when a positive pattern matches and no exclusion matches.
["**"] allows every path; without a guard, matching paths and tags alone
permit the skip.
guard is an optional repository-relative executable path, not a shell
command. It cannot be absolute or contain .. Orbit supplies the
candidate’s base and head commits as its first two arguments and as
ORBIT_REVIEW_SKIP_BASE and ORBIT_REVIEW_SKIP_HEAD; the tag is available
as ORBIT_REVIEW_SKIP_TAG.
Orbit runs the base revision’s copy of the guard in a throwaway detached
checkout of the candidate’s head commit, using the same environment and
sandbox rules as required validation. The guard sees the candidate’s HEAD
and files without changing the owner’s branch or edits. A candidate cannot
weaken its own guard by editing that executable. The guard runs only after
all tasks and paths qualify.
Authority, layering and defaults
Section titled “Authority, layering and defaults”Only task filing (including an auto-task definition) or an operator update
can add a mapped tag. An agent update that adds one is refused; removal is
always allowed. Tag names match case-insensitively. Config validation
refuses blank or duplicate normalized tags, unknown profile fields, empty
or malformed paths, invalid guard paths, and more than 32 mappings. Errors
name the offending key.
Profiles layer per tag: workspace values override global values for the
same tag; omitted fields and other global profiles remain inherited. A
workspace paths array replaces the global array whole. With no mappings
in either file, none apply. The seeded global config includes profiles for the shipped
default auto-tasks’ auto-task:<name> provenance tags, restricted to
documentation and CI paths. Existing config files are not migrated; add
tables explicitly to opt in. Keep finding tags such as code-review and
security-review unmapped so fixes filed by those reviews retain review.
The built-in skip-review and skip-validation tags cannot be remapped.
They use workflow. and require every delivered task
to carry the relevant tag and every changed path to qualify. skip-review
skips agent review; skip-validation skips local validation. Neither skips
hosted CI. A custom profile does not grant skip-validation behavior.
Inspecting decisions and distributed claims
Section titled “Inspecting decisions and distributed claims”Run orbit to inspect the effective profiles under Review
skip tags; orbit exposes them as review_skip_tags.
Use orbit to inspect the candidate’s
light_delivery_applied or light_delivery_ignored event. Each decision is
recorded once per candidate, naming the tag, profile key and any failed
condition: an untagged task, an outside path, a failing guard or a guard
missing at the base.
Delivery automation dry runs defer mapped-profile decisions, including
profiles with no guard. They run no guard and record no history. Unless a
before-PR certificate or built-in skip-review rule already covers a
landing, its preview counts it as requiring review. Real evaluation may
therefore find less review work than the preview reports.
For a distributed claim, the owner captures its profiles alongside
workflow. in the claim’s validation gates. The follower
uses that captured copy, including the guard, rather than its own profiles.
The owner evaluates the handoff again, guard included, when accepting it
and records the decision in task history. An older owner that captures no
profiles leaves the follower with none, so no mapped tag applies.
Delivery templates
Section titled “Delivery templates”The [pr], [commit] and [branch] templates shape what a single-task
delivery publishes. With none set, Orbit’s own titles, bodies, commit messages
and orbit/ branches are unchanged. A delivery that bundles
several tasks keeps Orbit’s own shapes.
[pr]title_template = "{{type}}: {{title}} ({{ext.jira}})"body_template = "repo"agent_sections = ["Risk"]required_sections = ["Rollback"]missing_required_section = "draft"labels = ["orbit"]reviewers = ["my-org/reviewers"]
[commit]subject_template = "{{type}}({{ext.jira}}): {{title}} [{{task_id}}]"
[branch]name_template = "feature/{{ext.jira}}-{{task_id}}-{{hash}}"Placeholders are written {{name}}; spaces inside the braces are ignored.
A template naming an unknown placeholder fails the configuration load with
the key and the placeholder.
| Placeholder | Value | Where |
|---|---|---|
{{task_id}} |
The task’s ID | Everywhere |
{{title}} |
The task title | PR title and body, commit |
{{type}} |
feat, fix, refactor or chore, from the task type |
PR title and body, commit |
{{description}} |
The task description | PR title and body, commit |
{{acceptance_criteria}} |
The acceptance criteria as a checklist | PR title and body, commit |
{{execution_summary}} |
The implementer’s execution summary | PR title and body, commit |
{{validation}} |
The validation section | PR title and body, commit |
{{freshness}} |
The branch’s base and head and how far it is behind and ahead; empty in commits or with pr. |
PR title and body, commit |
{{task_url}} |
The task link from pr.; empty when unset |
PR title and body, commit |
{{ext. |
The ID of the task’s external ref for <system>, such as {{ext.; empty when the task has none |
Everywhere |
{{prefix}} |
The delivery’s branch prefix: orbit unless a job sets another |
Branch only |
{{hash}} |
Eight hex characters derived from the run, so a retry reuses the branch | Branch only |
pr. reads the repository’s pull request template
at the delivery’s base revision, never from the candidate branch. Orbit looks
for pull_request_template. (any letter case) in ., the
repository root and docs/, in that order, and uses its own layout when none
exists. A repository-relative path must exist at the base revision. When a
template is used, Orbit appends an HTML comment naming the task
(<!-- ). A repository template does not
have to contain {{task_id}}. Delivery still recognizes the pull request
from its branch, an Orbit author, and that task id as a whole token in the
body; the comment supplies the token. The template’s own text is left as
rendered.
The implementer fills agent and required sections by attaching a
pr-sections. task artifact shaped
{"sections": . Each heading replaces the body
under the matching Markdown heading of the template, matched without regard
to letter case. With Orbit’s own layout, filled sections are appended as
## . An unfilled optional section keeps the template’s text. An
unfilled required section is never published as an empty heading: with
missing_required_section the pull request opens as a draft with a
note under the heading, and with "refuse" no pull request opens. Both are
recorded in the task’s history. Orbit never merges a draft automatically.
With pr. on (auto turns it on for tasks tagged ui),
Orbit renders the optional ## section with a table of Before
and After images from the
task’s artifacts named
screenshots/; a name without a
suffix is an After shot. Only PNG, JPEG, GIF and WebP images up to 1 MiB are
published. Orbit commits them to refs/ on origin,
a ref that is never merged or deleted, and links each image by that commit’s
sha, so a merged pull request keeps its images. A template’s ##
heading is filled in place; otherwise the section is added. If no screenshot
is publishable, the section shows No ; no gap is
recorded, and pr. does not draft or refuse the PR
for it.
Commit subjects keep a 72-character budget: the title is shortened first, with
an ellipsis, and kept whole in the commit body. A subject template must carry
the [{{task_id}}] marker Orbit uses to recognise delivered work. A branch
template must contain {{task_id}} and {{hash}}; a branch name that would
contain ., start with -, or break Git’s ref-name rules is refused.
Workspace presets
Section titled “Workspace presets”orbit applies a preset, a TOML file a distribution ships to set a workspace up in one step. Pass --force as well to apply one to a registered workspace.
name = "graph-distro" # required: 1-64 of A-Z a-z 0-9 . _ -
[seeding] # seeding.routines / seeding.auto_tasksroutines = ["worktree_gc"]auto_tasks = "none"
[enable] # plugin-seeded definitions to switch onroutines = ["graph-refresh"]auto_tasks = ["graph-reindex"]
[config] # workspace keys `orbit config set` accepts"workflow.crew_performance" = "off"Orbit checks the whole file before it writes anything. It refuses an unknown field, a [config] key or value orbit would refuse, and an [enable] name that no enabled plugin seeded into this workspace. A preset never grants plugin permissions or enables a plugin, so a grant, permission, plugin or plugin_enablement field is refused too; run orbit yourself first. The [seeding] and [config] keys are written to . before the defaults are seeded. The preset’s name and the sha256: digest of the file are recorded in ., and orbit reports them along with the seeding policy.
Workspace build output
Section titled “Workspace build output”Configure the output locator your workspace’s build commands consume:
[workflow.validation_env]build_output_env = ["CARGO_TARGET_DIR"] # Rust workspaceA non-Rust workspace can use build_output_env and have its
validation command invoke cmake followed by
cmake . Orbit has no toolchain-specific output default.
The built-in list is empty. A workspace list replaces the global list, including
an explicit []. Empty configuration allocates no managed output and leaves
inherited variables unchanged. Names are trimmed, deduplicated and sorted;
they must be shell environment identifiers. Execution identity variables
(PATH, HOME, USER, LOGNAME, SHELL, TMPDIR, TMP, TEMP, PWD,
OLDPWD) and ORBIT_ names are reserved, ignoring case.
After environment resolution, every configured variable points to the same
absolute host-owned directory, outside worker-writable build areas:
<primary-repository>/.
Different source checkouts have separate output; repeated host checks for one
source can reuse it. Commands must honor the locator to preserve that isolation.
Bindings apply to required validation, host replay and detached evidence,
including baseline and recovery checks, on every platform. They do not apply
to agent sessions or ordinary local_shell steps. When a binding is in
effect, those commands also receive CARGO_INCREMENTAL= unless
workflow. is true. Logs record the resolved
build_output environment, directory, source and host context.
Managed cleanup retains active, leased or ambiguous output and can reclaim
eligible inactive output even after its checkout is gone. Existing
host-validation-targets remain attributable and reclaimable when bindings
are disabled. Enable the workspace’s output locator before rolling out a
runtime that removes implicit Cargo routing; keep active clients’ output
contexts intact. Configuration examples describe an operator rollout,
not an automatic change to the owning workspace’s file.
Root override
Section titled “Root override”Most commands accept the global --root option, which overrides the Orbit root
directory:
orbit --root /path/to/orbit-root task listRetired backend selection
Section titled “Retired backend selection”Agent activities always run through the provider’s CLI. The --backend flag,
ORBIT_BACKEND, [runtime] , and [crews. were
removed, since there is no backend left to select.
Orbit still recognizes old declarations, so nothing is silently reinterpreted:
cli is accepted and ignored, while http and auto are rejected with a
migration message. Remove the setting.
Workspace state
Section titled “Workspace state”Workspace state lives in the repository’s . directory, including
routine definitions in . and the auto-task definitions that
orbit manages. Global state lives under ~/, created by
orbit . See Scoping Rules.