Cardigan Marketing
Aubainerie · Pipeline SEO
Architecture d'orchestration

Orchestration du workflow /aubainerie-seo-data

Pipeline complet de la donnée GSC à la publication Google Sheets : extraction, catégorisation, rédaction, refine, QA et push — orchestré par 7 skills isolés en sub-agents.

7
Skills orchestrés
2
Gates utilisateur
5
Sub-agents isolés
1
Excel multi-onglets
Pipeline data
Gate utilisateur
Rédaction
Refine SEO
QA
Fix mécanique
Push Sheets
1

Sitemap & filtrage Orchestrateur

Étape 1 · Préparation regex GSC

Fetch du sitemap FR Aubainerie, filtrage par handle (ex. femme-robes), construction de la regex .*/collections/{handle}.* pour cibler GSC.

Input
  • Argument handle (ex. femme-robes)
  • URL sitemap FR
Output
  • Liste URLs filtrées
  • Regex GSC ciblée
2

Pull GSC via MarkiFact MCP Orchestrateur

Étape 2 · Extraction 16 mois de search data

Extraction de 500 queries max, dimensions [query, page], métriques [clicks, impressions, ctr, position], triées par impressions DESC.

Source
  • Search Console sc-domain:aubainerie.com
  • Période 16 mois glissants
Output
  • Dataset GSC brut (CSV / file_id)
  • ~500 queries × 4 métriques
3

Nettoyage des queries Orchestrateur

Étape 3 · Filtrage brand, géo, génériques

Retire les queries brand (aubainerie + variantes orthographiques), géographiques (villes) et génériques non pertinentes. Ne garde que les queries non-brand uniques pertinentes pour le segment.

4

Enrichissement DataForSEO Orchestrateur

Étape 4 · Volume · CPC · Competition

Appel ./scripts/dataforseo.sh volume en batches de 100 keywords (limite API). Location Canada (2124), langue FR. Fusion sur query avec le dataset GSC.

Enrichissement
  • search_volume
  • competition (LOW/MEDIUM/HIGH)
  • cpc
Output
  • Dataset GSC enrichi (~queries × 8 colonnes)
5

Catégorisation sémantique /aubainerie-seo-categorize

Étape 5 · Sub-skill · Module canonique scripts/lib/categorizer.py

Classification des queries en sous-catégories sémantiques (couleur, longueur, occasion, style, prix, morphologie). Combine regex pour les catégories évidentes + jugement Claude pour les cas ambigus. Calcule la stratégie par catégorie.

DÉFENSIFtop 3 → renforcer & protéger
OFFENSIF PUSH4-7 → contenu plus complet
OFFENSIF ATTAQUE8+ → angle différenciateur

Gate 1 — Validation pré-rédaction Confirmation requise

Bloquant · Aucune génération sans confirmation explicite

L'orchestrateur affiche un brief stratégique complet (catégories, concurrents, FAQs data-driven, sous-collections proposées) et attend une réponse. Édouard valide ou demande des ajustements.

Brief affiché

📋 Analyse GSC · Catégories proposées avec stratégie colorée · Concurrents dominants · Brief contenu (angle, mots-clés défensifs/offensifs, FAQs) · Sous-collections à créer

6

Génération Excel multi-onglets Orchestrateur

Étape 6 · openpyxl · 6 onglets structurés

Génère output/aubainerie-seo-{segment}-{date}.xlsx avec conditional formatting, freeze panes et auto-filter.

INPUTURLs ciblées
ANALYSEQueries enrichies + sub_category
CATEGORIESRésumé + stratégie
COMPETITIONSERP analyses
BRIEFStratégie globale
OUTPUTLignes à rédiger (vide à ce stade)
7a

Génération sous-collections + ligne parent Orchestrateur

Étape 7a-b · scripts/lib/subcollections.py

Génère les sous-collections via generate_all_subcollections() (couleur, type, grande_taille, liquidation) et construit la ligne parent à la main avec 5 H2 et 4 FAQs data-driven.

7c

Rédaction du contenu SEO Sub-agent isolé /aubainerie-seo-redaction

Posture write-only · Contexte isolé du pipeline data

Rédige Title, Body HTML, title_tag, description_tag, seo_paragraph_onpage et FAQ pour la page parent + toutes les sous-collections. Isolé en sub-agent pour ne pas mélanger contexte data et contexte rédactionnel. Lit aubainerie-redaction-rules.yaml + aubainerie-redaction-guide.md comme sources de vérité.

Task(subagent_type="general-purpose", description="Rédaction contenu SEO Aubainerie", prompt="Sub-agent /aubainerie-seo-redaction. Lookup strategic_modes par sous-cat ...")
Mode stratégique appliqué
  • Longueurs cibles par sub_type
  • Nb FAQs · focus mots-clés · angle
Output
  • Onglet OUTPUT rempli (parent + subs)
  • JSON {rows_written, parent_handle, sub_handles}
7d

