Fiche STE-H3f — 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-H3f-DIAG : attribution des 3 familles `Accessed None` nouvelles en H3e-J (2026-10-13) Abréviations : **HJ** = `Docs\Migration\etat\ST\STE\STE-H3e-J\LifePlay.log` (copie du journal de l'archive `D:\Game\LifePlay_Build_5.8_CAM-B2_Development`, mêmes numéros de ligne relus dans l'original) ; **J6** = `D:\Game\LifePlay_Build_5.8_STE-J6_Development\Windows\LifePlay\Saved\Logs\LifePlay.log` ; **GEV** = `etat\ST\STE\dumps\GI__EventGraph_V5.txt` ; **LH** = `etat\ST\STE\dumps\GI__LoadHairMeshIfNeeded_D9.txt` ; **B55** = `D:\Game\LifePlay_Build_5.5_*` ; **P55** = `D:\Game\LifePlay-master 5.5\Saved\Logs\portage\`. Motif de comptage commun (outil Grep) : `LogScript: Warning: Accessed None trying to read (\(real\) )?property (K2Node_CustomEvent_Person|PersonCumming|SkeletalMesh_2_\w+)`. Une fiche par famille (rubrique 1 de la fiche) : un DIAG, trois hypothèses d'origine, une par section F1 à F3. ## 1. Symptôme et reproduction - Grep `Accessed None` sur HJ : 13 lignes `LogScript: Warning` (HJ:1160, 1244, 6880, 6903, 6926, 9194, 9243, 9262, 15417, 15627, 15841, 16058, 16086) ; sur J6 : 9 (J6:1230, 1280, 1381, 2643, 5126, 7325, 7666, 8125, 8712). Conforme aux 13 / 9 de la fiche. - Familles de HJ absentes de J6 : `K2Node_CustomEvent_Person` (HJ:6880, 6926, plus l'affectation liée HJ:6903), `PersonCumming` (HJ:9243, 9262), `SkeletalMesh_2_93573D…` (HJ:16058, 16086). Les 5 `Actor` (`isCreatureType`) de J6 ont disparu en HJ (correctif H3d). - Reproduction : non rejouée (lecture seule, pas de jeu, rubrique 6). Les parcours sont décrits par famille ci-dessous. ### F1 — `K2Node_CustomEvent_Person` (Person) - Lignes : HJ:6880 et HJ:6926 (13:38:54.909 et .912, image 294), HJ:6903 `Accessed None attempting to assign variable` (même image, même pile). Acteur `Person_C_2147481981`, `ExecuteUbergraph_Person:64X`. - Pile complète (HJ:6883-6891) : `Room_C:ExecuteUbergraph_Room` → `Person_C:PlayIdle` → `PlayWorkDaily` → `ExecuteUbergraph_Person` → `PlayDaily` → `ExecuteUbergraph_Person` → `moveToPersonStand` → `ExecuteUbergraph_Person` (tête). - Contexte de jeu : `Room_C_0 test0608 generateperson` (HJ:6874) → `Person_C_2147481981 index SPAWN` (HJ:6875) → `idle played` (HJ:6879) → erreur ; lieu « restaurant » (HJ:6949). ### F2 — `PersonCumming` (GI) - Lignes : HJ:9243 et HJ:9262 (13:40:29.289, image 883), `GI_C … ExecuteUbergraph_GI:64X`. - Pile (HJ:9246-9252) : `SexAction_C:BndEvt__ActionButton…OnButtonClicked` → `ExecuteUbergraph_SexAction` → `GI_C:cum` → `ExecuteUbergraph_GI` → `AfterCumSpeed` → `ExecuteUbergraph_GI` (tête). - Contexte : `SexAction_C_2147460580 Endsex (Animation String)` (HJ:9242), clic sur un bouton d'action de fin d'acte. ### F3 — `SkeletalMesh_2_93573D9945CD4136090CCBA1F1188DAC` (GI) - Lignes : HJ:16058 (13:43:43.368, image 350) et HJ:16086 (13:43:48.920, image 681), `ExecuteUbergraph_GI:64X`. - Pile (HJ:16061-16071) : `Contact_C:BndEvt__ContactButton…OnButtonClicked` → `ExecuteUbergraph_Contact` → `OnClickContactButton` → `ExecuteUbergraph_Contact` → `GI_C:LoadPreset` → `GenerateAndApplyStrings` → `PlayerChangeRace` → `ExecuteUbergraph_GI` → `UpdateDefaultHair` → `ExecuteUbergraph_GI` (tête). - Contexte : menu des contacts ; trois `AddCreatureButton` → `GenerateCreature` → `SavePreset` juste avant (HJ:15421, 15631, 15845 ; `DestroyDummy was from AddCreature` HJ:15433, 15643, 15857), puis clic sur un contact (`LOAD ETHNIC test1811` HJ:16085, 16113 ; `CLICK ON THE SAME BUTTON` HJ:16114). Les `LOAD ETHNIC` antérieurs de HJ (3317, 10219, 10221, 15414) et ceux de J6 (J6:3718, 3970) ne lèvent pas l'erreur. Grep `AddCreature|GenerateCreature` sur J6 : 0. ## 2. Hypothèse testée (une seule) H : chacune des trois familles est un **défaut d'origine** révélé par le **parcours** de HJ, et non un effet de Room B2 (CAM, non commité), de STE-H10 (`DestroyPerson`, `SavePreset`, `GetSMBoolForSMC_Cloth`, `ClearProxies`, `RandomizeHairs`, `Current`) ou de STE-H3d (`CallFunctionReturnBool`). Réfutée pour une famille si : elle est absente de tout journal antérieur à ces changements alors que son chemin y est exercé, ou si sa pile passe par un graphe modifié. ## 3. Essai et résultat brut ### 3.1 Comptes par journal (motif commun, outil Grep) | Journal | F1 | F2 | F3 | Source | |---|---|---|---|---| | HJ (CAM-B2, `0745917` + Room B2) | 2 (+1 affectation) | 2 | 2 | lignes § 1 | | J6 (`STE-J6`) | 0 | 0 | 0 | Grep J6 | | CAM-B2 `LifePlay-backup-2026.10.13-13.24.10.log` | 0 | 2 (l. 3170, 3181) | 0 | Grep | | CAM-B1 / B1c / B1d (2026-10-13) | 0 / 0 / 0 | 4 (l. 4289-4938) / 0 / 0 | 0 | Grep | | STE-J5 `backup-2026.10.10-23.30.21` | 10 | 4 | 0 | Grep | | STE-H5b-C0 `backup-2026.10.10-19.34.53` | 14 (compte des 3 motifs, F1 seule selon `STE-H5b-C0.md:52`) | — | 0 | Grep count | | STF-STE-LISIB (J3) | 14 | 0 | 0 | Grep | | STC (2026-10-10) | 0 | 2 (l. 3840, 3851) | 0 | Grep | | STB-JEU2 / STB-JEU `backup-2026.10.09-20.30.49` | 6 / 2 (l. 18574, 18600) | 0 | 0 | Grep | | STF-STE, STE-H5b-TEMOIN | 0 | 0 | 0 | Grep | | Toutes archives `LifePlay_Build_5.8_*` (Grep `SkeletalMesh_2_93573D`, glob `*/Windows/LifePlay/Saved/Logs/*.log`) | — | — | **2, CAM-B2 seul** | Grep count | | B55 (DC4, Development, DebugGame) | 38 au total | 2 (DebugGame l. 68565, 68576) | 0 | Grep `-o` | | P55 (journaux 5.5) | — | 56 sur 20 fichiers | 270 sur 3 fichiers (L5b 93, L5c 40, L5c2 137) | Grep count | | P55 `REF427_session_20260929_quete.log`, `ref427_partie_20260930.log` (référence **4.27**) | 0 | 2 + 2 | 0 | Grep | ### 3.2 Piles antérieures relues - F1 : `STB-JEU …backup-2026.10.09-20.30.49.log:18574-18585` et `B55 DC4 …backup-2026.10.08-15.16.01.log:13674-13685` : **même pile** `Room_C:ExecuteUbergraph_Room > PlayIdle > PlayWorkDaily > PlayDaily > moveToPersonStand`, suivie de la même `assign variable` (DC4:13687). Déjà requalifié « défaut d'origine » (`U8-T5cr2-VAL.md:133-140`, `STE-PASSATION.md:71`). - F2 : `STC LifePlay.log:3840-3849` même pile `SexAction > cum > AfterCumSpeed` ; **4.27** : `REF427_session_20260929_quete.log:13936-13942` même pile `SexAction_C:BndEvt__ActionButton > ExecuteUbergraph_SexAction > GI_C:cum` ; `ref427_partie_20260930.log:69939-69945` autre appelant (`Person_C:UpdateOeChange > GI_C:UpdateOeForSexPersons`). Signalé dès U3 (`U3-T4-EDITEUR.md:20` « Set Rate | Accès None PersonCumming », jugé « chemin de jeu propre à une scène ») et U8 (`U8-T5cr2-VAL.md:117`). - F3 : `P55 L5b_partie_utilisateur_20260929.log:11099-11115` : **même queue de pile** `LoadPreset > GenerateAndApplyStrings > PlayerChangeRace > ExecuteUbergraph_GI > UpdateDefaultHair` (entrée par `Scene_C NextButton > ContinueScene > ReadSceneLine > CallFunction > GeneratePerson`). Défaut voisin documenté : `U7-SUIVI.md:70-79` (`UpdateDefaultHair` lit None après une reconstruction de `GI.HairstyleTable`, corrigé en U7-T12 pour ce cas seulement). ### 3.3 Graphe à la tête (dumps relus) - F2 : GEV:10896-10904 `AfterCumSpeed` (`K2Node_CustomEvent_702`) → `VariableSet_9760 Rate` ← `CallFunction_1002` ; GEV:28040-28063 : `VariableGet_720 PersonCumming` → `VariableGet_721 Race` (`StartsWith 'Dog'`) et `VariableGet_722 IsMale` → `BooleanAND` → `bPickA` de `CallFunction_1002` (A = 0.0, B = 0.25, GEV:28036-28039). Deux lectures de `PersonCumming` = deux avertissements par clic. Avec `PersonCumming` = None, les deux lectures rendent la valeur par défaut, `bPickA` = false, `Rate` = 0.25 (estimé : sémantique d'une lecture `Accessed None` en Blueprint). - F3 : GEV:3701-3726 `UpdateDefaultHair` (`K2Node_CustomEvent_5`) : `IsMale` → `IfThenElse_65 / _66` → `LoadHairMeshIfNeeded` (`CallFunction_259` / `_287`, index `CallFunction_229` / `_254`, GEV:19804-19830) → `SetSkinnedAssetAndUpdate(HairSM, NewMesh = BreakStruct_12/13.SkeletalMesh_2)` (`CallFunction_662` / `_661`) → `MacroInstance_5 / _4` (ForEach) sur `VariableGet_1147 / _64 Materials` dont `self` = `BreakStruct_12/13.SkeletalMesh_2` (GEV:4143-4160, 19816-19818, 19835-19837). La lecture de `Materials` sur un maillage None lève l'avertissement ; `HairSM` a alors déjà reçu None. LH:11-80 : `LoadHairMeshIfNeeded` ne charge que si le maillage est invalide **et** chemin ≠ None **et** (`Daz` ou `LegacyPercentage > 0`), et `getSkeletalMeshFromPath` peut rendre None (asset introuvable) : trois cas où la table garde None. - F1 : pas de dump `Person` relu à l'offset `64X` (rubrique 9 : budget ; la pile suffit à l'attribution). ### 3.4 Lien avec les changements récents - STE-H10 / H3d : Grep `moveToPersonStand|PlayIdle|PlayDaily|PlayWorkDaily|AfterCumSpeed|PersonCumming|UpdateDefaultHair|LoadHairMeshIfNeeded|PlayerChangeRace|HairstyleTable|\bcum\b` sur `STE-H10*.md`, `STE-H3d*.md` : seuls `HairstyleTable` et `LoadHairMeshIfNeeded` sont cités, comme **lus** par A1 (`RandomizeHairs` de Person appelle `GI.LoadHairMeshIfNeeded`, GI non modifié : `STE-H10-SPEC.md:98-119`, `STE-H10-IMPL.md:34-40`) ; aucun des graphes des trois piles n'est modifié par H10 ou H3d. - Room B2 : `CAM-B2-DEMANDE.md:6-7` « Room seul … (PC, GI, Person non touchés) » ; `CAM-B2-V7-BUILD.md:2, 90` : build HJ = HEAD `0745917` + Room seul modifié. GI de HJ = GI du dépôt : `md5sum Content/BPs/GI.uasset` → `c4817b847ecf246c859647577647d6e9` (= `C4817B84` de la fiche). Seule F1 a Room dans sa pile (`Room_C:ExecuteUbergraph_Room` en bas), mais la même pile existe avant B2 (STB-JEU 2026-10-09, DC4 5.5). - État git relu (`git diff --stat HEAD -- Content/BPs/Room.uasset Content/BPs/Person.uasset Content/BPs/GI.uasset`) : Room **et Person** modifiés dans l'arbre à cette heure ; Person n'était pas modifié au build HJ (`CAM-B2-V7-BUILD.md:90` « Room seul modifié ») : constat hors périmètre, signalé. ## 4. Verdict : confirmée (par famille) | Famille | Origine | Niveau | Preuve | |---|---|---|---| | F1 `K2Node_CustomEvent_Person` (Person, `moveToPersonStand`) | défaut d'origine (≥ 5.5 DC4), révélé par le parcours ; ni B2, ni H10, ni H3d | **établi** (même pile dans DC4 5.5 et STB-JEU 5.8, antérieurs à H10, H3d et B2) | § 3.1, 3.2 | | F2 `PersonCumming` (GI, `cum > AfterCumSpeed`) | défaut d'origine **4.27**, révélé par le parcours (clic de fin d'acte) | **établi** (même pile dans REF427) | § 3.1-3.3 | | F3 `SkeletalMesh_2` (GI, `PlayerChangeRace > UpdateDefaultHair`) | défaut d'origine 5.5 (même queue de pile en L5b, 2026-09-29), révélé par le parcours contacts / créatures, jamais joué dans les archives 5.8 | **établi** pour l'antériorité ; **estimé** pour la cause exacte du None (§ 3.3 : trois cas possibles) et pour l'absence de rôle de H10-A1 (`UpdateDefaultHair` appelle lui-même `LoadHairMeshIfNeeded` avant de lire : le cache rempli ou non par `RandomizeHairs` ne change pas la condition) | § 3.1-3.4 | Pourquoi absentes de J6 : chemins non exercés ou exercés autrement (estimé) : F3 suit `AddCreature` / contact, 0 en J6 ; F2 dépend de l'acte (J6 a un `Endsex` J6:2849 sans erreur) ; F1 dépend d'un `PlayIdle` de Room pendant un `moveToPersonStand` (24 `generateperson` en J6, 32 en HJ ; la condition de course n'est pas mesurée). ## 5. Hypothèse suivante proposée, et à quel niveau Suites proposées (aucune lancée ; décisions à l'utilisateur) : - **F1** : défaut d'origine accepté (avis déjà rendu à Big Boss, `STE-PASSATION.md:71`) ; si une garde est voulue : CART N2 sur `Person:EventGraph` `moveToPersonStand` (lecture du paramètre `Person` gardé par `IsValid`, format G7). Dump à faire lancer : `.\Tools\RunCommandlet.ps1 -Lot STE-H3f -Commandlet LPDumpFunction -Args '-BP=Person -Fn=EventGraph -Pins -Exec'` (forme reprise de `fiches\STE-D.md:16-17`). Aucun lien CAM : pas de renvoi. - **F2** : garde G7 `IsValid(PersonCumming)` en amont de `BooleanAND_101` dans `AfterCumSpeed` (else → `bPickA` = false) : même `Rate` = 0.25 qu'aujourd'hui (estimé § 3.3), donc **sans changement de comportement** ; ou défaut d'origine accepté (4.27). Dump déjà disponible (GEV) ; à rafraîchir avant SPEC : `.\Tools\RunCommandlet.ps1 -Lot STE-H3f -Commandlet LPDumpFunction -Args '-BP=GI -Fn=EventGraph -Pins -Exec'`. - **F3** : garde G8 en deux temps. (a) Sans changement de comportement : `IsValid(SkeletalMesh_2)` avant les deux boucles `MacroInstance_4 / _5` sur `Materials` (la boucle sur un maillage None ne fait rien aujourd'hui). (b) Avec changement : ne pas appeler `SetSkinnedAssetAndUpdate` quand le maillage est None (garder la coiffure en place au lieu de la vider) → **Q1**. Avant toute SPEC, un DIAG N2 pour fixer la cause du None (index `CallFunction_229 / _254`, chemin, `Daz`, `LegacyPercentage`, préréglage de créature) ; même dump GI que F2, plus `-Fn=LoadHairMeshIfNeeded` et `-Fn=getSkeletalMeshFromPath`. Questions pour l'utilisateur : - **Q1** (F3) : quand le maillage de coiffure par défaut est None, garder la coiffure précédente (b) ou laisser le personnage sans coiffure comme aujourd'hui (a seul) ? - **Q2** (F1, F2) : défauts d'origine acceptés (aucune fiche) ou gardes G7 sans changement de comportement ? Tours : 30 / 40 ## Constats - Piège d'outil, établi : Grep sur le **dossier** `etat\ST\STE\dumps` avec le motif `SkeletalMesh_2_93573D|PersonCumming` → 0 fichier ; le même motif sur le **fichier** `GI__EventGraph_V5.txt` → lignes 3719, 28040… Les `.txt` de `etat/` sont ignorés par git (`lp-paths`) et ripgrep les saute même quand le dossier est passé en `path` ; il faut nommer le fichier. - Les comptes « 14 » de STE-H5b-C0 sont ceux du motif commun aux 3 familles ; la part F1 seule est reprise de `STE-H5b-C0.md:52` (non recomptée séparément). - Non mesuré : condition exacte qui rend `K2Node_CustomEvent_Person` None (F1) ; préréglage du contact cliqué (F3) ; journaux 4.27 hors des deux fichiers REF427 de P55. - Lecture seule respectée ; un seul fichier écrit (ce livrable, non suivi). Aucun nom d'utilisateur ni chemin de profil cité. Fichiers à commiter : A `Docs/Migration/etat/ST/STE/STE-H3f-DIAG.md` (dépôt jeu, branche `ue5.8`), par le gardien sur ticket. ## Décisions de l'utilisateur (2026-10-13) - Q2 (F1 `K2Node_CustomEvent_Person`, F2 `PersonCumming`) : **acceptés sans fiche** (défauts d'origine, à consigner au registre des erreurs au prochain jeton du journal). - Q1 (F3 `UpdateDefaultHair`) : **comportement actuel conservé** : garde sans changement de comportement (pas de coiffure, sans le message) à spécifier avec G15 (même passage MCP sur GI) ; cause exacte non instruite.