LifePlay-Revival/Docs/Migration/etat/ST/STE/STE-H10-GI1-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

13 KiB

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

STE-H10-GI1-IMPL : B1-a, partie EventGraph de GI, par MCP (2026-10-13)

Résultat : réussi. Le bloc EventGraph de B1-a (SPEC § C.5) est écrit dans GI : 2 variables, 9 nœuds, 3 coupures, 18 liens et 1 set_pin_value, tous relus conformes. Compilation (avertissements en erreurs) sans diagnostic ; /Game/BPs/GI enregistré seul. Ce livrable remplace celui du premier passage, arrêté avant écriture par un refus de permission (BLOCKED-PERM).

BUILD-GO : « [BOSS→STE] BUILD-GO STE-H10 (a), GI seul » (Big Boss, 2026-10-13), transféré à la session STE [b84cc5], qui a lancé cet agent. Éditeur headless PID 8296, port 8000, lancé par l'orchestrateur. Ligne de commande relue par Get-CimInstance Win32_Process : -ModelContextProtocolPort=8000 "-abslog=D:\Game\LifePlay-master 5.8\Saved\Logs\LANC1-headless-20261013-001639.log". Accord de l'utilisateur pour l'écriture : « tu peux y aller mcp ouvert », transmis par l'orchestrateur.

1. Fichiers modifiés

Content\BPs\GI.uasset est le seul asset écrit. Commande (Git Bash, copie 5.8) : md5sum Content/BPs/GI.uasset Content/BPs/Person.uasset Content/UI/TopRight.uasset

Fichier 2026-10-13 00:38:32 +0200 (départ) 2026-10-13 00:42:49 +0200 (après save_assets)
Content\BPs\GI.uasset fe4406a0294a8001f612cd03ee2c20cc 324a4f271203d4ed8758b6db73ad0a35 (52 578 631 o, écrit à 00:42:38)
Content\BPs\Person.uasset d1b4c63d47621b1191ad9352c80c99cd d1b4c63d47621b1191ad9352c80c99cd (inchangé)
Content\UI\TopRight.uasset 1fcb94a60061b418e9deeb08bc1a990d 1fcb94a60061b418e9deeb08bc1a990d (inchangé)

git status --short -- Content : au départ M Content/BPs/Person.uasset et M Content/UI/TopRight.uasset. Après l'écriture, M Content/BPs/GI.uasset s'ajoute à ces deux lignes. HEAD bfaaed2.

