Config reference
Location: ~/.sybra/config.yaml. Loaded once at startup. A small set of environment variables override selected fields at runtime — see Environment variables.
Complete schema
Section titled “Complete schema”# ─────────────────────────────────────────────────────────────# 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"Field reference
Section titled “Field reference”logging
Section titled “logging”| Field | Type | Notes |
|---|---|---|
level | string | debug, info, warn, error |
dir | path | Directory for rotating logs |
max_size_mb | int | Per-file rotation threshold |
max_files | int | Files kept after rotation |
| Field | Type | Notes |
|---|---|---|
enabled | bool | Writes ~/.sybra/logs/audit/*.ndjson |
retention_days | int | Files older than this are deleted |
| Field | Type | Notes |
|---|---|---|
provider | string | claude or codex |
model | string | Short alias or full model ID |
mode | string | headless or interactive |
max_concurrent | int | Global cap on simultaneous agents |
max_cost_usd | float | Per-run cost ceiling. Escalates on hit. |
max_turns | int | Per-run turn ceiling. Escalates on hit. |
require_permissions | bool | true pauses on every tool_use. false = skip-permissions. |
max_log_events | int | Events replayed from log when opening agent detail |
orchestrator
Section titled “orchestrator”| Field | Type | Notes |
|---|---|---|
auto_triage | bool | Let orchestrator classify new tasks |
auto_plan | bool | Auto-plan medium/large tasks |
todoist
Section titled “todoist”| Field | Type | Notes |
|---|---|---|
enabled | bool | Feature kill switch |
api_token | string | Personal API token. Override at runtime with SYBRA_TODOIST_TOKEN. |
project_id | string | Fetch from this Todoist project |
default_project_id | string | Target when creating tasks in Todoist |
poll_seconds | int | Poll interval |
github
Section titled “github”| Field | Type | Notes |
|---|---|---|
enabled | bool | Feature kill switch |
Credentials come from local gh auth — no token in config.
renovate
Section titled “renovate”| Field | Type | Notes |
|---|---|---|
enabled | bool | Feature kill switch |
author | string | GitHub username/login that authors Renovate PRs |
triage
Section titled “triage”| Field | Type | Notes |
|---|---|---|
enabled | bool | Auto-triage poller (independent of orchestrator) |
poll_seconds | int | Poll interval |
model | string | Model for the triage classifier |
monitor
Section titled “monitor”| Field | Type | Notes |
|---|---|---|
enabled | bool | In-process anomaly detector |
interval_seconds | int | Poll interval |
model | string | Model used for remediation decisions |
issue_cooldown_minutes | int | Same issue won’t be re-posted within this window |
dispatch_limit | int | Max remediation agents per cycle |
stuck_human_hours | float | Flag human-required tasks older than this |
lost_agent_minutes | int | Agent running past this with no heartbeat = “lost” |
failure_rate_threshold | float | Flag rolling failure rate above this (0.0–1.0) |
bottleneck_hours | map | Per-status hours in column before flagging |
issue_label | string | Label applied to meta issues |
issue_repo | string | Repo where meta issues are posted |
self_monitor
Section titled “self_monitor”| Field | Type | Notes |
|---|---|---|
enabled | bool | Hourly retrospective judge |
interval_hours | float | Tick interval |
judge_model | string | Fast model scoring runs |
synthesizer_model | string | Strong model consolidating findings |
max_issues_per_run | int | Ceiling on findings per tick |
max_auto_actions_per_day | int | Ceiling on auto-remediations per day |
auto_act_categories | list | Finding types eligible for auto-action |
dry_run | bool | true = report only, never act |
suppression_days | int | Suppress duplicates within this window |
suppression_threshold | int | Seen this many times = suppress |
max_cost_per_tick_usd | float | Budget cap per tick |
judge_parallelism | int | Concurrent judge runs per tick |
providers
Section titled “providers”| Field | Type | Notes |
|---|---|---|
health_check.enabled | bool | Periodic Claude/Codex probe |
health_check.interval_seconds | int | Probe interval |
claude.enabled / codex.enabled | bool | Individual provider kill switch |
claude.rate_limit_cooldown_seconds | int | After 429, wait this long before retrying |
auto_failover | bool | On provider fail, fall back to the other |
project_types
Section titled “project_types”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.
Directory overrides
Section titled “Directory overrides”Paths support ~ expansion. Use to point Sybra at a shared NFS mount for multi-machine setups (route carefully via project_types).
Validation
Section titled “Validation”- 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.