Fiche OUTIL1-A — Niveau N3 — Modèle prévu sonnet | utilisé claude-sonnet-5-5 — Agent lp-impl — Skills sk-protocol, ue-cpp-build, lp-build, lp-ue-compat # OUTIL1-A-IMPL : 9 intégrations à `Tools\` et index `Tools\LISEZMOI.md` (2026-10-14) Décision de l'utilisateur (session EVAL, 2026-10-14) : « (a) 9 intégrations » de `OUTIL1-PROPOSITION.md` § 2, plus la fusion des essais TRACE1 (§ 3, 3e puce). Les originaux restent en place (trace). Aucune commande git écrite ; `Tools\` est ignoré par git (`.gitignore:91 /Tools/`, vu par `git check-ignore -v`) : la sauvegarde des cibles est l'instantané, pas un commit. ## 1. Fichiers modifiés ### 1.1 Source → cible (tous nouveaux ; MD5 relus par `md5sum` après la dernière écriture) | Source (`Docs\Migration\etat\…`) | MD5 source | Cible (`Tools\…`) | MD5 cible | Octets | CR | |---|---|---|---|---:|---:| | `EVAL2\scripts\eval2_lf.py` | `02588153eccc1f7b9125355e7ac154c6` | `NormaliserLF.py` | `a4b60c5d61eb029990b1f543d7e61d40` (reprise A-b ; première version `d07028697d19a1117408a2d15e0ea60f`) | 6352 | 0 | | `EVAL2\AMEL1\R2\ecriture-gardien-v2.py` | `e03d4332d46392a44d5fa66a8fc0b57d` | `hooks\ecriture-gardien.py` | `e03d4332d46392a44d5fa66a8fc0b57d` (copie exacte, `cp`) | 117116 | 0 | | `EVAL2\AMEL1\R2\test_crochet.py` | `fef83c3cb2fe0d2438bbb7b2cd9450a1` | `hooks\TestCrochet.py` | `578a73c73efaf7e496950007cdad7e05` | 10477 | 0 | | `EVAL2\AMEL1\R2\cas-v2.jsonl` | `40eb34c7f3d250f63bcdb5d626243c52` | `hooks\cas-v2.jsonl` | `40eb34c7f3d250f63bcdb5d626243c52` (copie exacte) | 175777 | 0 | | `AG\brouillons\agents\lp-mcp-garde-lecture.py` | `f787d205d4102a16109606f4a357e9e5` | `hooks\lp-mcp-garde-lecture.py` | `f787d205d4102a16109606f4a357e9e5` (copie exacte) | 2113 | 0 | | `ARCH427\ARCH427_manifest.py` | `e28612e9a2bae4305e8c97d88a8f8094` | `Manifeste.py` | `b73935d6755158d2bd5c789129d696e0` | 6747 | 0 | | `U58\U3\cmp_pie.py` | `a0e3e4f116d73e120ba875f688edf1f1` | `CmpPie.py` | `337ae18e6fa54a9f2b9cca1655f5ba60` | 4070 | 0 | | `AG\TRACE1\TRACE1-T4b-essai.ps1` | `045b4a5513f1e31a59962894e57acff8` | `Tests\Corbeille.essais.ps1` | `c81d0d306d9d82a7e9328400d43d4960` | 10200 | 0 | | `AG\TRACE1\TRACE1-T4cv-essais.ps1` + `TRACE1-T4cv-essais3.ps1` | `6740b8e5ad27b749f7294f358e82a70e` + `9a7ff815156f4cbb45436c1a887461db` | `Tests\TracesCorbeille.essais.ps1` | `781e1a9fc86bd2137ac5a17c4263c91e` | 31387 | 0 | | (nouveau) | — | `LISEZMOI.md` | `63e5bf05c5a88aef8e950091b8d2f31f` (reprise A-b ; première version `21856367c357ea9bfa3f7df75e3b95ce`) | 15379 | 0 | Copies installées dans le profil (lecture seule, non modifiées) : `ecriture-gardien.py` `E03D4332D46392A44D5FA66A8FC0B57D`, `lp-mcp-garde-lecture.py` `F787D205D4102A16109606F4A357E9E5` (`Get-FileHash -Algorithm MD5`) : égales aux copies de référence. ### 1.2 Normalisations appliquées - **NormaliserLF.py** : fichiers ou dossier en paramètre (aucun chemin par défaut : sans chemin, code 2) ; à blanc par défaut, `--appliquer` écrit (reprise A-b ; `--essai` reste un synonyme du défaut) ; `--ext`, `--recursif`, `--forcer` ; refus des extensions binaires ou exigeant CRLF (`.png .7z .uasset .bat .cmd`…) et de tout fichier à octet NUL ; codes 0 (conforme, ou corrigé avec `--appliquer`) / 1 (à blanc, à corriger) / 2 ; `--help` ; chemins affichés avec `%USERPROFILE%` ; LF. - **TestCrochet.py** : crochet en premier paramètre, défaut = `%USERPROFILE%\.claude\hooks\ecriture-gardien.py` ; batterie en second paramètre, défaut `cas-v2.jsonl` voisin ; `--cwd` (défaut = racine du projet calculée depuis `Tools\hooks\`) à la place de la constante `D:\Game\LifePlay-master 5.8` ; code d'usage 64 devenu 2, crochet ou batterie introuvable = 2 ; `--sortie` (rapport LF) ; compte et profil masqués dans toute la sortie ; délai de 30 s traité comme erreur au lieu d'une trace ; `--help`. - **Manifeste.py** : sous-commandes `scan` / `compare` conservées, `--hash-ext` ; code 2 pour racine ou manifeste absent, écriture impossible, fichier illisible, `SORTIE` sous `RACINE` (refusée : le relevé se modifierait lui-même) ; lecture seule hors `SORTIE` ; `--help`. - **CmpPie.py** : `--cible` / `--ref` à la place de `--` ; codes 0 (aucune signature nouvelle) / 1 (au moins une) / 2 (usage, journal absent, aucune signature lue en cible) ; `--help`. La clé de signature est inchangée. - **Corbeille.essais.ps1** : racine par défaut déduite de `$PSScriptRoot`, `-Corbeille`, `-Sauvegardes`, `-Sortie` (défaut `%TEMP%\claude\`), `-Rapport` ; listes de cas générées dans `-Sortie` à partir de fichiers réels du poste (plus de liste figée du lot) ; cas sans fichier convenable « non joué » ; codes 0 / 1 / 2 ; bloc `.SYNOPSIS` / `Get-Help`. - **TracesCorbeille.essais.ps1** : étapes indépendantes du lot (Depart, Inventaire, Refus, Corbeille, Chaine, Code, Dates, Recents, Index, Doublons, Fin ; `Rapide` par défaut, `Tous`), `-Racine`, `-Sauvegardes`, `-Sortie`, `-Avant`, `-Echantillon`, `-Reference`, `-Rapport` ; étapes d'`essais3` (Dates, Recents, Index, Doublons) fusionnées ; l'étape T4b appelle `Corbeille.essais.ps1` ; jamais `-Envoyer` (`Invoke-Script` le refuse) ; codes 0 / 1 / 2 ; `Get-Help`. - **LISEZMOI.md** : une ligne par outil de `Tools\` (scripts, sous-dossiers `hooks\`, `Tests\`, `debug\`, `modules\`, `ui\`, `VS2026\`), colonnes Outil / Rôle / Appel type / Codes de sortie ; sections Mesure, Build, État de la copie, Traces, Hooks, Tests, Fichiers et paquets, Audit dans l'éditeur, Données. Les lignes de `LogStats.ps1`, `Indicateurs.py` (option `--detail`) et `SauverTranscriptions.ps1` sont celles du coordinateur (messages en cours de fiche). Aucun nom de compte ni `C:\Users\…` (`grep` du compte et de `C:\Users` : 0 ligne). ### 1.3 Non-régression : commandes et sorties (toutes rejouées par moi, sorties collées) Témoins dans `%TEMP%\claude\outil1-a\` (les fichiers d'origine des cas cités ont changé ou disparu : voir § 2 E9). **NormaliserLF.py — PASS.** 24 copies CRLF (21 csv, 3 md de `EVAL2\data`, reconverties de LF en CRLF) : `eval2_lf.py` d'origine sur l'une, `NormaliserLF.py` sur l'autre. ``` python -I -X utf8 eval2_lf.py (original) -> tableaux.md : 166 CR retires ; tickets.csv : 118 CR retires ; val.csv : 88 CR retires ; fini ; code=0 python -I -X utf8 Tools/NormaliserLF.py --essai <24 CRLF> -> fini (a blanc) : examines=24 a_corriger=24 cr=4795 ; code=1 python -I -X utf8 Tools/NormaliserLF.py <24 CRLF> -> fini : examines=24 corriges=24 cr=4795 ; code=0 rejeu --essai -> fini (a blanc) : examines=24 a_corriger=0 cr=0 ; code=0 MD5 des 24 fichiers (EVAL2\data d'origine = sortie de eval2_lf.py = sortie de NormaliserLF.py) : identiques 24, écarts 0 ``` Cas limites : sans chemin code 2 ; chemin absent `INTROUVABLE` code 2 ; `x.uasset` `REFUSE (extension binaire…)` code 2 ; dossier contenant `c.txt` à octet NUL : `REFUSE (octet NUL : fichier binaire)`, `fini (a blanc) : examines=2 a_corriger=2 cr=4`, code 2 ; `--help` code 0. Après application, 0 CR relu par `tr`. **Copies exactes des crochets — PASS.** `md5sum Tools/hooks/ecriture-gardien.py` = `e03d4332d46392a44d5fa66a8fc0b57d` ; `lp-mcp-garde-lecture.py` = `f787d205d4102a16109606f4a357e9e5` ; `cas-v2.jsonl` = `40eb34c7f3d250f63bcdb5d626243c52` ; chacun égal à sa source ; les deux crochets égaux aussi à la copie du profil. **TestCrochet.py — PASS.** `python -I -X utf8 Tools/hooks/TestCrochet.py Tools/hooks/ecriture-gardien.py --resume --sortie ` : ``` a : refus a tort de P3 total 36 | refus 1 | passe 35 | erreur 0 | conformes 36 / 36 b : refus utiles de P3 total 40 | refus 21 | passe 19 | erreur 0 | conformes 40 / 40 c : cas adverses total 245 | refus 245 | passe 0 | erreur 0 | conformes 245 / 245 t : temoins total 93 | refus 3 | passe 90 | erreur 0 | conformes 93 / 93 r : charges illisibles total 3 | refus 3 | passe 0 | erreur 0 | conformes 3 / 3 I2a (definition P3 ...) : 1 / 22 = 4.5 % I2b (adverses refuses / adverses) : 245 / 245 = 100.0 % conformes : 417 / 417 code=0 ``` Le `test_crochet.py` d'origine sur `ecriture-gardien-v2.py` rend les mêmes lignes de bilan et `conformes : 417 / 417`, code 0 (durée par cas 96 ms contre 98 ms). Sans crochet en paramètre (défaut = profil) : `conformes : 417 / 417`, code 0. Crochet absent : `crochet introuvable : …`, code 2. Batterie absente : `batterie introuvable : %USERPROFILE%\…`, code 2. `--help` code 0. Témoin négatif : `Backup_5.5\P7-H2\ecriture-gardien.py` (MD5 `c60f774fe527475d3cd735628f120dc8`, ancien crochet) rend `conformes : 292 / 417`, code 1. Le témoin cité (`246 / 417`, `AMEL1-R2-IMPL.md:122`) portait sur un autre crochet (MD5 `f00d973927cd292723a82be859d5c5bd`, `AMEL1-R2-IMPL.md:119`) que je n'ai pas retrouvé : **non reproduit** (voir § 4). **Manifeste.py — PASS.** Témoin figé de 6 fichiers (dont `.git\HEAD`, `.uasset`, `.cpp`, `.h`, `.dat`), `ARCH427_manifest.py` d'origine contre `Manifeste.py` : ``` original scan -> …\temoin-manifeste fichiers=6 octets=142 haches=4 dossiers=3 ; code=0 Manifeste scan -> %USERPROFILE%\…\temoin-manifeste fichiers=6 octets=142 haches=4 dossiers=3 ; code=0 md5sum man_orig.txt = man_new.txt = a5b41bcd83e30b6ea58312ef112fd092 Manifeste compare man_orig man_new -> avant=['6','142','4','3'] apres=['6','142','4','3'] seulement_avant=0 seulement_apres=0 differents=0 ; code=0 Un fichier de plus (copie -p) : compare man_new man_new2 -> apres=['7','185','4','3'] seulement_apres=1 ; code=1 ; l'original rend la même sortie, code 1 racine absente code 2 ; SORTIE sous RACINE code 2 ; manifeste absent code 2 ; sans argument code 2 ``` Les deux manifestes sont octet pour octet identiques (même MD5). **CmpPie.py — PASS (équivalence).** Journaux PIE réels de la copie 5.5 : cible `LifePlay-backup-2026.10.08-11.51.03.log`, références `…10.07-23.36.18.log` et `…10.07-23.19.06.log`. ``` cmp_pie.py (original) -> signatures 5.8 : 34 ; 5.5 : 100 ; seulement en 5.8 : 1 ; 1 GI | Execute Ubergraph GI | SetActive | none:ThemeSong ; code=0 CmpPie.py (nouveau) -> signatures cible : 34 ; ref : 100 ; seulement en cible : 1 ; 1 GI | Execute Ubergraph GI | SetActive | none:ThemeSong ; code=1 même journal contre lui-même -> signatures cible : 34 ; ref : 34 ; seulement en cible : 0 ; code=0 journal absent code 2 ; sans argument code 2 ; --help code 0 ``` Mêmes comptes et même signature ; le code 1 est la normalisation voulue (l'original rendait 0). Le cas cité (47 / 101 / 3, `U3-T4-EDITEUR.md:16-17`) **n'est pas rejouable** : le journal 5.8 du 08/10 n'existe plus. **Corbeille.essais.ps1 — PASS.** `pwsh -NoProfile -File Tools/Tests/Corbeille.essais.ps1 -Rapport ` : ``` cas1-absent REFUS absent code=2 OK cas2-suivi-git REFUS suivi-git code=2 OK cas3-profil-claude REFUS profil-claude + hors-racines code=2 OK cas4-racine-build REFUS racine-build + racine-autorisee + hors-racines + dossier-non-plantage code=2 OK cas5-manifest REFUS manifest code=2 OK cas6-admis A-BLANC … A BLANC lignes=1 ; CORBEILLE envoyes=0 octets=0 refuses=0 echecs=0 code=0 OK liste-refus (5 chemins) CORBEILLE envoyes=0 octets=0 refuses=5 echecs=0 code=2 OK ETAT IDENTIQUE=True ; CORBEILLE AVANT items=2783 / APRES items=2783 identique=True RESULTAT cas joues=7 ok=7 ko=0 non-joues=0 ; etat identique=True ; corbeille identique=True ; VERDICT=OK code=0 ``` Même suite de motifs et de codes que `TRACE1-T4b-essai.txt:11-51` (cas 1 à 5 `REFUS`, code 2 ; cas 6 `A-BLANC`, code 0 ; liste témoin `refuses=5`, code 2 ; état et corbeille inchangés). `Corbeille.ps1`, `Traces.ps1`, `TracesRacines.ps1` : MD5 relus avant et après (`61ef5e9c…`, `cdb3d82f…`, `191408d5…`), inchangés. **TracesCorbeille.essais.ps1 — PASS (11 étapes sur 11).** `pwsh -NoProfile -File Tools/Tests/TracesCorbeille.essais.ps1 -Etape Tous -Avant 2026-10-10 -Echantillon 100 -Reference -Sortie -Rapport ` (version finale, ≈ 13 min) : ``` VERDICT Depart/Inventaire/Refus/Corbeille/Chaine/Code/Dates/Recents/Index/Doublons/Fin : OK (11) Inventaire : Traces.ps1 code=1 duree=98s ; TRACES entrees=3334 … ; 0 entrée sous CrashReportClient, UnrealBuildTool, EpicGamesLauncher\Saved\Logs, UnrealHeaderTool, Zen, UnrealTrace, etat\REPO (6 copies) Refus : cas joues=11 ko=0 non-joues=0 ; liste des 9 refus ensemble : CORBEILLE envoyes=0 octets=0 refuses=9 echecs=0 (code 2) Code : 5 scripts, erreurs d'analyse=0 ; 9 manifestes de synthèse OK (illisible, vide x2, sans-colonne, chemin-invalide, chemin-introuvable, chemin-absolu, décidables x2) Dates : 8 noms OK ; Recents : seulement au courant=444, tous récents, anciens=0 ; Index : couvertes=1 (l'entrée attendue) sur 3334 Doublons : groupes=459 ; 3 groupes, MD5 recalculés égaux entre eux et à la liste ; Fin : modifiees ou disparues=0 RESULTAT etapes OK=11 KO=0 NON-JOUE=0 ; code=0 ``` Aussi `-Etape Rapide` (Depart, Code, Dates, Corbeille, Refus, Fin) : 6 OK, code 0 (première version). Les critères cités de `TRACE1-T4cv-VAL.md:164` (R1, R2, E11 levés ; critères 1 à 7 sans régression ; corbeille avant = après ; aucun fichier existant modifié) sont couverts (estimé, d'après les en-têtes de `T4cv-essais.ps1` et `essais3.ps1`, sans relire la VAL en entier) par Refus (R1, R2, E11), Inventaire / Dates / Recents / Index / Doublons (critères 1 à 4), Code (analyse, aide, fins de ligne), Fin et les compteurs de corbeille. Le chiffre `2521` est propre au poste du jour (2783 puis 2784 ici). ### 1.4 PubCheck et fins de ligne ``` pwsh -NoProfile -File Tools/PubCheck.ps1 -Fichiers PubCheck : 0 constat(s) PubCheck code=0 ``` Fins de ligne : 0 CR dans les 10 fichiers (`tr -cd '\r' | wc -c`, colonne CR du tableau 1.1), dernier octet LF pour les scripts PowerShell (étape Code). PubCheck du présent livrable : voir la fin (section Constats). ## 2. Écarts à la SPEC - **E1 `NormaliserLF.py`** (levé par la reprise OUTIL1-A-b : décision du coordinateur, à blanc par défaut et `--appliquer` écrit ; texte de la première version conservé) : la fiche demande `--essai` ; l'inventaire I1a proposait « à blanc par défaut et `--appliquer` ». J'ai suivi la fiche : écriture par défaut (comme l'original), `--essai` à blanc, mais aucun chemin par défaut. L'outil n'appelle pas `Snapshot.ps1` (l'inventaire le suggérait) : l'instantané reste un geste de l'appelant, écrit dans l'en-tête. - **E2 `TestCrochet.py`** : le crochet reste le premier argument positionnel (pas d'option `--crochet`), pour garder l'appel d'origine `test_crochet.py [cas]`. `--tout` et `--resume` sont devenus exclusifs (l'original tolérait les deux). Ajouts : `--sortie`, masquage du compte, délai traité en erreur. - **E3 `Manifeste.py`** : l'inventaire suggérait « sortie obligatoire sous `Saved\` ou `etat\` » : non retenu (trop contraignant pour un outil générique) ; seul est refusé le cas `SORTIE` sous `RACINE`. La ligne de bilan de `scan` masque `%USERPROFILE%` (l'original imprimait le chemin brut). - **E4 `CmpPie.py`** : libellés de sortie `signatures cible / ref / seulement en cible` à la place de `5.8 / 5.5 / seulement en 5.8` (les comptes sont les mêmes) ; code 2 si aucune signature en cible (zéro résultat = échec probable). - **E5 `Corbeille.essais.ps1`** : la liste du cas 2 n'est plus `Tools\Build.ps1` (non suivi par git depuis CHG-357, il ne serait plus refusé pour `suivi-git`) mais le premier fichier suivi sous `Docs\Migration\etat` hors `REPO`. Les contrôles statiques de l'original (critères 6 et 7 : motifs de suppression, analyse, aide) sont passés dans l'étape Code de `TracesCorbeille.essais.ps1`. La section `git status` / `check-ignore` est supprimée (propre au lot). - **E6 `TracesCorbeille.essais.ps1`** : inventaires figés de T4c / T4v supprimés (l'étape Recents demande `-Reference`, sinon « non joué ») ; Chaine compare l'empreinte des `-Echantillon` premiers chemins (300 par défaut) au lieu de tous, avec `-Avant mois` par défaut ; Index utilise un index témoin généré (un journal de `Saved\Logs`) au lieu du témoin figé de 31 entrées ; Doublons contrôle 2 membres de chacun des 3 plus petits groupes. `TRACE1-T4cv-essais2.ps1` (dossiers de plantage réels du jour) et les autres essais T4a / T4v restent en trace (classe b). - **E7 Quatre critères de mon propre script ajustés après un premier passage `Tous` KO ou non joué** (le premier passage, en-tête de la version initiale, rendait `OK=8 KO=2 NON-JOUE=2`) : 1. `Fin` : `differences=1`, ligne `=> manifeste|MEN1-D|122|815D2475…` : un autre lot avait pris un instantané (nouveau `manifest.csv`) pendant l'essai. `Fin` n'échoue plus que sur une empreinte du départ **modifiée ou disparue** (`<=`) ; les ajouts sont signalés. 2. Compteur global de corbeille (2783 puis 2784 pendant l'essai long, activité d'une autre session ou de l'utilisateur, non attribuée) : devenu information ; chaque cas de Refus et de Corbeille contrôle la corbeille sur sa propre durée (quelques secondes), contrôle strict conservé. 3. `Doublons` : `copies=0`, rôles `copie-seule=56 ; original=876`, donc aucune paire original + copie à contrôler (état du poste du jour, les copies de `LifePlay_Backup_5.5` n'ont plus d'original hors sauvegarde). Le contrôle porte désormais sur 2 membres d'un même groupe. Essai suivant : OK. 4. `Chaine` : avec `-Avant mois` la liste est vide (non joué) ; avec `-Avant 2026-10-10` : 2266 entrées, `Corbeille.ps1` refuse 4 lignes `suivi-git` (`D:\Game\LifePlay_Publication\repo\Build\…\FileOpenOrder\*OpenOrder.log`, fichiers suivis par git) et rend le code 2, sans rien envoyer ni modifier. Le critère d'origine (« code 0 ») dépendait de la date du jour ; l'étape vérifie l'innocuité (aucun envoi, empreintes, liste, corbeille inchangées) et signale un code 2 comme **observation**. Voir Constats. - **E8 `LISEZMOI.md`** : les lignes du coordinateur (`LogStats.ps1`, `Indicateurs.py`, `SauverTranscriptions.ps1`) ont une quatrième colonne « Codes de sortie » ajoutée ; `LogStats.ps1` : « aucun code explicite » (pas d'`exit` trouvé par `Grep` lors de ma lecture, estimé). - **E9 Cas d'origine non rejouables à l'identique** (remplacés par une équivalence original contre nouveau sur les mêmes données, § 1.3) : `eval2_lf.py` (les 7 fichiers de `EVAL2-STATS.md:187` sont déjà en LF) ; `ARCH427_manifest.py` (arbre `D:\Game\LifePlay-master` vivant, 2 770 fichiers de `ARCH427-T3-AVANT.md:31` périmés) ; `cmp_pie.py` (journal 5.8 du 08/10 disparu) ; témoin négatif `246 / 417` de `test_crochet.py` (crochet f00d9739… introuvable). ## 3. Instantané `pwsh -NoProfile -Command "& '…\Tools\Snapshot.ps1' -Lot OUTIL1-A -Path <10 cibles>"` avant toute écriture : les 10 cibles n'existaient pas (fichiers neufs), consignées `Existed=False` (« absent (sera retiré à la restauration) ») dans `D:\Game\LifePlay_Backup_5.5\OUTIL1-A\manifest.csv` (10 entrées). Retour arrière proposé, non lancé : `Tools\Restore.ps1 -Lot OUTIL1-A` (déplace les cibles, ne supprime pas). Reprise OUTIL1-A-b : instantané `OUTIL1-A2` de `Tools\NormaliserLF.py` (`D07028697D19A1117408A2D15E0EA60F`) et `Tools\LISEZMOI.md` (`21856367C357EA9BFA3F7DF75E3B95CE`) avant écriture, `D:\Game\LifePlay_Backup_5.5\OUTIL1-A2\manifest.csv` (2 entrées) ; retour arrière proposé : `Tools\Restore.ps1 -Lot OUTIL1-A2`. Aucun fichier existant du projet n'a été modifié ; `Tools\hooks\pre-push` (existant) et les autres outils sont intacts. Fichiers temporaires : `%TEMP%\claude\outil1-a\`, `%TEMP%\claude\corbeille-essais\`, `%TEMP%\claude\traces-essais\`. ## 4. Ce qui n'a pas été fait - Aucune installation : le profil (`%USERPROFILE%\.claude\hooks\`) n'est pas modifié ; la politique « copie ou lien » et le contrôle du MD5 après chaque changement sont à décider (inventaire I1b, ligne `ecriture-gardien-v2.py`). - Skills non amendés (`lp-validate`, `lp-lot`, `sk-protocol`, `lp-paths`, `lp-build`, `lp-commandlets`, `lp-doc` : `OUTIL1-PROPOSITION.md` § 6, groupés avec W5). - Originaux laissés en place ; aucun envoi à la corbeille ; `-Envoyer` jamais lancé ; `TRACE1-T4cv-essais2.ps1` non repris. - Témoin négatif `246 / 417` non reproduit. Je n'ai pas comparé aux MD5 `f00d9739…` les deux autres copies trouvées (`Backup_5.5\P7-H2\v2\ecriture-gardien.py`, `ecriture-gardien-ext.py`) ni celle de `Backup_5.5\P7\jetable copie\`. - Cas cités non rejoués à l'identique : voir E9. `Tools\Indicateurs.py` et `LogStats.ps1` non touchés (autres fiches). - Appels `python -I` sans `-X utf8` du `LISEZMOI.md` pour `uasset58.py`, `FicheStats.py` et `DiffRemplacementNoeuds.py` : repris de leurs en-têtes, non rejoués. ## 5. Points à confirmer en VAL - `python -I -X utf8 Tools/hooks/TestCrochet.py Tools/hooks/ecriture-gardien.py --resume` rend `conformes : 417 / 417`, code 0 ; sans argument (crochet du profil) le même résultat. - MD5 des copies de référence égaux à ceux du profil : `ecriture-gardien.py` `e03d4332…`, `lp-mcp-garde-lecture.py` `f787d205…`. - `PubCheck.ps1 -Fichiers` sur les 10 fichiers de `Tools\` et sur ce livrable : 0 constat. - 0 CR dans les 10 fichiers et dans ce livrable. - Rejeu de l'aller-retour `NormaliserLF.py` : 24 copies CRLF de `EVAL2\data` → 24 MD5 égaux à l'origine. - Rejeu `Manifeste.py scan` sur un dossier témoin : manifeste identique à celui de `ARCH427_manifest.py` ; `compare` 0 / 1 / 2. - Rejeu `CmpPie.py` : mêmes comptes que `cmp_pie.py` sur les mêmes journaux ; code 1 si une signature est nouvelle. - `Corbeille.essais.ps1` code 0 sur le poste, corbeille et fichiers inchangés ; `TracesCorbeille.essais.ps1 -Etape Rapide` code 0 (≈ 1 min) et `-Etape Tous` code 0 (≈ 13 min). - Tranché par la reprise OUTIL1-A-b (coordinateur, décision 1) : `NormaliserLF.py` est à blanc par défaut, `--appliquer` écrit. À rejouer en VAL : à blanc code 1, `--appliquer` code 0, rejeu `cr=0`. - Tranché par la reprise OUTIL1-A-b (coordinateur, décision 3) : « code 2 = observation » de l'étape Chaine (E7-4) accepté, contrôles d'innocuité stricts conservés. - Les lignes provisoires ou reprises du coordinateur dans `LISEZMOI.md` (`Indicateurs.py --detail`, `SauverTranscriptions.ps1`) sont à relire quand les fiches D1 et OUTIL1-T seront closes. ## 6. Fichiers à commiter Dépôt du jeu (branche `ue5.8`) : - `A Docs/Migration/etat/EVAL2/AMEL1/OUTIL1/OUTIL1-A-IMPL.md` Hors git (`Tools/` ignoré, `.gitignore:91`, sauvegardé par l'instantané `OUTIL1-A`) : les 10 fichiers du tableau 1.1 sous `D:\Game\LifePlay-master 5.8\Tools\`. Rien à commiter pour eux ; si l'utilisateur lève l'ignorance de `Tools/`, ce sont des `A`. Tours : ≈ 53 / 60 (compte estimé ; `python -I Tools/FicheStats.py --lot OUTIL1` fait foi) ## Constats - **Traces.ps1 liste des fichiers que Corbeille.ps1 refuse** (hors périmètre, non corrigé) : `Traces.ps1 -Avant 2026-10-10` retient 4 journaux `D:\Game\LifePlay_Publication\repo\Build\{Linux,Windows}NoEditor\FileOpenOrder\{Cooker,Editor}OpenOrder.log`, suivis par git ; `Corbeille.ps1` les refuse (`suivi-git`) et refuse alors toute la liste (code 2). La chaîne Traces → Corbeille proposée par la règle TRACE1 ne passe donc pas telle quelle pour cette date : à trancher (filtrer les fichiers suivis dans `Traces.ps1`, ou documenter le refus global). Sortie : `Traces.ps1 -Avant 2026-10-10 : TRACES entrees=2266 …` puis `Corbeille.ps1 : code=2 ; lignes A-BLANC=0 ; REFUS=4`. - `PubCheck.ps1 -Fichiers` sur ce livrable (première version puis reprise) : `PubCheck : 0 constat(s)`, code 0 ; 0 CR. ## Reprise OUTIL1-A-b (2026-10-14, budget 15 tours) Hors gabarit : section de reprise, ajoutée après la décision du coordinateur sur le § 5 de la première version. 1. **`NormaliserLF.py` à blanc par défaut, écriture avec `--appliquer`** (comme `Corbeille.ps1` sans `-Envoyer`). `--essai` reste accepté comme synonyme du défaut ; `--essai --appliquer` ensemble : refus d'argparse, code 2. Docstring, `--help`, epilog et ligne de `LISEZMOI.md` mis à jour. Instantané `OUTIL1-A2` pris avant (voir § 3). Aller-retour rejoué sur 24 nouvelles copies CRLF de `EVAL2\data` (`%TEMP%\claude\outil1-a\lf-new3\data`) : ``` python -I -X utf8 Tools/NormaliserLF.py <24 CRLF> -> fini (a blanc) : examines=24 a_corriger=24 cr=4795 ; code=1 ; CR restants après le passage : 4795 (rien d'écrit) python -I -X utf8 Tools/NormaliserLF.py --appliquer <24 CRLF> -> fini : examines=24 corriges=24 cr=4795 ; code=0 python -I -X utf8 Tools/NormaliserLF.py <24> -> fini (a blanc) : examines=24 a_corriger=0 cr=0 ; code=0 MD5 des 24 fichiers égaux à ceux de EVAL2\data d'origine : 24, écarts 0 PASS ``` Cas limites : `--essai` code 1 ; `--essai --appliquer` `error: argument --appliquer: not allowed with argument --essai` code 2 ; dossier avec `c.txt` à octet NUL `REFUSE (octet NUL : fichier binaire)` code 2 ; sans chemin code 2 ; `--appliquer a.md` : `2 CR retires`, code 0, puis 0 CR relu par `tr`. 2. **`LISEZMOI.md`** : la ligne `Indicateurs.py` ancienne (« I1a à I14 », ancienne ligne 20) est supprimée ; reste la ligne « I1a à I15 … `--detail` » avec ma colonne Codes de sortie (`grep -c '^| Indicateurs.py'` = 1, ligne 20 après suppression). La ligne `SauverTranscriptions.ps1` (ligne 67 après suppression, 68 avant) a été relue : texte identique à la version définitive envoyée par le coordinateur (`-Session ` vers `TRANSCRIPTIONS\sessions\\`, `-Tout` vers `TRANSCRIPTIONS\complet\`, `manifest.csv (Rel, Octets, MD5, Date)`, `-Essai`, codes 0 / 1 / 2) ; `grep -c '^| SauverTranscriptions.ps1'` = 1. 3. **Étape Chaine** : « code 2 = observation » accepté (décision 3) ; les contrôles d'innocuité de `TracesCorbeille.essais.ps1` (aucun envoi `envoyes=0`, empreintes, liste, corbeille) n'ont pas été modifiés par la reprise. 4. **Hooks** : copies de référence conservées, pas de lien (décision 4) ; rien à changer (MD5 inchangés : `ecriture-gardien.py` `e03d4332…`, `lp-mcp-garde-lecture.py` `f787d205…`, `TestCrochet.py` `578a73c7…`). 5. **Constat `Traces.ps1` / `Corbeille.ps1`** (fichiers suivis par git) : noté par le coordinateur comme suite hors fiche (décision 5), rien fait ici. MD5 et contrôles après la reprise (relus après la dernière écriture) : ``` NormaliserLF.py octets=6352 CR=0 md5=a4b60c5d61eb029990b1f543d7e61d40 LISEZMOI.md octets=15379 CR=0 md5=63e5bf05c5a88aef8e950091b8d2f31f PubCheck.ps1 -Fichiers NormaliserLF.py LISEZMOI.md -> PubCheck : 0 constat(s) ; code=0 ``` Fichiers à commiter de la reprise : `M Docs/Migration/etat/EVAL2/AMEL1/OUTIL1/OUTIL1-A-IMPL.md` (ce livrable, déjà `A` à la première livraison si non commité) ; `Tools\NormaliserLF.py` et `Tools\LISEZMOI.md` sont hors git (`/Tools/` ignoré), sauvegardés par `OUTIL1-A2`. Tours (reprise) : ≈ 7 / 15