Files
ki-fwi/docs/adr/0004-filieres-assets-a-b.md
OKIandClaude Opus 5 945a524b44 feat(session-0): cadre juridique, porte de validation et dataset vérifié
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>
2026-07-26 23:47:27 -04:00

4.4 KiB

ADR 0004 — Deux filières d'assets : vérité et décor

  • Statut : accepté
  • Date : 2026-07-27
  • Session : 0 — cadre et données

Contexte

Le pack d'origine prévoyait de générer l'intégralité des visuels du jeu — 76 images — par diffusion (SDXL / FLUX via ComfyUI), puis de passer directement à la production.

C'est une contradiction avec le but du jeu. Un enfant qui apprend à reconnaître un corossol sur une image générée n'apprend pas à reconnaître un corossol : il apprend à reconnaître ce qu'un modèle de diffusion produit quand on lui demande un corossol. Sur les espèces peu représentées dans les jeux d'entraînement — le zikak, la quenette, le cachiman cœur-de-bœuf, la pomme-liane — le modèle ne refuse pas : il produit un fruit plausible et faux. C'est le pire des deux mondes, parce que l'erreur est invisible à qui ne connaît pas déjà l'espèce.

Cette session a produit une illustration involontaire du même problème côté sources réelles : parmi les photographies que Wikimedia Commons remonte pour Melicoccus bijugatus (la quenette), l'un des premiers résultats est une photographie de singe capucin mangeant le fruit. Aucune machine — moteur de recherche ou modèle génératif — ne peut tenir lieu de validation botanique.

Décision

Deux filières, deux régimes, jamais mélangés.

Filière Contenu Source autorisée Rôle
A — Vérité fruit, coupe, feuille, écorce, port de l'arbre photographie réelle : Commons, iNaturalist, herbier, appareil du porteur tout ce qui sert à identifier — épreuves, indices, fiches
B — Décor fonds, personnages, UI, sprites arcade, badges, écrans de titre génération IA (ComfyUI / FLUX) tout ce qui ne sert pas à identifier

Une troisième catégorie découverte en session 0

Les fonds Commons contiennent beaucoup de planches botaniques anciennes — Blanco, Merian, Köhler, domaine public, exactes et magnifiques. Elles ne sont ni des photographies ni des images générées. Le schéma les distingue donc explicitement :

type_media : "photo" | "planche_botanique" | "image_generee"

Une planche botanique documente une fiche encyclopédique. Elle ne peut pas porter une épreuve d'identification : une gravure au trait rehaussée n'entraîne pas l'œil à reconnaître un fruit posé sur une table de marché.

Le champ usages et la porte

Chaque média déclare où il est employé : epreuve, indice, fiche, decor. Les deux premiers sont les usages identifiants. Un média identifiant doit satisfaire les quatre conditions, vérifiées par script :

  1. filiere: "A" ;
  2. type_media: "photo" ;
  3. valide: true, avec un valide_par nommé — une validation anonyme n'engage personne ;
  4. vue renseignée.

Conséquences

  • npm run validate:data fait échouer le build sur toute violation. npm run test:porte rejoue les neuf cas interdits et vérifie que le refus se produit — une règle qu'on n'a jamais vue refuser quelque chose est une intention, pas une règle.
  • Tout média sort de l'ingestion avec valide: false. Aucun agent, aucun script, aucun modèle ne peut passer ce champ à true. La validation se fait par comparaison à au moins deux photographies de référence, idéalement contresignée par quelqu'un qui connaît : TRAMIL, un enseignant de SVT, un agriculteur, une grand-mère.
  • Le pipeline de génération (filière B) vit dans tools/assets/, hors du bundle, avec son propre requirements.txt. Il est piloté hors ligne, au build (playbook P2). Aucun appel réseau ne subsiste au runtime du jeu.
  • Les défauts du script du pack d'origine sont corrigés en session 3 : hash() de Python est randomisé par exécution (PYTHONHASHSEED), donc les seeds annoncés comme reproductibles ne le sont pas — utiliser zlib.crc32(clé.encode()) & 0xFFFFFFFF ; copy.deepcopy au lieu de json.loads(json.dumps(...)) ; et vérifier la licence des poids du modèle rembg, qui ne suit pas nécessairement la licence MIT du paquet.

Alternative écartée

Générer les visuels d'identification et les faire valider a posteriori. Le pack le proposait implicitement. Le problème n'est pas la validation, c'est le coût de l'erreur non détectée : un validateur non spécialiste confirmera un corossol plausible. La photographie supprime la question.