{
 "$schema": "https://json-schema.org/draft/2020-12/schema",
 "type": "object",
 "properties": {
  "schemaVersion": {
   "type": "string",
   "const": "1.0"
  },
  "name": {
   "type": "string"
  },
  "license": {
   "type": "object",
   "properties": {
    "name": {
     "type": "string"
    },
    "url": {
     "type": "string",
     "format": "uri"
    }
   },
   "required": [
    "name",
    "url"
   ],
   "additionalProperties": false
  },
  "citation": {
   "type": "string"
  },
  "corpora": {
   "type": "array",
   "items": {
    "type": "object",
    "properties": {
     "id": {
      "type": "string",
      "minLength": 1
     },
     "version": {
      "type": "string",
      "minLength": 1
     },
     "title": {
      "type": "string",
      "minLength": 1
     },
     "category": {
      "type": "string",
      "enum": [
       "audio-transkription",
       "diktiersoftware",
       "medical-scribes",
       "medizinische-transkription",
       "meeting-scribes",
       "untertitel"
      ],
      "description": "Kategoriekennung: audio-transkription = Audiotranskription, diktiersoftware = Diktiersoftware, medical-scribes = Medical Scribes, medizinische-transkription = Medizinische Spracherkennung, meeting-scribes = Meeting-Scribes, untertitel = Untertitel."
     },
     "task": {
      "type": "string",
      "enum": [
       "clinical-notes",
       "therapy-notes",
       "nursing-notes",
       "anamnesis-report",
       "general-dictation",
       "legal-dictation",
       "voice-writing",
       "file-subtitles",
       "live-subtitles"
      ]
     },
     "protocol": {
      "type": "string",
      "minLength": 1
     },
     "description": {
      "type": "string",
      "minLength": 40
     },
     "sourceScenarioCount": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
     },
     "scenarioCount": {
      "type": "integer",
      "minimum": 2,
      "maximum": 9007199254740991
     },
     "runs": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
     },
     "exclusions": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "scenarioId": {
         "type": "string",
         "minLength": 1
        },
        "reason": {
         "type": "string",
         "minLength": 1
        }
       },
       "required": [
        "scenarioId",
        "reason"
       ],
       "additionalProperties": false
      }
     },
     "strata": {
      "minItems": 1,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "dimension": {
         "type": "string",
         "minLength": 1
        },
        "groups": {
         "minItems": 1,
         "type": "array",
         "items": {
          "type": "object",
          "properties": {
           "label": {
            "type": "string",
            "minLength": 1
           },
           "count": {
            "type": "integer",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991
           }
          },
          "required": [
           "label",
           "count"
          ],
          "additionalProperties": false
         }
        }
       },
       "required": [
        "dimension",
        "groups"
       ],
       "additionalProperties": false
      }
     },
     "speakers": {
      "type": "object",
      "properties": {
       "min": {
        "type": "integer",
        "exclusiveMinimum": 0,
        "maximum": 9007199254740991
       },
       "max": {
        "type": "integer",
        "exclusiveMinimum": 0,
        "maximum": 9007199254740991
       }
      },
      "required": [
       "min",
       "max"
      ],
      "additionalProperties": false
     },
     "durationSeconds": {
      "type": "object",
      "properties": {
       "min": {
        "type": "number",
        "exclusiveMinimum": 0
       },
       "max": {
        "type": "number",
        "exclusiveMinimum": 0
       },
       "median": {
        "type": "number",
        "exclusiveMinimum": 0
       },
       "total": {
        "type": "number",
        "exclusiveMinimum": 0
       }
      },
      "required": [
       "min",
       "max",
       "median",
       "total"
      ],
      "additionalProperties": false,
      "description": "Audiodauer je Szenario (min, max, median) und gesamt (total) in Sekunden, auf volle Minuten gerundet."
     },
     "audioFormats": {
      "minItems": 1,
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "codec": {
         "type": "string",
         "minLength": 1
        },
        "sampleRateHertz": {
         "type": "integer",
         "exclusiveMinimum": 0,
         "maximum": 9007199254740991
        },
        "channels": {
         "type": "integer",
         "exclusiveMinimum": 0,
         "maximum": 9007199254740991
        }
       },
       "required": [
        "codec",
        "sampleRateHertz",
        "channels"
       ],
       "additionalProperties": false
      }
     },
     "reference": {
      "type": "object",
      "properties": {
       "version": {
        "type": "string",
        "minLength": 1
       },
       "words": {
        "type": "integer",
        "exclusiveMinimum": 0,
        "maximum": 9007199254740991
       },
       "characters": {
        "type": "integer",
        "exclusiveMinimum": 0,
        "maximum": 9007199254740991
       },
       "charactersPerWord": {
        "type": "number",
        "exclusiveMinimum": 0
       },
       "facts": {
        "anyOf": [
         {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 9007199254740991
         },
         {
          "type": "null"
         }
        ]
       },
       "units": {
        "type": "array",
        "items": {
         "type": "object",
         "properties": {
          "key": {
           "type": "string",
           "minLength": 1
          },
          "label": {
           "type": "string",
           "minLength": 1
          },
          "count": {
           "type": "integer",
           "minimum": 0,
           "maximum": 9007199254740991
          }
         },
         "required": [
          "key",
          "label",
          "count"
         ],
         "additionalProperties": false
        }
       }
      },
      "required": [
       "version",
       "words",
       "characters",
       "charactersPerWord",
       "facts",
       "units"
      ],
      "additionalProperties": false
     },
     "annotation": {
      "type": "object",
      "properties": {
       "independentAnnotations": {
        "type": "integer",
        "exclusiveMinimum": 0,
        "maximum": 9007199254740991,
        "description": "Anzahl der Referenzfassungen je Einheit."
       },
       "adjudication": {
        "type": "string",
        "minLength": 20
       },
       "rubric": {
        "anyOf": [
         {
          "type": "object",
          "properties": {
           "id": {
            "type": "string",
            "minLength": 1
           },
           "version": {
            "type": "string",
            "minLength": 1
           }
          },
          "required": [
           "id",
           "version"
          ],
          "additionalProperties": false
         },
         {
          "type": "null"
         }
        ]
       },
       "agreement": {
        "type": "object",
        "properties": {
         "items": {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 9007199254740991,
          "description": "Einheiten, für die mehrere unabhängige Referenzfassungen verglichen wurden. Nur angegeben, wenn mehrere Fassungen erstellt wurden."
         },
         "rawPercent": {
          "type": "number",
          "minimum": 0,
          "maximum": 100
         },
         "kappa": {
          "type": "number",
          "minimum": -1,
          "maximum": 1,
          "description": "Cohen’s Kappa für kategoriale Urteile."
         },
         "weightedKappa": {
          "description": "Gewichtetes Kappa für ordinale Schweregrade. Fehlt bei Korpora ohne Schweregrad-Rubrik.",
          "type": "number",
          "minimum": -1,
          "maximum": 1
         }
        },
        "required": [
         "items",
         "rawPercent",
         "kappa"
        ],
        "additionalProperties": false
       }
      },
      "required": [
       "independentAnnotations",
       "adjudication",
       "rubric"
      ],
      "additionalProperties": false
     },
     "scorer": {
      "type": "object",
      "properties": {
       "name": {
        "type": "string",
        "minLength": 1
       },
       "version": {
        "type": "string",
        "minLength": 1
       }
      },
      "required": [
       "name",
       "version"
      ],
      "additionalProperties": false
     },
     "normalization": {
      "anyOf": [
       {
        "type": "object",
        "properties": {
         "id": {
          "type": "string",
          "minLength": 1
         },
         "version": {
          "type": "string",
          "minLength": 1
         }
        },
        "required": [
         "id",
         "version"
        ],
        "additionalProperties": false
       },
       {
        "type": "null"
       }
      ]
     },
     "manifestSha256": {
      "type": "string",
      "pattern": "^[a-f0-9]{64}$"
     },
     "referenceSha256": {
      "type": "string",
      "pattern": "^[a-f0-9]{64}$"
     },
     "uncertainty": {
      "type": "object",
      "properties": {
       "method": {
        "type": "string",
        "const": "paired-cluster-bootstrap"
       },
       "clusterUnit": {
        "type": "string",
        "enum": [
         "session",
         "scenario"
        ]
       },
       "resamples": {
        "type": "integer",
        "exclusiveMinimum": 0,
        "maximum": 9007199254740991
       },
       "seed": {
        "type": "integer",
        "minimum": 0,
        "maximum": 4294967295
       },
       "intervalMethod": {
        "type": "string",
        "enum": [
         "percentile",
         "bca",
         "basic"
        ]
       },
       "aggregation": {
        "type": "string",
        "const": "pooled-counts"
       },
       "pairedSampleManifestSha256": {
        "type": "string",
        "pattern": "^[a-f0-9]{64}$"
       }
      },
      "required": [
       "method",
       "clusterUnit",
       "resamples",
       "seed",
       "intervalMethod",
       "aggregation",
       "pairedSampleManifestSha256"
      ],
      "additionalProperties": false
     },
     "frozen": {
      "type": "string",
      "description": "Quartal, in dem der Korpus eingefroren wurde. Das Einfrieren liegt vor dem ersten Lauf der Testreihe, auch wenn beide in dasselbe Quartal fallen."
     },
     "testPeriod": {
      "type": "string",
      "description": "Testzeitraum des Korpus als Quartal oder Quartalsspanne."
     },
     "methodUrl": {
      "type": "string",
      "format": "uri"
     }
    },
    "required": [
     "id",
     "version",
     "title",
     "category",
     "protocol",
     "description",
     "sourceScenarioCount",
     "scenarioCount",
     "runs",
     "exclusions",
     "strata",
     "speakers",
     "durationSeconds",
     "audioFormats",
     "reference",
     "annotation",
     "scorer",
     "normalization",
     "manifestSha256",
     "referenceSha256",
     "uncertainty",
     "frozen",
     "testPeriod",
     "methodUrl"
    ],
    "additionalProperties": false
   },
   "description": "Testkorpora mit Umfang, Schichtung, Referenzzählern, Annotation und Unsicherheitsparametern."
  },
  "results": {
   "type": "array",
   "items": {
    "type": "object",
    "properties": {
     "id": {
      "type": "string",
      "description": "Stabile Kennung aus Anbieter und Testreihe."
     },
     "provider": {
      "type": "string",
      "description": "Anbieterkennung, entspricht /anbieter/<provider>/."
     },
     "providerName": {
      "type": "string"
     },
     "test": {
      "type": "string",
      "description": "Testreihe: Kategorie oder Kategorie:<Aufgabe>."
     },
     "label": {
      "type": "string"
     },
     "category": {
      "type": "string",
      "enum": [
       "audio-transkription",
       "diktiersoftware",
       "medical-scribes",
       "medizinische-transkription",
       "meeting-scribes",
       "untertitel"
      ],
      "description": "Kategoriekennung: audio-transkription = Audiotranskription, diktiersoftware = Diktiersoftware, medical-scribes = Medical Scribes, medizinische-transkription = Medizinische Spracherkennung, meeting-scribes = Meeting-Scribes, untertitel = Untertitel."
     },
     "task": {
      "description": "Aufgabe innerhalb einer Kategorie mit Aufgaben, etwa clinical-notes. Fehlt bei Kategorien ohne Aufgaben.",
      "type": "string",
      "enum": [
       "clinical-notes",
       "therapy-notes",
       "nursing-notes",
       "anamnesis-report",
       "general-dictation",
       "legal-dictation",
       "voice-writing",
       "file-subtitles",
       "live-subtitles"
      ]
     },
     "url": {
      "type": "string",
      "format": "uri",
      "description": "Ergebnisabschnitt auf der Testseite des Anbieters."
     },
     "rankingUrl": {
      "type": "string",
      "format": "uri",
      "description": "Rangliste der Testreihe."
     },
     "testPeriod": {
      "type": "string",
      "description": "Testzeitraum als Quartal, etwa 2026-Q3, oder Quartalsspanne wie 2026-Q2/2026-Q3."
     },
     "protocol": {
      "type": "string"
     },
     "corpus": {
      "type": "string"
     },
     "scenarios": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
     },
     "runs": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
     },
     "completed": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
     },
     "total": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
     },
     "completionRatePercent": {
      "type": [
       "number",
       "null"
      ]
     },
     "evaluation": {
      "type": "object",
      "properties": {
       "output": {
        "type": "string",
        "enum": [
         "verbatim-transcript",
         "edited-transcript",
         "clinical-note",
         "therapy-note",
         "nursing-note",
         "anamnesis-report",
         "meeting-summary",
         "written-document",
         "subtitles",
         "live-subtitles"
        ],
        "description": "Bewertete Ausgabe: verbatim-transcript = wortnahes Transkript, edited-transcript = bearbeitetes Transkript, clinical-note = klinisches Dokument, therapy-note = Sitzungsdokumentation, nursing-note = Eintrag der Pflegedokumentation, anamnesis-report = Anamnesebericht, meeting-summary = Meeting-Notizen, written-document = ausgearbeiteter Text, subtitles = Untertiteldatei, live-subtitles = Live-Untertitel."
       },
       "semanticRubric": {
        "anyOf": [
         {
          "type": "string",
          "minLength": 5
         },
         {
          "type": "null"
         }
        ]
       },
       "wordErrorRate": {
        "type": "object",
        "properties": {
         "applicability": {
          "type": "string",
          "enum": [
           "word-aligned",
           "diagnostic",
           "not-applicable"
          ],
          "description": "word-aligned: wortnahe Ausgabe, die WER ist zwischen Diensten vergleichbar. diagnostic: sprachlich überarbeitete Ausgabe, die WER zeigt nur die Abweichung vom Wortlaut und geht nicht in Score und Rangliste ein. not-applicable: Die Hauptausgabe ist ein Dokument, für sie wird keine WER berechnet. Liefert der Dienst zusätzlich ein Transkript, steht dessen WER unter additionalMetrics."
         },
         "basis": {
          "type": "string",
          "enum": [
           "delivered-output",
           "unavailable"
          ],
          "description": "delivered-output: Die WER beruht auf der tatsächlich gelieferten Ausgabe. unavailable: keine Wortzähler für die Hauptausgabe, weil dort keine WER anwendbar ist."
         },
         "explanation": {
          "type": "string",
          "minLength": 20
         }
        },
        "required": [
         "applicability",
         "basis",
         "explanation"
        ],
        "additionalProperties": false
       },
       "speakerLabels": {
        "description": "false: Die Ausgabe enthält keine Sprecherkennungen. Für die DER gilt sie als Ausgabe mit einem einzigen Sprecher, die DER ist dann der Anteil der Sprechzeit aller Personen außer der am längsten sprechenden, dazu verpasste und fälschlich erkannte Sprache. Fehlt das Feld, enthält die Ausgabe Sprecherkennungen oder die Testreihe bewertet keine Sprecher.",
        "type": "boolean",
        "const": false
       }
      },
      "required": [
       "output",
       "semanticRubric",
       "wordErrorRate"
      ],
      "additionalProperties": false
     },
     "score": {
      "anyOf": [
       {
        "type": "object",
        "properties": {
         "version": {
          "type": "string",
          "description": "Version des Bewertungsmodells, nach dem der ScribeIndex-Score berechnet wurde."
         },
         "value": {
          "type": "number",
          "description": "ScribeIndex-Score 0 bis 100 aus den ungerundeten Teilwerten, auf vier Nachkommastellen gerundet. Website und Platz (rank) runden den genauen Wert auf eine Nachkommastelle."
         },
         "ci95": {
          "anyOf": [
           {
            "type": "array",
            "prefixItems": [
             {
              "type": "number"
             },
             {
              "type": "number"
             }
            ],
            "items": false,
            "minItems": 2,
            "maxItems": 2
           },
           {
            "type": "null"
           }
          ],
          "description": "95-%-Intervall des ScribeIndex-Scores. In jeder Bootstrap-Stichprobe über Szenarien wird der vollständige Score neu berechnet. Verfahren siehe ci95Method."
         },
         "ci95Method": {
          "anyOf": [
           {
            "type": "string",
            "enum": [
             "paired-cluster-bootstrap",
             "paired-cluster-bootstrap-beta-critical"
            ]
           },
           {
            "type": "null"
           }
          ],
          "description": "paired-cluster-bootstrap: Alle Teilwerte stammen aus denselben gepaarten Bootstrap-Stichproben über Szenarien. paired-cluster-bootstrap-beta-critical: Inhaltsqualität, Korrekturaufwand und Abschlussquote stammen aus denselben gepaarten Bootstrap-Stichproben. Der Anteil schwerwiegender Fehler wird je Stichprobe und Dienst unabhängig aus einer Beta-Verteilung (Jeffreys) mit effektivem Stichprobenumfang n / Designeffekt gezogen, weil der Bootstrap bei null oder wenigen Ereignissen keine oder kaum Streuung liefert."
         },
         "pairedDifferences": {
          "type": "array",
          "items": {
           "type": "object",
           "properties": {
            "provider": {
             "type": "string"
            },
            "ci95": {
             "type": "array",
             "prefixItems": [
              {
               "type": "number"
              },
              {
               "type": "number"
              }
             ],
             "items": false,
             "minItems": 2,
             "maxItems": 2
            }
           },
           "required": [
            "provider",
            "ci95"
           ],
           "additionalProperties": false
          },
          "description": "95-%-Intervall der Scoredifferenz (dieser Dienst minus Vergleichsdienst) je Bootstrap-Stichprobe. Bei ci95Method paired-cluster-bootstrap-beta-critical ist der Teilwert schwerwiegende Fehler nicht gepaart. Der gemeinsame Einfluss schwieriger Aufnahmen hebt sich in der Differenz dieses Teilwerts nicht auf, das Intervall wird dadurch breiter."
         },
         "rank": {
          "anyOf": [
           {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
           },
           {
            "type": "null"
           }
          ],
          "description": "Platz nach dem auf eine Nachkommastelle gerundeten ScribeIndex-Score. Gleiche gerundete Werte teilen sich den Platz. null: einzige Messung der Testreihe, ohne Platzierung."
         },
         "cohortSize": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991,
          "description": "Zahl der Dienste mit Score in dieser Testreihe."
         },
         "criticalRatePercent": {
          "description": "Anteil der Ausgaben mit mindestens einem schwerwiegenden Fehler.",
          "type": [
           "number",
           "null"
          ]
         },
         "contentQuality": {
          "type": "number",
          "description": "q, Ergebnis der Qualitätsformel der Aufgabe in Punkten von 0 bis 100, vor dem Nullpunkt des Teilwerts Inhaltsqualität."
         },
         "references": {
          "type": "object",
          "properties": {
           "key": {
            "type": "string"
           },
           "qualityErrorPoints": {
            "type": "number"
           },
           "correctionMinutes": {
            "type": "number"
           },
           "criticalPercent": {
            "type": [
             "number",
             "null"
            ]
           }
          },
          "required": [
           "key",
           "qualityErrorPoints",
           "correctionMinutes",
           "criticalPercent"
          ],
          "additionalProperties": false,
          "description": "Bezugsgrößen der Teilwerte. qualityErrorPoints: fehlende Punkte zum fehlerfreien Ergebnis (100 − q), bei denen der Teilwert Inhaltsqualität 0 erreicht, Teilwert = 100 · max(0, 1 − (100 − q) / qualityErrorPoints), für alle Aufgaben gleich. correctionMinutes: Nacharbeit in Minuten je Audiostunde, bei der der Teilwert Korrekturaufwand 0 erreicht, Teilwert = 100 · max(0, 1 − Nacharbeit / correctionMinutes). criticalPercent: Anteil der Ausgaben mit schwerwiegendem Fehler, bei dem der Teilwert schwerwiegende Fehler 0 erreicht, nur bei medizinischen und juristischen Aufgaben, sonst null. Alle drei sind Bezugsgrößen des Scores, keine fachlichen Grenzwerte."
         },
         "components": {
          "type": "array",
          "items": {
           "type": "object",
           "properties": {
            "key": {
             "type": "string",
             "enum": [
              "quality",
              "critical",
              "effort",
              "reliability"
             ],
             "description": "quality: Inhaltsqualität, critical: Schwerwiegende Fehler, effort: Korrekturaufwand, reliability: Abschlussquote"
            },
            "label": {
             "type": "string"
            },
            "value": {
             "type": "number"
            },
            "weight": {
             "type": "number"
            },
            "contribution": {
             "type": "number"
            }
           },
           "required": [
            "key",
            "label",
            "value",
            "weight",
            "contribution"
           ],
           "additionalProperties": false
          },
          "description": "Teilwerte des Scores. value: Teilwert 0 bis 100, weight: Gewicht, contribution: value · weight. Die Beiträge ergeben zusammen den Score. quality ist 100 · max(0, 1 − (100 − q) / 30) mit q gleich Fakten-F1 bei medizinischen Aufgaben, sonst allgemeine Diktate 0,8 × (100 − WER) + 0,1 × name-accuracy + 0,1 × number-accuracy, juristische Diktate 0,8 × (100 − WER) + 0,1 × (100 − party-errors) + 0,1 × (100 − gemeinsame Quote aus amount-errors und deadline-errors), Audiotranskription 0,7 × (100 − WER) + 0,3 × (100 − der), Meetingnotizen 0,7 × Fakten-F1 + 0,3 × (100 − der), Textausarbeitung 0,8 × Fakten-F1 + 0,2 × instruction-compliance, Untertitel für Videodateien 0,5 × (100 − WER) + 0,3 × subtitle-timing-accuracy + 0,2 × subtitle-layout-accuracy, Live-Untertitel 0,5 × (100 − WER) + 0,3 × live-caption-timeliness + 0,2 × live-caption-stability. Jeder Teil ist auf 0 bis 100 begrenzt, die Kennzahlen stehen in additionalMetrics. Liefert ein Dienst Sprecherkennungen ohne eigene Zeitmarken, bestimmt ScribeIndex die Zeitmarken durch erzwungene Ausrichtung (Forced Alignment) seines eigenen Texts an der Aufnahme und berechnet die Kennzahl „der“ (DER) daraus wie bei allen anderen Diensten, mit verpasster und fälschlich erkannter Sprache und Fehlern an Segmentgrenzen. Enthält die Ausgabe gar keine Sprecherkennungen (evaluation.speakerLabels false), gilt sie für die DER als Ausgabe mit einem einzigen Sprecher. Die DER ist dann der Anteil der Sprechzeit aller Personen außer der am längsten sprechenden, dazu verpasste und fälschlich erkannte Sprache."
         }
        },
        "required": [
         "version",
         "value",
         "ci95",
         "ci95Method",
         "pairedDifferences",
         "rank",
         "cohortSize",
         "criticalRatePercent",
         "contentQuality",
         "references",
         "components"
        ],
        "additionalProperties": false
       },
       {
        "type": "null"
       }
      ],
      "description": "null: mindestens ein Teilwert fehlt, daher kein Score."
     },
     "mainMetric": {
      "type": "object",
      "properties": {
       "label": {
        "type": "string"
       },
       "abbreviation": {
        "type": "string"
       },
       "value": {
        "type": [
         "number",
         "null"
        ]
       },
       "direction": {
        "type": "string",
        "enum": [
         "lower",
         "higher"
        ],
        "description": "lower: niedrigere Werte sind besser. higher: höhere Werte sind besser."
       },
       "ci95": {
        "anyOf": [
         {
          "type": "array",
          "prefixItems": [
           {
            "type": "number"
           },
           {
            "type": "number"
           }
          ],
          "items": false,
          "minItems": 2,
          "maxItems": 2
         },
         {
          "type": "null"
         }
        ],
        "description": "95-%-Konfidenzintervall [untere Grenze, obere Grenze] in der Einheit der Kennzahl. null: kein Intervall berechnet."
       }
      },
      "required": [
       "label",
       "abbreviation",
       "value",
       "direction",
       "ci95"
      ],
      "additionalProperties": false
     },
     "transcription": {
      "anyOf": [
       {
        "type": "object",
        "properties": {
         "referenceWords": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
         },
         "substitutions": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
         },
         "deletions": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
         },
         "insertions": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
         },
         "errors": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
         },
         "werPercent": {
          "type": [
           "number",
           "null"
          ]
         },
         "ci95": {
          "anyOf": [
           {
            "type": "array",
            "prefixItems": [
             {
              "type": "number"
             },
             {
              "type": "number"
             }
            ],
            "items": false,
            "minItems": 2,
            "maxItems": 2
           },
           {
            "type": "null"
           }
          ],
          "description": "95-%-Konfidenzintervall [untere Grenze, obere Grenze] in der Einheit der Kennzahl. null: kein Intervall berechnet."
         },
         "comparable": {
          "type": "boolean",
          "description": "true: wortnahe Ausgabe, WER ist zwischen Anbietern vergleichbar. false: Die Ausgabe ist KI-überarbeitet, die WER zeigt nur die Abweichung vom Wortlaut."
         }
        },
        "required": [
         "referenceWords",
         "substitutions",
         "deletions",
         "insertions",
         "errors",
         "werPercent",
         "ci95",
         "comparable"
        ],
        "additionalProperties": false
       },
       {
        "type": "null"
       }
      ]
     },
     "facts": {
      "anyOf": [
       {
        "type": "object",
        "properties": {
         "truePositive": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
         },
         "falsePositive": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
         },
         "falseNegative": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
         },
         "referenceFacts": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991,
          "description": "TP + FN"
         },
         "outputFacts": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991,
          "description": "TP + FP"
         },
         "precisionPercent": {
          "type": [
           "number",
           "null"
          ]
         },
         "precisionCi95": {
          "anyOf": [
           {
            "type": "array",
            "prefixItems": [
             {
              "type": "number"
             },
             {
              "type": "number"
             }
            ],
            "items": false,
            "minItems": 2,
            "maxItems": 2
           },
           {
            "type": "null"
           }
          ],
          "description": "95-%-Konfidenzintervall [untere Grenze, obere Grenze] in der Einheit der Kennzahl. null: kein Intervall berechnet."
         },
         "recallPercent": {
          "type": [
           "number",
           "null"
          ]
         },
         "recallCi95": {
          "anyOf": [
           {
            "type": "array",
            "prefixItems": [
             {
              "type": "number"
             },
             {
              "type": "number"
             }
            ],
            "items": false,
            "minItems": 2,
            "maxItems": 2
           },
           {
            "type": "null"
           }
          ],
          "description": "95-%-Konfidenzintervall [untere Grenze, obere Grenze] in der Einheit der Kennzahl. null: kein Intervall berechnet."
         },
         "f1Percent": {
          "type": [
           "number",
           "null"
          ]
         },
         "f1Ci95": {
          "anyOf": [
           {
            "type": "array",
            "prefixItems": [
             {
              "type": "number"
             },
             {
              "type": "number"
             }
            ],
            "items": false,
            "minItems": 2,
            "maxItems": 2
           },
           {
            "type": "null"
           }
          ],
          "description": "95-%-Konfidenzintervall [untere Grenze, obere Grenze] in der Einheit der Kennzahl. null: kein Intervall berechnet."
         }
        },
        "required": [
         "truePositive",
         "falsePositive",
         "falseNegative",
         "referenceFacts",
         "outputFacts",
         "precisionPercent",
         "precisionCi95",
         "recallPercent",
         "recallCi95",
         "f1Percent",
         "f1Ci95"
        ],
        "additionalProperties": false
       },
       {
        "type": "null"
       }
      ]
     },
     "latency": {
      "type": "object",
      "properties": {
       "p50Seconds": {
        "type": "number",
        "minimum": 0
       },
       "p95Seconds": {
        "type": "number",
        "minimum": 0
       },
       "mode": {
        "type": "string",
        "enum": [
         "live-dictation",
         "live-conversation",
         "live-stream",
         "file-upload",
         "local-file"
        ],
        "description": "Messstrecke: live-dictation = Live-Diktat, live-conversation = Live-Gespräch, live-stream = Live-Übertragung (Zeitversatz statt Verarbeitungszeit), file-upload = hochgeladene Datei, local-file = lokal verarbeitete Datei. start und end nennen Beginn und Ende der Messung. Vergleichbar sind nur Werte derselben Messstrecke."
       },
       "start": {
        "type": "string",
        "minLength": 5
       },
       "end": {
        "type": "string",
        "minLength": 5
       }
      },
      "required": [
       "p50Seconds",
       "p95Seconds",
       "mode",
       "start",
       "end"
      ],
      "additionalProperties": false
     },
     "correction": {
      "type": "object",
      "properties": {
       "minutesPerAudioHour": {
        "type": "number",
        "description": "Geschätzte Nacharbeit bis zur Zielfassung je Audiostunde, aus den gezählten Fehlern aller abgeschlossenen Ausgaben mit festen Zeiten je Korrekturschritt, die für alle Dienste gleich sind, genau estimate.minutes ÷ estimate.audioHours, auf vier Nachkommastellen gerundet. Nicht enthalten ist die einmalige Durchsicht, die jedes Ergebnis auch ohne KI braucht, also das einmalige Durchlesen eines Dokuments oder Diktats, das einmalige Abhören eines Transkripts und das einmalige Abspielen eines Videos mit seinen Untertiteln."
       },
       "ci95": {
        "anyOf": [
         {
          "type": "array",
          "prefixItems": [
           {
            "type": "number"
           },
           {
            "type": "number"
           }
          ],
          "items": false,
          "minItems": 2,
          "maxItems": 2
         },
         {
          "type": "null"
         }
        ],
        "description": "95-%-Konfidenzintervall [untere Grenze, obere Grenze] in der Einheit der Kennzahl. null: kein Intervall berechnet."
       },
       "estimate": {
        "type": "object",
        "properties": {
         "outputs": {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 9007199254740991,
          "description": "Abgeschlossene Ausgaben, für die die Nacharbeit geschätzt wurde."
         },
         "audioSeconds": {
          "type": "number",
          "exclusiveMinimum": 0,
          "description": "Ausgewertete Audiodauer in Sekunden, auf volle Minuten gerundet. Geteilt durch 3600 ergibt sie deshalb nicht genau audioHours."
         },
         "minutes": {
          "type": "number",
          "minimum": 0,
          "description": "Geschätzte Nacharbeit aller Ausgaben zusammen, auf 0,01 min gerundet."
         },
         "ci": {
          "type": "array",
          "prefixItems": [
           {
            "type": "number",
            "minimum": 0
           },
           {
            "type": "number",
            "minimum": 0
           }
          ],
          "items": false,
          "minItems": 2,
          "maxItems": 2
         },
         "audioHours": {
          "type": "number",
          "exclusiveMinimum": 0,
          "description": "Ausgewertete Audiodauer in Stunden, aus der genauen Audiodauer auf drei Nachkommastellen gerundet wie auf der Testseite, nicht aus dem gerundeten audioSeconds. Nenner von minutesPerAudioHour."
         }
        },
        "required": [
         "outputs",
         "audioSeconds",
         "minutes",
         "ci",
         "audioHours"
        ],
        "additionalProperties": false
       }
      },
      "required": [
       "minutesPerAudioHour",
       "ci95",
       "estimate"
      ],
      "additionalProperties": false
     },
     "additionalMetrics": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "key": {
         "type": "string"
        },
        "label": {
         "type": "string"
        },
        "numerator": {
         "type": "integer",
         "minimum": -9007199254740991,
         "maximum": 9007199254740991
        },
        "denominator": {
         "type": "integer",
         "minimum": -9007199254740991,
         "maximum": 9007199254740991
        },
        "valuePercent": {
         "description": "numerator ÷ denominator in Prozent. null: Funktion im getesteten Aufbau nicht unterstützt (configuration.settings), Zähler und Nenner nennen dann die gesprochenen Referenzeinheiten ohne einen Treffer.",
         "type": [
          "number",
          "null"
         ]
        },
        "direction": {
         "type": "string",
         "enum": [
          "lower",
          "higher"
         ],
         "description": "lower: niedrigere Werte sind besser. higher: höhere Werte sind besser."
        },
        "definition": {
         "type": "string"
        },
        "ci95": {
         "anyOf": [
          {
           "type": "array",
           "prefixItems": [
            {
             "type": "number"
            },
            {
             "type": "number"
            }
           ],
           "items": false,
           "minItems": 2,
           "maxItems": 2
          },
          {
           "type": "null"
          }
         ],
         "description": "95-%-Konfidenzintervall [untere Grenze, obere Grenze] in der Einheit der Kennzahl. null: kein Intervall berechnet."
        },
        "ci95Method": {
         "anyOf": [
          {
           "type": "string",
           "enum": [
            "cluster-bootstrap-percentile",
            "wilson-design-effect"
           ]
          },
          {
           "type": "null"
          }
         ],
         "description": "cluster-bootstrap-percentile: Perzentilintervall aus dem gepaarten Cluster-Bootstrap über Szenarien. wilson-design-effect: Wilson-Intervall mit effektivem Stichprobenumfang n / designEffect, für alle Anteile binärer Einheiten aller Dienste, je Kennzahl und Testreihe ein Verfahren. Fehlerraten je Einheit (recognition-errors, cer, transcript-wer, der, der-strict) nutzen wie die WER den Cluster-Bootstrap."
        },
        "designEffect": {
         "description": "Designeffekt 1 + (m − 1) · ICC. m ist denominator ÷ Zahl der Aufnahmen des Dienstes mit Einheiten der Kennzahl. Die ICC gilt gemeinsam für alle Dienste der Testreihe und kommt aus dem ANOVA-Schätzer über die Zähler je Aufnahme, gepoolt innerhalb der Dienste (Dienst als fester Effekt), begrenzt auf 0 bis 1. Bei schwerwiegenden Fehlern ist die Einheit das Dokument je Lauf, und die ICC gilt gemeinsam für alle Testreihen derselben Schweregrad-Rubrik (alle medizinischen Testreihen zusammen, das juristische Diktat allein, Dienst und Testreihe als fester Effekt). Gibt es über alle Dienste der Testreihe weniger als fünf Paare aus Dienst und Aufnahme mit Ereignissen oder mit Nicht-Ereignissen, bei schwerwiegenden Fehlern über alle Testreihen der Rubrik weniger als zehn, gilt ICC = 1, jede Aufnahme zählt dann einmal. null: nicht unterstützte Funktion.",
         "type": [
          "number",
          "null"
         ]
        }
       },
       "required": [
        "key",
        "label",
        "numerator",
        "denominator",
        "valuePercent",
        "direction",
        "definition",
        "ci95",
        "ci95Method",
        "designEffect"
       ],
       "additionalProperties": false
      }
     },
     "scalarMetrics": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "key": {
         "type": "string",
         "minLength": 1
        },
        "label": {
         "type": "string",
         "minLength": 1
        },
        "value": {
         "type": "number"
        },
        "unit": {
         "type": "string",
         "minLength": 1
        },
        "direction": {
         "type": "string",
         "enum": [
          "lower",
          "higher",
          "none"
         ],
         "description": "none: beschreibender Wert ohne bessere Richtung, etwa die mittlere Zeilenlänge."
        },
        "definition": {
         "type": "string",
         "minLength": 20
        },
        "statistic": {
         "type": "string",
         "enum": [
          "mean",
          "median",
          "p95"
         ]
        },
        "sampleSize": {
         "type": "integer",
         "exclusiveMinimum": 0,
         "maximum": 9007199254740991
        },
        "ci": {
         "type": "array",
         "prefixItems": [
          {
           "type": "number"
          },
          {
           "type": "number"
          }
         ],
         "items": false,
         "minItems": 2,
         "maxItems": 2
        }
       },
       "required": [
        "key",
        "label",
        "value",
        "unit",
        "direction",
        "definition",
        "statistic",
        "sampleSize"
       ],
       "additionalProperties": false
      }
     },
     "errorTypes": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "label": {
         "type": "string"
        },
        "count": {
         "type": "integer",
         "minimum": 0,
         "maximum": 9007199254740991
        }
       },
       "required": [
        "label",
        "count"
       ],
       "additionalProperties": false
      }
     },
     "failedRuns": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "scenarioId": {
         "type": "string"
        },
        "run": {
         "type": "integer",
         "minimum": -9007199254740991,
         "maximum": 9007199254740991
        },
        "reason": {
         "type": "string"
        }
       },
       "required": [
        "scenarioId",
        "run",
        "reason"
       ],
       "additionalProperties": false
      },
      "description": "Abgebrochene Läufe mit Szenario und Grund."
     },
     "configuration": {
      "type": "object",
      "properties": {
       "locale": {
        "type": "string",
        "pattern": "^[a-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$"
       },
       "automaticLanguageDetection": {
        "type": "boolean"
       },
       "productVersion": {
        "anyOf": [
         {
          "type": "string",
          "minLength": 1
         },
         {
          "type": "null"
         }
        ]
       },
       "modelVersions": {
        "anyOf": [
         {
          "minItems": 1,
          "type": "array",
          "items": {
           "type": "object",
           "properties": {
            "name": {
             "type": "string",
             "minLength": 1
            },
            "version": {
             "anyOf": [
              {
               "type": "string",
               "minLength": 1
              },
              {
               "type": "null"
              }
             ]
            }
           },
           "required": [
            "name",
            "version"
           ],
           "additionalProperties": false
          }
         },
         {
          "type": "null"
         }
        ]
       },
       "template": {
        "anyOf": [
         {
          "type": "object",
          "properties": {
           "id": {
            "type": "string",
            "minLength": 1
           },
           "version": {
            "anyOf": [
             {
              "type": "string",
              "minLength": 1
             },
             {
              "type": "null"
             }
            ]
           }
          },
          "required": [
           "id",
           "version"
          ],
          "additionalProperties": false
         },
         {
          "type": "null"
         }
        ]
       },
       "instruction": {
        "type": "object",
        "properties": {
         "id": {
          "type": "string",
          "minLength": 1
         },
         "version": {
          "type": "string",
          "minLength": 1
         }
        },
        "required": [
         "id",
         "version"
        ],
        "additionalProperties": false
       },
       "customVocabulary": {
        "anyOf": [
         {
          "type": "object",
          "properties": {
           "id": {
            "type": "string",
            "minLength": 1
           },
           "version": {
            "type": "string",
            "minLength": 1
           }
          },
          "required": [
           "id",
           "version"
          ],
          "additionalProperties": false
         },
         {
          "type": "null"
         }
        ]
       },
       "settings": {
        "type": "object",
        "propertyNames": {
         "type": "string"
        },
        "additionalProperties": {
         "type": [
          "string",
          "number",
          "boolean",
          "null"
         ]
        }
       },
       "scorer": {
        "type": "object",
        "properties": {
         "name": {
          "type": "string",
          "minLength": 1
         },
         "version": {
          "type": "string",
          "minLength": 1
         }
        },
        "required": [
         "name",
         "version"
        ],
        "additionalProperties": false
       },
       "normalization": {
        "anyOf": [
         {
          "type": "object",
          "properties": {
           "id": {
            "type": "string",
            "minLength": 1
           },
           "version": {
            "type": "string",
            "minLength": 1
           }
          },
          "required": [
           "id",
           "version"
          ],
          "additionalProperties": false
         },
         {
          "type": "null"
         }
        ]
       }
      },
      "required": [
       "locale",
       "automaticLanguageDetection",
       "productVersion",
       "modelVersions",
       "template",
       "instruction",
       "customVocabulary",
       "settings",
       "scorer",
       "normalization"
      ],
      "additionalProperties": false
     },
     "corpusMetadata": {
      "type": "object",
      "properties": {
       "version": {
        "type": "string",
        "minLength": 1
       },
       "manifestSha256": {
        "type": "string",
        "pattern": "^[a-f0-9]{64}$"
       },
       "referenceVersion": {
        "type": "string",
        "minLength": 1
       },
       "referenceSha256": {
        "type": "string",
        "pattern": "^[a-f0-9]{64}$"
       },
       "sourceScenarioCount": {
        "type": "integer",
        "exclusiveMinimum": 0,
        "maximum": 9007199254740991
       },
       "evaluatedScenarioCount": {
        "type": "integer",
        "exclusiveMinimum": 0,
        "maximum": 9007199254740991
       },
       "totalAudioSeconds": {
        "type": "number",
        "exclusiveMinimum": 0
       },
       "durationSeconds": {
        "type": "object",
        "properties": {
         "minimum": {
          "type": "number",
          "exclusiveMinimum": 0
         },
         "maximum": {
          "type": "number",
          "exclusiveMinimum": 0
         }
        },
        "required": [
         "minimum",
         "maximum"
        ],
        "additionalProperties": false
       },
       "audioFormats": {
        "minItems": 1,
        "type": "array",
        "items": {
         "type": "object",
         "properties": {
          "codec": {
           "type": "string",
           "minLength": 1
          },
          "sampleRateHertz": {
           "type": "integer",
           "exclusiveMinimum": 0,
           "maximum": 9007199254740991
          },
          "channels": {
           "type": "integer",
           "exclusiveMinimum": 0,
           "maximum": 9007199254740991
          }
         },
         "required": [
          "codec",
          "sampleRateHertz",
          "channels"
         ],
         "additionalProperties": false
        }
       },
       "conversions": {
        "type": "array",
        "items": {
         "type": "object",
         "properties": {
          "description": {
           "type": "string",
           "minLength": 1
          },
          "tool": {
           "type": "string",
           "minLength": 1
          },
          "version": {
           "type": "string",
           "minLength": 1
          }
         },
         "required": [
          "description",
          "tool",
          "version"
         ],
         "additionalProperties": false
        }
       },
       "exclusions": {
        "type": "array",
        "items": {
         "type": "object",
         "properties": {
          "scenarioId": {
           "type": "string",
           "minLength": 1
          },
          "reason": {
           "type": "string",
           "minLength": 1
          }
         },
         "required": [
          "scenarioId",
          "reason"
         ],
         "additionalProperties": false
        }
       }
      },
      "required": [
       "version",
       "manifestSha256",
       "referenceVersion",
       "referenceSha256",
       "sourceScenarioCount",
       "evaluatedScenarioCount",
       "totalAudioSeconds",
       "durationSeconds",
       "audioFormats",
       "conversions",
       "exclusions"
      ],
      "additionalProperties": false,
      "description": "Korpusmetadaten. totalAudioSeconds und durationSeconds sind auf volle Minuten gerundet."
     },
     "uncertainty": {
      "type": "object",
      "properties": {
       "confidenceLevel": {
        "type": "number",
        "const": 0.95
       },
       "method": {
        "type": "string",
        "const": "paired-cluster-bootstrap"
       },
       "clusterUnit": {
        "type": "string",
        "enum": [
         "session",
         "scenario"
        ]
       },
       "clusterCount": {
        "type": "integer",
        "minimum": 2,
        "maximum": 9007199254740991
       },
       "resamples": {
        "type": "integer",
        "exclusiveMinimum": 0,
        "maximum": 9007199254740991
       },
       "seed": {
        "type": "integer",
        "minimum": 0,
        "maximum": 4294967295
       },
       "intervalMethod": {
        "type": "string",
        "enum": [
         "percentile",
         "bca",
         "basic"
        ]
       },
       "aggregation": {
        "type": "string",
        "const": "pooled-counts"
       },
       "pairedSampleManifestSha256": {
        "type": "string",
        "pattern": "^[a-f0-9]{64}$"
       }
      },
      "required": [
       "confidenceLevel",
       "method",
       "clusterUnit",
       "clusterCount",
       "resamples",
       "seed",
       "intervalMethod",
       "aggregation",
       "pairedSampleManifestSha256"
      ],
      "additionalProperties": false
     }
    },
    "required": [
     "id",
     "provider",
     "providerName",
     "test",
     "label",
     "category",
     "url",
     "rankingUrl",
     "testPeriod",
     "protocol",
     "corpus",
     "scenarios",
     "runs",
     "completed",
     "total",
     "completionRatePercent",
     "evaluation",
     "score",
     "mainMetric",
     "transcription",
     "facts",
     "latency",
     "correction",
     "additionalMetrics",
     "errorTypes",
     "failedRuns",
     "configuration",
     "corpusMetadata",
     "uncertainty"
    ],
    "additionalProperties": false
   }
  }
 },
 "required": [
  "schemaVersion",
  "name",
  "license",
  "citation",
  "corpora",
  "results"
 ],
 "additionalProperties": false,
 "title": "ScribeIndex Testergebnisse",
 "description": "Aufbau von /daten/benchmarks.json: Korpora und Ergebnisse mit Zählern, Nennern, Konfidenzintervallen, Score-Zusammensetzung, Messkonfiguration, Korpusmetadaten und Unsicherheitsparametern."
}