LifePlay-Revival/Docs/Migration/etat/CG/CG2/CG2-IMPL-01.md
edujiro5972 56dfcfc3d2 LifePlay UE 5.8 : état de développement au 2026-10-20
Tickets : PUB-20261020-T1

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-20 17:35:10 +02:00

15 KiB

Fiche CG2-IMPL-01 — Niveau N3 — Modèle prévu (lp-mcp-bp) | utilisé claude-opus-5-5 — Agent lp-mcp-bp — Skills lp-mcp, sk-protocol

CG2-IMPL-01 v4 : corrections Blueprint de la build 1 : cœur et C7 faits, C8 sautée (2026-10-20)

Hors gabarit : la fiche demande des sections en plus (historique v1 à v3, appels, diagnostics, journal, état final). Elles s'ajoutent aux sections 1 à 6 du gabarit IMPL.

Résultat v4 : réussi pour le cœur et pour l'option C7 ; option C8 sautée (budget de tours).

  • Faites : C1 (v2), C3, C4, C5, C6, C7 et C9 (lectures 1 et 2).
  • Écrits sur disque : CharGenSlider, CharGen et VisualMorph, chacun compilé avec {warnings_as_errors:true} ({"returnValue":null}), journal sans Error ni Warning, puis enregistré (save_assets → true).
  • git status --short -- Content/ : exactement les 3 fichiers attendus. GI.uasset est inchangé.
  • Aucun refus du mode auto en v4. Une seule écriture par tour, relue dans le même tour, avant la suivante.

Historique v1 à v3 (même jour)

  • v1 : arrêt à l'étape 1, sans écriture, sur des écarts de SPEC :

    • sous-graphe de _85 à 14 nœuds au lieu de 16 ;
    • C8 a ; C9 lecture 1 ; C10 ;
    • hyper_blueprint_debug_inspect absent du serveur ; type_id en anglais.

    La SPEC § 9 (révision 2) a corrigé ces points.

  • v2 :

    • C1 faite et enregistrée dans CharGenSlider (MD5 cbe53469…) ;
    • arrêt dans CharGen : deux refus du mode auto sur un create_node (Modify Shared Resources) ;
    • F2 : Utilities|IsValid crée la macro, d'où la SPEC § 10 (révision 3 : la macro remplace Branche + IsValid) ;
    • éditeur fermé sans enregistrer CharGen.
  • v3 : C3 et C5 faites en mémoire, C4 à moitié ; refus du mode auto (Auto-Mode Bypass) sur la liaison de C4. Écart G2 : appels groupés, dont 25 partis après le refus. L'utilisateur a ensuite ajouté la règle de permission mcp__unreal-mcp__call_tool (décision « Option A1 », relayée par l'orchestrateur). Cette reprise v4 repart de l'état en mémoire de la v3.

0. Reprise v4 : méthode et appels

  • Éditeur : pid 15280 d'après l'orchestrateur, port 8000.
  • Une seule écriture call_tool par tour, suivie dans le même tour d'une lecture (get_node_infos par execute_tool_script, lecture seule) du ou des nœuds touchés. Chaque relecture a été vue avant l'écriture suivante.
  • Toutes les écritures ont rendu {"returnValue":null}, sauf create_node (refPath) et save_assets (true).
  • Ordre :
    1. relecture de l'état en mémoire (T1, § 1) ;
    2. C4 (1 écriture) ;
    3. C6 (1) ;
    4. C7 (23) ;
    5. compilation, journal et enregistrement de CharGen ;
    6. C9 (12) ;
    7. compilation, journal et enregistrement de VisualMorph.
  • Budget, décidé avant la première écriture (sk-protocol § 8) : le cœur demandait 22 tours, C7 23 écritures, C8 11. C7 et C8 ensemble dépassaient les 50 tours de la reprise. J'ai gardé C7, l'option approuvée par l'utilisateur (Q5), et sauté C8 (§ 2 H1).

1. Fichiers modifiés, opérations et liaisons relues

Fichier MD5 avant (manifeste CG2) MD5 après (md5sum, fin v4) État
Content\UI\CharGenSlider.uasset 9B194EA6072EE0CF635312E36A312E03 cbe53469fc73e7829a00710126095c7e modifié (C1, v2)
Content\UI\CharGen.uasset E4C2EEA6A3A2129EB8B382715609B1D5 8d781ec0b94318b5bfbf22ee3b33556a modifié (C3 à C7)
Content\UI\VisualMorph.uasset 849C46E046BD4FE498B3825AFE924F37 84dd9b17b977a007f9a13940406e970a modifié (C9)
Content\BPs\GI.uasset 32FC0A970AB194626E8DC07DF3A9633D 32fc0a970ab194626e8dc07df3a9633d inchangé

