--- phase: 07-seo-blog plan: 03 type: execute wave: 2 depends_on: [07-01] files_modified: - app/pages/blog/index.vue autonomous: true requirements: [SEO-10, SEO-13, SEO-15] must_haves: truths: - "curl /fr/blog et /en/blog retournent og:image absolu = https://killiandalcin.fr/og-blog-default.jpg" - "og:locale = fr_FR (ou en_US) et og:locale:alternate = en_US (ou fr_FR) — le listing existe toujours dans les 2 langues" - "Le HTML contient un JSON-LD @type: CollectionPage (via defineWebPage) pour le listing" - "Le HTML contient un JSON-LD BreadcrumbList Accueil → Blog" artifacts: - path: "app/pages/blog/index.vue" provides: "useSeoMeta enrichi (D-16) + useSchemaOrg CollectionPage + Breadcrumb" contains: "defineWebPage" key_links: - from: "app/pages/blog/index.vue" to: "app/utils/resolve-og-image.ts" via: "import resolveOgImage" pattern: "resolveOgImage" --- Enrichir la page listing `/blog` avec (a) `useSeoMeta` étendu (D-16 — og:image fallback, og:locale, og:locale:alternate, twitter), et (b) `useSchemaOrg([defineWebPage({ '@type': 'CollectionPage' }), defineBreadcrumb])` (D-03, SEO-15). Purpose: Le listing doit être partageable socialement (card OG branded) et porter un breadcrumb JSON-LD cohérent avec les articles. Output: 1 page enrichie. @$HOME/.claude/get-shit-done/workflows/execute-plan.md @$HOME/.claude/get-shit-done/templates/summary.md @.planning/phases/07-seo-blog/07-CONTEXT.md @.planning/phases/07-seo-blog/07-RESEARCH.md @.planning/phases/07-seo-blog/07-PATTERNS.md @.planning/phases/07-seo-blog/07-01-SUMMARY.md @app/pages/blog/index.vue Depuis `app/pages/blog/index.vue` (existant, à étendre — ne PAS remplacer) : - `const { t, locale } = useI18n()` (ligne 2) - `const localePath = useLocalePath()` (ligne 3) - `const isFr = computed(() => locale.value === 'fr')` (ligne 4) - `useSeoMeta({ title, description, ogTitle, ogDescription, ogType: 'website' })` (lignes 37-43) — à ÉTENDRE Auto-imports : `useSchemaOrg`, `defineWebPage`, `defineBreadcrumb`. `resolveOgImage(null)` retourne `https://killiandalcin.fr/og-blog-default.jpg` (fallback, D-06). **Note**: `app/utils/resolve-og-image.ts` est créé dans 07-02 (Wave 2, parallèle). Plan 07-03 a DÉJÀ une dépendance implicite (runtime) sur ce fichier : si 07-03 exécute avant 07-02, `import { resolveOgImage }` échouera. L'exécuteur DOIT lancer 07-02 d'abord OU créer provisoirement le helper ici. **Recommandation** : exécuteur vérifie `test -f app/utils/resolve-og-image.ts` et, si absent, utilise la constante littérale `const OG_FALLBACK = 'https://killiandalcin.fr/og-blog-default.jpg'` en dur dans ce fichier (évite le couplage). Plan 07-02 n'écrit QUE `[slug].vue` + utils, donc pas de conflit de fichier. Task 1: Enrichir app/pages/blog/index.vue — useSeoMeta D-16 + useSchemaOrg CollectionPage + Breadcrumb app/pages/blog/index.vue - app/pages/blog/index.vue (fichier entier 1-151) - .planning/phases/07-seo-blog/07-RESEARCH.md §Open Question #1 (CollectionPage via defineWebPage), §useSeoMeta Enrichment - .planning/phases/07-seo-blog/07-PATTERNS.md §index.vue (modify) - .planning/phases/07-seo-blog/07-CONTEXT.md D-03, D-16 Dans `app/pages/blog/index.vue`, zone `