Files
ki-fwi/fruits.schema.json
T

335 lines
12 KiB
JSON
Raw Normal View History

{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://o-k-i.net/ki-fwi/fruits.schema.json",
"title": "Entrée du dataset KI FWI SA YÉ ?",
"description": "Un fruit ou une plante dangereuse. Un fichier par entrée dans src/lib/data/fruits/. Le kréyòl est la langue principale : noms.gcf est le nom de l'entrée, les autres langues en sont la traduction (ADR 0005).",
"type": "object",
"additionalProperties": false,
"required": [
"id",
"categorie",
"noms",
"orthographe",
"taxon",
"iles",
"comestible",
"danger",
"indices",
"medias",
"audio",
"sources_factuelles",
"valide"
],
"properties": {
"$schema": { "type": "string" },
"$comment": { "type": "string" },
"id": {
"type": "string",
"pattern": "^[a-z0-9]+(-[a-z0-9]+)*$",
"description": "Identifiant technique stable, sans diacritique. Sert de nom de fichier et de segment d'URL. Ne se renomme jamais après publication."
},
"categorie": {
"enum": ["fruit", "plante_dangereuse"]
},
"noms": {
"type": "object",
"additionalProperties": false,
"required": ["gcf"],
"properties": {
"gcf": { "type": "string", "minLength": 1, "description": "Nom kréyòl — nom principal de l'entrée." },
"fr": { "type": "string" },
"en": { "type": "string" },
"es": { "type": "string" },
"variantes_gcf": {
"type": "array",
"description": "Autres graphies ou autres noms proposés par des locuteurs. On les garde toutes : une variante n'est pas une erreur, c'est un usage. C'est le matériau de la relecture, pas son résultat.",
"items": {
"type": "object",
"additionalProperties": false,
"required": ["graphie", "source"],
"properties": {
"graphie": { "type": "string", "minLength": 1 },
"source": { "type": "string", "minLength": 2, "description": "Qui la propose : personne, commune, enregistrement, publication." },
"ile": { "enum": ["gp", "mq", "gf", "re", null] },
"note": { "type": ["string", "null"] }
}
}
}
}
},
"orthographe": {
"type": "object",
"additionalProperties": false,
"required": ["norme", "statut", "relu_par", "question_ouverte"],
"properties": {
"norme": {
"enum": ["gwadloupeyen"],
"description": "Norme unique du projet (ADR 0005). Ne jamais mélanger avec le matinitjé."
},
"statut": {
"enum": ["a_relire", "en_discussion", "relu"],
"description": "'a_relire' : personne ne s'est prononcé. 'en_discussion' : un doute est identifié et posé publiquement. 'relu' : un locuteur humain nommé a tranché — aucun agent ne peut le faire."
},
"relu_par": {
"type": ["string", "null"],
"description": "Nom du relecteur humain. Obligatoirement non nul quand statut = relu."
},
"question_ouverte": {
"type": ["string", "null"],
"description": "La question posée aux locuteurs, affichée telle quelle dans le jeu et l'encyclopédie. Obligatoire quand statut = en_discussion : on ne signale pas un doute sans dire lequel."
}
}
},
"taxon": {
"type": "object",
"additionalProperties": false,
"required": ["scientifique", "famille", "wikidata", "gbif", "verifie_le", "verifie_contre"],
"properties": {
"scientifique": { "type": "string", "minLength": 3 },
"famille": { "type": "string", "pattern": "^[A-Z][a-z]+aceae$" },
"wikidata": { "type": "string", "pattern": "^Q[1-9][0-9]*$" },
"gbif": { "type": "integer", "minimum": 1 },
"verifie_le": { "type": "string", "format": "date" },
"verifie_contre": {
"type": "array",
"minItems": 2,
"uniqueItems": true,
"items": { "enum": ["wikidata", "gbif"] },
"description": "Le brief §8 exige les deux référentiels. Un seul ne suffit pas."
}
}
},
"iles": {
"type": "array",
"minItems": 1,
"uniqueItems": true,
"items": { "enum": ["gp", "mq", "gf", "re"] }
},
"saison_mois": {
"type": "array",
"uniqueItems": true,
"items": { "type": "integer", "minimum": 1, "maximum": 12 },
"description": "Mois de disponibilité. Alimente le mode Sézon. Varie selon l'île : à affiner avec le terrain."
},
"comestible": { "type": "boolean" },
"danger": {
"oneOf": [
{ "type": "null" },
{
"type": "object",
"additionalProperties": false,
"required": ["niveau", "resume"],
"properties": {
"niveau": { "enum": ["vigilance", "eleve", "critique"] },
"resume": { "type": "string", "minLength": 10 },
"note": { "type": "string" },
"signalement": { "type": "string" },
"conduite": { "type": "string", "description": "Conduite à tenir en cas d'exposition. Ton factuel, jamais anxiogène (brief §6)." }
}
}
]
},
"indices": {
"type": "object",
"additionalProperties": false,
"description": "Les indices lisibles sur le terrain. Alimentent le mode Kaché, dévoilés dans l'ordre feuille → écorce → coupe → fruit.",
"properties": {
"feuille": { "type": "string" },
"ecorce": { "type": "string" },
"port": { "type": "string" },
"coupe": { "type": "string" },
"fruit": { "type": "string" },
"fleur": { "type": "string" },
"latex": { "type": "string" },
"graine": { "type": "string" },
"usage_haie": { "type": "string" }
}
},
"medias": {
"type": "array",
"items": { "$ref": "#/$defs/media" }
},
"audio": {
"type": "object",
"additionalProperties": false,
"required": ["gcf", "locuteur", "source", "licence", "url_description", "valide"],
"description": "La prononciation du nom kréyòl. Aucune synthèse vocale (brief §6) : une voix humaine, toujours.",
"properties": {
"gcf": {
"type": ["string", "null"],
"pattern": "^/audio/[a-z0-9-]+\\.opus$",
"description": "Fichier embarqué dans le jeu. Null tant que l'enregistrement manque ; le jeu se replie alors en silence, jamais sur une voix de synthèse."
},
"locuteur": {
"type": ["string", "null"],
"description": "Nom ou pseudonyme du locuteur, crédité nominativement. Il conserve ses droits voisins."
},
"source": {
"enum": ["porteur", "lingualibre", "contributeur", null],
"description": "'lingualibre' désigne un enregistrement déjà versé aux communs — à préférer, il sert au-delà de ce jeu."
},
"licence": {
"enum": ["CC0-1.0", "CC-BY-4.0", "CC-BY-SA-4.0", "OKI-CC-BY-SA-4.0", null]
},
"url_description": {
"type": ["string", "null"],
"description": "Page d'origine de l'enregistrement. Obligatoire quand la source n'est pas le porteur."
},
"valide": { "type": "boolean" },
"note": { "type": ["string", "null"] }
}
},
"sources_factuelles": {
"type": "array",
"description": "Références consultées pour les indices, la saisonnalité et le danger. TRAMIL se cite ici — jamais comme source de fichiers (ADR 0001).",
"items": {
"type": "object",
"additionalProperties": false,
"required": ["titre", "url", "consulte_le"],
"properties": {
"titre": { "type": "string" },
"url": { "type": "string", "format": "uri" },
"consulte_le": { "type": "string", "format": "date" }
}
}
},
"valide": {
"type": "boolean",
"description": "L'entrée entière est-elle validée pour publication ? False par défaut. Ne passe à true que par décision humaine."
}
},
"allOf": [
{
"if": { "properties": { "categorie": { "const": "fruit" } }, "required": ["categorie"] },
"then": { "required": ["saison_mois"] }
},
{
"if": { "properties": { "categorie": { "const": "plante_dangereuse" } }, "required": ["categorie"] },
"then": {
"properties": { "danger": { "type": "object" } },
"description": "Une plante dangereuse a obligatoirement un bloc danger renseigné."
}
},
{
"if": { "properties": { "orthographe": { "properties": { "statut": { "const": "relu" } }, "required": ["statut"] } } },
"then": { "properties": { "orthographe": { "properties": { "relu_par": { "type": "string", "minLength": 2 } } } } }
}
],
"$defs": {
"media": {
"type": "object",
"additionalProperties": false,
"required": [
"id",
"filiere",
"type_media",
"vue",
"usages",
"source",
"auteur",
"licence",
"url_fichier",
"url_description",
"attribution_requise",
"partage_identique",
"usage_non_commercial",
"composite",
"valide",
"valide_par"
],
"properties": {
"id": { "type": "string", "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$" },
"filiere": {
"enum": ["A", "B"],
"description": "A = vérité (photographie réelle, sert à identifier). B = décor (image générée, ne sert jamais à identifier). ADR 0004."
},
"type_media": {
"enum": ["photo", "planche_botanique", "image_generee"],
"description": "Une planche botanique ancienne est exacte mais stylisée : elle documente, elle n'entraîne pas la reconnaissance du réel. Seule une photo peut porter une épreuve."
},
"vue": {
"enum": ["fruit_entier", "coupe", "feuille", "ecorce", "port", "fleur", "graine", null],
"description": "Les quatre vues pédagogiques du pack (arbre · fruit entier · coupe · feuille), étendues. Null tant qu'un humain n'a pas regardé l'image."
},
"usages": {
"type": "array",
"uniqueItems": true,
"items": { "enum": ["epreuve", "indice", "fiche", "decor"] },
"description": "Où ce média est employé. 'epreuve' et 'indice' imposent filière A + photo + validé."
},
"source": {
"enum": ["wikimedia_commons", "inaturalist", "porteur", "herbier", "comfyui"]
},
"auteur": { "type": ["string", "null"] },
"licence": {
"enum": [
"CC0-1.0",
"PD",
"CC-BY-2.0",
"CC-BY-3.0",
"CC-BY-4.0",
"CC-BY-SA-2.0",
"CC-BY-SA-2.5",
"CC-BY-SA-3.0",
"CC-BY-SA-4.0",
"CC-BY-NC-4.0",
"CC-BY-NC-SA-4.0",
"OKI-CC-BY-SA-4.0"
]
},
"licence_url": { "type": ["string", "null"] },
"url_fichier": { "type": "string", "format": "uri" },
"url_description": { "type": "string", "format": "uri" },
"largeur": { "type": ["integer", "null"] },
"hauteur": { "type": ["integer", "null"] },
"mime": { "type": ["string", "null"] },
"description": { "type": ["string", "null"] },
"date_prise_de_vue": { "type": ["string", "null"] },
"attribution_requise": { "type": "boolean" },
"partage_identique": { "type": "boolean" },
"usage_non_commercial": {
"type": "boolean",
"description": "CC BY-NC. Accepté par l'ADR 0001 au prix d'un engagement non commercial définitif. Doit apparaître dans CREDITS.md."
},
"composite": {
"type": "boolean",
"description": "Ce média a-t-il été fusionné avec un autre ? Interdit sur tout média SA ou NC (conflit de licence, ADR 0001)."
},
"valide": { "type": "boolean" },
"valide_par": { "type": ["string", "null"] },
"valide_le": { "type": ["string", "null"], "format": "date" },
"note_validation": { "type": ["string", "null"] }
}
}
}
}