Refine SEO Sub-agent isolé /aubainerie-seo-refine

Score 5 dimensions · Fixer LLM bouclé · Convergence ou plafond ($3 / 3 iter / 10 min)

Score chaque row de l'OUTPUT sur 5 dimensions (Keyword targeting, Search intent, Internal linking, GEO, Competitive). Applique un fixer LLM bouclé jusqu'à convergence. Modifie le contenu (≠ QA report-only). Backup OUTPUT_PRE_REFINE créé avant tout fix.

CONVERGEDToutes rows ≥ threshold
MAX_ITER · PLATEAU3 iter sans converger
BUDGET_EXHAUSTED$3 ou 10 min dépassé
PARTIAL_SCOREScorer dégradé
Resume idempotent

Re-run après crash quasi gratuit : les rows déjà CONVERGED sont skippées via cache (cost ≈ 0, < 30s).

Bypass disponible

Flag --skip-refine sur /aubainerie-seo-data pour aller direct au QA (debug ou re-run après correction manuelle).

7e

QA automatique 2 passes Sub-agent isolé /aubainerie-seo-qa

Pass 1 mécanique déterministe + Pass 2 LLM Sonnet · Posture report-only

Pass 1 : longueurs, regex, balises, listes noires, em dash. Pass 2 : ton cliente, ancrage usage, banque adjectifs, humanisation, anti-templating (parallélisé sur Sonnet via CLI claude). Écrit un onglet QA avec violations classées BLOCK / WARN / INFO. Ne corrige jamais.

PASS→ push autorisé (étape 7f)
FAIL_WITH_BLOCKS→ /aubainerie-seo-fix
FAIL_LLMPass 2 KO, Pass 1 valide
⚙️

Branche conditionnelle — Fix mécanique /aubainerie-seo-fix

Déclenché si STATUS=FAIL_WITH_BLOCKS · scripts/lib/redaction_fix.py

Patche l'OUTPUT pour les BLOCK auto-fixables uniquement (suffixe brand, point final, troncature, em dash, double hyphen, espace avant ?, ? manquant en FAQ). Les WARN/INFO et corrections sémantiques (forbidden_words, AI patterns, FIELD_EMPTY) sont listés en skipped.

Boucle de validation

Après fix → re-run /aubainerie-seo-qa pour vérifier que les BLOCK sont bien résolus avant de continuer vers le push.

Gate 2 — Validation QA Gate dur

Le push est bloqué tant que QA ≠ PASS

Refus de push si l'onglet QA contient des BLOCK non résolus. La banner STATUS: PASS doit être présente.

7f

Push Google Sheets /aubainerie-seo-push

Format Shopify metafields · Sheet partagée Mathilde & François

Conversion via to_shopify_row() (jamais de colonnes ad-hoc). Création de l'onglet si manquant, écriture de la ligne parent + headers (clear), append des sous-collections en batches de 5 (append).

Connection
  • drive_mathilde@cardiganmtl.com
  • Spreadsheet ID 1_H8DT2u…
Colonnes Shopify
  • Handle, Title, Body HTML
  • Metafield title_tag · description_tag · seo_paragraph_onpage
  • 5 × FAQ question/answer · type/filter/statut
8

Résumé chat Orchestrateur

Étape 8 · Recap final pour Édouard

Affichage : queries pullées · enrichies · sous-catégories · % top 10 Aubainerie · position moyenne · top 5 catégories par volume · top competitors · chemin Excel · lien Google Sheets.

Architecture d'orchestration

Pourquoi cette structure

1 orchestrateur, 6 sub-skills

/aubainerie-seo-data drive le flow. Chaque sub-skill est invoqué via Task tool en sub-agent isolé.

Isolation de contexte

Le QA ne doit pas voir le contexte data. Le redacteur ne doit pas voir le contexte data brut. Chaque sub-agent reçoit uniquement ce dont il a besoin (Excel path + brief).

Postures clairement séparées

Refine : modifie. QA : report-only. Fix : mécanique uniquement. Push : write-only sur Sheets.

Gates utilisateur

Gate 1 (pré-rédaction) bloque sur confirmation explicite. Gate 2 (QA pass) bloque sur statut machine. Aucune dérive autonome possible.

État dans l'Excel

L'Excel multi-onglets est la source de vérité. Backup OUTPUT_PRE_REFINE. Onglet SCORE_SEO + QA permettent un re-run idempotent.

Configuration externalisée

config/aubainerie-seo.yaml · aubainerie-redaction-rules.yaml · aubainerie-redaction-guide.md · aubainerie-seo-refine.yaml = single source of truth.

Modules Python canoniques

scripts/lib/ : categorizer.py · seo_excel.py · subcollections.py · redaction_qa.py · redaction_fix.py · seo_refine.py

Sources externes

GSC via MarkiFact MCP · DataForSEO via script bash · Google Sheets via connection Drive Mathilde · CLI Claude (subscription) pour QA Pass 2.