LifePlay-Revival/Docs/Migration/etat/ST/STE/STE-VAL.md
edujiro5972 8084622450 LifePlay UE 5.8 : état de développement au 2026-10-19
Tickets : REP1-T4

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-19 22:57:42 +02:00

107 KiB
Raw Blame History

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
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
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:20inclutStyling/SlateTypes.h(type complet),.h:23prédéclareUEditableTextBox. .cpp:3-7: en-tête propre d'abord, puisComponents/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());; aucunSynchronizeProperties, aucun PRAGMA_*(lecture complète des 2 fichiers). **Aucun écart à la SPEC.** Garde de version : l'en-têteMisc/EngineVersionComparison.hest bien inclus dans le fichier qui utiliseUE_VERSION_OLDER_THAN`.
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 :: (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)