{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://modelos.inverence-llull.com/ficha-0.11.schema.json",
  "title": "Ficha de modelo — contrato v0.11, revisión r3",
  "description": "Contrato de RECEPCIÓN de la ficha 0.11, escrito por la plataforma desde los documentos del emisor (TolLlull/doc en master 251a097: el contrato de la ficha, changes.0.11 y la respuesta a la carta de la 0.11) y validado contra las 19 fichas que el emisor estampó «0.11» (ING-2c, llull-platform docs/recon-ficha-0-10/09-seguimiento-0-11.md). Es NUESTRO contrato: donde un documento del emisor habla, manda el documento; donde calla, la forma es una decisión nuestra, anotada en el nodo con `x-decision`. `NOT_APPLICABLE` es una palabra reservada del contrato: dice que el campo no procede en esta ficha, que no es lo mismo que no saberlo; sólo la admiten los campos de texto que el contrato nombra, y en qué tipo de nodo lo comprueba el decoder (regla R10). Revisión r3, fijada por sha256: dentro de 0.11 sólo se AÑADE; quitar o endurecer algo exige otra versión. La forma: tres claves (schema_version en la raíz y sólo ahí, metadata, model).",
  "x-revision": "r3",
  "x-acta": "r3 sustituye a r2 (sha256 6497b38a7aa9a61922d8860bf1dd90b7c6fc6b7d5bb589094b312ad63d776ebd) como el contrato de la etiqueta 0.11, y es la única vez que una revisión de 0.11 quita y endurece (ruling de Gus, 2026-10-06). r2 se escribió sobre la 0.10.1 del emisor renombrada y nunca recibió una ficha real: contra ella las 19 reales fallan todas (forecast_method, que la 0.11 retira; identification_method, user_output_name y result_scale_factor, que r2 no conoce). Nada dependía de r2 (comprobado el 2026-10-06, solo lectura): ninguna importación de ficha auditada en producción, ninguna ancla ni manifest 0.11, y el bucket del catálogo con 13 fichas, todas 0.8 o 0.9.",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "schema_version",
    "metadata",
    "model"
  ],
  "properties": {
    "schema_version": {
      "const": "0.11",
      "description": "Cadena, nunca número: 0.11 ≠ 0.1.",
      "x-decision": "Sólo «0.11» (D-L), que es lo que el emisor estampa desde la reemisión. Una «0.10.1» se rechaza nombrando el número acordado: una versión de parche que añade y quita campos no es un parche."
    },
    "metadata": {
      "type": "object",
      "description": "Diez secciones; lo que el modelo no puede contar de sí mismo. Una sección sin contenido se escribe con {\"content\": \"none\"}, salvo las que llevan un campo obligatorio. La 0.11 retira `invocation`.",
      "additionalProperties": false,
      "required": [
        "identity",
        "runtime",
        "data",
        "estimation",
        "outputs",
        "operations",
        "sources",
        "artifact",
        "flex_store_config",
        "limits"
      ],
      "properties": {
        "identity": {
          "$ref": "#/$defs/identity"
        },
        "runtime": {
          "oneOf": [
            {
              "$ref": "#/$defs/runtime"
            },
            {
              "$ref": "#/$defs/contentNone"
            }
          ]
        },
        "data": {
          "oneOf": [
            {
              "$ref": "#/$defs/data"
            },
            {
              "$ref": "#/$defs/contentNone"
            }
          ]
        },
        "estimation": {
          "oneOf": [
            {
              "$ref": "#/$defs/estimation"
            },
            {
              "$ref": "#/$defs/contentNone"
            }
          ]
        },
        "outputs": {
          "oneOf": [
            {
              "$ref": "#/$defs/outputs"
            },
            {
              "$ref": "#/$defs/contentNone"
            }
          ]
        },
        "operations": {
          "$ref": "#/$defs/operations"
        },
        "sources": {
          "oneOf": [
            {
              "$ref": "#/$defs/sources"
            },
            {
              "$ref": "#/$defs/contentNone"
            }
          ]
        },
        "artifact": {
          "$ref": "#/$defs/artifact"
        },
        "flex_store_config": {
          "oneOf": [
            {
              "$ref": "#/$defs/flex_store_config"
            },
            {
              "$ref": "#/$defs/contentNone"
            }
          ]
        },
        "limits": {
          "$ref": "#/$defs/limits"
        }
      }
    },
    "model": {
      "type": "object",
      "description": "Doce tablas, siempre las doce; la de parámetros se llama parameters_mle o parameters_bys y nunca coexisten.",
      "additionalProperties": false,
      "required": [
        "stats",
        "convergence",
        "relations",
        "workbook",
        "series_fit",
        "series_input_output",
        "forecast",
        "diagnostics",
        "correlations",
        "conditioning",
        "mcmc"
      ],
      "oneOf": [
        {
          "required": [
            "parameters_mle"
          ],
          "not": {
            "required": [
              "parameters_bys"
            ]
          }
        },
        {
          "required": [
            "parameters_bys"
          ],
          "not": {
            "required": [
              "parameters_mle"
            ]
          }
        }
      ],
      "properties": {
        "stats": {
          "type": "array"
        },
        "parameters_mle": {
          "oneOf": [
            {
              "$ref": "#/$defs/parameters_mle"
            },
            {
              "$ref": "#/$defs/contentNone"
            }
          ]
        },
        "parameters_bys": {
          "oneOf": [
            {
              "$ref": "#/$defs/parameters_bys"
            },
            {
              "$ref": "#/$defs/contentNone"
            }
          ]
        },
        "convergence": {
          "oneOf": [
            {
              "$ref": "#/$defs/convergence"
            },
            {
              "$ref": "#/$defs/contentNone"
            }
          ]
        },
        "relations": {
          "oneOf": [
            {
              "$ref": "#/$defs/relations"
            },
            {
              "$ref": "#/$defs/contentNone"
            }
          ]
        },
        "workbook": {
          "oneOf": [
            {
              "$ref": "#/$defs/workbook"
            },
            {
              "$ref": "#/$defs/contentNone"
            }
          ]
        },
        "series_fit": {
          "oneOf": [
            {
              "$ref": "#/$defs/series_fit"
            },
            {
              "$ref": "#/$defs/contentNone"
            }
          ]
        },
        "series_input_output": {
          "oneOf": [
            {
              "$ref": "#/$defs/series_input_output"
            },
            {
              "$ref": "#/$defs/contentNone"
            }
          ]
        },
        "forecast": {
          "type": "object"
        },
        "diagnostics": {
          "oneOf": [
            {
              "$ref": "#/$defs/diagnostics"
            },
            {
              "$ref": "#/$defs/contentNone"
            }
          ]
        },
        "correlations": {
          "oneOf": [
            {
              "$ref": "#/$defs/correlations"
            },
            {
              "$ref": "#/$defs/encodingNone"
            }
          ]
        },
        "conditioning": {
          "oneOf": [
            {
              "$ref": "#/$defs/conditioning"
            },
            {
              "$ref": "#/$defs/contentNone"
            }
          ],
          "x-decision": "No es una sección comprimida (va en precisión completa): vacía se declara con {\"content\": \"none\"}, como se emite, y no con encoding."
        },
        "mcmc": {
          "oneOf": [
            {
              "$ref": "#/$defs/mcmc"
            },
            {
              "$ref": "#/$defs/encodingNone"
            }
          ]
        }
      }
    }
  },
  "allOf": [
    {
      "if": {
        "properties": {
          "metadata": {
            "properties": {
              "identity": {
                "properties": {
                  "model_frame": {
                    "const": "@ModelDef"
                  }
                },
                "required": [
                  "model_frame"
                ]
              }
            }
          }
        }
      },
      "then": {
        "properties": {
          "model": {
            "properties": {
              "stats": {
                "$ref": "#/$defs/stats_modeldef"
              }
            }
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "metadata": {
            "properties": {
              "identity": {
                "properties": {
                  "model_frame": {
                    "const": "ModelExcel"
                  }
                },
                "required": [
                  "model_frame"
                ]
              }
            }
          }
        }
      },
      "then": {
        "properties": {
          "model": {
            "properties": {
              "stats": {
                "$ref": "#/$defs/stats_node"
              }
            }
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "metadata": {
            "properties": {
              "identity": {
                "properties": {
                  "model_class": {
                    "const": "XARIMA-MLE"
                  }
                },
                "required": [
                  "model_class"
                ]
              }
            }
          }
        }
      },
      "then": {
        "properties": {
          "model": {
            "required": [
              "parameters_mle"
            ]
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "metadata": {
            "properties": {
              "identity": {
                "properties": {
                  "model_class": {
                    "const": "XARIMA-BSR"
                  }
                },
                "required": [
                  "model_class"
                ]
              }
            }
          }
        }
      },
      "then": {
        "properties": {
          "model": {
            "required": [
              "parameters_bys"
            ]
          }
        }
      }
    },
    {
      "x-decision": "XARIMA-BSR con model_frame @ModelDef se rechaza: no está entre las cinco clases que el contrato mide hoy. Se abre cuando el emisor lo emita.",
      "not": {
        "properties": {
          "metadata": {
            "properties": {
              "identity": {
                "properties": {
                  "model_class": {
                    "const": "XARIMA-BSR"
                  },
                  "model_frame": {
                    "const": "@ModelDef"
                  }
                },
                "required": [
                  "model_class",
                  "model_frame"
                ]
              }
            }
          }
        }
      }
    },
    {
      "x-decision": "tech_id ↔ clase + marco (ING-2b, regla barata aceptada): «sistema.método.marco», y el método y el marco ya los dicen model_class y model_frame. Dos campos que dicen lo mismo y no concuerdan son un emisor roto, no una ficha que interpretar.",
      "if": {
        "properties": {
          "metadata": {
            "properties": {
              "identity": {
                "properties": {
                  "model_class": {
                    "const": "XARIMA-MLE"
                  },
                  "model_frame": {
                    "const": "@ModelDef"
                  }
                },
                "required": [
                  "model_class",
                  "model_frame"
                ]
              }
            }
          }
        }
      },
      "then": {
        "properties": {
          "metadata": {
            "properties": {
              "identity": {
                "properties": {
                  "tech_id": {
                    "const": "tol.mle.est"
                  }
                }
              }
            }
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "metadata": {
            "properties": {
              "identity": {
                "properties": {
                  "model_class": {
                    "const": "XARIMA-MLE"
                  },
                  "model_frame": {
                    "const": "ModelExcel"
                  }
                },
                "required": [
                  "model_class",
                  "model_frame"
                ]
              }
            }
          }
        }
      },
      "then": {
        "properties": {
          "metadata": {
            "properties": {
              "identity": {
                "properties": {
                  "tech_id": {
                    "const": "tol.mle.mms"
                  }
                }
              }
            }
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "metadata": {
            "properties": {
              "identity": {
                "properties": {
                  "model_class": {
                    "const": "XARIMA-BSR"
                  },
                  "model_frame": {
                    "const": "ModelExcel"
                  }
                },
                "required": [
                  "model_class",
                  "model_frame"
                ]
              }
            }
          }
        }
      },
      "then": {
        "properties": {
          "metadata": {
            "properties": {
              "identity": {
                "properties": {
                  "tech_id": {
                    "const": "tol.bys.mms"
                  }
                }
              }
            }
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "metadata": {
            "properties": {
              "identity": {
                "properties": {
                  "model_class": {
                    "const": "XARIMA-MLE"
                  },
                  "model_frame": {
                    "const": "@ModelDef"
                  }
                },
                "required": [
                  "model_class",
                  "model_frame"
                ]
              }
            }
          }
        }
      },
      "then": {
        "properties": {
          "model": {
            "properties": {
              "convergence": {
                "$ref": "#/$defs/contentNone"
              },
              "relations": {
                "$ref": "#/$defs/contentNone"
              },
              "workbook": {
                "$ref": "#/$defs/contentNone"
              },
              "series_fit": {
                "$ref": "#/$defs/series_fit"
              },
              "mcmc": {
                "$ref": "#/$defs/encodingNone"
              }
            }
          },
          "metadata": {
            "properties": {
              "identity": {
                "properties": {
                  "submodel": {
                    "const": ""
                  },
                  "children": {
                    "maxItems": 0
                  }
                }
              }
            }
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "metadata": {
            "properties": {
              "identity": {
                "properties": {
                  "model_class": {
                    "const": "XARIMA-MLE"
                  },
                  "model_frame": {
                    "const": "ModelExcel"
                  },
                  "submodel": {
                    "const": ""
                  }
                },
                "required": [
                  "model_class",
                  "model_frame",
                  "submodel"
                ]
              }
            }
          }
        }
      },
      "then": {
        "properties": {
          "model": {
            "properties": {
              "parameters_mle": {
                "$ref": "#/$defs/contentNone"
              },
              "convergence": {
                "$ref": "#/$defs/contentNone"
              },
              "workbook": {
                "$ref": "#/$defs/workbook"
              },
              "series_fit": {
                "$ref": "#/$defs/contentNone"
              },
              "series_input_output": {
                "$ref": "#/$defs/contentNone"
              },
              "diagnostics": {
                "$ref": "#/$defs/contentNone"
              },
              "correlations": {
                "$ref": "#/$defs/encodingNone"
              },
              "conditioning": {
                "$ref": "#/$defs/contentNone"
              },
              "mcmc": {
                "$ref": "#/$defs/encodingNone"
              },
              "forecast": {
                "$ref": "#/$defs/contentNone"
              }
            }
          },
          "metadata": {
            "properties": {
              "identity": {
                "properties": {
                  "children": {
                    "minItems": 1
                  }
                }
              }
            }
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "metadata": {
            "properties": {
              "identity": {
                "properties": {
                  "model_class": {
                    "const": "XARIMA-MLE"
                  },
                  "model_frame": {
                    "const": "ModelExcel"
                  },
                  "submodel": {
                    "minLength": 1
                  }
                },
                "required": [
                  "model_class",
                  "model_frame",
                  "submodel"
                ]
              }
            }
          }
        }
      },
      "then": {
        "properties": {
          "model": {
            "properties": {
              "convergence": {
                "$ref": "#/$defs/contentNone"
              },
              "relations": {
                "$ref": "#/$defs/contentNone"
              },
              "workbook": {
                "$ref": "#/$defs/contentNone"
              },
              "series_fit": {
                "$ref": "#/$defs/series_fit"
              },
              "mcmc": {
                "$ref": "#/$defs/encodingNone"
              }
            }
          },
          "metadata": {
            "properties": {
              "identity": {
                "properties": {
                  "children": {
                    "maxItems": 0
                  }
                }
              }
            }
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "metadata": {
            "properties": {
              "identity": {
                "properties": {
                  "model_class": {
                    "const": "XARIMA-BSR"
                  },
                  "model_frame": {
                    "const": "ModelExcel"
                  },
                  "submodel": {
                    "const": ""
                  }
                },
                "required": [
                  "model_class",
                  "model_frame",
                  "submodel"
                ]
              }
            }
          }
        }
      },
      "then": {
        "properties": {
          "model": {
            "properties": {
              "convergence": {
                "$ref": "#/$defs/convergence"
              },
              "workbook": {
                "$ref": "#/$defs/workbook"
              },
              "series_fit": {
                "$ref": "#/$defs/contentNone"
              },
              "series_input_output": {
                "$ref": "#/$defs/contentNone"
              },
              "diagnostics": {
                "$ref": "#/$defs/contentNone"
              },
              "correlations": {
                "$ref": "#/$defs/encodingNone"
              },
              "conditioning": {
                "$ref": "#/$defs/contentNone"
              },
              "forecast": {
                "$ref": "#/$defs/contentNone"
              }
            }
          },
          "metadata": {
            "properties": {
              "identity": {
                "properties": {
                  "children": {
                    "minItems": 1
                  }
                }
              }
            }
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "metadata": {
            "properties": {
              "identity": {
                "properties": {
                  "model_class": {
                    "const": "XARIMA-BSR"
                  },
                  "model_frame": {
                    "const": "ModelExcel"
                  },
                  "submodel": {
                    "minLength": 1
                  }
                },
                "required": [
                  "model_class",
                  "model_frame",
                  "submodel"
                ]
              }
            }
          }
        }
      },
      "then": {
        "properties": {
          "model": {
            "properties": {
              "parameters_bys": {
                "$ref": "#/$defs/parameters_bys"
              },
              "convergence": {
                "$ref": "#/$defs/convergence"
              },
              "relations": {
                "$ref": "#/$defs/contentNone"
              },
              "workbook": {
                "$ref": "#/$defs/contentNone"
              },
              "series_fit": {
                "$ref": "#/$defs/series_fit"
              },
              "diagnostics": {
                "$ref": "#/$defs/contentNone"
              },
              "correlations": {
                "$ref": "#/$defs/encodingNone"
              },
              "conditioning": {
                "$ref": "#/$defs/contentNone"
              },
              "mcmc": {
                "$ref": "#/$defs/encodingNone"
              }
            }
          },
          "metadata": {
            "properties": {
              "identity": {
                "properties": {
                  "children": {
                    "maxItems": 0
                  }
                }
              }
            }
          }
        }
      }
    },
    {
      "x-decision": "La 0.11 retira forecast_method: la sección de previsión trae todas las columnas, y cuáles trae lo dice la CLASE del modelo (el contrato, «forecast — la previsión»). Con el método se va la condición que lo leía; la forma de la tabla se decide aquí por model_class.",
      "if": {
        "properties": {
          "metadata": {
            "properties": {
              "identity": {
                "properties": {
                  "model_class": {
                    "const": "XARIMA-MLE"
                  }
                },
                "required": [
                  "model_class"
                ]
              }
            }
          }
        }
      },
      "then": {
        "properties": {
          "model": {
            "properties": {
              "forecast": {
                "oneOf": [
                  {
                    "$ref": "#/$defs/forecast_mle"
                  },
                  {
                    "$ref": "#/$defs/contentNone"
                  }
                ]
              }
            }
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "metadata": {
            "properties": {
              "identity": {
                "properties": {
                  "model_class": {
                    "const": "XARIMA-BSR"
                  }
                },
                "required": [
                  "model_class"
                ]
              }
            }
          }
        }
      },
      "then": {
        "properties": {
          "model": {
            "properties": {
              "forecast": {
                "oneOf": [
                  {
                    "$ref": "#/$defs/forecast_bsr"
                  },
                  {
                    "$ref": "#/$defs/contentNone"
                  }
                ]
              }
            }
          }
        }
      }
    }
  ],
  "$defs": {
    "nan": {
      "const": "NaN",
      "description": "Real desconocido (las-secciones-comprimidas, «Los no finitos y las fechas»)."
    },
    "real": {
      "description": "Real: número, o \"NaN\" / \"+Inf\" / \"-Inf\" como CADENA. Nunca null ni literal pelado.",
      "oneOf": [
        {
          "type": "number"
        },
        {
          "enum": [
            "+Inf",
            "-Inf",
            "NaN"
          ]
        }
      ]
    },
    "realOrNaN": {
      "oneOf": [
        {
          "type": "number"
        },
        {
          "$ref": "#/$defs/nan"
        }
      ]
    },
    "intOrNaN": {
      "oneOf": [
        {
          "type": "integer"
        },
        {
          "$ref": "#/$defs/nan"
        }
      ]
    },
    "flag01": {
      "enum": [
        0,
        1
      ],
      "description": "Bandera numérica 0/1."
    },
    "flag01OrNaN": {
      "oneOf": [
        {
          "enum": [
            0,
            1
          ]
        },
        {
          "$ref": "#/$defs/nan"
        }
      ]
    },
    "date": {
      "description": "Fecha: 10 caracteres día completo, 19 intradía, o \"NaT\" (las-secciones-comprimidas).",
      "oneOf": [
        {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
        },
        {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$"
        },
        {
          "const": "NaT"
        }
      ]
    },
    "text": {
      "type": "string"
    },
    "textList": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "realList": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/real"
      }
    },
    "intList": {
      "type": "array",
      "items": {
        "type": "integer"
      }
    },
    "dateList": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/date"
      }
    },
    "notApplicable": {
      "const": "NOT_APPLICABLE",
      "description": "Palabra reservada del contrato (0.11): el campo no procede en esta ficha. No es «vacío» ni «desconocido» («NaN»); ninguna unidad, formato ni vocabulario puede tomarla nunca."
    },
    "scopeToken": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_-]+$",
      "description": "Un miembro del ámbito: sin punto (el punto separa niveles en scope_id) ni barra (scope_id es un segmento de la clave del catálogo)."
    },
    "contentNone": {
      "description": "Sección corriente declarada vacía (regla de autodescripción): exactamente {\"content\": \"none\"}.",
      "type": "object",
      "properties": {
        "content": {
          "const": "none"
        }
      },
      "required": [
        "content"
      ],
      "additionalProperties": false
    },
    "encodingNone": {
      "description": "Sección comprimida declarada vacía: exactamente {\"encoding\": \"none\"}, SIN scale.",
      "type": "object",
      "properties": {
        "encoding": {
          "const": "none"
        }
      },
      "required": [
        "encoding"
      ],
      "additionalProperties": false
    },
    "identity": {
      "type": "object",
      "description": "Quién es este modelo (contrato, «identity»). Veintisiete campos: la 0.11 renombra `frequency` a `dating`, añade el tiempo (`time_units`, `time_units_per_period`), el ámbito (`scope_id`, `scope_map`) y la tecnología (`tech_id`), y mueve `keep_instance` a flex_store_config.",
      "additionalProperties": false,
      "required": [
        "client",
        "project",
        "model_id",
        "scope_id",
        "scope_map",
        "tech_id",
        "model_version",
        "submodel",
        "children",
        "model_class",
        "model_frame",
        "model_name",
        "purpose",
        "task_type",
        "task_type_other",
        "task_parameters",
        "owner",
        "client_phase",
        "creation_time",
        "dating",
        "time_units",
        "time_units_per_period",
        "arima_label",
        "constant_term",
        "model_comment",
        "version_comment"
      ],
      "properties": {
        "client": {
          "type": "string",
          "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$"
        },
        "project": {
          "type": "string",
          "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$"
        },
        "model_id": {
          "type": "string",
          "pattern": "^[A-Za-z0-9._-]+$",
          "description": "Concepto, no ejecución. OBLIGATORIO."
        },
        "scope_id": {
          "oneOf": [
            {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]+(\\.[A-Za-z0-9_-]+)*$",
              "not": {
                "$ref": "#/$defs/notApplicable"
              }
            },
            {
              "$ref": "#/$defs/notApplicable"
            }
          ],
          "description": "La rebanada del fenómeno que cubre el modelo: los miembros de scope_map concatenados con el punto, en orden (`ES.Tur`), o NOT_APPLICABLE si no hay ninguna dimensión que declarar. OBLIGATORIO. Parte de la clave del modelo.",
          "x-decision": "Entra en NUESTRA clave (D-M): la familia lleva el ámbito de la raíz y cada nodo el suyo. Que scope_id sea la concatenación de scope_map (R11) y que una hoja extienda el ámbito de su raíz (R14) lo comprueba el decoder."
        },
        "scope_map": {
          "oneOf": [
            {
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "ord",
                  "dimension",
                  "member"
                ],
                "properties": {
                  "ord": {
                    "type": "integer",
                    "minimum": 1
                  },
                  "dimension": {
                    "type": "string",
                    "minLength": 1
                  },
                  "member": {
                    "$ref": "#/$defs/scopeToken"
                  }
                }
              }
            },
            {
              "$ref": "#/$defs/notApplicable"
            }
          ],
          "description": "El diccionario para leer scope_id: la lista ordenada de {ord, dimension, member}, o NOT_APPLICABLE. OBLIGATORIO."
        },
        "tech_id": {
          "enum": [
            "tol.mle.est",
            "tol.mle.mms",
            "tol.bys.mms"
          ],
          "description": "Con qué tecnología se modela, en tres segmentos (sistema.método.marco). OBLIGATORIO. Parte de la clave del modelo: el mismo model_id con dos tecnologías son dos modelos.",
          "x-decision": "Vocabulario CERRADO con los tres casos del contrato; uno nuevo exige otra revisión. Que concuerde con model_class y model_frame lo exige el allOf de la raíz."
        },
        "model_version": {
          "type": "string",
          "pattern": "^\\d+\\.\\d+(\\.\\d+)?$",
          "description": "OBLIGATORIO con forma x.y o x.y.z (changes.0.10, «Lo que se exige»)."
        },
        "submodel": {
          "type": "string",
          "pattern": "^[A-Za-z0-9._-]*$",
          "description": "\"\" en la raíz y en un modelo suelto."
        },
        "children": {
          "type": "array",
          "items": {
            "type": "string",
            "pattern": "^[A-Za-z0-9._-]+$"
          },
          "uniqueItems": true,
          "description": "Hijos que declara la raíz; vacía en una hoja y en un modelo suelto."
        },
        "model_class": {
          "enum": [
            "XARIMA-MLE",
            "XARIMA-BSR"
          ]
        },
        "model_frame": {
          "enum": [
            "@ModelDef",
            "ModelExcel"
          ]
        },
        "model_name": {
          "type": "string"
        },
        "purpose": {
          "type": "string",
          "minLength": 1,
          "description": "OBLIGATORIO."
        },
        "task_type": {
          "type": "string"
        },
        "task_type_other": {
          "type": "string"
        },
        "task_parameters": {
          "type": "string"
        },
        "owner": {
          "type": "string"
        },
        "client_phase": {
          "enum": [
            "exploracion",
            "piloto",
            "produccion",
            ""
          ],
          "x-decision": "Los tokens tal como los emite el emisor, sin tildes (el documento del emisor los escribe en prosa con ellas)."
        },
        "creation_time": {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$",
          "description": "Instante de la estimación, en UTC y explícito."
        },
        "dating": {
          "enum": [
            "Daily",
            "T.monthly",
            "Mensual"
          ],
          "description": "Cuál es el fechado, por su nombre (hasta la 0.10, `frequency`).",
          "x-decision": "Vocabulario CERRADO con las tres grafías que se emiten hoy; otro valor se rechaza. La clave del fechado de las tablas de series se llama como este valor (regla R3 del decoder)."
        },
        "time_units": {
          "enum": [
            "year",
            "quarter",
            "month",
            "week",
            "day",
            "hour"
          ],
          "description": "La unidad de calendario más gruesa de la que el fechado es subconjunto. Por debajo de la hora no llega (límite declarado del emisor)."
        },
        "time_units_per_period": {
          "type": "number",
          "minimum": 1,
          "description": "Cuántas unidades dura un periodo, DE MEDIA sobre la ventana de la ficha. Un dato estadístico: no define el fechado, y un valor entero no prueba que sea regular. Vale al menos uno por construcción."
        },
        "arima_label": {
          "type": "string"
        },
        "constant_term": {
          "$ref": "#/$defs/realOrNaN",
          "x-decision": "Real o \"NaN\"; informativo, la plataforma no lo lee.",
          "x-pregunta": "F4"
        },
        "model_comment": {
          "type": "string"
        },
        "version_comment": {
          "type": "string"
        }
      },
      "x-decision": "El ámbito que la 0.10 rechazaba como `scope` llega especificado: scope_id + scope_map."
    },
    "runtime": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "emitter",
        "engine",
        "hostname",
        "operating_system",
        "source_encoding",
        "source_locale",
        "packaging",
        "build_artifacts",
        "packages"
      ],
      "properties": {
        "emitter": {
          "type": "string"
        },
        "engine": {
          "type": "string",
          "description": "Con el nombre del lenguaje delante: «TOL v4.1 p000 …». La fecha de construcción va dentro: el número de versión no sube en cada construcción, así que es la fecha la que separa dos builds."
        },
        "packages": {
          "type": "string",
          "description": "Los paquetes que intervinieron, con su versión, separados por espacio (`MMS.11.42 ModelExcel.13.17 ConceptualJSON.18.4`): procedencia de la ejecución, no identidad."
        },
        "hostname": {
          "type": "string"
        },
        "operating_system": {
          "type": "string"
        },
        "source_encoding": {
          "type": "string"
        },
        "source_locale": {
          "type": "string"
        },
        "packaging": {
          "type": "string"
        },
        "build_artifacts": {
          "type": "string"
        }
      }
    },
    "transform": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "kind",
        "formula",
        "exponent",
        "shift",
        "regularized"
      ],
      "properties": {
        "kind": {
          "enum": [
            "box_cox"
          ],
          "x-decision": "Vocabulario CERRADO: box_cox, la única transformación que se emite hoy; otra se rechaza."
        },
        "formula": {
          "type": "string"
        },
        "exponent": {
          "type": "number"
        },
        "shift": {
          "type": "number"
        },
        "regularized": {
          "$ref": "#/$defs/flag01",
          "x-decision": "0/1 aceptado; «distingue las dos Box-Cox que existen». Deshacer la regularizada es de serving, no de recepción, y espera a su fórmula.",
          "x-pregunta": "P17"
        }
      }
    },
    "data": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "granularity",
        "units_and_scale",
        "drivers",
        "drivers_are_deterministic",
        "transform"
      ],
      "properties": {
        "granularity": {
          "type": "string"
        },
        "units_and_scale": {
          "type": "string",
          "minLength": 1,
          "description": "OBLIGATORIO: en qué unidades están los datos con los que se estimó. NOT_APPLICABLE en una raíz (R10)."
        },
        "drivers": {
          "type": "string"
        },
        "drivers_are_deterministic": {
          "$ref": "#/$defs/flag01",
          "description": "OBLIGATORIO y declarado por el analista: si los drivers se conocen de antemano. No se puede contrastar con los datos; es una declaración que se cree.",
          "x-decision": "0/1, tal como se emite (también en la raíz). La palabra reservada no se admite aquí: es una bandera, no un texto."
        },
        "transform": {
          "oneOf": [
            {
              "$ref": "#/$defs/transform"
            },
            {
              "$ref": "#/$defs/contentNone"
            }
          ]
        }
      }
    },
    "estimation": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "algorithm",
        "estimation_method",
        "estimation_window",
        "estimation_call",
        "mcmc_length",
        "mcmc_burnin",
        "mcmc_thinning",
        "identification_method"
      ],
      "properties": {
        "algorithm": {
          "type": "string"
        },
        "estimation_method": {
          "type": "string"
        },
        "identification_method": {
          "type": "string",
          "minLength": 1,
          "description": "OBLIGATORIO desde la 0.11, texto libre: cómo se encontró la FORMA del modelo (a mano, o un sistema automático como nn-auto-arima), que es otra pregunta que estimation_method. Es de la versión, no de la instancia; el emisor no escribe la ficha si falta."
        },
        "estimation_window": {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}( \\d{2}:\\d{2}:\\d{2})? \\.\\. \\d{4}-\\d{2}-\\d{2}( \\d{2}:\\d{2}:\\d{2})?$",
          "x-decision": "Parte de la CLAVE del modelo, con la gramática «AAAA-MM-DD[ hh:mm:ss] .. AAAA-MM-DD[ hh:mm:ss]». La hora va SÓLO cuando el fechado es más fino que el día, y eso se decide por time_units, no mirando si la hora es medianoche (regla R13 del decoder)."
        },
        "estimation_call": {
          "type": "string"
        },
        "mcmc_length": {
          "$ref": "#/$defs/intOrNaN",
          "description": "Longitud EFECTIVA de la cadena (lo que la estimación usó, no lo declarado). \"NaN\" en máxima verosimilitud, que no muestrea."
        },
        "mcmc_burnin": {
          "$ref": "#/$defs/intOrNaN",
          "description": "Quemado efectivo; \"NaN\" en máxima verosimilitud."
        },
        "mcmc_thinning": {
          "$ref": "#/$defs/intOrNaN",
          "description": "Adelgazamiento efectivo (el libro puede no declararlo y quedarse en su valor por omisión); \"NaN\" en máxima verosimilitud."
        }
      },
      "x-decision": "La 0.11 retira `is_deterministic`: afirmaba una reproducibilidad que nadie puede firmar. Lo que se compara entre dos pasadas son sus residuos, en sigmas."
    },
    "outputs": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "output_series_name",
        "user_output_name",
        "produces",
        "other_output",
        "forecast_entry_point",
        "band_entry_point",
        "band_level",
        "needs_extra_step",
        "output_scale",
        "result_format_units",
        "result_scale_factor"
      ],
      "properties": {
        "output_series_name": {
          "type": "string",
          "minLength": 1,
          "description": "El nombre OFICIAL de la salida, que estampa el emisor: model_id, y con el scope_id detrás cuando lo hay (MatVeh.ES.Bus). Es la clave de la salida en series_input_output. NOT_APPLICABLE en una raíz, que no tiene salida.",
          "x-decision": "Declarado, deja de deducirse por eliminación: la regla R7 del decoder comprueba que es una clave de series_input_output. Dos hojas de una familia con el mismo nombre oficial se rechazan al ensamblar (R15)."
        },
        "user_output_name": {
          "type": "string",
          "minLength": 1,
          "description": "El nombre que el analista le dio a la salida (el del submodelo en un nodo, el de la variable en un @ModelDef), al lado del oficial y sin pisarlo. NOT_APPLICABLE en una raíz (R10)."
        },
        "result_scale_factor": {
          "oneOf": [
            {
              "type": "number",
              "exclusiveMinimum": 0
            },
            {
              "$ref": "#/$defs/nan"
            }
          ],
          "description": "Por cuánto se multiplica lo que viaja, ya deshecha la transformación, para tenerlo en la unidad de result_format_units (1 unidades, 1000 miles, 1e6 millones). \"NaN\" sin declarar, que no es 1: 1 afirmaría unidades sin que nadie lo haya hecho.",
          "x-decision": "Positivo: un factor que multiplica una magnitud no puede ser cero ni negativo."
        },
        "produces": {
          "type": "array",
          "items": {
            "enum": [
              "estimation",
              "fit",
              "forecast",
              "joint"
            ]
          },
          "uniqueItems": true,
          "description": "Qué trae la ficha, estampado por el emisor con vocabulario cerrado; vacía en una raíz.",
          "x-decision": "Vocabulario CERRADO. Que concuerde con las tablas que la ficha trae llenas lo comprueba el decoder (regla R12)."
        },
        "other_output": {
          "type": "string"
        },
        "forecast_entry_point": {
          "type": "string"
        },
        "band_entry_point": {
          "type": "string"
        },
        "band_level": {
          "oneOf": [
            {
              "type": "number",
              "exclusiveMinimum": 0,
              "exclusiveMaximum": 1
            },
            {
              "$ref": "#/$defs/nan"
            }
          ],
          "description": "El nivel de la banda como número, el alfa de las dos colas (0.05 por omisión); \"NaN\" en una raíz, que no prevé.",
          "x-decision": "El nivel con el que SIRVE la plataforma lo fija el anexo de alta (default_band_level); si no casa con éste, se anota, no se detiene."
        },
        "needs_extra_step": {
          "type": "string"
        },
        "output_scale": {
          "type": "string"
        },
        "result_format_units": {
          "type": "string",
          "minLength": 1,
          "description": "OBLIGATORIO: en qué unidades se sirve el resultado. NOT_APPLICABLE en una raíz (R10)."
        }
      }
    },
    "operations": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "reestimation_cadence",
        "resource_profile"
      ],
      "properties": {
        "reestimation_cadence": {
          "type": "string",
          "minLength": 1,
          "description": "OBLIGATORIO."
        },
        "resource_profile": {
          "type": "string"
        }
      }
    },
    "sources": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "repo",
        "files"
      ],
      "properties": {
        "repo": {
          "oneOf": [
            {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "url",
                "branch",
                "commit",
                "dirty"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "pattern": "^https://"
                },
                "branch": {
                  "type": "string"
                },
                "commit": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{40}$"
                },
                "dirty": {
                  "enum": [
                    "yes",
                    "no"
                  ],
                  "x-decision": "\"yes\"/\"no\", tal como se emite (semántica booleana en la prosa del emisor)."
                }
              }
            },
            {
              "$ref": "#/$defs/notApplicable"
            }
          ],
          "description": "El repositorio, o NOT_APPLICABLE cuando el modelo no vive en uno (hasta la 0.10 el campo desaparecía y no distinguía eso de no saberlo)."
        },
        "files": {
          "type": "array",
          "items": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "path",
              "size",
              "sha256",
              "in_repo"
            ],
            "properties": {
              "path": {
                "type": "string",
                "minLength": 1,
                "description": "Relativa al repositorio."
              },
              "size": {
                "type": "integer",
                "minimum": 0
              },
              "sha256": {
                "type": "string",
                "pattern": "^[0-9a-f]{64}$"
              },
              "in_repo": {
                "enum": [
                  "yes",
                  "no"
                ],
                "x-decision": "\"yes\"/\"no\", tal como se emite."
              },
              "role": {
                "type": "string",
                "x-decision": "Opcional e informativo: viaja en las 17 y el contrato del emisor no lo nombra."
              }
            }
          }
        }
      }
    },
    "artifact": {
      "oneOf": [
        {
          "$ref": "#/$defs/contentNone"
        },
        {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "serialized"
          ],
          "properties": {
            "serialized": {
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "path",
                  "sha256",
                  "size"
                ],
                "properties": {
                  "path": {
                    "type": "string",
                    "minLength": 1,
                    "description": "El nombre del fichero, sin directorios."
                  },
                  "loader": {
                    "type": "string",
                    "description": "Cómo se intenta recuperar del archivo del emisor; dice por dónde, no que vaya a estar."
                  },
                  "sha256": {
                    "type": "string",
                    "pattern": "^[0-9a-f]{64}$"
                  },
                  "size": {
                    "type": "integer",
                    "minimum": 0
                  }
                },
                "x-decision": "La huella del .oza: identifica unos BYTES, no el modelo (dos serializaciones del mismo objeto difieren), y no es una promesa de reproducibilidad. Cuando unos bytes la casan, el grado de importación es `verifiable`; nunca «ejecutable». La 0.11 retira `load_path`."
              }
            }
          }
        }
      ]
    },
    "flex_store_config": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "full_distrib_round",
        "in_out_ts",
        "res_fcst_ts",
        "periodic_purge",
        "keep_instance",
        "keep_if_change_over",
        "on_undeclared_change"
      ],
      "properties": {
        "keep_instance": {
          "$ref": "#/$defs/flag01OrNaN",
          "description": "Si el binario de esta instancia sobrevive a la siguiente estimación (en identity hasta la 0.10).",
          "x-decision": "0, 1 o \"NaN\"; es la política del archivo del emisor y la plataforma no la lee."
        },
        "keep_if_change_over": {
          "type": "number",
          "minimum": 0,
          "description": "Cuánto tiene que moverse una reestimación, EN SIGMAS, para conservar el binario de la anterior. Política del emisor; la plataforma no la lee."
        },
        "on_undeclared_change": {
          "enum": [
            "stop",
            "warn",
            "quiet"
          ],
          "description": "Qué hace el archivo del emisor si cambió la estructura o los datos y la versión no subió. Política del emisor; la plataforma no la lee."
        },
        "full_distrib_round": {
          "type": "integer",
          "minimum": 0,
          "description": "0 = la conjunta ni se guarda ni se envía."
        },
        "in_out_ts": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "relational",
            "card"
          ],
          "properties": {
            "relational": {
              "$ref": "#/$defs/flag01"
            },
            "card": {
              "$ref": "#/$defs/flag01"
            }
          }
        },
        "res_fcst_ts": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "relational",
            "card",
            "nu_sigmas_purge",
            "nu_sigmas_outlier"
          ],
          "properties": {
            "relational": {
              "$ref": "#/$defs/flag01"
            },
            "card": {
              "$ref": "#/$defs/flag01"
            },
            "nu_sigmas_purge": {
              "type": "number"
            },
            "nu_sigmas_outlier": {
              "type": "number"
            }
          }
        },
        "periodic_purge": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "day",
            "week",
            "month",
            "year"
          ],
          "properties": {
            "day": {
              "type": "string"
            },
            "week": {
              "type": "string"
            },
            "month": {
              "type": "string"
            },
            "year": {
              "type": "string"
            }
          },
          "x-decision": "Cuatro claves de texto; es la política de purga del archivo del emisor y la plataforma no la lee."
        }
      }
    },
    "limits": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "max_forecasts",
        "max_horizon",
        "licit_aggregations",
        "band_caveats",
        "invalidation_conditions"
      ],
      "properties": {
        "max_forecasts": {
          "oneOf": [
            {
              "type": "integer",
              "minimum": 0
            },
            {
              "$ref": "#/$defs/nan"
            }
          ],
          "description": "OBLIGATORIO; el que manda. \"NaN\" sólo en una raíz, cuya previsión no existe (R10): un campo numérico no admite la palabra reservada."
        },
        "max_horizon": {
          "type": "string",
          "description": "El mismo límite en palabras. NOT_APPLICABLE en una raíz; \"NaN\" si max_forecasts no se pudo leer."
        },
        "licit_aggregations": {
          "type": "string"
        },
        "band_caveats": {
          "type": "string"
        },
        "invalidation_conditions": {
          "type": "string"
        }
      }
    },
    "parameters_mle": {
      "type": "object",
      "description": "Traspuesta sin escalar, ocho cifras significativas. Listas paralelas de la misma longitud.",
      "additionalProperties": false,
      "required": [
        "Name",
        "Factor",
        "Order",
        "Value",
        "StDs",
        "TStudent",
        "RefuseProb",
        "Role",
        "Gradient",
        "Fixed"
      ],
      "properties": {
        "Name": {
          "$ref": "#/$defs/textList"
        },
        "Factor": {
          "$ref": "#/$defs/intList"
        },
        "Order": {
          "$ref": "#/$defs/intList"
        },
        "Value": {
          "$ref": "#/$defs/realList"
        },
        "StDs": {
          "$ref": "#/$defs/realList"
        },
        "TStudent": {
          "$ref": "#/$defs/realList"
        },
        "RefuseProb": {
          "$ref": "#/$defs/realList"
        },
        "Role": {
          "type": "array",
          "items": {
            "enum": [
              "transfer",
              "ar",
              "ma",
              "sigma",
              "hyper",
              "NaN"
            ]
          },
          "x-decision": "Vocabulario CERRADO del contrato 0.11, el mismo en las dos clases: transfer, ar, ma, sigma, hyper, y \"NaN\" para lo que el emisor no reconoce (en vez de inventarse un valor). Otro valor se rechaza."
        },
        "Gradient": {
          "$ref": "#/$defs/realList",
          "description": "Alineada con TODAS las filas; un fijo lleva \"NaN\" en su posición."
        },
        "Fixed": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/flag01"
          }
        }
      }
    },
    "parameters_bys": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "Name",
        "Role",
        "Factor",
        "Order",
        "Scope",
        "Mean",
        "Sd",
        "SeTmser",
        "RhatSplit",
        "Ess",
        "PIsZero",
        "Mode",
        "ModeAtBound",
        "BoundLow",
        "BoundHigh",
        "Quantiles"
      ],
      "properties": {
        "Name": {
          "$ref": "#/$defs/textList"
        },
        "Role": {
          "type": "array",
          "items": {
            "enum": [
              "transfer",
              "ar",
              "ma",
              "sigma",
              "hyper",
              "NaN"
            ]
          },
          "x-decision": "Vocabulario CERRADO del contrato 0.11, el mismo en las dos clases: transfer, ar, ma, sigma, hyper, y \"NaN\" para lo que el emisor no reconoce (en vez de inventarse un valor). Otro valor se rechaza."
        },
        "Factor": {
          "$ref": "#/$defs/intList"
        },
        "Order": {
          "$ref": "#/$defs/intList"
        },
        "Scope": {
          "type": "array",
          "items": {
            "enum": [
              "own",
              "shared",
              "hyper"
            ]
          },
          "x-decision": "Vocabulario CERRADO: own, shared (documentados) y hyper (lo emite la raíz). Otro valor se rechaza.",
          "x-pregunta": "F5"
        },
        "Mean": {
          "$ref": "#/$defs/realList"
        },
        "Sd": {
          "$ref": "#/$defs/realList"
        },
        "SeTmser": {
          "$ref": "#/$defs/realList"
        },
        "RhatSplit": {
          "$ref": "#/$defs/realList"
        },
        "Ess": {
          "$ref": "#/$defs/realList"
        },
        "PIsZero": {
          "$ref": "#/$defs/realList"
        },
        "Mode": {
          "$ref": "#/$defs/realList"
        },
        "ModeAtBound": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/flag01OrNaN"
          }
        },
        "BoundLow": {
          "type": "array",
          "items": {
            "oneOf": [
              {
                "type": "number"
              },
              {
                "enum": [
                  "-Inf",
                  "NaN"
                ]
              }
            ]
          },
          "description": "Sin cota = \"-Inf\", no \"NaN\"."
        },
        "BoundHigh": {
          "type": "array",
          "items": {
            "oneOf": [
              {
                "type": "number"
              },
              {
                "enum": [
                  "+Inf",
                  "NaN"
                ]
              }
            ]
          },
          "description": "Sin cota = \"+Inf\", no \"NaN\"."
        },
        "ModeMethod": {
          "type": "string",
          "x-decision": "Escalar de la TABLA entera, no una lista paralela (lo nombra el árbol de fichas del emisor, no su contrato).",
          "x-pregunta": "F7"
        },
        "DiagSource": {
          "type": "string",
          "x-decision": "Ídem ModeMethod.",
          "x-pregunta": "F7"
        },
        "Quantiles": {
          "type": "array",
          "items": {
            "type": "array",
            "minItems": 27,
            "maxItems": 27,
            "items": {
              "$ref": "#/$defs/real"
            }
          },
          "description": "Una fila por parámetro, 27 columnas en el orden 0, 0.001, 0.01, 0.025, 0.05, 0.10 … 0.90, 0.95, 0.975, 0.99, 0.999, 1."
        }
      }
    },
    "convergence": {
      "type": "object",
      "description": "Objeto de ESCALARES, la excepción a la forma del resto de model.",
      "additionalProperties": false,
      "required": [
        "RhatMax",
        "RhatMaxName",
        "EssMin",
        "EssMinName",
        "Unknowns",
        "Draws",
        "Verdict"
      ],
      "properties": {
        "RhatMax": {
          "$ref": "#/$defs/real"
        },
        "RhatMaxName": {
          "type": "string"
        },
        "EssMin": {
          "$ref": "#/$defs/real"
        },
        "EssMinName": {
          "type": "string"
        },
        "Unknowns": {
          "type": "integer",
          "minimum": 0
        },
        "Draws": {
          "type": "integer",
          "minimum": 0
        },
        "Verdict": {
          "enum": [
            "unknown",
            "not converged",
            "short sample",
            "ok"
          ]
        }
      }
    },
    "relations": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "Name",
        "Kind",
        "Parameters",
        "Submodels"
      ],
      "properties": {
        "Name": {
          "$ref": "#/$defs/textList"
        },
        "Kind": {
          "type": "array",
          "items": {
            "const": "equivalence"
          },
          "description": "Hoy sólo viajan las equivalencias."
        },
        "Parameters": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/textList"
          }
        },
        "Submodels": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/textList"
          }
        }
      }
    },
    "workbook": {
      "type": "object",
      "description": "El libro ya interpretado: doce tablas obligatorias, cada una con columns + rows, con la forma de las tablas del almacén, y desde la 0.11 dos opcionales de la hoja Submodels (ámbito y unidades por nodo).",
      "additionalProperties": false,
      "required": [
        "main",
        "submodels",
        "parameters",
        "hierarchies",
        "hierarchies_term",
        "hierarchies_def",
        "hierarchies_def_coef",
        "hyperparameters",
        "equations",
        "equations_def",
        "variables",
        "variables_open"
      ],
      "properties": {
        "main": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "columns",
            "rows"
          ],
          "properties": {
            "columns": {
              "type": "array",
              "minItems": 4,
              "maxItems": 4,
              "uniqueItems": true,
              "items": {
                "enum": [
                  "row_index",
                  "module",
                  "attribute",
                  "value"
                ]
              }
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "array",
                "minItems": 4,
                "maxItems": 4,
                "items": {
                  "type": [
                    "number",
                    "string"
                  ]
                }
              }
            }
          },
          "x-decision": "El conjunto de columnas es el del contrato; el ORDEN no importa, porque la cabecera `columns` viaja y el decoder direcciona cada celda por el nombre de su columna y la tipa con el tipo que el árbol de fichas declara para ella."
        },
        "submodels": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "columns",
            "rows"
          ],
          "properties": {
            "columns": {
              "type": "array",
              "minItems": 12,
              "maxItems": 12,
              "uniqueItems": true,
              "items": {
                "enum": [
                  "row_index",
                  "output",
                  "description",
                  "type",
                  "grammar",
                  "transformation",
                  "noise_type",
                  "arima_label",
                  "is_active",
                  "begins",
                  "ends",
                  "weight"
                ]
              }
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "array",
                "minItems": 12,
                "maxItems": 12,
                "items": {
                  "type": [
                    "number",
                    "string"
                  ]
                }
              }
            }
          },
          "x-decision": "El conjunto de columnas es el del contrato; el ORDEN no importa, porque la cabecera `columns` viaja y el decoder direcciona cada celda por el nombre de su columna y la tipa con el tipo que el árbol de fichas declara para ella."
        },
        "parameters": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "columns",
            "rows"
          ],
          "properties": {
            "columns": {
              "type": "array",
              "minItems": 15,
              "maxItems": 15,
              "uniqueItems": true,
              "items": {
                "enum": [
                  "row_index",
                  "output",
                  "input",
                  "is_active",
                  "is_additive",
                  "initial",
                  "minimum",
                  "maximum",
                  "prior_mean",
                  "prior_sigma",
                  "degree",
                  "is_fixed",
                  "order_group",
                  "order_index",
                  "order_coefficient"
                ]
              }
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "array",
                "minItems": 15,
                "maxItems": 15,
                "items": {
                  "type": [
                    "number",
                    "string"
                  ]
                }
              }
            }
          },
          "x-decision": "El conjunto de columnas es el del contrato; el ORDEN no importa, porque la cabecera `columns` viaja y el decoder direcciona cada celda por el nombre de su columna y la tipa con el tipo que el árbol de fichas declara para ella."
        },
        "hierarchies": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "columns",
            "rows"
          ],
          "properties": {
            "columns": {
              "type": "array",
              "minItems": 5,
              "maxItems": 5,
              "uniqueItems": true,
              "items": {
                "enum": [
                  "row_index",
                  "hierarchy",
                  "is_active",
                  "sigma",
                  "sigma_weight"
                ]
              }
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "array",
                "minItems": 5,
                "maxItems": 5,
                "items": {
                  "type": [
                    "number",
                    "string"
                  ]
                }
              }
            }
          },
          "x-decision": "El conjunto de columnas es el del contrato; el ORDEN no importa, porque la cabecera `columns` viaja y el decoder direcciona cada celda por el nombre de su columna y la tipa con el tipo que el árbol de fichas declara para ella."
        },
        "hierarchies_term": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "columns",
            "rows"
          ],
          "properties": {
            "columns": {
              "type": "array",
              "minItems": 3,
              "maxItems": 3,
              "uniqueItems": true,
              "items": {
                "enum": [
                  "row_index",
                  "term_index",
                  "term"
                ]
              }
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "array",
                "minItems": 3,
                "maxItems": 3,
                "items": {
                  "type": [
                    "number",
                    "string"
                  ]
                }
              }
            }
          },
          "x-decision": "El conjunto de columnas es el del contrato; el ORDEN no importa, porque la cabecera `columns` viaja y el decoder direcciona cada celda por el nombre de su columna y la tipa con el tipo que el árbol de fichas declara para ella."
        },
        "hierarchies_def": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "columns",
            "rows"
          ],
          "properties": {
            "columns": {
              "type": "array",
              "minItems": 6,
              "maxItems": 6,
              "uniqueItems": true,
              "items": {
                "enum": [
                  "row_index",
                  "hierarchy",
                  "output",
                  "input",
                  "degree",
                  "relative_sigma"
                ]
              }
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "array",
                "minItems": 6,
                "maxItems": 6,
                "items": {
                  "type": [
                    "number",
                    "string"
                  ]
                }
              }
            }
          },
          "x-decision": "El conjunto de columnas es el del contrato; el ORDEN no importa, porque la cabecera `columns` viaja y el decoder direcciona cada celda por el nombre de su columna y la tipa con el tipo que el árbol de fichas declara para ella."
        },
        "hierarchies_def_coef": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "columns",
            "rows"
          ],
          "properties": {
            "columns": {
              "type": "array",
              "minItems": 3,
              "maxItems": 3,
              "uniqueItems": true,
              "items": {
                "enum": [
                  "row_index",
                  "term_index",
                  "coefficient"
                ]
              }
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "array",
                "minItems": 3,
                "maxItems": 3,
                "items": {
                  "type": [
                    "number",
                    "string"
                  ]
                }
              }
            }
          },
          "x-decision": "El conjunto de columnas es el del contrato; el ORDEN no importa, porque la cabecera `columns` viaja y el decoder direcciona cada celda por el nombre de su columna y la tipa con el tipo que el árbol de fichas declara para ella."
        },
        "hyperparameters": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "columns",
            "rows"
          ],
          "properties": {
            "columns": {
              "type": "array",
              "minItems": 9,
              "maxItems": 9,
              "uniqueItems": true,
              "items": {
                "enum": [
                  "row_index",
                  "hierarchy",
                  "term",
                  "initial",
                  "minimum",
                  "maximum",
                  "prior_mean",
                  "prior_sigma",
                  "is_fixed"
                ]
              }
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "array",
                "minItems": 9,
                "maxItems": 9,
                "items": {
                  "type": [
                    "number",
                    "string"
                  ]
                }
              }
            }
          },
          "x-decision": "El conjunto de columnas es el del contrato; el ORDEN no importa, porque la cabecera `columns` viaja y el decoder direcciona cada celda por el nombre de su columna y la tipa con el tipo que el árbol de fichas declara para ella."
        },
        "equations": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "columns",
            "rows"
          ],
          "properties": {
            "columns": {
              "type": "array",
              "minItems": 8,
              "maxItems": 8,
              "uniqueItems": true,
              "items": {
                "enum": [
                  "row_index",
                  "type",
                  "equation",
                  "minimum",
                  "maximum",
                  "prior_mean",
                  "prior_sigma",
                  "initial"
                ]
              }
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "array",
                "minItems": 8,
                "maxItems": 8,
                "items": {
                  "type": [
                    "number",
                    "string"
                  ]
                }
              }
            }
          },
          "x-decision": "El conjunto de columnas es el del contrato; el ORDEN no importa, porque la cabecera `columns` viaja y el decoder direcciona cada celda por el nombre de su columna y la tipa con el tipo que el árbol de fichas declara para ella."
        },
        "equations_def": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "columns",
            "rows"
          ],
          "properties": {
            "columns": {
              "type": "array",
              "minItems": 6,
              "maxItems": 6,
              "uniqueItems": true,
              "items": {
                "enum": [
                  "row_index",
                  "equation",
                  "output",
                  "input",
                  "degree",
                  "coefficient"
                ]
              }
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "array",
                "minItems": 6,
                "maxItems": 6,
                "items": {
                  "type": [
                    "number",
                    "string"
                  ]
                }
              }
            }
          },
          "x-decision": "El conjunto de columnas es el del contrato; el ORDEN no importa, porque la cabecera `columns` viaja y el decoder direcciona cada celda por el nombre de su columna y la tipa con el tipo que el árbol de fichas declara para ella."
        },
        "variables": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "columns",
            "rows"
          ],
          "properties": {
            "columns": {
              "type": "array",
              "minItems": 22,
              "maxItems": 22,
              "uniqueItems": true,
              "items": {
                "enum": [
                  "row_index",
                  "sheet",
                  "name",
                  "scenario",
                  "description",
                  "type",
                  "expression",
                  "use_cache",
                  "is_trivial",
                  "data_concatenation",
                  "extension_rule",
                  "var_group",
                  "deco_medio",
                  "deco_canal",
                  "medio_cdm_calc",
                  "submedio_calc",
                  "clasif_submedio_calc",
                  "inv_expression",
                  "nature",
                  "sat_varname",
                  "is_grps",
                  "in_ma364"
                ]
              }
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "array",
                "minItems": 22,
                "maxItems": 22,
                "items": {
                  "type": [
                    "number",
                    "string"
                  ]
                }
              }
            }
          },
          "x-decision": "El conjunto de columnas es el del contrato; el ORDEN no importa, porque la cabecera `columns` viaja y el decoder direcciona cada celda por el nombre de su columna y la tipa con el tipo que el árbol de fichas declara para ella."
        },
        "variables_open": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "columns",
            "rows"
          ],
          "properties": {
            "columns": {
              "type": "array",
              "minItems": 5,
              "maxItems": 5,
              "uniqueItems": true,
              "items": {
                "enum": [
                  "row_index",
                  "sheet",
                  "column_name",
                  "role",
                  "value"
                ]
              }
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "array",
                "minItems": 5,
                "maxItems": 5,
                "items": {
                  "type": [
                    "number",
                    "string"
                  ]
                }
              }
            }
          },
          "x-decision": "El conjunto de columnas es el del contrato; el ORDEN no importa, porque la cabecera `columns` viaja y el decoder direcciona cada celda por el nombre de su columna y la tipa con el tipo que el árbol de fichas declara para ella."
        },
        "submodels_scope": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "columns",
            "rows"
          ],
          "properties": {
            "columns": {
              "type": "array",
              "minItems": 4,
              "maxItems": 4,
              "uniqueItems": true,
              "items": {
                "enum": [
                  "row_index",
                  "scope_index",
                  "dimension",
                  "value"
                ]
              }
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "array",
                "minItems": 4,
                "maxItems": 4,
                "items": {
                  "type": [
                    "number",
                    "string"
                  ]
                }
              }
            }
          },
          "description": "Las columnas scope.<dimensión> de la hoja Submodels, una fila por nodo y dimensión: de aquí compone el emisor el ámbito de cada hoja.",
          "x-decision": "OPCIONAL: las tres raíces de la 0.11 la traen (con filas o sin ellas), pero ningún documento del emisor la describe, así que exigirla sería inventar el contrato. Las columnas son las que traen las fichas; preguntado en C14."
        },
        "submodels_units": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "columns",
            "rows"
          ],
          "properties": {
            "columns": {
              "type": "array",
              "minItems": 4,
              "maxItems": 4,
              "uniqueItems": true,
              "items": {
                "enum": [
                  "row_index",
                  "units_and_scale",
                  "result_format_units",
                  "result_scale_factor"
                ]
              }
            },
            "rows": {
              "type": "array",
              "items": {
                "type": "array",
                "minItems": 4,
                "maxItems": 4,
                "items": {
                  "type": [
                    "number",
                    "string"
                  ]
                }
              }
            }
          },
          "description": "Las tres columnas reservadas de unidades de la hoja Submodels (respuesta del emisor a la carta de la 0.11, punto 2): lo que declara la celda manda para ese nodo y lo que calla lo hereda de la metadata.",
          "x-decision": "OPCIONAL, por lo mismo que submodels_scope: la traen las tres raíces y ningún documento la describe como tabla de la ficha."
        }
      }
    },
    "series_fit": {
      "type": "object",
      "description": "El fechado (clave = nombre del fechado) + las MISMAS siete series en las dos clases.",
      "required": [
        "Residuals",
        "DifNoise",
        "Noise",
        "Interruptions",
        "FullTransformed",
        "Transformed",
        "PrevHistTrans"
      ],
      "properties": {
        "Residuals": {
          "$ref": "#/$defs/realList"
        },
        "DifNoise": {
          "$ref": "#/$defs/realList"
        },
        "Noise": {
          "$ref": "#/$defs/realList"
        },
        "Interruptions": {
          "$ref": "#/$defs/realList"
        },
        "FullTransformed": {
          "$ref": "#/$defs/realList"
        },
        "Transformed": {
          "$ref": "#/$defs/realList"
        },
        "PrevHistTrans": {
          "$ref": "#/$defs/realList"
        }
      },
      "additionalProperties": {
        "$ref": "#/$defs/dateList"
      },
      "minProperties": 8,
      "maxProperties": 8,
      "x-decision": "La clave del fechado es la única clave adicional, con fechas, y se llama como metadata.identity.dating (regla R3 del decoder)."
    },
    "series_input_output": {
      "type": "object",
      "description": "Datos con los que se estimó: el fechado, la salida observada y un driver por término.",
      "minProperties": 2,
      "additionalProperties": {
        "type": "array",
        "items": {
          "oneOf": [
            {
              "$ref": "#/$defs/real"
            },
            {
              "$ref": "#/$defs/date"
            }
          ]
        }
      },
      "x-decision": "La clave del fechado se llama como metadata.identity.dating (R3). La salida es la clave que declara metadata.outputs.output_series_name (R7): ya no se deduce por eliminación, que falla en cuanto un driver se llame como un parámetro."
    },
    "diagnostics": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "DiagCode",
        "Title",
        "Value",
        "Punctuation",
        "Accept",
        "Refuse",
        "Qualification"
      ],
      "properties": {
        "DiagCode": {
          "$ref": "#/$defs/textList",
          "x-decision": "Texto. Los once códigos que se emiten hoy son los conocidos; uno nuevo se acepta y se marca «no interpretado»."
        },
        "Title": {
          "$ref": "#/$defs/textList"
        },
        "Value": {
          "$ref": "#/$defs/realList"
        },
        "Punctuation": {
          "$ref": "#/$defs/realList"
        },
        "Accept": {
          "$ref": "#/$defs/realList"
        },
        "Refuse": {
          "$ref": "#/$defs/realList"
        },
        "Qualification": {
          "type": "array",
          "items": {
            "enum": [
              "UNNECESSARY",
              "GOOD",
              "ACCEPTABLE",
              "REFUSED"
            ]
          }
        }
      }
    },
    "correlations": {
      "type": "object",
      "description": "encoding-spec-v1, lower-triangle-fixed-point. Congelada: idéntica byte a byte a la 0.9.",
      "additionalProperties": false,
      "required": [
        "encoding",
        "scale",
        "names",
        "rows"
      ],
      "properties": {
        "encoding": {
          "const": "lower-triangle-fixed-point"
        },
        "scale": {
          "type": "number",
          "exclusiveMinimum": 0
        },
        "names": {
          "type": "array",
          "items": {
            "type": "string",
            "pattern": "^.+\\[-?\\d+,-?\\d+\\]$"
          }
        },
        "rows": {
          "type": "array",
          "items": {
            "type": "string",
            "pattern": "^(-?\\d+( -?\\d+)*)?$"
          }
        }
      }
    },
    "conditioning": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "condition_number",
        "eigenvalues"
      ],
      "properties": {
        "condition_number": {
          "$ref": "#/$defs/real"
        },
        "eigenvalues": {
          "$ref": "#/$defs/realList"
        }
      }
    },
    "mcmc": {
      "type": "object",
      "description": "encoding-spec-v1, standardize-rectangle-fixed-point. En la 0.11 los miembros son siete: encoding, scale, draws, names, mean, sd, rows.",
      "additionalProperties": false,
      "required": [
        "encoding",
        "scale",
        "draws",
        "names",
        "mean",
        "sd",
        "rows"
      ],
      "properties": {
        "encoding": {
          "const": "standardize-rectangle-fixed-point"
        },
        "scale": {
          "type": "number",
          "exclusiveMinimum": 0
        },
        "draws": {
          "type": "integer",
          "minimum": 0,
          "description": "El número de extracciones, declarado dentro de la sección para que el artefacto suelto se describa a sí mismo.",
          "x-decision": "Donde viajan los dos, draws == convergence.Draws, y cada fila no vacía tiene draws valores (regla R6 del decoder)."
        },
        "names": {
          "$ref": "#/$defs/textList"
        },
        "mean": {
          "$ref": "#/$defs/realList"
        },
        "sd": {
          "$ref": "#/$defs/realList"
        },
        "rows": {
          "type": "array",
          "items": {
            "type": "string",
            "pattern": "^(-?\\d+( -?\\d+)*)?$"
          }
        }
      }
    },
    "stats_modeldef": {
      "type": "array",
      "minItems": 1,
      "maxItems": 1,
      "description": "Una lista de un elemento, como la lee el archivo.",
      "items": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "FirstDate",
          "LastDate",
          "DataNumber",
          "VarNumber",
          "Sigma",
          "R2",
          "RSS",
          "Swartz",
          "Pearson",
          "Kurtosis",
          "Asymmetry",
          "Variance",
          "MaxLHSigma",
          "MarquardtIterNumber",
          "Qualification",
          "ArimaLabel",
          "Average",
          "DiagnosysLogPrior",
          "normMaxLH",
          "MedianScaledRmse",
          "FirstObsDate",
          "LastObsDate",
          "WindowNumber",
          "DiffLostNumber",
          "MissingNumber",
          "ObservedNumber"
        ],
        "properties": {
          "FirstDate": {
            "$ref": "#/$defs/date"
          },
          "LastDate": {
            "$ref": "#/$defs/date"
          },
          "FirstObsDate": {
            "$ref": "#/$defs/date"
          },
          "LastObsDate": {
            "$ref": "#/$defs/date"
          },
          "DataNumber": {
            "type": "integer",
            "minimum": 0,
            "description": "Periodos que el MOTOR usó, en los dos marcos (0.11). Cuenta los omitidos: TOL no descarta un dato que falta, lo estima."
          },
          "WindowNumber": {
            "type": "integer",
            "minimum": 0,
            "description": "Periodos que abarca la ventana."
          },
          "DiffLostNumber": {
            "type": "integer",
            "minimum": 0,
            "description": "Periodos que la diferenciación se come por delante."
          },
          "MissingNumber": {
            "type": "integer",
            "minimum": 0,
            "description": "Omitidos dentro de lo que el motor usó."
          },
          "ObservedNumber": {
            "type": "integer",
            "minimum": 0,
            "description": "Observaciones de verdad. Con las otras cuatro: WindowNumber − DiffLostNumber = DataNumber y DataNumber − MissingNumber = ObservedNumber (regla R9 del decoder)."
          },
          "MedianScaledRmse": {
            "$ref": "#/$defs/real",
            "description": "Recalculable desde la ficha (series_fit.Transformed y PrevHistTrans, data.transform); no se mide sobre la misma muestra que Sigma. \"NaN\" donde la ficha no trae con qué (la raíz de un árbol)."
          },
          "VarNumber": {
            "type": "integer",
            "minimum": 0,
            "description": "Variables del modelo, no filas de la tabla de parámetros."
          },
          "Sigma": {
            "$ref": "#/$defs/real"
          },
          "R2": {
            "$ref": "#/$defs/real"
          },
          "RSS": {
            "$ref": "#/$defs/real"
          },
          "Swartz": {
            "$ref": "#/$defs/real"
          },
          "Pearson": {
            "$ref": "#/$defs/real"
          },
          "Kurtosis": {
            "$ref": "#/$defs/real"
          },
          "Asymmetry": {
            "$ref": "#/$defs/real"
          },
          "Variance": {
            "$ref": "#/$defs/real"
          },
          "MaxLHSigma": {
            "$ref": "#/$defs/real"
          },
          "MarquardtIterNumber": {
            "type": "integer",
            "minimum": 0
          },
          "Qualification": {
            "enum": [
              "UNNECESSARY",
              "GOOD",
              "ACCEPTABLE",
              "REFUSED",
              "NaN"
            ],
            "x-decision": "Los cuatro valores que declara el archivo de modelos del emisor, más \"NaN\" = «no calificado» (diagnóstico apagado); la 0.11 retira el \"?\" de la 0.10."
          },
          "ArimaLabel": {
            "type": "string"
          },
          "Average": {
            "$ref": "#/$defs/real"
          },
          "DiagnosysLogPrior": {
            "$ref": "#/$defs/real"
          },
          "normMaxLH": {
            "$ref": "#/$defs/real"
          }
        }
      }
    },
    "stats_node": {
      "type": "array",
      "minItems": 1,
      "maxItems": 1,
      "description": "Una lista de un elemento, como la lee el archivo.",
      "items": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "FirstDate",
          "LastDate",
          "DataNumber",
          "VarNumber",
          "Sigma",
          "R2",
          "MedianScaledRmse",
          "FirstObsDate",
          "LastObsDate",
          "WindowNumber",
          "DiffLostNumber",
          "MissingNumber",
          "ObservedNumber"
        ],
        "properties": {
          "FirstDate": {
            "$ref": "#/$defs/date"
          },
          "LastDate": {
            "$ref": "#/$defs/date"
          },
          "FirstObsDate": {
            "$ref": "#/$defs/date"
          },
          "LastObsDate": {
            "$ref": "#/$defs/date"
          },
          "DataNumber": {
            "type": "integer",
            "minimum": 0,
            "description": "Periodos que el MOTOR usó, también en un nodo (0.11; en la 0.10 era la ventana): en un nodo se deriva de la ventana menos la pérdida por diferenciación."
          },
          "WindowNumber": {
            "type": "integer",
            "minimum": 0
          },
          "DiffLostNumber": {
            "type": "integer",
            "minimum": 0
          },
          "MissingNumber": {
            "type": "integer",
            "minimum": 0
          },
          "ObservedNumber": {
            "type": "integer",
            "minimum": 0,
            "description": "Las dos identidades de la muestra valen también aquí (R9)."
          },
          "MedianScaledRmse": {
            "$ref": "#/$defs/real"
          },
          "VarNumber": {
            "type": "integer",
            "minimum": 0,
            "description": "Variables del modelo, no filas de la tabla de parámetros."
          },
          "Sigma": {
            "$ref": "#/$defs/real"
          },
          "R2": {
            "$ref": "#/$defs/real"
          }
        }
      }
    },
    "forecast_mle": {
      "type": "object",
      "description": "La previsión de máxima verosimilitud: el fechado, el modelo evaluado en la moda de cada parámetro y su desviación típica (el contrato, «forecast — la previsión»).",
      "required": [
        "point_modal",
        "point_modal_sd"
      ],
      "properties": {
        "point_modal": {
          "$ref": "#/$defs/realList"
        },
        "point_modal_sd": {
          "$ref": "#/$defs/realList"
        }
      },
      "additionalProperties": {
        "$ref": "#/$defs/dateList"
      },
      "minProperties": 3,
      "maxProperties": 3
    },
    "forecast_bsr": {
      "type": "object",
      "description": "La previsión bayesiana: el fechado, el modelo evaluado en la moda (presente y vacía: \"NaN\" en todas las fechas), la media y la mediana de cada parámetro, la media y la desviación de los futuros muestreados, y sus veintisiete cuantiles. sample_sd NO autoriza una banda normal: la banda se dibuja con los cuantiles.",
      "x-decision": "Los veintisiete cuantiles son las probabilidades del contrato para param_bsr («los mismos de param_bsr»; el árbol de fichas, en este orden: 0, 0.001, 0.01, 0.025, 0.05, 0.10 … 0.95, 0.975, 0.99, 0.999, 1), con la probabilidad por mil y cuatro cifras en el nombre (0.025 → sample_q0025), que es como los nombran las fichas. Todas obligatorias: la forma no cambia según lo que se haya calculado, y point_modal viaja aunque venga vacía.",
      "required": [
        "point_modal",
        "point_mean",
        "point_median",
        "sample_mean",
        "sample_sd",
        "sample_q0000",
        "sample_q0001",
        "sample_q0010",
        "sample_q0025",
        "sample_q0050",
        "sample_q0100",
        "sample_q0150",
        "sample_q0200",
        "sample_q0250",
        "sample_q0300",
        "sample_q0350",
        "sample_q0400",
        "sample_q0450",
        "sample_q0500",
        "sample_q0550",
        "sample_q0600",
        "sample_q0650",
        "sample_q0700",
        "sample_q0750",
        "sample_q0800",
        "sample_q0850",
        "sample_q0900",
        "sample_q0950",
        "sample_q0975",
        "sample_q0990",
        "sample_q0999",
        "sample_q1000"
      ],
      "properties": {
        "point_modal": {
          "$ref": "#/$defs/realList"
        },
        "point_mean": {
          "$ref": "#/$defs/realList"
        },
        "point_median": {
          "$ref": "#/$defs/realList"
        },
        "sample_mean": {
          "$ref": "#/$defs/realList"
        },
        "sample_sd": {
          "$ref": "#/$defs/realList"
        }
      },
      "patternProperties": {
        "^sample_q(0\\d{3}|1000)$": {
          "$ref": "#/$defs/realList"
        }
      },
      "additionalProperties": {
        "$ref": "#/$defs/dateList"
      },
      "minProperties": 33,
      "maxProperties": 33
    }
  }
}
