[DTP-Worker 20260806_144555] VÉRIF axe NEUF « forme de normalisation Unicode (NFC vs NFD) des sources » → CLEAN 387/387 (369 non-ASCII, 0 non-NFC) · sibling byte-encoding-sweep au niveau NORMALISATION : un é décomposé/NFD se lit à l'identique mais casse tout grep/assert littéral NFC + est aveugle au byte-repro = faux-vert de gate ; détecteur stdlib teeth-prouvé bout-en-bout (flague NFD, épargne NFC, démontre le grep-miss) ; 0 édition de prod, run_ci 33 PASS 0 FAIL 0 SKIP, rejouable, pas de gate (#5)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Code DTP Worker
2026-08-06 14:49:06 +00:00
parent 5d5e986fa6
commit caeb06be5f
+36
View File
@@ -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