From dcb463ee00e9098654d2a8de5e2dc8cdb91fa949 Mon Sep 17 00:00:00 2001 From: Claude Code DTP Worker Date: Sun, 2 Aug 2026 15:42:38 +0000 Subject: [PATCH] =?UTF-8?q?[DTP-Worker=2020260802=5F153601]=20Sprint=208?= =?UTF-8?q?=20=C2=B7=20buffer=20=C2=B7=20run=5Fci.sh=20:=20d=C3=A9compte?= =?UTF-8?q?=2030/23/7=20D=C3=89RIV=C3=89=20=C3=A0=20l'ex=C3=A9cution=20(re?= =?UTF-8?q?trait=20des=20comptes=20fig=C3=A9s=20du=20commentaire)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- 05_activity_log/2026-08-02.md | 43 +++++++++++++++++++++++++++++++++++ run_ci.sh | 24 +++++++++++++++---- 2 files changed, 63 insertions(+), 4 deletions(-) diff --git a/05_activity_log/2026-08-02.md b/05_activity_log/2026-08-02.md index 39d6642..4f73749 100644 --- a/05_activity_log/2026-08-02.md +++ b/05_activity_log/2026-08-02.md @@ -1,5 +1,48 @@ # 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) **Contexte — friction récurrente, pas une surface à gater.** Ouverture : arbre diff --git a/run_ci.sh b/run_ci.sh index 8d4e420..80c4ca7 100755 --- a/run_ci.sh +++ b/run_ci.sh @@ -21,9 +21,11 @@ # PÉRIMÈTRE : uniquement les jobs de `gate.needs` — ce qui exclut, par # 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. -# Les 30 jobs restants sont tous `bash ci/*.sh` (7 gates statiques) ou -# `python3 -m unittest` (23 suites de module) → stdlib pur, aucune install pip, -# aucune commande touchant le VPS. +# Les jobs restants sont tous soit `bash ci/*.sh` (gates statiques), soit +# `python3 -m unittest` (suites de module) → stdlib pur, aucune install pip, +# 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) : # c'est un LANCEUR de commodité. Son exactitude est STRUCTURELLE (il exécute ce @@ -32,7 +34,7 @@ # # Usage : # 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 # # 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; } +# --- 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 -------------------------------- if [ "$MODE" = "list" ]; then 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" printf '%-28s %-42s %s\n' "$job" "$wd" "$cmd" 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 fi @@ -100,6 +115,7 @@ LOGDIR="$(mktemp -d)" trap 'rm -rf "$LOGDIR"' EXIT 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 "gate.needs dérivé : $n_jobs jobs = $n_gates gates ci/*.sh + $n_suites suites de module" echo "------------------------------------------------------------------------" for row in "${ROWS[@]}"; do IFS=$'\t' read -r job wd cmd <<<"$row"