LifePlay-Revival/Docs/Migration/etat/CAM/CAM-B2i-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

16 KiB

Fiche CAM-B2i — Niveau N3 — Modèle prévu non précisé par la fiche | utilisé claude-opus-5-5 — Agent lp-mcp-bp (A-MCP-BP) — Skills sk-protocol, sk-change-safety, lp-mcp, lp-lot

CAM-B2i-IMPL : garde « hors sexe » sur les 5 branches « C2 ? » de Room, Room enregistré (2026-10-13)

Résultat : réussi, en un passage dans l'éditeur headless déjà lancé par l'orchestrateur (pid 38248, port 8000).

  • État lu conforme au tableau de la fiche ; 3 nœuds créés (NOT, AND n° 1, AND n° 2) et 10 liens posés (L1 à L10).
  • Relecture conforme ; compilation stricte sans diagnostic ; save_assets de Room seul.
  • Room passe de 0c8eb59f… à 18565365…. GI et Person sont inchangés et n'ont pas été chargés.

Spécification : Docs/Migration/etat/CAM/CAM-B2i-FICHE.md ; contexte : CAM-COMMUN4-DIAG.md §§ 1 à 3. Préfixe des nœuds : /Game/BPs/Room.Room:EventGraph.. Un seul appel MCP par message. Outils : editor_toolset.toolsets.asset.AssetTools (AT) et editor_toolset.toolsets.blueprint.BlueprintTools (BT).

Abréviations : NOT_453 = K2Node_CallFunction_453 ; AND1 = K2Node_CommutativeAssociativeBinaryOperator_61 ; AND2 = K2Node_CommutativeAssociativeBinaryOperator_62 ; OR_60 = K2Node_CommutativeAssociativeBinaryOperator_60 ; PO_8 = K2Node_PromotableOperator_8 ; 86 = K2Node_VariableGet_86 ; 9x = K2Node_IfThenElse_9x. PinID au format {direction, index_id} du nœud nommé.

1. Fichiers modifiés

  • Content/BPs/Room.uasset : 3 nœuds créés, 10 liens posés (dont 5 qui remplacent un lien existant).
    • MD5 0c8eb59f55cb02ad2c4fa1413840b84b (6 380 477 octets) devient 18565365b1195bf2416a1048bf9051b6 (6 387 514 octets, 2026-10-13 22:48:32 locale).
    • Seule sauvegarde du journal de l'éditeur : l. 2297, LogFileHelpers: Saving Package: /Game/BPs/Room.
  • Content/BPs/GI.uasset = e64b5b37c9ef0db7735de0d6e3bd7c1c et Content/BPs/Person.uasset = 8668a47c627f7a5254910cf0ac33b12a, comme au début. Ni l'un ni l'autre n'a été chargé.
    • git status les marque M : déjà le cas au début de la session (lots précédents), pas de cette fiche.
  • Docs/Migration/etat/CAM/CAM-B2i-IMPL.md : ce livrable.

1.1 Appels MCP, dans l'ordre

