LifePlay-Revival/Docs/Migration/etat/OB/OBA/OBA-T1-INV.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

98 lines
13 KiB
Markdown

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 -la` sur 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` (regex `LogPluginManager: Mounting (\w+) plugin (\S+)` sur ED et JEU ; lecture de `LifePlay.uproject` ; parcours récursif des `.uplugin` de `Engine\Plugins`, `Engine\Platforms`, `Plugins\` du jeu et `Plugins\` de l'addon ; lecture JSON stricte puis tolérante : commentaires `//` et `/* */`, virgules finales, BOM ; analyse des `Source\*\*.Build.cs` hors commentaires).
- Recomptes par une autre méthode : Grep `count` sur les CSV écrits (motifs par colonne) ; `pwsh -NoProfile` avec `Select-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` ; `cmp` du scratchpad aux CSV livrés ; Grep `"TargetAllowList"` et `"Optional"` (`count`) sur `LifePlay.uproject` ; Grep `"DeprecatedEngineVersion"` sur `Engine\Plugins`, `Plugins\` du jeu et `Plugins\` de l'addon ; Grep `DynamicallyLoadedModuleNames` sur `Source`.
- 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 -l` pour 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 ligne `Mounting 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 (dossier `etat/` 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 ; 36 `TargetAllowList` ; 2 `Optional`), 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), de `DeprecatedEngineVersion` (0), des modules (16 + 14 = 30).
- Règle d'activation par défaut, `PluginManager.cpp:421-435` : `EnabledByDefault` activé donne vrai (plugin du projet) ou `bAllowEnginePluginsEnabledByDefault` (plugin moteur) ; désactivé donne faux ; champ absent donne vrai seulement pour un plugin chargé depuis le projet. Un plugin nommé au `.uproject` n'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 `.uplugin` n'a pas `EnabledByDefault` ; 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 type `Editor` (colonne `modules` du CSV).
**Estimé** :
- La colonne `active_par` classe l'activation d'après les descripteurs, pas d'après le reçu de cible du build : 8 plugins nommés au `.uproject` avec `TargetAllowList: ["Editor"]` sont pourtant montés dans le jeu empaqueté ; je les classe `uproject-Editor+dep` parce 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 champ `Plugins` des `.uplugin` montés, non transitive, sans tenir compte des plateformes ni de `Optional` cô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 `dep` du jeu : le reçu de cible du build empaqueté (fichier `.target` sous `Binaries`) ou un journal `LogPluginManager` plus 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 `.uproject` ne 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 `Editor` seulement) ; plugins du `.uproject` marqués `Editor` mais montés en jeu ; PythonScriptPlugin (bêta) et ModelViewViewModel (bêta) dans le jeu ; LPSandbox bêta (addon).
- Le script `oba_t1.py` se réutilise sur un autre couple de journaux ; à ranger sous `Saved/OBA/` ou à proposer pour `Tools/` (`sk-protocol` § 7 : pas dans le scratchpad pour un usage répété). Non fait ici (hors périmètre de la fiche).
- Colonne `modules` du CSV : `Nom:Type:LoadingPhase` séparés par des virgules ; phase vide (`Teds…`, `OnlineBase`, `XInputDevice`) = champ absent du `.uplugin`. Séparateur de colonnes : `;`.