LifePlay-Revival/Docs/Migration/etat/ST/STE/STE-G3-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

9.3 KiB

Fiche STE-G3-VAL — Niveau N1 — Modèle prévu sonnet | utilisé claude-sonnet-5-5 — Agent lp-validator — Skills sk-protocol, sk-recount, debug-verification, lp-validate

STE-G3-VAL : validation statique de NotifyCoupleTeleported() (2026-10-14)

Verdict : PASS-STATIC. Rien compilé, rien exécuté. Aucun défaut bloquant ; deux remarques (D1, D2) de gravité faible.

1. Fiches amont relues

  • etat\ST\STE\fiches\STE-G3.md (fiche, 9 rubriques).
  • etat\ST\STE\STE-G3-IMPL.md (seule IMPL amont ; tête, §§ 1 à 6 présents, gabarit IMPL suivi, Tours : 15 / 20).
  • etat\CAM\CAM-COMMUN9-DIAG.md l. 129, 165-195, 215, 218-221 (besoin G3 de CAM).
  • Source\LifePlay\LPShowCoupleSubsystem.h (76 lignes) et .cpp (824 lignes), lus en entier.

2. Points à confirmer des IMPL (§ 5 de STE-G3-IMPL)

Point Verdict Preuve
Diff limité aux deux fichiers, 23 insertions, 0 suppression PASS § 3, lignes 1-2
LastSafe écrit une fois, à Lead.Get()->GetActorLocation(), même grandeur que .cpp:804 PASS .cpp:811, 816, 822 ; .cpp:752, 760, 804 ; .cpp:400 (Engage)
Aucun appel à ResolveCoupleMove, balayage ou recouvrement PASS corps .cpp:807-824 relu : lecture de position, un UE_LOG, deux affectations
Gardes bEngaged, meneur, partenaire, monde avant toute lecture/écriture PASS .cpp:812 ; GetActorLocation seulement l. 816
LastBlocker seul état remis à zéro, lu seulement pour le journal PASS LastBlocker : .h:53, .cpp:781, 790, 794, 798, 823 ; .h : aucun autre état de balayage (profondeur, normale dans Move, local)
Déclaration publique, sans UFUNCTION PASS .h:24 public:, .h:30 ; private: ne commence qu'à l. 32
CRLF conservées PASS § 3, lignes 5-6
Aucun nom local masquant un membre (Who, Now) PASS membres .h:45-55, 57-75 : ni Who ni Now ; (les lambdas de KeepTogether ont leur propre portée)
Build COMMUN-11 : 0 erreur, 0 avertissement nouveau reporté (COMMUN-11) non compilable ici
En jeu CAM-74 : ligne « place reprise… » puis fin des bloque par … profondeur 3 reporté (CAM-74) essai en jeu
En jeu : volume de la ligne « place reprise » en glisser continu reporté (CAM-74) ; voir D1

