{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/kaneme-com/json-schema/kaneme-com-certificate-published-schema.json",
  "title": "CertificatePublished",
  "x-generated": "2026-11-13",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/kaneme-com-openapi.json#/components/schemas/CertificatePublished",
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean",
      "const": true
    },
    "token": {
      "type": "string"
    },
    "path": {
      "type": "string"
    },
    "certificateUrl": {
      "type": "string",
      "format": "uri"
    },
    "verificationUrl": {
      "type": "string",
      "format": "uri"
    },
    "badgeSvgUrl": {
      "type": "string",
      "format": "uri"
    },
    "badge": {
      "type": "object",
      "properties": {
        "band": {
          "type": "string",
          "enum": [
            "signature",
            "plausible",
            "ambiguous",
            "foreign"
          ]
        },
        "label": {
          "type": "string"
        },
        "claim": {
          "type": "string"
        }
      },
      "required": [
        "band",
        "label",
        "claim"
      ],
      "additionalProperties": {}
    },
    "calibrated": {
      "type": "object",
      "properties": {
        "author": {
          "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"
                }
              ]
            },
            "label": {
              "type": "string",
              "description": "Bande en clair, dérivée de `probability` pour la question posée : « 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."
            },
            "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."
            },
            "language": {
              "type": "string"
            },
            "score": {
              "type": "number",
              "minimum": 0,
              "maximum": 100
            },
            "version": {
              "type": "string"
            },
            "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."
            }
          },
          "required": [
            "question",
            "probability",
            "score",
            "version"
          ],
          "additionalProperties": {}
        },
        "human": {
          "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"
                }
              ]
            },
            "label": {
              "type": "string",
              "description": "Bande en clair, dérivée de `probability` pour la question posée : « 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."
            },
            "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."
            },
            "language": {
              "type": "string"
            },
            "score": {
              "type": "number",
              "minimum": 0,
              "maximum": 100
            },
            "version": {
              "type": "string"
            },
            "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."
            }
          },
          "required": [
            "question",
            "probability",
            "score",
            "version"
          ],
          "additionalProperties": {}
        }
      },
      "required": [
        "author",
        "human"
      ],
      "additionalProperties": {}
    },
    "creditsUsed": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "ok",
    "token",
    "path",
    "certificateUrl",
    "verificationUrl",
    "badgeSvgUrl",
    "badge",
    "calibrated",
    "creditsUsed"
  ],
  "additionalProperties": {}
}