Every option
Every option has a default, so a factory that sets nothing runs the default profile. This
page is generated from factory/options.tsv,
the same registry the onboarding reads, so it cannot disagree with it.
Scope says where an option is set: in each service repo’s .xal/factory.conf, or in
the ops repo’s, which is also the factory profile every new service starts from. A value
set in a reviewed file, not a settings page, is the point: see
ADR-0009.
xal-factory config explain <key> prints any row below in the terminal.
factory
Section titled “factory”factory.ops_repo
Section titled “factory.ops_repo”The owner/name of the ops repo: admitted specs, the spend ledger, the idea inbox. No script can guess it.
| Default | Choices | Scope | Onboarding asks |
|---|---|---|---|
required |
any text | service | yes |
Change it later: xal-factory config set factory.ops_repo <owner>/<name>
factory.process_repo
Section titled “factory.process_repo”The factory repo services vendor the spec from and the reader is pinned in. Change it only if you run a fork.
| Default | Choices | Scope | Onboarding asks |
|---|---|---|---|
xodeeq/xal-factory |
any text | service | no |
Change it later: xal-factory config set factory.process_repo <owner>/<name>
factory.escalation_label
Section titled “factory.escalation_label”The label a stopped pull request gets when the pipeline hands it to a person.
| Default | Choices | Scope | Onboarding asks |
|---|---|---|---|
needs-human |
any text | service | yes |
Change it later: xal-factory config set factory.escalation_label <label>
stack.default_lang
Section titled “stack.default_lang”The language xal-factory seed pre-selects. The service’s stack ADR is still required: this is a fallback, not a decision.
| Default | Choices | Scope | Onboarding asks |
|---|---|---|---|
go |
go | ops | yes |
Change it later: xal-factory config set stack.default_lang <lang>
models
Section titled “models”models.driver
Section titled “models.driver”The model that builds plan sessions. The strongest is the default because the gate cannot see a test that proves nothing.
| Default | Choices | Scope | Onboarding asks |
|---|---|---|---|
claude-opus-5-5 |
any text | service | yes |
Change it later: xal-factory config set models.driver <model-id>
models.reader
Section titled “models.reader”The model that reads every session PR on Spec and Standards before it can merge.
| Default | Choices | Scope | Onboarding asks |
|---|---|---|---|
claude-opus-5-5 |
any text | service | no |
Change it later: xal-factory config set models.reader <model-id>
budget
Section titled “budget”budget.driver_max_turns
Section titled “budget.driver_max_turns”Turn cap per driver run: a loop guard, not a budget.
| Default | Choices | Scope | Onboarding asks |
|---|---|---|---|
200 |
a positive whole number | service | no |
Change it later: xal-factory config set budget.driver_max_turns <n>
budget.reader_max_turns
Section titled “budget.reader_max_turns”Turn cap per reader run.
| Default | Choices | Scope | Onboarding asks |
|---|---|---|---|
80 |
a positive whole number | service | no |
Change it later: xal-factory config set budget.reader_max_turns <n>
plan.spend_ceiling_usd
Section titled “plan.spend_ceiling_usd”Dollar ceiling per plan, checked against the ledger before every session. Spend is bounded to ceiling + one session.
| Default | Choices | Scope | Onboarding asks |
|---|---|---|---|
600 |
a positive whole number | service | yes |
Change it later: xal-factory config set plan.spend_ceiling_usd <n> (applies to plans emitted after)
plan.session_ceiling_usd
Section titled “plan.session_ceiling_usd”Dollar ceiling per session across its retries.
| Default | Choices | Scope | Onboarding asks |
|---|---|---|---|
70 |
a positive whole number | service | yes |
Change it later: xal-factory config set plan.session_ceiling_usd <n> (applies to plans emitted after)
plan.retry_cap
Section titled “plan.retry_cap”Retries per session before it is escalated to a person.
| Default | Choices | Scope | Onboarding asks |
|---|---|---|---|
2 |
a positive whole number | service | no |
Change it later: xal-factory config set plan.retry_cap <n> (applies to plans emitted after)
reader
Section titled “reader”reader.ref
Section titled “reader.ref”The plugin release the reader is read from. Pinned, so an unreleased edit never changes the merge gate.
| Default | Choices | Scope | Onboarding asks |
|---|---|---|---|
xal-factory--v0.2.0 |
any text | service | no |
Change it later: xal-factory config set reader.ref xal-factory--v<version>
ops.ledger_path
Section titled “ops.ledger_path”Where in the ops repo the spend ledger lives.
| Default | Choices | Scope | Onboarding asks |
|---|---|---|---|
status/costs.jsonl |
any text | service | no |
Change it later: xal-factory config set ops.ledger_path <path>
pipeline
Section titled “pipeline”pipeline.driver
Section titled “pipeline.driver”The driver: builds one plan session headless when dispatched (/run-session). Off means sessions are built by hand.
| Default | Choices | Scope | Onboarding asks |
|---|---|---|---|
on |
on, off | service | yes |
Change it later: xal-factory enable driver / xal-factory disable driver
pipeline.chain
Section titled “pipeline.chain”The chain: after a session merges, dispatches the next; retries a failure, then escalates. Off means every session is dispatched by a person.
| Default | Choices | Scope | Onboarding asks |
|---|---|---|---|
off |
on, off | service | yes |
Change it later: xal-factory enable chain / xal-factory disable chain
pipeline.auto_merge
Section titled “pipeline.auto_merge”What may merge with no person present. off disables merge.yml; the others set the plan’s autonomy_level. infra, billing, public-surface and delete never merge unattended.
| Default | Choices | Scope | Onboarding asks |
|---|---|---|---|
off |
off, code-only, code-and-tests-pre-deployment | service | yes |
Change it later: xal-factory config set pipeline.auto_merge <level> (a plan's own autonomy_level is the owner's approval)
pipeline.reader
Section titled “pipeline.reader”The reader on every session PR. Auto-merge requires it.
| Default | Choices | Scope | Onboarding asks |
|---|---|---|---|
on |
on, off | service | no |
Change it later: xal-factory enable reader / xal-factory disable reader
claude
Section titled “claude”claude.mention_workflow
Section titled “claude.mention_workflow”@claude in issues and PRs.
| Default | Choices | Scope | Onboarding asks |
|---|---|---|---|
on |
on, off | service | no |
Change it later: xal-factory enable mention / xal-factory disable mention
claude.pr_review
Section titled “claude.pr_review”The generic review bot on non-session PRs.
| Default | Choices | Scope | Onboarding asks |
|---|---|---|---|
on |
on, off | service | no |
Change it later: xal-factory enable review / xal-factory disable review
ci.runner
Section titled “ci.runner”Where every workflow runs. self-hosted needs a registered runner; unset means hosted minutes.
| Default | Choices | Scope | Onboarding asks |
|---|---|---|---|
ubuntu-latest |
ubuntu-latest, self-hosted | service | no |
Change it later: xal-factory config set ci.runner self-hosted
deploy
Section titled “deploy”deploy.target
Section titled “deploy.target”Where deploy.yml deploys. none refuses loudly. Turning one on is a person’s act (docs/deploy.md).
| Default | Choices | Scope | Onboarding asks |
|---|---|---|---|
none |
none, fly | service | no |
Change it later: xal-factory config set deploy.target fly
deploy.url
Section titled “deploy.url”The live base URL the smoke gate drives after a deploy.
| Default | Choices | Scope | Onboarding asks |
|---|---|---|---|
none |
any text | service | no |
Change it later: xal-factory config set deploy.url https://<host>
ops.status_nudge
Section titled “ops.status_nudge”The weekday nudge: status/current.md rendered into a pinned issue.
| Default | Choices | Scope | Onboarding asks |
|---|---|---|---|
on |
on, off | ops | yes |
Change it later: xal-factory enable nudge / xal-factory disable nudge
ops.idea_inbox
Section titled “ops.idea_inbox”The idea inbox: an open issue labelled ideas that /idea posts to.
| Default | Choices | Scope | Onboarding asks |
|---|---|---|---|
on |
on, off | ops | yes |
Change it later: xal-factory config set ops.idea_inbox on\|off