Skip to content

Config reference

Location: ~/.sybra/config.yaml. Loaded once at startup. A small set of environment variables override selected fields at runtime — see Environment variables.

# ─────────────────────────────────────────────────────────────
# Logging
# ─────────────────────────────────────────────────────────────
logging:
level: "info" # debug | info | warn | error
dir: "~/.sybra/logs"
max_size_mb: 50
max_files: 5
# ─────────────────────────────────────────────────────────────
# Audit
# ─────────────────────────────────────────────────────────────
audit:
enabled: true
retention_days: 30
# ─────────────────────────────────────────────────────────────
# Notifications
# ─────────────────────────────────────────────────────────────
notification:
desktop: true
# ─────────────────────────────────────────────────────────────
# Agent defaults (overridable per task / per workflow step)
# ─────────────────────────────────────────────────────────────
agent:
provider: "claude" # claude | codex
model: "sonnet" # opus | sonnet | haiku | full model ID
mode: "headless" # headless | interactive
max_concurrent: 3
max_cost_usd: 5.0
max_turns: 150
require_permissions: true # null = true, false = --dangerously-skip-permissions
max_log_events: 500 # events returned when replaying log
research_machine_dir: ""
# ─────────────────────────────────────────────────────────────
# Orchestrator
# ─────────────────────────────────────────────────────────────
orchestrator:
auto_triage: true
auto_plan: true
# ─────────────────────────────────────────────────────────────
# Integrations
# ─────────────────────────────────────────────────────────────
todoist:
enabled: false
api_token: ""
project_id: ""
default_project_id: ""
poll_seconds: 120
github:
enabled: true
renovate:
enabled: true
author: "app/renovate"
# ─────────────────────────────────────────────────────────────
# Background workers
# ─────────────────────────────────────────────────────────────
triage:
enabled: false
poll_seconds: 60
model: "sonnet"
monitor:
enabled: true
interval_seconds: 300
model: "sonnet"
issue_cooldown_minutes: 30
dispatch_limit: 3
stuck_human_hours: 8.0
lost_agent_minutes: 15
failure_rate_threshold: 0.3
bottleneck_hours:
plan-review: 4.0
human-required: 8.0
in-progress: 6.0
default: 12.0
issue_label: "monitor"
issue_repo: "Automaat/sybra"
self_monitor:
enabled: false
interval_hours: 6.0
judge_model: "claude-haiku-4-5-20251001"
synthesizer_model: "claude-sonnet-4-6"
max_issues_per_run: 5
max_auto_actions_per_day: 3
auto_act_categories:
- stuck_task
- workflow_loop
- cost_outlier
- triage_mismatch
dry_run: true
issue_cooldown_hours: 24.0
issue_label: "selfmonitor"
max_cost_per_tick_usd: 2.0
judge_parallelism: 4
suppression_days: 7
suppression_threshold: 3
# ─────────────────────────────────────────────────────────────
# Providers
# ─────────────────────────────────────────────────────────────
providers:
health_check:
enabled: true
interval_seconds: 300
claude:
enabled: true
rate_limit_cooldown_seconds: 900
codex:
enabled: true
rate_limit_cooldown_seconds: 900
auto_failover: true
# ─────────────────────────────────────────────────────────────
# Metrics
# ─────────────────────────────────────────────────────────────
metrics:
enabled: false
# ─────────────────────────────────────────────────────────────
# Per-machine routing
# ─────────────────────────────────────────────────────────────
project_types: [] # empty = all; ["work", "pet"] = only these
# ─────────────────────────────────────────────────────────────
# Directory overrides
# ─────────────────────────────────────────────────────────────
tasks_dir: "~/.sybra/tasks"
skills_dir: "~/.claude/skills"
projects_dir: "~/.sybra/projects"
clones_dir: "~/.sybra/clones"
worktrees_dir: "~/.sybra/worktrees"
loop_agents_dir: "~/.sybra/loop-agents"
FieldTypeNotes
levelstringdebug, info, warn, error
dirpathDirectory for rotating logs
max_size_mbintPer-file rotation threshold
max_filesintFiles kept after rotation
FieldTypeNotes
enabledboolWrites ~/.sybra/logs/audit/*.ndjson
retention_daysintFiles older than this are deleted
FieldTypeNotes
providerstringclaude or codex
modelstringShort alias or full model ID
modestringheadless or interactive
max_concurrentintGlobal cap on simultaneous agents
max_cost_usdfloatPer-run cost ceiling. Escalates on hit.
max_turnsintPer-run turn ceiling. Escalates on hit.
require_permissionsbooltrue pauses on every tool_use. false = skip-permissions.
max_log_eventsintEvents replayed from log when opening agent detail
FieldTypeNotes
auto_triageboolLet orchestrator classify new tasks
auto_planboolAuto-plan medium/large tasks
FieldTypeNotes
enabledboolFeature kill switch
api_tokenstringPersonal API token. Override at runtime with SYBRA_TODOIST_TOKEN.
project_idstringFetch from this Todoist project
default_project_idstringTarget when creating tasks in Todoist
poll_secondsintPoll interval
FieldTypeNotes
enabledboolFeature kill switch

Credentials come from local gh auth — no token in config.

FieldTypeNotes
enabledboolFeature kill switch
authorstringGitHub username/login that authors Renovate PRs
FieldTypeNotes
enabledboolAuto-triage poller (independent of orchestrator)
poll_secondsintPoll interval
modelstringModel for the triage classifier
FieldTypeNotes
enabledboolIn-process anomaly detector
interval_secondsintPoll interval
modelstringModel used for remediation decisions
issue_cooldown_minutesintSame issue won’t be re-posted within this window
dispatch_limitintMax remediation agents per cycle
stuck_human_hoursfloatFlag human-required tasks older than this
lost_agent_minutesintAgent running past this with no heartbeat = “lost”
failure_rate_thresholdfloatFlag rolling failure rate above this (0.0–1.0)
bottleneck_hoursmapPer-status hours in column before flagging
issue_labelstringLabel applied to meta issues
issue_repostringRepo where meta issues are posted
FieldTypeNotes
enabledboolHourly retrospective judge
interval_hoursfloatTick interval
judge_modelstringFast model scoring runs
synthesizer_modelstringStrong model consolidating findings
max_issues_per_runintCeiling on findings per tick
max_auto_actions_per_dayintCeiling on auto-remediations per day
auto_act_categorieslistFinding types eligible for auto-action
dry_runbooltrue = report only, never act
suppression_daysintSuppress duplicates within this window
suppression_thresholdintSeen this many times = suppress
max_cost_per_tick_usdfloatBudget cap per tick
judge_parallelismintConcurrent judge runs per tick
FieldTypeNotes
health_check.enabledboolPeriodic Claude/Codex probe
health_check.interval_secondsintProbe interval
claude.enabled / codex.enabledboolIndividual provider kill switch
claude.rate_limit_cooldown_secondsintAfter 429, wait this long before retrying
auto_failoverboolOn provider fail, fall back to the other

Empty = accept all project types on this machine. Non-empty = only tasks tied to projects with matching type run here. See Orchestrator and automation → Per-machine routing.

Paths support ~ expansion. Use to point Sybra at a shared NFS mount for multi-machine setups (route carefully via project_types).


  • Unknown field → warning in log, ignored
  • Wrong type → Sybra falls back to last-known-good config
  • Missing required (schema-level) → startup fails with a clear error

On startup, Sybra logs an app.automations summary with enabled toggles. Check it to verify the role of each machine.


Delete ~/.sybra/config.yaml. Sybra writes a fresh default on next start.