LifePlay-Revival/Docs/Migration/etat/CAM/CAM-B2p-J-PC-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

15 KiB

Fiche CAM-B2p-J-PC — Niveau N3 — Modèle prévu non précisé par la fiche | utilisé claude-opus-5-5 — Agent lp-mcp-bp — Skills sk-protocol, sk-change-safety, lp-mcp, lp-lot

CAM-B2p-J-PC-IMPL : Espace rendu à sa fonction pendant le sexe, PC par MCP (2026-10-14)

Résultat : réussi après reprise. Premier passage arrêté après l'écriture 1, parce que la relecture ne correspondait pas à l'attendu de la fiche (§ 2, E1). L'orchestrateur a choisi l'option A et ajouté l'amendement B2p-J-PC-a à la fiche (l. 44-50). La reprise s'est faite dans le même éditeur (§ Reprise), à partir de l'écriture 2.

  • Écritures 2 et 3 faites, chaque suppression prouvée par find_nodes.
  • Relecture de l'étape 4 conforme.
  • Compilation stricte sans diagnostic.
  • save_assets du PC seul.
  • PC 707220A6794E8E5469DD8F84437720CD (≠ B07F16A9…) ; Room, GI et Person inchangés.

Fiche : D:\Game\LifePlay-master 5.8\Docs\Migration\etat\CAM\CAM-B2p-J-PC-FICHE.md. Éditeur headless pid 26784, journal D:\Game\LifePlay-master 5.8\Saved\Logs\portage\CAM-B2p-J-PC-editeur_20261014-152203.log. Toolsets : editor_toolset.toolsets.asset.AssetTools (AT) et editor_toolset.toolsets.blueprint.BlueprintTools (BT). Préfixe des nœuds : /Game/BPs/PC.PC:EventGraph.K2Node_.

