{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://tradecat.local/contracts/tradecat-auto-agent-soft-layer.schema.json",
  "title": "TradeCat Auto Agent Soft Layer",
  "description": "Self-contained Agent/Hermes prompt templates, endpoint policy, and soft decision contracts for public-readonly paper research.",
  "type": "object",
  "required": ["schema", "schema_version", "ok", "resource_root", "prompt_templates", "role_profiles", "endpoint_policy", "soft_output_contract", "hard_boundaries", "provenance"],
  "properties": {
    "schema": {"const": "tradecat_auto.agent_soft_layer.v1"},
    "schema_version": {"const": "1.0.0"},
    "ok": {"const": true},
    "resource_root": {"type": "string"},
    "purpose": {"type": "string"},
    "prompt_templates": {
      "type": "array",
      "minItems": 1,
      "items": {
        "type": "object",
        "required": ["id", "language", "path"],
        "properties": {
          "id": {"type": "string"},
          "language": {"type": "string"},
          "path": {"type": "string"},
          "template": {"type": "string"}
        },
        "additionalProperties": true
      }
    },
    "role_profiles": {
      "type": "array",
      "minItems": 1,
      "items": {
        "type": "object",
        "required": ["id", "role", "language", "path", "sizing_contract", "exit_contract", "safety_boundary"],
        "properties": {
          "id": {"type": "string"},
          "role": {"type": "string"},
          "language": {"type": "string"},
          "path": {"type": "string"},
          "template": {"type": "string"},
          "sizing_contract": {
            "type": "object",
            "required": ["margin_budget_usdt_is_cap", "default_order_size", "missing_sizing_error_code"],
            "properties": {
              "margin_budget_usdt_is_cap": {"const": false},
              "margin_budget_usdt": {"type": "null"},
              "default_order_size": {"const": false},
              "missing_sizing_error_code": {"const": "agent_sizing_required"}
            },
            "additionalProperties": true
          },
          "exit_contract": {
            "type": "object",
            "required": ["default_stop_loss", "default_take_profit", "default_max_holding_minutes"],
            "properties": {
              "default_stop_loss": {"const": false},
              "default_take_profit": {"const": false},
              "default_max_holding_minutes": {"type": "null"}
            },
            "additionalProperties": true
          },
          "safety_boundary": {
            "type": "object",
            "required": ["public_readonly_market_data", "public_readonly", "paper_or_watch_only", "real_orders", "signed_requests", "reads_api_keys", "binance_account_state"],
            "properties": {
              "public_readonly_market_data": {"const": true},
              "public_readonly": {"const": true},
              "paper_or_watch_only": {"const": true},
              "real_orders": {"const": false},
              "signed_requests": {"const": false},
              "reads_api_keys": {"const": false},
              "binance_account_state": {"const": false}
            },
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      }
    },
    "endpoint_policy": {
      "type": "object",
      "required": ["schema", "schema_version", "allowed_market_context_families", "hard_forbidden_endpoint_categories", "hard_forbidden_state_keys"],
      "properties": {
        "schema": {"const": "tradecat_auto.agent_soft_endpoint_policy.v1"},
        "schema_version": {"const": "1.0.0"},
        "allowed_market_context_families": {"type": "array", "items": {"type": "object", "additionalProperties": true}},
        "hard_forbidden_endpoint_categories": {"type": "array", "items": {"type": "object", "additionalProperties": true}},
        "hard_forbidden_state_keys": {"type": "array", "items": {"type": "string"}}
      },
      "additionalProperties": true
    },
    "soft_output_contract": {"type": "object", "additionalProperties": true},
    "hard_boundaries": {
      "type": "object",
      "required": ["public_readonly_market_data", "public_readonly", "paper_or_watch_only", "real_orders", "signed_requests", "reads_api_keys", "binance_account_state", "account_state_source"],
      "properties": {
        "public_readonly_market_data": {"const": true},
        "public_readonly": {"const": true},
        "paper_or_watch_only": {"const": true},
        "real_orders": {"const": false},
        "signed_requests": {"const": false},
        "reads_api_keys": {"const": false},
        "binance_account_state": {"const": false},
        "account_state_source": {"const": "local TradeCat paper ledger only"}
      },
      "additionalProperties": true
    },
    "provenance": {"type": "object", "additionalProperties": true}
  },
  "additionalProperties": true
}
