{
  "meta": {
    "version": "1.0",
    "lastAudit": "2026-05-27",
    "auditeur": "interne (outillage Akiani) — pas d'audit externe à ce jour",
    "referentiel": "RGESN 2024 v.mai-2024",
    "perimetre": "akiani.fr — site Astro statique pré-buildé",
    "echantillon": "Audit 2026-05-27 : 15 mesures sur 8/12 archétypes (FR+EN) en passe nominale. Manque : news, recherche, contact, page froide. 3 passes (3G/4G P75) reportées le temps de compléter l'outillage (cf. AC-010). Audit global non finalisé (durée > 30 min sur 347 pages)."
  },
  "score": {
    "global": 30,
    "applicables": 54,
    "cible": 75,
    "note": "Audit interne 2026-05-27, révisé le 2026-08-14 : 16/54 OK = 30 %. Le critère 4.4 est repassé de ok à non conforme, la façade YouTube qu'il invoquait n'ayant jamais été posée (contrôle sur le build du 14 août). 9 critères ont basculé de 'à valider' à 'ok' grâce aux mesures sur la prod (2.10, 4.4, 4.5, 4.8, 5.1, 5.2, 6.2, 6.3, 6.7). Il reste 13 critères en attente (passes 3G/4G P75, audit DOM exhaustif, Coverage CSS) et 20 à étoffer côté documentation (familles Stratégie / Spécifications / Hébergement, plus les animations décoratives qui croisent 4.1/4.7/4.15)."
  },
  "compteurs": {
    "ok": 16,
    "aEtoffer": 22,
    "aValider": 12,
    "aOuvrir": 1,
    "aVerifier": 1,
    "nonApplicable": 24,
    "nonConforme": 2
  },
  "lighthouse": {
    "note": "Audit Lighthouse 2026-05-27 sur la prod akiani.fr/akiani-fr-2026/ (5 pages, headless Chrome, headers OVH réels avec gzip + cache-control).",
    "moyennes": {
      "performance": 99,
      "accessibility": 99,
      "bestPractices": 100,
      "seo": 69
    },
    "noteSeo": "Le score SEO 69 est cohérent : le robots meta de la préprod est noindex/nofollow le temps de la phase de validation. À recalculer après cutover production.",
    "pages": [
      {
        "url": "/ecoconception/",
        "performance": 99,
        "accessibility": 93,
        "bestPractices": 100,
        "seo": 69,
        "lcp": "1.7 s",
        "cls": 0.017
      },
      {
        "url": "/",
        "performance": 100,
        "accessibility": 100,
        "bestPractices": 100,
        "seo": 69,
        "lcp": "1.9 s",
        "cls": 0.02
      },
      {
        "url": "/savoir-faire/",
        "performance": 98,
        "accessibility": 100,
        "bestPractices": 100,
        "seo": 69,
        "lcp": "2.1 s",
        "cls": 0.001
      },
      {
        "url": "/blog/",
        "performance": 100,
        "accessibility": 100,
        "bestPractices": 100,
        "seo": 69,
        "lcp": "1.4 s",
        "cls": 0
      },
      {
        "url": "/identite/",
        "performance": 100,
        "accessibility": 100,
        "bestPractices": 100,
        "seo": 69,
        "lcp": "1.3 s",
        "cls": 0.009
      }
    ]
  },
  "ecoIndex": {
    "moyenne": 79.9,
    "grade": "B",
    "pagesSousB": 1,
    "note": "Audit 2026-05-27 — 15 mesures sur 12 archétypes Akiani (FR+EN), passe nominale. Médiane 79.7. Min 68.9 (blog ux-days long, grade C). Max 88.9 (404, grade A). Répartition : A=7 / B=7 / C=1.",
    "historique": [
      {
        "date": "2026-05-11",
        "moyenne": 80.1,
        "grade": "A",
        "pages": 185,
        "source": "ecoconception.astro déclaratif (avant refonte)"
      },
      {
        "date": "2026-05-27",
        "moyenne": 79.7,
        "grade": "B",
        "pages": 1,
        "source": "page /ecoconception/ refondue — DOM 344, 8 req, 507 Ko"
      },
      {
        "date": "2026-05-27",
        "moyenne": 79.9,
        "grade": "B",
        "pages": 15,
        "source": "12 archétypes (FR+EN) — audit interne",
        "min": 68.9,
        "max": 88.9,
        "below80": 8,
        "below70": 1
      },
      {
        "date": "2026-05-27",
        "moyenne": 78.6,
        "grade": "B",
        "pages": 1,
        "source": "page /ecoconception/ après refonte de la déclaration (16 ok, 1 non-conforme, 6 actions correctives ajoutées)"
      }
    ],
    "passe": {
      "nominal": {
        "moyenne": 79.9,
        "grade": "B",
        "echantillon": 15
      },
      "mobile3G": null,
      "mobile4G_P75": null
    },
    "archetypes": [
      {
        "id": "home",
        "url": "/",
        "score": 79.7,
        "grade": "B",
        "dom": 322,
        "requests": 12,
        "kb": 580.3
      },
      {
        "id": "home-en",
        "url": "/en/",
        "score": 80,
        "grade": "A",
        "dom": 309,
        "requests": 12,
        "kb": 614.4
      },
      {
        "id": "savoir-faire",
        "url": "/savoir-faire/",
        "score": 71,
        "grade": "B",
        "dom": 452,
        "requests": 20,
        "kb": 946.1
      },
      {
        "id": "edc-court",
        "url": "/realisations/le-design-de-service/",
        "score": 82.4,
        "grade": "A",
        "dom": 285,
        "requests": 9,
        "kb": 420.6
      },
      {
        "id": "edc-long",
        "url": "/realisations/faciliter-experience-festivaliers/",
        "score": 75.1,
        "grade": "B",
        "dom": 453,
        "requests": 9,
        "kb": 469.6
      },
      {
        "id": "blog-article-long",
        "url": "/blog/fr/ux-days-2025-resume-de-la-journee-dateliers/",
        "score": 68.9,
        "grade": "C",
        "dom": 549,
        "requests": 13,
        "kb": 804.1
      },
      {
        "id": "blog-index",
        "url": "/blog/",
        "score": 75.4,
        "grade": "B",
        "dom": 332,
        "requests": 23,
        "kb": 976
      },
      {
        "id": "glossaire",
        "url": "/glossaire/atelier-de-co-conception/",
        "score": 84.7,
        "grade": "A",
        "dom": 209,
        "requests": 9,
        "kb": 523.3
      },
      {
        "id": "lab",
        "url": "/lab/dark-mode-consensus-difficile/",
        "score": 75.1,
        "grade": "B",
        "dom": 460,
        "requests": 9,
        "kb": 424.2
      },
      {
        "id": "identite",
        "url": "/identite/",
        "score": 83.3,
        "grade": "A",
        "dom": 264,
        "requests": 10,
        "kb": 378.6
      },
      {
        "id": "research",
        "url": "/research/",
        "score": 79,
        "grade": "B",
        "dom": 370,
        "requests": 9,
        "kb": 393.7
      },
      {
        "id": "mentions-legales",
        "url": "/mentions-legales/",
        "score": 86.2,
        "grade": "A",
        "dom": 206,
        "requests": 6,
        "kb": 318.2
      },
      {
        "id": "404",
        "url": "/404/",
        "score": 88.9,
        "grade": "A",
        "dom": 124,
        "requests": 6,
        "kb": 304.1
      }
    ]
  },
  "budgets": {
    "firstLoad": {
      "poids": {
        "cible": 500,
        "regression": 1500,
        "actuel": 580,
        "unite": "Ko",
        "page": "index"
      },
      "requetes": {
        "cible": 20,
        "regression": 30,
        "actuel": 12,
        "page": "index"
      },
      "css": {
        "cible": 30,
        "regression": 50,
        "actuel": 71,
        "unite": "Ko",
        "note": "Mesure non-gzip dans dist/. Gzip OVH ≈ 14 Ko (sous cible). Pré-compression .gz fournie."
      },
      "js": {
        "cible": 15,
        "regression": 30,
        "actuel": 10,
        "unite": "Ko"
      },
      "polices": {
        "cible": 100,
        "regression": 150,
        "actuel": 120,
        "unite": "Ko",
        "note": "Figtree-Variable + Source Serif 4 300/400 (sous-set page home)"
      },
      "dom": {
        "cible": 800,
        "regression": 1500,
        "actuel": 322,
        "page": "index"
      }
    },
    "subsequent": {
      "poids": {
        "cible": 50,
        "regression": 200,
        "actuel": null,
        "unite": "Ko",
        "note": "Non mesuré dans cet audit — mesure reportée (cf. AC-010)"
      },
      "requetes": {
        "cible": 5,
        "regression": 12,
        "actuel": null
      }
    }
  },
  "criteres": [
    {
      "id": "1.1",
      "famille": "Stratégie",
      "intitule": "Évaluer favorablement l'utilité du service vs impacts environnementaux",
      "statut": "à étoffer",
      "preuve": "Réponses aux 9 questions Designers Éthiques + arbre de conséquences ADEME Empreinte Projet niv. 1 à produire",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "1.2",
      "famille": "Stratégie",
      "intitule": "Définir cibles utilisatrices, besoins métiers et attentes réelles",
      "statut": "ok",
      "preuve": "Personas + études UX disponibles dans le projet",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "1.3",
      "famille": "Stratégie",
      "intitule": "Référent écoconception identifié",
      "statut": "à étoffer",
      "preuve": "Référent désigné le 2026-08-14 : Sébastien Klifa, qui porte aussi l'accessibilité numérique. Le critère reste à étoffer tant que le rôle et les missions ne sont pas écrits sur la déclaration et que le suppléant n'est pas nommé.",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "1.4",
      "famille": "Stratégie",
      "intitule": "Revues régulières d'écoconception",
      "statut": "à valider",
      "preuve": "Cadence à fixer : audit interne d'écoconception à chaque PR touchant le build + revue trimestrielle de synthèse. À documenter.",
      "mesureObligatoire": true,
      "validationCroisee": [
        "2.6"
      ]
    },
    {
      "id": "1.5",
      "famille": "Stratégie",
      "intitule": "Objectifs de réduction des impacts environnementaux",
      "statut": "à valider",
      "preuve": "EcoIndex + méthodologie déclarée + cible chiffrée (B minimum, A objectif). Alerte automatique au-delà de 3 Mo à mettre en place.",
      "mesureObligatoire": true,
      "validationCroisee": []
    },
    {
      "id": "1.6",
      "famille": "Stratégie",
      "intitule": "Collecte responsable et raisonnée des données",
      "statut": "à étoffer",
      "preuve": "Le formulaire de /contact/ collecte le nom et l'adresse email, obligatoires pour répondre, puis société, fonction, téléphone et préférence de contact, tous facultatifs. Rien d'autre : aucun compte, aucun traceur, aucun service tiers dans le traitement (endpoint contact.php sur le domaine propre). Finalités, base légale et critères de conservation sont détaillés dans la politique de confidentialité. Corrigé le 2026-08-14 : la version précédente affirmait qu'Akiani n'avait pas de formulaire actif (audit Gabriel du 2026-08-11, constat C15).",
      "mesureObligatoire": false,
      "validationCroisee": [
        "4.4",
        "7.2"
      ]
    },
    {
      "id": "1.7",
      "famille": "Stratégie",
      "intitule": "Niveau de chiffrement adapté",
      "statut": "non applicable",
      "preuve": "HTTPS partout. Pas de données sensibles côté front (pas d'espace client).",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "1.8",
      "famille": "Stratégie",
      "intitule": "Efforts d'open source",
      "statut": "ok",
      "preuve": "Stack open : Astro, polices libres Figtree/Source Serif. À documenter si modules custom partagés.",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "1.9",
      "famille": "Stratégie",
      "intitule": "Technologies standard interopérables",
      "statut": "ok",
      "preuve": "HTML/CSS/JS standards. Astro = sortie HTML statique. Pas de vendor lock-in.",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "1.10",
      "famille": "Stratégie",
      "intitule": "API documentées ouvertes pour interagir avec matériel",
      "statut": "non applicable",
      "preuve": "Site vitrine sans API matérielle",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "2.1",
      "famille": "Spécifications",
      "intitule": "Définir liste des profils de matériels supportés",
      "statut": "à étoffer",
      "preuve": "Documenter desktop + mobile + ancien Android (≥ 5 ans) + iPhone N-3 + MBP 2015",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "2.2",
      "famille": "Spécifications",
      "intitule": "Utilisable sur d'anciens modèles de terminaux",
      "statut": "à valider",
      "preuve": "Documenter le parc de tests sur terminaux anciens : a minima un iPhone N-3 et un Android d'entrée de gamme N-3, avec date de sortie et version OS, et passer akiani.fr dessus à chaque jalon majeur.",
      "mesureObligatoire": false,
      "validationCroisee": [
        "2.4"
      ]
    },
    {
      "id": "2.3",
      "famille": "Spécifications",
      "intitule": "Utilisable via connexion bas débit ou hors-ligne",
      "statut": "à valider",
      "preuve": "Mesure 3G rurale 144 Kbps via émulation réseau Chrome — temps de chargement < 30 s cible",
      "mesureObligatoire": false,
      "validationCroisee": [
        "6.1"
      ]
    },
    {
      "id": "2.4",
      "famille": "Spécifications",
      "intitule": "Compatible avec d'anciennes versions OS et navigateurs",
      "statut": "à valider",
      "preuve": "Liste navigateurs N-2 + matrice caniuse + tests",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "2.5",
      "famille": "Spécifications",
      "intitule": "S'adapte à différents types de terminaux d'affichage",
      "statut": "ok",
      "preuve": "Responsive desktop/tablet/mobile testé. Breakpoint mobile 768px.",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "2.6",
      "famille": "Spécifications",
      "intitule": "Conçu avec revue de conception/code intégrant objectifs environnementaux",
      "statut": "à valider",
      "preuve": "Definition of Done incluant check éco + CI/CD gates + checklist revue à formaliser",
      "mesureObligatoire": false,
      "validationCroisee": [
        "1.4"
      ]
    },
    {
      "id": "2.7",
      "famille": "Spécifications",
      "intitule": "Stratégie de maintenance et de décommissionnement",
      "statut": "à étoffer",
      "preuve": "Mentionner 3 sous-types : préventive (mises à jour Astro/deps), corrective (bugs), évolutive (features). Plan de fin de vie URL/contenu.",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "2.8",
      "famille": "Spécifications",
      "intitule": "Imposer démarche env. aux fournisseurs",
      "statut": "à étoffer",
      "preuve": "Lister fournisseurs (OVH, freelances ext.) + clauses env. ou démarche déclarée",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "2.9",
      "famille": "Spécifications",
      "intitule": "Impacts des composants UI clé-en-main",
      "statut": "à valider",
      "preuve": "Audit du design system Akiani sur deux niveaux (composants clé-en-main vs composants sur-mesure) : écarter ou refactorer tout composant utilisé moins de 2×, et privilégier les patterns natifs (ex. tabulation HTML) face aux composants riches (ex. carrousel JS) quand l'usage le permet.",
      "mesureObligatoire": true,
      "validationCroisee": [
        "4.5"
      ]
    },
    {
      "id": "2.10",
      "famille": "Spécifications",
      "intitule": "Impacts des services tiers",
      "statut": "ok",
      "preuve": "Contrôle du 2026-08-14 sur le build : aucun script tiers chargé en blocking, aucun outil d'analyse, pixel, iframe marketing, chat ou widget social. Deux tiers seulement. player.vimeo.com, derrière une façade sur 24 pages : la vignette est auto-hébergée et l'iframe n'est posée qu'au clic, donc rien ne part avant l'action de l'internaute. youtube.com, sur un article de blog (FR + EN), en iframe brute chargée au défilement : c'est le seul appel tiers non consenti du site, corrigé par AC-012. La version précédente de cette preuve attribuait la façade à i.ytimg.com, domaine qui n'apparaît nulle part dans le build.",
      "mesureObligatoire": true,
      "validationCroisee": [
        "4.4",
        "6.7"
      ]
    },
    {
      "id": "3.1",
      "famille": "Architecture",
      "intitule": "Architecture conçue pour réduire impacts environnementaux",
      "statut": "à valider",
      "preuve": "Astro statique pré-buildé : aucun serveur applicatif à l'usage. Documenter le diagramme + poids/req par sous-système.",
      "mesureObligatoire": true,
      "validationCroisee": []
    },
    {
      "id": "3.2",
      "famille": "Architecture",
      "intitule": "Architecture adaptant ressources à la consommation",
      "statut": "à étoffer",
      "preuve": "Statique pré-buildé Astro = pas d'autoscaling applicatif. Documenter dimensionnement OVH mutualisé.",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "3.3",
      "famille": "Architecture",
      "intitule": "Supporter l'évolution technique des protocoles",
      "statut": "ok",
      "preuve": "HTTPS + HTTP/2 OVH. TLS 1.2/1.3.",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "3.4",
      "famille": "Architecture",
      "intitule": "Mises à jour correctives pendant durée de vie des équipements",
      "statut": "non applicable",
      "preuve": "Web statique : pas d'équipement dédié vendu",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "3.5",
      "famille": "Architecture",
      "intitule": "MAJ correctives indépendantes des évolutives",
      "statut": "non applicable",
      "preuve": "Pas d'équipement dédié",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "3.6",
      "famille": "Architecture",
      "intitule": "Mises à jour incrémentielles",
      "statut": "ok",
      "preuve": "Astro émet seulement pages modifiées. Cache-buster ?v={hash} permet update incrémental côté navigateur.",
      "mesureObligatoire": false,
      "validationCroisee": [
        "6.2"
      ]
    },
    {
      "id": "3.7",
      "famille": "Architecture",
      "intitule": "Optimiser sollicitation environnements dev/preprod/test",
      "statut": "à étoffer",
      "preuve": "Documenter la sobriété des environnements non-prod : préprod OVH coupée hors usage, CI déclenchée uniquement sur PR pertinentes, tâches lourdes (audits Lighthouse/EcoIndex en masse) planifiées en heures creuses.",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "4.1",
      "famille": "UX / UI",
      "intitule": "Pas d'autoplay (animations, vidéos, sons)",
      "statut": "à étoffer",
      "preuve": "Audit 2026-05-27 : footer-anim a preload='none' + JS lazy + bouton 'Arrêter l'animation' (data-footer-autoplay). MAIS vidéo démarre automatiquement au scroll → autoplay implicite. À trancher : assumer (avec contrôle utilisateur) ou retirer l'autostart (cf. AC-007).",
      "mesureObligatoire": false,
      "validationCroisee": [
        "4.6",
        "4.7",
        "4.15"
      ]
    },
    {
      "id": "4.2",
      "famille": "UX / UI",
      "intitule": "Pas de défilement infini",
      "statut": "ok",
      "preuve": "Pagination blog (load-more). Aucun scroll infini.",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "4.3",
      "famille": "UX / UI",
      "intitule": "Parcours de navigation optimisé par fonctionnalité",
      "statut": "à valider",
      "preuve": "Mesure poids/req sur parcours type (accueil → savoir-faire → EDC → contact)",
      "mesureObligatoire": true,
      "validationCroisee": []
    },
    {
      "id": "4.4",
      "famille": "UX / UI",
      "intitule": "Activation utilisateur des services tiers",
      "statut": "non conforme",
      "preuve": "Contrôle du 2026-08-14 : conforme sur les 24 façades Vimeo (vignette auto-hébergée, iframe posée au clic), NON conforme sur l'article Weezdays (FR + EN), qui embarque une iframe youtube.com brute en loading=lazy. Elle se charge au défilement, sans clic ni consentement. Le critère passe donc de ok à non conforme : la version précédente décrivait une façade YouTube qui n'a jamais été posée. Correction suivie par AC-012.",
      "mesureObligatoire": true,
      "validationCroisee": [
        "2.10",
        "6.7"
      ]
    },
    {
      "id": "4.5",
      "famille": "UX / UI",
      "intitule": "Composants natifs majoritaires",
      "statut": "ok",
      "preuve": "Audit DOM index 2026-05-27 : 16 <button> natifs, 0 <div role='button'>. Ratio 100 % natif.",
      "mesureObligatoire": true,
      "validationCroisee": [
        "2.9"
      ]
    },
    {
      "id": "4.6",
      "famille": "UX / UI",
      "intitule": "Médias porteurs d'information uniquement",
      "statut": "non conforme",
      "preuve": "Audit 2026-05-27 : footer-anim (footer-bg-anim webm 96 Ko) et hero-anim (76 Ko) = animations décoratives. Le contenu informationnel est porté par texte + image fixe (footer-bg.webp 89 Ko fallback). Non-conformité assumée — pas de valeur informationnelle ajoutée. Mitigation par 4.15 (bouton arrêt).",
      "mesureObligatoire": false,
      "validationCroisee": [
        "4.1",
        "4.7",
        "4.15"
      ]
    },
    {
      "id": "4.7",
      "famille": "UX / UI",
      "intitule": "Choix sobre : texte > image > audio > vidéo",
      "statut": "à étoffer",
      "preuve": "Audit 2026-05-27 : vidéos blog (Miro/Spline 280-432 Ko) = justifiables (démonstration outil). Footer-anim/hero-anim = décoratif (croise 4.6). Audit page par page de chaque média à produire.",
      "mesureObligatoire": false,
      "validationCroisee": [
        "4.6"
      ]
    },
    {
      "id": "4.8",
      "famille": "UX / UI",
      "intitule": "Polices limitées",
      "statut": "ok",
      "preuve": "Deux familles seulement : Figtree pour l'affichage, Source Serif 4 pour le corps. Sur la home, on charge une version sous-settée aux glyphes utilisés (Figtree-home 15 Ko, Source Serif 4 300-home 31 Ko, 400-home 30 Ko, total 76 Ko). Les autres pages chargent les versions globales (20 + 50 + 50 = 120 Ko). Dans tous les cas, on reste sous le seuil de 150 Ko.",
      "mesureObligatoire": true,
      "validationCroisee": []
    },
    {
      "id": "4.9",
      "famille": "UX / UI",
      "intitule": "Limiter requêtes serveur lors de saisie",
      "statut": "non applicable",
      "preuve": "Pas de formulaire avec validation serveur en place. À ré-évaluer si contact form ajouté.",
      "mesureObligatoire": true,
      "validationCroisee": []
    },
    {
      "id": "4.10",
      "famille": "UX / UI",
      "intitule": "Informer du format de saisie attendu",
      "statut": "non applicable",
      "preuve": "Pas de formulaire actif. À ré-évaluer si ajouté.",
      "mesureObligatoire": true,
      "validationCroisee": []
    },
    {
      "id": "4.11",
      "famille": "UX / UI",
      "intitule": "Informer poids/format fichier avant transfert",
      "statut": "à vérifier",
      "preuve": "Vérifier si champ upload présent. Si non, retirer toute mention. Si oui, afficher poids max + formats.",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "4.12",
      "famille": "UX / UI",
      "intitule": "Indiquer impacts environnementaux importants",
      "statut": "à ouvrir",
      "preuve": "Aucune fonctionnalité actuelle n'a un impact suffisamment significatif pour alerter — à documenter explicitement.",
      "mesureObligatoire": true,
      "validationCroisee": []
    },
    {
      "id": "4.13",
      "famille": "UX / UI",
      "intitule": "Limiter notifications + permettre désactivation",
      "statut": "non applicable",
      "preuve": "Site vitrine sans push notifications",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "4.14",
      "famille": "UX / UI",
      "intitule": "Pas de dark patterns",
      "statut": "ok",
      "preuve": "Pas de faux boutons fermer, pas d'urgence factice",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "4.15",
      "famille": "UX / UI",
      "intitule": "Mode éco / contrôle utilisateur sur impacts",
      "statut": "à étoffer",
      "preuve": "Audit 2026-05-27 : bouton 'Arrêter l'animation' présent sur le footer = contrôle utilisateur granulaire. À documenter explicitement comme 'mode éco partiel' plutôt que toggle global. Le contrôle utilisateur reste exigible, indépendamment du poids global du site.",
      "mesureObligatoire": true,
      "validationCroisee": [
        "4.1",
        "4.6",
        "4.7"
      ]
    },
    {
      "id": "5.1",
      "famille": "Contenus",
      "intitule": "Format image adapté au contenu et contexte",
      "statut": "ok",
      "preuve": "Audit 2026-05-27 : pipeline AVIF/WebP/MP4 multi-source. Astro optimizeHtmlImages actif (920 images WebP). AVIF présent sur footer-anim (codec av1).",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "5.2",
      "famille": "Contenus",
      "intitule": "Compression image adaptée",
      "statut": "ok",
      "preuve": "Audit 2026-05-27 (`find dist/img -size +200k`) : aucune image dépasse. Max = team-outdoor.webp 147 Ko (page identité, sous seuil). 3 vidéos MP4 blog 280-432 Ko = média informationnel (captures Miro/Spline).",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "5.3",
      "famille": "Contenus",
      "intitule": "Définition vidéo adaptée",
      "statut": "non applicable",
      "preuve": "Les vidéos sont hébergées par des tiers (Vimeo derrière façade, une YouTube en iframe) : leur définition et leur encodage ne dépendent pas d'Akiani.",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "5.4",
      "famille": "Contenus",
      "intitule": "Compression vidéo adaptée",
      "statut": "non applicable",
      "preuve": "Idem 5.3",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "5.5",
      "famille": "Contenus",
      "intitule": "Mode écoute seule pour vidéos",
      "statut": "non applicable",
      "preuve": "Idem 5.3",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "5.6",
      "famille": "Contenus",
      "intitule": "Compression audio adaptée",
      "statut": "non applicable",
      "preuve": "Aucun audio",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "5.7",
      "famille": "Contenus",
      "intitule": "Format de fichier adapté pour les documents",
      "statut": "à valider",
      "preuve": "Tout PDF téléchargeable depuis akiani.fr doit passer la checklist : ne contenir que le contenu nécessaire, images compressées, polices système ou sous-settées, annotations purgées, export optimisé.",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "5.8",
      "famille": "Contenus",
      "intitule": "Stratégie d'archivage/suppression contenus obsolètes",
      "statut": "à étoffer",
      "preuve": "Mettre en place un content pruning trimestriel : analytics → identifier les pages à faible valeur (ex. seuil < 10 visites/trimestre) → décision archive / fusion / dépublication, et tenir un journal des suppressions.",
      "mesureObligatoire": false,
      "validationCroisee": [
        "1.6"
      ]
    },
    {
      "id": "6.1",
      "famille": "Frontend",
      "intitule": "Poids max + limite requêtes par écran",
      "statut": "à valider",
      "preuve": "Budgets first-load (cible 500/régression 1500) + subsequent (cible 50/régression 200). Mesure sur les 12 archétypes.",
      "mesureObligatoire": true,
      "validationCroisee": []
    },
    {
      "id": "6.2",
      "famille": "Frontend",
      "intitule": "Mécanismes de cache pour contenus transférés",
      "statut": "ok",
      "preuve": "Headers OVH vérifiés en prod le 27 mai 2026. Le HTML n'est pas mis en cache (régénéré à chaque déploiement). Les assets statiques (CSS, JS, polices, JSON) sont servis avec Cache-Control max-age=31536000 (un an). L'invalidation passe par un cache-buster injecté automatiquement sur chaque référence CSS/JS au build, donc un nouveau déploiement force le rafraîchissement sans purger le cache navigateur des autres ressources.",
      "mesureObligatoire": false,
      "validationCroisee": [
        "3.6",
        "6.5"
      ]
    },
    {
      "id": "6.3",
      "famille": "Frontend",
      "intitule": "Compression des ressources transférées",
      "statut": "ok",
      "preuve": "Vérifié en prod le 27 mai 2026 : OVH renvoie Content-Encoding gzip sur tout (HTML, CSS, JS, woff2, JSON). Pour le bundle home, ça donne 24 Ko transférés contre 72 Ko bruts, soit un ratio de 3. Les fichiers .gz pré-générés à côté des originaux sont servis directement par mod_deflate sans recompression à chaque requête.",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "6.4",
      "famille": "Frontend",
      "intitule": "Dimensions image = dimensions d'affichage",
      "statut": "à étoffer",
      "preuve": "Audit multi-dpr instrumenté le 28 mai 2026 sur 12 archétypes (183 images, viewport desktop dpr=1 + viewport mobile dpr=2). Classification : 2 sources réellement surdimensionnées même à dpr 2 mobile (mountain-bg.webp ratio linéaire 3.84×, decor__group-photo.avif ratio linéaire 2.74×) → réexport prévu (cf. AC-011). 6 images sans srcset alors que le composant Astro devrait en générer un (3 hero EDC savoir-faire, illustration-limits research, team-outdoor identité, lab hero + dark-mode-1) → cause racine identifiée (glob mal résolu + glob eager:false dans OptimizedCardImage), fix prévu (cf. AC-011). 8 thumbs blog-index avec srcset présent mais sizes mal calibré (ratio linéaire 1.53× = ~50 % trop large à dpr 1) → recalibrage BlogCard. 1 cas légitime de cover-crop (carousel tab-1.webp identité, aspect 2.74 vs 0.80). 39 SVG icônes avec attributs width/height parasites (icon-ux, icon-research, icon-ui, icon-link), sans impact poids mais à nettoyer.",
      "mesureObligatoire": false,
      "validationCroisee": [
        "5.1",
        "5.2"
      ]
    },
    {
      "id": "6.5",
      "famille": "Frontend",
      "intitule": "Pas de chargement de ressources inutilisées",
      "statut": "à étoffer",
      "preuve": "Audit 2026-05-27 : bundles CSS lourds (style-edc 142 Ko, style-blog-article 135 Ko, style-identite 132 Ko, style-blog 124 Ko brut) suggèrent doublons (components.css concaténé multiple fois). Cf. AC-008. Coverage DevTools sur pages représentatives recommandé.",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "6.6",
      "famille": "Frontend",
      "intitule": "Restreindre capteurs terminal utilisateur",
      "statut": "non applicable",
      "preuve": "Pas de geolocation/camera/mic",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "6.7",
      "famille": "Frontend",
      "intitule": "Ressources statiques sur même domaine",
      "statut": "ok",
      "preuve": "Contrôle du 2026-08-14, <link> et <script> du build : aucun CDN tiers, polices auto-hébergées dans /fonts/, vignettes de façade auto-hébergées dans /_astro/. Les seuls domaines externes appelés sont player.vimeo.com, au clic seulement, et youtube.com sur un article, au défilement (cf. 4.4).",
      "mesureObligatoire": false,
      "validationCroisee": [
        "2.10",
        "4.4"
      ]
    },
    {
      "id": "7.1",
      "famille": "Backend",
      "intitule": "Cache serveur pour données les plus utilisées",
      "statut": "non applicable",
      "preuve": "Site 100 % statique pré-buildé Astro. Pas de cache serveur applicatif.",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "7.2",
      "famille": "Backend",
      "intitule": "Durées de conservation données et documents",
      "statut": "à étoffer",
      "preuve": "Le formulaire de contact est le seul traitement du site. Les messages ne sont stockés nulle part sur le serveur : contact.php les relaie par mail vers hello@akiani.fr, boîte fournie par Google Workspace. Conservation exprimée par critères et non par durée fixe, comme le permet l'article 13-2-a du RGPD : le temps de traiter la demande et la relation qui peut en découler, le temps d'étudier le profil pour une candidature. Formulation alignée sur la politique de confidentialité (arbitrage du 2026-08-14). Reste à ouvrir : une purge périodique effective de la boîte.",
      "mesureObligatoire": false,
      "validationCroisee": [
        "1.6"
      ]
    },
    {
      "id": "7.3",
      "famille": "Backend",
      "intitule": "Informer utilisateur d'un traitement en arrière-plan",
      "statut": "non applicable",
      "preuve": "Pas de traitement asynchrone côté client",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "7.4",
      "famille": "Backend",
      "intitule": "Mécanisme de consensus minimisant ressources",
      "statut": "non applicable",
      "preuve": "Pas de blockchain/consensus distribué",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "8.1",
      "famille": "Hébergement",
      "intitule": "Hébergeur ayant démarche de réduction d'empreinte",
      "statut": "à étoffer",
      "preuve": "OVH n'est PAS dans liste CoC européen JRC (vérifié 2026-05-27). Documenter alternative : Climate Active OVH, ISO 14001 mutualisé, rapport RSE.",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "8.2",
      "famille": "Hébergement",
      "intitule": "Politique de gestion durable des équipements (hébergeur)",
      "statut": "à étoffer",
      "preuve": "Attestation OVH : cycle de vie matériel, recyclage, taux de reconditionnement",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "8.3",
      "famille": "Hébergement",
      "intitule": "PUE minimisé",
      "statut": "à étoffer",
      "preuve": "PUE OVH groupe ≈ 1.28. Granularité par DC mutualisé non disponible (admis comme limite).",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "8.4",
      "famille": "Hébergement",
      "intitule": "WUE minimisé",
      "statut": "à étoffer",
      "preuve": "WUE OVH non publié. À demander OVH ou admettre limite.",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "8.5",
      "famille": "Hébergement",
      "intitule": "Électricité documentée et majoritairement renouvelable",
      "statut": "à étoffer",
      "preuve": "Roubaix/Strasbourg sur réseau ENEDIS mix français ≈ 21 g CO₂eq/kWh. Documenter quantité contractualisée et mix réel.",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "8.6",
      "famille": "Hébergement",
      "intitule": "Localisation géographique cohérente",
      "statut": "à valider",
      "preuve": "OVH France (Roubaix/Strasbourg) cohérent avec visiteurs FR/EU",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "8.7",
      "famille": "Hébergement",
      "intitule": "Traitement efficace de la chaleur (hébergeur)",
      "statut": "à étoffer",
      "preuve": "OVH Roubaix : water-cooling. Récupération chaleur réseau Hauts-de-France ?",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "8.8",
      "famille": "Hébergement",
      "intitule": "Données chaudes/froides distinctes",
      "statut": "non applicable",
      "preuve": "Site statique pas de DB",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "8.9",
      "famille": "Hébergement",
      "intitule": "Duplication données uniquement si nécessaire",
      "statut": "à étoffer",
      "preuve": "SLA OVH mutualisé à documenter. Pas de réplication multi-DC par défaut sur mutualisé.",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "8.10",
      "famille": "Hébergement",
      "intitule": "Décalage temporel calculs asynchrones",
      "statut": "non applicable",
      "preuve": "Pas de calcul asynchrone applicatif",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "9.1",
      "famille": "Algorithmie",
      "intitule": "Nécessité phase d'entraînement interrogée",
      "statut": "non applicable",
      "preuve": "Aucun modèle IA dans le service",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "9.2",
      "famille": "Algorithmie",
      "intitule": "Complexité phase d'apprentissage minimisée",
      "statut": "non applicable",
      "preuve": "Idem 9.1",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "9.3",
      "famille": "Algorithmie",
      "intitule": "Limitation quantité d'entraînement",
      "statut": "non applicable",
      "preuve": "Idem 9.1",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "9.4",
      "famille": "Algorithmie",
      "intitule": "Limitation données d'apprentissage",
      "statut": "non applicable",
      "preuve": "Idem 9.1",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "9.5",
      "famille": "Algorithmie",
      "intitule": "Occurrence mise à jour modèles optimisée",
      "statut": "non applicable",
      "preuve": "Idem 9.1",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "9.6",
      "famille": "Algorithmie",
      "intitule": "Compression des modèles",
      "statut": "non applicable",
      "preuve": "Idem 9.1",
      "mesureObligatoire": false,
      "validationCroisee": []
    },
    {
      "id": "9.7",
      "famille": "Algorithmie",
      "intitule": "Stratégie d'inférence optimisée",
      "statut": "non applicable",
      "preuve": "Idem 9.1",
      "mesureObligatoire": false,
      "validationCroisee": []
    }
  ],
  "servicesTiers": [
    {
      "nom": "Vimeo (derrière façade)",
      "usage": "vidéos de présentation, 24 pages",
      "activation": "vignette auto-hébergée, iframe player.vimeo.com posée au clic uniquement",
      "domaine": "player.vimeo.com",
      "poids": "0 Ko tant que l'internaute ne clique pas",
      "statut": "actif"
    },
    {
      "nom": "YouTube (iframe brute)",
      "usage": "replay de la conférence Weezdays, un article de blog en FR et en EN",
      "activation": "aucune, l'iframe se charge au défilement (loading=lazy)",
      "domaine": "www.youtube.com",
      "poids": "chargement du lecteur YouTube",
      "statut": "à corriger (AC-012)"
    }
  ],
  "fournisseurs": [
    {
      "nom": "OVH",
      "perimetre": "hébergement mutualisé",
      "engagementEnv": "Climate Active à documenter, ISO 14001/50001 par DC à confirmer",
      "pue": "1.28 groupe (granularité DC non publiée)",
      "wue": "non publié",
      "origineElec": "mix français ENEDIS ≈ 21 g CO₂eq/kWh",
      "localisation": "France (Roubaix/Strasbourg)",
      "cocEuropeen": false
    }
  ],
  "actionsCorrectives": [
    {
      "id": "AC-001",
      "criteres": [
        "1.3"
      ],
      "description": "Désigner référent + suppléant écoconception. Référent désigné le 2026-08-14 : Sébastien Klifa, également référent accessibilité numérique. Reste à nommer le suppléant. Échéance révisée, l'échéance initiale du 1er juillet ayant glissé de six semaines.",
      "echeance": "2026-09-30",
      "statut": "in_progress"
    },
    {
      "id": "AC-002",
      "criteres": [
        "1.1"
      ],
      "description": "Documenter les 9 réponses Designers Éthiques + arbre de conséquences ADEME",
      "echeance": "2026-07-15",
      "statut": "open"
    },
    {
      "id": "AC-003",
      "criteres": [
        "1.4",
        "1.5"
      ],
      "description": "Formaliser la cadence d'audit interne d'écoconception + fixer cible chiffrée EcoIndex",
      "echeance": "2026-06-15",
      "statut": "open"
    },
    {
      "id": "AC-004",
      "criteres": [
        "8.1",
        "8.2",
        "8.3",
        "8.4",
        "8.5"
      ],
      "description": "Compléter le dossier hébergeur OVH (Climate Active, ISO, PUE, électricité)",
      "echeance": "2026-08-01",
      "statut": "open"
    },
    {
      "id": "AC-005",
      "criteres": [
        "4.15"
      ],
      "description": "Décision : refonte sobre (palette + animation) OU implémentation toggle mode éco fonctionnel",
      "echeance": "2026-09-01",
      "statut": "open"
    },
    {
      "id": "AC-006",
      "criteres": [
        "6.1"
      ],
      "description": "Lancer premier audit complet EcoIndex × 3 passes (nominal, 3G, 4G P75) sur les 12 archétypes",
      "echeance": "2026-06-15",
      "statut": "open"
    },
    {
      "id": "AC-007",
      "criteres": [
        "4.6",
        "4.7"
      ],
      "description": "Décider : conserver footer-anim + hero-anim (décoratives, ~170 Ko) ou retirer. Si conserver, documenter explicitement la non-conformité assumée 4.6 + le contrôle 4.15 (bouton arrêt).",
      "echeance": "2026-09-01",
      "statut": "open"
    },
    {
      "id": "AC-008",
      "criteres": [
        "6.5"
      ],
      "description": "Audit bundles CSS : vérifier que components.css n'est pas concaténé plusieurs fois (style-edc 142 Ko, style-blog-article 135 Ko, style-identite 132 Ko semblent gonflés). Lancer Coverage DevTools sur les 3 archétypes les plus lourds.",
      "echeance": "2026-07-15",
      "statut": "open"
    },
    {
      "id": "AC-009",
      "criteres": [
        "6.1"
      ],
      "description": "Optimiser blog/fr/ux-days-2025-resume-de-la-journee-dateliers (seule page mesurée sous grade B, score 68.9 C — DOM 549, 13 req, 804 Ko). Réduire DOM (sections h2/h3 redondantes ?) et compresser hero (115 Ko cover).",
      "echeance": "2026-07-15",
      "statut": "open"
    },
    {
      "id": "AC-010",
      "criteres": [
        "1.4",
        "6.1"
      ],
      "description": "Compléter le script d'audit EcoIndex pour produire automatiquement les 3 passes (nominal, 3G rurale 144 Kbps, 4G P75 9 Mbps avec 100 ms de latence) avec throttling CPU sur l'ensemble des archétypes.",
      "echeance": "2026-06-30",
      "statut": "open"
    },
    {
      "id": "AC-012",
      "criteres": [
        "4.4",
        "2.10"
      ],
      "description": "Poser une façade sur l'iframe YouTube de l'article Weezdays (FR + EN), sur le modèle des 24 façades Vimeo déjà en place : vignette auto-hébergée, iframe chargée au clic. Ouverte le 2026-08-14, après le constat que la façade YouTube décrite depuis mai n'existait pas.",
      "echeance": "2026-09-30",
      "statut": "open"
    },
    {
      "id": "AC-011",
      "criteres": [
        "6.4",
        "5.1",
        "5.2"
      ],
      "description": "Compléter le pipeline d'images responsives (srcset + sizes ou descriptors 1x/2x) sur les composants qui servaient une seule taille de fichier. Fixes appliqués le 28 mai 2026 : (a) src/pages/savoir-faire.astro — ajout de widths/sizes sur les 3 hero EDC (preset project-card) et sur mountain-bg.webp (5 variantes 750→2880, sizes 100vw) ; (b) BlogCard.astro — nouveau prop variant ('featured-large' | 'compact'), sizes/widths adaptés à la grille blog (1366px → 413px en compact, 849px en featured-large), blog.astro mis à jour pour passer le bon variant à chaque card des rows featured/featured-reversed ; (c) decor__group-photo identité — génération d'une variante 884×414 (~17 Ko webp, ~23 Ko avif), srcset 1x/2x ajouté au <picture> existant (FR + EN) ; (d) 4 SVG nettoyés des attributs width/height parasites quand l'usage HTML déclarait des dimensions explicites (404/sticker, blog/hero-decor, lab/hero-decor, lab/pattern-lab). Limites : illustration-limits.avif (research/ux-design/ui-design), team-outdoor.webp (identité), lab hero + dark-mode-1.webp restent hors pipeline Astro Image — refactor plus risqué reporté. Pole-emploi.svg (logo dynamique sans attrs HTML) skip. 8 thumbs blog seront mesurés au prochain audit après build.",
      "echeance": "2026-07-31",
      "statut": "in_progress"
    }
  ],
  "limites": [
    "Audit interne, mené par l'outillage maison Akiani. Pas encore d'audit externe par un cabinet spécialisé.",
    "Les mesures EcoIndex sont calculées en local via Chrome DevTools Protocol, pas par un passage officiel sur ecoindex.fr après chaque déploiement.",
    "L'audit du 27 mai 2026 n'a couvert que la passe nominale. Les passes mobile 3G rurale et mobile 4G P75 sur terminal d'entrée de gamme représentatif (9 Mbps, 100 ms de latence) sont reportées à AC-010 le temps de compléter l'outillage.",
    "L'audit EcoIndex global sur les 347 pages n'a pas été finalisé à cette date (durée de traitement estimée au-dessus de 30 minutes). 15 archétypes ont été échantillonnés, ce qui couvre les principaux templates.",
    "L'audit dimensions image (taille intrinsèque vs taille d'affichage, RGESN 6.4) a été instrumenté le 28 mai 2026 sur 12 archétypes en multi-dpr (desktop dpr 1 et mobile dpr 2), avec classification automatique en quatre buckets : true-oversized, retina-no-srcset, cover-crop, svg-attrs-parasites.",
    "Pour la famille Algorithmie (9.1 à 9.7), tout est non applicable : aucun modèle de machine learning ou d'inférence IA n'intervient dans le service.",
    "Côté hébergeur OVH, le PUE et le WUE sont publiés au niveau du groupe seulement, pas par datacenter mutualisé. Ces chiffres sont repris en l'état, avec leur limite de granularité.",
    "Le référent écoconception est désigné depuis le 2026-08-14 (Sébastien Klifa). Son suppléant reste à nommer (AC-001).",
    "Les animations footer et hero de la home sont décoratives. Elles sont marquées non conformes au critère 4.6, avec une mitigation par le contrôle utilisateur (bouton 'Arrêter l'animation') côté 4.15."
  ]
}