107 lines
15 KiB
Markdown
107 lines
15 KiB
Markdown
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).
|