Session 0 du plan — aucun code applicatif. Cadre - 5 ADR : licences, Phaser 4 hors budget initial, frontière Svelte/Phaser, filières A/B des assets, kréyòl langue principale (norme gwadloupéyenne). - LICENSE (AGPL-3.0-or-later, texte canonique gnu.org), LICENSE-CONTENT (CC BY-SA 4.0). Le jeu est une œuvre collective : aucun compositing sur un média SA ou NC, contrainte vérifiée par script. - Audit des 7 sources avec endpoints réellement appelés. TRAMIL vérifié en direct : « all rights reserved » et page de mentions légales en 404. iNaturalist mesuré à 93 % de CC BY-NC sur un échantillon de 305 photos. Outillage (tools/data/, hors bundle, zéro appel réseau au runtime) - verify:taxa, ingest:commons, build:dataset, validate:data, test:porte, build:credits, check:audio. - validate.mjs est la porte exigée par le brief §2 : le build échoue si une épreuve s'appuie sur un média non validé, non photographique ou de filière B, sur une attribution sans auteur, sur un compositing SA/NC, ou sur une entrée publiée sans relecture kréyòl. test:porte prouve les 9 refus + 1 témoin. Données - 13 entrées (8 fruits + 5 plantes du module Pa touché) vérifiées contre Wikidata ET GBIF : 13/13 ACCEPTED, 0 divergence avec la graine. - 130 candidats Commons sous licence libre, 39 pré-inscrits, 0 validé — aucun agent ne peut valider un média. Écarts signalés, non corrigés en silence - Le champ danger de la graine a deux formes (note vs resume) : normalisé. - 3 identifiants divergent du nom kréyòl au-delà des accents : non tranchés. - comestible:false sur akée et pomme-cajou : sous-estimation prudente assumée. - Le mancenillier n'a aucune photographie moderne dans ses 3 premiers candidats — l'entrée la plus critique est la moins bien servie. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
299 lines
9.9 KiB
JSON
299 lines
9.9 KiB
JSON
{
|
|
"$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"] }
|
|
}
|
|
}
|
|
}
|
|
}
|