{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:orbiplex:schema:participant-capability-limits:v1",
  "title": "ParticipantCapabilityLimits v1",
  "description": "Machine-readable schema for a participant-scoped layered restriction state. The record freezes always-on soft degradation knobs and optional hard blocked operations without collapsing the participant into transport-layer peer quality or permanent exclusion.",
  "type": "object",
  "additionalProperties": true,
  "x-dia-workflow": "project",
  "x-dia-status": "draft",
  "x-dia-basis": [
    "doc/project/40-proposals/018-layered-capability-limited-participant-restrictions.md",
    "doc/project/50-requirements/requirements-009.md"
  ],
  "required": [
    "schema/v",
    "participant/id",
    "recorded-at",
    "status",
    "soft"
  ],
  "properties": {
    "schema/v": {
      "const": 1,
      "description": "Schema version."
    },
    "participant/id": {
      "type": "string",
      "pattern": "^participant:did:key:z[1-9A-HJ-NP-Za-km-z]+$",
      "description": "Canonical participant subject to which the restriction state applies."
    },
    "recorded-at": {
      "type": "string",
      "format": "date-time",
      "description": "Timestamp when this restriction state was recorded."
    },
    "status": {
      "const": "capability_limited",
      "description": "Frozen MVP state label for layered degraded participation."
    },
    "soft": {
      "$ref": "#/$defs/soft"
    },
    "hard": {
      "$ref": "#/$defs/hard"
    },
    "notes": {
      "type": "string",
      "description": "Optional human-readable explanation."
    }
  },
  "$defs": {
    "soft": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "priority-factor",
        "rate-limit-factor"
      ],
      "properties": {
        "priority-factor": {
          "type": "number",
          "exclusiveMinimum": 0.0,
          "maximum": 1.0,
          "description": "Relative routing or ranking priority factor. `1.0` means no soft priority degradation."
        },
        "rate-limit-factor": {
          "type": "number",
          "exclusiveMinimum": 0.0,
          "maximum": 1.0,
          "description": "Relative throughput allowance factor reserved for runtime rate limiting. `1.0` means no rate-limit degradation."
        }
      }
    },
    "hard": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "blocked-operations",
        "reason/ref",
        "decision/author",
        "expires-at"
      ],
      "properties": {
        "blocked-operations": {
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "items": {
            "type": "string",
            "pattern": "^[a-z0-9][a-z0-9-]*(/[a-z0-9][a-z0-9-]*)+$"
          },
          "description": "Open set of blocked operational permissions. This stays distinct from transport capability advertisement."
        },
        "reason/ref": {
          "type": "string",
          "minLength": 1,
          "description": "Audit anchor such as a review, case, or decision reference."
        },
        "decision/author": {
          "type": "string",
          "pattern": "^(participant|org|council):did:key:z[1-9A-HJ-NP-Za-km-z]+$",
          "description": "Canonical accountable authority that authored the hard restriction decision in MVP."
        },
        "expires-at": {
          "type": "string",
          "format": "date-time",
          "description": "Mandatory expiry timestamp for the hard restriction set."
        }
      },
      "allOf": [
        {
          "not": {
            "properties": {
              "blocked-operations": {
                "contains": {
                  "const": "core/messaging"
                }
              }
            },
            "required": [
              "blocked-operations"
            ]
          }
        },
        {
          "not": {
            "properties": {
              "blocked-operations": {
                "contains": {
                  "const": "keepalive"
                }
              }
            },
            "required": [
              "blocked-operations"
            ]
          }
        },
        {
          "not": {
            "properties": {
              "blocked-operations": {
                "contains": {
                  "const": "dispute/file"
                }
              }
            },
            "required": [
              "blocked-operations"
            ]
          }
        },
        {
          "not": {
            "properties": {
              "blocked-operations": {
                "contains": {
                  "const": "ubc/claim"
                }
              }
            },
            "required": [
              "blocked-operations"
            ]
          }
        },
        {
          "not": {
            "properties": {
              "blocked-operations": {
                "contains": {
                  "const": "signal-marker/send"
                }
              }
            },
            "required": [
              "blocked-operations"
            ]
          }
        }
      ]
    }
  }
}
