diff --git a/05_activity_log/2026-08-06.md b/05_activity_log/2026-08-06.md index cf79cfa..2995c7a 100644 --- a/05_activity_log/2026-08-06.md +++ b/05_activity_log/2026-08-06.md @@ -1,5 +1,41 @@ # Activity Log · 2026-08-06 · Claude Code DTP Worker +## Session `20260806_144555` — VÉRIF · axe NEUF « forme de normalisation Unicode (NFC vs NFD) des sources committées » → CLEAN 387/387 · 0 édition de production + +**Choix de tâche.** `./run_ci.sh` au démarrage = **33 PASS · 0 FAIL · 0 SKIP**, arbre propre, roadmap +`ROADMAP_8_WEEKS_OR_LESS.md` intégralement livrée/gatée (Sprints 1→7 ; prod VPS / builds EAS / dépôts +ONAPI hors périmètre worker · #8). `OPEN_DECISIONS_REGISTER.md` = 3 arbitrages produit de Michel +(non éditables). Objectif : un **axe encore jamais balayé**. + +**Axe NEUF (absent de la mémoire).** Le sweep `runtime-encoding-integrity-sweep` a couvert le niveau +octet — BOM · UTF-8 invalide · caractères de contrôle · CRLF · compile `.py`. Il n'a **jamais** couvert +la **forme de normalisation Unicode**. Or ce repo est **intégralement francophone** (369/387 fichiers +non-ASCII, pleins d'accents) : un `é` **décomposé** (NFD = `e` + U+0301 combinant) se **lit à +l'identique** d'un `é` **composé** (NFC, un seul point de code), mais c'est une **séquence d'octets +différente**. Conséquences d'un fichier NFD glissé dans le repo : +- **byte-repro aveugle** — le générateur lit ces octets et les ré-écrit tels quels → artefact identique. +- **faux-vert de gate** — un gate qui `grep` un littéral **NFC** (ex. `faisabilité`, `Bancable`) ou un + test qui `assert "…é…" in output` **rate silencieusement** le contenu NFD → la vérif passe au vert + alors qu'elle ne teste rien. + +**Détecteur (stdlib pur).** Pour chaque fichier texte committé (`.py .json .md .sh .yml .yaml .txt +.ts .tsx .js .jsx .toml .cfg .ini`, hors `.git/__pycache__/node_modules/.expo/venv`) : décoder UTF-8, +comparer `unicodedata.normalize("NFC", texte)` au texte brut ; toute divergence = contenu non-NFC. + +**Teeth (bout-en-bout, pas juste abstrait).** Deux fichiers temporaires de contenu **visuellement +identique** — `clean.md` (NFC) et `decomposed.md` (NFD de la même phrase) : le détecteur **flague** +`decomposed.md` (True) et **épargne** `clean.md` (False) ; et `grep 'faisabilité'` (littéral NFC) +matche `clean.md` **mais rate `decomposed.md`** → le faux-vert est **démontré**, pas supposé. + +**Résultat.** **387 fichiers** examinés · **369** non-ASCII (accentués) · **0 non-NFC** · 0 échec de +décodage. Le repo est **intégralement en forme NFC** → **CLEAN 387/387**. Aucun gate/test n'est exposé +au faux-vert d'octets-divergents-lus-pareil. + +**Périmètre.** VÉRIF pure : **0 fichier de production modifié** · **0 chiffre inventé** · **0 commande +VPS** (#8). `./run_ci.sh` inchangé = **33 PASS · 0 FAIL · 0 SKIP**. Fichiers touchés : ce journal + +1 entrée mémoire (`unicode-nfc-normalization-sweep`). Sweep **rejouable** tel quel (stdlib +`unicodedata`, sans réseau) — **NON promu en gate** (#5, occurrence-zéro). + ## Session `20260806_141554` — VÉRIF · axe NEUF « accord numérique INTER-artefacts d'un concept-singleton partagé » → CLEAN · 0 édition de production **Choix de tâche.** `./run_ci.sh` au démarrage = **33 PASS · 0 FAIL · 0 SKIP**, arbre propre, roadmap