{ "$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" } } }, "orthographe": { "type": "object", "additionalProperties": false, "required": ["norme", "statut", "relu_par"], "properties": { "norme": { "enum": ["gwadloupeyen"], "description": "Norme unique du projet (ADR 0005). Ne jamais mélanger avec le matinitjé." }, "statut": { "enum": ["a_relire", "relu"], "description": "Passe à 'relu' uniquement quand un locuteur humain a tranché. Aucun agent ne peut le faire." }, "relu_par": { "type": ["string", "null"], "description": "Nom du relecteur humain. Obligatoirement non nul quand statut = relu." } } }, "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"], "properties": { "gcf": { "type": ["string", "null"], "pattern": "^/audio/[a-z0-9-]+\\.opus$", "description": "Prononciation kréyòl par une voix humaine. Aucune synthèse vocale (brief §6). Null tant que l'enregistrement manque ; le jeu doit se replier en silence." }, "locuteur": { "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"] } } } } }