[DTP-Worker 20260802_153601] Sprint 8 · buffer · run_ci.sh : décompte 30/23/7 DÉRIVÉ à l'exécution (retrait des comptes figés du commentaire)
Dernière surface figée dans l'outil « anti-dérive par construction » : run_ci.sh dérive déjà la liste des checks de gate.needs (zéro liste en dur) mais son commentaire d'en-tête re-transcrivait à la main « 30 jobs · 23 suites · 7 gates » — un « vert trompeur » de la classe qu'il combat, logé dans sa propre doc (ajouter un job module → le script s'adapte, le commentaire se périme en silence). FIX (éliminer le nombre figé), pas gate N+1 : un lanceur de commodité (root ∉ ci/*.sh) ne mérite pas un gate redondant (#5) qui prendrait la mauvaise autorité. - ventilation dérivée des mêmes ROWS que l'exécution (n_gates/n_suites/n_jobs) ; - en-tête d'exécution + pied de --list impriment « 30 = 7 + 23 » (toujours exact) ; - commentaire reformulé : littéraux 30/23/7 remplacés par la description qualitative bash ci/*.sh / python3 -m unittest + note « décompte DÉRIVÉ, jamais figé ici » (anti-invention CLAUDE.md #6). Vérif : --list/--static impriment 30=7+23 · run_ci.sh complet 30 PASS/0 FAIL/0 SKIP · 7 gates re-joués exit 0. Aucun gate ajouté (#5). Aucune commande touchant au VPS. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,48 @@
|
|||||||
# Activity log · 2026-08-02 · Claude Code DTP Worker
|
# Activity log · 2026-08-02 · Claude Code DTP Worker
|
||||||
|
|
||||||
|
## Session `20260802_153601` · Sprint 8 · buffer · DevOps outillage — `run_ci.sh` : décompte `30/23/7` DÉRIVÉ à l'exécution (retrait des comptes figés du commentaire · anti-invention #6, PAS un gate #5)
|
||||||
|
|
||||||
|
**Contexte — dernière surface figée dans un outil « anti-dérive par construction ».**
|
||||||
|
Ouverture : arbre propre, **7 gates verts**, **30/30 jobs `gate.needs`** (`run_ci.sh`).
|
||||||
|
La file substantielle reste **saturée** (22/22 qualité · 564/564 tests · recette
|
||||||
|
15/15 · 13 fiches). Balayage des comptes numériques encore susceptibles de dériver :
|
||||||
|
`run_ci.sh` (créé la session précédente, commit `49123ec`) DÉRIVE dynamiquement la
|
||||||
|
liste des checks de `gate.needs` (« zéro liste en dur ») — mais son **commentaire
|
||||||
|
d'en-tête** re-transcrivait à la main « **30 jobs · 23 suites · 7 gates statiques** ».
|
||||||
|
Or ce sont exactement les quantités que le script calcule déjà : si un job module
|
||||||
|
est ajouté à `ci.yml`, le script s'adapte tout seul (il exécuterait 31 jobs) tandis
|
||||||
|
que son commentaire continuerait d'affirmer « 30 · 23 » — un **« vert trompeur »**
|
||||||
|
de la même classe que celle que l'outil combat, logé dans sa propre doc d'intention.
|
||||||
|
|
||||||
|
**Décision — FIXER (éliminer le nombre figé), pas gater** (mémoire *fix-vs-gate-a-
|
||||||
|
transitively-protected-constant*). Un gate N+1 sur un commentaire de lanceur de
|
||||||
|
commodité (root ∉ `ci/*.sh`) serait redondant (#5) et prendrait la mauvaise autorité.
|
||||||
|
La bonne réponse : **rendre le décompte inderivable-à-la-main** — le script le calcule
|
||||||
|
et l'imprime, le commentaire ne l'affirme plus.
|
||||||
|
|
||||||
|
**Livraison — `run_ci.sh` (+20/−4)** :
|
||||||
|
1. **Ventilation dérivée** des mêmes `ROWS` que l'exécution : `n_gates` (cmd `bash
|
||||||
|
ci/*`) vs `n_suites` (le reste avec commande) → `n_jobs`. Ajouter un job à
|
||||||
|
`gate.needs` le reclasse ici automatiquement, zéro édition.
|
||||||
|
2. **En-tête d'exécution** : nouvelle ligne `gate.needs dérivé : 30 jobs = 7 gates
|
||||||
|
ci/*.sh + 23 suites de module` (toujours exacte, imprimée par `all` et `--static`).
|
||||||
|
3. **Pied de `--list`** : `-- 30 jobs dérivés de gate.needs : 7 gates statiques
|
||||||
|
ci/*.sh + 23 suites de module.`
|
||||||
|
4. **Commentaire d'en-tête reformulé** : retrait des littéraux « 30 / 23 / 7 »
|
||||||
|
(remplacés par la description QUALITATIVE `bash ci/*.sh` / `python3 -m unittest`
|
||||||
|
— le point étant « stdlib pur, aucun pip », pas le nombre) + note explicite « le
|
||||||
|
décompte exact est DÉRIVÉ et imprimé à l'exécution, jamais figé ici (#6) ». Ligne
|
||||||
|
d'usage `--static` : « les gates statiques » (sans « 7 »).
|
||||||
|
|
||||||
|
**Vérif** — `--list` → pied `30 = 7 + 23` ; `--static` → en-tête `30 = 7 + 23` +
|
||||||
|
**7 PASS / 0 FAIL** ; `run_ci.sh` complet → **30 PASS / 0 FAIL / 0 SKIP**. Les **7
|
||||||
|
gates re-joués → exit 0** (guard_constraints · validate_json · check_docs ·
|
||||||
|
check_artifacts · check_regression · check_ci_integrity · check_readme_claims).
|
||||||
|
Aucun gate ne scanne `run_ci.sh` (surface hors périmètre des gates, cf. son en-tête).
|
||||||
|
Aucune commande touchant au VPS.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Sprint 8 · buffer · DevOps outillage — `run_ci.sh` : miroir LOCAL du gate CI, dérivé de `gate.needs` (zéro liste en dur · PAS un gate #5)
|
## Sprint 8 · buffer · DevOps outillage — `run_ci.sh` : miroir LOCAL du gate CI, dérivé de `gate.needs` (zéro liste en dur · PAS un gate #5)
|
||||||
|
|
||||||
**Contexte — friction récurrente, pas une surface à gater.** Ouverture : arbre
|
**Contexte — friction récurrente, pas une surface à gater.** Ouverture : arbre
|
||||||
|
|||||||
@@ -21,9 +21,11 @@
|
|||||||
# PÉRIMÈTRE : uniquement les jobs de `gate.needs` — ce qui exclut, par
|
# PÉRIMÈTRE : uniquement les jobs de `gate.needs` — ce qui exclut, par
|
||||||
# construction et à dessein, les jobs manuels `workflow_dispatch` hors gate
|
# construction et à dessein, les jobs manuels `workflow_dispatch` hors gate
|
||||||
# (ex. `e2e-baseline`/`npm test`, qui exige Node) et le job `gate` lui-même.
|
# (ex. `e2e-baseline`/`npm test`, qui exige Node) et le job `gate` lui-même.
|
||||||
# Les 30 jobs restants sont tous `bash ci/*.sh` (7 gates statiques) ou
|
# Les jobs restants sont tous soit `bash ci/*.sh` (gates statiques), soit
|
||||||
# `python3 -m unittest` (23 suites de module) → stdlib pur, aucune install pip,
|
# `python3 -m unittest` (suites de module) → stdlib pur, aucune install pip,
|
||||||
# aucune commande touchant le VPS.
|
# aucune commande touchant le VPS. Le décompte exact (jobs / gates / suites)
|
||||||
|
# est DÉRIVÉ de gate.needs et imprimé à l'exécution — jamais figé dans ce
|
||||||
|
# commentaire, où il se périmerait en silence (anti-invention CLAUDE.md #6).
|
||||||
#
|
#
|
||||||
# CE N'EST PAS un gate (aucun nouveau `ci/*.sh`, aucune nouvelle assertion) :
|
# CE N'EST PAS un gate (aucun nouveau `ci/*.sh`, aucune nouvelle assertion) :
|
||||||
# c'est un LANCEUR de commodité. Son exactitude est STRUCTURELLE (il exécute ce
|
# c'est un LANCEUR de commodité. Son exactitude est STRUCTURELLE (il exécute ce
|
||||||
@@ -32,7 +34,7 @@
|
|||||||
#
|
#
|
||||||
# Usage :
|
# Usage :
|
||||||
# bash run_ci.sh # exécute tout gate.needs (miroir CI complet)
|
# bash run_ci.sh # exécute tout gate.needs (miroir CI complet)
|
||||||
# bash run_ci.sh --static # seulement les 7 gates statiques ci/*.sh (rapide)
|
# bash run_ci.sh --static # seulement les gates statiques ci/*.sh (rapide)
|
||||||
# bash run_ci.sh --list # liste les jobs qui SERAIENT lancés, sans exécuter
|
# bash run_ci.sh --list # liste les jobs qui SERAIENT lancés, sans exécuter
|
||||||
#
|
#
|
||||||
# Sortie : une ligne PASS/FAIL par job + un récapitulatif. Code de sortie 0 ssi
|
# Sortie : une ligne PASS/FAIL par job + un récapitulatif. Code de sortie 0 ssi
|
||||||
@@ -85,6 +87,17 @@ mapfile -t ROWS < <(parse_jobs)
|
|||||||
|
|
||||||
is_static() { case "$1" in bash\ ci/*) return 0 ;; *) return 1 ;; esac; }
|
is_static() { case "$1" in bash\ ci/*) return 0 ;; *) return 1 ;; esac; }
|
||||||
|
|
||||||
|
# --- décompte DÉRIVÉ (jamais figé) : gates statiques ci/*.sh vs suites module -
|
||||||
|
# Ventilé depuis les mêmes ROWS que l'exécution, donc toujours exact : ajouter
|
||||||
|
# un job à gate.needs le reclasse ici automatiquement, zéro édition (#6).
|
||||||
|
n_gates=0; n_suites=0
|
||||||
|
for row in "${ROWS[@]}"; do
|
||||||
|
IFS=$'\t' read -r _j _w _c <<<"$row"
|
||||||
|
[ -n "$_c" ] || continue
|
||||||
|
if is_static "$_c"; then n_gates=$((n_gates+1)); else n_suites=$((n_suites+1)); fi
|
||||||
|
done
|
||||||
|
n_jobs=$((n_gates + n_suites))
|
||||||
|
|
||||||
# --- --list : montre le plan, n’exécute rien --------------------------------
|
# --- --list : montre le plan, n’exécute rien --------------------------------
|
||||||
if [ "$MODE" = "list" ]; then
|
if [ "$MODE" = "list" ]; then
|
||||||
printf '%-28s %-42s %s\n' "JOB" "WORKING-DIR" "RUN"
|
printf '%-28s %-42s %s\n' "JOB" "WORKING-DIR" "RUN"
|
||||||
@@ -92,6 +105,8 @@ if [ "$MODE" = "list" ]; then
|
|||||||
IFS=$'\t' read -r job wd cmd <<<"$row"
|
IFS=$'\t' read -r job wd cmd <<<"$row"
|
||||||
printf '%-28s %-42s %s\n' "$job" "$wd" "$cmd"
|
printf '%-28s %-42s %s\n' "$job" "$wd" "$cmd"
|
||||||
done
|
done
|
||||||
|
printf -- '-- %d jobs dérivés de gate.needs : %d gates statiques ci/*.sh + %d suites de module.\n' \
|
||||||
|
"$n_jobs" "$n_gates" "$n_suites"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -100,6 +115,7 @@ LOGDIR="$(mktemp -d)"
|
|||||||
trap 'rm -rf "$LOGDIR"' EXIT
|
trap 'rm -rf "$LOGDIR"' EXIT
|
||||||
pass=0; fail=0; skip=0; failed_jobs=()
|
pass=0; fail=0; skip=0; failed_jobs=()
|
||||||
echo "run_ci.sh · miroir du gate CI (mode=$MODE) · $(git rev-parse --short HEAD 2>/dev/null || echo '?')"
|
echo "run_ci.sh · miroir du gate CI (mode=$MODE) · $(git rev-parse --short HEAD 2>/dev/null || echo '?')"
|
||||||
|
echo "gate.needs dérivé : $n_jobs jobs = $n_gates gates ci/*.sh + $n_suites suites de module"
|
||||||
echo "------------------------------------------------------------------------"
|
echo "------------------------------------------------------------------------"
|
||||||
for row in "${ROWS[@]}"; do
|
for row in "${ROWS[@]}"; do
|
||||||
IFS=$'\t' read -r job wd cmd <<<"$row"
|
IFS=$'\t' read -r job wd cmd <<<"$row"
|
||||||
|
|||||||
Reference in New Issue
Block a user