Préfixes : SL = /Game/UI/CharGenSlider.CharGenSlider:EventGraph, CG = /Game/UI/CharGen.CharGen:EventGraph, VM = /Game/UI/VisualMorph.VisualMorph:EventGraph ; nœud = <préfixe>.K2Node_<Nom>. Notation : A#i → B#j = de la broche de sortie i de A vers la broche d'entrée j de B.

T1, relecture de départ (lecture seule) : find_nodes CG rend 1330 nœuds, dont aucun des 13 nœuds de C3. Les liens de C5 sont conformes à la SPEC § 10 ; P20 n'a aucun lien ; CallFunction_14.B = 2 ; les liens d'origine de C7 sont intacts. Aucun écart : la reprise peut continuer.

C1 (v2, SL) : IfThenElse_5#1 → VariableSet_4226#0 ; CallFunction_11, CallFunction_6 et VariableGet_25 supprimés.

C3 (CG)

  • Lien coupé : ComponentBoundEvent_85#1 → IfThenElse_37#0.
  • 13 nœuds supprimés : IfThenElse_37, CallFunction_59, VariableGet_280, IfThenElse_38, CallFunction_93, VariableGet_281, VariableGet_282, CallFunction_303, CommutativeAssociativeBinaryOperator_28, CallFunction_305, CallFunction_306, CommutativeAssociativeBinaryOperator_29, CallFunction_307.
  • Relu : aucun présent ; _85 présent, ses sorties then et InValue sans lien.

C4 (CG)

  • P20 = CallFunction_95 (Development|PrintString) : InString = CG2 CharGen Construct : cast GI echoue, bPrintToScreen = false, bPrintToLog = true.
  • Écriture v4 : DynamicCast_0#1 (CastFailed) → CallFunction_95#0.
  • Relu : DynamicCast_0 : then → VariableSet_2949#0, CastFailed → CallFunction_95#0 ; CallFunction_95 : then libre.

C5 (CG, macro IsValid de la SPEC § 10)

  • Lien coupé : CallFunction_144#0 → IfThenElse_2#0.
  • Liens de la garde :
    • CallFunction_144#0 → MacroInstance_40#0 (exec) ;
    • VariableGet_385#0 → MacroInstance_40#1 (InputObject). VariableGet_385 garde ses liens d'origine (VariableGet_386, CallFunction_7) ;
    • MacroInstance_40#0 (Is Valid) → IfThenElse_2#0, dont les sorties ne changent pas (then → CallFunction_8, else → CallFunction_1305) ;
    • MacroInstance_40#1 (Is Not Valid) → P25 = CallFunction_140#0.
  • P25 : InString = CG2 CharGen sans personnage edite : boutons d'etat desactives, bPrintToScreen = false, bPrintToLog = true.
  • Chaîne d'exécution : _140#0 → _187#0 → _225#0 → _336#0 → _337#0 → _338#0 → _339#0 → _340#0 → _341#0 → _342#0. La sortie then de _342 est libre.
  • 9 Widget|SetIsEnabled, bInIsEnabled = false ; cible (broche 1) ← getter (Variables|CharGen|Get<bouton>) :
SetIsEnabled Getter Événement du bouton
CallFunction_187 VariableGet_48 _179
CallFunction_225 VariableGet_55 _149
CallFunction_336 VariableGet_301 _87
CallFunction_337 VariableGet_302 _24
CallFunction_338 VariableGet_303 _75
CallFunction_339 VariableGet_304 _76
CallFunction_340 VariableGet_305 _34
CallFunction_341 VariableGet_306 _5
CallFunction_342 VariableGet_307 _10

C6 (CG) : set_pin_value CallFunction_14#1 (B) = 0. Relu : 0:A=0 > CommutativeAssociativeBinaryOperator_2#0, 1:B=0, 2:bPickA > CallFunction_15#0, ReturnValue > GetArrayItem_0#1.

