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

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

16 KiB

Fiche STE-H3i — Niveau N2 — Modèle prévu (modèle de l'agent lp-diag) | utilisé Opus 5.5 (claude-opus-5-5) — Agent lp-diag — Skills sk-protocol, ue-cpp-build, lp-commandlets, lp-paths

STE-H3i-DIAG : famille « Accessed None … (real) property chargen in /Game/BPs/GI.GI_C » (pile VisualMorph) du journal COMMUN-3 session 1 (2026-10-13)

Abréviations : S1 = D:\Game\LifePlay_Backup_5.5\COMMUN-3\essais\LifePlay_commun3_session1_definitif_BOSS.log (MD5 27e654cc941d3309637ba1403dac98a0, conforme à la fiche : md5sum rejoué) ; C2 = D:\Game\LifePlay_Backup_5.5\COMMUN-2\essais\LifePlay_commun2_definitif_BOSS.log ; P2 = etat\ST\STE\dumps\GI__EventGraph_P2.txt (5.8) ; O2 = D:\Game\LifePlay-master 5.5\Saved\Logs\portage\O2_dump_GI.log (dump GI 5.5) ; V1rc = D:\Game\LifePlay-master 5.5\Saved\Logs\portage\V1rc_partie_20260930.log (partie 5.5.4) ; L7i = D:\Game\LifePlay-master 5.5\Saved\Logs\portage\L7i_partie1_20260930.log (partie 5.5.4). Note : la variable de GI s'appelle CharGen dans les dumps ; le moteur l'écrit chargen dans l'avertissement (même FName, casse de la première inscription). Outils : Grep / Read ; lectures en tube (grep, sed -n) sur les journaux et le dump .txt (Grep de l'outil sur etat\…\dumps\ rend 0 : fichiers .txt ignorés par git, voir Constats).

1. Symptôme et reproduction

  • Compte réel : 378 occurrences, pas 756. Grep LogScript: Warning: .*property chargen in sur S1 → 378 ; Grep LogScript: Warning: Accessed None\r?$ (avertissement nu qui suit chaque en-tête) → 378. Le 756 de la fiche est le compte de la ligne Script call stack de la synthèse de fin : S1:41923 756 [LogScript Warning] Script call stack: | Function /Game/UI/VisualMorph.VisualMorph_C:ExecuteUbergraph_VisualMorph. Détail de la synthèse : S1:41924-41927 → 245 (VisualMorphMale) + 133 (VisualMorphFemale) pour l'en-tête chargen, autant pour l'Accessed None nu.
  • Première / dernière : S1:33273 (18.46.15:383, image [627]) ; S1:40437 / 40446 (18.46.15:819, image [627]). Toutes dans la même image 627 (grep -oE '\]\[[ 0-9]+\]LogScript' sur S1:33273-40454 → une seule valeur ][627]).
  • Pile complète (S1:33273-33289) : LogScript: Warning: Accessed None trying to read (real) property chargen in /Game/BPs/GI.GI_C / VisualMorph_C /Engine/Transient.GameEngine_…:GI_C_….BodyShapeMenu_C_2147451331.WidgetTree_….VisualMorphPair_C_2147450551.WidgetTree_….VisualMorphMale / Function /Game/UI/VisualMorph.VisualMorph_C:ExecuteUbergraph_VisualMorph:64X / Script call stack: Function …VisualMorph_C:ExecuteUbergraph_VisualMorph, puis S1:33282 LogScript: Warning: Accessed None (même objet, même offset 64X, même pile). Aucune fonction de GI dans la pile : GI n'est que le propriétaire de la variable lue.
  • Combien d'itérations : 378 VisualMorphPair_C_<n> distincts, chacun exactement 2 lignes d'objet (en-tête + nu) : sort | uniq -c → 378 2. Donc une occurrence par widget VisualMorph construit (un seul enfant par paire, Male ou Female), et non une boucle Tick ou une minuterie : la « boucle » est la construction de la liste de 378 paires de BodyShapeMenu dans une seule image.
  • Contexte avant (S1:33150-33272) : S1:33186 et 33220 menus=[MainMenu_C] (menu principal en jeu, monde CentralLondon) ; S1:33226 LogPlayerController: Error: InputMode:UIOnly - Attempting to focus Non-Focusable widget (18:46:14.837, image 625) ; S1:33236-33250 LISIB : SpinBox lisible BodyShapeMenu.PercentMale … TattooF (construction de BodyShapeMenu) ; S1:33272 premier GetAssetByObjectPath ECHEC … /Game/Heavy/New3/UI/true/OOF_Zora (icônes des morphs, 49 lignes ECHEC.*OOF_ dans S1). Aucun CharGen_C, LoadPreset, PlayerChangeRace dans ce contexte.
  • Après : rien après S1:40454 jusqu'au relevé S1:40487 menus=[BodyShapeMenu_C] (18:46:18) ; retour S1:40554 menus=[MainMenu_C] (18:46:23). Aucun autre avertissement chargen à la fermeture ni en déplaçant des curseurs.
  • CharGen jamais ouvert dans S1 : grep -cE 'OpenCharGen|CharGen_C|chargenroom' sur S1 → 0. Le marqueur est valable en 5.8 : C2:32509 chargenroom.lpworld LOAD ROOM puis C2:32522-32526 CharGen_C … CharGen_C:Construct.
  • Reproduction : non rejouée (rubrique 6) ; scénario déduit : charger une partie sans passer par CharGen, Échap → menu principal → répartition des silhouettes (BodyShapeMenu).

