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 : `\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 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= : ` ; 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 "& '