seo-audit-eeat — Analyse E-E-A-T & confiance
Couvre l'intégralité de la méthode E-E-A-T (references/process.md, copie fidèle de la spec). Produit findings/eeat.json + un score E-E-A-T /100.
Architecture hybride — deux couches, aucun process omis
- Couche script (
scripts/analyze.py) : tout ce qui est mécanisable — détection des pages auteur (4A.1), Person schema + complétude (4A.2), pages de confiance présence/indexabilité (4B.5), pages preuve client (4B.8), pages sécurité SaaS (4B.9). Calcule la part mécanique du score et écrit un score partiel honnête. - Couche agent (CE SKILL.md) : les jugements qualitatifs que le script ne peut pas faire — il les liste dans
to_judgeavec leur URL et leur rubrique exacte. L'agent les exécute via WebFetch, puis complète le score.
Le script ne fabrique JAMAIS un proxy à la place d'un jugement. S'il ne peut pas évaluer la qualité d'une About page, il l'inscrit dans
to_judgeavec le barème — l'agent va lire la page et scorer.
Procédure de l'agent
Étape 1 — Lancer le socle script
python seo/skills/seo-audit-eeat/scripts/analyze.py <slug>
Produit findings/eeat.json avec facts, score_breakdown (part calculable + part à juger), to_judge, findings.
Étape 2 — Exécuter chaque évaluation de to_judge
Pour chaque entrée de to_judge, WebFetch l'URL (ou l'échantillon) et applique la rubrique. Les rubriques (rappel) :
4A.3 — Crédentials auteur (échantillon 5 pages auteur) : checklist 7 points par page → 1) nom complet, 2) photo, 3) titre/rôle, 4) bio/crédentials, 5) liens sociaux, 6) indicateurs d'expertise, 7) lien vers ses articles. Score /7. Globalement : 0=aucun, 4=basique (1-3 éléments en moyenne), 8=bios complètes (5+).
4A.4 — Bylines blog (échantillon 10 articles) : par article → nom auteur visible, photo, bio snippet, lien page auteur, date pub, date MAJ. Byline Coverage = (articles avec attribution / total) × 100. Mappe : 0=<50%, 5=50-90%, 10=>90%.
4B.6 — Qualité About (/50) : Company story +15, Team avec bios +10, Mission +10, Office address +10, Awards +5. Mappe vers Authoritativeness.about_quality : 0=<20, 5=20-40, 10=>40. Note aussi industry_recognition (awards) : 0=aucune, 2=quelques, 5=prominents.
4B.7 — Contact : adresse physique, téléphone, email, formulaire, horaires, méthodes multiples, map. Complétude adresse → Trustworthiness.contact_address : 0=pas d'adresse, 4=ville seule, 8=adresse complète.
4B.8a — Témoignages : noms réels, logos, photos, résultats/métriques, citations vérifiables, vidéos, liens reviews tiers. Classer Bon (5+)/Basique (2-4)/Manquant (0-1) → Trustworthiness.testimonials : 0=Manquant, 3=Basique, 7=Bon.
4B.9a — Sécurité SaaS (si applicable) : SOC 2, GDPR, chiffrement, audits, pentesting, uptime SLA, certifications → 0=aucun, 2=basique, 5=certs documentées.
Étape 3 — Compléter le score E-E-A-T /100
Reprends score_breakdown. Pour chaque sous-score marqué to_judge, remplace par les points obtenus à l'étape 2. Somme les 4 composantes (Experience + Expertise + Authoritativeness + Trustworthiness, chacune plafonnée à 25). Brackets (thresholds.eeat.total_score) : 80-100 excellent, 60-79 bon, 40-59 moyen, 20-39 faible, 0-19 critique.
Pour Authoritativeness.brand_citations : si pas de DataForSEO (eeat.citations.spec_only présent), laisse ce sous-score à 0 et note "citations à brancher" — ne l'invente pas.
Étape 4 — Recommandations pilotées par les gaps (4D.14)
Ne PAS sortir un template générique par catégorie. La recommandation doit cibler le sous-score précis qui manque. Méthode :
- Après l'étape 3, tu as la valeur de chaque sous-score (pas seulement le total par composante). Ex : Experience = 10 parce que author_pages=10 mais credentials=0 et case_studies=0.
- Pour chaque composante < 15/25, identifie quels sous-scores sont déficients (à 0 ou sous leur palier) et ne recommande QUE pour ceux-là.
- Mappe chaque sous-score déficient à sa correction spécifique :
| Sous-score déficient | Recommandation ciblée |
|---|---|
author_credentials bas |
Ajouter bio + crédentials/certifications visibles sur les pages auteur identifiées (lister les URLs) |
case_studies = 0 |
Créer des cas clients démontrant l'expérience pratique |
author_schema partiel/0 |
Ajouter/compléter le Person schema (jobTitle, sameAs, description) sur les pages auteur listées |
blog_bylines < 90% |
Ajouter une signature visible (+ lien page auteur) sur les articles sans byline (lister l'échantillon) |
about_quality bas |
Enrichir l'About sur les éléments manquants précis du barème /50 (story / team / mission / address / awards — dire lesquels manquent) |
brand_citations bas |
Viser des mentions sur sites sectoriels / publications (si à brancher : noter "mesure citations à activer") |
contact_address bas |
Ajouter l'adresse physique complète au Contact |
testimonials bas |
Créer/améliorer la page témoignages avec noms réels, logos, métriques |
privacy_terms < complet |
Compléter Privacy Policy / CGV manquantes (dire lesquelles) |
security_saas bas (SaaS) |
Documenter SOC 2 / GDPR / chiffrement sur une page sécurité |
La recommandation cite l'URL ou l'élément concret concerné, pas une phrase générique. Une composante peut être <15 avec UN seul sous-score à corriger — ne recommande pas les autres s'ils sont déjà bons.
Étape 5 — Write-back du score et des recommandations (OBLIGATOIRE)
Une fois les sous-scores hydratés (étape 3), réintègre tout dans findings/eeat.json via le module partagé. Il stocke le score_breakdown complété ET génère automatiquement les recommandations ciblées par sous-score déficient (pas un template par catégorie) :
python seo/seo-os/scripts/judgment.py <findings/eeat.json> \
--results '{"score_breakdown": <le score_breakdown avec tous les sous-scores hydratés en {"points": N}>, "total": <score /100>}' \
--rule eeat_recos
La règle eeat_recos parcourt chaque composante < 15/25, repère les sous-scores à 0, et émet un finding eeat.reco.<sous_score> ciblé (ex : eeat.reco.author_credentials, eeat.reco.contact_address) — uniquement pour les déficits réels. Ajoute ensuite manuellement un finding eeat.score (via write-back) si le total < 60, avec le détail des composantes faibles.
Données requises
- Crawl (raw.json) : obligatoire (pages, microdata). Toujours là après seo-collect.
- Contenu HTML des pages (WebFetch) : requis pour les
to_judge. L'agent le récupère à la volée. - DataForSEO Content Analysis : pour 4C.10-12 (citations). Non collecté →
collecte_a_brancher.
Contrat
Entrée : data/crawl/<date>/raw.json. Sortie : findings/eeat.json (facts + score_breakdown + to_judge + findings). Voir references/process.md pour la spec complète et seo-os/references/data-contract.md pour le format.
Sur Hermes
Profil-worker seo-eeat, carte parents=[seo-collect], parallèle aux autres analyses. La couche agent (WebFetch + jugement) tourne dans le worker ; le SKILL.md la pilote.