{
  "version": "V4",
  "date": "2026-09-11",
  "scope": "Vérification de la livraison locale. Positions SEO, citations IA et serveur de production non mesurés.",
  "timezones": {
    "version": "IANA 2026c",
    "zones": 46,
    "provenance": "Archive IANA complète compilée avec zic"
  },
  "php": {
    "version": "8.3.6",
    "assertions": 1211
  },
  "javascript": {
    "assertions": 1625,
    "maxDifferenceWithPhpMs": 0
  },
  "edgeCases": {
    "assertions": 285,
    "scenarios": [
      "dates impossibles et hors période",
      "plages indépendantes",
      "minuit et dates distinctes",
      "heure manquante",
      "heure répétée avec offsets",
      "intervalle interrompu au retour d’heure",
      "ligne de changement de date",
      "ICS UTC, CRLF, échappement et pliage UTF-8"
    ],
    "errors": []
  },
  "totalEngineAssertions": 3121,
  "solar": {
    "reference": "US Naval Observatory API 4.0.1",
    "source": "https://aa.usno.navy.mil/data/RS_OneDay",
    "method": "Comparaison des événements sur la même date UTC, aux coordonnées du retour USNO. Données USNO arrondies à la minute.",
    "cases": 67,
    "maxDifferenceMinutes": 0.517,
    "comparisons": [
      {
        "city": "honolulu",
        "date": "2026-03-20",
        "event": "set",
        "deltaMinutes": 0.267
      },
      {
        "city": "honolulu",
        "date": "2026-03-20",
        "event": "rise",
        "deltaMinutes": 0.167
      },
      {
        "city": "honolulu",
        "date": "2026-03-20",
        "event": "noon",
        "deltaMinutes": 0.267
      },
      {
        "city": "honolulu",
        "date": "2026-06-21",
        "event": "set",
        "deltaMinutes": 0.083
      },
      {
        "city": "honolulu",
        "date": "2026-06-21",
        "event": "rise",
        "deltaMinutes": 0.383
      },
      {
        "city": "honolulu",
        "date": "2026-06-21",
        "event": "noon",
        "deltaMinutes": 0.35
      },
      {
        "city": "honolulu",
        "date": "2026-09-11",
        "event": "set",
        "deltaMinutes": 0.1
      },
      {
        "city": "honolulu",
        "date": "2026-09-11",
        "event": "rise",
        "deltaMinutes": 0.417
      },
      {
        "city": "honolulu",
        "date": "2026-09-11",
        "event": "noon",
        "deltaMinutes": 0.083
      },
      {
        "city": "honolulu",
        "date": "2026-12-21",
        "event": "set",
        "deltaMinutes": 0.35
      },
      {
        "city": "honolulu",
        "date": "2026-12-21",
        "event": "rise",
        "deltaMinutes": 0.4
      },
      {
        "city": "honolulu",
        "date": "2026-12-21",
        "event": "noon",
        "deltaMinutes": 0.283
      },
      {
        "city": "montreal",
        "date": "2026-03-20",
        "event": "rise",
        "deltaMinutes": 0.2
      },
      {
        "city": "montreal",
        "date": "2026-03-20",
        "event": "noon",
        "deltaMinutes": 0.367
      },
      {
        "city": "montreal",
        "date": "2026-03-20",
        "event": "set",
        "deltaMinutes": 0.117
      },
      {
        "city": "montreal",
        "date": "2026-06-21",
        "event": "set",
        "deltaMinutes": 0.517
      },
      {
        "city": "montreal",
        "date": "2026-06-21",
        "event": "rise",
        "deltaMinutes": 0.467
      },
      {
        "city": "montreal",
        "date": "2026-06-21",
        "event": "noon",
        "deltaMinutes": 0.133
      },
      {
        "city": "montreal",
        "date": "2026-09-11",
        "event": "rise",
        "deltaMinutes": 0.083
      },
      {
        "city": "montreal",
        "date": "2026-09-11",
        "event": "noon",
        "deltaMinutes": 0.167
      },
      {
        "city": "montreal",
        "date": "2026-09-11",
        "event": "set",
        "deltaMinutes": 0.067
      },
      {
        "city": "montreal",
        "date": "2026-12-21",
        "event": "rise",
        "deltaMinutes": 0.317
      },
      {
        "city": "montreal",
        "date": "2026-12-21",
        "event": "noon",
        "deltaMinutes": 0.433
      },
      {
        "city": "montreal",
        "date": "2026-12-21",
        "event": "set",
        "deltaMinutes": 0.45
      },
      {
        "city": "paris",
        "date": "2026-03-20",
        "event": "rise",
        "deltaMinutes": 0.317
      },
      {
        "city": "paris",
        "date": "2026-03-20",
        "event": "noon",
        "deltaMinutes": 0.017
      },
      {
        "city": "paris",
        "date": "2026-03-20",
        "event": "set",
        "deltaMinutes": 0.267
      },
      {
        "city": "paris",
        "date": "2026-06-21",
        "event": "rise",
        "deltaMinutes": 0.067
      },
      {
        "city": "paris",
        "date": "2026-06-21",
        "event": "noon",
        "deltaMinutes": 0.4
      },
      {
        "city": "paris",
        "date": "2026-06-21",
        "event": "set",
        "deltaMinutes": 0.117
      },
      {
        "city": "paris",
        "date": "2026-09-11",
        "event": "rise",
        "deltaMinutes": 0.333
      },
      {
        "city": "paris",
        "date": "2026-09-11",
        "event": "noon",
        "deltaMinutes": 0.233
      },
      {
        "city": "paris",
        "date": "2026-09-11",
        "event": "set",
        "deltaMinutes": 0.183
      },
      {
        "city": "paris",
        "date": "2026-12-21",
        "event": "rise",
        "deltaMinutes": 0.25
      },
      {
        "city": "paris",
        "date": "2026-12-21",
        "event": "noon",
        "deltaMinutes": 0.35
      },
      {
        "city": "paris",
        "date": "2026-12-21",
        "event": "set",
        "deltaMinutes": 0.05
      },
      {
        "city": "sydney",
        "date": "2026-03-20",
        "event": "noon",
        "deltaMinutes": 0.283
      },
      {
        "city": "sydney",
        "date": "2026-03-20",
        "event": "set",
        "deltaMinutes": 0.067
      },
      {
        "city": "sydney",
        "date": "2026-03-20",
        "event": "rise",
        "deltaMinutes": 0.283
      },
      {
        "city": "sydney",
        "date": "2026-06-21",
        "event": "noon",
        "deltaMinutes": 0.117
      },
      {
        "city": "sydney",
        "date": "2026-06-21",
        "event": "set",
        "deltaMinutes": 0.183
      },
      {
        "city": "sydney",
        "date": "2026-06-21",
        "event": "rise",
        "deltaMinutes": 0.167
      },
      {
        "city": "sydney",
        "date": "2026-09-11",
        "event": "noon",
        "deltaMinutes": 0.05
      },
      {
        "city": "sydney",
        "date": "2026-09-11",
        "event": "set",
        "deltaMinutes": 0.233
      },
      {
        "city": "sydney",
        "date": "2026-09-11",
        "event": "rise",
        "deltaMinutes": 0.267
      },
      {
        "city": "sydney",
        "date": "2026-12-21",
        "event": "noon",
        "deltaMinutes": 0.017
      },
      {
        "city": "sydney",
        "date": "2026-12-21",
        "event": "set",
        "deltaMinutes": 0.417
      },
      {
        "city": "sydney",
        "date": "2026-12-21",
        "event": "rise",
        "deltaMinutes": 0.117
      },
      {
        "city": "tokyo",
        "date": "2026-03-20",
        "event": "noon",
        "deltaMinutes": 0.067
      },
      {
        "city": "tokyo",
        "date": "2026-03-20",
        "event": "set",
        "deltaMinutes": 0.3
      },
      {
        "city": "tokyo",
        "date": "2026-03-20",
        "event": "rise",
        "deltaMinutes": 0.317
      },
      {
        "city": "tokyo",
        "date": "2026-06-21",
        "event": "noon",
        "deltaMinutes": 0.133
      },
      {
        "city": "tokyo",
        "date": "2026-06-21",
        "event": "set",
        "deltaMinutes": 0.45
      },
      {
        "city": "tokyo",
        "date": "2026-06-21",
        "event": "rise",
        "deltaMinutes": 0.033
      },
      {
        "city": "tokyo",
        "date": "2026-09-11",
        "event": "noon",
        "deltaMinutes": 0.183
      },
      {
        "city": "tokyo",
        "date": "2026-09-11",
        "event": "set",
        "deltaMinutes": 0.133
      },
      {
        "city": "tokyo",
        "date": "2026-09-11",
        "event": "rise",
        "deltaMinutes": 0.4
      },
      {
        "city": "tokyo",
        "date": "2026-12-21",
        "event": "noon",
        "deltaMinutes": 0.267
      },
      {
        "city": "tokyo",
        "date": "2026-12-21",
        "event": "set",
        "deltaMinutes": 0.467
      },
      {
        "city": "tokyo",
        "date": "2026-12-21",
        "event": "rise",
        "deltaMinutes": 0.483
      },
      {
        "city": "tromso",
        "date": "2026-03-20",
        "event": "rise",
        "deltaMinutes": 0.133
      },
      {
        "city": "tromso",
        "date": "2026-03-20",
        "event": "noon",
        "deltaMinutes": 0.383
      },
      {
        "city": "tromso",
        "date": "2026-03-20",
        "event": "set",
        "deltaMinutes": 0.45
      },
      {
        "city": "tromso",
        "date": "2026-06-21",
        "event": "noon",
        "deltaMinutes": 0.017
      },
      {
        "city": "tromso",
        "date": "2026-09-11",
        "event": "rise",
        "deltaMinutes": 0.25
      },
      {
        "city": "tromso",
        "date": "2026-09-11",
        "event": "noon",
        "deltaMinutes": 0.167
      },
      {
        "city": "tromso",
        "date": "2026-09-11",
        "event": "set",
        "deltaMinutes": 0.05
      }
    ]
  },
  "syntax": {
    "phpFiles": 341,
    "jsModules": 4,
    "errors": []
  },
  "http": {
    "pages": 330,
    "reachablePages": 330,
    "maxClicksFromHome": 3,
    "uniqueTitles": 330,
    "uniqueDescriptions": 330,
    "duplicateArticleHeadings": [],
    "uniqueLocalAndExternalReferences": 1476,
    "largestHtmlBytes": 27601,
    "errors": [],
    "downloads": {
      "/exports/soleil.php?ville=paris&annee=2026": 366,
      "/exports/soleil.php?ville=paris&annee=2024": 367,
      "/exports/decalages.php?de=paris&vers=montreal&annee=2026": 6
    }
  },
  "browser": {
    "browser": "Chromium 151",
    "pages": [
      {
        "path": "/",
        "width": 1440,
        "overflow": false,
        "brokenImages": [],
        "clocks": 0
      },
      {
        "path": "/heure/",
        "width": 1440,
        "overflow": false,
        "brokenImages": [],
        "clocks": 0
      },
      {
        "path": "/heure/france/paris.php",
        "width": 1440,
        "overflow": false,
        "brokenImages": [],
        "clocks": 1
      },
      {
        "path": "/soleil/france/paris.php",
        "width": 1440,
        "overflow": false,
        "brokenImages": [],
        "clocks": 0
      },
      {
        "path": "/decalage-horaire/paris-montreal.php",
        "width": 1440,
        "overflow": false,
        "brokenImages": [],
        "clocks": 0
      },
      {
        "path": "/miroir/",
        "width": 1440,
        "overflow": false,
        "brokenImages": [],
        "clocks": 0
      },
      {
        "path": "/miroir/11h11.php",
        "width": 1440,
        "overflow": false,
        "brokenImages": [],
        "clocks": 0
      },
      {
        "path": "/heures-creuses/",
        "width": 1440,
        "overflow": false,
        "brokenImages": [],
        "clocks": 0
      },
      {
        "path": "/outils/duree-entre-deux-heures.php",
        "width": 1440,
        "overflow": false,
        "brokenImages": [],
        "clocks": 0
      },
      {
        "path": "/outils/planifier-appel-international.php",
        "width": 1440,
        "overflow": false,
        "brokenImages": [],
        "clocks": 0
      },
      {
        "path": "/",
        "width": 390,
        "overflow": false,
        "brokenImages": [],
        "clocks": 0
      },
      {
        "path": "/heure/",
        "width": 390,
        "overflow": false,
        "brokenImages": [],
        "clocks": 0
      },
      {
        "path": "/heure/france/paris.php",
        "width": 390,
        "overflow": false,
        "brokenImages": [],
        "clocks": 1
      },
      {
        "path": "/soleil/france/paris.php",
        "width": 390,
        "overflow": false,
        "brokenImages": [],
        "clocks": 0
      },
      {
        "path": "/decalage-horaire/paris-montreal.php",
        "width": 390,
        "overflow": false,
        "brokenImages": [],
        "clocks": 0
      },
      {
        "path": "/miroir/",
        "width": 390,
        "overflow": false,
        "brokenImages": [],
        "clocks": 0
      },
      {
        "path": "/miroir/11h11.php",
        "width": 390,
        "overflow": false,
        "brokenImages": [],
        "clocks": 0
      },
      {
        "path": "/heures-creuses/",
        "width": 390,
        "overflow": false,
        "brokenImages": [],
        "clocks": 0
      },
      {
        "path": "/outils/duree-entre-deux-heures.php",
        "width": 390,
        "overflow": false,
        "brokenImages": [],
        "clocks": 0
      },
      {
        "path": "/outils/planifier-appel-international.php",
        "width": 390,
        "overflow": false,
        "brokenImages": [],
        "clocks": 0
      }
    ],
    "errors": []
  },
  "userJourneys": {
    "passed": [
      "Panne JSON : menu et calcul simple fonctionnent",
      "Panne JSON : formulaire de contact reste utilisable",
      "Panne fuseaux seule : recherche des villes utilisable",
      "Soleil : date choisie cohérente et conservée au rechargement",
      "Soleil : référence datée avec méthode et URL",
      "Soleil : année conserve la date et canonique stable",
      "Soleil : dates invalides et paramètres non scalaires refusés",
      "Soleil : fin de période bornée au 30 décembre",
      "Recherche soleil : destination solaire, alias et clavier",
      "Agenda : minuit, dates locales, téléchargement et données ICS",
      "Agenda : ancien résultat retiré après changement de réglage",
      "Date passée par URL non écrasée après synchronisation",
      "Absence de débordement des nouveaux résultats",
      "Sans JavaScript : navigation mobile accessible",
      "Sans JavaScript : recherche serveur avec caractères accentués",
      "Sans JavaScript : calendrier à une autre date"
    ],
    "errors": []
  },
  "architecture": {
    "physicalPhpPages": true,
    "frontController": false,
    "bootstrap": false,
    "sitemaps": 1,
    "indexableUrls": 330
  },
  "limits": [
    "Contrôles réalisés en PHP 8.3.6 et Chromium 151, sous serveur PHP local.",
    "Les images et débordements ont été contrôlés sur 10 routes en 1440 px et 390 px ; les parcours ciblés ajoutent les usages dégradés.",
    "La comparaison USNO porte sur 67 événements ; elle ne garantit pas toutes les situations astronomiques ni la visibilité sur le terrain.",
    "La configuration Apache/Nginx, le temps serveur et les paramètres propres à l’hébergeur demandent un contrôle en production.",
    "Aucun classement ni citation par un moteur ou une IA n’est garanti."
  ]
}