From 9e3c1764116eace014d648b9e093939506cfd918 Mon Sep 17 00:00:00 2001 From: OKI Date: Mon, 27 Jul 2026 10:12:35 -0400 Subject: [PATCH] feat(participatif): publier les manques et outiller la contribution MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- README.md | 21 +- docs/adr/0006-projet-participatif.md | 96 ++++ docs/contribuer.md | 280 ++++++++++++ docs/courriers/appel-liberation-tramil.md | 117 +++++ docs/manques.md | 514 ++++++++++++++++++++++ docs/plan.md | 22 +- docs/sessions/00-cadre-et-donnees.md | 44 ++ package.json | 3 +- tools/data/rapport-manques.mjs | 349 +++++++++++++++ 9 files changed, 1440 insertions(+), 6 deletions(-) create mode 100644 docs/adr/0006-projet-participatif.md create mode 100644 docs/contribuer.md create mode 100644 docs/courriers/appel-liberation-tramil.md create mode 100644 docs/manques.md create mode 100644 tools/data/rapport-manques.mjs diff --git a/README.md b/README.md index 0c97301..385e952 100644 --- a/README.md +++ b/README.md @@ -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 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 ```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 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 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 @@ -45,8 +62,10 @@ runtime du jeu** : tout est cuit au build. | 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/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/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 | diff --git a/docs/adr/0006-projet-participatif.md b/docs/adr/0006-projet-participatif.md new file mode 100644 index 0000000..053dc64 --- /dev/null +++ b/docs/adr/0006-projet-participatif.md @@ -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 `` 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 ». diff --git a/docs/contribuer.md b/docs/contribuer.md new file mode 100644 index 0000000..71398cb --- /dev/null +++ b/docs/contribuer.md @@ -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:`, 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. diff --git a/docs/courriers/appel-liberation-tramil.md b/docs/courriers/appel-liberation-tramil.md new file mode 100644 index 0000000..793fed3 --- /dev/null +++ b/docs/courriers/appel-liberation-tramil.md @@ -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.* diff --git a/docs/manques.md b/docs/manques.md new file mode 100644 index 0000000..dd2cee4 --- /dev/null +++ b/docs/manques.md @@ -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 n’est pas un défaut à masquer : c’est une tâche +publiée. Chaque ligne ci-dessous est quelque chose qu’une 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. C’est volontaire — une photo que personne ne peut trouver est presque +aussi inutile qu’une photo qui n’existe pas, et **la redécrire est déjà une contribution**. + +--- + +## Vue d’ensemble + +| 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 n’existe que dans ce jeu reste un nom perdu partout ailleurs. Wikidata offre +deux emplacements pour l’inscrire 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** ⚠ | + +C’est la contribution la moins coûteuse du projet et l’une 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 qu’il faut montrer : lisse, grise + +### 🗺️ Où l’espèce est déjà observée + +| île | observations GBIF | dont avec image | +|---|---|---| +| Guadeloupe | 112 | 35 | +| Martinique | 52 | 39 | + +Peu d’observations sur une île ne veut pas dire que l’espèce y est rare : cela veut +souvent dire que personne ne l’a encore documentée. C’est 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 n’a 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ù l’espèce est déjà observée + +| île | observations GBIF | dont avec image | +|---|---|---| +| Guadeloupe | 146 | 65 | +| Martinique | 151 | 86 | + +Peu d’observations sur une île ne veut pas dire que l’espèce y est rare : cela veut +souvent dire que personne ne l’a encore documentée. C’est 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 n’a 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ù l’espèce est déjà observée + +| île | observations GBIF | dont avec image | +|---|---|---| +| Guadeloupe | 4 | 1 | +| Martinique | 27 | 6 | +| Guyane | 7 | 2 | + +Peu d’observations sur une île ne veut pas dire que l’espèce y est rare : cela veut +souvent dire que personne ne l’a encore documentée. C’est 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 n’a 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ù l’espèce est déjà observée + +| île | observations GBIF | dont avec image | +|---|---|---| +| Guadeloupe | 18 | 11 | +| Martinique | 9 | 5 | +| Guyane | 12 | 7 | + +Peu d’observations sur une île ne veut pas dire que l’espèce y est rare : cela veut +souvent dire que personne ne l’a encore documentée. C’est 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 n’a 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ù l’espè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 d’observations sur une île ne veut pas dire que l’espèce y est rare : cela veut +souvent dire que personne ne l’a encore documentée. C’est 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 n’a 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ù l’espè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 d’observations sur une île ne veut pas dire que l’espèce y est rare : cela veut +souvent dire que personne ne l’a encore documentée. C’est 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 n’a 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ù l’espèce est déjà observée + +| île | observations GBIF | dont avec image | +|---|---|---| +| Guadeloupe | 50 | 28 | +| Martinique | 30 | 21 | +| Guyane | 29 | 18 | + +Peu d’observations sur une île ne veut pas dire que l’espèce y est rare : cela veut +souvent dire que personne ne l’a encore documentée. C’est 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 n’a 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ù l’espèce est déjà observée + +| île | observations GBIF | dont avec image | +|---|---|---| +| Guadeloupe | 21 | 7 | +| Martinique | 24 | 12 | +| Guyane | 16 | 13 | + +Peu d’observations sur une île ne veut pas dire que l’espèce y est rare : cela veut +souvent dire que personne ne l’a encore documentée. C’est 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 n’a 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ù l’espè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 d’observations sur une île ne veut pas dire que l’espèce y est rare : cela veut +souvent dire que personne ne l’a encore documentée. C’est 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 n’a 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ù l’espèce est déjà observée + +| île | observations GBIF | dont avec image | +|---|---|---| +| Guadeloupe | 66 | 27 | +| Martinique | 52 | 27 | + +Peu d’observations sur une île ne veut pas dire que l’espèce y est rare : cela veut +souvent dire que personne ne l’a encore documentée. C’est 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 n’a 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ù l’espèce est déjà observée + +| île | observations GBIF | dont avec image | +|---|---|---| +| Guadeloupe | 124 | 26 | +| Martinique | 101 | 29 | +| Guyane | 231 | 174 | + +Peu d’observations sur une île ne veut pas dire que l’espèce y est rare : cela veut +souvent dire que personne ne l’a encore documentée. C’est 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 n’a 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ù l’espè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 d’observations sur une île ne veut pas dire que l’espèce y est rare : cela veut +souvent dire que personne ne l’a encore documentée. C’est 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 n’a 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ù l’espèce est déjà observée + +| île | observations GBIF | dont avec image | +|---|---|---| +| Guadeloupe | 116 | 28 | +| Martinique | 59 | 23 | +| Guyane | 205 | 146 | + +Peu d’observations sur une île ne veut pas dire que l’espèce y est rare : cela veut +souvent dire que personne ne l’a encore documentée. C’est 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 n’a 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/) diff --git a/docs/plan.md b/docs/plan.md index 1019ce6..2dc7545 100644 --- a/docs/plan.md +++ b/docs/plan.md @@ -10,10 +10,10 @@ ## 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 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.** @@ -25,6 +25,7 @@ arbitrer. | Médias validés | 0 attendu | 0 ✅ | | `npm run validate:data` | vert | vert ✅ | | `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 ✅ | --- @@ -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 | | `npm run check` | 0 erreur, 0 warning | | `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 -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 | | Cibles tactiles | ≥ 44 px, testées par `elementFromPoint` en 390 px | | 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 à 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 | | Navigation clavier sur les cinq modes | complète | | É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 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`. 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. 4. **Faire relire l'orthographe kréyòl** par un humain. Points relevés : `docs/kreyol-a-relire.md`. 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. diff --git a/docs/sessions/00-cadre-et-donnees.md b/docs/sessions/00-cadre-et-donnees.md index 65c1bd0..9cf7084 100644 --- a/docs/sessions/00-cadre-et-donnees.md +++ b/docs/sessions/00-cadre-et-donnees.md @@ -25,6 +25,7 @@ playbook §0. Branche `main`. | `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 | +| `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é. @@ -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 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 build:credits → 13 entrées, 39 médias, 0 sous clause NC 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 diff --git a/package.json b/package.json index 1f2f2a7..8c63cae 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,8 @@ "check:audio": "node tools/data/check-audio.mjs", "validate:data": "node tools/data/validate.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": { "ajv": "^8.17.1", diff --git a/tools/data/rapport-manques.mjs b/tools/data/rapport-manques.mjs new file mode 100644 index 0000000..bd4c2d4 --- /dev/null +++ b/tools/data/rapport-manques.mjs @@ -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 n’a 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 n’est pas un défaut à masquer : c’est une tâche', + 'publiée. Chaque ligne ci-dessous est quelque chose qu’une 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. C’est volontaire — une photo que personne ne peut trouver est presque', + 'aussi inutile qu’une photo qui n’existe pas, et **la redécrire est déjà une contribution**.', + '', + '---', + '', + '## Vue d’ensemble', + '', + '| 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 n’existe que dans ce jeu reste un nom perdu partout ailleurs. Wikidata offre', + 'deux emplacements pour l’inscrire 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( + '', + 'C’est la contribution la moins coûteuse du projet et l’une 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 qu’il 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ù l’espè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 d’observations sur une île ne veut pas dire que l’espèce y est rare : cela veut', + 'souvent dire que personne ne l’a encore documentée. C’est 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); +});