LifePlay-Revival/Docs/Migration/etat/OUTC/OUTC-T3-IMPL.md
edujiro5972 8084622450 LifePlay UE 5.8 : état de développement au 2026-10-19
Tickets : REP1-T4

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-19 22:57:42 +02:00

14 KiB

Fiche OUTC-T3 — Niveau N1 — Modèle prévu sonnet | utilisé claude-sonnet-5-5 — Agent lp-impl — Skills sk-protocol, sk-windows-shell, lp-paths

OUTC-T3-IMPL : Tools\GitEtat.ps1 conforme à OUTC-SPEC § 3.4 (2026-10-11)

Skills réellement présents ou lus : sk-protocol, ue-cpp-build, lp-build, lp-ue-compat (préchargés) ; lp-paths lu par Read (.claude/skills/lp-paths/SKILL.md l. 40-73, dépôts et piège Modules) ; sk-windows-shell non invoqué (voir § 2, P4).

1. Fichiers modifiés

  • A D:\Game\LifePlay-master 5.8\Tools\GitEtat.ps1 : fichier neuf, 412 lignes, LF (0 CR), sans BOM, 0 octet > 0x7F, MD5 F50A0C23C809CBC446C5D1E3E979BEB3 (Tools\FileCheck.ps1, essai final). Aucun autre fichier de Tools\ touché.
    • l. 1-70 aide (.SYNOPSIS, .DESCRIPTION avec les codes de sortie, 7 .PARAMETER, .EXAMPLE) ; l. 71-81 param et $MaxTous ; l. 83-88 Stop-LPGitEtat (code 2) ; l. 90-118 Start-LPGit / Invoke-LPGit (System.Diagnostics.Process, --no-optional-locks, sortie UTF-8, stderr lu en asynchrone) ; l. 120-171 comptes d'octets en flux (Measure-LPStream, Get-LPTreeStats, Get-LPHeadStats = git cat-file blob HEAD:<chemin>) ; l. 173-199 Format-LPCr, Test-LPFins, Convert-LPFilter ; l. 201-314 Get-LPRepoState (status --porcelain=v1 -z, diff --name-status -z -M HEAD, ls-files -z, ls-files --eol -z par lots de chemins littéraux) ; l. 316-412 corps (dépôts, synthèse, texte ou JSON, codes).
  • Écrits hors des fichiers à commiter : D:\Game\LifePlay-master 5.8\Docs\Migration\etat\OUTC\OUTC-T3_essais.txt (sorties brutes, 9974 lignes LF, MD5 1AA386F8A3AFD9CF2653756E89574B55, ignoré par git : .gitignore:75) ; ce livrable ; dans le scratchpad …\scratchpad\OUTC-T3\ : driver1.ps1, driver2.ps1, une sortie par essai, dépôts jetables fix1\{min,jeu,addon,modules.git}, fix2 (600 fichiers), fix3 (sans commit), explo.

2. Écarts à la SPEC (§ 3.4) et à la fiche

