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
AD:\Game\LifePlay-master 5.8\Tools\GitEtat.ps1: fichier neuf, 412 lignes, LF (0 CR), sans BOM, 0 octet > 0x7F, MD5F50A0C23C809CBC446C5D1E3E979BEB3(Tools\FileCheck.ps1, essai final). Aucun autre fichier deTools\touché.- l. 1-70 aide (
.SYNOPSIS,.DESCRIPTIONavec les codes de sortie, 7.PARAMETER,.EXAMPLE) ; l. 71-81paramet$MaxTous; l. 83-88Stop-LPGitEtat(code 2) ; l. 90-118Start-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-199Format-LPCr,Test-LPFins,Convert-LPFilter; l. 201-314Get-LPRepoState(status --porcelain=v1 -z,diff --name-status -z -M HEAD,ls-files -z,ls-files --eol -zpar lots de chemins littéraux) ; l. 316-412 corps (dépôts, synthèse, texte ou JSON, codes).
- l. 1-70 aide (
- Écrits hors des fichiers à commiter :
D:\Game\LifePlay-master 5.8\Docs\Migration\etat\OUTC\OUTC-T3_essais.txt(sorties brutes, 9974 lignes LF, MD51AA386F8A3AFD9CF2653756E89574B55, ignoré par git :.gitignore:75) ; ce livrable ; dans le scratchpad…\scratchpad\OUTC-T3\:driver1.ps1,driver2.ps1, une sortie par essai, dépôts jetablesfix1\{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 :
- 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. - XY : le blanc de
git statusest écrit.(.M,A.,R.,..) pour que la ligne se découpe sur les blancs ; JSON idem. - 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>). - Statut
=ajouté : fichier suivi identique à HEAD (lignes de-Tous). Dépôt sans commit : première lettre de X. - Garde-fou
-Tous(ajout) : plus de 500 fichiers suivis non modifiés pour les-Chemin→ code 2 « affiner -Chemin » (une spawn degit cat-filepar fichier : 111 fichiers = 12,0 s). Constante$MaxTous, à valider. - Listes par virgule pour
-Depotet-Chemin:pwsh -Filepasse 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. - Erreurs : texte
GIT ERREUR : <motif>; en-Json, objet{synthese, erreur, code:2}. Toute exception inattendue est convertie en code 2 (sinonpwsh -Filerendrait 1, confondu avec l'alerte). - Lecture seule renforcée :
git --no-optional-locks(aucun verrou d'index pris pour rafraîchir) ;GIT_DIR,GIT_WORK_TREE,GIT_INDEX_FILEretirées de l'environnement des processus git. Date des 3indexinchangée après E01. - Binaire = octet nul dans les 8 000 premiers octets, y compris UTF-16 avec BOM (
FileCheck.ps1le lit comme texte).?si le fichier de l'arbre est illisible (non éprouvé). - 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.
- Dépôts non demandés non validés :
-Depot jeuignore un-Addonabsent (cas V10 de la fiche).-Copiedoit 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 -zdans 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 aucunrm: le fichier « supprimé » de la fixture a été déplacé (mv) versfix1\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 avecmv, en commandes plus petites, chemins littéraux ; rien d'autre n'a été contourné. Une 2e commande (heredocpwsh -Command -) a échoué à l'analyse de bash et a été remplacée par un fichierdriver1.ps1dans le scratchpad. - P3 : la fiche donne HEAD
06dfb55pour le jeu ;git rev-parse --short HEADrendae5d5e4(addon3f94b5e, Modulesc8661cd). - P4 :
sk-windows-shelln'a pas été invoqué ; les pièges utiles (guillemets, listes avec-File,-z,quotepath) viennent de la fiche et delp-build§ 8. - P5 :
driver1.ps1etdriver2.ps1ont 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 dansSaved\OUTC\si l'orchestrateur veut les garder. - P6 critère « CR arbre = CR HEAD » pour NUMEROS : non atteint à la lettre,
NUMEROS.mdest 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.lockou 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 lignesp ace é.txtest correcte dans le fichier brut). - Aucune alerte
FINSré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
- V9 :
pwsh -NoProfile -File Tools\GitEtat.ps1: une ligne par fichier, comptes égaux àgit status --porcelain=v1 --untracked-files=allpour chacun des 3 dépôts (essai encadré par deuxgit status: jeu 98, addon 266, modules 0, ensembles de chemins identiques). - 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). - 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=inputdu poste fait ignorer le changement à git lui-même. - V11 : relire le fichier en entier : un fichier neuf, aucun
Remove-Item, aucune commande git d'écriture (recherche négative faite : 0 occurrence deRemove-Item,rm,git add|commit|rm|mv|reset|checkout|restore|stash|merge|rebase|push|tag). - 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).
- Durée visée : 5,3 s pour les 3 dépôts sans filtre (E01), 1,0 à 3,0 s avec
-Depotou-Chemin. Tools\FileCheck.ps1 Tools\GitEtat.ps1:LF, BOM-, 0 alerte (MD5 ci-dessus, à comparer si le fichier est retouché).- 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.ps1A 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.