# Appel Arguments Retour
1 AT.load_asset {asset_path:"/Game/BPs/Room"} {"refPath":"/Game/BPs/Room.Room"}
2 BT.get_node_infos PO_8, OR_60, 86, 96, 97, 98, 99, 100, 91 état avant, conforme au tableau de la fiche (§ 1.3)
3 BT.find_node_types {graph:{refPath:"…:EventGraph"}, type_id_filter:"NOTBoolean", context_pins:[]} `["Math
4 BT.find_node_types idem, type_id_filter:"ANDBoolean" `["Math
5 BT.create_node `{graph:{refPath:"…:EventGraph"}, type_id:"Math Booléen
6 BT.create_node idem, `type_id:"Math Booléen
7 BT.create_node idem, `type_id:"Math Booléen
8 BT.get_node_infos NOT_453, AND1, AND2 NOT : A {EGPD_Input,0}, ReturnValue {EGPD_Output,0} ; AND1 et AND2 : A {EGPD_Input,0}, B {EGPD_Input,1}, ReturnValue {EGPD_Output,0} ; toutes false et libres ; aucune entrée en plus
9 BT.connect_pins (L1) 86 {EGPD_Output,0} (SexOn) → NOT_453 {EGPD_Input,0} (A) null
10 BT.connect_pins (L2) OR_60 {EGPD_Output,0} → AND1 {EGPD_Input,0} (A) null
11 BT.connect_pins (L3) NOT_453 {EGPD_Output,0} → AND1 {EGPD_Input,1} (B) null
12 BT.connect_pins (L4) AND1 {EGPD_Output,0} → 96 {EGPD_Input,1} (Condition) null
13 BT.connect_pins (L5) AND1 {EGPD_Output,0} → 97 {EGPD_Input,1} (Condition) null
14 BT.connect_pins (L6) PO_8 {EGPD_Output,0} → AND2 {EGPD_Input,0} (A) null
15 BT.connect_pins (L7) NOT_453 {EGPD_Output,0} → AND2 {EGPD_Input,1} (B) null
16 BT.connect_pins (L8) AND2 {EGPD_Output,0} → 98 {EGPD_Input,1} (Condition) null
17 BT.connect_pins (L9) AND2 {EGPD_Output,0} → 99 {EGPD_Input,1} (Condition) null
18 BT.connect_pins (L10) AND2 {EGPD_Output,0} → 100 {EGPD_Input,1} (Condition) null
19 BT.get_node_infos PO_8, OR_60, 86, NOT_453, AND1, AND2, 96 à 100, 91 relecture conforme (§ 1.3, § 1.4)
20 AT.is_dirty {asset_path:"/Game/BPs/Room"} true
21 BT.compile_blueprint {blueprint:{refPath:"/Game/BPs/Room.Room"}, warnings_as_errors:true} null (pas d'exception)
22 AT.save_assets {asset_paths:["/Game/BPs/Room"]} true, confirmé par le journal et le MD5

Aucun break_pins, delete_node ni set_pin_value. Aucune écriture par HyperAIStudio. Aucun autre asset chargé.

1.2 Nœuds créés (refPath complets)

Nœud refPath type_id Position
NOT /Game/BPs/Room.Room:EventGraph.K2Node_CallFunction_453 `Math Booléen
AND n° 1 /Game/BPs/Room.Room:EventGraph.K2Node_CommutativeAssociativeBinaryOperator_61 `Math Booléen
AND n° 2 /Game/BPs/Room.Room:EventGraph.K2Node_CommutativeAssociativeBinaryOperator_62 `Math Booléen

Les trois noms sont absents du dump de référence CAM-B2g-VAL_LPDumpFunction_20261013-211708.txt (Grep, 0 occurrence ; OR_60 et PO_8 y figurent, 13 occurrences) : ils apparaîtront comme nœuds nouveaux au diff de V5.

1.3 Conditions 96 à 100 : avant (appel 2) et après (appel 19)

Branche (événement) Condition {EGPD_Input,1} avant Condition après execute {EGPD_Input,0} then {EGPD_Output,0} else {EGPD_Output,1} Position
96 (CircleCamera) ← OR_60 [0] ← AND1 [0] ← CustomEvent_1 [1] → CallFunction_516 [0] → IfThenElse_26 [0] (5650, 4450)
97 (LeftRight) ← OR_60 [0] ← AND1 [0] ← CustomEvent_4 [1] → CallFunction_518 [0] → IfThenElse_9 [0] (5250, 2950)
98 (ScrollDownUp) ← PO_8 [0] ← AND2 [0] ← CustomEvent_55 [1] → VariableSet_69 [0] → IfThenElse_10 [0] (5100, 2350)
99 (RotateCamera) ← PO_8 [0] ← AND2 [0] ← CustomEvent_19 [1] → VariableSet_70 [0] → IfThenElse_25 [0] (5450, 5800)
100 (DownUp) ← PO_8 [0] ← AND2 [0] ← CustomEvent_8 [1] → VariableSet_71 [0] → IfThenElse_8 [0] (5750, 4250)

execute, then, else et positions : identiques avant et après pour les cinq branches. Valeur par défaut de la Condition : true avant et après (sans effet, broche reliée).

1.4 Sorties partagées et nœuds créés : avant et après

Broche (PinID) Avant (appel 2 ou 8) Après (appel 19)
PO_8 ReturnValue {EGPD_Output,0} → 91 [1], 98 [1], 99 [1], 100 [1], OR_60 [0] → 91 [1], OR_60 [0], AND2 [0] ; plus 98, 99 ni 100
PO_8 A {EGPD_Input,0} / B {EGPD_Input,1} ← CallFunction_439 / ← VariableGet_268 identique
OR_60 ReturnValue {EGPD_Output,0} → 96 [1], 97 [1] → AND1 [0] seulement
OR_60 A {EGPD_Input,0} / B {EGPD_Input,1} ← PO_8 / ← VariableGet_269 identique
86 SexOn {EGPD_Output,0} (` GetSexOn`) → CommutativeAssociativeBinaryOperator_19 [1], IfThenElse_29 [1], IfThenElse_28 [1]
86 self {EGPD_Input,0} ← VariableGet_103 (GI) identique
NOT_453 A {EGPD_Input,0} absent ← 86 SexOn
NOT_453 ReturnValue {EGPD_Output,0} absent → AND1 [1], AND2 [1]
AND1 A {EGPD_Input,0} / B {EGPD_Input,1} absent ← OR_60 / ← NOT_453
AND1 ReturnValue {EGPD_Output,0} absent → 96 [1], 97 [1]
AND2 A {EGPD_Input,0} / B {EGPD_Input,1} absent ← PO_8 / ← NOT_453
AND2 ReturnValue {EGPD_Output,0} absent → 98 [1], 99 [1], 100 [1]
91 Condition {EGPD_Input,1} (UpdateRoomCam) ← PO_8 ← PO_8 (inchangé) ; execute ← CustomEvent_45 [1], then → IfThenElse_92, else → IfThenElse_81, identiques

Garde Accessed None (lp-mcp § 1 règle 4) : aucun IsValid ajouté, comme le prévoit le DIAG § 3.

  • NOT et AND sont des nœuds purs : toutes leurs entrées sont évaluées.
  • Estimé sans risque nouveau :
    • 86 lit GI.SexOn par VariableGet_103 (GI de Room), une lecture que 19, 28 et 29 faisaient déjà ; la validité de GI n'est pas relue ici (DIAG § 3 : « GI est toujours valide ») ;
    • PO_8 et OR_60 étaient déjà évalués par ces mêmes branches avant le correctif.
  • Comportement voulu par la fiche : hors sexe, NOT SexOn = vrai, donc les conditions valent comme en B2h ; pendant le sexe, les cinq branches prennent else (comportement d'origine).

1.5 Compilation et sauvegarde (journal D:\Game\LifePlay_Backup_5.5\CAM-B2i\editeur\editeur-B2i.log)

  • 2289 lignes avant la compilation, aucune ligne Saving Package avant.
  • Après l'appel 21 : LogBlueprint: Compiling Blueprint '/Game/BPs/Room.Room'. Puis 0 ligne error ou warning (insensible à la casse) de la l. 2290 à la fin (l. 2327), sauvegarde et validation comprises.
  • hyper_blueprint_debug_inspect n'a pas été appelé : il est absent du serveur (repli prévu : warnings_as_errors et le journal).
  • Sauvegarde, l. 2297 : Saving Package: /Game/BPs/Room. Puis Moving '…/Saved/RoomC82CCF5C436EB580A5A27783211AE840.tmp' to '…/Content/BPs/Room.uasset' et AssetCheck: /Game/BPs/Room Validation de la ressource. Le journal n'a pas d'autre ligne Saving Package.

2. Écarts à la SPEC

  • Aucun écart sur l'état lu, les types, les nœuds, les liens ni la relecture.
  • Positions : la fiche dit seulement « près de 86 ou de 96 » et « près de 96 » / « près de 98 ». Valeurs choisies au § 1.2.
  • Le NOT est un K2Node_CallFunction (_453), pas un CommutativeAssociativeBinaryOperator comme les AND et le OU. C'est attendu : NOTBoolean est un appel de fonction simple, à une entrée.
  • Méthode : une commande Bash de lecture (MD5 et journal) a été refusée par le crochet ecriture-gardien (Constats). Elle a été rejouée sans le motif fautif ; rien n'a été écrit.
  • GI et Person n'ont pas été ouverts. Ni build, ni commandlet, ni jeu. L'éditeur n'a été ni lancé ni arrêté.

3. Instantané

  • D:\Game\LifePlay_Backup_5.5\CAM-B2i\manifest.csv (pris par l'orchestrateur), relu : "Content\BPs\Room.uasset","True","6380477","0C8EB59F55CB02AD2C4FA1413840B84B","2026-10-13T22:45:46".
  • MD5 sur le disque avant l'appel 1 = celui du manifeste.
  • Retour arrière proposé, non lancé, par l'orchestrateur, éditeur fermé, sur accord :
    1. .\Tools\Snapshot.ps1 -Lot CAM-B2i-retour -Path Content\BPs\Room.uasset ;
    2. .\Tools\Restore.ps1 -Lot CAM-B2i -WhatIf ;
    3. .\Tools\Restore.ps1 -Lot CAM-B2i -Only Content\BPs\Room.uasset. Contrôle : md5sum Content/BPs/Room.uasset = 0c8eb59f….
  • Entrée : 2026-10-13 | CAM-B2i, garde hors sexe sur 96-100 | Content/BPs/Room.uasset | retour arrière : Restore.ps1 -Lot CAM-B2i -Only Content\BPs\Room.uasset | instantané : D:\Game\LifePlay_Backup_5.5\CAM-B2i | vérification : relecture conforme, compilation stricte 0 diagnostic, Room = 18565365….

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

  • Le nombre de nœuds de Room (V5 : 1264 attendu) n'a pas été compté ; find_nodes n'a pas été appelé (aucun nœud supprimé dans cette fiche).
  • Les nœuds 19, 28, 29, 26, 9, 10, 25, 8 et les VariableSet / CallFunction en aval n'ont pas été relus en propre : leurs liens se lisent sur les broches relues (§ 1.3, § 1.4).
  • is_dirty n'a pas été relu après la sauvegarde (la fiche ne le demande pas).
  • CompileAllBlueprints éditeur fermé, build empaqueté, LogStats, essai en jeu : hors fiche (lp-mcp § 1 règles 3 et 5).
  • L'éditeur n'est pas fermé (rôle de l'orchestrateur, puis BUILD-FIN).

5. Points à confirmer en VAL

  • Room = 18565365b1195bf2416a1048bf9051b6 ; GI = e64b5b37… et Person = 8668a47c… inchangés.
  • V5 : EventGraph à 1264 nœuds (non compté ici).
  • V5, diff de Room limité à :
    • 3 nœuds nouveaux : K2Node_CallFunction_453 (NOT), K2Node_CommutativeAssociativeBinaryOperator_61 et _62 (AND) ;
    • conditions de 96 et 97 ← _61, de 98, 99 et 100 ← _62 ;
    • sorties de PO_8 (91, OR_60.A, _62.A), de OR_60 (_61.A seul) et de 86 (19, 29, 28, _453).
  • then / else de 96 à 100 et la Condition de 91 inchangés.
  • V6 : CompileAllBlueprints éditeur fermé = référence (3 erreurs CR_FaceExpRig, Room compilé sans erreur ni avertissement nouveau).
  • V7 (build suivant) : cas CAM-29 à CAM-32 de CAM-COMMUN4-DIAG.md § 4.

6. Fichiers à commiter

  • M Content/BPs/Room.uasset (dépôt du jeu, branche ue5.8).
  • A Docs/Migration/etat/CAM/CAM-B2i-IMPL.md (dépôt du jeu, branche ue5.8).
  • Pas GI ni Person : leur M vient de lots antérieurs.

Mesuré

$ md5sum Content/BPs/Room.uasset Content/BPs/GI.uasset Content/BPs/Person.uasset   (avant l'appel 1)
0c8eb59f55cb02ad2c4fa1413840b84b */d/Game/LifePlay-master 5.8/Content/BPs/Room.uasset
e64b5b37c9ef0db7735de0d6e3bd7c1c */d/Game/LifePlay-master 5.8/Content/BPs/GI.uasset
8668a47c627f7a5254910cf0ac33b12a */d/Game/LifePlay-master 5.8/Content/BPs/Person.uasset
$ wc -l editeur-B2i.log   (avant l'appel 21)
2289 /d/Game/LifePlay_Backup_5.5/CAM-B2i/editeur/editeur-B2i.log
$ grep -n "Saving Package" editeur-B2i.log   (avant l'appel 21)
(aucune ligne)
$ tail -n +2290 editeur-B2i.log | grep -ciE "error|warning"   (après les appels 21 et 22)
0
$ grep -n "Saving Package" editeur-B2i.log   (après l'appel 22)
2297:[2026.10.13-20.48.31:641][188]LogFileHelpers: Saving Package: /Game/BPs/Room
$ md5sum Content/BPs/Room.uasset Content/BPs/GI.uasset Content/BPs/Person.uasset   (après l'appel 22)
18565365b1195bf2416a1048bf9051b6 *Content/BPs/Room.uasset
e64b5b37c9ef0db7735de0d6e3bd7c1c *Content/BPs/GI.uasset
8668a47c627f7a5254910cf0ac33b12a *Content/BPs/Person.uasset
$ stat -c "%s %y" Content/BPs/Room.uasset
6387514 2026-10-13 22:48:32.279568100 +0200
$ git status --short -- Content/BPs/
 M Content/BPs/GI.uasset
 M Content/BPs/Person.uasset
 M Content/BPs/Room.uasset

Tours : 31 / 60

Constats

  • À verser dans lp-mcp § 3 (vérifié aujourd'hui) :
    • type_id du NON booléen : Math|Booléen|NOTBoolean (filtre NOTBoolean, 1 résultat) ; il se crée en K2Node_CallFunction_<n>, à une entrée A {EGPD_Input,0} ;
    • type_id du ET booléen : Math|Booléen|ANDBoolean (filtre ANDBoolean : NAND et AND) ; il se crée en K2Node_CommutativeAssociativeBinaryOperator_<n>, à 2 entrées par défaut ;
    • connect_pins vers une Condition déjà reliée remplace l'ancien lien (confirmé 5 fois : 96 à 100) ;
    • create_node et connect_pins mettent is_dirty à vrai (confirmé, sans la Branche isolée de B2f-a).
  • À verser dans sk-protocol § 7 : le crochet ecriture-gardien lit <…> dans un argument Bash comme une redirection. sed "s/ $USERNAME / <compte> /" a été refusé (« Ecriture: redirection vers / »). Pour masquer le compte dans une sortie lue, utiliser stat -c "%s %y" ou masquer à la rédaction, sans < ni > dans la commande.
  • Le message système « unreal-mcp encore en connexion » est apparu après l'appel 1, alors que l'appel avait réussi ; les 21 appels suivants ont tous répondu. Sans effet constaté.