{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/kaneme-com/json-schema/kaneme-com-public-verdict-schema.json",
  "title": "PublicVerdict",
  "x-generated": "2026-11-13",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/kaneme-com-openapi.json#/components/schemas/PublicVerdict",
  "type": "object",
  "properties": {
    "measurement": {
      "type": "object",
      "properties": {
        "version": {
          "type": "string",
          "const": "kaneme.measurement.v1"
        },
        "axis": {
          "type": "string",
          "enum": [
            "q1",
            "q2"
          ]
        },
        "contrast": {
          "type": "string"
        },
        "display": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "calibrationLanguage": {
          "type": "string",
          "enum": [
            "fr",
            "en"
          ]
        },
        "candidateLanguage": {
          "type": "string"
        },
        "engine": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "model": {
          "type": "string"
        },
        "scoreVersion": {
          "type": "string"
        },
        "calibrationVersion": {
          "type": "string"
        },
        "calibrationSource": {
          "type": "string"
        },
        "limitation": {
          "type": "string"
        }
      },
      "required": [
        "version",
        "axis",
        "contrast",
        "display",
        "calibrationLanguage",
        "candidateLanguage",
        "model",
        "scoreVersion",
        "calibrationVersion",
        "calibrationSource",
        "limitation"
      ],
      "additionalProperties": false
    },
    "question": {
      "type": "string",
      "enum": [
        "author",
        "human"
      ]
    },
    "probability": {
      "anyOf": [
        {
          "type": "number",
          "minimum": 0,
          "maximum": 1
        },
        {
          "type": "null"
        }
      ]
    },
    "unavailable": {
      "type": "string",
      "enum": [
        "self_overlap",
        "unsupported_language",
        "voice_language_mismatch",
        "mixed_language",
        "embedding_layer",
        "out_of_distribution",
        "calibration_mismatch"
      ],
      "description": "self_overlap — Le texte à juger est déjà, pour l’essentiel, dans la référence qui le juge : la mesure porterait sur elle-même. Juge un texte que la référence ne contient pas — ou retire-le du corpus de cette voix. · unsupported_language — Le texte ne se lit ni en français ni en anglais, même en départageant ces deux seules langues : le verdict n’est calibré que sur elles, chacune avec son propre moteur. Lis le champ `language` de la réponse avant d’appeler : hors du français et de l’anglais, ne demande pas de verdict. · voice_language_mismatch — Le texte et la voix de référence ne sont pas écrits dans la même langue : chaque moteur ne compare un texte qu’à une voix de sa langue. Juge ce texte avec une voix écrite dans sa langue — crée-la si elle n’existe pas. Ne le traduis pas pour contourner ce refus. · mixed_language — Le texte est dans la langue de la voix, mais au moins une phrase entière est dans l’autre langue servie : la mesure mêlerait deux moteurs. Corrige ou retire les passages renvoyés dans `passages` (positions dans le texte), puis relance. Les mots isolés — anglicismes, marques — et les citations entre guillemets ne déclenchent pas ce refus. · embedding_layer — La couche de mesure profonde n’a pas répondu ; sans elle, aucune probabilité n’est calibrée. Réessaie dans un instant si la couche de mesure redevient disponible. · out_of_distribution — Le panel de contraste ne couvre pas le registre de cette voix : la marge existerait, elle ne voudrait rien dire. Verse dans la voix des textes de référence plus proches du registre mesuré. · calibration_mismatch — La version du moteur ne correspond pas à une calibration validée. Attends la correction de la configuration du moteur. Ne modifie ni ne traduis le texte pour contourner ce refus."
    },
    "explanation": {
      "type": "object",
      "properties": {
        "version": {
          "type": "string"
        },
        "summary": {
          "type": "string"
        },
        "caveat": {
          "type": "string"
        },
        "factors": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "enum": [
                  "cadence",
                  "registre",
                  "structure",
                  "lexique"
                ]
              },
              "label": {
                "type": "string"
              },
              "status": {
                "type": "string",
                "enum": [
                  "aligned",
                  "mixed",
                  "different",
                  "unmeasured"
                ]
              },
              "gap": {
                "anyOf": [
                  {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 1
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "detail": {
                "type": "string"
              }
            },
            "required": [
              "id",
              "label",
              "status",
              "gap",
              "detail"
            ],
            "additionalProperties": {}
          }
        }
      },
      "required": [
        "version",
        "summary",
        "caveat",
        "factors"
      ],
      "additionalProperties": {}
    },
    "passages": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          },
          "start": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "end": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "language": {
            "type": "string",
            "enum": [
              "fr",
              "en"
            ]
          }
        },
        "required": [
          "text",
          "start",
          "end",
          "language"
        ],
        "additionalProperties": {}
      },
      "description": "Présent uniquement avec `unavailable: \"mixed_language\"` : les phrases écrites dans l’autre langue, avec leurs positions (`start`, `end`) dans le texte jugé. Les corriger ou les retirer, puis relancer."
    },
    "label": {
      "type": "string",
      "description": "Bande en clair, dérivée de `probability` : « Signe cette voix », « Plausiblement cette voix », « Ambigu », puis « Voix générique » (q1) ou « Voix étrangère » (q2). Avant le 12/10/2026 : « Auteur probable », « Auteur plausible », « Imposteur probable ». Absent quand `unavailable` est présent."
    },
    "band": {
      "type": "string",
      "enum": [
        "signature",
        "plausible",
        "ambiguous",
        "foreign"
      ],
      "description": "La bande de `label`, en clé stable : `signature`, `plausible`, `ambiguous`, `foreign` (sur q1, `foreign` est une écriture générique ; sur q2, une autre voix). Présent exactement quand `label` l’est. Depuis le contrat 5.3.0."
    },
    "confidence": {
      "type": "string",
      "enum": [
        "none",
        "low",
        "medium",
        "high"
      ]
    },
    "referenceLimited": {
      "type": "boolean"
    },
    "language": {
      "type": "string"
    },
    "version": {
      "type": "string"
    },
    "dimensions": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "passages": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "start": {
                  "type": "number"
                },
                "end": {
                  "type": "number"
                },
                "quote": {
                  "type": "string"
                },
                "observation": {
                  "type": "string"
                },
                "basis": {
                  "type": "string",
                  "enum": [
                    "reference",
                    "preference",
                    "observation"
                  ]
                }
              },
              "required": [
                "start",
                "end",
                "quote",
                "observation",
                "basis"
              ],
              "additionalProperties": false
            }
          },
          "id": {
            "type": "string",
            "enum": [
              "rythme",
              "lexique",
              "structure",
              "signature"
            ]
          },
          "label": {
            "type": "string"
          },
          "measured": {
            "type": "boolean"
          },
          "score": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "detail": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "label",
          "measured",
          "score",
          "detail"
        ],
        "additionalProperties": {}
      },
      "description": "Sur quoi le texte s’écarte des références : rythme, lexique, structure, signature. Ce n’est PAS la décomposition de `probability` — ces quatre-là lisent la couche stylométrique, qui pèse 20 % du score fusionné. Servies même en abstention : ce sont des faits mesurés, pas un verdict."
    },
    "dimensionsVersion": {
      "type": "string"
    }
  },
  "required": [
    "question",
    "probability",
    "referenceLimited",
    "version",
    "dimensions",
    "dimensionsVersion"
  ],
  "additionalProperties": {}
}