OBOXIA — Journal de dev

Co-pilote de jugement SEO scalable. Chaque CR/synthèse est une entrée datée immuable (append-only = rollback). L'historique nourrit le dev.

🏁 Dernier jalon (2026-08-08) — Deux jalons mesures le meme jour. La note monte pour la premiere fois de facon mesuree : 77 -> 80 sur le banc, premiere paire avant/apres jamais produite sur un site. Et la fiche Google est branchee sur le parc : detection executee 2 -> 16 sites, fiche identifiee 1 -> 12, note et avis Google recuperes sur 12 sites, contre 0 depuis le debut du projet.

Flotte OBOXIA — avancement

78 % avancement global ACTUEL — au 2026-08-11 · effort concentré sur l'Agent 5. 2 agents hors moyenne (% non calculable, faute de chantiers listés). ⚠️ les % cités dans les entrées datées ci-dessous sont des instantanés passés, pas le chiffre courant. Socle : 88 %
Les fondations techniques communesSocle / colonne de données (core, GSC, crawl) 88% en cours
La lecture de la demande du clientAgent 1 — Analyse du brief 100% livré v1 (mergé master a34af70..f28f97e, 9 tâches TDD, revue finale Opus READY TO MERGE) — 6/6 musts spec 2026-07-21
La machine à créer des pages par ville (le moteur existe déjà chez Slim, notre rôle reste à cadrer)Agents 2·3 — Génération de contenu + démultiplication multi-ville non calculable RETENU ET DEMARRE (decision Naouphel, 2026-08-02). Le moteur multiville (Obox-Multiville) reste la propriete de Slim et ne compte jamais comme notre travail fait. Notre part — piloter le moteur : choix des zones et villes, gabarit, declenchement — demarre par l ecriture de sa spec. Prerequis : Slim doit dire si le controle des pages-villes se fait avant ou apres publication.
La transformation des maquettes en site (côté Slim)Agent 4 — Figma-to-code non calculable CLOS (decision Naouphel, 2026-08-02). Sorti du perimetre : il ne figure plus dans le travail a faire, ni du notre ni de celui de Slim, et ne doit peser dans aucun decompte. · externe
L'outil qui note les sites et dit comment les améliorerAgent 5 — Audit SEO + reco + score ⭐ 100% livré (ancre de valeur) — 23/23 musts (dont points par reco, 2026-07-23), B-2 validé sans Slim, GA4 hors note
La visibilité dans les nouveaux moteurs de réponseAgent 7 — GEO 100% CORRIGE 2026-08-08 (le suivi disait 0 %/différé, faux) — livré v1 le 2026-08-07 (mergé master c0ebbf3, spec 2026-07-25-oboxia-geo-readiness-design.md, plan même date exécuté par sous-agent + revu). Suite 1876/1876 au merge, typecheck 0, registry-pin vert SANS bump (contrat additif). LIMITE CONNUE, mesurée sur le rendu réel : 2 signaux sur 4 (fraîcheur via contentDate, citabilité via externalLinks) sortent « non évalué » sur tout le parc tant qu'un nouveau passage du crawler n'a pas été fait — comportement voulu (règle d'abstention §3 de la spec), pas un défaut du code.
La surveillance des sites une fois en ligneAgent 8 — Maintenance continue 63% MAJ 2026-08-03 (Lot C livre) — le comparateur sante<->sante alerte reellement : --persist-dir cable, id de collision corrige, detectHealthRegressions + CLI + dashboard, declenche en fin de sweep-parc. Independant de la note (le parc est passe a 6/7 familles le 03/08 apres les chantiers indexabilite et exploration — seuil 5, donc une marge) : ce chemin d alerte-la n attend personne. Reste todo : la chaine de comparaison de la NOTE (SiteSnapshot) elle-meme, toujours a 0 photo ecrite tant que la couverture n atteint pas 5/7. Detail : docs/agent8-verite-et-reprise-2026-08-03.md, docs/spec-comparateur-sante-2026-08-03.md.
Le bilan régulier présenté au clientAgent 9 — Bilan client 0% attend D2
La vérification finale avant la mise en ligneAgent 10 — Contrôle avant mise en ligne non calculable livré v1 (mergé master, 471 tests, revue opus READY) — dépendance brief.json LEVÉE (Agent 1 livré 2026-07-21, A10 consomme le brief A1 : preuve déterministe 0 throw). Reste seulement : preuve réelle sur un vrai staging OBOXIA (crawl live).
L'assistant qui applique lui-même les corrections sur le siteAgent 6 — Correcteur (écrit dans WP, D4) 80% aperçu dry-run + WRITE STAGING codé/revu (revue Opus : cœur sécurité solide, 760 tests) + rollback + PREUVE LIVE OK (write réel HTTP 200 + rollback prouvés via le vrai CLI sur staging). Reste : write PROD gated Slim (plugin+owasp+validation humaine)
La vigie qui garde les règles SEO à jourAgent Veille — règles SEO (garder le rulepack à jour) 100% RÉTROGRADÉ livré→en-cours le 2026-08-11 (constat Naouphel), sur le MÊME critère qu Agent 8 le 2026-08-03 : les calculateurs sont livrés et prouvés, la chaîne ne produit rien d utilisable. Mesure du premier tir réel (2026-08-10, 605219f) : 40 candidats, 12 déjà couverts, 28 propositions dont ZÉRO mesurable (aucun exécuteur ne sait les calculer) et 40 candidats sur 40 SANS URL — donc inintégrables en l état. Un agent dont aucune sortie n est exploitable n est pas livré. || LE pct EST PASSÉ DE 100 À null LE 2026-08-11, dans le même geste : il mesurait les musts spécifiés, or il manque à cette spec le must décisif (des propositions intégrables). Un 100 % à côté d un state « en-cours » se contredisait aussi frontalement (règle 7 du garde G2) — voir pctStatus. || Cause racine déjà nommée le 2026-08-06 et non traitée : la Veille compare le référentiel au référentiel (lessons.md, 11/07) au lieu de le confronter à un référent EXTÉRIEUR. C est la contrepartie non négociable de l amendement du 08/08 sur le juge interne.
11 août 2026 à 15:13 UTC

Le carnet de bord reprend après six semaines de silence

Le journal reprend — 14 pages sur 14 produites, zéro publiable

Ce carnet de bord n'avait plus été tenu depuis le 1er juillet — six semaines sans une ligne, alors que le travail, lui, n'a pas arrêté. On ne va pas réécrire ces six semaines après coup : on reprend à partir d'aujourd'hui, et on dit franchement qu'il y a un trou.

Ce qui a été réparé ce matin. L'outil qui rédige les pages de villes a un garde-fou : il refuse de publier une page si elle cite un lieu qui n'existe pas. Problème, ce garde-fou était mal réglé — il se déclenchait sur des mots français parfaitement normaux (« Bienvenue », « Découvrez »). Résultat le 9 août : 14 pages rédigées, 14 refusées, et pas une seule ne contenait le moindre lieu inventé. Il a été remplacé par un vrai dictionnaire français de 336 000 mots. Aujourd'hui à midi, nouvel essai sur 14 communes belges : 14 pages rédigées, zéro refusée. Le garde-fou laisse passer le français et continue de bloquer l'invention.

Ce qui ne va toujours pas. J'ai lu trois de ces pages en entier, à l'œil, cet après-midi. Aucune n'est prête à être mise en ligne. Une note de travail interne (« à vérifier avant publication ») se retrouve dans le texte visible. La rubrique « nous intervenons aussi à proximité » annonce des communes situées à 29 kilomètres — un habitant de la région le verrait tout de suite. Et le texte d'introduction récite la liste des quartiers que la rubrique suivante répète juste en dessous.

C'est la leçon du jour, et elle vaut d'être écrite : le compteur affichait 14 réussites sur 14. Il a suffi de lire trois pages pour voir que zéro était présentable. Aucun test automatique ne remplace le fait de lire ce qu'on s'apprête à publier.

La suite. L'objectif est fixé à lundi 17 août : que les agents tournent tout seuls sur les sites, sans qu'on ait à les lancer à la main. Aujourd'hui, tout démarre manuellement. Il manque trois choses, et trois seulement : un réveil automatique, une livraison du résultat, et une trace de passage où un site en échec est nommé plutôt qu'oublié en silence. Démonstration mercredi 12 août après 14h.

Le journal reprend — et il reprend en disant pourquoi il s'était arrêté

Le trou, acté en une ligne

Aucune entrée entre le 1er juillet 06h43 et aujourd'hui : 41 jours de silence, ~811 commits non racontés ici. Ce n'est pas une panne — rien n'appelait journal/add.mjs, c'est un geste manuel qu'on a cessé de faire. Décision de Naouphel ce 11/08 à 17h15 : on ne rattrape pas rétroactivement, on repart d'aujourd'hui. Le récit de ces six semaines n'est pas perdu pour autant : il vit dans les bilans HTML publiés (docs/bilan-general-2026-08-11.html, docs/journal-actes-2026-08-10.html), simplement pas ici.

⚠️ Ce qui n'a jamais cessé, en revanche : journal/fleet.json (la jauge de flotte) était à jour ce matin encore. C'est le récit qui s'est arrêté, pas la mesure.

Ce qui a été réparé ce matin (branche garde-toponymes, 4 commits)

Correctif Ce que ça répare
67b3799 — pages-villes 0.12.0 Le garde anti-invention refusait le français, pas les lieux inventés. Au tir du 09/08 : 14 pages produites, 14 refusées, aucune ne citait un lieu inventé. Il repérait les majuscules — or le français capitalise tout début de phrase. Remplacé par un dictionnaire français de 336 524 mots, mesuré avant d'écrire la règle : les 13 mots refusés y sont tous, aucun des 7 toponymes de test.
ec165c3 — 0.13.0 Un refus garde désormais sa pièce à conviction. C'est la disparition des textes refusés qui avait rendu un bug invisible huit jours : le colmatage du 09/08 avait inscrit qu'il avec l'apostrophe droite alors que les textes emploient la courbe. On croyait avoir réparé 8 mots, on en avait réparé 7.
3bedec9 La Veille rétrogradée livréen-cours, décompte de flotte 5 → 4. Mesuré le 10/08 : 40 candidats, 28 propositions dont 0 mesurable, 40 sur 40 sans URL. Son pct passe à null plutôt qu'à un 100 % flatteur en face d'un « en-cours ».
9f27a34 — 0.13.1 L'identité de commune n'a plus une seule porte Overpass.

Le tir réel de midi : 14 pages sur 14, zéro refus

mesures/tir-reel-2026-08-11/ — les 14 communes belges du pilote (Anderlecht, Uccle, Waterloo, Kraainem…) : 14 dossiers collectés, 0 échec, 14 pages produites, 0 refusée par le garde. Le garde réparé ce matin laisse passer le français et continue de refuser l'invention.

Et pourtant : aucune de ces pages n'est publiable en l'état

Trois pages lues en entier, à l'œil ce 11/08 à 17h — le seul contrôle qui ait jamais attrapé le pire défaut du projet, et qu'aucun test ne remplace. Trois défauts visibles :

  1. Le marqueur interne [à vérifier avant publication] est DANS le texte servi — il partirait en ligne tel quel.
  2. La section « Nous intervenons aussi à proximité » n'est pas une liste de communes voisines, c'est le reste du lot : la page de Waterloo annonce Meise à 29,5 km. Un lecteur belge le voit immédiatement. Défaut déjà nommé le 09/08, toujours ouvert.
  3. L'intro recopie la liste des quartiers que la section suivante redonne : Anderlecht énumère ses 19 quartiers deux fois. Du bourrage, et du doublon intra-page — l'inverse de l'unicité qu'on cherche.

Verdict : 14 pages produites ≠ 14 pages publiables. Le compteur dit succès, la lecture dit non.

Le cap

V1 le lundi 17/08 : les agents tournent seuls sur le parc. Pas le plugin chez les clients, pas des pages publiées — la chaîne qui se déclenche, livre, et laisse une trace où un site en échec est nommé au lieu d'être avalé en silence. Il manque exactement trois choses : un déclencheur (il n'existe aucun cron aujourd'hui), une livraison, une trace de passage. Démonstration devant David et Slim mercredi 12/08 après 14h.

↑ haut de page
1 juillet 2026 à 06:43 UTC

Agent 8 est terminé : il surveille aussi les baisses dans le temps

Agent 8 COMPLET — détection de régression livrée (11 signaux, dashboard, seuils par signal)

Ce matin, on a livré la partie « bilan de santé » — la surveillance qui inspecte les sites aujourd'hui, à l'instant.

Ce soir, la surveillance est complète sur un deuxième front : elle regarde maintenant dans le temps. Elle compare le dernier relevé d'un site avec le précédent, et lève un drapeau dès qu'un signal important baisse.

Concrètement : si la note globale d'un site chute, si les visites ou les ventes depuis Google reculent, si la note étoiles sur Google Maps descend ou si des avis disparaissent, si de nouveaux problèmes techniques font leur apparition — tout ça est détecté. Les sites avec les baisses les plus graves remontent automatiquement en tête de liste.

On ne crie pas au loup pour une petite variation : chaque signal a son propre seuil, seules les vraies baisses déclenchent une alerte.

La surveillance est maintenant complète — bilan du jour et évolution dans le temps réunis. Le médecin de famille des sites veille désormais sur deux fronts. Un beau jalon.

Agent 8 — Facette 2 : Détection de régression (livré 2026-07-01 soir)

Ce qui a été construit : le module @oboxia/agent-8-regression compare les deux derniers SiteSnapshot persistés d'un site et signale les signaux qui ont significativement chuté, avec gravité par signal.

11 signaux surveillés avec seuils individuels :

  • Note composite : −5 (à surveiller) / −10 (critique)
  • 4 dimensions (technique / positions / perf / local) : −8
  • GA4 conversions : −20 % (critique) ; sessions : −25 %
  • Google Business : note −0,3 (critique) ; perte d'un avis (à surveiller)
  • Santé technique : nouveau problème critique (critique) ; +3 avertissements (à surveiller)
  • Signal absent d'un côté = ignoré (honnêteté stricte, pas de delta fantôme)

Contrat RegressionReport v1 (versionné, @oboxia/core) : tableau de RegressionSignal (signal, ancienne valeur, nouvelle valeur, delta, gravité critique/à-surveiller).

CLI regression-cli : --persist-dir, --site (filtrage), --json, --out. Isolation d'erreur par site (un site en échec ne bloque pas le reste).

Dashboard HTML « Régressions depuis le dernier scan » : tri parc par gravité descendante, sites sans historique = « pas encore de comparatif ».

Preuve E2E : fixture synthétique 2 relevés → exactement 3 critiques + 1 à surveiller (note −12, conversions −30 %, note Google −0,4, avis perdu). JSON + dashboard produits.

Qualité : design brainstorm → spec → plan → 4 tâches TDD + revue adversariale par tâche + revue finale Opus (« Ready to merge »). 446 tests verts (était 429), typecheck 0. 6 commits abf66ad136b8961.

Dette résiduelle loggée :

  1. Testé sur fixtures uniquement — aucune donnée réelle accumulée (1re vraie valeur quand la persistance snapshot aura tourné ≥ 2× sur le parc)
  2. buildSnapshot.health non peuplé en amont → signaux régression-santé (newCriticalHealth / moreSanteWarnings) inertes jusqu'au câblage de ce champ
  3. Regex sanitisation site→fichier dupliquée en 3 endroits (à centraliser dans @oboxia/core)
  4. Moyenne glissante / baseline / push Telegram = hors v1
↑ haut de page
1 juillet 2026 à 05:28 UTC

La surveillance santé des sites est prête

Agent 8 — santé technique livrée (8 checks, dashboard parc, preuve réelle 20 pages)

On a maintenant un inspecteur santé automatique pour tous les sites du parc. Il visite chaque page d'un site et remonte tout ce qui cloche : des liens qui tombent sur une erreur, des images qui ne s'affichent plus, des pages cachées à Google sans le faire exprès, un certificat de sécurité expiré, ou encore la « carte d'identité Google » (la fiche LocalBusiness) qui manque — c'est ce qui permet à Google Maps de bien référencer un artisan.

Pour chaque problème détecté, il indique qui doit le corriger : le Correcteur automatique, l'équipe technique, ou Slim directement. Les sites les plus urgents remontent en premier.

On l'a testé en vrai sur le site d'un plombier (20 pages) : en moins de 3 minutes, il a sorti un rapport complet. Résultat : zéro problème critique, 22 avertissements — surtout la carte d'identité Google à compléter sur chaque page. C'est exactement ce qu'on avait vu avec notre outil de notation : les deux outils arrivent au même constat sur les mêmes sites, ce qui confirme qu'on est dans le vrai.

Prochaine étape sur ce chantier : mettre en place les alertes automatiques quand un site se dégrade dans le temps.

Agent 8 — santé technique livrée : 8 checks, dashboard parc, preuve réelle

Construit cette session en 14 commits (6161cb6051a0dd) : nouveau package @oboxia/agent-8-sante. 429 tests verts (était 403 au démarrage), typecheck 0.

Les 8 checks du contrat SiteHealth v1

  1. pageDown — page injoignable (HTTP 5xx/timeout)
  2. httpsExpired — certificat HTTPS expiré
  3. noindex — balise meta noindex ou en-tête X-Robots-Tag: noindex (les deux sources)
  4. brokenInternalLinks — liens internes cassés
  5. brokenExternalLinks — liens externes cassés (avec retry)
  6. brokenImages — images cassées
  7. missingLocalBusinessSchema — JSON-LD LocalBusiness absent ; reconnaît les sous-types (Plombier/Électricien/etc.) — schémas partagés avec Agent 5 via @oboxia/core pour éliminer toute divergence inter-agents
  8. missingTags — balises manquantes (title / H1 / meta description)

Chaque problème porte une sévérité (critique / avertissement) et un « qui répare » (Correcteur auto / humain / ops). Contrat versionné SiteHealth v1 dans @oboxia/core avec verrou registre mécanique.

CLI health-cli : flags --site, --json, --out, --persist-dir. Flux complet : découverte sitemap → scan parallèle borné → dashboard HTML « Santé du parc » → historique JSONL.

Qualité

6 tâches TDD + revue par tâche + revue finale Opus (verdict « Ready to merge ») → 4 corrections post-revue : (1) sous-types schema partagés Agent 5/8 (divergence éliminée), (2) détection X-Robots-Tag, (3) parallélisation bornée des checks, (4) persistance + lien Correcteur dans le registre.

Preuve réelle bout-en-bout

  • ouadi-plomberie.fr — 20 pages, 167 s → 0 critique, 22 avertissements (20 LocalBusiness absent, 1 lien interne cassé, 1 balise manquante)
  • mp-solution.fr — 16 pages → 16 LocalBusiness absent + 16 images signalées (spot-check CDN recommandé avant présentation client)

Constat LocalBusiness recoupé avec l'audit Agent 5 sur ces deux sites : deux agents, même constat → cohérence inter-agents confirmée.

Dette résiduelle loggée (non bloquante)

  • Images sans retry → spot-check curl -I conseillé sur les 16 de mp-solution (faux positif CDN possible si le CDN filtre notre user-agent)
  • hasLocalBusinessSchema en JSON.parse strict → un JSON-LD malformé compterait comme absent (risque faible)
  • Retry 429 sans back-off exponentiel
  • Champ jsonLdTypes désormais inutilisé dans Agent 8
  • Reste Agent 8 = alertes sur régression des signaux dans le temps (facette « suivi continu », todo)
↑ haut de page
30 juin 2026 à 10:07 UTC

29-30/06 — risque Google corrigé + canal Telegram

Recalibration doorway + juge LLM câblé + canal Telegram (29-30/06)

Deux jours de travail sur le risque Google (le « doorway ») et les outils de suivi.

Le doorway, c'est quoi ? Quand un site fait 18 pages-villes avec le même texte (juste le nom de ville change), Google considère que c'est du remplissage et peut sanctionner. Notre outil détecte ce risque.

Ce qu'on a corrigé. Notre détecteur avait 3 défauts qu'on a trouvés en analysant tout le parc :

  1. Il prenait des sites d'un seul magasin (un ostéo, un café) pour des sites multi-villes → faux risque. Réglé.
  2. Pour un site vraiment dangereux (texte copié à 100 %), il disait « risque faible » au lieu de « danger ». Réglé : maintenant c'est clairement 🔴.
  3. Le rapport dit désormais quoi faire pour passer au vert (ajouter du vrai contenu local par ville) et quoi faire pour mieux apparaître sur Google (la fiche Google de l'artisan, surtout).

Ce qu'on a découvert sur le parc : sur 30 sites analysés, seulement 6 sont vraiment multi-villes, et 2 sont en danger réel (texte quasi copié-collé). Les autres ne risquent rien sur ce point. On a aussi sorti une analyse détaillée d'un site (vmcouvreur) : titres trop semblables, fiche d'identité Google absente, 4 numéros de téléphone différents, et même des pages de démo WordPress oubliées.

Côté communication : on a mis en place un canal Telegram d'équipe (le groupe « Canal dev oboxia ») — c'est là qu'arriveront désormais les points d'avancement, à la place du WhatsApp qui ne marchait plus.

Où on en est : l'agent principal (l'audit) est à 89 %. Tout est sauvegardé.

Session du 29-30/06 centrée sur le risque doorway/duplicate et l'outillage de pilotage.

Recalibration doorway DANS l'audit (3 bugs corrigés)

L'analyse de tout le parc (30 sites) a révélé 3 défauts de analyzeLocalSpecificity, tous corrigés en TDD :

  • Multiville fiable : multiCity était codé en dur (tout site ≥2 pages = « multiville »). Désormais calculé depuis les villes distinctes dérivées (+ stoplist anti faux-positifs /contact, /tarifs…). Un mono-site n'est plus flaggé doorway.
  • Verdict recalibré : ville-masquée ≥ 95% → 🔴 d'office (vmcouvreur, 100% identique après masquage, était classé 🟡 « faible » à cause d'une densité bernée). Densité effective = 0 quand les faits locaux sont identiques partout. Fixture réelle pages-vmcouvreur.json.
  • Rapport actionnable : nouveaux blocs « Pour passer au vert » (cible chiffrée : gabarit < 50 % ET ville-masquée < 60 %) + « Pour mieux ranker » (GBP, preuve locale, couches data). 374 tests verts.

