# LÉZIDÉJOU — Plan d'exécution normatif de la phase 1

Version consolidée — 11 août 2026

> **Note de renommage.** LÉZIDÉJOU est le nouveau nom de la plateforme précédemment documentée sous le nom ETBEUR. Cette mention historique ne réactive aucun ancien chemin, domaine, identifiant ou nom technique.

## Statut du document vivant

- Emplacement normatif : `docs/implementation/phase-1-execplan.md`.
- Ce document remplace tous les plans, corrections et addendums antérieurs de phase 1.
- Il est la source normative et vivante pour l'exécution de la phase 1.
- Le document d'architecture définit la trajectoire à moyen et long terme.
- La charte définit l'identité visuelle, les contenus et l'expérience publique.
- Les fichiers `AGENTS.md` définissent les règles de travail et de sécurité ; ils ne constituent pas une roadmap.
- En cas de contradiction pendant la phase 1, le présent ExecPlan prévaut.
- Toute déviation fonctionnelle, architecturale, de sécurité, de coût ou de dépendance doit être documentée et approuvée avant application.
- Un commit local de checkpoint est autorisé après la validation d'un jalon ; tout push, merge, rebase, tag, pull request, réécriture d'historique, déploiement, migration destructive ou modification d'un dépôt sous `sources/` reste strictement interdit sans autorisation explicite.

Pendant l'implémentation autorisée, le document doit conserver le plan et mettre à jour des sections de suivi pour : progression, jalon courant, décisions, découvertes, validations, problèmes non résolus et prochain jalon.

## Suivi d'exécution de la phase 1