2. Hypothèse testée (une seule)

H : la famille est un défaut d'origine : VisualMorph lit GI.CharGen sans garde ; GI.CharGen n'est écrit que par la création du widget CharGen et n'est jamais remis à None ; ouvrir BodyShapeMenu dans une session où CharGen n'a pas été ouvert le trouve à None. Ni G16, ni STG B7-a, ni Person, ni Room n'interviennent. Réfutée si : un graphe modifié par STE / STG / CAM est sur le chemin, ou si un journal antérieur ouvre BodyShapeMenu sans CharGen préalable sans produire l'avertissement.

3. Essai et résultat brut

3.1 Qui écrit GI.CharGen, qui le vide

  • P2 (5.8) : grep -c -E "VariableSet_[0-9]+ +variable 'CharGen'$" → 1 ; VariableGet … 'CharGen' → 7.
  • Seule écriture : P2:852 K2Node_VariableSet_796 variable 'CharGen' ← P2:846-850 K2Node_CreateWidget_59.ReturnValue, exécuté par P2:830 CustomEvent_1096 'CreateCharGenWidget', appelé par P2:837 CallFunction_6008 CreateCharGenWidget() depuis P2:713 CustomEvent_80 'OpenCharGen'.
  • Remise à None : aucune. P2:834 ClearCharGenWidget → VariableGet_153 CharGen → Widget::RemoveFromParent() (P2:863-869) : retire le widget de l'écran, la variable garde la référence.
  • Même structure en 5.5 : O2:51512-51532 (CreateCharGenWidget, CreateWidget_59 → VariableSet_796 CharGen, ClearCharGenWidget → RemoveFromParent). Inchangé entre 5.5 et 5.8.
  • Conséquence (établie par le graphe) : GI.CharGen vaut None tant que CharGen n'a pas été ouvert dans la session ; après une ouverture, il reste valide (widget hors écran) jusqu'à la fin de la session.

