# S7-T1 - Contrat d'isolation du plugin `LPSandbox` (jeu <-> addon) - **Fiche :** S7-T1 | **Role :** A-ARCH | **Date :** 2026-10-06 - **Perimetre :** specification. Les controles sont rejoues en `S7-CART.md` (S7-T3), l'implementation est en `S7-T2`. - **Amont :** `21_Sandbox_Addon.md` (S1 contrat de config, S2 module `LPAnimMeasure`, S3 liaison sibling, S5 `LPCoupleSim`). - **Plugin :** `D:\Game\LifePlay-Sandbox\Plugins\LPSandbox\` (modules `LPSandbox`, `LPAnimMeasure`). Le plugin doit rester **sans connaissance compilee du jeu** : le jeu depend du plugin (`LifePlay.Build.cs` -> `LPAnimMeasure`), jamais l'inverse. Toute information du jeu consommee par le plugin passe par un chemin d'asset (config) ou par la reflexion UE. ## Checklist de contrat (a verifier a chaque lot touchant l'addon) ### C1 - Aucun `include` / lien vers `LifePlay` dans le plugin - [ ] Aucun `#include "LifePlay.h"` ni header du module `LifePlay` (`LPShowCoupleSubsystem.h`, `LPDirectControlSubsystem.h`, ...). - [ ] Aucun symbole `LIFEPLAY_API` (ni export, ni usage). - [ ] Aucune entree `"LifePlay"` / `"LifePlayEditorTools"` dans `PublicDependencyModuleNames`, `PrivateDependencyModuleNames`, `DynamicallyLoadedModuleNames` des `*.Build.cs` du plugin. - [ ] Aucun chemin `Source/LifePlay` dans le code (hors commentaires de provenance). - [ ] Graphe de modules : `LPSandbox -> LPAnimMeasure` uniquement ; `LPAnimMeasure` ne depend ni de `LPSandbox` ni du jeu. Verification : `rg` sur `Plugins/LPSandbox/Source` (motifs en `S7-CART.md`). Attendu : 0 resultat hors commentaires. ### C2 - Aucun chargement de graphe Blueprint `GI` / `Person` / `Room` - [ ] Pas de reference a `GI`, `Room`, `BP_Room`, `GameInstance` du jeu (nom ou chemin `/Game/BPs/GI`, `/Game/BPs/Room`). - [ ] Le seul Blueprint du jeu touche est **`Person`**, uniquement pour **lire le CDO** de la classe (rayon / demi-hauteur de capsule, profil et reponses de collision) : `LoadObject(PersonBP)` puis `GetDefaultObject()`. Aucune instance (`SpawnActor`), aucun appel de fonction Blueprint, aucun `ProcessEvent`. - [ ] Le chemin du Blueprint vient de `Config/LPSandbox.ini` (`[Sandbox.Assets] PersonBP`), jamais d'un `StaticClass()` / include C++. - [ ] Le lanceur neutralise l'instance de jeu du Blueprint : `-ini:Engine:[/Script/EngineSettings.GameMapsSettings]:GameInstanceClass=/Script/Engine.GameInstance` (deja dans `Tools/debug/LifePlay_pair_sandbox.bat`). Remarque : `LoadObject` sur `Person.Person_C` charge le package du Blueprint (donnees serialisees) ; le contrat interdit l'**execution** de ses graphes, pas la lecture du CDO. ### C3 - `SoftObjectPath` / config uniquement - [ ] Tout asset du jeu (`/Game/...`) est reference par chaine de `Config/LPSandbox.ini` (19 cles, 6 sections, `S1-SPEC.md`) ou par decouverte `AssetRegistry` (`GetSoftObjectPath().ToString()`). - [ ] Aucun `TSubclassOf<>` / `TObjectPtr<>` / `ConstructorHelpers` vers un type ou un asset du jeu en dur. - [ ] Defaut en code = litteral historique ; fichier ou cle absents => comportement identique (repli S1). - [ ] Un asset introuvable journalise (`LogLPSandbox` / `LogLPAnimMeasure`), sans repli silencieux ni crash. ### C4 - Montage sibling documente - [ ] Jeu et addon sont deux depots **voisins** : `D:\Game\LifePlay-master 5.5\` et `D:\Game\LifePlay-Sandbox\` (pas de submodule imbrique). - [ ] `LifePlay.uproject` : `"AdditionalPluginDirectories": ["../LifePlay-Sandbox/Plugins"]` et plugin `LPSandbox` declare (`Enabled: true`, `Optional: true`, voir S7-T2). - [ ] Pin d'addon consigne a la main (`S3-INT.md`, README de l'addon) a chaque evolution consommee par le jeu. - [ ] Documente dans `21_Sandbox_Addon.md` (section S3) et le README de `LifePlay-Sandbox` (layout, clone sibling, pin). - [ ] Addon seul (`LPSandbox.uproject`) : `Content` du jeu monte par junction NTFS (documente S3). ### C5 - Configurations de build (S7-T2) - [ ] `LPSandbox.uplugin` : `SupportedTargetPlatforms: ["Win64"]`. - [ ] Module `LPSandbox` : `TargetConfigurationDenyList: ["Shipping"]` (le sandbox tourne en `-game` avec l'editeur en Development / DebugGame, jamais en Shipping). - [ ] Module `LPAnimMeasure` : **pas** de deny-list (le module jeu `LifePlay` en depend : `LPCoupleSim`, `LPAnimRedirect`). - [ ] Aucun `TargetAllowList: ["Editor"]` sur `LPSandbox` : trop strict, le sandbox tourne aussi en cible Game Development. ## Hors perimetre - Staging de `LPSandbox.ini` pour un jeu empaquete (reste ouvert depuis S1). - Show complet en jeu / alignement du plancher (`S5-VAL.md` ยง4).