LifePlay-Revival/Docs/Migration/etat/ST/STG/STG-B1-IMPL.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

22 KiB
Raw Blame History

Fiche STG-B1 — Niveau N3 — Modèle prévu (agent lp-mcp-bp) | utilisé claude-opus-5-5 — Agent lp-mcp-bp — Skills lp-mcp, sk-protocol, sk-change-safety, lp-lot

STG-B1-IMPL : C-O4b et C-O7 sur Person par MCP (2026-10-13)

Verdict : ARRÊT avant toute écriture. Le geste C-O4b c exige de lire NOT(elem.bHidden) sur un autre acteur. Les outils MCP ne savent pas créer ce nœud (§ 2). La fiche (rubrique 8) et le rôle imposent l'arrêt sur écart à la SPEC. Aucun nœud ni aucune variable créés, aucune compilation, aucun save_assets. Content/BPs/Person.uasset est inchangé (MD5 identique à l'instantané). C-O7 n'est pas posé non plus : l'arrêt vaut pour toute la fiche, mais l'outil a été examiné en lecture (§ 4).

1. Fichiers modifiés

Aucun fichier du projet modifié. Contrôles au 2026-10-13 vers 14 h 24 (heure locale), éditeur fermé :

Fichier MD5 avant (14 h 10) MD5 après (14 h 24) Attendu
Content/BPs/Person.uasset d1b4c63d47621b1191ad9352c80c99cd d1b4c63d47621b1191ad9352c80c99cd inchangé, puisqu'il y a eu arrêt
Content/BPs/Room.uasset (CAM) a5fa970e821dc2d0d9bf220fd43b9de6 a5fa970e821dc2d0d9bf220fd43b9de6 A5FA970E…
Content/BPs/GI.uasset c4817b847ecf246c859647577647d6e9 c4817b847ecf246c859647577647d6e9 C4817B84…

git status --short -- Content Source Config donne les mêmes lignes avant et après : M Content/BPs/Room.uasset, M Source/LifePlay/LPDebugSubsystem.cpp, M Source/LifePlay/LPDebugSubsystem.h (autres lots, non touchés).

Fichiers écrits hors git par l'éditeur :

  • journal de l'éditeur : D:\Game\LifePlay-master 5.8\Saved\Logs\portage\STG_B1_mcp_editor.log ;
  • sauvegarde automatique de l'éditeur : D:\Game\LifePlay-master 5.8\Saved\Autosaves\Game\BPs\Person_Auto1.uasset, 20 788 360 octets, MD5 a50b77c9bbe85ce5fb575138b3d16a32, écrite à 14 h 22 min 31 s. Dans le journal, l. 2266-2268 : Cmd: OBJ SAVEPACKAGE PACKAGE="/Game/BPs/Person" FILE=".../Saved/Autosaves/Game/BPs/Person_Auto1.uasset" ... AUTOSAVING=true (12 h 22 min 29 s UTC). Elle suit find_node_types (12 h 22 min 09 s UTC). Après load_asset, je n'ai fait que des lectures : le paquet Person a donc été marqué « modifié » par un outil de lecture (estimé : BlueprintGraphEditor.get_graph_editor, appelé par find_node_types). Le fichier est laissé en place : il est hors git et je ne le supprime pas.

Séquence MCP, dans l'ordre (un appel à la fois, tous en lecture) :

