13 KiB
Fiche OBA-T1 — Niveau N1 — Modèle prévu non précisé par la fiche (« modèle de l'agent lp-inventory ») | utilisé Sonnet 5.5 (claude-sonnet-5-5) — Agent lp-inventory — Skills sk-protocol, sk-recount, lp-paths
OBA-T1-INV : inventaire des plugins et modules dont dépend LifePlay 5.8 (2026-10-09)
Copie lue : D:\Game\LifePlay-master 5.8, branche ue5.8, HEAD 657ce7f (git log --oneline -1), git status --porcelain : 0 ligne avant écriture. Addon lu : D:\Game\LifePlay-Sandbox-5.8, branche ue5.8, HEAD ec23fad. Moteur : D:\Game\Launcher\Engine\UE_5.8\Engine. Aucun jeu, éditeur ni commandlet lancé. Fichiers écrits : ce livrable, OBA-T1-plugins.csv, OBA-T1-modules.csv (même dossier) ; le script de lecture est dans le scratchpad (oba_t1.py).
1. Commandes exactes
Journaux (abrégés : ED = D:\Game\LifePlay-master 5.8\Saved\Logs\portage\STM-T4c_EditorHeadless_20261009-161851.log, JEU = D:\Game\LifePlay_Build_5.8_Development_U8_essai\Windows\LifePlay\Saved\Logs\LifePlay.log) :
ls -lasur les deux journaux : présents (ED 322 253 octets, JEU 3 281 562 octets). Pas d'arrêt « journal manquant ».- Grep
Mounting (Engine|Project) plugin,output_mode: count, sur ED puis sur JEU. - Grep
Mounting (External|Project) plugin,output_mode: content, sur ED puis sur JEU. python -I oba_t1.py(regexLogPluginManager: Mounting (\w+) plugin (\S+)sur ED et JEU ; lecture deLifePlay.uproject; parcours récursif des.uplugindeEngine\Plugins,Engine\Platforms,Plugins\du jeu etPlugins\de l'addon ; lecture JSON stricte puis tolérante : commentaires//et/* */, virgules finales, BOM ; analyse desSource\*\*.Build.cshors commentaires).- Recomptes par une autre méthode : Grep
countsur les CSV écrits (motifs par colonne) ;pwsh -NoProfileavecSelect-String 'LogPluginManager: Mounting \w+ plugin'sur ED et JEU,Get-ChildItem -Recurse -Filter *.uplugin | Measure-Object,(Get-Content LifePlay.uproject -Raw | ConvertFrom-Json).Plugins | Measure-Object;cmpdu scratchpad aux CSV livrés ; Grep"TargetAllowList"et"Optional"(count) surLifePlay.uproject; Grep"DeprecatedEngineVersion"surEngine\Plugins,Plugins\du jeu etPlugins\de l'addon ; GrepDynamicallyLoadedModuleNamessurSource. - Règle d'activation par défaut relue à la source :
Engine\Source\Runtime\Projects\Private\PluginManager.cpp:421-435(FPlugin::IsEnabledByDefault). git ls-files "Plugins/<dossier>" | wc -lpour LPAnimCore, Marketplace, McpAutomationBridge, ModdingExtra, StreetMap ;git -C D:/Game/LifePlay-Sandbox-5.8 log --oneline -1.- Lectures (Read) :
LifePlay.uproject,Source\LifePlay\LifePlay.Build.cs,Source\LifePlayEditorTools\LifePlayEditorTools.Build.cs,Plugins\Marketplace\HyperAIStudio\HyperAIStudio.uplugin.
2. Comptes bruts
Plugins montés au démarrage (lignes Mounting … plugin) :
| Mesure | ED (éditeur) | JEU (empaqueté Development) | Commande |
|---|---|---|---|
Lignes Mounting tous types |
276 | 177 | oba_t1.py ; pwsh Select-String : 276 / 177 |
dont Engine |
271 | 173 | oba_t1.py |
dont Project |
4 | 4 | oba_t1.py |
dont External |
1 (LPSandbox, ED:373) | 0 | Grep Mounting (External|Project) plugin |
Grep (Engine|Project) seul |
275 | 177 | Grep count (l'écart de 1 avec 276 est la ligne External) |
| Noms distincts / doublons | 276 / 0 | 177 / 0 | oba_t1.py |
Recoupement : les 177 plugins du jeu sont tous montés dans l'éditeur (intersection 177, jeu seul 0, éditeur seul 99, union 276). Plugins Project montés dans le jeu : LPAnimCore, HyperAIStudio, ModdingExtra, StreetMap (JEU:236-239). Éditeur : ces quatre plus LPSandbox en External (ED:369-373).
LifePlay.uproject : Plugins = 42 entrées (40 Enabled: true, 2 Enabled: false : McpAutomationBridge, AndroidFileServer) ; AdditionalPluginDirectories = 1 (../LifePlay-Sandbox-5.8/Plugins) ; Modules = 2 (LifePlay Runtime, LifePlayEditorTools Editor) ; Optional : 2 entrées (LPSandbox, McpAutomationBridge ; Grep count 2) ; TargetAllowList: ["Editor"] : 36 entrées (Grep count 36), dont 35 activées et McpAutomationBridge (désactivé). Recompte pwsh du tableau Plugins : 42.
Fichiers .uplugin : moteur 921, jeu Plugins\ 5, addon 1 (pwsh Measure-Object : 921 et 5). Noms en double : 0. Lus pour l'inventaire : 278 (276 montés dans ED + les 2 désactivés du .uproject). Introuvables : 0.
Échecs de lecture de .uplugin : 0. Lus en mode tolérant (JSON strict refusé ; 270 lus en strict) : 8 — ChaosSolverPlugin, ImgMedia, MeshLODToolset, ModelViewViewModel, OnlineSubsystemIOS, SequencerScripting, VariantManager, VisualStudioSourceCodeAccess (chemins dans le CSV).
Drapeaux (sur les plugins montés) :
| Drapeau | JEU (177) | ED (276) | Recompte (autre méthode) |
|---|---|---|---|
IsBetaVersion: true |
52 | 68 | Grep count sur CSV : 52 / 68 |
IsExperimentalVersion: true |
20 | 48 | Grep count sur CSV : 20 / 48 |
DeprecatedEngineVersion présent |
0 | 0 | voir ci-dessous |
DeprecatedEngineVersion : 0 pour les 278 plugins lus. Le zéro n'est pas un échec de lecture : le champ existe dans 3 .uplugin du moteur (LightWeightInstancesEditor, RawInput, StructUtils ; Grep count sur Engine\Plugins), aucun des trois n'est monté (Grep sur le CSV : 0) ; 0 dans Plugins\ du jeu et de l'addon.
Plugins du dépôt et de l'addon : LPSandbox (addon) IsBetaVersion: true ; McpAutomationBridge (désactivé, non monté) bêta et expérimental true ; LPAnimCore, ModdingExtra, StreetMap, HyperAIStudio : ni l'un ni l'autre.
Listes nominatives bêta et expérimental du jeu : sorties de oba_t1.py (lignes beta jeu et experimental jeu), reconstituables par Grep sur le CSV (colonnes 6 et 7, monte_jeu = oui).
Activation (colonne active_par du CSV ; jetons : uproject = nommé et activé par le .uproject, uproject-Editor = idem avec TargetAllowList: ["Editor"], uproject-off = nommé Enabled: false, defaut = IsEnabledByDefault vrai et non nommé au .uproject, dep = requis (Enabled vrai, non optionnel) par un plugin monté dans le même contexte) :
| Origine | JEU | ED | Commande de recompte |
|---|---|---|---|
Nommé par le .uproject (activé) |
12 | 40 | Grep count ^[^;]+;[^;]+;[^;]+;oui;uproject : 12 ; ^[^;]+;[^;]+;oui;[^;]+;uproject(-Editor)?(\+|;) : 40 |
| Par défaut moteur ou projet seulement | 123 (91 defaut + 32 defaut+dep) |
176 (142 + 34) | Grep count …oui;defaut : 123 / 176 |
| Par dépendance seulement | 42 | 60 | Grep count …oui;dep; : 42 / 60 |
| Somme | 177 | 276 | = plugins montés |
Détail JEU des 12 nommés : 3 uproject (LPAnimCore, ModdingExtra, StreetMap), 1 uproject+dep (EnhancedInput), 8 uproject-Editor+dep (ConcertMain, ConcertSyncClient, ConcertSyncCore, HairStrands, Interchange, InterchangeAssets, PythonScriptPlugin, Takes).
Les 2 désactivés du .uproject (McpAutomationBridge, AndroidFileServer) ne sont montés ni dans ED ni dans JEU.
Lignes des CSV. OBA-T1-plugins.csv : 278 lignes de données + 1 en-tête = 279 (wc -l : 279) ; par source : moteur 272, dépôt 5 (LPAnimCore, ModdingExtra, StreetMap, HyperAIStudio, McpAutomationBridge), addon 1 (LPSandbox) ; Grep count ;moteur; : 272 et (depot|addon) : 6 ; 278 = 276 montés dans ED + McpAutomationBridge + AndroidFileServer. OBA-T1-modules.csv : 30 lignes + 1 en-tête = 31 (wc -l : 31). cmp du scratchpad contre les fichiers livrés : identiques pour les deux CSV.
Plugins du dépôt (Plugins\ du jeu, 5 .uplugin ; git ls-files : fichiers suivis) : LPAnimCore 7, ModdingExtra 8, StreetMap 34, Marketplace (HyperAIStudio) 0, McpAutomationBridge 0. Addon (AdditionalPluginDirectories) : LPSandbox, modules LPSandbox (Runtime), LPAnimMeasure (Runtime), LPModTools (Editor) ; non monté dans le jeu empaqueté (colonne monte_jeu = non).
Modules C++ (Source\*\*.Build.cs, 2 fichiers ; commentaires ignorés) :
| Module | Public | Private | DynamicallyLoaded | Total |
|---|---|---|---|---|
| LifePlay | 7 : Core, CoreUObject, Engine, InputCore, AssetRegistry, NavigationSystem, LPAnimCore | 9 : ImageWrapper, ApplicationCore, RHI, EngineSettings, Projects, Slate, SlateCore, UMG, Chaos | 0 | 16 |
| LifePlayEditorTools | 4 : Core, CoreUObject, Engine, LifePlay | 10 : UnrealEd, BlueprintGraph, KismetCompiler, AssetRegistry, StreetMapRuntime, UMG, UMGEditor, MeshDescription, Json, Projects | 0 | 14 |
Total 30 = lignes de données du CSV modules. DynamicallyLoadedModuleNames : Grep count sur Source = 0 occurrence (zéro attendu, confirmé par la lecture des deux fichiers : aucun usage). Deux lignes commentées ignorées dans LifePlay.Build.cs (lignes 48 : Slate/SlateCore, et 51 : OnlineSubsystem).
3. Écarts au compte attendu de la fiche
- La fiche n'annonce aucun compte attendu : sans objet pour la comparaison.
- Écart apparent 275 / 276 sur ED : le Grep
(Engine|Project)donne 275, il manque la ligneMounting External plugin LPSandbox(ED:373) ; le total correct des plugins montés par l'éditeur est 276. - Livrable écrit dans
D:\Game\LifePlay-master 5.5\Docs\Migration\etat\OB\OBA\comme la fiche l'indique, donc dans la copie 5.5 (dossieretat/ignoré par git dans ce dépôt,lp-paths), alors que les sources lues sont celles de la copie 5.8. À confirmer si c'est voulu. - Aucun arrêt déclenché ; budget tenu (≈ 25 tours, sous les ≈ 40 de la fiche).
4. Établi / estimé / incertain
Établi (lu à la source, recompté par une seconde méthode) :
- Les comptes de lignes
Mounting(276 / 177, types, absence de doublons), du.uproject(42 / 40 / 2 ; 36TargetAllowList; 2Optional), des.uplugin(921 + 5 + 1), de la lecture JSON (0 échec, 8 tolérants), des drapeaux bêta et expérimental (JEU 52 / 20 ; ED 68 / 48), deDeprecatedEngineVersion(0), des modules (16 + 14 = 30). - Règle d'activation par défaut,
PluginManager.cpp:421-435:EnabledByDefaultactivé donne vrai (plugin du projet) oubAllowEnginePluginsEnabledByDefault(plugin moteur) ; désactivé donne faux ; champ absent donne vrai seulement pour un plugin chargé depuis le projet. Un plugin nommé au.uprojectn'est pas repris par le passage « activés par défaut » (PluginManager.cpp:1748, test!Context.ConfiguredPluginNames.Contains). - HyperAIStudio (
Plugins\Marketplace\HyperAIStudio, 0 fichier suivi par git) n'est pas nommé au.uproject; son.upluginn'a pasEnabledByDefault; il est donc activé par la règle ci-dessus (plugin du projet) et monté dans ED (ED:372) et dans JEU (JEU:237). Ses 25 modules déclarés sont tous de typeEditor(colonnemodulesdu CSV).
Estimé :
- La colonne
active_parclasse l'activation d'après les descripteurs, pas d'après le reçu de cible du build : 8 plugins nommés au.uprojectavecTargetAllowList: ["Editor"]sont pourtant montés dans le jeu empaqueté ; je les classeuproject-Editor+depparce que d'autres plugins montés les requièrent. Raisonnement : l'allow-list exclut la cible jeu, leur présence au journal JEU s'explique donc par une dépendance. La chaîne exacte (qui requiert qui) n'est pas suivie : hors niveau N1. dep= relation directe lue dans le champPluginsdes.upluginmontés, non transitive, sans tenir compte des plateformes ni deOptionalcôté requis.- Plugin monté ne veut pas dire module chargé : le journal prouve le montage ; les types de modules sont ceux des descripteurs.
Incertain (essai qui trancherait) :
- Cause réelle du montage de chaque plugin
depdu jeu : le reçu de cible du build empaqueté (fichier.targetsousBinaries) ou un journalLogPluginManagerplus verbeux trancherait. - Statut Development contre Shipping : le journal JEU vient d'un build Development ; la liste d'un build Shipping n'a pas été lue (aucun journal de montage Shipping fourni par la fiche).
Constats
- 52 plugins bêta et 20 expérimentaux sont montés dans le jeu empaqueté, mais seulement 12 plugins sur 177 sont nommés au
.uproject: la grande majorité (123 par défaut, 42 par dépendance) est montée sans choix explicite du projet. Le.uprojectne porte pas la clébDisableEnginePluginsByDefault(relu :LifePlay.uproject, aucune occurrence dans le fichier lu en entier). - Pistes de localisation pour OBA-T2/T3 (pas de décision) : HyperAIStudio monté dans le jeu empaqueté (modules
Editorseulement) ; plugins du.uprojectmarquésEditormais montés en jeu ; PythonScriptPlugin (bêta) et ModelViewViewModel (bêta) dans le jeu ; LPSandbox bêta (addon). - Le script
oba_t1.pyse réutilise sur un autre couple de journaux ; à ranger sousSaved/OBA/ou à proposer pourTools/(sk-protocol§ 7 : pas dans le scratchpad pour un usage répété). Non fait ici (hors périmètre de la fiche). - Colonne
modulesdu CSV :Nom:Type:LoadingPhaseséparés par des virgules ; phase vide (Teds…,OnlineBase,XInputDevice) = champ absent du.uplugin. Séparateur de colonnes :;.