15 KiB
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_foodjuste après le 2e appel). Aucune ligne(RESULT OF GETRELATEDPERSON)dans la même image après les 7 appels (GrepGETRELATEDPERSON: 12115, 18560, 61213… jamais à 10029-10111, 63135-63163, 70366-70394) : brancheQuick(GRP:332-336 :Quick→SpawnDummy, sinonPrintString … (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.lpscenepuis un seulPerson_C_2147481860 index SPAWN(C2:60897-60898, 73057-73058, 76469-76470, 80927-80928) et finit parDestroyDummy 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 :…1884puis…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 commandeisTemporarydans la scène ;isTemporaryest appelé par la brancheisDatingdeCallFunctionReturnBool(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) :OptionalPersonnon valide (GRP:315-319IsValid→Is Not Valid) →GetVariable(Name = paramètre Person)(GRP:131-136) →GetArrayItem_2498index 0 surPerson_24(GRP:147-150) →VariableSet_0 Per(GRP:327-331). Tableau vide → messageof length 0,Per= None. - Lecteurs :
VariableGet_16607 PrefixetVariableGet_16608 SaveSlot, tous deuxself = VariableGet_0.Per(GRP:151-156) →Concat→VariableSet_6264 Slot(GRP:157-170). Deux lectures = deux avertissementsPerpar appel (7 × 2 = 14) ; en 4.27, offsets distinctsgetRelatedPerson:0068et:00A3(AB427:55584, 55595). - Appelant : CFV5:2312-2321,
CallFunction_175951 getRelatedPersonsertgetRelatedPersonetgetRelatedPersonQuick;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:8SO = getRelatedPersonQuick(Spouses, Dating)etvin_Base\Scenes\uni_tutor\tutee_cms.lpscene:24(nonQuick, jamais joué dans C2 : seulement 5CHECKING). GrepgetRelatedPersonQuick\(sur MOD →so_follows.lpai:8seul. - 4.27, même séquence : AB427:55580
LoadTxt OK | '/Modules/vin_Base/AI/high_priority/so_follows.lpai'puis AB427:55581of length 0, 55582 et 55593Accessed None … property Per, pile identiquePlayScene > 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_775index 0 surPerson_24→ sortie versVariableGet_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).SaveSlotest lu deux fois sur l'objet None (EqualEqual_3092 et Array_Contains_8287). isTemporarylitPersondeux fois : L6e:123480isTemporary:001Det L6e:123493isTemporary:0050(dump deisTemporaryabsent : à faire, § 5).isSameGender(RB:569-593) :GetArrayItem_519→VariableGet_3355 IsMale (self)etVariableGet_33 (self): deux lectures sur la même sortie.- Correspondance
_62/_58↔ nœud : estimée (les nomsCallFunc_Array_Get_Item_Nsont générés à la compilation, ils ne figurent pas dans le dump) :_62×2 =SaveSlotdeGetArrayItem_775(brancheisDating, juste aprèsisTemporary) ;_58×2 =IsMale/VariableGet_33deGetArrayItem_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 0avant C2:60899 → le tableauPerson_24d'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é parPerson_C_2147481860(avant :…1884, C2:49888) ; cause exacte du None non instruite (getRelatedPeoplenon 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 |
AB427, friend_bachelor_party |
— | 38 CHECKING sans isTemporary |
Grep AB427 (16239 … 193326) |
3.4 Lien avec les changements récents
- F-A :
getRelatedPersonetCallFunctionhors 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 branchesisDating(RB:297) etisSameGender(RB:569), distinctes deisCreatureTypeque G13 garde (STE-H3g-VALJEU.md:94) ; même pile et mêmes noms_62/_58en 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 localContent/Modules, change le comportement : l'IA suivrait son propre partenaire) → Q1 ; (c) garde G13 dansgetRelatedPerson:IsValid(Per)aprèsVariableSet_0(GRP:327),Is Not Valid→FunctionResult_2(retour vide) ; change le comportement (aujourd'hui recherche sur le créneau0) etSO.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 vautVariableGetpour une ligne sans sujet » (dumpCallFunction/ReadSceneLineà jour). - F-B : (a) défaut d'origine accepté (≥ 5.5) ; (b) garde au format G13 dans
CallFunctionReturnBool, branchesisDating(aprèsCallFunction_61514,IsValid(GetArrayItem_775.Output), sinonBoolToReturn = false→IfThenElse_8994) etisSameGender(même forme surGetArrayItem_519) : change possiblement le résultat (aujourd'huiisDating(None)peut valoir vrai siSaveSlot0 ==Dating) → Q2 ; (c) DIAG N2 à la source : pourquoigetRelatedPeople(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 dansgetRelatedPerson(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 0restants de C2 (2371, 3621) appartiennent àisSameAs(pileAction_C) : famille distincte, non instruite ici. - En 4.27, les lectures d'élément de tableau s'écrivent
property CallFunc_Array_Get_Itemsans suffixe (REF427 sans quête : 9635) : un Grep sur_58|_62ne prouve rien en 4.27 ; l'absence de F-B y repose surisTemporary= 0. - Non mesuré : HJ et J6 au-delà du Grep à 0 ; journal L7i B12 (non retrouvé dans le budget) ; nombre de
so_followsjoués dans C2 (pas de traceLoadTxtdans ce build) ; scène 5.5 de L6e ; valeur deGI.Dating; offsets C2 (tous64X, 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,
isTemporarydansCallFunctionReturnBool, scènefriend_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).