# Activity Log · 2026-07-31 · Claude Code DTP ## Session `20260731_005934` · Buffer S8 · Intégrité du câblage CI — le gate d'agrégat verrouille TOUS les jobs (gates statiques compris) **Tâche** : **Sprint 8 · buffer L75 (« Regression tests exhaustifs » · DevOps CI/CD)**. Roadmap fonctionnellement close (21/21 modules à 100/100, 534 tests verts, **5** gates statiques tous verts au démarrage). Poursuite de la série anti-dérive (INV4, fraîcheur matrice, reproductibilité artefacts) : recherche d'un **trou de câblage réel** plutôt qu'un correctif cosmétique. ### Défaut trouvé — les gates STATIQUES n'étaient gardés par aucun invariant d'appartenance au gate - **Constat** : le job `gate` (`needs: [...]`) est le **seul verrou de merge** — un check absent de son `needs:` ne bloque **rien**, même rouge. Les deux couvertures existantes (`audit_4big/registry.coverage_report`, `qa/regression/discovery. coverage_report`) prouvent l'appartenance au gate **uniquement** pour les jobs de **module** (ceux portant un `working-directory:` sous `05_deliverables_mvp`). Les **5 gates statiques** (`constraints-guard`/`validate-json`/`check-docs`/ `check-artifacts`/`check-regression` → scripts `ci/*.sh`) **n'ont pas** de working-directory : **rien** ne garantissait qu'ils alimentent le gate. Retirer l'un d'eux de `needs:` (ou une **typo** dans la liste, ou un `ci/*.sh` **décâblé**) rendait le gate **vert en se court-circuitant** — même classe de dérive silencieuse que INV4 (orphan_tests_dirs), côté **câblage CI**. - **Fix** : nouveau gate `ci/check_ci_integrity.sh` (bash/awk/git, stdlib pur, zéro réseau) + job CI `check-ci-integrity`, lui-même ajouté à `gate.needs`. Deux invariants, lus par FAITS dans `ci.yml` (jamais une liste à la main) : - **INV-A** : `gate.needs` == { tous les jobs définis } − { `gate` } − { jobs **manuels** `if: … workflow_dispatch …`, ex. `e2e-baseline` légitimement hors du gate push/PR }. Détecte **MISSING** (job oublié → ne bloque pas), **DANGLING** (référence fantôme : typo / job supprimé) et **MANUAL-IN-GATE** (job manuel dans `needs` → gate en attente perpétuelle sur push). - **INV-B** : chaque `ci/*.sh` du dépôt est lancé par exactement un job (`run: bash ci/