LifePlay-Revival/Docs/Migration/etat/OB/OBA/OBA-T23-EDIT-CART.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

30 KiB
Raw Blame History

Fiche OBA-T23-EDIT — Niveau N3 — Modèle prévu modèle de l'agent lp-cart | utilisé Opus 5.5 (claude-opus-5-5) — Agent lp-cart — Skills sk-protocol, lp-paths (préchargés aussi : ue-cpp-build, lp-commandlets)

OBA-T23-EDIT-CART : plugins éditeur, expérimentaux et d'IA montés dans le jeu empaqueté (2026-10-09)

Copie lue : D:\Game\LifePlay-master 5.8 (branche ue5.8, HEAD 657ce7f, état propre au début de la session). Moteur : D:\Game\Launcher\Engine\UE_5.8\Engine (sources UBT et .uplugin présents, lus). Rien lancé : ni UE, ni commandlet, ni build. Seul fichier écrit : ce livrable. Abréviations : JEU = D:\Game\LifePlay_Build_5.8_Development_U8_essai\Windows\LifePlay\Saved\Logs\LifePlay.log ; RCT-S = Binaries\Win64\LifePlay-Win64-Shipping.target (reçu de cible Shipping) ; RCT-D = Binaries\Win64\LifePlay.target ; RCT-E = Binaries\Win64\LifePlayEditor.target ; RSP-S = Intermediate\Build\Win64\x64\LifePlay\Shipping\LifePlay-Win64-Shipping.exe.rsp (fichier de réponse de l'éditeur de liens : liste des .obj/.lib liés) ; RSP-D = ...\Development\LifePlay.exe.rsp ; UFS-S = D:\Game\LifePlay_Build_5.8_Shipping_U8\Windows\Manifest_UFSFiles_Win64.txt (fichiers mis dans le paquet) ; UBT = Engine\Source\Programs\UnrealBuildTool\Configuration\UEBuildTarget.cs ; CSV = OBA-T1-plugins.csv.

1. Objet et périmètre

Un seul domaine : pourquoi des plugins d'outils éditeur, expérimentaux ou d'IA sont montés dans le jeu empaqueté, et ce qu'ils y apportent, sur trois niveaux distincts : (a) monté (ligne Mounting … plugin au journal du jeu, descripteur .uplugin mis dans le paquet) ; (b) code (modules du plugin liés dans l'exe du jeu, preuve : RSP) ; (c) contenu cuit (fichiers du plugin sous Saved\Cooked\Windows et dans UFS-S). Plugins : les 8 nommés au .uproject avec TargetAllowList: ["Editor"] mais montés en jeu (ConcertMain, ConcertSyncClient, ConcertSyncCore, HairStrands, Interchange, InterchangeAssets, PythonScriptPlugin, Takes), plus ConcertSharedSlate (même chaîne que Concert, hors liste de la fiche), HyperAIStudio, ModelContextProtocol, ToolsetRegistry, EditorToolset, MCPClientToolset, Terminal et les 15 toolsets du .uproject (LifePlay.uproject:211-315). Grille d'action : O3 du doc 30 (30_Projet_Audit_Obsolescence.md:37 : utilisé, état 5.8, service rendu, coût mesuré, action garder / désactiver / remplacer / corriger, risque).

2. Commandes et lectures (exactes) avec compte brut

