{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://example.invalid/pi-crew.schema.json",
  "title": "pi-crew config",
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "asyncByDefault": {
      "type": "boolean",
      "description": "Run team workflows in detached async mode by default when the tool call omits async."
    },
    "executeWorkers": {
      "type": "boolean",
      "description": "Allow real child Pi workers. Defaults to true; set false or use PI_CREW_EXECUTE_WORKERS=0/PI_TEAMS_EXECUTE_WORKERS=0 to force scaffold mode."
    },
    "notifierIntervalMs": {
      "type": "number",
      "minimum": 1000,
      "description": "Polling interval for async completion notifications."
    },
    "requireCleanWorktreeLeader": {
      "type": "boolean",
      "description": "Require a clean leader git repository before provisioning worktrees."
    },
    "autonomous": {
      "type": "object",
      "additionalProperties": false,
      "description": "Autonomous team routing policy injected into the agent system prompt.",
      "properties": {
        "profile": { "type": "string", "enum": ["manual", "suggested", "assisted", "aggressive"] },
        "enabled": { "type": "boolean" },
        "injectPolicy": { "type": "boolean" },
        "preferAsyncForLongTasks": { "type": "boolean" },
        "allowWorktreeSuggestion": { "type": "boolean" },
        "magicKeywords": {
          "type": "object",
          "additionalProperties": {
            "type": "array",
            "items": { "type": "string" }
          }
        }
      }
    },
    "limits": {
      "type": "object",
      "additionalProperties": false,
      "description": "Runtime safety limits for crew workers and policy decisions.",
      "properties": {
        "maxConcurrentWorkers": { "type": "integer", "minimum": 1 },
        "allowUnboundedConcurrency": { "type": "boolean" },
        "maxTaskDepth": { "type": "integer", "minimum": 1 },
        "maxChildrenPerTask": { "type": "integer", "minimum": 1 },
        "maxRunMinutes": { "type": "integer", "minimum": 1 },
        "maxRetriesPerTask": { "type": "integer", "minimum": 1 },
        "maxTasksPerRun": { "type": "integer", "minimum": 1 },
        "heartbeatStaleMs": { "type": "integer", "minimum": 1 }
      }
    },
    "runtime": {
      "type": "object",
      "additionalProperties": false,
      "description": "Crew runtime selection and live-agent behavior knobs.",
      "properties": {
        "mode": { "type": "string", "enum": ["auto", "scaffold", "child-process", "live-session"] },
        "preferLiveSession": { "type": "boolean" },
        "allowChildProcessFallback": { "type": "boolean" },
        "maxTurns": { "type": "integer", "minimum": 1 },
        "graceTurns": { "type": "integer", "minimum": 1 },
        "inheritContext": { "type": "boolean" },
        "promptMode": { "type": "string", "enum": ["replace", "append"] },
        "groupJoin": { "type": "string", "enum": ["off", "group", "smart"] },
        "groupJoinAckTimeoutMs": { "type": "integer", "minimum": 1 },
        "requirePlanApproval": { "type": "boolean" },
        "completionMutationGuard": { "type": "string", "enum": ["off", "warn", "fail"] },
        "effectivenessGuard": { "type": "string", "enum": ["off", "warn", "block", "fail"] }
      }
    },
    "control": {
      "type": "object",
      "additionalProperties": false,
      "description": "Agent control-plane settings for attention/stale activity detection.",
      "properties": {
        "enabled": { "type": "boolean" },
        "needsAttentionAfterMs": { "type": "integer", "minimum": 1 }
      }
    },
    "worktree": {
      "type": "object",
      "additionalProperties": false,
      "description": "Worktree setup hooks and dependency-linking options.",
      "properties": {
        "setupHook": { "type": "string", "minLength": 1 },
        "setupHookTimeoutMs": { "type": "integer", "minimum": 1 },
        "linkNodeModules": { "type": "boolean" }
      }
    },
    "agents": {
      "type": "object",
      "additionalProperties": false,
      "description": "Builtin agent override settings.",
      "properties": {
        "disableBuiltins": { "type": "boolean" },
        "overrides": {
          "type": "object",
          "additionalProperties": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "disabled": { "type": "boolean" },
              "model": { "oneOf": [{ "type": "string", "minLength": 1 }, { "const": false }] },
              "fallbackModels": { "oneOf": [{ "type": "array", "items": { "type": "string", "minLength": 1 } }, { "const": false }] },
              "thinking": { "oneOf": [{ "type": "string", "minLength": 1 }, { "const": false }] },
              "tools": { "type": "array", "items": { "type": "string", "minLength": 1 } }
            }
          }
        }
      }
    },
    "ui": {
      "type": "object",
      "additionalProperties": false,
      "description": "Pi UI settings for the crew widget, dashboard, and optional powerbar segments.",
      "properties": {
        "widgetPlacement": { "type": "string", "enum": ["aboveEditor", "belowEditor"] },
        "widgetMaxLines": { "type": "integer", "minimum": 1, "maximum": 50 },
        "powerbar": { "type": "boolean" },
        "dashboardPlacement": { "type": "string", "enum": ["center", "right"], "default": "right", "description": "Place /team-dashboard as a centered overlay or right-side panel." },
        "dashboardWidth": { "type": "integer", "minimum": 32, "maximum": 120, "default": 56 },
        "dashboardLiveRefreshMs": { "type": "integer", "minimum": 250, "maximum": 60000, "default": 1000 },
        "autoOpenDashboard": { "type": "boolean", "default": false, "description": "Opt in to automatically opening the live right sidebar for foreground runs when UI is available. Disabled by default because Pi overlays are modal in some terminals." },
        "autoOpenDashboardForForegroundRuns": { "type": "boolean", "default": true },
        "showModel": { "type": "boolean", "default": true, "description": "Show worker model attempts in dashboard agent rows." },
        "showTokens": { "type": "boolean", "description": "Show token usage in dashboard agent rows." },
        "showTools": { "type": "boolean", "description": "Show tool activity in dashboard agent rows." },
        "transcriptTailBytes": { "type": "integer", "minimum": 1024, "maximum": 52428800, "default": 262144, "description": "Maximum transcript bytes to parse by default; use viewer hotkey f to load full content." },
        "mascotStyle": { "type": "string", "enum": ["cat", "armin"] },
        "mascotEffect": { "type": "string", "enum": ["random", "none", "typewriter", "scanline", "rain", "fade", "crt", "glitch", "dissolve"] }
      }
    },
    "tools": {
      "type": "object",
      "additionalProperties": false,
      "description": "Public tool registration and foreground result behavior.",
      "properties": {
        "enableClaudeStyleAliases": { "type": "boolean", "default": true },
        "enableSteer": { "type": "boolean", "default": true },
        "terminateOnForeground": { "type": "boolean", "default": false, "description": "Opt in to returning terminate:true from foreground Agent/crew_agent calls after the child result is available." }
      }
    },
    "telemetry": {
      "type": "object",
      "additionalProperties": false,
      "description": "Pi-crew telemetry event controls.",
      "properties": {
        "enabled": { "type": "boolean", "default": true }
      }
    },
    "policy": {
      "type": "object",
      "additionalProperties": false,
      "description": "Operator policy gates for high-risk pi-crew actions.",
      "properties": {
        "requireIntentForDestructiveActions": { "type": "boolean", "default": false, "description": "Require config.intent or config._intent for destructive actions such as cancel, delete, forget, prune, and forced cleanup." }
      }
    },
    "notifications": {
      "type": "object",
      "additionalProperties": false,
      "description": "Operator notification routing, quiet-hours, batching, and JSONL sink settings.",
      "properties": {
        "enabled": { "type": "boolean", "default": true },
        "severityFilter": { "type": "array", "items": { "type": "string", "enum": ["info", "warning", "error", "critical"] }, "default": ["warning", "error", "critical"] },
        "dedupWindowMs": { "type": "integer", "minimum": 1000, "default": 30000 },
        "batchWindowMs": { "type": "integer", "minimum": 0, "default": 0 },
        "quietHours": { "type": "string", "pattern": "^\\d{2}:\\d{2}-\\d{2}:\\d{2}$", "description": "Local HH:MM-HH:MM quiet-hours range; supports cross-day ranges such as 22:00-07:00." },
        "sinkRetentionDays": { "type": "integer", "minimum": 1, "maximum": 90, "default": 7 }
      }
    },
    "observability": {
      "type": "object",
      "additionalProperties": false,
      "description": "Metric registry, heartbeat watcher, and metric file sink settings.",
      "properties": {
        "enabled": { "type": "boolean", "default": true },
        "pollIntervalMs": { "type": "integer", "minimum": 1000, "maximum": 60000, "default": 5000 },
        "metricRetentionDays": { "type": "integer", "minimum": 1, "maximum": 365, "default": 7 }
      }
    },
    "reliability": {
      "type": "object",
      "additionalProperties": false,
      "description": "Opt-in reliability controls for retry, recovery, and deadletter handling.",
      "properties": {
        "autoRetry": { "type": "boolean", "default": false },
        "autoRecover": { "type": "boolean", "default": false },
        "deadletterThreshold": { "type": "integer", "minimum": 1, "default": 3 },
        "retryPolicy": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "maxAttempts": { "type": "integer", "minimum": 1, "maximum": 10, "default": 3 },
            "backoffMs": { "type": "integer", "minimum": 100, "maximum": 60000, "default": 1000 },
            "jitterRatio": { "type": "number", "minimum": 0, "maximum": 1, "default": 0.3 },
            "exponentialFactor": { "type": "number", "minimum": 1, "maximum": 5, "default": 2 },
            "retryableErrors": { "type": "array", "items": { "type": "string", "minLength": 1 } }
          }
        }
      }
    },
    "otlp": {
      "type": "object",
      "additionalProperties": false,
      "description": "Optional OpenTelemetry metric export. Disabled by default.",
      "properties": {
        "enabled": { "type": "boolean", "default": false },
        "endpoint": { "type": "string", "minLength": 1 },
        "headers": { "type": "object", "additionalProperties": { "type": "string" } },
        "intervalMs": { "type": "integer", "minimum": 5000, "default": 60000 }
      }
    }
  }
}
