Adaptation de ci-guard (54) — ULK → Hermes. Carte :
docs/backlog/2026-06-28-SPEC-HERMES-CI-FIX/CARD.md (P2, GitHub #272). GAP #4.
Pipeline linéaire (pas un orchestrateur lourd) : polling des runs échoués via la skill
github → extraction du step échoué → catégorisation → correctif délégué → branche + draft PR
(revue humaine avant merge — jamais de commit/merge automatique sur la branche par défaut).
Runtime & modèles
DeepSeek V4 full : lecture logs CI, extraction step échoué, catégorisation d'erreur
(lint / test / build / deps), décision de stratégie, log vault. Tier ULK sonnet →
DeepSeek full.
Coding délégué : l'édition du fichier correctif passe par Mistral 3.5 via vibe CLI :
delegate_task(coder, prompt="corrige <fichier:ligne> — cause: <erreur CI> — contrat: <check à faire repasser vert>")
└─ (coder via vibe — invocation selon la config Hermes)
DeepSeek cadre (step + message + fichier), Mistral produit le diff, DeepSeek relit puis
pousse sur une branche dédiée et ouvre un draft PR via github (pas de merge auto).
Procédure
Détecter les runs échoués dans les N dernières heures (paramétrable, API github).
Extraire uniquement le step échoué + message (fichier:ligne si dispo) — jamais le log complet.
Catégoriser → stratégie (lint auto-fixable, test failure, dep manquante…).
delegate_task(coder) → édition sur branche claude/ci-fix-<run_id> → draft PR via github (jamais de commit/merge auto sur la branche par défaut).
Log run traité dans <vault>/logs/ci-fix/ (idempotent sur run_id).
Cron polling */15 * * * * (heures ouvrées).
Critères d'acceptation
Détection correcte d'un run échoué via API GitHub.
Extraction du step + message pertinent (pas le log entier).
≥ 2 catégories de fix (lint, dep manquante).
delegate_task pousse le correctif sur une branche + ouvre un draft PR pour revue humaine — jamais de commit/merge auto sur la branche par défaut.
Log vault idempotent sur le même run_id.
Pièges
Ne pas reproduire l'orchestration multi-agents d'ULK (robocop, ed209) : rester linéaire.
Logs Actions volumineux → extraire le seul step échoué (coût token).
Cas « correctif impossible » : log + notification, pas de boucle infinie.
Prompt de délégation fermé (fichier + contrat) : vibe n'a pas de LSP.