{
  "fields": [
    {
      "name": "lo_limit",
      "type": "number",
      "description": "Minimum weighted attendance share (0–1) for a person to be included in the global PCA result. Persons below this threshold are computed but marked included=false.",
      "constraints": {
        "required": true
      }
    },
    {
      "name": "lo_limit_time",
      "type": "number",
      "description": "Minimum weighted attendance share for time-interval projections. Defaults to lo_limit if omitted."
    },
    {
      "name": "yes_options",
      "type": "array",
      "description": "Vote option values that encode to +1. E.g. ['yes'].",
      "constraints": {
        "required": true
      }
    },
    {
      "name": "no_options",
      "type": "array",
      "description": "Vote option values that encode to -1. E.g. ['no', 'abstain'].",
      "constraints": {
        "required": true
      }
    },
    {
      "name": "absent_options",
      "type": "array",
      "description": "Vote option values that encode to NA (excluded from weight calculations). E.g. ['absent', 'before oath'].",
      "constraints": {
        "required": true
      }
    },
    {
      "name": "rotate",
      "type": "object",
      "description": "Reference person for orienting PCA axes so results are comparable across runs."
    },
    {
      "name": "time_interval",
      "type": "string",
      "description": "Size of time windows for rolling projections using the global eigenbasis. Null or omitted means no time-interval output."
    },
    {
      "name": "since",
      "type": "string",
      "description": "ISO 8601 date (YYYY-MM-DD). Only vote events on or after this date are included. Null/omitted = no lower bound."
    },
    {
      "name": "until",
      "type": "string",
      "description": "ISO 8601 date (YYYY-MM-DD). Only vote events on or before this date are included. Null/omitted = no upper bound."
    },
    {
      "name": "n_dims",
      "type": "integer",
      "description": "Number of PCA dimensions to retain in the output. Defaults to 3."
    },
    {
      "name": "extras",
      "type": "object",
      "description": "Additional metadata fields not covered by the core schema."
    }
  ]
}