# Outil Arguments Réponse (résumé fidèle)
1 list_toolsets — 37 toolsets ; editor_toolset.toolsets.blueprint.BlueprintTools et editor_toolset.toolsets.object.ObjectTools présents
2 AssetTools.load_asset {asset_path:"/Game/BPs/Person"} {"refPath":"/Game/BPs/Person.Person"}
3 BlueprintTools.find_node_types {graph:"/Game/BPs/Person.Person:EventGraph", type_id_filter:"HiddenInGame", context_pins:[]} ["Rendu|SetActorHiddenInGame","Développement|SetHiddeninGame","Variables|Rendu|ObtenirActorHiddenInGame","Classe|SceneComponent|ObtenirHiddeninGame", …GLTFExportOptions, PaperTileLayer, CameraComponent…]
4 BlueprintTools.get_node_infos CustomEvent_72, CallFunction_635, IfThenElse_90, CallFunction_664, CallFunction_658, CallFunction_531 état de la fiche § 4 reconfirmé (voir plus bas)
5 BlueprintTools.get_node_infos VariableGet_240, VariableGet_261 (lectures de bHidden existantes) type_id |GetbHidden, input_pins: [] pour les deux
6 BlueprintTools.find_node_types type_id_filter:"Hidden", context_pins:[{EGPD_Output, 2, CustomEvent_72}] (broche Person, de type Person) ["Rendu|SetActorHiddenInGame","Variables|Rendu|ObtenirActorHiddenInGame","Appelerunefonction|EnsureInvalidStaysHidden"]
7 ObjectTools.get_properties {instance:"/Game/BPs/Person.Default__Person_C:CharMoveComp", properties:["bUseRVOAvoidance","AvoidanceWeight","AvoidanceConsiderationRadius"]} {"bUseRVOAvoidance":false,"AvoidanceWeight":0,"AvoidanceConsiderationRadius":500}

État de départ relu par MCP (appel 4), conforme au dump dumps\Person__EventGraph.txt l. 15147-15442 :

  • K2Node_CustomEvent_72 (AddEvent|Custom|moveToPersonStand, position 11664, -2288) : sorties then 1, Person 2 (5 lecteurs), Distance 3 ;
  • K2Node_CallFunction_635 (|unOccupyFnt) : then (sortie 0) → IfThenElse_90.execute (entrée 0) ;
  • K2Node_IfThenElse_90 (12608, -2432) : Condition (entrée 1) ← CallFunction_664.ReturnValue (sortie 0) ; then 0 → 636 ; else 1 → 531 ;
  • K2Node_CallFunction_664 (Math|Flottant|Equal(Float)) : A ← Distance, B = 250 ;
  • K2Node_CallFunction_658 (Math|Vecteur|SelectVector, 13232, -1712) : ReturnValue → seul lecteur 531.Loc ; bPickA ← 659 ;
  • K2Node_CallFunction_531 (|moveTo) : execute ← IfThenElse_90.else, self 1 visible, Loc 2 ← 658, Precise 3 = false.

Nœuds créés : 0. Liens coupés ou créés : 0. Variables créées : 0. EventGraph : 3702 nœuds selon le dump, compte non relu par find_nodes, mais aucune écriture n'a eu lieu (n = 0). Compilation : non lancée, faute de modification.

2. Écarts à la SPEC