C7 (CG, option, cascade de 3 Branches, pas de OR)

  • Nœuds créés :
    • Utilities|String|Contains : K1 = CallFunction_343, K2 = CallFunction_344, K3 = CallFunction_346. bUseCase = false par défaut, relu ;
    • Utilities|FlowControl|Branch : B1 = IfThenElse_39, B2 = IfThenElse_40, B3 = IfThenElse_41.
  • Substring relus : K1 = .. (2 caractères), K2 = / (1 caractère), K3 = \ (1 caractère, code 92).
  • S = CallFunction_5136#0 → K1#0, K2#0, K3#0 (SearchIn). S garde ses liens vers CallFunction_5137#0 et CallFunction_5375#2.
  • Conditions : K1#0 → B1#1 ; K2#0 → B2#1 ; K3#0 → B3#1.
  • Exécution :
    • lien coupé : IfThenElse_366#0 → CallFunction_5375#0 ;
    • IfThenElse_366#0 → B1#0 ;
    • B1#0 → CallFunction_51#0 (F) ; B1#1 → B2#0 ;
    • B2#0 → F ; B2#1 → B3#0 ;
    • B3#0 → F ; B3#1 → CallFunction_5375#0.
  • Relu en fin de C7 : CallFunction_51 execute ← IfThenElse_366#1, IfThenElse_39#0, IfThenElse_40#0, IfThenElse_41#0 ; CallFunction_5375 execute ← IfThenElse_41#1, then → CallFunction_1396#0 (inchangé).

C8 : sautée (§ 2 H1).

C9 (VM, macro IsValid de la SPEC § 10)

  • Lecture 1 : MI1 = MacroInstance_3.
    • Lien coupé : VariableSet_1#0 → IfThenElse_1#0.
    • VariableSet_1#0 → MacroInstance_3#0 ; VariableGet_16#0 → MacroInstance_3#1 (VariableGet_16 garde son lien vers VariableGet_17).
    • MacroInstance_3#0 (Is Valid) → IfThenElse_1#0 ; MacroInstance_3#1 (Is Not Valid) → Knot_0#0.
    • Relu : Knot_0 entrée ← VariableSet_2#0, IfThenElse_1#1, MacroInstance_3#1 ; sortie → CallFunction_27#0. IfThenElse_1 : then → VariableSet_2#0, else → Knot_0#0.
  • Lecture 2 : MI2 = MacroInstance_4.
    • Lien coupé : Knot_1#0 → CallArrayFunction_0#0.
    • Knot_1#0 → MacroInstance_4#0 ; VariableGet_27#0 → MacroInstance_4#1 (VariableGet_27 garde son lien vers VariableGet_29).
    • MacroInstance_4#0 (Is Valid) → CallArrayFunction_0#0 ; MacroInstance_4#1 (Is Not Valid) → CallFunction_16#0.
    • Relu : CallFunction_16 execute ← CallArrayFunction_0#0, MacroInstance_4#1.

2. Écarts à la SPEC et à la fiche (v4)

  • H1 (option non faite) : C8 (insertion de ClearChildren, Branche de Split dans la boucle) n'est pas faite. Il aurait fallu 11 écritures de plus, au-delà des 50 tours de la reprise. La décision a été prise avant la première écriture, pour ne pas couper une opération en cours (sk-protocol § 8). D21 reste ouvert. C8 se reprend seule dans une fiche courte (SPEC § 2 et § 9).
  • H2 (forme) : chaque relecture s'est faite par execute_tool_script (get_node_infos, lecture seule), dans le même tour que l'écriture, juste après elle. Aucune écriture groupée.
  • H3 (positions) : les nouveaux nœuds sont placés près de leurs voisins (coordonnées choisies à la main). Sans effet sur le comportement.
  • Aucun autre écart : les opérations suivent la SPEC § 2, § 9 et § 10.

3. Instantané

Snapshot.ps1 -Lot CG2, pris par l'orchestrateur : manifeste D:\Game\LifePlay_Backup_5.5\CG2\manifest.csv. Retour arrière proposé, non lancé, éditeur fermé : .\Tools\Restore.ps1 -Lot CG2 -WhatIf, puis -Only <fichier> pour le Blueprint en cause.

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

  • C8 (option, H1).
  • C2 sautée (SPEC § 9). C10 et C11 retirées en B2 (SPEC § 9).
  • Étape 6 : fermeture de l'éditeur, RunCommandlet.ps1 -Lot CG2 -Commandlet CompileAllBlueprints, build : à faire par l'orchestrateur.

5. Points à confirmer en VAL (SPEC § 7)

  • V1 : git status --short -- Content/ doit rendre M sur CharGen.uasset, CharGenSlider.uasset, VisualMorph.uasset, et rien d'autre. Relevé en fin de v4 : conforme (§ 7).
  • V2 : get_node_infos des nœuds du § 1. CallFunction_14.B = 0. P20 et P25 : écran faux, journal vrai. Les 9 SetIsEnabled : bInIsEnabled = false. Substring de K3 : 1 caractère (\).
  • V3 : compilations {"returnValue":null} et journal sans Error ni Warning (§ 6 bis).
  • V4 : CompileAllBlueprints, éditeur fermé : 0 erreur ; aucun avertissement nouveau sur les 3 Blueprints.
  • V5 : MD5 après du § 1, différents du manifeste pour les 3 fichiers ; GI égal au manifeste.
  • V6a à V6d : en jeu, build Development.
  • V6e (C8) : sans objet, C8 non faite.
  • Point de B2 noté (SPEC § 9) : dans VM, la condition de IfThenElse_1 lit encore IsMale du personnage édité sans garde.
  • V7 : PubCheck et fins de ligne de ce livrable.

