Configuration Reference

August 23, 2026 · View on GitHub

This is the full configuration reference auto-generated from the settings schema. For a short onboarding guide, see Configuration.

For task-oriented guidance on the validation.* and e2e.* fields below — which surface to use, how to emit JUnit XML, how to capture artifacts, and the path rules those globs must obey — see Client Test Integrations.

Settings Reference

Auto-generated from settings schema.

Concurrency

FieldTypeDefaultDescriptionExamplesNotes
execution.concurrency.max_concurrent_sessionsinteger3Maximum parallel agent sessions1, 3, 5Set based on CPU, RAM, and how many concurrent sessions you can actively review.
execution.concurrency.session_timeout_minutesinteger45Kill sessions after this duration30, 45, 90Lower values fail faster for stuck sessions; higher values help long builds.
ui.queue_refresh_secondsinteger600How often to refresh the issue queue from GitHub (0 = manual only)0, 300, 600Use 0 to disable automatic refreshes and refresh manually in the UI.
ui.fetch_layer.enabledbooleanTrueEnable incremental refreshes between periodic full scanstrue, falseDisable to force a full GitHub queue scan on every refresh.
ui.fetch_layer.network_sync_secondsinteger60How often to run GitHub network sync cycles (independent of control tick)15, 60, 120Lower values improve freshness; higher values reduce GitHub API calls.
ui.fetch_layer.full_scan_interval_secondsinteger1800Run a full queue scan at this interval even when incremental mode is enabled600, 1800, 3600Lower values discover new work faster; higher values reduce API usage.
ui.fetch_layer.discovery_limitinteger25Max issues fetched per incremental discovery pass0, 25, 50Set to 0 to disable discovery during incremental refreshes.
ui.fetch_layer.max_hot_issues_per_cycleinteger40Max existing queue issues to refresh by direct issue lookup per cycle20, 40, 100Higher values improve freshness but increase API usage.
ui.fetch_layer.pr_scan_every_n_refreshesinteger2Scan review/rework PRs every N queue refreshes1, 2, 3Use 1 for max freshness; increase to reduce PR API calls.
ui.fetch_layer.dependency_scan_every_n_refreshesinteger1Recompute dependency blocking every N queue refreshes1, 2, 3Use 1 for immediate dependency updates; increase to reduce load.
ui.fetch_layer.visibility_aware_enabledbooleanFalsePrioritize refresh for issues currently visible in the Flow boardtrue, falseRequires browser visibility hints from the Flow board.
ui.fetch_layer.selective_sync_planner_enabledbooleanFalseEnable cross-entity selective sync planning for queue refresh cyclestrue, falseUse with telemetry to tune freshness versus API cost.
scheduling.default_priority_tierinteger1Default priority tier when none is specified (0-9)0, 1, 2Used when issue titles do not include a [P?-nnn] prefix.

E2E Runner