### Progression
- **Jalon 0 (Inspection et préflight)** : Terminé et validé le 11 août 2026.
- **Jalon 1 (Fusion prudente du squelette Laravel)** : Terminé et validé le 11 août 2026 (commit `b7462cf950c6d3bf6298b2376d84d41a29674851`).
- **Jalon 2 (Dépendances, environnement et domaines)** : Terminé et validé le 11 août 2026 (commit `634822f9ac52f31aceff03224702ef32fed407a7`).
- **Checkpoint documentaire post-jalon 2** : Effectué le 11 août 2026 (commit `90bb7fafaa159f3cdf80c51d1cc901e81c38167c`), ayant aligné le suivi vivant, la politique de commits locaux et les décisions Node.js / SQLite déjà validées.
- **Jalon 3 (Catalogue, routes et navigation)** : Terminé et validé le 12 août 2026 (commit de référence `d93ececef06e5f67d90bbfaccc1ec84b8655be8a`).
- **Jalon 4 (Interface, SEO et accessibilité)** : Terminé et validé le 12 août 2026 (commit de référence `79541ede99aa9a15eb967ef22599d741e9f1fde5`).
- **Jalon 5 (Filament, administrateur et TOTP)** : Terminé et validé le 13 août 2026.
- **Jalon 6 (SQLite, MySQL 8.4 et navigateur)** : Terminé et validé le 13 août 2026 (commit `2fb51577fc3c195513ef326b216a17c06489c69a`).
- **Jalon 7 (Lighthouse et CI GitHub Actions)** : Terminé et validé le 13 août 2026.
- **Jalon 8 (Documentation et compte rendu)** : Terminé et validé le 14 août 2026.
- **Jalon N2-1A (Préparation des décisions éditoriales Niveau 2)** : Préparé et validé le 15 août 2026.
- **Jalon N2-1B (Finalisation des contenus éditoriaux validés)** : Implémenté, testé et validé le 15 août 2026 (commit `fd15152bc18819ea3a0b62948be8534acee847c0`).
- **Jalon N2-1 (Contenus éditoriaux, catalogue et profil GitHub)** : Terminé et validé le 15 août 2026 après revue indépendante, validation des deux CI distantes et confirmation du pilotage.
- **Jalon N2-2 (Projets, visuels sobres et statut GoodGasoilPrice)** : Implémenté, testé et validé le 18 août 2026 (GoodGasoilPrice publié avec CTA public transitoire Railway et lien source distincts, 4 autres projets en développement, compositions textuelles sobres sans asset fictif).
- **Jalon N2-3 (Musique et Boutique)** : Implémenté, testé et validé le 18 août 2026 (4 liens officiels Joanto sans iframe ni script tiers, présentation sobre SerajoPrints avec 1 création réelle et liens Etsy différés du portail public sans CTA commercial).
- **Jalon N2-4 (Mentions légales, politique de confidentialité, coordonnées hébergeur OVHcloud, contact et correction collision robots.txt)** : Implémenté, testé et validé le 19 août 2026 (mentions légales conformes LCEN 1-1 II sans divulgation d'identité civile privée, politique de confidentialité factuelle RGPD avec logs techniques et rétention proportionnée sans durée inventée, adresse contact@lezidejou.fr opérationnelle, collision public/robots.txt définitivement résolue par suppression du fichier statique, RobotsController dynamique avec blocage entraînement IA et sitemap canonique).
- **Jalon N2-5 (Recette finale et verdict Niveau 2)** : Implémenté, testé et validé le 20 août 2026 (audit complet des 13 pages publiques, navigation desktop/mobile, responsive 360/768/1024/1440, a11y clavier/zoom 200%, carrousel Joanto Swiper 14 Coverflow en boucle continue validé, suite complète Unit 35/35, Feature 37/37, Integration MySQL 8.4 5/5, Playwright E2E 96/96, Lighthouse CI 10/10 conformes, absence confirmée de routes réservées et de Labo, revue indépendante réussie). Le **Niveau 2 est formellement atteint (GO Niveau 2)**.
- **Jalon N3-0 (Décisions d'infrastructure)** : Terminé et validé le 20 août 2026 (commit `54da09e417f23b015e621dd0757b3b9671b6a242`).
- **Jalon N3-1 (Pipeline CI/CD & script de déploiement)** : Terminé, validé et poussé le 20 août 2026 (commit `3d9d5b2c5dae973eaaf0f09a6edbca27317cf887`).
- **Jalon N3-2 (OVH/env & Secrets)** : Terminé, validé et poussé le 20 août 2026 (commit `e9c5d67401717842b25e677b7e361e7773705093`).
- **Jalon N3-3 (Backup/rollback)** : Terminé, validé et poussé le 20 août 2026 (commit `e323a1eefe9445e22638b85fb53b82bcd19939f9`).
- **Jalon N3-4 (Sécurité & ModSecurity)** : Terminé, validé et poussé le 20 août 2026 (commit `ab323e7e4d785ec91d5f23e25c50cba68b3f5c83`, SecurityHeadersMiddleware, HSTS prudent, forceScheme HTTPS en production, audit isolation Document Root et matrice de recette ModSecurity).

### Jalon courant
- **Jalon N3-6 (Recette/GO)** : En cours après la première release `v1.0.0` effectuée en production le 23 août 2026.

### Prochain jalon
- **Jalon N3-6 (Recette/GO — suite)** : Poursuivre la recette et prononcer le GO de production après validation des contrôles prévus.

### Décisions
1. **Politique de commits Git** : Le workflow du projet adopte la création d'un unique commit local de checkpoint après chaque jalon validé. Le checkpoint local du jalon 4 est autorisé à l'issue de sa validation. Toute réécriture d'historique, push, merge, rebase, tag, pull request ou déploiement reste strictly interdit sans autorisation explicite.
2. **Gestionnaire de dépendances frontend & Node.js** : Node.js 24.19.0 LTS est la version de référence active pour le projet et les builds de validation (`npm run build`). L'éventuelle version Node.js 25.9.0 observée par défaut dans une session sandbox ne constitue pas la version de référence.
3. **Moteur de base de données** : SQLite gère le bootstrap et les tests locaux des jalons 1 à 5. La configuration et les tests sous le moteur MySQL 8.4 représentatif unique (`lezidejou_test`) restent volontairement différés jusqu'au jalon 6.
4. **Statuts et catégories du catalogue** : Good Gasoil Price possède le statut `published` (avec CTA vers son instance publique transitoire et lien source GitHub distincts), tandis que Menu Planner, Belote Pro, Maths & Îles et LivraSign conservent rigoureusement leur statut `in_development` et sont répartis entre `application` et `game`. LivraSign demeure une application indépendante possédant sa fiche éditoriale interne `/projets/livrasign` sans lien externe ni CTA à ce stade.
5. **Polices auto-hébergées et charte graphique** : La police variable `Libre Franklin Variable` (WOFF2 local, axe 100-900 incluant la graisse 650 pour le mot-symbole) et les polices statiques `IBM Plex Mono` (WOFF2 local, graisses 400 et 500 uniquement ; 600 non utilisée retirée) ont été intégrées avec leurs licences `OFL-1.1`.
6. **Politique d'indexation et sitemap par environnement** : Hors environnement de production, l'ensemble des pages est en `noindex,follow`, `robots.txt` interdit l'exploration (`Disallow: /`) et `/sitemap.xml` retourne un XML valide avec un `urlset` vide. En production, les 6 pages éditoriales complètes ainsi que la fiche Good Gasoil Price (statut `published`) sont indexables (7 URLs au sitemap), tandis que les 4 projets `in_development` et les 2 pages juridiques restent en `noindex,follow` et sont exclus du sitemap. Le domaine canonique de production reste à confirmer avant déploiement.
7. **Modèle d'authentification unique et TOTP (12 août 2026)** : `App\Domain\Identity\Models\User` est le seul modèle d'authentification. `App\Models\User` a été supprimé. Le panel `/admin` Filament 5.7.6 exige `is_admin = true` et le TOTP d'application (`AppAuthentication`) avec 8 codes de récupération.
8. **Configuration Lighthouse CI, SEO ajusté & CI GitHub Actions (13–14 août 2026)** : Lighthouse CI est configuré via `lighthouserc.cjs` pour auditer les 10 URL publiques autorisées avec assertions pessimistes strictes. En production, la politique d'indexation actuelle retient 7 URLs indexables dans le sitemap XML (les 6 pages éditoriales et la fiche `published` de Good Gasoil Price), tandis que les 4 fiches de projets `in_development` et les 2 pages légales sont en `noindex,follow` et exclues du sitemap. L'audit Lighthouse `is-crawlable` (qui pénalise par conception le `noindex` à 0.66 brut) est exclu de la seule mesure de laboratoire (`skipAudits: ['is-crawlable']`), tandis que la politique d'indexation exacte (`index,follow` pour les 7 pages indexables, `noindex,follow` pour les 4 projets en cours et 2 pages légales) est validée strictement par la suite Feature (`SeoAccessibilityTest`). Le serveur local de test (`scripts/lighthouse-server.cjs`) génère une `APP_KEY` éphémère en mémoire au lancement, sans secret persistant. La commande publique `npm run test:lighthouse` précharge désormais le point d'entrée CommonJS `lighthouse-win-patch.cjs` au démarrage du processus LHCI réel, par `node --require ./lighthouse-win-patch.cjs ./node_modules/@lhci/cli/src/cli.js autorun` ; aucun `NODE_OPTIONS` n'est modifié pendant le chargement de `lighthouserc.cjs`. La validation dynamique ciblée a confirmé ce préchargement, avec **13/13** tests du patch réussis. Le patch Windows et son module pur (`scripts/lighthouse-win-cleanup.cjs`) restent sans effet fonctionnel hors Windows et strictement confinés au seul format de profil temporaire réel produit par chrome-launcher sous Windows (`^lighthouse\.\d{8}$`), avec canonicalisation physique du dossier parent, rejet des chemins frères tels que `Temp-escape`, imbriqués, liés/jonctions, fichiers ordinaires non-répertoires et formats alphanumériques Unix, puis relances bornées (5 tentatives, 150 ms) uniquement sur `EPERM`/`EBUSY` avec propagation obligatoire de l'erreur finale. Les profils temporaires historiques validés ont été supprimés après vérification individuelle.
9. **Scission des workflows d'intégration continue (14 août 2026)** : L'intégration continue est scindée en deux workflows GitHub Actions distincts :
   - Un workflow rapide automatique `.github/workflows/quality.yml` (exécutant validation Composer, Pint, PHPStan, `npm run build` positionné avant Feature, tests Unit, Feature et Integration MySQL 8.4 sans installer Chromium ni exécuter de suite navigateur).
   - Un workflow navigateur séparé `.github/workflows/browser-quality.yml` (conditionné aux modifications de fichiers d'interface/navigateur pour Playwright E2E sous Chromium avec 1 worker, avec exécution de Lighthouse CI complet limitée aux seuls déclenchements manuels `workflow_dispatch` via l'input `run_lighthouse: true`, et archivage des rapports principalement en cas d'échec).
10. **Statuts de validation et positionnement juridique** :
   - **Niveau 1 — Socle techniquement implémenté** : **Atteint le 14 août 2026**.
   - **Niveau 2 — Phase 1 fonctionnellement et éditorialement terminée** : **Atteint et validé le 20 août 2026** (jalons N2-0 à N2-5 complétés, recette globale validée, suites Unit, Feature, Integration MySQL 8.4, Playwright E2E et Lighthouse conformes, revue indépendante avec verdict GO Niveau 2).
   - **Niveau 3 — Préparation et Production** : **En cours (N3-5 terminé avec la première release `v1.0.0` effectuée en production le 23 août 2026 ; N3-6 recette/GO en cours)**.
11. **Contenus éditoriaux validés, profil GitHub et clôture du jalon N2-1 (15 août 2026)** :
   - Le jalon N2-1 est formellement validé au commit `fd15152bc18819ea3a0b62948be8534acee847c0` sur la PR #2 (`https://github.com/Etbeur/LEZIDEJOU-platform/pull/2`), maintenue en brouillon (*draft*).
   - **Workflows distants réussis** :
     - Quality CI : `https://github.com/Etbeur/LEZIDEJOU-platform/actions/runs/31879564115`
     - Browser Quality CI : `https://github.com/Etbeur/LEZIDEJOU-platform/actions/runs/31879564296`
   - **Revue indépendante et arbitrage du pilotage** : La revue indépendante a validé l'intégralité technique des contenus, liens GitHub, lien source GoodGasoilPrice, modèle de catalogue, statuts, routes, tests et CI. Son observation sur les méta-descriptions a été rejetée par le pilotage : celles-ci figuraient explicitement dans le dossier N2-1A, ont été validées par l'utilisateur et fournies dans le prompt N2-1B en tant que contenus éditoriaux de page.
   - **Absence d'impact d'infrastructure SEO** : Aucune politique d'indexation, règle `robots.txt`, route `/sitemap.xml`, balise `robots`, URL canonique ou infrastructure SEO n'a été modifiée.
   - **Transparence et statut** : Les cinq projets conservent strictement leur statut `in_development`, aucune disponibilité publique n'est simulée, aucun déploiement n'a été réalisé, aucune phase 2 n'est commencée.
12. **Consolidation de la Quality CI MySQL (14 août 2026)** :
   - L'étape Integration MySQL dans `.github/workflows/quality.yml` crée éphémèrement `.env.mysql-testing` depuis `.env.testing` pour garantir la présence d'`APP_KEY`.
   - La base `lezidejou_test` est explicitement harmonisée en `utf8mb4_unicode_ci` via `docker exec` avec le compte applicatif dédié `lezidejou_test_user` sans élever les privilèges à `root` ni exposer de mot de passe en clair.
   - L'exécution de la suite Integration s'effectue par appel direct de `php vendor/bin/phpunit --configuration=phpunit.mysql.xml --testsuite=Integration` pour éviter les collisions d'options `--configuration` de `artisan test`.
   - `phpunit.mysql.xml` définit `APP_ENV=mysql-testing` pour une stricte synchronisation avec la configuration d'environnement.
13. **Visuels des projets et statut GoodGasoilPrice (Jalon N2-2, 18 août 2026)** :
   - Pour le lancement, les cinq projets adoptent des compositions textuelles sobres valorisantes sans aucun visuel fictif, générique, logo ou illustration IA.
   - GoodGasoilPrice passe au statut `published` avec conservation de sa fiche éditoriale interne `/projets/good-gasoil-price` comme destination principale du catalogue.
   - Un CTA externe distinct pointant vers l'application publique transitoire `https://carburants-lezidejou.up.railway.app/` (`Accéder à GoodGasoilPrice`) est ajouté sur la fiche interne.
   - Le lien vers le code source GitHub `https://github.com/Etbeur/GoodGasoilPrice` est conservé séparément. L'application publique et le code source représentent deux concepts distincts.
   - L'hébergement Railway est documenté comme expressément transitoire et ne constitue pas l'architecture cible, qui demeure l'intégration ultérieure dans le domaine `FuelPrice` du monolithe central.
   - Les quatre autres projets (Menu Planner, Belote Pro, Maths & Îles, LivraSign) restent au statut `in_development`. LivraSign conserve sa fiche interne sans aucun CTA ni lien externe.
   - Le modèle `ProjectContent` valide strictement les URL publiques en HTTPS avec hôte et impose la présence conjointe de `publicUrl` et `publicLabel`.
14. **Liens officiels Musique et Boutique (Jalon N2-3, 18 août 2026)** :
   - La page Musique intègre quatre liens externes simples sécurisés (`rel="noopener noreferrer"`) vers les canaux officiels de Joanto (Spotify, YouTube, Instagram, Linktree) sous le label Etbeur Music, sans aucun lecteur audio automatique, iframe, embed ou script tiers.
   - La page Boutique présente sobrement SerajoPrints et l'existence d'une création réelle unique (cartes éducatives à imprimer), ramenée de l'ancien objectif de 4 à 8 créations.
   - Les deux URL Etsy validées par le propriétaire (`https://www.etsy.com/fr/shop/SerajoPrints` et `https://www.etsy.com/fr/listing/4398947195/cartes-montessori-chiffres-a-imprimer`) sont volontairement différées du portail public dans l'attente de la réévaluation du régime juridique professionnel ; aucun lien Etsy cliquable ni CTA commercial n'est rendu.
15. **Décisions de préparation du Jalon N2-4 (18 août 2026)** :
   - Régime prévu : éditeur non professionnel, portail informatif (LCEN art. 1-1).
   - Domaine canonique prévu : `https://lezidejou.fr` avec redirection obligatoire depuis `www.lezidejou.fr`, `lezidejou.com` et `www.lezidejou.com`.
   - Hébergement prévu : OVHcloud (coordonnées physiques à auditer au déploiement).
   - Adresse de contact prévue : `contact@lezidejou.fr` (non publiée avant création et test effectif de la boîte aux lettres).
   - Aucun outil analytique, traceur, publicité ni pixel au lancement.
   - Description honnête des cookies techniques strictement nécessaires et des logs serveur.
   - L'audit et la correction de la collision entre `public/robots.txt` et la route `/robots.txt` restent réservés au jalon N2-4.
16. **Correction d'hydratation seoDescription (18 août 2026)** :
   - `ProjectCatalog::hydrate()` transmet explicitement la clé `seo_description` à `ProjectContent`, garantissant la préservation d'une méta-description distincte du résumé éditorial.
17. **Assets authentiques Joanto, nom public Good Gasoil Price et suppression des notes d'intégration (18 août 2026)** :
   - Les quatre assets graphiques Joanto authentiques fournis par le propriétaire (`joanto-logo.svg`, `joanto-symbol.svg`, `joanto-portrait-square.jpg`, `joanto-portrait-vertical.png`) sont intégrés sous `public/images/joanto/`.
   - La page `/musique` exploite un hero éditorial deux colonnes sur bureau (identité textuelle avec logo Joanto, présentation, liens officiels et portrait carré principal) et empilé sans débordement sur mobile.
   - Le nom d'affichage public `GoodGasoilPrice` est harmonisé en `Good Gasoil Price`, sans modification des identifiants techniques (`good-gasoil-price`, `/projets/good-gasoil-price`, dépôt GitHub `GoodGasoilPrice`).
   - Le libellé du lien source est mis à jour en `Code source public` (sans mention obsolète « projet en développement »).
   - Les blocs génériques publics `Note d’intégration` sont supprimés des fiches projets afin de ne pas exposer d'informations d'architecture interne superflues aux visiteurs.
   - Aucun `target="_blank"` n'est utilisé sur les liens externes du portail.
18. **Finition sémantique, éditoriale et optimisation WebP Joanto (18 août 2026)** :
   - Le H1 de la page `/musique` est unifié autour du logo Joanto vectoriel avec `alt="Joanto"` (nom accessible sans doublon textuel visible).
   - Intégration de la section `À propos` avec les deux paragraphes éditoriaux validés (musique électronique, dance, deep house, démarche de création guidée par l'humain et assistée par l'intelligence artificielle, sans pourcentages Suno).
   - Intégration de la section `Écouter et suivre` avec les 4 canaux officiels (`Spotify`, `YouTube`, `Instagram`, `Toutes les plateformes`).
   - Optimisation du portrait Joanto en WebP 960 × 960 px (~77,6 Ko, ratio 1:1, `fetchpriority="high"`, sans lazy loading), réduisant le poids de 3,86 Mo à 77,6 Ko et garantissant un LCP < 2,0 s sous Lighthouse (score Performance 99/100, Accessibilité 100/100).
   - Archivage des 4 assets originaux HD sous `resources/assets/joanto/source/` et allègement du dossier public `public/images/joanto/`.
19. **Mentions légales, régime non professionnel et hébergement OVHcloud (Jalon N2-4, 19 août 2026)** :
    - LÉZIDÉJOU est présenté simplement comme un portail personnel consacré aux créations numériques (applications, jeux, musique, créations graphiques), édité à titre non professionnel.
    - Le régime de l'article 1-1 II de la LCEN permettant de préserver l'anonymat civil de l'éditeur est formellement retenu, sans mention publique superflue. Aucune identité civile privée (nom, prénom, adresse personnelle, téléphone) ni le pseudonyme Etbeur ne sont exposés en identification légale.
    - L'hébergement de production est assuré par OVH SAS (2, rue Kellermann, 59100 Roubaix, France, RCS Lille Métropole 424 761 419 00045).
    - L'adresse électronique publique dédiée et opérationnelle est `contact@lezidejou.fr` (nom d'affichage : LÉZIDÉJOU).
    - **Règle de gouvernance actée** : toute évolution future transformant réellement LÉZIDÉJOU en site professionnel ou commercial devra impérativement déclencher une nouvelle revue juridique avant mise en production.
20. **Politique de confidentialité factuelle, sobriété et absence de traceurs (Jalon N2-4, 19 août 2026)** :
    - Le portail applique une stricte sobriété numérique : aucun cookie publicitaire, aucun pixel, aucun tracker marketing et aucun outil d'analytics tiers chargé dans le navigateur au lancement. Le suivi de base s'effectue via les statistiques du serveur d'hébergement OVHcloud et la Google Search Console.
    - Aucun formulaire public en ligne, aucun compte utilisateur public, aucune lettre d'information (newsletter).
    - Les journaux techniques de l'hébergement (OVHcloud) et les journaux applicatifs (Laravel) sont fondés sur l'intérêt légitime pour assurer la sécurité, le diagnostic et la stabilité du réseau, avec une rétention proportionnée aux nécessités de diagnostic et aux obligations légales sans durée artificielle inventée.
    - Seuls les cookies techniques indispensables au framework web (session, CSRF) sont émis lors de la navigation, dispensant formellement le portail d'un bandeau de consentement aux cookies.
    - Point de contact RGPD : `contact@lezidejou.fr`, avec rappel de la possibilité de réclamation auprès de la CNIL (`www.cnil.fr`).
    - **Règle de gouvernance actée** : toute introduction future d'un outil d'analytics navigateur, de compte utilisateur, de paiement, d'abonnement ou de collecte commerciale exigera une nouvelle revue préalable (juridique, RGPD, cookies, sécurité).
21. **Résolution définitive de la collision robots.txt et politique d'exploration IA (Jalon N2-4, 19 août 2026)** :
    - Le fichier statique physique `public/robots.txt` a été supprimé définitivement, garantissant que la route dynamique `RobotsController` est l'unique source de vérité pour `/robots.txt`.
    - Hors production, l'exploration est intégralement interdite (`User-agent: *\nDisallow: /`).
    - En production, les crawlers d'entraînement de modèles IA tiers (`GPTBot`, `ClaudeBot`) sont explicitement bloqués (`Disallow: /`), tandis que l'exploration générale, les moteurs de recherche classiques, la découverte IA et `Google-Extended` sont autorisés (`User-agent: *\nAllow: /`), avec annonce du sitemap canonique.
    - Les pages `/mentions-legales` et `/confidentialite` conservent rigoureusement leur balise `<meta name="robots" content="noindex,follow">` et leur exclusion du sitemap XML.
22. **Architecture d'hébergement OVHcloud mutualisé PRO et pipeline de déploiement (Jalons N3-0 à N3-2, 20 août 2026)** :
    - Arborescence de production `/homez.2034/lezidea/lezidejou/` (`releases/`, `shared/`, `current`).
    - Fichier `shared/.env` créé avec `APP_KEY` unique, `APP_DEBUG=false`, cookies de session HTTPS stricts (`SESSION_SECURE_COOKIE=true`, `SESSION_HTTP_ONLY=true`, `SESSION_SAME_SITE=lax`) et droits 600.
    - Déploiement non interactif par clé SSH ED25519 dédiée (`ssh.cluster131.hosting.ovh.net`, port 22, user `lezidea`).
    - Bascule atomique du symlink `current` via `ln -sfn` et `mv -Tf` (GNU coreutils 8.30).
23. **Stratégie de sauvegarde, migrations et rollback de production (Jalon N3-3, 20 août 2026)** :
    - Sauvegarde MySQL réalisée manuellement dans l'espace client OVHcloud Manager avant chaque mise en production.
    - Le workflow `deploy-production.yml` exige obligatoirement l'input booléen `confirm_database_backup: true` (fail-fast immédiat si absent ou non confirmé).
    - Les migrations `php artisan migrate --force` s'exécutent dans le dossier temporaire de staging (`releases/.<tag>.staging.<pid>`) avant la publication de la release. En cas d'échec, le staging est nettoyé et `current` reste inchangé.
    - Interdiction absolue de `php artisan migrate:rollback` automatique en production. Priorité à la conception expand/contract.
    - Script `scripts/rollback-release.sh` versionné pour les rollbacks applicatifs atomiques (`mv -Tf`) vers des releases immuables existantes sans altération de fichiers.
    - Procédure de secours CAS B documentée (maintenance -> restauration dump OVH -> rollback applicatif -> up).
    - Stockage persistant : aucun upload utilisateur métier en v1 ; politique de sauvegarde de `storage/app` formalisée pour les versions futures.
24. **Politique de sécurité HTTP, HSTS et durcissement de production (Jalon N3-4, 20 août 2026)** :
    - Les en-têtes HTTP de sécurité (`X-Content-Type-Options: nosniff`, `X-Frame-Options: SAMEORIGIN`, `Referrer-Policy: strict-origin-when-cross-origin`, `Permissions-Policy: camera=(), microphone=(), geolocation=()`) sont injectés de manière globale et portable via `App\Http\Middleware\SecurityHeadersMiddleware`.
    - HSTS (`Strict-Transport-Security: max-age=86400`) est configuré pour 24 heures sans `preload` ni `includeSubDomains` uniquement sur requêtes HTTPS en environnement `production` (durée à augmenter après validation en conditions réelles).
    - Aucune CSP stricte aveugle n'est introduite en v1 pour garantir le parfait fonctionnement des composants dynamiques (Livewire, Filament admin, Vite assets, Swiper Coverflow).
    - `URL::forceScheme('https')` est activé en production dans `AppServiceProvider`.
    - Le pare-feu applicatif mutualisé OVH (ModSecurity) est conservé actif sans désactivation préventive ; une matrice exhaustive de tests réels de recette est documentée pour le jalon N3-6.

## Découvertes
1. **Installation de Node.js 24.19.0 LTS** : Node.js 24.19.0 LTS a été installé au jalon 2 via NVM (`C:\Users\romai\.config\herd\bin\nvm\nvm.exe`), déviation explicitement acceptée.
2. **Structure des domaines** : `App\Domain\Portal` et `App\Domain\Identity` sont en place. Au jalon 4, `App\Domain\Portal\Services\CanonicalUrlGenerator` a été introduit pour centraliser la construction sûre des URL canoniques absolues.
3. **Menu mobile natif sans JS** : Le menu mobile s'appuie sur le composant `<details class="mobile-nav-toggle">` avec une protection CSS explicite (`details.mobile-nav-toggle:not([open]) > *:not(summary) { display: none !important; }`), garantissant l'absence de débordement horizontal à 360 px et le masquage strict des liens lorsque le menu est fermé.
4. **API Filament 5.7.6 MFA** : Filament 5.7.6 utilise `Filament\Auth\MultiFactor\App\AppAuthentication`, les interfaces `HasAppAuthentication` et `HasAppAuthenticationRecovery`, ainsi que les traits `InteractsWithAppAuthentication` et `InteractsWithAppAuthenticationRecovery` qui gèrent automatiquement le chiffrement au repos (`encrypted` / `encrypted:array`) et le masquage de la sérialisation.
5. **Lancement du serveur Lighthouse CI & confinement du patch Windows** : Le serveur de laboratoire est lancé via `node scripts/lighthouse-server.cjs` sur le port 8002 (`APP_ENV=production`, `APP_DEBUG=false`, SQLite, clé éphémère en mémoire, aucun secret ni drapeau artificiel). Le nettoyage Windows s'appuie sur un module pur `scripts/lighthouse-win-cleanup.cjs` et son point d'entrée `lighthouse-win-patch.cjs`, strictement testé unitairement sous Node (`node --test tests/Node/lighthouse-win-patch.test.cjs`), qui confine la temporisation aux seuls profils temporaires Chrome réels sans impacter aucun autre chemin ou plateforme.
6. **Diagnostic de l'échec CI GitHub Actions distant historique (ViteManifest)** : L'inspection en lecture seule du run `31749573088` associé au commit `3008462e` a révélé que l'étape `Run PHPUnit Feature tests (SQLite)` avait échoué avec l'exception `ViteManifestNotFoundException` parce que `npm run build` était situé après Feature dans l'ancien workflow. La scission des workflows et le positionnement systématique de `npm run build` avant Feature ont définitivement résolu cette anomalie (validée lors du run `31836355444`).
7. **Observation et analyse des runs distants du candidat 2bf7ef8 (14 août 2026)** :
   - **Browser Quality CI (`.github/workflows/browser-quality.yml`, run `31836355484`)** : **Succès complet**. Playwright E2E a validé l'intégralité des 76 tests navigateur sous Chromium avec 1 worker. Les étapes Lighthouse complètes sont restées ignorées comme prescrit.
   - **Quality CI (`.github/workflows/quality.yml`, run `31836355444`)** : Échec à l'étape `Run PHPUnit Integration tests (MySQL 8.4)`.
   - Les étapes rapides antérieures ont toutes été validées à distance : test Node Lighthouse (13/13), validation Composer, Pint, PHPStan niveau 5, build Vite, tests Unit SQLite (25/25), tests Feature SQLite (28/28).
   - **Résultat exact de la suite Integration MySQL (run `31836355444`)** :
     - 3 tests échoués ;
     - 2 warnings comptabilisés par PHPUnit ;
     - 20 assertions ;
     - code de sortie 2.
   - **Répartition des trois échecs** :
     - 1 échec de collation (valeur attendue : `utf8mb4_unicode_ci`, valeur observée : `utf8mb4_0900_ai_ci`) ;
     - 2 `MissingAppKeyException`.
   - **Origine des deux warnings comptabilisés** : lectures de fichiers d'environnement absents (`file_get_contents()`) par Dotenv/Collision lors de l'exécution sans `.env.mysql-testing`.
   - **Avertissement de commande distinct** : duplication de l'option `--configuration` injectée par le wrapper `artisan test` et Collision (cause technique résolue par l'appel direct à PHPUnit).
8. **Validation distante finale de la CI consolidée (14 août 2026)** :
   - Commit correctif : `4b887a290f7c9f6043f975bd965e598e2dbf22c1` (`fix: stabilize mysql integration ci`).
   - **Quality CI distante (`.github/workflows/quality.yml`, run `31846477772`)** : **Succès complet** (durée : 1 min 33 s).
     - Environnement : Node.js 24.19.0, PHP 8.4, conteneur de service MySQL 8.4.11 ;
     - Test Node du patch d'isolation Lighthouse : 13/13 réussis ;
     - Validation Composer : `./composer.json is valid` ;
     - Style de code Pint : Passed ;
     - Analyse statique PHPStan niveau 5 : 0 erreur ;
     - Compilation frontend Vite : réussie ;
     - Tests Unit PHPUnit (SQLite) : **25/25 réussis (94 assertions)** ;
     - Tests Feature PHPUnit (SQLite) : **28/28 réussis (654 assertions)** ;
     - Tests Integration PHPUnit (MySQL 8.4) : **5/5 réussis (33 assertions), 0 échec, 0 warning** ;
     - `.env.mysql-testing` créé éphémèrement depuis `.env.testing` garantissant `APP_KEY` sans secret persistant ;
     - Base `lezidejou_test` harmonisée explicitement en `utf8mb4_unicode_ci` par `docker exec` avec le compte dédié `lezidejou_test_user` ;
     - Migrations MySQL appliquées avec succès ;
     - Appel PHPUnit direct (`php vendor/bin/phpunit --configuration=phpunit.mysql.xml --testsuite=Integration`) validé sans warning de duplication `--configuration`.
   - **Browser Quality CI distante (`.github/workflows/browser-quality.yml`, run `31836355484`)** : **Succès complet** (Playwright 76/76 sous Chromium avec 1 worker, Lighthouse complet non exécuté).
   - **Lighthouse CI historique (Jalon 7)** : **30/30 collectes réussies** sur 10 URLs autorisées (conservé comme référence historique du jalon 7, non réexécuté lors de la clôture du jalon 8).

### Validations finales (Jalon 8)
Résultats complets validés le 14 août 2026 :
- `composer validate --strict` : Succès (`./composer.json is valid`)
- `npm run build` : Succès (Vite v8.2.1, 11 assets compilés)
- `npm run test:lighthouse-patch` : **13/13 tests réussis** sous `node:test`
- `php artisan test --testsuite=Unit` : **25/25 tests réussis (94 assertions)**
- `php artisan test --testsuite=Feature` : **28/28 tests réussis (654 assertions)**
- `php vendor/bin/phpstan analyse` : Passed (0 erreur, Level 5)
- `php vendor/bin/pint --test` : Passed (0 fichier à modifier)
- `php artisan route:list` : Succès (30 routes enregistrées conformes)
- Validation distante Browser Quality (run `31836355484`) : **Succès** (Playwright 76/76 sous Chromium, 1 worker)
- Validation distante Quality CI (run `31846477772`) : **Succès** (Unit 25/25, Feature 28/28, Integration MySQL 8.4 5/5 avec 33 assertions, 0 échec, 0 warning)
- Validation syntaxique YAML et XML : Succès sans erreur.

#### Contrôles historiques de référence
- `npm run test:e2e` (Playwright E2E) : **76/76 réussis** (confirmé à distance sur run `31836355484`).
- `npm run test:lighthouse` (Lighthouse CI) : **30/30 collectes réussies** en local au Jalon 7 (pire Perf 99%, pire A11y 100%, pire BP 100%, pire SEO 100%).
- `Integration` MySQL locale de référence : **5/5 réussis (33 assertions)** sous MySQL 8.4.11 local avec `.env.mysql-testing`.

#### État des jalons
- **Jalons 0 à 8** : Terminés et validés.
- **Niveau 1** : Validé et atteint le 14 août 2026.
- Aucun jalon ultérieur commencé.

### Problèmes non résolus
- Le domaine de production définitif (`https://lezidejou.fr`) reste à valider formellement par l'utilisateur avant publication.
- Les visuels réels de projets, les textes juridiques définitifs et les liens externes officiels restent à fournir avant fin fonctionnelle (Niveau 2 non atteint).
- L'infrastructure d'hébergement, la sauvegarde, les procédures de rollback et les accès OVHcloud sont en cours de formalisation dans le cadre du Niveau 3.
- Aucune phase 2 commencée.

### Validations finales (Jalon 3)
Suites de contrôle exécutées au jalon 3 (12 août 2026) :
- `php artisan route:list` : Succès (9 routes éditoriales enregistrées, aucune route réservée)
- `php artisan test --testsuite=Unit` : 20/20 tests réussis (74 assertions), incluant 1 test d'exemple Laravel `ExampleTest` et 19 tests du domaine `Portal` (enums exacts, DTO, invariants URL HTTPS, catalogue et unicité des destinations)
- `php artisan test --testsuite=Feature` : 9/9 tests réussis (63 assertions), incluant 1 test d'exemple `ExampleTest` et 8 tests de routes/comportements (balise `<meta name="robots" content="noindex,follow">` exacte, routes interdites 404, masquage `hidden` vérifié sur toutes les pages)
- `php vendor/bin/phpstan analyse` : Passed (0 erreur, Level 5)
- `php vendor/bin/pint --test` : Passed (0 fichier à modifier)
- `git diff --check` : Succès (aucune erreur de whitespaces)

### Validations finales (Jalon 4)
Suites de contrôle exécutées au jalon 4 (12 août 2026) :
- `npm run build` : Succès (compilation Vite avec Node.js 24.19.0 LTS)
- `php artisan test --testsuite=Unit` : 20/20 tests réussis (74 assertions)
- `php artisan test --testsuite=Feature` : 14/14 tests réussis (535 assertions), comprenant 1 test d'exemple Laravel `ExampleTest`, 8 tests `PortalRoutesTest` (mis à jour pour la structure DOM de `main-nav`) et 5 tests `SeoAccessibilityTest` (analyse DOM des 13 pages HTML, un seul H1, un seul header, métadonnées uniques, canonique HTTPS exacte, `og:url`/`og:title`/`og:description` factuels, `noindex,follow` exact hors production, validation XML sitemap et `robots.txt` par environnement, structure du menu mobile)
- `php artisan test --filter=SeoAccessibilityTest` : 5/5 tests réussis (476 assertions)
- `php artisan test --filter=PortalRoutesTest` : 8/8 tests réussis (58 assertions)
- `php vendor/bin/phpstan analyse` : Passed (0 erreur, Level 5)
- `php vendor/bin/pint --test` : Passed (0 fichier à modifier)
- `php artisan view:cache` : Succès (vues Blade précompilées)
- `php artisan route:list` : Succès (25 routes enregistrées)
- `git diff --check` : Succès (aucune erreur de whitespaces)
- Inspections responsive (360px, 768px, 1024px, 1440px) : Succès sur les 13 pages HTML (HTTP 200, suppression du débordement mobile par `grid-column: 1` sur `.editorial-action`, `scrollWidth=345px` et `clientWidth=345px` à 360px sur `/` et `/projets`, menu mobile fermé, ouvert et refermé correctement par clic sur `<summary>`). Les 2 endpoints techniques `/robots.txt` et `/sitemap.xml` ont été contrôlés séparément (soit 15 endpoints HTTP contrôlés au total). L’activation réelle du composant `<summary>` par Entrée/Espace n’a pas pu être vérifiée avec le pilote disponible ; sa structure native `<details>/<summary>` demeure conforme statiquement.

### Validations finales (Jalon 5)
Suites de contrôle exécutées au jalon 5 (12 août 2026) et corrections appliquées le 13 août 2026 :

#### Corrections appliquées le 13 août 2026 (écarts bloquants et mineurs)

**Correction 1 — Migration additive (écart bloquant)**
- La migration initiale `0001_01_01_000000_create_users_table.php` a été restaurée à son état exact du commit `79541ede` (sans les trois colonnes Identity).
- Une migration additive dédiée `2026_08_12_000001_add_identity_and_app_authentication_columns_to_users_table.php` a été créée pour ajouter `is_admin` (boolean, dflt false), `app_authentication_secret` (TEXT, nullable) et `app_authentication_recovery_codes` (TEXT, nullable).
- Scénario SQLite frais (base temporaire `lzj_fresh_test.sqlite`) : 4 migrations appliquées, colonnes vérifiées (is_admin tinyint(1) dflt='0', deux colonnes TEXT nullable), idempotence confirmée (`Nothing to migrate` au second passage). Base supprimée après usage.
- Scénario mise à niveau depuis jalon 4 (base temporaire `lzj_upgrade_j4_test.sqlite`) : schéma jalon 4 reconstitué sans les trois colonnes, ligne historique fictive insérée, migration additive appliquée (batch 2), colonnes présentes, ligne historique conservée, `is_admin`=0 pour ligne existante, colonnes TOTP nulles pour ligne existante. Base supprimée après usage.

**Correction 2 — DatabaseSeeder (écart bloquant)**
- `DatabaseSeeder.php` ne crée plus aucun compte. L'import `use App\Domain\Identity\Models\User` a été retiré, la méthode `run()` est volontairement vide avec commentaire explicatif.

**Correction 3 — Couverture de la commande (écart mineur)**
- `CreateAdminCommandTest.php` : deux cas ajoutés dans `test_refuses_weak_password` — mot de passe sans lettre minuscule (`UPPERCASE12345!`) et mot de passe sans chiffre (`NoDigitPass!!`) ; l'adresse e-mail du cas "symbole" renommée `weak5@lezidejou.test` pour éviter toute collision.
- Ajout d'un test `test_database_seeder_creates_no_users_on_empty_database` vérifiant que `DatabaseSeeder::run()` sur une base vide laisse le compteur `users` à 0.

**Correction 4 — Test courriel invalide (écart mineur, 13 août 2026)**
- `CreateAdminCommandTest.php` : ajout de `test_refuses_invalid_email_address` — adresse `not-an-email` refusée avec le message `L'adresse électronique est invalide.`, code de sortie 1, aucun utilisateur créé (`assertDatabaseCount('users', 0)`). La commande s'arrête avant de poser les questions de mot de passe ; le test n'en prévoit donc aucune.

#### Résultats des contrôles du 13 août 2026 (après correction 4)
- `php artisan test --filter=CreateAdminCommandTest` : **6/6 tests réussis (62 assertions)** ✅
- `php artisan test --filter=Admin` : **14/14 tests réussis (83 assertions)** ✅
- `php artisan test --filter=MultiFactor` : 2/2 tests réussis (11 assertions) ✅
- `php artisan test --testsuite=Unit` : 25/25 tests réussis (94 assertions) ✅
- `php artisan test --testsuite=Feature` : **27/27 tests réussis (615 assertions)** ✅
- Total global des tests : **52/52 tests réussis (709 assertions)**
- `php artisan config:show auth` : `App\Domain\Identity\Models\User` configuré exclusivement ✅
- `php vendor/bin/phpstan analyse` : Passed (0 erreur, Level 5) ✅
- `php vendor/bin/pint --test` : Passed (0 fichier à modifier) ✅
- `php artisan view:cache` : Succès (vues Blade précompilées) ✅
- `php artisan route:list --path=admin` : 5 routes Filament ✅
- `php artisan route:list` : 30 routes ✅
- `git diff --check` : Aucune erreur de whitespaces ✅
- `git status --short --untracked-files=all` : 1 supprimé, 7 modifiés, 8 non suivis = 16 changements ✅

### Validations finales (Jalon 6)
Suites de contrôle exécutées au jalon 6 (13 août 2026) :
- `composer validate --strict` : Succès (0 erreur)
- `npm run build` : Succès (compilation Vite avec Node.js 24.19.0 LTS)
- `php artisan migrate --env=testing --force` : Succès (SQLite, base en mémoire)
- `php artisan test --testsuite=Unit` : 25/25 tests réussis (94 assertions)
- `php artisan test --testsuite=Feature` : 27/27 tests réussis (615 assertions)
- `php artisan test --env=mysql-testing --configuration=phpunit.mysql.xml --testsuite=Integration` : **5/5 tests réussis (33 assertions)** (connexion MySQL 8.4.11, base `lezidejou_test`, utilisateur dédié `lezidejou_test_user@127.0.0.1`, schéma utilisateurs vérifié, persistance Identity avec chiffrement/déchiffrement vérifiés, isolation confirmée par transaction explicite + rollback + vérification immédiate d'absence de fixture)
- `npm run test:e2e` : **76/76 tests réussis** en 59,5 s (Chromium, 4 viewports : DOM complet, lang="fr", liens internes résolus via new URL() + fetch GET, navigation desktop et mobile : count=4 exact, libellés+chemins exacts dans l'ordre, absence de Jeux/Labo/LivraSign/Contact, séquence clavier Entrée/Espace ouvre+ferme avec vérification de visibilité des 4 liens, accessibilité axe 0 violation serious/critical, 0 erreur JS, 0 ressource 4xx/5xx locale)
- `php vendor/bin/phpstan analyse` : Passed (0 erreur, Level 5)
- `php vendor/bin/pint --test` : Passed (0 fichier à modifier après correction concat_space)
- `php artisan view:cache` : Succès (vues Blade précompilées)
- `php artisan route:list` : Succès (30 routes)
- `git diff --check` : Succès (aucune erreur de whitespaces)

### Validations finales (Jalon 7)
Suites de contrôle exécutées au jalon 7 (13 août 2026) :
- `composer validate --strict` : Succès (./composer.json is valid)
- `npm run test:lighthouse-patch` : **13/13 tests réussis** sous `node:test` (confinement strict, canonicalisation physique du parent, rejet des chemins frères `Temp-escape`, imbriqués et liés, relances bornées sur `EPERM`/`EBUSY`, propagation d'erreur)
- `php vendor/bin/pint --test` : Passed (0 fichier à corriger)
- `php vendor/bin/phpstan analyse` : Passed (0 erreur, Level 5)
- `php artisan test --testsuite=Unit` : 25/25 tests réussis (94 assertions)
- `php artisan test --testsuite=Feature` : **28/28 tests réussis (654 assertions)**, incluant la vérification complète de la politique robots de production sur les 13 pages
- `php artisan test --env=mysql-testing --configuration=phpunit.mysql.xml --testsuite=Integration` : 5/5 tests réussis (33 assertions) sous MySQL 8.4.11
- `npm run build` : Succès (Vite v8.2.1, 11 assets générés en 128ms)
- `npm run test:e2e` : **76/76 tests réussis** (57.0s sur Chromium, 4 viewports)
- `npm run test:lighthouse` (historique complet) : **30/30 collectes réussies** sur les 10 URL autorisées (3 runs par URL, `is-crawlable` exclu de la seule mesure de laboratoire pour respecter le `noindex,follow` réel des 5 fiches projets sans artifice de rendu)
  - Assertions pessimistes toutes validées au niveau error :
    - Performance : **1.00** (seuil >= 0.90)
    - Accessibilité : **1.00** (seuil >= 1.00)
    - Best Practices : **1.00** (seuil >= 0.95)
    - SEO ajusté : **1.00** (seuil >= 0.95 ; score brut 0.66 sur les 5 fiches `in_development` dû à `is-crawlable` pénalisant le noindex, politique robots contrôlée strictement par la suite Feature)
    - LCP : pire valeur **1508 ms** (seuil <= 2500 ms)
    - CLS : pire valeur **0.018** (seuil <= 0.10)
    - TBT : **0 ms** (seuil <= 200 ms)
- Validation dynamique ciblée du patch Windows (14 août 2026) : Collecte unique réelle exécutée avec succès sur `http://127.0.0.1:8002/` avec préchargement (`node --require ./lighthouse-win-patch.cjs ./node_modules/@lhci/cli/src/cli.js collect --url="http://127.0.0.1:8002/" --numberOfRuns=1`). Les 5 anciens profils temporaires historiques ont été vérifiés individuellement et supprimés du dossier Temp canonique. Aucun nouveau profil temporaire résiduel ne subsiste après l'exécution.
- `php artisan view:cache` : Succès (Blade templates cached successfully)
- `php artisan route:list` : Succès (30 routes enregistrées)
- Workflow CI initial : `.github/workflows/quality.yml` configuré lors du jalon 7 avec actions officielles `@v7`, préparation `cp .env.testing.example .env.testing`, conteneur `mysql:8.4.11`, compte dédié `lezidejou_test_user` sans privilèges root (workflow scindé ultérieurement au jalon 8 en une CI rapide automatique et une CI navigateur séparée).
- `.gitignore` : `.env.mysql-testing` explicitement ignoré
- Distinction métriques de laboratoire / données terrain : Les scores 100% de laboratoire sont des mesures synthétiques sur environnement local isolé et ne constituent pas des mesures terrain RUM (Real User Monitoring).
- Limites restantes : La CI distante GitHub Actions n'a pas été exécutée sur les serveurs distants de GitHub, tout push restant formellement interdit avant validation explicite.

## 1. Objectif et résultat observable

Construire la phase 1 de LÉZIDÉJOU sous la forme d'un portail Laravel 13 maintenable, constituant le premier socle d'un futur monolithe modulaire.

Le résultat attendu est :

- un portail public responsive présentant LÉZIDÉJOU, ses projets, ses jeux, sa musique, sa boutique et LivraSign ;
- cinq fiches éditoriales pilotées par un catalogue de contenus typé ;
- une identité conforme à la charte, sans contenu ou asset fictif ;
- une administration Filament réservée aux administrateurs et protégée par TOTP obligatoire ;
- une base technique validée sous SQLite puis sous le moteur MySQL 8.4 représentatif selon les jalons ;
- des tests PHP, navigateur, accessibilité et Lighthouse reproductibles ;
- une CI GitHub Actions sans déploiement ;
- une documentation permettant la reprise du projet et la préparation future d'OVHcloud.

La phase 1 prépare les futures migrations de GoodGasoilPrice, Menu Planner, Belote Pro et Maths & Îles, mais n'intègre aucun de leurs codes métier.

## 2. Préflight documentaire du 11 août 2026

### 2.1 Racines et dépôts observés

Racine du workspace :

`C:\Users\romai\Documents\Projet_Dev\LEZIDEJOU-workspace`

Organisation canonique :

```text
LEZIDEJOU-workspace/
├── AGENTS.md
├── LEZIDEJOU-platform/
├── prototypes/
└── sources/
```

Racines Git indépendantes :

- `LEZIDEJOU-platform/.git` ;
- `sources/GoodGasoilPrice/.git` ;
- `sources/menu-planner/.git` ;
- `sources/belote-pro/.git` ;
- `sources/maths-et-iles/.git`.

Aucun dépôt Git n'a été observé à la racine de `LEZIDEJOU-workspace`.

Le dossier canonique `prototypes/` existe au pluriel. Lors de la décision Labo, il était vide et ne contenait aucun dépôt Git ; aucun renommage n'a été nécessaire.

### 2.2 État Git observé avant consolidation

Dépôt central :

```text
## main...origin/main
 D README.md
?? docs/
```

Les quatre dépôts sources ont chacun été observés sur `main...origin/main`, sans modification listée. Leur inspection a nécessité l'option locale non persistante `git -c safe.directory=...` à cause de l'utilisateur sandbox ; aucune configuration Git globale n'a été modifiée.

Conséquences :

- la suppression de `README.md` était une modification utilisateur préexistante au premier checkpoint documentaire ;
- le README supprimé contenait seulement un titre avec l'ancien nom et une phrase de présentation ;
- le correctif documentaire du 11 août 2026 autorise explicitement la création d'un README actuel, concis et sans ancienne présentation ETBEUR ;
- `docs/` était non suivi et doit être préservé ;
- aucun autre changement existant ne doit être nettoyé ou restauré automatiquement.

### 2.3 Instructions et documents observés

Avant consolidation :

- un `AGENTS.md` existait à la racine du workspace avec les anciens chemins ;
- aucun `AGENTS.md` n'existait à la racine du dépôt central ;
- aucun `AGENTS.md` n'existait dans `docs/` ;
- aucun autre `AGENTS.md` n'a été trouvé dans les dossiers parents inspectés ;
- l'ExecPlan avait déjà son emplacement canonique ;
- les deux documents de référence avaient des noms non canoniques, sans suffixe `(1)`.

Les emplacements canoniques après consolidation sont :

- `docs/implementation/phase-1-execplan.md` ;
- `docs/reference/architecture-plateforme-jeux-applications-2026.md` ;
- `docs/reference/charte-graphique-structure-lezidejou.md`.

### 2.4 Environnement observé dans la session actuelle

Observation non destructive du 11 août 2026 :

| Commande | Résultat dans le `PATH` de la session |
|---|---|
| `git --version` | `2.53.0.windows.2` |
| `herd` | non détecté |
| `php` | non détecté |
| `composer` | non détecté |
| `node` / `npm` | non détectés |
| `sqlite3` | non détecté |
| `mysql` / `mysqld` | non détectés |

Ces résultats signifient uniquement que les exécutables ne sont pas accessibles dans le `PATH` de cette session sandbox. Ils ne démontrent pas leur absence de la machine.

### 2.5 Diagnostic complété hors `PATH` le 11 août 2026

La recherche non destructive par chemins d'installation, métadonnées, registre et services a confirmé PHP 8.4.23, Composer 2.9.5, Node.js 25.9.0, npm 11.12.1, Git 2.53.0.windows.2 et Herd 1.28.0. Aucun exécutable ni service MySQL ou MariaDB n'a été trouvé dans les emplacements inspectés.

Node.js 25.9.0 est la seule version locale détectée. Elle est en fin de vie et ne doit pas être utilisée pour le projet. Les [archives officielles Node.js 24](https://nodejs.org/en/download/archive/v24) et l'[index officiel des versions](https://nodejs.org/dist/index.json), vérifiés le 11 août 2026, identifient Node.js 24.19.0 comme version LTS courante.

Node.js 24 LTS doit être installé ou activé avant toute installation ou compilation des dépendances frontend. Aucune installation n'est autorisée ni réalisée pendant ce correctif documentaire, et aucun fichier `.nvmrc` n'est créé.

Ces informations devront être confirmées au jalon 0 dans l'environnement qui exécutera réellement l'implémentation.

## 3. Décisions définitivement retenues

- LÉZIDÉJOU est la marque ombrelle du portail.
- Laravel 13 et PHP 8.4 constituent le socle prévu.
- Le portail évolue en monolithe modulaire.
- GoodGasoilPrice, Menu Planner, Belote Pro et Maths & Îles deviendront progressivement des modules du Laravel central.
- LivraSign reste une application Laravel indépendante.
- La phase 1 crée uniquement le portail et les domaines techniques réellement utiles.
- Aucun code métier des dépôts `sources/` n'est intégré en phase 1.
- Aucun module métier vide n'est créé par anticipation.
- Les expériences gratuites restent accessibles sans compte public.
- Le compte LÉZIDÉJOU commun est reporté jusqu'à une fonction personnelle utile.
- Le seul accès authentifié de phase 1 est l'administration Filament.
- Filament est réservé aux administrateurs avec TOTP obligatoire.
- Blade rendu côté serveur est le socle public.
- SQLite sert au bootstrap et aux tests locaux compatibles ; MySQL 8.4 est le moteur SQL représentatif unique pour Integration, CI et production. Aucune compatibilité MariaDB revendiquée.
- Le lancement doit rester compatible avec un hébergement Web OVHcloud simple.
- Redis, Horizon, Docker, VPS, workers permanents, Stripe et microservices sont hors périmètre sans besoin mesuré.
- Aucun CMS, moteur de recherche, API publique, analytique, traqueur ou bannière de consentement n'est ajouté.
- Aucun formulaire de contact n'est créé sans méthode publique validée.
- Aucun contenu, lien, logo, screenshot ou visuel fictif n'est présenté comme réel.
- Les nouvelles expérimentations sont isolées dans `prototypes/<slug>/` et ne sont créées ou modifiées que sur demande explicite.
- Une future rubrique `Labo` présentera uniquement des prototypes réels, accessibles et suffisamment documentés.
- L'intégration d'un prototype au monolithe n'est jamais automatique ; une application indépendante reste possible.
- Les commits locaux de checkpoint sont autorisés après la validation de chaque jalon ; tout push, merge, rebase, tag, pull request, réécriture d'historique ou déploiement reste strictement interdit sans autorisation explicite.

La documentation officielle Laravel consultée le 11 août 2026 confirme que Laravel 13 prend en charge PHP 8.3 à 8.5 ; PHP 8.4 reste le choix explicite du projet.

## 4. Périmètre de la phase 1

### Inclus

- création prudente du socle Laravel 13 ;
- architecture modulaire limitée aux domaines utiles au portail et à l'identité administrateur ;
- catalogue typé des cinq projets ;
- routes éditoriales, pages publiques et navigation ;
- interface responsive conforme à la charte ;
- polices et assets locaux autorisés ;
- SEO technique, sitemap et robots ;
- accessibilité automatisée et vérifications manuelles ;
- administration Filament ;
- commande sécurisée de création d'un administrateur ;
- TOTP obligatoire et codes de récupération ;
- tests Unit, Feature, Integration et navigateur ;
- validation SQLite puis MySQL 8.4 ;
- audits Lighthouse de laboratoire ;
- workflow GitHub Actions de qualité ;
- documentation locale, architecture et préparation OVHcloud ;
- préservation d'une architecture permettant d'ajouter le Labo plus tard sans refonte majeure ;
- compte rendu final avec commits locaux de checkpoint validés jalon par jalon, sans push ni déploiement.

### Hors périmètre

- copie ou intégration du métier des dépôts sous `sources/` ;
- création des modules `FuelPrice`, `MenuPlanner`, `Belote` ou `MathIslands` ;
- routes fonctionnelles réservées ;
- création technique du Labo, routes `/labo`, modèle, contrôleur, fiche ou prototype ;
- sous-domaines applicatifs ;
- API publique ou application mobile ;
- back-office éditorial des contenus ;
- inscription publique, équipes ou rôles multiples ;
- compte public et fonctions personnelles ;
- courriels transactionnels ;
- paiement, abonnement et monétisation ;
- formulaire de contact avec stockage ou envoi ;
- newsletter, commentaires, analytics, publicité ou pixels ;
- cookies non essentiels et bannière de consentement ;
- traduction multilingue ;
- configuration DNS, serveur web ou production ;
- migration destructive ;
- push, merge, rebase, tag, pull request, réécriture d'historique ou déploiement non autorisé (seuls les commits locaux de checkpoint après validation d'un jalon sont autorisés).

## 5. Prérequis et préflight d'implémentation

### Versions minimales

- PHP 8.4 et extensions Laravel usuelles, `pdo_sqlite`, `sqlite3`, `pdo_mysql`.
- Composer 2.7.
- Node.js 24 LTS et npm associé.
- Git 2.40.
- SQLite est autorisé pour le bootstrap Laravel initial et les tests locaux compatibles.
- MySQL 8.4 est le moteur SQL représentatif unique pour l'intégration, la future CI et la production.
- Aucune compatibilité MariaDB revendiquée.
- Chromium installé par Playwright.
- Herd Desktop seulement si le domaine local `.test` est retenu.

### Commandes obligatoires au jalon 0

Depuis la racine du workspace :

```powershell
Set-Location .\LEZIDEJOU-platform
Resolve-Path .
git rev-parse --show-toplevel
git status --short --untracked-files=all
Get-ChildItem -Force
Get-ChildItem -LiteralPath .\docs -Recurse -File
Get-ChildItem -LiteralPath ..\prototypes -Force -Recurse -ErrorAction SilentlyContinue
Get-ChildItem -LiteralPath ..\prototypes -Directory -Force -Recurse -Filter .git -ErrorAction SilentlyContinue
git ls-files --deleted
git diff -- README.md
Get-Command herd, php, composer, node, npm, git, sqlite3, mysql, mysqld, mariadb, mariadbd -ErrorAction SilentlyContinue
herd --version
herd php -v
herd composer --version
php -v
composer --version
node -v
npm -v
git --version
php -r "exit(version_compare(PHP_VERSION, '8.4.0', '>=') ? 0 : 1);"
php -r "foreach (['pdo_sqlite','sqlite3','pdo_mysql'] as `$extension) { echo `$extension.': '.(extension_loaded(`$extension) ? 'available' : 'missing').PHP_EOL; }"
sqlite3 --version
mysql --version
mysqld --version
mariadb --version
mariadbd --version
Get-Service | Where-Object { $_.Name -match 'mysql|maria' -or $_.DisplayName -match 'MySQL|MariaDB' }
```

Enregistrer la sortie réelle de chaque échec. Ne rien installer automatiquement. Si un prérequis bloque le jalon demandé, arrêter et indiquer le composant, la version minimale, la commande échouée, l'état détecté et l'action manuelle recommandée.

SQLite peut servir au bootstrap du jalon 1 et aux tests locaux compatibles des jalons 2 à 5. L'absence de MySQL ou MariaDB ne bloque donc pas ces jalons. Une base dédiée devient obligatoire pour terminer le jalon 6, valider le workflow du jalon 7 et exécuter les contrôles finaux du jalon 8.

`lezidejou_test` désigne la future base de test dédiée au moteur MySQL 8.4 lorsqu'elle devient nécessaire au jalon 6 ; elle n'est ni requise ni créée avant ce jalon. Aucun test annoncé comme compatible MySQL ne peut être considéré comme validé uniquement avec SQLite.

## 6. Architecture cible de phase 1

```text
HTTP public
  -> contrôleurs publics
  -> ProjectCatalog
  -> DTO immuables
  -> manifeste PHP versionné
  -> vues Blade SSR

HTTP /admin
  -> Filament AdminPanel
  -> garde web Laravel
  -> App\Domain\Identity\Models\User
  -> TOTP et codes de récupération protégés
```

Principes :

- `Portal` possède le catalogue et les règles de visibilité.
- `Identity` possède l'utilisateur administrateur et les règles d'accès.
- Les contrôleurs restent fins.
- Les vues ne lisent pas directement les manifestes.
- Un seul catalogue concret est utilisé ; aucune abstraction inutile n'est créée.
- DTO `readonly` et enums PHP pour les états et catégories.
- Routes publiques nommées.
- Les domaines ne dépendent pas de Filament ; Filament consomme `Identity`.

Arborescence cible indicative :

```text
LEZIDEJOU-platform/
├── .github/workflows/quality.yml
├── AGENTS.md
├── app/Domain/
│   ├── Identity/
│   └── Portal/
├── config/
├── database/
├── docs/
│   ├── implementation/phase-1-execplan.md
│   ├── reference/
│   │   ├── architecture-plateforme-jeux-applications-2026.md
│   │   └── charte-graphique-structure-lezidejou.md
│   ├── architecture/phase-1.md
│   ├── content/content-sourcing.md
│   └── runbooks/
│       ├── local-development.md
│       └── ovhcloud-readiness.md
├── resources/content/projects.php
├── resources/views/
├── routes/web.php
├── tests/
├── .env.testing.example
├── lighthouserc.cjs
├── phpstan.neon
├── phpunit.mysql.xml
└── playwright.config.ts
```

Les bases SQLite, rapports Playwright et rapports Lighthouse sont générés et ignorés par Git.

## 7. Routes publiques et navigation

### Navigation principale exacte

- Projets
- Musique
- Boutique
- À propos

Le mot-symbole LÉZIDÉJOU renvoie vers l'accueil. `/jeux` reste une entrée directe, mais ne devient un onglet principal qu'avec au moins deux jeux publics et maintenus. LivraSign reste dans le catalogue des projets.

Navigation secondaire :

- Contact uniquement si une méthode publique est approuvée ;
- Mentions légales ;
- Confidentialité.

### Routes éditoriales de phase 1

| Route | Comportement |
|---|---|
| `/` | Accueil LÉZIDÉJOU |
| `/projets` | Catalogue des projets visibles |
| `/projets/{slug}` | Fiche éditoriale générique |
| `/projets/good-gasoil-price` | Fiche interne |
| `/projets/menu-planner` | Fiche interne |
| `/projets/belote-pro` | Fiche interne |
| `/projets/maths-iles` | Fiche interne |
| `/projets/livrasign` | Fiche interne et destination externe seulement si validée |
| `/jeux` | Liste filtrée des jeux visibles |
| `/musique` | Joanto et Etbeur Music |
| `/boutique` | SerajoPrints et lien Etsy validé |
| `/a-propos` | Présentation LÉZIDÉJOU |
| `/contact` | Seulement si une méthode approuvée existe ; aucun formulaire par défaut |
| `/mentions-legales` | Informations légales |
| `/confidentialite` | Politique adaptée aux traitements réels |
| `/robots.txt` | Réponse dynamique |
| `/sitemap.xml` | Pages indexables uniquement |
| `/admin` | Panel Filament protégé |

Aucune route supplémentaire ne duplique `/musique` ou `/boutique` en phase 1.

### Routes fonctionnelles réservées

```text
/applications/prix-carburant
/applications/menu-planner
/jeux/belote-pro
/jeux/maths-iles
```

Elles ne sont ni créées ni liées pendant la phase 1.

### Routes éditoriales futures du Labo

```text
/labo
/labo/{slug}
```

Le sous-titre de travail est `Prototypes et expérimentations`. Ces routes sont seulement réservées dans la documentation. Elles ne sont ni créées ni liées pendant la phase 1 initiale.

La navigation cible pourra devenir `Projets`, `Labo`, `Musique`, `Boutique`, `À propos`, mais `Labo` n'apparaît que lorsqu'au moins un prototype réel, accessible et suffisamment présentable existe.

### Règles HTTP

- `published` : `200`, indexable et présent dans le sitemap si le contenu est complet ;
- `in_development` : `200`, visible, `noindex,follow`, absent du sitemap ;
- `hidden` : absent des listes et `404` sur sa route ;
- slug inconnu : `404` ;
- aucun lien ne pointe vers une route cachée ou réservée ;
- les liens externes ne forcent pas une nouvelle fenêtre ;
- aucune stack trace hors développement.

## 8. Modèle de contenu

Chaque `ProjectContent` immuable contient au minimum :

- identifiant stable, slug, titre et catégorie ;
- résumé, description et statut ;
- type de destination ;
- route ou URL validée ;
- image facultative et texte alternatif obligatoire si elle existe ;
- titre et description SEO.

Projets initiaux : GoodGasoilPrice, Menu Planner, Belote Pro, Maths & Îles et LivraSign.

Règles :

- un projet publié possède ses contenus, liens et assets validés ;
- un projet en développement peut ne pas avoir d'image ;
- aucune fausse capture ne remplace une image absente ;
- un contenu caché n'est ni listé, ni indexé, ni exposé au sitemap ;
- identifiants, slugs et routes sont uniques ;
- une destination externe utilise HTTPS et doit être confirmée ;
- le manifeste reste versionné, sans base ni CMS en phase 1 ;
- les fiches indiquent clairement que le métier n'est pas intégré.

### Cycle documentaire futur du Labo

```text
idée interne
→ prototype
→ en test
→ validé
→ projet consolidé
```

Sorties alternatives : `en pause` et `abandonné`. Identifiants techniques : `prototype`, `en_test`, `valide`, `en_pause`, `abandonne`, `consolide`. Les libellés publics restent en français clair.

Un prototype ne devient pas automatiquement un projet consolidé. La décision tient compte de son utilité, des retours, de sa stabilité, de sa maintenabilité, de son coût d'exploitation, de sa compatibilité architecturale, de sa conformité juridique, de sa sécurité et de la volonté de le maintenir.

Deux destinations sont possibles après validation :

1. intégration comme module durable de `LEZIDEJOU-platform` ;
2. application indépendante avec son dépôt, sa base, son domaine et son cycle propres.

Après migration, une seule version devient la référence active. L'ancien prototype est archivé ou marqué comme inactif.

Modes d'accès possibles : intégration au portail, application autonome ou démonstration limitée dans `/labo/{slug}`. La convention `<slug>.lab.lezidejou.fr` reste à confirmer. Aucune solution n'est imposée avant l'existence du premier prototype.

Une future fiche Labo indique le nom, l'objectif, le statut, ce qui fonctionne, les limites, la dernière mise à jour et uniquement les accès ou méthodes de retour réellement disponibles.

`sources/` et `prototypes/` restent des notions techniques internes et ne sont pas exposées comme catégories publiques.

## 9. Interface, SEO, accessibilité et performances

La charte canonique est `docs/reference/charte-graphique-structure-lezidejou.md`.

Exigences :

- catalogue éditorial numérique, sobre, chaleureux et précis ;
- fond ivoire, texte presque noir, bleu de marque ;
- Libre Franklin et IBM Plex Mono auto-hébergées avec licences ;
- grille éditoriale responsive ;
- vrais visuels uniquement ;
- animations limitées et `prefers-reduced-motion` ;
- aucune esthétique générique de startup IA ;
- aucune promesse, statistique, personne ou réalisation fictive.

Formulation de travail, à valider avant production :

> LÉZIDÉJOU rassemble des applications, des jeux, de la musique et des créations indépendantes.

SEO : titres et descriptions uniques, canonique explicite, Open Graph réel, `robots.txt`, sitemap limité, recette en `noindex`, aucune donnée structurée non vérifiée.

Accessibilité : HTML sémantique, un `h1`, ordre logique, skip-link, focus visible, clavier, zoom 200 %, textes alternatifs, contrastes WCAG AA et tests axe.

Performances : JavaScript minimal, assets locaux, images dimensionnées, lazy loading hors premier écran et audits Lighthouse de laboratoire. Les Core Web Vitals réels ne sont mesurables qu'après publication.

Largeurs minimales à inspecter : 360, 768, 1024 et 1440 px.

## 10. Administration Filament et TOTP

Identité :

- modèle unique `App\Domain\Identity\Models\User` ;
- aucun doublon `App\Models\User` ;
- `config/auth.php` référence le modèle central ;
- champ `is_admin` ;
- aucun accès Filament pour un non-administrateur ;
- aucune inscription publique.

Commande `lezidejou:admin:create` :

- demande nom et adresse électronique ;
- mot de passe et confirmation masqués ;
- minimum 12 caractères, majuscule, minuscule, chiffre et symbole ;
- refuse un courriel existant ;
- utilise `Hash::make` ;
- positionne `is_admin=true` et `email_verified_at` ;
- ne journalise aucun mot de passe, secret TOTP ou code de récupération ;
- ne modifie jamais silencieusement un compte existant.

TOTP :

- obligatoire avant accès au panel ;
- 8 codes de récupération ;
- secret TOTP et codes de récupération chiffrés au repos avec les casts chiffrés de Laravel ou une implémentation équivalente vérifiée ;
- noms de colonnes, contrats et traits alignés sur l'API Filament réellement installée ;
- champs sensibles masqués à la sérialisation ;
- marque affichée : `LÉZIDÉJOU` ;
- première connexion dirigée vers l'enrôlement ;
- aucun MFA par courriel ou SMS.

Configuration attendue, à aligner sur l'API Filament 5 installée :

```php
->multiFactorAuthentication([
    AppAuthentication::make()
        ->brandName('LÉZIDÉJOU')
        ->recoverable()
        ->recoveryCodeCount(8),
], isRequired: true)
```

La documentation officielle Filament 5 vérifiée le 11 août 2026 confirme `brandName()`, `recoverable()`, `recoveryCodeCount()` et `isRequired: true`.

## 11. Dépendances prévues

### Production Composer

- PHP `^8.4` ;
- Laravel `^13.0` ;
- Laravel Tinker `^3.0` ;
- Livewire `^4.0` si requis par Filament ou l'implémentation validée ;
- Filament `^5.0`.

### Développement Composer

Conserver les dépendances du squelette Laravel 13, puis ajouter Larastan `^3.0`. Ne supprimer aucune dépendance sans justification et validation.

### npm

- Vite `^8.0` ;
- Laravel Vite Plugin `^3.1` ;
- Tailwind CSS `^4.1` et `@tailwindcss/vite` `^4.1` si la traduction de charte retenue les utilise ;
- `@playwright/test` `^1` ;
- `@axe-core/playwright` `^4` ;
- `@lhci/cli` `^0.15`.

Aucune installation avant préflight et aucune installation hors `LEZIDEJOU-platform`.

## 12. Stratégie de tests

- Unit : enums, DTO, catalogue et règles de publication.
- Feature : routes, navigation, HTTP, SEO, sitemap, robots et administration.
- Integration : migrations et comportements du moteur MySQL 8.4 de référence.
- Architecture : modèle d'authentification unique et dépendances de domaine.
- Browser : responsive, clavier, liens, axe et parcours principaux.

Matrices : SQLite pour Unit/Feature et navigateur ; MySQL 8.4 dédié pour Integration par défaut ; CI sous PHP 8.4, Node.js 24 LTS et moteur MySQL 8.4 représentatif. La réussite sous SQLite ne valide jamais une compatibilité annoncée avec MySQL.

Scénarios essentiels : routes publiques, états de publication, sitemap, navigation exacte, absence de liens cassés, métadonnées uniques, `/admin` protégé, non-administrateur refusé, secret TOTP et codes de récupération chiffrés au repos, migrations SQLite et moteur SQL représentatif, responsive, clavier et axe sans violation sérieuse ou critique.

Playwright et Lighthouse sont strictement séquentiels et utilisent des ports distincts.

## 13. Playwright et Lighthouse

### Playwright

- `workers: 1` ;
- `baseURL: http://127.0.0.1:8001` ;
- serveur `php artisan serve --env=testing --host=127.0.0.1 --port=8001 --no-reload` ;
- `reuseExistingServer: false` ;
- `APP_ENV=testing`, SQLite, queue `sync` ;
- aucun secret réel ;
- vérification de la libération du port après exécution.

Sous Windows, ne jamais tuer globalement tous les processus PHP. Identifier le PID créé par le test si un processus résiduel existe.

### Lighthouse

- port 8002 ;
- trois exécutions par URL ;
- cibles : `/`, `/projets`, les cinq fiches si visibles, `/jeux`, `/musique`, `/boutique` ;
- aucune route fonctionnelle réservée ;
- aucune route Labo tant que la rubrique n'est pas réellement implémentée ;
- rapports locaux dans `.lighthouseci/` ;
- aucun envoi externe ;
- motif de disponibilité adapté à la sortie réelle de Laravel avant le premier audit.

Objectifs initiaux non acquis avant mesure : performance 0,90 ; accessibilité 1,00 ; bonnes pratiques 0,95 ; SEO 0,95 ; LCP 2 500 ms ; CLS 0,10 ; TBT 200 ms.

Un seuil ne peut être ajusté que si le résultat initial et la cause sont documentés et si l'ajustement ne masque pas une régression.

## 14. GitHub Actions et MySQL 8.4

L'intégration continue est structurée en deux workflows étanches sans aucun déploiement automatique :

### 14.1 CI rapide automatique (`.github/workflows/quality.yml`)

Ce workflow valide rapidement la qualité du code à chaque intégration :
- **Déclencheurs** :
  - `push` sur les branches `feat/phase-1-foundation` et `main` ;
  - `pull_request` vers `main` ;
  - Déclenchement manuel (`workflow_dispatch`).
- **Filtres de chemins** : Ignore les modifications exclusivement documentaires (`docs/**`, `README.md`).
- **Concurrence** : Concurrence configurée avec annulation des exécutions obsolètes (`cancel-in-progress: true`).
- **Environnement** : PHP 8.4, Node.js 24 LTS, conteneur de service MySQL 8.4.11 avec base dédiée `lezidejou_test` et compte applicatif non-root `lezidejou_test_user`.
- **Exclusions** : Aucune installation de Chromium, aucun test Playwright et aucun test Lighthouse complet dans ce workflow rapide.

**Séquence ordonnée exacte :**
1. Installation Composer (`composer install --no-interaction --prefer-dist --no-progress`)
2. Installation npm reproductible avec `npm ci`
3. Test Node du patch d'isolation Lighthouse Windows (`npm run test:lighthouse-patch`)
4. Préparation de l'environnement SQLite (`cp .env.testing.example .env.testing`, `key:generate`, `migrate`)
5. Validation de la configuration Composer (`composer validate --strict`)
6. Vérification du style de code Pint (`php vendor/bin/pint --test`)
7. Analyse statique PHPStan niveau 5 (`php vendor/bin/phpstan analyse`)
8. Compilation des assets frontend avec Vite (`npm run build`) — **positionné obligatoirement avant toute suite Feature testant des vues avec `@vite`**
9. Tests unitaires PHPUnit sous SQLite (`php artisan test --testsuite=Unit`)
10. Tests fonctionnels PHPUnit sous SQLite (`php artisan test --testsuite=Feature`)
11. Tests d'intégration PHPUnit sous MySQL 8.4 (création éphémère de `.env.mysql-testing` depuis `.env.testing`, correction de la collation `utf8mb4_unicode_ci` via `docker exec`, migrations `php artisan migrate --env=mysql-testing --force` puis exécution directe `php vendor/bin/phpunit --configuration=phpunit.mysql.xml --testsuite=Integration`)

### 14.2 CI navigateur conditionnelle (`.github/workflows/browser-quality.yml`)

Ce workflow gère les tests navigateur réels :
- **Déclencheurs** :
  - `push` sur `feat/phase-1-foundation` et `main` uniquement pour les modifications de fichiers pouvant influencer l'interface ou le navigateur (filtres de chemins sur `app/**`, `bootstrap/**`, `config/**`, `resources/**`, `routes/**`, `public/**`, `tests/Browser/**`, `playwright.config.ts`, `lighthouserc.cjs`, `lighthouse-win-patch.cjs`, `scripts/lighthouse-*.cjs`, dépendances, `.env.testing.example` et le workflow lui-même) ;
  - `pull_request` vers `main` avec les mêmes filtres de chemins ;
  - Déclenchement manuel (`workflow_dispatch`) avec l'input booléen explicite `run_lighthouse` (désactivé par défaut).
- **Filtres documentaires** : Aucune exécution automatique pour une modification exclusivement documentaire.
- **Exécution Playwright** : Installation de Chromium (`npx playwright install --with-deps chromium`), build Vite (`npm run build`), et exécution de Playwright E2E avec un seul worker (`npm run test:e2e`).
- **Exécution Lighthouse CI complet** : Jamais exécuté automatiquement sur un push ou une pull request ; exécuté uniquement lors d'un déclenchement manuel explicite (`workflow_dispatch` avec `run_lighthouse: true`).
- **Archivage des artefacts** : Les rapports Playwright et Lighthouse sont archivés principalement en cas d'échec (`if: failure()`).

### 14.3 Base de données de test MySQL 8.4

Base CI dédiée : `lezidejou_test`. Cette base apparaît d'abord au jalon 6 pour la validation locale représentative, puis est disponible dans le service SQL du workflow rapide et pour les contrôles d'intégration.

> **Prérequis administré localement (intervention humaine, non versionnable).** La base `lezidejou_test` et le compte applicatif dédié `lezidejou_test_user` doivent être créés une fois par un administrateur MySQL local, de façon interactive, avant la première exécution de la suite Integration. Cette opération utilise un compte administrateur MySQL disponible localement ; elle n'est pas scriptée dans ce document, ne doit jamais apparaître dans un fichier versionné et ne doit jamais exposer de mot de passe. Les identifiants applicatifs (`DB_USERNAME`, `DB_PASSWORD`, `DB_HOST`, `DB_DATABASE`) sont fournis exclusivement par `.env.mysql-testing`, ignoré par Git.

Laravel et PHPUnit utilisent uniquement le compte dédié `lezidejou_test_user`, jamais le compte administrateur.

```bash
# Commandes Laravel — compte dédié uniquement, identifiants fournis par l'environnement local ignoré
# Note : APP_ENV=mysql-testing est défini par phpunit.mysql.xml ; en CI, .env.mysql-testing est généré éphémèrement depuis .env.testing
php artisan migrate --env=mysql-testing --force
php vendor/bin/phpunit --configuration=phpunit.mysql.xml --testsuite=Integration
```

Les identifiants du service CI doivent être vérifiés contre l'image effective du runner. Un échec bloque le workflow ; il n'autorise ni la suppression des tests SQL représentatifs ni leur remplacement par les seuls tests SQLite.

## 15. Compatibilité OVHcloud

Règles de portabilité : MySQL 8.4 minimum pour le chemin de référence ; `utf8mb4_unicode_ci`, clés explicites, chaînes indexables, statuts en chaînes validées par enums, aucun `ENUM` natif, procédure stockée, trigger ou dépendance SQLite dans le métier. SQLite reste adapté au bootstrap et aux tests compatibles, mais ne constitue pas une validation représentative de l'hébergement.

Avant toute production, confirmer : offre exacte, PHP 8.4 et extensions, moteur/version SQL, SSH, Composer/Artisan, racine `public/`, permissions, CRON, mémoire, temps d'exécution, limites, sauvegardes/restauration, HTTPS, variables d'environnement, maintenance et rollback.

Ces confirmations ne bloquent pas le développement local mais bloquent toute autorisation de production.

## 16. Documentation à créer pendant l'implémentation

- `docs/architecture/phase-1.md` ;
- `docs/runbooks/local-development.md` ;
- `docs/runbooks/ovhcloud-readiness.md` ;
- `docs/content/content-sourcing.md`.

Le README actuel est le point d'entrée concis du dépôt. Ses liens vers les trois documents canoniques doivent rester valides pendant l'implémentation.

## 17. Contenus à fournir ou confirmer

Avant fin fonctionnelle : textes de l'accueil et À propos, descriptions des cinq projets, liens officiels LivraSign/Joanto/SerajoPrints, logos et visuels, licences, méthode de contact éventuelle, statuts de publication, textes légaux.

Avant production : identité légale, responsable de publication, hébergeur, coordonnées publiables, confidentialité approuvée, domaine canonique, accès OVHcloud transmis hors dépôt et autorisation explicite.

Les données manquantes ne sont jamais inventées. Elles peuvent empêcher la fin fonctionnelle sans bloquer le socle technique.

## 18. Risques et politique d'arrêt

Risques connus : état Git utilisateur préexistant, exécutables non accessibles dans la session actuelle, collisions possibles avec le squelette, API exacte des dépendances à vérifier après résolution, seuils Lighthouse non mesurés, offre OVHcloud non confirmée, assets réels potentiellement incomplets et tentation d'anticiper le Labo par des structures vides.

Arrêter immédiatement si :

- la racine Git n'est pas exactement `LEZIDEJOU-platform` ;
- un chemin source ou cible est ambigu ;
- un fichier utilisateur risque d'être écrasé ;
- un document canonique est absent ou divergent sans décision ;
- PHP ou Composer ne satisfont pas les versions minimales avant le jalon 1, ou Node.js 24 LTS n'est pas actif avant une installation ou compilation frontend ;
- une dépendance est incompatible ;
- une commande tente d'écrire hors du dépôt central ou sous `sources/` ;
- un secret apparaît dans une sortie ou un fichier versionnable ;
- une migration cible une base non identifiée comme base de test ;
- une décision requise n'est pas couverte par le plan ;
- une validation échoue et n'est pas corrigée.

## 19. Niveaux de validation

### Niveau 1 — Socle techniquement implémenté (Atteint le 14 août 2026)

Laravel, architecture monolithe modulaire, catalogue éditorial typé, routes et navigation, Filament/TOTP, double moteur SQLite et MySQL 8.4.11 représentatif, tests automatisés (Unit, Feature, Integration, Playwright 4 viewports), Lighthouse historique validé (30/30 collectes), double workflow CI GitHub Actions (`quality.yml` et `browser-quality.yml`) et documentation technique avec runbooks sont intégralement validés à distance.

### Niveau 2 — Phase 1 fonctionnellement terminée (Atteint le 20 août 2026)

En plus du niveau 1 : textes éditoriaux définitifs, liens externes officiels, assets et visuels réels, licences, mentions légales finales et coordonnées de l'hébergeur physique sont validés ; aucun contenu fictif ne subsiste.

### Niveau 3 — Production autorisée (Non atteint)

En plus des niveaux 1 et 2 : offre OVHcloud confirmée, domaine canonique confirmé, HTTPS, sauvegarde/restauration, rollback, secrets de production, identité légale et confidentialité sont confirmés, puis l'utilisateur donne une autorisation explicite de déployer.

Aucune action de ce plan n'atteint automatiquement le niveau 3.

## 20. Jalons exécutables 0 à 8

### Jalon 0 — Inspection et préflight

**Objectif :** confirmer le contexte sans mutation applicative et initialiser le suivi du plan.

**Actions :** relire `AGENTS.md` et l'ExecPlan, exécuter la section 5, vérifier les cinq racines Git, inspecter `prototypes/` sans y créer de projet, consigner `README.md`, `docs/`, outils, versions et états Git, puis initialiser progression, décisions, découvertes, validations, problèmes et prochain jalon.

**Contrôles :**

```powershell
git status --short --untracked-files=all
git diff --check
```

**Acceptation :** racine correcte, état initial documenté, plan inchangé hors sections vivantes, aucun fichier applicatif modifié.

**Arrêt :** ambiguïté de racine, divergence non comprise ou prérequis bloquant.

### Jalon 1 — Fusion prudente du squelette Laravel

**Objectif :** créer un squelette Laravel 13 temporaire puis copier uniquement les fichiers autorisés et absents.

**Exclusions absolues :** `.git`, `.env`, `README.md`, `docs/`, SQLite, `composer.lock`, `vendor/`, `node_modules/`, caches et fichiers générés.

**Commandes initiales :**

```powershell
Set-Location .\LEZIDEJOU-platform
$lezidejouTarget = (Resolve-Path .).Path
$lezidejouScaffold = Join-Path ([System.IO.Path]::GetTempPath()) ("lezidejou-laravel-scaffold-" + [guid]::NewGuid())
composer create-project laravel/laravel $lezidejouScaffold "^13.0" --no-scripts --no-install --no-interaction --prefer-dist
$lezidejouScaffoldResolved = (Resolve-Path -LiteralPath $lezidejouScaffold).Path
$lezidejouTargetResolved = (Resolve-Path -LiteralPath $lezidejouTarget).Path
$lezidejouScaffoldResolved
$lezidejouTargetResolved
```

Inventorier les collisions avant toute copie. Ne jamais utiliser `-Force` pour remplacer une cible. Comparer chaque collision et intégrer manuellement seulement le nécessaire.

**Acceptation :** socle présent, aucune collision écrasée, aucun élément exclu copié, README actuel et documentation préservés.

**Arrêt :** chemin incorrect, collision non résolue ou risque d'écrasement.

### Jalon 2 — Dépendances, environnement et domaines

**Objectif :** résoudre les dépendances approuvées, créer l'environnement local en sécurité et les domaines `Portal`/`Identity` seulement.

**Actions :** confirmer que Node.js 24 LTS est actif avant toute commande npm, fixer PHP `^8.4`, ajouter les dépendances sans résolution intermédiaire, résoudre une fois, installer npm, créer `.env` seulement s'il manque, ne générer une clé que si vide, créer `.env.testing.example` sans secret et sans `DB_DATABASE`, configurer les exclusions et les outils de qualité.

**Commandes principales :**

```powershell
composer require php:^8.4 livewire/livewire:^4.0 filament/filament:^5.0 --no-update --no-interaction
composer require --dev larastan/larastan:^3.0 --no-update --no-interaction
composer update --with-all-dependencies --no-interaction --prefer-dist
npm install
npm install --save-dev tailwindcss@^4.1 @tailwindcss/vite@^4.1 @playwright/test@^1 @axe-core/playwright@^4 @lhci/cli@^0.15
composer validate --strict
composer check-platform-reqs
npm ls
```

**Acceptation :** versions compatibles, lockfiles créés dans la cible, aucune clé remplacée, aucun secret, domaines limités au plan, build et analyses réussis.

**Arrêt :** incompatibilité, secret, clé existante menacée ou commande hors périmètre.

### Jalon 3 — Catalogue, routes et navigation

**Objectif :** implémenter le catalogue typé, les cinq fiches et les routes éditoriales exactes.

**Actions :** créer enums/DTO/catalogue, statuts `published`, `in_development`, `hidden`, routes de la section 7, navigation principale, pages musique/boutique/institutionnelles, omettre `/contact` sans méthode approuvée et ne créer aucune route fonctionnelle ou route Labo réservée.

**Contrôles :**

```powershell
php artisan route:list
php artisan test --testsuite=Unit
php artisan test --testsuite=Feature
php vendor/bin/phpstan analyse
php vendor/bin/pint --test
git diff --check
```

**Acceptation :** navigation exacte sans entrée Labo prématurée, catalogue valide, états HTTP corrects, aucun lien ou contenu inventé, aucune route réservée.

**Arrêt :** donnée non vérifiée modifiant le comportement public ou contradiction avec la structure normative.

### Jalon 4 — Interface, SEO et accessibilité

**Objectif :** appliquer la charte et rendre le portail responsive, accessible, indexable et performant.

**Actions :** layout/composants, palette/typo/grille, polices locales avec licences, métadonnées/canoniques/Open Graph réels, robots/sitemap, skip-link/focus/titres/reduced motion, optimisation des assets, vérifications 360/768/1024/1440, clavier et zoom 200 %.

**Contrôles :**

```powershell
npm run build
php artisan test --testsuite=Feature
php vendor/bin/phpstan analyse
php vendor/bin/pint --test
php artisan view:cache
```

**Acceptation :** build réussi, SEO testé, clavier utilisable, aucun asset sans origine/licence et aucun contenu fictif.

**Arrêt :** asset non autorisé ou correction visuelle dégradant l'accessibilité/SEO.

### Jalon 5 — Filament, administrateur et TOTP

**Objectif :** fournir une administration strictement réservée aux administrateurs avec TOTP obligatoire.

**Actions :** modèle `Identity`, fournisseur auth, `is_admin`, panel `/admin`, refus des non-administrateurs, MFA obligatoire, codes de récupération, commande `lezidejou:admin:create` et tests de chiffrement/accès.

Ne pas exécuter la commande de création d'administrateur réel sans demande explicite.

**Contrôles :**

```powershell
php artisan migrate --env=testing --force
php artisan route:list --path=admin
php artisan test --filter=Admin
php artisan test --filter=MultiFactor
php artisan config:show auth
```

Ne jamais afficher les secrets ni les valeurs chiffrées.

Sous ce jalon, les migrations et tests locaux compatibles utilisent SQLite. MySQL ou MariaDB n'est pas encore requis.

**Acceptation :** panel protégé, non-administrateur refusé, TOTP imposé, secret TOTP et codes de récupération chiffrés au repos, champs sensibles masqués et modèle unique.

**Arrêt :** secret exposé, contournement possible ou modèle incorrect.

### Jalon 6 — SQLite, MySQL 8.4 et navigateur

**Objectif :** valider l'application sous SQLite, sous le moteur MySQL 8.4 représentatif dédié et sous Chromium.

**Actions :** créer `.env.testing` seulement s'il manque, préserver sa clé, créer SQLite, migrer avec `--env=testing`, préparer pour la première fois `lezidejou_test` sur le moteur représentatif, exécuter Unit/Feature/Integration, installer Chromium, lancer Playwright avec un worker et vérifier le port 8001.

**Extrait MySQL local de référence :**

> **Prérequis administré localement.** La base `lezidejou_test` et le compte `lezidejou_test_user` sont créés une fois, de façon interactive, par un administrateur MySQL local. Cette opération n'est pas reproduite dans ce document. Les identifiants applicatifs sont fournis exclusivement par `.env.mysql-testing`, ignoré par Git.

Après ce prérequis, Laravel migre et PHPUnit exécute la suite Integration avec le compte dédié :

```powershell
# Identifiants fournis par .env.mysql-testing (ignoré par Git) — ne pas les écrire ici
php artisan migrate --env=mysql-testing --force
php vendor/bin/phpunit --configuration=phpunit.mysql.xml --testsuite=Integration
```

Aucune commande `migrate:fresh` locale. Aucun mot de passe dans ce fichier.

**Acceptation :** toutes les suites réussies, moteurs compatibles, aucun worker supplémentaire et aucun processus résiduel.

**Arrêt :** base non dédiée, migration destructive ou test échoué.

### Jalon 7 — Lighthouse et CI

**Objectif :** valider les performances de laboratoire et automatiser la qualité sans déploiement.

**Actions :** observer la sortie réelle du serveur 8002, adapter le motif, exécuter Lighthouse, documenter les mesures, créer le workflow initial avec son service MySQL 8.4 représentatif et sa base dédiée `lezidejou_test`, exécuter la suite Integration, vérifier l'ordre Playwright puis Lighthouse et conserver les rapports en artefacts (l'organisation CI a été ensuite consolidée au jalon 8 par la scission en une CI rapide automatique et une CI navigateur conditionnelle).