3. Critères rejoués (commande → résultat brut)

  1. git diff --stat -- Source/LifePlay/LPShowCoupleSubsystem.h Source/LifePlay/LPShowCoupleSubsystem.cpp → LPShowCoupleSubsystem.cpp | 19 +++, LPShowCoupleSubsystem.h | 4 ++++, 2 files changed, 23 insertions(+). Confirmé (+19 +4 = 23).
  2. git diff --stat -- Source → 9 fichiers (LPDebugSubsystem, LPDirectControlSubsystem, LPOutdoorRoomSubsystem, LPShowCoupleSubsystem, LifePlay.cpp). Les 7 autres fichiers sont modifiés par d'autres lots (exclus par la demande, présents au git status initial) ; aucun n'est cité par STE-G3. Grep ULPShowCoupleSubsystem|NotifyCoupleTeleported hors des deux fichiers dans Source → 0 résultat (aucun appelant ni dépendance ajoutée).
  3. git diff --stat HEAD sur les deux fichiers → identique (19 + 4).
  4. MD5 : md5sum du .h = 44c721ee9e82bdfdf7571e493af70e39, du .cpp = 3cdd572d78b691eef0a3f02b1b37a486. Confirmé pour les deux.
  5. git ls-files --eol → i/crlf w/crlf pour les deux.
  6. Octets (PowerShell, boucle sur les octets) : .h CR=76 LF=76 LF seul=0 BOM=False ; .cpp CR=824 LF=824 LF seul=0 BOM=False. CRLF pur, aucune ligne LF seule. (Tools\FileCheck.ps1 appelé avec chemins positionnels : refusé, « paramètre positionnel » ; le contrôle d'octets le remplace.)
  7. Instantané d'avant D:\Game\LifePlay_Backup_5.5\STE-G3\Source\LifePlay\ : .h 57dc8cd468d2fb5de231bfbe25346389, .cpp 35cf128c8c3e059130e7cf48d9fa0454. Confirmé (préfixes 57dc8cd4…, 35cf128c…).

4. Diff lu en entier

.h +4 lignes (l. 28-30 + ligne vide l. 31) : deux lignes de commentaire, void NotifyCoupleTeleported(); en public. .cpp +19 lignes (l. 806-824) : ligne vide + définition de 18 lignes. Aucune ligne existante modifiée (0 suppression).

Contenu de la fonction (.cpp:807-824) :

  • Publique : oui (.h:30, sous public: l. 24).
  • Grandeur : Who->GetActorLocation() avec Who = Lead.Get() ; identique à KeepTogether (.cpp:752, 760, 804) et Engage (.cpp:400). Établi.
  • Une seule mise à jour (.cpp:822), aucun balayage ni recouvrement ni SetActorLocation.
  • Gardes (.cpp:812) : bEngaged, Who (meneur, TWeakObjectPtr donc détruit = nul), Partner.Get(), GetWorld(). Court-circuit || : Who est testé avant tout déréférencement (l. 816). Pas de plantage possible : aucun déréférencement avant garde. Hors scène : Release met bEngaged faux et Lead.Reset() (.cpp:668-674) ; retour sans effet.
  • LastBlocker.Reset() (.cpp:823) : vidé, effet limité au dédoublonnage du journal (.cpp:781, 794).
  • Effet sur l'image suivante : Delta = Now - LastSafe (.cpp:761) ; si le meneur n'a pas bougé depuis l'appel, Delta nul et sortie sans balayage (.cpp:762-765) ; sinon le balayage part de la place posée par CAM (.cpp:792-793). Établi par lecture. Ordre dans l'image conforme à CAM § 6.4 l. 173-175 (téléportation par CAM avant le monde, AfterActors ensuite).
  • Pas d'état de balayage supplémentaire dans le sous-système (.h:45-75 relus : Box, FittedPair, RejectedPair, LoggedExtent, bPawnLogged, Saved* ne sont pas des états de balayage).

5. Compilation probable

  • Vector.h:600 IsNearlyZero(T Tolerance=UE_KINDA_SMALL_NUMBER) const, [[nodiscard]], valeur utilisée : OK. Vector.h:861 ToString() const : OK. Vector.h:1015 static T Dist(const TVector&, const TVector&) : double pour FVector (UE 5.8), %.0f correct. UnrealString.h.inl:332 FString::Reset(int32 = 0) : OK. Les relectures de l'IMPL pour TWeakObjectPtr::Get, GetWorld, GetActorLocation n'ont pas été rejouées ici : ces trois appels figurent déjà tels quels dans le fichier (.cpp:752-755, 760), donc compilés avant ; établi par usage.
  • !(Now - LastSafe).IsNearlyZero() : l'appel postfixe lie plus fort que ! ; l'expression nie bien IsNearlyZero() du résultat de la soustraction. FVector - FVector temporaire : appel d'une méthode const sur une rvalue, légal.
  • Includes : rien à ajouter (LifePlay.h pour LogLifePlay l. 24, GameFramework/Character.h l. 20, Engine/World.h l. 19).
  • Pas de UFUNCTION donc aucun besoin de .generated.h régénéré au-delà de l'ordinaire ; fonction non virtuelle, non const.
  • Ombrage : Who, Now locaux, aucun membre de ce nom ; pas de C4458/C4456 attendu. Estimé (non compilé).

6. Contrat pour CAM

  • Nom exact : ULPShowCoupleSubsystem::NotifyCoupleTeleported. Signature : void NotifyCoupleTeleported(); (publique, non const, sans paramètre ni retour). En-tête : #include "LPShowCoupleSubsystem.h" (module LifePlay, classe LIFEPLAY_API, .h:20). Appel C++ seulement (CAM § 6.2 l. 129 « C++ LPCameraModeSubsystem, aucun asset » ; l. 215) : pas de UFUNCTION requis. Forme conseillée de l'IMPL § 1.1 : GI->GetSubsystem<ULPShowCoupleSubsystem>() puis NotifyCoupleTeleported() : cohérente.
  • À appeler seulement après une place validée par G1 (CAM § 6.4 l. 184-188, 191-193), après le déplacement du couple dans l'image. Sinon une place recouvrant un meuble devient LastSafe et KeepTogether ne dépénètre plus tant que le meneur ne bouge pas.
  • Garde supplémentaire utile ? Dans la fonction : non (la validité de la place relève de G1, CAM). Côté CAM, une garde est recommandée : n'appeler qu'une fois par pose validée (fin de prise ou pose finale), pas à chaque image d'un glisser, tant que la place n'est pas validée (voir D1).

7. Défauts

# Gravité Constat Suite proposée
D1 Faible La ligne UE_LOG ... Warning « place reprise » s'écrit à chaque appel où la place a bougé. Si CAM appelle à chaque image du glisser, le journal reçoit une ligne par image (l'IMPL § 5 l'a déjà signalé). Effet : volume de journal seulement. Contrat côté CAM (un appel par pose validée) ou passage en Verbose/Log par l'orchestrateur ; pas de blocage.
D2 Faible Aucune garde Box : si le volume est absent, KeepTogether sort de toute façon (.cpp:756) ; l'appel met seulement LastSafe à jour, sans conséquence. Aucune garde de Box n'est donc demandée. Aucune.
(écart de forme) Informatif IMPL E1 : sk-change-safety invoqué après les Edit (instantané pris par l'orchestrateur, vérifié identique ici). Pas d'incidence. Aucune.

Aucun défaut de gravité moyenne ou forte. Aucun script d'édition détecté (diff de 23 lignes cohérent avec un Edit).

8. Verdict

PASS-STATIC. Critères 1 à 7 rejoués avec preuve fraîche ; compilation (COMMUN-11) et essai en jeu CAM-74 restent à faire.

9. Points à confirmer par l'utilisateur

  • Journal de la ligne « place reprise » : garder Warning ou passer en niveau plus bas (D1).
  • Le mode « tourner » de la prise (CoupleGrabMode == 2, signalé par l'IMPL § 4) appelle-t-il aussi la fonction ? Question pour CAM, hors périmètre STE.
  • COMMUN-11 : LPShowCoupleSubsystem.cpp compilé, 0 erreur, aucun avertissement nouveau.
  • CAM-74 en jeu.

Fichiers à commiter

Aucun (VAL en lecture seule). Livrable écrit : D:\Game\LifePlay-master 5.8\Docs\Migration\etat\ST\STE\STE-G3-VAL.md (A).

Tours : 5 / 20