FieldTypeDefaultDescriptionExamplesNotes
e2e.enabledbooleanFalseAutomatically run E2E tests when main branch changestrue, falseKeep disabled on repos without stable E2E tests.
e2e.auto_run_interval_minutesinteger30Min interval between auto runs (0 = disable)0, 30, 60Set to 0 to disable automatic runs and trigger manually.
e2e.rolestringautoRole in multi-orchestrator setupauto, executor, reader, disabledUse executor on the single machine that should run tests.
e2e.occupies_session_slotbooleanFalseTreat an E2E run as a first-class worker workloadtrue, falseOff (default) keeps today's parallel behavior: E2E runs alongside agents. On, an E2E run counts against max_concurrent_sessions (not the reserved tech lead slot): it starts only when a worker slot is free, occupies one slot while running so the planner launches one fewer agent, and a due suite claims a slot ahead of new issues but behind in-flight reviews/reworks/validation-retries/tech_lead. Enable on resource-constrained machines where a second orchestrator workload would starve live agents.
e2e.runner_kindstringpytestExecution adapter used for E2E runspytest, commandUse pytest for live test events and retries; use command for arbitrary test runners that emit JUnit XML.
e2e.pytest_argsstringtests/e2e -vSpace-separated pytest arguments used when Runner Kind is pytesttests/e2e -v, tests/e2e -v --junitxml=.issue-orchestrator/e2e-results/pytest-junit.xmlUsed only when runner_kind=pytest. Add --junitxml and mirror the same path in junit_xml_paths when you want structured Results coverage in the dashboard.
e2e.commandstring``Space-separated command used when Runner Kind is command./scripts/run-e2e-suite.sh, npm run test:e2e -- --reporter=junitUsed when runner_kind=command. The command runs inside the E2E worktree.
e2e.junit_xml_pathsstring``Relative JUnit XML files or globs to ingest after the run (one per line).issue-orchestrator/e2e-results/pytest-junit.xml, test-results/junit.xmlLeave empty for log-only runs. The run fails loudly when this list as a whole resolves to no fresh files; a single non-matching entry is tolerated when another entry here matched. Use the same path you passed to pytest --junitxml or your external test runner.
e2e.artifact_pathsstring``Additional report or artifact files to expose in the UI (one per line)playwright-report/index.html, test-results/**/*.zip, reports/**/*.htmlPaths are resolved relative to the E2E worktree after the run completes. Use this for native HTML reports, traces, screenshots, and similar debugging artifacts.
e2e.allow_retry_oncebooleanTrueRetry failing tests to reduce flakinesstrue, falseApplies to runner_kind=pytest. Command runners ignore this and report the original command result.
e2e.stop_on_first_failurebooleanFalseAdd -x flag to stop test run on first failuretrue, falseApplies to runner_kind=pytest.
e2e.quarantine_filestringtests/e2e/quarantine.txtPath to quarantine file for skipping known-flaky teststests/e2e/quarantine.txt, tests/e2e/quarantine-local.txtDoctor verifies the file exists when E2E is enabled.
e2e.auto_quarantinebooleanTrueAutomatically add failing tests to the quarantine listtrue, falseSet false to require manual quarantine updates.
e2e.auto_create_issuesbooleanTrueAutomatically create GitHub issues for failed teststrue, falseDisable if you prefer manual triage of failures.
e2e.issue_agent_labelstringagent:backendAgent label assigned to auto-created failure issuesagent:backend, agent:tech-leadMust refer to an agent defined in the config.

Validation

