LifePlay-Revival/Docs/Migration/etat/ST/STD/STD-SCN-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

216 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Fiche STD-SCN — Niveau N3 — Modèle prévu (modèle de l'agent lp-cart) | utilisé claude-opus-5-5 — Agent lp-cart — Skills lp-doc (gabarits), sk-protocol
# STD-SCN-DIAG : familles du moteur de scènes, origine STB ou préexistante (2026-10-10)
Lecture seule stricte : aucun lancement (jeu, éditeur, commandlet, build), aucune écriture hors de ce fichier. Copie
`D:\Game\LifePlay-master 5.8` lue à HEAD `20620f6` (gelée par STC).
Abréviations des journaux (chemins absolus) :
- **L2** = STB-JEU2 `D:\Game\LifePlay_Build_5.8_STB-JEU2_Development\Windows\LifePlay\Saved\Logs\LifePlay.log`
- **L1** = STB-JEU `D:\Game\LifePlay_Build_5.8_STB-JEU_Development\Windows\LifePlay\Saved\Logs\LifePlay-backup-2026.10.09-20.30.49.log`
- **LU8** = base U8 `D:\Game\LifePlay_Build_5.8_Development_U8_essai\Windows\LifePlay\Saved\Logs\LifePlay-backup-2026.10.09-16.46.02.log`
- **DC4** = 5.5 avant migration `D:\Game\LifePlay-master 5.5\Docs\Migration\etat\U58\U6\LifePlay_55_DC4_avantU6.log`
- **U6-55** / **U6-58** = `...\etat\U58\U6\LifePlay_55_session2.log` / `LifePlay_58_session2.log`
- **P10-55** / **P10-58** = `...\etat\U58\U7\P10\5.5\LifePlay.log` / `...\U7\P10\5.8\LifePlay.log` (5.8 avant STB, 2026-10-09 06:4x)
- **JM** = `D:\Game\LifePlay-master 5.8\Docs\Migration\Journal_Modifications.md`
- Dumps : **STA-d** = `D:\Game\LifePlay-master 5.5\Docs\Migration\etat\ST\STA\dumps\`, **STB-d** = `...\etat\ST\STB\dumps\`
## 1. Symptôme et reproduction
Session STB-JEU2 (parcours : nouvelle partie avec éditeur de personnage, ville, actions seul et avec partenaire,
scènes dont `meet_couple`, `STB-JEU-VAL.md:14-15`). Comptes bruts dans L2 (Grep, mode `count`, rejouables) :
| Famille | Motif Grep exact | L2 |
|---|---|---|
| F1 `Accessed None … Person` | `property Person in` | 270 (en tête de pile : `GI_C:ReturnStatIfNeeded:64X` 93, `GI_C:getActorVar:64X` 142, `GI_C:setActorVar:64X` 32 ; 3 non ventilées) |
| F2 index hors bornes « tableau sans nom » | `Person_24_4B712C904750AD4CE1580DBEBD9E7396' of length 0` | 351 (le tableau est le membre `Person` de la structure `/Game/Structs/Variable`, d'où le nom à GUID) |
| F3 `CallFunc_Array_Get_Item_31/32/33/41` | `property CallFunc_Array_Get_Item_(31\|32\|33\|41) ` | 167 (171 avec `_\d+` : 4 lignes `_30` hors fiche, L2:12087, 12097, 22396, 22406) ; dont `_33` : 33 |
| F4 `CallFunc_GetSkeletalMesh_ReturnValue` | `property CallFunc_GetSkeletalMesh_ReturnValue` | 99 ; variante GI (multiligne, en-tête `GI_C:ExecuteUbergraph_GI:`) 96 |
| F5 « No SkeletalMesh » | `No SkeletalMesh` | 15 793 (51 % des 30 995 lignes) ; `Person_C_2147481850` 10 751, `Person_C_2147481946` 1 040 ; socket `CenterBrow` 3 264 |
| Dénominateurs | `CHECKING:` / `index SPAWN` / `DestroyDummy was from CheckScenes` / `\(test0104\) for [0-9.]+ hours by 0` / `Actor cleared and destroyed` | 2 318 / 123 / 185 / 24 / **1** (L2:2226) |
Lien avec les lignes de scène (établi, même horodatage et même image) :
- F1 par le contrôle des scènes : L2:5226 `CHECKING: …meet_random/meet_new_person.lpscene` puis L2:5227-5238
(`UpdateCheckForScenes` → `CheckConditionsOther` → `CheckEachCondition` → `CalculateString` → `Calculator` →
`ReturnStatIfNeeded`). La ligne OTHER de la scène lit la stat d'un acteur peut-être absent :
`D:\Game\LifePlay-master 5.8\Content\Modules\vin_Base\Scenes\meet_random\meet_new_person.lpscene:5`
(`isWithCompanion() && Random(0, 200) < CurrentCompanion:interpersonal`). Même chose au démarrage d'une scène :
L2:20166 `CHECKING: …family/child_sexual.lpscene` → L2:20167-20178 (`PlayScene` → `CheckConditionsOther` → … → `ReturnStatIfNeeded`).
- F1/F2/F3 par la lecture du script d'une scène lancée : L2:20189-20200 (hors bornes `Person_24` + `getActorVar` sous
`PlayScene` → `ReadSceneLine` → `CallFunction`), L2:20327-20339 (`CallFunc_Array_Get_Item_33` dans `CallFunction`),
L2:20398-20411 (`setActorVar`). Chaque groupe `33, 32, 31, 31, 31, 31` est suivi de quelques dizaines de lignes par
`(test0104) for <n> hours by 0` (ex. L2:20331 → L2:20397 ; L2:20581 → 20647 ; L2:29929 → 29995) : 24 démarrages
d'action « by 0 », presque tous dans la rafale 21:32:09 à 21:32:21.
- F4 : L2:5173-5199 : `CHECKING: …dating/sociable_dating.lpscene` (WHO = `getSpecific(Dating)`,
`...\Scenes\dating\sociable_dating.lpscene:4`) → `Person_C_2147481850 index SPAWN` → avertissement (pile
`UpdateCheckForScenes` → `CheckConditionsWho` → `ReadSceneLine` → `CallFunction` → `GetSpecific` → `LoadPreset` →
`GenerateAndApplyStrings` → `PlayerChangeRace` → `UpdatePlayerMeshWithMorphs`) → `DESTROY… Slot: 1` →
`DestroyDummy was from CheckScenes, WHO unmatched`. 96 SPAWN sur 123 sont suivis à la ligne suivante de F4 (multiligne
`index SPAWN \(test0304\)\r?\n[^\n]*property CallFunc_GetSkeletalMesh_ReturnValue in` → 96).
- F5 : L2:5193 `test0304 DESTROY… index Person_C_2147481850` puis L2:5194-5198 et suivantes : `GetSocketInfoByName`
(Head ×2, pelvis, chestUpper, hip, CenterBrow) à chaque image sur **le même acteur** recyclé. Écart à la fiche :
« Actor cleared and destroyed » n'apparaît qu'une fois (L2:2226) ; le déclencheur réel est la libération
`test0304 DESTROY` du mannequin (acteur gardé en réserve, réutilisé au SPAWN suivant : `Person_C_2147481850` revient
dans la plupart des 123 SPAWN).
Comptage par scène : sans objet au sens strict pour F3, F1 (getActorVar/setActorVar) : le fichier joué par `PlayScene`
n'est pas écrit dans le journal (aucune ligne `lpscene` hors `CHECKING:` et `timed out`, Grep
`GI_C_\d+\] ([^C]|C[^H]).*(lpscene|lpaction|lpquest)` → 17 lignes `timed out` seulement). Normalisation retenue :
par démarrage d'action « by 0 » (F1, F3), par ligne `CHECKING:` (F1, F2, F5), par SPAWN de mannequin CheckScenes (F4).
## 2. Hypothèse testée (une seule)
**H : les cinq familles sont préexistantes au lot STB** — (a) leur fréquence normalisée dans L2 égale celle d'un
journal antérieur à STB, et (b) aucune fonction ni aucun événement de leur pile n'est modifié par CHG-281 à CHG-294.
## 3. Essai et résultat brut
### 3.1 Fonctions modifiées par STB (critère b)
Lecture de JM:1135-1148 (CHG-294 à CHG-281). Graphe GI touché : événements `LoadSettings`, `PopulateRaws`
(CHG-281, JM:1148), `FocusOnMapMarkers` et fonction `clearVariable` (CHG-282, JM:1147), nœuds de lecture
`Clothes4` / `MorphTags` (CHG-283, JM:1146), `clearDaily`, `PlayIdle`, `PlayDaily`, `PerTick` et fonctions
`determinePersonVars`, `clearScenePersons` (CHG-290, JM:1139). Person : `standIdle`, rotation de tête
(`HeadtrackTarget` → `CenterBrow`), `OccupyingFnt` (CHG-284, JM:1145), `assignHome` (CHG-285, JM:1144). Autres :
MainMenu (CHG-286 retiré par CHG-294), StreetMap_Static, Room, SexInterface, garde C++ des marqueurs.
**Aucun** des noms de pile n'y figure : `UpdateCheckForScenes`, `PlayScene`, `CheckConditionsWho`,
`CheckConditionsOther`, `CheckEachCondition`, `CalculateString`, `Calculator`, `ReturnStatIfNeeded`, `ReadSceneLine`,
`CallFunction`, `getActorVar`, `setActorVar`, `GetSpecific`, `getPerson`, `LoadPreset`, `GenerateAndApplyStrings`,
`PlayerChangeRace`, `UpdatePlayerMeshWithMorphs`. Réserve : `ExecuteUbergraph_GI` (EventGraph) est modifié, mais dans
d'autres événements ; pour F4, le câblage de `UpdatePlayerMeshWithMorphs` est identique avant et après STB (§ 3.5).
Point de contact indirect pour F5 : CHG-284 (lecture `CenterBrow` dans l'EventGraph de Person), voir § 3.6.
### 3.2 Tableau des comptes bruts (Grep, mode `count` ; L1 et LU8 avec le motif neutre de format)
Motif F1 neutre (5.5 écrit `…property Person` sans « (real) … in ») : `Accessed None trying to read (\(real\) )?property Person\b`.
F3 en 5.5 : `property CallFunc_Array_Get_Item_(31|32|33|41)\b`. F4 variante GI : multiligne
`property CallFunc_GetSkeletalMesh_ReturnValue( in not an UClass)?\r?\n\s+GI_C [^\n]*\n\s+Function /Game/BPs/GI\.GI_C:ExecuteUbergraph_GI:`.
| Journal (moteur, date) | CHECKING | by 0 | SPAWN | Dummy CheckScenes | F1 | F2 | F3 | F3 `_33` | F4 (GI) | F5 |
|---|---|---|---|---|---|---|---|---|---|---|
| DC4 (5.5, 2026-10-08) | 5 410 | 56 | 76 | 0 | 664 | 1 379 | 395 | 77 | 0 | 10 974 |
| U6-55 (5.5) | 831 | — | 20 | 0 | 3 | 87 | 0 | — | 0 | 2 315 |
| P10-55 (5.5) | 213 | — | 6 | 0 | 1 | 23 | 0 | — | 0 | 1 254 |
| U6-58 (5.8) | 380 | — | 18 | 0 | 2 | 59 | 0 | — | 0 | 2 723 |
| P10-58 (5.8, avant STB) | 1 429 | — | 33 | 57 | 1 | 119 | 0 | — | 10 | 10 388 |
| LU8 (5.8, avant STB) | 374 | 0 | 15 | — | 2 | 39 | 0 | — | 0 | 871 (`STA-T3-DOC.md:60` ; Grep combiné F4+F5+SPAWN = 886) |
| L1 (STB complet) | 2 515 | — | — | — | 152 | 204 | 84 | — | 97 | ≤ 18 226 (Grep combiné F5 + SPAWN + Dummy, non séparé) |
| L2 (STB, CHG-286 retiré) | 2 318 | 24 | 123 | 185 | 270 | 351 | 167 | 33 | 96 | 15 793 |
« — » = non compté (budget). `by 0` = `\(test0104\) for [0-9.]+ hours by 0` ; U58 : DC4 seul (56). Dummy CheckScenes =
`DestroyDummy was from CheckScenes` ; U58 : P10-58 seul (57).
### 3.3 F1 et F2 : `ReturnStatIfNeeded`, `getActorVar`, `setActorVar` (Person / tableau `Person_24…`)
- Mécanisme, lu dans STA-d `GI__ReturnStatIfNeeded.txt` : chaîne `X:stat` coupée sur `:` (`Split`, :409-417) →
`GetVariable(Name = X)` (:140-145) → `Variable.Person[0]` (`K2Node_GetArrayItem_10794`, :156-159) → `Set Person`
(:39-43) → `Person.QueryStat` (:160-168), sans test. Variable jamais affectée → tableau vide → F2 puis F1 ; variable
affectée à une référence nulle → F1 seul (cas L2:5227, sans ligne F2 avant). Chemin sans `:` → `PlayerCharacter`
(:31-53), toujours valide.
- Même signature et même pile en 5.5 avant migration : DC4:13020-13031 (`Accessed None trying to read property Person`,
`ReturnStatIfNeeded:036D`, pile `UpdateCheckForScenes` → `CheckConditionsOther` → … → `ReturnStatIfNeeded`).
- Fréquence normalisée : F1 par démarrage « by 0 » : L2 270 / 24 = **11,3** ; DC4 664 / 56 = **11,9**. Par
`CHECKING:` : L2 0,116 ; DC4 0,123. Les sessions U6/U7/U8 sans démarrage « by 0 » restent à 1-3.
- F2 : présent dans tous les journaux 5.5 et 5.8 (DC4 1 379, U6-55 87, P10-58 119, LU8 39). Plus bas en L2 qu'en DC4
par démarrage (14,6 contre 24,6) : une partie de F2 en DC4 vient de `clearVariable` (DC4:8624-8637, pile
`GeneratePerson` → `clearVariable`), lecture supprimée par CHG-282 (estimé : non décompté par fonction).
### 3.4 F3 : `CallFunc_Array_Get_Item_31/32/33/41` dans `CallFunction`
- Même nœuds, même pile en 5.5 : DC4:31616-31626 (`CallFunc_Array_Get_Item_33`, `CallFunction:ADF7`, pile
`PlayScene` → `ReadSceneLine` → `CallFunction`, précédé du hors bornes `Person_24`) ; `_32` en DC4:31689-31691.
- Fréquence : `_33` par démarrage « by 0 » : L2 33 / 24 = **1,38** ; DC4 77 / 56 = **1,375**. Journaux 5.8 antérieurs
sans démarrage « by 0 » : 0 (aucune ligne F3 dans `etat\U58` hors DC4, ni dans LU8).
- Cause : argument « personne » lu en `Variable.Person[0]` sur une variable d'acteur vide, puis fonction appelée sur None
(estimé : dump de `CallFunction` absent, § 3.7).
### 3.5 F4 : `CallFunc_GetSkeletalMesh_ReturnValue` (GI)
- Nœud : événement `UpdatePlayerMeshWithMorphs` (STB-d `GI__EventGraph.txt:1160-1197`) : `CharacterBeingEdited.Mesh`
(`K2Node_VariableGet_7384`) → `LPMeshCompat::GetSkeletalMesh` (`K2Node_CallFunction_1101`, :29255-29258) →
`MorphTargets` (`K2Node_VariableGet_7134`, :1189-1191) → `ForEachLoop`, sans test. `ULPMeshCompat::GetSkeletalMesh`
rend `Cast<USkeletalMesh>(GetSkinnedAsset())`, donc nullptr sans message quand le composant n'a pas de maillage
(`D:\Game\LifePlay-master 5.8\Source\LifePlay\LPMeshCompat.cpp:9-19`). Correspondance nom compilé
`CallFunc_GetSkeletalMesh_ReturnValue` ↔ nœud `_1101` : estimée (seul `GetSkeletalMesh` vu sur la chaîne de cet événement).
- Câblage identique avant STB : STA-d `GI__EventGraph.txt:1041-1044, 1070-1072, 29148-29151`.
- Avant STB en 5.8 : P10-58:39196-39221, même pile (via `getPerson` au lieu de `GetSpecific`), 10 avertissements pour
10 SPAWN de mannequin CheckScenes (`index SPAWN` suivi de F4 : 10). Les SPAWN de génération (`GeneratePerson`,
`GenerateUnknown`) étaient suivis de `currentMatchRace` (P10-58 : 21 ; LU8 : 15/15), avertissement retiré par CHG-290 ;
ils ne donnent pas F4.
- En 5.5 : aucun SPAWN de mannequin CheckScenes dans les journaux disponibles (`DestroyDummy was from CheckScenes` : 0
dans DC4, U6-55, P10-55) ; les 2 F4 de DC4 sont d'autres nœuds (CharGen `PopulateGenitalSlidersDaz` DC4:7424-7432,
Person `BackupMorphs` DC4:58139-58148). Origine 5.5 ou migration 5.8 : non tranchée.
- Rapport L2 : 96 F4 pour 96 SPAWN suivis immédiatement de F4 ; la hausse 10 → 96 suit le nombre de mannequins
CheckScenes (57 → 185), lui-même lié au parcours (relations du personnage créé).
### 3.6 F5 : « GetSocketInfoByName(...): No SkeletalMesh » (STA-D23)
- Même schéma en 5.5 avant migration : DC4:8821-8828 (`index SPAWN`, `DESTROY… Slot: 1`, puis Head ×2, pelvis,
chestUpper, hip sur le même acteur).
- Par `CHECKING:` : L2 **6,8** ; P10-58 (avant STB) **7,3** ; U6-58 7,2 ; LU8 2,3 ; 5.5 : DC4 2,0, U6-55 2,8, P10-55 5,9.
L2 reste dans la plage 5.8 d'avant STB.
- Part `CenterBrow` (seul socket touché par CHG-284) : L2 3 264 / 15 793 = 20,7 % ; P10-58 6 953 / 10 388 = 66,9 % ;
DC4 2 470 / 10 974 = 22,5 %. Aucune hausse après CHG-284, plutôt une baisse (cohérent avec l'évaluation
conditionnelle qui remplace le `SelectVector`, JM:1145 ; estimé : la part dépend aussi du parcours).
- Lecteur par image (tête, bassin, poitrine, hanche, sourcils) non identifié : EventGraph de Person ou AnimBP (point à confirmer).
### 3.7 Dumps
Présents : `ReturnStatIfNeeded` (STA-d), EventGraph GI avant / après STB (`UpdateCheckForScenes`, `PlayScene`,
`UpdatePlayerMeshWithMorphs`), EventGraph de Person (STB-d). **Dump requis** (non produit, copie gelée), tailles lues
dans STA-d `GI__graphes.txt` : `CallFunction` (1 538 nœuds, :50), `getActorVar` (15, :262), `setActorVar` (32, :263),
`LoadPreset` (109, :20), `CheckConditionsWho` (32, :42), `ReadSceneLine` (105, :49), `GenerateAndApplyStrings`
(391, :27) ; ainsi que `GetSpecific`, `getPerson`, `PlayerChangeRace`, `CheckConditionsOther`, `Calculator` (taille non relevée).
## 4. Verdict : confirmée (F1, F2, F3, F5) ; confirmée vis-à-vis de STB, indécise 5.5 / 5.8 pour F4
| Famille | Cause | Origine | Correctif proposé (non appliqué) | Effort |
|---|---|---|---|---|
| F1 `Person` dans `ReturnStatIfNeeded` / `getActorVar` / `setActorVar` | stat ou variable lue sur un acteur de scène vide ou nul (`X:stat`, ex. `meet_new_person.lpscene:5`), sans test avant `QueryStat` | **préexistante** (5.5 : DC4:13020-13031 ; 11,3 contre 11,9 par démarrage) | `ReturnStatIfNeeded` : `IsValidIndex(Variable.Person, 0)` puis `IsValid(Person)` entre `GetVariable` (`K2Node_CallFunction_81822`) et `QueryStat` (`K2Node_CallFunction_7798`) ; sinon `Float = 0.0` (valeur rendue aujourd'hui). Même garde dans `getActorVar` (valeur par défaut) et `setActorVar` (écriture sautée) | S (≈ 5 nœuds par fonction, schéma de CHG-282) ; dumps get/set requis |
| F2 hors bornes `Person_24…` | même lecture `Person[0]` sur tableau vide | **préexistante** (DC4 1 379, P10-58 119, LU8 39) ; baisse partielle due à CHG-282 (estimé) | couvert par F1 et F3 (même lecture) | — |
| F3 `CallFunc_Array_Get_Item_31/32/33/41` | 4 lectures `Variable.Person[0]` passées comme cible dans `CallFunction`, fonction appelée sur None | **préexistante** (DC4:31616-31626 ; `_33` 1,38 contre 1,375 par démarrage) | aide C++ `GetPersonAtOrNone` (modèle `GetStringAtOrEmpty`, CHG-283) pour la lecture, plus `IsValid` avant chaque appel ; ou abstention si l'on juge le cas normal (contenu de module, piège 5) | M (1 538 nœuds ; dump requis pour situer les 4 cas) |
| F4 `CallFunc_GetSkeletalMesh_ReturnValue` | `UpdatePlayerMeshWithMorphs` lit `MorphTargets` du maillage du mannequin recyclé, sans maillage au moment de `LoadPreset` | **préexistante au lot STB** (P10-58:39196-39221, 1 par SPAWN CheckScenes) ; **indécise** 5.5 / 5.8 (chemin absent des journaux 5.5) | garde `IsValid(GetSkeletalMesh)` avant le `ForEachLoop` (`_1101` → `_7134`) ; cause amont (ordre maillage / changement de race) à instruire (§ 5) | S (garde) ; M (cause) |
| F5 « No SkeletalMesh » | mannequin libéré (`DESTROY`) gardé en réserve sans maillage, toujours interrogé par image (5-6 sockets) | **préexistante** (DC4:8821-8828 ; 6,8 par CHECKING contre 7,3 avant STB) ; STA-D23 | désactiver tick / animation du mannequin au `DESTROY` et réactiver au SPAWN, ou garde dans les lecteurs de sockets ; abstention conseillée tant qu'aucun effet visible (STA-D23, `STA-T3-DOC.md:60`) | M (lecteur à identifier) |
Effet visible estimé (non vérifié en jeu) : F1, F2, F3 : stat lue à 0 et appel sauté, donc la branche de condition est
fausse et la ligne de script ne fait rien ; cohérent avec un acteur absent, aucun effet visible attendu. F4 : sans effet
pour un mannequin détruit aussitôt (`WHO unmatched`) ; **incertain** pour un mannequin gardé pour la scène
(P10-58:40222 → 40350, détruit plus tard par `DestroyPerson`) : morphs peut-être non appliqués au chargement. F5 :
acteur sans maillage, donc invisible ; coût = volume du journal (51 % de L2) et appels par image.
Origine STB : aucune famille ne l'est. Les hausses de L2 par rapport à LU8 suivent les dénominateurs (démarrages
« by 0 » 0 → 24, mannequins CheckScenes 0 → 185, CHECKING 374 → 2 318), pas un changement de taux.
Établi / estimé / incertain :
- **Établi** : comptes du § 3.2 (Grep rejouables) ; piles identiques en 5.5 (DC4) pour F1, F3, F5 et en 5.8 avant STB
(P10-58) pour F4 ; mécanisme de `ReturnStatIfNeeded` (dump STA) et de `UpdatePlayerMeshWithMorphs` (dumps STA et STB) ;
aucune fonction de pile citée par CHG-281 à 294.
- **Estimé** : taux comparés (même parcours non garanti) ; rôle de `CallFunction` (sans dump) ; nœud `_1101` ;
effet partiel de CHG-282 sur F2 ; effet visible.
- **Incertain** : fichier joué par `PlayScene` avant chaque démarrage « by 0 » ; origine 5.5 ou 5.8 de F4 ; lecteur de
sockets de F5 ; morphs d'un mannequin gardé (F4).
## 5. Hypothèse suivante proposée, et à quel niveau
- **H2 (F4, N3, lp-cart)** : le maillage du mannequin recyclé est vidé au `DESTROY` et `LoadPreset` →
`GenerateAndApplyStrings` → `PlayerChangeRace` déclenche `UpdatePlayerMeshWithMorphs` avant la réaffectation du corps.
Essai : dumps `LoadPreset`, `GenerateAndApplyStrings`, `PlayerChangeRace`, `GetSpecific` (copie dégelée), puis
contre-épreuve 5.5 sur une partie ayant des relations (mannequins CheckScenes) pour trancher 5.5 / 5.8.
- **H3 (F1/F3, N2, lp-cart)** : identifier la scène jouée par `PlayScene` avant chaque démarrage « by 0 » (dumps
`PlayScene` dans l'EventGraph STB-d, `CallFunction`, `getActorVar`, `setActorVar`) pour dire si l'acteur vide est
normal (contenu) ou un défaut de moteur.
- **H4 (F5, N2)** : identifier le lecteur par image des sockets (EventGraph Person STB-d, AnimBP à dumper).
## Constats
### Contre-épreuve U8 (parcours à rejouer par l'utilisateur, archive avant STB)
Archive : `D:\Game\LifePlay_Build_5.8_Development_U8_essai\Windows\` (même moteur 5.8, sans CHG-281 à 294).
1. Copier d'abord `...\Saved\Logs\LifePlay.log` (contre-épreuve de 22:35) à part : le prochain lancement le renomme.
2. Lancer `LifePlay.exe` de l'archive U8 ; **Nouvelle partie** avec l'éditeur de personnage, valider.
3. En ville, enchaîner **au moins 20 actions seul** de plusieurs heures (but : ≥ 20 lignes `for … hours by 0`).
4. Laisser tourner la ville **au moins 3 minutes** sans menu (but : ≥ 1 000 lignes `CHECKING:` et des mannequins
`DestroyDummy was from CheckScenes`, qui demandent un personnage avec relations : celui de la nouvelle partie).
5. Obtenir une scène `meet_couple` puis une scène à deux, comme en STB-JEU2.
6. Quitter par le menu ; copier le `LifePlay.log` produit.
Mesure (pwsh 7, depuis `D:\Game\LifePlay-master 5.8`) : `& .\Tools\LogStats.ps1 -Compare <journal U8 neuf>,<L2>`, puis
les motifs Grep du § 3.2 sur les deux journaux.
Décision : taux U8 ≈ L2 (± 50 %) pour F1 / « by 0 » (≈ 11), F3 `_33` / « by 0 » (≈ 1,4), F4 / SPAWN CheckScenes (≈ 1),
F5 / CHECKING (≈ 7) → préexistence confirmée sur le même parcours ; famille absente de U8 avec dénominateur non nul →
attribuer à STB et rouvrir.
### État de reprise par famille
F1, F2, F3, F5 : origine tranchée, correctifs proposés, dumps get/set/CallFunction à produire avant toute SPEC.
F4 : origine STB tranchée, origine 5.5 / 5.8 ouverte (H2). Aucune décision prise : choix des correctifs et de
l'abstention (contenu de module) à l'utilisateur.