Files
Claude Code DTP Worker 1513e69a79 [DTP-Worker 20260812_053034] vérif i18n · asymétrie cardinalité SEO fr=87·en=87·es=84 PROUVÉE NON-DÉFAUT · note by-design au dedup (anti re-flag, sans gate)
Angle frais jamais balayé (cohérence tri-lingue FR/EN/ES du module seo/). Un
Explore a remonté « es manque 3 mots-clés projet P01 » ; refusé au mot (#6,
verify-non-defects) et prouvé au byte-level un NON-DÉFAUT : l'artefact étant
byte-repro-gaté, l'écart reflète la LOGIQUE du générateur.

Preuve (repro du générateur sans dedup) : génération symétrique par langue →
raw 115/langue identique. L'écart vient du seul dedup (lang,term). country[es]
= « Republica Dominicana » == la localisation générique de 5 projets
(P01/02/03/06/09) → le mot-clé global {type} Republica Dominicana absorbe le
mot-clé projet identique de P01 (dedup correct, terme présent 1× en scope
global). En fr/en country != localisation → pas de collision, P01 garde ses 7
termes. D'où +3 collisions en es → 87 vs 84. Rien n'est perdu ; invariants
(≥ min_keywords_per_lang + unicité (term,lang)) tiennent ; es=84 déjà documenté
et gaté README.md:15 (check_readme_claims). Sortie CORRECTE.

Livrable = note explicative au point de dedup keywords.py:106 (asymétrie subtile
non-évidente qu'un futur balayage refera l'enquête). Aucune logique/fixture/claim
-gaté touché (gates byte visent out/*.json, pas la source). Style aligné ASCII +
em-dash existant, NFC-clean.

run_ci = 33 PASS/0/0 (inchangé). 0 code moteur V18 (#6), 0 logique modifiée,
0 artefact/fixture touché (#6), 0 gate ajouté (#5), 0 VPS (#8), 0 API externe.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-12 05:40:22 +00:00
..

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.json258 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 (lexique immobilier / à 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/price que pour un projet disponible dont une typologie porte un prix_depuis_usd numé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 pages www/ (agent Frontend/SEO) ;
  • Génération + soumission sitemap.xml et 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).