3.2 Qui crée VisualMorph, depuis quel écran

  • P2:16100-16131 : CustomEvent_4625 'OpenBodyShapeDistribution' → HideUI() → CreateWidget_406 → VariableSet_3846 BodyShapeMenu → AddToViewport → SetInputMode_UIOnlyEx (cause de l'erreur de focus S1:33226). Appelant de OpenBodyShapeDistribution : non relu (menu principal, d'après menus=[MainMenu_C] juste avant : estimé).
  • BodyShapeMenu contient des VisualMorphPair qui contiennent VisualMorphMale / VisualMorphFemale (chemin d'objet S1:33274). Création des paires : dans BodyShapeMenu (non dumpé).
  • Lecteur : paquet Content\UI\VisualMorph.uasset : grep -a -o -i -E 'chargen[A-Za-z_]*' → 2 CharGen, 1 CharGen_C ; même recherche sur VisualMorphPair.uasset et BodyShapeMenu.uasset → 0. Noms présents dans VisualMorph.uasset : Construct (3), OnInitialized (4), GetMorphTarget, SetMorphTarget, MorphTargetName, BndEvt__MorphValueSlider_…_OnFloatValueChangedEvent. Le lecteur est donc dans l'EventGraph de VisualMorph ; nœud exact non établi (pas de dump VisualMorph, offset 64X inutilisable en 5.8). Estimé : à la construction, GI.CharGen.<membre> puis GetMorphTarget(MorphTargetName) pour initialiser le curseur ; le premier accès donne l'en-tête property chargen, le second (contexte dérivé de None) l'Accessed None nu.

3.3 Le chemin de S1 diffère-t-il de CharGen de C2 ?

  • Oui. C2 passe par CharGen (C2:32509-32526, CharGen_C:Construct, changement de sexe 16:55:58) et n'ouvre jamais BodyShapeMenu : Grep property chargen|BodyShapeMenu|ExecuteUbergraph_VisualMorph sur C2 → 0. S1 ouvre BodyShapeMenu et jamais CharGen. Les deux chemins sont disjoints ; l'absence en C2 n'est pas une absence du défaut, mais du chemin.
  • COMMUN-3 session 2 et les autres journaux du dossier : Grep du même motif sur D:\Game\LifePlay_Backup_5.5\COMMUN-3\essais → S1 seul (3423 lignes) ; session 2 : 0 (chemin non exercé).

3.4 Antériorité

Journal BodyShapeMenu ouvert CharGen avant ? property chargen Source
S1 (5.8, COMMUN-3) oui, 18:46:14 non (0 marqueur) 378 § 1
C2, S2 (5.8) non C2 : oui 0 § 3.3
HJ, J6, archives LifePlay_Build_5.8_*, LifePlay_Build_5.5_*, builds_supprimees\*\Logs non (Grep `BodyShapeMenu property chargen ExecuteUbergraph_VisualMorph: seul le journal du build COMMUN-3 répond,LifePlay-backup-2026.10.13-18.48.09.log`, 3423) —
V1rc (5.5.4) oui, 10:34:05 (49 ECHEC.*OOF_, même nombre que S1) oui : V1rc:33991 chargenroom … LOAD ROOM (10:25:02), V1rc:34011 GI_C:OpenCharGen 0 grep -c
L7i (5.5.4) oui (L7i:15352 premier OOF_, 19:37:49) oui : L7i:7402 chargenroom (19:32:17) 0 grep -c
4.27 (REF427_*, ref427_*, AB427, ARCH427 LifePlay-backup-2026.09.28-14.17.59.log) non exercé (ARCH427 : lignes LogLPDump seulement, l. 63376-63406) — 0 Grep sur *427*.log → 0 ; grep -c ARCH427 → 0

Lecture : le même écran a été ouvert deux fois en 5.5 sans avertissement, chaque fois après CharGen ; il a été ouvert une fois en 5.8 sans CharGen et donne 378 avertissements. Le seul paramètre qui change est l'état de GI.CharGen, conformément au § 3.1. Aucun journal ne montre BodyShapeMenu ouvert sans CharGen avant S1 (ni en 5.5 ni en 4.27).

3.5 Lien avec les changements récents

  • git log --oneline -6 -- Content/UI/VisualMorph.uasset Content/UI/BodyShapeMenu.uasset Content/UI/VisualMorphPair.uasset → derniers commits 809102a (U5, resave), 8015f18 (L7i), a61fc3f (L4-CX-B07), 7aaeb06 (L6e), 9b7e971 (L1), 1122e17 (L0) ; git status --porcelain -- Content/UI/ → vide. Aucun lot STE / STG / CAM ne touche ces widgets ; le build COMMUN-3 ne modifie que GI, Person, Room (état git de la session).
  • G16 : EventGraph de GI, événement UpdateDefaultHair (STE-H3g-SPEC.md:33-34, 71, 85) ; nœuds listés (CustomEvent_5, IfThenElse_104, …) sans CreateWidget_59 ni VariableSet_796. Grep chargen|VisualMorph|BodyShape sur STE-H3g-SPEC.md → 0.
  • STG B7-a : graphe Show de GI seul (STG\STG-B7a-IMPL.md:49, refPath = /Game/BPs/GI.GI:Show.<nom>) ; Grep chargen|VisualMorph|BodyShape sur STG-B7a*.md → 0.
  • Person (STG), Room (CAM) : absents de la pile et du chemin d'objet (S1:33274 : GI_C > BodyShapeMenu_C > VisualMorphPair_C > VisualMorph).

4. Verdict : confirmée

Point Constat Niveau
Famille 378 occurrences (et non 756 : synthèse S1:41923 compte les lignes Script call stack, 2 par occurrence), une image (627), 18:46:15.383-.819 établi
Pile VisualMorph_C:ExecuteUbergraph_VisualMorph:64X, objet `BodyShapeMenu_C > VisualMorphPair_C > VisualMorph(Male Female)`
Nœud lecteur VariableGet CharGen sur GI dans l'EventGraph de VisualMorph (référence CharGen / CharGen_C dans le paquet), probablement à la construction, suivi d'un second accès sur le résultat (GetMorphTarget) graphe établi, nœud exact estimé (dump à faire, § 5)
« Boucle » construction des 378 VisualMorphPair de BodyShapeMenu (un VisualMorph actif par paire), pas de Tick ni de minuterie établi (comptes) ; boucle de création dans BodyShapeMenu estimée (non dumpée)
Chemin menu principal en jeu → GI.OpenBodyShapeDistribution → CreateWidget BodyShapeMenu (P2:16100-16131) dans une session où CharGen n'a jamais été ouvert (GI.CharGen = None, seul Set : P2:852) établi (S1 0 marqueur, P2)
Origine défaut d'origine (graphe CharGen identique 5.5 / 5.8, widgets inchangés depuis U5, aucun lot récent sur le chemin) ; révélé par un parcours nouveau (écran ouvert sans CharGen) estimé fort : défaut présent au moins en 5.5 (même graphe, même lecteur) ; jamais observé avant faute de parcours ; 4.27 non exercé
Lien G16 / B7-a / Person / Room aucun établi (§ 3.5)

Effet en jeu (estimé) : à l'ouverture sans CharGen, les curseurs de VisualMorph reçoivent la valeur par défaut d'une lecture None (0) au lieu d'une valeur lue sur le personnage de CharGen. Quand CharGen a été ouvert, ils lisent le widget CharGen hors écran (comportement d'origine, peut-être fortuit). Aucun effet sur la sauvegarde mesuré.

