feat(participatif): publier les manques et outiller la contribution

Le manque devient une information de première classe : mesuré, daté,
affiché, et accompagné de la marche à suivre pour le combler (ADR 0006).

Mesure
- rapport:manques : couverture des 5 vues pédagogiques dans les fonds
  publics, présence du kréyòl sur Wikidata, observations GBIF par île,
  manques internes du dataset → docs/manques.md.
- Le kréyòl est absent des communs : Wikidata enregistre 124 noms
  vernaculaires pour ces 13 espèces (zh, en, pt, sl) et aucun en kréyòl ;
  0 étiquette gcf sur 13 items.
- L'écorce est la vue manquante : 3 trous sur 65, tous des écorces —
  mansiniyé 0 fichier, aki 0, kénèt 1.
- Pl@ntNet publie en CC BY-SA là où iNaturalist est à ~93 % CC BY-NC :
  meilleur canal de contribution à effort égal.

Correction d'une mesure fausse avant publication
- Le premier rapport annonçait 28 vues manquantes sur 65. Le groupement OR
  de la recherche Commons ne se comporte pas comme attendu : « section »
  seul remonte 17 fichiers là où « (section OR sliced OR cut OR coupe) » en
  remonte 0. Un mot, une requête, avec gestion du débit — le chiffre réel
  est 3 sur 65. Publier les 28 aurait envoyé des bénévoles photographier
  ce qui existait déjà.

Documents
- docs/contribuer.md : six gestes, du nom kréyòl sur Wikidata (5 min) à
  l'enregistrement d'une voix, avec le tableau de choix de licence et la
  consigne de sécurité pour photographier le mancenillier.
- docs/adr/0006-projet-participatif.md : aucun dépôt interne, aucune
  requête tierce au runtime, la porte de validation reste inchangée.
- docs/courriers/appel-liberation-tramil.md : brouillon d'appel public,
  à n'envisager qu'après la demande privée. Publication au porteur.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
