Flotte OBOXIA — avancement
97 %
avancement global ACTUEL — au 2026-10-20 · effort concentré sur l'Agent 5. 1 agent 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 : 100 %
Les fondations techniques communesSocle / colonne de données (core, GSC, crawl)
100%
en cours
- ✅Le moteur de base qui fait tourner les agentsCLI runner + contrats Zod + validate — cli-runner.ts, schemas.ts
- ✅Le carnet de bord et la file d'erreursJournal + reject-queue — journal.ts, reject-queue.ts
- ✅Lire les données Google Search Console (tests + réel)Adaptateurs GSC fake + real — adapters/gsc.ts
- ✅Aller chercher le contenu de la page d'accueil (tests + réel)Crawl accueil fake + real — adapters/crawler.ts
- ✅Analyser toutes les pages d'un site, pas que l'accueilCrawl multi-pages (villes) — adapters/crawler.ts multi ★ cette session
- ✅Écrire les corrections directement dans le site : ça marche sur le site de test, il reste à décider par où on écrit sur les vrais sites (Slim a le plugin)Adaptateur WordPress D4 — correcteur/adapters/wp-real.ts (REST wp-json). Écriture STAGING faite, testée et prouvée en live (write HTTP 200 + rollback). Reste gated PROD : Slim possède le plugin WordPress propriétaire, qui est le chemin d'écriture D4 acté (decisions.md 2026-06-28) — à coordonner avec lui, pas à concevoir en parallèle. Même porte que le dernier item de l'Agent 6.
- ✅Lire les données Google Analytics 4Adaptateur GA4 — adapters/ga4.ts ★ cette session
- ✅Le garde-fou qui empeche les agents de se desynchroniserRegistre de contrats + verrou de version + harness d integration (council [3]) ★ cette session
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
- ✅Transformer le dossier client brut en fiche structuréeMapper pur RawDossier→Brief (normalizeIdentity/inferTrade/determineMultiCity/inventoryLocalMaterial/computeFlags composés) — analyse-brief.ts ★ cette session
- ✅Refuser un chantier multiville voué au déclassement AVANT de le lancerFlag bloquant differentiation_impossible strict-par-ville (multiville sans matière locale) — le différenciateur doorway porté à l'intake ★ cette session
- ✅La commande qui produit la fiche et bloque mécaniquement les cas à risqueCLI analyse-brief (lit RawDossier, écrit Brief validé, exit≠0 si bloqué = porte mécanique) — analyse-brief-cli.ts ★ cette session
- ✅Ne jamais inventer une donnée manquanteHonnêteté : champ absent → null + flag de complétude, jamais inventé ; sortie toujours BriefSchema-valide ★ cette session
- ✅Le garde-fou qui empêche A1 et A10 de se désynchroniserCouture A1→A10 enregistrée dans INTER_AGENT_SEAMS + garde anti-dérive (registry-pin) ★ cette session
- ✅Prouvé sur de vrais sites, et l'agent aval l'accepteTests TDD fixtures RÉELLES vmcouvreur+maison-brielle (flag prouvé 2 sens) + preuve aval : A10 consomme le brief A1 (0 throw) ★ cette session
La machine à créer des pages par villeAgent 2·3 — Génération de contenu multi-ville (un seul agent, tranché 11/08)
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 || RELECTURE 2026-09-05 (garde G3) : deux affinages du rulepack déjà couvert par le must « Audit on-page », ne bougent pas le %. Règle de vitesse serveur ajoutée à la famille Expérience de page (seuil 800 ms Google, médiane du site, 4 faux positifs trouvés et écartés en mesurant avant de livrer — 922ba39). Décodage HTML du H1 de balayage corrigé après publication réelle chez un client (76a2da5). || 02/10 : reprise des 4 améliorations du 08/09 et retour de l'encart « Juge sémantique — doorway ».
- ✅Examiner une page et repérer les défautsAudit on-page (rulepack) — core.ts, rulepack.ts, extract.ts
- ✅La note globale honnêteNote composite 3 dimensions — composite.ts
- ✅Lire les vraies visites Google, sans flatterPerformance GSC + honnêteté marque — performance.ts
- ✅Le rapport lisible avec graphiquesReporting client HTML + Markdown + graphes — report.ts, report-html.ts, report-charts.ts ★ cette session
- ✅Détecter les pages trop semblablesSpécificité locale / doorway déterministe — local-specificity.ts
- ✅Afficher ce risque dans le rapportSection doorway RENDUE dans le rapport — sectionLocalSpecificity ★ cette session
- ✅Aller chercher les vrais chiffres Google en directPipeline live (crawl accueil + GSC 6 mois) — report-cli --live, adapters/gsc.ts, crawler.ts ★ cette session
- ✅Publier le rapport en lien privéPublication HTML privée — scripts/publish-report.sh ★ cette session
- ✅Dire précisément quoi faire sur chaque pageRecos actionnables (checklist comment-faire) ★ cette session
- ✅Le rapport raconte un plan en 3 étapes (et plus une simple liste)Plan d action narratif déterministe (récit A/B/C) — action-plan.ts, sectionActionPlan ★ cette session
- ✅Le rapport note le local du commerce (carte d identite, telephone, adresse)Dimension Local (on-site) — Coherence locale : schema LocalBusiness + NAP tel + marqueurs + generateur JSON-LD ★ cette session
- ✅La note locale regarde aussi la fiche Google (avis, coherence)Dimension Local — fiche Google (Places) : avis qualite x volume + NAP site-vs-fiche + persistance horodatee (logique+fake ; real derriere cle Maps) ★ cette session
- ✅Donner au commerce ses coordonnees exactes a coller partout + la liste des annuaires ou s'inscrireOff-page niveau 1 — NAP canonique copier-coller + coherence NAP intra-site + annuaires-cibles (generic+metier, reviewedAt) — nap-coherence.ts, offpage.ts, metier-infer.ts, offpage-taxonomy.ts ★ cette session
- ✅Le branchement du juge IA pour les cas ambigus (code fait)B-2 couture (juge LLM doorway : contrat + fake/real OpenAI + escalade bande grise) — scaffold ★ cette session
- ✅Le juge IA a été testé en vrai sur les sites et il est cohérent (on ne passe plus par une relecture de Slim)B-2 validation — juge exercé EN RÉEL sur le parc (6/7 doorway, gpt-4o) + cohérent avec la couche déterministe sur les cas francs (masquée=1.0). Gold-set Slim DESCOPÉ (décision Naouphel 2026-07-04 : rien ne sera validé par Slim). Limite connue loggée : pas d accuracy vs vérité-terrain étiquetée.
- ✅Analyser toutes les pages d'un site, pas que l'accueilCrawl multi-pages (villes) — pour maillage interne + doorway live ★ cette session
- ✅Les conversions Google Analytics sont affichées dans le rapport (à côté de la note, pas dedans — c'est voulu)GA4 — conversion câblée & affichée HORS NOTE dans le rapport (report.ts/report-html.ts/report-cli.ts --ga4-property, mergé 82e8a32, vérifié live property 543343310). Intégration dans le score composite DESCOPÉE par le council (la note ≠ le juge ; vrai juge = conversions réelles). Mapping site→property = data/ops NICE, hors note donc ne conditionne pas le score. ★ cette session
- ✅L IA juge n intervient QUE sur un changement ou sur demande — jamais par habitudeB-2 — appeler judgeDoorwayResidual dans le pipeline d audit + afficher le verdict (LIVRÉ 2026-09-08, lot B) ★ cette session
- ✅Le détecteur de pages bidon est maintenant juste, et il dit comment corrigerRecalibration doorway (multiville fiable + verdict ville-masquée≥95%→🔴 + densité différenciante + blocs passer-au-vert/mieux-ranker) ★ cette session
- ✅Chaque conseil du rapport affiche combien de points il fait gagner, les plus rentables en premierPoints par reco — pointsFor/recoverablePoints + SeoIssue.pointsIfFixed (additif, 0 bump) + rendu badge « +X pts », tri par impact, total récupérable (score.ts, seo-report.ts, core.ts, report-html.ts). Amendement conscient : projection de note « X→Y/100 » abandonnée (mensonge sur issues multi-pages à plat) au profit d un total honnête. ★ cette session
- ✅La grille dit, pour chaque site, LA correction qui rapporte le plus de pointsSalle de commandement — colonne « Levier » : topLever pur (delta de note recalculé page par page, jamais une somme de poids), libellé issu du statement du rulepack, SeoReport.pagesCrawled additif. Prouvé sur les 30 sites réels : 30/30 cellules peuplées, 0 violation de gain ≤ 100−note. ★ cette session
- ✅La grille affiche la même note que le rapport, plus le trafic réel de chaque siteSalle — note honnête : le composite (même nombre que la page d audit) en tête, la note technique nommée en second ; colonne Trafic en sessions organiques 28j. AUCUNE conversion affichée (27/28 sites à 0 par absence de mesure, pas de conversion) — must d abstention verrouillé par test. ★ cette session
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 LEVÉE, MESURÉE LE 11/08 : la fiche annonçait que « 2 signaux sur 4 (fraîcheur, citabilité) sortent non évalué sur tout le parc tant qu un nouveau crawl n a pas eu lieu ». C EST PÉRIMÉ. Comptage exhaustif sur les 43 rapports du parc : 172 signaux évalués, ZÉRO non évalué, aucun site à score nul. Le re-crawl des 09-10/08 a peuplé les champs manquants. ⚠️ Cette phrase périmée m avait fait affirmer à Naouphel, le 11/08 à 18h, que le passage du soir « rallumerait deux signaux muets » — c était faux, et lu dans la fiche au lieu d être mesuré.
- ✅Le calcul qui juge si une page est prête à être citée par les IA (règles fixes, pas d'appel a un modèle)Moteur pur des 4 signaux déterministes (fraîcheur, front-load, contenu citable, schema pour l IA) — geo.ts, computeGeoReadiness. Aucun appel LLM.
- ✅Le format de données qui porte ce nouveau score, sans casser l existantContrat additif — PageData.contentDate/externalLinks + SeoReport.geoReadiness (optionnels sans default, registry-pin vert sans bump)
- ✅Aller chercher la date de publication et les liens externes dans la pageExtraction contentDate + externalLinks — adapters/extract.ts
- ✅Brancher le calcul sans déplacer d un seul point aucune note existanteCâblage auditSite + test de non-régression explicite du composite (maison-brielle garde 79 et 65 à l identique)
- ✅Afficher le score dans le rapport, avec le conseil explicite de NE PAS faire ce que la concurrence vend (llms.txt)Rendu HTML + Markdown — section « Prêt pour les moteurs de réponse (IA) » + anti-recommandation llms.txt écrite dans le rapport
- ✅Corrigé en revue : un score qu on n a pas pu mesurer ne s affiche plus comme une mauvaise noteRevue : score rendu nullable — un site sans aucun signal mesurable affiche désormais « non évalué » au lieu de « Score GEO : 0/100 » (3e occurrence de cette faute dans le dépôt, corrigée et verrouillée par test)
La surveillance des sites une fois en ligneAgent 8 — Maintenance continue
100%
MAJ 2026-10-20 (ancre sur 9 chantiers faits sur 9, breakdown) — Sentinelle complete : 20/20 exigences de la spec du 09/09, criteres herites verifies, registre docs/releves/2026-10-20-sentinelle-m20-registre.md. A observer cette nuit : premiere comparaison sante 1.1 contre 1.1 en production et premier passage du comparateur de notes du parc. Decision a soumettre a Naouphel : ressource-cassee confirmee sur 2 releves, echeance du certificat signalee immediatement.
- ✅Detecter les liens morts et les elements defaillants d un site — en serviceSante technique d un site : decouverte des pages par sitemap, liens et images casses, balises manquantes, noindex, certificat expire — discoverPages, buildSiteHealth, renderParcDashboard. Reellement execute en production par le pipeline de la salle de commandement.
- ✅Le format des releves que la surveillance lira dans le tempsContrats versionnes et epingles au registre : SiteSnapshot 1.0 (photo mesuree d un site) et RegressionReport 1.0 (le constat de degradation).
- ✅Le calcul qui compare deux releves et dit ce qui a baisseComparateur de deux photos : 8 seuils (note, dimensions, GA4, fiche Google, sante) + tableau HTML des regressions — detectRegressions, renderRegressionDashboard. Calculateur juste et teste, mais jamais nourri.
- ✅Chaque bilan enregistre desormais sa photo — le carnet se remplitCORRIGE le 2026-09-08 (Lot D1, consolidation Claude/Codex) — le pipeline de la salle appelle desormais persistNote (packages/command-room/src/persist-note.ts) apres chaque audit reussi : il derive la photo SiteSnapshot du rapport Agent 5 (buildSnapshot) et l ecrit (appendSnapshot) dans note-history/snapshot-history du site. Gardes verifies par test (packages/command-room/test/run-pipeline.test.ts, describe D1, 6 cas) : note absente jamais ecrite a 0, rapport d un autre site refuse, pipeline en echec n ecrit rien, panne de stockage n efface pas l audit, ancien rapport non redate, deux audits produisent deux releves ordonnes. RunMeta porte snapshotStatus/snapshotError. Preuve mecanique : no-dead-capability.test.ts (R2) ne rougit plus sur buildSnapshot/appendSnapshot. ★ cette session
- ✅La surveillance se declenche seule chaque nuit, et on voit si elle a tourneCORRIGE le 2026-10-20 (sentinelle-complete M18) — le declenchement est installe ET confronte au fichier versionne : crontab sante 00h15, alerte 01h45, audit 02h00 (heure de Paris), verrou anti-concurrence, temoin date chaque nuit (19/10 : ok, 53/53), une comparaison echouee n est jamais annoncee ok. Historique : MAILLON MANQUANT (PARTIELLEMENT COMBLE le 2026-08-24) — declencher le balayage. LA CHAINE SANTE A DESORMAIS SON ORDONNANCEUR : cron journalier 03h00 Paris (scripts/crontab-oboxia.txt, versionne), qui mesure les 50 sites PUIS appelle health-regression-cli, et laisse un temoin date (journal/temoin-sante.json) pour qu un cron mort se voie. Ligne prouvee sous env -i, code 0. CE QUI RESTE TODO, ET POURQUOI L ITEM N EST PAS COCHE : la chaine des NOTES (regression-cli, SiteSnapshot) n a toujours AUCUN ordonnanceur, et lui en poser un serait vain tant que l item 3 est ouvert — personne n ecrit la serie qu il lirait. Cocher ici ferait passer une demi-chaine pour une chaine entiere.
- ✅L historique de sante est desormais ecrit ET reluCORRIGE le 2026-08-03 (Lot C, comparateur sante) — relire l historique de sante : --persist-dir cable sur health-cli (run-pipeline.ts) et health-regression-cli.ts appelle desormais readHealthReadings pour de vrai. Preuve : le garde no-dead-capability.test.ts (R2) rougit quand l appel est debranche, reverdit quand il est retabli (rejoue et documente au commit). ★ cette session
- ✅La surveillance de la NOTE a tourne pour de vrai sur un siteCORRIGE le 2026-10-20 (sentinelle-complete M9/M10/M13) — premiere comparaison REELLE de deux releves de note portant leur provenance : audit a la demande de salon-coiffure-herblay, 12h07 UTC, 7 signaux compares, 4 ecartes avec motif, 0 baisse (docs/releves/2026-10-20-sentinelle-m19.md §5). Comparateur de notes a l echelle du parc branche dans le balayage de nuit (20/10). Historique : MAILLON MANQUANT — preuve sur donnees reelles (comparateur de NOTES, SiteSnapshot) : le comparateur n a jamais tourne sur deux releves reels (spec regression 2026-07-01 §7 : « premiere vraie valeur quand la persistance aura tourne ≥ 2 fois sur le parc »). Mesure du 2026-08-03 : sur 8 fixtures reelles, la photo vaut null 8 fois sur 8 — la note est absente partout tant que la couverture reste sous le seuil. Reste vrai : distinct du comparateur de SANTE (item suivant), qui lui ne depend pas de la note.
- ✅La surveillance sante (pages tombees, certificat, liens casses) alerte reellement maintenant, sans attendre la noteComparateur sante<->sante (Lot C, 2026-08-03, docs/spec-comparateur-sante-2026-08-03.md) : detectHealthRegressions (diffuse SiteHealth.findings par id, fenetre de confirmation 2/3 releves, id de collision corrige au prealable) + health-regression-cli.ts + dashboard artisan (confirmees/a confirmer/rien a signaler) + declenche en fin de sweep-parc.mjs. Independant de la note et de la couverture des familles : alerte des le 2e balayage (noindex) ou le 3e (checks bruyants). ★ cette session
- ✅La surveillance des sites est complete et prouvee sur le parc reelSentinelle complete (spec 2026-09-09) : 20 exigences sur 20 satisfaites, 56 criteres herites verifies (0 manquant), preuves reelles du parc (2 observations independantes, 53/53 comparees), cas controle, 5 sabotages rouges — registre docs/releves/2026-10-20-sentinelle-m20-registre.md. ★ cette session
Le bilan régulier présenté au clientAgent 9 — Bilan client
100%
RELECTURE 2026-09-18 (garde G3, journal/fleet.json périmé depuis le 15/09) : l'étiquette D2 était déjà corrigée depuis le 11/08 (must 6), mais la carte affichait encore « à-lancer / attend D2 » alors que la spec (docs/specs/2026-09-07-oboxia-agent9-bilan-client-design.md, amendée le 16/09 puis le 17/09) est écrite et LIVRÉE — packages/agent-9-bilan-client/ (bilan.ts/bilan-html.ts/bilan-cli.ts), 14 musts au total (M12-M14 ajoutés le 17/09 : recommandations lisibles client, dédupliquées, narration en tête). Vérifié ce jour : la ligne cron du must 7 (bloquée le 16/09 par le classificateur d'auto-mode, posée à la main depuis) est bien présente dans scripts/crontab-oboxia.txt:120 (trimestriel, 06h00 Paris). Reste hors périmètre code, cité par reste-a-traiter.md : le prérequis GA4 pour un bloc contacts chiffré (compte de service en lecture seule sur la majorité des propriétés) — le bloc s'abstient honnêtement (non_mesure) en attendant, ce n'est pas un must manquant. || RELECTURE 2026-09-21 (garde G3) : musts 15-22 ajoutés depuis la relecture du 18/09 — identité visuelle réelle, préséance présence locale, garde-fou rouge débloqué en production (runCliParc s'auto-alimente en previous, must 17), plus jamais « trimestre » en dur (must 18), puis 4 éléments d'une maquette envoyée par David, comparée section par section au code réel (musts 19-22 : visiteurs uniques via GA4 totalUsers jamais demandé, note/avis Google déjà collectés par l'API Places mais jamais lus par Agent 9, delta de clics par requête réutilisant le mécanisme du must 17, synthèse en 3 cartes reformatant la narration du must 14). Déployé en production et vérifié en direct à chaque étape. 22/22 musts faits, toujours 100 %. Hors périmètre code, documenté dans la spec : appels réels (dépend de Slim ou d'une intégration OVH neuve), devis, insights GBP (vues/clics/itinéraires — API Business Profile Performance, OAuth par client), historique 6 mois (persistance au-delà d'un seul passage précédent), actions en cours (contenu éditorial, pas une mesure). || RELECTURE 2026-09-22 : musts 23-25 livrés (commit 8105bc1e, revu par Codex en accord sans réserve — worktree isolé, 112 tests + typecheck rejoués de son côté). Corrige une erreur de cadrage de la spec elle-même : la note « courbes 6 mois hors périmètre » supposait à tort qu'il fallait persister nos propres instantanés, alors que GSC porte déjà 16 mois d'historique interrogeable (report-cli.ts le récupérait déjà et le jetait avant sérialisation) — must 23 ajoute un champ additif pour le garder, must 24 en fait une vraie courbe SVG multi-points (repli sur 2 barres si <2 mois), must 25 formalise le traitement visuel (gros chiffres, cartes dégradé) déjà cadré par la session du 17-21/09. 25/25 musts, toujours 100 %. Ce qui reste hors périmètre n'a PAS bougé avec la fusion de la brique 2 MyOboard2 (GA4/GSC en lecture seule, 22/09) : cette brique alimente un widget WordPress admin, pas le pipeline Agent 9 — Agent 9 avait déjà GA4/GSC via Agent 5. Les vrais trous (appels/devis/GBP performance) dépendent des briques 3-4 MyOboard2, non commencées, relancées auprès de Codex le 22/09. || RELECTURE 2026-09-24 : musts 26-27 ajoutés sur décision de Naouphel (« tu les construis et les chiffres viendront ensuite quand les API seront activées ») — les deux blocs manquants de la maquette de David existent désormais dans le bilan, en état déclaré-absent : appels (brique 4 Conversions livrée le 22/09, collecteur OVH en attente de 5 identifiants dédiés chez Slim) et activité de la fiche Google (API Business Profile Performance, app OAuth OBOXIA à créer + consentement par client). Le must 2 tient sans exception : aucun zéro affiché, chaque absence nomme sa cause. Deux défauts RÉELS corrigés le même jour, trouvés en relisant un bilan produit sur données live (maison-brielle, 342 jours GSC) : (1) le tableau des requêtes annonçait 198 clics sous un titre à 37 — deux fenêtres temporelles dans le même bloc, la fenêtre est désormais libellée ; (2) le motif « distinction non mesuré/zéro réel non encore produite en amont (dette connue, spec §2.6) » s’affichait sur la page du client — les motifs internes vivent maintenant dans motifInterne, que le rendu ne lit jamais, sous garde mécanique éprouvée par sabotage. || M28 ajouté le 2026-09-24 : delta des nouveaux avis Google. Motif — la spec GBP du 21/09 affirmait que « nouveaux avis » était DÉJÀ couvert ; vérifié le 24/09 en comparant bloc à bloc avec la maquette de David, c’était faux (note et nombre couverts par M20, variation nulle part). Aucune nouvelle API ni persistance : relecture du <site>-bilan.json déjà écrit, même mécanisme que M17/M21. Premier jet des tests écrit avec les deux fixtures habituelles PLUS une échappatoire : les trois passaient au vert en ne testant rien, ces fixtures n’ayant aucun avis mesuré. Réécrits sur sangare-avocat (le client de la maquette), sans échappatoire, avec une garde qui rougit si la fixture perdait ses avis, et éprouvés par sabotage (une baisse affichée en hausse fait rougir). || M29 ajouté le 2026-09-24, puis une conclusion FAUSSE rétractée le 25/09. M29 : SeoIssue.page existait et le bilan le jetait — le client lisait « la page porte une balise noindex » sans savoir laquelle, et recevait du balisage HTML brut. Corrigé côté Agent 9 seulement (l’audit interne garde sa précision), par une règle générale — une balise devient son terme porteur de sens, jamais une table de correspondance. Éprouvé par sabotage. ⚠️ RÉTRACTATION : en découvrant 5 noindex sur des pages légales, j’ai annoncé « 4 faux positifs sur 5 qui pèsent sur la note » et je l’ai écrit en hors-périmètre de la spec. C’était FAUX. Remesuré messages entiers le 25/09 : les 5 pages d’utilité sortent en sévérité convention à 0 point, la règle porte déjà un verdictPageUtilitaire et naturePage existe depuis le 08/08. Aucun impact sur la note, aucun code à changer. L’erreur venait de messages lus tronqués à 90 caractères, ce qui coupait le suffixe qui les distinguait — zéro suspect appliqué à l’envers. Seul dégât : la ligne de spec, rayée et corrigée. || 2026-10-01 : musts 30-36 livrés (décisions de Naouphel du 01/10, 09h31/09h55/10h31) — rendu « Votre point performance » repris du modèle de David, chiffres du tableau de bord MyOBOARD lus en lecture seule (relevé apparié au site et à la période, sinon non mesuré), total = appels reçus + messages sans les clics de conversion, fréquence affichée = durée réelle de la période. Deux relectures indépendantes (25 constats corrigés, chacun avec test et sabotage). Commit forcé hors verrou (claim Codex 7d43e2a4 sur packages/core/test/**, sans réponse de Codex) sur décision de Naouphel (option B, 14h51). || 2026-10-11 : musts 37-41 livrés — « les chiffres du Bilan ne bougent pas » (David), traçage chiffre par chiffre sur auphildelo-renovation. Bilan MENSUEL (cron du 5 + audit complet du 5 chaque mois, aperçu publié régénéré) et daté ; vitesse PageSpeed d'Agent 5 branchée (LCP 4,2 s mesuré le 11/10, « lente ») ; visiteurs organiques lus sur le mois civil (11 en septembre, et non 7 sur 28 jours glissants) ; requêtes de la période comparées au mois d'avant (« au phil de l'o » 2 clics en septembre, et non 8 sur 16 mois) ; évolution sur 4 mois partout où une source la garde, relevés conservés de bilan en bilan ailleurs. Bilan régénéré pour auphildelo hors production (scratchpad), rien d'envoyé au client.
- ✅Le contenu du bilan, construit à partir de l'audit existantModule de rendu à 5 blocs, lisant le seo-report.json d'Agent 5 (M1) ★ cette session
- ✅On n'invente jamais un chiffre qu'on n'a pasRègle d'honnêteté : un bloc non remplissable dit « nous ne mesurons pas », jamais une valeur inventée (M2) ★ cette session
- ✅La tendance affichée est la bonne, pas une approximation qui trompeCorrection du bug de tendance clics/impressions avant tout envoi client (M3) ★ cette session
- ✅Le document qu'on peut imprimer et envoyer tel quelRendu HTML autonome imprimable en PDF, socle report-html.ts (M4) ★ cette session
- ✅Générer les bilans de tout le parc en une commandeCLI de génération en lot, --parc (M5) ★ cette session
- ✅Nettoyage du suiviRetrait de l'étiquette D2 périmée dans fleet.json (M6)
- ✅Le bilan part tout seul chaque trimestreLigne cron trimestrielle posée dans scripts/crontab-oboxia.txt (M7)
- ✅Le texte n'invente jamais une explication qu'on n'a pasAucune causalité inventée dans la narration (M8) ★ cette session
- ✅Le ton reste le même pour tous les clientsTon et vocabulaire figés, vouvoiement systématique (M9) ★ cette session
- ✅Un trimestre catastrophique est signalé comme tel, pas noyé dans la moyenneGarde-fou trimestre rouge (M10) ★ cette session
- ✅Pas de feu tricolore vitesse dans cette versionVitesse hors des 5 blocs en V1 (M11) ★ cette session
- ✅Le client lit une phrase compréhensible, pas un code interneRecommandations en texte client-lisible, jamais l'identifiant technique du constat (M12, ajouté 17/09) ★ cette session
- ✅On ne répète pas le même conseilJamais deux fois la même recommandation (M13, ajouté 17/09) ★ cette session
- ✅Le bilan dit clairement quoi faire ensuiteNarration en tête du bilan formulant la prochaine priorité en action (M14, ajouté 17/09) ★ cette session
- ✅Le document a le vrai logo et les vraies couleurs OBOXIA, plus aucun bloc cachéIdentité visuelle réelle : vrai logo, charte oboxia.com, aucun bloc jamais omis (M15, ajouté 18/09) ★ cette session
- ✅Une fiche Google manquante ressort avant un détail technique mineurLa présence locale passe devant le technique quand elle montre un vrai trou (M16, ajouté 18/09) ★ cette session
- ✅L'alerte trimestre catastrophique se déclenche vraiment, pas seulement en testGarde-fou trimestre rouge débloqué en production (M17, ajouté 18/09) ★ cette session
- ✅Le bilan dit la vérité sur la période couverte, mensuelle ou trimestriellePlus jamais le mot « trimestre » en dur, quelle que soit la fréquence (M18, ajouté 18/09) ★ cette session
- ✅Le nombre de visiteurs uniques peut maintenant être affichéVisiteurs uniques enfin mesurables via GA4 totalUsers (M19, ajouté 21/09, maquette de David) ★ cette session
- ✅La note Google et le nombre d'avis apparaissent dans le bilanNote et avis Google affichés (M20, ajouté 21/09, maquette de David) ★ cette session
- ✅Le bilan montre si chaque mot-clé progresse ou reculeDelta de clics par mot-clé vs le passage précédent (M21, ajouté 21/09, maquette de David) ★ cette session
- ✅Un résumé en 3 points : ce qui a été généré, ce qui progresse, la prioritéSynthèse en 3 cartes : généré / progresse / priorité (M22, ajouté 21/09, maquette de David) ★ cette session
- ✅Les 16 mois d'historique Google sont enfin gardés jusqu'au bilanPerformanceReportSchema.monthlySeries, additif, série mensuelle GSC transportée (M23, ajouté 21/09 reprise) ★ cette session
- ✅Un vrai graphique de tendance, pas juste deux chiffresVraie courbe de tendance multi-mois, repli 2 barres sinon (M24, ajouté 21/09 reprise) ★ cette session
- ✅Le document ressemble enfin à la maquette de David, pas à un tableau brutTraitement visuel : gros chiffres, cartes dégradé, barres 2 périodes (M25, ajouté 21/09 reprise) ★ cette session
- ✅Le bloc appels existe dans le bilan, prêt à recevoir les vrais chiffresBloc « Vos appels » en état propre, alimentable par la brique 4 Conversions (M26, ajouté 24/09) ★ cette session
- ✅Le bloc fiche Google de la maquette de David existe, en attente de l’autorisation clientBloc « L’activité de votre fiche Google » — 5 métriques Business Profile Performance (M27, ajouté 24/09) ★ cette session
- ✅Le client voit combien d avis il a gagnes depuis le dernier pointDelta des nouveaux avis Google, relu sur le bilan precedent (M28, ajoute 24/09) ★ cette session
- ✅Le client sait QUELLE page corriger, en francais lisibleUne recommandation nomme sa page et ne montre aucun balisage brut (M29, ajoute 24/09) ★ cette session
- ✅Le bilan a la mise en page validée par DavidRendu « Votre point performance » repris du modèle de David, sections 01-07 (M30, ajouté 01/10) ★ cette session
- ✅Les vrais chiffres d'appels, messages et visiteurs du tableau de bordSource MyOBOARD en lecture seule : bloc activite, un état par chiffre, apparié au site et à la période (M31, ajouté 01/10) ★ cette session
- ✅Un total de contacts sans double comptageTotal leads = appels reçus + messages, jamais les clics de conversion (M32, ajouté 01/10) ★ cette session
- ✅Les mots du bilan disent la vraie périodeVocabulaire : « Total leads » autorisé, « trimestre » seulement sur une période trimestrielle (M33, ajouté 01/10) ★ cette session
- ✅Aucun bloc ne disparaît du bilanVitesse visible en section 03, non mesurée tant qu'aucune mesure n'est branchée (M34, ajouté 01/10) ★ cette session
- ✅Pas de courbe inventéeCourbes seulement sur une vraie série d'au moins 3 mois (M35, ajouté 01/10) ★ cette session
- ✅Les visiteurs sont comptés sans ambiguïtéDeux mesures de visiteurs, tous canaux et Google, jamais confondues (M36, ajouté 01/10) ★ cette session
- ✅Le bilan est refait chaque mois et dit de quand il dateFraîcheur : bilan régénéré chaque mois (et à la demande dans la salle), date de génération et des mesures affichées (M37, ajouté 11/10) ★ cette session
- ✅La vitesse du site est vraiment mesuréeVitesse branchée sur la mesure PageSpeed d'Agent 5, datée — plus « non mesurée » écrit en dur (M38, ajouté 11/10) ★ cette session
- ✅Les visiteurs Google portent leurs vraies datesVisiteurs organiques : la fenêtre affichée est la fenêtre mesurée, GA4 lu sur le mois civil (M39, ajouté 11/10) ★ cette session
- ✅Les recherches du mois, comparées au mois d'avantRequêtes de la période du bilan, comparées à la période précédente — plus le cumul de 16 mois (M40, ajouté 11/10) ★ cette session
- ✅Chaque chiffre montre son évolutionÉvolution sur 3-4 mois pour chaque chiffre quand l'historique existe, sinon dit en clair (M41, ajouté 11/10) ★ cette session
La vérification finale avant la mise en ligneAgent 10 — Contrôle avant mise en ligne
100%
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). Preuve réelle faite (breakdown « Preuve réelle sur un vrai staging OBOXIA » : done, docs/preuve-a10-r10-2026-09-09.md) — relu le 20/10, la mention « reste seulement » était périmée.
- ✅Contrat PreflightReport v1 versionné, verrouillé au registreContrat PreflightReport v1 versionné, verrouillé au registre
- ✅Règle de verdict mécanique (NO_GO ⟺ ≥1 anomalie blocker)Règle de verdict mécanique (NO_GO ⟺ ≥1 anomalie blocker)
- ✅Type unsubstituted_variable (blocker)Type unsubstituted_variable (blocker)
- ✅Type page_unreachable (blocker) + garde-fou NO_GO par défaut si contrôle impossibleType page_unreachable (blocker) + garde-fou NO_GO par défaut si contrôle impossible
- ✅Type nap_mismatch (blocker) — NAP éclaté en 3 sous-preuves nom/adresse/téléphoneType nap_mismatch (blocker) — NAP éclaté en 3 sous-preuves nom/adresse/téléphone
- ✅Type city_out_of_zone (blocker)Type city_out_of_zone (blocker)
- ✅Type legal_mentions_missing (blocker)Type legal_mentions_missing (blocker)
- ✅Type broken_internal_link (blocker)Type broken_internal_link (blocker)
- ✅Type broken_image (blocker)Type broken_image (blocker)
- ✅Type contact_form_dead (blocker) — soumission réelleType contact_form_dead (blocker) — soumission réelle
- ✅Type empty_page (blocker)Type empty_page (blocker)
- ✅Type broken_external_link (warning, pas blocker)Type broken_external_link (warning, pas blocker)
- ✅Type mobile_minor (warning)Type mobile_minor (warning)
- ✅Rendu HTML (preflight-dashboard.ts)Rendu HTML (preflight-dashboard.ts)
- ✅CLI : chargement/validation brief.json (Zod) + flags --staging/--brief/--test-inbox/--json/--outCLI : chargement/validation brief.json (Zod) + flags --staging/--brief/--test-inbox/--json/--out
- ✅CLI : --seo-reportCLI : --seo-report
- ✅CLI : --skip-factualCLI : --skip-factual
- ✅Isolation d erreur PAR CONTRÔLE (contrôle qui plante → blocker « contrôle impossible »)Isolation d erreur PAR CONTRÔLE (contrôle qui plante → blocker « contrôle impossible »)
- ✅brief.json absent/invalide → erreur CLI franchebrief.json absent/invalide → erreur CLI franche
- ✅Formulaire testé sans --test-inbox → « non testé » (warning), jamais un faux GOFormulaire testé sans --test-inbox → « non testé » (warning), jamais un faux GO
- ✅Preuve réelle sur un vrai staging OBOXIA (pas seulement une fixture synthétique)Preuve réelle sur un vrai staging OBOXIA (pas seulement une fixture synthétique)
- ✅Réutilisation du crawler multi-pages d Agent 5 — bug réel corrigé (feu vert Naouphel), unification complète reste une décision produit distincteRéutilisation du crawler multi-pages d Agent 5 — bug réel corrigé (feu vert Naouphel), unification complète reste une décision produit distincte
L'assistant qui applique lui-même les corrections sur le siteAgent 6 — Correcteur (écrit dans WP, D4)
89%
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) + le correcteur RÉDIGE au lieu de couper, avec garde anti-appauvrissement (2026-08-13). Reste : write PROD gated Slim (plugin+owasp+validation humaine) — 02/09 : ÉCRITURE PROD RÉELLE PROUVÉE sur 2 sites clients + retour arrière réel confirmé ; reste validation humaine des valeurs llm par Slim + revue owasp finale tracée || RELECTURE DE FLOTTE DU 2026-09-05 (garde G3, journal/fleet.json périmé depuis le 30/08) : la spec docs/superpowers/specs/2026-08-30-correcteurs-seo-dormants.md (18/18 musts, 8a19ab0) n'avait jamais été reportée ici. Depuis, deux de ses familles ont été activées avec feu vert (canonical-self et jsonld-localbusiness passés en auto le 03/09, docs/politique-publication.md), 20 sites traités en carte d'identité (17 puis 20 cartes, 362fd51/e5760c6) et les 13 sites sans URL de mentions-légales détectable ont été assignés et clos (8827847). h1-not-unique (sous-cas multi-H1) est préparé et dormant/propose — sous-cas h1-zéro explicitement GELÉ par décision Naouphel le 05/09 à 04h47 (voir handoff.md), pas par héritage. || RELECTURE DU 2026-09-11 (garde G3) : ne bouge pas le % — la spec du 30/08 couvrait la PRÉPARATION (18/18 musts), le branchement dans le pipeline était explicitement « hors périmètre avant feu vert » et n'est pas un must de cette spec ni d'aucune autre. Fait ce jour, hors spec (NICE) : `schema-localbusiness-missing` est câblé dans propose-values.ts (feu vert déjà donné le 03/09 dans politique-publication.md, jsonld-localbusiness: auto) — 6 sites/40 reçoivent désormais une proposition réelle, 34 s'abstiennent motivé. Couvre nap-phone-missing sur 3 sites au passage (même correctif). Effet concret : ces sites entrent dans le tir automatique AU MÊME TITRE que canonical/title/meta/breadcrumb déjà auto depuis début septembre — pas un nouveau régime, la suite du même. || RELECTURE DU 2026-09-15 (garde G3) : ne bouge pas le % — pas une nouvelle capacité, un correctif de plomberie. Mesuré (apply.audit.jsonl) : 0 écriture chaque nuit du 11 au 15/09 (le lanceur cron n'injectait jamais OBOXIA_SECRET_GABARIT au worker — même panne que le jeton d'approbation du 07/09, un secret plus loin). Corrigé à deux niveaux : le lanceur (scripts/tir-nocturne.mjs) l'injecte désormais, et attestation-gabarit.ts se replie sur le fichier des secrets si l'environnement est vide (même doctrine que ticket-restauration.ts et jeton-approbation.ts) — le secret est disponible pour tout appelant présent ou futur, pas seulement ceux câblés à la main. || RELECTURE DU 2026-09-18 (garde G3) : ne bouge pas le % — deux correctifs de plomberie, aucune nouvelle capacité. (1) maison-brielle (110 constats, 0 correction) : le crédit OpenAI était épuisé (credit_balance_exhausted), avalé sous le même motif qu'une panne réseau ; writer-llm.ts distingue désormais quota/réseau/autre et journalise chaque appel (journal/openai-usage.jsonl, scripts/openai-cout.mjs). (2) 2k-peinture (Keller) : apply.ts rendait un `unresolved` muet quand resolveTarget échoue à cause d'une redirection déjà connue de motifSiRedirection — consultée désormais avant, pas seulement après une résolution réussie. || 02/10 : passage en autonomie (rédaction attestée, approbation humaine conservée, page « Écrit cette nuit » + Annuler) et approbation nominative + sauvegardes durables (M1-M8). 04/10 : une écriture défaite (page publique muette) n'est plus retentée avant 30 j — débloque 10 sites coincés sur leur page /blog/ depuis le 29/09 (v0.107.0).
- ✅Le format des corrections + le garde-fouContrat d entree Correctif (versionne) + test-gate mecanique ★ cette session
- ✅Montrer ce qu'on écrirait, sans rien écrire, pour validationAperçu à blanc (dry-run) du lien WP — previewBatch + render HTML (0 write/réseau/secret) ★ cette session
- ✅Écrire vraiment les corrections dans un site de TEST, avec sauvegarde et retour arrièreWrite staging D4 — WpClient real/fake + applyBatch (dry-run défaut, staging-only deny-by-default, backup/rollback/idempotence, h1 différé, secrets non loggés) + CLI correcteur-apply + correcteur-rollback (mergé master, 760 tests, revue Opus) ★ cette session
- ✅Prouver l'écriture sur le vrai WordPress de testPreuve réelle rejouée via le CLI contre le staging (backup→write→vérif→rollback sur hello-world) ★ cette session
- ✅Les corrections de titres sont réécrites proprement, jamais coupées au milieuLe correcteur RÉDIGE au lieu de couper — redacteur-meta : titres et descriptions réécrits sous contrainte de longueur plutôt que tronqués (la marque cesse d'être amputée), + garde de sortie qui REFUSE toute proposition appauvrissant le texte du client (b70bb8d, 7cb6ecb, 3dab79d, 2026-08-13). Must du plan 2026-08-12-oboxia-correction-13-constats.md, vague 3. ★ cette session
- ✅Appliquer sur les vrais sites clients en ligne (dernière étape, sécurisée)Write PROD réel sur les sites clients, sous validation humaine (politique signée par Slim)
- ❌Faire relire la sécurité du correcteur une dernière fois, comme prévu au départRevue de sécurité OWASP finale du correcteur — condition du must d'origine, NON TRACÉE au 24/09 (seule la revue générale du 11/08 existe : docs/revue-agent-6-correcteur-2026-08-11.md)
- ✅18 nouveaux types de défauts SEO savent maintenant proposer une correction — mais aucun n'écrit tant que Slim ou Naouphel n'a pas dit oui pour ce type précisCorrecteurs SEO dormants — 18 familles préparées (canonical-not-self/missing, jsonld-invalid, schema-localbusiness, h1-not-unique-across-site, meta/title-not-unique, images-alt-missing, thin-content, internal-links-quality, sitemap/http-status/mixed-content/unclean-url, noindex, robots-txt, images-not-webp) — spec 2026-08-30-correcteurs-seo-dormants.md, 18/18 musts, 8a19ab0. Fonctions pures de diagnostic/abstention, aucun chemin d'écriture avant feu vert par famille (invariant de sécurité de la spec). ★ cette session
- ✅Deux des 18 défauts sont maintenant corrigés automatiquement la nuit (identité et adresse de référence) ; les autres restent en simple proposition tant que personne n'a dit ouiActivation par famille, post feu-vert — canonical-self et jsonld-localbusiness (carte d'identité) passés en auto le 03/09 (docs/politique-publication.md, provenance tracée) ; carte d'identité traitée sur 20 sites (362fd51, e5760c6) ; découverte des mentions-légales close sur les 13 sites sans URL détectable (8827847) ; h1-not-unique reste volontairement en propose/dormant (sous-cas h1-zéro gelé par décision explicite Naouphel le 05/09 04h47). ★ cette session
La vigie qui garde les règles SEO à jourAgent Veille — règles SEO (garder le rulepack à jour)
89%
19/10 : veille de quinzaine élargie — tri motivé (M18-M21), dossier Inoreader « Veille OBOXIA » de 11 médias et experts du SEO local, filtre des médias prolifiques (M22-M25), pas de sujet redit et jugement sur le parc réel (M26-M27). Examen sur 100 vrais articles : 2 → 2 à 4 sujets clés sur 8, 0 doublon. Tir réel le 19/10 à midi. Précédemment : Pilote fusionné dans master (vérifié 24/09 : git cherry origin/master codex/veille-pilote-0908 = 0 commit absent) ; son exécution en production n'est pas vérifiée. Source Google datée et archivée, comparaison et diagnostic réels. Contrôle du nom LocalBusiness actif sur cette branche, hors note et rattaché à sa famille. La commande chaine-veille-cli exécute l’Audit puis prépare un ajout du nom légal au document existant avec avant/après et réaudit. Abstention si preuves insuffisantes ou établissements multiples. Pas de publication client : stockage WordPress du bloc à raccorder. Adresse encore en brouillon. Preuves : docs/veille-audit-correcteur-preuves-2026-09-08.md. || 01/10 : veille de quinzaine (cron 15 et fin de mois, 20h Paris) + rubrique « Veille » de la salle. 11/10 : premier tir à blanc — les mises à jour du tableau de bord Google étaient toutes écartées (titre de page générique) ; corrigé (v1.3.2), relancé à blanc : 2 nouveautés retenues dont la mise à jour anti-spam de septembre 2026. Première exécution réelle : 15/10.
- ✅Le format des règles SEO, rendu relisible par une machineContrat Rule/Rulepack + registre + rulepack.json généré depuis les 7 blocs (8 règles) — a65c3a8
- ✅Le moteur qui applique les règles sans coder chaque cas a la mainExécuteurs (6 familles) + rulepack-runner + test-pont non-régression (478 tests Agent 5 verts) — 0b7e72b
- ✅Brancher l audit existant sur le nouveau moteur, sans rien casserMigration incrémentale Agent 5 — runOnPageRules devient un mince wrapper sur le runner data-driven (rulepack.ts)
- ✅Le format d une proposition de changement de règleContrat RulepackProposal + registre — 7ba08f0
- ✅La liste de départ des règles SEO externes à surveillerCorpus rulepack-candidates.json (amorçage biblio) — 70cf2fe
- ✅La commande qui repère ce qui manque au référentielVeille propose (curation candidats→RulepackProposal) + dashboard HTML + veille-cli propose — dc061e3
- ✅La commande qui met à jour le référentiel une fois validé par un humainVeille merge (n applique que accepted+executorAvailable, bump semver) + veille-cli merge — c555d85
- ✅Prouvé sur de vraies règles, pas seulement des tests fabriquésRevue adversariale par tâche + preuve E2E — proposition réelle depuis la biblio, 7 covered/4 partial/29 gap sur le vrai corpus — 37be1b6, mergé 494d5e2
- ❌Prouver qu'une proposition peut vraiment être intégrée et mesuréeMesure de sortie intégrable : chaque changement doit porter une URL source vérifiée et un exécuteur mesurable. Remesuré le 20/10 sur le tir réel du 19/10 : 0/1 (proposition « adresse » LocalBusiness : source Google vérifiée, exécuteur absent). Manque : (1) exécuteur de la règle adresse + preuve à blanc ; (2) calcul du ratio dans le pilote et la quinzaine, testé sur sortie réelle ; (3) réparer l’échec « dossier de sortie existe déjà » de la section règles de la quinzaine du 19/10. ★ cette session
20 octobre 2026 à 12:09 UTC
La surveillance des sites est terminée et prouvée
Sentinelle complète — clôture M20 : 20 exigences sur 20, registre et preuves
La Sentinelle, l'agent qui surveille la santé des sites, est terminée. Les vingt exigences fixées le 9 septembre sont toutes remplies, et chacune renvoie à sa preuve. Sur le parc réel, elle a mesuré et comparé les 53 sites. Elle a aussi comparé pour la première fois l'évolution de la note d'un site entre deux audits, en écartant proprement ce qui n'était pas comparable. Cette nuit, on vérifiera qu'elle fait la même chose seule, sur tout le parc.
Sentinelle complète — clôture M20 : 20 exigences sur 20, registre et preuves (20/10/2026)
Spec docs/specs/2026-09-09-oboxia-sentinelle-complete-design.md. Registre complet : docs/releves/2026-10-20-sentinelle-m20-registre.md ; preuves réelles : docs/releves/2026-10-20-sentinelle-m19.md.
| Signal objectif |
Valeur |
| Exigences de la spec citées par un test |
20 / 20 (pnpm musts:matrix) |
| Critères hérités (5 documents antérieurs) |
56 vérifiés : 38 couverts, 12 remplacés par une décision datée, 6 partiels complétés le 20/10, 0 manquant |
| Parc réel |
2 observations indépendantes, 53/53 sites comparés, 452 constats déjà connus, 0 nouveau |
| Comparaison des notes en production |
première comparaison réelle avec provenance : 7 signaux comparés, 4 écartés avec motif (audit à la demande, 12h07 UTC) |
| Sabotages |
5 gardes de la Sentinelle + 3 nouvelles gardes héritées : 8 sur 8 rouges |
| Agent 8 dans le suivi de flotte |
9 chantiers faits sur 9 (recalculé par la garde d'ancrage) |
À observer cette nuit : la première comparaison de santé 1.1 contre 1.1 en production, et le premier passage du comparateur de notes à l'échelle du parc.
Décision à soumettre à Naouphel : un fichier de page cassé (script, feuille de style) est confirmé sur deux relevés, comme une image ; l'échéance du certificat est signalée dès qu'elle apparaît.
↑ haut de page
20 octobre 2026 à 12:02 UTC
La Sentinelle a été éprouvée pour de vrai
Sentinelle M19 — preuves réelles et contre-exemples (53/53 comparés, 5 sabotages rouges)
La Sentinelle, l'agent qui surveille la santé des sites, a été éprouvée pour de vrai. Elle a mesuré les 53 sites deux fois, à onze heures d'écart, et a bien comparé les deux passages. Sur un faux site monté exprès, elle a vu une panne, l'a confirmée au passage suivant, puis a vu la réparation. Quand le faux site a cessé de répondre, elle a dit « je ne sais pas » au lieu de dire « c'est réparé ». Et quand on désactive volontairement chacune de ses protections, les contrôles automatiques le détectent à chaque fois.
Sentinelle M19 — preuves réelles et contre-exemples (20/10/2026)
Spec docs/specs/2026-09-09-oboxia-sentinelle-complete-design.md, M19. Relevé complet : docs/releves/2026-10-20-sentinelle-m19.md. Aucun message envoyé, aucun historique de production modifié.
| Preuve |
Résultat |
| Deux observations indépendantes du parc |
nuit 19/10 22h15 UTC puis 20/10 09h52 UTC : 53/53 sites mesurés, 53/53 comparés, 0 régression nouvelle, sur 452 constats déjà présents la veille |
| Cas contrôlé (serveur local, aucune panne client) |
série A : à confirmer → confirmé → disparition observée ; série B : à confirmer → confirmé → non revérifié (« cible non mesurée »), jamais tenu pour résolu |
| Sites sans historique |
premier relevé de chaque série : « non comparé (insufficientHistory) », visible |
| Sabotage des gardes |
5 sur 5 rouges (M2, M12 ×2, M10, M11), fichiers restaurés |
| Sortie déployée |
page Sentinelle de la salle rendue sur les données de production : 53 sites, 0 sans relevé |
- Le zéro a été contesté avant d'être écrit : 452 constats et 32 cibles non mesurées dans le relevé, donc « rien de nouveau », pas « rien vu ».
- Première comparaison 1.1 contre 1.1 : la nuit du 19→20/10 comparait 1.0 à 1.1 et la garde de version l'a refusée, à juste titre.
↑ haut de page
20 octobre 2026 à 08:19 UTC
Le juge IA a été essayé en vrai : un appel, puis zéro
Juge de l'Auditeur M7 — preuves du parcours réel (1 appel, puis 0, puis 0)
Le juge IA qui départage les cas ambigus a été essayé pour de vrai sur un site réel, sans rien modifier chez le client. La première fois, il a bien appelé l'IA (une fraction de centime). La deuxième fois, voyant que rien n'avait changé, il a réutilisé sa réponse sans rien dépenser. Et relire un rapport existant ne déclenche jamais de nouvel appel. C'est ce que la spec demandait.
Juge de l'Auditeur M7 — preuves du parcours réel (19/10/2026)
Spec docs/specs/2026-09-08-oboxia-auditeur-cycle-juge-design.md, M7. Relevé complet : docs/releves/2026-10-19-juge-m7.md. Site : avocat-brigitte-karila-fr, en lecture seule (rapport de production vérifié identique par SHA-256 avant et après).
| Passage |
Commande |
Appels au fournisseur |
Résultat |
| 1 |
--live --judge-si-change |
1 vrai appel gpt-4o (1 976 jetons en entrée, 142 en sortie, ≈ 0,0064 $) |
verdict uncertain, confiance 0,6, modèle retourné gpt-4o-2024-08-06 |
| 2 |
même commande |
0 |
« references identiques — verdict du 2026-10-19T18:43:04.809Z reutilise, aucun appel » ; judgedAt conservé, reusedAt ajouté |
| 3 |
--report (relecture) |
0 |
« aucune page (mode relecture) — aucun appel » ; JSON relu identique clé par clé |
- Empreinte du contenu :
73767c69e8add9b3c46dc0147f665792381355941478da1560fb8fbaff7113c2, identique aux passages 1 et 2.
- Empreinte du prompt :
81699bff0cc7263473875ebfed48bdef7f6653b3c554b938dd626f4c964b99c3, version 2026-10-12.1.
- Le verdict n'entre pas dans la note : il reste expérimental.
- À noter : le verdict du site a changé (
genuine-local 0,85 le 11/10, puis uncertain 0,6) sur un contenu différent. Le rapport de production n'a pas été touché.
↑ haut de page
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 :
- Le marqueur interne
[à vérifier avant publication] est DANS le texte servi — il partirait
en ligne tel quel.
- 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.
- 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 abf66ad → 136b8961.
Dette résiduelle loggée :
- Testé sur fixtures uniquement — aucune donnée réelle accumulée (1re vraie valeur quand la persistance snapshot aura tourné ≥ 2× sur le parc)
buildSnapshot.health non peuplé en amont → signaux régression-santé (newCriticalHealth / moreSanteWarnings) inertes jusqu'au câblage de ce champ
- Regex sanitisation site→fichier dupliquée en 3 endroits (à centraliser dans @oboxia/core)
- 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 (6161cb6 → 051a0dd) : nouveau package @oboxia/agent-8-sante. 429 tests verts (était 403 au démarrage), typecheck 0.
Les 8 checks du contrat SiteHealth v1
pageDown — page injoignable (HTTP 5xx/timeout)
httpsExpired — certificat HTTPS expiré
noindex — balise meta noindex ou en-tête X-Robots-Tag: noindex (les deux sources)
brokenInternalLinks — liens internes cassés
brokenExternalLinks — liens externes cassés (avec retry)
brokenImages — images cassées
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
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 :
- Il prenait des sites d'un seul magasin (un ostéo, un café) pour des sites multi-villes → faux risque. Réglé.
- Pour un site vraiment dangereux (texte copié à 100 %), il disait « risque faible » au lieu de « danger ». Réglé : maintenant c'est clairement 🔴.
- 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 :
- Le nombre d'avis et la note (les étoiles).
- 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 :
- La carte d'identité du commerce est-elle bien renseignée dans le code (nom, adresse, téléphone, horaires) ?
- 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) ?
- 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 :
- D'abord, réparer ce qui freine le site.
- 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.
- 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âche | Effort dev | Prérequis |
| Recos « actionnables » n°1 (checklist concrète par page) | ~0,5–1 j | champs h2, page GSC |
| Tranche 2 : courbe tendance 6 mois | ~0,5 j | — |
| Batch des 43 sites (config GSC = URL-prefix) | ~0,5–1 j | peu bloqué |
| Dimension LOCAL (Google Business / avis / NAP) | ~1–2 j (partiel) | GBP via API |
| Off-page / annuaires + autorité (backlinks) | ~3–5 j | donné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 j | clé Anthropic runtime + gold set Slim |
| Agent 8 (suivi / alertes) | ~2–3 j | — |
| Agent Correcteur (écrit dans WordPress, D4) | ~3–5 j | en 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)
- Context7 — utile immédiatement (on code les briques 1-2), zéro surface de sécu.
- GitHub MCP — dès qu'oboxia a un repo git + un remote.
- 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
- 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).
- Crawler 28-règles → NON 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.
- Différenciateur (sémantique/local, note composite, recos actionnables) → 100% en propre, aucun MCP ne le couvre.
- Forme : libs npm directes dans des adaptateurs (agents CLI déterministes) ; MCP réservé à la salle de commandement / VoltAgent.
- 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 (é…) → 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 Brielle → score 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
- 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.
- 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).
- 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).
- 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↔intention → DANS 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)
- H1 : rulepack.md = « ⚪ conseil, pas erreur » ; code =
recommande −7. Réaligner ⚪/−3.
- Title/méta trop court : esprit du doc = anti-troncature (donc trop-long seulement) ; code pénalise aussi trop-court. Retirer.
- Doorway : doc = multi-signaux + « aucun seuil chiffré » + jugement humain ; code = Jaccard unique + seuils figés sans mention d'incertitude. Enrichir ou reporter l'incertitude.
- 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)
- Fix hard-code des recos (vraies valeurs de page) + test garde-fou.
- Réaligner aux étiquettes : H1 → ⚪/−3 ; retirer pénalité « trop court » title/méta ; doorway = reporter l'incertitude (1 signal).
- Ajouter la vraie valeur (sourcée) : NAP consistency, présence schema LocalBusiness, thin content (comptage mots), cohérence sémantique title↔H1↔intention.
- 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.
- 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é).
- 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 :
- Tu déposes la clé dans
oboxia/.secrets/ → je lance le probe (🕐 ~2 min).
- Tu lances le probe toi-même en
! (la clé ne quitte pas ta machine) — je donne la ligne (🕐 ~2 min).
- On commence par récupérer les recos du partenaire (banc d'essai jugement) pendant que la clé arrive.
↑ haut de page