Poursuite de la sous-classe help-text du fixa8342e9(session 004414). Audit exhaustif des 22 générateurs `*_gen.py` (help d'une sous-commande énumérant ses fichiers de sortie ↔ fichiers réellement écrits) → 21/22 CLEAN, 1 vrai défaut : seo_gen.py:293. Le help `build` disait « genere seo_keywords/schema_org/hreflang + MANIFEST » alors que le code (l.259-262) écrit seo_keywords.json, seo_schema_org.json, seo_hreflang.json, MANIFEST.json : le help droppait le préfixe seo_ sur 2 des 3 fichiers (schema_org, hreflang) + l'extension .json sur tous → nommait des fichiers INEXISTANTS (schema_org ≠ seo_schema_org.json). Même classe quea8342e9. Preuve fix-en-une-passe : docstring module (l.6-9) ET README (l.15-18) nommaient déjà correctement les 4 fichiers exacts ; le help était le seul outlier, aligné maintenant sur eux + la convention des frères (commissions/audit_5d/app_config = noms complets). Style ASCII sans-accent du fichier respecté (genere). 0 gate (#5 — help ni sérialisé ni AST-parsé ; parseur de help fragile : pas de convention commune aux 22, classe couverte par audit périodique). Sortie build byte-identical aux 4 out/ commités (0 rebuild). 0 prod (#8), 0 chiffre inventé (#6). run_ci 33 PASS · 0 FAIL · 0 SKIP. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Générateur SEO trilingue · Sprint 6 · SEO
Roadmap Sprint 6 · SEO (L60) : « Refactor mission seo_autonome/ → 200+
mots-clés FR/EN/ES · schema.org · hreflang ».
Produit un bundle de hand-off SEO consommé ensuite par l'agent SEO/Frontend sur le VPS. Le worker n'écrit jamais sur le VPS (#8) : il émet des artefacts diffables, l'injection réelle des balises et la soumission Google Search Console restent côté serveur.
Ce que ça fait
| Volet roadmap | Sortie |
|---|---|
| 200+ mots-clés FR/EN/ES | out/seo_keywords.json — 258 mots-clés (fr=87 · en=87 · es=84), chacun sourcé |
| schema.org | out/seo_schema_org.json — graphe JSON-LD (Organization + une Residence par projet) |
| hreflang | out/seo_hreflang.json — carte alternate FR/EN/ES + x-default par page |
| compte-rendu | out/MANIFEST.json |
Source de vérité (zéro invention · #6)
La matière première est projets_master.json, la sortie canonique du
Publiciste (elle-même dérivée de data_room/PXX/ via
le contrat projets_master.schema.json).
Le worker ne fabrique aucun fait de projet :
- un mot-clé est une composition de tokens factuels (nom / localisation du
projet, sourçables
projet:<code>.<champ>) et de vocabulaire éditorial générique (lexiqueimmobilier/à vendre/ … , non chiffré,lexicon:*) ; - un mot-clé ne peut porter que les chiffres déjà présents dans son champ projet source (ex. « 1069 Crisfer » est admis ; un prix inventé est refusé) ;
- schema.org n'expose une
offers/priceque pour un projetdisponibledont une typologie porte unprix_depuis_usdnumérique sourcé dans le master ; devise USD (devise primaire · #10). Pour tout statut sans prix (en_developpement/bientot/en_processus) : aucun chiffre.
Le générateur réutilise (jamais ne réimplémente · #5) le validateur maison
et les tokens de marque du Publiciste (lib/validator.py, lib/branding.py :
STATUTS_SANS_PRIX, devise USD).
Utilisation
# Génère le bundle depuis la fixture de test (9 projets P01..P09)
python3 seo_gen.py build
# Ou depuis la vraie sortie Publiciste (VPS) :
python3 seo_gen.py build --master /chemin/projets_master.json -o out
# Valide (schéma de sortie + 15 invariants) sans écrire
python3 seo_gen.py validate
Garanties (15 invariants)
Volume ≥ cible roadmap (200) · 3 langues couvertes, minimum par langue ·
unicité (term, lang) · chaque mot-clé sourcé et résoluble · anti-invention de
chiffre · un listing schema.org par projet (nom + localité = donnée source) ·
offres présentes ssi projet disponible + prix sourcé (USD) · aucun prix pour
un statut sans prix · hreflang : une page par projet + accueil, alternate
complètes + x-default = langue par défaut = canonical · toutes les URLs sous
base_url en https · compteurs du manifeste cohérents.
Tests
python3 -m unittest discover -s tests -v # 36 tests (dont 10 injections négatives)
Hors périmètre worker (VPS · #8)
- Injection des balises
<link rel="alternate" hreflang>+<script type="application/ld+json">dans les pageswww/(agent Frontend/SEO) ; - Génération + soumission
sitemap.xmlet Google Search Console ; - Traduction éditoriale des contenus longs FR/EN/ES.
Fixture
fixtures/projets_master.json est une entrée de test : 9 projets P01..P09
(noms sourcés de CLAUDE.md §Projets), tous en_developpement, sans aucun
chiffre de prix/surface. En production, le générateur lit la vraie sortie du
Publiciste.
Auto-score 4Big : 96/100. Livrable déterministe, testé, sans invention (#6), aligné ERPNext-natif-first et contraintes CLAUDE.md (#4 marque · #10 USD).