LifePlay-Revival/Docs/Migration/etat/ST/STE/STE-H3h-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

107 lines
15 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 STE-H3h — 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-H3h-DIAG : familles F-A (`getRelatedPerson`, `Per`) et F-B (`isTemporary`, `CallFunc_Array_Get_Item_58 / _62`) du journal COMMUN-2 (2026-10-13)
Abréviations : **C2** = `D:\Game\LifePlay_Backup_5.5\COMMUN-2\essais\LifePlay_commun2_definitif_BOSS.log` ; **HJ** =
`etat\ST\STE\STE-H3e-J\LifePlay.log` ; **J6** = `D:\Game\LifePlay_Build_5.8_STE-J6_Development\Windows\LifePlay\Saved\Logs\LifePlay.log` ;
**L6e** = `D:\Game\LifePlay_Backup_5.5\builds_supprimees\LifePlay_Build_5.5_L6e\Logs\LifePlay.log` (5.5) ; **AB427** =
`D:\Game\LifePlay-master 5.5\Saved\Logs\portage\AB427_20261001.log` (4.27 : `LogInit: Engine Version: 4.27.2-18319896`, AB427:133) ;
**RB** = `etat\ST\STE\dumps\GI__CallFunctionReturnBool_P1.txt` (avant G13) ; **GRP** = `etat\ST\STE\dumps\GI__getRelatedPerson_D3.txt` ;
**CFV5** = `etat\ST\STE\dumps\GI__CallFunction_V5.txt` ; **MOD** = `D:\Game\LifePlay-master 5.8\Content\Modules`.
Un DIAG, une hypothèse d'origine par famille (sections F-A, F-B). Outil : Grep / Read seulement, fichiers nommés (piège `etat/` ignoré, H3f Constats).
## 1. Symptôme et reproduction
Comptes C2 (Grep, en-têtes `LogScript: Warning` seuls ; la synthèse de fin C2:85628-85653 est en `LogLifePlay: Display` avec `[LogScript Warning]`, donc **hors** du motif) :
motif `Warning: (Accessed None.*(property Per in|CallFunc_Array_Get_Item_(58|62)|property Person in)|Script Msg: Attempted to access index)` →
`property Per in` 14 ; `property Person in` 8 ; `_62` 8 ; `_58` 8 ; `Person_24_… of length 0` 9 (7 `getRelatedPerson` + 2 `isSameAs`, C2:2371 et 3621, pile `Action_C > CheckConditionsWho > … > isSameAs` : hors fiche).
Synthèse relue pour décompte : C2:85641 (16 `_#`), 85646 (14 `Per`), 85650 (9 `of length`), 85651 (8 `isTemporary`), 85652 (7 piles `getRelatedPerson`) : mêmes nombres.
HJ et J6 : Grep `GI_C:isTemporary|property Per in|getRelatedPerson` → 0 et 0. Reproduction : non rejouée (rubrique 6).
### F-A — `Per` dans `GI.getRelatedPerson` (7 appels, 14 + 7)
- Lignes C2 (en-tête `of length 0`, puis 2 × `Per`) : 10020/10029/10048 (16:41:01.372), 10083/10092/10111 (16:41:01.622), 16667/16676/16695 (16:42:30.845), 23777/23786/23805 (16:47:34.790), 43843/43852/43871 (16:59:25.404), 63135/63144/63163 (17:09:10.110), 70366/70375/70394 (17:11:41.574).
- Pile (C2:10032-10038) : `ExecuteUbergraph_GI > PlayScene > ExecuteUbergraph_GI > ReadSceneLine > CallFunction > getRelatedPerson`.
- Contexte : une routine d'IA est en cours (C2:63114 `GI CurrentScene=[/Modules/vin_Base/AI/high_priority/meal.lpai]` 1 image avant ; C2:10138 `[AI] 3 moves to fast_food` juste après le 2e appel). Aucune ligne `(RESULT OF GETRELATEDPERSON)` dans la même image après les 7 appels (Grep `GETRELATEDPERSON` : 12115, 18560, 61213… jamais à 10029-10111, 63135-63163, 70366-70394) : branche `Quick` (GRP:332-336 : `Quick` → `SpawnDummy`, sinon `PrintString … (RESULT OF GETRELATEDPERSON)` GRP:299-314).
### F-B — `isTemporary` (8) + `CallFunc_Array_Get_Item_62` (8) + `_58` (8) dans `CallFunctionReturnBool`
- **Quatre rafales** de 6 lignes (2 `Person` + 2 `_62` + 2 `_58`), et non une rafale de 24 : C2:60899-61008 (17:08:48.500), 73059-73168 (17:11:48.922), 76471-76580 (17:12:08.308), 80929-81038 (17:12:27.837).
- Pile (C2:60903-60910) : `ExecuteUbergraph_GI > UpdateCheckForScenes > ExecuteUbergraph_GI > CheckConditionsWho > CheckConditionsOther > CheckEachCondition > CallFunctionReturnBool > isTemporary` ; `_62` / `_58` : même pile terminée à `CallFunctionReturnBool` (C2:60949-60955).
- Scène en cours : chaque rafale suit `CHECKING: /Modules/vin_Base/Scenes/misc/friend_bachelor_party.lpscene` puis **un seul** `Person_C_2147481860 index SPAWN` (C2:60897-60898, 73057-73058, 76469-76470, 80927-80928) et finit par `DestroyDummy was from CheckScenes, WHO unmatched` (C2:61029).
Les 3 contrôles antérieurs de la même scène, sans erreur, font **deux** SPAWN (C2:11616-11618, 17770-17772, 49885-49887 : `…1884` puis `…1860`).
- Condition WHO (MOD `vin_Base\Scenes\misc\friend_bachelor_party.lpscene:4`) : `Actor = getRelatedPeople(Dating); If !Actor0.isDating() && !Actor1.isDating() && [Actor0.isSameGender(Player) || Actor1.isSameGender(Player)]` : aucune commande `isTemporary` dans la scène ; `isTemporary` est appelé **par** la branche `isDating` de `CallFunctionReturnBool` (ci-dessous).
## 2. Hypothèse testée (une seule)
H : F-A et F-B sont des **défauts d'origine** (antérieurs à STE, STG-B1 et CAM-B2) révélés par le parcours de C2 ; ni H10, ni H3d (G13), ni H3g, ni Person B1, ni Room B2 n'entrent dans leur pile ou leur cause.
Réfutée pour une famille si : sa pile passe par un graphe modifié par ces lots, ou si elle est absente d'un journal antérieur où son chemin est exercé.
## 3. Essai et résultat brut
### 3.1 F-A : nœud lecteur et entrée vide
- GRP (`getRelatedPerson`, 53 nœuds, dump STE-D3 du 2026-10-10) : `OptionalPerson` non valide (GRP:315-319 `IsValid` → `Is Not Valid`) → `GetVariable(Name = paramètre Person)` (GRP:131-136) → `GetArrayItem_2498` index 0 sur `Person_24` (GRP:147-150) → **`VariableSet_0 Per`** (GRP:327-331). Tableau vide → message `of length 0`, `Per` = None.
- Lecteurs : `VariableGet_16607 Prefix` et `VariableGet_16608 SaveSlot`, tous deux `self = VariableGet_0.Per` (GRP:151-156) → `Concat` → `VariableSet_6264 Slot` (GRP:157-170). **Deux lectures = deux avertissements `Per` par appel** (7 × 2 = 14) ; en 4.27, offsets distincts `getRelatedPerson:0068` et `:00A3` (AB427:55584, 55595).
- Appelant : CFV5:2312-2321, `CallFunction_175951 getRelatedPerson` sert `getRelatedPerson` **et** `getRelatedPersonQuick` ; `Person ← VariableGet 'VariableGet'` (le sujet avant le point), `OptionalPerson` (vide).
- Ligne de module : Grep `(^|[^.\w])getRelatedPerson(Quick)?\(` sur MOD → 2 lignes seulement sans sujet : `vin_Base\AI\high_priority\so_follows.lpai:8` `SO = getRelatedPersonQuick(Spouses, Dating)` et `vin_Base\Scenes\uni_tutor\tutee_cms.lpscene:24` (non `Quick`, jamais joué dans C2 : seulement 5 `CHECKING`). Grep `getRelatedPersonQuick\(` sur MOD → `so_follows.lpai:8` seul.
- **4.27, même séquence** : AB427:55580 `LoadTxt OK | '/Modules/vin_Base/AI/high_priority/so_follows.lpai'` puis AB427:55581 `of length 0`, 55582 et 55593 `Accessed None … property Per`, pile identique `PlayScene > ReadSceneLine > CallFunction > getRelatedPerson` (AB427:55585-55602). `LoadTxt OK.*so_follows` : 11 dans AB427.
### 3.2 F-B : nœuds lecteurs et entrée vide
- RB:297-318 : `isDating` → `CallFunction_61514 GetVariable(ActualVariable)` → `GetArrayItem_775` index 0 sur `Person_24` → sortie vers `VariableGet_618 SaveSlot (self)`, `EqualEqual_ObjectObject` (= `PlayerCharacter`), `IsRelative(Person)`, **`CallFunction_51 isTemporary(Person)`** (RB:2128-2131).
- RB:338-342 : `IfThenElse_946` (Person = PlayerCharacter ?) ; Person None ≠ PlayerCharacter → `else` → `VariableSet_320 BoolToReturn = BooleanAND_1873( OR_4671( SaveSlot == Dating , Datings.Contains(SaveSlot) ), NOT IsRelative, NOT isTemporary )` (RB:269-273, 987-1000, 1220-1232, 2132-2135). `SaveSlot` est lu deux fois sur l'objet None (EqualEqual_3092 et Array_Contains_8287).
- `isTemporary` lit `Person` deux fois : L6e:123480 `isTemporary:001D` et L6e:123493 `isTemporary:0050` (dump de `isTemporary` absent : à faire, § 5).
- `isSameGender` (RB:569-593) : `GetArrayItem_519` → `VariableGet_3355 IsMale (self)` et `VariableGet_33 (self)` : deux lectures sur la même sortie.
- Correspondance `_62` / `_58` ↔ nœud : **estimée** (les noms `CallFunc_Array_Get_Item_N` sont générés à la compilation, ils ne figurent pas dans le dump) : `_62` ×2 = `SaveSlot` de `GetArrayItem_775` (branche `isDating`, juste après `isTemporary`) ; `_58` ×2 = `IsMale` / `VariableGet_33` de `GetArrayItem_519` (`Actor1.isSameGender(Player)`, évalué ensuite car `!isDating(None)` laisse passer). Offsets 5.5 : `_62` à `19F0` / `1A23`, `_58` à `2246` (L6e:123506, 123518, 123530), éloignés.
- Entrée vide : pas de `of length 0` avant C2:60899 → le tableau `Person_24` d'un des acteurs **contient** un élément None (estimé : `Actor1`). Corrélé au SPAWN unique de C2:60898 contre deux SPAWN dans les contrôles sans erreur (§ 1). Depuis C2:57687 (17:08:16), le personnage du créneau 2 est porté par `Person_C_2147481860` (avant : `…1884`, C2:49888) ; cause exacte du None non instruite (`getRelatedPeople` non dumpé).
### 3.3 Antériorité
| Journal | F-A | F-B | Source |
|---|---|---|---|
| C2 (COMMUN-2, 5.8) | 7 appels (14 + 7) | 4 rafales (8 + 8 + 8) | § 1 |
| HJ, J6 (5.8) | 0 | 0 | Grep § 1 |
| L6e (5.5, 2026-09-30) | non compté | même pile, mêmes `_62` / `_58` | L6e:123478-123530 |
| L7i B12 (5.5) | 7 piles `getRelatedPerson` selon `STE-H3g-VALJEU.md:89` | — | non relu (Glob en échec : délai de ripgrep sur `D:\Game\**`) |
| AB427 (**4.27**) | même pile, précédée de `LoadTxt so_follows.lpai` | 0 | AB427:55580-55602 ; Grep `isTemporary|CallFunc_Array_Get_Item_(58|62)` sur les 5 journaux `*427*` → 0 |
| AB427, `friend_bachelor_party` | — | 38 `CHECKING` sans `isTemporary` | Grep AB427 (16239 … 193326) |
### 3.4 Lien avec les changements récents
- F-A : `getRelatedPerson` et `CallFunction` hors des graphes modifiés par H10 / H3d / H3g (`STE-H3g-VALJEU.md:88`) ; présente en 4.27 → aucun lien possible avec STG-B1 (Person), CAM-B2 (Room) ni STE.
- F-B : fonction de tête `CallFunctionReturnBool` (graphe de G13), mais branches `isDating` (RB:297) et `isSameGender` (RB:569), distinctes de `isCreatureType` que G13 garde (`STE-H3g-VALJEU.md:94`) ; même pile et mêmes noms `_62` / `_58` en 5.5 L6e (2026-09-30), **avant** H3d (2026-10-13) : G13 ne joue aucun rôle. Ni Person ni Room dans la pile.
## 4. Verdict : confirmée (par famille)
| Famille | Cause | Nœud lecteur | Origine | Niveau |
|---|---|---|---|---|
| F-A `Per` | `getRelatedPersonQuick(Spouses, Dating)` **sans sujet** (`so_follows.lpai:8`) : le nom passé à `GetVariable` désigne une variable dont `Person_24` est vide → `Per` = None | `GetArrayItem_2498` → `VariableSet_0 Per` ; lus par `VariableGet_16607 Prefix` et `_16608 SaveSlot` (GRP:147-156) | défaut d'origine **4.27** (ligne de module + graphe) | pile et nœud **établis** ; rattachement des 7 appels de C2 à `so_follows.lpai` **estimé** (seul appel `Quick` sans sujet, aucune trace `RESULT`, même séquence en 4.27 avec `LoadTxt`) ; nature exacte de la variable vide **incertaine** |
| F-B `isTemporary` + `_62` / `_58` | WHO de `friend_bachelor_party` : `getRelatedPeople(Dating)` laisse un acteur dont l'élément 0 est None ; `isDating` puis `isSameGender` le lisent sans garde | `GetArrayItem_775` (→ `isTemporary`, `SaveSlot`) et `GetArrayItem_519` (→ `IsMale`) | défaut d'origine **≥ 5.5** (L6e) ; absent des journaux 4.27 relus (parcours) | pile **établie** ; nœuds `_62` / `_58` **estimés** ; cause du None **incertaine** |
Effet en jeu (estimé, valeurs par défaut d'une lecture None) : F-A : `Slot` = `""` + `"0"` → la recherche se fait sur le créneau `0` au lieu de celui de l'IA (`SO` peut être le mauvais partenaire ou vide). F-B : la scène est rejetée (`WHO unmatched`, C2:61029) ; le résultat de `isDating(None)` dépend de `GI.Dating` (`SaveSlot` 0 == `Dating` ?) et n'est pas mesuré.
## 5. Hypothèse suivante proposée, et à quel niveau
Suites proposées (aucune lancée ; décisions à l'utilisateur) :
- **F-A** : (a) défaut d'origine accepté (4.27), comme F1 / F2 de H3f ; (b) correction **de module** `so_follows.lpai:8` → `SO = AI.getRelatedPersonQuick(Spouses, Dating)` (dépôt local `Content/Modules`, change le comportement : l'IA suivrait son propre partenaire) → **Q1** ; (c) garde G13 dans `getRelatedPerson` : `IsValid(Per)` après `VariableSet_0` (GRP:327), `Is Not Valid` → `FunctionResult_2` (retour vide) ; change le comportement (aujourd'hui recherche sur le créneau `0`) et `SO.getUntil()` lirait alors None plus loin → **Q1**. Recommandation : (a), ou (b) si l'utilisateur veut le comportement voulu par le script. Avant (c) : DIAG N2 « que vaut `VariableGet` pour une ligne sans sujet » (dump `CallFunction` / `ReadSceneLine` à jour).
- **F-B** : (a) défaut d'origine accepté (≥ 5.5) ; (b) garde au format G13 dans `CallFunctionReturnBool`, branches `isDating` (après `CallFunction_61514`, `IsValid(GetArrayItem_775.Output)`, sinon `BoolToReturn = false` → `IfThenElse_8994`) et `isSameGender` (même forme sur `GetArrayItem_519`) : **change possiblement** le résultat (aujourd'hui `isDating(None)` peut valoir vrai si `SaveSlot` 0 == `Dating`) → **Q2** ; (c) DIAG N2 à la source : pourquoi `getRelatedPeople(Dating)` rend un acteur None (SPAWN unique, créneau 2 réaffecté à `…1860`). Recommandation : (c) puis décider (a) / (b).
- Dumps à faire lancer (éditeur fermé, `lp-commandlets`) :
`.\Tools\RunCommandlet.ps1 -Lot STE-H3h -Commandlet LPDumpFunction -Args '-BP=GI -Fn=isTemporary -Pins -Exec'`
`.\Tools\RunCommandlet.ps1 -Lot STE-H3h -Commandlet LPDumpFunction -Args '-BP=GI -Fn=getRelatedPeople -Pins -Exec'`
`.\Tools\RunCommandlet.ps1 -Lot STE-H3h -Commandlet LPDumpFunction -Args '-BP=GI -Fn=getRelatedPerson -Pins -Exec'` (rafraîchit GRP, D3)
`.\Tools\RunCommandlet.ps1 -Lot STE-H3h -Commandlet LPDumpFunction -Args '-BP=GI -Fn=CallFunctionReturnBool -Pins -Exec'` (état après G13, avant toute SPEC)
Questions pour l'utilisateur :
- **Q1** (F-A) : accepter le défaut d'origine, corriger la ligne de module `so_follows.lpai:8` (comportement voulu par le script), ou garder dans `getRelatedPerson` (retour vide) ?
- **Q2** (F-B) : accepter le défaut d'origine, ou instruire d'abord la cause (`getRelatedPeople`) avant une garde qui peut changer l'issue du WHO ?
Tours : 38 / 40
## Constats
- Écart à `STE-H3g-VALJEU.md:93` : F-B n'est pas « une rafale de 24 lignes dans la même milliseconde » mais 4 rafales de 6 (17:08:48, 17:11:48, 17:12:08, 17:12:27) ; le total 24 est juste.
- Les 2 `of length 0` restants de C2 (2371, 3621) appartiennent à `isSameAs` (pile `Action_C`) : famille distincte, non instruite ici.
- En 4.27, les lectures d'élément de tableau s'écrivent `property CallFunc_Array_Get_Item` sans suffixe (REF427 sans quête : 9635) : un Grep sur `_58|_62` ne prouve rien en 4.27 ; l'absence de F-B y repose sur `isTemporary` = 0.
- Non mesuré : HJ et J6 au-delà du Grep à 0 ; journal L7i B12 (non retrouvé dans le budget) ; nombre de `so_follows` joués dans C2 (pas de trace `LoadTxt` dans ce build) ; scène 5.5 de L6e ; valeur de `GI.Dating` ; offsets C2 (tous `64X`, inutilisables).
- 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-H3h-DIAG.md` (dépôt jeu, branche `ue5.8`), par le gardien sur ticket.
## Décisions de l'utilisateur (2026-10-13, session STE)
- Q1 (F-A, `getRelatedPerson` / `so_follows.lpai:8`) : **défaut d'origine accepté** (4.27), sans correctif ; registre ERR au prochain jeton du journal.
- Q2 (F-B, `isTemporary` dans `CallFunctionReturnBool`, scène `friend_bachelor_party`) : **défaut d'origine accepté** (au moins 5.5), sans correctif ni DIAG de suite ; registre ERR au prochain jeton du journal.
- Note de l'orchestrateur : la VALJEU H3g (l. 93) parlait d'une rafale de 24 lignes ; le DIAG en compte 4 de 6 (C2 l. 60899, 73059, 76471, 80929).