**Contrôles :**

```powershell
npm run test:e2e
npm run test:lighthouse
Get-NetTCPConnection -LocalPort 8001,8002 -ErrorAction SilentlyContinue
git diff --check
git status --short --untracked-files=all
```

**Acceptation :** toutes les URL éditoriales prévues auditées, trois collectes, aucun envoi externe, CI sans déploiement et échecs non masqués.

**Arrêt :** serveur non détecté, port résiduel, route réservée auditée ou échec masqué.

### Jalon 8 — Documentation et compte rendu

**Objectif :** finaliser la documentation, exécuter la chaîne de contrôle et rendre compte avec le commit local de checkpoint.

**Actions :** créer les documents de la section 16, mettre à jour les sections vivantes, exécuter les contrôles, vérifier les cinq dépôts, distinguer les changements utilisateur préexistants et produire le compte rendu.

**Contrôles finaux :**

```powershell
composer validate --strict
npm run test:lighthouse-patch
php vendor/bin/pint --test
php vendor/bin/phpstan analyse
npm run build
php artisan test --testsuite=Unit
php artisan test --testsuite=Feature
php vendor/bin/phpunit --configuration=phpunit.mysql.xml --testsuite=Integration
npm run test:e2e
npm run test:lighthouse
php artisan route:list
git diff --check
git status --short --untracked-files=all
```