Nœuds de GI:EventGraph (find_nodes {graph, title:""}, résultats d'outil enregistrés) :

grep -o '"refPath":"[^"]*"' <avant> | wc -l          → 6232   (unique : 6232)
grep -o '"refPath":"[^"]*"' <après> | wc -l          → 6241   (unique : 6241)
comm -13 <avant trié> <après trié>                   → 9 refPath : CallFunction_697, IfThenElse_216, IfThenElse_217, IfThenElse_218,
                                                       VariableGet_171, VariableGet_232, VariableSet_393, VariableSet_394, VariableSet_396
comm -23 <avant trié> <après trié> | wc -l           → 0  (aucun nœud disparu)

6 232 + 9 = 6 241 (établi).

Correspondance SPEC → nom réel → type_id. Préfixe refPath : /Game/BPs/GI.GI:EventGraph.K2Node_. Chaque type_id a été vérifié par find_node_types avant le premier create_node de son type ; le type relu est celui de get_node_infos.

SPEC Nœud réel type_id de création Type relu Broches (index) Position
D1 Branche IfThenElse_216 `Utilitaires ContrôleDeFlux Branche` idem
D2 Set SaveBeforeDestroy (true) VariableSet_393 `Variables Pardéfaut DéfinirSaveBeforeDestroy` `
D3 Set SaveBeforeDestroy (false) VariableSet_394 idem D2 ` SetSaveBeforeDestroy` idem, valeur 1 = false
G1 Branche IfThenElse_217 `Utilitaires ContrôleDeFlux Branche` idem
GR Get RevertSkipped VariableGet_171 `Variables Pardéfaut ObtenirRevertSkipped` `
G2 Branche IfThenElse_218 `Utilitaires ContrôleDeFlux Branche` idem
GV Get Valid (Person) VariableGet_232 `Classe Person ObtenirValid` `
G3 Person.RevertStripAll CallFunction_697 `Classe Person RevertStripAll` `
G4 Set RevertSkipped (false) VariableSet_396 `Variables Pardéfaut DéfinirRevertSkipped` `

Le filtre Branche a été vérifié une fois et a servi aux 3 branches. Le filtre SaveBeforeDestroy a été vérifié une fois et a servi à D2 et D3 ; le filtre RevertSkipped a servi à GR et G4.

Variables membres (add_variable {blueprint:{refPath:"/Game/BPs/GI.GI"}, name, type_name:"bool"}, réponse {"returnValue":null}) : SaveBeforeDestroy et RevertSkipped. Leur existence est établie par find_node_types, qui rend les accesseurs Obtenir… / Définir… des deux variables.

Coupures (break_pins, réponse null ; relues absentes) :

  1. IfThenElse_152.then(0) / CallFunction_104.execute(0) ;
  2. CallFunction_104.then(0) / CallFunction_937.execute(0). Le lien CallFunction_842.then → CallFunction_937.execute reste ;
  3. CallFunction_166.then(0) / CallFunction_731.execute(0).

Liens (connect_pins, réponse null ; relus par get_node_infos sur les 15 nœuds, après le dernier lien) :

# Sortie Entrée Relu
1 IfThenElse_152.then (0) IfThenElse_216.execute (0) oui
2 CustomEvent_3172.WithoutDestroying (3) IfThenElse_216.Condition (1) oui
3 IfThenElse_216.then (0) CallFunction_104.execute (0) oui
4 IfThenElse_216.else (1) VariableSet_393.execute (0) oui
5 VariableSet_393.then (0) CallFunction_104.execute (0) oui
6 CallFunction_104.then (0) VariableSet_394.execute (0) oui
7 VariableSet_394.then (0) CallFunction_937.execute (0) oui
8 CallFunction_166.then (0) IfThenElse_217.execute (0) oui
9 VariableGet_171.RevertSkipped (0) IfThenElse_217.Condition (1) oui
10 IfThenElse_217.else (1) CallFunction_731.execute (0) oui
11 IfThenElse_217.then (0) IfThenElse_218.execute (0) oui
12 CustomEvent_3172.Person (2) VariableGet_232.self (0) oui
13 VariableGet_232.Valid (0) IfThenElse_218.Condition (1) oui
14 IfThenElse_218.then (0) CallFunction_697.execute (0) oui
15 CustomEvent_3172.Person (2) CallFunction_697.self (1) oui
16 CallFunction_697.then (0) VariableSet_396.execute (0) oui
17 IfThenElse_218.else (1) VariableSet_396.execute (0) oui
18 VariableSet_396.then (0) CallFunction_731.execute (0) oui

État relu des nœuds existants touchés (même appel get_node_infos) :

  • IfThenElse_152 : then → IfThenElse_216 seul ; else → CallFunction_842 et execute ← CallFunction_838, inchangés ;
  • CallFunction_104 : execute ← IfThenElse_216 et VariableSet_393 ; then → VariableSet_394 seul ; broches File, Var 0.0, StatOnly false et IncludeStat true inchangées ;
  • CallFunction_937 : execute ← CallFunction_842 et VariableSet_394 ; then → IfThenElse_1766, inchangé ;
  • CallFunction_166 : then → IfThenElse_217 seul ; entrées inchangées ;
  • CallFunction_731 : execute ← IfThenElse_217.else et VariableSet_396 ; InString inchangé ;
  • CustomEvent_3172 : Person a 12 cibles, soit les 10 d'avant plus VariableGet_232 et CallFunction_697 ; WithoutDestroying a 2 cibles, IfThenElse_1766 (inchangé) et IfThenElse_216.

Compilation : compile_blueprint {blueprint:{refPath:"/Game/BPs/GI.GI"}, warnings_as_errors:true} → {"returnValue":null}. Journal de l'éditeur (Saved\Logs\LANC1-headless-20261013-001639.log, heures en UTC), lignes qui suivent l'appel, hors lignes MCP :

[2026.10.12-22.42.10:517][ 59]LogBlueprint: Compiling Blueprint '/Game/BPs/GI.GI'
[2026.10.12-22.42.14:693][ 59]LogUObjectHash: Compacting FUObjectHashTables data took   3.96ms

Le journal ne contient aucune ligne Error / Warning de compilation entre cette ligne et l'enregistrement. La seule ligne Error de la fin du journal est LogModelContextProtocol: Error: Call to unknown method "server/discover" (22:41:20), un message du client MCP sans rapport avec GI. hyper_blueprint_debug_inspect n'a pas été appelé : il est absent du serveur (fiche, rubrique 5).

Enregistrement : save_assets {asset_paths:["/Game/BPs/GI"]} → {"returnValue":true}. Journal : Saving Package: /Game/BPs/GI (22:42:34), Moving '…/Saved/GIF53547CC4E6C76A5C2584FAF6B1C0C32.tmp' to '…/Content/BPs/GI.uasset' (22:42:38), puis validation de contenu sur 1 asset (/Game/BPs/GI) sans erreur. Aucun autre paquet n'a été enregistré.

2. Écarts à la SPEC

Aucun écart de graphe : 2 variables, 9 nœuds, 3 coupures, 18 liens, D2 = true. Les points suivants sont des précisions de forme, sans effet sur le graphe :

  • GV est créé par Classe|Person|ObtenirValid, comme le prescrit la fiche, et non par find_node_types avec context_pins:[CustomEvent_3172.Person] comme l'écrit la SPEC § C.5. Le nœud obtenu est un VariableGet |GetValid avec une broche self de type Person ;
  • add_variable prend type_name (forme courte add_variable(GI, "…", "bool") dans la SPEC) ;
  • positions des nœuds choisies sous la chaîne (y 5300-5550), sans effet sur le comportement ;
  • garde Accessed None : aucun IsValid ajouté. La SPEC n'en prévoit pas, et le seul nouveau lecteur de Person (GV) se trouve derrière G1, qui ne passe à then que si RevertSkipped vaut true. Dans cette fiche, RevertSkipped n'est jamais mis à true : S3 est écrit par STE-H10-GI2. G1 prend donc toujours else, et le comportement est identique à celui d'avant (estimé, d'après le graphe relu). Person est déjà testé par IsValid en tête de DestroyPerson (SPEC § 2.2, GEV:17765, non relu ici).

3. Instantané

Non relancé, sur consigne de la fiche (rubrique 3). Contrôle seulement :

  • D:\Game\LifePlay_Backup_5.5\STE-H10\manifest.csv : "Content\BPs\GI.uasset","True","52553784","FE4406A0294A8001F612CD03EE2C20CC","2026-10-11T07:21:48" ;
  • md5sum D:\Game\LifePlay_Backup_5.5\STE-H10\Content\BPs\GI.uasset = fe4406a0294a8001f612cd03ee2c20cc, égal au MD5 de GI sur disque au départ (2026-10-13 00:38:32).
  • Retour arrière proposé, non lancé, éditeur fermé : .\Tools\Snapshot.ps1 -Lot STE-H10-retour -Path Content\BPs\GI.uasset, puis .\Tools\Restore.ps1 -Lot STE-H10 -Only Content\BPs\GI.uasset -WhatIf, puis sans -WhatIf.

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

  • La partie SavePreset de B1-a (S1, S2, S3, 1 coupure, 4 liens) et B2-a (GetSMBoolForSMC_Cloth) sont hors fiche ; elles reviennent à STE-H10-GI2.
  • CompileAllBlueprints éditeur fermé, build empaqueté et LogStats : non faits ici ; la preuve en jeu reste celle du build (lp-mcp § 1, règle 5).
  • Non mesuré : la valeur par défaut des deux variables membres dans le CDO. Valeur estimée false (défaut d'un bool neuf), non relue par un outil.

5. Points à confirmer en VAL

  • LPDumpFunction -BP=GI -Fn=EventGraph -Pins -Exec : 6 241 nœuds (6 232 + 9, compte find_nodes de cette fiche) ; chaîne DestroyPerson conforme aux 18 liens du § 1.
  • SaveBeforeDestroy et RevertSkipped : variables membres bool, défaut false.
  • VariableGet_232 (|GetValid, cible Person) : même fonction que VariableGet_599 (GEV:25944-25946).
  • CallFunction_697 (|RevertStripAll, cible Person) : même fonction que l'appel SP:1354.
  • CallFunction_937.execute a toujours ses deux entrées (CallFunction_842 et VariableSet_394).
  • CompileAllBlueprints éditeur fermé : 0 erreur, 0 avertissement nouveau sur GI.
  • Person (D1B4C63D…) et TopRight (1FCB94A6…) inchangés par cette fiche, comme relevé en § 1.

6. Fichiers à commiter

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

  • M Content/BPs/GI.uasset (MD5 324a4f271203d4ed8758b6db73ad0a35 au 2026-10-13 00:42:49). SPEC § C.2 : un commit par asset. GI sera encore modifié par STE-H10-GI2 ; le commit de GI est à placer après GI2, au choix de l'orchestrateur.
  • A Docs/Migration/etat/ST/STE/STE-H10-GI1-IMPL.md (ce livrable, réécrit en entier).

Tours : 57 / 60

Constats

  • Le chemin du journal de l'éditeur headless se lit sur la ligne de commande du processus (Get-CimInstance Win32_Process, argument -abslog=). Une compilation sans diagnostic n'écrit que LogBlueprint: Compiling Blueprint '/Game/BPs/GI.GI'.
  • add_variable {blueprint:{refPath}, name, type_name:"bool"} répond {"returnValue":null} en cas de succès. Les accesseurs apparaissent aussitôt dans find_node_types (Variables|Pardéfaut|Obtenir<Var> / Définir<Var>).
  • Classe|Person|ObtenirValid crée un K2Node_VariableGet relu |GetValid, avec une broche d'entrée self (index 0) de type Person.
  • Pour le compte avant / après, find_nodes {graph, title:""} (environ 410 Ko pour GI:EventGraph) se compare par comm sur les refPath triés, ce qui donne les nœuds ajoutés et disparus.
  • La numérotation des nœuds créés a sauté VariableSet_395, sans conséquence (noms attribués par l'éditeur).