LifePlay-Revival/Docs/Migration/etat/OUTC/OUTC-VAL-A.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

129 lines
25 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-T4a — Niveau N1 — Modèle prévu sonnet | utilisé claude-sonnet-5-5 — Agent lp-validator — Skills sk-protocol, sk-recount, debug-verification, lp-validate (invoqués), sk-windows-shell (non invoqué : pièges `pwsh -File` / `-Command` appliqués, voir § 3)
# OUTC-VAL-A : VAL indépendante de CopieEtat.ps1, UeState.ps1, FileCheck.ps1, EtatDir.ps1 (2026-10-11)
Périmètre : partie « a » du découpage de `fiches\OUTC-T4.md` (V1, V2, V3, V4, V5, V6, V11, V12 pour ces 4 fichiers). V7 à V10 et le verdict des 3 autres scripts : `OUTC-VAL-B.md` (T4b). Verdict global du lot = le pire des deux.
Sorties brutes : `OUTC-VAL-A_essais.txt` (3 400 lignes, même dossier). JSON de l'essai réel : `OUTC-VAL-A_copieetat.json`. Scripts d'essai : `<scratchpad>\OUTC-T4a\` (`h.ps1` harnais, `t1`, `t1b`, `t3a`, `t4`, `t5`, `t6`, `t7`, `bg.ps1`, dépôts factices sous `fx\`). Rien supprimé.
Copie `D:\Game\LifePlay-master 5.8`, branche `ue5.8`, HEAD `ae5d5e4`. MD5 des 4 scripts relevés à 07:07 puis inchangés (mtime 06:32 à 06:48) : `CopieEtat` `4A83F321…`, `UeState` `736FBF15…`, `FileCheck` `1FD13C70…`, `EtatDir` `5E18EC5B…` (= IMPL T1 et T6). Ancienne version (référence V2, V12) : `D:\Game\LifePlay_Backup_5.5\OUTC\Tools\` ; ses MD5 `A47107D5…`, `CA9CBA16…`, `28274CB7…` sont égaux à ceux du manifeste et à `git show HEAD:Tools/<f> | md5sum` (établi).
## 1. Fiches amont relues
Relues en entier : `fiches\OUTC-T4.md` (dont « Découpage »), `OUTC-SPEC.md` (§ 1 à 8), `OUTC-T1-IMPL.md`, `OUTC-T6-IMPL.md`, les 4 scripts (CopieEtat 460 l., UeState 167 l., FileCheck 203 l., EtatDir 62 l.), les 3 diffs `git diff -- Tools/UeState.ps1 Tools/FileCheck.ps1 Tools/EtatDir.ps1`, l'instantané `D:\Game\LifePlay_Backup_5.5\OUTC\manifest.csv`, `gabarits.md` (VAL).
Non relues, reportées à T4b : `OUTC-T2-IMPL.md` et `OUTC-T3-IMPL.md` (Verrou, Numero, GitEtat : hors du périmètre « a » ; l'ordre de l'orchestrateur ne les citait pas).
## 2. Points à confirmer des IMPL
`OUTC-T1-IMPL.md` § 5 :
| Point | Verdict | Preuve |
|---|---|---|
| V1 : LF, sans BOM, aucun octet > 0x7F dans CopieEtat | PASS | § 3 V1 |
| V2 : UeState et FileCheck identiques à l'ancienne version (sans paramètre, `-Brief`, `-Kind Editeur -Brief`, listes, `-Lot OUTC`, `-OnlyChanged`, introuvable, manifeste absent, dossier) | PASS | § 3 V2 : 14 cas + 4 cas de liste, octets de stdout, stderr et code égaux ; 1 seule différence de texte, attendue (trace d'exception, voir V2) |
| V3 / V4 sur la copie réelle, éditeur fermé : code 0, `modifies=0` | PASS (code 0 obtenu à 07:01:42, après la fermeture de l'éditeur PID 7972) | § 3 V3, V4 |
| V5 : codes 1 et type d'alerte `ASSET_ABSENT`, `ASSET_MODIFIE`, `GIT`, `PARASITE`, `PROC` | PASS | § 3 V5 |
| V6 : code 2 (`-Copie` inexistante, `-Reference` introuvable, copie hors table sans `-Addon`, copie non dépôt, `-Lot` absent, Modules introuvable) | PASS | § 3 V6 |
| Durée < 30 s | PASS | 4,1 à 5,8 s pwsh compris (`Measure-Command` 4,1 s) ; `duree_s` 4,6 |
| Filtre P9 : `5.8b` exclu, `/` accepté, `..` résolu, `-WaitExit -Copie` n'attend que la copie | PASS | § 3 V3 (processus factices) ; `..` aussi sur le vrai éditeur PID 7972 à 07:00 (UeState `-Copie` l'a retenu, colonne Copy `LifePlay-Sandbox-5.8`) |
| Ajouts Big Boss B1 à B5 dans la synthèse et le JSON | PASS (B1 `7z` sur copie factice seulement) | § 3 V3 |
| V11 : 3 diffs relus, aucune commande git d'écriture, aucun `Remove-Item` | PASS | § 3 V11 |
`OUTC-T6-IMPL.md` § 6 (V12) :
| Point | Verdict | Preuve |
|---|---|---|
| P1 : rejouer les 17 cas et les 2 absolus, comparer à l'ancienne version | PASS | § 3 V12 : 30 cas (17 de T6, 2 absolus, 11 en plus) |
| P2 : `Build.ps1`, `RunCommandlet.ps1`, `ReimportCorrectif.ps1` s'analysent sans erreur et dot-sourcent `EtatDir.ps1` sans le modifier | PASS-STATIC (aucun appel réel, interdit : ils lancent UBT ou l'éditeur) | § 3 V12 |
| P3 : diff lu en entier ; LF, sans BOM, ASCII | PASS | § 3 V1, V11 |
`OUTC-SPEC.md` § 8 (ajouts de Big Boss), pour mémoire : 1 `7z` PASS (copie factice), 2 `jeu_hors_docs` / `jeu_docs` PASS, 3 `head=` PASS, 4 `verrou=` PASS (libre réel, occupé factice avec `qui.txt` ; état `vide` non essayé), 5 `cpu=` PASS, 6 remplacement en une écriture PASS-STATIC (écriture passée : relevée seulement par `LastWriteTime`, MD5 de départ = instantané), 7 EtatDir PASS (V12).
## 3. Critères rejoués
Toutes les commandes sont lancées par `pwsh -NoProfile -File <script> …` depuis la copie 5.8, code relevé par `Process.ExitCode` (harnais `h.ps1`) ; les listes de fichiers de FileCheck par `pwsh -NoProfile -Command "& '<script>' a, b …; exit $LASTEXITCODE"` (un `-File a,b` arrive en une seule chaîne). Toutes les lignes brutes sont dans `OUTC-VAL-A_essais.txt` (repère `=== <nom d'essai>`).
| # | Commande (abrégée) | Code relevé | Attendu | Verdict |
|---|---|---|---|---|
| V1 | octets des 4 fichiers + `FileCheck.ps1 Tools\CopieEtat.ps1, Tools\UeState.ps1, Tools\FileCheck.ps1, Tools\EtatDir.ps1` + `git ls-files --eol` | FileCheck 0 | LF, sans BOM, ASCII | PASS |
| V2 | ancien (Backup) vs neuf : UeState ×6, FileCheck ×8 en `-File`, ×4 listes en `-Command` (18 paires) | codes égaux dans les 18 paires : UeState 1, 1, 1, 0, 0, 2 ; FileCheck 2, 1 (jetons), 0, 0, 2, 2, 0, 1 ; listes 0, 2, 0, 0 | sorties et codes identiques | PASS |
| V3 | `CopieEtat.ps1 -Lot OUTC -Assets Content\BPs\GI.uasset,Content\BPs\GM.uasset -Autorise <3 fichiers addon> -Sortie …\OUTC-VAL-A_copieetat.json` | 0 à 07:01:42 (4,6 s) ; avant, à 07:00 : 1 `PROC,GIT`, puis 1 `PROC` | 0 si rien ne tourne et état déclaré | PASS |
| V4 | idem `-Reference <json V3>` (texte, `-Json`, + `-Autorise`) | 0, 0, 0 à 07:02 ; `modifies=0` | 0, `modifies=0` | PASS |
| V5 | `ASSET_ABSENT`, `ASSET_MODIFIE`, `GIT`, `PARASITE`, `PROC` | 1 à chaque cas | 1 et type d'alerte | PASS |
| V6 | `-Copie` inexistante, `-Reference` introuvable, etc. | 2 ×11 | 2 | PASS |
| V11 | `git diff` ×3 lu en entier ; CopieEtat lu en entier ; Grep | — | aucune commande git d'écriture, aucun `Remove-Item` | PASS |
| V12 | `Resolve-LPEtatDir … -NoCreate`, ancien vs neuf, 30 cas | 0 / 0 | différences = table de T6 § 4 | PASS |
**V1.** Octets lus par `[IO.File]::ReadAllBytes` : CopieEtat 24 300 o, CR 0, LF 460, > 0x7F 0, BOM non ; UeState 6 964 o, CR 0, LF 167 ; FileCheck 10 895 o, CR 0, LF 203 ; EtatDir 3 697 o, CR 0, LF 62 ; dernier octet 10 partout (`FileCheck.ps1` : `LF=4 alertes=0`). `git ls-files --eol` : `i/lf w/lf` pour UeState, FileCheck, EtatDir ; CopieEtat (non suivi, `-o`) `w/lf`. Grep `[^\x00-\x7F]` non rejoué (les octets > 0x7F sont comptés à 0). Analyse syntaxique Windows PowerShell 5.1.26100 : 0 erreur pour les 4.
**V2.** Baseline vérifiée (MD5 de Backup = manifeste = `HEAD`). Comparaison stdout + stderr + code (+ MD5 de la concaténation) pour : `UeState` défaut, `-Brief`, `-Kind Editeur -Brief`, `-Kind Jeu`, `-Kind Jeu -WaitExit -TimeoutSeconds 5`, `-Kind Editeur -WaitExit -TimeoutSeconds 3 -Brief` (code 2, éditeur PID 7972 vivant) ; `FileCheck` (avec `-ProjectRoot` explicite, sinon l'ancienne version prendrait le dossier Backup) `Tools\Build.ps1,Tools\Snapshot.ps1` (une chaîne : introuvable, code 2), deux jetons (erreur de liaison, code 1), `-Lot OUTC`, `-Lot OUTC -OnlyChanged`, introuvable, manifeste absent, dossier, sans argument ; listes `-Command` : `Build, Snapshot` (0), avec introuvable (2), 4 fichiers `-Lot OUTC` (0), `-OnlyChanged` (0). 17 paires sur 18 identiques octet pour octet. La dernière (sans argument, `throw 'Indiquer des fichiers…'`, code 1) ne diffère que par la trace d'exception : chemin du script et numéro de ligne (111 → 127, lignes ajoutées plus haut) ; après neutralisation du chemin, de la ligne et des séquences ANSI, stderr est identique, stdout identique (`Projet : …`), même code. Alertes de FileCheck (code 1) prouvées sur un lot factice : `-Lot LOTX -BackupRoot <scratch>` fichier LF passé en CRLF → `ALERTE FINS`, code 1, ancien = neuf ; `g-mixte.txt` → `MIXTE`, code 1, ancien = neuf. `FileCheck -Json` (hors V2, SPEC § 3.1) : JSON seul valide, codes 0 (fichier propre : MD5, `Taille`, `Modifie` = `Get-FileHash` / `Get-Item`), 1 (`FINS`, `MIXTE`), 2 (introuvable listé dans `introuvables`, manifeste absent `{erreur, code=2}`), `-Lot OUTC` : 7 MD5 du JSON = 7 MD5 du texte, même ordre.
**V3.** Essai réel, copie 5.8, HEAD `ae5d5e4`. Chronologie : 06:57 UeState : éditeur `UnrealEditor.exe` PID 7972 (lancé 06:44:21 par un tiers, `-game`, chemin relatif `LifePlay-Sandbox-5.8\Tools\debug\..\..\..`) vivant ; 07:00 CopieEtat sans `-Autorise` : code 1, `alertes=PROC,GIT` (3 entrées addon non déclarées : `LPSandboxModWrappers.cpp` `[ M]`, `LPSandboxCharGenMod.cpp` et `.h` `[??]`, identiques à `git status` de `D:\Game\LifePlay-Sandbox-5.8` relevé au même moment) ; avec `-Autorise` des 3 : code 1, `alertes=PROC` seul. Sonde `UeState -Copie` toutes les 60 s : 07:00:34 code 1, 07:01:35 code 0 (l'éditeur a disparu entre les deux sans mon intervention). 07:01:42 : code 0.
Synthèse (1 ligne) : `COPIE OK lot=OUTC copie=LifePlay-master 5.8 proc=0 assets=2 absents=0 modifies=0 git=1/3/0 hors_declares=0 parasites=0 jeu_hors_docs=8 jeu_docs=106 head=ae5d5e4/22dd7c3/c8661cd verrou=95:libre cpu=29% alertes=aucune`.
JSON `OUTC-VAL-A_copieetat.json` : 16 275 o, sans BOM, CR 0, ASCII, `ConvertFrom-Json` OK, champs `synthese, horodatage, duree_s, lot, copie, depots, processus, assets, git, parasites, verrou, cpu, alertes, code` (`code`=0). Contrôles croisés :
- MD5 : GI `FE4406A0294A8001F612CD03EE2C20CC` et GM `DAC10494BFE32F708CCD1FE427E6DD48` identiques dans le JSON de CopieEtat, dans `FileCheck.ps1 -Json` et dans `Get-FileHash -Algorithm MD5` (une seule fois, contre-preuve) ; taille (52 553 784 et 21 349) et date égales à `Get-Item`.
- B2 : `jeu_hors_docs=8`, `jeu_docs=106` = `git status --porcelain --untracked-files=all` du jeu (114 = 8 + 106, relevé à 07:00 et à 07:07) ; `git=1/3/0` = jeu `Content Config Source` 1 (GI), addon 3, Modules 0.
- B3 : `head=` jeu `ae5d5e4` (branche `ue5.8`), addon `22dd7c3` (`ue5.8`), Modules `c8661cd` (`main`) = `git rev-parse --short HEAD` / `branch --show-current` des 3 dépôts.
- B4 : `verrou=95:libre` à 07:01:42 ; le dossier réel a ensuite reçu `96` (07:03:18) et `96-libre` (07:03:46) d'une autre session ; je n'ai rien écrit dans `VERROU` (lecture seule dans CopieEtat). Cas occupé sur copie factice (`9`, `9-libre`, `10` sans `-libre`) : `verrou=10:occupe`, `qui` lu (ordre numérique, pas alphabétique).
- B5 : `cpu=29%` (échantillon instantané, `Win32_Processor.LoadPercentage` ; 0 % relevé à la main plus tard : valeur de charge, non comparable).
- B1 : sur copie factice `fx\copie-x`, avec 6 processus factices (copies de `cmd.exe` dans le scratchpad, `ping -n`, fin spontanée en 14 à 45 s) : `7z.exe` dont la ligne de commande cite la copie → `processus.copie` + alerte `PROC` (PID 11008, `Start`, `Exe` renseigné) ; `7z.exe` hors copie → `processus.autres` ; sur la copie réelle aucun 7z à ce moment (non rejoué en réel pour ne pas fausser les CopieEtat des autres sessions).
- P9 : 3 `LifePlayFauxT4a.exe` citant la copie factice par chemin direct, par `…/Content` entre guillemets, par `…\sub\..\copie-x\…` : retenus (`UeState -Copie fx -Kind Jeu -Json` : `compte='processus=3 jeu=3'`) ; le 4e citant `copie-xb` : exclu (dans `autres` de CopieEtat) ; racine en MAJUSCULES avec `/` final : mêmes 3 PID. `-WaitExit -Copie` : code 0 après 17 s alors que le processus `copie-xb` tournait encore (45 s). `UeState -Copie "D:/Game/LifePlay-master 5.5/" -Json` : 0 processus, code 0. `-WaitExit -Json` expiré (`-TimeoutSeconds 3`) : code 2, `attente='expiree apres 4 s …'`, stdout = JSON seul.
- Instantané : avec le manifeste `OUTC` (Tools\*), `instantane` = `modifie` (UeState, EtatDir), `nouveau` (CopieEtat), `pas sauvegarde` (Build.ps1 et un fichier absent) ; sans alerte propre.
- Durées : 4,1 à 5,8 s pwsh compris (7 mesures de CopieEtat réel), `Measure-Command` 4,1 s ; `duree_s` 4,6.
Le fichier livré est une copie (`Copy-Item`, `bg.ps1`) de `bg-v3.json`, écrit par `-Sortie` du même appel de code 0 ; une version de code 1 (07:00, `alertes=PROC`) avait été écrite d'abord au même chemin par `-Sortie` et a été écrasée (sa synthèse est dans `OUTC-VAL-A_essais.txt`, `=== V3-reel-avec-Autorise`).
**V4.** 07:02 : `-Reference <json V3>` : code 0, `modifies=0`, `hors_declares=0` (texte) ; `-Json` : 0 ; avec `-Autorise` : 0. Rejeu à 07:08 : V3 frais avec `-Autorise` (5 chemins : 2 nouveaux fichiers addon `LPSandboxScene.cpp` et `.h` `[ M]` apparus entre-temps) code 0 ; `-Reference <ce V3 frais>` code 0 `modifies=0`. `-Reference <OUTC-VAL-A_copieetat.json>` à 07:08 : code 1, `modifies=0`, `hors_declares=2`, `alertes=GIT` : les deux fichiers de `LPSandboxScene` ne figuraient pas dans la référence de 07:01 (changement réel d'un autre lot), alerte correcte, pas un défaut. La référence livrée est donc périmée dès que d'autres lots modifient l'addon, par conception de la SPEC (Q1).
**V5.** Copie factice `fx\copie-x` (dépôts `git init` du scratchpad, nom hors table : `-Addon`, `-ModulesGitDir`) ; cas, code et alertes (texte) :
- `F0` propre (avec/sans `-Assets`, `-Reference`, `-Json`) : 0 ×4, `alertes=aucune` (code 0 sur dépôts propres).
- `ASSET_ABSENT` (`-Assets A.uasset,Content\BPs\Absent_T4a.uasset`) : 1, `absents=1`.
- `ASSET_MODIFIE` : `-Reference` à MD5 falsifié (32 zéros) : 1, `modifies=1`, `(md5 0000… -> 43BDFDB8…)` ; + `-Autorise Content/BPs/A.uasset` : 0 (`modifies=1`, pas d'alerte) ; modification réelle du fichier après la référence : 1, `ASSET_MODIFIE`.
- `GIT` : fichier non suivi dans le jeu (`jeu [??] Content/x-nondecl.txt`) : 1 ; `-Autorise` : 0 ; `-Reference` d'une sortie qui le contenait : 0 ; fichiers non suivis dans l'addon et dans Modules : 1 (`addon [??]`, `modules [??] M1/nouveau.txt`) ; `-Autorise` avec jokers (`Content/Modules/M1/*`) : 0.
- État réel non déclaré : copie 5.8, 07:00 et 07:08 : 1 `GIT` (3 puis 5 entrées addon d'autres lots), rapproché de `git status` de l'addon ; avec `-Autorise` : 0.
- `PARASITE` : `etat\X\etat`, `etat\Y\Docs\Migration`, `etat\Z\Migration`, `etat\U58\etat\deep\etat` : 1, `parasites=4` (`U58\etat`, `X\etat`, `Y\Docs`, `Z\Migration` : le plus haut seulement) ; `publication\PUB2\neutral\Docs\Modding` présent et non compté.
- `PROC` : copie 5.8, 07:00 : 1, `ALERTE PROC : Editeur PID 7972 UnrealEditor.exe depuis 2026-10-11T06:44:21 LifePlay-Sandbox-5.8` (éditeur réel, rattaché par la règle `..`) ; copie factice : 3 `Jeu` + 1 `7z` citant la copie : 1, `proc=4`.
**V6.** Code 2, texte puis `-Json` (`code`=2 dans le JSON) : `-Copie` inexistante ; `-Reference` introuvable ; `-Reference` illisible (JSON invalide) ; sans `-Lot` ; `-Lot 'a b/c'` ; copie hors table sans `-Addon` ; `-Sortie` dans un dossier inexistant (aucun dossier créé : `Test-Path` faux) ; Modules introuvable ; copie qui n'est pas un dépôt ; asset qui est un dossier ; argument orphelin (`-Assets a b`, sans virgule finale). `-Assets 'a,' b` (liste en deux jetons) accepté : `assets=2`. Aucun fichier JSON n'est écrit en code 2.
**V11.** Relu en entier : les 3 diffs (EtatDir 21 lignes, FileCheck 49, UeState 66 ; `git diff --stat` : 125 insertions, 11 suppressions) et `CopieEtat.ps1` (460 l.). Les 11 lignes retirées sont réécrites sous garde `-not $Json` ou étendues : `[string]$BackupRoot…,`, le test du manifeste, les lignes `Lot` et `Projet`, `introuvable` (FileCheck, 5) ; `[switch]$Brief` et deux lignes d'attente (UeState, 3) ; la ligne de doc `-EtatDir`, `$dir = if …`, la règle `OUT\d*` (EtatDir, 3). Grep `Remove-Item|\brm\b|Set-Content|Out-File|git (add|commit|reset|checkout|restore|push|rm|mv|tag|stash|merge|rebase)|'(add|commit|…)'` sur les 4 : aucune occurrence. Les seules sous-commandes git de CopieEtat sont `status --porcelain=v1 -z --untracked-files=all`, `rev-parse --short HEAD`, `rev-parse --show-toplevel` et `branch --show-current` (l. 173, 181, 182, 192). Seule écriture : `-Sortie` (l. 451, `WriteAllText` UTF-8 sans BOM, dossier existant exigé). Aucune ligne hors périmètre.
**V12.** `Resolve-LPEtatDir … -NoCreate` sur 30 cas, ancienne vs nouvelle version (script `etatdir-test.ps1`) : 17 identiques (U8, STE, OUT1, OUTC, OUTX2, ZZZ, PUB2, ETAT2, PROP, SK, L7i, `-EtatDir OUTC`, `publication\PUB2\neutral\Docs`, `D:\Temp\abs`, absolu `…\etat\OUTC`, lot invalide, `OUT*`) et 13 différents, tous conformes à `OUTC-T6-IMPL.md` § 4 : `OUTC-T1` et `OUTC-T4a` → `etat\OUTC` (avant `etat\OUTC-T1`, `etat\OUTC-T4a`) ; `Docs\Migration\etat\OUTC`, `Docs/Migration/etat/U58/U8`, `etat\OUTC`, `.\etat\OUTC`, `ETAT\OUTC`, `docs\migration\ETAT\OUTC` → dossier propre (avant : parasites) ; `U58\etat\U8`, `…\Docs\Migration\etat\Docs\Migration\etat\X`, absolu `…\etat\U58\etat` → exception « dossier parasite refusé » ; `etat` et absolu `…\Docs\Migration\etat` → exception (racine). Création réelle sur racine factice : `ZZ9` (avertissement « hors table ») et `OUTC-T9` → `etat\OUTC` créés ; `U58\etat\Q` refusé et `etat\U58` non créé. P2 : `Parser::ParseFile` 0 erreur pour `Build.ps1`, `RunCommandlet.ps1`, `ReimportCorrectif.ps1` (pwsh 7) et `Build.ps1` (5.1) ; `git diff --stat` de ces 3 : vide ; ils appellent `Resolve-LPEtatDir $ProjectRoot $Lot $EtatDir [-NoCreate]` (`Build.ps1:51-52`, `RunCommandlet.ps1:38-39`, `ReimportCorrectif.ps1:37-39`), signature inchangée. Non rejoué : un appel réel de ces trois scripts.
## 4. Diff lu en entier
- 3 fichiers modifiés : `Tools/EtatDir.ps1` (+18 −3), `Tools/FileCheck.ps1` (+44 −5, les 5 retirées réécrites sous garde), `Tools/UeState.ps1` (+63 −3), total 125 insertions, 11 suppressions (`git diff --stat`, recompté). UeState + FileCheck = 107 insertions et 8 suppressions : égal au compte de T1.
- 1 fichier neuf lu en entier : `Tools/CopieEtat.ps1` (460 lignes, non suivi).
- Écriture hors périmètre : aucune constatée ; `git status --porcelain -- Tools` : `M` EtatDir, FileCheck, UeState ; `??` CopieEtat, GitEtat, Numero, Verrou (les trois derniers : T4b).
## 5. Verdict
**PASS** pour la partie « a » (V1, V2, V3, V4, V5, V6, V11, V12) : tous les critères rejoués conformes, codes 0, 1 et 2 prouvés pour chacun des scripts qui en ont (CopieEtat 0/1/2 ; UeState 0/1/2 ; FileCheck 0/1/2, texte et `-Json` ; EtatDir : exceptions, pas de code), essai réel de V3 fait sur la copie 5.8 avec code 0 à 07:01:42. Réserves sans effet sur le verdict : § Constats 1 à 5.
## 6. Points à confirmer par l'utilisateur
- [ ] Le changement de comportement d'`EtatDir.ps1` (`OUTC-Tn` → `etat\OUTC\` ; un `-EtatDir` désignant la racine ou un parasite lève une exception) est accepté : il était voulu par Big Boss (T6 § 2), mais il touche `Build.ps1`, `RunCommandlet.ps1` et `ReimportCorrectif.ps1`, jamais exécutés ici.
- [ ] Les deux écarts de procédure de la fiche (Constats 1 et 2) sont acceptés.
- [ ] Un essai de `CopieEtat` avec un vrai `7z.exe` citant la copie réelle n'est pas demandé (couvert par processus factices sur copie factice).
Tours : 30 / 40 (compte propre, à recouper par `python -I Tools/FicheStats.py --lot OUTC`)
## Constats
1. **Critère d'arrêt de la fiche (rubrique 9) : processus Unreal de la copie 5.8 pendant l'essai.** L'éditeur PID 7972 tournait au début de mes essais (06:57 à 07:00:34) ; je n'y ai pas touché et j'ai suivi le § 4 de la fiche (sonde toutes les 60 s) : il a disparu seul avant 07:01:35 ; les critères qui n'en dépendent pas ont été poursuivis, conformément au § 4. Le code 1 `PROC` constaté à 07:00 est une preuve réelle du code 1.
2. **Critère d'arrêt : le vrai verrou a changé pendant l'essai** : `96` créé à 07:03:18 et `96-libre` à 07:03:46 par une autre session (gardien), `95:libre` relevé par CopieEtat à 07:01:42. Noté. Je n'ai pas arrêté mes essais de V3/V4/V5/V6/V12, qui n'écrivent pas dans `VERROU` (V7 et V8 sont de T4b) ; l'orchestrateur décide si ce changement invalide quelque chose.
3. **`git status` et index** (estimé, non essayé) : `Invoke-LPGit` (`CopieEtat.ps1:144-157`) ne met pas `GIT_OPTIONAL_LOCKS=0` ; un `git status` peut rafraîchir l'index et prendre `index.lock` un instant, au risque d'une collision avec un commit du gardien lancé en même temps. À trancher par l'orchestrateur ; essai qui tranche : lancer CopieEtat pendant un `git commit` de test sur dépôt factice. (Corrigé par OUTC-T7, voir « Reprise T7 ».)
4. **Listes sous `pwsh -File`** : `FileCheck.ps1 a,b` arrive en une chaîne (introuvable) et `a b` donne une erreur de liaison (code 1 de pwsh) : comportement ancien, identique avant / après, hors périmètre. CopieEtat appelle FileCheck dans le processus avec un tableau, donc non concerné. `CopieEtat -Assets a b` (sans virgule finale) : code 2 explicite.
5. **Règle de la racine suivie d'un blanc** (`UeState.ps1:68`, `CopieEtat.ps1:123`) : `(?:\\|\s|$)` fait aussi retenir une ligne de commande où la racine est suivie d'un blanc puis de texte (p. ex. `…\LifePlay-master 5.8 fichier`) : voulu (ligne de commande), mais `…5.8 backup\x` serait aussi retenu ; cas rare, non essayé.
6. **Non essayé** : état `vide` du verrou ; entrées git renommées (`R`) ; chemins non ASCII ; CopieEtat sur la copie 5.5 ; `-Autorise` absolu ; `-Sortie` sur un fichier existant autrement que par l'écrasement du V3 ; `7z` sur la copie réelle ; `FileCheck -Json` sur un dossier avec `-Recurse`.
7. **Processus que j'ai lancés** (scratchpad seulement, copies de `cmd.exe` renommées `LifePlayFauxT4a.exe` et `7z.exe`, `ping -n 14 à 45`, fin spontanée constatée `HasExited`) : aucun processus existant touché ; pendant ces fenêtres (07:04 environ et 07:06) un `UeState` complet d'une autre session les aurait listés en famille `Jeu`.
8. **Fichiers à commiter** (dépôt jeu, `D:\Game\LifePlay-master 5.8`, branche `ue5.8`) : `A Docs/Migration/etat/OUTC/OUTC-VAL-A.md` (`.md` sous `etat\` : suivi). `OUTC-VAL-A_essais.txt` et `OUTC-VAL-A_copieetat.json` : ignorés par git (`.gitignore:75`, `check-ignore -v`), non commités. Aucun script modifié par moi ; les 4 scripts restent à commiter par le gardien comme annoncé par T1 et T6. Aucune écriture git de ma part.
## Reprise T7 (2026-10-11, après `OUTC-T7-IMPL.md`)
Objet : `CopieEtat.ps1` modifié par OUTC-T7 (`--no-optional-locks` ajouté à `Invoke-LPGit`), en réponse au Constat 3. Lu en entier : `OUTC-T7-IMPL.md`. Version installée : MD5 `5E441FA06F05B1F1D91B91DCAC5B023F` (= IMPL T7), mtime 07:11:44, `git ls-files --eol -o` : `w/lf`. Sorties brutes ajoutées en fin de `OUTC-VAL-A_essais.txt` (section `essais-t7.txt`) ; scripts `t8.ps1`, `t9.ps1` du scratchpad `OUTC-T4a\`. L'orchestrateur a accepté le suivi de la sonde du § 4 (Constat 1), le changement d'`EtatDir.ps1` et la référence périmée (V4) : ces points sont clos.
| Point | Verdict | Preuve |
|---|---|---|
| P1 : diff réduit à `Invoke-LPGit` | PASS | `diff CopieEtat.avant.ps1 Tools\CopieEtat.ps1` : 2 hunks seulement, l. 143 (commentaire, 1 ligne devenue 2) et l. 146-147 (`@('--no-optional-locks', '-c', 'core.quotePath=false')`). Le MD5 de `CopieEtat.avant.ps1` est `4A83F321…` = celui que j'ai validé en T4a. |
| P2 : `.git\index` non touché par `git status` de CopieEtat | PASS (dépôt factice) ; sans objet probant sur la copie réelle | Dépôt `fx\copie-x`, index rendu périmé (mtime d'un fichier suivi modifié, contenu identique) : version T1 (`CopieEtat.avant.ps1`) : index 07:01:37 → 07:14:54 (réécrit) ; version T7 : 07:14:54 → 07:14:54 (inchangé) ; `git status` classique (contre-preuve) : 07:14:54 → 07:15:01 (réécrit). Copie réelle, version T7 : `.git\index` 07:14:44.529 avant et après, 154 927 o, pas d'`index.lock` après. L'index réel n'était pas périmé : cet essai seul ne prouve rien, c'est le cas factice qui prouve. |
| P3 : V3 et V5 rejoués, mêmes codes | PASS pour V5, V6, V3/V4 hors code 0 réel ; **BLOCKED-PROC** pour le code 0 de V3/V4 sur la copie réelle | voir ci-dessous |
P3, détail (version installée) :
- V5 sur `fx\copie-x` : `ASSET_ABSENT` code 1 (`alertes=ASSET_ABSENT,GIT,PARASITE`), `ASSET_MODIFIE` avec `-Reference ref0.json` code 1 (`ASSET_MODIFIE,GIT,PARASITE`), `GIT,PARASITE` code 1. V6 : copie inexistante code 2, `-Reference` introuvable code 2. Mêmes codes et mêmes types qu'en T4a.
- V3/V4 code 0 : dépôts factices propres `fx2` (version T7) : `COPIE OK … alertes=aucune` code 0 (V3), et avec `-Reference` code 0, `modifies=0` (V4).
- V3/V4 sur la copie réelle 5.8 : un nouvel éditeur tourne (PID 28332, `UnrealEditor.exe`, lancé 07:13:28, `LifePlay-master 5.8` d'après `UeState -Copie`). Sans `-Autorise` : code 1, `alertes=PROC,GIT` (11 entrées addon d'un autre lot ; HEAD jeu `a7350fc`, plus `ae5d5e4`) ; avec `-Autorise` des 11 : code 1, `alertes=PROC` seul, `hors_declares=0`, `modifies=0` ; `-Reference` : code 1, `alertes=PROC` seul, `modifies=0`. Le code 0 réel avec la version T7 n'a donc pas pu être rejoué : l'orchestrateur le fera rejouer quand l'éditeur sera fermé. Le code 0 réel de la version T1 reste celui de 07:01:42 (§ 3 V3) ; le diff T7 ne touche que les arguments git.
- Constat relevé en passant : `verrou=99:occupe` puis `99:libre` entre deux appels (autre session, lecture seule chez moi).
**Verdict de la reprise T7 : PASS** (P1 et P2 PASS, P3 PASS sauf le code 0 réel de V3/V4, BLOCKED-PROC). Verdict de la partie « a » inchangé : **PASS**. Le Constat 3 est levé.
Tours de la reprise : 6 / 10