[DTP-Worker] Sprint 8 · buffer L75 · Fix "vert trompeur" : les 6 gates ci/*.sh passaient exit 0 VERT hors d'un arbre git (cd "$(git rev-parse …)" → cd "" no-op succès → git ls-files vide → 0 fichier contrôlé). Helper partagé ci/lib.sh::cd_repo_root échoue bruyamment (exit 3). INV-B (check_ci_integrity) durci : un ci/*.sh est câblé s'il est lancé par un job OU sourcé par un gate (prouve que lib.sh n'est pas mort).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
+17
-3
@@ -93,9 +93,11 @@ ne bloque **rien**, même rouge. Deux invariants :
|
||||
**oublié** du gate (MISSING → ne bloque pas), une **référence fantôme** (DANGLING →
|
||||
typo / job renommé-supprimé) et un job **manuel** glissé dans `needs` (gate en
|
||||
attente perpétuelle sur push).
|
||||
- **INV-B** — chaque script `ci/*.sh` du dépôt est lancé par exactement un job
|
||||
(`run: bash ci/<script>`), lui-même dans `gate.needs`. Un nouveau gate statique
|
||||
**non câblé** (script mort) ou **décâblé** casse le check.
|
||||
- **INV-B** — chaque script `ci/*.sh` du dépôt est **câblé** : soit lancé par un job
|
||||
(`run: bash ci/<script>`) lui-même dans `gate.needs`, soit **sourcé** par ≥1 gate
|
||||
script (lib partagée `ci/lib.sh` — jamais un job propre). Un nouveau gate statique
|
||||
**non câblé** (script mort) ou **décâblé**, ou une **lib morte** (sourcée par
|
||||
personne), casse le check.
|
||||
|
||||
Ferme le trou laissé par les couvertures existantes (`audit_4big/registry`,
|
||||
`qa/regression/discovery`) qui ne prouvent l'appartenance au gate que des jobs de
|
||||
@@ -103,6 +105,18 @@ Ferme le trou laissé par les couvertures existantes (`audit_4big/registry`,
|
||||
working-directory n'étaient gardés par personne. Même classe d'anti-dérive que INV4
|
||||
(disque→CI), appliquée au **câblage** CI. stdlib pur (bash/awk/git), zéro réseau.
|
||||
|
||||
### `lib.sh` — helper partagé (sourcé, jamais exécuté seul)
|
||||
Les 6 gates commençaient tous par `cd "$(git rev-parse --show-toplevel)"`. **Hors**
|
||||
d'un arbre de travail git (tarball, `git archive | tar -x`, `git` absent du PATH),
|
||||
`git rev-parse` n'écrit rien → `cd ""` est un **no-op qui RETOURNE SUCCÈS** : le gate
|
||||
poursuivait, `git ls-files` renvoyait une liste **vide**, et `validate_json` /
|
||||
`guard_constraints` / `check_docs` sortaient **exit 0 VERT en n'ayant RIEN
|
||||
contrôlé** — le pire « vert trompeur ». `ci/lib.sh` factorise ce préambule dans
|
||||
`cd_repo_root`, qui **échoue bruyamment** (exit `3`, code distinct d'un échec de
|
||||
contrôle `1`) hors d'un checkout git. `check_ci_integrity` (INV-B) prouve que
|
||||
`lib.sh` est bien sourcé par des gates (pas du code mort) sans exiger qu'il figure
|
||||
dans un job.
|
||||
|
||||
## 3. Exécution locale (avant push)
|
||||
|
||||
```bash
|
||||
|
||||
Reference in New Issue
Block a user