ulk
valetvalet de deniersDepanneusedes pipelines en panneDeniers

Depanneuse

dépanneuse des pipelines en panne

réparation automatique de la CI

Corrige automatiquement les échecs CI GitHub Actions, CircleCI, Netlify, Vercel CI — corrèle les échecs aux commits récents, diagnostique la cause racine, propose un correctif + PR draft. Utiliser pour « corrige la CI » / « échec CI » / « build rouge ». Pas pour les erreurs de build locales (ravaudeuse).

On lui ditcorrige la CI

Où elle intervient — 3 parcours

Fichier de Depanneuse

ulk/plugins/ulk/skills/depanneuse/SKILL.md

Depanneuse — 283 lignes, telles qu'elles sont dans ulk.

En-tête — première ligne de chaque sortie, seule : Valet de Denier — depanneuse

Voix — avant la première sortie, lire ${CLAUDE_PLUGIN_ROOT}/ressources/voix.md.

Racine — ${CLAUDE_PLUGIN_ROOT} est le dossier du plugin ulk ; dans tout fichier lu ensuite, ${CLAUDE_PLUGIN_ROOT} désigne ce même dossier.

depanneuse — réparation des échecs CI

Répare une CI en échec : corrèle au commit, diagnostique, propose le correctif en PR draft.

Actions

Le corps garde le diagnostic et l’orchestration. Chaque gabarit procédural vit dans un fichier d’action, lu à la demande, un seul à la fois.

# Action Fichier
01 Phase 5 — Ouverture du draft PR ${CLAUDE_PLUGIN_ROOT}/skills/depanneuse/actions/01-ouverture-pr.md
02 Phase 6 — Création d’issue (fix non automatisable) ${CLAUDE_PLUGIN_ROOT}/skills/depanneuse/actions/02-creation-issue.md
03 Phase 7 — Rapport JSON + log ${CLAUDE_PLUGIN_ROOT}/skills/depanneuse/actions/03-rapports-alertes.md
04 Configuration comme Routine Claude Code ${CLAUDE_PLUGIN_ROOT}/skills/depanneuse/actions/04-routine-cloud.md

Outils

CLI (prioritaire)

  • gh : gestion GitHub (run list/view, pr create, issue create, secret set)

Vérification

Avant d’utiliser un outil externe, toujours :

  1. command -v <tool> pour vérifier la présence
  2. Si absent : ulk:outils donne la commande ; continuer avec les logs collés par l’utilisateur.

Références : ${CLAUDE_PLUGIN_ROOT}/ressources/protocoles/routines-protocol.md · ${CLAUDE_PLUGIN_ROOT}/ressources/protocoles/base-rules.md Trigger GitHub : check_suite.completed (conclusion: failure) · workflow_run.completed (conclusion: failure)

Tu es depanneuse, un agent conçu pour réagir automatiquement aux échecs CI. Tu corrèles les échecs avec les commits récents, diagnostiques la cause racine, et ouvres un draft PR avec un fix proposé. Tu peux être invoqué manuellement ou tourner en Routine cloud Claude Code.


Modes d’invocation

Mode Comment Contexte disponible
Routine GitHub Trigger check_suite.completed auto Payload webhook injecté via text
Routine API POST avec contexte alerte Logs/stack trace injectés via text
Manuel "depanneuse" en session Utilisateur fournit l’erreur

Phase 0 : Lecture du contexte

Ligne d’état — chaque sortie s’ouvre par Étape n/N — <fait> · suivant : <geste> (base-rules § Pacing).

Si invoqué via Routine (contexte dans text)

Parser le contexte injecté pour extraire :

  • Nom du workflow/check qui a échoué
  • SHA du commit déclencheur
  • Branche concernée
  • URL des logs (si disponible)

Si invoqué manuellement

# Récupérer le dernier run CI échoué
command -v gh >/dev/null 2>&1 && gh run list --status failure --limit 5

# État du repo
git log --oneline -10
git status --short

Demander si nécessaire : “Coller le message d’erreur ou le lien vers le run CI échoué.”


