{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://polytraders.dev/schemas/MarketScope.json",
  "title": "MarketScope",
  "description": "Defines which markets a strategy evaluates within its target Portfolio's universe. Two modes in M2 (cluster | manual). Filter-expression DSL is M3.",
  "type": "object",
  "required": ["mode"],
  "oneOf": [
    {
      "title": "Cluster binding (primary)",
      "required": ["mode", "clusters"],
      "properties": {
        "mode": { "const": "cluster" },
        "clusters": {
          "type": "array",
          "minItems": 1,
          "maxItems": 20,
          "uniqueItems": true,
          "items": { "$ref": "_common.json#/$defs/ClusterId" }
        }
      },
      "additionalProperties": false
    },
    {
      "title": "Manual list (fallback)",
      "required": ["mode", "condition_ids"],
      "properties": {
        "mode": { "const": "manual" },
        "condition_ids": {
          "type": "array",
          "minItems": 1,
          "maxItems": 50,
          "uniqueItems": true,
          "items": { "$ref": "_common.json#/$defs/ConditionId" },
          "description": "Hard cap: 50 markets per strategy. Frozen at launch; edits must write a new audit envelope and emit STRAT_MARKET_OUT_OF_SCOPE / STRAT_MARKET_IN_SCOPE for the diff."
        }
      },
      "additionalProperties": false
    }
  ]
}