Écarts de conception, tous de forme ou d'ajout, aucun ne change un code de sortie ni une règle d'alerte :

  1. Champ eol : deux jetons git, i/lf w/crlf (forme citée par V9 et la fiche), au lieu de <eol index>/<eol arbre> ; - seul si non suivi ou supprimé (conforme à la SPEC). JSON : eol_index, eol_arbre.
  2. XY : le blanc de git status est écrit . (.M, A., R., ..) pour que la ligne se découpe sur les blancs ; JSON idem.
  3. Synthèse en première ligne (la SPEC la liste après les fichiers, comme CopieEtat), puis une ligne d'en-tête par dépôt == <depot> <branche>@<head> <n> fichiers (<racine>).
  4. Statut = ajouté : fichier suivi identique à HEAD (lignes de -Tous). Dépôt sans commit : première lettre de X.
  5. Garde-fou -Tous (ajout) : plus de 500 fichiers suivis non modifiés pour les -Chemin → code 2 « affiner -Chemin » (une spawn de git cat-file par fichier : 111 fichiers = 12,0 s). Constante $MaxTous, à valider.
  6. Listes par virgule pour -Depot et -Chemin : pwsh -File passe une liste en une seule chaîne (lp-build § 8). Un filtre ne peut donc pas contenir de virgule (git ls-files | grep -c ',' = 0 dans le jeu). Chemin absolu sous la racine du dépôt accepté ; un chemin absolu d'un autre dépôt est ignoré pour ce dépôt.
  7. Erreurs : texte GIT ERREUR : <motif> ; en -Json, objet {synthese, erreur, code:2}. Toute exception inattendue est convertie en code 2 (sinon pwsh -File rendrait 1, confondu avec l'alerte).
  8. Lecture seule renforcée : git --no-optional-locks (aucun verrou d'index pris pour rafraîchir) ; GIT_DIR, GIT_WORK_TREE, GIT_INDEX_FILE retirées de l'environnement des processus git. Date des 3 index inchangée après E01.
  9. Binaire = octet nul dans les 8 000 premiers octets, y compris UTF-16 avec BOM (FileCheck.ps1 le lit comme texte). ? si le fichier de l'arbre est illisible (non éprouvé).
  10. Règle FINS littérale : CR 0 → > 0 (ou l'inverse) alerte même si HEAD n'a aucun saut de ligne (fichier vide ou d'une ligne) ; seul un fichier texte suivi, présent dans HEAD et dans l'arbre, peut alerter.
  11. Dépôts non demandés non validés : -Depot jeu ignore un -Addon absent (cas V10 de la fiche). -Copie doit contenir .git (jeu) ; Modules = <Copie>\Content\Modules + -ModulesGitDir. Ordre des lignes : chemin en ordre des octets.

Écarts de déroulement (à connaître de l'orchestrateur) :

  • P1 suppression : en sondant le format status -z dans le dépôt d'exploration du scratchpad (explo), j'ai lancé rm b.txt (fichier que j'avais créé). C'est contraire à la rubrique 6 de la fiche (« aucune suppression, y compris dans le scratchpad »). Ensuite plus aucun rm : le fichier « supprimé » de la fixture a été déplacé (mv) vers fix1\del.deplace.txt.
  • P2 permissions : deux commandes Bash (fixture jetable, 1re et 3e tentatives) ont été refusées par le système de permissions, sans motif donné ; toutes deux contenaient rm (estimé : c'est la cause). Reprise avec mv, en commandes plus petites, chemins littéraux ; rien d'autre n'a été contourné. Une 2e commande (heredoc pwsh -Command -) a échoué à l'analyse de bash et a été remplacée par un fichier driver1.ps1 dans le scratchpad.
  • P3 : la fiche donne HEAD 06dfb55 pour le jeu ; git rev-parse --short HEAD rend ae5d5e4 (addon 3f94b5e, Modules c8661cd).
  • P4 : sk-windows-shell n'a pas été invoqué ; les pièges utiles (guillemets, listes avec -File, -z, quotepath) viennent de la fiche et de lp-build § 8.
  • P5 : driver1.ps1 et driver2.ps1 ont servi trois fois chacun (relances après deux retouches du script) et restent dans le scratchpad, comme le prescrit la fiche pour les essais ; à ranger dans Saved\OUTC\ si l'orchestrateur veut les garder.
  • P6 critère « CR arbre = CR HEAD » pour NUMEROS : non atteint à la lettre, NUMEROS.md est modifié par une autre session ( M, git diff --numstat = 3 0) : i/crlf w/crlf, CR 45 (arbre) / 42 (HEAD), soit exactement les 3 lignes CRLF ajoutées, sans alerte. L'égalité est prouvée sur un fichier CRLF propre : Docs/Migration/etat/REPO/README.md, i/crlf w/crlf CR:13/13.

3. Instantané

Lot OUTC, manifeste D:\Game\LifePlay_Backup_5.5\OUTC\manifest.csv l. 5 : "Tools\GitEtat.ps1","False","0","",… : fichier neuf, rien à restaurer. Retrait possible par Tools\Restore.ps1 -Lot OUTC (proposé, jamais lancé).

4. Ce qui n'a pas été fait

  • Pas de compilation ni de lancement d'éditeur (outillage pwsh). Aucune commande git d'écriture dans le jeu, l'addon ni Modules (seules lectures : branch, rev-parse, status, diff, ls-files, cat-file, config --get). Écritures git uniquement dans des dépôts jetables du scratchpad (git init, add, commit, mv), autorisées par la fiche pour le cas d'alerte.
  • Non éprouvé : HEAD détaché ; index.lock ou rebase en cours ; fichier de l'arbre illisible (?) ; suppression indexée (D.) ; rename + modification (RM) ; sous-module ; Windows PowerShell 5.1 (refusé volontairement, code 2) ; filtre contenant une virgule ; affichage de noms non ASCII par une console OEM (la ligne sp ace é.txt est correcte dans le fichier brut).
  • Aucune alerte FINS réelle sur les trois dépôts du projet à l'heure des essais (alertes_fins=0) : le code 1 est prouvé sur dépôts jetables seulement.
  • Pic de jetons non mesuré. Skills et agents non modifiés.

5. Points à confirmer en VAL

  1. V9 : pwsh -NoProfile -File Tools\GitEtat.ps1 : une ligne par fichier, comptes égaux à git status --porcelain=v1 --untracked-files=all pour chacun des 3 dépôts (essai encadré par deux git status : jeu 98, addon 266, modules 0, ensembles de chemins identiques).
  2. V9 NUMEROS : -Chemin Docs/Migration/etat/REPO/NUMEROS.md -Tous → i/crlf w/crlf ; CR arbre = CR HEAD si le fichier n'est plus modifié, sinon écart = lignes ajoutées (git diff --numstat).
  3. V10 : rejouer la commande de la fiche sur un dépôt jetable neuf avec .gitattributes * -text (comme le projet) → ALERTE FINS, code 1 ; sans cet attribut, core.autocrlf=input du poste fait ignorer le changement à git lui-même.
  4. V11 : relire le fichier en entier : un fichier neuf, aucun Remove-Item, aucune commande git d'écriture (recherche négative faite : 0 occurrence de Remove-Item, rm, git add|commit|rm|mv|reset|checkout|restore|stash|merge|rebase|push|tag).
  5. Décision de l'orchestrateur sur les écarts 1 (format eol), 2 (point pour le blanc), 3 (synthèse en tête), 5 (garde-fou 500), 6 (virgule).
  6. Durée visée : 5,3 s pour les 3 dépôts sans filtre (E01), 1,0 à 3,0 s avec -Depot ou -Chemin.
  7. Tools\FileCheck.ps1 Tools\GitEtat.ps1 : LF, BOM -, 0 alerte (MD5 ci-dessus, à comparer si le fichier est retouché).
  8. Contrôle de la fiche P1 : l'orchestrateur décide de la suite à donner à la suppression de explo\b.txt (fichier jetable du scratchpad).

6. Fichiers à commiter

Dépôt jeu (D:\Game\LifePlay-master 5.8, branche ue5.8) :

  • A Tools/GitEtat.ps1
  • A Docs/Migration/etat/OUTC/OUTC-T3-IMPL.md

Dépôt addon : aucun. Dépôt Modules : aucun. Non commité par construction : Docs/Migration/etat/OUTC/OUTC-T3_essais.txt (ignoré, .gitignore:75). Les autres fichiers non suivis de Tools\ (Numero.ps1, Verrou.ps1) et M Tools/EtatDir.ps1 viennent d'autres fiches du lot, pas de celle-ci.

Tours : 35 / 40

Constats

Table des essais (copie 5.8, script final ; sorties brutes dans OUTC-T3_essais.txt, repère === <Id> ; pwsh -NoProfile -File Tools\GitEtat.ps1 …) :

Id Arguments Code Synthèse Durée
E01 (aucun) 0 GIT OK jeu=ue5.8@ae5d5e4 98 fichiers ; addon=ue5.8@3f94b5e 266 fichiers ; modules=main@c8661cd 0 fichiers ; alertes_fins=0 ; comptes git status 98/98, 266/266, 0/0 ; date des 3 index inchangée 5,3 s
E02 -Json 0 ConvertFrom-Json OK ; n = 98 / 266 / 0 ; ensembles de chemins = git status -z (0 différence) 5,6 s
V9_1 -Json entre deux git status 0 avant = après = GitEtat : 98, 266, 0 (copie stable) 5,5 s
E03 -Chemin …/NUMEROS.md -Tous 0 .M M i/crlf w/crlf CR:45/42 ; diff --numstat = 3 0 (voir P6) 2,4 s
E03b -Chemin …/README.md -Tous 0 .. = i/crlf w/crlf CR:13/13 2,4 s
E03c -Depot jeu -Chemin …/NUMEROS.md 0 une ligne .M M … CR:45/42 1,6 s
E04 -Depot modules 0 modules=main@c8661cd 0 fichiers 1,0 s
E05 -Depot jeu,addon -Chemin Tools 0 jeu 4, addon 255 fichiers (liste par virgule) 3,0 s
E06 -Json -Depot modules 0 JSON valide, fichiers: [] 1,2 s
E07 -Depot jeu -Chemin <chemin absolu de GitEtat.ps1> 0 ?? ? - CR:0/- Tools/GitEtat.ps1 1,2 s
E08 -Depot jeu -Chemin Content/BPs/GI.uasset 0 .M M i/-text w/-text CR:bin/bin 2,0 s
E10 -Tous 2 GIT ERREUR : -Tous exige -Chemin 0,6 s
E11 -Addon D:\Game\NoSuchAddonDir 2 addon introuvable 0,6 s
E11b -Depot addon -Addon <absent> 2 idem 0,6 s
E12 -Copie D:\Game\NoSuchCopie 2 copie introuvable 0,6 s
E13 -Depot foo 2 depot inconnu : foo (jeu, addon, modules) 0,6 s
E14 -Copie <scratchpad>\explo 2 -Addon obligatoire pour la copie 'explo' 0,6 s
E15 -Json -Tous 2 objet JSON {synthese, erreur, code:2} 0,6 s
E16 -Depot modules -ModulesGitDir <absent> 2 dossier git des Modules introuvable 0,6 s
V10 -Copie fix1\min -Addon fix1\min -ModulesGitDir fix1\min\.git -Depot jeu 1 GIT ALERTE jeu=main@14fdfd7 1 fichiers ; alertes_fins=1 ; .M M i/lf w/crlf CR:3/0 t.txt ALERTE FINS 1,3 s
F01 3 dépôts jetables (fix1\jeu, addon, modules.git) 1 alertes_fins=4 : lf.txt, crlf.txt, crlf_mix.txt (jeu), a.txt (addon) ; crlf_ok.txt, mixed_old.txt, bin.dat, new.txt, ren2.txt (de ren.txt), del.txt (.D, CR:-/0), added.txt (A., CR:0/-), sp ace é.txt sans alerte 3,2 s
F02 idem -Json 1 JSON valide ; 13 cas attendus / obtenus : 0 écart (xy, statut, eol, CR, alerte, ancien) 3,2 s
F03 -Depot modules (jetable) 0 modules .M M i/lf w/lf CR:0/0 m1.txt : le dépôt Modules par --git-dir/--work-tree marche 1,4 s
F04 -Chemin *.dat 0 filtre glob : bin.dat seul 1,3 s
F05 -Chemin .gitattributes,lf.txt -Tous 1 .gitattributes propre .. = ; lf.txt ALERTE FINS 1,5 s
F06 -Copie fix1 (sans .git) 2 depot jeu introuvable (pas de .git) 0,6 s
F07 -Chemin f1*.txt -Tous (111 fichiers propres) 0 111 lignes .. = 12,0 s
F08 -Chemin . -Tous (600 fichiers propres) 2 -Tous : 600 fichiers suivis non modifies … (maximum 500) 1,2 s
F09 -Copie fix3 -Depot jeu (aucun commit) 0 jeu=main@- ; A. A i/lf w/crlf CR:1/- s.txt ; ?? ? - CR:1/- u.txt 1,1 s

Critère d'acceptation (fiche § 8) : comptes par dépôt égaux aux git status --porcelain : atteint (E01, V9_1) ; NUMEROS vu CRLF : atteint (i/crlf w/crlf), CR arbre = CR HEAD : atteint sur README.md, écart expliqué sur NUMEROS.md (P6) ; codes 0, 1 et 2 prouvés ; JSON valide (E02, E06, F02, E15).

Établi : tout ce qui précède, par les sorties de OUTC-T3_essais.txt (rejouées après les deux retouches du script : tri par octets, puis SortedDictionary à la place de [Array]::Sort($keys, $items) qui ne permutait pas les éléments sous PowerShell 7.6.6 — essai de diagnostic fait à part, sorties non archivées). Avant les essais : aucun index.lock, rebase-*, MERGE_HEAD, CHERRY_PICK_HEAD dans les trois dépôts (ls -a de leurs dossiers git). Versions : git 2.56.0.windows.2, pwsh 7.6.6. Estimé : cause des deux refus de permission (rm). Incertain : comportement hors des cas listés au § 4.