chore: dépôt initial — sécurisation des documents de cadrage ki-fwi

Aucun code applicatif. Commit de protection avant toute modification
(playbook OKI §5b.1 : git vérifié/initialisé avant tout travail).

Contenu : brief Claude Code, analyse et plan de sessions, données
d'amorçage fruits.seed.json. Le pack de référence OKI
(doc2sveltekit-transition/) reste local et non versionné.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
OKI
2026-07-26 23:23:21 -04:00
co-authored by Claude Opus 5
commit f0b3ce8484
4 changed files with 683 additions and 0 deletions
+218
View File
@@ -0,0 +1,218 @@
# KI FWI SA YÉ ? — Analyse du pack, décisions d'architecture et plan de sessions
> Document destiné à l'humain (toi). Le fichier `BRIEF-CLAUDE-CODE_ki-fwi.md` est le prompt à coller
> dans Claude Code. `fruits.seed.json` est le jeu de données d'amorçage.
>
> Contexte : ORGANISATION KA INTERNATIONALE · Martinique/Guadeloupe · doctrine souveraineté numérique
> (playbook unifié OKI × SvelteKit, juillet 2026).
---
## 1. Ce que vaut le pack `pack_complet_game_fruit`
**Ce qui est bon et à garder :**
- La **taxonomie d'assets en 4 vues** (arbre · fruit entier · coupe · feuille) est exactement la bonne
découpe pédagogique. C'est le meilleur apport du document : elle correspond aux quatre indices que
l'on apprend réellement à lire sur le terrain.
- Le **prompt négatif universel** est réutilisable tel quel.
- L'**automatisation par l'API HTTP de ComfyUI** (`POST /prompt`) est la bonne méthode, et elle est
compatible avec la doctrine : la génération est une opération **hors ligne, au build**, jamais au
runtime. Aucun appel tiers ne subsiste dans le jeu livré (P2 du playbook : *bake au build*).
**Ce qui est faux, risqué ou manquant — par ordre de gravité :**
### 1.1 La contradiction pédagogique centrale (bloquant)
Le but est que des enfants **reconnaissent des fruits et des arbres réels**. Un jeu dont 100 % des
visuels sont générés par IA leur apprend à reconnaître les hallucinations d'un modèle de diffusion.
Le problème est concret : SDXL et FLUX connaissent mal le corossol, à peine la quenette, presque pas
le zikak, la pomme-liane ou le cachiman cœur-de-bœuf. Sur les espèces peu représentées dans les jeux
d'entraînement, le modèle produit un fruit *plausible et faux*.
**Règle à graver dans le projet — deux filières d'assets, deux régimes :**
| Filière | Contenu | Source autorisée | Rôle |
|---|---|---|---|
| **A — Vérité** | photo de fruit, de coupe, de feuille, d'écorce, de port de l'arbre | **photographie réelle** (Commons, iNaturalist, herbier, ton propre appareil) | tout ce qui sert à **identifier** : épreuves, fiches, indices |
| **B — Décor** | fonds, personnages, UI, sprites arcade, badges, écrans de titre | IA (Krea2 / FLUX via ComfyUI) | tout ce qui **ne sert pas** à identifier |
Un sprite IA peut illustrer le mode arcade (fruits qui tombent), à condition qu'il soit **validé
contre au moins deux photos réelles** et que l'épreuve d'identification, elle, se joue toujours sur
la photo. Une photo prise par toi au marché de Fort-de-France vaut mieux que n'importe quel FLUX.
### 1.2 « Ressources libres de droit » : l'expression est fausse, et c'est un risque juridique réel
- **Wikimedia Commons** n'est pas « libre de droit ». La plupart des fichiers sont **CC BY-SA 4.0** :
attribution nominative obligatoire + partage à l'identique. Le partage à l'identique contamine les
œuvres dérivées — si tu composites une photo CC BY-SA dans un sprite, le sprite devient CC BY-SA.
- **TRAMIL** : les mentions légales du site n'accordent **aucune licence**. Par défaut : tous droits
réservés. La TRAMILothèque (photos, scans, planches d'herbier, coupes microscopiques) est une
ressource magnifique et **inutilisable sans autorisation écrite**. TRAMIL est hébergé par le SCD de
l'Université des Antilles à Schœlcher — tu es à quinze minutes. **Va les voir.** Un partenariat
TRAMIL × OKI sur un jeu scolaire martiniquais est une demande qui a toutes les chances d'aboutir,
et il transforme le projet : accès à des images d'herbier vouchées, et une caution scientifique.
- **CIRAD / INRAE** : régimes mixtes, majoritairement © avec des cas d'usage pédagogique négociables.
Agritrop (dépôt ouvert du CIRAD) contient de l'open access exploitable. À demander, pas à présumer.
- **iNaturalist** : beaucoup de CC BY-**NC**. Compatible avec un jeu gratuit et non commercial ;
incompatible si tu veux un jour vendre une version. Décide maintenant.
**Décision à prendre avant la première ligne de code** : licence du code (AGPL-3.0 ou GPL-3.0),
licence du contenu (CC BY-SA 4.0 recommandé, cohérent avec Commons), et registre `CREDITS.md` +
métadonnée de licence **par média** dans les données, avec un écran de crédits dans le jeu.
### 1.3 Aucune boucle de validation botanique
Le pack génère 76 images et passe directement à la production. Il faut une **porte** : chaque asset
porte un champ `valide` qui vaut `false` par défaut, et rien d'invalidé n'est embarqué dans le build.
La validation se fait par comparaison à deux photos de référence, idéalement contresignée par
quelqu'un qui connaît (TRAMIL, un enseignant SVT, un agriculteur, ta grand-mère).
### 1.4 Un bug réel dans le script fourni
```python
workflow["4"]["inputs"]["seed"] = hash(fruit["id"] + asset_type) % 2**32
```
En Python 3, `hash()` sur une chaîne est **randomisé à chaque exécution** (`PYTHONHASHSEED`). Les
seeds ne sont donc pas reproductibles d'un lancement à l'autre — exactement l'inverse de l'argument
« même seed = même style » vendu dans le pack. Utiliser `zlib.crc32(s.encode()) & 0xFFFFFFFF` ou
`int(hashlib.sha256(s.encode()).hexdigest()[:8], 16)`.
Accessoirement : `json.loads(json.dumps(x))``copy.deepcopy(x)` ; et vérifier la licence du modèle
utilisé par `rembg` (les poids ne suivent pas toujours la licence MIT du paquet).
### 1.5 Le format de sortie est hostile au mobile 4G
80 PNG en 512×512 = plusieurs mégaoctets, hors budget du playbook (≤ 2 Mo pour l'entrée). Il faut :
AVIF/WebP, **atlas de textures** par écran de jeu, et chargement par paquet (un pack de fruits par
île, téléchargeable et mis en cache par le service worker).
### 1.6 Ce qui manque entièrement
- **Le son.** Un jeu qui enseigne les noms kréyòl sans les faire *entendre* rate sa cible : les
enfants visés lisent mal le kréyòl écrit, dont l'orthographe leur est peu familière. Chaque fruit
doit avoir son nom prononcé par une **voix humaine locale** (pas de TTS). C'est du terrain, pas du
code : une après-midi d'enregistrement vaut dix heures de développement.
- **Le game design.** Le pack ne parle que d'assets. Il n'y a ni boucle de jeu, ni progression, ni
mesure de l'apprentissage.
- **La sécurité.** Un jeu antillais sur les fruits qui ne parle pas du **mancenillier** est
incomplet et, à la limite, irresponsable. Idem : akée non mûr, coque de pomme-cajou, graines de
médicinier, laurier-jaune. Un module « **Pa touché** » transforme un jeu sympathique en outil que
les écoles ont une raison d'installer.
- **La saisonnalité.** Savoir *quand* un fruit se trouve fait partie de la connaissance perdue,
autant que le nom.
---
## 2. Décisions d'architecture
### 2.1 Phaser 5 n'existe pas
La branche courante est **Phaser 4** (4.0 « Caladan », avril 2026 ; 4.1 « Salusa » ; 4.2 « Giedi »),
avec un moteur WebGL réécrit et une architecture de *render nodes*. Cibler `phaser@^4`, vérifier la
dernière version publiée au démarrage (`npm view phaser version`), et **ne pas partir de Phaser 3**.
### 2.2 Phaser ne doit pas porter tout le jeu
Trois des cinq modes de jeu (QCV photo, indices progressifs, calendrier) sont des interfaces de
cartes et de boutons : Svelte + CSS les fait mieux, plus léger, plus accessible au clavier et au
lecteur d'écran. Phaser gagne sa place sur **une seule scène** : le jaden arcade, où il y a de la
physique, des particules et du *game feel*.
**Architecture retenue — hybride, à frontière stricte :**
```
Svelte 5 (coquille) Phaser 4 (îlot)
├─ routes, i18n, SEO └─ scène « Ranmasé » uniquement
├─ menus, HUD, album · montée en import dynamique
├─ fiches encyclopédie · dans (jeu)/ranmase, jamais au layout racine
├─ données, progression · détruite au démontage (game.destroy(true))
└─ audio, réglages · communique par événements, pas par état partagé
```
Conséquence sur les budgets : le shell reste **≤ 170 Ko JS** (règle du playbook, non négociable) ;
Phaser (~300400 Ko gzip selon le build) n'est téléchargé **qu'à l'entrée dans la scène arcade**,
derrière un écran de chargement designé (P5). C'est un écart au budget, il doit être **documenté
comme tel** dans un ADR, pas subi.
### 2.3 WebGL : oui, mais borné
Phaser en mode `AUTO` (WebGL avec repli canvas), `resolution`/DPR plafonné à **1.5**,
`powerPreference: 'low-power'`, cible **30 fps stables sur Mali-G52**. Aucun WebGL ailleurs dans le
site. Le miroir DOM sémantique de la scène reste obligatoire (ladder §2.8 du playbook).
### 2.4 Deux produits dans un dépôt
C'est la synthèse qui rend le projet cohérent avec le reste de ton écosystème :
- **`/zerbaj/`** — l'encyclopédie : une page prérendue par fruit, SSR complet, lisible **sans
JavaScript**, avec JSON-LD, hreflang et le traitement AI-Overview de ton `PRD_AI_Overview`. C'est
ce qui sera trouvé par les moteurs, cité par les assistants, et lu par les enseignants.
- **`/je/`** — le jeu : PWA hors ligne, aucun compte, aucun tracker, progression en local.
Le jeu déverrouille les fiches ; les fiches ramènent au jeu. Un seul jeu de données pour les deux.
### 2.5 Hors ligne d'abord
Contrainte réelle : le wifi des écoles. Le jeu doit être **entièrement jouable hors ligne** après une
première visite, et installable. Packs d'assets par île, téléchargés à la demande, `Cache-Storage`.
---
## 3. Le jeu proposé — « KI FWI SA YÉ ? »
**Public :** 712 ans, Guadeloupe · Martinique · Guyane · Réunion (extensible).
**Langues :** kréyòl en premier (le nom kréyòl est le nom *principal*, le français est la traduction —
c'est un choix politique, pas cosmétique), FR, EN. `lang` correct partout.
**Cinq modes :**
1. **Rekonèt** — photo réelle → 4 propositions. Répétition espacée façon Leitner (5 boîtes) persistée
en local. C'est le cœur : c'est lui qui fait apprendre.
2. **Kaché** — indices dévoilés un à un : feuille → écorce → coupe → fruit entier. Score dégressif.
Enseigne la lecture botanique, pas la reconnaissance de vignette.
3. **Ranmasé** (Phaser) — récolte dans le jaden : cueillir uniquement le fruit demandé, esquiver les
plantes dangereuses. Le seul mode d'adresse.
4. **Sézon** — placer les fruits sur le calendrier de l'année. Connaissance rare, facile à jouer.
5. **Pa touché** — module sécurité : mancenillier, akée non mûr, coque de cajou, médicinier,
laurier-jaune. Jamais chronométré, jamais scoré. On n'apprend pas le danger sous pression.
**Progression :** un album (`Lakou`) de fiches à débloquer, badges en KA, zéro monnaie, zéro pub,
zéro compte, zéro notification. Export de la progression en JSON (utile pour un enseignant).
**Le « moment de révélation »** (leçon JWE du playbook) : à la bonne réponse — la photo qui se
retourne, le nom kréyòl **prononcé**, le compteur en count-up, la fiche qui s'ajoute à l'album.
---
## 4. Plan en 7 sessions
Chaque session se termine par un build vert, un commit et une note de session. Ne pas enchaîner deux
sessions sans relire ce qui a été produit.
| # | Session | Livrable | Porte de sortie |
|---|---|---|---|
| **0** | **Cadre & données** — aucun code applicatif | ADR (licences, Phaser 4, hybride, sources), `fruits.schema.json`, dataset de 8 fruits vérifiés contre Wikidata/GBIF, `CREDITS.md`, `SOURCES.md`, lettre-type de demande TRAMIL/CIRAD | Le plan est validé **par toi** avant tout code |
| **1** | **Socle** — SvelteKit 2 + Svelte 5 + TS strict, tokens OKI, thème sombre, fonts self-hébergées, PWA, i18n GCF/FR/EN, `/zerbaj/` prérendu avec JSON-LD | 8 fiches en ligne, Lighthouse ≥ 90/95/95/95, lisible sans JS |
| **2** | **Moteur pédagogique** en Svelte pur — modes Rekonèt, Kaché, Sézon + Leitner + audio + album | **Le jeu est déjà amusant sans Phaser.** Si non, ne pas passer à la suite |
| **3** | **Pipeline assets** — client ComfyUI (seeds déterministes), porte de validation, AVIF/WebP, atlas, packs par île | 0 asset non validé dans le build, ≤ 2 Mo à l'entrée |
| **4** | **Ranmasé** (Phaser 4) + module **Pa touché** | Phaser absent du bundle initial, 30 fps sur mobile d'entrée de gamme, miroir DOM |
| **5** | **Contenu** — 24 fruits + 5 plantes dangereuses, audio kréyòl enregistré, relecture orthographique kréyòl | Contenu validé par une personne compétente, pas par un modèle |
| **6** | **Finition** — perf, a11y, DoD §8, `.htaccess`/`_headers`, déploiement, crédits, tag, push Gitea | DoD intégralement vraie |
**Test en classe entre la 5 et la 6.** Six enfants, trente minutes, tu regardes sans intervenir.
C'est la seule mesure qui compte, et elle invalidera une partie de ce document — tant mieux.
---
## 5. Ce qui ne se délègue pas à Claude Code
- Aller voir TRAMIL à Schœlcher.
- Enregistrer les voix kréyòl.
- Photographier les fruits qui manquent sur Commons (il en manquera).
- Faire relire l'orthographe kréyòl par un humain (GEREC-F ou l'usage local — et l'orthographe
gwadloupéyen et matinitjé diffèrent : choisir, documenter, ne pas mélanger).
- Le test en classe.
Le code est la partie facile.