docs(07): capture phase context — SEO blog (JSON-LD via nuxt-schema-org, og:image hybride, sitemap Nitro endpoint, hreflang alternates)

This commit is contained in:
2026-04-22 10:25:39 +02:00
parent 71ab4f29d0
commit 275d8f268c
2 changed files with 262 additions and 0 deletions
@@ -0,0 +1,126 @@
# Phase 7: SEO Blog - Discussion Log
> **Audit trail only.** Do not use as input to planning, research, or execution agents.
> Decisions are captured in CONTEXT.md — this log preserves the alternatives considered.
**Date:** 2026-04-22
**Phase:** 07-seo-blog
**Areas discussed:** JSON-LD strategy, og:image fallback, Sitemap source, Périmètre listing, Author/publisher, dateModified, Drafts in sitemap, hreflang alternates
---
## JSON-LD strategy
| Option | Description | Selected |
|--------|-------------|----------|
| nuxt-schema-org (Recommended) | Module Nuxt SEO. defineArticle/defineBreadcrumb typés, locale-aware. | ✓ |
| Hand-rolled via useHead | Construction manuelle JSON-LD. Zero dep mais répétitif et risque drift. | |
| @nuxtjs/seo (umbrella) | Bundle complet — doublonne avec @nuxtjs/sitemap. | |
**User's choice:** nuxt-schema-org
**Notes:** Recommandation suivie — typage + auto-merge site.url + cohérence Nuxt SEO ecosystem.
---
## og:image fallback
| Option | Description | Selected |
|--------|-------------|----------|
| Frontmatter image OR static fallback (Recommended) | image: frontmatter sinon /og-blog-default.jpg statique. KISS, zero runtime. | ✓ |
| nuxt-og-image (Satori, runtime) | Génération dynamique. Joli mais build-time + edge runtime + design. | |
| Frontmatter only, fail si absent | Strict, bloque les articles texte-only. | |
**User's choice:** Hybride frontmatter + fallback statique
**Notes:** nuxt-og-image reporté en deferred ideas (à reconsidérer si traction social).
---
## Sitemap source
| Option | Description | Selected |
|--------|-------------|----------|
| Endpoint Nitro /api/__sitemap__/urls.ts (Recommended) | Server route query collections, retourne loc+lastmod+alternates. | ✓ |
| Auto-discovery via prerender hooks | Marche en SSG uniquement. | |
| Liste statique régénérée à chaque build | Pas reactive aux nouveaux articles post-build. | |
**User's choice:** Endpoint Nitro
**Notes:** Pattern officiel @nuxtjs/sitemap + i18n. Compatible SSR pur (déploiement Docker actuel).
---
## Périmètre listing
| Option | Description | Selected |
|--------|-------------|----------|
| Articles + listing minimal (Recommended) | /blog reçoit useSeoMeta enrichi + JSON-LD Blog simple ; /blog/[slug] le pack complet. | ✓ |
| Articles uniquement | Plus rapide mais ranking listing affaibli. | |
| Articles + listing + page d'accueil / | Scope creep — relève d'une phase SEO globale. | |
**User's choice:** Articles + listing minimal
**Notes:** WebSite/Person globaux home reportés en deferred.
---
## Author/publisher
| Option | Description | Selected |
|--------|-------------|----------|
| Constante globale Killian (Recommended) | Single Person identity dans config. Pas de frontmatter override. | ✓ |
| Frontmatter author override + fallback Killian | Flexibilité guest-posts non planifiée. | |
**User's choice:** Constante globale Killian
**Notes:** Pas de guest authors prévus — over-engineering évité.
---
## dateModified
| Option | Description | Selected |
|--------|-------------|----------|
| Frontmatter `updated` optionnel, fallback `date` (Recommended) | Schema Zod enrichi updated.optional(). Semantically correct. | ✓ |
| Toujours = date | Perte signal SEO si article révisé. | |
| git mtime du fichier .md | Hook git — casse en build Docker sans .git layer. | |
**User's choice:** updated optional + fallback date
**Notes:** git mtime déféré — à reconsidérer si on ajoute un layer git ou stamping CI.
---
## Drafts in sitemap
| Option | Description | Selected |
|--------|-------------|----------|
| Non, draft=false uniquement (Recommended) | Cohérent avec Phase 6 D-14. Drafts accessibles direct URL only. | ✓ |
| Oui, tous articles + drafts | Risque indexation drafts (test-kotlin-syntax.md). | |
**User's choice:** Drafts exclus
**Notes:** Cohérence avec filtrage listings établi Phase 6.
---
## hreflang alternates
| Option | Description | Selected |
|--------|-------------|----------|
| Oui, par paire de slugs (Recommended) | xhtml:link rel='alternate' hreflang='fr/en' croisés + x-default FR. | ✓ |
| Non, sitemap par locale indépendant | Risque duplicate content vu par Google. | |
**User's choice:** Alternates par paire de slugs
**Notes:** Fr = locale par défaut → x-default pointe sur FR.
---
## Claude's Discretion
- Naming exact composable/helper résolution og:image
- Format précis description JSON-LD Blog/CollectionPage du listing
- Choix definePerson global app.vue vs author inline par defineArticle (à confirmer en research)
- Design exact /og-blog-default.jpg
## Deferred Ideas
- og:image dynamique via nuxt-og-image (Satori)
- JSON-LD WebSite + Person globaux sur la home
- Liens internes /hytale ↔ articles (SEO-14, déjà planifié Phase 8)
- git mtime pour dateModified
- JSON-LD BlogPosting[] exhaustif sur /blog