{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://meyorda.uz/research/uzbek-food-ai-benchmark-2026/protocol.schema.json",
  "title": "Meyorda Uzbek Food AI Benchmark protocol schema",
  "description": "Schema for a versioned pre-results research protocol. It describes planned methods and must not be used to represent benchmark results.",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "$schema",
    "$id",
    "protocolVersion",
    "status",
    "resultsPublished",
    "publishedAt",
    "lastModified",
    "titles",
    "abstracts",
    "organizer",
    "researchQuestion",
    "scope",
    "systemEligibility",
    "caseDesign",
    "referenceMethods",
    "outcomes",
    "reportingRules",
    "reproducibility",
    "limitations",
    "changePolicy",
    "artifacts"
  ],
  "properties": {
    "$schema": {
      "const": "https://meyorda.uz/research/uzbek-food-ai-benchmark-2026/protocol.schema.json"
    },
    "$id": {
      "type": "string",
      "format": "uri"
    },
    "protocolVersion": {
      "const": "0.1.0"
    },
    "status": {
      "const": "protocol_published_before_results"
    },
    "resultsPublished": {
      "const": false
    },
    "publishedAt": {
      "type": "string",
      "format": "date"
    },
    "lastModified": {
      "type": "string",
      "format": "date"
    },
    "titles": {
      "$ref": "#/$defs/localizedText"
    },
    "abstracts": {
      "$ref": "#/$defs/localizedText"
    },
    "organizer": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "name",
        "url",
        "contact",
        "conflictDisclosure"
      ],
      "properties": {
        "name": {
          "$ref": "#/$defs/nonEmptyString"
        },
        "url": {
          "type": "string",
          "format": "uri"
        },
        "contact": {
          "type": "string",
          "format": "email"
        },
        "conflictDisclosure": {
          "$ref": "#/$defs/nonEmptyString"
        }
      }
    },
    "researchQuestion": {
      "$ref": "#/$defs/localizedText"
    },
    "scope": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "market",
        "plannedDishTypes",
        "plannedIndependentPlatesPerDish",
        "plannedIndependentPlates",
        "plannedImagesPerPlate",
        "plannedNegativeControls",
        "plannedSystems",
        "primaryTrack",
        "languages"
      ],
      "properties": {
        "market": {
          "const": "Uzbekistan"
        },
        "plannedDishTypes": {
          "type": "integer",
          "minimum": 1
        },
        "plannedIndependentPlatesPerDish": {
          "type": "integer",
          "minimum": 1
        },
        "plannedIndependentPlates": {
          "type": "integer",
          "minimum": 1
        },
        "plannedImagesPerPlate": {
          "type": "integer",
          "minimum": 1
        },
        "plannedNegativeControls": {
          "type": "integer",
          "minimum": 0
        },
        "plannedSystems": {
          "type": "integer",
          "minimum": 2
        },
        "primaryTrack": {
          "const": "photo_only"
        },
        "languages": {
          "type": "array",
          "minItems": 2,
          "uniqueItems": true,
          "items": {
            "enum": [
              "uz",
              "ru"
            ]
          }
        }
      }
    },
    "systemEligibility": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "rosterStatus",
        "rules",
        "tentativeCandidates",
        "candidateDisclaimer"
      ],
      "properties": {
        "rosterStatus": {
          "const": "to_be_frozen_before_testing"
        },
        "rules": {
          "$ref": "#/$defs/nonEmptyStringArray"
        },
        "tentativeCandidates": {
          "$ref": "#/$defs/nonEmptyStringArray"
        },
        "candidateDisclaimer": {
          "$ref": "#/$defs/nonEmptyString"
        }
      }
    },
    "caseDesign": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "independentUnit",
        "plannedTracks",
        "dishRosterRule",
        "imageRightsRule",
        "negativeControlRule"
      ],
      "properties": {
        "independentUnit": {
          "const": "plate"
        },
        "plannedTracks": {
          "type": "array",
          "minItems": 1,
          "items": {
            "$ref": "#/$defs/idDescription"
          }
        },
        "dishRosterRule": {
          "$ref": "#/$defs/nonEmptyString"
        },
        "imageRightsRule": {
          "$ref": "#/$defs/nonEmptyString"
        },
        "negativeControlRule": {
          "$ref": "#/$defs/nonEmptyString"
        }
      }
    },
    "referenceMethods": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "dishIdentity",
        "portion",
        "nutrition",
        "restaurantRule"
      ],
      "properties": {
        "dishIdentity": {
          "$ref": "#/$defs/nonEmptyString"
        },
        "portion": {
          "$ref": "#/$defs/nonEmptyString"
        },
        "nutrition": {
          "$ref": "#/$defs/nonEmptyString"
        },
        "restaurantRule": {
          "$ref": "#/$defs/nonEmptyString"
        }
      }
    },
    "outcomes": {
      "type": "array",
      "minItems": 1,
      "items": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "id",
          "kind",
          "unit",
          "description"
        ],
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[a-z0-9]+(?:_[a-z0-9]+)*$"
          },
          "kind": {
            "enum": [
              "primary",
              "secondary",
              "safety"
            ]
          },
          "unit": {
            "$ref": "#/$defs/nonEmptyString"
          },
          "description": {
            "$ref": "#/$defs/nonEmptyString"
          }
        }
      }
    },
    "reportingRules": {
      "$ref": "#/$defs/nonEmptyStringArray"
    },
    "reproducibility": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "inputNormalization",
        "runRules",
        "plannedArtifacts"
      ],
      "properties": {
        "inputNormalization": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "maximumEdgePixels",
            "format",
            "jpegQuality",
            "chromaSubsampling"
          ],
          "properties": {
            "maximumEdgePixels": {
              "type": "integer",
              "minimum": 1
            },
            "format": {
              "const": "image/jpeg"
            },
            "jpegQuality": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            },
            "chromaSubsampling": {
              "type": "string"
            }
          }
        },
        "runRules": {
          "$ref": "#/$defs/nonEmptyStringArray"
        },
        "plannedArtifacts": {
          "$ref": "#/$defs/nonEmptyStringArray"
        }
      }
    },
    "limitations": {
      "$ref": "#/$defs/nonEmptyStringArray"
    },
    "changePolicy": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "beforeResults",
        "afterResults"
      ],
      "properties": {
        "beforeResults": {
          "$ref": "#/$defs/nonEmptyString"
        },
        "afterResults": {
          "$ref": "#/$defs/nonEmptyString"
        }
      }
    },
    "artifacts": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "landingPageRu",
        "landingPageUz",
        "protocolJson",
        "schemaJson",
        "datasetStatus",
        "doiStatus",
        "licenseStatus"
      ],
      "properties": {
        "landingPageRu": {
          "type": "string",
          "format": "uri"
        },
        "landingPageUz": {
          "type": "string",
          "format": "uri"
        },
        "protocolJson": {
          "type": "string",
          "format": "uri"
        },
        "schemaJson": {
          "type": "string",
          "format": "uri"
        },
        "datasetStatus": {
          "const": "not_published"
        },
        "doiStatus": {
          "const": "not_assigned"
        },
        "licenseStatus": {
          "const": "not_assigned"
        }
      }
    }
  },
  "$defs": {
    "nonEmptyString": {
      "type": "string",
      "minLength": 1
    },
    "nonEmptyStringArray": {
      "type": "array",
      "minItems": 1,
      "items": {
        "$ref": "#/$defs/nonEmptyString"
      }
    },
    "localizedText": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "ru",
        "uz",
        "en"
      ],
      "properties": {
        "ru": {
          "$ref": "#/$defs/nonEmptyString"
        },
        "uz": {
          "$ref": "#/$defs/nonEmptyString"
        },
        "en": {
          "$ref": "#/$defs/nonEmptyString"
        }
      }
    },
    "idDescription": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "id",
        "description"
      ],
      "properties": {
        "id": {
          "type": "string",
          "pattern": "^[a-z0-9]+(?:_[a-z0-9]+)*$"
        },
        "description": {
          "$ref": "#/$defs/nonEmptyString"
        }
      }
    }
  }
}
