Files
ki-fwi/docs/adr/0003-frontiere-svelte-phaser.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

60 lines
2.9 KiB
Markdown

# ADR 0003 — Frontière stricte entre Svelte et Phaser
- **Statut :** accepté
- **Date :** 2026-07-27
- **Session :** 0 — cadre et données
## Contexte
Le pack d'origine supposait que le jeu entier serait porté par le moteur de jeu. Or trois
des cinq modes — Rekonèt, Kaché, Sézon — sont des interfaces de cartes et de boutons. Un
canvas les rendrait moins accessibles, plus lourds et plus difficiles à rendre lisibles
sans JavaScript, pour aucun gain.
Le public visé lit parfois mal, navigue sur Android d'entrée de gamme, et une partie de
l'usage se fera en classe, potentiellement au clavier ou avec un lecteur d'écran.
## Décision
Architecture **hybride à frontière stricte** : Svelte porte la coquille, Phaser porte un
seul îlot.
```
Svelte 5 (coquille) Phaser 4 (îlot)
├─ routes, i18n, SEO └─ scène « Ranmasé » uniquement
├─ menus, HUD, album · import dynamique dans (jeu)/ranmase
├─ fiches encyclopédiques · jamais au layout racine
├─ données, progression · game.destroy(true) au démontage
├─ audio, réglages · communication par événements
└─ Rekonèt · Kaché · Sézon · aucun état Svelte partagé par frame
```
Règles de frontière, non négociables :
1. **Import dynamique uniquement**, dans la route de la scène. Un `import` statique de
Phaser au layout racine ferait entrer 300 à 400 Ko dans le chemin critique de toutes
les pages, y compris de l'encyclopédie.
2. **Destruction symétrique** : `game.destroy(true)` au démontage du composant. Un moteur
de jeu qui survit à sa route fuit de la mémoire et continue de consommer du rAF.
3. **Communication par événements**, jamais par état Svelte lu ou écrit à chaque frame.
Le playbook §3 l'interdit explicitement : les états réactifs par frame passent par des
variables plain et un flush rAF.
4. **Miroir DOM sémantique obligatoire** pour la scène (playbook §2.8, point 4) : le canvas
est `aria-hidden`, et l'état du jeu est doublé en DOM lisible au clavier et au lecteur
d'écran.
## Conséquences
- Les quatre modes non-arcade sont **jouables au clavier** et dégradent proprement.
- La session 2 doit produire un jeu **déjà amusant sans Phaser**. C'est la porte de sortie
de cette session : si le jeu n'est pas plaisant en Svelte pur, ajouter un moteur de jeu
ne le sauvera pas — cela ajoutera du poids à un problème de game design.
- L'encyclopédie `/zerbaj/` ne dépend d'aucune brique de jeu et reste prérendue, lisible
sans JavaScript.
## Alternative écartée
**Tout en Phaser.** Aurait unifié le rendu au prix de l'accessibilité clavier, du
référencement de l'encyclopédie, de la lisibilité sans JS et du budget. Le playbook P3 est
explicite : DOM d'abord, WebGL seulement où ça paie. Ici, il ne paie que sur une scène.