[DTP-Worker 20260802_163601] Sprint 8 · buffer · Fiche devops/AGENT.md : documentation du livrable run_ci.sh (indexé au README racine mais absent de la fiche de son agent propriétaire) → 3e ligne table + sous-section « outillage local, PAS un gate #5 » (dérive de gate.needs, hors gate.needs, racine ∉ ci/ donc hors INV-B), aligné mémoire local-ci-runner · zéro module · zéro gate · check_docs valide le lien ../../run_ci.sh · run_ci 30 PASS + guards verts

This commit is contained in:
Claude Code DTP Worker
2026-08-02 16:39:22 +00:00
parent 4f390b4ee2
commit 59eb4dcb7c
2 changed files with 20 additions and 0 deletions
+14
View File
@@ -23,6 +23,20 @@ et vérifications HTTP restent côté **agent DevOps/ERPNext Backend**.
|---|---|---|---|---|
| [`.gitea/workflows/ci.yml`](../../.gitea/workflows/ci.yml) + [`ci/`](../../ci/README.md) | 1 (roadmap L29) | **CI/CD Gitea Actions** : 3 guards blocants (contraintes / JSON / docs) + un job de tests par livrable gated + `gate` agrégateur + `e2e-baseline` | déclenché sur `push`/`pull_request``main` + `workflow_dispatch` | 22 suites gated |
| [`05_deliverables_mvp/devops/deploy_runbook/`](../../05_deliverables_mvp/devops/deploy_runbook/README.md) | 8 (roadmap L73) | **Run-book VPS unifié** : graphe de **7 phases ordonnées** couvrant TOUS les modules gated, dépendances inter-phases + confirmations préalables sourcées | `deploy_runbook_gen.py build\|validate` | 29 (dont 14 injections négatives) |
| [`run_ci.sh`](../../run_ci.sh) | 8 (roadmap L73 · « regression exhaustifs ») | **Miroir LOCAL du gate** : rejoue en une commande, hors runner et hors réseau, l'ensemble exact des checks de `gate.needs` | `bash run_ci.sh` (outil, non un gate) | — (voir ci-dessous) |
### `run_ci.sh` — outillage local, PAS un gate (#5)
Confort développeur, pas un maillon de la chaîne de merge : le script **dérive**
sa liste de checks de `gate.needs` (`.gitea/workflows/ci.yml`, la source déjà
verrouillée par `ci/check_ci_integrity.sh`) — **zéro liste en dur**, donc aucune
dérive silencieuse possible (ajouter/retirer un job CI se répercute ici sans
édition). Il n'ajoute **aucun `ci/*.sh` ni aucune assertion** : ce n'est **pas**
un gate (CLAUDE.md #5), il ne s'inscrit pas dans `gate.needs` et, la racine
n'étant pas sous `ci/`, il échappe par construction à l'invariant qui interdit un
`ci/*.sh` non câblé au gate. Périmètre = uniquement les jobs de `gate.needs`
(exclut les jobs `workflow_dispatch` type `e2e-baseline`/`npm test` qui exigent
Node). Le décompte jobs/gates/suites est **imprimé à l'exécution** — jamais figé
dans le code, où il se périmerait (anti-invention · #6).
### Le gate CI — trois guards blocants (`ci/`)
- **`guard_constraints.sh`** : détecte l'**usage** (pas la simple mention) des