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:
OKI
2026-07-26 23:47:27 -04:00
co-authored by Claude Opus 5
parent f0b3ce8484
commit 945a524b44
45 changed files with 8599 additions and 0 deletions
+78
View File
@@ -0,0 +1,78 @@
# ADR 0005 — Le kréyòl est la langue principale, norme gwadloupéyenne
- **Statut :** accepté ; orthographe en attente de relecture humaine
- **Date :** 2026-07-27
- **Session :** 0 — cadre et données
## Contexte
Le jeu vise à restituer une connaissance qui se transmettait en kréyòl. Traiter le kréyòl
comme une traduction du français inverserait le rapport que le projet cherche précisément
à rétablir.
Par ailleurs, les orthographes gwadloupéyenne et matinitjée diffèrent sur plusieurs entrées
du jeu de données. Les mélanger produirait un contenu que personne ne reconnaît tout à
fait comme le sien.
## Décision
### Le nom kréyòl est le nom de l'entrée
Dans les données, `noms.gcf` est le **nom principal**. `noms.fr`, `noms.en` et `noms.es` en
sont les traductions. Le schéma rend `gcf` obligatoire et les autres facultatives — pas
l'inverse. C'est un choix politique, pas cosmétique, et il ne s'inverse pas au motif que le
français serait « plus pratique » pour l'interface.
### Routes
`/` sert le kréyòl, `/fr/` le français, `/en/` l'anglais. Routeur par dossiers avec
catalogues JSON, pas de middleware (playbook §5b.7) : les URLs et le prérendu restent sous
contrôle total, ce qui est la condition du statique et du hors-ligne.
Attribut `lang="gcf"` correct partout, y compris sur les fragments kréyòl insérés dans une
page française — un nom de fruit prononcé par un lecteur d'écran avec la phonétique
française n'est pas le nom du fruit.
### Norme orthographique : gwadloupéyenne
Une seule norme pour tout le projet, décidée par le porteur en session 0. Le champ
`orthographe.norme` vaut `"gwadloupeyen"` sur chaque entrée, et le schéma n'accepte pas
d'autre valeur : il est impossible de mélanger les deux normes sans modifier le schéma,
donc sans que la décision soit revue.
### L'orthographe elle-même n'est pas du ressort de l'agent
Aucune graphie n'est tranchée par un agent de code. Chaque entrée porte :
```json
"orthographe": { "norme": "gwadloupeyen", "statut": "a_relire", "relu_par": null }
```
`statut` ne passe à `"relu"` que par décision d'un locuteur humain nommé. Le validateur
refuse toute entrée déclarée publiable dont l'orthographe n'est pas relue, et toute entrée
`relu` sans nom de relecteur.
Les incertitudes constatées sont consignées dans `docs/kreyol-a-relire.md` — signalées, pas
corrigées.
## Conséquences
- Les 13 graphies issues de `fruits.seed.json` sont **toutes non vérifiées** à ce stade. La
graine elle-même le déclare. Trois incohérences internes ont été relevées entre
l'identifiant technique et le nom kréyòl (voir `docs/kreyol-a-relire.md`) : elles ne sont
pas corrigées ici.
- Les identifiants techniques (`id`) restent en ASCII sans diacritique — ils servent de nom
de fichier et de segment d'URL. Ils ne sont **pas** une graphie et ne doivent jamais être
affichés à l'utilisateur. `kowosol` est un identifiant ; `kowosòl` est un nom.
- Un identifiant ne se renomme jamais après publication : il est dans les URLs, dans la
progression stockée en local et dans les liens partagés. Une correction d'orthographe
change `noms.gcf`, jamais `id`.
- Chaque entrée doit recevoir un enregistrement audio du nom prononcé par une voix humaine
locale. Pas de synthèse vocale : les enfants visés lisent mal le kréyòl écrit, dont
l'orthographe leur est peu familière — un jeu qui enseigne les noms kréyòl sans les faire
entendre rate sa cible. `npm run check:audio` tient la liste de ce qui manque.
## Point ouvert
Le relecteur n'est pas encore désigné. Tant qu'il ne l'est pas, aucune entrée ne peut être
publiée : c'est le validateur qui l'impose, pas une note de bas de page.