Livrables amont relus : OBA-T1-INV.md, OBA-T4-INV.md (Read, en entier) ; CSV (Grep, lignes du périmètre).

  1. Read LifePlay.uproject (323 lignes, en entier).
  2. Glob Binaries/Win64/*.{target,modules,version} → 4 fichiers (UnrealEditor.modules, RCT-E, RCT-S, RCT-D). Glob Intermediate/Build/Win64/x64/LifePlay/*/*.rsp → 4 (dont RSP-S et RSP-D).
  3. Dates (pwsh Get-Item … LastWriteTime) : RSP-S 17:55:57, exe Shipping 17:56:48 (164 823 552 o), RCT-S 17:56:49 ; RSP-D 18:17:38, exe Development 18:18:26 (330 686 464 o), RCT-D 18:18:28. Ce sont les produits des compilations U8 (U8_Build_20261009-175553.log, -181732.log ; tailles d'exe égales à OBA-T4-INV.md § 2.2).
  4. Grep RCT-S, motif Concert|HairStrands|Interchange|PythonScript|Takes|HyperAIStudio|ModelContextProtocol|Toolset|Terminal, count → 26 lignes (13 dans RuntimeDependencies, 13 dans BuildPlugins), puis content.
  5. Grep RCT-S, RCT-D, RCT-E (-i), motif des 20 noms de la famille MCP + requérants → famille MCP : 0 ligne dans RCT-S et RCT-D, 20 dans RCT-E (lignes 36727-36978).
  6. Grep RSP-S, motif Concert|HairStrands|HairCard|Interchange|GLTFCore|Python|Take|CacheTrackRecorder|HyperAI|ModelContext|Toolset|Terminal|ConsoleVariables|NiagaraSimCaching|ChaosCaching|GLTFExporter (content) ; recompte par un second motif Concert|HairStrands|Interchange|GLTFCore|Python|/Take|HyperAI|ModelContext|Toolset|Terminal (count) : RSP-S 44, RSP-D 44.
  7. Glob Plugins/VirtualProduction/Takes/Intermediate/Build/Win64/x64/UnrealGame/Shipping/**/*.obj (moteur) → 6 .obj : les chemins ../Plugins/… de RSP-S sont relatifs à Engine\Source (RSP-S:2 ../Build/Windows/Resources/…), donc à Engine\Plugins.
  8. Grep JEU, motif Concert|Takes|TakeRecorder|Python|Interchange|HyperAI|HairStrands|ModelContext|Toolset → 16 lignes (13 Mounting, 1 LogDevObjectVersion, 3 Set CVar r.HairStrands…) ; aucune ligne ModelContextProtocol ni toolset hors MeshModelingToolset.
  9. Contenu cuit (pwsh, Glob ayant rendu 0 sous Saved\Cooked, voir § 5) : Get-ChildItem 'Saved\Cooked\Windows\LifePlay\Plugins' -Recurse -File → 2 fichiers, tous deux de StreetMap (799 + 39 390 o) ; Get-ChildItem 'Saved\Cooked\Windows\Engine\Plugins' -Recurse -File, regroupé par dossier de plugin → 207 fichiers, 4 492 970 o, 10 plugins : ACLPlugin 4, ControlRig 116, DeformerGraph 10, Landmass 22, MeshModelingToolsetExp 6, Water 29, MediaPlate 2, PCG 6, AudioWidgets 2, HairStrands 10 / 650 122 o ; liste des 10 fichiers HairStrands (5 matériaux .uasset+.uexp, datés 18:07:52-18:08:28 local = cuisson U8-T3).
  10. Grep UFS-S, motif Concert|HairStrands|/Interchange|Python|/Takes/|HyperAI|ModelContext|Toolset|/Terminal/|upluginmanifest (content) ; recompte ancré ^(Engine/Plugins/(Developer/Concert|Experimental/InterchangeAxF|Experimental/PythonScriptPlugin|Interchange|Runtime/HairStrands|VirtualProduction/Takes|Experimental/ModelContextProtocol|Experimental/Toolset|Experimental/Terminal)|LifePlay/Plugins/Marketplace) : Shipping 29, Development 29. Manifest_NonUFSFiles_Win64.txt (Shipping), même famille de motifs : 0.
  11. Grep "Name"\s*:\s*"(Takes|ConcertMain|…|HyperAIStudio)" dans Engine\Plugins\**\*.uplugin (requérants de chaque plugin), puis croisement avec CSV (monte_jeu) ; Grep des requérants de second rang (ChaosCaching|SequencerScripting|InterchangeEditor|…).
  12. Read des descripteurs : ConsoleVariables.uplugin (49 l.), NiagaraSimCaching.uplugin (40), Interchange.uplugin (122), InterchangeEditor.uplugin:8-57, GLTFExporter.uplugin (42), ChaosCaching.uplugin:10-36, ChaosCloth.uplugin:10-39, Dataflow.uplugin:50-63, ControlRig.uplugin:10-37, Niagara.uplugin:1-26, RigVM.uplugin:40-53, PluginUtils.uplugin (36), SequencerScripting.uplugin:8-27, HyperAIStudio.uplugin:1-40 et :344-478.
  13. Read UBT:5630-5737, 5740-5779, 5800-5919 ; Grep UBT bDescriptorNeededAtRuntime =|bDescriptorReferencedExplicitly = ; Read UBT:2515-2544 ; Read System\Plugins.cs:108-129 ; Read Runtime\Projects\Private\PluginManager.cpp:2405-2479 ; Grep PluginManager.cpp UBT_TARGET_BUILD_PLUGINS (l.1462).
  14. Grep Source (Groom|HairStrands|TakeRecorder|Interchange|Python|Concert|HyperAI) → 4 lignes, toutes HyperAIStudio dans LifePlayEditorTools (module Editor). Grep Config (même motif + ModelContextProtocol) → 3 lignes (DefaultGame.ini:59,60,72) ; Read DefaultGame.ini:40-89.
  15. Grep HairStrands\Source (noms des 5 matériaux) → GroomComponent.cpp:1499-1502. Grep PythonScriptPluginPreload (WITH_PYTHON|bBuildEditor) → PythonScriptPluginPreload.Build.cs:16,26.
  16. HyperAIStudio : pwsh Get-ChildItem par sous-dossier → Binaries 51 / 1 712 641 848 o, Content 1 / 204 o (Content\HyperAIStudio\README.md), Docs 1, Intermediate 554, Resources 2, Source 248 ; git check-ignore -v → .git/info/exclude:15:/Plugins/Marketplace/ (code 0) ; git status --porcelain --ignored -- Plugins/Marketplace → !! Plugins/Marketplace/.
  17. Doc 29 : Grep TargetAllowList → l.140 ; Read 29_Projet_Stabilisation_V2.md:130-149.
  18. Web : WebSearch « Unreal Engine 5.8 release notes Model Context Protocol toolsets experimental plugin » ; WebSearch « … TargetAllowList Editor still packaged dependency … » ; WebFetch des notes de version 5.8 (lu : caractères 0-100 000 sur 357 273).

3. Constats fichier:ligne

3.1 Mécanisme commun (UBT et gestionnaire de plugins à l'exécution)

  • Une entrée du .uproject est d'abord inscrite dans ReferencedNames (UBT:5661), puis passée à AddPlugin (UBT:5667). Pour la cible Game, une entrée TargetAllowList: ["Editor"] est rejetée par if (!Reference.IsEnabledForTarget(TargetType)) … return null (UBT:5840-5844).
  • Le passage « plugins activés par défaut » saute tout nom déjà dans ReferencedNames (UBT:5680). L'entrée Editor du .uproject retire donc aussi l'activation par défaut côté Game (cas d'Interchange, EnabledByDefault: true à Interchange.uplugin:13).
  • En revanche, une dépendance déclarée dans le .uplugin d'un plugin activé pour le jeu est une nouvelle référence, sans liste de cibles : elle passe les contrôles de UBT:5827-5844 et le plugin est activé (relu pour le chemin de l'instance existante, UBT:5816-5820 ; chemin de la nouvelle instance non relu ligne à ligne, voir § 4). Une référence Optional: true active quand même le plugin s'il est trouvé : bOptional ne joue qu'en cas d'absence (UBT:5878-5883).
  • Même règle à l'exécution : PluginManager.cpp:2425-2429 ignore une référence non permise pour la cible et suit les dépendances de la file (:2417-2420).
  • Descripteur mis dans le paquet : référence non optionnelle (bDescriptorReferencedExplicitly = !Reference.bOptional, UBT:5932) ou plugin CanContainContent/dépendance qui en a besoin (UBT:5996-5999). Ajout aux dépendances d'exécution du reçu : UBT:2519-2525. Le jeu empaqueté lit LifePlay/Plugins/LifePlay.upluginmanifest (UFS-S:22069).
  • Modules : seuls les types autorisés pour Game sont compilés. Les modules Editor et UncookedOnly sont absents de RSP-S (preuves par plugin ci-dessous).

3.2 Concert (ConcertMain, ConcertSyncClient, ConcertSyncCore, plus ConcertSharedSlate)

  • .uproject : LifePlay.uproject:176-196 (Editor). Monté : JEU:89-92. Reçu Shipping : RCT-S:3360-3372 (descripteurs UFS), RCT-S:4018-4021 (BuildPlugins).
  • Chaîne : ConsoleVariables.uplugin:11 (EnabledByDefault: true) requiert les quatre sans option (:18-35). ConsoleVariables est dans le jeu (RCT-S:4022, CSV:68 defaut, jeu = oui). Les autres requérants trouvés dans le moteur (DisplayClusterLaunch, Composite, LiveLink, RemoteControl, nDisplay, ColorCorrectRegions, SequencerPlaylists, CineCameraRigs, MultiUser*) ne sont pas montés dans le jeu (CSV : absents, ou LiveLink:145 jeu = non).
  • Code : modules tous UncookedOnly (CSV:63-66) → 0 ligne Concert dans RSP-S. Le requérant apporte ConsoleVariablesEditorRuntime (RSP-S:787).
  • Contenu : 0 fichier cuit ; dans le paquet, 4 .uplugin (UFS-S:817-820) et DefaultConcertSyncCore.ini (UFS-S:1667).

3.3 Takes

  • .uproject : :197-203 (Editor). Monté : JEU:234. Reçu : RCT-S:3916, :4165.
  • Chaînes : (1) NiagaraSimCaching.uplugin:13 (EnabledByDefault: true), :30-34 → Takes. (2) ChaosCaching.uplugin:30-35 → Takes ; ChaosCaching (EnabledByDefault: false, :13) est requis par ChaosCloth.uplugin:28-32 (EnabledByDefault: true, :13) et Dataflow.uplugin:57-60. Les quatre requérants sont dans le jeu (RCT-S:4004 ChaosCaching, :4117 NiagaraSimCaching ; RCT-S:3340 ChaosCloth, :3352 Dataflow).
  • Code : 6 modules Runtime liés : TakeMovieScene, TakesCore, TakeTrackRecorders, TakeRecorder, TakeRecorderSources, TakeRecorderNamingTokens (RSP-S:1097, 1100, 1102-1105). Absents : TakeRecorderEditor, CacheTrackRecorder (UncookedOnly), TakeSequencer (Editor) (CSV:248). Requérants liés : NiagaraSimCaching (RSP-S:964), ChaosCaching (RSP-S:762).
  • Contenu : 0 fichier cuit (DefaultGame.ini:71 DirectoriesToNeverCook=/Takes, lot O1) ; paquet : Takes.uplugin (UFS-S:956) et DefaultTakes.ini (UFS-S:1702).

3.4 PythonScriptPlugin

  • .uproject : :204-210 (Editor). Monté : JEU:156. Reçu : RCT-S:3608, :4142.
  • Chaînes : (1) Niagara.uplugin:13 (EnabledByDefault: true), :17-21 → PythonScriptPlugin, sans option ni liste de cibles. (2) ControlRig.uplugin:13, :30-33 → SequencerScripting ; SequencerScripting.uplugin:17-21 → PythonScriptPlugin. Pas par RigVM (RigVM.uplugin:45-50, Editor) ni PluginUtils (PluginUtils.uplugin:29-34, Enabled: false, optionnel, Editor). Niagara RCT-S:4114, SequencerScripting RCT-S:4155.
  • Code : 1 module lié, PythonScriptPluginPreload (RSP-S:1008, Runtime, EarliestPossible) ; le module PythonScriptPlugin (UncookedOnly) est absent. Hors éditeur, le module est compilé avec WITH_PYTHON=0 (PythonScriptPluginPreload.Build.cs:16 teste Target.bBuildEditor, :26 WITH_PYTHON=0). Aucune DLL Python mise en paquet (NonUFS : 0).
  • Contenu : 0 fichier cuit (DefaultGame.ini:72) ; paquet : PythonScriptPlugin.uplugin seul (UFS-S:879).

3.5 Interchange et InterchangeAssets

  • .uproject : Interchange :80-91, InterchangeAssets :92-98 (Editor). Monté : JEU:167 et :165 (InterchangeEditor :166, InterchangeAxfAssets :148). Reçu : RCT-S:3652, :3644, :3648, :3576 ; BuildPlugins RCT-S:4077-4080.
  • Chaîne Interchange : GLTFExporter.uplugin:12 (EnabledByDefault: true), :27-36 (Interchange, Optional: true, ce qui l'active quand même) ; GLTFExporter est dans le jeu (RCT-S:4055, CSV:120). Pas par InterchangeEditor (InterchangeEditor.uplugin:51-57 : Interchange limité à Editor, Program). Les autres extensions Interchange ne sont pas dans le reçu Game (Grep RCT-S : seuls Interchange, InterchangeAssets, InterchangeAxfAssets, InterchangeEditor).
  • Chaîne InterchangeAssets : Interchange.uplugin:115-118, GLTFExporter.uplugin:37-40, InterchangeAxfAssets.uplugin:26 (InterchangeAxfAssets activé par défaut, CSV:132).
  • Code : 11 modules d'Interchange liés (16 .obj) : GLTFCore, InterchangeNodes, InterchangeCommon, InterchangeFactoryNodes, InterchangeMessages, InterchangeDispatcher, InterchangeCommonParser, InterchangeImport, InterchangeExport, InterchangePipelines, InterchangeAnalytics (RSP-S:842-845, 900-912). S'y ajoute draco.lib (RSP-S:41, 1175). InterchangeFbxParser est absent (Interchange.uplugin:79-91, module limité à Editor, Program). InterchangeAssets : 1 module (RSP-S:913) ; InterchangeAxFAssets (RSP-S:914) ; GLTFExporter (RSP-S:846-847). InterchangeEditor : modules Editor limités à Editor, Program (InterchangeEditor.uplugin:22-49), 0 dans RSP-S. Les modules moteur InterchangeCore, InterchangeEngine (RSP-S:841, 844, sous Engine\Intermediate) ne viennent pas du plugin.
  • Contenu : 0 fichier cuit (DefaultGame.ini:59-60) ; paquet : 3 .uplugin (UFS-S:888-890), 2 .ini (UFS-S:1683-1684).

3.6 HairStrands

  • .uproject : :134-140 (Editor). Monté : JEU:210. Reçu : RCT-S:3824, :4070.
  • Chaîne : Interchange.uplugin:95-98 → HairStrands. C'est le seul requérant monté dans le jeu : USDCore, MetaHumanSDK (CSV:262, 165, jeu = non) ; USDImporter, AlembicHairImporter, MetaHuman*, HairCardGenerator, HairModelingToolset, MeshResizing, MeshPartition, HairStrandsMutable absents du CSV. Chaîne complète : GLTFExporter (activé par défaut) → Interchange → HairStrands.
  • Code : 4 modules Runtime liés (8 .obj) : HairStrandsCore (RSP-S:836-840), HairStrandsSolver (:868), HairStrandsDeformer (:869), HairStrandsRuntime (:870). Absents : HairStrandsEditor, HairCardGeneratorFramework, HairStrandsDataflow (Editor, CSV:124).
  • Contenu : 10 fichiers cuits, 650 122 o (Saved\Cooked\Windows\Engine\Plugins\Runtime\HairStrands\Content\Materials\, 5 matériaux), mis en paquet (UFS-S:12936-12945), avec HairStrands.uplugin (UFS-S:933) et DefaultHairStrands.ini (UFS-S:1692). Origine : 4 de ces matériaux sont chargés par le constructeur de UGroomComponent (GroomComponent.cpp:1499-1502, ConstructorHelpers::FObjectFinder). /HairStrands n'est pas dans DirectoriesToNeverCook (DefaultGame.ini:58-73).
  • Les 23 lignes LifePlay/Content/…HairStrands… d'UFS-S (ex. l.9308) sont des assets du jeu, nommés ainsi. Elles ne viennent pas du plugin et ne sont pas comptées.

3.7 HyperAIStudio

  • Non nommé au .uproject (LifePlay.uproject:21-316, lu en entier). Son .uplugin n'a pas EnabledByDefault (HyperAIStudio.uplugin:1-18). Plugin du projet, donc activé par défaut (Plugins.cs:115-121 pour le champ présent ; branche du champ absent : PluginManager.cpp:421-435 selon OBA-T1-INV.md § 4, non relu ici). Monté : JEU:237. Reçu : RCT-S:3952 (descripteur UFS), :4072.
  • Descripteur mis en paquet parce que "CanContainContent": true (HyperAIStudio.uplugin:14 ; UBT:5996-5999) : UFS-S:961.
  • Dépendances : 20 entrées Enabled: false (HyperAIStudio.uplugin:346-426), ignorées (UBT:5773-5777). 5 entrées MCP Enabled: true limitées à Editor (:427-476 : ModelContextProtocol, ToolsetRegistry, EditorToolset, MCPClientToolset, Terminal). HyperAIStudio n'entraîne donc aucun plugin dans le jeu.
  • Code : 25 modules, tous Editor (CSV:126) → 0 ligne HyperAI dans RSP-S.
  • Contenu : dossier Content = 1 fichier non asset (README.md, 204 o) → 0 fichier cuit (Saved\Cooked\Windows\LifePlay\Plugins ne contient que StreetMap). Dans le paquet : le seul .uplugin.
  • Dépôt : ignoré par .git/info/exclude:15 (exclusion locale, pas .gitignore) ; installé et non commité (doc 29:138-139).

3.8 Famille MCP : ModelContextProtocol, ToolsetRegistry, EditorToolset, MCPClientToolset, Terminal et les 15 toolsets

  • Non montés dans le jeu : CSV:6, 14, 31, 67, 80, 93, 109, 144, 157, 170, 178, 186, 202, 205, 211, 238, 243, 251, 254, 259 (monte_jeu = non pour les 20). JEU : 0 ligne ModelContext, aucun toolset.
  • Absents des reçus Game : 0 ligne dans RCT-S et RCT-D. Présents dans RCT-E (20 lignes, 36727-36978).
  • Code : 0 dans RSP-S et RSP-D. Contenu : 0 dans UFS-S.
  • Raison : les 15 toolsets portent TargetAllowList: ["Editor"] au .uproject (:211-315, correction de doc 29:139-140). ModelContextProtocol, ToolsetRegistry, EditorToolset, MCPClientToolset et Terminal ne sont activés que par dépendance (CSV dep), depuis HyperAIStudio (Editor, § 3.7) et les toolsets (Editor). ModelContextProtocol a pourtant des modules Runtime (CSV:170), qui restent hors du jeu.

4. Établi / estimé / incertain

Établi (lu à la source) :

  • Les trois niveaux par plugin, tableau de ## Constats : montage (JEU, reçus RCT-S/RCT-D), code lié (RSP-S, recompte RSP-D identique : 44/44), contenu (pwsh sur Saved\Cooked, UFS-S ; recompte Development identique : 29/29).
  • Les chaînes de dépendances, lues dans les .uplugin du moteur 5.8 installé, avec les entrées présentes dans BuildPlugins de RCT-S.
  • La règle UBT : une entrée Editor du .uproject n'empêche pas un plugin d'entrer dans le jeu par dépendance (UBT:5661, 5680, 5840-5844 ; résultat visible dans RCT-S).
  • RSP-S, RCT-S et l'exe Shipping viennent de la compilation U8-T2 (dates, taille d'exe). Les fichiers cuits HairStrands viennent de la cuisson U8-T3 (dates).
  • État 5.8, d'après les descripteurs locaux : Concert bêta (CSV:63-66) ; PythonScriptPlugin bêta (CSV:220) ; Takes, HairStrands, Interchange, InterchangeAssets ni bêta ni expérimentaux (CSV:248, 124, 130, 131) ; famille MCP expérimentale (CSV), confirmé par les notes de version Epic 5.8 (« MCP Server (Experimental) »).

Estimé :

  • Les modules Runtime liés sont aussi chargés et démarrés à l'exécution : leur plugin est monté, et IMPLEMENT_MODULE en monolithique les enregistre statiquement. Aucun journal ne liste les démarrages de modules du jeu.
  • L'éditeur de liens garde le code de ces modules (enregistrement statique), malgré /OPT:REF ; la part de chacun dans les 164,8 Mo de l'exe n'est pas mesurée.
  • Le chemin « nouvelle instance » de AddPlugin qui suit les dépendances (UBT:5933-5995) n'a pas été relu ligne à ligne ; son effet est prouvé par RCT-S.
  • PythonScriptPluginPreload est une coquille vide en jeu : la structure if (Target.bBuildEditor) … else WITH_PYTHON=0 est déduite des lignes 16 et 26, non lues en entier.
  • Les matériaux HairStrands sont cuits à cause des références du CDO de UGroomComponent (module lié) ; aucun journal de cuisson n'a été lu pour le confirmer.

Incertain (essai qui trancherait) :

  • Le jeu utilise-t-il des grooms (HairStrands) ? Source : 0 occurrence de Groom. Une requête AssetRegistry sur les classes GroomAsset / GroomComponent / GroomBindingAsset dans /Game (par exemple LPDumpAssets, ou l'AssetRegistry.bin cuit) trancherait.
  • Usage d'Interchange ou de glTF en jeu ou par les mods (import ou export à l'exécution) : 0 occurrence dans Source ; le contenu de Content/Modules et des mods n'a pas été lu.
  • Chaîne exacte à l'exécution : un lancement du jeu avec -LogCmds="LogPluginManager Verbose" afficherait les références ignorées (PluginManager.cpp:2427).
  • État 5.8 de Concert, Takes, Python, HairStrands et Interchange selon Epic : seuls les caractères 0-100 000 des notes de version (357 273) ont été lus ; aucune mention de ces cinq plugins dans cette partie. Il reste à lire les offsets 100 000 et au-delà.
  • Coût en octets du code dans l'exe : il faudrait une carte de liens (/MAP) ou un outil de taille ; non disponible.

5. Points à confirmer (repris par la fiche suivante)

  1. Avant de couper HairStrands : établir l'absence d'assets groom dans /Game (incertain ci-dessus).
  2. Avant de couper Interchange et GLTFExporter : établir l'absence d'import ou d'export glTF à l'exécution, y compris par les mods.
  3. Lire la définition de TargetRules.ShouldIgnorePluginDependency (appel UBT:5816). Si elle se surcharge dans LifePlay.Target.cs, elle couperait proprement NiagaraSimCaching → Takes, ChaosCaching → Takes ou Niagara → PythonScriptPlugin pour le seul jeu (non lu).
  4. DisablePlugins dans le Target.cs n'est pas une voie propre : un plugin de DisablePlugins réactivé par un requérant ne produit qu'un avertissement, ou une erreur selon DisablePluginsConflictWarningLevel (UBT:5911-5919). À vérifier si la SPEC l'envisage.
  5. Après toute correction : recompiler la cible Game, puis relire BuildPlugins de RCT-S (absence attendue), RSP-S (modules disparus), UFS-S (.uplugin disparu) et les lignes Mounting d'un nouveau journal de jeu.
  6. Piège d'outil à reporter dans lp-paths : Glob a rendu 0 sous Saved\Cooked\Windows (motifs LifePlay/Plugins/**/* et Engine/Plugins/**/…), alors que Get-ChildItem y liste des fichiers. Il a fonctionné sous Binaries et Intermediate. Sous Saved, lister par pwsh.
  7. Doc 29 § 9 lu seulement aux lignes 130-149 (HyperAIStudio, toolsets) ; ERR-054 à 056 non relus.

6. Questions pour la SPEC ou l'utilisateur

  • Q1 : accepte-t-on de nommer au .uproject, avec TargetAllowList: ["Editor"], des plugins requérants qui ne sont pas eux-mêmes du périmètre ? ConsoleVariables couperait Concert ×4 ; GLTFExporter et InterchangeAxfAssets couperaient Interchange, InterchangeAssets et HairStrands. Le .uproject grossit, mais c'est la seule coupure par descripteur qui marche (§ 3.1).
  • Q2 : pour HyperAIStudio (ignoré par git localement), accepte-t-on une entrée .uproject {"Name": "HyperAIStudio", "Enabled": true, "Optional": true, "TargetAllowList": ["Editor"]} ? Sans Optional, une compilation Editor sur un clone sans le plugin échouerait (« Unable to find plugin », UBT:5884-5886). Les outils de mise en place de HyperAIStudio réécrivent-ils le .uproject (doc 29:139-140 : ils ont déjà touché aux toolsets) ?
  • Q3 : Takes (6 modules) et PythonScriptPlugin (1 module vide) entrent par Niagara, ControlRig et ChaosCloth, que le jeu garde. Accepte-t-on « garder » (contenu déjà exclu par le lot O1), ou ouvre-t-on la piste ShouldIgnorePluginDependency (point 3) ?
  • Q4 : bDisableEnginePluginsByDefault (absent du .uproject, OBA-T1-INV.md Constats) réglerait le problème à la racine pour les 123 plugins activés par défaut. C'est un lot à part, hors de cette fiche.

Constats

Tableau par plugin (grille O3). Monté = journal JEU et reçu RCT-S ; code = modules du plugin dans RSP-S ; cuit = fichiers du plugin sous Saved\Cooked\Windows (le paquet contient en plus le .uplugin et les .ini cités en § 3).

Plugin Monté en jeu (preuve) Pourquoi (chaîne, preuve) Code lié (RSP-S) Contenu cuit Service en jeu État 5.8 Action proposée Risque
ConcertMain, ConcertSyncClient, ConcertSyncCore (+ ConcertSharedSlate) oui, JEU:89-92 ; RCT-S:4018-4021 ConsoleVariables (activé par défaut) → les 4 (ConsoleVariables.uplugin:11,18-35) 0 (modules UncookedOnly) ; le requérant lie ConsoleVariablesEditorRuntime (:787) 0 non (aucun code, seulement un .ini) bêta corriger : ConsoleVariables au .uproject en TargetAllowList: ["Editor"] (Q1) faible : vérifier qu'aucun préréglage de CVar n'est utilisé en jeu ; gain = 4 descripteurs, 1 .ini, 1 module
Takes oui, JEU:234 ; RCT-S:4165 NiagaraSimCaching (activé par défaut, :13,30-34) et ChaosCloth/Dataflow → ChaosCaching → Takes (ChaosCaching.uplugin:30-35) 6 modules Runtime (:1097, 1100, 1102-1105) 0 (DefaultGame.ini:71) non attendu (enregistrement de prises : outil de production) ; 0 référence dans Source stable (ni bêta ni expérimental) garder tant que ChaosCloth/Dataflow restent ; option : couper la seule branche NiagaraSimCaching (Editor), ou ShouldIgnorePluginDependency (point 3, Q3) couper ChaosCloth casserait la simulation de tissu : à exclure
PythonScriptPlugin oui, JEU:156 ; RCT-S:4142 Niagara (activé par défaut, :13,17-21) ; ControlRig → SequencerScripting → Python (SequencerScripting.uplugin:17-21) 1 : PythonScriptPluginPreload (:1008), WITH_PYTHON=0 (estimé) 0 (DefaultGame.ini:72) ; aucune DLL Python non bêta garder (coût quasi nul ; coupure impossible sans retirer Niagara) nul
Interchange oui, JEU:167 ; RCT-S:4077 GLTFExporter (activé par défaut) → Interchange (GLTFExporter.uplugin:12,27-36, optionnel mais actif) 11 modules (16 .obj) + draco.lib 0 (DefaultGame.ini:59) non établi (0 référence dans Source ; mods non lus) stable corriger si Q1 et point 2 : GLTFExporter (et InterchangeAxfAssets) en Editor au .uproject moyen : un import/export glTF à l'exécution, s'il existe, disparaît
InterchangeAssets oui, JEU:165 ; RCT-S:4078 Interchange (Interchange.uplugin:115-118), GLTFExporter (:37-40), InterchangeAxfAssets (InterchangeAxfAssets.uplugin:26) 1 (:913) 0 (DefaultGame.ini:60) non établi stable corriger, avec Interchange (mêmes requérants) faible si Interchange est coupé
HairStrands oui, JEU:210 ; RCT-S:4070 GLTFExporter → Interchange → HairStrands (Interchange.uplugin:95-98) ; seul requérant monté 4 modules Runtime (8 .obj, :836-840, 868-870) 10 fichiers, 650 122 o (matériaux chargés par GroomComponent.cpp:1499-1502) incertain (usage de grooms non établi) stable corriger seulement si le point 1 établit « pas de groom » (suit la coupure d'Interchange) ; sinon garder et le nommer en jeu moyen : des cheveux groom, s'il y en a, ne s'afficheraient plus
HyperAIStudio oui, JEU:237 ; RCT-S:3952, 4072 plugin du projet, activé par défaut (non nommé au .uproject) ; descripteur mis en paquet par CanContainContent (HyperAIStudio.uplugin:14, UBT:5996-5999) 0 (25 modules Editor) 0 (Content = 1 README.md) non outil tiers Fab, 5.8 seulement (doc 29:135-136) corriger : entrée .uproject Optional + TargetAllowList: ["Editor"] (Q2) faible ; vérifier que l'outil ne réécrit pas le .uproject
ModelContextProtocol, ToolsetRegistry, EditorToolset, MCPClientToolset, Terminal non (CSV, JEU, RCT-S : 0) dépendances de HyperAIStudio (Editor, :427-476) et des toolsets (Editor) 0 0 non (outils éditeur) expérimental (notes de version 5.8 « MCP Server (Experimental) ») garder tel quel (déjà hors jeu) nul
15 toolsets (AIModuleToolset … UMGToolSet) non (CSV, RCT-S : 0 ; RCT-E : présents) nommés au .uproject avec TargetAllowList: ["Editor"] (:211-315, doc 29:139-140) 0 0 non expérimental (CSV) garder tel quel nul

Synthèse :

  • Sur les 9 plugins du périmètre montés en jeu, aucun n'y est par choix du projet. Tous y sont par la chaîne d'un plugin moteur activé par défaut (ConsoleVariables, GLTFExporter, NiagaraSimCaching, Niagara, ControlRig, ChaosCloth, Dataflow), sauf HyperAIStudio, activé par défaut comme plugin du projet.
  • Le TargetAllowList du .uproject ne coupe que l'activation directe, jamais une dépendance.
  • Le lot O1 a déjà neutralisé le contenu (DirectoriesToNeverCook) de Takes, Python, Interchange et InterchangeAssets. Le seul contenu de plugin cuit dans le périmètre est HairStrands (650 122 o bruts).
  • Code réellement lié dans l'exe : Takes 6 modules, Interchange 11 (+ draco.lib), InterchangeAssets 1, HairStrands 4, Python 1 (vide). Concert, HyperAIStudio et la famille MCP n'en apportent aucun.

Sources web :