[DTP-Worker 20260806_204654] VÉRIF axe NEUF « cohérence shebang ↔ bit-exécutable git ↔ interpréteur sur l'arbre tracké » → CLEAN 409 fichiers · 9 exec (tous #!bash) · 46 shebangs · 37 shebang-non-exec by-design (.py -m / lib.sh sourcé) · 0 exec-sans-shebang/CRLF/BOM/mismatch/drift · teeth 9/9 (3 spare + 6 bite) · 0 édition de prod
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1582,3 +1582,23 @@ Critère : `run/f/e` identiques aux 3 modes **et** 0 failure/error partout.
|
|||||||
- (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.
|
- (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`).
|
**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`).
|
||||||
|
|
||||||
|
## Session `20260806_204654` — VÉRIF · axe NEUF « cohérence shebang ↔ bit-exécutable ↔ interpréteur sur l'arbre tracké » → CLEAN 409 fichiers · 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. Objectif : un **axe teeth encore jamais balayé**.
|
||||||
|
|
||||||
|
**Axe NEUF (absent de la mémoire).** La session précédente a fait `bash -n` (parse-validité shell) + fidélité du code de sortie sur la couche gate ; `runtime-encoding-integrity-sweep` a fait BOM/CRLF/ctrl-char **au niveau octet** sur les sources. Jamais éprouvée : la **relation** ligne-shebang ↔ **bit-exécutable git** ↔ **interpréteur** — méta-axe distinct, aveugle à toute la chaîne de gates. Six faux-verts possibles :
|
||||||
|
- **(1) exec sans shebang** : un fichier `100755` sans `#!` → l'exécution directe échoue à trouver un interpréteur (fallback `sh` hasardeux).
|
||||||
|
- **(2) CRLF dans le shebang** : `#!/usr/bin/env bash\r` → « bad interpreter » à l'exécution (invisible au parse `bash -n` qui tolère le CR).
|
||||||
|
- **(3) BOM avant `#!`** : le shebang est **silencieusement désactivé** (le noyau ne le reconnaît plus en tête).
|
||||||
|
- **(4) mismatch interpréteur↔extension** : un `.sh` portant `python3`, ou un `.py` portant `bash`.
|
||||||
|
- **(5) shebang hors ligne 1** : une ligne blanche/commentaire avant `#!` le neutralise.
|
||||||
|
- **(6) dérive mode-git ↔ bit-disque** : `os.access(X_OK)` ≠ `100755` (fichier exécutable sur disque mais commité non-exec, ou l'inverse).
|
||||||
|
|
||||||
|
**Détecteur (stdlib pur, rejouable, `/tmp` — 0 fichier prod touché).** `git ls-files -s` (mode + chemin) + lecture des 4 premiers Ko de chaque fichier ; classification des 6 codes ci-dessus par fichier.
|
||||||
|
|
||||||
|
**Résultat → CLEAN sur 409 fichiers trackés.** **9 exécutables** (`100755` = les 8 `ci/*.sh` + `run_ci.sh`, tous `#!/usr/bin/env bash`), **46 shebangs** au total. Les **37 shebang-mais-non-exec** sont **par conception** — les `.py` (générateurs/tests) se lancent via `python3 fichier.py` / `-m` (jamais `./fichier.py`), et `ci/lib.sh` est **sourcé** (100644, garde un shebang doc-hint — cohérent avec son absence de `exit` top-level trouvée la session précédente). **0** exec-sans-shebang · **0** CRLF · **0** BOM · **0** mismatch-interpréteur · **0** dérive disque/git.
|
||||||
|
|
||||||
|
**Dents prouvées (mutants synthétiques `/tmp`, prod intouchée).** Harnais rejouant la logique de détection sur des fixtures `(mode, chemin, octets, disk_exec)` : **9/9 discriminations** — 3 fichiers propres (gate `.sh`, module `.py`, lib sourcée) **épargnés** ; 6 classes de mutants (exec-sans-shebang, CRLF, BOM, `.sh`→python, `.py`→bash, dérive-mode) **mordues**. Détecteurs non-inertes.
|
||||||
|
|
||||||
|
**Conformité.** VÉRIF pure : **0 fichier de production modifié** · **0 chiffre inventé** (#6 — 409/9/46/37 recomputés par balayage `git ls-files -s`) · **0 commande VPS** (#8) · **aucun gate ajouté** (#5 — axe CLEAN, occurrence-zéro, détecteur rejouable). `./run_ci.sh` inchangé = **33 PASS · 0 FAIL · 0 SKIP**, arbre propre. Fichiers : ce journal + 1 entrée mémoire (`shebang-execbit-coherence-sweep`).
|
||||||
|
|||||||
Reference in New Issue
Block a user