{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://lydiahub.online/benchmark-schema.json",
  "title": "ResetPulse public benchmark",
  "type": "object",
  "required": ["schema", "generatedAt", "method", "sources", "reconciliation", "forecastComparison", "boundary"],
  "properties": {
    "schema": { "const": "resetpulse.public-benchmark.v1" },
    "generatedAt": { "type": "string", "format": "date-time" },
    "method": { "type": "string" },
    "sources": { "type": "array", "items": { "$ref": "#/$defs/source" } },
    "reconciliation": {
      "type": "object",
      "required": ["state", "resetpulseStatus", "comparisonStatus", "comparedSourceCount", "agreeingSourceCount", "majorityStatus", "independenceStatus", "independenceNote", "note"],
      "properties": {
        "state": { "enum": ["aligned", "disagreement", "insufficient"] },
        "resetpulseStatus": { "enum": ["confirmed", "candidate", "rejected", "pending", "unknown"] },
        "comparisonStatus": { "enum": ["confirmed", "candidate", "rejected", "pending", "unknown"] },
        "comparedSourceCount": { "type": "integer", "minimum": 0 },
        "agreeingSourceCount": { "type": "integer", "minimum": 0 },
        "majorityStatus": { "enum": ["confirmed", "candidate", "rejected", "pending", "unknown"] },
        "independenceStatus": { "const": "not-verified" },
        "independenceNote": { "type": "string" },
        "note": { "type": "string" }
      }
    },
    "forecastComparison": {
      "type": "object",
      "required": ["sources", "probability24hRange", "probability48hRange", "note"],
      "properties": {
        "sources": { "type": "array", "items": { "$ref": "#/$defs/sourceWithForecast" } },
        "probability24hRange": { "$ref": "#/$defs/probabilityRange" },
        "probability48hRange": { "$ref": "#/$defs/probabilityRange" },
        "note": { "type": "string" }
      }
    },
    "boundary": {
      "type": "object",
      "required": ["credentialsRequired", "privateAccountTelemetry", "rawExternalPayloadsPublished", "speedClaim"],
      "properties": {
        "credentialsRequired": { "const": false },
        "privateAccountTelemetry": { "const": false },
        "rawExternalPayloadsPublished": { "const": false },
        "speedClaim": { "const": "not-claimed" }
      }
    }
  },
  "$defs": {
    "source": {
      "type": "object",
      "required": ["id", "name", "kind", "publicUrl", "status", "checkedAt", "providerCheckedAt", "latestPublishedAt", "firstObservedAt", "freshnessSeconds", "freshnessBasis", "latestSignalStatus", "timingSummary", "note"],
      "properties": {
        "id": { "type": "string" },
        "name": { "type": "string" },
        "kind": { "enum": ["resetpulse", "public-feed", "public-dashboard"] },
        "publicUrl": { "type": "string", "format": "uri" },
        "status": { "enum": ["available", "unavailable"] },
        "checkedAt": { "type": "string", "format": "date-time" },
        "providerCheckedAt": { "type": ["string", "null"], "format": "date-time" },
        "latestPublishedAt": { "type": ["string", "null"], "format": "date-time" },
        "firstObservedAt": { "type": ["string", "null"], "format": "date-time" },
        "freshnessSeconds": { "type": ["integer", "null"], "minimum": 0 },
        "freshnessBasis": { "enum": ["collector-check", "public-signal", "provider-check"] },
        "latestSignalStatus": { "enum": ["confirmed", "candidate", "rejected", "pending", "unknown"] },
        "forecast": { "$ref": "#/$defs/forecast" },
        "timingSummary": {
          "type": "object",
          "required": ["sampleCount", "medianSeconds", "p95Seconds", "latestMeasuredAt", "basis"],
          "properties": {
            "sampleCount": { "type": "integer", "minimum": 0 },
            "medianSeconds": { "type": ["integer", "null"], "minimum": 0 },
            "p95Seconds": { "type": ["integer", "null"], "minimum": 0 },
            "latestMeasuredAt": { "type": ["string", "null"], "format": "date-time" },
            "basis": { "enum": ["public-published-to-observation", "not-available"] }
          }
        },
        "note": { "type": "string" }
      }
    },
    "forecast": {
      "type": "object",
      "required": ["probability24h", "probability48h", "confidence", "basis"],
      "properties": {
        "probability24h": { "type": ["integer", "null"], "minimum": 0, "maximum": 100 },
        "probability48h": { "type": ["integer", "null"], "minimum": 0, "maximum": 100 },
        "confidence": { "enum": ["low", "medium", "high", "unknown"] },
        "basis": { "enum": ["local-model", "public-page"] }
      }
    },
    "sourceWithForecast": {
      "allOf": [
        { "$ref": "#/$defs/source" },
        { "type": "object", "required": ["forecast"], "properties": { "forecast": { "$ref": "#/$defs/forecast" } } }
      ]
    },
    "probabilityRange": {
      "type": "object",
      "required": ["min", "max"],
      "properties": {
        "min": { "type": ["integer", "null"], "minimum": 0, "maximum": 100 },
        "max": { "type": ["integer", "null"], "minimum": 0, "maximum": 100 }
      }
    }
  }
}
