150 lines
14 KiB
Markdown
150 lines
14 KiB
Markdown
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.
|