Flotte OBOXIA — avancement
78 %
avancement global ACTUEL — au 2026-08-11 · effort concentré sur l'Agent 5. 2 agents hors moyenne (% non calculable, faute de chantiers listés). ⚠️ les % cités dans les entrées datées ci-dessous sont des instantanés passés, pas le chiffre courant.
Socle : 88 %
Les fondations techniques communesSocle / colonne de données (core, GSC, crawl)
88%
en cours
- ✅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 ville (le moteur existe déjà chez Slim, notre rôle reste à cadrer)Agents 2·3 — Génération de contenu + démultiplication multi-ville
non calculable
RETENU ET DEMARRE (decision Naouphel, 2026-08-02). Le moteur multiville (Obox-Multiville) reste la propriete de Slim et ne compte jamais comme notre travail fait. Notre part — piloter le moteur : choix des zones et villes, gabarit, declenchement — demarre par l ecriture de sa spec. Prerequis : Slim doit dire si le controle des pages-villes se fait avant ou apres publication.
La transformation des maquettes en site (côté Slim)Agent 4 — Figma-to-code
non calculable
CLOS (decision Naouphel, 2026-08-02). Sorti du perimetre : il ne figure plus dans le travail a faire, ni du notre ni de celui de Slim, et ne doit peser dans aucun decompte. · externe
L'outil qui note les sites et dit comment les améliorerAgent 5 — Audit SEO + reco + score ⭐
100%
livré (ancre de valeur) — 23/23 musts (dont points par reco, 2026-07-23), B-2 validé sans Slim, GA4 hors note
- ✅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
- ✅Faire intervenir l IA juge pendant l analyse (branchée mais pas encore appelée)B-2 — appeler judgeDoorwayResidual dans le pipeline d audit + afficher le verdict (scaffold non câblé) ★ 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 CONNUE, mesurée sur le rendu réel : 2 signaux sur 4 (fraîcheur via contentDate, citabilité via externalLinks) sortent « non évalué » sur tout le parc tant qu'un nouveau passage du crawler n'a pas été fait — comportement voulu (règle d'abstention §3 de la spec), pas un défaut du code.
- ✅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
63%
MAJ 2026-08-03 (Lot C livre) — le comparateur sante<->sante alerte reellement : --persist-dir cable, id de collision corrige, detectHealthRegressions + CLI + dashboard, declenche en fin de sweep-parc. Independant de la note (le parc est passe a 6/7 familles le 03/08 apres les chantiers indexabilite et exploration — seuil 5, donc une marge) : ce chemin d alerte-la n attend personne. Reste todo : la chaine de comparaison de la NOTE (SiteSnapshot) elle-meme, toujours a 0 photo ecrite tant que la couverture n atteint pas 5/7. Detail : docs/agent8-verite-et-reprise-2026-08-03.md, docs/spec-comparateur-sante-2026-08-03.md.
- ✅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.
- ❌Personne n enregistre les releves : la surveillance lit un carnet videMAILLON MANQUANT — alimenter la serie : aucun pipeline ne derive ni n ecrit de photo SiteSnapshot. report-cli n en produit jamais, et le pipeline de la salle lance la sante SANS --persist-dir. Le comparateur lit donc un repertoire que personne ne remplit.
- ❌Rien ne declenche la surveillance automatiquementMAILLON MANQUANT — declencher le balayage : aucun ordonnanceur n appelle le CLI de regression (ni le pipeline de la salle, ni un cron). La detection ne tourne que si quelqu un tape la commande a la main.
- ✅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 n a encore jamais tourne pour de vrai sur les sites (bloque par la couverture, pas par nous)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
Le bilan régulier présenté au clientAgent 9 — Bilan client
0%
attend D2
La vérification finale avant la mise en ligneAgent 10 — Contrôle avant mise en ligne
non calculable
livré v1 (mergé master, 471 tests, revue opus READY) — dépendance brief.json LEVÉE (Agent 1 livré 2026-07-21, A10 consomme le brief A1 : preuve déterministe 0 throw). Reste seulement : preuve réelle sur un vrai staging OBOXIA (crawl live).
L'assistant qui applique lui-même les corrections sur le siteAgent 6 — Correcteur (écrit dans WP, D4)
80%
aperçu dry-run + WRITE STAGING codé/revu (revue Opus : cœur sécurité solide, 760 tests) + rollback + PREUVE LIVE OK (write réel HTTP 200 + rollback prouvés via le vrai CLI sur staging). Reste : write PROD gated Slim (plugin+owasp+validation humaine)
- ✅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
- ❌Appliquer sur les vrais sites clients en ligne (dernière étape, sécurisée)Write PROD réel — gated : plugin de Slim + revue owasp finale + validation humaine (en dernier, par conception)
La vigie qui garde les règles SEO à jourAgent Veille — règles SEO (garder le rulepack à jour)
100%
RÉTROGRADÉ livré→en-cours le 2026-08-11 (constat Naouphel), sur le MÊME critère qu Agent 8 le 2026-08-03 : les calculateurs sont livrés et prouvés, la chaîne ne produit rien d utilisable. Mesure du premier tir réel (2026-08-10, 605219f) : 40 candidats, 12 déjà couverts, 28 propositions dont ZÉRO mesurable (aucun exécuteur ne sait les calculer) et 40 candidats sur 40 SANS URL — donc inintégrables en l état. Un agent dont aucune sortie n est exploitable n est pas livré. || LE pct EST PASSÉ DE 100 À null LE 2026-08-11, dans le même geste : il mesurait les musts spécifiés, or il manque à cette spec le must décisif (des propositions intégrables). Un 100 % à côté d un state « en-cours » se contredisait aussi frontalement (règle 7 du garde G2) — voir pctStatus. || Cause racine déjà nommée le 2026-08-06 et non traitée : la Veille compare le référentiel au référentiel (lessons.md, 11/07) au lieu de le confronter à un référent EXTÉRIEUR. C est la contrepartie non négociable de l amendement du 08/08 sur le juge interne.
- ✅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
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