28 KiB
Fiche STE-H3c — Niveau N3 — Modèle prévu (modèle de l'agent lp-cart) | utilisé claude-opus-5-5 — Agent lp-cart — Skills sk-protocol, ue-cpp-build, lp-commandlets, lp-paths (préchargés), lp-doc (gabarits)
STE-H3c-SPEC : lectures Person[0] restantes (232 F2 de J3) : garde G12 dans AddVariable (2026-10-10)
Lecture seule stricte (aucun éditeur, commandlet, build ni écriture hors de ce fichier). Copie D:\Game\LifePlay-master 5.8,
branche ue5.8. Gabarit SPEC : D:\Game\LifePlay-master 5.8\.claude\skills\lp-doc\gabarits.md:36-38. Suite de STE-H3-SPEC.md
(G1-G6) et STE-H3b-SPEC.md (G7-G11) : mêmes conventions (H3S § 2.1), gardes G12 et suivantes, risques et questions
préfixés H3c (la SPEC STE-H5b, écrite en parallèle, numérote déjà ses R1-R10 et Q-H5b-1).
Statut : partiel. Les 232 lignes sont attribuées (une seule source, estimé fort) ; la garde G12 est spécifiée sur le
graphe de données 5.5 mais son câblage d'exécution est à compléter : le dump 5.8 d'AddVariable avec broches
d'exécution n'existe pas (commande en P1). Cas B (STE-H5b) : aucune des 232 lignes n'a pour cause l'absence d'AI (§ 1.2).
Abréviations (chemins absolus) :
- J3 = copie de lecture
%USERPROFILE%\AppData\Local\Temp\claude\D--Game-LifePlay-master-5-8\37530d8d-c780-4a57-8fbd-bcb010aa6408\scratchpad\J3_LifePlay.logdeD:\Game\LifePlay_Build_5.8_STF-STE-LISIB_Development\Windows\LifePlay\Saved\Logs\LifePlay.log(MD5 des deuxd029de50ffd694b0b7079f82a9ed463f,md5sum, identiques ;STE-VAL.md:351: D029DE50…) ; - D =
D:\Game\LifePlay-master 5.8\Docs\Migration\etat\ST\STE\dumps\; CFG = DGI__CallFunction_apres-GARDES.txt; CRBG = DGI__CallFunctionReturnBool_apres-GARDES.txt; RSL = DGI__ReadSceneLine.txt; CCW = DGI__CheckConditionsWho.txt; EG = DGI__EventGraph_apres-GARDES.txt; - L6f =
D:\Game\LifePlay-master 5.8\Docs\Migration\etat\portage55\L6f\L6f_dump_GI.txt(GI 5.5,-Fn=* -Pins, sans broches d'exécution, d'aprèsSTE-H5b-SPEC.md:12-13) ; - AI =
D:\Game\LifePlay-master 5.8\Content\Modules\vin_Base\AI\; H3S, H3bS, H5D, H5bS =STE-H3-SPEC.md,STE-H3b-SPEC.md,STE-H5-DIAG.md,STE-H5b-SPEC.md(dossierD:\Game\LifePlay-master 5.8\Docs\Migration\etat\ST\STE\) ; - 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" → b8b97c46b825a6af942baabd5bf74c56 ;
git status --short -- Content/BPs/GI.uasset vide ; dernier commit du fichier 5c55db4 (STE-R5). Les dumps *_apres-GARDES
décrivent cet état (STE-VAL.md:352, H5bS:10-11).
1. Objectif mesurable
Supprimer, sans changer ce que le jeu fait, les 232 lignes Script Msg: Attempted to access index 0 from array 'Person_24_4B712C904750AD4CE1580DBEBD9E7396' of length 0 in '/Game/Structs/Variable.Variable'! de J3 (F2 sans pile :
« called by: GI_C »). Attendu après G12, à parcours comparable : 0 (normalisé par CHECKING:, J3 : 232 / 5 490).
1.1 Attribution des 232 lignes (source unique : GI.AddVariable, remplacement d'une variable existante)
Mécanisme (L6f:10070-10273, GI 5.5, données seulement) : AddVariable parcourt Variables (MacroInstance_2707, L6f:10098-10101),
compare le nom (EqualEqual_StriStri CallFunction_34376 → IfThenElse_3951, L6f:10112-10118) et, pour l'entrée de même
nom, lit Person[0] de l'ancienne valeur : GetArrayItem_2453, Array ← BreakStruct_1527.Person_24_…, index 0
(L6f:10102-10110, 10164-10167). Sortie vers une macro à broche InputObject (MacroInstance_1960, IsValid estimé), SaveSlot,
bHidden, SavedClothes, PersonsUsedThisScene.RemoveItem, == PlayerCharacter, == nouvelle personne, destroyDummy
(L6f:10167-10273) ; puis Array_Set (remplacement, L6f:10119-10124) ou Array_Add (ajout). La branche est vivante en 5.8 :
3 « DestroyDummy was from AddVariable » dans J3 (J3:8404, 19889, 20264).
Quand l'ancienne valeur a un tableau Person vide, la lecture lève F2 et rend None (UE, § 6), lu ensuite sans
« Accessed None » (multiligne F2 → called by → Accessed None sur J3 : 0) : lecture silencieuse, conforme à une
première consommation par IsValid.
Qui écrit des variables à Person vide : 19 nœuds MakeArray sans élément câblés sur une entrée Person dans CFG
(Grep multiligne C11), dont ceux des sites AddVariable des commandes de routine : getActorVar CallFunction_143 ←
MakeArray_94 (CFG:4828-4839, 4849-4850), getBuilding _180 ← MakeArray_139 (CFG:5373-5383, 5393-5394), getBuildingType
_183 ← MakeArray_138 (CFG:5429-5439, 5450-5451), findNearbyBuilding _199 ← MakeArray_142 (CFG:5652-5662, 5672-5673).
Aucun dans RSL, CRBG, EG, CCW. L'affectation composée de RSL (+=, -=… → AddVariable CallFunction_1435, RSL:511-527)
passe un MakeArray_92 non vide.
| Groupe (J3) | Lignes | Statut | Empreinte |
|---|---|---|---|
Image (frame) d'une routine d'IA aboutie (même numéro d'image qu'une ligne [AI] N moves to) |
121 | estimé fort | voir ci-dessous |
| Autres images | 111 | estimé | même mécanisme pour les routines arrêtées avant setCurrentLocation ; résidu possible, R-H3c-4 |
| Total | 232 | établi (C2) |
Comptage 121 / 111 : manuel, image par image, sur la liste de 322 lignes de C3 (232 F2, 46 moves to, 44 hours by) ;
recoupé par deux sous-comptes rejouables : F2 juste avant [AI] N moves to = 37 (C5) ; F2 juste après hours by N = 24 (C6).
Empreintes (rejouables sur J3) :
work_office.lpai(AI\high_priority\work_office.lpai:8-25) :Today = AI.getActorVar(…),Work = AI.getBuilding(work),Type = Work.getBuildingType()(3 remplacements àPersonvide),AI.setCurrentLocation(Work)(« moves to work »), puisLunch,Add,Until(affectations par expression : rien),AI.setUntil(« by »),Today = Today + Add(1 remplacement). J3 : 3 F2 avant, 1 après pour les 7 « moves to work » complets (J3:5697-5705, 8391-8399, 9584-9592, 11980-11988, 16436-16444, 32075-32083, 32183-32191).meal.lpai(destinationrestaurant) se termine par deuxAI.setActorVar(meal.lpai:55-56), sansAddVariable(siteCallFunction_162, CFG:4873-4889) : 0 F2 après « by » pour les 8 « moves to restaurant » (J3:9771, 10102, 17004, 17032, 17047, 18695, 20542, 21103) ; avant, 2 à 6 F2 selon les variables déjà présentes.- Ordre temporel : la F2 qui suit la recherche lente
findNearbyBuilding(≈ 25 ms) tombe après elle, avantmoves to(ex. J3:20538:475→ 20540:500→ 20542:501) : c'est l'AddVariable_199deDest = Current.findNearbyBuilding(…). - Première routine de la partie, sans variable antérieure (J3:2663 « 1 moves to home ») : 0 F2 ; écarte une émission à
la création (et une émission par
GetVariabledu paramètreHome/DestdesetCurrentLocation,CallFunction_186, H3S:114-116). random/coffee/entertainment:Today += 1après « by » (affectation composée remplaçant unTodayécrit pargetActorVar) : 1 F2 après « by » (ex. J3:5190, 6880, 12523). Exemples d'« autres images » : 13 F2 sur les images 245-271 sans aucunmoves to(J3:23276-23300), boucle d'un PNJ qui parcourt ses.lpaisans aboutir (condition fausse ou cas B) ; F2 isolées entre deuxCHECKING:(ex. J3:10466).
1.2 Cas B (variable AI absente, STE-H5b) : 0 ligne à transférer
- Tous les sites qui lisent
AIdans les commandes des.lpaisont gardés parIsValidIndex(G3-G11, CHG-313/314,D:\Game\LifePlay-master 5.8\Docs\Journal_Modifications.md:1136-1137), silencieux sur tableau vide (UE, § 6) :AIabsente n'y produit plus de F2. - Le seul lecteur non gardé connu,
getRelatedPerson(R13 de H3bS), laisse 2property Peraprès sa F2 : 0 dans J3 (liste-odesAccessed None … property X, C10 : aucunePer). - La lecture d'
AddVariablene dépend pas d'AI: elle dépend de l'ancienne valeur de la variable écrite (Today,Current,Dest,Work,Type…). Une partie non mesurable des 111 « autres » est émise pendant des suites de routines en cas B (muettes en J3 depuis G4/G5,H5bS:210), sans en être causée : STE-H5b en réduira le nombre (routines abouties plus tôt, moins de.lpaipar PNJ ;H5bS:268attend un rapport F2 /CHECKING:≤ 0,042), sans supprimer le mécanisme. G12 le supprime.
2. Fichiers touchés, ordre
Un seul fichier : Content\BPs\GI.uasset, graphe de fonction AddVariable (2 nœuds créés, 1 break_pins, 5 connect_pins
attendus). Ni CallFunction, ni ReadSceneLine, ni l'EventGraph, ni les MakeArray, ni le C++, ni le contenu des modules.
Ordre : G12 est indépendante de STE-H5b (qui insère un appel AddVariable('AI') dans l'EventGraph, H5bS:110) ; les deux
écrivent GI.uasset : IMPL successives, instantané et MD5 propres à chacune (P2). L'appel ajouté par H5b passe par G12 :
ancienne valeur [AIDummy] (longueur 1), donc chemin then, sans effet.
2.0 Préalables (dans l'ordre, avant tout create_node)
- P1 (bloquant, à compléter) : dump 5.8 avec broches d'exécution, même commande que P3 de H5b (
H5bS:6-7) :.\Tools\RunCommandlet.ps1 -Lot STE-D -Commandlet LPDumpFunction -Args '-BP=GI -Fn=AddVariable -Pins -Exec', copié endumps\GI__AddVariable_D4.txt. Puis remplir le tableau du § 2.2 (colonnes « 5.8 »). Sans P1 : arrêt sur G12, aucune improvisation. - P2 : MD5 de
GI.uasset=b8b97c46…(ou la valeur relevée à la fin de l'IMPL H5b) ; sinon refaire P1. - P3 : gel annoncé (lp-mcp § 1.7),
.\Tools\Snapshot.ps1 -Lot STE-H3c(GI.uasset),AssetTools.load_asset/Game/BPs/GI. - P4 :
get_node_infos {nodes:[{refPath:"/Game/BPs/GI.GI:AddVariable.K2Node_<Nom>"}]}pour chaque nœud existant cité ; liens = P1, sinon arrêt.
2.1 Conventions
Reprises de H3S § 2.1 (H3S:55-70) : type_id IsValidIndex = Utilitaires|Tableau|IsValidIndex, Branch =
Utilitaires|ContrôleDeFlux|Branche ; Branch entrée exécution 0 / Condition 1, sorties then 0 / else 1 ; IsValidIndex
TargetArray (entrée 1 attendue), Index (entrée 2, laissé à 0, relu), ReturnValue (sortie 0) relus par get_node_infos ;
après le graphe : compile_blueprint + hyper_blueprint_debug_inspect {blueprintAssetPath:"/Game/BPs/GI.GI", graphName:"AddVariable"}
= 0 diagnostic ; save_assets {asset_paths:["/Game/BPs/GI"]}.
2.2 G12 — AddVariable, lecture de Person[0] de l'ancienne valeur (232 F2 de J3) — modèle G7 / G8
| Rôle | 5.5 (L6f) | 5.8 (P1, à compléter) |
|---|---|---|
Élément de la boucle sur Variables |
BreakStruct_1527 (L6f:10102-10111) |
|
| Test du nom, sortie vraie = X | IfThenElse_3951.then (L6f:10117-10118 ; broche d'exécution non dumpée en 5.5) |
|
| Lecture fautive | GetArrayItem_2453, Array ← BreakStruct_1527.Person_24_…, Dimension 1 = '0' (L6f:10164-10167) |
|
| Premier consommateur exécuté de la sortie = M | MacroInstance_1960.InputObject (L6f:10168-10169), macro IsValid estimée |
|
| Entrée d'exécution de M ← source S | à lire (attendu : IfThenElse_3951.then ou un nœud qui le suit) |
|
Cible(s) de Is Not Valid = Y |
à lire |
Après (à exécuter une fois le tableau rempli) : IsValidIndex G12-I, Branch G12-B ; break_pins (S.<sortie>, M.exec) ;
connect_pins (5) : 1. S.<sortie> → G12-B.execute (0) ; 2. BreakStruct_<5.8>.Person_24_4B712C904750AD4CE1580DBEBD9E7396 →
G12-I.TargetArray ; 3. G12-I.ReturnValue → G12-B.Condition (1) ; 4. G12-B.then (0) → M.exec ; 5. G12-B.else (1) →
chaque cible de Y (rien si Is Not Valid (vide)). G12-I.Index = 0 (relu).
Comportement : aujourd'hui, ancienne valeur à Person vide → F2, sortie remise au défaut (None) → IsValid faux → Is Not Valid → Y. Après : IsValidIndex faux, sans message → else → Y. Identique (estimé fort ; établi si P1 montre que M
est la macro IsValid et qu'aucun autre consommateur de la sortie ne s'exécute hors de sa branche Is Valid). Ancienne
valeur avec une personne : then → M, chemin d'origine inchangé (y compris destroyDummy).
Arrêts de G12 (rapport, pas de correctif) : M n'est pas un IsValid ; la sortie de la lecture alimente un nœud exécuté hors de
Is Valid ; plusieurs lectures Person_24_…[0] dans le graphe 5.8 (chacune demande sa ligne de tableau) ; nœuds 5.8 sans
correspondance avec L6f.
2.2 bis G12 — nœuds 5.8 relus sur le dump STE-D5 — complément A-CART pour l'orchestrateur LOT STE (2026-10-10)
Auteur : agent lp-cart (A-CART), claude-opus-5-5, skills sk-protocol, ue-cpp-build, lp-commandlets, lp-paths ; lecture
seule, seuls ce fichier et STE-H5b-SPEC.md écrits. Dump AV = D:\Game\LifePlay-master 5.8\Docs\Migration\etat\ST\STE\dumps\GI__AddVariable_D5.txt
(-BP=GI -Fn=AddVariable -Pins -Exec, lot STE-D5, 20:51:17, code 0, 49 nœuds, AV:120 ; AV:367-416 = écho tronqué du même
dump). GI.uasset non modifié depuis 17:33:20 (stat -c '%y %s'), MD5 b8b97c46…, git status vide : AV décrit l'état
actuel (établi). P1 est fait (fichier _D5, lot STE-D5, au lieu de _D4 / STE-D). Les nœuds cités par le § 2.2
portent dans AV les noms de L6f (R-H3c-1 levé pour ce graphe).
| Rôle | 5.5 (L6f) | 5.8 (AV, établi) |
|---|---|---|
Élément de la boucle sur Variables |
BreakStruct_1527 |
K2Node_BreakStruct_1527 : Variable ← MacroInstance_2707.Array Element ; Person_24_… → GetArrayItem_2453.Array (AV:159-168) |
| Test du nom, sortie vraie = X | IfThenElse_3951.then |
K2Node_IfThenElse_3951 : execute ← MacroInstance_2707.LoopBody ; Condition ← CallFunction_34376.ReturnValue (EqualEqual_StriStri) ; then → MacroInstance_1960.exec ; else (vide) (AV:174-178) |
| Lecture fautive | GetArrayItem_2453 |
K2Node_GetArrayItem_2453 : Array ← BreakStruct_1527.Person_24_…, Dimension 1 = '0', Output → 8 entrées (AV:238-241) |
| Premier consommateur exécuté = M | MacroInstance_1960, IsValid estimée |
K2Node_MacroInstance_1960, macro 'IsValid' (AV:242) : exec ← IfThenElse_3951.then (seul lien) ; InputObject ← GetArrayItem_2453.Output ; Is Valid → IfThenElse_4367.execute ; Is Not Valid → CallArrayFunction_4346.execute (AV:243-246) |
| Entrée d'exécution de M ← source S | à lire | IfThenElse_3951.then (sortie 0) |
Cible de Is Not Valid = Y |
à lire | K2Node_CallArrayFunction_4346 = Array_Set(Variables, MacroInstance_2707.Array Index, MakeStruct_614) ; execute ← MacroInstance_1960.Is Not Valid, IfThenElse_4367.else, IfThenElse_4819.then, CallFunction_606.then ; then → VariableSet_3566 (Replaced = true) → Knot_488 → MacroInstance_2707.Break (AV:179-186, 201-205, 215-217) |
MacroInstance_1960 = IsValid : estimation confirmée (AV:85, 242).
Arrêts du § 2.2, contrôlés sur AV :
- M est un IsValid : oui.
- Consommateurs de
GetArrayItem_2453.Output(AV:241) :MacroInstance_1960.InputObject;VariableGet_19165.self(SaveSlot→CallFunction_27614→IfThenElse_4367.Condition) ;VariableGet_142.self(bHidden→Not),CallFunction_24845.A(== PlayerCharacter),CallFunction_1.A(==nouvelle),VariableGet_1.self(SavedClothes→Length > 0), tous versBooleanOR_236→IfThenElse_4819.Condition;CallArrayFunction_5493.Item;CallFunction_0.Dummy. Les nœuds exécutés qui les lisent sontIfThenElse_4367(execute←Is Validseul, AV:256),IfThenElse_4819(←IfThenElse_4367.thenseul, AV:279),CallArrayFunction_5493etCallFunction_0(chaîneIfThenElse_4819.else→CallFunction_2→5493→0, AV:264, 298, 313) : tous sousIs Valid(établi). - Une seule lecture d'un élément de
Variables:Person_24_… -> K2Node_GetArrayItem_2453.Array(AV:167) ; les deux autresGetArrayItemlisent des paramètres (GetArrayItem_0←Person,GetArrayItem_8856←Float, AV:230-231, 303-304), hors G12. - Correspondance avec L6f : complète. G12 est exécutable.
Câblage exact (outils Epic, un appel à la fois ; refPath /Game/BPs/GI.GI:AddVariable.K2Node_<Nom>), après P2 et P3 :
- P4 :
get_node_infosdeIfThenElse_3951,MacroInstance_1960,BreakStruct_1527,GetArrayItem_2453,CallArrayFunction_4346: liens = tableau ci-dessus ; relever les indices deMacroInstance_1960.exec(entrée, attendu 0), deBreakStruct_1527.Person_24_…(sortie) et deCallArrayFunction_4346.execute(entrée, attendu 0). create_node {graph:{refPath:"/Game/BPs/GI.GI:AddVariable"}, type_id:"Utilitaires|Tableau|IsValidIndex", pos:{x,y}}→ G12-I ;get_node_infos: entréesTargetArray0 etIndexToTest1 (=0), sortieReturnValue0, valeurs relevées en 5.8 surCallArrayFunction_8à_14(GIMPL =STE-GARDES-IMPL.md:38 ; CFG:7619-7623). Correction du § 2.1 : la broche s'appelleIndexToTest(indice 1), pasIndex(2), etTargetArraya l'indice 0.create_nodetype_id:"Utilitaires|ContrôleDeFlux|Branche"→ G12-B (entréesexecute0,Condition1 ; sortiesthen0,else1, lp-mcp § 3).break_pins:IfThenElse_3951.then(sortie 0) /MacroInstance_1960.exec(entrée, indice relu en 1).connect_pins:IfThenElse_3951.then(0) →G12-B.execute(0).connect_pins:BreakStruct_1527.Person_24_4B712C904750AD4CE1580DBEBD9E7396→G12-I.TargetArray(0) ; broche générique, typéePersonau câblage (H3S:65-66) ; le lien versGetArrayItem_2453.Arrayreste.connect_pins:G12-I.ReturnValue(0) →G12-B.Condition(1).connect_pins:G12-B.then(0) →MacroInstance_1960.exec.connect_pins:G12-B.else(1) →CallArrayFunction_4346.execute(5e lien entrant ; une entrée d'exécution en accepte plusieurs, H3bS:78-79).- Relire
G12-I.IndexToTest=0(ne le poser que s'il diffère). get_node_infosde G12-I, G12-B et des 5 nœuds de l'étape 1 : liens = « Après ».compile_blueprintavertissements en erreurs (hyper_blueprint_debug_inspectest absent du serveur, GIMPL:44-46 : il remplace celui du § 2.1 et du § 7.2) ;save_assets {asset_paths:["/Game/BPs/GI"]}; fermeture,UeState.ps1= 0, MD5 relevé. Volume : 2 nœuds, 1break_pins, 5connect_pins, 0set_pin_value(+1 relecture) ;AddVariableaprès = 51 nœuds (§ 7.1 :=== GI :: AddVariable (51 noeuds) ===).
Après (liens attendus) : IfThenElse_3951.then → G12-B.execute (seul) ; G12-B.Condition ← G12-I.ReturnValue, then →
MacroInstance_1960.exec (seul lien entrant de M), else → CallArrayFunction_4346.execute ; G12-I.TargetArray ←
BreakStruct_1527.Person_24_…, IndexToTest = 0 ; BreakStruct_1527.Person_24_… → GetArrayItem_2453.Array,
G12-I.TargetArray ; CallArrayFunction_4346.execute ← MacroInstance_1960.Is Not Valid, IfThenElse_4367.else,
IfThenElse_4819.then, CallFunction_606.then, G12-B.else ; aucun autre nœud modifié.
Comportement : identique (établi, les deux conditions du § 2.2 étant vérifiées). Ancienne Person vide : aujourd'hui F2
puis Is Not Valid → Array_Set → Replaced → Break ; après, IsValidIndex faux sans message → else → le même
Array_Set. Ancienne Person non vide : then → M, chemin d'origine (y compris destroyDummy). Nom différent, ajout
(Array_Add), cas choice du SwitchString_75 : non touchés. Appel AddVariable('AI') de STE-H5b : ancienne AI =
[AIDummy] (longueur 1) → then, sans effet.
Réponse à Q-H3c-1 : P1 a été lancé par l'orchestrateur (STE-D5, partagé avec P3 de H5b) et le § 2.2 est complété ici, dans
la forme du § 2.4 bis de H3bS ; une fiche courte n'est pas nécessaire. Statut de la SPEC : complète, exécutable sous
P2-P4. Ordre avec STE-H5b : IMPL successives (P2 : MD5 de départ = b8b97c46… ou M1 de H5b, qui ne touche pas
AddVariable) ; si le témoin de H5b est posé (STE-H5b-SPEC.md § 2.7), G12 se fait avant l'instantané STE-H5b-temoin ou
après sa restauration, jamais entre les deux.
Tours du complément (A-CART, commun à STE-H5b-SPEC.md § 2.0 bis et § 2.7) : 19 / 50.
3. Repli
- Avant écriture : instantané
.\Tools\Snapshot.ps1 -Lot STE-H3c(P3), MD5 de départ relevé (P2). - Échec de compilation, diagnostic, lien relu différent : arrêt,
.\Tools\Restore.ps1 -Lot STE-H3céditeur fermé (GI entier), contrôle MD5 = valeur de P2. - Après commit (gardien) :
git revertdu commit du ticket STE-H3c (indépendant de ceux de H3, H3b, H5b).
4. Risques R#, questions Q#
- R-H3c-1 : nœuds de G12 lus sur L6f (GI 5.5 du 2026-09-30, sans exécution) ; aucune fiche ST ne cite
AddVariableparmi les fonctions modifiées (CHG-313/314 :CallFunction,CallFunctionReturnBool,setActorVar,getActorVar,ReturnStatIfNeeded), mais le portage 5.8 a pu renommer : P1 et P4 tranchent. - R-H3c-2 :
AddVariablesert toutes les variables de scène (sites deCallFunction,ReadSceneLine, EventGraphAI,Companion,PregTemp,ImpregTemp, H5D:58-59) : une erreur de câblage touche tout le moteur de scènes. Critères § 7.1-7.3 obligatoires avant commit. - R-H3c-3 : attribution des 121 lignes estimée forte (empreintes du § 1.1) ; des 111 autres, estimée (même mécanisme attendu). Le message F2 ne nomme pas la fonction (UE, § 6) : la VAL tranche (§ 7.3).
- R-H3c-4 : lecteurs silencieux candidats, non observés dans J3 (attribution incertaine), non retenus : C1
CheckConditionsWhoGetArrayItem_3268→ IsValidMacroInstance_2601(Is Not Valid→VariableSet_5) (CCW:180-204) ; C2 EventGraphGetArrayItem_935→ IsValidMacroInstance_72(Is Not Valid (vide)) (EG:6963-6966, 29107-29111). Même forme que G12 ; si un reste F2 > 0 après G12 : fiche de suite (dumps présents). - R-H3c-5 : alternative écartée : donner un élément
[None]aux 19MakeArrayvides de CFG. Change le résultat deArray_Length(Person) > 0dansReadSceneLine(RSL:616-628 :Person = Person[0]au lieu dePlayerCharacter, RSL:375-381) pour les lignes de statistiques sur ces variables : comportement modifié, hors Q1 = A. - R-H3c-6 : masquage : nul. La lecture fautive ne sert que le chemin « ancienne personne absente », qui ne fait rien
d'autre que
Is Not Valid. - Q-H3c-1 (orchestrateur) : lancer P1 (commande unique, partagée avec P3 de H5b) puis compléter le § 2.2 par un complément de SPEC (forme du § 2.4 bis de H3bS), ou confier le complément à une fiche courte.
- Q-H3c-2 (utilisateur, facultative) : traiter C1 et C2 par précaution (gardes à comportement identique) ou seulement si un reste apparaît en VAL (recommandation : seulement si reste).
5. Interdits
- Aucune modification de
CallFunction,ReadSceneLine,CheckConditionsWho, de l'EventGraph, desMakeArray, du C++. - Aucune correction de contenu (
Content\Modules\…), aucun nœud AND / OR / Select pur, aucunFunctionResultcréé, aucundelete_node. Pas d'IMPL de G12 sans P1 à P4. - Pas d'écriture HyperAIStudio (lp-mcp § 1.1) ; outils Epic seulement. Pas de commit par l'agent : ticket au gardien (lp-repo).
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'! » avec, pour%sfinal, le chemin du propriétaire de la propriété tableau (ici la structureVariable, pas la fonction appelante), puis élément remis au défaut (None) :Runtime\Engine\Private\KismetArrayLibrary.cpp:459-479(message l. 472-478,ResetToDefaultl. 479).GenericArray_IsValidIndex: test sans message :Runtime\Engine\Private\KismetArrayLibrary.cpp:583-591.
7. Critères de VAL (commande → attendu)
- Dump après IMPL :
.\Tools\RunCommandlet.ps1 -Lot STE-H3c -Commandlet LPDumpFunction -Args '-BP=GI -Fn=AddVariable -Pins -Exec'→ nœuds = P1 + 2 ; liens du § 2.2 relus ;python Tools\DiffRemplacementNoeuds.py <P1> <après> <profil>sans autre écart. hyper_blueprint_debug_inspect0 diagnostic (AddVariable) ;CompileAllBlueprintséditeur fermé : 0 erreur ;LPTestStringCompat3120 / 0 / 60 (lp-validate).- Journal de jeu (build Development, parcours de J3 :
STE-J3.md:10-16), Grep en modecount:Person_24_4B712C904750AD4CE1580DBEBD9E7396' of length 0→ 0 (J3 : 232) ; un reste > 0 → rapport, attribution à C1 / C2 (R-H3c-4), pas de correctif improvisé ;- multiligne
Person_24[^\n]*\r?\n[^\n]*called by[^\n]*\r?\n[^\n]*\[AI\] \d+ moves to→ 0 (J3 : 37) ; multilignehours by \d+\r?\n[^\n]*Person_24→ 0 (J3 : 24) ; DestroyDummy was from AddVariable→ présent, même ordre que J3 (3) : branche « ancienne personne valide » intacte ;- non-régression :
hours by [1-9]≥ 1 (J3 : 46),\[AI\] \d+ moves to≥ 1 (J3 : 46),index SPAWN> 0 (J3 : 151), dénominateurCHECKING:(J3 : 5 490) ; - inchangés à 0 :
property Person in,CallFunc_Array_Get_Item_3[0-3],CallFunc_Array_Get_Item_41; - information :
Attempted to access index(J3 : 336, dont 104 sur d'autres tableaux, hors périmètre).
- Puis
& .\Tools\LogStats.ps1 -Compare <journal>,<J3>: aucune famille nouvelle.
Fichiers à commiter (dépôt jeu, branche ue5.8, ticket au gardien) :
- A
Docs/Migration/etat/ST/STE/STE-H3c-SPEC.md
Tours : 45 / 60
Constats
Commandes (outil Grep sauf mention ; J3 = copie de lecture) et comptes bruts :
- C1 (Bash)
cpdu journal J3 vers le scratchpad puismd5sumdes deux :d029de50ffd694b0b7079f82a9ed463f× 2. - C2
Attempted to access index 0 from array 'Person_24_(count) → 232. - C3
\d\d\.\d\d\.\d\d:\d{3}\]\[[ \d]+\](LogScript: Warning: Script Msg: Attempted|LogBlueprintUserMessages: \[AI\] \d+ moves to \w*|LogBlueprintUserMessages: \[GI_C_\d+\] \(test0104\) for [\d.]+ hours by \d+)(-o) → 322 lignes (base du comptage 121 / 111). - C4 multiline
Attempted to access index 0 from array 'Person_24[^\n]*\r?\n[^\n]*called by[^\n]*\r?\n[^\n]*Accessed None→ 0. - C5 multiline F2 →
called by→\[AI\] \d+ moves to→ 37 ; C6 multilinehours by \d+\r?\n[^\n]*Person_24→ 24 ; C7 multiline\[AI\] \d+ moves to[^\n]*\r?\n[^\n]*hours by→ 46 ;moves to .*\(test0104\)→ 46. - C8
Attempted to access index→ 336 ; C9Attempted to access index \d+ from array '(?:Person|Float|String|Building|Bool)' of length|DestroyDummy was from AddVariable|DestroyDummy test1903 via AddVariable(-o) → 6 lignes, toutesDestroyDummy(J3:8403-8404, 19888-19889, 20263-20264) : aucune F2 sur le paramètrePersond'AddVariable. - C10
Accessed None trying to read (\(real\) )?property \w+(-o) → 80 lignes (SexInterface,K2Node_CustomEvent_Person,CallFunc_GetSkeletalMesh_ReturnValue*,ThemeSong,GI,K…), aucunePerniPerson. - C11 multiline
K2Node_MakeArray_\d+ +K2Node_MakeArray\r?\n[^\n]*Array +-> K2Node_CallFunction_\d+\.Person\r?\nLogLPDump: Warning: K2Node_sur CFG, RSL, CRBG, EG, CCW → 19 nœuds, tous dans CFG (MakeArray_15, 19, 27, 11, 72, 65, 83, 93, 94, 109, 102, 1, 139, 138, 142, 158, 162, 101, 174). - C12
Person_24_4B712C904750AD4CE1580DBEBD9E7396(count, glob*__*.txtsousetat\ST) → 1 109 sur 20 fichiers ; lecteurs non encore gardés lus : RSLGetArrayItem_2243gardé parArray_Length > 0(RSL:616-628) ; CCW_3268, EG_935(R-H3c-4) ; EG_45,_49→ModifyStat.self(EG:24474-24478, 24508-24512 : lèveraient « Accessed None », 0 dans J3, C4). - C13 (Bash)
md5sumdeGI.uasset→b8b97c46…;git log --oneline -2 -- Content/BPs/GI.uasset→5c55db4,c70082d. - Lu : L6f:10070-10273 (
AddVariable5.5, 49 nœuds) ; CFG:120-164, 4828-4889, 5373-5451, 5622-5673 ; CRBG:1584-1590, 2255-2380 (isString,isOpen,isSameBuilding,isBuildingValid: aucune lecturePerson_24) ; RSL:296-385, 484-543 ; AI :entertainment,home,random,coffee,high_priority\work_hourly,sleep,meal,so_follows,work_office. - Écarts de méthode : un appel Bash
ls … | grepa servi à lister deux dossiers (présence deSTE-H5b-SPEC.mdet absence de dumpAddVariable/GetVariable/isStringsousdumps\) au lieu de Glob ; lp-mcp non invoqué : conventions MCP reprises de H3S § 2.1. Aucun dump 5.8 d'AddVariable,GetVariableniisString(C13, listage ci-dessus). - Constat annexe :
GetVariablen'est pas l'émetteur (estimé) : la première routine (J3:2663) appellesetCurrentLocation(<variable écrite par getBuilding, Person vide>)viaGetVariable(CallFunction_186) sans F2.