# S7-T3 - Cartographie de conformite du plugin `LPSandbox` (contrat S7-SPEC) - **Fiche :** S7-T3 | **Role :** CART | **Date :** 2026-10-06 - **Cible :** `D:\Game\LifePlay-Sandbox\Plugins\LPSandbox\Source` (modules `LPSandbox`, `LPAnimMeasure`) - **Outil :** `rg` (ripgrep). Compte hors commentaires precise quand applicable. ## Resultats des grep exiges | # | Motif | Portee | Resultats | Attendu | |---|---|---|---:|---:| | 1 | `#include ` / `"LifePlay.h"` | `Source/**` | **0** | 0 | | 2 | `LIFEPLAY_API` | `Source/**` | **0** | 0 | | 3 | `"LifePlay"` ou `"LifePlayEditorTools"` (module) | `*.Build.cs` | **0** | 0 | | 4 | `^\s*#include.*LifePlay` (tout include mentionnant LifePlay) | `Source/**` | **0** | 0 | | 5 | `LifePlay` (mot, tous contextes) | `Source/**` | 16 | commentaires + 1 nom de section ini (voir ci-dessous) | | 6 | `SpawnActor.*Person`, `ConstructorHelpers`, `TSubclassOf<`, `TObjectPtrGetString(TEXT("LifePlay.Anim"), TEXT("Target"), ...)` : **nom de section d'un fichier `.ini`** (donnee), pas une dependance de code. ## Cases du contrat ### C1 - Aucun lien vers `LifePlay` - [x] Aucun `#include "LifePlay.h"` ni header du module jeu (grep #1, #4 : 0). - [x] Aucun `LIFEPLAY_API` (grep #2 : 0). - [x] Aucune dependance de module `LifePlay` / `LifePlayEditorTools` dans les `*.Build.cs` (grep #3 : 0 ; `LPSandbox` -> `Core`, `CoreUObject`, `Engine`, `InputCore`, `SlateCore`, `LPAnimMeasure`, `Slate`, `ImageWrapper`, `AssetRegistry`, `Json` ; `LPAnimMeasure` -> `Core`, `CoreUObject`, `Engine`, `Json`). - [x] Aucun chemin `Source/LifePlay` hors commentaires. - [x] Graphe acyclique `LPSandbox -> LPAnimMeasure` ; `LPAnimMeasure` sans dependance vers `LPSandbox` (verifie dans `LPAnimMeasure.Build.cs`). ### C2 - Aucun chargement de graphe `GI` / `Person` / `Room` - [x] Aucune reference a `GI` du jeu : `\bGI\b`, `BPs/GI`, `BPs/Room`, `BP_Room` -> **0** sur le code (le motif `\bRoom\b` donne 66 hits : tous des **variables locales** `ALPPairSandboxStage* Room`, type du plugin, aucune relation avec le Blueprint `Room` du jeu). - [x] `Person` : lecture de CDO uniquement. Deux sites, tous deux `LoadObject(nullptr, *FLPSandboxConfig::Get().PersonBP)` puis `GetDefaultObject()` : - `LPSandboxRoomBuilder.cpp:119-120` ; - `LPCoupleSim.cpp:39-40`. Aucun `SpawnActor` de `Person`, aucun `CallFunctionByName`. Le seul `ProcessEvent` du plugin (`LPSandboxRoomBuilder.cpp:308`) vise `BP_Sky_Sphere` du **moteur**. - [x] Chemin du Blueprint : `Config/LPSandbox.ini` `[Sandbox.Assets] PersonBP` (defaut `/Game/BPs/Person.Person_C`, `LPSandboxConfig.h:15`). - [x] Lanceur : `GameInstanceClass=/Script/Engine.GameInstance` (`Tools/debug/LifePlay_pair_sandbox.bat`) ; le journal runtime confirme `Game class is 'LPPairSandboxGameMode'` et « profil Person lu ». L'unique `LogLifePlay: Error: Coiffures : GI.HairstyleTable ...` est emis par le **module jeu** (categorie `LogLifePlay`, pas `LogLPSandbox`) : erreur connue (S3-VAL, S4-VAL, S5-VAL), non liee au plugin. ### C3 - `SoftObjectPath` / config seulement - [x] Aucun `ConstructorHelpers`, `TSubclassOf<>` ni `TObjectPtr<>` vers un type du jeu (grep #6 : 0). - [x] Un seul litteral `/Game/` hors config : `LPAnimRedirect.cpp:17` (`/Game/Quaternius/UAL`), **defaut interne** documente (S2), surcharge par `LPAnimRedirect::SetUALRoot` (poussee par le module jeu depuis la config) ; asset de contenu tiers, pas de code du jeu. - [x] `LoadObject` par chaine (config) et `AssetRegistry` + `GetSoftObjectPath().ToString()` (`LPCoupleSim.cpp:227,236`) pour Quaternius. - [x] Repli au litteral historique si fichier/cle absents (S1) ; journal `LogLPSandbox` sur asset introuvable. ### C4 - Montage sibling documente - [x] Layout sibling + decision « pas de submodule » : `21_Sandbox_Addon.md` (section S3) et `S3-INT.md`. - [x] `LifePlay.uproject` : `AdditionalPluginDirectories` = `../LifePlay-Sandbox/Plugins` ; `LPSandbox` `Enabled: true`, `Optional: true` (S7-T2). - [x] Pin consigne : `S3-INT.md` (maj S7-T4 -> `f09c42e`). - [x] README de l'addon : layout, clone sibling, junction `Content` (S3). ### C5 - Configurations - [x] `SupportedTargetPlatforms: ["Win64"]`. - [x] `LPSandbox` : `TargetConfigurationDenyList: ["Shipping"]`. - [x] `LPAnimMeasure` : aucune deny-list. - [x] Pas de `TargetAllowList: ["Editor"]`. ## Ecarts / observations | # | Observation | Gravite | |---|---|---| | 1 | `LoadObject(PersonBP)` charge le **package** `Person` (donnees serialisees) : le contrat C2 interdit l'execution, pas ce chargement ; inevitable pour lire le CDO. | Info | | 2 | Section ini `[LifePlay.Anim]` lue par `LPAnimRedirect` : couplage de **nom** (donnee), pas de code. | Info | | 3 | `Optional: true` ne dispense pas du clone sibling pour compiler le jeu (`LifePlay.Build.cs` -> `LPAnimMeasure`). | Limite (documentee S7-IMPL-L) | **Verdict CART : conforme (0 ecart bloquant).**