diff --git a/03_agents/devops/AGENT.md b/03_agents/devops/AGENT.md index 5c6e0af..a2239f1 100644 --- a/03_agents/devops/AGENT.md +++ b/03_agents/devops/AGENT.md @@ -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 diff --git a/05_activity_log/2026-08-02.md b/05_activity_log/2026-08-02.md index 483e4f5..e841cc1 100644 --- a/05_activity_log/2026-08-02.md +++ b/05_activity_log/2026-08-02.md @@ -1626,3 +1626,9 @@ nouvelle introduite ; l'état launch-readiness est **inchangé et vert**. `../../.gitea/workflows/ci.yml`, `../qa/...` — mirrorent le style des addenda existants et passent le link-check). Arbre `git status --porcelain` vide avant l'édition. Aucune commande touchant au VPS. + +## Session 20260802_163601 · Sprint 8 · buffer · Fiche `devops/AGENT.md` : documentation du livrable `run_ci.sh` (angle mort de complétude) +- **Constat** : `run_ci.sh` (miroir local du gate, ajouté aux commits `49123ec`/`dcb463e`) est déjà indexé dans la table Navigation du `README.md` racine, mais **absent de la fiche de son agent propriétaire** (`03_agents/devops/AGENT.md`) — la table « Livrables DevOps réellement produits » n'en listait que 2 (ci.yml+ci/, deploy_runbook). Gap de **complétude doc-vs-réalité**, pas une dérive de chiffre. +- **Action** : ajout d'une 3e ligne à la table + sous-section dédiée décrivant `run_ci.sh` **avec exactitude** : outillage local (confort dev), **PAS un gate** (CLAUDE.md #5 · aucun `ci/*.sh`, hors `gate.needs`, racine ∉ `ci/` donc hors invariant INV-B), liste de checks **dérivée** de `gate.needs` (zéro liste en dur → zéro dérive), décompte imprimé à l'exécution (#6). Aligné sur la mémoire `local-ci-runner`. +- **Zéro nouveau module · zéro gate ajouté** (#5). Seul changement = prose de fiche. +- **Vérif** : `check_docs.sh` valide le nouveau lien `../../run_ci.sh` (HARD) → vert · `guard_constraints.sh` vert · `run_ci.sh` → **30 PASS · 0 FAIL · 0 SKIP**.