6. Fichiers à commiter

Dépôt du jeu, branche ue5.8, par le gardien sur ticket, après la VAL :

  • M Content/UI/CharGenSlider.uasset
  • M Content/UI/CharGen.uasset
  • M Content/UI/VisualMorph.uasset
  • A Docs/Migration/etat/CG/CG2/CG2-IMPL-01.md

6 bis. Diagnostics avant / après, sorties de compilation, journal

Blueprint Avant (v1) Après
CharGenSlider compile_blueprint {warnings_as_errors:true} → {"returnValue":null} {"returnValue":null} (v2) ; save_assets → {"returnValue":true}
CharGen {"returnValue":null} {"returnValue":null} (v4) ; save_assets ["/Game/UI/CharGen"] → {"returnValue":true}
VisualMorph {"returnValue":null} {"returnValue":null} (v4) ; save_assets ["/Game/UI/VisualMorph"] → {"returnValue":true}

Journal de l'éditeur, appel EditorToolset.LogsToolset.GetLogEntries {category:"", pattern:"(Error|Warning).*(CharGen|VisualMorph)|(CharGen|VisualMorph).*(Error|Warning)|Compiling Blueprint '/Game/UI/(CharGen|VisualMorph)", maxEntries:20}, après la compilation de VisualMorph. Sortie brute (aucune ligne Error ou Warning) :

[2026.10.20-00.15.32:405][ 67]LogBlueprint: Compiling Blueprint '/Game/UI/CharGen.CharGen'
[2026.10.20-00.17.41:073][451]LogBlueprint: Compiling Blueprint '/Game/UI/VisualMorph.VisualMorph'

Pour CharGenSlider (v2), le même contrôle avait rendu [] pour (Error|Warning).

7. État final

git status --short -- Content/
 M Content/UI/CharGen.uasset
 M Content/UI/CharGenSlider.uasset
 M Content/UI/VisualMorph.uasset

md5sum : CharGenSlider cbe53469fc73e7829a00710126095c7e, CharGen 8d781ec0b94318b5bfbf22ee3b33556a, VisualMorph 84dd9b17b977a007f9a13940406e970a, GI 32fc0a970ab194626e8dc07df3a9633d (inchangé). L'éditeur reste ouvert (pid 15280, port 8000), sans paquet sale connu pour ces 3 Blueprints. Fermeture, puis BUILD-FIN : orchestrateur.

Tours : v1 18 / 75 ; v2 21 / 50 ; v3 11 / 50 ; v4 45 / 50 (déclarés ; FicheStats fait foi)

État de reprise

  • Établi : C1, C3, C4, C5, C6, C7 et C9 enregistrées et compilées proprement.
  • Reste :
    • C8 (option) : fiche courte, environ 15 tours, une écriture par tour (SPEC § 9 pour a, § 2 pour b) ;
    • étape 6 (CompileAllBlueprints éditeur fermé) ;
    • build Development et VAL.
  • Prochaine commande pour C8 : break_pins {output_pin:{direction:"EGPD_Output", index_id:1, node:{refPath:"/Game/UI/CharGen.CharGen:EventGraph.K2Node_CustomEvent_139"}}, input_pin:{direction:"EGPD_Input", index_id:0, node:{refPath:"/Game/UI/CharGen.CharGen:EventGraph.K2Node_VariableSet_508"}}} (après la création de ClearChildren, Widget|Panel|ClearChildren, et du getter Variables|CharGen|GetLoadScrollBox).

Constats

  • À verser : lp-mcp § 3 :
    • en mode auto, avec la règle de permission mcp__unreal-mcp__call_tool, il faut un tour par écriture, relue dans le même tour : environ 1 tour par broche, à prévoir au budget (C7 = 23 tours) ;
    • Utilities|String|Contains : 0:SearchIn, 1:Substring, 2:bUseCase (défaut false) ;
    • set_pin_value d'un \ : la valeur JSON "\\" donne bien 1 caractère (code 92) ;
    • macro IsValid : 0:exec, 1:InputObject → 0:Is Valid, 1:Is Not Valid.
  • À verser : sk-protocol § 8 : choisir les options à faire avant la première écriture, selon le nombre d'écritures, pour ne pas couper un Blueprint en cours.