Juge LLM B-2 câblé (--judge-llm)

attachDoorwayJudgment + flag opt-in --judge-llm : le juge IA est appelé sur la bande grise et son verdict affiché (expérimental, hors note tant que non validé au gold-set). Contrat DoorwayJudgment + section HTML.

Analyse du parc + outillage

  • Triage de 30 sites : seulement 6 vrais multivilles (≠ 30 « multiville » du flag cassé) ; 2 en 🔴 (texte ~100% copié : vmcouvreur, charpentier-couvreur-morbihan). Reco page-par-page produite sur vmcouvreur (titres spinés, JSON-LD LocalBusiness absent, 4 numéros de tél, pages démo WordPress non supprimées).
  • Outils : doorway-risk-cli.ts (scan rapide), classify-multiville.py (slug↔commune).

Stratégie (council « ligne doorway »)

Council : le multiville pur plafonne ~65-70, viser « 90 interne » est la mauvaise cible ; le vrai juge = clics/CTR GSC réels ; levier de ranking = fiche Google (GBP) par artisan. Objectif produit recadré (Naouphel) : ne pas être pénalisé (doorway) + rester positionné. Doorway ≠ duplicate.

Pilotage

  • Canal Telegram d'équipe câblé (groupe « Canal dev oboxia ») → remplace le WhatsApp/CallMeBot mort ; Slim + David voient les jalons.
  • Hook timebox automatique + horodatage injectés à chaque tour.
  • Avancement : Agent 5 = 89%, global build 22%. Tout sur master, poussé sur GitHub privé.
