{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://groupmixer.app/benchmarks/public-group-generator-v1/publication.schema.json",
  "title": "GroupMixer public group-generator benchmark publication",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "schemaVersion",
    "benchmarkId",
    "benchmarkRevision",
    "attemptSeeds",
    "comparators",
    "resourceClasses",
    "cases",
    "disclosure"
  ],
  "properties": {
    "schemaVersion": { "const": "groupmixer-benchmark-publication-v1" },
    "benchmarkId": { "const": "public-group-generator-v1" },
    "benchmarkRevision": { "type": "integer", "minimum": 1 },
    "attemptSeeds": {
      "type": "array",
      "items": { "type": "integer" },
      "minItems": 1,
      "uniqueItems": true
    },
    "comparators": {
      "type": "array",
      "items": { "$ref": "#/$defs/comparator" },
      "minItems": 1
    },
    "resourceClasses": {
      "type": "object",
      "additionalProperties": { "$ref": "#/$defs/resourceClass" },
      "minProperties": 1
    },
    "cases": {
      "type": "array",
      "items": { "$ref": "#/$defs/case" },
      "minItems": 1
    },
    "disclosure": { "type": "string", "minLength": 1 }
  },
  "$defs": {
    "comparator": {
      "type": "object",
      "additionalProperties": false,
      "required": ["id", "name", "kind"],
      "properties": {
        "id": { "type": "string", "minLength": 1 },
        "name": { "type": "string", "minLength": 1 },
        "kind": { "enum": ["product", "general_purpose_solver", "end_user_product"] }
      }
    },
    "resourceClass": {
      "type": "object",
      "additionalProperties": false,
      "required": ["timeout_seconds", "logical_cpu_limit"],
      "properties": {
        "timeout_seconds": { "type": "integer", "minimum": 1 },
        "logical_cpu_limit": { "type": "integer", "minimum": 1 }
      }
    },
    "observedLimit": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "attempted_member_count": { "type": "integer", "minimum": 1 },
        "accepted_member_count": { "type": "integer", "minimum": 0 },
        "http_status": { "type": "integer", "minimum": 100, "maximum": 599 },
        "response_body": { "type": "string" }
      }
    },
    "summary": {
      "type": "object",
      "additionalProperties": false,
      "required": ["status", "attemptCount", "validAttemptCount", "bestCost", "medianCost", "statusCounts"],
      "properties": {
        "status": {
          "enum": [
            "optimal",
            "optimal_proven",
            "feasible",
            "timeout",
            "error",
            "unsupported",
            "unavailable",
            "invalid",
            "pending_verification",
            "not_run",
            "infeasible_proven"
          ]
        },
        "attemptCount": { "type": "integer", "minimum": 0 },
        "validAttemptCount": { "type": "integer", "minimum": 0 },
        "bestCost": { "type": ["number", "null"] },
        "medianCost": { "type": ["number", "null"] },
        "statusCounts": {
          "type": "object",
          "additionalProperties": { "type": "integer", "minimum": 0 }
        },
        "observedLimit": { "$ref": "#/$defs/observedLimit" }
      }
    },
    "commonMetrics": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "unique_contacts",
        "contact_incidences",
        "total_repeat_excess",
        "pairs_repeated",
        "maximum_pair_count",
        "linear_repeat_penalty",
        "squared_repeat_concentration",
        "minimum_unique_contacts_per_participant",
        "mean_unique_contacts_per_participant",
        "maximum_unique_contacts_per_participant",
        "pair_frequency_histogram"
      ],
      "properties": {
        "unique_contacts": { "type": "integer", "minimum": 0 },
        "contact_incidences": { "type": "integer", "minimum": 0 },
        "total_repeat_excess": { "type": "integer", "minimum": 0 },
        "pairs_repeated": { "type": "integer", "minimum": 0 },
        "maximum_pair_count": { "type": "integer", "minimum": 0 },
        "linear_repeat_penalty": { "type": "integer", "minimum": 0 },
        "squared_repeat_concentration": { "type": "integer", "minimum": 0 },
        "minimum_unique_contacts_per_participant": { "type": "integer", "minimum": 0 },
        "mean_unique_contacts_per_participant": { "type": "number", "minimum": 0 },
        "maximum_unique_contacts_per_participant": { "type": "integer", "minimum": 0 },
        "pair_frequency_histogram": {
          "type": "object",
          "patternProperties": { "^[0-9]+$": { "type": "integer", "minimum": 0 } },
          "additionalProperties": false
        }
      }
    },
    "terminalDetail": {
      "type": "object",
      "additionalProperties": false,
      "required": ["memoryAllocationFailure", "outerWatchdogFired"],
      "properties": {
        "memoryAllocationFailure": { "type": "boolean" },
        "outerWatchdogFired": { "type": "boolean" }
      }
    },
    "attempt": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "attemptId",
        "seed",
        "status",
        "timingClass",
        "canonicalCost",
        "wallSeconds",
        "solveSeconds",
        "peakRssBytes",
        "proof",
        "commonMetrics"
      ],
      "properties": {
        "attemptId": { "type": "string", "minLength": 1 },
        "seed": { "type": ["integer", "null"] },
        "status": {
          "enum": [
            "optimal_zero",
            "optimal_proven",
            "feasible",
            "feasible_timeout",
            "no_solution_timeout",
            "infeasible_proven",
            "target_impossible",
            "error",
            "invalid_output",
            "unsupported",
            "unavailable",
            "not_run"
          ]
        },
        "timingClass": { "enum": ["same_machine_native", "hosted_observational"] },
        "canonicalCost": { "type": ["number", "null"] },
        "wallSeconds": { "type": ["number", "null"], "minimum": 0 },
        "solveSeconds": { "type": ["number", "null"], "minimum": 0 },
        "peakRssBytes": { "type": ["integer", "null"], "minimum": 0 },
        "proof": {
          "type": ["string", "null"],
          "enum": ["optimality", "hard_infeasibility", "target_impossibility", null]
        },
        "commonMetrics": {
          "oneOf": [
            { "$ref": "#/$defs/commonMetrics" },
            { "type": "null" }
          ]
        },
        "terminalDetail": { "$ref": "#/$defs/terminalDetail" }
      }
    },
    "dimensions": {
      "type": "object",
      "additionalProperties": false,
      "required": ["people", "groups", "sessions"],
      "properties": {
        "people": { "type": "integer", "minimum": 1 },
        "groups": { "type": "integer", "minimum": 1 },
        "sessions": { "type": "integer", "minimum": 1 }
      }
    },
    "caseComparator": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "comparatorId",
        "admissionState",
        "configurationId",
        "evidenceRevision",
        "attemptPolicy",
        "reason",
        "summary",
        "attempts",
        "evidenceHref"
      ],
      "properties": {
        "comparatorId": { "type": "string", "minLength": 1 },
        "admissionState": { "enum": ["eligible", "verify", "unsupported", "unavailable"] },
        "configurationId": { "type": "string", "minLength": 1 },
        "evidenceRevision": { "type": "integer", "minimum": 1 },
        "attemptPolicy": { "enum": ["seeded_five", "stochastic_five", "deterministic_single"] },
        "reason": { "type": ["string", "null"] },
        "summary": { "$ref": "#/$defs/summary" },
        "attempts": { "type": "array", "items": { "$ref": "#/$defs/attempt" } },
        "evidenceHref": { "type": ["string", "null"] }
      }
    },
    "case": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "scenarioId",
        "slug",
        "title",
        "summary",
        "problemHash",
        "lane",
        "caseKind",
        "resourceClass",
        "attemptPolicy",
        "dimensions",
        "comparators"
      ],
      "properties": {
        "scenarioId": { "type": "string", "minLength": 1 },
        "slug": { "type": "string", "minLength": 1 },
        "title": { "type": "string", "minLength": 1 },
        "summary": { "type": "string", "minLength": 1 },
        "problemHash": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" },
        "lane": { "enum": ["common_mixing", "constrained", "capability_frontier", "proof_behavior"] },
        "caseKind": { "enum": ["quality", "hard_infeasible_proof"] },
        "resourceClass": { "enum": ["standard", "heavy"] },
        "attemptPolicy": { "enum": ["seeded_five", "stochastic_five", "deterministic_single"] },
        "dimensions": { "$ref": "#/$defs/dimensions" },
        "comparators": {
          "type": "array",
          "items": { "$ref": "#/$defs/caseComparator" },
          "minItems": 1
        }
      }
    }
  }
}