**Acceptation :** documentation à jour, validations réussies, niveau annoncé, écarts et problèmes visibles, dépôts sources inchangés, commits locaux de checkpoint effectués, aucun push/déploiement.

**Arrêt :** aucun jalon n'est terminé sur la seule présence des fichiers ; tout échec reste bloquant jusqu'à correction ou décision explicite.

## 21. Compte rendu final d'implémentation attendu

- niveau de validation atteint ;
- jalons terminés et incomplets ;
- fichiers créés/modifiés ;
- dépendances et versions résolues ;
- commandes et résultats ;
- résultats SQLite et MySQL 8.4, PHP, Playwright, axe, build et Lighthouse ;
- état Git final ;
- distinction des modifications utilisateur préexistantes ;
- écarts, contenus manquants, risques et problèmes ;
- prérequis de production ;
- confirmation des dépôts sources inchangés ;
- confirmation d'absence de push, merge, rebase, tag, pull request et déploiement.

## 22. Checklist initiale « prêt à démarrer » — historique

> **Note d'historique.** Cette checklist documente les conditions d'éligibilité et de préflight initiales observées avant le lancement de la phase 1. Le suivi courant des jalons et leur statut d'exécution sont désormais assurés par la section [Suivi d'exécution de la phase 1](#suivi-dexecution-de-la-phase-1).

- [ ] L'implémentation de la phase 1 est explicitement autorisée.
- [ ] La racine de travail est `LEZIDEJOU-platform`.
- [ ] Les `AGENTS.md` et le présent plan ont été relus.
- [ ] L'état Git préexistant est accepté et documenté.
- [ ] Le `README.md` actuel est présent et ses trois liens documentaires sont valides.
- [ ] Les trois documents canoniques sont présents.
- [ ] Aucun dépôt sous `sources/` ne sera modifié.
- [ ] Aucun prototype, dépôt Git de prototype, route ou fiche Labo ne sera créé pendant la phase 1 initiale.
- [ ] PHP 8.4 et Composer sont accessibles avant le jalon 1 ; Node.js 24 LTS est actif avant toute installation ou compilation frontend.
- [ ] Aucun secret, push, merge, rebase, tag, pull request ou déploiement n'est autorisé sans accord explicite (seuls les commits locaux de checkpoint par jalon validé sont autorisés).
- [ ] L'exécution s'arrête au premier prérequis bloquant ou test non corrigé.
- [ ] Aucun métier source ni module futur vide n'est créé.

## 23. Prompt initial d'autorisation — historique

> **Note d'historique.** Le prompt ci-dessous est conservé uniquement pour la traçabilité de l'autorisation initiale de démarrage de la phase 1. Il ne doit plus être utilisé pour piloter l'exécution courante. L'état courant du projet, les validations effectives et le prochain jalon sont définis exclusivement par la section [Suivi d'exécution de la phase 1](#suivi-dexecution-de-la-phase-1).

```text
J'autorise maintenant l'implémentation de la phase 1 LÉZIDÉJOU conformément au plan consolidé dans `docs/implementation/phase-1-execplan.md`.

Travaille exclusivement dans `LEZIDEJOU-platform` et respecte les `AGENTS.md` du workspace et du dépôt.

Avant toute modification applicative :
1. relis intégralement l'ExecPlan ;
2. exécute le préflight non destructif du jalon 0 ;
3. vérifie l'état Git, le `README.md` actuel et les documents canoniques ;
4. initialise les sections vivantes de progression, décisions, découvertes, validations, problèmes et prochain jalon.

Exécute ensuite les jalons 0 à 8 dans l'ordre, en validant chaque jalon avant le suivant. Corrige toute validation échouée et ne déclare jamais un jalon terminé sur la seule création de fichiers.

Contraintes absolues :
- ne modifie aucun dépôt sous `sources/` ;
- ne crée ni ne modifie aucun prototype sans demande explicite ciblant ce prototype ;
- ne copie aucun code métier provenant de `sources/` ;
- ne crée aucun module métier vide ;
- ne crée aucune route, fiche, modèle ou contrôleur Labo par anticipation ;
- préserve les modifications utilisateur ;
- n'écrase aucun fichier sans inspection et comparaison ;
- n'installe aucune dépendance système automatiquement ;
- ne révèle, n'enregistre et ne versionne aucun secret ;
- ne remplace aucune clé existante ;
- n'exécute aucune migration destructive ;
- ne crée aucun push, merge, rebase, tag, pull request ou réécriture d'historique sans autorisation explicite (seuls les commits locaux de checkpoint par jalon validé sont autorisés) ;
- ne modifie pas l'historique Git préexistant ;
- ne déploie rien.

Si une décision fonctionnelle, architecturale, de sécurité, de coût ou de production non couverte par le plan devient nécessaire, arrête-toi et demande ma validation.

À la fin, fournis le compte rendu prévu par le plan avec commandes, résultats, fichiers, validations, écarts, problèmes restants et états Git finaux.
```

## 24. Suivi de la finalisation du Niveau 2 (Phase 1)

### 24.1 Statut général

- **Niveau 1 (Socle technique)** : **Atteint le 14 août 2026** (validé par tests Unit, Feature, Integration MySQL 8.4, Playwright E2E sur 4 viewports, Lighthouse CI et double workflow GitHub Actions).
- **Niveau 2 (Finalisation fonctionnelle et éditoriale de la Phase 1)** : **Atteint le 20 août 2026**, après exécution et validation des jalons N2-0 à N2-5.
- **Niveau 3 (Production autorisée)** : **Non atteint** (exige la confirmation de l'offre d'hébergement, du domaine canonique, de la configuration HTTPS, des sauvegardes et de la restauration, du plan de rollback, des secrets de production et d'une autorisation explicite de déploiement).
- **Phase 2 (GoodGasoilPrice)** : **Non commencée et non autorisée**.
- **Déploiement** : **Première release `v1.0.0` effectuée en production le 23 août 2026** ; le jalon N3-6 de recette/GO reste en cours.

### 24.2 Décisions déjà actées

- **Navigation principale exacte** :
  1. **Projets** (`/projets`)
  2. **Musique** (`/musique`)
  3. **Boutique** (`/boutique`)
  4. **À propos** (`/a-propos`)
  - Le mot-symbole `LÉZIDÉJOU` renvoie systématiquement vers l'accueil (`/`).
  - `/jeux` reste une entrée directe vers les projets de type jeu sans devenir un onglet principal (réservé à la présence d'au moins deux jeux publics et maintenus).
- **Statuts de catalogue actuels** :
  - Good Gasoil Price est `published`.
  - Menu Planner, Belote Pro, Maths & Îles et LivraSign sont `in_development`.
  - Seuls les trois statuts d'énumération `published`, `in_development` et `hidden` sont autorisés dans le catalogue.
- **LivraSign** :
  - LivraSign est une application professionnelle indépendante et reste limité en Phase 1 à une fiche éditoriale interne (`/projets/livrasign`), sans lien externe ni bouton d'action (CTA) tant qu'une URL HTTPS officielle n'est pas confirmée.
- **Good Gasoil Price** :
  - L'application possède une URL publique Railway validée : `https://carburants-lezidejou.up.railway.app/`.
  - Le dépôt source public officiel reste distinct : `https://github.com/Etbeur/GoodGasoilPrice`.
- **Identité publique de l'éditeur** :
  - Marque centrale : **LÉZIDÉJOU**.
  - Identité publique de l'éditeur : Pseudonyme **Etbeur**.
  - Profil GitHub officiel de l'éditeur : `https://github.com/Etbeur`.
  - Aucune identité civile, raison sociale d'entreprise inexistante ou adresse personnelle n'est publiée sur le portail.
- **Absence de suivi, de publicité et de vente directe** :
  - Aucun suivi analytique, aucune publicité, aucun pixel, aucun cookie non essentiel et aucun formulaire de contact ou de collecte non validé.
- **Périmètre applicatif strict du Niveau 2** :
  - Aucune route fonctionnelle de projet (`/applications/*`, `/jeux/*`), aucun code métier sous `sources/` et aucune rubrique ni route `Labo` (`/labo`, `/labo/*`) ne sont intégrés dans le Niveau 2.

### 24.3 Roadmap de finalisation du Niveau 2

#### N2-0 — Formalisation de la finalisation du Niveau 2
- Consignation de la roadmap détaillée et structurée du Niveau 2 dans l'ExecPlan.
- Clarification rigoureuse du périmètre de finalisation de la Phase 1.
- Séparation stricte des exigences de fin fonctionnelle (Niveau 2) et des exigences d'infrastructure/production (Niveau 3).
- Statut de ce jalon mis à jour uniquement après réalisation et vérification de la présente modification documentaire.

#### N2-1 — Décisions éditoriales
- Validation définitive des textes et formulations de l'accueil (`/`).
- Validation définitive de la page À propos (`/a-propos`) (structure, démarche, relation entre entités).
- Validation des descriptions et résumés des cinq projets du catalogue.
- Décision sur l'emplacement public du profil GitHub officiel `https://github.com/Etbeur` (ex. pied de page ou À propos).

#### N2-2 — Projets et assets
- Audit éditorial successif et ordonné :
  1. GoodGasoilPrice
  2. Menu Planner
  3. Belote Pro
  4. Maths & Îles
- LivraSign reste strictement limité à sa fiche éditoriale interne (`/projets/livrasign`), sans lien externe ni CTA.
- Choix explicite et motivé, projet par projet, entre :
  - un visuel réel, autorisé et traçable (capture authentique, illustration propre) ;
  - une composition textuelle sobre et valorisante conforme à la charte graphique.
- Une image n'est pas obligatoire pour chaque projet `in_development`.
- Lorsqu'une image est retenue, sa provenance, sa licence/propriété intellectuelle et son texte alternatif d'accessibilité doivent être formellement validés.
- Aucun faux logo, faux screenshot, mockup flottant ou visuel fictif, trompeur, générique ou non autorisé ne peut remplacer un asset absent.

#### N2-3 — Musique et Boutique
- Contenus réels et authentiques retenus pour Joanto et Etbeur Music : hero avec photo studio verticale validée (`joanto-studio-portrait-768.webp` et `384.webp`), présentation éditoriale, section « Sorties » présentant les 8 sorties discographiques effectives par ordre chronologique inversé (avec dates `<time datetime="...">` précises et pochettes WebP optimisées 1024x1024 et 512x512, dont Pace Ritual issue de la source authentique carrée 3000x3000px), carrousel Swiper 14 Coverflow modulaire centré avec boucle continue (loop), vitesse `DEFAULT_SPEED = 700`, glissement contrôlé et adaptation prefers-reduced-motion (`speed = 0`), strictement contenu dans le conteneur sans aucun débordement de page, section « Écouter Joanto » avec 4 plateformes vérifiées (Spotify, Apple Music, YouTube Music, Linktree) et section distincte « Suivre Joanto » avec 2 canaux officiels (YouTube, Instagram), sans doublon de lien et avec icônes officielles locales.
- Contenus réels retenus pour SerajoPrints : intégration sobre du logo officiel WebP optimisé, présentation factuelle de la collection initiale de cartes éducatives à imprimer et ajout du CTA externe sobre « Découvrir SerajoPrints » pointant vers la boutique officielle Etsy (`https://www.etsy.com/fr/shop/SerajoPrints`).
- Ajout uniquement de liens officiels externes explicitement fournis et vérifiés (plateformes de streaming, boutique Etsy).
- Aucune URL ne doit être recherchée, supposée ou inventée.
- Aucune vente directe sur la plateforme, aucun widget commercial, aucun script ou iframe tiers, aucun tunnel de commande dupliqué et aucun lecteur audio automatique.

#### N2-4 — Juridique, confidentialité et SEO
- Finalisation des Mentions légales selon le cadre applicable (coordonnées hébergeur physique OVH SAS, point de contact électronique `contact@lezidejou.fr`, sans divulgation d'identité civile privée ni attribution de personnalité morale au portail, mention sobre de la boutique externe SerajoPrints sur Etsy).
- Finalisation de la politique de Confidentialité adaptée aux traitements effectifs de la plateforme : pile middleware web standard de Laravel (cookies techniques de session et sécurité CSRF strictement nécessaires exemptés de consentement préalable selon les lignes directrices de la CNIL, sans nécessité de bandeau), absence totale de formulaires, de cookies publicitaires et de traceurs tiers, données techniques de logs d'hébergement et applicatifs sous base d'intérêt légitime factuelle (art. 6.1.f RGPD) avec durée de conservation proportionnée, traitement par les prestataires techniques de messagerie et d'hébergement, perspective Google Search Console après mise en ligne sans tracking client, couverture des liens externes dont Etsy.
- Adresse électronique publique dédiée de contact opérationnelle (`contact@lezidejou.fr`).
- Investigation et correction de la collision entre le fichier physique `public/robots.txt` et la route dynamique Laravel `/robots.txt` par suppression du fichier statique.
- Validation de la politique d'indexation `robots.txt` et du flux XML `sitemap.xml` par environnement (blocage ciblé des crawlers d'entraînement IA tiers GPTBot et ClaudeBot, autorisation générale de recherche/découverte/grounding IA incluant Google-Extended, annonce du sitemap canonique en production, `Disallow: /` hors production).
- Aucune identité civile ni adresse personnelle publiée sur le portail.
- Préservation des exigences d'infrastructure au **Niveau 3** : domaine canonique définitif, HTTPS, gestion des secrets de production, politique de sauvegarde, procédure de restauration, plan de rollback et autorisation explicite de déploiement restent classés au Niveau 3.

#### N2-5 — Recette finale et verdict Niveau 2
- Contrôle exhaustif des 13 pages rendues côté serveur.
- Vérification de la navigation desktop et mobile (menu natif `<details>/<summary>`).
- Contrôles responsive sur les 4 largeurs canoniques (360 px, 768 px, 1024 px, 1440 px).
- Accessibilité : navigation au clavier, zoom à 200 %, axe d'accessibilité et textes alternatifs complets.
- Vérification de l'ensemble des liens internes et des liens externes validés.
- Métadonnées SEO uniques, balises canoniques, indexation, `robots.txt` et `sitemap.xml`.
- Exécution complète de la suite de tests applicables et de la CI (Unit, Feature, Integration MySQL 8.4, Playwright E2E, Lighthouse de laboratoire).
- Absence confirmée de routes fonctionnelles réservées (`/applications/*`, `/jeux/*`) et de routes Labo (`/labo`).
- Revue indépendante finale.
- Prononcé du verdict formel **GO** ou **NO-GO** pour l'atteinte du Niveau 2.

### 24.4 Suivi opérationnel des jalons Niveau 2

| Jalon | Statut | Décisions nécessaires | Éléments attendus | Validations réalisées | Blocages | Prochaine action autorisée |
|---|---|---|---|---|---|---|
| **N2-0 — Formalisation** | **Terminé et validé le 15 août 2026** | Roadmap et périmètre du Niveau 2 validés | Section 24 intégrée à l'ExecPlan, cohérente avec l'architecture et la charte | Contrôle croisé des documents normatifs, `git diff --check`, audit ciblé des assets Filament, validation utilisateur du 15 août 2026 | Aucun | Poursuivre les jalons applicables |
| **N2-1 — Décisions éditoriales** | **Terminé et validé le 15 août 2026** | Textes finaux accueil et À propos, descriptions des 5 projets, profil GitHub | Textes approuvés, décisions d'intégration documentées | Textes accueil, À propos, projets et lien GitHub validés et implémentés (commit `fd15152bc18819ea3a0b62948be8534acee847c0`), CI distante validée | Aucun | Jalon clôturé |
| **N2-2 — Projets et visuels** | **Terminé et validé le 18 août 2026** | Compositions textuelles sobres retenues, GoodGasoilPrice published, hébergement transitoire Railway documenté | Fiches projets complétées, GoodGasoilPrice publié avec CTA public et source GitHub distincts, 4 projets in_development, invariants HTTPS | Tests unitaires DTO/catalogue, tests Feature fiches projets, compositions textuelles sobres validées | Aucun | Jalon clôturé |
| **N2-3 — Musique et Boutique** | **Terminé et validé le 19 août 2026** | Canaux officiels Joanto (Spotify, Apple Music, YouTube Music, Linktree, YouTube, Instagram), photo studio Joanto validée, 8 sorties discographiques réelles avec pochettes WebP optimisées (Pace Ritual authentique carrée 3000x3000px) et carrousel Swiper 14 modulaire centré sans débordement, SerajoPrints avec logo WebP optimisé et lien officiel externe Etsy | Liens externes musique sans iframe ni script tiers, carrousel Swiper 14 des 8 sorties Joanto sans débordement de page, photo studio verticale dans le hero, présentation sobre boutique avec logo réel et CTA externe Etsy sans widget ni transaction directe | Tests Feature musique et boutique, tests Playwright E2E sur les 4 viewports sans overflow horizontal, vérification absence d'embeds, scripts tiers ou CTA commerciaux | Aucun | Jalon clôturé |
| **N2-4 — Juridique, confidentialité et SEO** | **Terminé et validé le 19 août 2026** | Coordonnées physiques exactes hébergeur OVHcloud, boîte contact@lezidejou.fr opérationnelle, arbitrage collision public/robots.txt, politique robots IA affinée, pile middleware standard Laravel | Textes légaux complets, politique robots/sitemap validée, arbitrage collision réalisé, cookies techniques de session et CSRF documentés sans bandeau (exemption CNIL) | Mentions légales concises et neutres sans identité civile privée avec mention Etsy, politique de confidentialité factuelle RGPD décrivant les cookies techniques de sécurité/session, conservation proportionnée des logs sans promesse arbitraire, base légale d'intérêt légitime factuelle, contact@lezidejou.fr validé, collision public/robots.txt résolue, RobotsController dynamique (blocage GPTBot/ClaudeBot, autorisation Google-Extended et découverte IA, sitemap canonique), tests Feature et Unit validés | Aucun | Jalon clôturé |
| **N2-5 — Recette finale** | **Terminé et validé le 20 août 2026** | Validation de la grille de recette globale et décision GO/NO-GO | Rapports de tests, audits responsive, a11y, SEO, CI et revue indépendante conformes | Suite complète validée : Unit (35/35), Feature (37/37), Integration MySQL 8.4 (5/5), Playwright E2E (96/96 sur 4 viewports), Lighthouse CI (10/10 avec A11y 100%, BP 100%, SEO 100%, Perf 92-100%, TBT 0ms, CLS < 0.02), absence confirmée de routes réservées et de Labo, revue indépendante conforme. Verdict : **GO Niveau 2** | Aucun | Clôture formelle du Niveau 2 |

### 24.5 Découverte technique — Reproductibilité des assets du back-office Filament

* **Faits confirmés (15 août 2026 à 00:49, heure locale)** :
  * L'utilisateur a constaté que le back-office Filament local ne disposait pas de son CSS.
  * Il a exécuté manuellement des commandes afin de générer les assets nécessaires au panel d'administration.
  * Les fichiers produits apparaissent actuellement sous :
    * `public/css/` (`public/css/filament/filament/app.css`, 1 fichier)
    * `public/fonts/filament/` (`public/fonts/filament/filament/inter/*`, 8 fichiers)
    * `public/js/` (`public/js/filament/*`, 28 fichiers)
  * Ces 37 fichiers appartiennent à l'utilisateur et sont préservés intégralement.
  * Ils sont désormais ignorés par Git et régénérés automatiquement.

* **Qualification de l'anomalie** :
  * **Écart bloquant pour l’atteinte du Niveau 2, sans remise en cause rétroactive du Niveau 1 déjà validé**.
  * Cette anomalie n'a pas bloqué la clôture documentaire du jalon N2-0. Sa résolution technique est désormais implémentée, testée, validée par la CI distante et approuvée par revue indépendante.

* **Statut de la correction** :
  * **Correction technique validée le 15 août 2026** (revue indépendante Codex et workflows CI distants réussis).

* **Validation par la revue indépendante et la CI distante (15 août 2026)** :
  * **Revue indépendante Codex (15 août 2026)** : conclusion **« GO avec correction ciblée »** ; aucun défaut technique bloquant identifié. La présente mise à jour documentaire clôt la réserve ciblée de la revue concernant l'actualisation des statuts de validation. Les pistes d'amélioration non bloquantes du test (écoute de `requestfailed` et assertion explicite d'une réponse de police) ne sont pas requises pour ce checkpoint et restent facultatives.
  * **Quality CI (GitHub Actions)** : **Succès** sur le commit `9e96d0e062af02aaf9ca3d0c3a3631d2540e28df` (https://github.com/Etbeur/LEZIDEJOU-platform/actions/runs/31876175576).
  * **Browser Quality CI (GitHub Actions)** : **Succès** sur le même commit `9e96d0e062af02aaf9ca3d0c3a3631d2540e28df` (https://github.com/Etbeur/LEZIDEJOU-platform/actions/runs/31876175537).
  * **Pull Request** : La PR #2 (`feat: finalize level 2 portal`) demeure à l'état **brouillon** (*draft*).
  * **Gouvernance et périmètre** : Cette validation technique d'infrastructure ne vaut ni validation globale du Niveau 2, ni démarrage de la Phase 2 GoodGasoilPrice, ni préparation d'un déploiement. Le jalon **N2-1 reste non commencé**.

* **Détails de l'implémentation locale (15 août 2026)** :
  * **Fichiers modifiés** :
    * `composer.json` : ajout de `@php artisan filament:upgrade` dans `scripts.post-autoload-dump` après `@php artisan package:discover --ansi`.
    * `.gitignore` : ajout des règles d'exclusion `/public/css/filament/`, `/public/fonts/filament/` et `/public/js/filament/`.
    * `tests/Browser/AdminAssetsTest.spec.ts` : ajout d'un test Playwright vérifiant le chargement en HTTP 200 de tous les assets Filament (CSS, JS, Fonts) et l'absence d'erreur sur `/admin/login`.
    * `docs/implementation/phase-1-execplan.md` : suivi et traçabilité dans la présente section 24.5.
  * **Commandes exécutées et résultats** :
    * `composer validate --strict` : validé (code 0).
    * `composer dump-autoload` : exécution automatique de `@php artisan filament:upgrade`, publication des 37 assets confirmée, nettoyage des caches réussi.
    * Contrôle d'intégrité SHA-256 : hashes des 37 assets 100 % identiques avant et après régénération.
    * `npx playwright test tests/Browser/AdminAssetsTest.spec.ts` : 4/4 tests passés avec succès sur les 4 viewports (Mobile 360px, Tablet 768px, Desktop 1024px, Desktop 1440px).
    * `npx playwright test tests/Browser/RoutingTest.spec.ts` : 16/16 tests passés avec succès.
    * `php artisan test --filter=Admin` : 14/14 tests passés avec succès (83 assertions).
    * `git diff --check` : code 0.

* **Source technique de référence** :
  * Documentation officielle Filament 5 — Deploying to production — Ensuring assets are up to date : https://filamentphp.com/docs/5.x/deployment#ensuring-assets-are-up-to-date

### 24.6 Jalon N2-5 — Recette finale et verdict formel Niveau 2 (20 août 2026)

* **Périmètre audité** :
  * Les 13 pages publiques et rendues du portail (`/`, `/projets`, `/projets/good-gasoil-price`, `/projets/menu-planner`, `/projets/belote-pro`, `/projets/maths-iles`, `/projets/livrasign`, `/jeux`, `/musique`, `/boutique`, `/a-propos`, `/mentions-legales`, `/confidentialite`).
  * Navigation desktop (4 liens ordonnés) et mobile (menu accordéon `<details>/<summary>` sans JS obligatoire, fermeture automatique au clic et accessibilité clavier totale).
  * Responsive vérifié sur 4 viewports canoniques : Mobile (360×640), Tablette (768×1024), Desktop standard (1024×768), Desktop large (1440×900).
  * Zoom 200 % sans chevauchement ni perte d'information.
  * Accessibilité : navigation au clavier complète (Tab, Entrée, Espace, Flèches), `aria-label`, hiérarchie des titres (un seul H1 par page), contrastes conformes WCAG AA.
  * Textes alternatifs complets et descriptifs sur l'ensemble des images et logos.
  * Liens internes canoniques et liens externes vérifiés (GitHub, Railway, Spotify, Apple Music, YouTube Music, Linktree, YouTube, Instagram, Etsy).
  * SEO technique : balises `<meta name="robots">` exactes (en production : `index,follow` sur les 6 pages éditoriales et la fiche publiée Good Gasoil Price soit 7 URLs au sitemap, `noindex,follow` sur les 4 projets `in_development` et les 2 pages légales), flux XML `/sitemap.xml` conforme, route dynamique `/robots.txt` avec blocage ciblé des robots d'entraînement IA (GPTBot, ClaudeBot) et autorisation Google-Extended.
  * Absence stricte de routes fonctionnelles réservées (`/applications/*`, `/jeux/*`) et de rubriques Labo (`/labo`).
  * Carrousel Joanto final : Swiper 14 Coverflow modulaire centré, boucle continue (`loop: true`), clic direct sur pochette latérale (`slideToClickedSlide: true`), boutons fléchés accessibles, clavier flèches gauche/droite, swipe/drag contrôlé (`DEFAULT_SPEED = 700`), mode `prefers-reduced-motion: reduce` instantané (`speed = 0`), aucun débordement horizontal (`overflow: hidden`).

* **Synthèse des validations d'assurance qualité** :
  * `composer validate --strict` : Validé (code 0).
  * `php vendor/bin/pint --test` : 100 % conforme (0 fichier à corriger).
  * `php vendor/bin/phpstan analyse` : 0 erreur (Niveau 5).
  * `npm run test:lighthouse-patch` : **13/13** tests réussis.
  * `php artisan test --testsuite=Unit` : **35/35** tests réussis (148 assertions).
  * `php artisan test --testsuite=Feature` : **37/37** tests réussis (925 assertions).
  * `php vendor/bin/phpunit --configuration=phpunit.mysql.xml --testsuite=Integration` : **5/5** tests réussis (33 assertions) sur MySQL 8.4.11.
  * `npm run test:e2e` (Playwright full suite) : **96/96** tests réussis sur les 4 viewports.
  * `Lighthouse CI` : 10/10 URL auditées avec **Accessibilité = 100 %**, **Best Practices = 100 %**, **SEO = 100 %**, **TBT = 0 ms**, **CLS < 0.02**, **Performance = 92–100 %**.
  * `npm run build` : Build de production Vite propre et optimisé (code 0).

* **Verdict formel** : **GO NIVEAU 2**
  * Le Niveau 2 est formellement atteint et validé.
  * Aucun blocage résiduel.
  * La PR #2 (`feat/niveau-2-finalisation`) est prête pour validation et merge final par l'utilisateur.

## 25. Jalons Niveau 3 (Préparation Production)

* **N3-0** : Décisions d'infrastructure et mise à jour du plan (Terminé le 20 août 2026).
* **N3-1** : Pipeline CI/CD et script de déploiement (Terminé, testé et poussé le 20 août 2026, SHA `3d9d5b2c5dae973eaaf0f09a6edbca27317cf887`).
* **N3-2** : OVH/env (Configuration de l'environnement `shared`, `.env`, clé SSH et secrets GitHub Actions) (Terminé et validé le 20 août 2026).
  - Validation empirique des commandes GNU coreutils 8.30 (`mv -Tf` et `ln -sfn`) sur OVH.
  - Arborescence `/homez.2034/lezidea/lezidejou/` (`releases/`, `shared/`, `current`) créée et vérifiée.
  - Fichier `shared/.env` créé avec `APP_KEY` unique, cookies HTTPS stricts et base MySQL 8.4 (`lezideaapp.mysql.db`).
  - Paire SSH ED25519 dédiée générée, autorisée dans `~/.ssh/authorized_keys` et validée sans mot de passe (`IdentitiesOnly=yes`, `BatchMode=yes`).
  - Hôte public SSH `ssh.cluster131.hosting.ovh.net` validé et les 6 secrets GitHub Actions configurés.
* **N3-3** : Backup/rollback (Garde-fou confirmation backup, migrations en staging, scripts de rollback et runbook) (Terminé, validé et poussé le 20 août 2026, SHA `e323a1eefe9445e22638b85fb53b82bcd19939f9`).
  - Paramètre obligatoire `confirm_database_backup` (boolean) intégré dans `.github/workflows/deploy-production.yml`.
  - Exécution des migrations (`php artisan migrate --force`) dans le staging avant bascule atomique et sans rollback automatique.
  - Script versionné `scripts/rollback-release.sh` implémenté avec validation SemVer, intégrité et bascule atomique pure sans écriture dans la release.
  - Runbook autonome `docs/runbooks/production-rollback.md` formalisant les deux types de rollback (CAS A : bug applicatif seul, CAS B : rupture/altération DB).
  - Évaluation du stockage persistant : confirmation de l'absence d'uploads métier en v1 et règle d'évolution pour les versions futures.
* **N3-4** : Sécurité (Headers HTTP, HSTS prudent, vérification isolation et matrice de recette ModSecurity) (Terminé, validé et poussé le 20 août 2026, SHA `ab323e7e4d785ec91d5f23e25c50cba68b3f5c83`).
  - Middleware `App\Http\Middleware\SecurityHeadersMiddleware` implémenté et couvert par `Tests\Feature\SecurityHeadersTest`.
  - Configuration `URL::forceScheme('https')` en environnement `production`.
  - Validation en production de l'isolation du Document Root `lezidejou/current/public` et conservation d'`Options -MultiViews -Indexes` dans `public/.htaccess`.
  - Documentation de la politique HSTS prudente (24 heures sans preload ni includeSubDomains, sous condition HTTPS et production), du report de CSP stricte en évolution future, et de la matrice de recette ModSecurity pour N3-6.
* **N3-5** : Première release `v1.0.0` effectuée en production le 23 août 2026.
* **N3-6** : Recette/GO en cours.
