Aller au contenu

PD-232 — Retour d'expérience


📚 Navigation User Story | Document | | | ---------- | -- | | 📋 [Spécification](PD-232-specification.md) | | | 🛠️ [Plan d'implémentation](PD-232-plan.md) | | | ✅ [Critères d'acceptation](PD-232-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-232 visait à structurer une FAQ maintenable via Markdown en utilisant les Content Collections d'Astro. L'implémentation est la plus réussie de l'EPIC : schéma Zod complet avec catégories, ordre et langue, 54 fichiers FAQ Markdown (27 FR + 27 EN) organisés par catégorie, rendu avec accordéons <details> accessibles, et schéma JSON-LD FAQPage généré dynamiquement. Seuls deux écarts mineurs ont été identifiés : validation Zod légèrement moins stricte que prévu et composant FAQSection non factorisé. Verdict : ACCEPTÉ AVEC RÉSERVES (écarts mineurs uniquement).


2. Points fluides

  • Content Collection configurée avec schéma Zod complet (question, category, order, lang, translationKey)
  • Enum de catégories stricte (security, legal, business, usage, apps, transfer, data, misc)
  • 54 fichiers FAQ Markdown créés et organisés par langue et catégorie
  • Frontmatter validé automatiquement au build (erreurs bloquantes)
  • getCollection() avec filtre par langue fonctionnel
  • Tri par order et regroupement par catégorie implémentés
  • Accordéons <details> HTML natifs (accessibles sans JS)
  • Schéma JSON-LD FAQPage généré dynamiquement avec toutes les questions
  • Styles de réponse FAQ bien formatés (listes, blockquotes, strong)
  • Animation d'ouverture CSS fluide

3. Points difficiles

  • Validation Zod minimale : Le schéma utilise z.string() pour question au lieu de z.string().min(10) prévu dans le plan. Des questions très courtes pourraient passer.

  • Composant FAQSection non créé : Le plan prévoyait un composant dédié FAQSection.astro pour factoriser le rendu des accordéons. L'implémentation a choisi de tout mettre inline dans les pages FR et EN.

  • Duplication FR/EN : Les pages faq.astro FR et EN sont quasi identiques. Un composant partagé aurait réduit la duplication.


4. Hypothèses révélées tardivement

  • Pas besoin de script validate-faq.sh : La validation Zod au build détecte automatiquement les frontmatters invalides. Le script de parité FR/EN prévu dans le plan n'a pas été jugé nécessaire.

  • Markdown body brut dans JSON-LD : Le schéma FAQPage utilise entry.body (Markdown brut) au lieu du HTML rendu. Les moteurs de recherche gèrent bien ce format.

  • translationKey peu utilisé : Le champ optionnel existe dans le schéma mais n'est pas exploité pour lier les versions FR/EN programmatiquement.


5. Invariants complexes

Invariant Difficulté
FAQ versionnée dans GitLab Très facile, inhérent à la structure fichiers
Frontmatter validé Facile, Zod le fait automatiquement
FAQ rendue correctement Facile, Content Collections gère le Markdown

6. Dette technique

Dette Impact Priorité
Validation question min(10) manquante Risque questions vides Basse
Pas de composant FAQSection Duplication pages FR/EN Basse
translationKey non exploité Pas de lien FR↔EN automatique Basse
Pas de script parité FR/EN Traductions manquantes non détectées Basse

7. Risques résiduels

Risque Probabilité Impact Mitigation suggérée
FAQ FR sans équivalent EN Faible Faible Script CI de vérification parité
Frontmatter mal formé Très faible Bloquant Déjà mitigé par Zod
JSON-LD trop volumineux Très faible Faible Paginer si >100 FAQ
Catégorie mal orthographiée Très faible Bloquant Enum Zod le bloque

8. Améliorations processus

  • Créer un composant partagé pour éviter la duplication des pages FR/EN
  • Exploiter translationKey pour générer automatiquement les liens hreflang FAQ↔FAQ
  • Ajouter un test de parité CI pour alerter si une FAQ existe en FR mais pas en EN
  • Documenter le workflow d'ajout de FAQ pour les contributeurs non-techniques

9. Enseignements clés

  1. Les Content Collections sont puissantes — La validation Zod intégrée et le typage automatique éliminent beaucoup d'erreurs potentielles.

  2. L'enum Zod est un garde-fou efficace — Impossible de créer une FAQ avec une catégorie inexistante, le build échoue immédiatement.

  3. <details> est suffisant pour les accordéons — Pas besoin de JavaScript custom pour un comportement d'accordéon accessible et fonctionnel.

  4. La factorisation peut attendre — Avoir du code inline dupliqué est acceptable pour un MVP si le résultat fonctionne. Le refactoring viendra plus tard.

  5. Le JSON-LD FAQPage améliore le SEO — Générer dynamiquement le schéma à partir des données garantit qu'il est toujours à jour avec le contenu.


10. Addendum — Résolution des écarts (2025-12-21)

Mise à jour : Les écarts E-01 et E-02 identifiés dans ce REX ont été corrigés. Le verdict passe de "ACCEPTÉ AVEC RÉSERVES" à "✅ ACCEPTÉ".

Corrections apportées

Écart Problème initial Résolution
E-01 z.string() sans contrainte de longueur z.string().min(10) ajouté dans src/content/config.ts
E-02 Rendu inline dupliqué dans les pages FR/EN Composant src/components/FAQSection.astro créé et utilisé

Impact sur les sections précédentes

Section Élément Statut post-correction
§1 Résumé "Verdict : ACCEPTÉ AVEC RÉSERVES" → ✅ ACCEPTÉ
§3 Points difficiles Validation Zod minimale → Résolu
§3 Points difficiles Composant FAQSection non créé → Résolu
§3 Points difficiles Duplication FR/EN → Résolu (pages 314→126 lignes)
§6 Dette technique Validation question min(10) manquante → Résolu
§6 Dette technique Pas de composant FAQSection → Résolu
§9.4 Enseignement "La factorisation peut attendre" → Factorisation effectuée

Métriques de refactoring

Métrique Avant Après
Lignes fr/faq.astro 314 126
Lignes en/faq.astro 314 126
Lignes FAQSection.astro 0 186
Total 628 438
Duplication éliminée 190 lignes

Référence

  • Acceptabilité : PD-232-acceptability.md — Suivi E-01/E-02 du 2025-12-21
  • Fichiers modifiés :
  • src/content/config.ts
  • src/components/FAQSection.astro (créé)
  • src/pages/fr/faq.astro
  • src/pages/en/faq.astro

Verdict final : ✅ ACCEPTÉ (2025-12-21)