From 40b023c2eb10579cc15236f927d48eae4d2baad4 Mon Sep 17 00:00:00 2001 From: Claude Code DTP Worker Date: Thu, 6 Aug 2026 18:50:04 +0000 Subject: [PATCH] =?UTF-8?q?[DTP-Worker=2020260806=5F184624]=20V=C3=89RIF?= =?UTF-8?q?=20axe=20NEUF=20=C2=AB=20portabilit=C3=A9=20des=20NOMS=20de=20f?= =?UTF-8?q?ichiers=20/=20structure=20arbre=20git=20(collision-casse=20?= =?UTF-8?q?=C2=B7=20r=C3=A9serv=C3=A9s=20Windows=20=C2=B7=20chars=20ill?= =?UTF-8?q?=C3=A9gaux=20=C2=B7=20dot/espace=20terminal=20=C2=B7=20symlinks?= =?UTF-8?q?)=20=C2=BB=20=E2=86=92=20CLEAN=20409=20fichiers=20=C2=B7=200=20?= =?UTF-8?q?=C3=A9dition=20de=20prod?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 05_activity_log/2026-08-06.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/05_activity_log/2026-08-06.md b/05_activity_log/2026-08-06.md index b1b3519..f82fbfb 100644 --- a/05_activity_log/2026-08-06.md +++ b/05_activity_log/2026-08-06.md @@ -1501,3 +1501,24 @@ journaux `05_activity_log/`. **0 date inventée.** Faux-positifs écartés par c **Conformité.** 0 édition de production (sweep read-only). `./run_ci.sh` inchangé = **33 PASS · 0 FAIL · 0 SKIP**. Fichiers : ce journal + 1 entrée mémoire. Sweep **rejouable** (stdlib pur) — **NON promu en gate** (#5, occurrence-zéro). + +## Session `20260806_184624` — VÉRIF · axe NEUF « portabilité des NOMS de fichiers / structure de l'arbre git (collision-casse · réservés Windows · chars illégaux · dot/espace terminal · symlinks) » → CLEAN · 0 édition de production + +**Choix de tâche.** `./run_ci.sh --static` au démarrage = **8 PASS · 0 FAIL · 0 SKIP** (gate complet = 33 jobs), 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).** TOUS les balayages précédents portent sur le **contenu** des fichiers (comptes, slugs, schémas, encodage byte/NFC, dates) ou les **valeurs** des artefacts. Jamais éprouvé : la **portabilité de l'arbre lui-même** — les **noms de fichiers** et la **structure** du dépôt. Un checkout se fait sur macOS (case-insensitive/case-preserving) et Windows (NTFS : noms réservés, chars interdits, dot/espace terminal ignorés) — la CI, elle, tourne sous Linux (case-sensitive, POSIX permissif). Donc un futur agent qui commit `out/Data.json` à côté de `out/data.json`, ou un fichier `con.md`/`a:b.json`, garde la **CI verte sous Linux** tout en **cassant le `git checkout` sur Mac/Windows** (collision silencieuse : un des deux fichiers écrase l'autre / erreur d'invalid-argument). Faux-vert de portabilité, invisible à toute la chaîne de gates (aucun ne regarde les noms). Distinct de `runtime-encoding-integrity-sweep`/`unicode-nfc-normalization-sweep` (qui balaient le **contenu** octet/forme-NFC des fichiers, jamais leurs **chemins**). + +**Détecteur (stdlib pur, rejouable).** Sur `git ls-files` (409 fichiers · 340 composants de chemin uniques) : +- **Collision-casse** : chemin complet ET (dirname + basename lower) — deux entrées `tolower`-égales mais littéralement distinctes. +- **Réservés Windows** : `CON/PRN/AUX/NUL/COM1-9/LPT1-9` (comparés sur le **stem** lower, avant la 1re extension — NTFS réserve aussi `nul.txt`). +- **Chars illégaux NTFS** : `< > : " \ | ? *`. +- **Chars de contrôle** : tout `ord(ch)<32` dans un composant. +- **Dot/espace TERMINAL** de composant (`c != c.rstrip(" .")`) — Windows les strippe silencieusement → renommage fantôme. +- **Longueur** : composant >255 octets, chemin >200 octets. +- **Symlinks trackés** (`git ls-files -s` mode `120000`) : cible relative ? dans le repo ? résout sur disque ? + +**Dents prouvées (mutants synthétiques, prod intouchée).** 6 classes discriminées end-to-end : collision `out/Data.json`⟷`out/data.json` **MORD** ; `con.md`, `nul.txt` (réservés) **MORDENT** ; `a:b.json`, `we|rd.md` (illégaux) **MORDENT** ; `ta\tb.md` (ctrl) **MORD** ; `folder.`, `x.md.` (dot terminal) + `folder ` `name.md ` (espace terminal) **MORDENT** ; l'échantillon réel + le cas légal `name .md` (espace **interne**, autorisé) **épargnés**. Un premier mutant trailing-space mal formé (`name .md`) a été correctement **épargné** par le détecteur → mutant corrigé en composant à espace **terminal**, pas le détecteur (validation croisée). + +**Résultat.** Sur **409 fichiers trackés** : **0 collision-casse** (chemin + basename), **0 nom réservé Windows**, **0 char illégal/contrôle**, **0 dot/espace terminal**, **0 composant/chemin surdimensionné**. **1 symlink** tracké — `04_roadmap/ROADMAP.md → ROADMAP_8_WEEKS_OR_LESS.md` : cible **relative**, **dans le repo**, **résout** vers un fichier existant = portable et sûr (ni absolu, ni hors-repo, ni dangling). Arbre git **portable**. + +**Conformité.** 0 édition de production (sweep read-only). `./run_ci.sh --static` inchangé = **8 PASS · 0 FAIL · 0 SKIP**. Fichiers : ce journal + 1 entrée mémoire (`tree-filename-portability-sweep`). Sweep **rejouable** (`git ls-files` + stdlib pur) — **NON promu en gate** (#5, occurrence-zéro).