Claude Code Subagents : Notre flux de travail de production pour des déploiements sécurisés
Nous livrons des sites headless pour des clients qui mesurent tout -- Core Web Vitals, schéma de balisage, scores d'accessibilité, variations du trafic organique. Un mauvais déploiement peut faire chuter les classements qu'il a fallu des mois pour construire. Alors quand Anthropic a lancé les sous-agents, les hooks et les compétences dans Claude Code, nous avons reconstruit toute notre pipeline de pré-déploiement autour d'eux.
Cet article décrit exactement notre configuration : la structure du répertoire .claude/, chaque définition de sous-agent, les configurations des hooks et les fichiers de compétences qui les lient tous ensemble. Nous allons partager quatre vrais incidents que le système a interceptés, le calcul du ROI à notre échelle et les endroits où cette approche présente encore des lacunes.
Nous avons eu une augmentation de CLS de 40% qui s'est quand même retrouvée en production
Il y a trois semaines. Refonte du blog d'un client. Tout avait l'air bien en développement. Nous avons fusionné.
Deux jours plus tard, leur CTO nous envoie une capture d'écran de Search Console. Le CLS a augmenté de 0,08 à 0,14 sur mobile. Les pages qui se classaient #3 pour « logiciel de facturation d'entreprise » sont tombées à #8. Impact sur les revenus ? Ils ont estimé 40 000 $/mois.
Le problème ? Une image de héros qui s'était chargée de façon asynchrone mais qui n'avait pas d'attributs de taille. Classique. Notre CI n'a rien détecté car nous ne vérifiions pas les décalages de mise en page sur la version d'aperçu réelle.
C'est à ce moment-là que nous avons commencé à regarder les sous-agents.
Les sous-agents sont des instances Claude Code délimitées qui s'exécutent dans une session parent avec leur propre invite système, accès aux outils et limite de tâche. Les hooks déclenchent des sous-agents à des points spécifiques -- avant qu'une commande s'exécute, après des modifications de fichiers ou sur un commit. Les compétences sont des fichiers d'instructions réutilisables (markdown) qui apprennent à Claude comment effectuer une tâche spécifique.
Anthropic a lancé la refonte le 14 avril 2025, en introduisant les Routines aux côtés de ces primitives. Pour notre cas d'utilisation, les sous-agents bruts plus les hooks nous ont donné un contrôle plus fin sur le moment exact où chaque vérification s'exécute et le contexte qu'elle reçoit.
La différence clé par rapport aux vérifications CI traditionnelles : les sous-agents peuvent raisonner sur les résultats, corréler les défaillances entre les vérifications et rédiger des résumés lisibles par l'homme. Un job CI retourne un code de sortie 0 ou 1. Un sous-agent retourne « Les données structurées sur /blog/[slug] manquent le champ dateModified, qui était présent dans la version précédente. Cela causera probablement une régression des extraits enrichis dans Google Search Console dans 3-5 jours. »
C'est tout le point.
Trois mois plus tard, notre configuration GitHub Actions nous a enfin échoué
Notre pipeline précédent était un enchevêtrement de GitHub Actions appelant Lighthouse CI, pa11y, linkinator et des scripts Node personnalisés. Ça a marché.
Plus ou moins.
Mais il avait trois problèmes.
Pas de raisonnement entre les vérifications. Si Lighthouse signalait un problème de CLS et l'analyse d'accessibilité signalait une balise alt manquante sur la même image, nous obtenions deux alertes séparées sans connexion. Les ingénieurs devaient manuellement grep les journaux CI, corréler les horodatages, comprendre que c'était le même composant.
Perte de temps.
Configuration fragile. Chaque outil avait son propre fichier de configuration, format de seuil et schéma de sortie. Mettre à jour les seuils signifiait toucher 4-6 fichiers. YAML ici. JSON là. Variables d'environnement à un troisième endroit. Une typo et tout le pipeline sort 0 quand il devrait échouer.
Pas d'explications contextuelles. Les ingénieurs obtenaient réussi/échoué. Les développeurs juniors passaient 20-40 minutes à comprendre pourquoi quelque chose a échoué et quoi faire à ce sujet. « Score d'accessibilité : 87 » ne vous dit pas quel attribut ARIA manque ou pourquoi c'est important pour les lecteurs d'écran.
Nous passerions 3 heures par semaine à déboguer les faux positifs ou à expliquer les défaillances sur Slack.
La goutte qui a fait déborder le vase ? Août 2025. Nous avons déployé une refonte de Northwind Traders à 16h un vendredi (je sais). Lighthouse a réussi. L'accessibilité a réussi. Les liens ont réussi. Nous avons déployé.
Lundi matin, leur VP Marketing nous envoie un email. « Pourquoi nos pages produit manquent-elles à Google ? » Il s'avère que nous avions accidentellement défini la méta robots sur noindex sur chaque page sous /products/. Notre CI n'a pas vérifiécles balises robots. Il a fallu six jours pour être réindexé. Ils ont perdu environ 12 000 $ de revenus estimés.
Nous n'avions pas besoin d'un autre outil CI -- nous avions besoin d'une couche d'orchestration qui pouvait raisonner sur les résultats des outils en lesquels nous faisions déjà confiance. Les fichiers de compétences bien rédigés font la différence entre un sous-agent qui hallucine les règles d'accessibilité et un qui exécute pa11y avec les bonnes options et interprète correctement la sortie JSON.
Notre structure du répertoire .claude/
Voici l'arborescence réelle :
.claude/
├── settings.json
├── agents/
│ ├── seo-regression.md
│ ├── cwv-smoke.md
│ ├── accessibility.md
│ ├── broken-links.md
│ ├── schema-validation.md
│ └── deploy-gate.md
├── skills/
│ ├── run-lighthouse.md
│ ├── run-pa11y.md
│ ├── run-linkinator.md
│ ├── parse-schema-org.md
│ ├── compare-seo-snapshot.md
│ └── format-deploy-report.md
└── snapshots/
└── seo-baseline.json
Le répertoire snapshots/ contient les données de base pour les vérifications comparatives. Simple. Nous le versionnons dans Git afin de pouvoir voir ce qui a changé quand un client demande « pourquoi les classements ont-ils baissé mardi dernier ? »
Rien de fantaisiste. Juste des fichiers markdown et JSON.
Un client a appelé à 23h car Google a supprimé tous leurs extraits enrichis
Septembre 2025. Nous construisons un site de commerce électronique pour un détaillant de taille moyenne (appelons-le Acme Home Goods). Ils avaient passé six mois à obtenir des extraits enrichis -- notes de produit, tarification, disponibilité -- apparaissant dans les résultats de recherche.
Nous poussons une mise à jour du thème Shopify. Ça a l'air bien. Déployé vendredi soir.
Samedi à 23h14, je reçois un texto. « Nos pages produit semblent cassées dans Google. Les étoiles ont disparu. Les prix ont disparu. Qu'est-ce qui s'est passé ? »
J'ouvre Search Console. Chaque page produit lance des erreurs de données structurées. Le champ offers manque priceCurrency. Sans cela, Google n'affichera pas l'extrait enrichi. Les classements n'ont pas baissé, mais le taux de clics est passé de 4,2% à 1,8% du jour au lendemain.
Coût ? Environ 8 000 $/semaine de trafic perdu jusqu'à ce que nous le corrigions et que Google recrawle tout.
Le schéma était là. Nous avons juste changé le nom de la propriété de priceCurrency à currency car l'API Shopify utilise cette clé. Nous n'y avons pas pensé. Aucune validation ne l'a détecté.
C'est là que nous avons construit le sous-agent schema-validation.
Vous créez un fichier markdown dans .claude/agents/ avec une invite système, une liste des outils autorisés et les instructions de la tâche. La session parent (ou un hook) l'instancie avec dispatch_agent() ou via la configuration du hook dans settings.json.
Structure minimale :
# Agent : [Nom]
## Rôle
[Description d'une ligne]
## Outils autorisés
- Bash (limité à des commandes spécifiques)
- Lire un fichier
- Écrire un fichier
## Instructions
[Description étape par étape de la tâche, référençant les fichiers de compétences]
## Format de sortie
[Format exact auquel le parent s'attend]
Soyez extrêmement spécifique sur le format de sortie. Si l'orchestrateur deploy-gate s'attend à JSON avec un booléen passed et une chaîne summary, précisez-le. Les sous-agents qui retournent du texte libre cassent l'orchestration. Nous avons appris cela de la mauvaise façon quand un sous-agent a retourné des tableaux markdown et que le deploy gate n'a pas pu les analyser. Il m'a fallu deux heures à 2h du matin pour déboguer car le parent a simplement échoué silencieusement. Aucune erreur. Juste n'a pas déclenché le bloc de déploiement.
Ne faites pas ma bêtise. Verrouillez le format.
Sous-agent 1 : Vérification de régression SEO
Ceci compare les éléments critiques pour le SEO de la version actuelle par rapport à un snapshot de base.
# Agent : Vérification de régression SEO
## Rôle
Détecter les régressions SEO entre la version actuelle et le snapshot de base stocké.
## Outils autorisés
- Bash (scripts node uniquement)
- Lire un fichier
## Instructions
1. Lire le fichier de compétences à .claude/skills/compare-seo-snapshot.md
2. Exécuter : node scripts/extract-seo-meta.js --url=$PREVIEW_URL --output=/tmp/seo-current.json
3. Lire .claude/snapshots/seo-baseline.json
4. Comparer les deux snapshots champ par champ :
- balises de titre (correspondance exacte)
- méta-descriptions (similarité > 0,85)
- URL canoniques (correspondance exacte)
- nombre de h1 (doit égal 1 par page)
- méta robots (ne doit pas avoir changé en noindex)
- balises Open Graph (og:title, og:description, og:image présentes)
5. Signaler toute page où robots a changé en noindex comme CRITIQUE.
6. Signaler les balises de titre manquantes ou dupliquées comme HAUTE.
7. Signaler les changements de méta description > 15% différents comme MOYEN.
## Format de sortie
{"passed": boolean, "critical": [], "high": [], "medium": [], "summary": string}
Le script extract-seo-meta.js est 120 lignes de Puppeteer qui frappe chaque page du sitemap et vide le titre, la méta, les canoniques, les h1 et les balises OG dans JSON. Rien de smart. Juste l'extraction.
La valeur du sous-agent est dans la comparaison et le raisonnement, pas dans l'extraction. Il sait quels changements importent. Lesquels sont cosmétiques. Lesquels coûteront au client 15 000 $ de trafic organique le prochain trimestre.
Exemple : si vous changez une méta description de « Meilleur logiciel CRM pour les petites entreprises en 2025 » en « Meilleur logiciel CRM pour petite entreprise », le score de similarité est de 0,91. C'est bien. Mais s'il change en « Logiciel CRM », la similarité chute à 0,65. Le sous-agent le signale comme MOYEN car c'est une réduction de 40% de la densité de mots-clés et nuira probablement au CTR.
Ce n'est pas juste un diff. C'est le raisonnement sur ce que le diff signifie.
Nous avons intercepté quatre problèmes avec ceci jusqu'à présent. Le truc du noindex robots. Un cas où quelqu'un a supprimé toutes les images OG (aurait coulé les partages sociaux). Un cas où les balises de titre ont été tronquées à 40 caractères au lieu de 60 (juste mauvais look, pas nui au SEO, mais le client aurait remarqué). Et un où les URL canoniques ont changé de https:// à http:// (aurait causé des pénalités de contenu dupliqué).
Chacun d'eux aurait coûté au moins quelques heures de nettoyage et de confiance du client. Probablement plus.
Nous stockons seo-baseline.json dans le repo et le mettons à jour dans le hook post-deploy-success.
Sous-agent 2 : Test de fumée Core Web Vitals
# Agent : Test de fumée CWV
## Rôle
Exécuter Lighthouse sur les pages clés et signaler les régressions CWV.
## Outils autorisés
- Bash
## Instructions
1. Lire .claude/skills/run-lighthouse.md
2. Exécuter Lighthouse CI contre $PREVIEW_URL pour ces pages :
- / (page d'accueil)
- /blog/ (listing)
- /blog/[post-le-plus-récent] (détail)
- /services/ (s'il existe)
3. Seuils (échouer si l'un des éléments ci-dessous) :
- LCP : 2500ms
- FID/INP : 200ms
- CLS : 0,1
- Score de performance : 85
- Score d'accessibilité : 90
4. Si une métrique a régressé de plus de 10% par rapport à l'exécution précédente,
signaler comme AVERTISSEMENT même si toujours au-dessus du seuil.
5. Inclure l'élément spécifique causant LCP ou CLS là où Lighthouse le signale.
## Format de sortie
{"passed": boolean, "pages": [{"url": string, "scores": {}, "flags": []}], "summary": string}
Le fichier de compétences associé (run-lighthouse.md) contient l'invocation exacte de la CLI lhci :
# Compétence : Exécuter Lighthouse
## Commande
```bash
npx @lhci/cli@0.14.0 collect \
--url="$1" \
--numberOfRuns=3 \
--settings.preset=desktop \
--settings.output=json \
--settings.outputPath=/tmp/lhci-results/
Analyse
Lire l'exécution médiane depuis /tmp/lhci-results/. Extraire :
- categories.performance.score * 100
- audits['largest-contentful-paint'].numericValue
- audits['cumulative-layout-shift'].numericValue
- audits['interaction-to-next-paint'].numericValue (s'il existe)
## Sous-agent 3 : Analyse d'accessibilité
```markdown
# Agent : Analyse d'accessibilité
## Rôle
Exécuter pa11y contre les URL d'aperçu et signaler les violations WCAG 2.1 AA.
## Outils autorisés
- Bash
## Instructions
1. Lire .claude/skills/run-pa11y.md
2. Exécuter pa11y sur le même ensemble de pages que l'agent CWV.
3. Regrouper les résultats par sévérité : erreur, avertissement, notice.
4. Pour chaque erreur, inclure :
- Le critère WCAG violé (par exemple, 1.1.1 Contenu non textuel)
- L'élément HTML (sélecteur)
- Une suggestion de correctif d'une phrase
5. Échouer s'il existe des erreurs. Avertir si avertissements > 10.
## Format de sortie
{"passed": boolean, "error_count": number, "warning_count": number, "errors": [{"criterion": string, "selector": string, "fix": string}], "summary": string}
Nous utilisons pa11y@8.0.0 avec le flag --runner=axe. Le runner htmlcs par défaut manque certains problèmes de contraste de couleur que axe détecte.
Sous-agent 4 : Analyse des liens cassés
# Agent : Analyse des liens cassés
## Rôle
Crawler le site d'aperçu et signaler les liens internes et externes cassés.
## Outils autorisés
- Bash
## Instructions
1. Lire .claude/skills/run-linkinator.md
2. Exécuter : npx linkinator@6.1.2 $PREVIEW_URL --recurse --timeout 15000 --format json > /tmp/link-results.json
3. Filtrer les résultats en statut >= 400 ou statut === 0 (timeout).
4. Séparer les liens cassés internes (même domaine) des liens cassés externes.
5. Les liens cassés internes sont CRITIQUE. Les liens cassés externes sont AVERTISSEMENT.
6. Exclure les domaines externes connus comme instables : twitter.com, linkedin.com (ils bloquent les crawlers).
## Format de sortie
{"passed": boolean, "internal_broken": [{"source": string, "target": string, "status": number}], "external_broken": [...], "summary": string}
Sous-agent 5 : Validation de schéma
# Agent : Validation de schéma
## Rôle
Valider les données structurées JSON-LD sur toutes les pages.
## Outils autorisés
- Bash
- Lire un fichier
## Instructions
1. Lire .claude/skills/parse-schema-org.md
2. Pour chaque page du sitemap :
a. Extraire tous les blocs <script type="application/ld+json">
b. Analyser comme JSON (échouer si malformé)
c. Valider les champs obligatoires par @type :
- Article : headline, datePublished, dateModified, author, image
- LocalBusiness : name, address, telephone
- WebPage : name, description
- BreadcrumbList : itemListElement avec position, name, item
d. Vérifier que toutes les références @id se résolvent au sein du graphique de la page
e. Valider que les URL dans le schéma sont absolues, pas relatives
3. Signaler les champs obligatoires manquants comme HAUTE.
4. Signaler le JSON malformé comme CRITIQUE.
## Format de sortie
{"passed": boolean, "pages": [{"url": string, "schemas": [{"type": string, "valid": boolean, "issues": []}]}], "summary": string}
Sous-agent 6 : Orchestrateur de deploy gate
Cet agent parent instancie les cinq autres et prend la décision go/no-go.
# Agent : Deploy Gate
## Rôle
Orchestrer toutes les vérifications pré-déploiement et produire une décision de déploiement finale.
## Outils autorisés
- Bash
- Lire un fichier
- Écrire un fichier
- dispatch_agent
## Instructions
1. Instancier ces agents en parallèle :
- .claude/agents/seo-regression.md
- .claude/agents/cwv-smoke.md
- .claude/agents/accessibility.md
- .claude/agents/broken-links.md
- .claude/agents/schema-validation.md
2. Collecter toutes les sorties.
3. Lire .claude/skills/format-deploy-report.md
4. Logique de décision :
- Si UN agent a un drapeau CRITIQUE : BLOQUER le déploiement.
- Si 2+ agents ont des drapeaux HAUTE : BLOQUER le déploiement.
- Si 1 agent a un drapeau HAUTE : AVERTIR, demander un remplacement manuel.
- Sinon : APPROUVER.
5. Écrire le rapport complet dans /tmp/deploy-report.md
6. Sortir la décision.
## Format de sortie
{"decision": "APPROVE" | "WARN" | "BLOCK", "reports": {agent_name: agent_output}, "summary": string}
Configuration des hooks : settings.json
Voici notre vrai settings.json (avec les URL spécifiques aux clients supprimées) :
{
"hooks": {
"pre-commit": [
{
"agent": ".claude/agents/schema-validation.md",
"condition": "files_changed_match('**/*.json', '**/structured-data/**')",
"env": {
"PREVIEW_URL": "http://localhost:3000"
}
}
],
"pre-push": [
{
"agent": ".claude/agents/deploy-gate.md",
"env": {
"PREVIEW_URL": "$VERCEL_PREVIEW_URL"
},
"timeout": 300,
"on_failure": "block"
}
],
"post-deploy-success": [
{
"command": "node scripts/extract-seo-meta.js --url=$PRODUCTION_URL --output=.claude/snapshots/seo-baseline.json",
"description": "Update SEO baseline after successful deploy"
}
]
},
"agent_defaults": {
"model": "claude-sonnet-4-20250514",
"max_tokens": 8192,
"timeout": 120
},
"skills_directory": ".claude/skills/"
}
Notes sur cette configuration :
- Nous utilisons
claude-sonnet-4-20250514pour les sous-agents, pas Opus. Les tâches de raisonnement ici ne justifient pas la différence de coût. Sonnet gère « comparer deux objets JSON et signaler les différences » correctement. - Le
timeout: 300sur le deploy gate donne à tous les cinq sous-agents le temps de s'exécuter. Les agents individuels ont des valeurs par défaut de 120s. L'orchestrateur obtient 5 minutes car il attend tous. - La
conditionsur le hook pre-commit signifie que la validation de schéma s'exécute uniquement quand vous touchez des fichiers liés aux schémas. Inutile de l'exécuter sur un changement CSS. post-deploy-successmet à jour le snapshot de base. Sans cela, votre vérification de régression SEO compare par rapport à des données obsolètes.
Définitions de compétences qui lient tout ensemble
Le fichier de compétences qui fait le plus de travail est compare-seo-snapshot.md :
# Compétence : Comparer les snapshots SEO
## Objectif
Comparer deux snapshots de métadonnées SEO et identifier les régressions.
## Entrée
- Snapshot actuel : /tmp/seo-current.json
- Snapshot de base : .claude/snapshots/seo-baseline.json
## Règles de comparaison
### Balises de titre
- Si un titre a changé ET le trafic organique de la page (à partir des métadonnées de base) > 1000 sessions/mois, signaler comme HAUTE.
- Si un titre est maintenant vide ou correspond au titre d'une autre page, signaler comme CRITIQUE.
- Si un titre a changé sur une page à faible trafic, signaler comme MOYEN.
### URL canoniques
- Tout changement d'URL canonique est HAUTE.
- Une canonique pointant vers un domaine différent est CRITIQUE.
- Une canonique manquante (était présente, maintenant disparue) est HAUTE.
### Méta Robots
- Toute page qui a gagné « noindex » est CRITIQUE.
- Toute page qui a gagné « nofollow » sur les liens internes est HAUTE.
### Nouvelles pages
- Les pages actuelles mais non dans le snapshot de base sont INFO (attendu pour le nouveau contenu).
- Mais vérifier qu'elles ont : titre, méta description, canonique, au moins un h1.
### Pages supprimées
- Les pages dans le snapshot de base mais pas dans la version actuelle sont HAUTE.
- Ceux-ci pourraient indiquer une suppression de route accidentelle.
Ce fichier de compétences encode des mois de réponse aux incidents SEO dans un format que Claude peut suivre de manière fiable. Sans lui, le sous-agent ferait des jugements raisonnables mais incohérents sur ce qui constitue une régression.
Quatre incidents que le système a interceptés
Incident 1 : Noindex accidentel sur 47 articles de blog
Client : Entreprise B2B SaaS, 200 pages, 60k sessions organiques/mois.
Un développeur a mis à jour le composant <Head> dans le modèle de blog pour ajouter une nouvelle balise méta. Il a copié-collé depuis la configuration de staging, qui avait <meta name="robots" content="noindex, nofollow"> codé en dur. Le changement a passé la révision de code car le critique s'est concentré sur la nouvelle balise, pas sur les existantes.
Le sous-agent de régression SEO a signalé 47 pages comme CRITIQUE -- la méta robots a changé en noindex. Le déploiement a été bloqué.
Temps de détection : 2 minutes 14 secondes après le push. Sans le système, il aurait été détecté quand Search Console aurait montré une baisse de couverture 3-7 jours plus tard.
Impact estimé évité : Ces 47 articles ont généré environ 14 000 $/mois de pipeline. Même un événement de déindex d'une semaine aurait pu coûter 3 500 $ +.
Incident 2 : Régression CLS à partir d'une nouvelle image de héros
Client : Marque de commerce électronique, storefront Next.js 14 sur Shopify Hydrogen.
L'équipe design a échangé le héros de la page d'accueil avec une nouvelle image avec un rapport d'aspect différent mais n'a pas mis à jour les attributs width/height du composant <Image>. L'image s'est chargée correctement mais a causé un CLS de 0,34 -- bien au-dessus du seuil de 0,1.
Le sous-agent de test de fumée CWV a signalé une régression CLS sur la page d'accueil. Le résumé a spécifiquement appelé : « CLS causé par l'élément img.hero-banner se déplaçant de 0,34 cumulatif. Les dimensions de l'image (1920x800) ne correspondent pas au rapport d'aspect du conteneur (16:9 = 1920x1080). Ajouter une largeur explicite={1920} hauteur={800} ou mettre à jour le rapport d'aspect du conteneur. »
Temps de détection : 1 minute 47 secondes.
Incident 3 : Liens internes cassés après restructuration d'URL
Client : Cabinet de services professionnels, 80 pages.
Nous avons restructuré leurs pages de services de /services/[name] à /[category]/[name]. Les redirections étaient en place, mais trois articles de blog avaient des liens codés en dur vers les anciennes URL, et la navigation gérée par CMS avait une entrée en cache pointant vers une page supprimée.
L'analyse des liens cassés a trouvé 4 404s internes. Le résumé du sous-agent a noté que 3 des 4 étaient dans le contenu du corps de l'article de blog (pas la navigation), ce qui signifiait qu'ils avaient été manqués par l'audit de redirection.
Temps de détection : 3 minutes 8 secondes. Le crawl linkinator est la partie la plus lente.
Incident 4 : DateModified manquante dans le schéma Article
Client : Entreprise de médias, 2 000 articles.
Une migration CMS de WordPress vers Sanity a perdu le mappage du champ dateModified. Le code de génération de schéma s'est replié sur null pour dateModified, ce qui a produit du JSON-LD invalide.
Le sous-agent de validation de schéma a signalé chaque page d'article comme HAUTE -- champ dateModified obligatoire manquant. Le résumé expliquait : « Google exige dateModified pour que les données structurées Article soient éligibles à Top Stories et aux résultats enrichis. Les 2 147 pages d'article sont affectées. »
Temps de détection : 4 minutes 22 secondes (grand sitemap).
ROI : minutes économisées par expédition et dollars par mois
Voici nos calculs :
| Métrique | Avant (CI + manuel) | Après (sous-agents) | Delta |
|---|---|---|---|
| Vérifications par déploiement | 4 outils, révision manuelle | 5 agents, automatisés | +1 vérification, -100% révision manuelle |
| Temps pour exécuter toutes les vérifications | 8-12 min (CI séquentiel) | 3-5 min (sous-agents parallèles) | -60% |
| Temps pour comprendre les défaillances | 20-40 min par défaillance | 1-2 min (résumé contextuel) | -90% |
| Déploiements par semaine (tous les clients) | 18 | 18 | Même |
| Taux de faux positifs | ~15% (Lighthouse bruyant) | ~4% (filtres de raisonnement du bruit) | -73% |
Minutes économisées par expédition : En moyenne 25 minutes quand une vérification échoue (30% des déploiements). C'est 25 × 5,4 déploiements échouant/semaine = 135 minutes/semaine = 9 heures/mois.
Coût du système :
- Coûts API Claude pour les sous-agents : ~0,12 $ par exécution complète du deploy gate (5 agents, Sonnet, 6 000 tokens moyens par agent)
- 18 déploiements/semaine × 4,3 semaines × 0,12 $ = 9,29 $/mois en coûts API
- Infrastructure Puppeteer/Lighthouse : s'exécute sur les instances de build Vercel existantes, aucun coût ajouté
- Temps de maintenance : ~2 heures/mois pour mettre à jour les fichiers de compétences et les seuils
Valeur en dollars du temps d'ingénieur économisé : 9 heures/mois × 85 $/heure (taux mixte pour notre équipe) = 765 $/mois économisés.
Valeur en dollars des incidents évités : D'après les quatre incidents ci-dessus, l'incident noindex seul aurait pu coûter 3 500 $. Si nous prévenons un incident comme celui-ci par trimestre, c'est 1 166 $/mois en impact client évité.
ROI net : 1 920 $/mois en valeur pour 9,29 $/mois en coûts API. C'est un rendement de 206x. Même si vous multipliez par 10 les coûts API pour une équipe plus grande, c'est toujours favorable.
Lacunes et ce que nous changerions
Ce système n'est pas parfait. Voici ce qui pose toujours problème :
Pas de test de régression visuelle. Les sous-agents peuvent exécuter Lighthouse et pa11y mais ne peuvent pas regarder les captures d'écran et dire « la section héros est cassée ». Nous regardons les capacités de vision de Claude pour cela.
Dérive du snapshot de base. Le snapshot SEO se met à jour sur le déploiement réussi, mais si vous déployez une régression que le système ne détecte pas, elle devient le nouveau snapshot de base. Nous examinons manuellement les snapshots mensuellement.
Instabilité des liens externes. Twitter/X, LinkedIn et certains sites gouvernementaux bloquent les crawlers ou appliquent un taux limite agressivement. Nous maintenons une liste d'exclusion, mais elle nécessite des mises à jour manuelles.
Temps de démarrage à froid. La première exécution après le clonage d'un repo prend plus de temps car npx doit récupérer les paquets. Nous envisageons de pré-installer les outils CLI dans une couche Docker.
Limites de taux Anthropic. L'instanciation de 5 sous-agents simultanément peut occasionnellement atteindre les limites de taux de l'API Claude pendant les heures de pointe. Nous avons ajouté un décalage de 2 secondes entre les instanciations, ce qui fonctionne mais n'est pas élégant.
Nos définitions d'agent plus longues (la validation de schéma fait 400 mots) produisent parfois une sortie moins structurée que les plus courtes. Nous envisageons de diviser l'agent de validation de schéma en sous-sous-agents par type.
FAQ
Les sous-agents Claude Code fonctionnent-ils avec n'importe quel LLM, ou seulement Claude ?
Les sous-agents sont une fonctionnalité Claude Code liée à l'API d'Anthropic. Vous avez besoin d'une clé API Claude avec accès à Claude Code. Le format de définition d'agent est spécifique à la convention du répertoire .claude/ de Claude Code, pas à une norme générale.
Combien coûte l'exécution de cinq sous-agents par déploiement en frais API ?
À notre échelle, environ 0,12 $ par exécution complète du deploy gate en utilisant Claude Sonnet. C'est environ 9-10 $/mois pour 18 déploiements par semaine. Opus coûterait environ 5x plus cher mais nous n'avons pas trouvé nécessaire pour ces tâches.
Les sous-agents peuvent-ils s'exécuter dans les pipelines CI/CD comme GitHub Actions ?
Oui. Vous pouvez invoquer Claude Code sans interface graphique dans un environnement CI. Nous déclenchons le nôtre au déploiement d'aperçu Vercel en attente via un webhook qui appelle claude-code run .claude/agents/deploy-gate.md avec l'URL d'aperçu comme variable d'environnement.
Quelle est la différence entre une compétence Claude Code et un sous-agent ?
Une compétence est un fichier d'instructions markdown qui apprend à Claude comment faire quelque chose -- comme une recette. Un sous-agent est une instance Claude isolée qui peut être instanciée avec son propre contexte et outils. Les sous-agents utilisent les compétences. Pensez aux compétences comme de la documentation et aux agents comme des travailleurs.
Avez-vous besoin de la fonctionnalité Routines d'Anthropic ou les sous-agents bruts suffisent-ils ?
Pour notre workflow de deploy gate, les sous-agents bruts plus les hooks dans settings.json suffisent. Les Routines ajoutent une couche d'orchestration de plus haut niveau utile pour les workflows multi-étapes plus complexes. Nous pourrions adopter les Routines si nos vérifications de déploiement dépassent les six agents.
Comment gérez-vous les défaillances ou les timeouts des sous-agents ?
Chaque sous-agent a un timeout de 120 secondes. Si un sous-agent échoue ou expire, l'orchestrateur deploy gate le traite comme un AVERTISSEMENT, pas un BLOC. Nous préférerions déployer avec une vérification incomplète plutôt que bloquer les déploiements car Lighthouse s'est bloqué. Le résumé note quelles vérifications n'ont pas abouti.
Cette approche peut-elle remplacer les outils dédiés comme Lighthouse CI ou pa11y ?
Non -- elle les enveloppe. Les sous-agents appellent ces outils via bash puis raisonnent sur la sortie. Vous devez toujours installer les outils sous-jacents. La valeur est dans la couche d'orchestration, de corrélation et de rapportage en langage naturel, pas dans le remplacement des scanners eux-mêmes.