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

31 KiB

Fiche STE-H3d — Niveau N3 — Modèle prévu (modèle de l'agent lp-cart) | utilisé claude-sonnet-5-5 — Agent lp-cart — Skills sk-protocol, ue-cpp-build, lp-commandlets, lp-paths (préchargés), lp-mcp (invoqué, § 3-4), lp-doc (gabarits)

STE-H3d-SPEC : lectures Person[0] restantes des scènes d'animal (isCreatureType), garde G13 dans CallFunctionReturnBool (2026-10-13)

Lecture seule stricte (aucun éditeur, MCP, commandlet, build ni écriture hors de ce fichier). Copie D:\Game\LifePlay-master 5.8, branche ue5.8, HEAD f32df0d. Gabarit SPEC : D:\Game\LifePlay-master 5.8\.claude\skills\lp-doc\gabarits.md:36-38. Suite de STE-H3-SPEC.md (G1-G6), STE-H3b-SPEC.md (G7-G11), STE-H3c-SPEC.md (G12) : mêmes conventions (H3S § 2.1), gardes G13 et suivantes, risques et questions préfixés H3d.

Statut : partiel mais exécutable. Sur 13 lignes Person_24 du journal H9 (chemin J5), 9 sont attribuées à un seul site (CallFunctionReturnBool, commande isCreatureType, nœud GetArrayItem_2346) et 5 des 6 lignes de J6 aussi. G13, variante a (rejeu exact), est spécifiée sur le dump existant ; la variante b (valeur neutre) exige un dump absent (commande en § 2.0). Le reste (4 lignes getRelatedPerson en H9 ; 1 ligne silencieuse en J6) n'est pas attribuable à isCreatureType : § 1.2. Écart à la fiche : le critère « Person_24 = 0 sur le parcours J6 » ne sera pas tenu par G13 seule (1 ligne J6 reste non attribuée, § 1.2).

Abréviations (chemins absolus) :

  • J6 = D:\Game\LifePlay_Build_5.8_STE-J6_Development\Windows\LifePlay\Saved\Logs\LifePlay.log (lu en place, non copié) ;
  • H9 = D:\Game\LifePlay_Build_5.8_STE-J5_Development\Windows\LifePlay\Saved\Logs\LifePlay.log (écrasé par la session H9, lignes datées 2026-10-11 02:51-02:58 ; MD5 596fbe9a0d23f32d8ffbc5987f617d51) ;
  • J5c = copie de lecture du vrai journal J5 (2026-10-10 21:56-22:04, MD5 43db15231d9d64dc152a7d5d41bfbd3d) : %USERPROFILE%\AppData\Local\Temp\claude\D--Game-LifePlay-master-5-8\37530d8d-c780-4a57-8fbd-bcb010aa6408\scratchpad\J5-LifePlay.log ;
  • D = D:\Game\LifePlay-master 5.8\Docs\Migration\etat\ST\STE\dumps\ ; CRBG = D GI__CallFunctionReturnBool_apres-GARDES.txt (dump STE-VAL, 2026-10-10 17:42:40, GI B8B97C46, 591 nœuds, CRBG:120) ; GRP = D GI__getRelatedPerson_D3.txt (STE-D3, GI 606EB437) ; CCW = D GI__CheckConditionsWho.txt ; L6f = D:\Game\LifePlay-master 5.8\Docs\Migration\etat\portage55\L6f\L6f_dump_GI.txt (GI 5.5, données seules) ;
  • CAMEG / CAMCF = D:\Game\LifePlay-master 5.8\Docs\Migration\etat\CAM\CAM-B1-PRE_LPDumpFunction_20261013-083048.txt (EventGraph) / ...-083157.txt (CallFunction), présents (Glob), GI = HEAD selon l'orchestrateur (aucune ligne MD5 dans leur en-tête : non vérifié). Ils ne contiennent pas CallFunctionReturnBool ; utilisés ici seulement pour C2 et pour compter les lecteurs ;
  • GIMPL = STE-GARDES-IMPL.md ; UE = D:\Game\Launcher\Engine\UE_5.8\Engine\Source\ (moteur installé, lu).

État du Blueprint : md5sum "/d/Game/LifePlay-master 5.8/Content/BPs/GI.uasset" → 71034a04c6d64e1a806ca0dadc934fb9 (HEAD, STE-H10 GI1+GI2) ; git log --oneline -3 -- Content/BPs/GI.uasset → b3ee785, 7bceea6, 4283c13. CAM B1 écrira GI ensuite : l'IMPL relira le MD5 (P2).

1. Objectif mesurable

Supprimer, sans changer ce que le jeu fait, les lignes Script Msg: Attempted to access index 0 from array 'Person_24_4B712C904750AD4CE1580DBEBD9E7396' of length 0 in '/Game/Structs/Variable.Variable'! émises à l'évaluation de la condition If CurrentCompanion.isCreatureType(<Dog|Horse>) des deux scènes vin_Base\Scenes\pet\meet_new_person_pet.lpscene:5 et vin_Base\Scenes\pet\horse\meet_new_person_horse.lpscene:5 (seules scènes du jeu qui appellent CurrentCompanion.isCreatureType : Grep CurrentCompanion\.isCreatureType, glob *.lpscene, sous Content\Modules → 2 fichiers). Attendu après G13, à parcours comparable : J6 6 → 1 (la ligne silencieuse, § 1.2), H9 13 → 4 (les 4 getRelatedPerson), J5c 13 → 2.

1.1 Attribution ligne par ligne (journaux lus en place ; « pile » = pile du message Accessed None qui suit la F2)

Méthode : la F2 (Script Msg) ne porte pas de pile (« called by: GI_C » seulement, UE § 6). Quand elle est suivie, dans la même milliseconde et sur les lignes consécutives, d'un Accessed None … property X avec pile, c'est cette pile qui nomme la fonction qui consomme le None rendu par Array_Get. Le dump (CRBG) montre que GetArrayItem_2346 est le seul producteur de l'entrée Actor de isCreatureType (CRBG:2007-2012, 2024-2027).

J6 (6 lignes ; 5 évaluations CHECKING: de ces deux scènes, 5 F2 : une F2 par évaluation) :

# J6:ligne Horodatage [trame] CHECKING voisin (ligne précédente) Pile du Accessed None suivant Attribution Statut
1 5124 05:42:47.042 [47] 5123 pet/horse/meet_new_person_horse isCreatureType:64X ← CallFunctionReturnBool ← CheckEachCondition ← CheckConditionsOther ← UpdateCheckForScenes (5128-5136), property Actor G13 estimé fort
2 7323 05:43:20.958 [6] 7322 …horse… même fonction de tête (7327) G13 estimé fort
3 7664 05:43:30.284 [561] 7663 …horse… idem (7668) G13 estimé fort
4 8123 05:43:39.284 [101] 8122 pet/meet_new_person_pet idem (8127) G13 estimé fort
5 8710 05:43:45.953 [460] 8709 …horse… idem (8714) G13 estimé fort
6 8892 05:43:49.814 [681] aucun : lignes 8886-8891 = GenerateRecs, clic carte StreetMap_Static, 2 changements de curseur (49.247-49.408) aucun Accessed None (8893 = called by, 8894 = [AI] 2 moves to art à +118 ms) non attribuée (§ 1.2) incertain

H9 (13 lignes ; 9 évaluations CHECKING: pet/horse, 9 F2 de type isCreatureType) :

# H9:ligne Horodatage [trame] CHECKING voisin Pile Attribution Statut
1 1427 02:51:44.179 [301] 1426 …horse… isCreatureType:64X (1431) G13 estimé fort
2 1896 02:51:54.530 [879] aucun property Per, getRelatedPerson:64X ← CallFunction ← ReadSceneLine ← PlayScene (1898-1907) getRelatedPerson (§ 2.3) estimé fort
3 2044 02:51:54.697 [889] aucun idem (2046-2055) getRelatedPerson estimé fort
4 3528 02:52:10.945 [845] 3527 pet/meet_new_person_pet isCreatureType (3532) G13 estimé fort
5 9869 02:56:16.249 [307] 9868 …horse… isCreatureType (9873) G13 estimé fort
6 10079 02:56:24.320 [774] 10078 …pet isCreatureType (10083) G13 estimé fort
7 12163 02:56:42.789 [845] 12162 …horse… isCreatureType (12167) G13 estimé fort
8 13913 02:56:56.061 [619] 13912 outdoors/camp (sans lien : la pile est celle de PlayScene) getRelatedPerson (13917-13924) getRelatedPerson estimé fort
9 15290 02:57:08.961 [377] 15289 …pet isCreatureType (15294) G13 estimé fort
10 18458 02:57:45.951 [508] 18457 …pet isCreatureType (18462) G13 estimé fort
11 20467 02:58:14.885 [167] aucun (20466 FlushAsyncLoading) getRelatedPerson (20471-20478) getRelatedPerson estimé fort
12 21249 02:58:24.225 [699] 21248 …pet isCreatureType (21253) G13 estimé fort
13 21438 02:58:24.862 [736] 21437 …horse… isCreatureType (21442) G13 estimé fort

J5c (13 lignes ; 13 évaluations CHECKING: pet/horse, 11 F2) : isCreatureType aux lignes 4331, 6727, 7604, 10623, 17631, 18019, 19706, 20021, 21622, 22078, 22311 (chacune précédée du CHECKING de l'une des deux scènes, fonction de tête isCreatureType:64X) ; 2 silencieuses : 34375 (22:04:21.340 [989], même milliseconde que 34374 DestroyDummy was from AddVariable, aucun Accessed None) et 34556 (22:04:32.038 [602], 100 ms après 34555 HideCursorDuringCapture Changed, True -> False, aucun Accessed None). C'est la description de STE-J5.md:43-46 (« tous… sauf 2 »).

Récapitulatif (commandes en Constats) :

Journal F2 Person_24 isCreatureType (G13) getRelatedPerson silencieuses CHECKING pet/horse
J6 6 5 0 1 5
H9 13 9 4 0 9
J5c 13 11 0 2 13

1.2 Mécanisme de G13 (établi sur dump) et lignes hors G13

Mécanisme (CRBG:1993-2028) : cas SwitchString_77.isCreatureType → CallFunction_21 (GetVariable, Name ← VariableGet_18330.ActualVariable) → then → VariableSet_23 (BoolToReturn) → IfThenElse_8994. L'entrée BoolToReturn de VariableSet_23 vient de CallFunction_27 = isCreatureType(Animal, Actor), pure (pas de broche d'exécution dans le dump), réévaluée à l'exécution de VariableSet_23 : Animal ← GetArrayItem_21.Output (ActualParameters[0], Dog / Horse) ; Actor ← GetArrayItem_2346.Output (Array ← BreakStruct_956.Person_24_…, index 0). CurrentCompanion sans compagnon : Person vide → F2 (UE KismetArrayLibrary.cpp:472-479) → Actor = None → isCreatureType lit Actor.Race (L6f:38895-38913, GI 5.5 : StartsWith(Conv_TextToString(Actor.Race), Animal, IgnoreCase)) → Accessed None … property Actor (UE ScriptCore.cpp:3213-3216), valeur remise à zéro (:3242-3245), résultat false (UE String.cpp.inl:640-645, § 6) → BoolToReturn = false. Ce n'est pas un lecteur silencieux : C1 / C2 de R-H3c-4 ne sont pas la source de ces lignes (piles).

Lignes hors G13 (non attribuées à isCreatureType) :

  • getRelatedPerson (H9 : 4 lignes ; J6 et J5c : 0) : F2 de GetArrayItem_2498 (GRP:145-150, Person_24_… -> GetArrayItem_2498.Array, Output -> VariableSet_0.Per) ; la pile cite getRelatedPerson appelée par CallFunction. Hors scènes d'animal, hors parcours J6 : § 2.3.
  • Silencieuses (J6 : 1 ; J5c : 2 ; H9 : 0), aucune pile. Éléments établis : GI seulement (« called by: GI_C ») ; lecteur de Variable.Person[0] consommé sans Accessed None ; J6:8892 tombe hors balayage CHECKING: (aucune ligne CHECKING: entre 8886 et 8892, soit ≥ 0,4 s sans balayage), précédée d'un clic carte, suivie de [AI] 2 moves to art 118 ms plus tard ; J5c:34375 suit DestroyDummy was from AddVariable ; J5c:34556 suit un changement de curseur. Candidats de R-H3c-4 : C1 (CheckConditionsWho, CCW:180-204 : GetVariable → GetArrayItem_3268 → IsValid MacroInstance_2601, Is Not Valid → VariableSet_5, Matched = false) exécuté dans le balayage : incompatible avec J6:8892 (hors balayage), non démontré pour J5c. C2 (EventGraph, événement personnalisé Sex (CustomEvent_15, CAMEG:6882), ForEachLoop_645 sur Persons → GetVariable → GetArrayItem_935 → IsValid MacroInstance_72 → Array_Add(SexPersons), CAMEG:6941-6975, 29108-29110) : exécuté au démarrage d'une scène ; compatible avec J5c:34556 (changement de mode d'entrée = interface de scène, estimé), non démontré pour J6:8892 (aucune scène visible). CAMCF compte en outre 95 lecteurs Person_24_… -> GetArrayItem_N.Array, dont 8 reliés aussi à un CallArrayFunction_N.TargetArray (G4-G10 = _8 à _14, et _3 non identifié) : attribution statique impossible pour les silencieuses (estimé, aucune pile). Non spécifié ici : § 4 Q-H3d-2.

2. Fichiers touchés, ordre

Un seul fichier : Content\BPs\GI.uasset, graphe de fonction CallFunctionReturnBool (G13 : variante a = 4 nœuds créés, 1 break_pins, 8 connect_pins ; variante b = 3 nœuds, 1 break_pins, 6 connect_pins). Ni isCreatureType, ni CheckConditionsOther, ni CheckEachCondition, ni CallFunction, ni l'EventGraph, ni le C++, ni les scènes. Ordre : après CAM B1 (autre graphe du même .uasset : IMPL successives, instantané et MD5 propres à chacune).

2.0 Préalables (dans l'ordre, avant tout create_node)

  • P1 (dumps manquants ; commandes à faire lancer, BUILD-GO de Big Boss), après la fin de CAM B1 pour décrire le GI à écrire :
    • bloquant pour la variante b seulement (corps 5.8 de isCreatureType, absent de D et des dumps CAM) : .\Tools\RunCommandlet.ps1 -Lot STE-H3d -Commandlet LPDumpFunction -Args '-BP=GI -Fn=isCreatureType -Pins -Exec' -EtatDir "D:\Game\LifePlay-master 5.8\Docs\Migration\etat\ST\STE" ;
    • recommandé pour G13 a et b (rafraîchir CRBG à l'état du GI à écrire ; le dump CRBG existant date de GI B8B97C46 ; aucune IMPL postérieure ne cite ce graphe, Grep CallFunctionReturnBool dans STE-*IMPL*.md : 2 occurrences, toutes dans STE-GARDES-IMPL.md, donc estimé inchangé) : .\Tools\RunCommandlet.ps1 -Lot STE-H3d -Commandlet LPDumpFunction -Args '-BP=GI -Fn=CallFunctionReturnBool -Pins -Exec' -EtatDir "D:\Game\LifePlay-master 5.8\Docs\Migration\etat\ST\STE" ;
    • pour G14 seulement (§ 2.3, dump GRP daté de GI 606EB437) : .\Tools\RunCommandlet.ps1 -Lot STE-H3d -Commandlet LPDumpFunction -Args '-BP=GI -Fn=getRelatedPerson -Pins -Exec' -EtatDir "D:\Game\LifePlay-master 5.8\Docs\Migration\etat\ST\STE". Arrêt sur ce site pour la variante b et G14 tant que ces dumps n'existent pas ; la variante a est exécutable sans eux (P4 relit les nœuds).
  • P2 : MD5 de GI.uasset relevé juste avant l'IMPL (HEAD : 71034a04… ; sinon valeur laissée par CAM B1) = valeur de repli.
  • P3 : gel annoncé (lp-mcp § 1.7), .\Tools\Snapshot.ps1 -Lot STE-H3d (GI.uasset), AssetTools.load_asset /Game/BPs/GI.
  • P4 : get_node_infos {nodes:[{refPath:"/Game/BPs/GI.GI:CallFunctionReturnBool.K2Node_<Nom>"}]} pour SwitchString_77, CallFunction_21, BreakStruct_956, GetArrayItem_2346, GetArrayItem_21, VariableGet_21, CallFunction_27, VariableSet_23, IfThenElse_8994 : liens = colonne « Avant » ci-dessous ; relever les indices de CallFunction_21.then (sortie, attendu 0), VariableSet_23.execute (entrée, attendu 0), BoolToReturn (entrée, attendu 1) et .then (sortie 0), CallFunction_27.Animal / .Actor / .True. Tout écart : arrêt.
  • P5 : find_node_types {graph:{refPath:"/Game/BPs/GI.GI:CallFunctionReturnBool"}, type_id_filter:"isCreatureType", context_pins:[]} (variante a) : attendu Appelerunefonction|IsCreatureType (estimé, par analogie avec Appelerunefonction|HasRelationship, GIMPL:39) ; après create_node, get_node_infos doit montrer la fonction isCreatureType de GI, pure, comme CallFunction_27, sinon arrêt et repli.

2.1 Conventions

Reprises de H3S § 2.1 (STE-H3-SPEC.md:55-70) et lp-mcp § 3 : type_id Branch = Utilitaires|ContrôleDeFlux|Branche (exécution 0 / Condition 1 ; then 0 / else 1), IsValidIndex = Utilitaires|Tableau|IsValidIndex (broches relues en 5.8 : TargetArray entrée 0, IndexToTest entrée 1, ReturnValue sortie 0, GIMPL:38 ; corrige les « Index » de H3S/H3bS), Set BoolToReturn = Variables|Pardéfaut|DéfinirBooltoReturn (le nœud créé doit porter |SetBoolToReturn, comme VariableSet_51, GIMPL:40 ; CRBG:3092). Cascades de Branch, jamais AND / OR / Select purs ; IndexToTest laissé à 0 (relu). Après le graphe : compile_blueprint en erreur sur avertissement (hyper_blueprint_debug_inspect absent du serveur, GIMPL:44-46) ; save_assets {asset_paths:["/Game/BPs/GI"]} ; fermeture de l'éditeur, UeState.ps1 = 0, MD5 relevé.

2.2 G13 — CallFunctionReturnBool, commande isCreatureType, lecture de Person[0] (J6 : 5 lignes ; H9 : 9 ; J5c : 11) — CRBG

Avant (CRBG:1993-2028 ; 591 nœuds) :

Nœud Liens
SwitchString_77 sortie isCreatureType → CallFunction_21.execute (CRBG:1994)
CallFunction_21 (GetVariable) then → VariableSet_23.execute ; Name ← VariableGet_18330.ActualVariable ; Variable → BreakStruct_956.Variable (CRBG:1993-1998)
BreakStruct_956 Person_24_4B712C904750AD4CE1580DBEBD9E7396 → GetArrayItem_2346.Array (seul lien, CRBG:2007)
GetArrayItem_2346 Array ← BreakStruct_956.Person_24_… ; Dimension 1 = '0' ; Output → CallFunction_27.Actor (seul lien, CRBG:2009-2012)
VariableGet_21 / GetArrayItem_21 ActualParameters → GetArrayItem_21.Array ; Dimension 1 = '0' ; Output → CallFunction_27.Animal (CRBG:2013-2018)
CallFunction_27 isCreatureType, pur, self vide ; Animal ← GetArrayItem_21.Output ; Actor ← GetArrayItem_2346.Output ; True → VariableSet_23.BoolToReturn (CRBG:2024-2028)
VariableSet_23 BoolToReturn ← CallFunction_27.True ; execute ← CallFunction_21.then ; then → IfThenElse_8994.execute (CRBG:2019-2023)

Après, variante a (rejeu exact) : IsValidIndex G13-I, Branch G13-B, isCreatureType (pur) G13-H, Set BoolToReturn G13-S (4 nœuds). break_pins (1) : CallFunction_21.then / VariableSet_23.execute. connect_pins (8) :

  1. CallFunction_21.then → G13-B.execute (0) ;
  2. BreakStruct_956.Person_24_4B712C904750AD4CE1580DBEBD9E7396 → G13-I.TargetArray (0) (broche générique, typée Person au câblage ; le lien vers GetArrayItem_2346.Array reste) ;
  3. G13-I.ReturnValue (0) → G13-B.Condition (1) ;
  4. G13-B.then (0) → VariableSet_23.execute (0) ;
  5. G13-B.else (1) → G13-S.execute (0) ;
  6. GetArrayItem_21.Output → G13-H.Animal (le lien vers CallFunction_27.Animal reste) ;
  7. G13-H.True → G13-S.BoolToReturn (1) ;
  8. G13-S.then (0) → IfThenElse_8994.execute. G13-H.Actor reste sans lien (défaut None, relu) ; G13-H.self vide ; G13-I.IndexToTest = 0 (relu, ne le poser que s'il diffère). Aucun set_pin_value. get_node_infos final de G13-I, G13-B, G13-H, G13-S et des 9 nœuds de P4 : liens = « Après » ; CallFunctionReturnBool = 595 nœuds.

Comportement (a) : aujourd'hui, Person vide → F2, Actor = None, isCreatureType lève Accessed None … property Actor et rend false, BoolToReturn = false. Après : IsValidIndex faux (sans message, UE KismetArrayLibrary.cpp:583-593) → else → G13-H évalué par G13-S avec Actor = None (valeur rendue par Array_Get hors limites = défaut, :479) → même appel, même argument, même résultat, même Accessed None, sans la F2. Person à ≥ 1 élément (y compris un élément None, qui ne lève pas de F2 aujourd'hui) : then → VariableSet_23, chemin d'origine inchangé. Identique (établi par construction ; les lignes property Actor de J6 (5) subsistent).

Variante b (valeur neutre, 3 nœuds : G13-I, G13-B, G13-S) : mêmes liens 1 à 5 ; G13-S.BoolToReturn laissé à false (relu) ; G13-S.then → IfThenElse_8994.execute ; pas de G13-H, pas de lien 6-7 ; connect_pins (6) ; 594 nœuds. Supprime en plus les Accessed None … property Actor (J6 : 5, H9 : 9, J5c : 11). Identique si isCreatureType(None, Animal) rend false : établi sur le corps 5.5 (L6f:38895-38913 + UE ScriptCore.cpp:3242-3245 + String.cpp.inl:640-645 : source vide, InPrefixLen > 0 && Strnicmp faux ; préfixe vide → faux aussi), à confirmer sur le corps 5.8 par le dump isCreatureType de P1. Sans ce dump : variante a. Les deux variantes ne diffèrent que par les lignes Accessed None (Q-H3d-1).

Arrêts de G13 (rapport, pas de correctif) : P4 montre un lien différent ; GetArrayItem_2346 a un autre consommateur que CallFunction_27.Actor ; CallFunction_27 n'est pas pur ; type_id d'isCreatureType introuvable (P5) ; compile_blueprint ou relecture en écart. delete_node interdit.

2.3 G14 — getRelatedPerson (H9 : 4 lignes ; J6 : 0 ; J5c : 0) — non spécifiée : dump périmé, hors parcours J6

Structure établie sur GRP (GI 606EB437, avant G1-G12) : entrée → MacroInstance_0 (IsValid sur OptionalPerson) ; Is Not Valid → CallFunction_25390 (GetVariable(Person)) → then → VariableSet_0 (Per) ← GetArrayItem_2498.Output (F2) → VariableSet_6264 (Slot = Prefix + Conv_IntToString(SaveSlot), tous deux lus sur Per, GRP:151-169 : 2 Accessed None … Per si None) ; Is Valid → VariableSet_1 → VariableSet_6264. Garde de forme G7/G11 : IsValidIndex(BreakStruct_830.Person_24_…, 0) + Branch entre CallFunction_25390.then et VariableSet_0.execute ; chemin vide à rejouer = Per = None, puis Slot = "0" (clé "0", Prefix lu "", SaveSlot lu 0, H3bS § 2.1, établi). Non spécifiée : le dump est antérieur à six IMPL sur GI, l'effet de Slot = "0" en aval (Array_Contains sur NpcRelationships) n'est pas relu en 5.8, et aucune ligne de J6 ne la justifie. Fiche de suite si l'utilisateur la veut (Q-H3d-3) : dump getRelatedPerson (P1), puis SPEC.

2.4 C1 / C2 (R-H3c-4) — tranchés

Non retenus : leurs lecteurs sont silencieux et ne sont pas la source des lignes à pile (§ 1.2). Aucune garde spécifiée (pas de preuve qu'ils émettent la ligne silencieuse de J6). Les dumps existent (CCW, CAMEG) si une fiche de suite les reprend.

3. Repli

  • Avant écriture : instantané .\Tools\Snapshot.ps1 -Lot STE-H3d (P3), MD5 de départ relevé (P2).
  • Échec de compilation, diagnostic, type_id introuvable (P5) ou lien relu différent : arrêt, .\Tools\Restore.ps1 -Lot STE-H3d éditeur fermé (GI entier), contrôle MD5 = valeur de P2. Attention : un Restore de GI défait aussi toute écriture de CAM B1 faite entre P3 et le repli (IMPL successives, jamais entrelacées).
  • Après commit (gardien) : git revert du commit du ticket STE-H3d (indépendant de ceux de H3, H3b, H3c, H10).

4. Risques R#, questions Q#

  • R-H3d-1 : attribution F2 → isCreatureType estimée forte (F2 sans pile ; paire F2 + Accessed None à pile, mêmes lignes consécutives et même milliseconde ; un seul chemin de données vers Actor, CRBG:2012 ; 5 CHECKING pet/horse = 5 F2 en J6, 9 = 9 en H9, 13 → 11 en J5c). La VAL tranche (§ 7).
  • R-H3d-2 : nœuds lus sur CRBG (GI B8B97C46, 2026-10-10 17:42), HEAD = 71034A04 ; aucune IMPL postérieure ne cite le graphe (estimé) ; P1 (dump neuf) et P4 tranchent.
  • R-H3d-3 : type_id d'isCreatureType estimé (P5) ; échec → arrêt et repli.
  • R-H3d-4 : G13 couvre aussi toute autre évaluation d'isCreatureType dans CRBG (un seul appel, CallFunction_27) sur une variable à Person vide : même effet (F2 supprimée, résultat identique). Les scènes de bestialité (Actor.isCreatureType(...), Grep : 59 fichiers) passent par le même cas ; aucune ne figure dans J5c / H9 / J6.
  • R-H3d-5 : masquage nul : le chemin vide rejoue (a) ou donne (b) le résultat false que l'exécution produit déjà ; IfThenElse_8994 et la suite sont inchangés.
  • R-H3d-6 : le critère de la fiche (Person_24 = 0 en J6) ne peut pas être tenu par G13 : 1 ligne silencieuse non attribuée (§ 1.2). Attendu honnête : J6 = 1 (ou 0 si la ligne est absente du nouveau parcours : elle suit un clic carte).
  • Q-H3d-1 (utilisateur) : variante a (rejeu exact, F2 supprimée, Accessed None … Actor conservés, 4 nœuds), b (BoolToReturn = false, F2 et Accessed None supprimés, 3 nœuds, identique si le dump 5.8 confirme le corps de isCreatureType) ou c (pas de garde). Recommandation : b après le dump, a sinon (conforme à Q1 = A dans les deux cas ; b plus simple).
  • Q-H3d-2 (utilisateur / orchestrateur) : lignes silencieuses (J6 : 1, J5c : 2) — accepter le reste (1 ligne par parcours, aucun Accessed None associé) ou ouvrir un DIAG dédié (instrumentation, hors lecture seule). Recommandation : accepter ; Q-H3c-2 (« seulement si un reste ») est satisfaite pour isCreatureType, pas démontrée pour C1 / C2.
  • Q-H3d-3 (utilisateur) : G14 (getRelatedPerson, 4 lignes en H9 seulement) : fiche de suite avec dump, ou abstention. Recommandation : abstention tant qu'aucun journal de parcours récent (J6) ne la montre.
  • Q-H3d-4 (orchestrateur) : lancer P1 (BUILD-GO) après CAM B1 : 1 dump (isCreatureType) pour la variante b, 1 dump (CallFunctionReturnBool) de rafraîchissement.

5. Interdits

  • Aucune modification d'isCreatureType, de CheckConditionsOther, CheckEachCondition, CallFunction, getRelatedPerson, de l'EventGraph, des scènes (.lpscene), du C++.
  • Aucun nœud AND / OR / Select pur, aucun FunctionResult créé, aucun delete_node. Pas d'IMPL sans P2 à P5. Pas d'écriture HyperAIStudio (lp-mcp § 1.1) ; outils Epic seulement.
  • Pas de commit par l'agent : ticket au gardien (lp-repo). IMPL non entrelacée avec CAM B1.

6. Valeurs moteur lues dans le moteur installé (UE = D:\Game\Launcher\Engine\UE_5.8\Engine\Source\)

  • GenericArray_Get, index invalide : message « Attempted to access index %d from array '%s' of length %d in '%s'! » (nom de la propriété tableau, longueur, chemin du propriétaire, ici la structure Variable), puis élément remis au défaut : Runtime\Engine\Private\KismetArrayLibrary.cpp:459-482 (message l. 472-478, ResetToDefault l. 479).
  • GenericArray_IsValidIndex : test sans message : Runtime\Engine\Private\KismetArrayLibrary.cpp:583-593.
  • « Accessed None trying to read (real) property X in not an UClass » (propriété propriétaire non classe : ici le paramètre Actor d'une fonction) : Runtime\CoreUObject\Private\UObject\ScriptCore.cpp:3213-3216 ; contexte nul : expression sautée et valeur rendue effacée par ClearValue : :3234-3245.
  • Cadre d'une fonction script mis à zéro à chaque appel (fonction, pas l'ubergraph persistant) : ScriptCore.cpp:984-993.
  • FString::StartsWith(prefix, len, case) : InPrefixLen > 0 && !Strnicmp(**this, InPrefix, InPrefixLen) en IgnoreCase : Runtime\Core\Private\Containers\String.cpp.inl:640-650 (source vide : faux ; préfixe vide : faux).

7. Critères de VAL (commande → attendu)

  1. Dump après IMPL : .\Tools\RunCommandlet.ps1 -Lot STE-H3d -Commandlet LPDumpFunction -Args '-BP=GI -Fn=CallFunctionReturnBool -Pins -Exec' → 595 nœuds (variante a) ou 594 (b), contre 591 (P1/CRBG) ; liens du § 2.2 relus ; python Tools\DiffRemplacementNoeuds.py <avant> <après> <profil> sans autre écart.
  2. compile_blueprint 0 diagnostic ; CompileAllBlueprints éditeur fermé : BP /Game/ du projet 0 erreur (critère requalifié par l'utilisateur le 2026-10-13, CC_Shaders à part) ; LPTestStringCompat 3120 / 0 / 60 (lp-validate).
  3. Journal d'un build Development, parcours comparable à J6 (même séquence : au moins 5 CHECKING: pet/horse), Grep en mode count :
    • Person_24_.*of length 0 → ≤ 1 (J6 : 6 ; attendu 1 si la ligne silencieuse revient, 0 sinon ; plus aucune ligne suivie d'une pile isCreatureType) ;
    • multiligne of length 0[^\n]*\r?\n[^\n]*called by[^\n]*\r?\n[^\n]*property Actor in not an UClass → 0 (J6 : 5) ;
    • isCreatureType:64X (piles) → variante a : égal au nombre de CHECKING: pet/horse sans compagnon (J6 : 5) ; variante b : 0 ;
    • non-régression : CHECKING: .*pet/(horse/)?meet_new_person ≥ 1 (J6 : 5) ; index SPAWN > 0 ; hours by [1-9] ≥ 1 ; \[AI\] \d+ moves to ≥ 1 ; dénominateur CHECKING: relevé ;
    • inchangés : property Per in (J6 : 0), CallFunc_Array_Get_Item_41 (0), fatal / Unhandled / Critical / Assertion (0) ; information : LogScript: Warning: Accessed None (J6 : 9 ; attendu 4 en variante b, 9 en a).
  4. & .\Tools\LogStats.ps1 -Compare <journal>,<J6> : aucune famille nouvelle.
  5. Preuve facultative du chemin « avec compagnon » (inchangé par construction) : un parcours avec un animal de compagnie, la scène meet_new_person_* peut démarrer (CHECKING: suivi de SPAWN ou de la scène) ; non obligatoire (le chemin then est le chemin d'origine).

Fichiers à commiter (dépôt jeu, branche ue5.8, ticket au gardien) :

  • A Docs/Migration/etat/ST/STE/STE-H3d-SPEC.md

Tours : 26 / 60

Constats

Commandes (outil Grep / Read sauf mention) et comptes bruts :

  • C1 Person_24_.*of length 0 (count) : J6 → 6 ; H9 → 13 ; J5c → 13 (liste -B1 -A4, § 1.1).
  • C2 J6, isCreatureType:|getRelatedPerson:|property Per in (content) → 6 lignes : 5 fonctions de tête Function /Game/BPs/GI.GI_C:isCreatureType:64X (J6:5128, 7327, 7668, 8127, 8714) + 1 résumé LogLifePlay (J6:9884, « 5 … property Actor … isCreatureType ») ; J6, LogScript: Warning: Accessed None (count) → 9.
  • C3 CHECKING: .*pet/(horse/)?meet_new_person (count) : J6 5 ; H9 9 ; J5c 13.
  • C4 Bash md5sum : H9 596fbe9a0d23f32d8ffbc5987f617d51, J5c 43db15231d9d64dc152a7d5d41bfbd3d, GI.uasset 71034a04c6d64e1a806ca0dadc934fb9 ; git log --oneline -3 -- Content/BPs/GI.uasset → b3ee785, 7bceea6, 4283c13.
  • C5 CurrentCompanion\.isCreatureType (count, glob *.lpscene, Content\Modules) → 2 fichiers, 1 occurrence chacun (meet_new_person_pet.lpscene, meet_new_person_horse.lpscene, ligne 5). \.isCreatureType\( (files_with_matches) → 59 fichiers.
  • C6 CRBG : === GI :: CallFunctionReturnBool (591 noeuds) === (CRBG:120) ; K2Node_CallFunction_98, VariableSet_51, CallArrayFunction_4, CallFunction_99 présents (G11, CRBG:3087-3107) ; lien Person_24 -> GetArrayItem_2346.Array CRBG:2007, Output -> CallFunction_27.Actor CRBG:2012.
  • C7 L6f : isCreatureType → 2 occurrences (appel L6f:22445, fonction L6f:38895-38913 : Race de Actor → Conv_TextToString → StartsWith(…, Animal, IgnoreCase) → True).
  • C8 CHECKING du 05:43:49 en J6 (count) → 15 (toutes avant la ligne 8886) ; aucune ligne CHECKING: entre J6:8886 et 8892 (lecture).
  • C9 CAMCF Person_24_… -> K2Node_GetArrayItem_\d+\.Array (count) → 95 ; avec , K2Node_CallArrayFunction_\d+\.TargetArray (count) → 8 ; Glob CAM-B1-PRE_LPDumpFunction_* → 2 dumps .txt (EventGraph 08:31:52, CallFunction 08:32:50, code 0) + 2 .log sous Saved\Logs\portage\.
  • C10 Dumps D récents consultés : GI__AddVariable_V5.txt:48 (G12 présente : CallArrayFunction_1.TargetArray), GI__destroyDummy_V6.txt (aucun lecteur Person_24). Piles complètes lues : J6:5128-5136, H9 pour les 9 cas isCreatureType et les 4 cas getRelatedPerson ; pour J6 (4 autres cas) et J5c (11 cas) seule la fonction de tête isCreatureType:64X est lue (-A4).
  • Écarts de méthode : un Bash (md5sum, git log) ; un Grep de dossier sur etat\…\dumps sans résultat (dossier ignoré par git, sk-protocol § 7) repris par chemins de fichiers ; une regex avec anticipation négative refusée par rg (reprise sans). Aucun commandlet, MCP ni éditeur.

Décisions de l'utilisateur (2026-10-13)

  • Q-H3d-1 : variante b (BoolToReturn = false sans compagnon, 3 nœuds), sous réserve du dump 5.8 de isCreatureType (P1) qui doit confirmer le corps ; si le dump l'infirme : arrêt et retour à l'utilisateur.
  • Q-H3d-2 : ouvrir un DIAG sur les lignes silencieuses restantes (fiche STE-H3e, instrumentation, build et session de jeu).
  • Q-H3d-3 : abstention sur G14 (getRelatedPerson).
  • SPEC approuvée pour la variante b ; IMPL après CAM B1 et les dumps P1 (BUILD-GO de Big Boss).
  • P1 fait (2026-10-13 09:09-09:12, BUILD-GO de Big Boss, orchestrateur) sur GI 6A957CB2 (CAM B1 non commité ; refaire si B1 est modifié ou replié) : dumps\GI__isCreatureType_P1.txt (5 nœuds : Actor.Race → Conv_TextToString → StartsWith(Animal, IgnoreCase) → True) et dumps\GI__CallFunctionReturnBool_P1.txt (591 nœuds, comme le dump d'avant). Réserve de Q-H3d-1 levée : avec Actor nul, Race lu par défaut (texte vide, Accessed None), StartsWith("", "Dog" | "Horse") = false → la variante b rend la même valeur sans lecture ; MD5 de GI identique avant / après ; 0 éditeur (le jeu CAM-B1 de l'utilisateur tournait, hors copie).