E1 (bloquant) : NOT(elem.bHidden) (fiche, rubrique 5 c) ne peut pas être construit par les outils MCP.

  • Le moteur n'expose pas d'accesseur appelable : AActor::IsHidden() n'est pas une UFUNCTION (D:\Game\Launcher\Engine\UE_5.8\Engine\Source\Runtime\Engine\Classes\GameFramework\Actor.h:4520-4525). Seule la propriété bHidden se lit, par un nœud VariableGet.
  • find_node_types ne propose, pour cette propriété, que Variables|Rendu|ObtenirActorHiddenInGame (appels 3 et 6), avec ou sans context_pins sur une broche de type Person. Il n'existe ni Classe|Acteur|… ni Classe|Person|…ActorHidden….
  • Ce type de nœud est un accesseur sur self dont la broche self est cachée. Les deux accesseurs bHidden déjà présents dans Person (VariableGet_240, VariableGet_261) rendent input_pins: [] (appel 5). BlueprintTools._resolve_pin ne voit que les broches de list_all_pins (...\Toolsets\EditorToolset\Content\Python\editor_toolset\toolsets\blueprint.py:556-565), donc aucune broche self ne peut être reliée à elem.
  • Ce résultat a déjà été obtenu à l'essai de création dans Room, sur le même moteur, avec le même type_id : il produit l'accesseur de l'acteur lui-même, sans broche self, avec « PinID index_id 0 out of range », y compris avec declaring_class Actor (etat\CAM\CAM-B1-IMPL.md:41-44). write_graph_dsl est exclu, car il réécrit le graphe entier. Aucune autre voie n'a été essayée : chercher un contournement est hors rôle.
  • Conséquence : le geste C-O4b ne peut pas être posé tel que la fiche le décrit. La règle de la rubrique 8 (« En cas … d'écart : ARRÊT, ne pas sauvegarder ») s'applique. Aucune écriture n'a été faite, la décision revient à l'orchestrateur.

Options pour la décision (à trancher par l'orchestrateur ou l'utilisateur, aucune n'est appliquée) :

Option Geste Effet Risque
A retirer le terme NOT(elem.bHidden) (AND à 3 entrées, 17 nœuds) tout Person compte comme tiers, caché ou non un figurant caché garé près du point déclenche standIdle à tort ; standIdle peut alors tomber sur le repli « centre de Room + 50 » (C-O2 reporté). Incertain : l'endroit où restent les figurants cachés
B remplacer le terme par « tiers visible » au sens de C-O2 (SPEC § 2, l. 45) : Array_Contains(GI.DummyPersonsInUse, elem) ou elem == GI.PlayerCharacter même définition de « visible » que C-O2 lecture de GI : garde IsValid(GI) en cascade exigée (lp-mcp § 1 règle 4) ; type_id `Classe
C fonction C++ BlueprintPure (lecture de IsHidden()) test identique à la SPEC demande un build ; la SPEC § 2 l. 52 dit « pas de build après B1 » : à placer dans un autre sous-lot

Estimé : B est la plus cohérente avec la SPEC, puisque C-O2 utilise déjà cette définition. Il faut d'abord vérifier par une lecture (CART) que GI.DummyPersonsInUse couvre tous les tiers visibles.

3. Instantané

Je n'ai pas relancé d'instantané : la fiche (rubrique 3) le donne comme déjà pris. Contrôle effectué :

  • D:\Game\LifePlay_Backup_5.5\STG\manifest.csv : "Content\BPs\Person.uasset","True","20788360","D1B4C63D47621B1191AD9352C80C99CD","2026-10-13T14:10:12" ;
  • md5sum D:/Game/LifePlay_Backup_5.5/STG/Content/BPs/Person.uasset donne d1b4c63d47621b1191ad9352c80c99cd, égal à Person sur disque au départ et à l'arrivée.
  • Aucun retour arrière n'est nécessaire, puisque Person est inchangé. S'il fallait un jour restaurer, il se proposerait sans être lancé, éditeur fermé : .\Tools\Snapshot.ps1 -Lot STG-retour -Path Content\BPs\Person.uasset, puis .\Tools\Restore.ps1 -Lot STG -Only Content\BPs\Person.uasset -WhatIf.

4. Ce qui n'a pas été fait

  • C-O4b (rubrique 5, gestes a à f) : rien n'est posé, ni variable STG_StandTarget / STG_StandCrowded, ni nœud, ni lien. Cause : E1.
  • C-O7 (rubrique 6) : non posé, arrêt sur écart C-O4b. Il n'est pas absent faute d'outil. Outils examinés : je n'ai pas lancé describe_toolset, conformément à lp-mcp § 1 règle 6 sur le volume ; j'ai lu le code source du toolset à la place. ObjectTools.set_properties(instance, values) existe (...\editor_toolset\toolsets\object.py:81-94, avec require_editable) ; BlueprintTools.get_default_object aussi (blueprint.py:214-229). Le sous-objet du CDO se lit par refPath /Game/BPs/Person.Default__Person_C:CharMoveComp (appel 7 : bUseRVOAvoidance false, AvoidanceWeight 0, AvoidanceConsiderationRadius 500). L'écriture n'a pas été essayée. Incertain : require_editable accepte-t-il ce sous-objet, et la valeur survit-elle à compile_blueprint et à save_assets ? L'essai qui tranche : set_properties, puis compile_blueprint, puis get_properties, dans la prochaine fiche.
  • Compte des nœuds de l'EventGraph par find_nodes : non relevé (aucune écriture, n = 0).
  • compile_blueprint, save_assets : non lancés (rien à compiler ni à enregistrer).
  • Build, commandlet, jeu : hors fiche.

5. Points à confirmer en VAL

  • md5sum Content/BPs/Person.uasset = d1b4c63d47621b1191ad9352c80c99cd (inchangé par STG-B1).
  • md5sum Content/BPs/Room.uasset = a5fa970e… et Content/BPs/GI.uasset = c4817b84… (inchangés).
  • Tools\UeState.ps1 : processus=0 editeur=0 compilation=0 shaders=0 jeu=0 (relevé à 14 h 24).
  • Saved\Autosaves\Game\BPs\Person_Auto1.uasset (MD5 a50b77c9…, hors git) : sauvegarde automatique de l'éditeur, sans effet sur Content. À laisser ou à déplacer vers une quarantaine, au choix de l'orchestrateur.
  • Pour la reprise : décision sur E1 (options A, B ou C), puis nouvelle fiche B1 avec le terme de visibilité réécrit, et essai d'écriture de C-O7.

6. Fichiers à commiter

Dépôt du jeu, copie 5.8, branche ue5.8 :

  • A Docs/Migration/etat/ST/STG/STG-B1-IMPL.md (ce livrable).

Aucun asset à commiter : Person n'a pas été modifié. La ligne STG-B1 de STG-TACHES.md n'a pas été mise à jour, car l'agent n'a pas Edit : c'est à l'orchestrateur de le faire.

Tours : 32 / 60

Constats

  • Éditeur headless (lp-mcp § 2), lancé à 14 h 11 min 24 s, PID 27416, moteur D:\Game\Launcher\Engine\UE_5.8, journal Saved\Logs\portage\STG_B1_mcp_editor.log. Serveur MCP démarré à 12 h 11 min 43 s UTC (l. 1904-1907 : « Starting MCP server on port 8000 », « Created new HttpListener on 127.0.0.1:8000 »). Arrêté par Stop-Process -Id 27416 à 14 h 24, puis UeState.ps1 = 0 et port 8000 libre. Jeton UE tenu environ 13 minutes.
  • Wait-HyperAIStudioMCP.ps1 -Port 8000 -UrlPath /mcp -TimeoutSeconds 540 a rendu le code 1 à 14 h 20 min 31 s, alors que le port 8000 était en écoute (netstat : LISTENING, PID 27416). Le journal ne montre aucune « Initializing new session » avant 12 h 20 min 40 s UTC, c'est-à-dire avant la reconnexion du client de la session (« Unknown session id … client should reinitialize », l. 2240). Incertain : la cause de l'échec du script, puisque ses requêtes initialize ne figurent pas au journal. Les outils unreal-mcp ont répondu dès le premier appel (list_toolsets).
  • Un outil de lecture (find_node_types) peut marquer un Blueprint comme modifié. La sauvegarde automatique de l'éditeur écrit alors le paquet dans Saved\Autosaves (20 s plus tard ici) : à prévoir dans le décompte des fichiers écrits d'une fiche MCP.
  • get_node_infos affiche la broche self d'un appel de fonction sur soi (CallFunction_635, _531 : entrée 1 « Self Référence d'objet »), mais pas celle d'un accesseur de variable sur soi (|GetbHidden : input_pins: []).

Passe 2 (2026-10-13, 14 h 27)

Consigne de l'orchestrateur : E1 est tranché en faveur de l'option A ; la fiche est amendée (rubrique 5 c : plus de test bHidden, rubrique 6 : essai de C-O7 par set_properties). Le jeton UE reste à la session STG pour environ 40 minutes. On garde un appel MCP à la fois, une compilation stricte et save_assets de Person seul.

Verdict passe 2 : arrêté au budget, avant toute écriture. L'éditeur n'est pas relancé. Aucun appel MCP. Person est inchangé.

P2-1. Contrôles de départ

  • fiches\STG-B1.md relue : l. 15 (amendement A) et l. 20 (C-O7 par set_properties, compile_blueprint, get_properties) ; rubrique 9 inchangée : budget 60 tours pour la fiche.
  • md5sum à 14 h 27 min 49 s : Person d1b4c63d47621b1191ad9352c80c99cd (égal à D1B4C63D…), Room a5fa970e821dc2d0d9bf220fd43b9de6, GI c4817b847ecf246c859647577647d6e9 ; UeState.ps1 : processus=0 editeur=0 compilation=0 shaders=0 jeu=0.

P2-2. Pourquoi rien n'est commencé

Règle sk-protocol § 8 (décision de l'utilisateur du 2026-10-12, D-P7.10) : une écriture MCP ne commence que si le budget de tours restant la couvre en entier. Chaque écriture est un appel call_tool unitaire, un tour par appel, puisque les appels MCP ne se chevauchent pas. ProgrammaticToolset est interdit pour écrire.

Bloc (option A, AND à 3 entrées) Tours
démarrage de l'éditeur, attente, load_asset 3
lecture des type_id des nœuds nouveaux (find_node_types, lectures groupées permises) 1 à 6
add_variable ×2, set_variable_category ×2 4
create_node ×17 : Set Target, Set Crowded faux, GetAllActorsOfClass, ForEachLoopWithBreak, Branch, AND, Self, != ×2, GetActorLocation, Get Target ×2, Distance2D, <, Set Crowded vrai, OR, Get Crowded ; plus add_node_pin sur AND 18
set_pin_value ×3 (ActorClass = Person_C, Crowded = vrai, <.B = 70) 3
break_pins ×3 (635 → 90.execute, 664 → 90.Condition, 658 → 531.Loc) 3
connect_pins ×26 (8 d'exécution, 18 de données) 26
relecture get_node_infos (groupée) 1 à 2
C-O7 : set_properties, compile_blueprint (strict), get_properties, save_assets, get_properties 5
arrêt de l'éditeur, MD5, UeState, livrable, remise 4
Total ≈ 68 à 75

Restant à l'ouverture de la passe 2 : 60 − 33 = 27 tours de budget, et 42 tours sous le plafond maxTurns 75. Le total ne tient ni dans l'un ni dans l'autre. Commencer exposerait à une coupure au milieu du câblage, avec l'éditeur ouvert, Person modifié en mémoire et une sauvegarde automatique dans Saved.

C-O7 seul (≈ 10 tours) tiendrait dans le budget. Je ne l'ai pas fait seul : la fiche prévoit un seul save_assets de Person, après C-O4b. Enregistrer C-O7 seul changerait le MD5 de départ de la passe suivante (contrôle D1B4C63D… = ARRÊT) sans fiche pour le couvrir. C'est à l'orchestrateur de décider.

P2-3. Écarts

  • Écart de la fiche amendée à la SPEC : STG-SPEC.md § 2, l. 46 et fiche l. 19 (« effet attendu ») parlent encore de « tiers visible ». Avec l'amendement A, tout Person compte comme tiers. À reporter dans la SPEC (DOC).
  • Aucun écart d'exécution : rien n'a été fait.

P2-4. État de reprise

  • Établi : l'état de départ de la fiche § 4 et les indices de broches relus en passe 1, à savoir CustomEvent_72.Person sortie 2, 635.then sortie 0, IfThenElse_90.execute entrée 0 et Condition entrée 1, 664.ReturnValue sortie 0, 658.ReturnValue sortie 0, 531.Loc entrée 2. Les valeurs de C-O7 avant geste sont false / 0 / 500. Person vaut D1B4C63D….
  • Établi ailleurs (CAM-B0-IMPL.md § 2) : Utilitaires|Opérateurs|Inférieurà(<) se type par la 1re liaison (relier avant set_pin_value) ; add_variable prend type_name et rend {"returnValue":null} (STE-H10-GI1-IMPL.md:166).
  • Incertain (à lire par find_node_types au début de la reprise) : type_id de Get et Set des nouvelles variables (catégorie STG), GetAllActorsOfClass, ForEachLoopWithBreak (macro), Self, !=, Distance2D, GetActorLocation, AND, OR ; indices des broches de ForEachLoopWithBreak (LoopBody, Array Element, Completed, Break).
  • Reste à faire : C-O4b gestes a à f (≈ 54 écritures), C-O7, compilation stricte, relectures, save_assets de Person, compte des nœuds avant et après (attendu 3702 + 17), MD5.
  • Prochaine commande : relancer l'éditeur selon lp-mcp § 2, puis load_asset {asset_path:"/Game/BPs/Person"}, puis la lecture groupée des type_id.
  • Voies proposées (au choix de l'orchestrateur) :
    1. la session STG fait elle-même les appels MCP, un par un, sans plafond de tours. Précédent : CAM-B0-IMPL.md:3-5, environ 75 appels MCP, 0 refus du mode auto ;
    2. une nouvelle fiche avec un budget couvrant environ 75 tours. Cela dépasse le plafond maxTurns 75 de lp-mcp-bp : il faut soit un autre agent, soit une exception décidée par l'utilisateur ;
    3. scinder sans enregistrement intermédiaire. Déconseillé : l'éditeur resterait ouvert entre deux agents avec Person modifié en mémoire et des sauvegardes automatiques.

Fichiers à commiter (inchangé) : A Docs/Migration/etat/ST/STG/STG-B1-IMPL.md (dépôt du jeu, ue5.8). Aucun asset.

Tours : 36 / 60 (cumul des passes 1 et 2 : 32 + 4, ce Write, le contrôle des fins de ligne et la remise compris)

Passe 3 — écriture par l'orchestrateur (session STG, claude-opus-5-5), 2026-10-13 14:30-14:35

Fiche STG-B1, passe 3 — Niveau N3 — Modèle prévu (agent lp-mcp-bp) | utilisé claude-opus-5-5 (orchestrateur, appels MCP directs, un à la fois ; voie retenue après l'arrêt au budget de la passe 2, précédent CAM-B0/B1).

Écart à la fiche (décision de l'orchestrateur) : C-O4b réalisé par SphereOverlapActors au lieu de la boucle GetAllActorsOfClass + ForEachLoopWithBreak (7 nœuds au lieu d'≈ 19, même effet) : sphère de rayon 50 cm centrée sur le point choisi, types d'objets [ObjectTypeQuery3] (Pawn), filtre de classe Person_C, acteurs ignorés [self, Person] → un tiers est trouvé si le centre de sa capsule (rayon 20) est à moins de ≈ 70 cm du point. Les capsules en NoCollision (scènes de contact, GI.toggleGravity) ne sont pas trouvées : conforme à Q-STG-5. Option A (pas de test bHidden) conservée.

Éditeur : UnrealEditor.exe … -RenderOffScreen -unattended -nosplash -NoSound -ModelContextProtocolStartServer -ModelContextProtocolPort=8000, PID 6516, journal Saved\Logs\portage\STG_B1_mcp_editor_p3.log ; arrêté par Stop-Process après save_assets.

Appels d'écriture (dans l'ordre) :

  1. load_asset /Game/BPs/Person ; add_struct_variable(Person, STG_StandTarget, /Script/CoreUObject.Vector).
  2. create_node : Collision|SphereOverlapActors → K2Node_CallFunction_573 ; DéfinirSTGStandTarget → K2Node_VariableSet_241 ; ObtenirSTGStandTarget → K2Node_VariableGet_257 ; Utilitaires|Array|Faireuntableau ×2 → K2Node_MakeArray_33 (types), K2Node_MakeArray_34 (ignorés, + add_node_pin) ; Utilitaires|Tableau|IsValidIndex → K2Node_CallArrayFunction_78 (index 0 = « au moins un ») ; Math|Booléen|ORBoolean → K2Node_CommutativeAssociativeBinaryOperator_122.
  3. Valeurs : MakeArray_33[0] = ObjectTypeQuery3 ; 573.SphereRadius = 50.0 ; 573.ActorClassFilter = /Game/BPs/Person.Person_C.
  4. Liens créés : 33 → 573.ObjectTypes ; 34 → 573.ActorsToIgnore ; Self_10 → 34[0] ; CustomEvent_72.Person → 34[1] ; 658 → 241.STG_StandTarget ; 257 → 573.SpherePos ; 573.OutActors → 78.TargetArray ; 78 → 122.A ; 664 → 122.B ; 122 → IfThenElse_90.Condition ; exécution 635.then → 241 → 573 → IfThenElse_90 ; 257 → 531.Loc.
  5. Liens coupés : 664 → IfThenElse_90.Condition ; 635.then → IfThenElse_90.execute ; 658 → 531.Loc.
  6. Relecture get_node_infos (573, 241, 90, 531, 658, 33, 34, 122) : conforme ; 658 n'a plus qu'un lecteur (241).
  7. compile_blueprint(Person) : aucun message au journal de l'éditeur (ni avertissement ni erreur).
  8. C-O7 : ObjectTools.set_properties(instance = /Game/BPs/Person.Default__Person_C:CharMoveComp, values = {"bUseRVOAvoidance": true, "AvoidanceWeight": 0.5}) → true ; recompilation ; get_properties → true, 0.5 (avant : false, 0) ; save_assets(["/Game/BPs/Person"]) → true ; get_properties après enregistrement → true, 0.5.

Mesuré :

  • MD5 Person : avant D1B4C63D47621B1191AD9352C80C99CD (= instantané Backup_5.5\STG), après B239E1035CB028B78FBD4BB9F0C5F70A ; Room A5FA970E… et GI C4817B84… inchangés.
  • Relecture sur disque, éditeur fermé (STG-B1d-INV.md, lp-builder) : EventGraph 3709 nœuds (3702 + 7) ; CharMoveComp bUseRVOAvoidance = True, AvoidanceWeight = 0.500000.
  • UeState.ps1 : 0 à la fin.
  • Hors git, laissé en place : Saved\Autosaves\Game\BPs\Person_Auto1.uasset (14:22, passe 1).

Non fait (conforme au GO) : pas de build ; C-O2 reporté après la session street ; Room non touché. Fichiers à commiter : Content/BPs/Person.uasset (après VAL et essai, dans le build commun ordonné par Big Boss) ; Docs/Migration/etat/ST/STG/STG-B1-IMPL.md, STG-B1d-INV.md, fiches/STG-B1.md.

Note (VAL c-5) : la relecture get_node_infos du § 6 rendait pour K2Node_CallFunction_573 : ActorClassFilter value /Game/BPs/Person.Person_C, SphereRadius 50.0, ObjectTypes ← MakeArray_33 ([0] = ObjectTypeQuery3), ActorsToIgnore ← MakeArray_34 ([0] ← Self_10, [1] ← CustomEvent_72.Person) ; le dump LPDumpFunction n'imprime pas les valeurs d'objet par défaut.