LifePlay-Revival/Docs/Migration/etat/CAM/CAM-B2kmn-VAL.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-B2kmn-VAL — Niveau N1 — Modèle prévu non précisé par la demande | utilisé claude-sonnet-5-5 — Agent lp-validator (A-VAL) — Skills sk-protocol, sk-recount, debug-verification, lp-validate

CAM-B2kmn-VAL : validation des fiches CAM-B2k (Room, recalage C1), CAM-B2m (PC, lacet POV) et CAM-B2n (Room, orbite de scène) (2026-10-14)

Verdict global : PASS (V5 Room, V5 PC, V6, MD5 et UeState rejoués à neuf, éditeur fermé). V7 (essai en jeu) n'est pas de cette VAL : reporté (COMMUN-6).

Copie D:\Game\LifePlay-master 5.8, branche ue5.8 (relevée par git branch --show-current). Aucun asset, code ni doc validée modifié par la VAL. Seuls fichiers écrits : les 3 sorties de commandlets (§ 3) et ce livrable.

1. Fiches amont relues

  • CAM-B2k-FICHE.md, CAM-B2m-FICHE.md, CAM-B2n-FICHE.md (avec l'amendement B2n-a : GetActorArrayAverageLocation dans le fil, opérateurs génériques Soustraire et Ajouter).
  • CAM-B2k-IMPL.md (25 / 60 tours), CAM-B2m-IMPL.md (23 / 60), CAM-B2n-IMPL.md (63 / 60).
  • Références de diff : CAM-B2i-VAL_LPDumpFunction_20261013-225125.txt (Room), CAM-B1-VAL_LPDumpFunction_20261013-085611.txt (PC), CAM-B2i-VAL_CompileAllBlueprints_20261013-225336.txt et son journal (V6).
  • Instantané d'avant : D:\Game\LifePlay_Backup_5.5\CAM-B2kmn\ (manifeste, Content\BPs\Room.uasset et PC.uasset).

Conformité des IMPL au gabarit IMPL de lp-doc : les 6 sections numérotées sont présentes dans les trois. Écarts de forme relevés (aucun ne touche au contenu validé) :

  • CAM-B2n-IMPL.md : 63 tours pour un budget de 60 (déclaré par l'auteur, sous le plafond de 75) ; ses « Constats » portent aussi la liste des appels MCP, des PinID et des liens, ce qui est permis.
  • CAM-B2k-IMPL.md et CAM-B2m-IMPL.md : « Modèle prévu non précisé par la fiche » ; section « Mesuré » hors gabarit mais utile. Pas d'écart bloquant.
  • Les trois fiches prévoient un instantané -Lot CAM-B2k / -B2m / -B2n. L'instantané réel est CAM-B2kmn (commun), signalé par chaque IMPL (§ 2). Retour arrière à lire -Lot CAM-B2kmn -Only <fichier>.

2. Points à confirmer des IMPL

Id Point (IMPL) Verdict Preuve
B2k-1 Room = 6be71e01… après B2k, PC / GI / Person inchangés Reporté pour 6be71e01… (état intermédiaire écrasé par B2n, non rejouable). PC / GI / Person : PASS MD5 finaux § 3.4 ; le contenu de B2k est entièrement dans le diff V5 (B2k-3)
B2k-2 V5 : EventGraph à 1265 nœuds PASS (remplacé) : 1272 attendu après B2n (1264 + 1 + 7) === Room :: EventGraph (1272 noeuds) === ; réf. 1264
B2k-3 Diff limité à _512 (SceneComponent::K2_SetWorldLocation(), bSweep / bTeleport faux), 83.then → 512.execute, sorties de 265 et de PO_2 PASS § 3.1 : 512 apparaît, execute ← IfThenElse_83.then, self ← VariableGet_265.FirstPersonSM, NewLocation ← PromotableOperator_2.ReturnValue ; 265 + 512.self ; PO_2 + 512.NewLocation
B2k-4 83.else, Condition de 83, liens de 81, 82, 91, 440, 441, 446 inchangés PASS aucun hunk sur ces nœuds ; 83.else → 440.execute relu l. 9843 du dump
B2k-5 Nom _512 absent de la référence PASS Grep K2Node_CallFunction_512 sur la référence : 0 occurrence
B2k-6 V6 : Room compilé sans erreur ni avertissement nouveau PASS § 3.3
B2k-7 V7 (C1 à hauteur des yeux ; LogStats sans Accessed None nouveau ; cas limite PlayerCharacter nul + vue nulle) Reporté (essai en jeu COMMUN-6) non rejoué
B2m-1 PC = f45be57a… ; Room, GI, Person inchangés PASS § 3.4
B2m-2 V5 PC : 312 Yaw au lieu de Roll ; 136 then / else → 204 ; 951.execute vide ; 204.execute ← 136 (deux liens) ; aucun nœud nouveau ni supprimé PASS § 3.2 ; 1439 nœuds avant et après
B2m-3 316, 164 et le reste de l'EventGraph inchangés PASS aucun autre hunk de corps
B2m-4 V6 : PC sans erreur ni avertissement nouveau malgré 951 mort PASS § 3.3
B2m-5 V7 : sens du lacet (réserve 108.B = 1), tangage 316 faux face à Y, LogStats Reporté (essai en jeu) non rejoué
B2n-1 7 nœuds de plus : 101, 535 à 538, PO_46, PO_47 PASS § 3.1 ; 1264 → 1272 = 8 = 1 (512) + 7
B2n-2 14 liens de plus, 537.Axis = (0, 0, 1) PASS (liens) / PASS-STATIC (Axis) § 3.1 : les 14 liens L1 à L13 (L11a + L11b) relus dans le dump. Axis relu '0,0,1', alors que 497 porte '0.0,0.0,1.0' : même vecteur Z = 1 par lecture ; l'interprétation moteur de la chaîne 0,0,1 n'est pas rejouée en jeu (estimé)
B2n-3 Aucune autre différence ; 512 de B2k présent et inchangé PASS § 3.1 : 8 hunks de corps, tous attendus ; 512 identique aux § 1.4 de B2k
B2n-4 Conversion implicite DeltaSeconds (double) → AngleDeg (simple précision) sans diagnostic PASS Room compilé avec succès en V6, avertissements identiques (55 lignes, 42 signatures)
B2n-5 V6 = référence PASS § 3.3
B2n-6 V7 (orbite pendant le sexe, hors sexe inchangé, SexPersons vide → orbite autour de l'origine) Reporté (essai en jeu) non rejoué
B2n-7 Sauvegarde automatique Saved/Autosaves/Game/BPs/Room_Auto1.uasset « à ignorer » Non vérifié hors périmètre (pas dans Content)

3. Critères rejoués

Environnement : éditeur fermé, Tools\UeState.ps1 -Brief avant et après : processus=0 editeur=0 compilation=0 shaders=0 jeu=0 (UeState = 0). Moteur D:\Game\Launcher\Engine\UE_5.8. Lancement : Tools\RunCommandlet.ps1 -Lot CAM-B2kmn-VAL … -EtatDir …\etat\CAM.

3.0 MD5 de départ (avant tout lancement)

$ md5sum Content/BPs/Room.uasset Content/BPs/PC.uasset Content/BPs/GI.uasset Content/BPs/Person.uasset
3a451fddf991ac01a699af7bd1fbdc12 *Content/BPs/Room.uasset
f45be57a39d13d3eb19d0b543153ab0b *Content/BPs/PC.uasset
e64b5b37c9ef0db7735de0d6e3bd7c1c *Content/BPs/GI.uasset
8668a47c627f7a5254910cf0ac33b12a *Content/BPs/Person.uasset
$ md5sum D:/Game/LifePlay_Backup_5.5/CAM-B2kmn/Content/BPs/*.uasset      (instantané d'avant)
a19510e613f31905437bab48f38c6154 *…/PC.uasset
18565365b1195bf2416a1048bf9051b6 *…/Room.uasset

Room et PC diffèrent de l'instantané ; Room = attendu 3A451FDD…, PC = attendu F45BE57A…, GI et Person = attendus.

3.1 V5 Room : PASS

Commande : LPDumpFunction -BP=Room -Fn=* -Pins -Exec ; code 0, 57 s, 0 erreur, 10 881 avertissements (le dump). Sortie : Docs\Migration\etat\CAM\CAM-B2kmn-VAL_LPDumpFunction_20261014-011706.txt (journal dans Saved\Logs\portage\). Diff : git diff --no-index --unified=0 CAM-B2i-VAL_LPDumpFunction_20261013-225125.txt CAM-B2kmn-VAL_LPDumpFunction_20261014-011706.txt | grep -v '^[-+]LogInit:' : 212 lignes. Les 138 premières sont l'en-tête (date, durée, histogramme des signatures d'avertissements, qui bouge avec le nombre de lignes : bruit). Corps (lignes 139 à 212), brut :

-=== Room :: EventGraph  (1264 noeuds) ===
+=== Room :: EventGraph  (1272 noeuds) ===
 CustomEvent_1.DeltaSeconds   + K2Node_CallFunction_537.AngleDeg
 CallFunction_149.then        (vide) -> K2Node_IfThenElse_101.execute
 VariableGet_102.SceneCamera  + K2Node_CallFunction_536.self, K2Node_CallFunction_538.self
 VariableGet_86.SexOn         + K2Node_IfThenElse_101.Condition
 VariableGet_106.SexPersons   + K2Node_CallFunction_535.Actors
 VariableGet_265.FirstPersonSM + K2Node_CallFunction_512.self
 IfThenElse_83.then           (vide) -> K2Node_CallFunction_512.execute
 PromotableOperator_2.ReturnValue + K2Node_CallFunction_512.NewLocation
+ 45 lignes : blocs des 8 nœuds neufs (l. 10907 du nouveau dump)

Blocs neufs, relus l. 10907 à 10951 du nouveau dump :

  • CallFunction_512 SceneComponent::K2_SetWorldLocation() : execute ← IfThenElse_83.then, then vide, self ← VariableGet_265.FirstPersonSM, NewLocation ← PromotableOperator_2.ReturnValue, bSweep et bTeleport false.
  • IfThenElse_101 : execute ← CallFunction_149.then, Condition ← VariableGet_86.SexOn, then → CallFunction_535.execute, else vide.
  • CallFunction_535 GameplayStatics::GetActorArrayAverageLocation() : execute ← 101.then, then → CallFunction_538.execute, Actors ← VariableGet_106.SexPersons, ReturnValue → PromotableOperator_46.B, PromotableOperator_47.A.
  • CallFunction_536 K2_GetActorLocation() : self ← VariableGet_102.SceneCamera, ReturnValue → PromotableOperator_46.A.
  • PromotableOperator_46 Subtract_VectorVector() : A ← 536, B ← 535, ReturnValue → CallFunction_537.InVect (536 moins 535).
  • CallFunction_537 RotateAngleAxis() : InVect ← 46, AngleDeg ← CustomEvent_1.DeltaSeconds, Axis '0,0,1', ReturnValue → PromotableOperator_47.B.
  • PromotableOperator_47 Add_VectorVector() : A ← 535, B ← 537, ReturnValue → CallFunction_538.NewLocation (535 plus 537).
  • CallFunction_538 K2_SetActorLocation() : execute ← 535.then, then vide, self ← VariableGet_102.SceneCamera, NewLocation ← 47, bSweep et bTeleport false.

Contrôles complémentaires :

  • Compte : 1264 + 8 = 1272 (512, 101, 535, 536, 537, 538, PO_46, PO_47), recompté par 8 blocs neufs.
  • Absence de _512 dans la référence : Grep, 0 occurrence ; 4 dans le nouveau dump (3 liens + le bloc).
  • Aucun hunk sur 19, 26, 29, 96, MacroInstance_13, 153 : liens inchangés (149 : execute ← 19.else inchangé, relu l. 5491).
  • Aucune autre fonction de Room changée (aucun hunk hors EventGraph).
  • 149.then est passé de vide à 101.execute seulement, conformément à L1.

3.2 V5 PC : PASS

Commande : LPDumpFunction -BP=PC -Fn=EventGraph -Pins -Exec ; code 0, 58 s, 0 erreur, 6 410 avertissements (identique à B1). Sortie : …\CAM-B2kmn-VAL_LPDumpFunction_20261014-011816.txt. Référence B1 : une seule section PC :: EventGraph (1439 noeuds) (deux fois dans le fichier, la seconde en LogInit: retirée par le filtre), aucun autre graphe ; nouveau dump : même section, 1439 nœuds. Diff grep -v '^[-+]LogInit:', corps brut (après l'en-tête, qui ne porte que des histogrammes de signatures) :

-            Roll   -> K2Node_CommutativeAssociativeBinaryOperator_108.ReturnValue        (312)
+            Roll   = '0.0'
-            Yaw    = '0.0'
+            Yaw    -> K2Node_CommutativeAssociativeBinaryOperator_108.ReturnValue
-            execute (vide)                                                                 (204)
+            execute -> K2Node_IfThenElse_136.then, K2Node_IfThenElse_136.else
-            then   -> K2Node_CallFunction_951.execute                                    (136)
-            else   -> K2Node_CallFunction_951.execute
+            then   -> K2Node_CallFunction_204.execute
+            else   -> K2Node_CallFunction_204.execute
-            execute -> K2Node_IfThenElse_136.then, K2Node_IfThenElse_136.else            (951)
+            execute (vide)
-            ReturnValue -> K2Node_CallFunction_312.Roll                                  (108)
+            ReturnValue -> K2Node_CallFunction_312.Yaw

Les nœuds portant chaque hunk ont été relus dans le nouveau dump (l. 1847 à 1852 pour 312, 1889 à 1893 pour 204, 2000 à 2004 pour 136, 2035 à 2039 pour 951, 2043 à 2047 pour 108). 312 : Yaw ← 108, Roll 0.0 non relié, ReturnValue → 204.DeltaRotation et 951.DeltaRotation ; 204 : self ← VariableGet_67.FirstPersonSM, DeltaRotation ← 312, then vide. Rien d'autre : écart au résultat attendu = 0. Le PC de la référence B1 est supposé A19510E6… (dit par la fiche B2m, non prouvable sur le fichier texte) ; le diff, limité aux seuls changements de B2m, est cohérent avec cela.

3.3 V6 : PASS

Commande : CompileAllBlueprints ; code 3 (comme la référence : le code reflète les 3 erreurs de CR_FaceExpRig), 228 s, 25 lignes d'erreur, 55 lignes d'avertissement. Sortie : …\CAM-B2kmn-VAL_CompileAllBlueprints_20261014-011924.txt.

$ grep "Compiling Completed" <journal> (référence B2i et nouveau)
Compiling Completed with 3 errors and 0 warnings and 0 blueprints that failed to load.   (les deux)
$ grep -c "Loading and Compiling"  : 421 (réf.)  421 (nouveau)
$ grep -c "La compilation de .* a réussi" : 420 (réf.)  420 (nouveau)
$ liste triée des 'Loading and Compiling' (sans horodatage) : diff réf. contre nouveau = vide
$ diff <(sed -n 6,40p réf.) <(sed -n 6,40p nouveau) : identiques (Erreurs : 25 lignes, 16 signatures ; Avertissements : 55 lignes,
  42 signatures)
GI, Person, PC, Room : « La compilation de … a réussi ! » (l. 1963, 1984, 2018, 2021 du journal)

La 421e entrée est CR_FaceExpRig (moteur, 3 erreurs). Les 16 signatures d'erreur sont toutes CR_FaceExpRig / RLExpStruct / RLConstraintStruct / « Could not find graph function data » : aucune ligne d'erreur d'un Blueprint du jeu. Le diff brut des deux résumés ne diffère que par les horodatages, les durées de compilation et la ligne de commande.

3.4 Fin : MD5 et UeState : PASS

$ md5sum Content/BPs/Room.uasset Content/BPs/PC.uasset Content/BPs/GI.uasset Content/BPs/Person.uasset   (après les commandlets)
3a451fddf991ac01a699af7bd1fbdc12 *Content/BPs/Room.uasset
f45be57a39d13d3eb19d0b543153ab0b *Content/BPs/PC.uasset
e64b5b37c9ef0db7735de0d6e3bd7c1c *Content/BPs/GI.uasset
8668a47c627f7a5254910cf0ac33b12a *Content/BPs/Person.uasset
$ Tools\UeState.ps1 -Brief   (après)
processus=0 editeur=0 compilation=0 shaders=0 jeu=0

Les commandlets n'ont modifié aucun des 4 assets. git status : Room, PC, GI, Person M (déjà modifiés avant la VAL).

4. Diff lu en entier

  • Room : diff du corps du dump, 8 hunks de liens existants + 1 bloc de 45 lignes ajoutées + l'en-tête de graphe (§ 3.1).
  • PC : 6 hunks de corps (§ 3.2).
  • Fichiers de contenu lus : Content/BPs/Room.uasset et PC.uasset (binaires, lus par dump), GI/Person (MD5 seul).
  • Aucun fichier de code C++ n'est dans ces fiches. Fichiers non annoncés produits par la VAL : aucun hors § 3.
  • Fins de ligne des fichiers écrits : mon livrable en LF ; les trois sorties de commandlets sont celles de RunCommandlet.ps1 (CRLF, FileCheck.ps1 : alertes = 0).

5. Verdict

PASS

  • V5 Room : PASS. V5 PC : PASS. V6 : PASS. MD5 : PASS. UeState = 0 : PASS.
  • PASS-STATIC (limité) : la chaîne d'axe 0,0,1 de 537.Axis (lecture du dump, pas d'essai en jeu).
  • Non rejoué : V7 et LogStats (essais en jeu), état intermédiaire 6be71e01… de Room, sens du lacet de B2m, tangage 316.

6. Points à confirmer par l'utilisateur

  • V7 (COMMUN-6) pour B2k : C1 à hauteur des yeux (assis, levé, marche, rassis, changement de pièce) ; C2 et sexe inchangés.
  • V7 pour B2m : lacet POV à la souris sans pente ; sens non inversé (sinon set_pin_value 108.B = 1) ; tangage 316 faux face à Y, connu, non traité.
  • V7 pour B2n : orbite autour du couple pendant le sexe, cadrage conservé ; cas SexPersons vide pendant SexOn (orbite autour de l'origine) ; limite C2 → sexe (vue restant sur CamRoom, fiche B2o éventuelle).
  • Ticket au gardien : Room.uasset contient B2k et B2n inséparables ; PC.uasset pour B2m ; l'instantané est CAM-B2kmn.
  • Sauvegarde automatique Saved/Autosaves/Game/BPs/Room_Auto1.uasset : à ignorer ou nettoyer (non vérifiée).

Fichiers à commiter

  • A Docs/Migration/etat/CAM/CAM-B2kmn-VAL.md
  • A Docs/Migration/etat/CAM/CAM-B2kmn-VAL_LPDumpFunction_20261014-011706.txt
  • A Docs/Migration/etat/CAM/CAM-B2kmn-VAL_LPDumpFunction_20261014-011816.txt
  • A Docs/Migration/etat/CAM/CAM-B2kmn-VAL_CompileAllBlueprints_20261014-011924.txt
  • (Les journaux bruts restent dans Saved/Logs/portage/, non suivis.)

Tours : 22 / 40

Constats

  • Le dump LPDumpFunction de PC ne contient que EventGraph quand -Fn=EventGraph ; le même nom de section apparaît deux fois dans le fichier (une fois préfixé LogInit: Display:), d'où le filtre grep -v '^[-+]LogInit:' du diff.
  • Un hook du poste refuse à lp-validator toute redirection de sortie de Bash vers le dossier temporaire de session : les diffs ont été affichés sans fichier intermédiaire.
  • Intervalle d'un gabarit à l'autre : le nom de nœud _512 réutilisé (numéro libre sous des nœuds existants) a été contrôlé absent de la référence, comme le recommande l'IMPL B2k.