diff --git a/05_activity_log/2026-08-06.md b/05_activity_log/2026-08-06.md index cba6a6d..bb6009f 100644 --- a/05_activity_log/2026-08-06.md +++ b/05_activity_log/2026-08-06.md @@ -1562,3 +1562,23 @@ Critère : `run/f/e` identiques aux 3 modes **et** 0 failure/error partout. **Résultat.** Sur **25 suites · 651 tests** : **0 module order-dependent** sous rev_method **et** sous rev_full. `run/failures/errors` strictement identiques aux 3 ordres, 0 failure partout. **Aucun couplage inter-test caché** (ni intra-classe ni inter-classe) : le vert de la CI ne dépend pas de son ordre alphabétique fixe. Chaque test est réellement isolé. **Conformité.** 0 édition de production (sweep read-only, harnais `/tmp`). `./run_ci.sh` inchangé = **33 PASS · 0 FAIL · 0 SKIP**, arbre propre. Fichiers : ce journal + 1 entrée mémoire (`test-order-independence-sweep`). Sweep **rejouable** (`unittest` stdlib pur) — **NON promu en gate** (#5, occurrence-zéro). + +## Session `20260806_201644` — VÉRIF · axe NEUF « intégrité STATIQUE de la couche shell-script : parse-validité (`bash -n`) + fidélité du code de sortie des gates » → CLEAN 10/10 parse · 8/8 exit load-bearing · 0 édition de production + +**Choix de tâche.** `./run_ci.sh` au démarrage = **33 PASS · 0 FAIL · 0 SKIP** (gate complet), arbre propre, roadmap `ROADMAP_8_WEEKS_OR_LESS.md` intégralement livrée/gatée (prod VPS / builds EAS / dépôts ONAPI hors périmètre worker · #8), `OPEN_DECISIONS_REGISTER.md` = arbitrages produit de Michel (non éditables). Objectif : un **axe teeth encore jamais balayé**. + +**Axe NEUF (absent de la mémoire).** `runtime-encoding-integrity-sweep` a fait `compile()` sur les **144 `.py`** (parse-validité côté Python) mais **jamais `bash -n`** sur les scripts **shell** — la couche `ci/*.sh` + `run_ci.sh` n'a jamais été éprouvée en parse-validité. Deux sous-axes complémentaires, tous deux ciblant la **couche gate elle-même** (méta-niveau, aveugle aux autres sweeps qui vérifient le CONTENU) : +- **(A) parse-validité shell (`bash -n`)** — une erreur de syntaxe dans une **branche non-atteinte** d'un gate (ex. la branche `report()`/`bad()` du chemin ROUGE, jamais exercée tant que le repo est CLEAN) **passe silencieusement** : `bash -n` la détecterait, mais le runtime ne l'atteint jamais sur le chemin vert. Le jour où un vrai défaut fait entrer l'exécution dans cette branche, le gate **crashe (exit 2)** au lieu de reporter proprement — ou pire, l'erreur masque le check. Sœur-SHELL du `.py compile`. +- **(B) fidélité du code de sortie** — les 8 gates sont **accumulateurs** (`set -uo pipefail` **sans** `set -e` : `FAIL=0` ; `report()` pose `FAIL=1` ; `exit "$FAIL"` final). Un gate qui incrémenterait son compteur mais ferait `exit 0` (ou lirait la mauvaise variable, ou capturerait `rc=$?` **après un pipe** masquant l'exit d'un python) = **faux-vert de la CI elle-même** — le défaut de plus haut impact possible (rend TOUTE la couverture du gate inerte). Distinct de `guard-constraints-flags-usage` (qui mutation-teste INPUT→rouge, **empiriquement** ; ici je prouve **structurellement** que la ligne `exit` lit le bon accumulateur). + +**Détecteurs (rejouables, harnais `/tmp`, 0 fichier prod touché).** +- (A) `bash -n` sur chacun des **10** scripts shell trackés (`git ls-files '*.sh'`). +- (B) audit de la ligne `exit` finale de chaque gate ; vérification que `check_readme_claims.sh` invoque son heredoc python en `python3 - <<'PY'` **non-pipé** (l.121) → `rc=$?` (l.9237) capture bien l'exit python, pas celui d'un `tee`. + +**Résultat → CLEAN.** (A) **10/10 scripts parse OK** sous `bash -n` (`ci/*.sh` × 9 + `run_ci.sh`). (B) **8/8 gates** terminent par `exit "$FAIL"` (ou `exit "$rc"` pour readme-claims, `rc` = exit du python non-pipé) ; `lib.sh` n'a **aucun** `exit` top-level (fichier **sourcé**, correct — cohérent avec sa propre doc « jamais exécuté en propre »). + +**Dents prouvées (bout-en-bout, `/tmp`, prod intouchée).** +- (A) copie de `validate_json.sh` + `if [[ 1 -eq 1 ]; then …` (un `]` manquant) → `bash -n` **PARSE-FAIL** (MORD) ; le vrai script **épargné** (OK). Détecteur non-inert. +- (B) mini-repo git `/tmp` avec un `sub/broken.json` malformé : le **vrai** `validate_json.sh` → **RED ✓** ; un **mutant** identique où `exit "$FAIL"` est remplacé par `exit 0` → **fake-green ✓**. Prouve que la ligne `exit` est **load-bearing** — le faux-vert que le sous-axe (B) chasse est un vrai risque, et le vrai gate y échappe. + +**Conformité.** VÉRIF pure : **0 fichier de production modifié** · **0 chiffre inventé** (#6 — 10/8 recomputés par balayage) · **0 commande VPS** (#8) · **aucun gate ajouté** (#5 — axe CLEAN, occurrence-zéro, détecteurs rejouables ; transitivement, la fidélité de sortie est aussi empiriquement prouvée par le mutation-bite `guard-constraints-flags-usage`). `./run_ci.sh` inchangé = **33 PASS · 0 FAIL · 0 SKIP**, arbre propre. Fichiers : ce journal + 1 entrée mémoire (`shell-script-static-integrity-sweep`).