# Historique des versions — Atlas Agroalimentaire

Numérotation SemVer (MAJEUR.MINEUR.CORRECTIF) à partir de la 20.0.0. Les versions 3.x à 19.0 sont décrites dans `web/CHANGELOG-v9.md` et dans `data/manifest.json` (champ `audit`).

## 22.1.0 — 2026-10-02 — 100 % des fiches contrôlées, interface téléphone identique au PC

- Les 18 694 fiches ont été relues par le contrôle automatique : plus aucune anomalie bloquante (textes d'un homonyme, images
  sans rapport, régime alimentaire faux, unités impériales, caractères cassés). Les informations manquantes sont signalées, jamais inventées.
- Images vérifiées une à une sur Wikimedia Commons : 1 175 images ou vignettes hors sujet retirées, auteur et licence affichés partout.
- Recettes TheMealDB / TheCocktailDB en français, mesures en unités métriques.
- Allergènes et régimes : « lait » retiré des charcuteries qui portaient les textes-types des fromages, 351 allergènes déduits d'un simple
  accompagnement ou d'un arôme retirés, 98 régimes « végétarien » erronés corrigés (saucisson, chorizo, pancetta…).
- Impression d'une fiche : en-tête (adresse, date, version) et pied de page (sources, licences), sans le relevé brut des données.
- Intègre la 22.0.3 (421 résumés encyclopédiques, 369 références).
- Sur téléphone et tablette (iOS, Android) : même navigation que sur ordinateur (Accueil · Explorer · Ressources), mêmes menus,
  mêmes actions de fiche ; affichage adapté à l'encoche et aux barres système.

## 22.0.3 — 2026-10-02

- 421 fiches enrichies d'un résumé encyclopédique (article Wikipédia du même nom et du même élément Wikidata), 369 références ajoutées.
- Impression d'une fiche : la fiche seule, sur autant de pages que nécessaire, sections repliées dépliées.

## 22.0.2 — 2026-10-01

- Administration : seuls les échecs de connexion sont comptés.

## 22.0.1 — 2026-10-01 — mise en ligne

- Site, données et service de contributions en ligne sur https://atlas-agrofood.netlify.app ; administration sécurisée active.
- Applications Windows (64 et 32 bits) et Android 22.0.0 téléchargeables depuis la page « Applications » ; mises à jour automatiques
  de l'application Windows actives (flux `latest.yml` publié).

## 22.0.0 — 2026-10-01 — remise en état, administration, contributions centralisées, finalisation Windows x64

### Causes réelles des pannes signalées
- **« Service de contribution non joignable » et erreur `Cannot find channel "latest.yml"` (HTTP 404)** : le 30/09/2026, l'adresse
  `https://atlas-agrofood.netlify.app` servait **un autre site (FISARMEMENT)**. `/api/*`, `/data/*` et `/downloads/*` répondaient donc 404
  (page HTML), et les appels de l'application de bureau (origine `atlas://app`) étaient en plus bloqués par CORS. Par ailleurs les installateurs
  n'avaient jamais été publiés (`releases.json` : « Publication en attente », `GITHUB_REPO` vide) : `latest.yml` n'existait pas en ligne.
  → Nouveau menu **`DEPLOIEMENT.bat` → 20 « Remettre Atlas en ligne »** : secrets, notifications, installateur + `latest.yml`, site **avec ses fonctions API**,
  puis vérification réelle (`tools/deploy_helper.mjs verify-online`).
- **Bandeau « Diagnostic Atlas — JavaScript: Invalid or unexpected token »** : `encodeURIComponent` n'échappe pas l'apostrophe ; un clic sur
  « Atmosphère contrôlée » (« jusqu'à 12 mois ») cassait le gestionnaire `onclick`. Même défaut latent pour « Côte d'Ivoire », « acétate_d'éthyle »…
  → fonction `jsq()` (littéral JS sûr dans un attribut HTML) appliquée à **112 attributs / 137 valeurs** ; convertisseur CSP réécrit (vrai lecteur de littéraux).
- **Carte vide au retour sur l'accueil** : l'instance Leaflet restait liée à un conteneur retiré du DOM → recréée à chaque affichage, couches réappliquées.
- **Champ « Classe » affiché deux fois** (fiche additif) : clé en double dans la liste des données scientifiques ; déduplication générale.
- **Barres invisibles dans l'administration** : attributs `style` bloqués par la CSP → largeurs appliquées par le CSSOM.
- **« Cette application ne prend pas en charge l'aperçu avant impression »** : impression Electron remplacée par un **aperçu PDF** (Ctrl+P) et un export PDF.
- Recherche : « kimchee » ne trouvait plus rien → variantes orthographiques, pluriels, tolérance aux fautes étendue ; nom exact après correction remonté en tête.
- Erreur console `<svg> attribute height: auto` (structures moléculaires) corrigée ; hors ligne, « Rechercher une mise à jour » ne répond plus « à jour ».
- Accueil : pendant le chargement, « Fiches au total » affichait **34 476** (le total officiel + les fiches encore en cours de chargement,
  comptées deux fois) puis 19 734 ; « Produits » affichait 500. Total du sommaire affiché d'emblée, « … » tant que le décompte n'est pas définitif.

### Interface
- Couche `atlas-core/v22.css` : aucun texte ne sort de son bloc ni n'est coupé (retours à la ligne, `min-width:0`, `overflow-wrap`,
  suppression des coupures `line-clamp` et des ellipses) — **sans `overflow:hidden`**.
