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_assetsde 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) devient18565365b1195bf2416a1048bf9051b6(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.
- MD5
Content/BPs/GI.uasset=e64b5b37c9ef0db7735de0d6e3bd7c1cetContent/BPs/Person.uasset=8668a47c627f7a5254910cf0ac33b12a, comme au début. Ni l'un ni l'autre n'a été chargé.git statusles marqueM: 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 :
86litGI.SexOnparVariableGet_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_8etOR_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 prennentelse(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 Packageavant. - Après l'appel 21 :
LogBlueprint: Compiling Blueprint '/Game/BPs/Room.Room'. Puis 0 ligneerrorouwarning(insensible à la casse) de la l. 2290 à la fin (l. 2327), sauvegarde et validation comprises. hyper_blueprint_debug_inspectn'a pas été appelé : il est absent du serveur (repli prévu :warnings_as_errorset le journal).- Sauvegarde, l. 2297 :
Saving Package: /Game/BPs/Room. PuisMoving '…/Saved/RoomC82CCF5C436EB580A5A27783211AE840.tmp' to '…/Content/BPs/Room.uasset'etAssetCheck: /Game/BPs/Room Validation de la ressource. Le journal n'a pas d'autre ligneSaving 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 unCommutativeAssociativeBinaryOperatorcomme les AND et le OU. C'est attendu :NOTBooleanest 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 :
.\Tools\Snapshot.ps1 -Lot CAM-B2i-retour -Path Content\BPs\Room.uasset;.\Tools\Restore.ps1 -Lot CAM-B2i -WhatIf;.\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_nodesn'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/CallFunctionen aval n'ont pas été relus en propre : leurs liens se lisent sur les broches relues (§ 1.3, § 1.4). is_dirtyn'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_61et_62(AND) ; - conditions de 96 et 97 ←
_61, de 98, 99 et 100 ←_62; - sorties de PO_8 (91,
OR_60.A,_62.A), deOR_60(_61.A seul) et de 86 (19, 29, 28,_453).
- 3 nœuds nouveaux :
- then / else de 96 à 100 et la Condition de 91 inchangés.
- V6 :
CompileAllBlueprintséditeur fermé = référence (3 erreursCR_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
Mvient 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_iddu NON booléen :Math|Booléen|NOTBoolean(filtreNOTBoolean, 1 résultat) ; il se crée enK2Node_CallFunction_<n>, à une entrée A{EGPD_Input,0};type_iddu ET booléen :Math|Booléen|ANDBoolean(filtreANDBoolean: NAND et AND) ; il se crée enK2Node_CommutativeAssociativeBinaryOperator_<n>, à 2 entrées par défaut ;connect_pinsvers une Condition déjà reliée remplace l'ancien lien (confirmé 5 fois : 96 à 100) ;create_nodeetconnect_pinsmettentis_dirtyà vrai (confirmé, sans la Branche isolée de B2f-a).
- À verser dans sk-protocol § 7 : le crochet
ecriture-gardienlit<…>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, utiliserstat -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é.