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

2.9 KiB

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.