- **Densité compacte par défaut** : texte, marges, espacements, cartes, titres, en-tête et hauteur des contrôles à ≈ 81 % — l'équivalent de
  deux crans de zoom arrière (80 %), vérifié par comparaison d'écrans au format réel du PC de développement (1920 × 1080 à 175 %) — mais
  obtenu par les jetons de taille : la mise en page se recalcule sur la largeur réelle (plus de colonnes, pas de `transform:scale`) ;
  texte de lecture conservé sur téléphone ; densité « Confortable » disponible. Largeur du contenu réglable, **contraste élevé**.
- Tailles de texte Normale / Grande / Très grande / Maximale combinées à la densité, testées sans débordement.
- **Explorer** : méga-menu en grille de tuiles (icône, libellé, description), 16 pôles visibles d'un coup d'œil, « Accès rapides ».
- Contrôle automatique : **0 débordement** sur 20 vues × 12 combinaisons (853×480 à 3840×2160, tailles de texte 0 à 3).

### Paramètres (nouvelle page à catégories)
Affichage · Données (recharger, **vérifier l'intégrité SHA-256**, synchroniser, vider le cache, taille du cache) · Mises à jour (version, dernière
vérification, canal stable, historique) · Contributions (état du service, file d'attente hors ligne, historique) · **Diagnostic** (Internet, API, API
contributions, base centrale, e-mail, mise à jour, données locales : état, temps, code HTTP, message, date ; journal technique) · Administration · À propos.

### Contributions centralisées
- Toutes les plateformes (web, PWA, Windows, macOS, Linux, Android, iOS) envoient au même service `/api/contributions` → base centrale (Netlify Blobs)
  → boîte de réception de l'administration → **e-mail à l'administrateur** (Resend ; adresse et expéditeur dans `server/lib/config.mjs`, clé en variable d'environnement).
- 13 types : nouveau produit, plat, boisson, matière première, fiche ; correction ; modification ; suppression proposée ; ajout de source ;
  ajout de référence ; signalement ; suggestion ; autre. Plateforme d'origine enregistrée.
- **Hors ligne : la contribution n'est jamais perdue** (« Contribution enregistrée localement. Elle sera envoyée automatiquement lorsque la connexion
  sera rétablie. ») ; envoi automatique au retour du réseau, retrait de la file uniquement après confirmation du serveur.

### Administration
- Connexion **identifiant + mot de passe** (empreinte scrypt côté serveur, session signée 8 h, anti-CSRF, limitation des tentatives).
- Tableau de bord (base de données, contributions, état du système), **Propositions** (boîte de réception : Voir / Accepter / Refuser / Mettre en attente,
  statuts Nouvelle · En cours · À vérifier · Acceptée · Refusée · Archivée, traçabilité date + administrateur), **Audit des fiches** (compteurs, priorités 1 à 4,
  filtres, ouverture de la fiche), **Qualité bibliographique** (DOI invalides / incohérents / manquants, sans auteur, sans date, anciennes, doublons,
  non reliées), **Journal** filtrable (date, type, statut, gravité, plateforme), **Diagnostic** serveur avec e-mail de test.
- Application de bureau : fenêtre d'administration sécurisée (Aide → Administration), session isolée.

### Mises à jour (Windows)
Lecture et contrôle du manifeste avant electron-updater ; codes `UPDATE_MANIFEST_404`, `UPDATE_OFFLINE`, `UPDATE_NETWORK`, `UPDATE_TIMEOUT`,
`UPDATE_SERVER`, `UPDATE_MANIFEST_INVALID`, `UPDATE_INCOMPATIBLE`, `UPDATE_CORRUPT`, `UPDATE_DOWNLOAD` ; message simple + « Réessayer » ; détails
dans `%APPDATA%\Atlas Agroalimentaire\logs\atlas.log`. Plus aucune trace technique à l'écran.

### Données (aucun contenu inventé)
- `tools/audit_fiches.py` : audit de 19 734 fiches — 1 736 complètes, 17 659 incomplètes, 2 273 sans description, 619 sans référence, 422 à
  une seule référence, 2 164 sans relation, 1 474 doublons potentiels, 10 919 à vérifier ; priorités 1 : 2 434 · 2 : 6 458 · 3 : 7 746 · 4 : 1 021.
- `tools/enrich_crossref.py` : **3 531 références complétées et vérifiées** (DOI, auteurs, année, revue, volume, pages) : 3 482 par titre exact (similarité ≥ 0,92), 45 par DOI déjà cité puis contrôlé, 4 citations abrégées (même auteur, année et revue). **38 DOI cités désignaient un autre article** et 6 sont introuvables : signalés dans l'administration, jamais propagés. Articles sans DOI : 5 865 → 2 368 ; références sans auteur : 21 839 → 18 832 ; sans lien : 18 943 → 15 412.
- `tools/derive_relations.py` : 174 fiches de référence reliées aux produits qui les citent (1 568 liens « lien inverse »).
- Données ouvertes et flux de mise à jour servis avec `Access-Control-Allow-Origin: *`.

## 21.3.1 — 2026-09-30 — catégories, homonymes et liens corrigés, indicateurs plus exigeants
Complément de la 21.3.0 (paquet « 21.3b ») : il apporte aussi les corrections C12 à C15 décrites plus bas dans la 21.3.0. Toute la chaîne (`tools/maj_v21_3.py` puis `tools/build_all.py`) a été rejouée depuis les données d'origine : les chiffres de la 21.3.0 ci-dessous sont ceux de cette exécution finale (`reports/maj_v21_3.json`).