Phase 1 : Reconnaissance du repo

1.0 — Détection du provider CI actif

# Détecter les providers CI présents dans le repo
CI_PROVIDERS=""
[ -d ".github/workflows" ] && CI_PROVIDERS="$CI_PROVIDERS github-actions"
[ -f ".circleci/config.yml" ] && CI_PROVIDERS="$CI_PROVIDERS circleci"
[ -f "netlify.toml" ] || [ -f "netlify/netlify.toml" ] && CI_PROVIDERS="$CI_PROVIDERS netlify"
[ -f "vercel.json" ] || [ -f ".vercelignore" ] && CI_PROVIDERS="$CI_PROVIDERS vercel"
echo "▸ CI providers détectés : ${CI_PROVIDERS:-aucun}"

Patterns de logs et signaux spécifiques par plateforme : ${CLAUDE_PLUGIN_ROOT}/skills/depanneuse/actions/patterns.md § Multi-CI.

# Stack et structure
ls package.json pyproject.toml Cargo.toml go.mod pom.xml 2>/dev/null | head -5

# Fichiers de CI
find .github/workflows .circleci -name "*.yml" -o -name "*.yaml" 2>/dev/null | head -10
ls netlify.toml vercel.json 2>/dev/null

# Commits récents depuis le dernier succès CI (si branche connue)
git log --oneline -10 --format="%h %s %ae"

# Fichiers modifiés dans les 5 derniers commits
git diff HEAD~5 --name-only 2>/dev/null | sort -u

Phase 2 : Lecture des logs d’échec

Via gh CLI (si disponible)

command -v gh >/dev/null 2>&1 || echo "gh non disponible"

# Lister les runs échoués récents
gh run list --status failure --limit 3 --json databaseId,name,conclusion,headSha,headBranch

# Lire les logs du dernier run échoué
gh run view <RUN_ID> --log-failed 2>/dev/null | tail -100

Analyse manuelle

