Files
ki-fwi/docs/sessions/00-cadre-et-donnees.md
T

172 lines
8.4 KiB
Markdown
Raw Normal View History

# Session 0 — Cadre et données
**Date :** 2026-07-27 · **Type de mission :** B (création *ex nihilo*) · **Code applicatif écrit : aucun.**
---
## Ce qui a été fait
**Gouvernance.** `git init` et commit de protection des documents de cadrage **avant toute
autre action** (playbook §5b.1 — atlas-fediverse avait été perdu faute de ce réflexe). Le
pack de référence `doc2sveltekit-transition/` reste local et non versionné, conformément au
playbook §0. Branche `main`.
**Cadre.** Cinq ADR, `LICENSE` (AGPL-3.0-or-later, texte canonique récupéré depuis gnu.org),
`LICENSE-CONTENT`, audit des sept sources, `SOURCES.md`, deux lettres-types.
**Outillage.** Six scripts dans `tools/data/`, tous hors bundle :
| Commande | Rôle |
|---|---|
| `npm run verify:taxa` | vérifie 13 taxons contre Wikidata (SPARQL) et GBIF |
| `npm run ingest:commons` | remonte les photos candidates sous licence libre |
| `npm run build:dataset` | compose les entrées ; refuse d'écraser sans `--force` |
| `npm run validate:data` | **la porte** — schéma + règles métier, sortie non nulle = build refusé |
| `npm run test:porte` | prouve que la porte refuse les 9 cas interdits |
| `npm run build:credits` | régénère `CREDITS.md` depuis les données |
| `npm run check:audio` | liste les enregistrements kréyòl manquants |
**Données.** 13 entrées dans `src/lib/data/fruits/`, 39 médias candidats, 0 validé.
---
## Ce que la vérification a appris
### La graine était bonne sur la taxonomie
**13 taxons sur 13** trouvés dans Wikidata par correspondance exacte sur `P225`, et
**13 sur 13** acceptés par GBIF en `matchType: EXACT`, `status: ACCEPTED`. **Zéro divergence**
sur les familles annoncées dans `fruits.seed.json`.
Y compris *Cascabela thevetia* pour le laurier-jaune, alors que le synonyme
*Thevetia peruviana* circule largement. Le contrôle du statut GBIF était écrit pour attraper
exactement ce cas ; il n'a rien trouvé à corriger. C'est le bon résultat, et il est
maintenant **vérifié plutôt que supposé**`docs/verification-taxons.md`.
### Aucune machine ne peut valider une photo
La recherche Commons sur *Melicoccus bijugatus* (kénèt) remonte en deuxième position une
photographie de **singe capucin** mangeant le fruit. Le moteur de recherche classe par
pertinence textuelle, pas par contenu botanique.
Cette observation a produit une décision de conception : le schéma distingue désormais
`photo`, `planche_botanique` et `image_generee`. Les fonds Commons contiennent beaucoup de
planches anciennes du domaine public — Blanco, Merian — exactes mais stylisées. Une planche
documente une fiche ; elle ne peut pas porter une épreuve de reconnaissance du réel.
Sur 39 médias candidats retenus : **25 photographies, 14 planches botaniques.**
### Le mancenillier n'a aucune photographie dans le haut de sa pile
Trois entrées comptent moins de deux photographies parmi leurs trois premiers candidats :
| entrée | photos sur 3 candidats | ce que Commons remonte en tête |
|---|---|---|
| `mansiniye` (mancenillier) | **0** | trois planches gravées — Jacquin 1780, Green 1816-20, Hocquart 1821 |
| `pom-site` (pòm-sitè) | **0** | planches, dont deux Blanco |
| `medisinye` (medsinyé) | 1 | |
C'est l'entrée la plus critique du module « Pa touché » qui est la moins bien servie. Un
enfant doit reconnaître un mancenillier **sur une plage**, pas sur une gravure de 1780. Il
faudra descendre plus bas dans les dix candidats de `docs/planche-relecture-medias.md`, ou
photographier l'arbre sur le littoral — il est signalé par une bande de peinture rouge, ce
qui rend la séance de terrain praticable et sans risque de confusion.
Le pré-tri qui produit cette classification a lui-même été corrigé en cours de session : la
planche de Jacquin ressortait d'abord en « photo » parce que ni son titre ni son auteur ne
disent son siècle. La date de prise de vue est désormais examinée, et toute date antérieure
à 1900 classe le média en planche. Ce pré-tri reste **un tri, pas un verdict** : c'est le
relecteur humain qui corrige le champ.
### TRAMIL : la situation est pire que ce que le brief supposait
Vérification directe le 2026-07-27 : le pied de page de `tramil.net` affiche
« © Copyright 2017 TRAMIL all rights reserved », et le lien « Legal notice » du site renvoie
une **404**. Les conditions d'usage ne sont donc même pas consultables. La demande écrite
n'est pas une précaution, c'est la seule voie.
### iNaturalist : 93 % de non commercial, mesuré
Échantillon de 305 photographies de qualité recherche sur *Chrysobalanus icaco* : 280 en
CC BY-NC, 12 en CC0, 8 en CC BY, 5 en CC BY-NC-SA. Se limiter au non-NC réduirait
iNaturalist à un appoint marginal — ce qui donne son poids réel à la décision du porteur.
---
## Écarts constatés et signalés, non corrigés en silence
Le brief §9 impose de signaler les écarts plutôt que de les corriger discrètement.
1. **Le champ `danger` de la graine a deux formes.** Les niveaux « vigilance » (kénèt,
pòm-kannèl) portent leur texte dans `note`, les niveaux « élevé » et « critique » dans
`resume`. Le schéma impose un champ unique : la composition normalise vers `resume`, sans
réécrire un mot. C'est la porte de validation qui a levé l'incohérence, pas une relecture.
2. **Trois identifiants divergent du nom kréyòl au-delà des accents** : `ake`/`aki`,
`medisinye`/`medsinyé`, `lorye-jonn`/`lorié-jòn`. Non tranchés — `docs/kreyol-a-relire.md`.
3. **Deux planches Blanco produisaient le même identifiant de média** une fois tronquées à
60 caractères. Désambiguïsées par suffixe plutôt que perdues.
4. **`comestible: false` sur l'akée et la pomme-cajou** est une sous-estimation assumée :
les deux se mangent sous conditions strictes. Le choix prudent était le seul défendable
sans arbitrage humain — `docs/a-arbitrer.md` §1.
5. **Le brief demandait 8 fruits ; 13 entrées ont été produites** (les 5 plantes du module
« Pa touché » incluses, sur décision du porteur). La vérification coûtait le même effort
et le contenu de sécurité demande le plus long délai de relecture.
---
## La porte de validation
Le brief §2 exigeait que le contrôle soit « un script de build, pas une consigne ».
`tools/data/validate.mjs` refuse :
- une épreuve ou un indice s'appuyant sur un média non validé, non photographique, de
filière B, ou dont la vue n'est pas renseignée ;
- un média à attribution dont l'auteur est absent ;
- un compositing sur un média en partage à l'identique ou sous clause non commerciale ;
- une validation sans nom de validateur ;
- une épreuve portée par une plante dangereuse ;
- une entrée publiée avec moins de deux photos validées, ou dont l'orthographe kréyòl n'est
pas relue par un humain nommé.
`npm run test:porte` fabrique ces neuf cas et vérifie que le refus se produit, plus un cas
témoin conforme qui doit passer. **10/10.** Une règle de sécurité qu'on n'a jamais vue
refuser quelque chose est une intention, pas une règle.
---
## Ce qui bloque la suite
| Blocage | Bloque | Qui peut le lever |
|---|---|---|
| 0 média validé | Rekonèt sur données réelles (session 2) | le porteur, `docs/planche-relecture-medias.md` |
| Aucun relecteur kréyòl désigné | toute publication | le porteur |
| 13 enregistrements manquants | le moment de révélation | une après-midi d'enregistrement |
| Saisonnalité non sourcée | publication du mode Sézon | CIRAD, lettre prête |
| 6 points non arbitrés | publication | le porteur, `docs/a-arbitrer.md` |
**Le premier travail non délégable est la planche de relecture des médias.** La session 1 ne
l'exige pas — les fiches affichent texte, taxonomie et crédits sans photo. La session 2, si.
---
## Vérifications de fin de session
```
npm run verify:taxa → 13 taxons, 0 divergence
npm run ingest:commons → 130 candidats, 0 taxon sous le seuil de 2
npm run validate:data → 13 entrées, 39 médias, 0 validé, 0 erreur
npm run test:porte → 10/10
npm run build:credits → 13 entrées, 39 médias, 0 sous clause NC
npm run check:audio → 13 enregistrements à réaliser
```
Dépendances installées : `ajv` et `ajv-formats` uniquement, toutes deux importées et
utilisées (playbook §2.2 — aucune dépendance installée sans être utilisée).
**Prochaine session : 1 — Socle.** Ne pas la démarrer sans avoir relu ce document et
`docs/plan.md`.