diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index b80d36f..72bffd9 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -77,6 +77,26 @@ jobs: - name: Contrôle fraîcheur matrice de régression run: bash ci/check_regression.sh + # -------------------------------------------------------------------------- + # Intégrité du câblage CI (Sprint 8 buffer). Le job `gate` ci-dessous est le + # SEUL verrou de merge : un check absent de son `needs:` ne bloque rien, même + # rouge. Les couvertures existantes (audit_4big/registry · qa/regression/ + # discovery) ne prouvent l'appartenance au gate que des jobs de MODULE (ceux + # portant un `working-directory:`). Ce gate ferme le trou côté gates STATIQUES + # (les `ci/*.sh` sans working-directory) : il prouve, en lisant ci.yml, que + # `gate.needs` == { tous les jobs } − { gate } − { jobs manuels workflow_dispatch } + # (aucun oubli ni référence fantôme) et que chaque `ci/*.sh` du dépôt est lancé + # par un job du gate. Même classe d'anti-dérive que INV4, appliquée au câblage. + # stdlib pur (bash/awk/git), zéro réseau. + # -------------------------------------------------------------------------- + check-ci-integrity: + name: Intégrité du câblage CI (gate agrège tout · gates statiques verrouillés) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Contrôle intégrité du câblage CI + run: bash ci/check_ci_integrity.sh + # -------------------------------------------------------------------------- # Publiciste (Sprint 2) : parser faisabilité → projets_master.json + generator. # Tests unitaires stdlib pur (unittest) → aucune installation pip requise sur @@ -462,7 +482,7 @@ jobs: gate: name: Gate qualité (agrégat) runs-on: ubuntu-latest - needs: [constraints-guard, validate-json, check-docs, check-artifacts, check-regression, publiciste-tests, rbac-tests, faisabilite-gen-tests, rbac-fixtures-tests, rbac-userperm-tests, rbac-roleprofile-tests, rbac-applyplan-tests, bancable-tests, crm-workflow-vente-tests, crm-dossier-vente-tests, crm-commissions-tests, fiscal-ecf-tests, frontend-portails-tests, legal-confotur-tests, qa-audit-5d-tests, seo-tests, chat-otoia-tests, qa-audit-4big-tests, demo-scenario-tests, qa-regression-tests, devops-deploy-runbook-tests, qa-acceptance-tests] + needs: [constraints-guard, validate-json, check-docs, check-artifacts, check-regression, check-ci-integrity, publiciste-tests, rbac-tests, faisabilite-gen-tests, rbac-fixtures-tests, rbac-userperm-tests, rbac-roleprofile-tests, rbac-applyplan-tests, bancable-tests, crm-workflow-vente-tests, crm-dossier-vente-tests, crm-commissions-tests, fiscal-ecf-tests, frontend-portails-tests, legal-confotur-tests, qa-audit-5d-tests, seo-tests, chat-otoia-tests, qa-audit-4big-tests, demo-scenario-tests, qa-regression-tests, devops-deploy-runbook-tests, qa-acceptance-tests] steps: - name: Résultat run: echo "✅ Gate qualité 4Big franchi — tous les checks verts." diff --git a/05_activity_log/2026-07-31.md b/05_activity_log/2026-07-31.md index a9ebe29..4d8d727 100644 --- a/05_activity_log/2026-07-31.md +++ b/05_activity_log/2026-07-31.md @@ -1,5 +1,70 @@ # 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/