OKI
2026-07-27 10:12:35 -04:00
co-authored by Claude Opus 5
parent 945a524b44
commit 9e3c176411
9 changed files with 1440 additions and 6 deletions
+20 -1
View File
@@ -25,6 +25,22 @@ Cette règle n'est pas une consigne : c'est un script. `npm run validate:data` f
le build si une épreuve s'appuie sur un média non validé, et `npm run test:porte` prouve que le build si une épreuve s'appuie sur un média non validé, et `npm run test:porte` prouve que
ce refus se produit. ce refus se produit.
## Un projet participatif — le manque est publié, pas masqué
Les fonds libres documentent mal la flore antillaise, et le kréyòl en est presque absent :
Wikidata enregistre **124 noms vernaculaires** pour les 13 espèces du projet — en chinois, en
anglais, en portugais, en slovène — et **aucun en kréyòl**.
Plutôt que de contourner ces trous, le projet les mesure et les publie. Une fiche sans photo
d'écorce le dit et explique comment le combler. `npm run rapport:manques` régénère
l'inventaire ; [`docs/contribuer.md`](docs/contribuer.md) explique les six gestes possibles,
de l'ajout d'un nom sur Wikidata — cinq minutes, aucun matériel — jusqu'à l'enregistrement
d'une voix kréyòl.
Contribuer se fait sur Wikimedia Commons, Wikidata, iNaturalist ou Pl@ntNet, **jamais dans le
jeu** : les contributions doivent servir à tout le monde, pas seulement à ce projet. Le jeu
se contente de liens ordinaires — il ne contacte aucun service pendant qu'on y joue.
## Commandes ## Commandes
```bash ```bash
@@ -36,6 +52,7 @@ npm run validate:data # la porte : schéma + règles métier
npm run test:porte # prouve que la porte refuse ce qu'elle doit refuser npm run test:porte # prouve que la porte refuse ce qu'elle doit refuser
npm run build:credits # régénère CREDITS.md depuis les données 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 npm run check:audio # liste les enregistrements kréyòl manquants
npm run rapport:manques # mesure ce qui manque, dans le projet et dans les fonds publics
``` ```
Ces scripts vivent dans `tools/data/`, hors du bundle. **Aucun appel réseau ne subsistera au Ces scripts vivent dans `tools/data/`, hors du bundle. **Aucun appel réseau ne subsistera au
@@ -45,8 +62,10 @@ runtime du jeu** : tout est cuit au build.
| Fichier | Contenu | | Fichier | Contenu |
|---|---| |---|---|
| [`docs/contribuer.md`](docs/contribuer.md) | **comment enrichir la connaissance** — six gestes, du plus rapide au plus engageant |
| [`docs/manques.md`](docs/manques.md) | ce qui manque, mesuré et daté — régénéré par script |
| [`docs/plan.md`](docs/plan.md) | les 7 sessions et leurs portes de sortie mesurables | | [`docs/plan.md`](docs/plan.md) | les 7 sessions et leurs portes de sortie mesurables |
| [`docs/adr/`](docs/adr/) | les cinq décisions d'architecture et leurs motifs | | [`docs/adr/`](docs/adr/) | les six décisions d'architecture et leurs motifs |
| [`docs/audit-sources.md`](docs/audit-sources.md) | ce qu'on prend à chaque source, sous quelle licence | | [`docs/audit-sources.md`](docs/audit-sources.md) | ce qu'on prend à chaque source, sous quelle licence |
| [`docs/a-arbitrer.md`](docs/a-arbitrer.md) | ce qu'un humain doit trancher avant publication | | [`docs/a-arbitrer.md`](docs/a-arbitrer.md) | ce qu'un humain doit trancher avant publication |
| [`docs/kreyol-a-relire.md`](docs/kreyol-a-relire.md) | les incertitudes orthographiques, signalées non corrigées | | [`docs/kreyol-a-relire.md`](docs/kreyol-a-relire.md) | les incertitudes orthographiques, signalées non corrigées |
+96
View File
@@ -0,0 +1,96 @@
# ADR 0006 — Le manque est publié, pas masqué
- **Statut :** accepté
- **Date :** 2026-07-27
- **Session :** 0 — cadre et données
- **Décideur :** le porteur
## Contexte
Le projet se heurtait à un mur prévisible : les fonds libres documentent mal la flore
antillaise, et le premier réflexe d'un projet logiciel devant un trou de données est de le
contourner — masquer la fiche incomplète, remplacer la photo absente par un visuel généré,
afficher une saison approximative sans le dire.
Chacun de ces contournements dégrade ce que le jeu prétend enseigner, et surtout : **il perd
l'information**. Un trou masqué reste un trou. Un trou publié est une tâche que quelqu'un
peut prendre.
La mesure faite en session 0 donne à cette question un poids inattendu. Wikidata enregistre
**124 noms vernaculaires** pour les 13 espèces du projet — 33 pour le fruit à pain, 22 pour
la pomme d'eau, en chinois, anglais, portugais, slovène. **Aucun en kréyòl.** Le jeu n'est
donc pas seulement consommateur de communs numériques : il est, sur cette langue, à peu près
le seul à en produire.
## Décision
**Le manque est une information de première classe, affichée dans le produit.**
### Trois conséquences concrètes
1. **L'encyclopédie affiche ce qu'elle n'a pas.** Une fiche sans photo d'écorce le dit, et
explique comment la combler. Pas de silence, pas de remplissage.
2. **Le jeu comporte un écran de contribution** — « Ba on koudmen » — qui liste les manques
du moment et pointe vers les plateformes où les combler. Session 2.
3. **Le manque est mesuré par script, pas décrit à la main.**
`npm run rapport:manques` produit `docs/manques.md` : couverture des cinq vues
pédagogiques dans les fonds publics, présence du kréyòl sur Wikidata, observations par
île, et manques internes du dataset. Un chiffre daté vaut mieux qu'une impression.
### Ce que cette décision n'autorise pas
- **Aucune requête tierce au runtime.** Contribuer se fait sur les plateformes externes ; le
jeu se contente de liens `<a>` ordinaires. Le rapport de manques est calculé **au build**
(playbook P2) et embarqué comme donnée statique. Aucun appel à Commons, Wikidata,
iNaturalist ou Pl@ntNet pendant qu'on joue.
- **Aucun compte, aucune collecte.** Le projet ne reçoit pas les contributions : il oriente
vers Commons et Wikidata, où elles profitent à tout le monde. Un formulaire de dépôt
interne créerait un silo, exactement ce que le projet combat, et poserait la question de
la modération de contenus déposés par des enfants — que ce projet ne veut pas avoir à se
poser.
- **Aucun assouplissement de la porte de validation.** Une contribution passe par la même
relecture humaine nominative que le reste (ADR 0004). L'ouverture porte sur qui peut
proposer, jamais sur qui peut valider.
## Conséquences
### Sur les priorités de contenu
La mesure fait apparaître une hiérarchie que l'intuition n'aurait pas donnée :
- **L'écorce est la vue manquante** — 3 trous sur les 3 restants après correction de la
mesure, tous des écorces. C'est aussi l'indice le plus fiable sur le terrain, puisqu'un
tronc est visible toute l'année quand un fruit ne l'est que quelques mois.
- **Le mancenillier est le plus mal servi** : 56 fichiers sur Commons contre 1076 pour la
goyave, ses trois premiers résultats étant des gravures de 1780, 1816 et 1821. L'entrée la
plus critique du module de sécurité est la moins bien documentée.
- **Le kréyòl est à zéro partout**, ce qui rend la contribution Wikidata prioritaire alors
qu'elle ne demande ni appareil photo ni déplacement.
### Sur les sessions suivantes
- **Session 1** — l'encyclopédie affiche les manques de chaque fiche.
- **Session 2** — écran « Ba on koudmen », alimenté par le rapport baké au build.
- **Session 6** — `docs/contribuer.md` devient une page publique du site.
### Sur la mesure elle-même
Le premier rapport produit annonçait **28 vues manquantes sur 65**. Le chiffre était faux :
le groupement `OR` de la recherche Commons ne se comporte pas comme attendu — sur
*Annona muricata*, `section` seul remonte 17 fichiers là où `(section OR sliced OR cut OR
coupe)` en remonte 0. Après correction — un mot, une requête —, le chiffre réel est **3 sur
65**.
L'écart est instructif à deux titres. D'abord, publier 28 faux manques aurait envoyé des
bénévoles photographier ce qui existait déjà. Ensuite, une mesure qui produit un résultat
extrême — ici, `coupe` à zéro pour les treize espèces — doit être suspectée avant d'être
publiée. Le script gère désormais explicitement la limitation de débit des API, parce qu'une
réponse illisible comptée comme « 0 fichier » fabrique un manque imaginaire.
## Alternative écartée
**Un formulaire de dépôt de photos dans le jeu.** Plus simple pour le contributeur, mais il
crée un silo — les photos ne serviraient qu'à ce jeu —, impose une modération, et suppose un
serveur, un compte et une collecte. Orienter vers Commons demande un effort de plus au
contributeur et rend sa contribution utile bien au-delà du projet. C'est le sens même du mot
« communs ».
+280
View File
@@ -0,0 +1,280 @@
# Contribuer — enrichir la connaissance, pas seulement le jeu
Ce projet a deux objets. Le premier est d'apprendre aux enfants à reconnaître les fruits de
leurs îles. Le second est de **réparer un trou dans les communs numériques** : ces espèces
sont mal documentées, et leurs noms kréyòl le sont encore moins.
Ces deux objets se servent l'un l'autre. Chaque photo versée à Wikimedia Commons, chaque
nom kréyòl inscrit sur Wikidata sert à ce jeu **et** à tous ceux qui viendront après —
enseignants, chercheurs, autres jeux, moteurs de recherche, assistants.
L'inventaire des manques, mesuré et daté, est dans [`manques.md`](manques.md). Il est
régénéré par `npm run rapport:manques`.
> **Note sur le jeu lui-même.** Le jeu ne contacte aucun service tiers pendant qu'on y joue :
> c'est une règle du projet. Contribuer se fait donc **en dehors** du jeu, sur les
> plateformes ci-dessous. Le jeu affichera les manques et pointera vers elles par des liens
> ordinaires — il ne collectera jamais rien.
---
## Ce qui manque vraiment — mesuré le 2026-07-27
Trois constats, du plus surprenant au plus prévisible.
### 1. Le kréyòl est absent des communs numériques
Sur les 13 espèces du projet, Wikidata enregistre **124 noms vernaculaires** — 33 pour le
fruit à pain, 22 pour la pomme d'eau, 12 pour la goyave, en chinois, en anglais, en
portugais, en slovène. **Aucun en kréyòl.** Zéro sur 13.
Ce n'est pas une petite lacune de catalogue. Cela veut dire qu'aujourd'hui, un moteur de
recherche, un assistant ou un chercheur qui interroge les données ouvertes du monde ne
trouvera nulle part que ce fruit s'appelle **kowosòl**.
### 2. L'écorce est la vue qui manque partout
Sur les cinq vues pédagogiques et les 13 espèces, **trois trous** subsistent dans les fonds
libres — et les trois sont des écorces :
| espèce | fichiers « écorce » trouvables sur Commons |
|---|---|
| mansiniyé — mancenillier | **0** |
| aki — akée | **0** |
| kénèt — quenette | **1** |
Trois autres sont tout juste au-dessus du seuil : kowosòl, zikak et lorié-jòn, avec 3
fichiers chacune.
C'est cohérent avec la pratique : on photographie un fruit, rarement un tronc. Or l'écorce
est l'un des quatre indices que le mode **Kaché** enseigne, et c'est souvent le plus fiable
sur le terrain — un fruit n'est visible que quelques mois par an, un tronc toute l'année.
### 3. Le mancenillier est le plus mal servi, alors qu'il est le plus important
L'arbre le plus dangereux du littoral antillais compte **56 fichiers** sur Commons, contre
1076 pour la goyave. Ses trois premiers résultats de recherche sont des **gravures de 1780,
1816 et 1821**. Aucune photographie moderne en tête de pile, aucune écorce.
---
## Six gestes, du plus rapide au plus engageant
### A. Inscrire un nom kréyòl sur Wikidata — 5 minutes, aucun matériel
**Le geste le plus rentable du projet.** Il ne demande ni appareil photo ni déplacement, et
son effet dure.
1. Créer un compte sur [wikidata.org](https://www.wikidata.org) (facultatif mais recommandé).
2. Ouvrir l'élément de l'espèce — les liens sont dans [`manques.md`](manques.md), par
exemple [Q1709343](https://www.wikidata.org/wiki/Q1709343) pour le corossol.
3. Ajouter le nom kréyòl à **deux endroits** :
- l'**étiquette** en langue `gcf` (kréyòl gwadloupéyen) ;
- la propriété **P1843 « nom vernaculaire du taxon »**, valeur `kowosòl`, langue `gcf`.
4. Enregistrer avec un commentaire du type « nom vernaculaire kréyòl gwadloupéyen ».
**Important :** n'inscrire que des noms dont on est sûr, dans la norme gwadloupéyenne, et de
préférence après relecture. Les incertitudes du projet sont listées dans
[`kreyol-a-relire.md`](kreyol-a-relire.md) — inscrire une graphie douteuse sur Wikidata la
propage partout.
Si le code de langue `gcf` n'apparaît pas dans l'interface, le signaler dans une issue du
projet plutôt que de rabattre sur un autre code : le kréyòl haïtien (`ht`) est une **autre
langue**, et l'y mettre serait une erreur, pas un pis-aller.
---
### B. Rendre trouvable une photo qui existe déjà — 10 minutes
La recherche Commons porte sur le **texte** des pages de fichier, pas sur le contenu des
images. Une photo d'écorce de corossol dont la description dit seulement « Annona muricata »
est, en pratique, introuvable pour qui cherche une écorce.
Une partie des trous mesurés dans [`manques.md`](manques.md) sont donc des trous de
**description**, pas de photographie. Les combler ne demande qu'un navigateur :
1. Parcourir les fichiers de l'espèce (lien « tous les fichiers » dans `manques.md`).
2. Repérer une photo dont le sujet réel — écorce, feuille, coupe, port de l'arbre — n'est
pas dit dans la description.
3. Compléter la description en français **et** en anglais : « écorce / bark », « feuille /
leaf », « fruit coupé / cut fruit ».
4. Ajouter la donnée structurée **« représente » (depicts)** et la catégorie de l'espèce.
Aucun droit d'auteur en jeu : on décrit, on ne modifie pas l'image.
---
### C. Photographier ce qui manque — la contribution la plus utile
**Priorité absolue : les écorces**, et en premier celles du mancenillier, de l'akée et de la
quenette.
**Ce qu'une photo utile montre.** Un cadre net, une lumière du jour, un seul sujet :
| vue | ce qu'il faut voir | erreur fréquente |
|---|---|---|
| écorce | une portion de tronc de près, à hauteur de poitrine, texture lisible | photographier l'arbre entier |
| feuille | une feuille isolée à plat, dessus **et** dessous, avec la nervure | une masse de feuillage |
| coupe | le fruit coupé net, graines et chair visibles | un fruit croqué |
| fruit entier | le fruit sur l'arbre, avec une échelle si possible | un fruit sur une assiette, hors contexte |
| port | l'arbre entier, silhouette dégagée | un arbre pris dans un fourré |
**Sécurité — à lire avant de photographier les cinq plantes du module « Pa touché ».**
Le mancenillier ne se touche pas, ne s'approche pas sous la pluie, et son bois ne se brûle
pas. Il se photographie **au téléobjectif, à distance, par temps sec**. Les arbres sont
signalés par une bande de peinture rouge sur le littoral martiniquais et guadeloupéen : cela
lève tout doute d'identification et permet de garder ses distances. Aucune photo ne vaut une
brûlure.
**Ensuite, verser sur Wikimedia Commons :**
1. [Assistant de versement](https://commons.wikimedia.org/wiki/Special:UploadWizard) — **uniquement ses propres photos**.
2. Licence : **CC BY-SA 4.0** ou **CC0**. Voir le tableau des licences plus bas.
3. Décrire en français et en anglais, en nommant la vue.
4. Catégorie : `Category:<Nom scientifique>`, par exemple `Category:Hippomane mancinella`.
5. Ajouter la géolocalisation si elle n'expose pas un lieu privé.
---
### D. Observer sur iNaturalist ou Pl@ntNet — et bien choisir sa licence
Ces deux plateformes documentent la **répartition** et la **saisonnalité**, deux choses qui
manquent au projet (le mode Sézon n'est aujourd'hui sourcé par rien). Elles alimentent GBIF,
donc les données ouvertes mondiales.
**Le point de licence, qui change tout.** Mesuré sur le zikak en Guadeloupe :
| plateforme | licence des images observée | conséquence pour le projet |
|---|---|---|
| **iNaturalist** | ~93 % **CC BY-NC** | utilisable, mais consomme l'engagement non commercial |
| **Pl@ntNet** | **CC BY-SA** dans notre échantillon (jeu GBIF sous CC BY 4.0) | pleinement réutilisable |
Deux conseils qui découlent de cette mesure :
- **Sur iNaturalist, changez votre licence par défaut.** Dans les paramètres du compte, la
licence des photos est réglable une fois pour toutes. Passer de CC BY-NC à **CC BY** ou
**CC0** rend toutes vos observations pleinement réutilisables, sans effort supplémentaire.
C'est probablement le réglage le plus utile que puisse faire un naturaliste amateur.
- **Pl@ntNet sert aussi à vérifier avant de publier.** Photographier une feuille et laisser
l'application proposer une identification est un bon garde-fou — à condition de la traiter
comme un avis, pas comme une preuve. Une identification automatique reste une hypothèse.
---
### E. Enregistrer une voix kréyòl
Chaque nom doit être **entendu**, pas seulement lu : les enfants visés lisent mal le kréyòl
écrit, dont l'orthographe leur est peu familière. **Aucune synthèse vocale** n'est utilisée
dans ce projet.
La liste de ce qui manque : [`audio-a-enregistrer.md`](audio-a-enregistrer.md) — **13 noms à
ce jour, soit la totalité.**
Un téléphone dans une pièce calme suffit. Une voix locale vaut mieux qu'un studio. Le
locuteur est crédité nominativement, conserve ses droits, et doit donner une autorisation
écrite avant embarquement.
Une après-midi d'enregistrement vaut dix heures de développement.
---
### F. Écrire sur Wikipédia
L'article français d'une espèce mentionne rarement son nom kréyòl, ses usages locaux ou sa
saison aux Antilles. Ajouter un paragraphe **sourcé** est une contribution durable.
À noter : **il n'existe pas de Wikipédia en kréyòl gwadloupéyen.** Un projet est en
incubation sur [Wikimedia Incubator](https://incubator.wikimedia.org/wiki/Wp/gcf) — y
contribuer participe à le faire naître. Attention à ne pas le confondre avec la Wikipédia en
créole haïtien (`ht.wikipedia.org`), qui est une **autre langue**.
---
## Choisir la bonne licence
C'est le choix qui détermine si votre travail sera réutilisable. Il n'existe pas de
« libre de droit ».
| licence | ce qu'elle permet | recommandation |
|---|---|---|
| **CC0** | tout, sans condition | ✅ idéale pour ce projet |
| **CC BY 4.0** | tout, avec attribution | ✅ excellente |
| **CC BY-SA 4.0** | tout, avec attribution + partage à l'identique | ✅ recommandée, celle du projet |
| **CC BY-NC** | usage non commercial seulement | ⚠️ acceptée, mais engage définitivement le projet |
| tous droits réservés | rien sans autorisation écrite | ⛔ inutilisable |
**Pourquoi éviter le NC quand on peut.** La clause non commerciale interdit aussi des usages
que personne ne veut interdire : une école privée, une association qui vend un livret à prix
coûtant, un éditeur de manuels scolaires. Elle empêche par ailleurs de mélanger l'image à
une œuvre en partage à l'identique — d'où l'interdiction absolue de compositing dans ce
projet ([ADR 0001](adr/0001-licences.md)).
Si votre photo peut être en CC BY-SA plutôt qu'en CC BY-NC, elle servira à beaucoup plus de
monde, pour exactement le même effort.
---
## Comment une contribution revient dans le jeu
```
vous photographiez, décrivez, ou nommez
Commons · Wikidata · iNaturalist · Pl@ntNet
npm run ingest:commons (récupère métadonnées et licences)
npm run rapport:manques (recalcule ce qui manque encore)
relecture humaine : vue assignée, valide → true, validateur nommé
npm run validate:data (la porte : refuse tout média non validé)
dans le jeu
```
**Aucun automate ne peut valider un média à votre place.** Un script ne sait pas si une
photo montre bien un zikak — la recherche Commons remonte d'ailleurs, pour la quenette, une
photo de singe capucin en train d'en manger. La validation est un geste humain, nominatif,
et le fichier de données enregistre qui l'a posé.
---
## L'appel à la libération des données TRAMIL
TRAMIL est un programme de recherche sur la médecine traditionnelle caribéenne, hébergé par
le SCD de l'Université des Antilles à Schœlcher. Sa TRAMILothèque — photographies, planches
d'herbier, coupes microscopiques — est **la meilleure ressource iconographique existante
pour la flore antillaise**.
Elle est aujourd'hui inutilisable. Constaté le 2026-07-27 :
- le pied de page de `tramil.net` indique **« © Copyright 2017 TRAMIL all rights reserved »** ;
- le lien **« Legal notice » du site renvoie une erreur 404** — les conditions d'usage ne
sont donc même pas consultables.
Un fonds financé par la recherche publique, sur un patrimoine collectif caribéen, sans
licence lisible : le résultat est qu'il ne circule pas.
Ce projet ne prend aucun fichier TRAMIL et n'en prendra pas sans autorisation écrite. Il
porte en revanche une demande, à deux niveaux :
- **la démarche individuelle** — [`courriers/tramil.md`](courriers/tramil.md), une demande
d'autorisation classique pour un usage précis ;
- **l'appel public** — [`courriers/appel-liberation-tramil.md`](courriers/appel-liberation-tramil.md),
qui demande l'adoption d'une licence libre sur le fonds. À cosigner et à publier, si le
porteur le juge opportun.
Le second n'est pas une attaque contre TRAMIL : c'est une demande adressée à une institution
dont le travail mérite d'être diffusé, et qu'une licence absente empêche de diffuser.
---
## Signaler sans contribuer
Voir une erreur est déjà une contribution. Une photo qui ne montre pas la bonne espèce, un
nom kréyòl mal orthographié, une saison fausse, un indice botanique douteux : ouvrir une
issue suffit.
Le projet préfère un signalement approximatif à une erreur qui reste. C'est particulièrement
vrai du module « Pa touché » : sur les plantes dangereuses, un doute exprimé vaut mieux
qu'une politesse.
+117
View File
@@ -0,0 +1,117 @@
# Appel public à la libération des données TRAMIL — brouillon
> **Statut : brouillon. Rien n'est publié.**
>
> Ce texte est destiné à être **cosigné puis rendu public** — sur o-k-i.net, envoyé à
> l'Université des Antilles, aux rectorats de Martinique et de Guadeloupe, et aux
> associations d'éducation à l'environnement de la région.
>
> **Deux précautions avant toute publication.**
>
> 1. **Envoyer d'abord la demande privée** ([`tramil.md`](tramil.md)) et lui laisser un délai
> réel — deux à trois mois. Un appel public lancé avant toute prise de contact serait à la
> fois discourtois et moins efficace : la voie normale obtient souvent ce qu'elle demande.
> 2. **Faire relire le texte** par quelqu'un qui connaît les rapports institutionnels
> locaux. TRAMIL est un partenaire potentiel, pas un adversaire ; le ton doit rester celui
> d'une demande entre gens qui poursuivent le même but.
>
> La décision de publier appartient au porteur.
---
## Pour que le patrimoine végétal caribéen circule
**Appel à l'adoption d'une licence libre sur les ressources du programme TRAMIL**
### Ce que TRAMIL a construit
Depuis plus de trente ans, le programme TRAMIL — *Programme de recherche appliquée à la
médecine populaire de la Caraïbe* — documente les usages traditionnels des plantes de la
région. Enquêtes de terrain, validation scientifique, publications multilingues, et une
iconographie considérable : photographies, planches d'herbier, coupes microscopiques.
C'est, à notre connaissance, la ressource la plus complète existante sur la flore utile
caribéenne. Elle est le fruit d'un travail collectif, largement financé par la recherche
publique, portant sur un savoir qui appartient d'abord aux populations de la région.
### Ce qui empêche ce travail de servir
Ce fonds ne circule pas.
Constaté le 27 juillet 2026 :
- le site `tramil.net` porte en pied de page la mention **« © Copyright 2017 TRAMIL all
rights reserved »** ;
- le lien **« Legal notice »** du site renvoie une **erreur 404**.
Autrement dit : aucune licence n'est accordée, et les conditions d'usage ne sont pas
consultables. Pour un enseignant, un développeur d'outil éducatif, une association ou une
collectivité, la conséquence pratique est simple — **on ne peut rien en faire**, même à but
strictement pédagogique et non lucratif.
Nous ne pensons pas que ce soit un choix délibéré. C'est plus vraisemblablement un impensé :
la question de la licence ne s'est pas posée à une époque où elle ne se posait à personne, et
personne ne l'a rouverte depuis. C'est précisément pour cela qu'un appel a un sens.
### Ce que nous demandons
L'adoption d'une **licence libre explicite** sur tout ou partie du fonds TRAMIL —
prioritairement l'iconographie et les fiches d'espèces —, par exemple :
- **CC BY 4.0** (attribution seule), ou
- **CC BY-SA 4.0** (attribution et partage à l'identique),
et le versement des images concernées à **Wikimedia Commons**, où elles deviendraient
consultables, réutilisables et durables.
À défaut d'une ouverture complète, une ouverture partielle serait déjà décisive : les fiches
d'espèces sans l'iconographie, ou l'iconographie des seules espèces les plus dangereuses —
mancenillier, médicinier, laurier-jaune, akée —, dont la reconnaissance est un enjeu de
santé publique pour les enfants de la région.
### Pourquoi maintenant
Trois raisons.
**La connaissance se perd plus vite que le fonds ne s'ouvre.** Une partie des enfants
antillais ne sait plus nommer les fruits de son île, ni reconnaître les arbres qui les
portent. Les outils qui pourraient y remédier existent ; ce qui leur manque, ce sont des
images utilisables.
**Le vide se remplit tout seul, et mal.** Les modèles génératifs produisent aujourd'hui des
images de corossol, de quenette et de zikak, plausibles et fausses. À défaut de
photographies libres, ce sont ces images qui illustreront la flore caribéenne — dans les
supports scolaires, dans les moteurs de recherche, dans les réponses des assistants. Un fonds
scientifique fermé ne protège pas contre cela : il laisse le champ libre.
**Les données ouvertes sont devenues la condition d'exister.** Les 13 espèces que documente
notre projet totalisent 124 noms vernaculaires enregistrés dans Wikidata — en chinois, en
anglais, en portugais, en slovène. **Aucun en kréyòl.** Ce qui n'est pas dans les communs
numériques est, pour une part croissante du monde, ce qui n'existe pas.
### Ce que nous nous engageons à faire
Nous, signataires, nous engageons à :
- **créditer intégralement** TRAMIL et chaque auteur, dans nos outils et dans nos publications ;
- **verser en retour** nos propres contributions — photographies, enregistrements de noms
kréyòl, données de saisonnalité — sous licence libre, à Wikimedia Commons et à Wikidata ;
- **respecter l'intégrité scientifique** des contenus : aucune modification, aucun
recadrage-recomposition, aucune reprise hors contexte ;
- **retirer sans délai** tout contenu sur simple demande.
En attendant une réponse, nous nous interdisons tout usage de fichiers TRAMIL. Notre projet
cite TRAMIL comme source de vérification factuelle, et n'en reprend aucune image.
### Signataires
| Organisation / personne | Qualité | Date |
|---|---|---|
| ORGANISATION KA INTERNATIONALE | porteur du projet KI FWI SA YÉ ? | |
| | | |
---
*Contact : [courriel du porteur] · o-k-i.net*
*Ce projet est libre : code sous AGPL-3.0, contenu sous CC BY-SA 4.0, aucune publicité,
aucun compte, aucun traceur, aucune collecte de données sur les enfants.*
+514
View File
@@ -0,0 +1,514 @@
# Ce qui manque — et comment le combler
> Généré par `npm run rapport:manques` le 2026-07-27.
> Sortie de script : ne pas éditer à la main.
Ce projet est participatif. Un manque nest pas un défaut à masquer : cest une tâche
publiée. Chaque ligne ci-dessous est quelque chose quune personne peut aller combler,
et dont le bénéfice dépasse ce jeu — une photo versée à Wikimedia Commons sert à tous.
**Comment contribuer :** [`docs/contribuer.md`](contribuer.md).
## Comment lire ce rapport
Une vue est déclarée **manquante** quand les fonds publics contiennent moins de 3 fichiers
trouvables pour elle. La mesure porte sur le **texte** des pages de fichier Commons, pas sur
le contenu des images : une photo de feuille dont la description ne dit pas « leaf » est
comptée absente. Cest volontaire — une photo que personne ne peut trouver est presque
aussi inutile quune photo qui nexiste pas, et **la redécrire est déjà une contribution**.
---
## Vue densemble
| entrée | fichiers Commons | fruit | coupe | feuille | écorce | port | médias validés |
|---|---|---|---|---|---|---|---|
| `kenet` | 30 | 14 | 8 | 3 | **1** ⚠ | 3 | 0/3 |
| `mansiniye` | 56 | 6 | 9 | 4 | **0** ⚠ | 20 | 0/3 |
| `ake` | 75 | 23 | 6 | 4 | **0** ⚠ | 14 | 0/3 |
| `pom-site` | 93 | 36 | 9 | 6 | 7 | 12 | 0/3 |
| `fwiyapen` | 851 | 222 | 147 | 73 | 25 | 438 | 0/3 |
| `gouyav` | 1076 | 153 | 29 | 75 | 13 | 116 | 0/3 |
| `kowosol` | 395 | 209 | 17 | 24 | 3 | 66 | 0/3 |
| `medisinye` | 356 | 67 | 13 | 86 | 10 | 23 | 0/3 |
| `pom-dlo` | 882 | 221 | 156 | 22 | 29 | 406 | 0/3 |
| `pom-kannel` | 546 | 321 | 46 | 65 | 13 | 69 | 0/3 |
| `zikak` | 78 | 19 | 14 | 19 | 3 | 6 | 0/3 |
| `lorye-jonn` | 416 | 62 | 27 | 79 | 3 | 145 | 0/3 |
| `pom-kajou` | 827 | 180 | 94 | 39 | 29 | 198 | 0/3 |
**3 vues manquantes sur 65** dans les fonds publics libres.
---
## Le kréyòl dans les communs numériques
Un nom qui nexiste que dans ce jeu reste un nom perdu partout ailleurs. Wikidata offre
deux emplacements pour linscrire durablement : l**étiquette** de langue `gcf`, et la
propriété **P1843**, « nom vernaculaire du taxon ».
**0 étiquette(s) kréyòl sur 13** · **0 nom(s) vernaculaire(s) kréyòl sur 13**.
| entrée | nom kréyòl | étiquette `gcf` | noms vernaculaires enregistrés | dont kréyòl |
|---|---|---|---|---|
| [`kenet`](https://www.wikidata.org/wiki/Q279728) | kénèt | **absente** ⚠ | 2 | **non** ⚠ |
| [`mansiniye`](https://www.wikidata.org/wiki/Q636480) | mansiniyé | **absente** ⚠ | 1 | **non** ⚠ |
| [`ake`](https://www.wikidata.org/wiki/Q417145) | aki | **absente** ⚠ | 5 | **non** ⚠ |
| [`pom-site`](https://www.wikidata.org/wiki/Q500383) | pòm-sitè | **absente** ⚠ | 3 | **non** ⚠ |
| [`fwiyapen`](https://www.wikidata.org/wiki/Q14677) | fwiyapen | **absente** ⚠ | 33 | **non** ⚠ |
| [`gouyav`](https://www.wikidata.org/wiki/Q166843) | gouyav | **absente** ⚠ | 12 | **non** ⚠ |
| [`kowosol`](https://www.wikidata.org/wiki/Q1709343) | kowosòl | **absente** ⚠ | 7 | **non** ⚠ |
| [`medisinye`](https://www.wikidata.org/wiki/Q74644) | medsinyé | **absente** ⚠ | 10 | **non** ⚠ |
| [`pom-dlo`](https://www.wikidata.org/wiki/Q11643111) | pòm-dlo | **absente** ⚠ | 22 | **non** ⚠ |
| [`pom-kannel`](https://www.wikidata.org/wiki/Q275620) | pòm-kannèl | **absente** ⚠ | 10 | **non** ⚠ |
| [`zikak`](https://www.wikidata.org/wiki/Q577669) | zikak | **absente** ⚠ | 6 | **non** ⚠ |
| [`lorye-jonn`](https://www.wikidata.org/wiki/Q10694475) | lorié-jòn | **absente** ⚠ | 2 | **non** ⚠ |
| [`pom-kajou`](https://www.wikidata.org/wiki/Q34007) | pòm-kajou | **absente** ⚠ | 11 | **non** ⚠ |
Cest la contribution la moins coûteuse du projet et lune des plus durables : quelques
minutes par entrée, un bénéfice qui dépasse largement ce jeu. Marche à suivre dans
[`contribuer.md`](contribuer.md).
---
## kénèt — *Melicoccus bijugatus*
`kenet` · fruit · Guadeloupe, Martinique
### 📷 Photographies à prendre (1 vue(s))
- **ecorce** — 1 fichier(s) trouvable(s) sur Commons.
Ce quil faut montrer : lisse, grise
### 🗺️ Où lespèce est déjà observée
| île | observations GBIF | dont avec image |
|---|---|---|
| Guadeloupe | 112 | 35 |
| Martinique | 52 | 39 |
Peu dobservations sur une île ne veut pas dire que lespèce y est rare : cela veut
souvent dire que personne ne la encore documentée. Cest aussi une contribution.
### 📝 Manques dans les données du projet
- 0 média validé sur 3 — il en faut au moins 2
- aucune vue assignée — personne na encore regardé les images
- aucun enregistrement du nom kréyòl
- aucune source factuelle citée pour les indices
- orthographe kréyòl non relue
- saisonnalité non sourcée et non ventilée par île
### 🔗 Aller voir
- [Commons — tous les fichiers](https://commons.wikimedia.org/w/index.php?search=%22Melicoccus%20bijugatus%22%20filetype%3Abitmap&ns6=1)
- [Wikidata Q279728](https://www.wikidata.org/wiki/Q279728) · [GBIF 3189990](https://www.gbif.org/species/3189990)
- [iNaturalist](https://www.inaturalist.org/search?q=Melicoccus%20bijugatus) · [Pl@ntNet](https://identify.plantnet.org/)
## mansiniyé — *Hippomane mancinella*
`mansiniye` · ⚠ plante dangereuse · Guadeloupe, Martinique
### 📷 Photographies à prendre (1 vue(s))
- **ecorce** — 0 fichier(s) trouvable(s) sur Commons.
### 🗺️ Où lespèce est déjà observée
| île | observations GBIF | dont avec image |
|---|---|---|
| Guadeloupe | 146 | 65 |
| Martinique | 151 | 86 |
Peu dobservations sur une île ne veut pas dire que lespèce y est rare : cela veut
souvent dire que personne ne la encore documentée. Cest aussi une contribution.
### 📝 Manques dans les données du projet
- 0 média validé sur 3 — il en faut au moins 2
- 0 photographie(s) parmi les candidats, 3 planche(s) ancienne(s)
- aucune vue assignée — personne na encore regardé les images
- aucun enregistrement du nom kréyòl
- aucune source factuelle citée pour les indices
- orthographe kréyòl non relue
### 🔗 Aller voir
- [Commons — tous les fichiers](https://commons.wikimedia.org/w/index.php?search=%22Hippomane%20mancinella%22%20filetype%3Abitmap&ns6=1)
- [Wikidata Q636480](https://www.wikidata.org/wiki/Q636480) · [GBIF 3063705](https://www.gbif.org/species/3063705)
- [iNaturalist](https://www.inaturalist.org/search?q=Hippomane%20mancinella) · [Pl@ntNet](https://identify.plantnet.org/)
## aki — *Blighia sapida*
`ake` · ⚠ plante dangereuse · Guadeloupe, Martinique, Guyane
### 📷 Photographies à prendre (1 vue(s))
- **ecorce** — 0 fichier(s) trouvable(s) sur Commons.
### 🗺️ Où lespèce est déjà observée
| île | observations GBIF | dont avec image |
|---|---|---|
| Guadeloupe | 4 | 1 |
| Martinique | 27 | 6 |
| Guyane | 7 | 2 |
Peu dobservations sur une île ne veut pas dire que lespèce y est rare : cela veut
souvent dire que personne ne la encore documentée. Cest aussi une contribution.
### 📝 Manques dans les données du projet
- 0 média validé sur 3 — il en faut au moins 2
- aucune vue assignée — personne na encore regardé les images
- aucun enregistrement du nom kréyòl
- aucune source factuelle citée pour les indices
- orthographe kréyòl non relue
### 🔗 Aller voir
- [Commons — tous les fichiers](https://commons.wikimedia.org/w/index.php?search=%22Blighia%20sapida%22%20filetype%3Abitmap&ns6=1)
- [Wikidata Q417145](https://www.wikidata.org/wiki/Q417145) · [GBIF 3189955](https://www.gbif.org/species/3189955)
- [iNaturalist](https://www.inaturalist.org/search?q=Blighia%20sapida) · [Pl@ntNet](https://identify.plantnet.org/)
## pòm-sitè — *Spondias dulcis*
`pom-site` · fruit · Guadeloupe, Martinique, Guyane
### 📷 Photographies
Les cinq vues sont couvertes dans les fonds publics. Reste à les choisir et les valider.
### 🗺️ Où lespèce est déjà observée
| île | observations GBIF | dont avec image |
|---|---|---|
| Guadeloupe | 18 | 11 |
| Martinique | 9 | 5 |
| Guyane | 12 | 7 |
Peu dobservations sur une île ne veut pas dire que lespèce y est rare : cela veut
souvent dire que personne ne la encore documentée. Cest aussi une contribution.
### 📝 Manques dans les données du projet
- 0 média validé sur 3 — il en faut au moins 2
- 0 photographie(s) parmi les candidats, 3 planche(s) ancienne(s)
- aucune vue assignée — personne na encore regardé les images
- aucun enregistrement du nom kréyòl
- aucune source factuelle citée pour les indices
- orthographe kréyòl non relue
- saisonnalité non sourcée et non ventilée par île
### 🔗 Aller voir
- [Commons — tous les fichiers](https://commons.wikimedia.org/w/index.php?search=%22Spondias%20dulcis%22%20filetype%3Abitmap&ns6=1)
- [Wikidata Q500383](https://www.wikidata.org/wiki/Q500383) · [GBIF 3190595](https://www.gbif.org/species/3190595)
- [iNaturalist](https://www.inaturalist.org/search?q=Spondias%20dulcis) · [Pl@ntNet](https://identify.plantnet.org/)
## fwiyapen — *Artocarpus altilis*
`fwiyapen` · fruit · Guadeloupe, Martinique, Guyane, La Réunion
### 📷 Photographies
Les cinq vues sont couvertes dans les fonds publics. Reste à les choisir et les valider.
### 🗺️ Où lespèce est déjà observée
| île | observations GBIF | dont avec image |
|---|---|---|
| Guadeloupe | 448 | 42 |
| Martinique | 376 | 36 |
| Guyane | 66 | 47 |
| La Réunion | 85 | 11 |
Peu dobservations sur une île ne veut pas dire que lespèce y est rare : cela veut
souvent dire que personne ne la encore documentée. Cest aussi une contribution.
### 📝 Manques dans les données du projet
- 0 média validé sur 3 — il en faut au moins 2
- aucune vue assignée — personne na encore regardé les images
- aucun enregistrement du nom kréyòl
- aucune source factuelle citée pour les indices
- orthographe kréyòl non relue
- saisonnalité non sourcée et non ventilée par île
### 🔗 Aller voir
- [Commons — tous les fichiers](https://commons.wikimedia.org/w/index.php?search=%22Artocarpus%20altilis%22%20filetype%3Abitmap&ns6=1)
- [Wikidata Q14677](https://www.wikidata.org/wiki/Q14677) · [GBIF 2984573](https://www.gbif.org/species/2984573)
- [iNaturalist](https://www.inaturalist.org/search?q=Artocarpus%20altilis) · [Pl@ntNet](https://identify.plantnet.org/)
## gouyav — *Psidium guajava*
`gouyav` · fruit · Guadeloupe, Martinique, Guyane, La Réunion
### 📷 Photographies
Les cinq vues sont couvertes dans les fonds publics. Reste à les choisir et les valider.
### 🗺️ Où lespèce est déjà observée
| île | observations GBIF | dont avec image |
|---|---|---|
| Guadeloupe | 193 | 51 |
| Martinique | 212 | 35 |
| Guyane | 58 | 38 |
| La Réunion | 476 | 18 |
Peu dobservations sur une île ne veut pas dire que lespèce y est rare : cela veut
souvent dire que personne ne la encore documentée. Cest aussi une contribution.
### 📝 Manques dans les données du projet
- 0 média validé sur 3 — il en faut au moins 2
- aucune vue assignée — personne na encore regardé les images
- aucun enregistrement du nom kréyòl
- aucune source factuelle citée pour les indices
- orthographe kréyòl non relue
- saisonnalité non sourcée et non ventilée par île
### 🔗 Aller voir
- [Commons — tous les fichiers](https://commons.wikimedia.org/w/index.php?search=%22Psidium%20guajava%22%20filetype%3Abitmap&ns6=1)
- [Wikidata Q166843](https://www.wikidata.org/wiki/Q166843) · [GBIF 5420380](https://www.gbif.org/species/5420380)
- [iNaturalist](https://www.inaturalist.org/search?q=Psidium%20guajava) · [Pl@ntNet](https://identify.plantnet.org/)
## kowosòl — *Annona muricata*
`kowosol` · fruit · Guadeloupe, Martinique, Guyane
### 📷 Photographies
Les cinq vues sont couvertes dans les fonds publics. Reste à les choisir et les valider.
### 🗺️ Où lespèce est déjà observée
| île | observations GBIF | dont avec image |
|---|---|---|
| Guadeloupe | 50 | 28 |
| Martinique | 30 | 21 |
| Guyane | 29 | 18 |
Peu dobservations sur une île ne veut pas dire que lespèce y est rare : cela veut
souvent dire que personne ne la encore documentée. Cest aussi une contribution.
### 📝 Manques dans les données du projet
- 0 média validé sur 3 — il en faut au moins 2
- aucune vue assignée — personne na encore regardé les images
- aucun enregistrement du nom kréyòl
- aucune source factuelle citée pour les indices
- orthographe kréyòl non relue
- saisonnalité non sourcée et non ventilée par île
### 🔗 Aller voir
- [Commons — tous les fichiers](https://commons.wikimedia.org/w/index.php?search=%22Annona%20muricata%22%20filetype%3Abitmap&ns6=1)
- [Wikidata Q1709343](https://www.wikidata.org/wiki/Q1709343) · [GBIF 5407273](https://www.gbif.org/species/5407273)
- [iNaturalist](https://www.inaturalist.org/search?q=Annona%20muricata) · [Pl@ntNet](https://identify.plantnet.org/)
## medsinyé — *Jatropha curcas*
`medisinye` · ⚠ plante dangereuse · Guadeloupe, Martinique, Guyane
### 📷 Photographies
Les cinq vues sont couvertes dans les fonds publics. Reste à les choisir et les valider.
### 🗺️ Où lespèce est déjà observée
| île | observations GBIF | dont avec image |
|---|---|---|
| Guadeloupe | 21 | 7 |
| Martinique | 24 | 12 |
| Guyane | 16 | 13 |
Peu dobservations sur une île ne veut pas dire que lespèce y est rare : cela veut
souvent dire que personne ne la encore documentée. Cest aussi une contribution.
### 📝 Manques dans les données du projet
- 0 média validé sur 3 — il en faut au moins 2
- 1 photographie(s) parmi les candidats, 2 planche(s) ancienne(s)
- aucune vue assignée — personne na encore regardé les images
- aucun enregistrement du nom kréyòl
- aucune source factuelle citée pour les indices
- orthographe kréyòl non relue
### 🔗 Aller voir
- [Commons — tous les fichiers](https://commons.wikimedia.org/w/index.php?search=%22Jatropha%20curcas%22%20filetype%3Abitmap&ns6=1)
- [Wikidata Q74644](https://www.wikidata.org/wiki/Q74644) · [GBIF 3072953](https://www.gbif.org/species/3072953)
- [iNaturalist](https://www.inaturalist.org/search?q=Jatropha%20curcas) · [Pl@ntNet](https://identify.plantnet.org/)
## pòm-dlo — *Syzygium samarangense*
`pom-dlo` · fruit · Guadeloupe, Martinique, Guyane, La Réunion
### 📷 Photographies
Les cinq vues sont couvertes dans les fonds publics. Reste à les choisir et les valider.
### 🗺️ Où lespèce est déjà observée
| île | observations GBIF | dont avec image |
|---|---|---|
| Guadeloupe | 9 | 5 |
| Martinique | 5 | 1 |
| Guyane | 5 | 2 |
| La Réunion | 30 | 12 |
Peu dobservations sur une île ne veut pas dire que lespèce y est rare : cela veut
souvent dire que personne ne la encore documentée. Cest aussi une contribution.
### 📝 Manques dans les données du projet
- 0 média validé sur 3 — il en faut au moins 2
- aucune vue assignée — personne na encore regardé les images
- aucun enregistrement du nom kréyòl
- aucune source factuelle citée pour les indices
- orthographe kréyòl non relue
- saisonnalité non sourcée et non ventilée par île
### 🔗 Aller voir
- [Commons — tous les fichiers](https://commons.wikimedia.org/w/index.php?search=%22Syzygium%20samarangense%22%20filetype%3Abitmap&ns6=1)
- [Wikidata Q11643111](https://www.wikidata.org/wiki/Q11643111) · [GBIF 3183180](https://www.gbif.org/species/3183180)
- [iNaturalist](https://www.inaturalist.org/search?q=Syzygium%20samarangense) · [Pl@ntNet](https://identify.plantnet.org/)
## pòm-kannèl — *Annona squamosa*
`pom-kannel` · fruit · Guadeloupe, Martinique
### 📷 Photographies
Les cinq vues sont couvertes dans les fonds publics. Reste à les choisir et les valider.
### 🗺️ Où lespèce est déjà observée
| île | observations GBIF | dont avec image |
|---|---|---|
| Guadeloupe | 66 | 27 |
| Martinique | 52 | 27 |
Peu dobservations sur une île ne veut pas dire que lespèce y est rare : cela veut
souvent dire que personne ne la encore documentée. Cest aussi une contribution.
### 📝 Manques dans les données du projet
- 0 média validé sur 3 — il en faut au moins 2
- aucune vue assignée — personne na encore regardé les images
- aucun enregistrement du nom kréyòl
- aucune source factuelle citée pour les indices
- orthographe kréyòl non relue
- saisonnalité non sourcée et non ventilée par île
### 🔗 Aller voir
- [Commons — tous les fichiers](https://commons.wikimedia.org/w/index.php?search=%22Annona%20squamosa%22%20filetype%3Abitmap&ns6=1)
- [Wikidata Q275620](https://www.wikidata.org/wiki/Q275620) · [GBIF 5407099](https://www.gbif.org/species/5407099)
- [iNaturalist](https://www.inaturalist.org/search?q=Annona%20squamosa) · [Pl@ntNet](https://identify.plantnet.org/)
## zikak — *Chrysobalanus icaco*
`zikak` · fruit · Guadeloupe, Martinique, Guyane
### 📷 Photographies
Les cinq vues sont couvertes dans les fonds publics. Reste à les choisir et les valider.
### 🗺️ Où lespèce est déjà observée
| île | observations GBIF | dont avec image |
|---|---|---|
| Guadeloupe | 124 | 26 |
| Martinique | 101 | 29 |
| Guyane | 231 | 174 |
Peu dobservations sur une île ne veut pas dire que lespèce y est rare : cela veut
souvent dire que personne ne la encore documentée. Cest aussi une contribution.
### 📝 Manques dans les données du projet
- 0 média validé sur 3 — il en faut au moins 2
- aucune vue assignée — personne na encore regardé les images
- aucun enregistrement du nom kréyòl
- aucune source factuelle citée pour les indices
- orthographe kréyòl non relue
- saisonnalité non sourcée et non ventilée par île
### 🔗 Aller voir
- [Commons — tous les fichiers](https://commons.wikimedia.org/w/index.php?search=%22Chrysobalanus%20icaco%22%20filetype%3Abitmap&ns6=1)
- [Wikidata Q577669](https://www.wikidata.org/wiki/Q577669) · [GBIF 2985082](https://www.gbif.org/species/2985082)
- [iNaturalist](https://www.inaturalist.org/search?q=Chrysobalanus%20icaco) · [Pl@ntNet](https://identify.plantnet.org/)
## lorié-jòn — *Cascabela thevetia*
`lorye-jonn` · ⚠ plante dangereuse · Guadeloupe, Martinique, Guyane, La Réunion
### 📷 Photographies
Les cinq vues sont couvertes dans les fonds publics. Reste à les choisir et les valider.
### 🗺️ Où lespèce est déjà observée
| île | observations GBIF | dont avec image |
|---|---|---|
| Guadeloupe | 14 | 10 |
| Martinique | 7 | 4 |
| Guyane | 42 | 38 |
| La Réunion | 133 | 16 |
Peu dobservations sur une île ne veut pas dire que lespèce y est rare : cela veut
souvent dire que personne ne la encore documentée. Cest aussi une contribution.
### 📝 Manques dans les données du projet
- 0 média validé sur 3 — il en faut au moins 2
- aucune vue assignée — personne na encore regardé les images
- aucun enregistrement du nom kréyòl
- aucune source factuelle citée pour les indices
- orthographe kréyòl non relue
### 🔗 Aller voir
- [Commons — tous les fichiers](https://commons.wikimedia.org/w/index.php?search=%22Cascabela%20thevetia%22%20filetype%3Abitmap&ns6=1)
- [Wikidata Q10694475](https://www.wikidata.org/wiki/Q10694475) · [GBIF 3169652](https://www.gbif.org/species/3169652)
- [iNaturalist](https://www.inaturalist.org/search?q=Cascabela%20thevetia) · [Pl@ntNet](https://identify.plantnet.org/)
## pòm-kajou — *Anacardium occidentale*
`pom-kajou` · ⚠ plante dangereuse · Guadeloupe, Martinique, Guyane
### 📷 Photographies
Les cinq vues sont couvertes dans les fonds publics. Reste à les choisir et les valider.
### 🗺️ Où lespèce est déjà observée
| île | observations GBIF | dont avec image |
|---|---|---|
| Guadeloupe | 116 | 28 |
| Martinique | 59 | 23 |
| Guyane | 205 | 146 |
Peu dobservations sur une île ne veut pas dire que lespèce y est rare : cela veut
souvent dire que personne ne la encore documentée. Cest aussi une contribution.
### 📝 Manques dans les données du projet
- 0 média validé sur 3 — il en faut au moins 2
- aucune vue assignée — personne na encore regardé les images
- aucun enregistrement du nom kréyòl
- aucune source factuelle citée pour les indices
- orthographe kréyòl non relue
### 🔗 Aller voir
- [Commons — tous les fichiers](https://commons.wikimedia.org/w/index.php?search=%22Anacardium%20occidentale%22%20filetype%3Abitmap&ns6=1)
- [Wikidata Q34007](https://www.wikidata.org/wiki/Q34007) · [GBIF 5421368](https://www.gbif.org/species/5421368)
- [iNaturalist](https://www.inaturalist.org/search?q=Anacardium%20occidentale) · [Pl@ntNet](https://identify.plantnet.org/)
+18 -4
View File
@@ -10,10 +10,10 @@
## Session 0 — Cadre et données ✅ terminée ## Session 0 — Cadre et données ✅ terminée
**Livré.** Dépôt initialisé, cinq ADR, audit des sept sources, `fruits.schema.json`, **Livré.** Dépôt initialisé, six ADR, audit des sept sources, `fruits.schema.json`,
validateur exécutable et son test, 13 entrées vérifiées contre Wikidata et GBIF, 39 médias validateur exécutable et son test, 13 entrées vérifiées contre Wikidata et GBIF, 39 médias
candidats sourcés sur Commons, `CREDITS.md` généré, licences, lettres-types, points à candidats sourcés sur Commons, `CREDITS.md` généré, licences, lettres-types, points à
arbitrer. arbitrer, inventaire mesuré des manques et guide de contribution.
**Porte de sortie — franchie.** **Porte de sortie — franchie.**
@@ -25,6 +25,7 @@ arbitrer.
| Médias validés | 0 attendu | 0 ✅ | | Médias validés | 0 attendu | 0 ✅ |
| `npm run validate:data` | vert | vert ✅ | | `npm run validate:data` | vert | vert ✅ |
| `npm run test:porte` | 10/10 | 10/10 ✅ | | `npm run test:porte` | 10/10 | 10/10 ✅ |
| Manques mesurés, pas estimés | rapport daté | 3 vues sur 65 ✅ |
| Code applicatif écrit | aucun | aucun ✅ | | Code applicatif écrit | aucun | aucun ✅ |
--- ---
@@ -48,9 +49,11 @@ entrée, avec JSON-LD, hreflang et le traitement `PRD_AI_Overview`.
| Requêtes vers un domaine tiers | **0**, vérifié par grep du build | | Requêtes vers un domaine tiers | **0**, vérifié par grep du build |
| `npm run check` | 0 erreur, 0 warning | | `npm run check` | 0 erreur, 0 warning |
| `svelte-autofixer` sur chaque composant modifié | silencieux | | `svelte-autofixer` sur chaque composant modifié | silencieux |
| Chaque fiche affiche ce qui lui manque | vrai pour les 13 (ADR 0006) |
**Dépendance humaine :** aucune. La session 1 fonctionne avec 0 média validé — les fiches **Dépendance humaine :** aucune. La session 1 fonctionne avec 0 média validé — les fiches
affichent le texte, la taxonomie et les crédits, pas encore les photos. affichent le texte, la taxonomie, les crédits et **les manques**, pas encore les photos.
Une fiche incomplète ne se masque pas : elle dit ce qui lui manque et comment le combler.
--- ---
@@ -73,6 +76,8 @@ score en count-up (rAF → écriture DOM directe, span `aria-hidden` + valeur fi
| Progression conservée après rechargement | vérifiée | | Progression conservée après rechargement | vérifiée |
| Cibles tactiles | ≥ 44 px, testées par `elementFromPoint` en 390 px | | Cibles tactiles | ≥ 44 px, testées par `elementFromPoint` en 390 px |
| JS initial | toujours ≤ 170 Ko gzip | | JS initial | toujours ≤ 170 Ko gzip |
| Écran « Ba on koudmen » | présent, alimenté par le rapport baké au build |
| Appels réseau depuis l'écran de contribution | **0** — des liens, pas des requêtes |
**Si le jeu n'est pas plaisant ici, ne pas passer à la session 3.** Ajouter un moteur de jeu **Si le jeu n'est pas plaisant ici, ne pas passer à la session 3.** Ajouter un moteur de jeu
à un problème de game design ajoute du poids au problème. Le mode Sézon reste non publiable à un problème de game design ajoute du poids au problème. Le mode Sézon reste non publiable
@@ -178,6 +183,8 @@ Performance, accessibilité, DoD §8 du playbook, `.htaccess` et `_headers`, dé
| Lighthouse mobile, accueil et fiche | ≥ 90 / 95 / 95 / 95 | | Lighthouse mobile, accueil et fiche | ≥ 90 / 95 / 95 / 95 |
| Navigation clavier sur les cinq modes | complète | | Navigation clavier sur les cinq modes | complète |
| Écran de crédits dans le jeu | présent, généré depuis les données | | Écran de crédits dans le jeu | présent, généré depuis les données |
| `docs/contribuer.md` publié comme page du site | fait |
| Rapport de manques à jour à la date du build | fait |
--- ---
@@ -186,12 +193,19 @@ Performance, accessibilité, DoD §8 du playbook, `.htaccess` et `_headers`, dé
Ces cinq points conditionnent la livraison et ne figurent dans aucune session parce Ces cinq points conditionnent la livraison et ne figurent dans aucune session parce
qu'aucune session ne peut les produire : qu'aucune session ne peut les produire :
1. **Aller voir TRAMIL à Schœlcher.** Lettre prête : `docs/courriers/tramil.md`. 1. **Aller voir TRAMIL à Schœlcher.** Lettre prête : `docs/courriers/tramil.md`. Si la voie
privée n'aboutit pas sous deux à trois mois, l'appel public est rédigé :
`docs/courriers/appel-liberation-tramil.md` — à cosigner, la décision de publier
appartient au porteur.
2. **Enregistrer les voix kréyòl.** Liste prête : `docs/audio-a-enregistrer.md`. 2. **Enregistrer les voix kréyòl.** Liste prête : `docs/audio-a-enregistrer.md`.
3. **Photographier ce qui manque sur Commons** — il manquera, surtout les vues d'écorce, de 3. **Photographier ce qui manque sur Commons** — il manquera, surtout les vues d'écorce, de
feuille isolée et de coupe, celles dont le mode Kaché a besoin. feuille isolée et de coupe, celles dont le mode Kaché a besoin.
4. **Faire relire l'orthographe kréyòl** par un humain. Points relevés : 4. **Faire relire l'orthographe kréyòl** par un humain. Points relevés :
`docs/kreyol-a-relire.md`. `docs/kreyol-a-relire.md`.
5. **Le test en classe.** 5. **Le test en classe.**
6. **Inscrire les noms kréyòl sur Wikidata** — 0 sur 13 aujourd'hui, contre 124 noms
vernaculaires enregistrés dans d'autres langues pour les mêmes espèces. Ne demande ni
appareil photo ni déplacement, mais demande une orthographe relue : à faire après le
point 4, jamais avant. `docs/contribuer.md` §A.
Le code est la partie facile. Le code est la partie facile.
+44
View File
@@ -25,6 +25,7 @@ playbook §0. Branche `main`.
| `npm run test:porte` | prouve que la porte refuse les 9 cas interdits | | `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 build:credits` | régénère `CREDITS.md` depuis les données |
| `npm run check:audio` | liste les enregistrements kréyòl manquants | | `npm run check:audio` | liste les enregistrements kréyòl manquants |
| `npm run rapport:manques` | mesure les manques, dans le projet et dans les fonds publics |
**Données.** 13 entrées dans `src/lib/data/fruits/`, 39 médias candidats, 0 validé. **Données.** 13 entrées dans `src/lib/data/fruits/`, 39 médias candidats, 0 validé.
@@ -93,6 +94,48 @@ iNaturalist à un appoint marginal — ce qui donne son poids réel à la décis
--- ---
## Ajout en cours de session — la dimension participative
Décision du porteur : les manques ne se masquent pas, ils se publient. ADR 0006, guide
[`contribuer.md`](../contribuer.md), inventaire mesuré [`manques.md`](../manques.md), et
appel public à la libération des données TRAMIL en brouillon.
### Ce que la mesure a révélé
**Le kréyòl est absent des communs numériques.** Wikidata enregistre **124 noms
vernaculaires** pour les 13 espèces — 33 pour le fruit à pain, 22 pour la pomme d'eau, 12
pour la goyave, en chinois, anglais, portugais, slovène. **Zéro en kréyòl**, et aucune
étiquette de langue `gcf` sur aucun des 13 items. C'est la contribution la moins coûteuse du
projet — cinq minutes par entrée, aucun matériel — et l'une des plus durables. Elle suppose
en revanche une orthographe relue : à faire après la relecture kréyòl, jamais avant.
**L'écorce est la vue qui manque.** Après correction de la mesure, il reste 3 trous sur 65
dans les fonds libres, et les trois sont des écorces : mansiniyé (0 fichier), aki (0),
kénèt (1). Trois autres sont tout juste au seuil. C'est cohérent avec la pratique — on
photographie un fruit, rarement un tronc — et c'est fâcheux, parce que l'écorce est l'indice
le plus fiable sur le terrain : un tronc est visible toute l'année, un fruit quelques mois.
**Pl@ntNet est un meilleur canal de contribution que iNaturalist.** Mesuré sur le zikak en
Guadeloupe : les images iNaturalist sont à ~93 % en CC BY-NC, celles de Pl@ntNet apparaissent
en CC BY-SA (jeu de données GBIF sous CC BY 4.0). À effort égal pour le contributeur, la
seconde voie produit des images pleinement réutilisables. D'où le conseil mis en avant dans
le guide : régler sa licence par défaut sur iNaturalist une fois pour toutes.
### Une mesure fausse, attrapée avant publication
Le premier rapport annonçait **28 vues manquantes sur 65**. C'était faux. Le groupement `OR`
de la recherche Commons ne se comporte pas comme attendu : sur *Annona muricata*, `section`
seul remonte 17 fichiers là où `(section OR sliced OR cut OR coupe)` en remonte 0. Le signal
d'alerte était que `coupe` ressortait à zéro pour les **treize** espèces — Commons contient
évidemment des photos de corossol coupé.
Après correction — un mot, une requête, avec gestion du débit des API —, le chiffre réel est
**3 sur 65**.
Publier les 28 aurait envoyé des bénévoles photographier ce qui existait déjà. La leçon est
consignée dans l'ADR 0006 : une mesure qui produit un résultat extrême se suspecte avant de
se publier, et une réponse d'API illisible ne se compte jamais comme un zéro.
## Écarts constatés et signalés, non corrigés en silence ## É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. Le brief §9 impose de signaler les écarts plutôt que de les corriger discrètement.
@@ -162,6 +205,7 @@ npm run validate:data → 13 entrées, 39 médias, 0 validé, 0 erreur
npm run test:porte → 10/10 npm run test:porte → 10/10
npm run build:credits → 13 entrées, 39 médias, 0 sous clause NC npm run build:credits → 13 entrées, 39 médias, 0 sous clause NC
npm run check:audio → 13 enregistrements à réaliser npm run check:audio → 13 enregistrements à réaliser
npm run rapport:manques → 3 vues manquantes sur 65, 0 nom kréyòl sur Wikidata
``` ```
Dépendances installées : `ajv` et `ajv-formats` uniquement, toutes deux importées et Dépendances installées : `ajv` et `ajv-formats` uniquement, toutes deux importées et
+2 -1
View File
@@ -15,7 +15,8 @@
"check:audio": "node tools/data/check-audio.mjs", "check:audio": "node tools/data/check-audio.mjs",
"validate:data": "node tools/data/validate.mjs", "validate:data": "node tools/data/validate.mjs",
"build:credits": "node tools/data/build-credits.mjs", "build:credits": "node tools/data/build-credits.mjs",
"test:porte": "node tools/data/test-porte.mjs" "test:porte": "node tools/data/test-porte.mjs",
"rapport:manques": "node tools/data/rapport-manques.mjs"
}, },
"devDependencies": { "devDependencies": {
"ajv": "^8.17.1", "ajv": "^8.17.1",
+349
View File
@@ -0,0 +1,349 @@
#!/usr/bin/env node
/**
* rapport-manques.mjs — mesure ce qui manque, et où le trouver.
*
* Le projet est participatif : un manque n'est pas un défaut à masquer, c'est une tâche à
* publier. Ce script produit l'inventaire des trous — dans les données du projet ET dans
* les fonds publics — pour que chacun puisse en combler un.
*
* Deux mesures distinctes :
*
* 1. MANQUES INTERNES — ce que le dataset n'a pas : photos validées, vues assignées,
* enregistrement kréyòl, sources factuelles, relecture, saisonnalité sourcée.
*
* 2. DISPONIBILITÉ EXTERNE — ce que les fonds publics contiennent pour chaque vue
* pédagogique. Un trou ici veut dire : « personne au monde n'a publié cette photo
* sous licence libre », donc c'est une photo à aller prendre.
*
* LIMITE À CONNAÎTRE : la recherche Commons porte sur le TEXTE des pages de fichier, pas
* sur le contenu des images. Une photo de feuille dont la description ne dit pas « leaf »
* est comptée comme absente. Ce n'est pas un défaut de la mesure : une photo que personne
* ne peut trouver est presque aussi inutile qu'une photo qui n'existe pas — et la
* redécrire sur Commons est justement une contribution utile.
*
* Sortie : docs/manques.md
*/
import { readFile, readdir, writeFile } from 'node:fs/promises';
import { fileURLToPath } from 'node:url';
import { dirname, join } from 'node:path';
const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..', '..');
const DATA = join(ROOT, 'src', 'lib', 'data', 'fruits');
const UA = 'ki-fwi-dataset/0.1 (https://o-k-i.net ; projet educatif ORGANISATION KA INTERNATIONALE)';
/**
* Les vues pédagogiques, avec les mots par lesquels on les cherche dans plusieurs langues.
*
* Chaque mot est interrogé SÉPARÉMENT. Une première version groupait les mots par `OR` —
* la syntaxe est acceptée par l'API mais ne se comporte pas comme attendu : sur
* Annona muricata, `section` seul remonte 17 fichiers alors que
* `(section OR sliced OR cut OR coupe)` en remonte 0. Le rapport affichait donc des
* manques inexistants. Un mot, une requête.
*/
const VUES = {
fruit_entier: ['fruit', 'fruits', 'fruta', 'frutas'],
coupe: ['section', 'sliced', 'pulp', 'cut'],
feuille: ['leaf', 'leaves', 'feuille', 'hoja'],
ecorce: ['bark', 'trunk', 'ecorce', 'corteza'],
port: ['tree', 'arbre', 'arbol', 'habit']
};
/** Seuil en dessous duquel une vue est déclarée manquante dans les fonds publics. */
const SEUIL_VUE = 3;
const ILES = { gp: 'GP', mq: 'MQ', gf: 'GF', re: 'RE' };
const NOM_ILE = { gp: 'Guadeloupe', mq: 'Martinique', gf: 'Guyane', re: 'La Réunion' };
const pause = (ms) => new Promise((r) => setTimeout(r, ms));
/**
* Les API Wikimedia limitent le débit et répondent alors autre chose que du JSON.
* Une réponse illisible comptée comme « 0 fichier » fabriquerait un manque imaginaire :
* on réessaie, et on échoue franchement plutôt que de renvoyer un chiffre faux.
*/
async function getJson(url, params, essais = 4) {
const u = new URL(url);
for (const [k, v] of Object.entries(params)) u.searchParams.set(k, v);
let derniere;
for (let i = 0; i < essais; i++) {
try {
const res = await fetch(u, { headers: { 'User-Agent': UA, Accept: 'application/json' } });
if (!res.ok) throw new Error(`${res.status} ${res.statusText}`);
return await res.json();
} catch (e) {
derniere = e;
await pause(600 * (i + 1));
}
}
throw new Error(`${u.host} injoignable après ${essais} essais : ${derniere?.message}`);
}
async function commonsCompte(recherche) {
const json = await getJson('https://commons.wikimedia.org/w/api.php', {
action: 'query',
format: 'json',
list: 'search',
srnamespace: '6',
srlimit: '1',
srinfo: 'totalhits',
srsearch: recherche
});
return json.query?.searchinfo?.totalhits ?? 0;
}
/**
* Nombre de fichiers trouvables pour une vue : le maximum obtenu sur les mots de la vue.
* Le maximum et non la somme — un même fichier peut répondre à plusieurs mots, et une
* somme surestimerait la couverture, donc sous-estimerait le manque.
*/
async function commonsPourVue(nomSci, mots) {
let meilleur = 0;
let motRetenu = null;
for (const mot of mots) {
const n = await commonsCompte(`"${nomSci}" ${mot} filetype:bitmap`);
if (n > meilleur) {
meilleur = n;
motRetenu = mot;
}
await pause(350);
}
return { n: meilleur, mot: motRetenu };
}
const commonsTotal = (nomSci) => commonsCompte(`"${nomSci}" filetype:bitmap`);
/**
* Le kréyòl est-il présent dans les communs numériques, ou seulement dans ce dépôt ?
*
* Deux endroits où un nom kréyòl a sa place sur Wikidata :
* — l'étiquette de langue `gcf` (kréyòl gwadloupéyen) ;
* — la propriété P1843, « nom vernaculaire du taxon », avec sa langue.
*
* Un nom qui n'existe que dans ce jeu reste un nom perdu ailleurs. C'est la contribution
* la moins coûteuse du projet, et l'une des plus durables.
*/
async function wikidataKreyol(qids) {
const labels = await getJson('https://www.wikidata.org/w/api.php', {
action: 'wbgetentities',
ids: qids.join('|'),
props: 'labels',
languages: 'gcf',
format: 'json'
});
const etat = {};
for (const q of qids) {
etat[q] = { etiquette: labels.entities?.[q]?.labels?.gcf?.value ?? null, vernaculaires: null, gcfVern: false };
await pause(250);
try {
const cl = await getJson('https://www.wikidata.org/w/api.php', {
action: 'wbgetclaims',
entity: q,
property: 'P1843',
format: 'json'
});
const noms = cl.claims?.P1843 ?? [];
etat[q].vernaculaires = noms.length;
etat[q].gcfVern = noms.some((c) => c.mainsnak?.datavalue?.value?.language === 'gcf');
} catch {
/* le compte reste null : mieux vaut un trou qu'un chiffre inventé */
}
}
return etat;
}
/** Observations GBIF pour ce taxon dans cette île, et combien portent une image. */
async function gbifIle(taxonKey, pays) {
const [tout, avecImage] = await Promise.all([
getJson('https://api.gbif.org/v1/occurrence/search', { taxonKey: String(taxonKey), country: pays, limit: '0' }),
getJson('https://api.gbif.org/v1/occurrence/search', {
taxonKey: String(taxonKey),
country: pays,
mediaType: 'StillImage',
limit: '0'
})
]);
return { total: tout.count ?? 0, avecImage: avecImage.count ?? 0 };
}
async function main() {
const fichiers = (await readdir(DATA)).filter((f) => f.endsWith('.json')).sort();
const rapports = [];
for (const f of fichiers) {
const e = JSON.parse(await readFile(join(DATA, f), 'utf8'));
process.stdout.write(`${e.id}`);
// ── 1. Manques internes
const photos = e.medias.filter((m) => m.type_media === 'photo');
const planches = e.medias.filter((m) => m.type_media === 'planche_botanique');
const validees = e.medias.filter((m) => m.valide);
const vuesAssignees = new Set(e.medias.map((m) => m.vue).filter(Boolean));
const internes = [];
if (validees.length < 2) internes.push(`${validees.length} média validé sur ${e.medias.length} — il en faut au moins 2`);
if (photos.length < 2) internes.push(`${photos.length} photographie(s) parmi les candidats, ${planches.length} planche(s) ancienne(s)`);
if (!vuesAssignees.size) internes.push('aucune vue assignée — personne na encore regardé les images');
if (!e.audio.gcf) internes.push('aucun enregistrement du nom kréyòl');
if (!e.sources_factuelles.length) internes.push('aucune source factuelle citée pour les indices');
if (e.orthographe.statut !== 'relu') internes.push('orthographe kréyòl non relue');
if (e.categorie === 'fruit' && e.saison_mois?.length) internes.push('saisonnalité non sourcée et non ventilée par île');
// ── 2. Disponibilité externe
const total = await commonsTotal(e.taxon.scientifique);
await pause(350);
const vues = {};
for (const [vue, mots] of Object.entries(VUES)) {
vues[vue] = await commonsPourVue(e.taxon.scientifique, mots);
}
const iles = {};
for (const code of e.iles) {
if (!ILES[code]) continue;
iles[code] = await gbifIle(e.taxon.gbif, ILES[code]);
await pause(200);
}
const vuesManquantes = Object.entries(vues)
.filter(([, v]) => v.n < SEUIL_VUE)
.map(([v]) => v);
console.log(`${total} fichiers Commons · ${vuesManquantes.length} vue(s) sous le seuil`);
rapports.push({ e, internes, total, vues, vuesManquantes, iles, photos: photos.length, planches: planches.length });
}
process.stdout.write('→ Wikidata : présence du kréyòl… ');
const kreyol = await wikidataKreyol(rapports.map((r) => r.e.taxon.wikidata));
const avecEtiquette = Object.values(kreyol).filter((k) => k.etiquette).length;
const avecVernaculaire = Object.values(kreyol).filter((k) => k.gcfVern).length;
console.log(`${avecEtiquette} étiquette(s), ${avecVernaculaire} nom(s) vernaculaire(s)`);
// ── Écriture du rapport, du plus démuni au mieux servi
rapports.sort((a, b) => b.vuesManquantes.length - a.vuesManquantes.length || b.internes.length - a.internes.length);
const l = [
'# Ce qui manque — et comment le combler',
'',
`> Généré par \`npm run rapport:manques\` le ${new Date().toISOString().slice(0, 10)}.`,
'> Sortie de script : ne pas éditer à la main.',
'',
'Ce projet est participatif. Un manque nest pas un défaut à masquer : cest une tâche',
'publiée. Chaque ligne ci-dessous est quelque chose quune personne peut aller combler,',
'et dont le bénéfice dépasse ce jeu — une photo versée à Wikimedia Commons sert à tous.',
'',
'**Comment contribuer :** [`docs/contribuer.md`](contribuer.md).',
'',
'## Comment lire ce rapport',
'',
`Une vue est déclarée **manquante** quand les fonds publics contiennent moins de ${SEUIL_VUE} fichiers`,
'trouvables pour elle. La mesure porte sur le **texte** des pages de fichier Commons, pas sur',
'le contenu des images : une photo de feuille dont la description ne dit pas « leaf » est',
'comptée absente. Cest volontaire — une photo que personne ne peut trouver est presque',
'aussi inutile quune photo qui nexiste pas, et **la redécrire est déjà une contribution**.',
'',
'---',
'',
'## Vue densemble',
'',
'| entrée | fichiers Commons | fruit | coupe | feuille | écorce | port | médias validés |',
'|---|---|---|---|---|---|---|---|'
];
const mark = (n) => (n < SEUIL_VUE ? `**${n}** ⚠` : String(n));
for (const r of rapports) {
l.push(
`| \`${r.e.id}\` | ${r.total} | ${mark(r.vues.fruit_entier.n)} | ${mark(r.vues.coupe.n)} | ${mark(r.vues.feuille.n)} | ${mark(r.vues.ecorce.n)} | ${mark(r.vues.port.n)} | ${r.e.medias.filter((m) => m.valide).length}/${r.e.medias.length} |`
);
}
const totalVuesManquantes = rapports.reduce((n, r) => n + r.vuesManquantes.length, 0);
l.push(
'',
`**${totalVuesManquantes} vues manquantes sur ${rapports.length * Object.keys(VUES).length}** dans les fonds publics libres.`,
'',
'---',
'',
'## Le kréyòl dans les communs numériques',
'',
'Un nom qui nexiste que dans ce jeu reste un nom perdu partout ailleurs. Wikidata offre',
'deux emplacements pour linscrire durablement : l**étiquette** de langue `gcf`, et la',
'propriété **P1843**, « nom vernaculaire du taxon ».',
'',
`**${avecEtiquette} étiquette(s) kréyòl sur ${rapports.length}** · **${avecVernaculaire} nom(s) vernaculaire(s) kréyòl sur ${rapports.length}**.`,
'',
'| entrée | nom kréyòl | étiquette `gcf` | noms vernaculaires enregistrés | dont kréyòl |',
'|---|---|---|---|---|'
);
for (const r of rapports) {
const k = kreyol[r.e.taxon.wikidata] ?? {};
l.push(
`| [\`${r.e.id}\`](https://www.wikidata.org/wiki/${r.e.taxon.wikidata}) | ${r.e.noms.gcf} | ${k.etiquette ? '✔ ' + k.etiquette : '**absente** ⚠'} | ${k.vernaculaires ?? '?'} | ${k.gcfVern ? '✔' : '**non** ⚠'} |`
);
}
l.push(
'',
'Cest la contribution la moins coûteuse du projet et lune des plus durables : quelques',
'minutes par entrée, un bénéfice qui dépasse largement ce jeu. Marche à suivre dans',
'[`contribuer.md`](contribuer.md).',
'',
'---',
''
);
for (const r of rapports) {
const e = r.e;
l.push(`## ${e.noms.gcf} — *${e.taxon.scientifique}*`, '');
l.push(
`\`${e.id}\` · ${e.categorie === 'fruit' ? 'fruit' : '⚠ plante dangereuse'} · ${e.iles.map((i) => NOM_ILE[i] ?? i).join(', ')}`,
''
);
if (r.vuesManquantes.length) {
l.push(`### 📷 Photographies à prendre (${r.vuesManquantes.length} vue(s))`, '');
for (const v of r.vuesManquantes) {
const indice = e.indices[v === 'fruit_entier' ? 'fruit' : v];
l.push(`- **${v}** — ${r.vues[v].n} fichier(s) trouvable(s) sur Commons.`);
if (indice) l.push(` Ce quil faut montrer : ${indice}`);
}
l.push('');
} else {
l.push('### 📷 Photographies', '', 'Les cinq vues sont couvertes dans les fonds publics. Reste à les choisir et les valider.', '');
}
if (Object.keys(r.iles).length) {
l.push('### 🗺️ Où lespèce est déjà observée', '');
l.push('| île | observations GBIF | dont avec image |', '|---|---|---|');
for (const [code, v] of Object.entries(r.iles))
l.push(`| ${NOM_ILE[code] ?? code} | ${v.total} | ${v.avecImage} |`);
l.push(
'',
'Peu dobservations sur une île ne veut pas dire que lespèce y est rare : cela veut',
'souvent dire que personne ne la encore documentée. Cest aussi une contribution.',
''
);
}
if (r.internes.length) {
l.push('### 📝 Manques dans les données du projet', '');
for (const m of r.internes) l.push(`- ${m}`);
l.push('');
}
l.push(
'### 🔗 Aller voir',
'',
`- [Commons — tous les fichiers](https://commons.wikimedia.org/w/index.php?search=${encodeURIComponent(`"${e.taxon.scientifique}" filetype:bitmap`)}&ns6=1)`,
`- [Wikidata ${e.taxon.wikidata}](https://www.wikidata.org/wiki/${e.taxon.wikidata}) · [GBIF ${e.taxon.gbif}](https://www.gbif.org/species/${e.taxon.gbif})`,
`- [iNaturalist](https://www.inaturalist.org/search?q=${encodeURIComponent(e.taxon.scientifique)}) · [Pl@ntNet](https://identify.plantnet.org/)`,
''
);
}
await writeFile(join(ROOT, 'docs', 'manques.md'), l.join('\n'));
console.log(`\n✔ docs/manques.md — ${totalVuesManquantes} vues manquantes sur ${rapports.length * Object.keys(VUES).length}.`);
}
main().catch((e) => {
console.error('✘', e.stack ?? e.message);
process.exit(1);
});