107 KiB
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 pargit difftexte. 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,ConfigniSource(C5).MainMenu.uassetest 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_*_*.txtdeRunCommandlet.ps1, la copiedumps\GI__EventGraph_apres-STE-GI.txt, ce livrable ; trois journaux dansSaved\Logs\portage\(non suivis). Scriptdiffdump.py/diffdump2.pydans 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 estac3a176…(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, 0GetRootComponent_ReturnValue_1/_2, 0property Companionde 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_inspectabsent, 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, 0GetRootComponent_ReturnValue_1/_2, 0property Companionde 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 ROOMl. 1406 (11:02:53) ; - inventaire :
Inventory_C … (START OF MENU)l. 1502 (11:03:01) ; - portrait :
GI_C … OpenSpacel. 1837 et 1856 (11:04:18, 11:04:27) ; - action :
(test0104) for 2.8 hours by 1l. 3063 (11:08:55) ; - scènes : 29 lignes
Scene_C(pilesScene_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 journalSaved\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-1195460relu : formes deVariableSet_1146/_1147conformes 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.csnon modifié (absent degit status --short -- Source).Content/UI/CharGen.uassetetStatMenu.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 statuscomplet :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 parRunCommandlet.ps1etBuild.ps1 -FromLogdansDocs\Migration\etat\ST\STE\(voir « Fichiers à commiter ») ; 4 journaux dansSaved\Logs\portage\(non suivis) ; une copie temporaire degit show HEAD:Content/UI/CharGen.uassetdans 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_inspectest 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é parCompileAllBlueprints0 / 0, qui couvre la compilation mais pas la même vérification. - E2 : la compilation de
LPWidgetStyleLibrary.gen.cppn'est pas nommée dans le journal de build (estimée dansModule.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 -FromLoglaisse 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::FCachedTypefaceDatadansSaved\Crashes; 1 fichier attendu, l'ancien (VAL-15). - Accepter ou refuser
hyper_blueprint_debug_inspectabsent (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
WidgetStylesur 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\Crashesaprès 14:25 (avant STE-P1 : plantage au premier refus, rapportUECC-…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) : 0Accessed NoneLogScript ; 1 erreur PIEproperty GI dans CharGen_C(l. 2715, résumé l. 2795), résidu connuSpinBox_0confié à STF-T5, sans lien avec STE. - Effet de bord : un Save Preset avec
teea crééContent\Modules\tee.lpcharacter(14:27:57, 1 924 o), déplacé versD:\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, 5connect_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) etdumps\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 deContent,Config,Sourcemodifié (C0, C8) ;Source/LifePlay/LPReadableTextSubsystem.*est l'autre lot (LISIB), non touché. Il se lit par les dumps, pas pargit difftexte. Les 6 diffs de dumps sont lus en entier (1 892 → 1 937 arêtes dansCallFunction, 803 → 814 dansCallFunctionReturnBool, 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.pydemandé par les SPEC § 7 (outil à profils de remplacement de nœuds pour d'autres dumps) : inadapté à des insertions, remplacé par mondiffgi.py; les trois instantanésRestore.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.pyetshowadded.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 dansTools\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ésSTE-VAL_*_20261010-17*.txtdeRunCommandlet.ps1dansDocs\Migration\etat\ST\STE\; 6 copiesdumps\GI__<Fn>_apres-GARDES.txt; 8 journaux dansSaved\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_inspectabsent du serveur MCP (déjà noté par l'IMPL § 3 et en STE-GI / STE-P1) ; BLOCKED-outil, remplacé parCompileAllBlueprints0 / 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 modecount:property Person inhors 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(pileUpdatePlayerMeshWithMorphs) à 0 ou en forte baisse ; rapportof length 0/CHECKING:inférieur à 351 / 2 318 (reporté). - R1 / Q4 / Q5 :
LPDumpSaveavant / après sur la même sauvegarde (clés"0"deActorVarsetAI_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.pydansTools\(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_568dans 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 : sectionsSTE-GIetSTE-GARDESci-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) etContent/BPs/Room.uasset(5 723 964 → 5 727 427 o, O1). Ils se lisent par les dumps, pas pargit difftexte. Les 4 diffs de dumps sont lus en entier (C9a à C9d, 5 + 4 + 5 + 7 lignes modifiées, 10 + 9 + 9 + 12 ajoutées) ;CallFunctionidentique (C11),EventGraphde 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,AddVariablen'a rien d'autre changé entre B8B97C46 et M3 (F-a n'écrit que l'EventGraph, J4 § 1). De mêmeclearScenePersonset 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,ConfigniSourceé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é pargit diff; le fichier ne finissait pas par un LF, il en a un maintenant) ; 5 dumpsdumps\*_V5.txt(lignesLogLPDumpdes journaux, horodatage retiré, sans les 50 lignes d'échoLogInit: Display:, LF, sans BOM) ; 7 résumésSTE-V5_*_20261010-23*.txtproduits parRunCommandlet.ps1dansDocs\Migration\etat\ST\STE\; 7 journaux dansSaved\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.mden LF (relevé final : voir le compte rendu de la VAL ;tr -cd '\r' < STE-VAL.md | wc -cdoit 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 « 15connect_pins» ; la somme de ses propres lignes (O1 5 + O3 4 + G12 5) et les dumps donnent 14 liens posés (les 3break_pinssont confirmés). À corriger par l'auteur de l'IMPL avant d'en reporter le chiffre dans le CHG. - E2 :
hyper_blueprint_debug_inspectabsent du serveur MCP : BLOCKED-outil, remplacé parCompileAllBlueprints(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 macroIsValiddu DIAG (+1). Sémantique équivalente, estimée : pour O3, leelsevide s'appuie sur le comportement duForEachLoopstandard (non dumpé). - E5 : les 7 résumés
STE-V5_*.txtdeRunCommandlet.ps1sont écrits dansDocs\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-TEMOINdansGI.uassetbinaire est une recherche ASCII (C11) ; la preuve est le dump deCallFunction.
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_PersonToReturnetremoveAlreadyGot= 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-TEMOINabsent 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,Asyncet 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 / 3break_pins/ 3connect_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 etdestroyDummyn'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 pargit difftexte. 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,ConfigniSource(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 lignesLogLPDumpdu journalSTE-V6_LPDumpFunction_20261011-062959.log, horodatages du journal conservés, 50 lignes d'échoLogInit: Display:comprises, LF, sans BOM) ; 3 résumésSTE-V6_*_20261011-06*.txtdeRunCommandlet.ps1dansDocs\Migration\etat\ST\STE\; 3 journaux dansSaved\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-H4etRestore.ps1 -WhatIfnon 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.mden LF (tr -cd '\r' < STE-VAL.md | wc -cdoit 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_inspectabsent du serveur MCP (déjà noté par les VAL précédentes) ; la compilation est couverte parCompileAllBlueprints0 / 0, pas le critère « 0 diagnostic ». - E3 : seul
destroyDummyest redumpé (§ 4) ; les autres graphes de GI ne sont pas prouvés inchangés. - E4 (documentaire) : le dump copié
dumps\GI__destroyDummy_V6.txtconserve les horodatages du journal et les 50 lignes d'écho (238 lignesLogLPDump), 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 dansetat\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
destroyDummyredumpé) 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)