### Fiches rangées dans la mauvaise catégorie (C18)
- **380 fiches recatégorisées** après relecture une à une des 1 214 fiches décrites par une phrase-type de catégorie (« X est un style de bière. », « X est un spiritueux. »…), des fiches boissons, sandwichs, fromages, sauces, pâtes, fruits et plantes, et des plats dont la description ou le résumé dit « cocktail », « boisson », « vin ». La catégorie venait d'un mot du nom : **Tomate Brandywine → spiritueux** (« brandy »), **Torta del Casar → sandwich** (« torta »), Galette complète bretonne → bière, Solomillo al whisky → spiritueux, Lentilles corail au lait de coco → boisson, Feuille de Dreux et Camembert au calvados hors des fromages, merguez, sai ua et 'nduja parmi les épices ; ou de la valeur par défaut « Plat du monde » : **147 cocktails, cafés, vins, liqueurs et boissons** (Daiquiri, Negroni, Barsac, Pouilly-Fumé, Țuică, lassi, horchata…).
- Nouvelles catégories : 136 plats, 71 cocktails, 67 boissons, 33 desserts, 10 spiritueux, 9 fromages, 9 fruits et légumes, 9 plantes, 7 vins, 6 thés et infusions, 6 céréales, et quelques épices, sauces, sandwichs, aromates, charcuteries, boissons fermentées et un miel.
- Les **textes-types de l'ancienne catégorie** sont mis de côté (valeur identique, nom neutralisé, sur au moins 3 fiches de la catégorie ou 5 au total) : une tomate « se conservait debout, à l'abri de la lumière », avec pour risque « boisson fortement alcoolisée » et pour procédé la distillation ; le Barsac « se conservait comme tout plat préparé au réfrigérateur, réchauffé à cœur (≥ 70 °C) ». Sont aussi retirés les voisins et « même famille » de l'ancienne catégorie, la mention « fermenté » propre à celle-ci et le régime alimentaire qui en était déduit (une merguez passait pour végétalienne). La consigne de conservation de la nouvelle catégorie (même table réglementée que C7) est appliquée.
- **Relecture indépendante** de la liste : 372 décisions confirmées, 2 erreurs (patoleo → dessert, galette de la Chaise-Dieu → fromage) et 8 cas discutables corrigés (Shirley Temple sans alcool → boisson, es teler et es goyobod → desserts, chai épicés alignés sur la fiche « Chai latte », kounafa cheese et tortelli di zucca laissés dans leur catégorie).
- Badge de catégorie : le code « epice » affichait « Charcuterie épicée » sur **toutes les épices** (poivres, cannelle, curry…) ; il affiche désormais « Épice & aromate », et les trois charcuteries épicées ont leur propre code.

### Homonymes et imports erronés
- **C16 — 7 recettes importées d'un autre plat** (TheMealDB, par ressemblance de nom) : l'èba recevait la recette de l'Adana kebab, le gaz (nougat persan) un gaspacho, le boli (banane plantain grillée) des boulettes de fromage de Curaçao, le cupcake un gâteau au kunafa… Recette, ingrédients, photo, référence et description composée depuis la recette mis de côté (description remplacée par le résumé Wikipédia français quand il existe). **Origine du boli corrigée** : Nigeria (Wikidata Q16874222) au lieu de « Bolivie » (confusion de nom).
- **C17 — 54 descriptions tirées d'une page homonyme** : Adasi → roi d'Assyrie, Gaz → état de la matière, Toronto → la ville, Revolver → l'arme, Zombie → mort-vivant, Mantu → cabinet de conseil, Pigeon aux petits pois → tableau de Picasso, Quentão → vin chaud… Description, image, résumé, faits et lien Wikidata, références de l'homonyme mis de côté (liste relue une à une).
- **Riz gras gabonais et Riz à djej** décrits comme l'espèce *Oryza sativa* (taxon, répartition GBIF, photos de la plante, nutrition du riz cru, « végétalien ») : traités comme les organismes homonymes de C12.
- 2 résumés portant sur une autre espèce écartés (myrtille sauvage → myrtille américaine, poivre de Timut → poivre du Sichuan).

### Liens entre fiches
- **C19 — 47 570 liens « entités liées » sans information retirés** (8 904 fiches) : 6 668 plats et boissons affichaient la même liste alphabétique (Aam papad, Aanvla murabba, Aash, Abbacchio…) comme « produits similaires », y compris un daiquiri ou un sauternes ; les listes « même famille » identiques sur au moins 25 fiches sont retirées de la même façon.
- **C20 — 3 452 listes de « produits voisins » recalculées** (même méthode que C5) là où la même liste figurait sur au moins 25 fiches : les rillettes étaient proposées comme voisines du rhum, du milkshake ou du cold brew, les tomates comme voisines des poires.

