LifePlay-Revival/Docs/Migration/etat/OUTC/OUTC-T1-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

158 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Fiche OUTC-T1 — Niveau N3 — Modèle prévu opus | utilisé claude-opus-5-5 — Agent lp-impl — Skills sk-protocol, ue-cpp-build, lp-build, lp-ue-compat (préchargés), sk-windows-shell, lp-paths (invoqués)
# OUTC-T1-IMPL : CopieEtat.ps1, UeState.ps1 -Copie/-Json, FileCheck.ps1 -Json (2026-10-11)
Sources : `OUTC-SPEC.md` § 2, § 3.1, § 4, § 7 ; consignes de l'orchestrateur reçues en cours de fiche (A : préparer au
scratchpad puis remplacer en une écriture ; B : ajouts Big Boss ; contrôle `UnrealEditor-Cmd.exe` avant écriture).
Sorties brutes : `D:\Game\LifePlay-master 5.8\Docs\Migration\etat\OUTC\OUTC-T1_essais.txt` (636 lignes, LF).
Scratchpad des essais : `<scratchpad>\OUTC-T1\`
(versions de travail, scripts d'essai `essais-nr.ps1`, `essais-copie.ps1`, `essais-tools.ps1`, `installer.ps1`, `parse51.ps1`, copies factices, rien supprimé).
## 1. Fichiers modifiés
Copie `D:\Game\LifePlay-master 5.8`, branche `ue5.8`. Les trois fichiers sont en LF, sans BOM, ASCII seul
(`FileCheck.ps1` : `LF` ; `tr -cd '\r' | wc -c` = 0 ; octets > 0x7F = 0 ; Grep `[^\x00-\x7F]` : aucun) et passent
l'analyse syntaxique de Windows PowerShell 5.1.26100 (0 erreur, `parse51.ps1`).
| Fichier | MD5 | Lignes | Contenu |
|---|---|---|---|
| `A Tools\CopieEtat.ps1` | `4A83F321C9EBBA12FF0AB64DA85CD3D2` | 460 | neuf (SPEC § 3.1 + ajouts Big Boss) |
| `M Tools\UeState.ps1` | `736FBF158C0772BAB81E98E96604809F` (avant `A47107D5…`) | 167 | l. 14, 29-39, 44 (aide) ; 50-52 (`-Copie`, `-Json`) ; 63-81 (racine normalisée, `Test-LPCopie`) ; 85 (filtre dans `Get-LPUeProcess`) ; 118-133 (`Write-LPUeJson`) ; 136-140 (`-Json` sans attente) ; 153, 156-159, 161 (`-Json` avec `-WaitExit`) |
| `M Tools\FileCheck.ps1` | `1FD13C705EF5869F79E5165D039F3AAA` (avant `CA9CBA16…`) | 203 | l. 31-36, 41 (aide) ; 49-50 (`-Json`) ; 86, 90-93 (manifeste introuvable en JSON) ; 95, 97 (lignes `Lot`/`Projet` hors JSON) ; 101, 110-113 (introuvables collectés, sans `Write-Host`) ; 151, 163-164 (`Taille`, `Modifie`, calculés seulement avec `-Json`) ; 170-189 (bloc JSON) |
`git diff --stat` : 2 fichiers, 107 insertions, 8 suppressions ; les 8 lignes retirées sont réécrites à l'identique
sous une garde `if ($Json)` / `if (-not $Json)` (relu par `git diff -U0`). `git ls-files --eol` : `i/lf w/lf` pour les deux.
Interface de `CopieEtat.ps1` : celle de la SPEC § 3.1, plus `-BackupRoot`. Codes 0 / 1 / 2. Synthèse réelle :
`COPIE <OK|ALERTE> lot= copie= proc= assets= absents= modifies= git=j/a/m hors_declares= parasites= jeu_hors_docs= jeu_docs= head=j/a/m verrou=k:etat cpu=n% alertes=`.
JSON : `synthese, horodatage, duree_s, lot, copie, depots{jeu,addon,modules}, processus{copie[],autres[]}, assets[], git{jeu[],addon[],modules[],jeu_hors_docs[],jeu_docs[]}, parasites[], verrou{racine,k,etat,qui}, cpu, alertes[{type,detail}], code`.
## 2. Écarts à la SPEC
1. **Méthode d'écriture (consigne A de l'orchestrateur)** : versions préparées et testées au scratchpad (Write / Edit),
puis chaque fichier de `Tools\` remplacé en **une** écriture par `Copy-Item -Force` (`installer.ps1`). Aucune
édition en place : MD5 avant écriture = instantané (`A47107D5…`, `CA9CBA16…`). Contrôle `UnrealEditor-Cmd.exe`
juste avant chaque écriture : 0 processus à 06:51:31 (UeState) et 06:51:32 (FileCheck), aucune attente.
2. **Ajouts Big Boss (demande du 2026-10-11, information sans alerte sauf 7z)** : (B1) processus `7z.exe`, `7za.exe`,
`7zG.exe` par requête CIM dans CopieEtat (UeState inchangé par défaut), champ `Exe` et `Start`, alerte `PROC` si la
ligne de commande ou l'exécutable cite la copie, sinon `autres` ; (B2) `git status` de tout l'arbre du jeu,
`jeu_hors_docs` / `jeu_docs` ; (B3) `head=` des 3 dépôts (+ `branche` dans `depots`) ; (B4) dernier verrou
`REPO\VERROU` en lecture seule (k numérique, `libre` / `occupe` / `vide` / `absent`, `qui.txt` si occupé) ;
(B5) `cpu=` moyenne de `Win32_Processor.LoadPercentage`. Les champs s'insèrent avant `alertes=`.
3. **Git du jeu** : un seul `git status` sur tout l'arbre (B2) ; la liste soumise à l'alerte est filtrée par préfixe
sensible à la casse `^(Content|Config|Source)(/|$)` au lieu de `-- Content Config Source` (même ensemble, un
parcours de moins).
4. **Format porcelain** : `--porcelain=v1 -z` et `-c core.quotePath=false`, sortie lue en UTF-8 par
`Diagnostics.Process` (chemins avec espace ou non ASCII non cités ; stderr séparé). Toujours lecture seule.
5. **Règle P9 étendue** (UeState `-Copie` et CopieEtat) : segments `.` et `..` résolus avant la comparaison. Motif
établi : l'éditeur réel PID 7972 (`UnrealEditor.exe … "D:\Game\LifePlay-Sandbox-5.8\Tools\debug\..\..\..\LifePlay-master 5.8\LifePlay.uproject" … -game`,
lancé 06:44:21, pas par moi) était classé `autres` en passe 1 alors qu'il tourne sur la copie 5.8.
6. **UeState `-Json`** : objet `{ copie, compte, processus[] }` (+ `attente` avec `-WaitExit`), car un tableau JSON
ne peut pas porter de champ `compte` ; `Start` en texte ISO `yyyy-MM-ddTHH:mm:ss`. Avec `-WaitExit -Json`, aucune
ligne d'attente, un seul JSON à la fin ; codes inchangés (0 / 1 / 2).
7. **FileCheck `-Json`** : objet `{ projet, lot, manifeste, lignes[], introuvables[], comptes{fichiers,fins,alertes,introuvables,contenu}, synthese, code }` ;
manifeste introuvable : `{ projet, lot, erreur, code = 2 }`. `Modifie` = `LastWriteTime` local au format ISO sans fuseau.
8. **`instantane`** : vocabulaire de FileCheck, donc aussi `nouveau`, `absent`, `absent (prevu)` en plus de
identique / modifie / pas sauvegarde.
9. **`modifies=`** compte tout MD5 différent de la référence, autorisé ou non ; l'alerte `ASSET_MODIFIE` seule
respecte `-Autorise` (essai `V5-md5-falsifie-Autorise` : `modifies=1 alertes=aucune`). Champ `reference` par asset.
10. **Listes sous `pwsh -File`** : `pwsh -File` passe `a,b` en une chaîne (découpée par le script) et `a, b` en deux
jetons. `[CmdletBinding(PositionalBinding = $false)]` + `-Reste` (ValueFromRemainingArguments) : sans eux, le 2e
élément de `-Assets a, b` était lié **en silence** à `-Autorise` (passe 1 : `assets=1`). Les jetons restants
rejoignent la seule liste terminée par une virgule, sinon code 2.
11. **Erreurs (code 2)** : ligne `COPIE ERREUR lot=<LOT> : <motif>` ; en `-Json`, `{ synthese, horodatage, lot, copie, erreur, code }` ;
`-Sortie` n'est pas écrit en code 2 et exige un dossier existant (aucun dossier créé). Racine du jeu et de l'addon
vérifiées comme racines git (`rev-parse --show-toplevel`), sinon code 2 (git remonterait au dépôt parent).
12. **`-Autorise`** : chemin relatif au dépôt, à la copie (`Content/Modules/…` pour Modules) ou absolu ; `*` et `?` acceptés.
13. **Contexte de la fiche** : HEAD réel `ae5d5e4` (fiche : `06dfb55`), sans effet (MD5 de départ = instantané) ;
assets `Content\LifePlay\GI.uasset` inexistants, remplacés par `Content\BPs\GI.uasset` et `Content\BPs\GM.uasset` (Glob).
14. **Essais PROC** : copies de `cmd.exe` renommées `LifePlayFauxOUTC.exe` et `7z.exe` dans le scratchpad, lancées
deux fois environ 30 s (06:46:49-06:47:24, 06:50:00-06:50:33, arrêt seul, `restants=0`). Elles apparaissaient
comme famille `Jeu` dans un UeState complet d'une autre session pendant ces fenêtres. Ce n'est pas le jeu.
15. **Skill lp-validate** non invoqué : fins de ligne contrôlées par `FileCheck.ps1` et comptage d'octets (`tr`), selon
la mémoire `eol-check-etat-lf`.
## 3. Instantané
`D:\Game\LifePlay_Backup_5.5\OUTC\manifest.csv` (pris par l'orchestrateur à 06:26:32) : `Tools\CopieEtat.ps1`
Existed=False ; `Tools\UeState.ps1` `A47107D53ED98A6914598BAA19567887` ; `Tools\FileCheck.ps1`
`CA9CBA1654A5762B4D3A189647A282CA` ; copies dans `D:\Game\LifePlay_Backup_5.5\OUTC\Tools\`. Repli proposé, non lancé :
`Tools\Restore.ps1 -Lot OUTC`.
## 4. Ce qui n'a pas été fait
- Code 0 de V3/V4 sur la **copie réelle** après le correctif P9 : l'éditeur PID 7972 de la copie 5.8 tournait
pendant tous les essais (alerte `PROC` à juste titre). Code 0 prouvé sur `copie-propre` (dépôts jetables) et sur la
copie réelle en passe 1 (06:46, `V4-reel-Reference` code 0) avant le correctif, journal de la passe 1 écrasé
par la passe 2 (seule la sortie de la commande l'atteste).
- Non essayés : `-WaitExit -Json` expiré (code 2) ; entrées git renommées (`R`) ; chemins non ASCII ; CopieEtat sur
la copie 5.5 (seul `UeState -Copie 'D:/Game/LifePlay-master 5.5/'` essayé : 0 processus) ; verrou `vide`.
- Erreur de liaison de pwsh lui-même (paramètre inconnu `-Foo`) : code 1 de pwsh, pas 2 (limite, non contournée).
- `pwsh -Command "& '<script>' …"` rend 0/1 (statut de la commande), pas le code du script : ajouter
`; exit $LASTEXITCODE` (constaté sur `FileCheck-Json-Absent` : processus 1, JSON `code=2` ; même règle pour l'ancienne version).
- Aucun commit, aucune entrée CHG, aucune modification de skill ni d'agent.
## 5. Points à confirmer en VAL
- V1 : `git ls-files --eol` et `FileCheck.ps1` sur les 3 fichiers : LF, pas de BOM, aucun octet > 0x7F dans `CopieEtat.ps1`.
- V2 : sortie octet pour octet et code identiques à `D:\Game\LifePlay_Backup_5.5\OUTC\Tools` pour UeState (sans paramètre, `-Brief`, `-Kind Editeur -Brief`, avec et sans processus) et FileCheck (liste, `-Lot OUTC`, `-OnlyChanged`, introuvable, manifeste absent, dossier) : 10/10 IDENTIQUE avant et après installation.
- V3/V4 sur la copie réelle, éditeur 5.8 fermé : code 0, `modifies=0` avec `-Reference` (et `-Autorise` des 3 entrées addon en cours si elles sont encore là).
- V5 : codes 1 et type d'alerte : `ASSET_ABSENT`, `ASSET_MODIFIE` (référence falsifiée), `GIT` (copie factice et état réel non déclaré), `PARASITE` (3 dossiers factices, `publication\PUB2\neutral\Docs` non compté), `PROC` (faux processus, éditeur réel).
- V6 : code 2 pour `-Copie` inexistante et `-Reference` introuvable (texte et `-Json`), plus copie hors table sans `-Addon`, copie non dépôt, `-Lot` absent, Modules introuvable.
- Durée < 30 s sur la copie 5.8 : 4,5 s mesurés (`duree_s` interne 3,9 s).
- Filtre P9 : `5.8b` exclu, `/` accepté, `..` résolu (PID 7972), `-WaitExit -Copie` attend les seuls processus de la copie (18 s, le faux `5.8b` ignoré).
- Ajouts Big Boss B1-B5 présents dans la synthèse et le JSON (`7z` en `copie` et en `autres`, `jeu_hors_docs`, `jeu_docs`, `head=`, `verrou=93:libre` et `10:occupe` factice, `cpu=`).
- Relecture des 3 diffs en entier (V11) : aucune commande git d'écriture, aucun `Remove-Item`.
## 6. Fichiers à commiter
Dépôt jeu, copie `D:\Game\LifePlay-master 5.8`, branche `ue5.8` :
A Tools/CopieEtat.ps1
M Tools/UeState.ps1
M Tools/FileCheck.ps1
A Docs/Migration/etat/OUTC/OUTC-T1-IMPL.md
(`Docs/Migration/etat/OUTC/OUTC-T1_essais.txt` : `.txt` sous `etat\`, ignoré par git, non commité.)
## 7. Table des essais (rubrique 7 de la fiche)
Toutes les commandes sont lancées par `pwsh -NoProfile -File`, dossier courant = copie 5.8. Durées mesurées par
`Stopwatch` autour du processus (lancement de pwsh compris). `<S>` = scratchpad, `<P>` = copie 5.8.
| Essai | Commande (abrégée) | Code | Durée | Ligne de synthèse / résultat |
|---|---|---|---|---|
| NR ×10 (scratch, puis Tools) | ancienne vs neuve, voir § 5 V2 | = | 0,5-1,3 s | 10/10 IDENTIQUE (MD5 stdout + stderr + code), deux fois |
| NR avec processus | `UeState.ps1` pendant les faux processus | 1 / 1 | 1,2 s | IDENTIQUE |
| UeState-Copie58-Json | `UeState.ps1 -Copie <P> -Json` (faux processus) | 1 | 1,2 s | JSON valide ; `processus=2 editeur=1 … jeu=1` ; PID 7972, 25260 (pas 35976 `5.8b`) |
| UeState-WaitExit-Copie-Json | `-Copie <P> -Kind Jeu -WaitExit -TimeoutSeconds 90 -Json` | 0 | 18,1 s | JSON seul, `"attente": "terminee apres 17 s"` (`OUTC-T1_essais.txt` l. 410) |
| FileCheck-Json ×4 | `-Json` liste / `-Lot OUTC` / introuvable / manifeste absent | 0 / 0 / 2 / 2 | 0,6-1 s | JSON valide, `Taille`, `Modifie` ; introuvables listés ; `erreur` (code 2 via `-File`) |
| V3-reel-Sortie | `CopieEtat.ps1 -Lot OUTC -Copie <P> -Assets GI,GM -Sortie <S>\ref.json` | 1 | 4,5 s | `COPIE ALERTE … proc=1 assets=2 absents=0 modifies=0 git=1/3/0 hors_declares=3 parasites=0 jeu_hors_docs=5 jeu_docs=95 head=ae5d5e4/3f94b5e/c8661cd verrou=93:libre … alertes=PROC,GIT` ; `ref.json` valide, LF, sans BOM, ASCII |
| Contrôle MD5 | `FileCheck.ps1 GI, GM` | 0 | — | `FE4406A0…` / `DAC10494…` = MD5 de CopieEtat |
| V3-reel-Autorise | + `-Autorise` des 3 fichiers addon en cours | 1 | 4,6 s | `hors_declares=0 … alertes=PROC` (éditeur 7972) |
| V4-reel-Reference (+ `-Json`) | `-Reference <S>\ref.json` | 1 | 4,7 s | `modifies=0 hors_declares=0 alertes=PROC` ; passe 1 (avant § 2.5) : code 0 `COPIE OK` |
| Code0-copie-propre | `-Copie <S>\copie-propre -Addon … -ModulesGitDir … -Assets Content\BPs\A.uasset -Sortie` | 0 | 4,1 s | `COPIE OK … git=1/0/0 hors_declares=0 parasites=0 … verrou=-:absent alertes=aucune` |
| Code0-copie-propre-Reference | + `-Reference <S>\propre.json -Json` | 0 | 4,1 s | JSON valide, `code=0` |
| V5-asset-absent | `-Assets GI,Content\BPs\Absent_OUTC.uasset` | 1 | 4,5 s | `absents=1 … alertes=PROC,ASSET_ABSENT` |
| V5-md5-falsifie | `-Reference <S>\ref-falsifie.json` | 1 | 4,7 s | `modifies=1 … alertes=PROC,ASSET_MODIFIE` (md5 0…0 → FE4406A0…) |
| V5-md5-falsifie-Autorise | + `-Autorise Content/BPs/GI.uasset` | 1 | 4,5 s | `modifies=1 … alertes=PROC` (plus d'`ASSET_MODIFIE`) |
| V5-reel-non-declare | sans `-Assets` | 1 | 4,4 s | `hors_declares=4 … alertes=PROC,GIT` (GI.uasset + 3 addon) |
| Usage-liste-espace | `-Assets GI, GM` (deux jetons) | 1 | 4,5 s | `assets=2` (passe 1 sans `PositionalBinding=$false` : `assets=1`) |
| V5-factice | `-Copie <S>\copie-factice -Addon … -ModulesGitDir … -Assets Content\BPs\A.uasset -Sortie` | 1 | 4,3 s | `git=3/0/1 hors_declares=3 parasites=3 … verrou=10:occupe alertes=GIT,PARASITE` ; parasites `X\etat`, `Y\Docs`, `Z\Migration` ; `publication\PUB2\neutral\Docs` non compté |
| V5-factice-Autorise-Json | + `-Autorise Content/x-non-declare.txt,Content/Modules/M1/* -Json` | 1 | 4,2 s | JSON valide ; `hors_declares=0 … alertes=PARASITE` |
| PROC-reel-faux | V4 pendant les faux processus | 1 | 5 s | `proc=3` : éditeur 7972, faux `Jeu` 25260, 7z 28036 (`/`) ; `autres` : 35976 (`5.8b`), 7z 35860 (5.5) |
| V6-copie-inexistante | `-Copie <S>\copie-inexistante` | 2 | 0,6 s | `COPIE ERREUR lot=OUTC : copie introuvable : …` |
| V6-reference-introuvable (+ `-Json`) | `-Reference <S>\ref-inexistante.json` | 2 / 2 | 0,6 s | `COPIE ERREUR … reference introuvable` ; JSON `code=2` |
| Code2 ×4 | hors table sans `-Addon` ; copie non dépôt ; sans `-Lot` ; Modules introuvable | 2 ×4 | 0,5-0,8 s | motif précis à chaque fois |
| T-V3 / T-V4 / T-V4-Json (Tools, copie par défaut) | `Tools\CopieEtat.ps1 -Lot OUTC -Assets GI,GM …` | 1 / 1 / 1 | 4,5 s | `hors_declares=0 modifies=0 alertes=PROC` (éditeur 7972) ; `duree_s=3.9` |
Tours : 31 / 75 (60 de la fiche + 15 accordés par l'orchestrateur pour les ajouts B)
## Constats
- L'éditeur PID 7972 (mode `-game`, lancé depuis `D:\Game\LifePlay-Sandbox-5.8\Tools\debug\` avec un chemin relatif
vers `LifePlay-master 5.8\LifePlay.uproject`) est un cas réel du piège P9 : la colonne `Copy` d'UeState (inchangée)
affiche `LifePlay-Sandbox-5.8` pour un processus de la copie 5.8. Seuls `-Copie` et CopieEtat le rattachent à la bonne copie.
- Piège à reporter dans `sk-windows-shell` (lot DOC) : `pwsh -File` lie en position un jeton orphelin d'une liste
`a, b` au paramètre suivant **sans erreur** ; parade : `[CmdletBinding(PositionalBinding = $false)]`.
- `git status --porcelain -- Tools` montre aussi `M Tools/EtatDir.ps1` et `?? Tools/GitEtat.ps1`, `Numero.ps1`,
`Verrou.ps1` : pas de mon fait (autres fiches OUTC ; `EtatDir.ps1` modifié à 06:32:38, avant mon installation de 06:51).
- `ConvertFrom-Json` (pwsh 7) transforme les dates ISO en `DateTime` : un consommateur de ces JSON qui réécrit le
JSON doit les reformater (fait dans CopieEtat, `Format-LPDate`).