↑ haut de page
28 juin 2026 à 20:30 UTC

28/06 — 3 analyses prêtes pour Slim + fondations blindées

Session 28/06 — fondations anti-recodage (council [1]→[3]) + 3 pilotes + B-2 scaffold

Grosse journée. On a fait trois choses.

1. On a blindé les fondations. On a posé des "garde-fous" entre les robots : si l'un change sa façon de parler, un test sonne l'alarme tout de suite. Ça évite de devoir tout recoder plus tard — c'était le gros risque, il est écarté.

2. On a sorti 3 vraies analyses de sites. Une charcuterie, un plombier multi-villes, un avocat. Trois métiers différents, trois rapports complets, en ligne, prêts à montrer à Slim. C'est LA preuve que l'outil sert à quelque chose : Slim regarde, et il dit si c'est bon ou pas. Exemples concrets trouvés : la charcuterie a une fiche Google 5 étoiles (11 avis) et un produit qui peut vite monter ("saucisson aux tomates séchées") ; le plombier copie-colle ses pages de villes (Google n'aime pas ça) ; l'avocat a 6 numéros de téléphone différents sur son site (la cata pour Google).

3. On a branché l'IA juge. Pour les cas où le calcul automatique hésite, une IA tranche. Le branchement est fait ; reste à vérifier qu'elle a bon — et pour ça il faut que Slim corrige une cinquantaine de pages "à la main" pour servir de référence.

Où on en est : l'avancement global passe à 22 %, mais surtout l'Agent principal est à 94 %. Le reste dépend maintenant de Slim : qu'il regarde les 3 rapports et qu'il remplisse la grille de référence.

Grosse session de fondations : on a posé le mécanisme anti-recodage du council (séquencer par gels de contrats, pas par agents), produit 3 pilotes réels et construit la dernière brique d'Agent 5.

Infrastructure de contrats (council [1] → [3])

  • GA4 : contrat Ga4Report + adaptateur fake/real (miroir de GSC), touch réel sur la property 543343310 → signal de conversion disponible.
  • Contrat Correctif (Agent 5 → Correcteur) versionné + test-gate mécanique : il casse si la sortie d'Agent 5 dérive du schéma d'entrée du Correcteur (mutation-prouvé). C'est la « première chose à faire » du council.
  • Contrat SiteSnapshot (entrée Agent 8) versionné + persistance JSONL horodatée.
  • Registre de contrats (CONTRACT_VERSIONS) = source unique des versions + verrou de bump (tout changement de version casse un test = décision consciente) + harness d'intégration extensible. Le gel mécanique est généralisé : aucun contrat inter-agents ne peut dériver en silence.

3 pilotes Agent 5 publiés (preuve de valeur)

Trois recos réelles, contrastées, prêtes pour le go/no-go de Slim :

  • Maison Brielle (commerce) — note 71/100, fiche Google réelle (11 avis 5/5), quick-win « saucisson aux tomates séchées ».
  • MP Solution (artisan multiville) — note 63/100, doorway mis en évidence (72 % de gabarit dupliqué, le différenciateur).
  • Sangaré Avocat (profession libérale) — note 52/100, annuaires métier (Doctrine/Justifit/Avocat.fr) + NAP en vrac (6 numéros de tél).

B-2 — juge sémantique anti-doorway (scaffold)

Couture du juge LLM : contrat DoorwayJudgment + adaptateur fake/real (OpenAI, modèle fort) + escalade uniquement sur la bande grise du déterministe. Run réel non exercé, validation en attente du gold-set de Slim (honnête : juge non mesuré tant que pas étiqueté).

Avancement (ancré, pas au doigt mouillé)

  • Global build = 22 % (Agent 8 → 33 %, Correcteur → 50 %, Agent 5 → 94 % avec B-2 couture faite / validation todo).
  • 361 tests verts, typecheck 0. Tout sur master.
  • Outillage de suivi durci : jalon.sh (sync unique cockpit + journal), bandeau « Dernier jalon », fleet ré-ancré. (Le WhatsApp de jalon est mort — quota épuisé — remplacé par le bandeau du journal.)

Facteur limitant désormais = Slim : go/no-go sur les 3 pilotes + étiquetage du gold-set (débloque la validation B-2).

↑ haut de page
26 juin 2026 à 18:46 UTC

Un 11e agent rejoint l'usine : la vigie SEO

Nouvel agent : Veille SEO — l'usine passe à 11 agents (l'ajout d'un agent à 0 % dilue temporairement la moyenne)

L'usine OBOXIA compte un 11ᵉ ouvrier : un agent de veille dont le métier sera de surveiller les règles de Google et du référencement, et de garder l'outil à jour.

Pourquoi ? Le référencement change tout le temps. Sans cette vigie, l'outil risquerait, dans quelques mois, de donner des conseils dépassés. Cet agent, c'est l'assurance que le rapport reste fiable dans la durée.

Pour l'instant il n'est pas encore construit — juste décidé et noté dans la liste des choses à faire.

Un mot sur l'honnêteté du suivi : en ajoutant ce nouvel agent à la liste, le pourcentage d'avancement global a légèrement baissé ce jour-là, pas augmenté. C'est normal et voulu : on compte tout le travail qui reste, on ne gonfle pas le chiffre. Mieux vaut un pourcentage modeste et vrai qu'un chiffre flatteur.

En clair : l'usine vise 11 ouvriers ; un seul (celui qui note les sites) est bien avancé, les autres restent à démarrer. Le projet est à ses débuts, et on le dit tel quel.

Nouvel agent dans la flotte : l'Agent Veille SEO. L'usine passe de 10 à 11 agents.

En travaillant sur la dimension Local, un besoin a émergé clairement : le SEO bouge (Google change ses règles, les bonnes pratiques évoluent). Un audit n'a de valeur que si le rulepack (notre base de règles notées 🔴/🟠/⚪) reste à jour. D'où un 11ᵉ agent : la Veille SEO.

Son rôle (à cadrer) : surveiller l'évolution des règles et bonnes pratiques SEO (Google + sources fiables) et maintenir le rulepack à jour — sans bruit ni faux signaux. C'est ce qui empêche l'outil de donner, dans 6 mois, des recommandations périmées.

Statut : parké en to-do (brainstorming → spec → build plus tard). Pas encore commencé.

Conséquence honnête sur le suivi : ajouter un vrai agent au décompte fait baisser l'avancement global, pas monter. Le fleet.json passe de 8 → 8 agents scope-build ? Non : de 7 → 8 (la veille rejoint a1/a5/a7/a8/a9/a10/Correcteur). Donc le global build a légèrement baissé ce jour-là (un agent de plus à 0 % dilue la moyenne). C'est volontaire : on compte le travail à faire, on ne le cache pas. (Chiffres de l'époque retirés pour éviter toute confusion avec l'avancement courant, affiché en haut de page.)

Rappel décompte : usine = 11 agents (10 du projet.md + veille). Les agents 2/3/6 (constructeur multiville) existent déjà via le plugin Obox-Multiville → « ce qu'on build » = 8 agents.

↑ haut de page
26 juin 2026 à 18:29 UTC

La note locale regarde aussi la fiche Google (avis)

Dimension Local — fiche Google Business (avis + NAP-fiche) via Places

La note « local » du rapport va maintenant aussi regarder la fiche Google Business du commerce (sa page Google avec les étoiles et les avis), en plus du site.

Concrètement, l'outil saura lire — automatiquement et seulement sur des infos publiques :

  1. Le nombre d'avis et la note (les étoiles).
  2. Si le téléphone et le nom sont les mêmes entre le site et la fiche Google (une incohérence fait perdre des points à Google).

Deux principes d'honnêteté importants :

  • L'outil ne se fie à une fiche que s'il est sûr que c'est la bonne (même téléphone/adresse et bonne ville) — sinon il dit « fiche non identifiée » plutôt que de risquer de noter la fiche du voisin.
  • Pour les avis, la qualité prime sur la quantité : 8 avis tous excellents valent mieux que 60 avis moyens. Et on affiche toujours les vrais chiffres (« 8 avis, 5/5 ») pour que ce soit vérifiable.

L'outil garde aussi une trace datée de chaque relevé — ça permettra plus tard de montrer l'évolution (les avis qui montent mois après mois) et d'alerter en cas d'avis négatif.

Ce qui n'est pas encore dedans : savoir si la fiche sort bien sur Google Maps quand on cherche le métier — c'est la prochaine étape, et on l'écrit clairement dans le rapport (« à venir ») pour ne rien promettre qu'on ne mesure pas encore.

Il manque juste une clé d'accès Google à créer pour activer la lecture réelle ; toute la mécanique est déjà construite et testée.

La dimension local capte maintenant la fiche Google Business (avis + NAP-fiche), via l'API Places.

Suite à tes réponses : tu es admin des fiches, OK pour lire le public, et ton signal n°1 = la fiche qui ranke sur les mots-clés (pack local) + le nombre d'avis. On a livré la brique « avis + cohérence fiche », le pack local arrive juste après (cf. plus bas).

