{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://oms.local/schemas/role-policy.schema.json",
  "title": "OMS role policy v2",
  "type": "object",
  "additionalProperties": false,
  "required": ["version", "credit_billed_allowed", "models", "roles"],
  "properties": {
    "version": { "const": 2 },
    "credit_billed_allowed": { "type": "boolean", "default": false },
    "models": {
      "type": "object",
      "minProperties": 1,
      "additionalProperties": { "$ref": "#/$defs/modelDefinition" }
    },
    "roles": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "oms.conductor",
        "oms.exec-advisor",
        "oms.ticket-executor",
        "oms.goal-long-executor",
        "oms.grader.codex",
        "oms.grader.claude",
        "oms.bounded-dreamer"
      ],
      "properties": {
        "oms.conductor": { "$ref": "#/$defs/rolePolicyRow" },
        "oms.exec-advisor": { "$ref": "#/$defs/rolePolicyRow" },
        "oms.ticket-executor": { "$ref": "#/$defs/rolePolicyRow" },
        "oms.goal-long-executor": { "$ref": "#/$defs/rolePolicyRow" },
        "oms.grader.codex": { "$ref": "#/$defs/rolePolicyRow" },
        "oms.grader.claude": { "$ref": "#/$defs/rolePolicyRow" },
        "oms.bounded-dreamer": { "$ref": "#/$defs/rolePolicyRow" }
      }
    }
  },
  "$defs": {
    "modelDefinition": {
      "type": "object",
      "additionalProperties": false,
      "required": ["engine", "id"],
      "properties": {
        "engine": { "enum": ["claude", "codex"] },
        "id": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$" },
        "reasoning_effort": { "type": "string", "enum": ["low", "medium", "high", "xhigh"] }
      }
    },
    "rolePolicyRow": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "role_id",
        "engine",
        "model_id",
        "billing_class",
        "allow_api_billing",
        "allow_overage_credits",
        "auth_mode",
        "unattended_eligible",
        "sandbox",
        "transport",
        "session_policy",
        "freshness_policy",
        "evidence_schema"
      ],
      "properties": {
        "role_id": {
          "enum": [
            "oms.conductor",
            "oms.exec-advisor",
            "oms.ticket-executor",
            "oms.goal-long-executor",
            "oms.grader.codex",
            "oms.grader.claude",
            "oms.bounded-dreamer"
          ]
        },
        "engine": { "enum": ["claude", "codex"] },
        "model_id": { "type": "string", "minLength": 1 },
        "billing_class": { "enum": ["subscription", "api", "enterprise", "credit_billed"] },
        "allow_api_billing": { "type": "boolean", "default": false },
        "allow_overage_credits": { "type": "boolean", "default": false },
        "auth_mode": {
          "enum": [
            "claude_subscription",
            "chatgpt_subscription",
            "api_key",
            "enterprise_access_token",
            "cloud_provider"
          ]
        },
        "unattended_eligible": { "type": "boolean", "default": false },
        "sandbox": { "enum": ["read-only", "ticket-worktree-write"] },
        "transport": { "enum": ["claude_interactive", "codex_exec", "codex_goal"] },
        "session_policy": { "enum": ["operator_originated_oms_managed_interactive", "fresh", "persistent"] },
        "freshness_policy": { "enum": ["fresh_required", "resumable", "persistent"] },
        "evidence_schema": {
          "enum": [
            "conductor-decision.v1",
            "advisor-output.v1",
            "executor-result.v1",
            "goal-executor-result.v1",
            "grader-output.v1",
            "reflection.v1"
          ]
        }
      }
    }
  }
}
