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 dez.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.astropour 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¶
-
Les Content Collections sont puissantes — La validation Zod intégrée et le typage automatique éliminent beaucoup d'erreurs potentielles.
-
L'enum Zod est un garde-fou efficace — Impossible de créer une FAQ avec une catégorie inexistante, le build échoue immédiatement.
-
<details>est suffisant pour les accordéons — Pas besoin de JavaScript custom pour un comportement d'accordéon accessible et fonctionnel. -
La factorisation peut attendre — Avoir du code inline dupliqué est acceptable pour un MVP si le résultat fonctionne. Le refactoring viendra plus tard.
-
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.tssrc/components/FAQSection.astro(créé)src/pages/fr/faq.astrosrc/pages/en/faq.astro
Verdict final : ✅ ACCEPTÉ (2025-12-21)