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.mdl. 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)
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).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 augit statusinitial) ; aucun n'est cité par STE-G3.Grep ULPShowCoupleSubsystem|NotifyCoupleTeleportedhors des deux fichiers dansSource→ 0 résultat (aucun appelant ni dépendance ajoutée).git diff --stat HEADsur les deux fichiers → identique (19 + 4).- MD5 :
md5sumdu.h=44c721ee9e82bdfdf7571e493af70e39, du.cpp=3cdd572d78b691eef0a3f02b1b37a486. Confirmé pour les deux. git ls-files --eol→i/crlf w/crlfpour les deux.- Octets (PowerShell, boucle sur les octets) :
.hCR=76 LF=76 LF seul=0 BOM=False ;.cppCR=824 LF=824 LF seul=0 BOM=False. CRLF pur, aucune ligne LF seule. (Tools\FileCheck.ps1appelé avec chemins positionnels : refusé, « paramètre positionnel » ; le contrôle d'octets le remplace.) - Instantané d'avant
D:\Game\LifePlay_Backup_5.5\STE-G3\Source\LifePlay\:.h57dc8cd468d2fb5de231bfbe25346389,.cpp35cf128c8c3e059130e7cf48d9fa0454. 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, souspublic:l. 24). - Grandeur :
Who->GetActorLocation()avecWho = Lead.Get(); identique àKeepTogether(.cpp:752, 760, 804) etEngage(.cpp:400). Établi. - Une seule mise à jour (
.cpp:822), aucun balayage ni recouvrement niSetActorLocation. - Gardes (
.cpp:812) :bEngaged,Who(meneur,TWeakObjectPtrdonc détruit = nul),Partner.Get(),GetWorld(). Court-circuit||:Whoest testé avant tout déréférencement (l. 816). Pas de plantage possible : aucun déréférencement avant garde. Hors scène :ReleasemetbEngagedfaux etLead.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,Deltanul 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,AfterActorsensuite). - Pas d'état de balayage supplémentaire dans le sous-système (
.h:45-75relus :Box,FittedPair,RejectedPair,LoggedExtent,bPawnLogged,Saved*ne sont pas des états de balayage).
5. Compilation probable
Vector.h:600IsNearlyZero(T Tolerance=UE_KINDA_SMALL_NUMBER) const,[[nodiscard]], valeur utilisée : OK.Vector.h:861ToString() const: OK.Vector.h:1015static T Dist(const TVector&, const TVector&):doublepourFVector(UE 5.8),%.0fcorrect.UnrealString.h.inl:332FString::Reset(int32 = 0): OK. Les relectures de l'IMPL pourTWeakObjectPtr::Get,GetWorld,GetActorLocationn'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 bienIsNearlyZero()du résultat de la soustraction.FVector - FVectortemporaire : appel d'une méthode const sur une rvalue, légal.- Includes : rien à ajouter (
LifePlay.hpourLogLifePlayl. 24,GameFramework/Character.hl. 20,Engine/World.hl. 19). - Pas de
UFUNCTIONdonc aucun besoin de.generated.hrégénéré au-delà de l'ordinaire ; fonction non virtuelle, non const. - Ombrage :
Who,Nowlocaux, 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"(moduleLifePlay, classeLIFEPLAY_API,.h:20). Appel C++ seulement (CAM § 6.2 l. 129 « C++LPCameraModeSubsystem, aucun asset » ; l. 215) : pas deUFUNCTIONrequis. Forme conseillée de l'IMPL § 1.1 :GI->GetSubsystem<ULPShowCoupleSubsystem>()puisNotifyCoupleTeleported(): 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
LastSafeetKeepTogetherne 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
Warningou 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.cppcompilé, 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