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>
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user