### Indicateurs
- **Complétude plus exigeante (I2)** : les phrases-types qui ne diffèrent que par le nom de la fiche (« En tant que plat traditionnel, <nom> s'inscrit… », « Comme tout plat préparé, <nom> se conserve… ») comptaient comme contenu propre ; **21 591 champs** sont désormais reconnus comme indications générales (et regroupés comme tels sur les fiches). La complétude moyenne recalculée avec cette règle, avant et après : **45,3 → 46,5 %** (plats du répertoire 28,7 → 30,0 %). Nouveaux compteurs : boissons rangées parmi les plats (126 → 4), liens « entités liées » génériques (49 335 → 0).
- 1 482 fiches signalées « à compléter » : 1 204 descriptions-gabarits (21.3.0), 222 phrases-types d'une autre catégorie (C18), 55 descriptions d'un homonyme (C12, C17), 1 description composée depuis une recette étrangère (C16). Un texte faux n'est jamais remplacé par un texte inventé.

### Applications
- Version 21.3.1 (versionCode Android 210301) : applications de bureau reconstruites avec ces données ; service hors ligne renouvelé pour que la PWA installée recharge l'interface.

## 21.3.0 — 2026-09-30 — audit critique, rubriques fusionnées, données corrigées et complétées
### Défauts majeurs corrigés
- **Le site publié était en retard de deux versions** : `web/data` et les pages publiques dataient de la 21.0 alors que `data-source` contenait les corrections 21.1 et 21.2 (compositions Ciqual, liens Wikidata écartés, quiz). Tout est reconstruit : données, **19 725 pages publiques**, exports, quiz.
- **Carte mondiale vide** : le fond CARTO renvoie désormais une tuile « API KEY REQUIRED » (réponse HTTP 200, donc la bascule de secours ne se déclenchait jamais). Fond **OpenStreetMap France** (libellés en français), repli automatique sur OpenStreetMap ; carte des filières : fond OpenStreetMap assombri par filtre.
- **Accueil** : compteurs figés sur le premier lot chargé (« 500 produits », « 5 397 plats », carte à 499 points) → valeurs réelles après chargement (7 438 produits, 7 804 plats, 9 491 points). Le total des fiches est le même partout (site, administration, documentation) : **19 734** (15 242 produits et plats + 4 492 fiches de référence), publié dans `data/manifest.json`.
- Fiche : « [object Object] » dans Culture & société, doublon interne « Energie kcal num » affiché, badge « traduit de l'anglais » inexact (les extraits ne sont pas traduits : la langue d'origine est maintenant indiquée, avec l'attribut `lang`).
- Contrôles scientifiques exécutés sur la version précédente des données : ils tournent désormais après la construction.

### Navigation et fiches : fusion des rubriques
- Menu « Explorer » : **73 liens → 14 pôles** (Aliments · Plats & cuisines du monde · Boissons · Fermentations · Additifs & ingrédients · Nutriments · Molécules & réactions · Micro-organismes · Procédés · Équipements & emballages · Sécurité sanitaire · Réglementation & normes · Matières premières · Pays, régions & terroirs). Chaque ancienne rubrique devient un **onglet** de son pôle (barre d'onglets commune en haut de page) ; aucune route supprimée, anciens liens et favoris valides. En-tête allégé (« Recherche » et « Données » faisaient doublon avec le bouton de recherche et le menu Ressources).
- Accueil : cartes générées depuis les pôles du menu (une seule définition, plus d'écart entre accueil et menu).
- Fiche : ~25 sous-onglets → **8 sections thématiques** (L'essentiel · Composition & nutrition · Fabrication, procédés & conservation · Sécurité, santé & microbiologie · Usages, dégustation & culture · Informations complémentaires · Fiches liées · Sources) + Indications générales et Historique. Titres en double fusionnés (Conservation ×2, Préparation ×2…), sections vides retirées, **cinq blocs de liens réunis dans « Fiches liées »** sans doublon, sections au contenu identique dédoublonnées, « Données structurées » réduites aux seuls champs non affichés ailleurs, sommaire par section, badges redondants masqués.
- **Textes-gabarits** (valeur identique sur au moins 25 fiches) regroupés dans « Indications générales » avec la mention « commune à de nombreuses fiches — non propre à ce produit ».
- **Fiches « à compléter »** (1 482 après la 21.3.1) : bandeau explicite et bouton « Proposer un complément » au lieu d'un texte-gabarit vide de sens ou d'un texte sur un autre sujet.
- Fiche pays : profil (capitale, population, superficie, nombre de fiches), produits emblématiques et plats nationaux cliquables (et non plus une liste d'identifiants).
- Petites collections : barre alphabétique masquée sous 40 fiches ; cartes sans description complétées (objectif, principe, résumé).

### Données : corrections (toute valeur remplacée reste en interne dans `_verif_v21_3`)
- **1 068 classifications biologiques reconstruites depuis GBIF** : 139 règnes faux (esturgeon classé *Plantae*…), 1 054 familles culinaires placées à la place de la famille biologique ; 77 « noms scientifiques » qui étaient des descriptions françaises écartés.
- **4 910 liens « procédés » sans rapport retirés** (4 184 fiches) : « Conditionnement aseptique (Tetra Pak) » était attribué à 3 353 fiches, dont la milanesa. Un lien n'est conservé que si la fiche mentionne le procédé.
- 4 515 sous-catégories automatiques erronées (« soupe » par défaut) recalculées ; 7 714 listes de « produits voisins » de plats recalculées (même famille, même pays, même continent — Pho et Sukiyaki n'étaient pas voisins de la milanesa).
- 329 descriptions dont les valeurs nutritionnelles contredisaient le tableau de la même fiche.
- 3 792 textes de conservation identiques remplacés par une consigne propre à la catégorie, avec sa base réglementaire (règlements (CE) 853/2004 et (UE) 1169/2011, arrêté du 21 décembre 2009).
- 13 résumés Wikipédia hors sujet (« Latik » → biographie d'une sculptrice, « Soow » → Shoah, « Glycérine végétale » → Addendum…) et 4 liens Wikidata erronés écartés (Stracciatella di burrata reliée à la soupe aux œufs du même nom, Sauce satay reliée aux brochettes, avec leurs compositions fausses).
- 1 263 descriptions-gabarits de plats : 47 remplacées par le résumé Wikipédia en français (source affichée), 1 204 signalées « à compléter » (les autres relevaient d'une correction plus précise : homonyme, recette étrangère, catégorie).
- **58 plats, boissons et produits transformés reliés à un organisme homonyme** (relecture une à une des fiches de produits préparés portant un nom scientifique ; éléments Wikidata vérifiés : P31 = taxon) : Aguapanela → mygale, Diabolo → papillon, Kocho → *Mycobacterium tuberculosis* et photo d'un rosier, Dame blanche → effraie des clochers, Vodka de pomme de terre → pommier, Pálinka → lin, Golden Monkey → singe doré, Bagani → pourghère (plante toxique), **Café noisette → noisetier, avec les valeurs nutritionnelles et l'allergène de la noisette**… Mis de côté (avec les 2 plats de riz de la 21.3.1) : 60 classifications, 24 liens Wikidata (jamais réintroduits), 33 images, 21 galeries, 15 résumés, 21 listes de noms alternatifs (la recherche « pommier » renvoyait la vodka), 11 alias, 4 descriptions, **125 références portant sur l'organisme** (fiches GBIF/NCBI, articles sur l'éponge *Smenospongia*, le bacille de Koch, le logiciel « NOISEtte CFD »…).
- **988 liens « matières premières » attribués par un mot pris hors de son sens** (903 fiches) : « caillé » → caille (183 fromages), « herbes » → herbes de Provence (154), « pommes de terre » → pomme (158), « saison de pêche » → pêche (62), « croûte orange » → orange (66), « mousse » → mousse d'Irlande, « moulé » → moule, « arômes de cassis et poivron » → cassis, poivron… Un lien n'est retiré que si aucune mention n'est un constituant réel (`tools/controle_mentions.py`).
- **228 allergènes détectés par mots-clés sur un homonyme ou un descripteur retirés** (222 fiches) : « lait de coco », « beurre de cacao », « cochon de lait », « noix de coco / de muscade », « goût de noisette », fromage « moulé » → mollusques, « tourteau de cacao » → crustacés, « blé noir », « germes de soja » (haricot mungo), « œufs de poisson », « sans œuf »… Garde-fous : les allergènes rédigés explicitement ne sont jamais touchés ; un allergène est gardé dès qu'un autre ingrédient du même groupe est cité (ghî, « dessert lacté », « Lait » dans les risques) ; « servi avec » compte comme constituant pour un plat ; desserts, pâtisseries et sandwichs gardent lait et œufs (variantes courantes) ; un produit du groupe de l'allergène le garde (pétoncle → mollusques) ; les feuilles de moutarde gardent l'allergène moutarde. **Relecture indépendante** des retraits : 4 faux négatifs et 6 cas discutables trouvés (bebinca au ghî, canjica, mandazi, maja blanca…) → règles resserrées, les 10 cas rétablis.
- **1 386 allergènes manquants ajoutés** (1 106 fiches) quand la composition de la fiche cite l'ingrédient (description et recette d'un plat ; composition, ingrédients et matières premières d'un produit) : arachides du nasi lemak et du massaman, gluten de l'avoine, œufs de l'otak-otak… (source « ingredient_cite », mêmes contrôles de contexte ; céréales des spiritueux et sirops de glucose exemptés comme le prévoit l'annexe II).
- Statuts internes harmonisés (verified / verifie / verifiee…).

### Données : éléments manquants
- **114 fiches pays** : tous les pays cités par les fiches en ont désormais une (144 au total) — Wikidata, Wikipédia, population, superficie, fiches de l'Atlas rattachées.
- **9 fiches bactériophages** (collection vide jusqu'ici) : phage P100, groupes 936, c2 et P335 des lactocoques, phages de *S. thermophilus*, phages Stx… avec des articles à DOI vérifiés (EFSA 2009 et 2016, Garneau & Moineau 2011, Deveau et al. 2006…).
- **14 règlements UE ajoutés** (1935/2004, 2023/2006, 10/2011, 2017/625, 2019/627, 2021/382, 1924/2006, 396/2005, 1334/2008, 1332/2008, 2019/649, 1829/2003, 1830/2003, 2024/1143) ; 1881/2006 signalé **abrogé** (remplacé par 2023/915) ; 4 doublons fusionnés avec renvoi ; 24 liens officiels (EUR-Lex, Légifrance, FDA, Codex) ajoutés comme références.
- Références normatives (29 normes), Codex CXC 1-1969 (7 principes HACCP), registres officiels (7 labels) ; 253 fiches de référence reliées à leur article Wikipédia (correspondances relues : Baumé → astéroïde, Polymorphisme → informatique… écartés) ; 21 termes du glossaire sans identifiant (impossibles à ouvrir) corrigés ; 2 régions reliées au vin au lieu de la région (Bourgogne, Champagne).

### Enrichissement sourcé
- **910 fiches enrichies** : 118 résumés Wikipédia en français, 740 extraits dans la langue de l'article faute d'article français (langue indiquée), 114 illustrations libres, 176 nouveaux liens Wikidata (titre Wikipédia anglais, redirections vers un sujet plus général refusées), 161 définitions Wikidata ; **524 correspondances refusées** par le contrôle d'identité (tous les mots du nom doivent se retrouver dans le titre ou le résumé).
- 56 compositions (Wikidata, libellés français, élément de nature alimentaire) et 43 origines inconnues renseignées (pays d'origine, ou pays de la cuisine).

### Indicateurs internes (administration)
- **Méthode v2** (`tools/completude_v2.py`) : la complétude ne compte que le contenu propre à la fiche (les gabarits valent 0), la qualité bibliographique pondère les sources par niveau de preuve (A / B / C / D). Même méthode avant/après (règle I2 de la 21.3.1 comprise) : complétude des produits et plats **45,3 → 46,5 %** (plats du répertoire 28,7 → 30,0 %), qualité bibliographique des produits 42,3 → 43,4, fiches de référence sans source **807 → 617**, fiches produits de niveau D 5 050 → 5 010 (les références qui portaient sur un homonyme ne comptent plus). Détail : `reports/indicateurs_avant_apres_v21_3.json`, `reports/maj_v21_3.json`.
- Tableau de bord : niveaux de preuve, gabarits à remplacer, comparaison ancienne/nouvelle méthode, historique annoté.

### Applications
- Windows (x64, x86), Linux (AppImage) et macOS (Intel, Apple Silicon) reconstruits avec les données définitives de la 21.3 ; empreintes dans `release/SHA256SUMS.txt`, catalogue `web/downloads/releases.json`.
- **macOS** : les archives construites sous Linux remplaçaient les liens symboliques des frameworks par des copies (7-Zip d'electron-builder) — 300 Mo au lieu de 140 Mo et structure `.framework` invalide. Nouveau `apps/desktop/scripts/dist-mac.js` (`npm run dist:mac`) : `zip -y` qui conserve les liens, et **signature ad hoc** avec rcodesign quand il est installé (macOS propose alors « Ouvrir » au lieu d'annoncer une application endommagée).
- Android 21.3 (versionCode 210300) : à construire sur le PC qui détient la clé (DEPLOIEMENT.bat → 9, avant → 18).

### Tests
- Bout en bout : 60/60 avec l'API, 52/52 en mode statique (dont nouveaux contrôles : pôles et onglets, fiche sans titre en double, sommaire, bactériophages, pays) ; API 18/18 ; synchronisation des contributions OK ; non-perte des données OK ; aucun indicateur interne publié ; **nouveau test de non-régression des homonymes** (`tests/unit/test_homonymes.py`, exécuté par `build_all.py`).

## 21.2.0 — 2026-09-29 — deuxième passe d'enrichissement et de vérification
### Enrichissement sourcé
- **499 fiches supplémentaires reliées à Wikidata** (redirections de Wikipédia, nom exact dans 15 langues pour les plats nommés dans leur langue : Tepache, Schupfnudeln, Anmitsu…) ; un seul aliment doit correspondre, les redirections vers un sujet plus général sont refusées. Elles reçoivent 180 résumés Wikipédia, 148 compositions, 268 illustrations libres et leurs références.
- **Composition nutritionnelle Ciqual élargie** : +131 fiches (nom anglais identique dans la table Ciqual ; variétés de fruits, légumes, poissons et viandes bruts rattachées à l'aliment générique cru, signalé comme tel sur la fiche). +2 fiches USDA. Au total **476 fiches** avec une composition mesurée.
- +63 origines « à préciser » renseignées (Wikidata P495, pays unique).
- La composition nutritionnelle et sa source apparaissent aussi sur les **pages publiques** (476 pages).
### Vérification
- Deuxième audit indépendant (70 fiches) : les 12 erreurs et doutes relevés sont corrigés (liens vers un sujet général ou une autre espèce, compositions bruitées, correspondance trop spécifique).
- **19 liens Wikidata** et **44 descriptions** hors sujet ou réduites à un mot écartées (biographies d'homonymes : Mazarin, Garibaldi, Charlie Chaplin… ; pages d'homonymie ; « Groupe d'îles indonésiennes » pour la sauce Thousand Island). Quand un résumé Wikipédia fiable existe, il remplace la description (26 fiches, source affichée) ; sinon la description est mise de côté et la fiche redevient « à compléter » (18 fiches). Anciennes valeurs conservées en interne.
- Origines corrigées quand elles provenaient d'un mauvais lien (Thousand Island : États-Unis ; Sopa de fideo : à préciser).
### Quiz
- **529 questions** (+120) : comparaisons nutritionnelles calculées sur les valeurs Ciqual (« lequel est le plus riche en fer pour 100 g ? »), avec un écart net imposé et les valeurs en correction.

## 21.1.0 — 2026-09-29 — navigation fusionnée, quiz refondu, corpus vérifié et enrichi
### Navigation
- Méga‑menu ramené de 12 à **8 domaines**, 10 liens maximum par groupe : Aliments & plats · Boissons & fermentations · Ingrédients & additifs · Microbiologie · Nutrition & composition · Procédés & équipements · Qualité, sécurité & réglementation · Matières premières & origines.
- **Plats & cuisines du monde** fusionnés (répertoire + cuisines nationales, bascule « Répertoire / Par cuisine nationale »).
- Domaine « Sciences & outils » retiré (outils et quiz dans Ressources) ; « Territoires & environnement » réparti dans Matières premières & origines (pays, terroirs, carte). Aucune page supprimée : toutes les anciennes routes répondent.
- Accueil : raccourcis alignés sur les 8 domaines ; « Mes contributions » dans le menu mobile.
### Quiz (entièrement refait)
- 409 questions vérifiées en 11 thèmes (microbiologie, fermentation, sécurité, biochimie, nutrition, boissons, produits laitiers, réglementation, procédés, additifs, origines) ; 52 nouvelles questions rédigées, erreurs corrigées (ex. Roquefort/méthylcétones, pH 4,6 et *C. botulinum*, 46 AOP fromagères), 12 doublons retirés.
- Questions générées uniquement depuis des données sourcées (numéros E, allergènes INCO, minéraux, origines confirmées par deux sources).
- Quiz du jour, niveau, nombre de questions, mode entraînement / examen, clavier 1‑6, correction détaillée avec lien vers la fiche, « Rejouer mes erreurs », meilleur score par thème.
### Données : vérification
- **309 liens Wikidata erronés** écartés (ex. Koso → Kosovo, Kanji → écriture japonaise, Quark → particule, Cantal → département).
- **241 autres liens** corrigés : produits dérivés reliés à leur ingrédient ou à leur espèce (Huile d'arachide → arachide, Vin rouge → *Vitis vinifera*, Comté → *Bos taurus*, Thé Oolong → théier) et homonymes (Lafun → *Lafunavirus*, Choriço → *Choricotyle*). La relation exacte est conservée (`wikidata_qid_espece`, `wikidata_qid_ingredient`) et 90 fiches ont été reliées au bon élément (vodka, cidre, huile d'arachide, thé Oolong…).
- Les champs issus d'un mauvais lien (résumés, faits, images, références) sont retirés du public et conservés en interne (`_verif_wikidata`) — rien n'est supprimé. Rapport : `reports/verification_wikidata_v21.json`.
- Compositions nettoyées des éléments qui ne sont pas des ingrédients (familles taxonomiques, arbres), conservés en interne.
- Nouveau contrôle : estimation nutritionnelle historique confrontée à la mesure Ciqual (33 écarts signalés à l'administration).
- Audit indépendant d'un échantillon de 60 fiches : aucun homonyme grossier restant, correspondances Ciqual toutes exactes ; les défauts relevés (liens vers l'espèce végétale) ont été corrigés par le contrôle ci‑dessus.
### Données : enrichissement sourcé
- **344 fiches** reçoivent une composition nutritionnelle mesurée pour 100 g, avec lien vers la source : 329 depuis la table **Ciqual 2020 (ANSES**, Licence Ouverte), 15 depuis l'**USDA FoodData Central** (domaine public, appariement exact par l'identifiant USDA de Wikidata).
- **1 786 fiches** enrichies depuis Wikidata / Wikipédia / Commons : 1 488 compositions, 266 résumés, 76 illustrations libres, références spécifiques ajoutées.
- 26 origines « à préciser » renseignées (Wikidata P495, pays unique déjà normalisé dans le corpus ; les zones régionales ne sont jamais remplacées par un pays).
- Complétude recalculée critère par critère (seuls les critères réellement satisfaits sont retirés) : moyenne des produits 47,4 % → 49,1 %.
### Plateforme
- Une fiche de la communauté retirée de la publication (ou refusée / supprimée) après son intégration est désormais masquée du site à la synchronisation suivante, sans être supprimée de la base locale.
### Applications
- Windows x64 / x86, macOS Intel / Apple Silicon (zip), Linux AppImage, Android (AAB + APK) reconstruits avec les données 21.1.

## 21.0.0 — 2026-09-29 — plateforme collaborative, administration sécurisée
### Deux niveaux d'accès (séparation réelle, côté serveur)
- **Public** : plus aucun indicateur interne visible (complétude, scores bibliographiques, statut documentaire, « points à vérifier », tableaux de bord qualité). Ils sont retirés des fichiers publiés eux‑mêmes (`web/data`, pages SEO, exports), pas seulement masqués ; un test bloque toute publication qui en contiendrait.
- **Administration** `/admin/` : connexion par mot de passe (empreinte scrypt en variable d'environnement, jamais dans le code), session HttpOnly signée, anti‑CSRF, limitation des tentatives. Tableau de bord, Fiches, Contributions, Validation, Qualité des données, Bibliographie, Statistiques, Utilisateurs, Exports, Paramètres. Toutes les données viennent de l'API `/api/admin/*` (401 sans session).
### Contributions
- Bouton **« + Ajouter une fiche »** (en-tête, accueil, menu mobile) : fiche vierge structurée, champs propres à chaque catégorie, sources multiples, documents justificatifs, brouillon ou soumission, sauvegarde locale automatique, alerte « cette fiche existe peut‑être déjà ».
- **« Proposer une correction »** sur chaque fiche (et sur les pages SEO).
- **Mes contributions** : suivi sans compte par code personnel, messages de l'équipe, correction et renvoi.
- Workflow complet : brouillon → soumise → en vérification → correction demandée / validée / fusionnée / refusée → publiée ; historique de chaque action ; contrôles automatiques (doublons, plages, formats, URL, cohérence nutritionnelle, sources).
- **Fiches de la communauté** publiées immédiatement après validation ; compléments validés affichés dans la fiche concernée.
- Intégration définitive dans la base par script local (`16_integrer_contributions.bat`) : identifiant stable, aucun doublon en cas de relance, CSV synchronisé, journal.
### Interface simplifiée
- En-tête : Accueil · Explorer · Recherche · Données · À propos + « Ajouter une fiche ». Raccourcis en double retirés de l'accueil ; filtres « statut » retirés des listes.
- Fiche réorganisée en sections repliables : Informations principales · Caractéristiques · Données · Informations complémentaires · Sources · Historique et mise à jour.
- Page **Données ouvertes** : exports CSV (produits, autres fiches), fichiers JSON réutilisables, licence, fonctionnement des contributions.
### Déploiement
- Menus interactifs **Netlify** (13) et **Vercel** (14) : connexion, changement de compte, projets (liste, sélection, création), sous‑domaine / domaine, déploiement site + API, statut, ouverture, déconnexion, réinitialisation, configuration ; vérification préalable des outils avec proposition d'installation.
- Scripts **15** (mot de passe administrateur + envoi à l'hébergeur), **16** (intégration des contributions), **17** (test local complet).
- API : Netlify Functions + Netlify Blobs ; Vercel Functions + Upstash Redis.
### Corrections
- Carte de l'accueil : erreur « Map container not found » quand on quittait l'accueil avant son initialisation.

## 20.0.0 — 2026-09-28 — refonte, audit complet, multiplateforme
### Données (aucune fiche ni aucun champ supprimé)
- Base : la v19 en ligne (le dossier local v9 était en retard ; toutes ses données sont incluses dans la v19).
- Scission sans perte des fiches : lots légers (78 Mo au lieu de 283 Mo) + détail chargé à la demande (305 paquets). Vérification automatique de l’identité exacte avec la source.
- 96 fiches « Conservateurs naturels » redevenues accessibles (clé de collection dupliquée qui les masquait).
- Contrôles scientifiques automatiques : 2 011 fiches portent désormais des « points à vérifier » visibles (valeurs hors plage, nutrition incohérente, origine divergente, description gabarit), sans modification des valeurs.
### Interface & expérience
- Design system (jetons, composants), typographie d’interface lisible, **thèmes clair / sombre / automatique**, taille de texte réglable, animations réductibles.
- Nouvelle navigation : méga‑menu « Atlas » en 12 domaines (aliments, boissons & fermentations, cuisines, ingrédients & additifs, microbiologie, procédés & équipements, nutrition & chimie, qualité & sécurité, réglementation, matières premières & filières, territoires & environnement, sciences & outils), menu Ressources, tiroir mobile.
- **Moteur de recherche** : plein texte, autocomplétion, fautes de frappe, synonymes FR/EN, numéros E (« E960 », « e 960 »), noms scientifiques ; palette Ctrl+K ; page de résultats avec extrait, pertinence, étiquettes et **11 filtres combinables** + « Réinitialiser les filtres », filtres dans l’URL.
- **Comparateur scientifique** (2 à 4 fiches, tous types, critères adaptatifs, différences surlignées, export CSV, lien partageable).
- **Favoris** : ajout/retrait, recherche, listes personnalisées, export/import.
- Fiches : barre d’outils (favori, comparer, copier le lien, imprimer), sommaire, **contenus associés**, points à vérifier, date de vérification, rôle dialog + piège de focus.
- Pages Paramètres (→ À propos avec version), Applications (téléchargements), Ressources, 404.
- Écran de chargement professionnel : progression réelle, délai maximal, nouvelles tentatives, « Réessayer ».
### Corrections
- Liens profonds vers une fiche ou une vue : ils étaient écrasés par la page d’accueil au démarrage.
- Anciennes routes mortes (`#/glossaire` → glossaire), routes inconnues → vraie page 404.
- Alias de fiche collés (« TapeTapayTapai »), chiffres d’accueil arrondis et faux pendant le chargement, titre « v8.18 » de la page À propos.
- Navigation et cartes inaccessibles au clavier (liens sans `href`), sélecteurs sans libellé, contrastes insuffisants.
- `eval()` supprimé (recherche du graphe), rechargement intempestif lors de l’installation du service worker.
### Plateformes
- PWA complète : manifeste (icônes, raccourcis), service worker versionné (coque hors ligne, données « stale‑while‑revalidate », détails de fiches plafonnés), invitation à la mise à jour.
- SEO : 19 580 pages publiques à URL stable (`/atlas/<section>/<fiche>/`), Open Graph, JSON‑LD, sitemap, robots.txt, canonical.
- Sécurité : CSP, en‑têtes (nosniff, frame‑ancestors, Referrer‑Policy, Permissions‑Policy), aucun secret dans le front.
- Applications : Windows x64 et x86 (NSIS, mises à jour automatiques), macOS Intel et Apple Silicon (non signées), Linux AppImage, Android (AAB + APK signés), projet iOS/iPadOS prêt.
- Tests automatisés (34 vérifications de bout en bout + test de non‑perte des données), documentation complète.

### Ajouts post‑livraison (20.0.0)
- Scripts de publication Windows : `DEPLOIEMENT.bat` + `deploiement/` (Netlify préprod/prod, actualisation, Vercel, GitHub code et Release, .exe x64/x86/MSI, Android, Google Play, macOS/iOS via GitHub Actions).
- `tools/bump_version.py`, `tools/prepare_vercel.py`, `tools/play_upload.mjs` (API Google Play), `.gitignore` protégeant les clés.
