PD-229 — Retour d'expérience¶
📚 Navigation User Story
| Document | | | ---------- | -- | | 📋 [Spécification](PD-229-specification.md) | | | 🛠️ [Plan d'implémentation](PD-229-plan.md) | | | ✅ [Critères d'acceptation](PD-229-acceptability.md) | | | 📝 **Retour d'expérience** | *(ce document)* | [← Retour à site-vitrine](../PD-225-epic.md) · [↑ Index User Story](index.md)1. Résumé exécutif¶
La User Story PD-229 visait à garantir un référencement naturel optimal avec des métadonnées SEO complètes, JSON-LD structuré et OpenGraph. L'implémentation a produit des métadonnées de base fonctionnelles (title, description, OpenGraph, Twitter Cards) directement dans BaseLayout.astro, un schéma Organization complet, et un robots.txt bien configuré. Cependant, plusieurs écarts majeurs ont été identifiés : absence des schémas WebSite et BreadcrumbList, pas de balise robots meta, sitemap statique incomplet, et le composant Seo.astro créé mais jamais utilisé. Verdict : ACCEPTÉ AVEC RÉSERVES.
2. Points fluides¶
- Métadonnées de base présentes sur toutes les pages (title, description, canonical)
- OpenGraph complet avec og:title, og:description, og:type, og:url, og:image, og:locale
- Twitter Cards correctement configurées (summary_large_image)
- Images OpenGraph générées pour chaque page et langue (14 images PNG 1200x630)
- Schéma JSON-LD Organization complet avec contactPoints et sameAs
- Schéma JSON-LD SoftwareApplication pour la page produit
- Robots.txt bien structuré avec blocage des crawlers AI (GPTBot, CCBot, etc.)
- Liens hreflang alternate présents dans BaseLayout.astro
3. Points difficiles¶
-
Duplication SEO / non-utilisation du composant : Un composant Seo.astro a été créé mais n'est jamais utilisé. BaseLayout.astro implémente directement les balises SEO, créant une duplication et un composant mort.
-
Schémas JSON-LD partiels : Seuls Organization et SoftwareApplication sont implémentés. Les schémas WebSite et BreadcrumbList requis par la spec sont absents.
-
Sitemap manuel : Le sitemap.xml est un fichier statique dans public/, non généré automatiquement. Il risque de devenir obsolète si des pages sont ajoutées.
-
Pas de balise robots meta : Aucune gestion index/noindex au niveau des pages. Impossible de différencier prod/préprod ou de marquer certaines pages comme non indexables.
4. Hypothèses révélées tardivement¶
-
@astrojs/sitemap non utilisé : Le plan prévoyait une génération automatique du sitemap via l'intégration Astro officielle. Cette intégration n'a pas été installée.
-
JSON-LD centralisé vs distribué : La stratégie de gestion des schémas JSON-LD (centralisé dans un fichier vs distribué par page) n'était pas clarifiée. Les fichiers JSON existent mais leur injection est partielle.
-
Environnement de déploiement : La distinction prod/préprod pour les balises robots n'a pas été implémentée car aucun mécanisme de détection d'environnement n'était prévu.
5. Invariants complexes¶
| Invariant | Difficulté |
|---|---|
| Title + description sur chaque page | Facile, bien respecté |
| JSON-LD valide et complet | Complexe : plusieurs schémas à maintenir, injection conditionnelle |
| Pages indexables en prod uniquement | Non implémenté : nécessite détection d'environnement |
| Sitemap à jour avec hreflang | Manuel actuellement, risque d'obsolescence |
6. Dette technique¶
| Dette | Impact | Priorité |
|---|---|---|
| Composant Seo.astro non utilisé | Code mort, confusion | Moyenne |
| Pas de schéma WebSite JSON-LD | SEO sous-optimal | Haute |
| Pas de BreadcrumbList JSON-LD | Rich snippets absents | Moyenne |
| Pas de balise robots meta | Pas de contrôle index/noindex | Haute |
| Sitemap statique | Risque d'obsolescence | Haute |
| Pas de @astrojs/sitemap | Génération manuelle | Moyenne |
7. Risques résiduels¶
| Risque | Probabilité | Impact | Mitigation suggérée |
|---|---|---|---|
| Sitemap obsolète après ajout de pages | Haute | Moyen | Installer @astrojs/sitemap |
| Page de préprod indexée | Moyenne | Élevé | Ajouter robots meta + env detection |
| Rich snippets non affichés | Moyenne | Faible | Ajouter WebSite, BreadcrumbList |
| Duplication de code SEO | Faible | Faible | Refactorer vers Seo.astro unique |
8. Améliorations processus¶
- Clarifier la stratégie JSON-LD avant l'implémentation : quels schémas, où les injecter, comment les maintenir
- Utiliser les intégrations officielles Astro (@astrojs/sitemap) plutôt que des fichiers manuels
- Supprimer le code mort : si un composant n'est pas utilisé, le retirer ou l'intégrer
- Prévoir l'environnement dès le départ : variable d'environnement pour distinguer prod/staging/dev
- Tester les Rich Results : utiliser l'outil Google Rich Results Test en CI
9. Enseignements clés¶
-
Un composant créé doit être utilisé — Seo.astro existe mais BaseLayout.astro fait le travail. Cette duplication crée de la confusion et du code mort.
-
Les fichiers statiques deviennent obsolètes — Un sitemap.xml manuel sera oublié lors de l'ajout de nouvelles pages. L'automatisation est essentielle.
-
JSON-LD est un investissement — Implémenter correctement tous les schémas requis demande du temps. Il vaut mieux le planifier dès le départ.
-
Le robots.txt ne suffit pas — Il ne contrôle que le crawl, pas l'indexation. La balise meta robots est nécessaire pour un contrôle fin.
-
Les specs SEO sont exigeantes — La spécification listait clairement WebSite, Organization, BreadcrumbList. Ne pas tous les implémenter crée un écart majeur.
10. Addendum — Résolution des écarts¶
[2025-12-21] — Mise à jour suite à acceptation finale¶
Les écarts E-01 à E-04 identifiés lors de la revue initiale ont été corrigés :
| Écart | Résolution |
|---|---|
| E-01 (JSON-LD incomplet) | Schéma WebSite ajouté (src/seo/website.json) ; spec mise à jour pour rendre BreadcrumbList conditionnel (profondeur > 1) |
| E-02 (Meta robots absente) | BaseLayout.astro ajoute <meta name="robots" content={PROD ? "index, follow" : "noindex, nofollow"}> |
| E-03 (Sitemap incomplet) | public/sitemap.xml couvre 18 pages FR/EN avec xhtml:link alternates fr/en/x-default |
| E-04 (Composant SEO non utilisé) | Suppression du code mort src/components/Seo.astro |
Verdict final : ✅ ACCEPTÉ (2025-12-20)