203 lines
16 KiB
Markdown
203 lines
16 KiB
Markdown
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|Booléen|NOTBoolean"]` |
|
|
| 4 | BT.`find_node_types` | idem, `type_id_filter:"ANDBoolean"` | `["Math|Booléen|NANDBoolean","Math|Booléen|ANDBoolean"]` |
|
|
| 5 | BT.`create_node` | `{graph:{refPath:"…:EventGraph"}, type_id:"Math|Booléen|NOTBoolean", pos:{x:5100,y:4850}}` | `{"refPath":"…K2Node_CallFunction_453"}` |
|
|
| 6 | BT.`create_node` | idem, `type_id:"Math|Booléen|ANDBoolean", pos:{x:5500,y:4700}` | `{"refPath":"…K2Node_CommutativeAssociativeBinaryOperator_61"}` |
|
|
| 7 | BT.`create_node` | idem, `type_id:"Math|Booléen|ANDBoolean", pos:{x:4850,y:2450}` | `{"refPath":"…K2Node_CommutativeAssociativeBinaryOperator_62"}` |
|
|
| 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|NOTBoolean` | (5100, 4850), entre 86 (5344, 5168) et 96 (5650, 4450) |
|
|
| AND n° 1 | `/Game/BPs/Room.Room:EventGraph.K2Node_CommutativeAssociativeBinaryOperator_61` | `Math|Booléen|ANDBoolean` | (5500, 4700), près de 96 |
|
|
| AND n° 2 | `/Game/BPs/Room.Room:EventGraph.K2Node_CommutativeAssociativeBinaryOperator_62` | `Math|Booléen|ANDBoolean` | (4850, 2450), près de 98 (5100, 2350) |
|
|
|
|
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] | → 19 [1], 29 [1], 28 [1], **`NOT_453` [0]** (4 liens) |
|
|
| `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é.
|