1. Fichiers modifiés

  • D:\Game\LifePlay-master 5.8\Content\BPs\PC.uasset : enregistré par AT.save_assets (appel 16), à 15:27:09 (heure locale), 3 420 303 octets. MD5 707220A6794E8E5469DD8F84437720CD. Avant : B07F16A9EC04CA297A8504F126D406E1, 3 424 059 octets (manifeste de l'instantané).
  • Changement (graphe EventGraph du PC) :
    • IfThenElse_40.then [O0] → CallFunction_277.execute [I0] (lien posé, appel 3).
    • IfThenElse_134 supprimé (appel 8), avec ses liens : 134.Condition ← 22.SexOn, 134.then → 408, 134.else → 277.
    • CallFunction_408 (appel LeftMouseSexOn) supprimé (appel 11).
  • Room, GI et Person : non chargés, non enregistrés, MD5 inchangés (§ Mesuré).

2. Écarts à la SPEC

E1 — l'attendu de l'écriture 1 était faux (premier passage, cause de l'arrêt ; corrigé par l'amendement B2p-J-PC-a). La fiche (§ Écritures, 1) attendait, après connect_pins 40.then → 277.execute : « 40.then → 277 seul ; 277 a une seule entrée (40) ; 134 n'a plus d'entrée ».

Relu à l'appel 4 (BT.get_node_infos de 40, 134 et 277) :

Critère de la fiche Relu Verdict
40.then → 277 seul 40 [O0 then] → CallFunction_277 [I0] seul ; 40 [O1 else] → IfThenElse_41 inchangé conforme
134 n'a plus d'entrée 134 [I0 execute] : connected_pins: [] ; Condition ← VariableGet_22 [O0] conforme
277 a une seule entrée (40) 277 [I0 execute] ← IfThenElse_134 [O1 else] et IfThenElse_40 [O0 then] écart

Pourquoi : connect_pins sur une sortie d'exécution remplace les liens de cette sortie : 40.then ↛ 134 est bien parti. Il ne touche pas aux autres liens entrants de la broche cible, et une entrée d'exécution en accepte plusieurs. Le lien 134.else → 277 ne disparaît donc qu'avec la suppression de 134. J'ai appliqué la règle « arrêt au moindre écart », sans réinterpréter la fiche.

L'amendement B2p-J-PC-a (fiche, l. 44-50) reprend ce relevé comme attendu. Le critère « 277 a une seule entrée (40) » est vérifié à l'étape 4 (appel 13, conforme).

Lectures ajoutées aux étapes de la fiche (pas des écritures) :

  • appel 5 (is_dirty, pour l'état de reprise) ;
  • appels 7 et 10 (find_nodes avant chaque suppression, comme relevé de référence pour la preuve d'absence) ;
  • CallFunction_35 ajouté à la relecture de l'étape 4, puisque la fiche dit qu'il reste.

Aucun autre écart.

3. Instantané

  • Lot CAM-B2p-J-PC, pris par l'orchestrateur avant la fiche : D:\Game\LifePlay_Backup_5.5\CAM-B2p-J-PC\manifest.csv. Relu : "Content\BPs\PC.uasset","True","3424059","B07F16A9EC04CA297A8504F126D406E1","2026-10-14T15:21:31" (une ligne, le PC seul).
  • PC sur disque avant l'appel 1 : B07F16A9EC04CA297A8504F126D406E1, égal au manifeste.
  • Retour arrière (fiche) : .\Tools\Restore.ps1 -Lot CAM-B2p-J-PC -Only Content\BPs\PC.uasset, éditeur fermé. Proposé, pas lancé.

3.1 Appels MCP du premier passage (1 à 5, un à la fois)

# Outil Objet Retour
1 AT.load_asset {asset_path:"/Game/BPs/PC"} {"refPath":"/Game/BPs/PC.PC"}
2 BT.get_node_infos 40, 134, 408, 277, VariableGet_22, 15, 63, CustomEvent_11, VariableSet_0 conforme à l'état attendu (§ 3.2)
3 BT.connect_pins {output_pin:{EGPD_Output,0,IfThenElse_40}, input_pin:{EGPD_Input,0,CallFunction_277}} null
4 BT.get_node_infos 40, 134, 277 écart E1 (277 a deux entrées), arrêt
5 AT.is_dirty {asset_path:"/Game/BPs/PC"} true

3.2 État relu avant écriture (appel 2) ; broches vérifiées avant connect_pins

Nœud Relu Fiche
IfThenElse_40 (Branche, x 2080, y -1632) execute ← 63 [O1 else] ; Condition ← CallFunction_125 ; then [O0, Exécution] → 134 [I0] ; else [O1] → IfThenElse_41 [I0] conforme
IfThenElse_134 (Branche) execute ← 40 [O0] ; Condition ← VariableGet_22 [O0] ; then → CallFunction_408 [I0] ; else → CallFunction_277 [I0] conforme
CallFunction_408 (` LeftMouseSexOn`) execute ← 134 [O0] ; then vide ; self non relié
CallFunction_277 (` PlayClick`) execute [I0, Exécution] ← 134 [O1] ; then → VariableSet_0 [I0] ; self non relié
VariableGet_22 (` GetSexOn`) SexOn → IfThenElse_15 [I1] et IfThenElse_134 [I1] ; self ← VariableGet_6044
IfThenElse_15 (Branche) execute ← IfThenElse_19 ; Condition ← 22 ; then vide ; else → CallFunction_160 conforme
IfThenElse_63 (référence) execute ← InputAction_3 ; Condition ← VariableGet_175 ; then vide ; else → 40 [I0] (non exigé)
CustomEvent_11 (`AddEvent Custom LeftMouseSexOn`)
VariableSet_0 (` SetGamePaused`) execute ← 277 [O0] ; GamePaused ← CallFunction_75 ; self ← VariableGet_2873 ; then → CallFunction_112

Reprise (amendement B2p-J-PC-a, option A de l'orchestrateur, même éditeur pid 26784)

L'amendement est présent dans la fiche (l. 44-50, relu avant le premier appel de la reprise). Toutes les commandes, écritures comprises, se sont faites un appel MCP à la fois.

R.1 Appels MCP de la reprise (6 à 16)

# Outil Objet Retour
6 BT.get_node_infos 40, 134, 277, 408 conforme à l'amendement : 40.then → 277 seul ; 134 sans entrée, then → 408, else → 277, Condition ← 22 ; 277.execute ← 134.else et 40.then ; 408 ← 134.then, then vide
7 BT.find_nodes {graph:EventGraph, title:"Branche", node_class:"/Script/BlueprintGraph.K2Node_IfThenElse"} 157 nœuds (compte manuel), IfThenElse_134 présent (dernier de la liste)
8 BT.delete_node {node:{refPath:"…K2Node_IfThenElse_134"}} (forme lue dans CAM-B2f-IMPL.md:133) null
9 BT.find_nodes même requête que 7 156 nœuds (compte manuel), même liste dans le même ordre, IfThenElse_134 absent (dernier : IfThenElse_133)
10 BT.find_nodes {graph:EventGraph, title:"LeftMouseSexOn", node_class:"/Script/BlueprintGraph.K2Node_CallFunction"} CallFunction_35, CallFunction_408
11 BT.delete_node {node:{refPath:"…K2Node_CallFunction_408"}} null
12 BT.find_nodes même requête que 10 CallFunction_35 seul : CallFunction_408 absent
13 BT.get_node_infos 40, 277, VariableSet_0, 22, 15, 63, CustomEvent_11, CallFunction_35 conforme (§ R.2)
14 AT.is_dirty {asset_path:"/Game/BPs/PC"} true
15 BT.compile_blueprint {blueprint:{refPath:"/Game/BPs/PC.PC"}, warnings_as_errors:true} null ; journal : LogBlueprint: Compiling Blueprint '/Game/BPs/PC.PC' puis aucune ligne Error ni Warning
16 AT.save_assets {asset_paths:["/Game/BPs/PC"]} true ; une ligne Saving Package: /Game/BPs/PC (l. 2314)

R.2 Relecture finale (appel 13, étape 4)

Nœud Relu Attendu
IfThenElse_40 execute ← 63.else ; Condition ← CallFunction_125 ; then → 277 seul ; else → 41 conforme
CallFunction_277 (` PlayClick`) execute ← 40.then seul ; then → VariableSet_0 ; self non relié
VariableSet_0 (` SetGamePaused`) execute ← 277 ; GamePaused ← CallFunction_75 ; self ← VariableGet_2873 ; then → CallFunction_112
VariableGet_22 (` GetSexOn`) SexOn → IfThenElse_15 [I1] seul ; self ← VariableGet_6044
IfThenElse_15 execute ← 19 ; Condition ← 22 ; then vide (coupure G-g 1) ; else → 160 inchangé
IfThenElse_63 execute ← InputAction_3 ; Condition ← VariableGet_175 ; then vide ; else → 40 inchangé
CustomEvent_11 (LeftMouseSexOn) then → IfThenElse_10 ; OutputDelegate vide inchangé, reste
CallFunction_35 (` LeftMouseSexOn`, x -3824, y 1024) aucun lien (execute vide, coupure G-g 1 123.then ↛ 35)

Effet (estimé, d'après le graphe relu) : Espace (InputAction_3) → 63.else → 40.then → PlayClick → GamePaused = NOT GamePaused. Pendant le sexe comme hors du sexe, aucune voie de branchement sur SexOn ne reste sur ce chemin. La preuve en jeu n'est pas établie : elle relève du build empaqueté (lp-mcp § 1 règle 5).

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

  • hyper_blueprint_debug_inspect non appelé : il est absent du serveur (mémoire unreal-mcp-reconnect). Contrôle de remplacement : compile_blueprint {warnings_as_errors:true} plus le journal de l'éditeur, comme le prescrit la fiche.
  • Pas de compilation C++, pas de Live Coding, aucune commande git qui écrit.
  • Éditeur laissé ouvert (pid 26784 vivant après l'appel 16) : sa fermeture, UeState et le BUILD-FIN reviennent à l'orchestrateur.
  • CompileAllBlueprints et dump du PC : non faits, ils reviennent à la VAL (V5, V6), éditeur fermé.

5. Points à confirmer en VAL

  • V5 : dump du PC comparé à CAM-B2p-G-PC-VAL_LPDumpFunction_20261014-135527.txt. Seules différences attendues : 1447 → 1445 nœuds (sans IfThenElse_134 ni CallFunction_408), 40.then → 277, 22.SexOn → 15 seul.
  • V5 : la voie d'Espace (40 → 277) est identique à CAM-B2kmn-VAL_LPDumpFunction_20261014-011816.txt.
  • V6 : CompileAllBlueprints égal à la référence CAM-B2p-G-PC-VAL_CompileAllBlueprints_20261014-135635.txt.
  • MD5 du PC sur disque, éditeur fermé : 707220A6794E8E5469DD8F84437720CD (relevé au 2026-10-14, 15:27 heure locale).
  • Les comptes 157 → 156 des appels 7 et 9 sont comptés à la main. Seule l'absence de IfThenElse_134 est établie ; le dump V5 compte les nœuds à la machine.

6. Fichiers à commiter

  • M Content/BPs/PC.uasset (dépôt du jeu, copie 5.8, branche ue5.8). Il était déjà M par rapport à HEAD avant cette fiche (lots CAM antérieurs non commités, état git du début de session). Le diff à HEAD englobe donc plus que cette fiche ; le gardien commite selon l'ordre des tickets du lot.
  • A Docs/Migration/etat/CAM/CAM-B2p-J-PC-IMPL.md (même dépôt) : ce livrable.
  • Content/BPs/GI.uasset, Room.uasset, Person.uasset et Content/UI/TopRight.uasset sont aussi M dans git status, mais cette fiche n'y a pas touché (MD5 de GI, Room et Person identiques avant et après ; TopRight non chargé). Ils ne sont pas à commiter au titre de cette fiche.

Mesuré

$ pwsh -NoProfile -Command "Get-FileHash -Algorithm MD5 <PC>,<Room>,<GI>,<Person>"   (avant l'appel 1)
B07F16A9EC04CA297A8504F126D406E1 D:\Game\LifePlay-master 5.8\Content\BPs\PC.uasset
931387479E2D15F80BC4F36398907712 D:\Game\LifePlay-master 5.8\Content\BPs\Room.uasset
32FC0A970AB194626E8DC07DF3A9633D D:\Game\LifePlay-master 5.8\Content\BPs\GI.uasset
8668A47C627F7A5254910CF0AC33B12A D:\Game\LifePlay-master 5.8\Content\BPs\Person.uasset
$ grep -c "Dispatching toolset tool" <journal> ; grep -c "Saving Package: /Game/BPs/PC" <journal>   (avant l'appel 1)
0
0
$ pwsh -NoProfile -Command "Get-FileHash -Algorithm MD5 <PC>,<Room>,<GI>,<Person> ; Get-Item <PC> | Length,LastWriteTime ; Get-Process -Id 26784"   (après l'appel 16)
707220A6794E8E5469DD8F84437720CD D:\Game\LifePlay-master 5.8\Content\BPs\PC.uasset
931387479E2D15F80BC4F36398907712 D:\Game\LifePlay-master 5.8\Content\BPs\Room.uasset
32FC0A970AB194626E8DC07DF3A9633D D:\Game\LifePlay-master 5.8\Content\BPs\GI.uasset
8668A47C627F7A5254910CF0AC33B12A D:\Game\LifePlay-master 5.8\Content\BPs\Person.uasset
 Length LastWriteTime
3420303 14/10/2026 15:27:09
26784 UnrealEditor
$ wc -l <journal> ; grep -c "Dispatching toolset tool" <journal> ; grep -c "Saving Package" <journal> ; sed -n '2280,$p' <journal> | grep -cE "Error|Warning|Erreur|Avertissement"
2343 .../Saved/Logs/portage/CAM-B2p-J-PC-editeur_20261014-152203.log
16
1
0
$ grep -n "Saving Package" <journal>
2314:[2026.10.14-13.27.09:513][794]LogFileHelpers: Saving Package: /Game/BPs/PC
  • 16 appels MCP et 16 lignes Dispatching toolset tool (la première à la l. 2279, 13:23:45 UTC). Les lignes Error / Warning du journal sont toutes antérieures au premier appel (l. 2228-2272 : socket_send_failure, Unknown session id, server/discover, à l'ouverture de la session MCP).
  • Après l'enregistrement : LogSavePackage: Moving … to '…/Content/BPs/PC.uasset', puis LogContentValidation: Starting to validate 1 assets sur /Game/BPs/PC, sans erreur (l. 2316-2343).

Tours : 36 / 60 (15 au premier passage, 21 à la reprise ; compte de l'agent, FicheStats.py fait foi)

Constats

  • connect_pins sur une sortie d'exécution ne remplace que les liens de la sortie ; l'entrée d'exécution cible garde ses autres liens entrants (appel 4). À verser : lp-mcp § 3. Une relecture attendue après un seul connect_pins vers une entrée d'exécution doit compter les liens entrants déjà présents sur la cible.
  • find_nodes accepte title:"Branche" avec node_class:"/Script/BlueprintGraph.K2Node_IfThenElse" (éditeur en français), et title:"LeftMouseSexOn" avec K2Node_CallFunction. Un relevé de référence avant delete_node rend la preuve d'absence comparable (même liste, même ordre, moins le nœud supprimé). À verser : lp-mcp § 3.
  • Crochet ecriture-gardien : une commande Bash contenant awk -F: '$1>0' est refusée comme « redirection vers 0 » (le > entre guillemets simples est lu comme une redirection). J'ai retiré le filtre ; aucune autre écriture.
  • Le journal de l'éditeur contient un chemin de profil utilisateur (ligne LogDerivedDataCache, l. 2288) : il n'est pas recopié ici. À filtrer si le journal est cité ou archivé (PubCheck).