LifePlay-Revival/Docs/Migration/etat/ST/STE/STE-G3-VAL.md

82 lines
9.3 KiB
Markdown
Raw Normal View History

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