5. Hypothèse suivante proposée, et à quel niveau

Suites proposées (aucune lancée ; décisions à l'utilisateur) :

  • (a) défaut d'origine accepté (comme F-A / F-B de H3h) : 378 avertissements par ouverture de l'écran sans CharGen, sans effet mesuré.
  • (b) garde IsValid(GI.CharGen) dans l'EventGraph de VisualMorph, avant le premier VariableGet CharGen du chemin de construction ; branche Is Not Valid : sauter la lecture (le curseur garde sa valeur par défaut, 0). Comportement : identique en valeur (une lecture None rend déjà 0), journal sans les 378 + 378 lignes → pas de changement de comportement attendu (estimé ; à confirmer par le dump). Si le même graphe écrit aussi par SetMorphTarget sur CharGen quand on bouge un curseur (BndEvt__MorphValueSlider_…), la même garde s'y applique (chemin non exercé dans S1). Niveau : SPEC N2 après dump, IMPL MCP (lp-mcp) sur VisualMorph, pas sur GI.
  • (c) DIAG N2 préalable : dump VisualMorph pour fixer le nœud lecteur et l'événement (Construct / OnInitialized), puis décider (a) / (b). Recommandation : (c) puis (b) si l'utilisateur veut un journal propre ; sinon (a).
  • Dumps à faire lancer (éditeur fermé, lp-commandlets, non lancés) : .\Tools\RunCommandlet.ps1 -Lot STE-H3i -Commandlet LPDumpFunction -Args '-BP=/Game/UI/VisualMorph -Fn=EventGraph -Pins -Exec' -EtatDir 'D:\Game\LifePlay-master 5.8\Docs\Migration\etat\ST\STE' .\Tools\RunCommandlet.ps1 -Lot STE-H3i -Commandlet LPDumpFunction -Args '-BP=/Game/UI/BodyShapeMenu -Fn=EventGraph -Pins -Exec' -EtatDir 'D:\Game\LifePlay-master 5.8\Docs\Migration\etat\ST\STE' (boucle de création des paires, appelant de OpenBodyShapeDistribution côté menu à relire dans MainMenu si besoin)

Questions pour l'utilisateur :

  • Q1 (H3i) : accepter le défaut d'origine (a), ou faire le dump VisualMorph puis poser une garde IsValid(GI.CharGen) dans VisualMorph (b, sans changement de valeur attendu) ?

Tours : 26 / 40

Constats

  • Écart à la fiche : le compte 756 (fiche, etat\BOSS\COMMUN-3-BILAN.md:43) est celui des lignes Script call stack de la synthèse ; les avertissements chargen sont 378 (245 Male + 133 Female), plus 378 Accessed None nus jumeaux.
  • Écart à la fiche : pas de boucle Tick / minuterie / ForEach sur chargen dans GI ; 378 constructions de widget dans une image.
  • Piège outil : Grep (outil) sur etat\ST\STE\dumps\ rend 0 pour CharGen alors que grep -c -i -a chargen GI__EventGraph_P2.txt rend 74 : les .txt d'etat/ sont ignorés par git et ripgrep les saute même avec le dossier en path ; nommer le fichier.
  • Non mesuré : nœud exact et événement dans VisualMorph (pas de dump) ; appelant de OpenBodyShapeDistribution ; effet visuel en jeu ; comportement 4.27 de l'écran (jamais ouvert dans les journaux 4.27 relus) ; chemin SetMorphTarget en déplaçant un curseur.
  • Lecture seule respectée ; un seul fichier écrit (ce livrable). Aucun nom d'utilisateur ni chemin de profil cité.

Fichiers à commiter : A Docs/Migration/etat/ST/STE/STE-H3i-DIAG.md (dépôt jeu, branche ue5.8), par le gardien sur ticket.

Décision de l'utilisateur (2026-10-13, session STE)

  • Q1 : dump de VisualMorph puis SPEC d'une garde IsValid(GI.CharGen) après l'alpha (hors COMMUN-3, hors chemin critique) ; défaut d'origine non bloquant d'ici là ; dump à demander à Big Boss (jeton UE) quand la file le permettra.