582 lines
107 KiB
Markdown
582 lines
107 KiB
Markdown
|
|
Fiche STE-VAL (partie STE-GI) — Niveau N1 — Modèle prévu sonnet | utilisé Sonnet 5.5 (claude-sonnet-5-5) — Agent lp-validator — Skills sk-protocol, sk-recount, debug-verification, lp-validate
|
|||
|
|
# STE-VAL : validation du lot STE, partie STE-GI (2026-10-10)
|
|||
|
|
|
|||
|
|
Copie `D:\Game\LifePlay-master 5.8`, branche `ue5.8` (relevée par `git branch --show-current`). BUILD-GO STE-GI-VAL de Big Boss :
|
|||
|
|
commandlets en lecture seule, éditeur fermé, un à la fois. Les autres parties du lot (STE-TXT, H2, H3) ne sont pas dans ce
|
|||
|
|
passage : sections à ajouter à ce fichier par leur propre VAL.
|
|||
|
|
|
|||
|
|
## STE-GI
|
|||
|
|
|
|||
|
|
### 1. Fiches amont relues
|
|||
|
|
|
|||
|
|
- `etat\ST\STE\fiches\STE-GI.md` (fiche, lue en entier).
|
|||
|
|
- `etat\ST\STE\STE-GI-IMPL.md` (IMPL, lue en entier : § 1 les 5 gardes, § 5 les 4 points à confirmer).
|
|||
|
|
- Dump d'avant : `etat\ST\STE\dumps\GI__EventGraph.txt` (ligne 120 : « 6218 noeuds » ; MD5 de GI à ce moment D93785FC…, instantané
|
|||
|
|
`D:\Game\LifePlay_Backup_5.5\STE-GI\manifest.csv` : D93785FCA90E3342575FC0B601CC2E93, 52 423 688 o).
|
|||
|
|
- Lu aussi : `etat\ST\STC\STC-VAL.md` (référence CompileAllBlueprints 418 / 418, 0 / 0, ligne V2).
|
|||
|
|
- Non relus : `STE-D-INV.md` (cité par l'IMPL pour D-2, `RootComponent = None`) : hors périmètre de cette VAL, l'IMPL en tire seulement
|
|||
|
|
la décision de poser les gardes R07 / R08 ; je vérifie les gardes, pas la raison de les poser.
|
|||
|
|
|
|||
|
|
### 2. Points à confirmer des IMPL (STE-GI-IMPL § 5)
|
|||
|
|
|
|||
|
|
| # | Point | Verdict | Preuve |
|
|||
|
|
|---|---|---|---|
|
|||
|
|
| 1 | Dump après : « 6218 + 14 = 6232 nœuds », diff = nœuds et liaisons du § 1 | **PASS avec écart de comptage** | Le contenu du diff est exactement celui du § 1 (§ 3 ci-dessous). Les comptes de l'IMPL et de la fiche de VAL sont faux d'une unité : **13 nœuds** créés (pas 14), **6231** nœuds (pas 6232), **8** liaisons coupées (IMPL : 9), **31** posées (IMPL : 30), **4** valeurs de broche (IMPL : 3). La liste nominative des nœuds (5 `IfThenElse` + 8 `CallFunction`) est celle de l'IMPL et de la fiche : seul le total écrit est faux (écart E1). |
|
|||
|
|
| 2 | CompileAllBlueprints, éditeur fermé : 0 erreur, aucun avertissement nouveau sur GI | **PASS** | § 3 critère C3. |
|
|||
|
|
| 3 | LPTestStringCompat 3120 / 0 / 60 | **PASS** | § 3 critère C4. |
|
|||
|
|
| 4 | `git status --short -- Content Config Source` = GI et MainMenu seulement ; MD5 MainMenu 00E42D72… | **PASS** | § 3 critère C5. |
|
|||
|
|
|
|||
|
|
### 3. Critères rejoués (commande → résultat)
|
|||
|
|
|
|||
|
|
Toutes les commandes en pwsh depuis `D:\Game\LifePlay-master 5.8`. Un commandlet à la fois, éditeur fermé.
|
|||
|
|
|
|||
|
|
| # | Critère | Commande | Attendu | Compté | Verdict |
|
|||
|
|
|---|---|---|---|---|---|
|
|||
|
|
| C0 | Entrée : `UeState` à 0, MD5 de départ | `.\Tools\UeState.ps1` ; `Get-FileHash -Algorithm MD5 Content\BPs\GI.uasset, Content\UI\MainMenu.uasset` | tout à 0 ; GI 606EB437… ; MainMenu 00E42D72… | `processus=0 editeur=0 compilation=0 shaders=0 jeu=0` ; GI `606EB43714C1F4317300B797EDD02E62` ; MainMenu `00E42D72C773A55F6998AE67662FDB76` | PASS |
|
|||
|
|
| C1 | Dump après | `.\Tools\RunCommandlet.ps1 -Lot STE-VAL -Commandlet LPDumpFunction -Args '-BP=GI -Fn=EventGraph -Pins -Exec'` | code 0 | `code=0 duree=67s erreurs=0 avertissements=30141` (les « avertissements » sont les lignes `LogLPDump: Warning:` du dump lui-même, comme pour le dump d'avant) ; résumé `STE-VAL_LPDumpFunction_20261010-124550.txt`, copié en `dumps\GI__EventGraph_apres-STE-GI.txt` (2 604 787 o) ; journal `Saved\Logs\portage\STE-VAL_LPDumpFunction_20261010-124550.log` | PASS |
|
|||
|
|
| C2a | Nombre de nœuds | `Grep` des lignes d'en-tête de nœud (trois espaces d'indentation) dans les deux dumps, et ligne « === GI :: EventGraph (N noeuds) » (l. 120) | 6218 → 6232 (fiche) | avant **6218** (l. 120 et recompte), après **6231** (l. 120 : « 6231 noeuds » et recompte `grep -cE '^LogLPDump: Warning: [^ ]'` = 6231). Delta **+13**. Aucun nœud retiré, aucun doublon de nom. | écart de comptage E1 ; contenu conforme (voir C2b) |
|
|||
|
|
| C2b | Diff par nom de nœud, descriptions et broches | `python -I` sur `scratchpad\diffdump2.py` (script de lecture, hors dépôt) : parse les deux dumps, compare par nom de nœud la description et chaque broche (cibles de liaison triées), puis l'ensemble des arêtes (non orientées) et des valeurs par défaut | nœuds ajoutés = liste de la fiche ; nœuds modifiés = les 17 du § 1 ; rien d'autre | ajoutés **13** : `IfThenElse_210`, `_211`, `_212`, `_213`, `_214`, `CallFunction_451`, `_488`, `_490`, `_493`, `_494`, `_496`, `_565`, `_566` (= la liste exacte de la fiche) ; retirés **0** ; modifiés **17** : `CallFunction_5895`, `_2310`, `_333`, `_939`, `_760`, `_5578`, `_3014`, `_2920`, `_472`, `VariableSet_1341`, `_326`, `VariableGet_3100`, `_3103`, `_96`, `_1375`, `_2515`, `MacroInstance_21` (= les 17 de la fiche, aucun de plus, aucun de moins). Arêtes : 8173 → 8196 (+23) ; **8 coupées**, **31 posées**, toutes dans les nœuds ci-dessus. Valeurs : 4 ajoutées (nouveaux SetVisibility), aucune changée ailleurs. | PASS |
|
|||
|
|
| C2c | Garde R06a (HideUI) | lecture du dump d'après (l. 854-863) et sortie du script | `5895.then` → Branch 210 ; Condition ← IsValid(`VariableGet_1375.TintUI`) ; then → 2310 → 1341 ; else → 1341 | `5895.then → IfThenElse_210.execute` ; `451.Object ← VariableGet_1375.TintUI` ; `451.ReturnValue → 210.Condition` ; `210.then → 2310.execute` ; `2310.then → 1341.execute` (conservé) ; `210.else → 1341.execute`. `2310.InVisibility = 'Hidden'` inchangé. 451 est `KismetSystemLibrary::IsValid()` pur (broche `self` vide). | PASS |
|
|||
|
|
| C2d | Garde R06b (ShowUI) | idem (l. 886-890) | `333.then` → Branch 211 ; Condition ← IsValid(`VariableGet_2515.TintUI`) ; then → 939 → 760 ; else → 760 | `333.then → 211.execute` ; `488.Object ← 2515.TintUI` ; `488.ReturnValue → 211.Condition` ; `211.then → 939.execute` ; `939.then → 760.execute` (conservé) ; `211.else → 760.execute`. `939.InVisibility = 'HitTestInvisible'` inchangé. | PASS |
|
|||
|
|
| C2e | Garde R07 (HideRender) | idem (l. 901-906) | `5578` garde la cible 1912 seule, entrées (586, 658) conservées ; Branch 212 ← IsValid(3100) ; then → 490 `SetVisibility(false, true)` cible 3100 → 326 ; else → 326 | `5578.execute ← 586.then, 658.then` ; `5578.self ← VariableGet_1912.StaticMeshComponent` seule ; `5578.then → 212.execute` ; `493.Object ← VariableGet_3100.RootComponent` ; `493.ReturnValue → 212.Condition` ; `212.then → 490.execute` ; `490.self ← VariableGet_3100.RootComponent` ; **`490.bNewVisibility = 'false'`, `490.bPropagateToChildren = 'true'`** ; `490.then → VariableSet_326.execute` ; `212.else → VariableSet_326.execute`. `5578` garde false / true. | PASS |
|
|||
|
|
| C2f | Garde R08 (ShowRender) | idem (l. 913-918) | `3014` garde cibles 1811 + 3097, entrées (107, CustomEvent_519) conservées ; Branch 213 ← IsValid(3103) ; then → 494 `SetVisibility(true, true)` cible 3103 → 2920 ; else → 2920 | `3014.execute ← 107.then, CustomEvent_519.then` ; `3014.self ← VariableGet_1811.StaticMeshComponent, VariableGet_3097.RootComponent` (même ordre qu'avant, sans 3103) ; `3014.then → 213.execute` ; `496.Object ← VariableGet_3103.RootComponent` ; `496.ReturnValue → 213.Condition` ; `213.then → 494.execute` ; `494.self ← VariableGet_3103.RootComponent` ; **`494.bNewVisibility = 'true'`, `494.bPropagateToChildren = 'true'`** ; `494.then → CallFunction_2920.execute` ; `213.else → 2920.execute`. | PASS |
|
|||
|
|
| C2g | Garde R10 (SceneStart) | idem (l. 25112-25118) | `472` cible 95 seule, entrées (664, VariableSet_272) conservées ; Branch 214 ← IsValid(96) ; then → 565 `ClearAllExpressions` cible 96 → MacroInstance_21 ; else → MacroInstance_21 | `472.execute ← 664.then, VariableSet_272.then` ; `472.self ← VariableGet_95.PlayerCharacter` seule ; `472.then → 214.execute` ; `566.Object ← VariableGet_96.Companion` ; `566.ReturnValue → 214.Condition` ; `214.then → 565.execute` ; `565.self ← VariableGet_96.Companion` ; `565.then → MacroInstance_21.exec` ; `214.else → MacroInstance_21.exec`. `565` est `Person_C::ClearAllExpressions()` comme `472`. | PASS |
|
|||
|
|
| C3 | CompileAllBlueprints, éditeur fermé | `.\Tools\RunCommandlet.ps1 -Lot STE-VAL -Commandlet CompileAllBlueprints` | 0 erreur ; aucun avertissement nouveau sur GI ; référence STC-VAL 418 / 418, 0 / 0 | `code=0 duree=227s erreurs=0 avertissements=0`. Journal `Saved\Logs\portage\STE-VAL_CompileAllBlueprints_20261010-124806.log` : 418 lignes « Loading and Compiling » (Grep count), 418 lignes « a réussi » (Grep count), l. 3243 `LogInit: Display: Success - 0 error(s), 0 warning(s)`, l. 2020 « La compilation de GI a réussi ! [en 4 741 ms] (/Game/BPs/GI.GI) », l. 2696 MainMenu réussi. Identique à STC-VAL (418 / 418, 0 / 0, GI réussi en 3 610 ms à l'époque). Résumé : `STE-VAL_CompileAllBlueprints_20261010-124806.txt` (« Erreurs : 0 lignes », « Avertissements : 0 lignes »). | PASS |
|
|||
|
|
| C4 | LPTestStringCompat | `.\Tools\RunCommandlet.ps1 -Lot STE-VAL -Commandlet LPTestStringCompat` | code 0, `3120 cas : compat != herite(UE4) : 0 ; moteur != herite(UE4) : 60` | `code=0 duree=16s erreurs=0 avertissements=2` ; journal `STE-VAL_LPTestStringCompat_20261010-125206.log` l. 1995 et 2000 : `=== 3120 cas : compat != herite(UE4) : 0 ; moteur != herite(UE4) : 60 ===` (les 2 « avertissements » sont cette ligne de résultat, émise en `Warning`, comme en STC-VAL). | PASS |
|
|||
|
|
| C5 | Sortie : état et MD5 | `.\Tools\UeState.ps1` ; `Get-FileHash -Algorithm MD5` ; `(Get-Item Content\BPs\GI.uasset).Length` ; `git status --short -- Content Config Source` | UeState 0 ; GI 606EB437… ; MainMenu 00E42D72… ; status = GI et MainMenu seulement | `processus=0 editeur=0 compilation=0 shaders=0 jeu=0` ; GI `606EB43714C1F4317300B797EDD02E62` (52 450 518 o, = taille de l'IMPL) ; MainMenu `00E42D72C773A55F6998AE67662FDB76` ; `git status --short -- Content Config Source` → ` M Content/BPs/GI.uasset` et ` M Content/UI/MainMenu.uasset`, 2 lignes. Les commandlets n'ont modifié aucun des deux fichiers. | PASS |
|
|||
|
|
|
|||
|
|
Recompte croisé du § 2 point 1 (deux méthodes) : (a) en-têtes de nœud par `grep -cE` : 6218 / 6231 ; (b) analyse du script : 6218 / 6231 ; (c) ligne « (N noeuds) » du dump lui-même, l. 120 : 6218 / 6231. Le « 14 / 6232 » de la fiche de VAL et de l'IMPL est une erreur d'addition : la liste qu'ils donnent contient 13 noms.
|
|||
|
|
|
|||
|
|
### 4. Diff lu en entier
|
|||
|
|
|
|||
|
|
- Fichier unique suivi concerné : `Content/BPs/GI.uasset` (binaire, 52 423 688 → 52 450 518 o, +26 830 o). Il se lit par les dumps, pas par `git diff` texte. Diff des dumps : 13 nœuds ajoutés, 17 nœuds dont des broches changent, 8 arêtes coupées, 31 posées, 4 valeurs de broche ; le détail complet est reproductible avec le script (sortie complète conservée dans le scratchpad de session, `diff2.out`, 143 lignes ; le résumé ci-dessus la reprend en entier).
|
|||
|
|
- Aucune autre modification de `Content`, `Config` ni `Source` (C5). `MainMenu.uasset` est modifié par la session STF (autre lot) : MD5 inchangé pendant la VAL, non touché.
|
|||
|
|
- Fichiers que j'ai écrits (hors dépôt validé) : les 3 résumés `STE-VAL_*_*.txt` de `RunCommandlet.ps1`, la copie `dumps\GI__EventGraph_apres-STE-GI.txt`, ce livrable ; trois journaux dans `Saved\Logs\portage\` (non suivis). Script `diffdump.py` / `diffdump2.py` dans le scratchpad de session.
|
|||
|
|
- Non rejoué : le fait que les autres graphes de GI (fonctions, macros) soient inchangés (l'IMPL écrit « EventGraph seulement »). Le dump d'après ne couvre que l'EventGraph ; la taille (+26 830 o pour 13 nœuds) est cohérente mais ne le prouve pas. À trancher, si l'utilisateur le veut, par un dump de chaque fonction contre les dumps d'avant de `dumps\` (dates 11:04 à 12:30, MD5 de GI alors D93785FC…).
|
|||
|
|
- Non rejoué non plus : le contrôle de l'instantané par `Tools\Restore.ps1 -WhatIf` ; j'ai lu le manifeste (`manifest.csv` : GI, D93785FCA90E3342575FC0B601CC2E93, 52 423 688, 2026-10-10T12:32:20) et le tag annoté `STE-avant` → `5b344992a37d6249c319e2b1eba61c0783f80f80` (`git tag -l STE-avant -n1`, `git rev-parse`). Le HEAD actuel est `ac3a176…` (une autre session a commité depuis ; sans incidence sur GI, status inchangé).
|
|||
|
|
- Non rejoué : le comportement en jeu (preuve J1, STE-JEU, hors de ce passage). La fiche exige « 0 `property TintUI`, 0 `GetRootComponent_ReturnValue_1/_2`, 0 `property Companion` de pile SceneStart » en jeu : **reporté à STE-JEU**.
|
|||
|
|
|
|||
|
|
### 5. Verdict
|
|||
|
|
|
|||
|
|
**PASS** pour STE-GI sur ce qui est vérifiable éditeur fermé : le graphe d'après est conforme aux 5 gardes du § 1 de l'IMPL, ligne par ligne, sans aucune liaison ni nœud en plus ; compilation 418 / 418 et 0 / 0 ; test de chaînes 3120 / 0 / 60 ; MD5 et état git conformes.
|
|||
|
|
|
|||
|
|
Réserves à lire avant d'accepter :
|
|||
|
|
- **E1 (documentaire, sans effet sur le graphe)** : les totaux écrits dans l'IMPL § 1 (« 14 nœuds créés, 9 liaisons coupées, 30 liaisons posées, 3 valeurs de broche ») sont faux ; recomptés : 13 / 8 / 31 / 4. Même erreur dans la fiche de VAL (« 14 nœuds », « 6232 »). À corriger dans l'IMPL (par son auteur) et dans le futur texte du CHG-305 avant d'y reporter les chiffres. Cela ne change pas le verdict car le critère « tout autre écart = FAIL » vise le contenu (nœuds et liaisons), qui est exactement celui attendu ; si l'orchestrateur lit le critère de façon stricte sur le total 14, c'est la fiche qui est fausse, pas le graphe.
|
|||
|
|
- E2 : les écarts à la SPEC déjà annoncés par l'IMPL § 2 (outil `hyper_blueprint_debug_inspect` absent, premier lot MCP de R06a en un seul appel) ne sont pas rejouables ici ; non vérifiés.
|
|||
|
|
- Le comportement en jeu n'est pas prouvé (STE-JEU).
|
|||
|
|
|
|||
|
|
### 6. Points à confirmer par l'utilisateur / l'orchestrateur
|
|||
|
|
|
|||
|
|
- [ ] Accepter l'écart de comptage E1 (13 / 6231 au lieu de 14 / 6232) et faire corriger les chiffres de l'IMPL avant le CHG-305.
|
|||
|
|
- [ ] Faut-il vérifier par dumps que les autres graphes de GI sont inchangés (non rejoué, § 4) ? Sinon, accepter « EventGraph seulement » sur la foi de l'IMPL.
|
|||
|
|
- [ ] Preuve en jeu J1 / STE-JEU : 0 `property TintUI`, 0 `GetRootComponent_ReturnValue_1/_2`, 0 `property Companion` de pile SceneStart (reporté).
|
|||
|
|
- [ ] Commit de GI : après J1 (archive commune STF + STE), par le gardien, ticket STE-R2 ; rien n'est commité par cette VAL.
|
|||
|
|
|
|||
|
|
Fichiers à commiter (pour le ticket du gardien, ni A ni M faits par moi dans git) :
|
|||
|
|
```
|
|||
|
|
A Docs/Migration/etat/ST/STE/STE-VAL.md
|
|||
|
|
A Docs/Migration/etat/ST/STE/STE-VAL_LPDumpFunction_20261010-124550.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/STE-VAL_CompileAllBlueprints_20261010-124806.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/STE-VAL_LPTestStringCompat_20261010-125206.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/dumps/GI__EventGraph_apres-STE-GI.txt
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Tours : 14 / 40
|
|||
|
|
|
|||
|
|
## STE-GI — preuve en jeu J1 (archive commune STF + STE, 2026-10-10)
|
|||
|
|
|
|||
|
|
Mesure faite par l'orchestrateur LOT STE (pas une déclaration). Validation de l'utilisateur, rapportée par Big Boss :
|
|||
|
|
« J1 fait, tout est conforme » (2026-10-10).
|
|||
|
|
|
|||
|
|
Journal : `D:\Game\LifePlay_Build_5.8_STF-STE_Development\Windows\LifePlay\Saved\Logs\LifePlay.log` (10 600 lignes,
|
|||
|
|
MD5 3393742B…, dernière écriture 13:14:11), copié dans le scratchpad de la session avant lecture. Archive : GI 606EB437….
|
|||
|
|
|
|||
|
|
| Motif (Select-String) | Attendu | J1 | STB-JEU2 (avant) |
|
|||
|
|
|---|---|---|---|
|
|||
|
|
| `property TintUI in` | 0 | **0** | 30 |
|
|||
|
|
| `GetRootComponent_ReturnValue` | 0 | **0** | 5 |
|
|||
|
|
| `property Companion in` (toutes piles, donc SceneStart compris) | 0 | **0** | 8 |
|
|||
|
|
|
|||
|
|
Dénominateurs (le parcours a bien eu lieu) : les piles `GI_C:(HideUI|ShowUI)` et `GI_C:SceneStart` ne s'impriment
|
|||
|
|
qu'en cas d'erreur (0 ici, comme attendu). Le parcours se lit donc à d'autres marques :
|
|||
|
|
- création de personnage : `chargenroom.lpworld LOAD ROOM` l. 1406 (11:02:53) ;
|
|||
|
|
- inventaire : `Inventory_C … (START OF MENU)` l. 1502 (11:03:01) ;
|
|||
|
|
- portrait : `GI_C … OpenSpace` l. 1837 et 1856 (11:04:18, 11:04:27) ;
|
|||
|
|
- action : `(test0104) for 2.8 hours by 1` l. 3063 (11:08:55) ;
|
|||
|
|
- scènes : 29 lignes `Scene_C` (piles `Scene_C:BndEvt__NextButton`, dès l. 2148), donc des scènes jouées.
|
|||
|
|
Le démarrage d'une scène **sans compagnon** n'est pas isolable dans ce journal (estimé, pas établi).
|
|||
|
|
|
|||
|
|
Avertissements de GI encore présents, hors périmètre STE-GI et attendus : F4 `CallFunc_GetSkeletalMesh_ReturnValue`
|
|||
|
|
(16, STE-H2), F5 `No SkeletalMesh` (STE-H2b / H4), `Floats_…` dans `getBeautyValue` (54, connu, doc 29).
|
|||
|
|
Hors STE, signalé : `MainMenu_C` `Accessed None` (48 + 24 + 24 + 24, `Get_SpinBox_…`, lot STF) et
|
|||
|
|
`property GI in /Game/UI/CharGen.CharGen_C` (l. 1422).
|
|||
|
|
|
|||
|
|
**Verdict J1 STE-GI : PASS** (3 motifs à 0 contre 43 dans STB-JEU2 ; parcours établi pour HideUI/ShowUI et
|
|||
|
|
HideRender/ShowRender ; SceneStart sans compagnon estimé).
|
|||
|
|
Résidu CharGen (relevé par Big Boss sur ce journal, CharGen relève de STE) : 1 `Accessed None trying to read (real)
|
|||
|
|
property GI in /Game/UI/CharGen.CharGen_C` (l. 1422, 11:02:53), pile
|
|||
|
|
`CharGen_C:BndEvt__SpinBox_0_K2Node_ComponentBoundEvent_85_OnSpinBoxValueChangedEvent` → `ExecuteUbergraph_CharGen`.
|
|||
|
|
Même mécanisme qu'ERR-057, estimé : `OnValueChanged` d'une SpinBox exécuté avant que `GI` soit affecté. **Non couvert**
|
|||
|
|
par STE-TXT (couleurs seulement) ni par une fiche STE. Aucun ERR au registre (Grep `CharGen` : ERR-021 et ERR-025 seulement).
|
|||
|
|
Candidat `STE-CG` retiré : décision de l'utilisateur rapportée par Big Boss (2026-10-10), lot unique des résidus `SpinBox_0`
|
|||
|
|
(MainMenu et CharGen) confié à STF (STF-T5).
|
|||
|
|
|
|||
|
|
## STE-P1 (et STE-TXT)
|
|||
|
|
|
|||
|
|
Fiche STE-VAL (partie STE-P1, avec STE-TXT) — Niveau N1 — Modèle prévu sonnet | utilisé Sonnet 5.5 (claude-sonnet-5-5) — Agent lp-validator — Skills sk-protocol, sk-recount, debug-verification, lp-validate
|
|||
|
|
|
|||
|
|
Copie `D:\Game\LifePlay-master 5.8`, branche `ue5.8` (`git branch --show-current`), HEAD `547dcdd`. BUILD-GO de Big Boss
|
|||
|
|
(2026-10-10, ~14:13-14:21) : commandlets en lecture seule, éditeur fermé, un à la fois, aucun éditeur, aucune écriture dans
|
|||
|
|
`Source`, `Content`, `Config` ni dans une doc validée. Commandes en pwsh depuis la racine de la copie (ou `MSYS_NO_PATHCONV=1` sous Git Bash).
|
|||
|
|
|
|||
|
|
### 1. Fiches amont relues
|
|||
|
|
|
|||
|
|
- `etat\ST\STE\fiches\STE-P1.md` (fiche, lue en entier : critère d'acceptation rubrique 8).
|
|||
|
|
- `etat\ST\STE\STE-P1-SPEC.md` (lue en entier ; § 2.3 code, § 2.4 tableau des 4 substitutions, § 7 critères de VAL).
|
|||
|
|
- `etat\ST\STE\STE-P1-IMPL.md` (lue en entier : partie C++ § 1 à 6, « Constats », « Partie graphe » ; § 5 = VAL-1 à VAL-16).
|
|||
|
|
- `etat\ST\STE\STE-P1-BUILD.md` (lue en entier) et son journal `Saved\Logs\portage\STE-P1_Build_20261010-140719.log` (lignes 28-53 relues).
|
|||
|
|
- `etat\ST\STE\STE-TXT-DIAG.md` (lignes 1-12, 38-88 : valeurs de STE-TXT, comparaison octet par octet HEAD / état STE-TXT) ; `Tools\uasset58.py` (lu : limites, lecture par motif).
|
|||
|
|
- Relevé de référence du graphe d'avant : `Saved\Logs\portage\U5_assets_apres.txt` (CharGen `:1195439-1195460` relu : formes de `VariableSet_1146` / `_1147` conformes au tableau de la SPEC § 2.4).
|
|||
|
|
- Non relus : `STE-TACHES.md`, `STE-INT.md` (hors périmètre de cette VAL).
|
|||
|
|
|
|||
|
|
### 2. Points à confirmer des IMPL (STE-P1-IMPL § 5)
|
|||
|
|
|
|||
|
|
| # | Point | Verdict | Preuve |
|
|||
|
|
|---|---|---|---|
|
|||
|
|
| VAL-1 | Build : code 0, ligne `Using Visual Studio 14.50.35739 toolchain (…\MSVC\14.50.35717)` | **PASS** (recompté sur journal, sans recompiler) | § 3 critère C6 : `Result: Succeeded` (journal l. 52), toolchain l. 35, résumé `-FromLog` 0 erreur 0 avertissement 20 autres. Le code 0 lui-même est dans `STE-P1-BUILD.md` (`BUILD_EXIT=0`) ; `-FromLog` n'a pas de code de sortie de compilation (affiche -1, normal). |
|
|||
|
|
| VAL-2 | Unités `LPWidgetStyleLibrary.cpp` et `.gen.cpp` (ou unity) compilées ; DLL liée | **PASS** | § 3 C6 : `[1/5] Compile LPWidgetStyleLibrary.cpp` (l. 42), `[2/5] Compile Module.LifePlay.cpp` (l. 43), `[4/5] Link UnrealEditor-LifePlay.dll` (l. 46) ; DLL 1 276 928 o, 14:08:07. `LPWidgetStyleLibrary.gen.cpp` et `.generated.h` existent (Glob) et le `.gen.cpp` contient 50 occurrences de `LPWidgetStyleLibrary|SetEditableTextBoxStyle` ; il n'est pas nommé dans le journal : sa compilation dans l'unité `Module.LifePlay.cpp` est **estimée**, mais la fonction est résolue par l'éditeur dans les dumps (`appel LPWidgetStyleLibrary::SetEditableTextBoxStyle()`, § 3 C2), ce qui exige le code généré compilé et lié. |
|
|||
|
|
| VAL-3 | 0 `error`, 0 `warning C4996`, « autres lignes » = 20 | **PASS** | § 3 C6 : erreurs 0, avertissements 0, autres 20 (tous `Plugin 'HyperAIStudio' does not list plugin …`). Grep `C4996\|LNK2\|error C\|warning C` sur le journal : 0 ligne. |
|
|||
|
|
| VAL-4 | Aucune `LNK2019` / `LNK2001` (`MinimalAPI`, R9) | **PASS** | Même Grep : 0 ligne `LNK2` ; étape `[4/5] Link … dll` terminée, `Result: Succeeded`. |
|
|||
|
|
| VAL-5 | `git status -- Source` = exactement les 2 fichiers `??` ; ASCII, LF ; MD5 identiques à l'IMPL | **PASS** | § 3 C1 et C7 : `?? Source/LifePlay/LPWidgetStyleLibrary.cpp` et `.h` seuls ; `FileCheck` : LF, CRLF 0, CR seul 0, BOM absent, 0 octet > 127 ; MD5 `.h` BD13433C…, `.cpp` AF691516… = IMPL. |
|
|||
|
|
| VAL-6 | En éditeur, le nœud est trouvé (`find_node_types`), broches `TextBox`, `Style`, `self` cachée | **PASS-STATIC** | Pas d'éditeur ni de MCP ici. Le dump d'après montre les 4 nœuds `appel LPWidgetStyleLibrary::SetEditableTextBoxStyle()` avec broches `execute`, `then`, `self (vide)`, `TextBox`, `Style` (§ 3 C2). La catégorie `LifePlay|UI` se lit dans l'en-tête (`LPWidgetStyleLibrary.h:32`). L'appel MCP `find_node_types` lui-même n'est pas rejoué. |
|
|||
|
|
| VAL-7 | 4 nœuds Set remplacés, liens conformes à SPEC § 2.4, 0 Set `WidgetStyle` restant | **PASS** | § 3 C2 et C3 : liens conformes broche à broche ; 0 `VariableSet_1146` / `_1147` et 0 Set de `WidgetStyle` / `EditableTextBox` dans les deux dumps. |
|
|||
|
|
| VAL-8 | `compile_blueprint` CharGen et StatMenu sans avertissement ; `hyper_blueprint_debug_inspect` 0 diagnostic | **PASS pour la compilation ; BLOCKED pour `hyper_blueprint_debug_inspect`** | Compilation : `CompileAllBlueprints` (§ 3 C5) compile CharGen et StatMenu, 0 erreur 0 avertissement. `hyper_blueprint_debug_inspect` : outil absent du serveur MCP (IMPL « Partie graphe », écart déjà noté en STE-GI) ; BLOCKED-outil, non rejouable ici. Le point R5 (`ErrorType = 1` des anciens nœuds de StatMenu) est sans objet : ces nœuds n'existent plus (C3). |
|
|||
|
|
| VAL-9 | `CompileAllBlueprints` 0 erreur, 0 avertissement | **PASS** | § 3 C5. |
|
|||
|
|
| VAL-10 | PIE, CharGen : 10 refus de nom de suite sans plantage | **reporté** (J2bis, avec l'utilisateur) | Exige PIE. Non rejouable par un validateur éditeur fermé. |
|
|||
|
|
| VAL-11 | Flash rouge visible puis retour au blanc après le Delay | **reporté** (J2bis) | Idem. Statiquement : la chaîne est `else → CallFunction_51 (style rouge, MakeStruct_62) → Delay_5310 → CallFunction_52 (style blanc, MakeStruct_64)`, soit l'ordre d'origine (§ 3 C2). |
|
|||
|
|
| VAL-12 | Texte noir lisible avant, pendant, après, avec et sans focus | **reporté** (J2bis) | Idem. Statiquement : les deux valeurs de STE-TXT sont toujours dans CharGen (§ 3 C8). |
|
|||
|
|
| VAL-13 | Texte tapé pendant le Delay conservé, curseur non déplacé | **reporté** (J2bis) | Idem. Statiquement : le corps retenu (D) n'appelle pas `SynchronizeProperties` (`LPWidgetStyleLibrary.cpp:20-26` relu) ; la raison est en SPEC § 6.3 (non rejouée). |
|
|||
|
|
| VAL-14 | Même essai dans StatMenu si un refus y est accessible | **reporté** (J2bis) | Idem ; l'accessibilité d'un refus dans StatMenu n'est pas établie ici. |
|
|||
|
|
| VAL-15 | Aucun nouveau rapport `FCachedTypefaceData` dans `Saved\Crashes` | **reporté** (après PIE) | `Saved\Crashes` contient 3 dossiers `UECC-Windows-*` (`ls`), le nombre attendu par le DIAG (« 3 rapports, dont 2 du 2026-10-08 »). Le contrôle n'a de sens qu'après l'essai en jeu. |
|
|||
|
|
| VAL-16 | Branche 5.5 (`UE_VERSION_OLDER_THAN`) non compilée | **reporté** (SPEC R4, Q1) | Le code de la branche 5.5 est relu (`.cpp:22-29` : rien dans la branche, commentaire seul) ; non compilé en 5.5, comme prévu. |
|
|||
|
|
|
|||
|
|
### 3. Critères rejoués (commande → résultat)
|
|||
|
|
|
|||
|
|
| # | Critère | Commande | Attendu | Compté | Verdict |
|
|||
|
|
|---|---|---|---|---|---|
|
|||
|
|
| C0 | Entrée : `UeState` à 0 ; MD5 d'entrée | `pwsh -NoProfile -File Tools/UeState.ps1` ; `Get-FileHash -Algorithm MD5` sur les 4 assets et les 2 fichiers Source | tout à 0 ; MainMenu 7292C6BE…, GI 606EB437…, CharGen A0DE37AC…, StatMenu 9030531C… | `processus=0 editeur=0 compilation=0 shaders=0 jeu=0` (code 0) ; MainMenu `7292C6BEB26A8066343ABDDF49B63D9F` ; GI `606EB43714C1F4317300B797EDD02E62` ; CharGen `A0DE37ACC2CFCB02EF254AF2517E4E20` ; StatMenu `9030531CCF4EF46C133722DACD6D2203` ; `.h` `BD13433C36BF222B2FEAB3D6C23C0976` ; `.cpp` `AF691516002C8F97E341CB0B3B29D002` | PASS |
|
|||
|
|
| C1 | C++ : fins de ligne, encodage, BOM | `.\Tools\FileCheck.ps1 -Path Source\LifePlay\LPWidgetStyleLibrary.h,Source\LifePlay\LPWidgetStyleLibrary.cpp` ; lecture des octets (CR, LF, > 127, BOM) en Python ; `file` ; `git status --short -- Source` | LF, ASCII, sans BOM ; 2 fichiers `??` | `.h` : LF 34, CRLF 0, CR 0, BOM non, 1 895 o ; `.cpp` : LF 30, CRLF 0, CR 0, BOM non, 1 319 o ; 0 octet > 127 dans les deux ; `file` : « C++ source, ASCII text » (`.h`) et « C source, ASCII text » (`.cpp`), comme `LPMeshCompat.*` ; `FileCheck` `fichiers=2 LF=2 alertes=0` (code 0) ; `git status --short -- Source` : 2 lignes `??`, aucune autre | PASS |
|
|||
|
|
| C1b | C++ relu contre la SPEC § 2.3 (ligne à ligne) | Read de `LPWidgetStyleLibrary.h` (34 l.) et `.cpp` (30 l.) | signature, catégorie, `DisplayName`, includes, garde `IsValid`, copie dans le membre, garde `UE_VERSION_OLDER_THAN(5, 8, 0)`, pas de `SynchronizeProperties`, pas de pragma de dépréciation | `.h:25-34` : `UCLASS()`, `LIFEPLAY_API ULPWidgetStyleLibrary : UBlueprintFunctionLibrary`, `UFUNCTION(BlueprintCallable, Category = "LifePlay|UI", meta = (DisplayName = "Set Widget Style (Text Box, LP)")) static void SetEditableTextBoxStyle(UEditableTextBox* TextBox, const FEditableTextBoxStyle& Style);` ; `.h:20` inclut `Styling/SlateTypes.h` (type complet), `.h:23` prédéclare `UEditableTextBox`. `.cpp:3-7` : en-tête propre d'abord, puis `Components/EditableTextBox.h`, `Misc/EngineVersionComparison.h`, `LifePlay.h` ; `.cpp:11-16` `IsValid` + `UE_LOG(LogLifePlay, Verbose, …)` + return ; `.cpp:20` `TextBox->WidgetStyle = Style;` ; `.cpp:22-27` `#if !UE_VERSION_OLDER_THAN(5, 8, 0)` → `TextBox->SetWidgetStyle(TextBox->GetWidgetStyle());` ; aucun `SynchronizeProperties`, aucun `PRAGMA_*` (lecture complète des 2 fichiers). **Aucun écart à la SPEC.** Garde de version : l'en-tête `Misc/EngineVersionComparison.h` est bien inclus dans le fichier qui utilise `UE_VERSION_OLDER_THAN`. | PASS |
|
|||
|
|
| C2 | Dump après, CharGen | `.\Tools\RunCommandlet.ps1 -Lot STE-VAL -Commandlet LPDumpFunction -Args '-BP=CharGen -Fn=EventGraph -Pins -Exec'` | code 0 ; `CallFunction_51` / `_52` câblés comme le tableau de l'IMPL | `code=0 duree=51s erreurs=0 avertissements=5718` (lignes `LogLPDump: Warning:` du dump) ; résumé `STE-VAL_LPDumpFunction_20261010-141402.txt`, journal `Saved\Logs\portage\STE-VAL_LPDumpFunction_20261010-141402.log`. Dump l. 5776-5787 : `CallFunction_51` : `execute ← IfThenElse_366.else`, `then → CallFunction_5310.execute`, `self (vide)`, `TextBox ← VariableGet_2400.FilenameEntry`, `Style ← MakeStruct_62.EditableTextBoxStyle` ; `CallFunction_52` : `execute ← CallFunction_5310.then`, `then (vide)`, `self (vide)`, `TextBox ← VariableGet_2400.FilenameEntry`, `Style ← MakeStruct_64.EditableTextBoxStyle`. Côtés opposés relus : l. 1475-1477, 1499, 1510, 1547-1548, 1554. Identique au tableau de l'IMPL et de la SPEC § 2.4. | PASS |
|
|||
|
|
| C2' | Dump après, StatMenu | `.\Tools\RunCommandlet.ps1 -Lot STE-VAL -Commandlet LPDumpFunction -Args '-BP=StatMenu -Fn=EventGraph -Pins -Exec'` | idem avec `CallFunction_6` / `_10` | `code=0 duree=51s erreurs=0 avertissements=587` ; résumé `STE-VAL_LPDumpFunction_20261010-141459.txt`, journal `…141459.log`. Dump l. 645-656 : `CallFunction_6` : `execute ← IfThenElse_366.else`, `then → CallFunction_5310.execute`, `TextBox ← VariableGet_204.FilenameEntry`, `Style ← MakeStruct_62.EditableTextBoxStyle` ; `CallFunction_10` : `execute ← CallFunction_5310.then`, `then (vide)`, `TextBox ← VariableGet_204.FilenameEntry`, `Style ← MakeStruct_64.EditableTextBoxStyle`. Côtés opposés relus : l. 435, 448-449, 455, 474, 522. Conforme au tableau. | PASS |
|
|||
|
|
| C3 | Aucun nœud `VariableSet` de `WidgetStyle` | Grep `K2Node_VariableSet_114[67]\|K2Node_VariableSet_\d+\s.*(WidgetStyle\|EditableTextBox)` sur les deux dumps ; Grep `WidgetStyle` sur chaque dump ; témoin positif : Grep count `K2Node_VariableSet_\d+ ` | 0 | motif Set : **0 correspondance** dans les 2 dumps. `WidgetStyle` n'apparaît que sur `K2Node_VariableGet_3348` (lecture, CharGen l. 1524 ; StatMenu l. 488) et les broches de `BreakStruct_62` : ce sont des Get, préexistants. Témoin positif : 85 nœuds `VariableSet_*` dans le dump CharGen, donc le motif sait lire ces lignes. | PASS |
|
|||
|
|
| C3b | Nombre de nœuds identique à l'avant (−2 Set, +2 appels) | Grep count `^ CharGen:EventGraph\.\S+ \[` et `^ StatMenu:EventGraph\.\S+ \[` sur le relevé U5 ; Grep count `^LogLPDump: Warning: K2Node_\w+ ` sur chaque dump ; ligne d'en-tête `=== … (N noeuds) ===` | avant = après | CharGen : relevé **1318** ; dump **1318** (l. 120 : « 1318 noeuds ») ; StatMenu : relevé **114** ; dump **114** (l. 120 : « 114 noeuds »). Le relevé permet la comparaison : le graphe de CharGen est celui de HEAD (seules les propriétés de widget et la recompilation diffèrent, DIAG § 3.2 ; dernier commit sur CharGen et StatMenu `809102a`, U5). | PASS |
|
|||
|
|
| C3c | Différence exacte avant / après (noms de nœuds et liaisons) | `python -I -` (script lu sur l'entrée standard, aucun fichier écrit) : noms de nœuds et arêtes `nœud.broche ↔ nœud.broche` du relevé U5 contre ceux du dump d'après | −2 `VariableSet`, +2 `CallFunction` ; rien d'autre | **CharGen** : retirés `VariableSet_1146`, `VariableSet_1147` ; ajoutés `CallFunction_51`, `CallFunction_52` ; arêtes : 1590 → 1591, 7 retirées (toutes sur `VariableSet_1146/1147`) et 7 ajoutées (toutes sur `CallFunction_51/52`, celles du tableau) + 1 arête signalée « ajoutée » qui est un **artefact de mon script** : `IfThenElse_3.execute ↔ SwitchString_5.Scale (may break animations, use with caution!)` ; le nom de la broche contient une virgule, que mon découpage `", "` coupe côté relevé ; le lien existe dans les deux états (relevé l. 1191629, dump l. 2087 et 2938). **StatMenu** : retirés `VariableSet_1146/_1147`, ajoutés `CallFunction_6`, `CallFunction_10` ; arêtes 158 → 158, 7 retirées, 7 ajoutées, aucune autre. Aucun nœud ni lien touché hors des 4 substitutions. | PASS |
|
|||
|
|
| C5 | `CompileAllBlueprints` | `.\Tools\RunCommandlet.ps1 -Lot STE-VAL -Commandlet CompileAllBlueprints` | 0 erreur, 0 avertissement ; référence 418 / 418 (STE-VAL § STE-GI) | `code=0 duree=177s erreurs=0 avertissements=0`. Journal `Saved\Logs\portage\STE-VAL_CompileAllBlueprints_20261010-141625.log` : Grep count « Loading and Compiling » = **418** ; Grep count « a réussi » = **418** ; l. 3239 `LogInit: Display: Success - 0 error(s), 0 warning(s)` ; l. 2797 « La compilation de CharGen a réussi ! [en 624 ms] » ; l. 2800 « La compilation de StatMenu a réussi ! [en 382 ms] ». Résumé `STE-VAL_CompileAllBlueprints_20261010-141625.txt`. Égal à la dernière référence (418 / 418, 0 / 0). | PASS |
|
|||
|
|
| C5b | `LPTestStringCompat` | `.\Tools\RunCommandlet.ps1 -Lot STE-VAL -Commandlet LPTestStringCompat` | code 0 ; `3120 cas : compat != herite(UE4) : 0 ; moteur != herite(UE4) : 60` | `code=0 duree=12s erreurs=0 avertissements=2` ; journal `STE-VAL_LPTestStringCompat_20261010-141936.log` l. 1995 et 2000 : `=== 3120 cas : compat != herite(UE4) : 0 ; moteur != herite(UE4) : 60 ===` (les 2 « avertissements » sont cette ligne, émise en `Warning`). | PASS |
|
|||
|
|
| C6 | Build recompté sans recompiler | `.\Tools\Build.ps1 -Lot STE-P1-VAL -FromLog 'D:\Game\LifePlay-master 5.8\Saved\Logs\portage\STE-P1_Build_20261010-140719.log'` | résumé identique à `STE-P1-BUILD.md` | `erreurs=0 avertissements=0 autres=20 unites=2` (code affiché -1 : pas de compilation) ; chaîne `Using Visual Studio 14.50.35739 toolchain (…\MSVC\14.50.35717)` ; résumé `STE-P1-VAL_BuildLog_20261010-142047.txt`. Journal : l. 36 `[Adaptive Build] Excluded from LifePlay unity file: LPWidgetStyleLibrary.cpp` ; l. 42-47 les 5 actions (compile `LPWidgetStyleLibrary.cpp`, compile `Module.LifePlay.cpp`, 2 liens, métadonnées) ; l. 52 `Result: Succeeded`. 20 « autres lignes » = `Plugin 'HyperAIStudio' does not list plugin …`, connues (lp-build § 7). DLL `Binaries\Win64\UnrealEditor-LifePlay.dll` : 1 276 928 o, 2026-10-10 14:08:07, antérieure aux assets (14:12:33). Le module modifié figure bien dans les unités compilées. | PASS |
|
|||
|
|
| C7 | Sortie : état, MD5, git | `UeState.ps1` ; `Get-FileHash -Algorithm MD5` + taille ; `git status --short -- Content Config Source` | UeState 0 ; MD5 d'entrée inchangés ; ` M CharGen`, ` M StatMenu`, `??` les 2 fichiers Source seulement | `processus=0 editeur=0 compilation=0 shaders=0 jeu=0` (code 0) ; MainMenu 7292C6BE… (2 260 418 o), GI 606EB437… (52 450 518 o), CharGen A0DE37AC… (5 046 138 o), StatMenu 9030531C… (561 213 o), `.h` BD13433C…, `.cpp` AF691516… : **tous identiques à C0** ; tailles CharGen et StatMenu = celles de l'IMPL. `git status --short -- Content Config Source` : ` M Content/UI/CharGen.uasset`, ` M Content/UI/StatMenu.uasset`, `?? Source/LifePlay/LPWidgetStyleLibrary.cpp`, `?? Source/LifePlay/LPWidgetStyleLibrary.h` (4 lignes, rien d'autre). Les commandlets n'ont modifié aucun fichier suivi. | PASS |
|
|||
|
|
| C8 | STE-TXT : les deux valeurs sont toujours dans CharGen A0DE37AC… | `python -I -` important `load` de `Tools\uasset58.py` (lecture seule), recherche de l'étiquette de propriété (`ColorAndOpacity` / `ForegroundColor`, nom + numéro) dans les exports `FilenameEntry` et `VarianceSpinBox`, puis des 16 octets `00000000 00000000 00000000 0000803f` ; témoin négatif : même lecture de `git show HEAD:Content/UI/CharGen.uasset` copié dans le scratchpad | présentes (0,0,0,1) | CharGen courant (MD5 A0DE37AC…, 3 582 exports, contigus) : `FilenameEntry` (exports #738 et #739, taille 868 o) : étiquette `ColorAndOpacity` présente 1 fois chacun (octet 214), `LinearColor` (0,0,0,1) à +98 de l'étiquette, noms `SlateColor`, `SpecifiedColor`, `ColorUseRule` et `ESlateColorStylingMode::UseColor_Specified` référencés dans le bloc de 191 o ; `VarianceSpinBox` (#3162 et #3170, taille 698 o) : étiquette `ForegroundColor` présente 1 fois chacun (octet 120), `LinearColor` (0,0,0,1) à +98, bloc de 122 o, `SpecifiedColor` seul (pas de `ColorUseRule`, conforme au DIAG § 3.2). Tailles d'export : 868 − 677 = **+191** et 698 − 576 = **+122**, exactement les écarts du DIAG § 3.2. Témoin négatif : HEAD (MD5 21ab367c…) : 0 étiquette, exports de 677 et 576 o. | PASS-STATIC (lecture hors éditeur par motif, limite de `uasset58.py` : propriétés non décodées ; l'énumération `UseColor_Specified` est établie comme nom référencé dans le bloc, pas comme valeur décodée) |
|
|||
|
|
|
|||
|
|
Non rejoué (hors périmètre éditeur fermé) : les appels MCP de l'orchestrateur (`find_node_types`, `create_node`, `connect_pins`, `compile_blueprint`, `save_assets`) ; je n'ai pas de preuve indépendante de leur déroulement, seulement de leur résultat (C2, C3, C3c, C5, C7).
|
|||
|
|
|
|||
|
|
### 4. Diff lu en entier
|
|||
|
|
|
|||
|
|
- `git status --short -- Content Config Source` (C7) : 4 entrées, toutes annoncées par la fiche : `M CharGen.uasset`, `M StatMenu.uasset`, `?? LPWidgetStyleLibrary.h`, `?? LPWidgetStyleLibrary.cpp`. Aucun fichier non annoncé dans ces trois dossiers.
|
|||
|
|
- `Source` : 2 fichiers nouveaux, lus en entier (64 lignes au total) : aucun écart à la SPEC § 2.3 (C1b). `LifePlay.Build.cs` non modifié (absent de `git status --short -- Source`).
|
|||
|
|
- `Content/UI/CharGen.uasset` et `StatMenu.uasset` : binaires, lus par dumps de graphe (C2, C2', C3, C3c) et par lecture des octets pour CharGen (C8). Graphes : −2 / +2 nœuds, 7 liaisons retirées et 7 posées par asset, rien d'autre (C3c). Le cas de CharGen est le plus large (CharGen contient STE-TXT + STE-P1) : l'écart de STE-TXT (2 propriétés) reste présent (C8) ; l'état HEAD → courant du reste de CharGen (recompilation, bytecode) a été décrit par le DIAG et n'est pas re-comparé ici.
|
|||
|
|
- Fichiers hors périmètre vus dans `git status` complet : `Docs/Migration/etat/BOSS/BOSS-JOURNAL.md`, `OB/OBP/OBP-TACHES.md`, `Docs/README.md`, `REPO/tickets/OBP-R5.md` : autres lots, non touchés par cette VAL.
|
|||
|
|
- Fichiers que j'ai écrits : ce livrable (`STE-VAL.md`, ajout de cette section) ; 5 résumés produits par `RunCommandlet.ps1` et `Build.ps1 -FromLog` dans `Docs\Migration\etat\ST\STE\` (voir « Fichiers à commiter ») ; 4 journaux dans `Saved\Logs\portage\` (non suivis) ; une copie temporaire de `git show HEAD:Content/UI/CharGen.uasset` dans le scratchpad de session (hors dépôt, témoin négatif de C8). Aucune modification de code, de Content, de Config ni de doc validée ; aucun git en écriture ; aucun éditeur.
|
|||
|
|
|
|||
|
|
### 5. Verdict
|
|||
|
|
|
|||
|
|
**PASS-STATIC** pour STE-P1 (et STE-TXT).
|
|||
|
|
|
|||
|
|
Rejoué avec preuve fraîche et conforme : le C++ (relu contre la SPEC, LF, ASCII, MD5 de l'IMPL), le recompte du build (0 erreur, 0 avertissement, 20 lignes HyperAIStudio connues, DLL liée, toolchain 14.50.35717), les deux dumps (4 nœuds d'appel câblés comme l'IMPL, 0 `VariableSet` de `WidgetStyle`, 1318 / 1318 et 114 / 114 nœuds, différence avant / après limitée aux 4 substitutions), `CompileAllBlueprints` 418 / 418 et 0 / 0, `LPTestStringCompat` 3120 / 0 / 60, les deux valeurs de STE-TXT toujours présentes, MD5 et état git de sortie identiques à l'entrée.
|
|||
|
|
|
|||
|
|
Pourquoi pas PASS : la preuve en jeu **J2bis** (10 refus de nom de suite sans plantage, flash rouge, texte noir lisible avec et sans focus, texte saisi conservé pendant le Delay, essai StatMenu, contrôle `Saved\Crashes`) n'a pas été faite et relève de l'utilisateur (VAL-10 à VAL-15, SPEC § 7 critères 5, 6, 7). Aucun critère rejouable n'a échoué.
|
|||
|
|
|
|||
|
|
Écarts et réserves :
|
|||
|
|
- **E1** : `hyper_blueprint_debug_inspect` est absent du serveur MCP (déjà noté par l'IMPL et en STE-GI) : le critère « 0 diagnostic » de la SPEC § 7.3 n'est pas rejouable (BLOCKED-outil) ; remplacé par `CompileAllBlueprints` 0 / 0, qui couvre la compilation mais pas la même vérification.
|
|||
|
|
- **E2** : la compilation de `LPWidgetStyleLibrary.gen.cpp` n'est pas nommée dans le journal de build (estimée dans `Module.LifePlay.cpp`) ; la résolution de la fonction dans les dumps la rend certaine en pratique.
|
|||
|
|
- **E3** : lecture des valeurs de STE-TXT par motif (limite de `uasset58.py`), pas décodée ; à confirmer par l'éditeur (MCP) ou par la vue en jeu (J2bis) si l'utilisateur veut un niveau « établi par décodage ».
|
|||
|
|
- **E4** (documentaire, sans effet) : `Build.ps1 -FromLog` laisse le champ « Makefile : » vide, déjà noté par le BUILD ; l'artefact d'arête de C3c vient de mon script, pas du graphe.
|
|||
|
|
- La branche 5.5 (`UE_VERSION_OLDER_THAN`) n'est pas compilée (SPEC R4, Q1) : reportée. Les mods (`Content\Modules`) n'ont pas été cherchés (SPEC R3).
|
|||
|
|
|
|||
|
|
### 6. Points à confirmer par l'utilisateur / l'orchestrateur
|
|||
|
|
|
|||
|
|
- [ ] J2bis en jeu, dans CharGen (panneau Save Preset, nom vidé) : 10 refus de suite sans plantage ; flash rouge puis retour au blanc ; texte noir lisible avant, pendant et après, avec et sans focus (VAL-10 à VAL-12).
|
|||
|
|
- [ ] J2bis, non-régression : pendant le Delay, cliquer dans le champ et taper : texte conservé, curseur immobile (VAL-13).
|
|||
|
|
- [ ] J2bis, StatMenu : un refus de nom y est-il accessible ? Si oui, même essai ; sinon consigner « reporté, motif » (VAL-14).
|
|||
|
|
- [ ] Après l'essai : Grep `FCachedTypefaceData::FCachedTypefaceData` dans `Saved\Crashes` ; 1 fichier attendu, l'ancien (VAL-15).
|
|||
|
|
- [ ] Accepter ou refuser `hyper_blueprint_debug_inspect` absent (E1) comme écart permanent du serveur MCP.
|
|||
|
|
- [ ] Garder ou retirer la branche 5.5 de la fonction (SPEC Q1) ; chercher ou non les mods qui posent `WidgetStyle` sur une Text Box (SPEC R3).
|
|||
|
|
- [ ] Commit de STE-TXT + STE-P1 par le gardien après J2bis : `M Content/UI/CharGen.uasset`, `M Content/UI/StatMenu.uasset`, `A Source/LifePlay/LPWidgetStyleLibrary.h`, `A Source/LifePlay/LPWidgetStyleLibrary.cpp`, livrables STE-P1 ; entrées ERR-088 et CHG à écrire par lp-writer ou l'orchestrateur (non vues dans cette VAL). Rien n'est commité par cette VAL.
|
|||
|
|
|
|||
|
|
Fichiers à commiter (pour le ticket du gardien, ni A ni M faits par moi dans git) :
|
|||
|
|
```
|
|||
|
|
M Docs/Migration/etat/ST/STE/STE-VAL.md
|
|||
|
|
A Docs/Migration/etat/ST/STE/STE-VAL_LPDumpFunction_20261010-141402.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/STE-VAL_LPDumpFunction_20261010-141459.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/STE-VAL_CompileAllBlueprints_20261010-141625.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/STE-VAL_LPTestStringCompat_20261010-141936.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/STE-P1-VAL_BuildLog_20261010-142047.txt
|
|||
|
|
```
|
|||
|
|
(`git status` ne liste pas ces `.txt` en `??` : probablement ignorés par `.gitignore`, estimé ; le gardien décide, comme pour les résumés de STE-GI.)
|
|||
|
|
|
|||
|
|
Tours : 27 / 40
|
|||
|
|
|
|||
|
|
## STE-P1 et STE-TXT — preuve en PIE J2bis (2026-10-10, 14:25-14:30)
|
|||
|
|
|
|||
|
|
Éditeur avec interface (BUILD-GO Big Boss), pid 9932, de 14:25:32 à 14:30:15. Assets : CharGen A0DE37AC…,
|
|||
|
|
StatMenu 9030531C…. Validation de l'utilisateur, dans la session LOT STE : « oui 10 refus sans crash, texte noir, éditeur fermé ».
|
|||
|
|
|
|||
|
|
- 10 refus du nom vide de suite (flash rouge), sans plantage. Aucun dossier `Saved\Crashes` après 14:25 (avant STE-P1 :
|
|||
|
|
plantage au premier refus, rapport `UECC-…6F2B4B3F` à 13:32:31).
|
|||
|
|
- Texte du champ noir, avec et sans focus, y compris après un flash. Variance noire (capture utilisateur : `6,0`).
|
|||
|
|
- Journal de l'éditeur `Saved\Logs\LifePlay.log` (14:28:28) : 0 `Accessed None` LogScript ; 1 erreur PIE
|
|||
|
|
`property GI dans CharGen_C` (l. 2715, résumé l. 2795), résidu connu `SpinBox_0` confié à STF-T5, sans lien avec STE.
|
|||
|
|
- Effet de bord : un Save Preset avec `tee` a créé `Content\Modules\tee.lpcharacter` (14:27:57, 1 924 o), déplacé
|
|||
|
|
vers `D:\Game\LifePlay_Backup_5.5\STE-TXT\essai-J2bis\` (MD5 95E50214… identique), dépôt des modules revenu à l'état d'avant.
|
|||
|
|
- Sortie : UeState à 0 ; MD5 CharGen A0DE37AC…, StatMenu 9030531C…, GI 606EB437…, MainMenu 7292C6BE… inchangés ;
|
|||
|
|
`git status` = CharGen, StatMenu, 2 fichiers Source.
|
|||
|
|
|
|||
|
|
**Verdict J2bis : PASS** (STE-P1 : plantage ERR-088 supprimé ; STE-TXT : texte noir lisible, critère § 8 de la fiche).
|
|||
|
|
Non essayé : le flash rouge de StatMenu (même schéma de nœuds, validé en statique).
|
|||
|
|
|
|||
|
|
## STE-GARDES (H3, H3b, H2)
|
|||
|
|
|
|||
|
|
Fiche STE-VAL (partie STE-GARDES : STE-H3, STE-H3b, STE-H2) — Niveau N1 — Modèle prévu sonnet | utilisé Sonnet 5.5 (claude-sonnet-5-5) — Agent lp-validator — Skills sk-protocol, sk-recount, debug-verification, lp-validate
|
|||
|
|
|
|||
|
|
Copie `D:\Game\LifePlay-master 5.8`, branche `ue5.8` (`git branch --show-current`), HEAD `8b6f6a9`. BUILD-GO de Big Boss
|
|||
|
|
(2026-10-10, ~17:35-17:50) : commandlets en lecture seule, éditeur fermé, un à la fois, aucune écriture dans `Source`,
|
|||
|
|
`Content`, `Config` ni dans une doc validée, aucun git en écriture. Commandes en pwsh (ou `MSYS_NO_PATHCONV=1` sous Git Bash)
|
|||
|
|
depuis la racine de la copie. Les résumés de `RunCommandlet.ps1` (lot `STE-VAL`) sont tombés dans `Docs\Migration\etat\ST\STE\`
|
|||
|
|
(lignes `resume :` des 8 commandes ; `ls Docs/Migration/etat/STE*` : aucun dossier parasite). Tous les chiffres ci-dessous
|
|||
|
|
sont rejoués par moi, pas repris de l'IMPL.
|
|||
|
|
|
|||
|
|
### 1. Fiches amont relues
|
|||
|
|
|
|||
|
|
- `etat\ST\STE\STE-GARDES-IMPL.md` (IMPL, lue en entier : § 1 trois sous-lots et MD5, § 2 table des 12 gardes, § 3 écarts, § 4 sortie, § 5 trois points à confirmer).
|
|||
|
|
- `etat\ST\STE\STE-H3-SPEC.md` (lue en entier : § 2.2 à 2.7 « Après » de G1 à G6, § 7 critères).
|
|||
|
|
- `etat\ST\STE\STE-H3b-SPEC.md` (lue en entier : § 2.2 G7, § 2.3 G8, § 2.4 bis G9, § 2.5 G10 variante a, § 2.6 G11 variante a, § 7 critères).
|
|||
|
|
- `etat\ST\STE\STE-H2-DIAG.md` (« Correctif proposé » et « Critères de VAL », l. 129-190 : tableau avant / après, 5 `connect_pins`).
|
|||
|
|
- Gabarit VAL : `.claude\skills\lp-doc\gabarits.md` (l. 50-53), relu avec Read.
|
|||
|
|
- Dumps d'avant : `dumps\GI__{setActorVar,getActorVar,ReturnStatIfNeeded,CallFunction,CallFunctionReturnBool}_D3.txt` (état GI 606EB437…, STE-D3) et `dumps\GI__EventGraph_apres-STE-GI.txt` (état GI 606EB437…, VAL STE-GI).
|
|||
|
|
- Non relus : `STE-INT.md`, `STE-TACHES.md`, `STE-GI-IMPL.md` (autres parties) ; `STE-D-INV.md`. L'IMPL affirme « dumps STE-D3 identiques ligne pour ligne à STE-D / STE-D2 » : non rejoué (les D3 sont mon « avant »).
|
|||
|
|
|
|||
|
|
### 2. Points à confirmer des IMPL (STE-GARDES-IMPL § 5)
|
|||
|
|
|
|||
|
|
| # | Point | Verdict | Preuve |
|
|||
|
|
|---|---|---|---|
|
|||
|
|
| 1 | Dumps après des 6 graphes contre les dumps STE-D3 / `GI__EventGraph_apres-STE-GI.txt` : seuls les nœuds et liens du § 2 | **PASS (contenu) avec écart de total E1** | § 3 C2 à C5b : 41 nœuds ajoutés, tous ceux du § 2 de l'IMPL, 0 retiré, 13 liaisons coupées, 88 posées, toutes sur les nœuds ajoutés ou les nœuds gardés ; 0 liaison hors de ces nœuds. Mais le total « 37 » écrit dans l'IMPL (et dans la fiche) est faux : les nombres par garde du même § 2 font 41 (E1). |
|
|||
|
|
| 2 | CompileAllBlueprints 0 / 0 ; LPTestStringCompat 3120 / 0 / 60 | **PASS** | § 3 C6 (418 / 418, 0 erreur, 0 avertissement) et C7 (3120 / 0 / 60). |
|
|||
|
|
| 3 | Preuve en jeu : Grep `property Person in`, `Person_24`, `CallFunc_Array_Get_Item_3[0-3]\|_41`, `CallFunc_GetSkeletalMesh_ReturnValue`, ligne « by 0 » à 0 ou en forte baisse | **reporté** (build Development et parcours STB-JEU2, par l'utilisateur) | Exige un build empaqueté et un parcours en jeu ; non rejouable éditeur fermé. Voir § 6. |
|
|||
|
|
|
|||
|
|
### 3. Critères rejoués (commande → résultat)
|
|||
|
|
|
|||
|
|
| # | Critère | Commande | Attendu | Compté | Verdict |
|
|||
|
|
|---|---|---|---|---|---|
|
|||
|
|
| C0 | Entrée : UeState, MD5, status | `.\Tools\UeState.ps1` ; `Get-FileHash -Algorithm MD5` sur GI, CharGen, MainMenu, StatMenu ; `(Get-Item Content\BPs\GI.uasset).Length` ; `git status --short -- Content Config Source` | UeState à 0 ; GI B8B97C46…, CharGen E4C2EEA6…, MainMenu 7292C6BE…, StatMenu 9030531C… ; status = ` M GI` + `?? LPReadableTextSubsystem.*` | `processus=0 editeur=0 compilation=0 shaders=0 jeu=0` ; GI `B8B97C46B825A6AF942BAABD5BF74C56` (52 540 467 o, = taille de l'IMPL § 1) ; CharGen `E4C2EEA6A3A2129EB8B382715609B1D5` ; MainMenu `7292C6BEB26A8066343ABDDF49B63D9F` ; StatMenu `9030531CCF4EF46C133722DACD6D2203` ; status : ` M Content/BPs/GI.uasset`, `?? Source/LifePlay/LPReadableTextSubsystem.cpp`, `?? Source/LifePlay/LPReadableTextSubsystem.h` (3 lignes) | PASS |
|
|||
|
|
| C1 | Dumps après (6, un à la fois) | `.\Tools\RunCommandlet.ps1 -Lot STE-VAL -Commandlet LPDumpFunction -Args '-BP=GI -Fn=<Fn> -Pins -Exec'` pour setActorVar, getActorVar, ReturnStatIfNeeded, CallFunction, CallFunctionReturnBool, EventGraph | 6 × code 0 | 6 × `code=0 erreurs=0` : setActorVar 46 s (avertissements=200, horodatage 173836), getActorVar 46 s (124, 173923), ReturnStatIfNeeded 46 s (486, 174009), CallFunction 51 s (7657, 174055), CallFunctionReturnBool 51 s (3046, 174148), EventGraph 56 s (30150, 174240) ; les « avertissements » sont les lignes `LogLPDump: Warning:` du dump. Résumés `STE-VAL_LPDumpFunction_20261010-<hhmmss>.txt` dans `etat\ST\STE\`, journaux `Saved\Logs\portage\STE-VAL_LPDumpFunction_*.log`. Copies `dumps\GI__<Fn>_apres-GARDES.txt` × 6, tailles dans le même ordre : 29 705 / 23 367 / 53 905 / 654 213 / 275 675 / 2 605 606 o | PASS |
|
|||
|
|
| C2 | Nombre de nœuds (deux méthodes) | (a) ligne d'en-tête « === GI :: <Fn> (N noeuds) » lue par mon script ; (b) Grep count `^LogLPDump: Warning: [^ ]` sur chaque dump d'avant et d'après | setActorVar +2, getActorVar +2, ReturnStatIfNeeded +4, CallFunction +25, CallFunctionReturnBool +6, EventGraph +2 (= 41) | avant → après : setActorVar **32 → 34**, getActorVar **15 → 17**, ReturnStatIfNeeded **95 → 99**, CallFunction **1538 → 1563**, CallFunctionReturnBool **585 → 591**, EventGraph **6231 → 6233** ; (a) et (b) concordent. Delta par graphe +2 / +2 / +4 / +25 / +6 / +2 ; somme **+41** (Grep : 8496 avant, 8537 après, 8537 − 8496 = 41). Aucun doublon de nom de nœud dans les 12 dumps. | PASS (par graphe) ; **le total « 37 » de la fiche est faux : 41 (E1)** |
|
|||
|
|
| C3 | Diff par nom de nœud et par liaison | `python -I scratchpad\diffgi.py <avant> <après>` (script de lecture, hors dépôt : parse les dumps, compare par nom de nœud la description et chaque broche, puis l'ensemble des arêtes non orientées et des valeurs) sur les 6 paires | ajoutés = § 2 de l'IMPL ; retirés 0 ; liaisons changées = celles des gardes | **ajoutés 41** (liste nominative = IMPL § 2, graphe par graphe : setActorVar `CallFunction_7`, `IfThenElse_3` ; getActorVar `CallFunction_3`, `IfThenElse_1` ; ReturnStatIfNeeded `CallArrayFunction_1`, `IfThenElse_0`, `CallFunction_9`, `IfThenElse_1` ; CallFunction `CallArrayFunction_8` à `_14` (7), `IfThenElse_12` à `_22` (11), `CallFunction_355` à `_360` (6), `MakeArray_178` (1) = 25 ; CallFunctionReturnBool `CallArrayFunction_4`, `IfThenElse_0`, `CallFunction_99`, `IfThenElse_1`, `CallFunction_98`, `VariableSet_51` ; EventGraph `CallFunction_567`, `IfThenElse_215`) ; **retirés 0** ; arêtes **coupées 13** (1 + 1 + 2 + 7 + 1 + 1) ; **posées 4 + 5 + 10 + 52 + 12 + 5 = 88** ; « arêtes hors nœuds ajoutés / modifiés » = **0** dans les 6 graphes ; nœuds existants modifiés : 2 + 3 + 5 + 32 + 6 + 4 = 52, tous portés par une coupure ou un lien ajouté vers un nœud de garde (les seules broches changées sont des broches d'exécution coupées ou reliées à un nœud de garde, et des sorties de données qui gagnent une cible de plus). Aucune valeur de broche changée sur un nœud existant. | PASS |
|
|||
|
|
| C4 | Chaque garde contre le texte « Après » de sa SPEC (liens relus broche à broche dans la sortie du script) | lecture de `diff_*.out` et `added.out` (scratchpad) | voir colonnes | **G1** (H3S § 2.2) : coupe `FunctionEntry_0.then ↔ IfThenElse_2.execute` ; pose `FunctionEntry_0.then → IfThenElse_3.execute`, `FunctionEntry_0.Person → CallFunction_7.Object`, `CallFunction_7.ReturnValue → IfThenElse_3.Condition`, `IfThenElse_3.then → IfThenElse_2.execute` ; `else` vide ; nœud 7 = `KismetSystemLibrary::IsValid()`. **G2** (§ 2.3) : coupe `FunctionEntry_0.then ↔ VariableSet_0.execute` ; pose `then → IfThenElse_1.execute`, `Person → CallFunction_3.Object`, `RV → Condition`, `IfThenElse_1.then → VariableSet_0.execute`, `IfThenElse_1.else → FunctionResult_1.execute`. **G3** (§ 2.4) : coupes `81822.then ↔ VariableSet_1019.execute`, `VariableSet_1019.then ↔ 7798.execute` ; poses `81822.then → IfThenElse_0.execute`, `BreakStruct_2805.Person_24_4B712C90… → CallArrayFunction_1.TargetArray`, `Array_IsValidIndex.RV → IfThenElse_0.Condition`, `IfThenElse_0.then → VariableSet_1019.execute`, `IfThenElse_0.else → FunctionResult_7.execute`, `VariableSet_1019.then → IfThenElse_1.execute`, `VariableSet_1019.Output_Get → CallFunction_9.Object`, `CallFunction_9.RV → IfThenElse_1.Condition`, `IfThenElse_1.then → 7798.execute`, `IfThenElse_1.else → FunctionResult_7.execute` (10 poses = les 10 de la SPEC). **G4** (§ 2.5) : coupe `186.then ↔ 185.execute` ; `186.then → IfThenElse_12.execute`, `BreakStruct_52.Person_24_… → CallArrayFunction_8.TargetArray`, RV → `IfThenElse_12.Condition`, `IfThenElse_12.then → IfThenElse_13.execute`, `GetArrayItem_73.Output → CallFunction_355.Object`, RV → `IfThenElse_13.Condition`, `IfThenElse_13.then → 185.execute`, deux `else` vides. **G5** (§ 2.6) : coupe `189.then ↔ 190.execute` ; mêmes 7 liens via `CallArrayFunction_9`, `IfThenElse_14`, `CallFunction_356`, `IfThenElse_15`, source `BreakStruct_54`, `GetArrayItem_75`, cible `190.execute` ; deux `else` vides. **G6** (§ 2.7) : coupe `178.then ↔ 179.execute` ; 9 liens via `CallArrayFunction_10`, `IfThenElse_16/17`, `CallFunction_357`, source `BreakStruct_48`, `GetArrayItem_71`, cible `179.execute`, et `IfThenElse_16.else`, `IfThenElse_17.else → CallFunction_180.execute`. **G7** (H3bS § 2.2) : coupe `141.then ↔ 142.execute` ; `141.then → IfThenElse_18.execute`, `BreakStruct_40.Person_24_… → CallArrayFunction_11.TargetArray`, RV → Condition, `then → 142.execute`, `else → 143.execute`. **G8** (§ 2.3) : coupe `150.then ↔ 162.execute` ; 4 liens via `CallArrayFunction_12`, `IfThenElse_19`, source `BreakStruct_45`, `else` vide. **G9** (§ 2.4 bis) : coupe `144.then ↔ 163.execute` ; 4 liens via `CallArrayFunction_13`, `IfThenElse_20`, source `BreakStruct_39`, `else` vide. **G10** (§ 2.5 a) : coupe `200.then ↔ 203.execute` ; les 16 liens 1 à 16 de la SPEC, dont `IfThenElse_21.else`, `IfThenElse_22.else → CallFunction_360.execute`, `VariableGet_152.AI_Untils → CallFunction_359.TargetMap`, `359.Value → MakeArray_178.[0]`, `MakeArray_178.Array → 360.Float`, `VariableGet_153.VariableName → 360.Name`, `MakeArray_149/148/146.Array → 360.Bool/String/Person`. **G11** (§ 2.6 a) : coupe `177620.then ↔ VariableSet_57739.execute` ; les 12 liens 1 à 12 de la SPEC, dont `IfThenElse_0.else`, `IfThenElse_1.else → VariableSet_51.execute`, `VariableGet_128296.ActualParameters → CallFunction_98.Types`, `CallFunction_98.hasRelationship → VariableSet_51.BoolToReturn`, `VariableSet_51.then → IfThenElse_8994.execute`. **G-H2** (DIAG) : coupe `CallArrayFunction_231.then ↔ MacroInstance_207.Exec` ; `231.then → IfThenElse_215.execute`, `CallFunction_1101.ReturnValue → CallFunction_567.Object` (lien vers `VariableGet_7134.self` gardé), `567.RV → IfThenElse_215.Condition`, `IfThenElse_215.then → MacroInstance_207.Exec`, `IfThenElse_215.else → CallFunction_10426.execute` (`207.Completed → 10426.execute` gardé). | PASS |
|
|||
|
|
| C5 | Valeurs de broches des nœuds créés (IsValid, IsValidIndex, Key, Slot, Class) | `added.out` (scratchpad, `python -I showadded.py`) ; relecture dans les dumps par Grep (`CallFunction_359`, `_360`, `CallFunction_98`) | `IndexToTest = 0` ; IsValid sur la bonne sortie ; `Key = 0`, `Slot = 0`, `Class = Float` | **9 `Array_IsValidIndex` créés** (ReturnStatIfNeeded 1, CallFunction 7, CallFunctionReturnBool 1) : `IndexToTest = '0'` partout, `TargetArray` ← la sortie `Person_24_4B712C90…` du `BreakStruct` de la SPEC (vérifiée garde par garde en C4). **9 `IsValid`** (`KismetSystemLibrary::IsValid()`, `self` vide) : `Object` ← `FunctionEntry_0.Person` (G1, G2), `VariableSet_1019.Output_Get` (G3), `GetArrayItem_73 / _75 / _71 / _78` `.Output` (G4, G5, G6, G10), `GetArrayItem_12254.Output` (G11), `CallFunction_1101.ReturnValue` (G-H2) ; `ReturnValue` → `Condition` du `IfThenElse` voulu. **G10** : `CallFunction_359` = `BlueprintMapLibrary::Map_Find()`, `Key = '0'` (`GI__CallFunction_apres-GARDES.txt:7709`) ; `CallFunction_360` = `AddVariable()`, `Class = 'Float'` (`:7720`), `Array = 'false'`. **G11** : `CallFunction_98` = `hasRelationship()` (pur, pas de broche `execute`), `Slot = '0'` (`GI__CallFunctionReturnBool_apres-GARDES.txt:3089`). `else` vide : G1, G4 (×2), G5 (×2), G8, G9 ; `else` relié : G2 (→ `FunctionResult_1`), G3 (×2 → `FunctionResult_7`), G6 (×2 → `CallFunction_180`), G7 (→ `CallFunction_143`), G10 (×2 → `CallFunction_360`), G11 (×2 → `VariableSet_51`), G-H2 (→ `CallFunction_10426`), conformes à la SPEC de chaque garde. | PASS |
|
|||
|
|
| C5b | Entrées de données de `360` / `359` / `98` / `51` identiques à celles des nœuds d'origine `203` / `202` / `177622` / `57739` | table `pair()` de `showadded.py`, pin par pin | toutes identiques, sauf le remplacement voulu (`Key` / `Slot` en littéral `0`) | **`CallFunction_360` vs `_203`** : `Name` ← `VariableGet_153.VariableName`, `Bool` ← `MakeArray_149`, `String` ← `MakeArray_148`, `Person` ← `MakeArray_146`, `Class = 'Float'`, `Array = 'false'`, `Building` vide, `self` vide, `then` vide : identiques ; `Float` ← `MakeArray_178` (copie de `MakeArray_147`, dont `[0]` ← `Map_Find`) : voulu. **`359` vs `202`** : `TargetMap` ← `VariableGet_152.AI_Untils` identique ; `Key` ← `Concat(Prefix, IntToString(SaveSlot))` devient `'0'` : voulu (SPEC « rejeu exact avec la clé "0" ») ; `ReturnValue = 'false'` identique. **`MakeArray_178` vs `_147`** : même forme (`[0]` ← `Find.Value`, `Array` → `AddVariable.Float`). **`98` vs `177622`** : `Types` ← `VariableGet_128296.ActualParameters` identique ; `Slot` ← `Concat(...)` devient `'0'` : voulu ; sortie `hasRelationship` → `VariableSet_51.BoolToReturn`. **`VariableSet_51` vs `_57739`** : `BoolToReturn` ← `CallFunction_98`, `Output_Get = 'false'`, `then → IfThenElse_8994.execute` : identiques à l'origine. Nœuds d'origine `203` et `177622` : leurs entrées de données n'ont pas bougé (`203` n'apparaît dans la liste des nœuds modifiés que pour `execute`, `177622` n'y apparaît pas). | PASS |
|
|||
|
|
| C6 | CompileAllBlueprints, éditeur fermé | `.\Tools\RunCommandlet.ps1 -Lot STE-VAL -Commandlet CompileAllBlueprints` | 0 erreur, 0 avertissement ; référence 418 / 418, 0 / 0 | `code=0 duree=181s erreurs=0 avertissements=0`. Journal `Saved\Logs\portage\STE-VAL_CompileAllBlueprints_20261010-174503.log` : Grep count « Loading and Compiling » = **418**, Grep count « a réussi » = **418** ; l. 3240 `LogInit: Display: Success - 0 error(s), 0 warning(s)` ; l. 2019 « La compilation de GI a réussi ! [en 3 876 ms] (/Game/BPs/GI.GI) » ; aucune ligne `LogBlueprint: Error` ni `Warning` (Grep sur le journal : 0). Résumé `STE-VAL_CompileAllBlueprints_20261010-174503.txt`. Égal à la référence. | PASS |
|
|||
|
|
| C7 | LPTestStringCompat | `.\Tools\RunCommandlet.ps1 -Lot STE-VAL -Commandlet LPTestStringCompat` | code 0, `3120 cas : compat != herite(UE4) : 0 ; moteur != herite(UE4) : 60` | `code=0 duree=16s erreurs=0 avertissements=2` ; journal `STE-VAL_LPTestStringCompat_20261010-174805.log` l. 1995 et 2000 : `=== 3120 cas : compat != herite(UE4) : 0 ; moteur != herite(UE4) : 60 ===` (les 2 « avertissements » sont cette ligne de résultat, émise en `Warning`). | PASS |
|
|||
|
|
| C8 | Sortie : UeState, MD5, status ; emplacement des résumés | `.\Tools\UeState.ps1` ; `Get-FileHash -Algorithm MD5` ; `git status --short -- Content Config Source` ; `ls Docs/Migration/etat/ST/STE/STE-VAL_*20261010-17*` ; `ls Docs/Migration/etat/` | UeState 0 ; MD5 inchangés ; status inchangé ; résumés dans `ST\STE\` | `processus=0 editeur=0 compilation=0 shaders=0 jeu=0` ; GI `B8B97C46B825A6AF942BAABD5BF74C56` (52 540 467 o), CharGen `E4C2EEA6A3A2129EB8B382715609B1D5`, MainMenu `7292C6BEB26A8066343ABDDF49B63D9F`, StatMenu `9030531CCF4EF46C133722DACD6D2203` : **identiques à C0** ; status = les 3 mêmes lignes qu'à l'entrée ; 8 résumés `STE-VAL_*_20261010-17*.txt` (6 `LPDumpFunction`, 1 `CompileAllBlueprints`, 1 `LPTestStringCompat`) dans `Docs\Migration\etat\ST\STE\`, aucun dossier `etat\STE*`. Les commandlets n'ont modifié aucun fichier suivi. | PASS |
|
|||
|
|
|
|||
|
|
Recompte croisé du total de nœuds (sk-recount) : (a) somme des nombres par garde du § 2 de l'IMPL : 2 + 2 + 4 + 4 + 4 + 4 + 2 + 2 + 2 + 7 + 6 + 2 = **41** ; (b) somme par sous-lot : G1-G6 = 20 (IMPL : 20), G7-G11 = 2 + 2 + 2 + 7 + 6 = **19** (IMPL : 15), G-H2 = 2 (IMPL : 2) ; (c) somme des en-têtes de dump : 41 ; (d) Grep count d'en-têtes de nœud : 41. Le « 15 » de l'IMPL pour G7-G11 et donc le « 37 » (et le « Total : 37 » de la fiche) sont des erreurs d'addition ; les 13 coupures de l'IMPL sont confirmées (C3).
|
|||
|
|
|
|||
|
|
### 4. Diff lu en entier
|
|||
|
|
|
|||
|
|
- Fichier unique suivi concerné : `Content/BPs/GI.uasset` (binaire, 52 450 518 → 52 540 467 o, +89 949 o pour 41 nœuds, estimé cohérent), seul fichier de `Content`, `Config`, `Source` modifié (C0, C8) ; `Source/LifePlay/LPReadableTextSubsystem.*` est l'autre lot (LISIB), non touché. Il se lit par les dumps, pas par `git diff` texte. Les 6 diffs de dumps sont lus en entier (1 892 → 1 937 arêtes dans `CallFunction`, 803 → 814 dans `CallFunctionReturnBool`, 8249 → 8253 dans l'EventGraph, 46 → 49, 20 → 24, 116 → 124 dans les trois petites fonctions) : toutes les arêtes qui bougent touchent un nœud ajouté ; aucune arête ne bouge ailleurs.
|
|||
|
|
- La seule propriété comparée est ce que le dump montre (description, broches, liens, valeurs par défaut) : positions des nœuds, GUID, commentaires, types de broche et propriétés de nœud ne sont pas dans le dump (non vérifiés).
|
|||
|
|
- Non rejoué : les autres graphes de GI (fonctions, macros, autres) sont-ils inchangés ? L'IMPL écrit que seuls ces 6 graphes sont touchés ; je n'ai dumpé que ces 6. La taille et le MD5 ne le prouvent pas. À trancher si l'utilisateur le veut (un dump par fonction contre les dumps d'avant de `dumps\`).
|
|||
|
|
- Non rejoué : `Tools\DiffRemplacementNoeuds.py` demandé par les SPEC § 7 (outil à profils de remplacement de nœuds pour d'autres dumps) : inadapté à des insertions, remplacé par mon `diffgi.py` ; les trois instantanés `Restore.ps1 -WhatIf` (`STE-H3`, `STE-H3b`, `STE-H2`) ; les appels MCP de l'orchestrateur (`create_node`, `connect_pins`, `compile_blueprint`, `save_assets`), dont seul le résultat est contrôlé ici.
|
|||
|
|
- Script `diffgi.py` et `showadded.py` : dans le scratchpad de session (`%USERPROFILE%\AppData\Local\Temp\claude\D--Game-LifePlay-master-5-8\37530d8d-c780-4a57-8fbd-bcb010aa6408\scratchpad\`), lecture seule, stdlib seule, rejouables ; à ranger dans `Tools\` si l'orchestrateur le veut (pas fait par moi).
|
|||
|
|
- Fichiers que j'ai écrits : ce livrable (ajout de cette section, le fichier est réécrit en entier faute d'Edit, anciennes sections reprises à l'identique, vérifié par `git diff`) ; 8 résumés `STE-VAL_*_20261010-17*.txt` de `RunCommandlet.ps1` dans `Docs\Migration\etat\ST\STE\` ; 6 copies `dumps\GI__<Fn>_apres-GARDES.txt` ; 8 journaux dans `Saved\Logs\portage\` (non suivis). Aucune modification de code, de Content, de Config ni de doc validée ; aucun git en écriture ; aucun éditeur.
|
|||
|
|
|
|||
|
|
### 5. Verdict
|
|||
|
|
|
|||
|
|
**PASS-STATIC** pour STE-GARDES (G1 à G11 et G-H2), sur ce qui est vérifiable éditeur fermé.
|
|||
|
|
|
|||
|
|
Établi avec preuve fraîche : les 6 graphes touchés contiennent exactement les 41 nœuds du § 2 de l'IMPL, aucun nœud retiré, les 13 coupures et les liaisons posées de chaque garde sont celles du texte « Après » de leur SPEC (G1 à G11, G9 d'après le § 2.4 bis, G-H2 d'après le DIAG), `IndexToTest` à 0, `IsValid` sur la bonne sortie, `Key = 0`, `Slot = 0`, `Class = Float`, entrées de données de `360` et `98` égales à celles de `203` et `177622` ; compilation 418 / 418 et 0 / 0 ; test de chaînes 3120 / 0 / 60 ; UeState, MD5 et status identiques à l'entrée.
|
|||
|
|
|
|||
|
|
Pourquoi pas PASS : la preuve en jeu (IMPL § 5 point 3, SPEC § 7.3 de H3 et H3b, DIAG H2 « Critères de VAL ») n'est pas faite ; elle relève de l'utilisateur sur un build Development.
|
|||
|
|
|
|||
|
|
Écarts et réserves :
|
|||
|
|
- **E1 (documentaire, sans effet sur le graphe, à décider)** : le total « 37 nœuds créés » (IMPL § 2 « Totaux », repris dans la fiche) est faux ; recompté **41**, car G7-G11 = 19 et non 15. Le contenu (liste nominative des nœuds et chiffres par garde) est exact. Si l'orchestrateur applique « tout autre écart = FAIL » au seul chiffre 37, le verdict devient FAIL pour ce chiffre ; je le tiens pour une erreur d'addition de la fiche et de l'IMPL (précédent : E1 de STE-GI, 14 au lieu de 13). À corriger dans l'IMPL par son auteur et dans les textes CHG-313 à 315 avant d'y reporter les chiffres.
|
|||
|
|
- **E2** : `hyper_blueprint_debug_inspect` absent du serveur MCP (déjà noté par l'IMPL § 3 et en STE-GI / STE-P1) ; BLOCKED-outil, remplacé par `CompileAllBlueprints` 0 / 0, qui ne fait pas la même vérification.
|
|||
|
|
- **E3** : les autres graphes de GI n'ont pas été redumpés (§ 4).
|
|||
|
|
- **E4** : les SPEC citent `Tools\DiffRemplacementNoeuds.py` ; non utilisé (§ 4).
|
|||
|
|
- **Instant des dumps « avant »** : les D3 datent de 15:35 à 15:41 (`ls -l dumps`), les trois enregistrements de GI de 17:26 à 17:33 (IMPL § 1) ; de plus aucun des 41 noms de nœud ajoutés n'existe dans les dumps d'avant : les D3 précèdent bien les trois sous-lots.
|
|||
|
|
|
|||
|
|
### 6. Points à confirmer par l'utilisateur / l'orchestrateur
|
|||
|
|
|
|||
|
|
- [ ] Accepter l'écart de total E1 (41 nœuds, G7-G11 = 19) et faire corriger l'IMPL avant les textes CHG-313 à 315.
|
|||
|
|
- [ ] Preuve en jeu des gardes (build Development, parcours STB-JEU2 : nouvelle partie, ≥ 20 actions seul, ≥ 3 min en ville ; `index SPAWN` > 0 avant de mesurer). Grep en mode `count` : `property Person in` hors des fonctions gardées ; F1 ciblée multiligne (SPEC H3 § 1) = 0 ; `property CallFunc_Array_Get_Item_3[123] ` = 0 ; `_41` = 0 ; `_30` = 0 ; `hours by 0` = 0 ; `hours by [1-9]` ≥ 1 ; `CallFunc_GetSkeletalMesh_ReturnValue` (pile `UpdatePlayerMeshWithMorphs`) à 0 ou en forte baisse ; rapport `of length 0` / `CHECKING:` inférieur à 351 / 2 318 (reporté).
|
|||
|
|
- [ ] R1 / Q4 / Q5 : `LPDumpSave` avant / après sur la même sauvegarde (clés `"0"` de `ActorVars` et `AI_Untils`), SPEC H3 § 7.4 et H3b § 7.4 (reporté).
|
|||
|
|
- [ ] Dumper les autres graphes de GI pour prouver « inchangés » (E3) ? Sinon, accepter sur la foi de l'IMPL.
|
|||
|
|
- [ ] Ranger `diffgi.py` dans `Tools\` (ou non).
|
|||
|
|
- [ ] Commit de GI et des livrables par le gardien (ticket STE-R4 ou suivant) après la preuve en jeu ; rien n'est commité par cette VAL.
|
|||
|
|
|
|||
|
|
Fichiers à commiter (pour le ticket du gardien, ni A ni M faits par moi dans git) :
|
|||
|
|
```
|
|||
|
|
M Docs/Migration/etat/ST/STE/STE-VAL.md
|
|||
|
|
A Docs/Migration/etat/ST/STE/dumps/GI__setActorVar_apres-GARDES.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/dumps/GI__getActorVar_apres-GARDES.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/dumps/GI__ReturnStatIfNeeded_apres-GARDES.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/dumps/GI__CallFunction_apres-GARDES.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/dumps/GI__CallFunctionReturnBool_apres-GARDES.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/dumps/GI__EventGraph_apres-GARDES.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/STE-VAL_LPDumpFunction_20261010-173836.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/STE-VAL_LPDumpFunction_20261010-173923.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/STE-VAL_LPDumpFunction_20261010-174009.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/STE-VAL_LPDumpFunction_20261010-174055.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/STE-VAL_LPDumpFunction_20261010-174148.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/STE-VAL_LPDumpFunction_20261010-174240.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/STE-VAL_CompileAllBlueprints_20261010-174503.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/STE-VAL_LPTestStringCompat_20261010-174805.txt
|
|||
|
|
```
|
|||
|
|
(`.gitignore:75` ignore `/Docs/Migration/etat/**` : `git check-ignore -v` le confirme pour un dump et un résumé ; seuls les fichiers déjà suivis, comme `STE-VAL.md`, apparaissent en `M`. Le gardien décide pour les `.txt`, comme pour les sections précédentes.)
|
|||
|
|
|
|||
|
|
Tours : 35 / 40 (compté à la main ; `Tools/FicheStats.py` fait foi)
|
|||
|
|
|
|||
|
|
## STE-GARDES — preuve en jeu J3 (archive commune STF-T5 + STE + LISIB, 2026-10-10)
|
|||
|
|
|
|||
|
|
Mesure faite par l'orchestrateur LOT STE. Validation de l'utilisateur, rapportée par Big Boss : « tests terminé, rien de marquant » (2026-10-10).
|
|||
|
|
Journal : `D:\Game\LifePlay_Build_5.8_STF-STE-LISIB_Development\Windows\LifePlay\Saved\Logs\LifePlay.log` (32 927 lignes,
|
|||
|
|
MD5 D029DE50…, 19:24:40), copié dans le scratchpad avant lecture. GI de l'archive = B8B97C46… (état STE-GARDES).
|
|||
|
|
|
|||
|
|
| Motif (Select-String) | Attendu | J3 | STB-JEU2 (avant) |
|
|||
|
|
|---|---|---|---|
|
|||
|
|
| `property Person in` | 0 | **0** | 270 |
|
|||
|
|
| `CallFunc_Array_Get_Item_31` / `_32` / `_33` | 0 | **0 / 0 / 0** | 96 / 24 / 33 |
|
|||
|
|
| `CallFunc_Array_Get_Item_41` / `_30` | 0 | **0 / 0** | 14 / 4 |
|
|||
|
|
| `CallFunc_GetSkeletalMesh_ReturnValue` → pile `UpdatePlayerMeshWithMorphs` | 0 | **0** | 96 |
|
|||
|
|
| `hours by 0` | 0 (effet G5 accepté) | **0** | 24 |
|
|||
|
|
| `Person_24_…` `of length 0` | baisse (R7) | 232 | 351 |
|
|||
|
|
|
|||
|
|
Dénominateurs (le parcours a bien sollicité les gardes) : `hours by [1-9]` = 46 (routines d'IA valides), `index SPAWN` = 151
|
|||
|
|
(mannequins CheckScenes), `CHECKING:` = 5 490 (scènes testées), `Scene_C` = 41.
|
|||
|
|
Restes hors périmètre : 7 `CallFunc_GetSkeletalMesh_ReturnValue` (4 `Person_C:ExecuteUbergraph_Person`, 1 `GI_C:SavePreset`,
|
|||
|
|
1 `CharGen_C:PopulateGenitalSlidersDaz`, 1 `MainMenu` NewGame), aucun de `UpdatePlayerMeshWithMorphs` ; 232 `Person_24`
|
|||
|
|
« Script Msg » d'autres lecteurs de `Person[0]` (R7 de H3b, `getRelatedPerson` R13, fiche H3c à ouvrir après le gel).
|
|||
|
|
|
|||
|
|
**Verdict J3 STE-GARDES : PASS** (toutes les familles visées par G1-G11 et G-H2 à 0, dénominateurs non nuls ; effet G5 constaté).
|
|||
|
|
|
|||
|
|
## STE-H5b / STE-H5c / STE-H3c (VAL, 2026-10-10)
|
|||
|
|
|
|||
|
|
Fiche STE-VAL (partie STE-H5b / STE-H5c / STE-H3c) — Niveau N1 — Modèle prévu sonnet | utilisé Sonnet 5.5 (claude-sonnet-5-5) — Agent lp-validator — Skills sk-protocol, sk-recount, debug-verification, lp-validate
|
|||
|
|
|
|||
|
|
Copie `D:\Game\LifePlay-master 5.8`, branche `ue5.8`, HEAD `6b038c6`. BUILD-GO de Big Boss (file de la copie UE, 2026-10-10,
|
|||
|
|
vers 23:17-23:29 heure locale) : commandlets en lecture seule, éditeur fermé, un à la fois, aucune écriture dans `Content`,
|
|||
|
|
`Config` ni `Source`, aucun éditeur, build, jeu ni git en écriture. Chaque commandlet est encadré par un contrôle MD5 de
|
|||
|
|
`GI.uasset` et `Room.uasset` (arrêt au moindre écart) et par un comptage des processus `UnrealEditor*` / `LifePlay*`
|
|||
|
|
(`Get-CimInstance Win32_Process`, arrêt si > 0). Commandes lancées via `powershell -NoProfile -Command` depuis la racine de la
|
|||
|
|
copie. Tous les chiffres ci-dessous sont rejoués par moi, pas repris des IMPL. Les horodatages de fichiers sont en heure locale,
|
|||
|
|
ceux du contenu des journaux en UTC (écart de 2 h).
|
|||
|
|
|
|||
|
|
### 1. Fiches amont relues
|
|||
|
|
|
|||
|
|
- `etat\ST\STE\STE-J4.md` (lue en entier : § 1-2 IMPL F-a, H5-A = `K2Node_CallFunction_568` dans l'EventGraph de GI ; § 5 restauration du témoin ; § 7-8 décisions O1 + O3 après l'essai C1).
|
|||
|
|
- `etat\ST\STE\STE-H5c-IMPL.md` (IMPL, lue en entier : § 1 instantanés, § 2 écritures O1 / O3 / G12, § 3 résultat et MD5, repli).
|
|||
|
|
- `etat\ST\STE\STE-H5b-SPEC.md` (lue en entier : § 2.0 bis A1-A3, § 2.2 nœuds existants, § 2.4 « Après », § 2.7 témoin, § 7 critères V1-V6).
|
|||
|
|
- `etat\ST\STE\STE-H3c-SPEC.md` (lue en entier : § 2.2 bis « Après » de G12, § 7).
|
|||
|
|
- `etat\ST\STE\STE-H5c-DIAG.md` (lue en entier : tableau des options, O1 / O3).
|
|||
|
|
- Gabarit VAL : `D:\Game\LifePlay-Sandbox\Tools\claude\skills\lp-doc\gabarits.md` (l. 50-53), relu avec Read ; méthode des VAL précédentes : sections `STE-GI` et `STE-GARDES` ci-dessus.
|
|||
|
|
- Dumps d'avant (état de GI et de Room indiqué) : `GI__AddVariable_D5.txt` (49 nœuds, GI B8B97C46), `GI__clearScenePersons_D6.txt` (56, GI M1 4773054E), `Room__EventGraph_D6.txt` (1008, Room D051CE94), `GI__EventGraph_apres-GARDES.txt` (6233, GI B8B97C46, avant F-a), `GI__EventGraph_D6-M1.txt` (6234, GI M1, avec F-a), `GI__CallFunction_apres-GARDES.txt` (1563, GI B8B97C46).
|
|||
|
|
- Non relus : `STE-H5b-C0.md`, `STE-H2b-DIAG.md`, `STE-H5-DIAG.md`, `STE-INT.md`, `STE-TACHES.md` (hors périmètre de cette VAL).
|
|||
|
|
|
|||
|
|
### 2. Points à confirmer des IMPL
|
|||
|
|
|
|||
|
|
Les IMPL (`STE-H5c-IMPL.md`, `STE-J4.md` § 1) n'ont pas de section « points à confirmer » numérotée ; je retiens leurs attentes pour la VAL
|
|||
|
|
(« Nœuds attendus aux dumps de VAL », « dump V1 sur M1 reste à faire », repli, MD5) et les critères V1-V3 de `STE-H5b-SPEC.md` § 7.
|
|||
|
|
|
|||
|
|
| # | Point | Verdict | Preuve |
|
|||
|
|
|---|---|---|---|
|
|||
|
|
| P1 | `AddVariable` 49 → 51 nœuds ; liens de G12 = « Après » de H3c § 2.2 bis | **PASS** | § 3 C1 et C9a. |
|
|||
|
|
| P2 | `clearScenePersons` 56 → 58 nœuds ; O3 (`CallFunction_18`, `IfThenElse_8`) | **PASS** | § 3 C2 et C9b. |
|
|||
|
|
| P3 | `Room.EventGraph` 1008 → 1010 nœuds ; O1 (`CallFunction_62`, `IfThenElse_73`) | **PASS** | § 3 C3 et C9c. |
|
|||
|
|
| P4 | `GI.EventGraph` 6233 → 6234 nœuds ; F-a (`CallFunction_568`) et liens de H5b § 2.4 ; EventGraph inchangé par O3 / G12 | **PASS** | § 3 C4, C9d, C10. Dump V1 sur M1 (« reste à faire », J4 § 1) : couvert par `GI__EventGraph_D6-M1.txt` et par C10 (V5 = D6-M1, 0 ligne de différence). |
|
|||
|
|
| P5 | Témoin `STE-H5b-TEMOIN` (`CallFunction_361` / `_362`) absent de `CallFunction` (1563 nœuds) | **PASS** | § 3 C5, C11. |
|
|||
|
|
| P6 | `CompileAllBlueprints` 418 / 418, 0 erreur, 0 avertissement | **PASS** | § 3 C6. |
|
|||
|
|
| P7 | `LPTestStringCompat` 3120 / 0 / 60 | **PASS** | § 3 C7. |
|
|||
|
|
| P8 | MD5 GI M3 `16394D43…` et Room `E8F58B2A…` avant / après chaque commandlet ; `git status -- Content Config Source` = ` M` GI et Room seuls | **PASS** | § 3 C0, C1-C7 (colonne MD5), C12. |
|
|||
|
|
| P9 | Instantanés `STE-H5c` (GI M1, Room D051CE94) et `STE-H3c` (GI M1) = copies contrôlées | **PASS** | § 3 C13 (MD5 relus). `Restore.ps1 -WhatIf` non rejoué. |
|
|||
|
|
| P10 | Écart accepté : O1 et O3 en fonction pure `IsValid` + Branche (+2 nœuds par garde) au lieu de la macro `IsValid` (+1) | **PASS-STATIC** (lecture) | Les dumps montrent bien `KismetSystemLibrary::IsValid()` (broche `self` vide) + `K2Node_IfThenElse`, deux nœuds par garde. Sémantique : voir C9b et C9c. |
|
|||
|
|
| P11 | `hyper_blueprint_debug_inspect` : 0 diagnostic (SPEC H3c § 2.1, H5b § 2.1) | **BLOCKED-outil** | Outil absent du serveur MCP (déjà noté par l'IMPL et les VAL précédentes) ; remplacé par `CompileAllBlueprints` 0 / 0 (C6). Les `compile_blueprint` de l'IMPL ne sont pas rejoués. |
|
|||
|
|
| P12 | Preuve en jeu J5 : paquets `GI_C:Dress:` / `GetSpecific_PersonToReturn` / `removeAlreadyGot` à 0 sur le parcours de C1 (compagne qui suit) ; critères V5 de H5b § 7 ; critères § 7.3 de H3c (232 F2 `Person_24` → 0) | **reporté** (J5, build Development, par l'utilisateur) | Exige un build empaqueté et un parcours ; non rejouable éditeur fermé. |
|
|||
|
|
| P13 | Les autres graphes de GI et de Room sont inchangés | **reporté / non rejoué** | Je n'ai dumpé que 5 graphes (GI : `AddVariable`, `clearScenePersons`, `EventGraph`, `CallFunction` ; Room : `EventGraph`). Voir E3. |
|
|||
|
|
|
|||
|
|
### 3. Critères rejoués (commande → résultat)
|
|||
|
|
|
|||
|
|
Commande commune : `.\Tools\RunCommandlet.ps1 -Lot STE-V5 -Commandlet <C> -Args '<args>'` (les résumés tombent dans `Docs\Migration\etat\ST\STE\STE-V5_<C>_<horodatage>.txt`, les journaux dans `Saved\Logs\portage\STE-V5_<C>_<horodatage>.log`). MD5 attendus : GI `16394D438788E986AC23FAEB427402B8`, Room `E8F58B2A4A79DA0D62D8FACC18411CE8`. Notation MD5 : « A/A » = identiques aux attendus avant et après le commandlet, processus = 0 avant et après.
|
|||
|
|
|
|||
|
|
| # | Critère | Commande (`-Args`) | Attendu | Obtenu | Verdict |
|
|||
|
|
|---|---|---|---|---|---|
|
|||
|
|
| C0 | Entrée : MD5, processus, état git | `md5sum Content/BPs/GI.uasset Content/BPs/Room.uasset` ; `Get-CimInstance Win32_Process` (filtre `UnrealEditor\|LifePlay`) ; `git status --short -- Content Config Source` | MD5 attendus ; 0 processus ; ` M` GI et Room | GI `16394d438788e986ac23faeb427402b8`, Room `e8f58b2a4a79da0d62d8facc18411ce8` ; 0 processus ; ` M Content/BPs/GI.uasset`, ` M Content/BPs/Room.uasset` | PASS |
|
|||
|
|
| C1 | Dump `AddVariable` | `LPDumpFunction` `-BP=GI -Fn=AddVariable -Pins -Exec` | code 0 ; `(51 noeuds)` | `code=0 duree=46s erreurs=0 avertissements=307` (23:17:33, journal `STE-V5_LPDumpFunction_20261010-231733.log`) ; en-tête `=== GI :: AddVariable (51 noeuds) ===` ; MD5 A/A | PASS |
|
|||
|
|
| C2 | Dump `clearScenePersons` | `LPDumpFunction` `-BP=GI -Fn=clearScenePersons -Pins -Exec` | code 0 ; `(58 noeuds)` | `code=0 duree=47s erreurs=0 avertissements=307` (`…231828.log`) ; `=== GI :: clearScenePersons (58 noeuds) ===` ; MD5 A/A | PASS |
|
|||
|
|
| C3 | Dump `Room.EventGraph` | `LPDumpFunction` `-BP=Room -Fn=EventGraph -Pins -Exec` | code 0 ; `(1010 noeuds)` | `code=0 duree=51s erreurs=0 avertissements=4839` (`…231918.log`) ; `=== Room :: EventGraph (1010 noeuds) ===` ; MD5 A/A | PASS |
|
|||
|
|
| C4 | Dump `GI.EventGraph` | `LPDumpFunction` `-BP=GI -Fn=EventGraph -Pins -Exec` | code 0 ; `(6234 noeuds)` | `code=0 duree=61s erreurs=0 avertissements=30162` (`…232014.log`) ; `=== GI :: EventGraph (6234 noeuds) ===` ; MD5 A/A | PASS |
|
|||
|
|
| C5 | Dump `GI.CallFunction` | `LPDumpFunction` `-BP=GI -Fn=CallFunction -Pins -Exec` | code 0 ; `(1563 noeuds)` ; 0 `STE-H5b-TEMOIN` | `code=0 duree=51s erreurs=0 avertissements=7657` (`…232243.log`) ; `=== GI :: CallFunction (1563 noeuds) ===` ; Grep count `STE-H5b-TEMOIN` sur `dumps\GI__CallFunction_V5.txt` = **0** ; MD5 A/A | PASS |
|
|||
|
|
| C6 | CompileAllBlueprints | `CompileAllBlueprints` (sans argument) | code 0 ; 0 erreur, 0 avertissement ; référence 418 / 418 | `code=0 duree=186s erreurs=0 avertissements=0` (23:25:38, `STE-V5_CompileAllBlueprints_20261010-232538.log`). Grep count « Loading and Compiling » = **418** ; Grep count « a réussi » = **418** ; l. 3242 `LogInit: Display: Success - 0 error(s), 0 warning(s)` ; l. 2017 « La compilation de GI a réussi ! [en 3 856 ms] » ; l. 2021 « La compilation de Room a réussi ! [en 1 039 ms] » ; Grep `Error:\|a échoué\|Failure` sur le journal : 0 ligne (hors la ligne `Success`) ; MD5 A/A. Égal à la référence (STE-GARDES C6). | PASS |
|
|||
|
|
| C7 | LPTestStringCompat | `LPTestStringCompat` (sans argument) | code 0 ; `3120 cas : compat != herite(UE4) : 0 ; moteur != herite(UE4) : 60` | `code=0 duree=16s erreurs=0 avertissements=2` (23:28:47, `STE-V5_LPTestStringCompat_20261010-232847.log`) ; l. 1996 et 2001 : `=== 3120 cas : compat != herite(UE4) : 0 ; moteur != herite(UE4) : 60 ===` (les 2 « avertissements » sont cette ligne, émise en `Warning`) ; MD5 A/A. Égal à la référence. | PASS |
|
|||
|
|
| C8 | Nombre de nœuds, deux méthodes | (a) ligne d'en-tête `(N noeuds)` ; (b) Grep `^ [^ ]` (nœuds à 2 espaces d'indentation) sur chaque `*_V5.txt` normalisé (préfixe `LogLPDump: Warning: ` retiré) | AddVariable 51, clearScenePersons 58, Room 1010, EventGraph 6234, CallFunction 1563 | (a) et (b) concordent : **51 / 58 / 1010 / 6234 / 1563**. Avant (en-tête) : 49 / 56 / 1008 / 6233 / 1563. Delta **+2 / +2 / +2 / +1 / 0**. Nœuds d'EventGraph : 6232 `K2Node_*` + 2 `EdGraphNode_Comment` = 6234. Lignes de dump : 257 / 257 / 4789 / 30112 / 7607 ; + 50 lignes d'écho `LogInit: Display:` = 307 / 307 / 4839 / 30162 / 7657 = le « avertissements » de `RunCommandlet.ps1` (recompte exact). | PASS |
|
|||
|
|
| C9 | Diff par nom de nœud et par ligne contre les dumps d'avant | Normalisation (retrait de l'horodatage, du préfixe `LogLPDump: Warning: `, des CR ; coupe à la ligne `=== `) puis `diff` avant / après et comparaison des listes de noms de nœuds (`comm -23` / `-13`) ; propriétaire de chaque ligne modifiée par `awk` (dernier en-tête de nœud rencontré). Scripts de lecture dans le scratchpad, hors dépôt | nœuds retirés 0 ; ajoutés = ceux des IMPL ; aucune ligne modifiée hors des gardes | **Retirés : 0 dans les 4 graphes modifiés.** Ajoutés : `CallArrayFunction_1`, `IfThenElse_0` (AddVariable) ; `CallFunction_18`, `IfThenElse_8` (clearScenePersons) ; `CallFunction_62`, `IfThenElse_73` (Room) ; `CallFunction_568` (EventGraph). Lignes changées : voir C9a à C9d. | PASS |
|
|||
|
|
| C9a | G12 dans `AddVariable` (AV, 5 lignes changées + 10 ajoutées) | diff `GI__AddVariable_D5.txt` → `GI__AddVariable_V5.txt` | « Après » de H3c § 2.2 bis | Ligne 48 `BreakStruct_1527.Person_24_4B712C90…` : `→ GetArrayItem_2453.Array` gagne `CallArrayFunction_1.TargetArray` (lien vers `GetArrayItem_2453` conservé). Ligne 58 `IfThenElse_3951.then` : `MacroInstance_1960.exec` devient `IfThenElse_0.execute` (seul lien). Ligne 61 `CallArrayFunction_4346.execute` : 4 liens entrants conservés (`1960.Is Not Valid`, `IfThenElse_4367.else`, `IfThenElse_4819.then`, `CallFunction_606.then`) + `IfThenElse_0.else` (5e). Ligne 124 `MacroInstance_1960.exec ← IfThenElse_0.then` (au lieu de `3951.then`). Nouveaux : `CallArrayFunction_1` = `KismetArrayLibrary::Array_IsValidIndex()`, `self` vide, `TargetArray ← BreakStruct_1527.Person_24_…`, **`IndexToTest = '0'`**, `ReturnValue → IfThenElse_0.Condition` ; `IfThenElse_0` : `execute ← IfThenElse_3951.then`, `Condition ← CallArrayFunction_1.ReturnValue`, `then → MacroInstance_1960.exec`, `else → CallArrayFunction_4346.execute`. = 1 coupure (`3951.then ↔ 1960.exec`) et 5 liens posés, exactement le « Après » (nom des 2 nœuds = ceux attendus). `IfThenElse_3951.else` (vide) et le reste du graphe inchangés. | PASS |
|
|||
|
|
| C9b | O3 dans `clearScenePersons` (4 lignes changées + 9 ajoutées) | diff `GI__clearScenePersons_D6.txt` → `GI__clearScenePersons_V5.txt` | IMPL § 2 « O3 » | Ligne 17 `MacroInstance_0.LoopBody` : `CallFunction_13.execute` devient `IfThenElse_8.execute`. Ligne 18 `Array Element` : 13 cibles conservées + `CallFunction_18.Object`. Ligne 156 `CallFunction_13.execute ← IfThenElse_8.then` (au lieu de `MacroInstance_0.LoopBody`). Nouveaux : `CallFunction_18` = `KismetSystemLibrary::IsValid()` pur (`self` vide, `Object ← MacroInstance_0.Array Element`, `ReturnValue → IfThenElse_8.Condition`) ; `IfThenElse_8` : `execute ← MacroInstance_0.LoopBody`, `Condition`, `then → CallFunction_13.execute`, **`else` vide**. = 1 coupure et 4 liens posés. Sémantique (estimée, macro standard non dumpée) : élément nul → `else` vide → fin du corps de boucle = tour suivant du `ForEachLoop`. | PASS |
|
|||
|
|
| C9c | O1 dans `Room.EventGraph` (5 lignes changées + 9 ajoutées) | diff `Room__EventGraph_D6.txt` → `Room__EventGraph_V5.txt` | IMPL § 2 « O1 » | Ligne 2611 `CallFunction_235.then` : `CallFunction_199.execute` devient `IfThenElse_73.execute`. Ligne 2616 `PersonToReturn` : 12 cibles conservées + `CallFunction_62.Object`. Ligne 2332 `CallFunction_199.execute ← IfThenElse_73.then` (au lieu de `235.then`). Ligne 3127 `Knot_1.InputPin` : 5 liens entrants conservés (`IfThenElse_44.then`, `_40.else`, `_41.else`, `_43.else`, `CallFunction_255.then`) + `IfThenElse_73.else` ; `Knot_1.OutputPin → MacroInstance_26` (`IncrementInt`) inchangé (l. 3128). Nouveaux : `CallFunction_62` = `KismetSystemLibrary::IsValid()` (`Object ← CallFunction_235.PersonToReturn`, `ReturnValue → IfThenElse_73.Condition`) ; `IfThenElse_73` : `execute ← CallFunction_235.then`, `then → CallFunction_199.execute`, `else → Knot_1.InputPin`. = 1 coupure et 5 liens posés ; le saut passe par le `Knot_1` déjà utilisé par `IfThenElse_43.else`, juste avant `GetSpecific` (établi par le dump). | PASS |
|
|||
|
|
| C9d | F-a dans `GI.EventGraph` (7 lignes changées + 12 ajoutées) | diff `GI__EventGraph_apres-GARDES.txt` → `GI__EventGraph_V5.txt` | H5b § 2.4 | Ligne 25635 `IfThenElse_148.else` : `CallFunction_743.execute` devient `CallFunction_568.execute` (seul lien). Ligne 24773 `CallFunction_743.execute ← MacroInstance_43.LoopBody, CallFunction_568.then`. Lignes 25043 / 25045 / 25047 / 25049 : `MakeArray_4` / `_5` / `_6` / `_3` `.Array` → `CallFunction_739.<Bool\|Float\|String\|Person>` **et** `CallFunction_568.<même broche>`. Nouveau `CallFunction_568` (`appel ?::AddVariable()`, même forme que `CallFunction_739`) : `execute ← IfThenElse_148.else`, `then → CallFunction_743.execute`, `self` vide, `Name = 'AI'`, `Class = 'Person'`, `Array = 'false'`, `Bool ← MakeArray_4`, `Float ← MakeArray_5`, `String ← MakeArray_6`, `Person ← MakeArray_3`, `Building` vide. = point par point la liste de H5b § 2.4 ; aucun autre nœud modifié. | PASS |
|
|||
|
|
| C10 | EventGraph inchangé par O1 / O3 / G12 | `diff` du `GI__EventGraph_D6-M1.txt` (GI M1 avec F-a, 6234) contre `GI__EventGraph_V5.txt` (GI M3), même normalisation | 0 ligne de différence | **0 ligne** (30112 lignes comparées de part et d'autre). | PASS |
|
|||
|
|
| C11 | Témoin absent de `CallFunction` | `cmp` du dump normalisé `GI__CallFunction_apres-GARDES.txt` (GI B8B97C46, 7607 lignes) contre `GI__CallFunction_V5.txt` ; Grep `K2Node_CallFunction_36[12]\b` et `STE-H5b-TEMOIN` sur `GI__CallFunction_V5.txt` ; Grep `STE-H5b-TEMOIN` sur `Content\BPs\GI.uasset` | identique ; 0 ; 0 | `cmp` : **identiques** (7607 lignes, 1563 nœuds) ; Grep `CallFunction_361` / `_362` : **0** ; `STE-H5b-TEMOIN` dans le dump : **0** ; dans `GI.uasset` (binaire, recherche ASCII) : **0** (limite : une chaîne stockée en UTF-16 ne serait pas vue ; le dump est la preuve principale, la restauration est établie par J4 § 5). | PASS |
|
|||
|
|
| C12 | Sortie : MD5, taille, git, processus | `md5sum` ; `ls -l` ; `git diff --stat -- Content` ; `git status --short -- Content Config Source` ; comptage des processus | MD5 inchangés ; GI 52 553 784 o, Room 5 727 427 o (IMPL § 3) ; status = GI et Room | GI `16394d43…` **52 553 784 o** (git : 52 540 467 → 52 553 784) ; Room `e8f58b2a…` **5 727 427 o** (git : 5 723 964 → 5 727 427) ; ` M Content/BPs/GI.uasset`, ` M Content/BPs/Room.uasset`, rien dans `Config` ni `Source` ; 0 processus. Les 7 commandlets n'ont modifié aucun fichier suivi. | PASS |
|
|||
|
|
| C13 | Instantanés de l'IMPL | `md5sum` + `stat` des copies `D:\Game\LifePlay_Backup_5.5\STE-H5c\Content\BPs\{GI,Room}.uasset`, `STE-H3c\…\GI.uasset`, `STE-H5b\…\GI.uasset` | GI M1 `4773054E…` (52 545 296 o), Room `D051CE94…` (5 723 964 o), GI B8B97C46 | `STE-H5c` GI `4773054e738a0ab166ed1971fd4fa889` (52 545 296 o), Room `d051ce9465fceb8021f3030bf569f626` (5 723 964 o) ; `STE-H3c` GI `4773054e…` (52 545 296 o) ; `STE-H5b` GI `b8b97c46b825a6af942baabd5bf74c56` (52 540 467 o) : conformes à l'IMPL § 1 et au repli. Room avant = taille de `HEAD` (5 723 964). | PASS |
|
|||
|
|
| C14 | Fins de ligne des livrables | `tr -cd '\r' < <fichier> \| wc -c` ; `head -c3 <fichier> \| xxd -p` ; `git ls-files --eol` | `STE-VAL.md` et dumps `_V5` : LF, 0 CR, sans BOM | dumps `_V5` (5 fichiers) : 0 CR, premiers octets `4c6f67` (« Log »), pas de BOM ; `STE-VAL.md` : relevé après écriture, voir la ligne « Fins de ligne » du § 4. | PASS |
|
|||
|
|
|
|||
|
|
Recompte croisé (sk-recount) des liens : lignes ajoutées (`>`) moins lignes retirées (`<`) = AV 15 − 5, clearScenePersons 13 − 4, Room 14 − 5, EventGraph 19 − 7 = +10 / +9 / +9 / +12 = le nombre de lignes des nœuds ajoutés (2 × 5 ; 4 + 5 ; 4 + 5 ; 12), donc chaque ligne modifiée est une ligne d'un nœud existant dont seule la liste de cibles change, et le propriétaire de chaque ligne modifiée (awk) est l'un des nœuds listés en C9a à C9d : aucun lien hors des gardes n'a bougé. Total des liens posés lus dans les dumps : G12 5 + O3 4 + O1 5 = **14**, plus 6 liens pour F-a (déjà dans M1) ; coupures : 1 + 1 + 1 = **3** (= les 3 `break_pins` de l'IMPL).
|
|||
|
|
|
|||
|
|
### 4. Diff lu en entier
|
|||
|
|
|
|||
|
|
- Fichiers suivis concernés : `Content/BPs/GI.uasset` (binaire, `git diff --stat` : 52 540 467 → 52 553 784 o, vs HEAD : F-a + G12 + O3) et `Content/BPs/Room.uasset` (5 723 964 → 5 727 427 o, O1). Ils se lisent par les dumps, pas par `git diff` texte. Les 4 diffs de dumps sont lus en entier (C9a à C9d, 5 + 4 + 5 + 7 lignes modifiées, 10 + 9 + 9 + 12 ajoutées) ; `CallFunction` identique (C11), `EventGraph` de M3 identique à celui de M1 (C10).
|
|||
|
|
- `AddVariable` : le dump « avant » (D5) a été pris sur GI B8B97C46, pas sur M1 ; comme le diff D5 → V5 ne montre que G12, `AddVariable` n'a rien d'autre changé entre B8B97C46 et M3 (F-a n'écrit que l'EventGraph, J4 § 1). De même `clearScenePersons` et Room : « avant » D6 = état juste avant O3 / O1.
|
|||
|
|
- Limite du dump : description, broches, liens et valeurs par défaut seulement ; positions, GUID, commentaires, types de broche et propriétés de nœud (ex. `bPrintToScreen`) ne sont pas vérifiés. `IndexToTest = '0'` est lu.
|
|||
|
|
- Aucun fichier de `Content`, `Config` ni `Source` écrit par moi (C12).
|
|||
|
|
- Fichiers que j'ai écrits : cette section de `STE-VAL.md` (réécrit en entier faute d'Edit, anciennes sections reprises à l'identique, vérifié par `git diff` ; le fichier ne finissait pas par un LF, il en a un maintenant) ; 5 dumps `dumps\*_V5.txt` (lignes `LogLPDump` des journaux, horodatage retiré, sans les 50 lignes d'écho `LogInit: Display:`, LF, sans BOM) ; 7 résumés `STE-V5_*_20261010-23*.txt` produits par `RunCommandlet.ps1` dans `Docs\Migration\etat\ST\STE\` ; 7 journaux dans `Saved\Logs\portage\` (non suivis). Rien d'autre : scripts et fichiers normalisés de comparaison dans le scratchpad de session (hors dépôt).
|
|||
|
|
- Dumps `_V5` ↔ journaux : `GI__AddVariable_V5.txt` ← `STE-V5_LPDumpFunction_20261010-231733.log` ; `GI__clearScenePersons_V5.txt` ← `…231828.log` ; `Room__EventGraph_V5.txt` ← `…231918.log` ; `GI__EventGraph_V5.txt` ← `…232014.log` ; `GI__CallFunction_V5.txt` ← `…232243.log`.
|
|||
|
|
- Fins de ligne : `STE-VAL.md` en LF (relevé final : voir le compte rendu de la VAL ; `tr -cd '\r' < STE-VAL.md | wc -c` doit valoir 0).
|
|||
|
|
|
|||
|
|
### 5. Verdict
|
|||
|
|
|
|||
|
|
**PASS-STATIC** pour STE-H5b (F-a), STE-H5c (O1, O3) et STE-H3c (G12), sur ce qui est vérifiable éditeur fermé.
|
|||
|
|
|
|||
|
|
Établi avec preuve fraîche : les 5 graphes dumpés ont les nombres de nœuds attendus (51 / 58 / 1010 / 6234 / 1563) ; aucun nœud retiré ; les 7 nœuds ajoutés sont exactement ceux des IMPL ; les 3 coupures et les 14 liens posés de G12, O3 et O1, et les liens de F-a, sont ceux des « Après » des SPEC et de l'IMPL, et aucun lien hors de ces nœuds n'a changé ; `IndexToTest = 0` ; `EventGraph` de GI identique à celui de M1 ; `CallFunction` identique à l'état B8B97C46, témoin absent ; `CompileAllBlueprints` 418 / 418 et 0 / 0 ; `LPTestStringCompat` 3120 / 0 / 60 ; MD5 de GI et de Room égaux aux valeurs attendues avant et après chacun des 7 commandlets, 0 processus à chaque contrôle ; instantanés conformes.
|
|||
|
|
|
|||
|
|
Pourquoi pas PASS : la preuve en jeu J5 (disparition des paquets `Dress`, des 232 F2 `Person_24`, critères V5 de H5b) n'est pas faite et relève de l'utilisateur ; `hyper_blueprint_debug_inspect` est absent (BLOCKED-outil) ; les autres graphes de GI et de Room ne sont pas redumpés.
|
|||
|
|
|
|||
|
|
Écarts et réserves :
|
|||
|
|
- **E1 (documentaire, sans effet sur le graphe)** : `STE-H5c-IMPL.md` § 3 écrit « 15 `connect_pins` » ; la somme de ses propres lignes (O1 5 + O3 4 + G12 5) et les dumps donnent **14** liens posés (les 3 `break_pins` sont confirmés). À corriger par l'auteur de l'IMPL avant d'en reporter le chiffre dans le CHG.
|
|||
|
|
- **E2** : `hyper_blueprint_debug_inspect` absent du serveur MCP : BLOCKED-outil, remplacé par `CompileAllBlueprints` (P11).
|
|||
|
|
- **E3** : seuls 5 graphes ont été redumpés (GI : `AddVariable`, `clearScenePersons`, `EventGraph`, `CallFunction` ; Room : `EventGraph`). Les autres graphes de GI (`Dress`, `GetSpecific`, `removeAlreadyGot`, `Async`…) et de Room ne sont pas prouvés inchangés ; la taille (GI +8 488 o de M1 à M3 pour 4 nœuds, Room +3 463 o pour 2 nœuds) est cohérente mais ne le prouve pas (estimé).
|
|||
|
|
- **E4 (accepté par la consigne)** : O1 et O3 en fonction pure `IsValid` + Branche (+2 nœuds par garde), pas la macro `IsValid` du DIAG (+1). Sémantique équivalente, estimée : pour O3, le `else` vide s'appuie sur le comportement du `ForEachLoop` standard (non dumpé).
|
|||
|
|
- **E5** : les 7 résumés `STE-V5_*.txt` de `RunCommandlet.ps1` sont écrits dans `Docs\Migration\etat\ST\STE\` (comportement du script, comme pour les VAL précédentes), en plus des dumps `_V5`.
|
|||
|
|
- **E6** : la recherche de `STE-H5b-TEMOIN` dans `GI.uasset` binaire est une recherche ASCII (C11) ; la preuve est le dump de `CallFunction`.
|
|||
|
|
|
|||
|
|
### 6. Points à confirmer par l'utilisateur / l'orchestrateur
|
|||
|
|
|
|||
|
|
- [ ] J5 en jeu (build Development, parcours de C1 : compagne qui suit le joueur dans deux bâtiments) : `GI_C:Dress:` = 0, `property Person in not an UClass` = 0, `GetSpecific_PersonToReturn` et `removeAlreadyGot` = 0, `Attempted to access index 0 from array 'Person_24_…' of length 0` = 0 (J3 : 232) ; non-régression : `hours by 0` = 0, `hours by [1-9]` ≥ 1, `\[AI\] \d+ moves to` ≥ 1, `STE-H5b-TEMOIN` absent de l'archive (reporté).
|
|||
|
|
- [ ] Accepter l'écart documentaire E1 (14 liens posés, non 15) et le faire corriger dans `STE-H5c-IMPL.md`.
|
|||
|
|
- [ ] Accepter E4 (fonction pure `IsValid` + Branche pour O1 et O3).
|
|||
|
|
- [ ] Faut-il redumper `Dress`, `GetSpecific`, `removeAlreadyGot`, `Async` et d'autres graphes pour prouver « inchangés » (E3) ? Sinon, accepter sur la foi de l'IMPL.
|
|||
|
|
- [ ] Commit de GI (F-a + O3 + G12) et de Room (O1) par le gardien après J5 (CHG à réserver) ; rien n'est commité par cette VAL.
|
|||
|
|
|
|||
|
|
Fichiers à commiter (pour le ticket du gardien, ni A ni M faits par moi dans git ; `.gitignore:75` ignore `/Docs/Migration/etat/**`, le gardien décide pour les `.txt`) :
|
|||
|
|
```
|
|||
|
|
M Docs/Migration/etat/ST/STE/STE-VAL.md
|
|||
|
|
A Docs/Migration/etat/ST/STE/dumps/GI__AddVariable_V5.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/dumps/GI__clearScenePersons_V5.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/dumps/Room__EventGraph_V5.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/dumps/GI__EventGraph_V5.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/dumps/GI__CallFunction_V5.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/STE-V5_LPDumpFunction_20261010-231733.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/STE-V5_LPDumpFunction_20261010-231828.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/STE-V5_LPDumpFunction_20261010-231918.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/STE-V5_LPDumpFunction_20261010-232014.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/STE-V5_LPDumpFunction_20261010-232243.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/STE-V5_CompileAllBlueprints_20261010-232538.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/STE-V5_LPTestStringCompat_20261010-232847.txt
|
|||
|
|
```
|
|||
|
|
(`Content/BPs/GI.uasset` et `Content/BPs/Room.uasset` sont les écritures des IMPL, non touchées par moi.)
|
|||
|
|
|
|||
|
|
Tours : 29 / 40 (compté à la main ; `Tools/FicheStats.py` fait foi)
|
|||
|
|
|
|||
|
|
## STE-H4-C0 (VAL, 2026-10-11)
|
|||
|
|
|
|||
|
|
Fiche STE-VAL (partie STE-H4-C0) — Niveau N1 — Modèle prévu sonnet | utilisé Sonnet 5.5 (claude-sonnet-5-5) — Agent lp-validator — Skills sk-protocol, sk-recount, debug-verification, lp-validate
|
|||
|
|
|
|||
|
|
Copie `D:\Game\LifePlay-master 5.8`, branche `ue5.8`. BUILD-GO STE-H4-C0 de Big Boss (après la porte T11 d'U8) : commandlets en lecture seule, éditeur fermé, un à la fois, aucune écriture dans `Content`, `Config` ni `Source`, aucun éditeur, build, jeu ni git en écriture. Avant et après chaque commandlet : MD5 de `Content\BPs\GI.uasset` (attendu M-C0 `FE4406A0294A8001F612CD03EE2C20CC`, arrêt au moindre écart) et comptage des processus `UnrealEditor*` / `LifePlay*` (`Get-Process`, arrêt si > 0). Commandes lancées via `powershell -NoProfile -Command` depuis la racine de la copie, avec `-EtatDir "D:\Game\LifePlay-master 5.8\Docs\Migration\etat\ST\STE"` (chemin absolu, consigne de Big Boss). Horodatages de fichiers en heure locale, ceux du contenu des journaux en UTC (écart de 2 h). Écart accepté par Big Boss : pas de build dédié, commit sur VAL PASS-STATIC ; **preuve en jeu reportée à J6 (STE-H10), écart accepté par Big Boss**.
|
|||
|
|
|
|||
|
|
### 1. Fiches amont relues
|
|||
|
|
|
|||
|
|
- `etat\ST\STE\STE-H4-C0-SPEC.md` (lue en entier : § 2.1 tableau des liens avant / après, § 2.2 étapes MCP, § 3 comportement, § 5 critères de VAL).
|
|||
|
|
- `etat\ST\STE\STE-H4-C0-IMPL.md` (IMPL, lue en entier : P1-P5, étapes 1-8, M-C0 = `FE4406A0294A8001F612CD03EE2C20CC` (52 553 784 o), volume 0 nœud / 3 `break_pins` / 3 `connect_pins`, repli).
|
|||
|
|
- `etat\ST\STE\dumps\GI__destroyDummy_D4.txt` (dump « avant » DD4, 39 nœuds, GI B8B97C46 ; relu en entier par comparaison ligne à ligne avec le dump d'après). Dans la SPEC, DD4 est pris sur GI B8B97C46 et `destroyDummy` n'a pas été touchée par F-a, O3 ni G12 (SPEC en-tête) : la comparaison D4 → V6 isole donc seulement C0.
|
|||
|
|
- Gabarit VAL : `D:\Game\LifePlay-Sandbox\Tools\claude\skills\lp-doc\gabarits.md` (l. 50-53), relu avec Read.
|
|||
|
|
- Non relus : `STE-H4-DIAG.md`, `STE-INT.md`, `STE-TACHES.md` (hors périmètre de cette VAL ; la SPEC cite le DIAG § 3.6, je vérifie le graphe, pas le diagnostic).
|
|||
|
|
|
|||
|
|
### 2. Points à confirmer des IMPL (STE-H4-C0-IMPL)
|
|||
|
|
|
|||
|
|
L'IMPL n'a pas de section « points à confirmer » numérotée ; je retiens ses attentes et les critères de la SPEC § 5.
|
|||
|
|
|
|||
|
|
| # | Point | Verdict | Preuve |
|
|||
|
|
|---|---|---|---|
|
|||
|
|
| P1 | `destroyDummy` reste à 39 nœuds (0 nœud créé) | **PASS** | § 3 C1 : en-tête `(39 noeuds)` et 39 en-têtes de nœud. |
|
|||
|
|
| P2 | Liens : `_0.then → _2`, `_2.then → _1`, `_1.then → VariableSet_0` ; `_0.execute` inchangé ; données inchangées | **PASS** | § 3 C1 et C2 : diff D4 → V6, 6 lignes changées = 3 liens × 2 extrémités. |
|
|||
|
|
| P3 | `compile_blueprint` (avertissements en erreurs) sans erreur ni avertissement | **PASS** (rejoué par `CompileAllBlueprints`) | § 3 C3. Le `compile_blueprint` de l'IMPL n'est pas rejoué. |
|
|||
|
|
| P4 | MD5 M-C0 `FE4406A0…` (52 553 784 o) | **PASS** | § 3 C0, C1-C4 (colonne MD5), C5 ; taille relevée 52 553 784 o. |
|
|||
|
|
| P5 | Preuve en jeu : plus de groupe F5 (`Head` ×2, `pelvis`, `chestUpper`, `hip`) dans la trame de chaque `DESTROY…Slot` ; compte F5 en baisse ≈ 5 × nombre de DESTROY ; aucun plantage (SPEC § 5) | **reporté** (J6, STE-H10) | Exige un build empaqueté et un parcours ; **écart accepté par Big Boss**. Non rejouable éditeur fermé. |
|
|||
|
|
| P6 | Repli `Restore.ps1 -Lot STE-H4` (GI = 16394D43) | **reporté / non rejoué** | `Restore.ps1 -WhatIf` non rejoué ; instantané non relu par moi. |
|
|||
|
|
|
|||
|
|
### 3. Critères rejoués (commande → résultat)
|
|||
|
|
|
|||
|
|
| # | Critère | Commande | Attendu | Obtenu | Verdict |
|
|||
|
|
|---|---|---|---|---|---|
|
|||
|
|
| C0 | Entrée : MD5, processus, état git | `Get-FileHash 'Content\BPs\GI.uasset' -Algorithm MD5` ; `Get-Process` (filtre `UnrealEditor\|LifePlay`) ; `git status --short -- Content Config Source` | MD5 `FE4406A0294A8001F612CD03EE2C20CC` ; 0 processus ; ` M` GI seul | GI `FE4406A0294A8001F612CD03EE2C20CC` ; 0 processus ; ` M Content/BPs/GI.uasset` (1 ligne ; `git diff --stat -- Config Source` vide). `Content` : seul GI est modifié. | PASS |
|
|||
|
|
| C1 | Dump `destroyDummy` | `.\Tools\RunCommandlet.ps1 -Lot STE-V6 -Commandlet LPDumpFunction -Args '-BP=GI -Fn=destroyDummy -Pins -Exec' -EtatDir "D:\Game\LifePlay-master 5.8\Docs\Migration\etat\ST\STE"` | code 0 ; `(39 noeuds)` | `code=0 duree=51s erreurs=0 avertissements=238` (06:29:59 local) ; journal `Saved\Logs\portage\STE-V6_LPDumpFunction_20261011-062959.log` ; résumé `STE-V6_LPDumpFunction_20261011-062959.txt` ; en-tête `=== GI :: destroyDummy (39 noeuds) ===` ; processus 0 avant, MD5 `FE4406A0…` avant et après. Les 238 « avertissements » = 188 lignes de dump + 50 lignes d'écho `LogInit: Display:` (même total que D4 : 238). | PASS |
|
|||
|
|
| C1b | Nombre de nœuds, deux méthodes | (a) ligne d'en-tête `(N noeuds)` ; (b) Grep count `^LogLPDump: Warning: K2Node_` sur les lignes `LogLPDump` extraites du journal (188 premières lignes) | 39 | (a) **39** ; (b) **39** (V6) et **39** (D4, même méthode). | PASS |
|
|||
|
|
| C2 | Diff D4 → V6, ligne à ligne | `diff` des lignes `LogLPDump` extraites des deux journaux (`STE-D4_LPDumpFunction_20261010-200959.log` et `STE-V6_…062959.log`), préfixe d'horodatage retiré (`sed`), fichiers de comparaison dans le scratchpad (hors dépôt) ; bloc de dump = lignes 1-188 ; `diff` ordonné sur ces 188 lignes | 3 liens d'exécution changés (`_0.then → _2`, `_2.then → _1`, `_1.then → VariableSet_0`), rien d'autre | **12 lignes de diff = 6 lignes changées (6 `<`, 6 `>`)**, soit 3 liens × 2 extrémités. `CallFunction_0.then` : `→ _1.execute` devient `→ _2.execute` (l. 31) ; `CallFunction_1.execute` : `← _0.then` devient `← _2.then` (l. 35) et `CallFunction_1.then` : `→ _2.execute` devient `→ VariableSet_0.execute` (l. 36) ; `CallFunction_2.execute` : `← _1.then` devient `← _0.then` (l. 39) et `CallFunction_2.then` : `→ VariableSet_0.execute` devient `→ _1.execute` (l. 40) ; `VariableSet_0.execute` : `← _2.then` devient `← _1.then` (l. 131). **Aucune autre ligne ne change** : ni nœud (39 en-têtes identiques), ni valeur par défaut (`bNewHidden = 'true'`, `bSweep`/`bTeleport = 'false'`, `Valid = 'false'` identiques), ni lien de données (`self ← FunctionEntry_0.Dummy`, `NewTransform ← CallFunction_3.ReturnValue` identiques). `CallFunction_0.execute ← CallFunction_4.then, IfThenElse_1.then` (l. 30) inchangé. Pour les 50 lignes d'écho (l. 189-238), les mêmes lignes d'exécution diffèrent, aucune autre. | PASS |
|
|||
|
|
| C3 | CompileAllBlueprints, éditeur fermé | `.\Tools\RunCommandlet.ps1 -Lot STE-V6 -Commandlet CompileAllBlueprints -EtatDir "D:\Game\LifePlay-master 5.8\Docs\Migration\etat\ST\STE"` | code 0 ; 0 erreur, 0 avertissement ; 418 / 418 | `code=0 duree=202s erreurs=0 avertissements=0` (06:31:44 local). Journal `Saved\Logs\portage\STE-V6_CompileAllBlueprints_20261011-063144.log` : Grep count « Loading and Compiling » = **418** ; Grep count « a réussi » = **418** ; l. 3243 `LogInit: Display: Success - 0 error(s), 0 warning(s)` ; l. 2021 « La compilation de GI a réussi ! [en 4 003 ms] (/Game/BPs/GI.GI) » ; Grep `Error:\|a échoué` : 0 ligne. Résumé `STE-V6_CompileAllBlueprints_20261011-063144.txt`. MD5 `FE4406A0…` avant et après, 0 processus avant. | PASS |
|
|||
|
|
| C4 | LPTestStringCompat | `.\Tools\RunCommandlet.ps1 -Lot STE-V6 -Commandlet LPTestStringCompat -EtatDir "D:\Game\LifePlay-master 5.8\Docs\Migration\etat\ST\STE"` | code 0 ; `3120 cas : compat != herite(UE4) : 0 ; moteur != herite(UE4) : 60` | `code=0 duree=16s erreurs=0 avertissements=2` (06:35:19 local) ; journal `STE-V6_LPTestStringCompat_20261011-063519.log` l. 1996 et 2001 : `=== 3120 cas : compat != herite(UE4) : 0 ; moteur != herite(UE4) : 60 ===` (les 2 « avertissements » sont cette ligne, émise en `Warning`). Résumé `STE-V6_LPTestStringCompat_20261011-063519.txt`. MD5 `FE4406A0…` avant et après, 0 processus avant. | PASS |
|
|||
|
|
| C5 | Sortie : MD5, taille, git, processus | `Get-FileHash` ; `(Get-Item …).Length` ; `git status --short -- Content Config Source` ; `Get-Process` | MD5 `FE4406A0…` ; 52 553 784 o ; ` M` GI seul ; 0 processus | `FE4406A0294A8001F612CD03EE2C20CC`, **52 553 784 o** (= M-C0 de l'IMPL) ; ` M Content/BPs/GI.uasset` seul, rien dans `Config` ni `Source` ; 0 processus. Les 3 commandlets n'ont modifié aucun fichier suivi. | PASS |
|
|||
|
|
| C6 | Consigne de Big Boss (OUTC, `Tools\EtatDir.ps1` remplacé à 06:32:38 pendant C3) : après chaque commandlet suivant C3, le résumé `.txt` atterrit dans `etat\ST\STE\` et aucun dossier `etat\Docs` n'apparaît | `ls -la Docs/Migration/etat/ST/STE/STE-V6_*` ; `ls -d Docs/Migration/etat/Docs` ; `ls -la Tools/EtatDir.ps1` | résumé dans `ST\STE\` ; pas de dossier `etat\Docs` | Après C4 : `STE-V6_LPTestStringCompat_20261011-063519.txt` (8 850 o, 06:35) dans `Docs\Migration\etat\ST\STE\` (ligne `resume :` du script) ; `ls Docs/Migration/etat/Docs` : « No such file or directory » ; `Tools\EtatDir.ps1` daté 06:32. Les résumés de C1 (06:30) et C3 (06:35, lancé à 06:31:44, donc avec l'ancien chargement du script) sont aussi dans `ST\STE\`. | PASS |
|
|||
|
|
| C7 | Fins de ligne du dump copié et de ce livrable | `tr -cd '\r' < <fichier> \| wc -c` | 0 CR | `dumps\GI__destroyDummy_V6.txt` : 0 CR ; `STE-VAL.md` : relevé après écriture, voir § 4. | PASS |
|
|||
|
|
|
|||
|
|
Recompte croisé (sk-recount) du diff C2 : seconde méthode = lecture directe des lignes de V6 (l. 31-40 et l. 131 du bloc de dump) : `CallFunction_0.then → CallFunction_2.execute`, `CallFunction_2.execute ← CallFunction_0.then`, `CallFunction_2.then → CallFunction_1.execute`, `CallFunction_1.execute ← CallFunction_2.then`, `CallFunction_1.then → VariableSet_0.execute`, `VariableSet_0.execute ← CallFunction_1.then` : cohérent avec la chaîne attendue `SetActorHiddenInGame → K2_SetActorTransform → ResetVars → Set Valid` (SPEC § 1). Chaque lien apparaît des deux côtés (côté `then` et côté `execute`) : 3 liens × 2 = 6 lignes.
|
|||
|
|
|
|||
|
|
### 4. Diff lu en entier
|
|||
|
|
|
|||
|
|
- Fichier unique suivi concerné : `Content/BPs/GI.uasset` (binaire, `git diff --stat` : 52 553 784 → 52 553 784 o par rapport à HEAD, même taille ; le contenu binaire diffère par ordre de liens). Il se lit par le dump, pas par `git diff` texte. Diff du dump : 6 lignes sur 188, 3 liens d'exécution, 0 nœud, 0 valeur, 0 lien de données (C2).
|
|||
|
|
- Aucune autre modification de `Content`, `Config` ni `Source` (C0, C5).
|
|||
|
|
- Fichiers que j'ai écrits : ce livrable (ajout de cette section, le fichier est réécrit en entier faute d'Edit, anciennes sections reprises à l'identique, à vérifier par `git diff` ; fins de ligne LF) ; `dumps\GI__destroyDummy_V6.txt` (en-tête de 5 lignes + les 238 lignes `LogLPDump` du journal `STE-V6_LPDumpFunction_20261011-062959.log`, horodatages du journal conservés, 50 lignes d'écho `LogInit: Display:` comprises, LF, sans BOM) ; 3 résumés `STE-V6_*_20261011-06*.txt` de `RunCommandlet.ps1` dans `Docs\Migration\etat\ST\STE\` ; 3 journaux dans `Saved\Logs\portage\` (non suivis). Rien d'autre : fichiers de comparaison dans le scratchpad de session (hors dépôt). Aucune modification de code, de Content, de Config ni de doc validée ; aucun git en écriture ; aucun éditeur.
|
|||
|
|
- Non rejoué : les autres graphes de GI (fonctions, macros, EventGraph) sont-ils inchangés par l'écriture C0 ? Je n'ai dumpé que `destroyDummy`. La taille à l'octet près (52 553 784 o = taille de HEAD) et le MD5 attendu n'en sont pas la preuve (estimé cohérent : 6 liens réordonnés).
|
|||
|
|
- Non rejoué : les appels MCP de l'orchestrateur (`break_pins`, `connect_pins`, `compile_blueprint`, `save_assets`) ; seul leur résultat est contrôlé (C2, C3, C5). Instantané `STE-H4` et `Restore.ps1 -WhatIf` non rejoués.
|
|||
|
|
- Limite du dump : description, broches, liens et valeurs par défaut ; positions, GUID, commentaires, types de broche et propriétés de nœud non vérifiés.
|
|||
|
|
- Fins de ligne : `STE-VAL.md` en LF (`tr -cd '\r' < STE-VAL.md | wc -c` doit valoir 0).
|
|||
|
|
|
|||
|
|
### 5. Verdict
|
|||
|
|
|
|||
|
|
**PASS-STATIC** pour STE-H4-C0 (chaîne `destroyDummy` : `SetActorHiddenInGame` → `K2_SetActorTransform` → `ResetVars` → `Set Valid`), sur ce qui est vérifiable éditeur fermé.
|
|||
|
|
|
|||
|
|
Établi avec preuve fraîche : `destroyDummy` à 39 nœuds ; exactement 3 liens d'exécution changés par rapport à D4 (`_0.then → _2`, `_2.then → _1`, `_1.then → VariableSet_0`), aucun autre écart (nœuds, valeurs, liens de données) ; `CompileAllBlueprints` 418 / 418 et 0 / 0 ; `LPTestStringCompat` 3120 / 0 / 60 ; MD5 de GI `FE4406A0294A8001F612CD03EE2C20CC` avant et après chacun des 3 commandlets, 0 processus à chaque contrôle ; état git de `Content`, `Config`, `Source` limité à GI ; résumés des commandlets dans `etat\ST\STE\`, pas de dossier `etat\Docs`.
|
|||
|
|
|
|||
|
|
Pourquoi pas PASS : la preuve en jeu (SPEC § 5 : plus de groupe F5 dans la trame des DESTROY, compte F5 en baisse d'environ 5 × nombre de DESTROY, aucun plantage) n'est pas faite : **preuve en jeu reportée à J6 (STE-H10), écart accepté par Big Boss**. Aucun critère rejouable n'a échoué.
|
|||
|
|
|
|||
|
|
Écarts et réserves :
|
|||
|
|
- **E1** : preuve en jeu reportée à J6 (STE-H10), écart accepté par Big Boss (pas de build dédié, commit sur VAL PASS-STATIC).
|
|||
|
|
- **E2** : `hyper_blueprint_debug_inspect` absent du serveur MCP (déjà noté par les VAL précédentes) ; la compilation est couverte par `CompileAllBlueprints` 0 / 0, pas le critère « 0 diagnostic ».
|
|||
|
|
- **E3** : seul `destroyDummy` est redumpé (§ 4) ; les autres graphes de GI ne sont pas prouvés inchangés.
|
|||
|
|
- **E4 (documentaire)** : le dump copié `dumps\GI__destroyDummy_V6.txt` conserve les horodatages du journal et les 50 lignes d'écho (238 lignes `LogLPDump`), contrairement à la convention des dumps `_V5` (horodatage retiré, sans écho) ; la consigne de Big Boss demandait « les lignes LogLPDump extraites du journal ».
|
|||
|
|
- **E5** : le commandlet C3 a été lancé à 06:31:44, avant le remplacement de `Tools\EtatDir.ps1` (06:32:38) : il n'est pas touché ; son résumé est bien dans `etat\ST\STE\`.
|
|||
|
|
|
|||
|
|
### 6. Points à confirmer par l'utilisateur / l'orchestrateur
|
|||
|
|
|
|||
|
|
- [ ] J6 (STE-H10) en jeu, parcours J5 : dans la trame de chaque `DESTROY…Slot`, plus de groupe F5 (`Head` ×2, `pelvis`, `chestUpper`, `hip`) attribué au mannequin détruit ; compte F5 total en baisse d'environ 5 × nombre de DESTROY ; aucun plantage (reporté).
|
|||
|
|
- [ ] Accepter E3 (seul `destroyDummy` redumpé) ou demander un dump des autres graphes de GI.
|
|||
|
|
- [ ] Commit de GI et des livrables par le gardien (ticket STE-R…) sur ce VAL PASS-STATIC, selon l'écart accepté par Big Boss ; rien n'est commité par cette VAL.
|
|||
|
|
|
|||
|
|
Fichiers à commiter (pour le ticket du gardien, ni A ni M faits par moi dans git ; `.gitignore:75` ignore `/Docs/Migration/etat/**`, le gardien décide pour les `.txt`) :
|
|||
|
|
```
|
|||
|
|
M Docs/Migration/etat/ST/STE/STE-VAL.md
|
|||
|
|
A Docs/Migration/etat/ST/STE/dumps/GI__destroyDummy_V6.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/STE-V6_LPDumpFunction_20261011-062959.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/STE-V6_CompileAllBlueprints_20261011-063144.txt
|
|||
|
|
A Docs/Migration/etat/ST/STE/STE-V6_LPTestStringCompat_20261011-063519.txt
|
|||
|
|
```
|
|||
|
|
(`Content/BPs/GI.uasset` est l'écriture de l'IMPL, non touchée par moi.)
|
|||
|
|
|
|||
|
|
Tours : 27 / 40 (compté à la main ; `Tools/FicheStats.py` fait foi)
|