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,CharGenetVisualMorph, chacun compilé avec{warnings_as_errors:true}({"returnValue":null}), journal sansErrorniWarning, puis enregistré (save_assets→true). git status --short -- Content/: exactement les 3 fichiers attendus.GI.uassetest 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_inspectabsent du serveur ;type_iden anglais.
La SPEC § 9 (révision 2) a corrigé ces points.
- sous-graphe de
-
v2 :
- C1 faite et enregistrée dans
CharGenSlider(MD5cbe53469…) ; - arrêt dans
CharGen: deux refus du mode auto sur uncreate_node(Modify Shared Resources) ; - F2 :
Utilities|IsValidcrée la macro, d'où la SPEC § 10 (révision 3 : la macro remplace Branche + IsValid) ; - éditeur fermé sans enregistrer
CharGen.
- C1 faite et enregistrée dans
-
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 permissionmcp__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_toolpar tour, suivie dans le même tour d'une lecture (get_node_infosparexecute_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}, saufcreate_node(refPath) etsave_assets(true). - Ordre :
- relecture de l'état en mémoire (T1, § 1) ;
- C4 (1 écriture) ;
- C6 (1) ;
- C7 (23) ;
- compilation, journal et enregistrement de
CharGen; - C9 (12) ;
- 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 ;
_85présent, ses sortiesthenetInValuesans 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:thenlibre.
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_385garde 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_342est 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 = falsepar défaut, relu ;Utilities|FlowControl|Branch: B1 =IfThenElse_39, B2 =IfThenElse_40, B3 =IfThenElse_41.
Substringrelus : 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 versCallFunction_5137#0etCallFunction_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.
- lien coupé :
- Relu en fin de C7 :
CallFunction_51execute←IfThenElse_366#1,IfThenElse_39#0,IfThenElse_40#0,IfThenElse_41#0;CallFunction_5375execute←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_16garde son lien versVariableGet_17).MacroInstance_3#0(Is Valid) →IfThenElse_1#0;MacroInstance_3#1(Is Not Valid) →Knot_0#0.- Relu :
Knot_0entrée ←VariableSet_2#0,IfThenElse_1#1,MacroInstance_3#1; sortie →CallFunction_27#0.IfThenElse_1: then →VariableSet_2#0, else →Knot_0#0.
- Lien coupé :
- 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_27garde son lien versVariableGet_29).MacroInstance_4#0(Is Valid) →CallArrayFunction_0#0;MacroInstance_4#1(Is Not Valid) →CallFunction_16#0.- Relu :
CallFunction_16execute←CallArrayFunction_0#0,MacroInstance_4#1.
- Lien coupé :
2. Écarts à la SPEC et à la fiche (v4)
- H1 (option non faite) : C8 (insertion de
ClearChildren, Branche deSplitdans 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 rendreMsurCharGen.uasset,CharGenSlider.uasset,VisualMorph.uasset, et rien d'autre. Relevé en fin de v4 : conforme (§ 7). - V2 :
get_node_infosdes nœuds du § 1.CallFunction_14.B = 0. P20 et P25 : écran faux, journal vrai. Les 9SetIsEnabled:bInIsEnabled = false.Substringde K3 : 1 caractère (\). - V3 : compilations
{"returnValue":null}et journal sansErrorniWarning(§ 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 deIfThenElse_1lit encoreIsMaledu 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.uassetM Content/UI/CharGen.uassetM Content/UI/VisualMorph.uassetA 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 deClearChildren,Widget|Panel|ClearChildren, et du getterVariables|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éfautfalse) ;set_pin_valued'un\: la valeur JSON"\\"donne bien 1 caractère (code 92) ;- macro
IsValid:0:exec,1:InputObject→0:Is Valid,1:Is Not Valid.
- en mode auto, avec la règle de permission
- À 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.