Ce qui est construit (déterministe, lecture seule, testé sur fakePlacesClient — le réseau réel se branche dès la clé Maps créée) :

  • Adaptateur PlacesClient (fake/real, miroir de GSC). real = Text Search + Place Details, derrière une clé Maps à créer côté GCP (prérequis ops).
  • Résolution de fiche vérifiée (place-resolve) : on relie un client à SA fiche seulement si (téléphone OU domaine identique) ET ville cohérente → couvre le piège des franchises au même domaine. Sinon « fiche non identifiée » (jamais la mauvaise fiche, jamais de fausse note). Tu peux fournir un Place ID pour les cas ambigus.
  • Score avis = qualité mène le volume (gbpScore) : un 5/5 sur 8 avis = 80 (la qualité compense le faible volume), un 3/5 sur 60 avis = 60 — fini les paliers absolus indéfendables en RDV. Les chiffres bruts « N avis, X/5 » sont toujours affichés. NAP site≠fiche → signal rouge (ton levier vs le prestataire).
  • Persistance horodatée des lectures (fondation du suivi d'avis dans le temps + alertes — Agent 8).
  • La dimension local = 0,55 on-site + 0,45 fiche Google ; son poids dans la note globale monte de .15 à .20. Mention explicite « présence sur Maps : à venir » (on ne promet pas un rang instable).

Conception relue par un conseil LLM (qui a corrigé un bug d'unité dans le scoring des avis + durci la vérif géo + rééquilibré le poids), puis bâtie en 6 tâches TDD avec revue adversariale par tâche : 254 tests.

Reste : créer la clé Maps (toi/nous, ~15 min GCP) pour activer le réel, puis le pack local (ta priorité n°1) en sous-piste suivante.

↑ haut de page
26 juin 2026 à 17:25 UTC

Le rapport note maintenant le « local » du commerce

Dimension « Cohérence locale (on-site) » — 4ᵉ note composite (Agent 5)

Le rapport SEO note maintenant un 4ᵉ critère : le « local » — c'est-à-dire à quel point le site d'un commerce de quartier donne à Google les bonnes infos de proximité.

Concrètement, l'outil regarde tout seul, sur le site :

  1. La carte d'identité du commerce est-elle bien renseignée dans le code (nom, adresse, téléphone, horaires) ?
  2. Le numéro de téléphone est-il le même partout (un numéro qui change d'une page à l'autre fait perdre confiance à Google) ?
  3. L'adresse et les horaires sont-ils visibles ?

Et surtout : quand il manque la carte d'identité, l'outil génère le bout de code tout prêt à coller sur le site — un vrai cône de chantier « voici quoi faire », pas juste un constat.

On reste honnête : tant qu'on ne regarde pas encore la fiche Google et les avis (ça vient après), la note s'appelle clairement « cohérence locale (sur le site) » avec la mention « hors Google Business ». On ne fait pas croire qu'on mesure tout.

Sur un client test, la note globale a même baissé (de 68 à 62) — parce qu'elle dit désormais une vérité qu'elle ignorait avant. Une note qui descend en disant vrai vaut mieux qu'une note flatteuse.

Une 4ᵉ note rejoint le composite : « Cohérence locale (on-site) ».

Jusqu'ici la note Agent 5 = 3 dimensions (technique / positions / performance). Pour des PME locales, il manquait le volet local. On ajoute une 4ᵉ dimension local (poids 0,15), mesurée depuis le crawl, zéro dépendance externe, lecture seule :

  • Schema LocalBusiness (0,40) : complétude de la fiche d'identité structurée (JSON-LD) — parsing robuste (@graph, @type en tableau, sous-types Dentist/Restaurant…, address imbriquée ou string).
  • Cohérence NAP téléphone (0,30) : même numéro partout + numéro affiché == numéro de la fiche. Aucun téléphone = malus (pas neutralisé). Multi-numéros légitimes (standard/mobile/fax) non pénalisés ; mono-page sans crédit gratuit.
  • Marqueurs locaux visibles (0,30) : code postal + horaires dans le contenu (couche visible, distincte du structuré → pas de double-comptage).

Bonus actionnable : un générateur de bloc JSON-LD prêt-à-coller (« voici le code à mettre »), avec À COMPLÉTER sur les champs manquants — jamais de valeur inventée.

Nom honnête : la note s'appelle « Cohérence locale (on-site) » avec un disclaimer « hors Google Business & avis » (la fiche Google + les avis = incrément 2, en attente de tes réponses sur l'accès aux données).

Sur Maison Brielle (fixture 1-page) : local 30/100 (fiche absente + téléphone introuvable → 2 signaux rouges honnêtes), ce qui fait passer l'overall de 68 à 62 — la note descend parce qu'elle dit enfin la vérité locale.

Conception relue par un conseil LLM (rééquilibrage, malus tél-absent, anti-double-compte) puis construite en 6 tâches TDD avec revue adversariale par tâche : 233 tests, 2 bugs importants attrapés + corrigés avant merge.

↑ haut de page
26 juin 2026 à 14:23 UTC

Le rapport raconte un plan, pas juste une liste

Plan d'action narratif (Agent 5) — récit A/B/C déterministe

Avant, notre rapport donnait une liste de choses à corriger. Utile, mais un peu sec. Le prestataire qu'on remplace, lui, écrivait un petit plan qui se raconte — et ça rassure un patron de commerce.

Maintenant, notre rapport raconte aussi un plan, en 3 étapes :

  1. D'abord, réparer ce qui freine le site.
  2. Ensuite, aller chercher de nouveaux clients — pas seulement les gens qui tapent déjà votre nom, mais ceux qui cherchent vos produits sans vous connaître.
  3. Enfin, sécuriser et suivre les résultats dans le temps.

La différence avec le prestataire : chaque phrase s'appuie sur un vrai chiffre mesuré sur le site. On ne « fait pas joli » avec des promesses en l'air — si c'est écrit, c'est que la donnée le dit.

Exemple sur un client (une charcuterie) : le rapport explique que presque tous ses visiteurs tapent déjà son nom (donc le site ne lui ramène pas de nouveaux clients), et pointe la seule vraie opportunité (« saucisson aux noisettes », tout près de la 1ʳᵉ page Google) à pousser en priorité.

C'est écrit, vérifié, et ça se lit comme un plan — pas comme une liste.

Le seul angle où le prestataire nous battait — le « plan d'action narratif » — est comblé.

Jusqu'ici, le rapport listait les recommandations à plat (🔴🟠🚀). Le prestataire, lui, écrivait un récit « Axe A / B / C » qui se lit bien côté client. On a tranché le comment avec un conseil LLM (5 avis + relectures) : génération déterministe, pas de LLM en bout de chaîne — parce que notre force, c'est que chaque phrase est sourcée sur une donnée mesurée, et qu'un LLM qui « reformule » risque de réintroduire le flou invérifiable qu'on reproche au prestataire.

Ce qui est livré :

  • Un module pur buildActionPlan(report) qui réorganise les constats déjà calculés en 3 axes-trajectoire : A — Stopper l'hémorragie (dimension la plus faible + correctifs imposés), B — Conquête commerciale (quick-wins dé-bruités de la marque + % de trafic de marque), C — Sécuriser & mesurer (doorway/spécificité locale + tendance). Un axe sans donnée porteuse est omis (pas de remplissage creux).
  • Deux rendus : HTML (récit en tête + preuve repliable <details> par axe, déplié à l'impression PDF) et Markdown. L'ancienne liste à plat est remplacée.
  • Un garde-fou (test) : tout chiffre d'un paragraphe doit tracer vers un champ du rapport — impossible d'halluciner un nombre.

Exemple réel (Maison Brielle) : « Votre trafic est à 100 % de votre nom de marque… la croissance vient de 1 requête commerciale (saucisson aux noisettes, position 17) à pousser en page 1. » Le récit du prestataire, mais honnête et vérifiable.

Qualité : 8 tâches en TDD (sous-agent + revue adversariale par tâche, en worktree isolé), 214 tests verts, typecheck 0, revue finale = 0 bug bloquant. Fixtures réelles uniquement (Brielle + Degalet pour le cas doorway).

↑ haut de page
25 juin 2026 à 07:21 UTC

Bilan session 2026-06-25 + feuille de route

Bilan session 2026-06-25 + feuille de route

On a construit l'outil qui note les sites des clients et dit honnêtement comment les améliorer. On l'a prouvé sur un vrai site — un ostéopathe — en allant chercher les vrais chiffres Google : ça marche. Slim a dit oui pour continuer.

Ce qu'il reste à faire, dans l'ordre :

  • Rendre les conseils encore plus concrets — au lieu de « pousser ce mot-clé », dire quoi faire précisément sur chaque page (~1 jour).
  • Suivre l'évolution sur 6 mois pour voir si ça progresse (~0,5 jour).
  • Lancer l'analyse sur les 43 sites clients (~1 jour).
  • Ajouter le volet « présence locale » : fiche Google, avis, cohérence de l'adresse (~1–2 jours).

Avec ça, on a une première version solide et vendable en 1 à 2 semaines. La suite — surveiller les sites dans la durée, corriger automatiquement, tableau de bord général — c'est quelques semaines de plus. On avance couche par couche, sans brûler les étapes.

✅ Fait cette session

  • Agent 5 complet : audit on-page honnête + note composite 3 dimensions (technique / positions / performance) + reporting client + couche features spécificité locale. 115 tests verts, typecheck 0.
  • Template rapport HTML/PDF réutilisable (graphes SVG : donut marque, barres de note).
  • Go/no-go Brielle assemblé (rapport + duel vs partenaire) → GO de Slim obtenu.
  • Pipeline LIVE prouvé : report-cli --live (real crawl accueil + real GSC 6 mois), tourné en vrai sur Ostéopathe Sicot (1er essai, 557 clics / 9 365 impressions / pos 5,7). Rapport publié : https://oboxia.taraji-conseil.fr/r/eb14fcd2b14b0317/
  • Décision : rapports = HTML-first + script publish-report.sh (publication en 1 commande).
  • Journal de dev en double lecture David/Slim publié.
  • Mécaniques : kanban.md, hook conventions (Kanban + scan skill + WhatsApp attendu réel), canal WhatsApp réactivé.
  • Specs écrites : tranche 1 live + amélioration reco n°1 (recos actionnables).

🔄 En cours

Industrialisation : tranche 1 live faite ; suite = tendance 6 mois + batch 43.

📋 Feuille de route + estimations

TâcheEffort devPrérequis
Recos « actionnables » n°1 (checklist concrète par page)~0,5–1 jchamps h2, page GSC
Tranche 2 : courbe tendance 6 mois~0,5 j
Batch des 43 sites (config GSC = URL-prefix)~0,5–1 jpeu bloqué
Dimension LOCAL (Google Business / avis / NAP)~1–2 j (partiel)GBP via API
Off-page / annuaires + autorité (backlinks)~3–5 jdonnées externes (Ahrefs/DataForSEO)
Concurrence (données SERP)différédépend données externes
B-2 : juge sémantique LLM (gpt-4o-mini tri + Claude juge)~1–2 jclé Anthropic runtime + gold set Slim
Agent 8 (suivi / alertes)~2–3 j
Agent Correcteur (écrit dans WordPress, D4)~3–5 jen DERNIER, garde-fous + risque juridique
Salle de commandement (D5, orchestration 10 agents)~1–2 sem.sous-projet, candidat VoltAgent
Cartographie interactive (style BNP)~0,5 j

Cadrage global : cœur de valeur (recos n°1 + tendance + batch + dimension locale) ≈ 1–2 semaines → produit vendable solide. Puis off-page + B-2 + Agent 8 ≈ 2–4 semaines de plus. Correcteur + salle de commandement = sous-projets ultérieurs. Facteur limitant = priorisation Slim + données externes (off-page/SERP), pas le code.

🗺️ Carte de la flotte OBOXIA

graph TD
  classDef done fill:#2d7a2d,color:#fff,stroke:#1a5c1a
  classDef wip fill:#c07a00,color:#fff,stroke:#8a5800
  classDef todo fill:#555,color:#ccc,stroke:#333
  classDef external fill:#2255aa,color:#fff,stroke:#14378a
  classDef future fill:#444,color:#aaa,stroke:#333,stroke-dasharray:5 5

  subgraph Sources["Sources de données"]
    GSC["Google Search Console"]:::done
    GA4["Google Analytics 4"]:::done
    CRAWL["Crawl on-page"]:::done
  end

  subgraph Colonne["Colonne de données (fondation)"]
    SOCLE["Socle commun / adaptateurs"]:::wip
  end

  GSC --> SOCLE
  GA4 --> SOCLE
  CRAWL --> SOCLE

  SOCLE --> A5

  subgraph Flotte["Flotte — 10 agents"]
    A1["Agent 1 — Analyse du brief"]:::todo
    A236["Agents 2·3·6 — Générateur multi-ville"]:::external
    A4["Agent 4 — Figma-to-code (Slim)"]:::external
    A5["Agent 5 — Audit SEO + note composite + recos ⭐"]:::wip
    A7["Agent 7 — GEO"]:::todo
    A8["Agent 8 — Suivi / alertes"]:::future
    A9["Agent 9 — Bilan client"]:::todo
    A10["Agent 10 — Contrôle pré-vol"]:::todo
    CORR["Agent Correcteur (écrit dans WP, D4)"]:::future
  end

  A5 --> RAPPORT["Rapport HTML publié\n(ex. Ostéopathe Sicot)"]:::done
  A5 -.->|future| CORR
  A5 -.->|future| A8

  subgraph CMD["Salle de commandement (D5) — orchestration des 10 agents"]
    SALLE["Interface + orchestrateur (VoltAgent candidat)"]:::future
  end

  SALLE -.-> A1
  SALLE -.-> A5
  SALLE -.-> A8
  SALLE -.-> A9
  SALLE -.-> A10
  SALLE -.-> CORR

Légende : ■ fait · ■ en cours · ■ à venir · ■ externe (existe) · ■ futur / pointillé

↑ haut de page
24 juin 2026 à 22:14 UTC

Comment juger la qualité des pages : du simple d'abord, l'intelligence ensuite

Council — LLM jugement : features déterministes d'abord, Claude juge sur le résiduel

On a réuni un panel de conseillers pour décider comment juger si une page est vraiment locale ou juste recopiée. La réponse : d'abord des vérifications simples et automatiques, qui règlent la grande majorité des cas sans rien coûter, et qui font déjà mieux que notre ancienne méthode.

Pour les cas vraiment douteux qui restent, on fera appel à un assistant intelligent et fiable comme juge final, pour quelques centimes par site.

Bonne nouvelle : la partie simple peut être construite tout de suite, sans attendre Slim ni de nouvel accès payant. On démarre donc dès maintenant.

Council — quel LLM pour le moteur de jugement (B-2)

Date : 2026-06-24. Conseil (5 advisors + 3 relectures) sur le choix LLM pour le jugement sémantique « local réel vs spinning ».

Verdict

  • Écarter Ollama (contenu public → zéro bénéfice privé ; 8 Go sans GPU → trop faible) et Gemini (clé pour rien).
  • Architecture, pas un modèle : (1) features déterministes d'abord (NAP, densité géo inter-pages, boilerplate) — ~80 % des verdicts, coût nul, bat déjà le Jaccard ; (2) gpt-4o-mini (clé Slim) = tri + plomberie ; (3) Claude Sonnet = JUGE sur le résiduel (nouvelle clé Anthropic, centimes).
  • gpt-4o-mini JAMAIS juge final : il est lui-même un moteur de spinning → validerait Degalet.
  • Abonnement ≠ clé API : Claude Max ne s'appelle pas en runtime ; le juge = clé Anthropic facturée.

Angles morts attrapés

  • Le RUBRIC manque : définir « réellement local » (faits requis) AVANT d'étiqueter — sinon le gold set est inétiquetable.
  • Gold set : 20-50 pages-villes étiquetées par Slim + accord inter-annotateur.
  • Contrat adaptateur : entrée features+pages-sœurs ; sortie verdict+score+citation ; mode dégradé ; drift des spinners (juge réévalué).
  • Volume jamais chiffré (43 sites × N villes).

Ce que ça débloque

La couche features est déterministe → codable MAINTENANT, sans la clé OpenAI ni Slim, et améliore déjà sur le Jaccard (cas Degalet). → slice 1 de B-2 lancé. Rubric+gold set (Slim) et juge Claude (nouvelle clé) viennent après.

↑ haut de page
24 juin 2026 à 21:58 UTC

Un rapport client complet et honnête, qui dit la vérité sans flatter

Agent 5 complet + honnête — perf, composite, reporting (avant/après marque)

On a créé un rapport qui note un site client et dit, sans flatter, ce qui ne va vraiment pas. Sur le site de charcuterie testé, on a vu que presque tous les visiteurs connaissaient déjà la marque — donc le site n'attire pas de nouveaux clients. C'est exactement ce que l'ancien prestataire cachait.

Avant, l'outil donnait une note flatteuse de 88 et une liste de sept « gains » dont six étaient des gens qui tapaient déjà le nom de l'entreprise. Maintenant il donne une note honnête de 67 et pointe le seul vrai levier de croissance.

Là où l'ancien prestataire écrivait « résultats encourageants », notre outil dit la vérité utile. C'est précisément ça, faire mieux que lui.

Agent 5 complet + HONNÊTE — chaîne perf → composite → reporting

Date : 2026-06-24 (nuit). L'Agent 5 produit désormais un rapport client de bout en bout, sur données réelles, et honnête (c'est le différenciateur vs le partenaire). 5 commits, 97 tests verts, typecheck 0.

Construit ce soir

  • Dimension perf GSC : adaptateur gsc (fake/real via service account), analyzePerformance (totals, quick-wins, brandShare, top requêtes).
  • Note composite : computeComposite — technique + positions + performance, pondérée et re-normalisée, transparente.
  • Reporting client : renderReportMarkdown — 6 sections (synthèse, perf, le vrai constat, opportunités, technique, recos prioritaires).
  • Refinements honnêteté (marque) : pénalité part-de-marché sur le perf-score + filtre du bruit-marque sur les quick-wins.

Avant / après (Maison Brielle) — l'agent devient juste

Mesure Avant Après
Note globale 88 (flatteur) 67
Performance 98 40
Quick-wins 7 (6 fautes de marque + 1 noyé) saucisson aux noisettes seul
Constat « trafic 100 % marque, faible conquête commerciale »

→ Là où le partenaire écrivait « résultats encourageants », l'agent dit 67 + le seul vrai levier. C'est ça, battre le partenaire.

Reste

B-incrément-2 (vérif sémantique/locale, LLM — Context7 posé) = le gros différenciateur ; Agent 8 (suivi) ; Correcteur (D4, WP REST direct) ; salle de commandement (D5/VoltAgent).

Repo : 5 commits (baseline→perf→composite→reporting→honnêteté). Reprise : handoff.md.

↑ haut de page
24 juin 2026 à 21:26 UTC

On choisit les bons outils pour aller plus vite et plus sûr

Balayage MCP dev — Context7/GitHub/Postgres en assistant, runtime en lib directe

On a fait le tri parmi les outils qui peuvent nous faire gagner du temps pendant la construction. On en adopte quelques-uns tout de suite, et on en garde d'autres en réserve pour plus tard, quand on en aura besoin.

Le principe est simple : ces outils nous aident à coder plus vite et sans erreurs, mais ils ne touchent jamais directement aux sites des clients.

Point d'attention important : le jour où l'outil interviendra sur les sites des clients, on utilisera des accès dédiés et limités, pour ne jamais mettre en danger les données de qui que ce soit.

Balayage MCP utiles au dev OBOXIA — décision

Date : 2026-06-24. Sweep des serveurs MCP utiles au dev (hors connecteurs déjà possédés). Principe unificateur qui ressort (cohérent avec la décision Lighthouse) : le MCP sert la couche assistant/dev + orchestration ; le runtime des agents reste en lib/CLI directe.

Tableau

MCP / outil Usage OBOXIA Verdict
Context7 (upstash) docs de libs à jour pendant le code (lighthouse, Zod, WP REST, GA4) — zéro hallucination d'API Adopter maintenant
GitHub MCP (officiel) workflow dev (PR, issues, CI) — PAT limité au repo Adopter après init git + repo
Postgres MCP (crystaldba, read-only) inspecter/optimiser la future DB colonne de données Adopter quand DB
Playwright MCP (Microsoft) E2E/visuel du dashboard ; reproduire un parcours client Adopter (dashboard)
Crawl4AI (runtime, pas MCP) crawl avec rendu JS pour la colonne de données / crawler Agent 5 — self-host, gratuit Runtime direct
lib lighthouse (runtime) CWV/perf (diagnostic) Runtime direct (déjà tranché)
WP REST + Application Passwords (runtime) Agent Correcteur écrit dans WP client — credential Editor par client, dry-run, idempotence maison Runtime direct (pas le MCP)
git CLI (runtime) versioning oboxia Runtime direct
Firecrawl MCP crawl SaaS Différé (coût/cloud)
shadcn MCP composants dashboard Différé (au démarrage dashboard)
WordPress/mcp-adapter écriture WP via MCP Différé (préférer REST direct)
Sentry MCP observabilité prod Différé
Figma MCP design-to-code Écarté (pas de maquette)

Les 3 à mettre en place en premier (réalisé pour NOTRE état actuel)

  1. Context7 — utile immédiatement (on code les briques 1-2), zéro surface de sécu.
  2. GitHub MCP — dès qu'oboxia a un repo git + un remote.
  3. Postgres MCP (read-only) — quand la colonne de données aura une vraie base.

Sécurité

WordPress (écrit sur sites clients) + Playwright/crawl sur sites clients = surfaces sensibles → credentials dédiés par client, droits minimaux, self-host pour ne rien exfiltrer, jamais de delete activé côté Correcteur.

Sources : github.com/upstash/context7 · github/github-mcp-server · crystaldba/postgres-mcp · microsoft/playwright-mcp · unclecode/crawl4ai · docdyhr/mcp-wordpress · WordPress/mcp-adapter.

↑ haut de page
24 juin 2026 à 21:17 UTC

Acheter les outils ordinaires, construire nous-mêmes ce qui fait la différence

Décision — outils SEO MCP : intégrer Lighthouse, construire le différenciateur

On a passé en revue des outils SEO déjà existants pour décider lesquels réutiliser plutôt que de tout refaire. Règle qu'on s'est fixée : pour tout ce qui est standard (comme mesurer la vitesse d'un site), on réutilise les outils du marché.

Mais pour ce qui fait notre vraie valeur — juger la qualité réelle des pages et donner des conseils sur mesure — on construit nous-mêmes, parce qu'aucun outil tout fait ne sait le faire correctement.

C'est cohérent avec notre objectif : on ne se distingue pas en mesurant plus vite, on se distingue par la qualité du jugement.

Décision — outils SEO MCP : intégrer vs construire

Date : 2026-06-24. Évaluation des serveurs MCP SEO de mcpmarket (sources réelles : repos GitHub) pour ancrer le « build vs intégrer » sur la dimension technique de l'Agent 5.

Verdict

Lighthouse MCP (danielsogl) Crawler 28-règles (houtini-ai) Rulepack OBOXIA
Couvre Perf / CWV / a11y (1 page) Technique on-page cosmétique Sémantique local + doorway + note composite + recos
Maintenance ✅ vivant (v1.5, MIT) ⚠️ jeune, 16★, mono-auteur, Apache-2.0
Rendu JS ✅ oui (Chrome headless) ❌ non (rédhibitoire WP/SPA)
Local / clé API ✅ 100% local ✅ 100% local
Touche le différenciateur ? Non Non Oui

Décisions

  1. Lighthouse → intégrer via la lib lighthouse npm en direct (adaptateur agent-5/adapters/lighthouse.ts), PAS le wrapper MCP. CWV = commodité, mais c'est du diagnostic lab, pas un verdict de ranking (verdict = champ/CrUX).
  2. Crawler 28-règlesNON intégré (cosmétique, fragile, pas de rendu JS). Recopier sa liste de règles (Apache-2.0) dans le rulepack comme checklist (canonical, orphelines, redirect chains, headers sécu), codées par nous.
  3. Différenciateur (sémantique/local, note composite, recos actionnables) → 100% en propre, aucun MCP ne le couvre.
  4. Forme : libs npm directes dans des adaptateurs (agents CLI déterministes) ; MCP réservé à la salle de commandement / VoltAgent.
  5. Ahrefs / DataForSEO (payants) → différés (gaps netlinking/SERP, hors priorité build-1).

Principe ancré

Commodité technique = intégrer/recopier l'existant. Différenciateur (jugement) = construire. Cohérent avec le cap « co-pilote de jugement » et le constat Degalet (le Jaccard/comptage ne bat pas le partenaire ; le jugement sémantique/local, oui).

Sources : github.com/danielsogl/lighthouse-mcp-server · github.com/houtini-ai/seo-crawler-mcp

↑ haut de page
24 juin 2026 à 18:35 UTC

Bilan de la soirée et plan pour les jours à venir

Clôture session 2026-06-24 + planning des jours à venir

Grosse soirée de travail bouclée : les fondations de l'outil sont en place, l'outil note un site honnêtement, on a confirmé l'accès aux statistiques de visites Google, et on a vérifié que nos conseils s'appuient bien sur des sources sérieuses.

Découverte importante de la soirée : nos pages « par ville » se ressemblent trop entre elles, et notre méthode ne le détecte pas encore. C'est précisément là qu'on doit s'améliorer pour dépasser l'ancien prestataire.

Pour la suite, on attend trois choses : un accès à un assistant intelligent plus puissant, quelques anciens conseils de l'ancien prestataire pour pouvoir se comparer, et le feu vert de Slim. Ensuite on enchaîne sur la note finale et la comparaison décisive.

Clôture session 2026-06-24 + planning

Ce qui a été accompli ce soir

  • Socle @oboxia/core construit (cli-runner, contrats Zod, validate, journal, reject-queue).
  • Agent 5 audit SEO : on-page honnête + enrichi (thin-content, schema LocalBusiness via JSON-LD réel, NAP téléphone), recos site-spécifiques (hard-code éliminé + test garde-fou), doorway/unicité. 49 tests verts, typecheck 0 erreur.
  • Probe GSC réussi (accès Search Console via service account Myobox prouvé) — clé dans .secrets/.
  • Conformité SEO vérifiée contre les livres du Drive : rien d'inventé ; cosmétique vs vraie valeur identifiés.
  • Insight clé : le détecteur doorway par Jaccard est insuffisant (pages Obox Degalet = spinning sans spécificité locale, passent à 0.751). → le vrai différenciateur = vérif sémantique/locale (B-incrément-2).
  • Mécanisations : journal HTML, kanban synchro, journal de décisions, hook conventions (mini-CR + timebox + réel-vs-estimé), bash auto-approuvé, infra WhatsApp (CallMeBot, dormante), RTK confirmé (75 % d'économie).

Calibration de mes estimations (réel vs estimé)

  • Audit multi-ville Degalet : estimé 12 min → réel 2,2 min (×5 trop haut).
  • Hygiène extract/typecheck : estimé 8 min → réel 3 min (×2,7 trop haut).
  • Leçon : je sur-estime le temps-horloge des sous-agents ; je corrige à la baisse.

Planning des jours à venir (résumé)

Préalables : décision accès LLM (→ B-2), init git oboxia, Slim (5-10 recos partenaire pour le banc d'essai), clé CallMeBot.

  • Jalon A (non bloqué) : init git + dimension perf GSC empilée sur l'agent.
  • Jalon B [dépend LLM] : vérif sémantique/locale — le différenciateur qui attrape le cas Degalet.
  • Jalon C [dépend Slim] : note composite + banc d'essai jugement = GO/NO-GO.
  • Après GO : reporting (remplace le partenaire), Agent 8 (suivi), Correcteur (D4, dernier), salle de commandement (D5).

Détail complet : oboxia/planning.md. Reprise technique : oboxia/handoff.md.

↑ haut de page
24 juin 2026 à 18:25 UTC

Un test grandeur nature révèle où l'on doit progresser

CR — Test probant Degalet : le Jaccard ne suffit pas (doorway)

On a testé l'outil sur de vraies pages « par ville » d'un site de couvreur (une page pour Vannes, une pour Auray, etc.). L'outil les a jugées bonnes alors qu'en réalité ce sont presque les mêmes pages, juste avec le nom de la ville changé et quelques phrases reformulées. Aucune information vraiment locale dedans.

C'est important : un humain ou Google verrait tout de suite que ces pages se ressemblent trop, et Google peut sanctionner pour ça. Notre méthode actuelle ne l'attrape pas encore.

Conclusion : pour vraiment faire mieux que l'ancien prestataire, il faut une vérification plus fine du sens des pages, pas juste une comparaison de mots. Ce test sur un cas réel nous le prouve noir sur blanc.

CR — Test probant Agent 5 sur multi-ville réel (Degalet/Obox)

Date : 2026-06-24 (soir). Estimé ~12 min · réel ~2,2 min (sur-estimation ~5×).

Résultat brut

4 pages-villes de charpentier-couvreur-morbihan.fr (racine/Vannes, arradon, arzon, auray), HTTP 200. Agent 5 → score 100, 0 issue. uniqueness : multiCity:true, maxSimilarity 0.751, doorwayRisk:"none" (seuils 0.8/0.9). Toutes les règles-à-valeur (thin/schema/NAP) restent muettes → contenu mécaniquement sain.

Le vrai constat (le plus important)

La différenciation Obox = synonym spinning, pas du contenu local réel :

  • Title/H1/méta 100 % templatés (seuls ville + CP varient).
  • Corps = blocs identiques (devis, services) + paragraphes reformulés (même sens, phrases différentes).
  • Zéro spécificité locale (pas de quartier/chantier/particularité de commune).
  • Le Jaccard 0.751 passe car la reformulation baisse la similarité lexicale — mais c'est exactement le profil doorway qu'un humain/Google flaggerait en jugement qualitatif.

Conséquence projet

Le détecteur doorway par Jaccard est insuffisant (la conformité l'avait pressenti). Le levier pour battre le partenaire = vérif de spécificité locale / sémantique (= B-incrément-2, cohérence sémantique, différé). Ce test le prouve sur cas réel.

Bug trouvé

extract.ts : decodeEntities ne décode pas les entités d'accents FR (&eacute;…) → tokenisation parasitée. Pré-existant, sans impact sur ce verdict (gonfle légèrement la similarité → verdict "none" conservateur-safe). À corriger pour une mesure fine.

Fichiers

fixtures/agent-5/pages-degalet-multiville.json, scripts/capture-degalet.mjs, .work/seo_report_degalet.json.

↑ haut de page
24 juin 2026 à 17:30 UTC

Premier rapport qui note un site — et le bug qu'on a attrapé à temps

CR — Build socle + Agent 5 + audit multi-sites

Les fondations de l'outil sont posées et solides. L'outil sait maintenant examiner un vrai site et lui donner une note : sur le site test Maison Brielle, il a sorti une première note et une liste de points à améliorer, sans jamais rien modifier sur le site lui-même.

On a aussi confirmé un point clé : on accède bien aux statistiques de visites Google de nos clients. Ce risque-là est levé.

En revanche, on a repéré un défaut sérieux : les conseils étaient figés et se recopiaient d'un site à l'autre. Tant que ce n'est pas corrigé, on ne peut pas dire que cette étape est vraiment réussie. C'est noté pour la suite.

CR — Build socle + Agent 5 + audit multi-sites

Compte-rendu factuel de la session de build : socle commun, Jalon 1 de l'Agent 5, audit multi-sites, et un bug détecté qui invalide le Jalon 1.

Socle commun — ✅ 8/8 tests

Le socle (core) est en place et vert : 8 tests sur 8 passent (cli-runner, contrats Zod, validate, journal, reject-queue). Fondation stable pour brancher les agents.

Agent 5 — Jalon 1 (annoncé)

  • Produit un seo_report.json sur un site réel.
  • Site de référence : Maison Briellescore 87.
  • Le rapport sort des correctifs proposés (lecture seule, l'agent n'écrit jamais).

Audit multi-sites — 5 sites

Site Score Détections
(5 sites audités) 87–94 OK
  • Fourchette de scores : 87 à 94.
  • Les détections fonctionnent sur l'ensemble des 5 sites.

🐛 Bug bloquant — hard-code des recommandations

Détecté : les recommandations sont hard-codées. Les citations propres à Maison Brielle fuient sur les autres sites — autrement dit, les correctifs « concrets » affichés sur les autres sites reprennent des éléments de Maison Brielle au lieu d'être tirés des vraies valeurs de chaque page.

➡️ Conséquence : le Jalon 1 n'est PAS réellement atteint. L'actionnabilité site-spécifique (le différenciateur make-or-break, faiblesse #1 du partenaire) n'est pas prouvée tant que les recos ne sont pas dérivées des signaux mesurés de chaque page. Le score sort, mais la reco ne tient pas.

Probe GSC — ✅ réussi

Le probe GSC (script-sonde de dérisquage) a réussi : l'accès aux données Google Search Console est validé sur le réel — un JSON GSC s'affiche. Le risque d'accès données (scopes / quotas / mapping de propriété) est levé.

Verdict

  • Socle : solide (8/8).
  • Accès données : dérisqué (probe GSC OK).
  • Agent 5 : Jalon 1 à reprendre — corriger le hard-code des recos (les dériver des vraies valeurs de page) + ajouter un test garde-fou, avant de pouvoir déclarer le Jalon 1 réellement atteint.
↑ haut de page
24 juin 2026 à 17:27 UTC

Nos conseils sont maintenant taillés sur mesure pour chaque site

CR — Agent 5 B-incrément-1 (réalignement + valeur SEO)

On a corrigé un gros défaut : avant, l'outil recopiait parfois des conseils d'un site sur un autre. Maintenant chaque conseil est tiré du contenu réel de la page qu'on examine, et on a posé une sécurité pour vérifier que ça ne se reproduira plus.

On a aussi ajouté les vérifications qui comptent vraiment : que la page ait assez de contenu, que les coordonnées de l'entreprise soient bien présentes, et que la fiche locale soit complète.

On l'a testé sur 5 sites clients réels : ils étaient tous plutôt bien faits, donc peu d'alertes. Pour vraiment prouver l'utilité de l'outil, l'étape suivante est de le lancer sur des sites de moins bonne qualité.

CR — Agent 5 B-incrément-1 (réalignement + valeur SEO)

Date réelle : 2026-06-24 (soir). Résultat : 45 tests verts (était 25/12), 100% vert.

Ce qui a été fait

  1. Fix hard-code des recommandations : les recos sont désormais construites depuis les vraies valeurs de page (page.title, page.h1, longueurs réelles). Test garde-fou no-hardcode.test.ts sur 2 fixtures (Brielle + Sangaré). Anti-fuite vérifié par grep : 0 occurrence des chaînes Maison Brielle sur les 4 autres sites.
  2. Réalignement des sévérités sur la spec : H1 ≠ 1 → convention (Google tolère plusieurs H1) ; longueur title/méta : pénalité « trop court » retirée (seulement > 60 / > 160).
  3. Contrôles à vraie valeur ajoutés (sourcés rulepack) : thin-content (< 300 mots), schema-localbusiness-missing (D.1 🔴, via extraction JSON-LD), nap-phone-missing (D.2 🔴). jsonLdTypes ajouté au contrat PageData (rétro-compatible).
  4. 5 fixtures réelles re-capturées avec jsonLdTypes réels.

Tableau multi-sites (données réelles)

Site Score jsonLdTypes réels
maison-brielle (ecommerce) 91 WebSite, Organization
sangare-avocat (avocat) 94 WebSite, Organization, LocalBusiness, PostalAddress, OpeningHours
je-deboss (carrossier) 91 WebSite, Person, LocalBusiness, PostalAddress, OpeningHours
osteopathe-sicot 94 WebSite, Organization, ContactPoint, LocalBusiness, PostalAddress
maree-havraise (restaurant) 97 Organization, WebSite, WebPage, Article

Nuance honnête (valeur probante)

Les 5 sites sont tous bien construits → les règles thin/schema/nap ne se déclenchent pas (vrais négatifs). Validées par tests unitaires sur entrées contrôlées. Pour prouver leur valeur sur le terrain, les lancer sur des sites faibles / pages multi-ville Obox.

Gap

pnpm typecheck échoue (@types/node absent) — pré-existant, à nettoyer.

Fichiers

Modifiés : packages/core/src/contracts/page-data.ts, packages/agent-5-audit-seo/src/rulepack.ts, adapters/crawler.ts, tests. Créés : adapters/extract.ts, test/{no-hardcode,extract}.test.ts, scripts/capture-fixtures.mjs. Aucun commit git.

↑ haut de page
24 juin 2026 à 14:00 UTC

On garde la trace écrite de toutes nos décisions

Snapshot — journal de décisions

On a mis en place un carnet des décisions : chaque choix important est noté avec sa date et son statut (validé, en attente, ou reporté). Comme ça, on ne revient pas en boucle sur des sujets déjà tranchés.

La décision la plus structurante reste la même : l'ancien prestataire est un niveau à dépasser, pas un modèle à copier. Tout le reste découle de là.

Avantage concret : si une nouvelle demande contredit une décision déjà verrouillée, on s'arrête et on le signale, au lieu de partir dans le mur sans s'en rendre compte.

OBOXIA — Journal de décisions

Contrôle de cohérence (niveau b choisi le 2026-06-24). Chaque décision : date · libellé · statut. Statuts : validé (par Naouphel) · auto (appliqué par Claude, bookkeeping/faible risque) · proposé (en attente) · différé. Règle associée : si une demande contredit une décision verrouillée du CLAUDE.md, Claude s'arrête et le signale au lieu d'appliquer.

Date Décision Statut
2026-06-24 Runtime agents = CLI Node/TS, contrats JSON ; stack build Vitest+Zod+tsx+pnpm validé
2026-06-24 Cap = co-pilote de jugement (recadré council), « temps réel » déclassé validé (council endossé)
2026-06-24 Décomposition en agents distincts : données → Agent 5 (lecture) → reporting → Agent 8 → Correcteur (dernier) validé
2026-06-24 Frontière Agent 5 recommande ≠ Correcteur applique (contrat JSON entre les deux) validé
2026-06-24 Note Agent 5 = C (composite : perf + positions + technique) validé
2026-06-24 Le partenaire est insatisfaisant → plancher à battre, PAS cible à reproduire validé (correction Naouphel)
2026-06-24 Banc d'essai jugement = l'agent doit battre le partenaire (go/no-go avant gros code) validé
2026-06-24 Séquençage 1er build = audit technique d'abord (non bloqué) + GSC en parallèle validé
2026-06-24 Agent 1 (brief) déprioritisé (hors chemin de valeur SEO) validé
2026-06-24 2 strates : agents headless JSON ↔ salle de commandement (interface/orchestration = D5) validé
2026-06-24 Frameworks : agents hand-rolled neutres maintenant ; VoltAgent candidat D5 (différé) ; n8n écarté validé
2026-06-24 Contrôle de cohérence = niveau b (ce journal + règle de conflit) validé
2026-06-24 Clé service account récupérée du Drive → oboxia/.secrets/ (gitignored) ; probe GSC OK auto
2026-06-24 pnpm installé dans ~/.local (sans root) auto
2026-06-24 pnpm-workspace.yaml : allowBuilds: esbuild: true (politique supply-chain pnpm 11) proposé (à valider, revue owasp-security)
2026-06-24 Stratégie git (oboxia sous-dossier non commité du repo home) différé
2026-06-24 Coffre de secrets (clé SA + mdp WP + clés OVH en clair dans Drive) différé (dette)
D1 pages villes (différenciation, déjà pratiquée via Obox-Multiville) validé
D4 (écriture WordPress, REST vs WP-CLI) → bloque le Correcteur différé
↑ haut de page
24 juin 2026 à 11:30 UTC

On vérifie que nos conseils sont vraiment fondés, pas du pinaillage

Conformité SEO de l'Agent 5 vs livres

On a relu nos règles de référence SEO en les comparant aux livres SEO sérieux. Le constat : une partie de ce qu'on vérifiait était du détail cosmétique sans vrai impact, et on présentait certains petits réglages comme des fautes alors que Google s'en moque.

Surtout, on s'était trompé de priorité : la vraie valeur, c'est le référencement local (que les coordonnées de l'entreprise soient claires et cohérentes partout) et le fait que les pages ne se ressemblent pas trop, sinon Google sanctionne. C'est exactement ce qu'on ne vérifiait pas encore.

Conclusion : rien de faux ou de dangereux dans l'outil, mais il fallait le recentrer sur ce qui compte vraiment pour un client, et arrêter le pinaillage qui n'apporte rien.

OBOXIA — Conformité SEO de l'Agent 5 vs livres de référence (2026-06-24)

Vérification source-of-truth (demande Naouphel) : les règles de l'Agent 5 sont-elles conformes aux livres SEO du Drive, ou hors-piste ? Croisement 3 niveaux : livres Drive (« OBOXIA - SEO », id 12U8jf7peum0FHRZZzrgIFIP-K5RRQ2DA) ↔ base de référence (docs/superpowers/specs/oboxia-seo-rulepack.md) ↔ code réel (oboxia/packages/agent-5-audit-seo/src/{rulepack,uniqueness,score}.ts).

Ce que disent (et ne disent pas) les livres

  • 50-Step Technical SEO Checklist : robots/sitemap/HTTPS, canonical, contenu dupliqué (step 11), thin content (step 12), JSON-LD, liens internes, click depth. N'évoque NI longueur title, NI longueur méta, NI nombre de H1, NI SEO local géo.
  • SEO Best Practices 2026 : search intent > keywords (pilier #1), EEAT, NAP consistency (entity SEO), schema, « éviter les patterns de contenu templaté » (soutient l'anti-doorway). Aucune borne chiffrée title/méta/H1.
  • State of SEO 2026 : enquête d'industrie (AI Overviews…), aucune mécanique on-page.

➡️ Aucun livre ne fixe de seuil chiffré title (50-60), méta (150-160) ou H1. Ce sont des conventions d'outils, pas des règles Google.

Tableau de conformité

Règle (code) Livres Google (fiable) Classif. correcte Verdict
Title manquant → recommande implicite bonne pratique, non bloquante (Google génère un titre) 🟠 DANS LES CLOUS
Longueur title hors 50-60 → convention absent pas une règle Google (affichage SERP) DANS LES CLOUS — ⚠️ retirer la pénalité « trop court »
H1 ≠ 1 → recommande (−7) absent Mueller : plusieurs H1 = OK ⚪ (code dit 🟠) À NUANCER — sur-classé, doit être ⚪/−3
Méta manquante → recommande absent non-facteur de ranking, influence CTR 🟠 DANS LES CLOUS
Longueur méta hors 150-160 → convention absent pas une règle Google (affichage) DANS LES CLOUS — ⚠️ idem trop-court
Doorway / unicité (Jaccard 0.8/0.9) soutenu (step 11/12, « templated content ») politique anti-spam réelle 🔴, mais aucun seuil chiffré 🔴 politique + ⚪ mesure À NUANCER — sous-implémenté (1 seul signal vs multi-signaux du rulepack.md)
Barème −15/−7/−3 aucun aucun (choix maison) À NUANCER — légitime mais non sourcé, ne pas présenter comme tel

Propositions d'enrichissement — vérdict des livres

  • A. Mot-clé géo dans title/H1/métaÀ NUANCER : faiblement soutenu, frôle le keyword-stuffing déconseillé par Best Practices. Le vrai levier local = NAP + GBP + LocalBusiness schema (déjà 🔴 dans le rulepack.md, section D). Préférer D.2 (NAP) au géo-dans-le-title.
  • B. H1 parasités par pages légales → À NUANCER : vrai défaut technique (fuite de gabarit), mais cas particulier de la règle H1, à classer ⚪/🟠.
  • C. Cohérence sémantique title↔H1↔intentionDANS LES CLOUS : pilier #1 de Best Practices 2026. Le mieux sourcé ; déplace l'agent du comptage vers le jugement = le différenciant visé. Classer 🟠.

Écarts code ↔ base de référence (à corriger)

  1. H1 : rulepack.md = « ⚪ conseil, pas erreur » ; code = recommande −7. Réaligner ⚪/−3.
  2. Title/méta trop court : esprit du doc = anti-troncature (donc trop-long seulement) ; code pénalise aussi trop-court. Retirer.
  3. Doorway : doc = multi-signaux + « aucun seuil chiffré » + jugement humain ; code = Jaccard unique + seuils figés sans mention d'incertitude. Enrichir ou reporter l'incertitude.
  4. Non implémenté alors que dans le doc (souvent 🔴) : SEO local (NAP D.2, LocalBusiness D.1), thin content (step 12), robots/sitemap/canonical, alt images, JSON-LD. Le code ne couvre que 5 contrôles cosmétiques.

Synthèse — où est la vraie valeur

Pinaillage cosmétique (faible valeur, non sourcé) : longueurs title/méta (surtout trop-court), H1=1 à −7, le barème. Vraie valeur SEO (sourcée) : title/méta présents ; doorway/dupliqué (politique 🔴, à enrichir multi-signaux) ; SEO local non codé (NAP, LocalBusiness, thin content) = là où est la valeur métier OBOXIA et où l'agent est muet ; cohérence sémantique (proposition C).

Verdict global : rien d'inventé de toxique, mais l'agent actuel est cosmétique + sur-classe le H1 + sous-implémente le doorway + n'a pas codé la partie à plus forte valeur (local). Le oboxia-seo-rulepack.md est rigoureux et honnête ; le code doit s'y réaligner.

Plan de réalignement (grounded dans les livres)

  1. Fix hard-code des recos (vraies valeurs de page) + test garde-fou.
  2. Réaligner aux étiquettes : H1 → ⚪/−3 ; retirer pénalité « trop court » title/méta ; doorway = reporter l'incertitude (1 signal).
  3. Ajouter la vraie valeur (sourcée) : NAP consistency, présence schema LocalBusiness, thin content (comptage mots), cohérence sémantique title↔H1↔intention.
  4. Démoter/garder en faible poids les contrôles cosmétiques.
↑ haut de page
24 juin 2026 à 09:00 UTC

On pose les bases : faire mieux que l'ancien prestataire

État d'étape — cadrage Autopilot

On quitte l'ancien prestataire parce que son travail ne donnait pas de résultats. L'idée n'est pas de faire pareil que lui, mais nettement mieux : donner à Slim des conseils plus précis et plus utiles pour chaque site client, sans qu'il perde la main sur les décisions.

Notre but, au départ, est tout simple : sortir un seul conseil, sur un seul site, que Slim approuve sans rien changer. Tant qu'on n'a pas ça, le reste n'existe pas vraiment.

Bonne nouvelle : tout est à portée de main. On a déjà accès aux chiffres de Google, on a 43 sites clients réels pour tester, et on connaît exactement les défauts de l'ancien prestataire à corriger. Le vrai risque n'est pas technique : c'est de construire un outil que Slim n'utiliserait pas.

OBOXIA — État d'étape (2026-06-24)

Point charnière. Document de référence stratégique : objectif visé → ce qui est fait → ce qui reste → découpage temporel → dépendances/blocages. (Complète handoff.md qui est l'état de reprise technique.)


1. L'objectif visé (à quoi tout ça répond)

Co-pilote de jugement SEO scalable. ⚠️ On quitte le partenaire parce que son travail est jugé INSATISFAISANT → il est un plancher à battre, pas une cible à reproduire. L'objectif : produire des recommandations SEO que Slim juge meilleures que celles du partenaire, à la chaîne, Slim gardant la main sur la décision finale.

Définition du succès (la seule qui compte au départ) : UNE recommandation, sur UN site, que Slim approuve sans la retoucher. Pas 43 sites, pas la note composite complète, pas un dashboard temps réel. Tant qu'on n'a pas ça, le reste est théorique.

Pourquoi maintenant : la chaîne de valeur est déjà à portée — données Google accessibles (service account Myobox sur GSC+GA4 de chaque client), parc de 43 sites réels, livrables partenaire connus (2 rapports lus). Le risque n'est pas technique, il est de construire un truc que Slim n'utilise pas ou de ne pas faire mieux que le partenaire.

1bis. Le barème à battre (les 4 faiblesses du partenaire → 4 différenciateurs)

Naouphel juge le partenaire insatisfaisant sur les 4 axes. Chacun mappe une couche de l'archi — c'est ce qui valide le design :

Faiblesse partenaire Ce que l'agent doit faire de MIEUX Couche qui le porte
Recos génériques / pas actionnables (prose : cocon, netlinking, maillage) Correctifs concrets, site-spécifiques : « fais X sur la page Y », tirés de signaux mesurés Agent 5 — cœur du différenciateur, c'est le go/no-go
Résultats faibles (positions/trafic ne décollent pas) Note + suivi avant/après qui prouve l'impact ; à terme le dataset apprend quels correctifs bougent l'aiguille Note composite + suivi (dataset)
Trop lent / trop cher Automatisation : coût marginal ≈ 0, instantané sur les 43 sites Toute la chaîne automatisée
Pas de suivi / réactivité Surveillance continue + alertes quand une position chute (entre deux rapports) Agent 8 — re-validé (voir nuance)

Nuance sur Agent 8 : le council avait déclassé le « temps réel » comme faux différenciant. La faiblesse #4 le re-valide partiellement : ce n'est pas du live seconde-par-seconde (le SEO bouge en semaines), mais une surveillance qui rattrape les chutes que le partenaire rate entre deux rapports périodiques. Différenciant réel = réactivité, pas fréquence d'affichage.

Conséquence n°1 : le différenciateur make-or-break est l'actionnabilité (faiblesse #1). Le banc d'essai / go-no-go = « l'agent sort un correctif concret là où le partenaire restait vague, et Slim le juge meilleur ».


2. Ce qu'on a fait (acquis)

Acquis Preuve / fichier
Cadrage verrouillé (runtime Node/TS CLI, JSON, stack Vitest+Zod+tsx+pnpm) CLAUDE.md
Phase 0 GO — Slim s'engage sur l'Agent 5 handoff.md
Chiffre de cadrage : 5-6 sites/mois, douleur = SEO « faire grimper la note » handoff.md
43 sites clients réels capturés (dont 7 à positions Google connues) fixtures/sites.md
Process multi-ville réel = plugin Obox-Multiville (existe déjà, ne pas refaire) fixtures/multiville-obox.md
Livrable partenaire = rapport de performance GSC (≠ audit technique) 2 rapports Drive lus (Artiserv, Maison Brielle)
Données accessibles : service account Google Myobox sur GSC+GA4 par client captures Drive
Note Agent 5 = composite (perf + positions + technique) — « note de plusieurs noteurs » décision Slim
Council (5 advisors + 3 relectures) → recadrage endossé §3 ci-dessous
Gouvernance mécanisée (hook charge CLAUDE.md à chaque message OBOXIA) CLAUDE.md, lessons.md
Script-sonde GSC écrit (spike de dérisquage) spikes/gsc-probe.mjs

Recadrage du council (endossé)

  • Pas « autopilot autonome »co-pilote de jugement (automatiser reporting+mesure, garder Slim sur la décision).
  • « Temps réel » déclassé (faux différenciant : GSC a 2-3 j de latence, le SEO bouge en semaines) → périodique/à la demande suffit. Différenciant = qualité de la reco.
  • Séquençage A (tranche verticale), unanime — mais livrable = une reco, pas un graphe.
  • Correcteur = agent séparé, en dernier, existence à confirmer (risque juridique d'écrire dans le site d'un client).
  • Upside (dataset propriétaire « avant/après » sur 43 sites, SaaS revendable aux agences) = réel mais séquencé plus tard ; pour l'instant juste garder les contrats JSON propres.
  • Note composite = peut-être outil interne (un garagiste ne lit pas une note 3-dim) → à trancher en montrant la 1re sortie.

3. Ce qu'on va faire (et le découpage dans le temps)

Estimations = dev solo (Naouphel + Claude). Chaque phase a un gate (preuve à obtenir avant d'avancer).

Phase 0bis — Dérisquage & validation du jugement — 🕐 ~1-2 j

Objectif : prouver que l'accès données marche ET qu'on sait reproduire le jugement, AVANT d'investir des semaines.

  1. Probe GSC réel : spikes/gsc-probe.mjs sur 1 site → sort clics/impressions/positions. 🕐 ~0,5 j. Gate : un JSON GSC réel s'affiche (sinon on a trouvé le vrai risque : scopes/quotas/mapping propriété).
  2. Banc d'essai jugement : sur un même site, comparer la reco de l'agent à celle (passée) du partenaire → Slim juge laquelle est meilleure. Les recos partenaire = contre-exemples / plancher (jugées faibles), pas étalon à imiter. 🕐 ~0,5-1 j. Gate GO/NO-GO : si l'agent ne BAT pas le partenaire, on ne code pas la suite.

Phase 1 — Socle + tranche verticale A (perf GSC → 1 reco) — 🕐 ~1-1,5 semaine

Objectif : la définition du succès (1 reco approuvée par Slim sans retouche, sur 1 site).

  • Socle commun (core : cli-runner, contrats Zod, validate, journal, reject-queue) — 🕐 2-3 j (déjà planifié).
  • Adaptateur gsc (fake fixture + real service account) — 🕐 ~2 j.
  • Dimension performance + génération de LA reco (LLM, style des rapports partenaire) — 🕐 ~2-3 j.
  • Gate : Slim valide une reco sans la retoucher.

Phase 2 — Empilage dimensions → note composite — 🕐 ~1-1,5 semaine

  • Positions mots-clés (GSC) — 🕐 ~1-2 j.
  • Technique on-page (rulepack) — 🕐 ~3-4 j (≈ déjà dans le plan existant).
  • Conception note composite 3-dim + pondération calibrée sur le réel — 🕐 ~1-2 j.
  • Gate : décider note client vs interne en la montrant à un vrai client.

Phase 3 — Reporting (remplace le livrable partenaire) — 🕐 ~1 semaine

  • Assemblage d'un rapport proche des 2 rapports partenaire (périodique / à la demande). Gate : Slim livre ce rapport à un client à la place du partenaire.

Phase 4 — Suivi (Agent 8) — 🕐 ~1 semaine

  • Lecture continue + alertes sur chutes (positions / CWV / disponibilité).

Phase 5 — Correcteur (en dernier) — 🕐 différé, non estimé

  • Applique les correctifs (écrit dans WordPress = D4, garde-fous). Pré-condition : correctifs proposés validés à la main 3-4× et avérés justes + existence confirmée.

Jalon « on remplace le rapport du partenaire » = fin Phase 3 ≈ ~3-4 semaines de dev solo effectif après le GO de Phase 0bis.


4. Dépendances & blocages

Élément Type Impact Levée
Clé ga-service-key.json (service account) 🔴 blocage Probe GSC + toute la dimension perf Slim/Naouphel la dépose dans oboxia/.secrets/ (gitignored) ou lance le probe en !
5-10 recos passées du partenaire 🔴 blocage Banc d'essai jugement (go/no-go) À récupérer auprès de Slim (Drive / historique)
pnpm non installé 🟠 dépendance Build des agents (le plan l'assume) npm i -g pnpm avant Phase 1
D4 — écriture WordPress 🟠 dépendance Bloque le Correcteur (Phase 5) Trancher REST vs WP-CLI le moment venu
Note client vs interne 🟡 décision Forme du livrable Phase 2/3 Montrer la 1re sortie à un vrai client
Coffre de secrets 🟡 dette Clé SA + mdp WP + clés OVH en clair dans le Drive Chantier sécurité OBOXIA séparé

5. Décision immédiate

Comment débloquer la Phase 0bis (le probe + le banc d'essai). Trois options :

  1. Tu déposes la clé dans oboxia/.secrets/ → je lance le probe (🕐 ~2 min).
  2. Tu lances le probe toi-même en ! (la clé ne quitte pas ta machine) — je donne la ligne (🕐 ~2 min).
  3. On commence par récupérer les recos du partenaire (banc d'essai jugement) pendant que la clé arrive.
↑ haut de page