FieldTypeDefaultDescriptionExamplesNotes
validation.quick.cmdstring (optional)NoneFast command run by coding-done and review exchange loops./scripts/validate-fast.sh, make test-fastKeep this fast enough for agent/reviewer back-and-forth. Put repo-specific policy checks such as banned test skips here.
validation.quick.timeout_secondsinteger300Timeout for quick validation120, 300, 600Lower values keep review loops responsive.
validation.publish.cmdstring (optional)NoneAuthoritative command run before push/publish./scripts/validate-pr.sh, ./scripts/validate-pr-suite.shThis should match the repo's authoritative local PR/pre-push gate. If make validate-pr wraps the cache-aware verify hook, configure a private non-recursive suite command instead.
validation.publish.timeout_secondsinteger1800Timeout for publish validation600, 1800, 3600Allow enough time for the deeper publish gate.
validation.publish.dirty_checkstringtrackedDirty-tree policy enforced before push actionstracked, unstaged, all, offUse tracked for normal agent worktrees. Use off only when another guard owns dirty-tree safety.
validation.junit_xml_pathsstring``Relative JUnit XML files or globs emitted by validation commandstest-results.xml, build/test-results/test/*.xmlWhen set, failed validations render a structured test-results view in the dashboard. Evidence only: reports that do not resolve or cannot be parsed leave the view empty without changing the validation command's own outcome.

Filtering

FieldTypeDefaultDescriptionExamplesNotes
filtering.labelstring (optional)NoneOnly process issues with this label (optional)bot-ready, needs-triageUse a single label to gate which issues are eligible.
filtering.milestonesstring``Milestones to process (comma-separated string or YAML list)M1, M2, ["M1", "M2"]Accepts a comma-separated string or a YAML list. Leave empty to allow all milestones.
filtering.exclude_labelsstring``Labels to exclude (comma-separated string or YAML list)test-data, skip, ["test-data", "skip"]Accepts a comma-separated string or a YAML list.
filtering.exclude_label_prefixesstring``Label prefixes to exclude (comma-separated string or YAML list)io:e2e:, ["io:e2e:", "tmp:"]Exclude issues that have any label starting with one of these prefixes.
filtering.fetch_limitinteger100Max issues to fetch per API call50, 100, 200Lower values reduce API load; higher values reduce pagination.
filtering.max_to_startinteger0Stop after starting N issues (0 = unlimited)0, 5, 10Useful for dry runs or throttling initial ramp-up.

Milestones

FieldTypeDefaultDescriptionExamplesNotes
milestones.orderstring``Explicit ordered list of milestone titles. Does not filter; unlisted milestones are appended using the milestone sort strategy.M1, M2Use to override the default sort order without filtering.

Review

FieldTypeDefaultDescriptionExamplesNotes
review.enabledbooleanFalseEnable automated code review workflowtrue, falseWhen enabled, a reviewer agent validates work agent PRs.
review.defaultstring (optional)NoneAgent label for code reviews (e.g., agent:reviewer)agent:reviewerMust match a label defined under agents.
review.max_rework_cyclesinteger5Max times to re-queue work agent before escalating0, 2, 5Set to 0 to disable rework cycles (immediate escalation).
review.internal.enabledbooleanFalseRequire each coder turn to iterate with an internally spawned reviewer before reporting successful completiontrue, falseThis lightweight coder-owned loop runs before the independent review exchange and does not replace it.
review.internal.max_roundsinteger5Maximum internal reviewer verdicts before the coder must report blocked3, 5, 10Reaching the limit never permits successful completion; the coder reports the turn as blocked.
review.internal.instructionsstring.io/internal-review.mdRepo-relative coder instructions for the internal review loop.io/internal-review.mdThe file is appended to coder prompts when internal review is enabled. Doctor verifies that it exists.
review.max_consecutive_publish_failuresinteger3Escalate to needs-human after this many consecutive push/PR creation failures2, 3, 5After N consecutive publish failures for the same issue, escalate to needs-human instead of publish-failed.
review.keep_current_approach_labelstringreviewer-keep-current-approachLabel that tells reviewer to avoid alternative approachesreviewer-keep-current-approachApplied to issues where stability is preferred over refactors.
review.retrospective.enabledbooleanFalseEnable review-first audits for existing implementationstrue, falseWhen enabled, issues carrying the retrospective trigger label are reviewed before any coder rework is launched.
review.retrospective.trigger_labelstringretrospective-reviewIssue label that queues review of an existing implementationretrospective-review, lack-of-review-redoThis label is the source of truth for review-first reruns. It may be applied to open or closed issues.
review.retrospective.reviewed_labelstringretrospective-reviewedIssue label added after retrospective review approvalretrospective-reviewedAdded to the issue when the reviewer approves the existing implementation.
review.retrospective.changes_requested_labelstringretrospective-changes-requestedIssue label added when retrospective review asks for coder reworkretrospective-changes-requestedAdded before the issue enters the normal coder rework and PR review lifecycle.
review.run_audit.min_runtime_minutesinteger20Automatically capture a run audit when runtime meets or exceeds this threshold (0 = disable)0, 20, 60Long runs get a persisted audit automatically; set to 0 to keep audits label-driven only.
review.run_audit.on_timeoutbooleanTrueAutomatically capture a run audit when a session times outtrue, falseKeep enabled to preserve diagnostics for timed-out sessions even when they did not exceed the slow-run threshold cleanly.
review.nits.default_policystringsurfaceDefault policy for reviewer nits before PR creationsurface, address, ignoreNits are non-blocking review items. surface records and shows them without rework; address includes them in the normal coder rework loop before PR creation; ignore records them only in review artifacts.
review.nits.by_agentobject``Per-coder-agent nit policy overrides{"agent:frontend": "address"}Keys are coder agent labels. Values override review.nits.default_policy for work produced by that agent.
review.exchange.modestringvia-local-loopReview exchange mode (via-mcp loop, local loop, or via-draft-pr review)via-local-loop, via-draft-pr, via-mcp, autoLocal loop is the default; use via-draft-pr for GitHub-mediated review cycles.
review.exchange.probe.schedulestringdailyWhen to run MCP round-trip validationdaily, startup, interval, manualUse manual to disable automatic probes and run on demand.
review.exchange.probe.interval_daysinteger1Interval for MCP round-trip validation when schedule=interval1, 7, 14Used only when schedule=interval.
review.exchange.loop.max_roundsinteger10Max coder/reviewer rounds before stopping the MCP loop5, 10, 20Higher values allow longer back-and-forth reviews.
review.exchange.loop.max_no_progressinteger2Max rounds where reviewer reports no progress before stopping1, 2, 3Limits loops when reviewer is not seeing improvements.
review.exchange.loop.require_validationbooleanTrueRequire a validation record before reviewer can approvetrue, falseDisable only if you accept reviewer approvals without validation.
review.max_consecutive_review_exchange_failuresinteger3Escalate to needs-human after this many consecutive review-exchange runs ended in reviewer/coder no-completion timeouts.2, 3, 5Bounds the runaway loop where a reviewer agent keeps timing out without writing its verdict file. Each consecutive no-completion summary on the same coding session counts; any clean (non-error) summary, scratch-reset boundary, or different reason resets the count.
review.post_publish.checks_pending_timeout_secondsnumber1800.0How long the orchestrator waits for required GitHub checks to finalize after reviewer approval before escalating to needs-human.1800, 3600, 5400Governs ONLY the 'waiting on CI' (WAIT_FOR_CHECKS) state: mergeable_state in {unstable, blocked} with the status-check rollup reading PENDING/EXPECTED/unknown is treated as 'CI still running', so the orchestrator waits rather than triggering rework and escalates a 'checks pending too long' timeout to needs-human only after this budget elapses. Two other post-approval states are NOT bounded by this timeout and escalate immediately. (1) Unreadable checks: when a decisive PR's status-check rollup cannot be read (the configured GitHub token is missing the Checks / commit-status read scope), the orchestrator does not wait — it raises a separate 'status_rollup_permission_denied' credential/scope diagnostic right away. Repeated rollup probing and logging for that case is throttled by the status-rollup permission backoff, a separate window, not by this pending-checks timeout. (2) Branch-protection blocks (rollup=SUCCESS but mergeable_state=blocked) also escalate immediately. Tune this only to control how long to wait on pending CI.
tech_lead.enabledbooleanFalseMaster switch for all new tech-lead worktrue, falseWhen false, the Repository Engine admits and plans no new tech-lead batch reviews, failure investigations, health reviews, stuck sweeps, manual runs, proposal reconciliation, or finding promotion. Detailed tech-lead settings remain configured so changing only this value back to true restores them. Already-running sessions may finish. If omitted from YAML, legacy configurations remain enabled when review.tech_lead_review_agent is configured.
review.tech_lead_review_agentstring (optional)NoneAgent for batch, health, and failure-investigation runsagent:tech-leadMust match a label defined under agents.
review.tech_lead_follow_up_agentstring (optional)NoneWorker agent that tech-lead-proposed follow-up issues route toagent:developerWhen a tech lead decision proposes a new follow-up issue, the orchestrator attaches this worker's agent label so normal discovery picks it up. Must match a worker label under agents. REQUIRED whenever tech_lead.enabled is true: an active tech lead can make create_issue proposals reachable, so leaving this unset fails startup validation instead of guessing by config order later.
review.tech_lead_review_thresholdinteger0Trigger tech lead after N PRs (0 = manual only)0, 5, 10Set to 0 to only trigger tech lead manually.
review.tech_lead_review_labelstring (optional)NoneLabel marking PRs that await tech lead review (optional)needs-tech-lead-reviewFalls back to code_reviewed_label when not set.
review.tech_lead_reviewed_labelstringtech-lead-reviewedLabel added to manifest PRs after tech lead completestech-lead-reviewedAdded to every PR in the tech lead manifest on success.
review.tech_lead_failed_labelstringtech-lead-failedLabel added to manifest PRs when a tech lead session failstech-lead-failedAdded to every PR in the tech lead manifest on failure.
review.tech_lead_review_on_failurebooleanTrueQueue a tech lead investigation when sessions failtrue, falseDisable to only tech lead PR batches, not failures.
tech_lead.dedup.enabledbooleanTrueCheck tech-lead follow-up proposals against all open issuestrue, falseWhen enabled, the orchestrator maintains a rebuildable local fingerprint cache of every open GitHub issue. Agent-cited duplicates are verified against that corpus, and the lexical backstop gates strong matches instead of filing unchecked duplicates. Disable only to intentionally bypass this safety gate.
tech_lead.dedup.similarity_thresholdnumber0.72Lexical similarity at or above which a follow-up is gated0.72, 0.8, 0.9Higher values reduce false-positive duplicate gates; lower values catch looser shared-vocabulary matches. Must be greater than 0.0 and at most 1.0.
tech_lead.authority.post_commentstringexecuteExecute or surface tech-lead-proposed diagnosis commentsexecute, proposeexecute posts the proposed comment; propose (shadow mode) surfaces it as would-have-done. Allowed values: execute, propose.
tech_lead.authority.create_issuestringexecuteExecute or gate tech-lead-proposed follow-up issuesexecute, proposeexecute files the proposed follow-up issue directly; propose files it as a gated proposal issue carrying the proposed-tech-lead label, inert until an operator removes that label (per-instance approval, #6778). Allowed values: execute, propose.
tech_lead.authority.flag_patternstringexecuteOpen/append durable pattern case-file issues for recurring cross-job patternsexecute, proposeexecute opens a durable pattern case-file issue the first time a pattern_signature is observed and appends an evidence comment to that same case file on every repeat observation (one case file per signature, #6781), so cross-job pattern evidence accrues for later health reviews to mine; it also emits the pattern trace event. propose (shadow mode) records only a would-have-done proposal and opens no case file. Every flag_pattern action MUST carry a pattern_signature (the case-file ledger key) or the tech lead decision is rejected. Allowed values: execute, propose.
tech_lead.authority.reset_retrystringproposeAct-level: reset-and-retry an issue from scratchpropose, executeexecute runs the reset+retry-from-scratch owner after re-validating the proposal's preconditions at execution time; stale proposals downgrade to a surfaced record (#6764). propose (default) files each proposal as a gated GitHub issue carrying the proposed-tech-lead label; removing the label is per-instance approval and triggers the same re-validated execution (#6778). Allowed values: execute, propose.
tech_lead.authority.kill_hung_sessionstringproposeAct-level: terminate a stuck sessionpropose, executepropose (default) files each proposal as a gated GitHub issue carrying the proposed-tech-lead label; removing the label is per-instance approval and executes the stored op after re-validating the target session is still active (#6778). execute terminates the exact session generation that was active when the decision was planned, after re-validating that it is still active. Allowed values: execute, propose.
tech_lead.findings.promotestringgatedPromote accrued pattern case files to runnable issuesgated, off, autoThe finding-promotion lane (#6957) turns a pattern case file that crossed its evidence threshold into a runnable issue in the repo that owns the fix. gated (default) files it carrying the proposed-tech-lead label, so operator approval is exactly one action — removing the label; auto files it ungated, immediately runnable in the target repo's own pipeline; off disables the lane entirely (no promotion issues and no loop-closure reads); the lane is also inert without tech_lead.enabled, since it actuates tech-lead findings. Only findings the tech lead classified fix:code are ever promoted. Routing is YAML-only: tech_lead.findings.route maps an area label to 'self' or an owner/repo target, with route.default as the catch-all. A route entry may also be a mapping ({repo, scope_label, agent_label}) declaring the target's scheduling labels; a 'self' route inherits filtering.label and review.tech_lead_follow_up_agent and must not redeclare them. Every foreign target is proven FILEABLE at startup, not at promotion time: reachable, issues enabled, and able to apply that route's labels plus create any it lacks (filing provisions labels before it opens the issue, and GitHub's triage role cannot create them). Allowed values: off, gated, auto.
tech_lead.findings.min_evidenceinteger2Observations a pattern must accrue before it can be promoted2, 3Counted from the orchestrator-owned pattern ledger, not from case-file comments, so human comments on a case file can never inflate it. A signature becomes promotable on the tick its observation count reaches this value.
tech_lead.findings.max_open_promotedinteger3Cap on in-flight promoted issues per target repository3, 1Storm backpressure: excess eligible signatures wait behind merges rather than flooding a repo. It also bounds the lane's GitHub reads — loop closure polls at most this many issues per target per tick, rotating across the durable ledger so lowering the cap after a larger cohort was filed slows coverage instead of exceeding the budget. Set tech_lead.findings.promote: off to disable the lane instead of setting this to 0.
tech_lead.health_review.interval_minutesinteger0Create a periodic health-review issue every N minutes (0 = disabled)0, 240ADR-0031 §4: when the interval elapses the orchestrator files a health-review anchor issue for the tech lead agent to walk the board snapshot. Requires a configured tech lead agent. 0 disables.
tech_lead.health_review.storm_thresholdinteger3Escalate this many recent blocked/failed issues into one health review (0 = disabled)0, 3, 5When the threshold is reached inside the configured storm window, the orchestrator creates one immediate, unscheduled health review and suppresses individual investigations for the cohort. The periodic interval remains independent.
tech_lead.health_review.storm_window_minutesinteger5Time window used to group blocked/failed problem issues1, 5, 15Problems observed within this window count toward the storm threshold. This window groups reactions; it does not delay ordinary failure investigations.
tech_lead.stuck_sweep.enabledbooleanFalseRe-inject terminally-stuck issues into reactive tech lead (0 = disabled)true, falseADR-0031 (#6823): a bounded, timer-gated backstop that finds open issues stuck in a terminal blocking state the normal loop cannot re-discover and re-injects each into the reactive-tech-lead pipeline as a recovered failure. Requires a configured tech lead agent and tech_lead_review_on_failure. Off by default.
tech_lead.stuck_sweep.interval_minutesinteger240Scan for stuck issues every N minutes (>= 1; disable via 'enabled')240, 60, 480How often the tech-lead sweep scans open issues for terminal stuck state. Only runs when the sweep is enabled. The scan is a broad exhaustive open-issue read, so this is a reconcile-for-strays BACKSTOP cadence, not a hot path — the 4h default keeps that read off the frequent paths; lower it only when faster recovery of stranded issues is worth the extra scans.
tech_lead.stuck_sweep.max_recovery_attemptsinteger3Re-inject a stuck issue at most this many times before escalating1, 3, 5After this many recovery attempts a stuck issue is no longer re-injected (no infinite loop); it is surfaced as exhausted and needs human attention. The counter is durable across restarts.
tech_lead.max_concurrentinteger (optional)NoneReserved concurrency slots for tech lead sessions (empty = share the worker budget)1, 2Empty (the default) shares the worker budget (execution.concurrency.max_concurrent_sessions): tech lead counts against it and is planned from the shared capacity, exactly as before. A positive value is a SEPARATE additive tech lead budget: tech lead sessions run from their own slots and are NOT subtracted from the worker budget, so the tech lead can run even when workers are saturated. Total live agents are then bounded at max_concurrent_sessions + tech_lead.max_concurrent.
tech_lead.max_expeditedinteger3Cap on outstanding tech-lead-expedited issues at the front of the worker queue (valid range 0-20; 0 disables the expedite lane)0, 3, 5When the tech lead files an urgent create_issue follow-up (expedite=true), the orchestrator jumps it to the front of the worker lane via the same priority queue operators use. This caps how many such issues can be outstanding at once so a noisy tech lead cannot starve normal work. Valid range is 0-20 (values outside it fail validation at both startup and in the settings form); further expedite requests past the cap are logged and fall back to normal priority. 0 disables expediting entirely. Under 'propose' authority an expedited follow-up jumps the lane only after its proposed-tech-lead gate is removed.

Merge Queue

FieldTypeDefaultDescriptionExamplesNotes
merge_queue.enabledbooleanFalseEnqueue approved PRs into GitHub's native merge queuetrue, falseWhen enabled, approved PRs that have cleared the orchestrator gate are enqueued into the provider's merge queue instead of being reworked merely for being behind base. Requires a repo whose branch protection has the merge queue configured.
merge_queue.providerstringgithubWhich merge queue backend to usegithubOnly GitHub's native merge queue is supported today; the value is constrained to the allowed set so the settings form rejects unsupported providers before they reach the running config.
merge_queue.enqueue_afterstringcode-reviewedOrchestrator gate that must pass before a PR is enqueuedcode-reviewed, tech-lead-reviewedNames the approval gate the PR must clear before enqueue. code-reviewed is the reviewer-approval gate.
merge_queue.failure_actionstringreworkHow to route a PR that fails the merge queuerework, needs_humanrework sends the PR back to a coding agent; needs_human escalates it for manual attention.

Goal Pilot

FieldTypeDefaultDescriptionExamplesNotes
goal_pilot.enabledbooleanFalseEnable the Goal Pilot AI controllertrue, falseEnable only when Goal Pilot prompts are configured and tested.
goal_pilot.agentstring (optional)NoneAgent label to run as Goal Pilot (e.g., agent:goal-pilot)agent:goal-pilotMust match a label defined under agents.
goal_pilot.approval_policystringjourneys_onlyHow Goal Pilot applies repo changesjourneys_only, gatekeeper, batchBatch mode bundles changes before approval; gatekeeper requests approval per change.
goal_pilot.approval_batch_sizeinteger10How many changes to bundle before approval (batch mode)5, 10, 25Used only when approval_policy=batch.
goal_pilot.approval_batch_window_minutesinteger60Max time to wait before asking for approval (batch mode)30, 60, 120Used only when approval_policy=batch.

Hooks

FieldTypeDefaultDescriptionExamplesNotes
hooks.ai_gate.interval_daysinteger7Run AI gate tests every N days (0 = disabled)0, 7, 30Set to 0 to disable periodic AI gate tests.
hooks.ai_gate.dangerous_allow_failurebooleanFalseIf true, warn only on AI gate failure; if false, block orchestrator starttrue, falseKeep false in production to enforce hook integrity.

Advanced

FieldTypeDefaultDescriptionExamplesNotes
sqlite_backup.enabledbooleanTrueEnable automatic backups of local SQLite statetrue, falseDisable only if backups are managed externally.
sqlite_backup.cadence_hoursinteger24Minimum hours between backups6, 24, 48Lower values increase backup frequency.
sqlite_backup.check_interval_minutesinteger60How often to check whether backups are due30, 60, 120Checks are lightweight; keep reasonably frequent.
sqlite_backup.retention_dailyinteger14Number of daily backups to keep7, 14, 30Set to 0 to disable daily backups.
sqlite_backup.retention_weeklyinteger8Number of weekly backups to keep4, 8, 12Set to 0 to disable weekly backups.
sqlite_backup.enforce_on_startupbooleanTrueIf cadence elapsed, force a backup on startuptrue, falseKeeps backups current if the process was stopped for a while.
timeline.max_recordsinteger5000Max timeline events kept per issue before trimming2000, 5000, 10000Set to 0 to disable trimming; higher values keep more history but grow state files faster.
provider_resilience.short_retry.max_attemptsinteger4Max attempts for transient provider failures2, 4, 6Higher values reduce failures but can prolong degraded runs.
provider_resilience.short_retry.initial_backoff_secondsinteger5Initial backoff for transient provider retries2, 5, 10Shorter backoffs retry faster but can amplify rate limits.
provider_resilience.short_retry.max_backoff_secondsinteger60Maximum backoff for transient provider retries30, 60, 120Caps exponential backoff to avoid excessive waiting.
provider_resilience.short_retry.jitterbooleanTrueApply full jitter to provider retry backofftrue, falseKeep enabled to avoid synchronized retry storms.
provider_resilience.circuit_breaker.cooldown_secondsinteger1800Cooldown window before retrying provider after outage600, 1800, 3600Longer cooldowns reduce repeated failures during incidents.
provider_resilience.circuit_breaker.max_cooldownsinteger6Maximum cooldown escalation steps3, 6, 8Limits how long we will keep extending cooldowns.
provider_resilience.circuit_breaker.labelstringblocked:provider-unavailableLabel applied when provider is unavailableblocked:provider-unavailableUse a label that is visible and searchable in your workflow.
provider_resilience.circuit_breaker.auth_failure_thresholdinteger1Consecutive provider auth failures before the circuit opens1, 2, 3The credential probe reads local CLI state and is deterministic, so one confirmed failure is normally enough. Raise it only if a provider's probe proves flaky.
provider_resilience.circuit_breaker.auth_cooldown_secondsinteger21600How long the circuit stays open after a provider auth failure3600, 21600, 86400An expired login only a human can fix, so this is much longer than the transient cooldown. Recovery does not wait it out, and does not need a successful session: while the circuit is open nothing launches, so the credential probe is what notices the re-authentication and clears the circuit before the next launch.
execution.session_interactions.enabledbooleanFalseAllow the orchestrator to auto-respond to trusted prompts in running agent sessionstrue, falseOff by default. Enable only if you want runner-managed prompt responses such as Claude's initial trust confirmation.
observability.session_no_output_secondsinteger120Emit event after this much idle time60, 120, 300Lower values surface silent sessions sooner.
observability.stale_escalation_ticksinteger0Escalate after K consecutive stale ticks (0 = disabled)0, 3, 5Set to 0 to disable automatic escalation.
observability.session_output_retention_daysinteger7Requested retention metadata for artifacts in an existing worktree0, 7, 30Worktree cleanup deletes these artifacts regardless of this value; the orchestrator does not archive them elsewhere.
observability.session_output_retention_tierstringhotClassification tag recorded in run manifestshot, coldMetadata only: this tag does not copy or move artifacts, and worktree cleanup deletes them.
ui.web_portinteger0Port for the web dashboard. 0 = auto-assign free port (requires restart)0, 8080, 3000, 90900 = auto-assign a free port. Use a fixed port for bookmarkable URLs.
ui.control_api_portinteger00 = auto-assign free port0, 19080, 190810 = auto-assign a free port. Allows multiple instances to coexist.
ui.browser_session.ttl_secondsinteger28800How long a Control Center login is valid before it expires and the operator must re-enter the admin token. Overridable at runtime via ISSUE_ORCHESTRATOR_SESSION_TTL_SECONDS.3600, 28800, 86400Minimum 60 s. Shorter values reduce the window a stolen cookie is useful; longer values reduce re-login friction.
ui.browser_session.maxinteger1024Deprecated. Browser sessions are now stateless cookies validated by HMAC, so there is no in-memory table to cap. The field is still accepted for back-compat with operator YAML but the value is ignored at runtime.1024Deprecated and ignored as of the cross-process session change. Stateless cookies removed the in-memory cap; this field exists only so existing YAML continues to validate. Safe to remove from your config.
ui.browser_session.sse_token_ttl_secondsinteger60How long a /api/sse-token response is valid before the browser must request a fresh one. Tokens are single-use within their window. Overridable via ISSUE_ORCHESTRATOR_SSE_TOKEN_TTL_SECONDS.30, 60, 300Shorter is safer — a token in an access log or Referer header becomes useless faster. The browser re-requests on every reconnect so operator-visible reconnection latency is unchanged.
ai_systems.allowedstring``Additional ai_system values allowed in config (comma-separated)codex, custom-systemUse to allow new providers beyond ai_systems.yaml.
worktrees.basestring../worktreesOutside-repository directory where git worktrees are created../worktrees/my-repo, ../worktrees, /tmp/worktrees/my-repoRelative paths are resolved from the repo root. New repository Setup defaults to ../worktrees/.
worktrees.base_branch_overridestring (optional)NoneOverride the base branch for worktree creation (auto-detect if unset)main, masterUse when your default branch is not auto-detected correctly.
worktrees.seed_refstring (optional)NoneOptional local ref used to seed fresh issue worktrees before review/PR creationHEAD, main, fc42d4cUse for local iteration when fresh issue worktrees should inherit a specific local ref.
worktrees.worktree_branch_on_recreatestringdeleteWhat to do when recreating a worktree with existing branchdelete, create_new_branchUse create_new_branch to keep the old branch intact.
worktrees.setupstring``Commands to run in each new worktree after creation (one per line)npm install, pip install -e '.[dev]', make setupEach command runs in the worktree directory. Leave empty if no setup needed. The orchestrator's own setup (hooks, coding-done, reviewer-done, Claude settings) is automatic.