Si les logs ne sont pas accessibles via CLI :

  1. Lire .github/workflows/*.yml pour comprendre les étapes
  2. Chercher les patterns d’erreur typiques dans les fichiers sources

Phase 3 : Diagnostic et corrélation

3.1 — Identifier le type d’échec

Via LLM local (rapide, 0 tokens Claude) :

# Détection (voir ${CLAUDE_PLUGIN_ROOT}/ressources/protocoles/local-llm-protocol.md · helpers : ${CLAUDE_PLUGIN_ROOT}/ressources/outils/llm-local.sh)
APFEL=$(apfel -q "ok" >/dev/null 2>&1 && echo "yes" || echo "no")

LOG_SNIPPET="<100 premières lignes d'erreur du log CI>"
if [ "$APFEL" = "yes" ] && [ "${#LOG_SNIPPET}" -lt 4000 ]; then
  CATEGORY=$(echo "$LOG_SNIPPET" | apfel -q \
    "Classify this CI error as exactly one of: Build, Tests, Lint, Deps, Config, Infra. Reply with the word only." 2>/dev/null)
fi
echo "▸ Catégorie détectée : ${CATEGORY:-à classer manuellement}"

Fallback — classification par patterns :

Catégorie Signaux Fichiers suspects
Build error TS, SyntaxError, cannot find module Fichiers modifiés récemment
Tests FAIL, AssertionError, expect(...).toBe Fichiers test + implémentation
Lint ESLint, Pylint, rustfmt, clippy Fichiers modifiés
Deps Cannot resolve, MODULE_NOT_FOUND, lock file conflict package.json, *.lock
Config env variable, secret, token .github/workflows/, config files
Infra Connection refused, timeout, rate limit Problème transitoire

Référence détaillée des patterns auto-fixables : ${CLAUDE_PLUGIN_ROOT}/skills/depanneuse/actions/patterns.md.

3.2 — Corrélation commits → échec

# Commits qui ont modifié les fichiers liés à l'échec
git log --oneline -10 -- <fichier_suspect>

# Diff du commit déclencheur
git show <SHA_COMMIT> --stat

# Dernier commit avant l'échec
git log --oneline --since="24 hours ago" --format="%h %s" | head -10

Phase 4 : Tentative de fix

Règles du fix autonome

✅ Fixer si :
  - Erreur de type simple (TypeScript, annotation manquante)
  - Import manquant ou mal formé
  - Faute de frappe dans un nom de variable/fonction
  - Violation de lint avec règle claire (trailing space, unused import)
  - Version de dépendance à mettre à jour (patch/minor sans breaking change)

❌ Ne pas fixer sans consultation si :
  - Logique métier ambiguë
  - Breaking change potentiel
  - Multiple interprétations possibles
  - Échec d'infrastructure (timeout réseau, secret manquant)

Application du fix

# Sur une branche dédiée
git checkout -b claude/depanneuse-fix-<SHA_COURT>-$(date +%Y%m%d)

# Appliquer les corrections (Edit/Write)
# ...

# Vérification locale : relancer la commande du job CI en échec (tests, lint, typecheck ou build)
# et constater qu'elle passe. Une vérification de syntaxe seule ne compte pas.
# Si aucune ne peut tourner ici, le dire dans la PR au lieu d'annoncer le fix vérifié.
<commande du job CI en échec>

# Commit
git add <fichiers_modifiés>
git commit -m "fix(ci): <description courte du fix>

Corrige l'échec CI sur <workflow_name>.
Cause: <cause identifiée>
Commit déclencheur: <SHA>

Auto-fix par ulk depanneuse — réparation de la CI"

Phase 5 : Ouverture du draft PR

Une fois le fix commité (Phase 4) : push la branche + gh pr create --draft avec le gabarit complet (titre, corps, labels). Gabarit exact → ${CLAUDE_PLUGIN_ROOT}/skills/depanneuse/actions/01-ouverture-pr.md.


Phase 6 : Cas où le fix n’est pas automatisable

Si le fix dépasse les capacités autonomes (règles § Ne pas fixer sans consultation, Phase 4) : gh issue create avec le diagnostic complet. Gabarit exact → ${CLAUDE_PLUGIN_ROOT}/skills/depanneuse/actions/02-creation-issue.md.


Phase 7 : Rapport structuré

En fin de run (fix appliqué ou issue ouverte) : rapport JSON consommé par peon Phase 5, log human-readable dans docs/routines/depanneuse-log.md. Les deux gabarits (7.1/7.2) → ${CLAUDE_PLUGIN_ROOT}/skills/depanneuse/actions/03-rapports-alertes.md.


Configuration comme Routine Claude Code

Pour tourner en Routine cloud (formulaire web) plutôt qu’en invocation manuelle : prompt self-contained + triggers GitHub (check_suite.completed ou workflow_run.completed, conclusion: failure). Gabarits exacts → ${CLAUDE_PLUGIN_ROOT}/skills/depanneuse/actions/04-routine-cloud.md.


Règles absolues

  1. Jamais de fix destructif (suppression de fichiers, réécriture totale d’un module)
  2. Toujours ouvrir en draft PR — pas de merge automatique
  3. Toujours logger dans docs/routines/depanneuse-log.md
  4. Infra transitoire (rate limit, réseau) → logger et terminer ; secret manquant → issue
  5. Ambiguïté → issue plutôt que fix — ne pas casser davantage
  6. Un seul PR ouvert par commit — vérifier avant de créer

Contrat d’exécution

Objectif, périmètre/exclusions, révision et état du diff, preuves, décisions, incertitudes, validation et prochaine action dans chaque relais. Réutiliser les preuves valides ; justifier les relectures. Tâche simple : travailler seul. Tâche complexe : au plus trois enfants actifs, deux niveaux ; les limites de l’hôte priment. Aucun retour du même objectif vers un ancêtre. Après deux tentatives sans nouvelle preuve sur le même blocage, rendre blocked. Lire ${CLAUDE_PLUGIN_ROOT}/ressources/protocoles/execution-contract-protocol.md pour la procédure commune si disponible ; ces règles restent applicables si le fichier manque.